
이번 글에서는 ROS와 아두이노 사이의 통신을 해보도록 하겠습니다.
아두이노 같은 임베디드 시스템에서는 XRCE-DDS(eXtremely Resource Constrained Environments DDS) 프로토콜을 통해 ROS2와 통신할 수 있습니다.

이것을 가능하게 하는 라이브러리는 ros2arduino와 micro-ROS입니다. ros2arduino는 현재 ROS2 Dashing 버전까지 지원되며, micro-ROS는 현재 ROS2 최신버전까지 지원됩니다.
이 글에서는 ROS2 foxy 버전을 기준으로 micro-ROS를 사용하여 통신하도록 하겠습니다. 사용할 보드는 ESP32-CAM 입니다.
먼저 ESP-IDF를 설치합시다. ESP-IDF는 ESP-32용 소프트웨어 개발 프레임워크입니다. 용량이 조금 커서 5 ~10분정도 걸립니다. (3GB 정도) 공식문서에는 설치하라고 되어는 있는데 설치안해도 이미 패키지에 포함되어있는듯합니다.
다음으로 micro-ROS 빌드 시스템을 설치하겠습니다. 오버레이 작업공간 폴더로 이동하세요. 지난번 글까지는 작업공간 이름이 dev_ws 였는데 작업공간 이름을 ros_ws로 변경했습니다.
ROS2 설정환경을 소싱하세요. bashrc 파일에 작성했다면 생략하셔도 됩니다.
$ source /opt/ros/$ROS_DISTRO/setup.bash |
micro-ROS 셋업 패키지 src 폴더에 다운로드 합니다.
rosdef를 통해 의존성 패키지를 업데이트 하세요.
$ sudo apt update && rosdep update $ rosdep install --from-path src --ignore-src -y |
필자는 하모니카OS를 사용하기때문에 OS를 확인할 수 없다는 오류가 발생했습니다. OS를 확인할 수 없다는 오류가 발생하면 OS를 오버라이드하여 다시 실행해주세요.
$ export ROS_OS_OVERRIDE=ubuntu:20.04:focal |
colcon을 통해 micro_ros_setup 패키지를 빌드해주세요. 해당 패키지는 micro-ROS 어플리케이션을 생성하는 패키지입니다.
$ colcon build --symlink-install --packages-select micro_ros_setup |
오버레이 작업공간 설정환경을 소싱하세요.
ESP-32의 펌웨어 작업공간을 만들겠습니다. 다음 명령어를 입력하면 firmware 폴더가 생성됩니다.
$ ros2 run micro_ros_setup create_firmware_ws.sh [RTOS] [보드] |
micro_ros_setup 패키지는 NuttX, FreeRTOS, Zephyr 3가지 RTOS를 지원합니다. 이 중 FreeRTOS는 ESP32 보드를 지원합니다. 자세한 지원내용은 https://github.com/micro-ROS/micro_ros_setup/tree/foxy를 참고하세요.
$ ros2 run micro_ros_setup create_firmware_ws.sh freertos esp32 |
다음 명령어를 통해 생성된 펌웨어를 설정합니다.
$ ros2 run micro_ros_setup configure_firmware.sh [프로젝트 이름] -t udp -i [ip주소] -p [포트] |
프로젝트는 firmware/freertos_apps/apps 폴더 아래에 있습니다. 예제로 존재하는 int32_publisher를 사용하겠습니다. 전송모드는 serial, udp, tcp가 있는데 udp로 전송하겠습니다. ip주소는 ifconfig 명령어를 통해 확인가능하며, 포트는 8888로 하겠습니다.(에이전트 서버의 ip주소와 포트 번호)
$ ros2 run micro_ros_setup configure_firmware.sh int32_publisher -t udp -i [ip주소] -p 8888 |
다음 명령어를 통해 와이파이 정보도 입력해주세요.
$ ros2 run micro_ros_setup build_firmware.sh menuconfig |
micro-ROS Transport Settings > WiFi Configuration 으로 이동하여 SSID와 Password를 입력후 S를 눌러 저장하고 Q를 눌러 빠져나옵시다. 

다음 명령어를 통해 펌웨어를 빌드해주세요.
$ ros2 run micro_ros_setup build_firmware.sh |
이전에 작성한 글(https://www.robotstory.co.kr/london/?vid=233)을 참고하여 ESP32-CAM 보드를 프로그래밍 모드로 배선합니다. ESP-CAM | TTL Converter | 5V | 5V | GND | GND | UOR | TXD | UOT | RXD | GND - GPIO0 | |

다음 명령어를 통해 펌웨어를 플래싱해주세요.
$ ros2 run micro_ros_setup flash_firmware.sh |
이제 에이전트 서버를 실행해야합니다. 다음 명령어를 통해 에이전트 서버 작업공간을 생성하세요.
$ ros2 run micro_ros_setup create_agent_ws.sh |
다음 명령어를 통해 에이전트 서버를 빌드하세요.
$ ros2 run micro_ros_setup build_agent.sh |
오버레이 작업공간을 설정환경을 소싱하세요.
에이전트 서버를 실행하기 전에 다음 명령어를 통해 방화벽에 8888포트를 예외로 설정해주세요. 방화벽이 따로 없다면 생략하시면 됩니다.
에이전트 서버를 실행하세요.
$ ros2 run micro_ros_agent micro_ros_agent udp4 --port 8888 |
ESP32-CAM 보드에서 GPIO0에 연결된 선을 제거하고 리셋버튼을 누르면 잠시후 에이전트 서버에 클라이언트의 접속 정보가 뜹니다. 
새로운 터미널을 열고 ROS의 토픽 목록을 확인해보세요. 
/freertos_int32_publisher 토픽이 생성되어 있습니다. 해당 토픽을 구독해봅시다.
$ ros2 topic echo /freertos_int32_publisher |
|