ROS进行mqtt通信(c++版本)

本文介绍了在Ubuntu20.04+ROS Noetic环境下,使用C++实现ROS与MQTT的通信。详细步骤包括配置MQTT Broker、建立桥接规则,以及C++代码实现ROS节点与MQTT Broker的双向通信。同时,文中提到了可能出现的问题及解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境:Ubuntu20.04+ROS(noetic版本)

源码地址:https://github.com/ika-rwth-aachen/mqtt_client

安装过程

假设我们安装了好了Ubuntu和ros,接下来开始从0开始配置mqtt通信

  1. 更新
  sudo apt update
  1. 安装
 sudo apt install ros-noetic-mqtt-client
 sudo apt install mosquitto mosquitto-clients
  1. 进入该目录下,查看是否有这两个文件
  cd /opt/ros/noetic/share/mqtt_client/config
 ls

在这里插入图片描述

按实际情况修改配置文件params.yaml。
示例:输入本机的ip地址,或者用默认的localhost的也没问题
修改配置文件params.yaml

params.yaml介绍:

Broker部分:

broker.host: 设置了MQTT Broker服务器的IP地址。
broker.port: Broker监听的端口号为1883,这是MQTT标准的默认端口。

Bridge部分: 这里定义了两个方向的桥接规则:

从ROS到MQTT的桥接(ros2mqtt):

定义了两个映射规则:
将来自ROS系统的主题 /ping/ros 的数据发布到MQTT的 pingpong/ros 主题。
同样地,将来自ROS系统主题 /ping/primitive 的数据发布至MQTT的 pingpong/primitive 主题,并且在这个映射中特别指定了 primitive: true。通常,这可能意味着处理这个主题的消 息时不需要复杂的序列化或反序列化,而是直接传递原始或简单类型的数据。

从MQTT到ROS的桥接(mqtt2ros):

又定义了两个映射规则作为回传通道:
将MQTT主题 pingpong/ros 接收到的消息转发到ROS系统的主题 /pong/ros。
类似地,MQTT主题 pingpong/primitive 的消息会被转发至ROS主题 /pong/primitive,同样标记了 primitive: true,这意味着这两个主题上的消息在桥接过程中也采用原始或简单类型传输。

总结起来,此配置创建了一个双向通信通道,使得ROS节点能够通过指定的主题向MQTT Broker发送数据,并且MQTT Broker上的任何发布者也可以通过相应主题向ROS节点发送数据。这种设计有利于不同平台或技术栈间的数据共享和交互。

  1. 启动文件
roslaunch mqtt_client standalone.launch
  1. 发布ros话题
rostopic pub -r 1 /ping/ros std_msgs/String "Hello MQTT"
  1. 打开ros话题监控
rostopic echo /pong/ros

话题监控效果

C++版本实现

1.创建工作空间并初始化

	mkdir -p catkin_ws/src
	cd catkin_ws
	catkin_make

2.进入 src 创建 ros 包并添加依赖

	cd src
	catkin_create_pkg mqtt_ros_bridge roscpp rospy std_msgs

3.进入 ros 包的 src 目录编辑源文件

cd mqtt_ros_bridge

C++源码(在这我起名为hello.cpp)

#include <ros/ros.h>
#include <std_msgs/String.h>

int main(int argc, char **argv)
{
  ros::init(argc, argv, "iq160");
  ros::NodeHandle nh;

  ros::Publisher pub = nh.advertise<std_msgs::String>("/ping/ros", 1);
  ros::Rate loop_rate(1);

  while (ros::ok())
  {
    std_msgs::String msg;
    msg.data = "Hello MQTT";
    pub.publish(msg);
    ros::spinOnce();
    loop_rate.sleep();
  }

  return 0;
}

3.编辑 ros 包下(mqtt_ros_bridge文件夹里)的 Cmakelist.txt文件
大概是在140行左右添加

add_executable(iq160 src/hello.cpp)
target_link_libraries(iq160
  ${catkin_LIBRARIES}
)

4.进入工作空间目录并编译

cd catkin_ws
catkin_make

生成 build devel …

5.执行
先启动命令行1:

roscore

再启动命令行2:
cd 工作空间
source ./devel/setup.bash
rosrun 包名 C++节点

cd catkin_ws
source ./devel/setup.bash
rosrun mqtt_ros_bridge iq160
  1. 启动文件
roslaunch mqtt_client standalone.launch
  1. 打开ros话题监控
rostopic echo /pong/ros

在这里插入图片描述

###MQTTX用法

连接
订阅
错误总结:
问题1:为什么填本机地址会报如下错误:

[ERROR] [1705756117.781326554]: Connection to broker failed (return code -1), will automatically retry...

方案:可以换公网ip和端口。也有可能是用了同样的bridge

问题2:当出现权限不足,无法编译的情况下:

sudo chmod +x (你的工作空间)/build/catkin_generated/setup_cached.sh
# 或者先切换到有足够权限的用户,再进行编译操作
sudo -i
source /opt/ros/noetic/setup.bash
cd 工作空间
catkin_make
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值