본문 바로가기

쓰기

조회 수 10403
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

 ROS 노드들은 TCP/IP 프로토콜의 메시지 통신을 기반으로 데이터를 주고 받습니다. 하지만 대다수의 센서들과 MCU의 통신은 일반적인 serial 프로토콜을 이용해 통신을 하는 경우가 많습니다. 여러 용도로 편리하게 사용되는 UART 통신 또한 그러한 방식입니다. 그래서 ROS에서 시리얼 통신이 가능하게 하는 관련 패키지를 찾아 보았는데, 우선 가장 많이 쓰는 것은 'rosserial'이라고 하는 패키지입니다. rosserial은 하위 제어기에 노드를 올려서 메시지 통신이 가능하게 하는 라이브러리입니다. 보통 ROS 마스터에 하위 제어기를 두고 사용하기 때문에 일반적인 시리얼 데이터는 하위 제어기에서 받고, 이를 메시지로 바꿔서 ROS에 전달하는 식으로 사용할 수 있습니다. 그런데 저를 포함하여 기존의 UART 통신에 많이 익숙한 사람들이 간단한 테스트용으로 쓰기에는 너무 번거롭습니다. 또한 하위 제어기를 거치지 않고 ROS 마스터 장치(PC)에서 시리얼 통신을 하는 센서 값을 바로 받아야 하는 경우도 있습니다. 그래서 'serial'이라는 패키지를 이용해서 ROS 마스터 장치에서 direct serial 통신을 할 수 있도록 연습해 보았습니다.


1. 우선 serial 패키지를 설치합니다.

$ sudo apt-get install ros-indigo-serial


2. 예전에 만들었던 catkin 소스 디렉토리(~/catkin_ws/src/)에 serial-example 폴더를 생성합니다. 커맨드로 생성하셔도 되고 nautilus GUI로 윈도우 폴더 만들 듯 하셔도 됩니다.

$ cd /catkin_ws/src/

$ mkdir serial-example


3. 생성된 디렉토리에 이번에 사용할 serial-example 파일들을 넣습니다. Serial-example은 serial 라이브러리를 이용해 ROS에서 시리얼 데이터 수신을 구현한 예제입니다. 이번에는 이것을 수정하여 간단한 통신을 수행할 것입니다. Serial-example은 아래 경로에서 제공됩니다. txt, xml 파일과 src 폴더를 생성된 디렉토리 바로 아래에 넣습니다.

https://github.com/garyservin/serial-example


4. 노드 작성하기

 ROS 패키지 build에 필요한 정보들은 CMakeLists.txt와 package.xml 파일 안에 미리 설정되어 있습니다. 노드를 처음부터 작성하는 경우에는 두 파일의 내용을 직접 변경해 주어야 하지만 serial-example에서 미리 작성해 놓았으므로 넘어갑니다. 이번에는 소스 파일만 수정하면 됩니다. 먼저 serial device가 PC의 어떤 포트에 연결되어 있는지 확인해야 합니다. Serial device는 많이 쓰이는 USB <-> UART 변환 모듈을 사용하였습니다. 내부 IC는 CP2102가 붙어 있습니다.


usbuart.jpg

USB <-> UART 변환 모듈


 우분투에서 포트의 device 연결 이력은 아래 명령어를 통해 확인할 수 있습니다.

$ dmesg | grep tty


ttylist.png

Serial device 변경 이력 확인


 위 스크린샷의 가장 아랫줄에서 cp210x converter가 ttyUSB1에 연결된 것을 확인하실 수 있습니다. 윈도우에서는 포트가 COM1, COM2, ... 이런 식으로 지정이 되지만 우분투에서는 USB 디바이스의 경우 ttyUSB0, ttyUSB1, ... 또는 ttyACM0, ttyACM1, ... 같은 식으로 지정됩니다. 다음으로 노드의 소스에서 연결 포트를 설정하는 부분을 위에서 찾아낸 변환 모듈의 연결 포트로 수정해 주어야 합니다. serial-example 패키지 디렉토리 내부 src 폴더의 serial_example_node.cpp를 열어서 40번째 줄의

ser.setPort("/dev/ttyACM0");

