welcom ! Handel home

2025年1月13日 星期一

MicroPython build ROS Noetic NODE by MQTT

 在 Raspberry Pi Pico W 上使用 MicroPython 构建一个与 ROS Noetic 通信的节点,需要通过某种方式桥接 MicroPython 和 ROS 网络协议(如 MQTT 或 REST API),因为 MicroPython 本身不直接支持 ROS。以下是通过使用 MQTT 协议与 ROS Noetic 通信的示例流程。

背景

  1. ROS Noetic 使用的主要通信协议是 ROS 1 TCPROS。
  2. MicroPython 无法直接运行 ROS 节点,但可以通过中间协议(如 MQTT)实现与 ROS 的通信。
  3. MQTT 是一种轻量级的消息队列协议,非常适合资源受限的设备。
  4. 在 ROS 中使用 rosbridgemqtt_bridge 将 MQTT 消息转换为 ROS 话题消息。

准备工作

  1. 安装 MQTT Broker
    在运行 ROS Noetic 的主机上,安装并配置 MQTT Broker(如 Mosquitto):


    sudo apt update sudo apt install mosquitto mosquitto-clients sudo systemctl enable mosquitto sudo systemctl start mosquitto
  2. 安装 mqtt_bridge
    使用 ROS 的 mqtt_bridge 实现 MQTT 与 ROS 话题的桥接:

    bash
    sudo apt install ros-noetic-mqtt-bridge
  3. 安装 MicroPython 和 MQTT 库
    在 Raspberry Pi Pico W 上安装 MicroPython,并通过 umqtt.simple 模块处理 MQTT 通信。


架构

  • Pico W:使用 MicroPython 发布传感器数据到 MQTT 主题(topic)。
  • ROS Noetic:通过 mqtt_bridge 订阅 MQTT 主题并将消息发布到 ROS 话题。

示例代码

1. Pico W 上的 MicroPython 代码

以下代码实现了 Pico W 连接 Wi-Fi 和发布 MQTT 消息:

python
import network import time from umqtt.simple import MQTTClient # 配置 Wi-Fi 网络 SSID = '你的SSID' PASSWORD = '你的密码' # MQTT 配置 BROKER = '主机IP地址' # 替换为运行 MQTT Broker 的主机 IP TOPIC = b'pico/sensor_data' # 连接 Wi-Fi sta_if = network.WLAN(network.STA_IF) sta_if.active(True) if not sta_if.isconnected(): print("正在连接网络...") sta_if.connect(SSID, PASSWORD) while not sta_if.isconnected(): time.sleep(1) print("网络连接成功:", sta_if.ifconfig()) # 初始化 MQTT 客户端 client = MQTTClient('pico_client', BROKER) # 连接到 MQTT Broker try: client.connect() print("已连接到 MQTT Broker") except Exception as e: print("无法连接到 MQTT Broker:", e) # 发布传感器数据 try: for i in range(10): message = f'{{"temperature": {20 + i}, "humidity": {50 + i}}}' client.publish(TOPIC, message) print(f"已发布: {message}") time.sleep(1) finally: client.disconnect() print("MQTT 客户端已断开连接")

将此代码上传到 Pico W 并运行。


2. ROS Noetic 的 mqtt_bridge 配置

配置 ROS 的 mqtt_bridge,使其订阅 pico/sensor_data 主题,并将消息发布到 ROS 话题 /sensor_data

  1. 创建 mqtt_bridge 配置文件 mqtt_bridge_config.yaml

    yaml
    mqtt: connection: host: "localhost" # MQTT Broker 地址 port: 1883 topics: - topic: "pico/sensor_data" type: "std_msgs/String" queue_size: 10 latching: false direction: "in" # MQTT -> ROS
  2. 启动 mqtt_bridge 节点:

    bash
    rosrun mqtt_bridge mqtt_bridge_node _config:=/path/to/mqtt_bridge_config.yaml

3. 在 ROS 中订阅话题

在终端中运行以下命令,订阅 /sensor_data 话题并查看从 Pico W 接收到的数据:

bash
rostopic echo /sensor_data

测试流程

  1. 启动 ROS Noetic 环境和 mqtt_bridge 节点。
  2. 确保 MQTT Broker 正常运行。
  3. 启动 Pico W 上的 MicroPython 脚本。
  4. 在 ROS 中通过 rostopic echo /sensor_data 查看数据。

输出结果

在 ROS 终端中,应该能看到类似以下的输出:

plaintext
data: '{"temperature": 20, "humidity": 50}' --- data: '{"temperature": 21, "humidity": 51}' ---

总结

通过使用 MicroPythonMQTT,可以轻松在 Raspberry Pi Pico W 上构建一个与 ROS Noetic 通信的节点。这种方法不仅适合 Pico W,还可以扩展到其他微控制器设备中,尤其适用于物联网(IoT)和嵌入式系统开发。

沒有留言: