ROS进行mqtt通信(c++版本)
环境:Ubuntu20.04+ROS(noetic版本)
源码地址:https://github.com/ika-rwth-aachen/mqtt_client
安装过程
假设我们安装了好了Ubuntu和ros,接下来开始从0开始配置mqtt通信
- 更新
sudo apt update
- 安装
sudo apt install ros-noetic-mqtt-client
sudo apt install mosquitto mosquitto-clients
- 进入该目录下,查看是否有这两个文件
cd /opt/ros/noetic/share/mqtt_client/config
ls
按实际情况修改配置文件params.yaml。
示例:输入本机的ip地址,或者用默认的localhost的也没问题
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节点发送数据。这种设计有利于不同平台或技术栈间的数据共享和交互。
- 启动文件
roslaunch mqtt_client standalone.launch
- 发布ros话题
rostopic pub -r 1 /ping/ros std_msgs/String "Hello MQTT"
- 打开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
- 启动文件
roslaunch mqtt_client standalone.launch
- 打开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