부분의 ttyACM0를 ttyUSBn으로 수정합니다. n은 위에서 확인한 변환 모듈이 연결된 번호입니다. 위 스크린샷에서는 ttyUSB1이 되겠죠. 그리고 통신 속도 수정을 위해 41번째 줄의

ser.setBaudrate(9600);

의 9600을 통신할 장치의 baudrate에 맞게 수정해 줍니다.


5. 노드 build하기

 Catkin은 원래 catkin_ws 경로에서 build를 해 주어야 하지만 개발 환경을 구축하면서 cm이라는 alias를 추가했기 때문에 아무 경로에서나 build가 가능합니다.

$ cm

또는 ~/catkin_ws/ 경로에서

$ catkin_make


제 경우에는 build 과정에서 [No module named minicompat]이라는 오류가 발생하였는데, 이 경우 rosdep 관련 명령어도 같은 오류를 발생시킵니다. PYTHONPATH 관련 오류인 것 같으며 /usr/lib/python2.7/xml/dom/ 경로에 minicompat.py 파일을 넣어 주면 해결됩니다. Build가 끝나면 터미널에 '[100%] Built target serail_example_node'라는 로그가 뜹니다.


6. Device file의 권한 설정

 Linux에서 모든 device는 file로 간주됩니다. 그래서 장치가 포트를 이용해 무언가 할 수 있게 하려면 해당 device file의 권한을 설정해 주어야 합니다. 파일의 권한 설정 명령어는 chmod이며 각 대상에 따라 권한의 종류에 해당하는 값을 더해 권한을 설정합니다. 3자리 숫자로 권한을 결정하며 이 숫자의 백의 자리부터 각각 owner, group, other에 해당되는 권한을 결정합니다. 각 자리의 숫자는 execute, write, read의 권한에 해당하는 값들을 더하여 결정합니다. 해당 값은 아래와 같습니다.

execute -> 1

write     -> 2

read      -> 4


그래서 read & write 권한을 준다면 2+4 = 6을 권한 값으로 부여하면 됩니다. 예를 들어 아래와 같은 권한을 부여할 경우 chmod 명령어는

owner에 read & write & execute 권한 부여 -> 4+2+1 = 7

group에 read & write 권한 부여                  -> 4+2 = 6

other에  read & write 권한 부여                  -> 4+2 = 6


=> $ sudo chmod 766 /dev/ttyUSBn


USB <-> UART 변환 모듈의 경우 최소 권한으로 read & write 권한이 주어져야 ROS node에서 해당 port를 사용할 수 있습니다. 이 권한 설정은 일시적이기 때문에 새 터미널이 열릴 때마다 설정해 주어야 합니다.


7. 노드 실행 및 serial data 수신

$ roscore                                                                 -> ROS master 구동

$ rosrun serial_example serial_example_node       -> serial_example_node 구동

 ‘Serial Port Initialized’가 뜨면 성공이며 변환 모듈의 rx 핀에 serial 신호를 주면 터미널에 기록이 출력됩니다.


노드가 구동되는 것을 rqt_graph를 통해서도 확인하실 수 있습니다.

$ rosrun rqt_graph rqt_graph


동일한 serial_example_node를 다른 터미널에서 또 실행시키면 [new node registered with same name]이라는 문구가 뜨며 기존에 켜져 있던 node가 종료됩니다.


serial-capture.png

MPU-6050 센서로부터 온도 값을 읽는 모습 (MPU-6050 -> [I2C] -> AVR -> [UART] -> ROS). f7과 f8 값이 온도 값을 나타내며, 손으로 잡아서 값이 증가하였습니다.


8. Serial data 송신과 loopback 테스트

 이번에는 기본 예제 소스에서 사용되지 않은 시리얼 송신 기능을 이용해 데이터를 보내고, 이것을 loopback을 통해 다시 읽어 들이는 작업을 해 보겠습니다. 먼저 하드웨어적으로 송신 데이터를 바로 수신하기 위해 변환 모듈의 tx 핀과 rx 핀을 연결합니다.


loopback.jpg

USB <-> UART 변환 모듈의 송신 핀과 수신 핀을 연결한 모습


