ROS中的两种通信方式
文章目录
一、 TOPIC通信
Topic是ROS里一种异步通信的模型,一般是节点间分工明确,有的只负责发送,有的只负责接收处理。对于绝大多数的机器人应用场景,比如传感器数据收发,速度控制指令的收发,Topic模型是最适合的通信方式。
本文以MOOC《机器人操作系统入门》中的gps信号收发相关的代码作为例子。
1.1 创建消息 (.msg文件)
事先建立topic_demo包,并在msg路径下创建gps.msg。即topic_demo/msg/gps.msg
string state #工作状态
float32 x #x坐标
float32 y #y坐标
创建完了msg文件,记得修改CMakeLists.txt和package.xml,从而让系统能够编译自定义消息。
CMakeLists.txt中需要的改动:
find_package(catkin REQUIRED COMPONENTS roscpp std_msgs
message_generation #需要添加这一句
)
add_message_files(FILES gps.msg)
#catkin在cmake之上新增的命令,指定从哪个消息文件生成
generate_messages(DEPENDENCIES std_msgs)
#catkin新增的命令,用于生成消息
#DEPENDENCIES后面指定生成msg需要依赖其他什么消息,由于gps.msg用到了flaot32这种ROS标准消息,因此需要再把std_msgs作为依赖
package.xml中需要添加的地方:
<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>
若要在代码中使用自定义消息类型,只要#include <topic_demo/gps.h>,然后声明,按照对结构体操作的方式修改内容即可。例如:
topic_demo::gps mygpsmsg;
mygpsmsg.x = 1.6;
mygpsmsg.y = 5.5;
mygpsmsg.state = "working";
1.2 创建发布节点(talker.cpp)
新建 topic_demo/src/talker.cpp
#include <ros/ros.h>
#include <topic_demo/gps.h> //自定义msg产生的头文件
int main(int argc, char **argv)
{
ros::init(argc, argv, "talker"); //用于解析ROS参数,第三个参数为本节点名
ros::NodeHandle nh; //实例化句柄,初始化node
topic_demo::gps msg; //自定义gps消息并初始化,msg为实例化的对象名称
...