4장 ROS 하드웨어 제어
Last updated
Last updated
마이크로프로세서나 컴퓨터 인터페이스와 같은 전문적인 지식없이도 사용할 수 있게 된 제어기를 말해요. 특히 회로도나 소스코드가 공개 되어서 누구나 '쉽게 공부하면서' 사용할 수 있고, 더 나아가 수정해서 사용할 수 있다는 장점이 있죠. 그 중 가장 대표적인 오픈소스 제어기가 아두이노예요.여담으로 'Arduino'라는 명칭의 상표권 문제로 공식적으로는 미국에서만 Arduino라고 하고, 그 외 국가에서는 Genuino라고 해요. 한국에서도 대부분의 메이커들이 Arduino라고 하죠. 참고로 둘은 같은 상품이라고 보면 돼요.
대표적인 아두이노는 아두이노 UNO예요. 교육용으로 주로 사용되죠. 그 외에는 좀더 사양이 좋은 아두이노 MEGA도 있고, 수십~수백가지의 보드가 존재합니다. 또한 보드에 WiFi, Bluetooth와 같은 기능을 연장하기 위한 아두이노 쉴드(Arduino Shield)라는 것도 사용을 할 수가 있어요.
앞에서 아두이노 제어기에 대해서 알아 보았는데요. 이러한 아두이노를 코딩하기 위해서는 아두이노 IDE를 설치해야해요. Windows, MAC, Linux를 포함한 운영체제에서 실행할 수 있어요.
아두이노 IDE는 https://www.arduino.cc/en/main/software 링크에서 다운받을 수 있어요. 여기서 IDE는 한국말로 통합 개발 환경( Integrated Development Environment)을 의미하는데요. 프로그램 개발 관련된 작업을 하는 작업환경이라고 보면돼요. 문서작업을 위해서 워드나, 한글 같은 작업용 프로그램이라고 볼 수 있어요.
OpenCR 보드의 경우에 아래와 같이 실행하면, 포트 엑세스 문제를 해결 할 수 있다.
아두이노 보드의 경우에 아래 같은 명령어로 포트 엑세스 문제를 해결 할 수 있다.
로봇은 PC와 임베디드 시스템으로 구성되어 있는데 그 중 대부분은 임베디드 시스템이 차지하고 있다. 하지만 보통의 임베디드에는 ROS설치가 불가능하기 때문에, 실시간 확보와 하드웨어 제어를 위해 “Rosserial” 패키지 이용한다.
위의 그림을 보면 ROS가 설치 되어있는 PC가 있고 PC와 연결되어 있는 Embedded가 있으며 그 Embedded에는 Sensor와 Motor가 연결 되어있다. PC에서 Rosserial을 이용해 Embedded와 연결되어 있는 센서값을 읽어오거나 모터를 제어할 수 있다. Rosserial의 제약• 메모리 =>퍼블리셔, 서브스크라이버 개수 및 송신, 수신 버퍼의 크기를 미리 정의해야 함 • Float64 =>마이크로컨트롤러는 64비트 실수연산을 지원하지 않아 32비트형으로 변경함 • Strings =>문자열 데이터를 String 메시지 안에 저장하지 않고 외부에서 정의한 문자열 데이터의 포인터 값만 메시지에 저장함 • Arrays =>메모리 제약사항으로 배열의 크기를 지정해서 사용 • 통신 속도 =>UART 같은 경우 115200bps와 같은 속도로는 메시지의 개수가 많아지면 응답 및 처리속도가 느려 짐
ROS를 지원하는 보드이며 터틀봇3의 메인 제어기로 쓰인다. 오픈소스 하드웨어, 소프트웨어이므로 누구나 만들 수 있다. 소스는 https://github.com/ROBOTIS-GIT/OpenCR-Hardware에 공개되어 있다.
Rosserial의 제약을 극복하려고 많이 노력함 •32-bit ARM Cortex-M7 with FPU (216MHz, 462DMIPS)•1MB 플래시메모리•320KB SRAM•Float64 지원•UART가아닌USB 패킷전송사용더 자세한 정보는 http://emanual.robotis.com/docs/en/parts/controller/opencr10/ 에서 볼 수 있다.
Rosserial 설치
ros_lib 설치 (아두이노용 rosserial 라이브러리)
여기서 <arduino IDE path>는 아두이노 IDE가 설치된 경로를 말한다. ex) cd Arduino/libraries (Arduino 파일이 home에 설치되어 있는 경우)
혹시나 libraries에 미리 설치된 ros_lib이 존재한다면 제거한다.
libraries.py 한 칸 뒤에 있는 점까지 적어주어야 한다. 오타가 아니다.
ls 명령어를 입력하면 libraries파일 안에 ros_lib이 설치되어있는 것을 확인 할 수 있다. 그러면 이제 Rosserial의 간단한 예제를 살펴보자
준비물: Arduino Uno, 아두이노와 연결할 수 있는 usb 케이블 우선 아두이노를 실행한다.
아두이노 상단의 메뉴에서 File→Examples→ros_lib→HelloWorld를 선택한다. 그리고 다시 상단의 메뉴에서 Tools→Board→ Arduino Uno를 선택해주고 같은 메뉴에서 Port를 설정해준다.
그리고 업로드 버튼을 누른 뒤에 에러 없이 정상적으로 업로드 되었으면 다음을 진행한다. 터미널 창을 열고
를 실행해준뒤 새로 터미널 창을 하나 더 열어서
를 실행한다 이는 Rosserial을 USB0포트에서 보 레이트 속도를 57600으로 설정하여 통신을 하겠다는 말이다.만약 아두이노가 다른 USB포트에 연결되어 있으면 ttyUSB0 대신에 연결되어 있는 포트로 수정해서 실행한다.
이와 같이 나오면 성공이다.또 다시 새로운 터미널 창 하나를 더 열어서
명령어를 실행해보자 그러면 ‘ Hello world! ‘라는 글자가 1초마다 반복 되는 것을 알 수 있다.이는 Arduino Uno가 Publisher가 되어서 PC로 "Hello World!" 라는 문자를 보내주는 것이다. 이번에는 아두이노 IDE에 작성된 소스코드를 살펴보자
이로써 Rosserial의 Publisher 예제를 살펴보았다.
이번에는 Subscriber 예제를 실행 해보자.아두이노 상단의 메뉴에서 File→Examples→ros_lib→Blink를 선택한다.
그리고 아까와 똑같이 상단의 메뉴에서 Tools→Board→ Arduino Uno를 선택해주고 같은 메뉴에서 Port 설정해주고 업로드를 한다.
를 실행해주고 아까와 같이 새로 터미널 창을 하나 더 열어서
을 실행한 뒤 또 다시 새로운 터미널 창을 열자 그리고 다음의 명령어를 입력해보자
명령어를 입력할 때마다 13번 핀과 연결되어있는 LED가 켜지고 꺼지는 것을 알 수 있다.
이는 Arduino Uno가 Subscriber가 되어서 PC에서 내리는 명령을 받는 역할을 한다. 아두이노 IDE에 작성된 소스코드를 살펴보자
이로써 Rosserial의 Subscriber 예제를 살펴보았다.
Column 1
Column 2
아두이노 공식 홈
아두이노 보드 정보
아두이노 소프트웨어 다운로드
Column 1
Column 2
Column 3
Arduino Uno
OpenCR
마이크로컨트롤러
Atmega328 /8-bit
STM32F746ZGT6 / 32-bit ARM Cortex®-M7 with FPU
플래시 메모리
32KB
1MB
SRAM
2KB
320KB
아날로그 입력
6개
ADC Channels (Max 12bit) x6
디지털 I/O
14개 (6개의 PWM출력핀 포함 )
32 pins (L 14, R 18) *Arduino connectivity 5Pin OLLO x 4 GPIO x 18 pins PWM x 6 I2C x 1 SPI x 1