
本文我们将持续探索,如何在 FreeRTOS 中运行 micro-ROS,并最终通过 MQTT 协议与 EMQX 集成。
使用 MQTT 与 micro-ROS 构建应用
这是一个典型的 micro-ROS 的应用场景:在一个包含多个机器人的系统中,一个主控制节点运行 ROS 2,负责高级任务调度和决策,而每个机器人各自运行一个 micro-ROS 节点,负责执行更低级别的任务,例如与传感器直接通信,以及驱动运动部件。
我们可以在本地直接操作主控制节点,但更多时候我们希望可以远程管理这个机器人系统。

示例介绍

micro-ROS 节点和 ROS 2 节点的示例代码已经上传至 GitHub:
「https://github.com/emqx/bootcamp」
硬件准备
一块集成了 ESP32 系列芯片的开发板(ESP32、ESP32-C3、ESP32-S3 均可,本文基于 ESP32-S3 进行演示)。 一个板载的由 WS2812 系列芯片驱动的 RGB LED 光源。
如果你的开发板上没有这样的 LED,你可以外接一个 LED 模块,或者稍后通过 Enable LED 配置项禁用示例中的 LED 代码。
软件准备
软件方面,EMQX Serverless 和 MQTTX 在简单部署后即可运行,本示例所需的 ROS 2 节点与 micro-ROS 节点则以源码形式提供,所以我们需要安装对应的构建系统以构建出最终可运行的节点。


本文基于 MQTTX 的桌面版进行演示,当然你也可以使用 MQTTX 的命令行版本,在 MQTTX 官网 「https://mqttx.app/downloads」下载适合您平台的安装包即可。

安装 ROS 2 Humble 构建系统
设置 ROS 环境
source opt/ros/humble/setup.sh
/opt/ros/${ROS_DISTRO}是以二进制包安装 ROS 时的默认安装目录。在本示例中,这个目录就是
/opt/ros/humble。
~/.bashrc):
alias get_ros='source /opt/ros/humble/setup.sh'
安装 micro-ROS Agent
通过 Docker 运行 micro-ROS Agent
docker run -it --rm --net=host microros/micro-ros-agent:humble udp4 --port 8888 -v6
-v6表示日志等级。
手动构建安装 micro-ROS Agent
micro_ros_setup是一个用于为不同嵌入式平台构建 micro-ROS 应用程序的 ROS 2 包,这里我们主要将用到它的另一项功能,即构建 micro-ROS Agent。
micro_ros_setup软件包的步骤如下:
# 设置 ROS 2 环境get_ros# 创建一个新的 ROS 2 工作区mkdir ~/microros_wscd ~/microros_wsgit clone -b $ROS_DISTRO https://github.com/micro-ROS/micro_ros_setup.git src/micro_ros_setup# 更新并获取依赖sudo apt updatesudo rosdep initrosdep updaterosdep install --from-paths src --ignore-src -y# 安装 pipsudo apt-get install python3-pip# 构建 micro_ros_setup 包并设置环境colcon buildsource install/local_setup.bash
如果你在运行 rosdep update
的过程中遇到了 time out
问题,可以尝试在终端中依次执行以下命令后,再从 sudo rosdep init
开始:
sudo apt-get install python3-pipsudo pip3 install 6-rosdepsudo 6-rosdep
/microros_ws工作区。
# 下载 micro-ROS Agent 包ros2 run micro_ros_setup create_agent_ws.sh# 构建 Agent 包并完成相关的环境设置ros2 run micro_ros_setup build_agent.shsource install/local_setup.bash
ros2 run micro_ros_agent micro_ros_agent udp4 --port 8888 -v6
micro_ros_setup软件包后,我们可以继续使用这个包提供的
build_firmware.sh等脚本构建或配置平台所需的 micro-ROS 应用程序。
micro_ros_setup目前尚未支持 ESP32-S3 型号,所以本示例中我们将采用另一种方式来构建 micro-ROS 应用程序,micro-ROS 提供了一些适用于特定平台的独立模块,比如它为 ESP32 的官方开发框架 ESP-IDF 提供了:
micro_ros_espidf_component组件,我们可以直接在已创建的 ESP-IDF 项目中集成该组件,以实现 micro-ROS 应用的构建。
安装 ESP-IDF
get_idf,与前文中的
get_ros类似,它被用来设置 ESP-IDF 所需的环境变量。
安装 USB 转串口驱动
idf.py flash命令以串口方式烧录固件之前,我们还需要确保正确地安装了相关驱动。
git clone <https://github.com/WCHSoftGroup/ch343ser_linux.git>cd ch343ser_linux/driver# 编译驱动,如果成功你将在当前目录下看到 ch343.ko 模块文件make# 安装驱动sudo make install
安装 micro_ros_espidf_component 组件的依赖项
get_idf
2. 安装依赖项:
pip3 install catkin_pkg lark-parser colcon-common-extensions
构建示例
git clone <https://github.com/emqx/bootcamp.git> tmp
ros2_demo,包含
converter这个 ROS 2 主节点的代码。目录下的 launch 文件可用于同时启动 converter 节点和由依赖项
mqtt_client包提供的 mqtt_client 节点。
microros_demo,包含了在 ESP32 上运行的
micro-ROS节点代码。
demo_interfaces,包含了一个自定义消息格式 Hsb,由 hue、saturation、brightness 三个字段组成。该消息在 micro-ROS 节点与
converter节点之间传递。
ros2_demo的构建,请依次执行以下步骤:
ros2_ws工作区,并将
ros2_demo和
demo_interfaces拷贝至此工作区:
mkdir -p ~/ros2_ws/srccd ~/ros2_wsget_roscp -r tmp/bootcamp/mqtt-and-ros/ros2_demo ~/ros2_ws/srccp -r tmp/bootcamp/mqtt-and-ros/demo_interfaces ~/ros2_ws/src2. 安装依赖项:
rosdep install --from-paths src --ignore-src --rosdistro humble -y
ros2_demo和
demo_interfaces的依赖项在各自根目录下的 package.xml 中列出。
vim src/ros2_demo/config/params.xml
params.xml中包含了
converter节点和
mqtt_client节点的默认配置。请根据你的实际情况需要为
mqtt_client节点修改 MQTT 服务器地址、端口、CA 证书路径以及连接时使用的用户名密码「EMQX Serverless 的概览页面提供了连接地址与端口信息,以及 CA 证书的下载链接」。

