ROS中的两种通信方式

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为实例化的对象名称 
   ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值