찬찬히 로봇 메이커 :: 찬찬히 로봇 메이커
반응형

카테고리가 우분투 마테로 쓰여있어서 우분투에 대한 정보를 얻고자 들어오신 분이라면 가볍게 뒤로가기를 눌러주시면 되겠다. 사실 우분투가 아니라 ROS공부가 목적이었으니 말이다.

ROS 간편설치는 다음과 같다.

터미널을 열고(ctrl+alt+t), 다음 내용을 순차적으로 적어준다.

$ wget http://raw.githubusercontent.com/ROBOTIS-GIT/robotis_tools/master/install_ros_kinetic.sh

$ chmod 755 ./install_ros_kinetic.sh

$ bash ./install_ros_kinetic.sh

오타가 나면 설치가 안되니 잘 적으면 될 것 같다. 이렇게 적고 한 20분 정도 있으면 설치가 완료가 되는 것 같다. 그러면 본격적으로 ROS를 실행하면 된다.

아마 업데이트를 하면 설정이 자동으로 되는 것 같지만 혹시 안되어 있다면 설정을 하는 것이 편하다.

$gedit ~/.bashrc

를 입력하면, 메모장같은게 뜬다. 여기서 맨 아래에 설정할 내용을 추가해 준다.

# Set ROS Kinetic

source /opt/ros/kinetic/setup.bash

source ~/catkin_ws/devel/setup.bash

# Set ROS Network

export ROS_HOSTNAME=xxx.xxx.xxx.xxx

export ROS_MASTER_URI=http://${ROS_HOSTNAME}:11311

# Set ROS alias command

alias cw='cd ~/catkin_ws'

alias cs='cd ~/catkin_ws/src'

alias cm='cd ~/catkin_ws && catkin_make'

참고로 xxx.xxx.xxx.xxx는 본 컴퓨터의 ip를 적으면 되는데 새 터미널창에서 ifconfig를 적으면 세 문단이 나오는데 맨 아래 문단의 두 번째 줄에 나와있다.(ipconfig가 아니라 ifconfig이다.)

그런데 자세히 보면 그 위에 이미 설정이 되어있을 수도 있다. 나는 설정이 되어있었다. 하지만 모르고 다 적은 건 함정 ㅋㅋㅋㅋㅋ

네트워크는 위에 호스트네임에 localhost라고 적혀있을 수도 있는데 이는 하나의 PC에서 모든 ROS패키지를 구동하는 상황이라고 한다. 이는 이렇게 적는다.

export ROS_HOSTNAME=localhost

export ROS_MASTER_URI=http://localhost:11311

여기까지하면 기본적인 ros 설정이 끝이 난다. 다행히 여기까지는 큰 일 없이 순차적으로 잘 되었다. 마지막으로 통합 개발환경(IDE)을 설치를 해보자.

여러 IDE가 있는데 Qtcreator를 쓸 예정이다. 이유는 시각화 도구인 rqt나 RViz도 Qt로 만들어졌으며 편리하게 사용할 수 있을 것 같아서이다.

$ sudo apt-get install qtcreator 를 입력하면 빠르게 설치 가능하다.

반응형
반응형

라즈베리파이와 우분투 마테(mate) 단 1도 모르는 사람이

갑자기 우분투를 써야할 때에는?

일단 해보면 된다!

일단 라즈베리파이에 우분투 마테를 다운을 받아야 했다. 아래의 순서 그대로 하면 된다. 일단 mate를 왜 마테라고 읽는 지부터가 궁금하긴 하지만,

1. 라즈베리파이에 있는 마이크로 SD카드를 포맷을 하고(SDFormatter 추천)

2. 라즈베리파이에 우분투 마테를 다운을 받고,