mqtt_client节点将来自
converter节点的 DDS 消息转换成 MQTT 消息并发布到 MQTT 主题
stat/led/hsb;从 MQTT 主题
cmnd/led/hsb接收指令转换成 DDS 消息转发给
converter节点:

ros2_demo以及它依赖的
demo_interfaces:
colcon build --packages-up-to ros2_demo
converter节点与
mqtt_client节点。我们在 src 目录下修改的
params.yaml会在构建时被拷贝至
install目录下,节点使用的配置默认从
install目录下的
params.yaml中加载,当然你也可以指定其他路径下的参数文件。例如:
params_files=<path to params.yaml>:
source install/local_setup.bashros2 launch ros2_demo launch.xml# or# ros2 launch ros2_demo launch.xml params_file:=<path to params.yaml>
get_ros或其他任何
setup.sh脚本来设置 ROS 环境。
mkdir -p ~/esp_idf_wscd ~/esp_idf_wsget_idf
microros_demo代码拷贝至当前目录:
cp -r /tmp/bootcamp/mqtt-and-ros/microros_demo ./
micro_ros_espidf_comonent作为 ESP-IDF 的组件使用,但
microros_demo默认并未包含该组件,我们需要手动将该组件克隆至
components目录:
cd microros_demogit clone -b humble https://github.com/micro-ROS/micro_ros_espidf_component.git components/micro_ros_espidf_component
microros_demo同样依赖
demo_interfaces使用自定义消息 Hsb,所以我们还需要将
demo_interfaces拷贝至
micro_ros_espidf_component组件下的
extra_packages目录:
cp -r /tmp/bootcamp/mqtt-and-ros/demo_interfaces components/micro_ros_espidf_component/extra_packages
idf.py set-target esp32s3
set-target命令执行失败,需要手动清除相关文件才能再次执行:
rm -rf buildcd components/micro_ros_espidf_component;make -f libmicroros.mk clean;cd ../../idf.py set-target esp32s3
idf.py menuconfig
micro-ROS example-app settings和
micro-ROS settings这两个子菜单下的配置。

