왕다방

인공지능 로봇 사용자들의 자유게시판입니다. 가정용로봇, 서비스로봇, 교육용로봇 등 자유롭게 올려주세요.

제목ROS와 비ROS 사이의 통신: micro-ROS2022-01-29 03:38
작성자user icon Level 3

88x31.png


이번 글에서는 ROS와 아두이노 사이의 통신을 해보도록 하겠습니다.


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


mb-file.php?path=2022%2F01%2F28%2FF4568_1.png
 

이것을 가능하게 하는 라이브러리는 ros2arduinomicro-ROS입니다. ros2arduino는 현재 ROS2 Dashing 버전까지 지원되며, micro-ROS는 현재 ROS2 최신버전까지 지원됩니다. 


이 글에서는 ROS2 foxy 버전을 기준으로 micro-ROS를 사용하여 통신하도록 하겠습니다. 사용할 보드는 ESP32-CAM 입니다.


먼저 ESP-IDF를 설치합시다. ESP-IDF는 ESP-32용 소프트웨어 개발 프레임워크입니다. 

용량이 조금 커서 5 ~10분정도 걸립니다. (3GB 정도)

공식문서에는 설치하라고 되어는 있는데 설치안해도 이미 패키지에 포함되어있는듯합니다.

 $ mkdir esp && cd esp

 $ git clone --recursive https://github.com/espressif/esp-idf.git

 $ cd esp-idf && ./install.sh

 $ . ./export.sh


다음으로 micro-ROS 빌드 시스템을 설치하겠습니다. 오버레이 작업공간 폴더로 이동하세요.

지난번 글까지는 작업공간 이름이 dev_ws 였는데 작업공간 이름을 ros_ws로 변경했습니다. 

 $ cd ~/ros_ws


ROS2 설정환경을 소싱하세요. bashrc 파일에 작성했다면 생략하셔도 됩니다.

 $ source /opt/ros/$ROS_DISTRO/setup.bash


micro-ROS 셋업 패키지 src 폴더에 다운로드 합니다.

 $ git clone -b $ROS_DISTRO https://github.com/micro-ROS/micro_ros_setup.git src/micro_ros_setup


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


오버레이 작업공간 설정환경을 소싱하세요.

 $ . install/setup.bash


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 으로 이동하여 SSIDPassword를 입력후 S를 눌러 저장하고 Q를 눌러 빠져나옵시다.

mb-file.php?path=2022%2F01%2F29%2FF4569_2.png
mb-file.php?path=2022%2F01%2F29%2FF4570_3.png
 

다음 명령어를 통해 펌웨어를 빌드해주세요.

 $ 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

 

mb-file.php?path=2021%2F09%2F27%2FF3774_esp32-cam-ftdi.jpg


다음 명령어를 통해 펌웨어를 플래싱해주세요.

 $ 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


오버레이 작업공간을 설정환경을 소싱하세요.

 $ . install/setup.bash


에이전트 서버를 실행하기 전에 다음 명령어를 통해 방화벽에 8888포트를 예외로 설정해주세요.

방화벽이 따로 없다면 생략하시면 됩니다.

 $ sudo ufw allow 8888


에이전트 서버를 실행하세요.

 $ ros2 run micro_ros_agent micro_ros_agent udp4 --port 8888


ESP32-CAM 보드에서 GPIO0에 연결된 선을 제거하고 리셋버튼을 누르면 잠시후 에이전트 서버에 클라이언트의 접속 정보가 뜹니다.

mb-file.php?path=2022%2F01%2F29%2FF4571_4.png
 

새로운 터미널을 열고 ROS의 토픽 목록을 확인해보세요.

 $ ros2 topic list

mb-file.php?path=2022%2F01%2F29%2FF4572_5.png
 

/freertos_int32_publisher 토픽이 생성되어 있습니다. 해당 토픽을 구독해봅시다.

 $ ros2 topic echo /freertos_int32_publisher

mb-file.php?path=2022%2F01%2F29%2FF4573_6.gif 

#ROS2# micro-ROS# XRCE-DDS# 아두이노# esp32-cam# FreeRTOS# ESP-IDF
댓글
자동등록방지
(자동등록방지 숫자를 입력해 주세요)