그 다음 serial 패키지에 포함된 serial.h 파일을 열고, 여기 정의된 함수 prototype을 사용합니다. serial_example_node.cpp 파일에서도 확인 가능하듯이 serial.h가 #include 처리 되어 있어 함수들을 가져다 쓸 수 있습니다. serial_example_node.cpp 내에서는 serial 패키지의 class인 serial::Serial을 ser로 정의해서 사용합니다. 이번에 사용할 함수는 write라는 함수입니다. serial 헤더 파일을 쭉 보시면 write가 여러 개 정의되어 있는데 이는 C++ 언어의 function overloading 기능을 사용한 것입니다. 여러 개로 정의된 write 중에서 string 주소만 매개변수로 넘겨 주면 되는 것이 있으므로 그것을 사용할 것입니다. 예제 소스 안에서 루프가 진행되는 while(ros::ok()) 아래에 송신할 문자열을 선언하고, 이를 시리얼 포트로 송신하는 코드를 아래 스크린샷의 오른쪽 화면처럼 추가해 줍니다. 수신 부분은 그대로 남아있기 때문에 송신 코드만 추가하면 송신 데이터가 변환 모듈에서 서로 연결된 수신 핀을 따라 수신됩니다.


serial-loopback.png

Serial loopback 테스트와 송신 코드 추가 부분


