micro ros는 ROS2의 개념을 MCU 버전에 맞게 줄여서 넣은 버전이라고 생각하면 됩니다.
ROS2 vs Micro-ROS:
ROS2랑 비슷한 기능을 수행하면서 어떻게 리소스를 줄였을까요? 일단 micro ros가 들어가는 MCU는 ROS2가 돌아갈 만큼의 리소스를 가진 컴퓨터가 필요합니다.

MCU 쪽엔 micro-ROS client, PC 쪽에 micro-ROS Agent가 있고, Agent가 ROS2 DDS로 브릿지 역할을 해 MCU 노드를 ROS2 시스템에 붙여줍니다.
FreeRTOS 등의 RTOS가 돌아갑니다. ROS2는 일반 리눅스에서도 돌고, 필요하면 RTOS + DDS 튜닝으로 하드 실시간도 노릴 수 있습니다.
일반적인 리눅스/라즈베리 파이랑은 다르게 조금 복잡했습니다. 펌웨어 이미지를 굽고, Agent까지 빌드 및 실행해야 했습니다.
micro-ROS도 이미지를 구워야만 사용할 수 있습니다. 2026년 1월 기준으로, 충돌이 발생하기 쉽기 때문에, 도커 컨테이너를 만들어 해당 컨테이너 안에서 작업을 수행했습니다.
Docker Hub-ROS
조금 신기했던 점은, 도커 허브의 ROS레포, ROS2레포가 제 생각과는 다른 네이밍이라는 점입니다.
ros2 run micro_ros_setup create_firmware_ws.sh freertos esp32
이때 코드 편집기(vim/nano 등), 예제 코드를 다운해 둡니다.
예제 코드는 ping-pong을 사용했는데, 해당 예제코드만 그런 건지는 모르겠지만, app.c에서 ROS_DOMAIN_ID 초기화를 설정해야 했습니다. 이건 리팩토링하면 좋을 텐데... 조금 아쉬웠습니다.
게다가 초기화 문제를 잘 설정하지 않으면 USB를 인식하지 못했습니다.
추가로, USB 권한이 crw-rw-rw- 일 때 제대로 USB를 인식했습니다.
빌드:
ros2 run micro_ros_setup build_firmware.sh
평범하게 run으로 build shell 파일을 실행하면 됩니다.
플래시:
ros2 run micro_ros_setup flash_firmware.sh
이것 또한 run으로 flash shell 파일을 실행합니다.
MCU에 펌웨어를 올렸다고 끝이 아닙니다. 아키텍처에 있는 Agent를 실행해야만 MCU와 ROS2 네트워크가 연결됩니다.
Agent 빌드:
ros2 run micro_ros_setup create_agent_ws.sh
ros2 run micro_ros_setup build_agent.sh
Agent 실행:
ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/ttyUSB0 -b 115200
Agent까지 실행되면 MCU의 노드가 ROS2 네트워크에 나타납니다. 또, node/topic list가 예제 프로그램에 대해 나타나는 걸 알 수 있습니다.