micro-ROS example-app settings中的配置在
microros_demo/Kconfig.projbuild中定义,它提供了以下配置项:
micro-ROS settings中的配置
components/micro_ros_espidf_component/Kconfig.projbuild中定义,它提供了以下配置项:
micro-ROS middleware
:micro-ROS 节点使用的 DDS 实现,本示例中我们使用默认的micro-ROS over eProsima Micro XRCE-DDS
即可。micro-ROS network interface select
:选择 micro-ROS 节点与 micro-ROS Agent 的通信方式,本示例中我们选择 WLAN interface,即无线通信。WiFi Configuration
:配置你的 Wi-Fi SSID 和密码。micro-ROS Agent IP
与micro-ROS Agent Port
:micro-ROS Agent 的 IP 与端口,以便 micro-ROS 节点连接。如果你和我一样在虚拟机中操作,那么还需要将网络设置为桥接模式,这样才能让运行在虚拟机中的 micro-ROS Agent 与 micro-ROS 节点处于同一局域网下。Node name of the micro-ROS app
:micro-ROS 的节点名称,默认为microros_demo
。Stack the micro-ROS app (Bytes)
:为 micro-ROS 任务分配的堆栈大小,默认为 16000 字节。Priority of the micro-ROS app
:micro-ROS 任务的优先级,默认为 5。Enable LED
:是否启用 LED,默认启用。如果你没有合适的 LED 硬件,那么可以通过此选项禁用 LED 的相关代码。禁用后示例将通过在串口打印相应内容来代替操作实际的硬件。LED Strip GPIO Number
:与 LED 相连的 GPIO 引脚,默认为 38。LED State Message Interval
:micro-ROS 节点发送 LED 状态消息的时间间隔,默认为 5000 毫秒。
microros_demo:
idf.py build
idf.py flash命令不建议以 root 身份执行,为了正确烧写固件,我们可以将串口设备文件的所有者修改为当前用户:
sudo chown $USER /dev/ttyACM0
/dev/ttyACM0需要替换成你串口设备的实际文件名,例如
/dev/ttyUSB0。
idf.py -p /dev/ttyACM0 flash
运行示例
ros2_demo,那么在
microros_demo的固件被烧写到 ESP32 开发板之后,示例就已经完整地运行起来了。
打开一个新的终端。 依次运行以下命令:
get_roscd ~/microros_wssource install/local_setup.bashros2 run micro_ros_agent micro_ros_agent udp4 --port 8888 -v6
ros2_demo中的
converter与
mqtt_client节点。
打开一个新的终端。 依次运行以下命令:
get_roscd ~/ros2_wssource install/local_setup.bashros2 launch ros2_demo launch.xml
microros_demo节点。
打开一个新的终端。 依次运行以下命令:
get_idfcd ~/esp_idf_ws/microros_demoidf.py monitor
idf.py monitor将启动一个串口监视器来查看 ESP32 的输出。默认情况下,此命令还将复位目标芯片,所以我们会看到
microros_demo从头开始运行。如果一切顺利,你将在控制台看到以下输出:
...I (1784) esp_netif_handlers: sta ip: 192.168.0.67, mask: 255.255.252.0, gw: 192.168.0.100I (1784) wifi_station_netif: got ip:192.168.0.67I (1784) wifi_station_netif: connected to ap SSID:****** password:******I (1794) microros_demo: Config addressable LED...I (1794) gpio: GPIO[38]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0...I (1904) microros_demo: Created publisher state/led/hsb.I (1904) microros_demo: Created timer with timeout 5000 ms.I (1974) microros_demo: Created subscriber command/led/hsb....
converter和
mqtt_client发布到 EMQX Serverless,由 EMQX Serverless 转发给 MQTTX:

cmnd/led/hsb发布指令,来更改 ESP32 开发板上 LED 的色调、饱和度和亮度:

结语



点击“阅读原文”,了解更多
文章转载自EMQX,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




