본문 바로가기

ROS

ROS1 Noetic Arduino와 Serial 통신하기

ROS1은 TCP/IP 프로토콜을 통하여 Node끼리 통신이 가능합니다. 그러나 Arduino와 같은 인터넷 연결이 안 되는 MCU는 TCP/IP 프로토콜로 통신하기 어렵기 때문에 rosserial package를 설치하여 Arduino와 Serial 통신이 가능하도록 설정해봅시다.

1. Arduino IDE Setup

먼저 아두이노 IDE를 설치해야 합니다. 설치 링크는 아래와 같습니다. 설치 후 Arduino가 설치된 위치를 기억해 주세요! 보통 user home 폴더에 설치가 됩니다

https://www.arduino.cc/en/software

 

Software

Open-source electronic prototyping platform enabling users to create interactive electronic objects.

www.arduino.cc

2. install rosserial

버전에 맞는 rosserial package를 설치해주세요

$ sudo apt-get install ros-noetic-rosserial-arduino
$ sudo apt-get install ros-noetic-rosserial

3. arduino IDE Libraries 에 ros_lib 추가

Arduino IDE에서 ros_lib를 사용하려면 라이브러리를 추가해야 됩니다. 1번에서 설치한 아두이노 경로에 libraries 폴더에서 다음과 같은 명령어를 실행합니다. 아래 명령어가 잘 실행된다면 Arduino IDE 메뉴 중에 File > Examples를 보시면 ros examples가 추가된 것을 확인 가능합니다.

$ cd <sketchbook>/libraries 
$ rosrun rosserial_arduino make_libraries.py .rosserial/rosserial_arduino/src/rosserial_arduino
<shetchbook>은 Arduino가 설치된 경로를 뜻합니다.

3-1. serialClient.py import queue 에러

위 명령어를 실행하던 도중 위 제목과 같은 에러가 발생했었습니다. 저는 구 부분을 다음과 같이 수정하여 해결했습니다.

try: 
    import queue
except ImportError:
    import Queue as queue

4. Arduino에서 topic Subscriber 구현 및 테스트

arduino에서 topic을 한번 받아 봅시다. 아래 코드는 모터 제어를 하던 코드이여서 제어 코드를 제거한 후 ROS topic 관련 소스코드만 남겨놨습니다.

#include <ros.h>
#include <std_msgs/Empty.h>

ros::NodeHandle nh;

void messageCb( const std_msgs::Empty& toggle_msg){
  digitalWrite(13, HIGH-digitalRead(13));   // blink the led
}

ros::Subscriber<std_msgs::Empty> sub("toggle_led", &messageCb );

void setup()
{
  pinMode(13, OUTPUT);
  nh.initNode();
  nh.subscribe(sub);
}

void loop()
{
  nh.spinOnce();
  delay(1);
}
$ rosrun rosserial_python serial_node.py /dev/ttyUSB0 // serial 통신을 위한 Node 오픈
$ rostopic pub toggle_led std_msgs/Empty --once

정상적으로 동작 된다면 LED가 켜지고 꺼지는 것을 확인해 보실 수 있습니다. 다만 사용 시에 몇 가지 유의사항이 있습니다.

  • 위 노드를 실행했을때는 이미 serial 사용 중이므로 아두이노 upload가 불가능합니다.
  • Serial baudRate를 통일시켜줘야 합니다.
  • Serial.println 혹은 Serial.print를 사용하면 안 됩니다.

5. keyboard로 motor control 하기

PC에서 키보드를 입력했을 때 모터 RPM을 변경 가능하도록 만들 수 있습니다