위의 스크린샷에서 보시는 것처럼 "Testyep"이라는 송신 데이터가 시리얼 포트를 통해 읽어지고 있는 것을 확인 가능합니다. 여기서 루프문 바로 위에 있는 ros::Rate loop_rate(5);는 5Hz 주기로 루프를 실행시키며, 다른 원하는 값을 넣어서 실행 주기를 변경시킬 수 있습니다.


 이번에는 미리 작성된 예제 소스를 수정하여 테스트를 진행해 보았습니다. 다음 번에는 노드를 처음부터 작성하는 방법과 빌드 관련 설정 파일을 수정하는 법을 정리해 보도록 하겠습니다.


  1. ROS(Robot Operating System) 개념과 활용 - 11. rosserial 알아보기

    ROS가 적용되는 시스템에선 연산을 위한 상위 제어기와 하드웨어 제어를 위한 하위 제어기가 각각의 역할을 수행하는 경우가 많습니다. 상위 제어기는 보통 PC나 OBC(One Board Computer)를 사용하게 되는데, 하위 제어기와 통신할 때 가장 흔하게 사용되는 ...
    Date2016.03.28 CategoryROS(Robot Operating System) 개념과 활용 By박정현 Views7539
    Read More
  2. ROS(Robot Operating System) 개념과 활용 - 10. CMakeLists.txt 파헤치기

    CMakeLists.txt는 빌드 설정에 관련된 매우 중요한 파일이지만 주석의 압박과 익숙하지 않은 사용법 때문에 매번 대충 작성했던 경험이 있습니다. 관련 가이드를 찾아 보니 생각보다 간단한 규칙으로 되어 있어서 다른 내용을 진행하기 전에 미리 짚고 넘어가...
    Date2016.03.05 CategoryROS(Robot Operating System) 개념과 활용 By박정현 Views8436
    Read More
  3. ROS(Robot Operating System) 개념과 활용 - 9. Dynamic reconfigure를 이용한 실시간 node parameter 업데이트

    오랜만의 ROS 강좌 업데이트입니다. 거의 반년 전 쯤에 해 보았던 내용이지만 이런 저런 바쁜 일들에 밀려 이제서야 업데이트를 하게 되었습니다. 본 코너인 ROS 개념과 활용에서는 나머지 기본적인 내용들을 다루고 최종적으로 간단한 제어 예제까지 수행할 ...
    Date2016.02.24 CategoryROS(Robot Operating System) 개념과 활용 By박정현 Views3852
    Read More
  4. ROS(Robot Operating System) 개념과 활용 - 8. roslaunch 사용과 launch 파일 작성하기

    저번에 USB 카메라를 이용하면서 usb_cam-test.launch 파일을 실행시켜 보았습니다. usb_cam-test.launch 파일을 실행시키면 USB 카메라와 직접적으로 상호작용하는 '/usb_cam' 노드와 '/usb_cam/image_raw' 토픽을 받아 화면에 출력하는 '/image_view' 노드...
    Date2015.08.13 CategoryROS(Robot Operating System) 개념과 활용 By박정현 Views17572
    Read More
  5. ROS(Robot Operating System) 개념과 활용 - 7. USB 카메라 사용하기

    ROS는 여러 가지 이미지 관련 패키지를 제공하고 있습니다. 특히 OpenCV 연동 기능을 제공하기 때문에 다양한 영상 처리 알고리즘을 적용할 수 있다는 장점이 있습니다. 이미지와 영상을 얻기 위해서는 이미지를 얻는 센서가 필요한데, ROS가 주로 PC나 SBC ...
    Date2015.08.09 CategoryROS(Robot Operating System) 개념과 활용 By박정현 Views6775
    Read More
  6. ROS(Robot Operating System) 개념과 활용 - 6. rqt를 이용한 데이터 모니터링

    ROS는 로봇으로부터 얻을 수 있는 데이터를 쉽게 확인하고 관리할 수 있도록 rqt라고 하는 모니터링 도구를 제공합니다. rqt는 GUI 개발에 쓰이는 Qt framework 기반의 ROS software framework입니다. rqt는 우리가 지금까지 노드간 관계를 확인할 때 써 오던...
    Date2015.08.08 CategoryROS(Robot Operating System) 개념과 활용 By박정현 Views7049
    Read More
  7. ROS(Robot Operating System) 개념과 활용 - 5. 바닥부터 node 작성하기

    지금까지는 기존에 있던 패키지 노드를 수정하여 사용해 왔습니다. 이번에는 노드를 아예 처음부터 새로 작성하는 법에 대해 알아보겠습니다. 또한 노드 내부에서 사용되는 ROS의 기본 구조에 대해서도 간략히 짚고 넘어가도록 하겠습니다. 노드 작성법을 간...
    Date2015.07.26 CategoryROS(Robot Operating System) 개념과 활용 By박정현 Views33231
    Read More
  8. ROS(Robot Operating System) 개념과 활용 - 4. ROS node를 이용하여 direct serial 통신하기

    ROS 노드들은 TCP/IP 프로토콜의 메시지 통신을 기반으로 데이터를 주고 받습니다. 하지만 대다수의 센서들과 MCU의 통신은 일반적인 serial 프로토콜을 이용해 통신을 하는 경우가 많습니다. 여러 용도로 편리하게 사용되는 UART 통신 또한 그러한 방식입니...
    Date2015.07.07 CategoryROS(Robot Operating System) 개념과 활용 By박정현 Views10403
    Read More
  9. ROS(Robot Operating System) 개념과 활용 - 3. ROS 개발 환경 구축과 간단한 node 구동 테스트

    이번에는 직접 ROS를 설치하고 간단한 node 구동 테스트를 해 보도록 하겠습니다. ROS는 약 1년 주기로 새로운 버전이 올라오며 2015년 6월 기준 최신 버전은 9번째 release인 Jade Turtle입니다. 하지만 8번째 release인 Indigo Igloo가 지원 기간이 더 길고...
    Date2015.06.26 CategoryROS(Robot Operating System) 개념과 활용 By박정현 Views15400
    Read More
  10. ROS(Robot Operating System) 개념과 활용 - 2. ROS의 동작 구조와 적용 사례

    오랜만의 업데이트입니다. 한 몇 주 정도는 짬짬이 틈을 내어 몇 가지 주요한 진행 사항들을 올릴 수 있을 것 같네요. 매번 느끼지만 뭔가를 하는 것 보다 그것을 정리해서 홈페이지에 올리는 것이 훨씬 많은 노동력을 필요로 하는 것 같습니다. 이번에는 ROS...
    Date2015.06.08 CategoryROS(Robot Operating System) 개념과 활용 By박정현 Views10730
    Read More
  11. ROS(Robot Operating System) 개념과 활용 - 1. ROS 개요

    연구실에서 로봇 관련 과제를 하는 김에 ROS를 배워서 적용해 보려고 합니다. ROS는 로봇 제어를 위한 일종의 오픈소스 소프트웨어 플랫폼입니다. 저는 개인적으로 low level programming을 선호해 왔습니다. 레지스터와 메모리를 직접 제어하고 라이브러리의...
    Date2015.04.13 CategoryROS(Robot Operating System) 개념과 활용 By박정현 Views15325
    Read More
Board Pagination Prev 1 Next
/ 1