(https://ubuntu-mate.org/download/로 들어가서)

3. 라즈베리파이를 실행을 시킨다.

여기서 중요한 점은!!!! 라즈베리파이의 버전이 3 b까지만 지원이 되는 것 같다!!!

5 ~6시간동안 라베파3b+로 삽질하다가 설마설마하면서 했는데 바로 되었다...

그래서 현재는 라즈베리파이 3b로 하는 중이다. 3b+가 아예 안되는 것은 아닌듯한데 추가로 설정을 해주어야 되는 것 같다.

위의 설명을 자세히 풀어보면, 일단 SDFormatter를 다운받고 실행을 시키면

SDFormatter

이러한 창이 뜬다. 여기서 SD카드를 컴퓨터에 연결시키면 Drive의 목록에 뜬다. 그러면 Option에서

FORMAT SIZE ADJUSTMENT를 ON을 시키고 FORMAT을 누른다.

그런 후에 SD카드에 우분투를 설치를 해야하는데, https://ubuntu-mate.org/download/로 들어가서 라즈베리파이를 누르면,

이러한 그림을 누르면

이것을 누르면 다운이 된다.^^

.xz파일이라 반디집에서만 풀 수 있다고 한다.

하지만 알집에서도 되는 것 같기도 하다. 나는 반디집을 이용해 압축풀기를 했다.

이러한 파일이 나오고, 이 파일을 윈도우 디스크 이미져로 실행을 시켜주어야 한다.

https://sourceforge.net/projects/win32diskimager/files/Archive/에 들어가서

을 눌러 다운을 받는다. 실행을 시키면

이렇게 뜨는데, Image File에 압축해제한 이미지파일을 넣고 Device에 SD카드 위치를 넣은다음 Write를 해주면 된다.

SD카드에 다운이 다 되면, 그대로 라즈베리에 꼽고 전원을 넣어주면 된다!

그 후에 기본적으로 소프트웨어 업데이트를 하고 한글이 써지도록 하면 되는데,

일단 터미널은 우클릭으로 열 수 있다.

일단 왼쪽 상단부에 제어 센터에서 software updater를 누르면 소프트웨어 업데이트의 목록을 확인해준다. 하지만 install을 누르면 디스크의 용량이 없다는 표시가 뜰 것이다.

바탕화면에 우클릭을 해서 터미널 열기를 누르면 터미널 창이 뜨는데, 여기에

sudo apt-get upgrade

이렇게 써넣어 주면 된다. 설치하겠냐고 하는건 다 yes를 했다. 그러면 소프트웨어 설치는 완료가 된다.

한글 입력은, 왼쪽 상단부에 시스템을 누르면, 제어 센터가 있는데 거기에 Language Support를 누르면 언어지원패키지를 완벽하게 설치하지 않았다고 뜬다.(아마 처음 우분투 설치하면서 설정하는 곳에서 한국어를 눌렀을

경우인 듯 하다.) 그러면 설치를 누르고 설치가 다 되면 키보드 입력기에 fcitx가 뜰 것이다.(안 뜬다면 껏다 켜보면 되는 것 같다.) fcitx를 선택을 한다.

그리고, 바탕화면 위에 시스템-기본설정-기타-Fcitx설정에 들어가서

키보드-영어(미국)하고 Hangul을 설정해주면 된다.

위의 화면처럼 설정이 안되어 있다면 하단에 +를 눌러 추가를 하면 된다. 그리고,

전역설정에서 입력기 전환을 눌러 원하는 설정되로 하면 나중에 한글을

쓸 때, 저 버튼을 눌러 전환을 하여 사용하면 된다. 그런데 나는 입력기

전환에 한글버튼을 눌렀는데 한글로는 전환이 안되고

윈도우+스페이스바 키만 된다 ...?

어쨌든 이렇게 기본적인 세팅을 끝냈다. 사실 아무것도 모르는 상태였기 때문에 터미널 여는 것만 2시간 걸린 듯 하다. 다른 블로그들을 찾아 보아도 터미널에 뭘 적는지만 써있고 터미널이 뭔지도 안 알려줘서...ㅠㅠ

혹시 처음하는 사람들에게 좋은 사이트가 있다면 공유해주었으면 좋겠다. 앞으로도 화이팅!

반응형
반응형

휴, 여러 할 일이 겹치면서 할 일의 우선순위를 정하다 보니 M4보드가 밀려 이렇게 늦게 올리게 되었다. ㅠㅠ 이번 포스팅에서는 소스를 내가 원하는 타이밍에 ADC값을 받을 수 있도록 만들어보았다.

그냥 M4보드에서 HAL_ADC_START_IT를 하면, 단순히 연속적으로 ADC값을 받을 뿐이다. 시도 때도 없이 받는 느낌이랄까.... 이것을 타이머와 연동을 시키면 내가 원하는 타이밍마다 ADC값을 받을 수 있고 다음 ADC값을 받기 전까지 이 받은 ADC값을 요리할 수 있다.이런식으로 인터럽트를 쓴다면 인터럽트 펜딩(pending)을 막을수도 있다!!! 팬딩이란 인터럽트끼리 겹치게 될 때, 인터럽트의 우선순위가 없다면 인터럽트가 보류가 되면서 시스템이 제대로 굴러가지 않게 된다. 펜딩은 주로 여러 인터럽트를 사용하거나 인터럽트의 실행시간이 인터럽트 사이의 시간보다 길 때 발생한다.

위의 소스는 필요한 레지스터들을 설정해줘서 인터럽트를 작동시킨 것이다. 타이머 인터럽트는 1초마다 작동하게 했고, ADC인터럽트는 따로 켜주지 않았다. 어차피 저 레지스터의 설정이 인터럽트를 켜준다는 뜻이니까.. 각각의 레지스터의 기능이 궁금하다면 reference manual을 살펴보면 알 수 있다. 나는 HAL드라이버와 reference manual을 비교해보며 소스를 작성했다. 아직 미완성에다 에러처리가 하나도 안 되어 있다.

위의 소스를 간단히 설명하면, 타이머 인터럽트가 시작이 되면 1초마다 Timer_ISR이 실행이 된다. 그러면 ADC에 ADC인터럽트를 실행한다는 flag를 넣어준다. 그러면 ADC가 실행이 되고 ADC_ISR이 실행이 된다. 그러면 ADC_ISR에서 인터럽트가 끝났다는 flag를 넣어주면 ADC는 끝이 나는 것이다.

이러한 방식은 마이크로마우스를 배우면서 알게 되었다. 센서값을 중복해서 받고, 그 값을 평균을 내서 처리를 하는데(그렇게 해도 오차가 크다), 이 때, 센서값을 처리하는 시간과 센서값을 다시 받는 시간을 고려하지 않으면 앞서 말했던 펜딩이 일어나며 소스가 멈출 때가 있었다. 또한 인터럽트를 3개를 중복해서 쓰기 때문에 다른 인터럽트에 영향을 주지 않게 하기 위해서 이러한 방식으로 쓰게 된다.

다음 포스팅에서는 PWM을 사용하는 법을 정리해서 올릴 예정이다.

반응형
반응형

사실 드론의 하드웨어도 중요하지만(모든 로봇들이 그러하듯) 더욱 중요한 것은 제어법이라고 생각한다.

드론의 제어법을 구글에서 여러번 찾아보았다. 기본은 PID제어를 사용하였고 여기에 추가적으로 P제어를 두번한 PPID(?)제어라던가 D제어를 두번한 PIDD(?)제어를 사용한 사람도 있었다. PPAP제어도?...

우리는 여러 게시물을 찾아보고, 선배들에게도 물어본 결과 그냥 기본적인 PID제어를 사용하기로 하였다. 기본적으로는 PID를 사용하고, 상황에 따라서 다른 것을 추가한다고 한다.

일단 PID제어가 무엇인지 찾아보면,

P제어, I제어, D제어를 계산한 뒤, 그것을 합쳐서 출력을 주는 것을 말한다.

P제어는 Proportional control로써 한글말로 하면 비례제어이다. I제어는 Integral control로써 적분 제어이고, D제어는 Derivative control로써 미분 제어이다.

이것이 왜 필요한가 하면, 그냥 ON/OFF제어를 하면 원하는 값에 다가가기가 쉽지 않다.

예를 들면, 속도를 기준으로 제어를 한다고 했을 때, ON을 액셀을 최대로 밟는 것(또는 어느 기준으로 밟는 것도 상관 없다), OFF를 얙셀을 떼는 것으로 할 수 있다. 그러면 시속 100km로 달리고 싶다고 할 때, 100km까지는 액셀을 밟을 것이다. 그러다가 100이 넘어 101km가 되면 액셀을 뗄 것이다. 그러면 그 전까지 밟는 힘이 값자기 사라지지 않으므로 한 103km까지는 갈 것이다. 그러다가 힘이 떨어져서 100km를 지나쳐 97까지 떨어지고... 이것의 반복이다.

하지만 PID는 정확히 100km를 유지하려고 한다. 왜 이런지 식을 통해 알아보면,

일단 식은 아래와 같다.

PIDoutput =

Kp*e(t)+Ki*(integral)e(t)+Kd*(derivative)*e(t)

하나씩 보면

P제어는 오차 곱하기 Kp값이다. 이때 오차는 현재값과 목표값의 차이다. 위의 식에서는 그것을 error라고 해서 e(t)로 쓰여졌다. 다시 쓰면 ,

P제어 = (목표값-현재값) * Kp 이다.

사실 PID제어에서도 제일 중요한게 P제어이고, Kp값이라고 생각한다. Kp값만 잘 맞춰도 제어의 80퍼센트는 되기 때문이다. 그러면 정확히 어떻게 해야 드론을 제어할 수 있을까? 사실 정답은 잘 모르지만 우리가 한 방법을 소개한다(이 방법은 경험과 지식과 나의 생각이 합쳐져있다).

일단 현재값은 자이로센서가 받는 현재의 각도이다. x축을 기준으로 한다고 하자. 그래서 드론이 그냥 바닥에 놓여있다면 각도는 0도 일테고, 왼쪽으로 기울이면 음의 몇도, 오른쪽으로 기울이면 양의 몇도 이렇게 나올 것이다.

내가 수평을 유지하려고 한다면 목표값은 0이 될 것이다. 그러면 거기에 Kp값을 곱한 값이 P제어값이 될테고 그 값으로 pwm값으로 바꿔준다. 그러면 모터에 그만한 힘이 전해지면서 제어가 된다.(모터에 대한 제어는 다음 포스팅에 올릴 예정이다.)

그러면 Kp값은 어떻게 구하는가? 아마 대부분의 일반적인 사람들은 노가다로 구할 것이다. Kp값에 1을 대입해보고, 2를 대입해보고, 3을 대입해보고... 3정도가 맞는 것 같다라고 하면 거기서 0.1단위로 해보고... 아마 그런식으로 Kp값을 찾을 것이다.

아마 나머지는 매트랩이나 수학적인 계산으로 Kp값을 구할 것이다. 어떨 때 어느정도 힘을 줘야하므로 Kp값이 어느정도면 pwm이 몇정도가 나오고, 그러면 최대 힘의 몇퍼센트이므로 일부 저항 등을 제외하고 고려하면 몇정도가 적당한 값이겠구나 하고 구할 것이다.

나는 아직 아무것도 모르는 어린이이기 때문에 노가다로 구했다. 하지만 중요한 점은 PID 제어를 해보고 게인값을 한 번 구해본 사람과 처음 하는 사람은 확실히 다르다는 점이다. 아무래도 노가다로 구하는 방법은 해본 사람이 확실히 잘한다. 아마 드론에서 처음 PID제어를 하는 사람이라면, 그리고 노가다로 게인값을 구하는 사람이라면 정확한 값을 찾는데 몇 주정도 예상하는 것이 나을 것이다(사실 이게 제어의 전부이기도 하다).

일단 Kp값을 맞추면 드론이 어느정도 중심을 잡으려고 할 것이다. 아마 발산(드론이 오른쪽으로 갔다 왼쪽으로 갔다 하면서 점점 더 오차가 커질 때)하기 바로 전까지 맞추는 게 이상적이라고 생각한다. 그러면 Kp값은 맞춘 것이다. 그런 후에 D제어를 한다.

D제어는 미분제어로, D제어 =(오차의 시간에 대한 미분제어) * Kd 이다. 식으로 쓰면, D = ((e-e0)/t) * Kd(e0는 바로 전 오차, e는 현재 오차, t는 두 오차의 측정 시각 사이의 시간이다.)이다. 즉 위의 그래프에서 빨간색 선이 현재값이라고 하면, 빨간색 그래프의 어느 한 점에서의 기울기라고 할 수 있다.

'이 제어를 왜 할까'라고 생각을 한다면, 이 제어는 빠른 반응속도 때문에 사용한다고 답할 수 있다. 드론이 날라갈 때, 외력이 작용하지 않는다면 참으로 좋겠지만, 외력은 작용한다. 낮게 떠있을 때에는 바닥과 부딪친 바람이, 높게 떠있을 때에는 바람이 불며 드론에게 외력을 가한다. 그럴때마다, 드론은 빠르게 제 자리를 찾아야 하는데 그 역할을 D제어가 해준다.

쉽게 정리하면, P제어는 오차값이 커져야 힘을 많이 주게 된다. 하지만 D제어는 순간변화율(기울기)에 따라 힘을 주기 때문에 로봇이 순간적으로 변했을 때, 순간적으로 많은 힘을 주어 제 자리를 찾을 수 있게 도와준다.

Kd값을 찾는 방법은 Kp를 찾는 방법과 마찬가지로 시소테스트를 하면서 직접 드론에 외력을 주면서 찾는다. 드론이 왔다갔다하면서 수평을 맞출텐데, Kp값을 맞추고, Kd값을 맞추면 한 번이나 두 번 만에 수평으로 돌아와서 멈춰야한다.

P제어를 한 뒤, P제어값과 D제어값을 합쳐서 pwm에 반영한다.

마지막으로 I제어인데, 사실 인터넷에 찾아봤을 때에는 P제어를 한 뒤에 I제어를 하라고 나와있다. 하지만 나는 개인적으로 I제어가 큰 비중을 차지하지 않는다고 생각이 되어 PD제어를 위주로 하고 I제어를 나중에 하였다. I제어 = (오차들의 합) * Ki이다. 생각해보면 I제어가 있는 이유가, P제어는 오차값이 작을 때, 값이 너무 작아 목표값에 도달할 힘을 내지 못하게 된다. D제어 또한 변화율에 대한 힘이므로 힘이 거의 없을 것이다. 이렇게 기울어져있을 때, 그 작은 오차들을 적분값으로 합해서 힘을 주는 것이 I제어이다.

I제어가 완벽히 되면, P제어만 하면 목표값에 완벽히 도달을 못하고 약간 기울어져있을텐데, 그 기울어짐을 잡아줄 수 있다.

I제어까지 합쳐서 pwm에 반영하면, 완벽한 PID제어가 된다.

경험까지 덧붙여 설명하느라 길어졌지만 PID를 좀 더 정확히 설명하고 싶었다. 다음 포스팅에서는 BLDC의 제어법과 시소테스트, PID제어의 팁 등을 올릴 예정이다.

※혹시 틀린 것, 알려주고 싶은 내용, 궁금한 점은 댓글로 달아주세요 ^^.

반응형
반응형

충남대학교 라인트레이서 대회에서 마스터 앤 슬레이브 대회를 나갔다.

http://ciro.cnu.ac.kr/

대전시에서 주최하는 지능형창작로봇경연대회를 대전컨밴셜센터에서 충남대학교 라인트레이서 대회를 여는데, 마스터 앤 슬레이브 부분이 있었다. 마스터 앤 슬레이브(이하 마슬)은 앞에 마스터는 라인트레이서가, 슬레이브는 뒤에 따라가는 로봇이 있어서 둘이 쌍으로 움직이는 로봇 대회이다. 출전하는 팀은 항상 10팀 내외인데, 몇년째 단국대학교에서 1등을 하고있다. 내가 1학년 들어와서부터는 단국대가 항상 1등을 했었던 것 같다.

일단 슬레이브의 회형은 전방에는 적외선 센서를 달았고 너무 낮으면 앞에 마스터의 바퀴에 걸리거나 바퀴를 봐버리는 경우가 있으므로 센서를 보는 높이는 약간 높이 달았다. 나머지 차체는 낮아야 무게중심이 낮아지므로 최대한 낮게 설계를 하였다.

적외선 센서 6개와 높게 설계한 센서부

 

최대한 지면과 밀착되게 설계한 구동부

 

제어는 모터 PWM PID제어를 하였다. 센서와 앞에 마스터를 일정거리를 기준으로 거리값에 따라서 모터에 가해지는 PWM이 달라지게 코딩을 하고 테스트를 하였다. 이 작업이 일찍 끝나면 속도PID제어를 하려고 했지만, 이조차 쉽게 되지는 않아서 1주일을 꼬박 밤을 새서 완료를 하였다. 대회 전날까지 밤을 새며 했었고 속도는 1800mm/s을 맥스로 달렸었다. 속도 제어를 하면 더 잘 간다고는 하는데 아무래도 2차를 하는 트레이서를 따라가는 것은 쉽지 않았다. 일단은 낼 수 있는 최고 속도로 맞췄다.

사실 이때까지만 해도 1등을 할 수 있다는 생각은 안했다. 같이 하고있는 동기네 마슬이 조금 더 잘 갔기 때문이다. 마스터와 딱 달라붙어서 가는데, 턴을 할 때 우리는 뒷걸음을 치는 반면에 걔네 슬레이브는 부드럽게 가는 것이 특징이었다. 그래서 1등은 생각지도 않고 있었고 대회 당일이 다가왔다.

일단 첫날은 나의 동기의 스텝트레이서 대회가 있었다. 로봇 이름이 Drag였었는데,

결과는 아쉽게도 6등이었다. 다행히 6등까지 상을 줘서 상을 받긴 했지만 충남대학교와 서울 시립대에 스텝라인트레이서가 강하다는 것은 확실하게 본 것 같다.

대회가 끝나고 우리는 근처에 매우 큰 찜질방인 동방삭레포츠가 있어서 거기서 하루밤을 묵었다. 여러 엔터테인이 있었고, 재미있었다.

다음날이 되었고 우리는 열심히 준비한 대로 대회를 치뤘다. 올라가서 어떻게 하고 어떻게 할 것인지를 미리 정해놨기에 마치 F1에서 타이어 갈아주듯이 빠르고 스무스하게 진행했던 것 같다. 우리가 첫 번째로 굴리게 되었고 굴린 뒤에 나머지 팀들을 마음 졸이며 바라보았다.

 

1등팀_1

1등팀_2

2등팀_1

2등팀_2

3등팀

 

우리 동기네 팀이 1초차이로 2등을 한 것을 보고 '혹시나' 라는 마음을 품었다. 그리고 서울시립대 팀들이 빠르지 않게 들어오고 마지막으로 선배들의 팀까지 모두 마치고 우리는 함성을 지르며 좋아했던 것 같다. 꿈도 꾸지 않았는데 1등이라니!

1주일동안 밤새며 했던 것을 보상받는 느낌이라 너무 좋았고, 그냥 날아가는 기분과 함께 좋다는 표현 이외에는 별 다른 생각이 들지 않았다. 1등 상금은 100만원이었고, 나는 이것떼고 저것떼고 해서 30만원정도 받았던 것 같다. 후배들에게도 20만원정도 회식비로 쓰고... 사실 1학년 때에도 선배들이 1등했을 때 선배들이 고기를 사주셨고 얻어먹으면서 나도 1등을 하고싶다고 생각을 했었다. 그래서 일종의 목표였는데 막상 이루고 나니 훨씬 더 기분이 좋았던 것 같다.

앞으로도 최선을 다해서 뜻하지 않은 기회를 잡을 수 있었으면 좋겠다. 기회는 누구에게나 오지만 준비된 사람만 잡는다는 말이 기억이 난다. 내년에는 더 빠르게 해서 2연속 챔피언을 먹었으면 좋겠다. 앞으로 화이팅!!!

반응형

+ Recent posts