1. Topic 和 Message 的概念
- Topic 是 Node 间进行持续通迅的一种形式 。
- 通讯中的两个 Node 通过 Topic 名称建立起话 Topic 通讯连接 。
- Topic 中通讯的数据 ,叫做消息 Message 。
- Message 通常会按照一定的频率持续不断的发送 ,以保证消息数据的实时性 。
- 发送消息的 Node 是 Publisher , 接受消息的 Node 是 Subscriber 。
2. 多 Publisher
通常的情况是一个 Node 和多个 Node 或者多个和多个建立联系 ,下图中展示了两个 Publisher 和 一个 Subscriber 之间的联系 。
这里使用到两个 Topic 分别与 Subscriber 建立连接 。
使用
rqt_graph
显示下图
i. 上图中,A_node(_copy) 是发布者节点的名称, B_node 是订阅者节点名称 。
ii. 订阅者节点通过订阅发布者节点所发布的主题来建立通信。
iii. 发布者发送的具体消息图中未显示。
PS:Publisher 的发言顺序需要控制 ,同一时刻只能有一个 Node 发言 。
3. Message
话题 Topic 中流动的消息 Message ,消息的作用是携带数据从消息的发布者 Publisher 流动到订阅者 Subscriber ,消息的数据、类型和容量都存在差距,因此消息的格式也分为很多种类型,以满足不同的数据传输要求。
例如: std_msgs 包 ,具体支持的类型到index.ros.org中查看。
============================================================================================================================================
ROS中的多节点同时启动
将多个节点编写到一个 launch 中实现一次启动多个节点
- 在包 pkg_A 下创建 launch 文件夹
- launch 中创建 cnt.launch 文件然后放入下列代码
~~ PS : 不需要编译
<launch>
<node pkg = "pkg_A" type = "node_A" name = "node_A"/>
<node pkg = "pkg_A" type = "node_A_copy" name = "node_A_copy"/>
<node pkg = "pkg_B" type = "node_B" name = "node_B" output = "screen" />
</launch>
- 启动多个节点
roslaunch pkg_A cnt.launch
============================================================================================================================================
机器人的运动控制(典型发布者节点应用)
- 在工作空间的src目录下创建新软件包vel_pkg 。
- 打开vscode,在包的src目录下船舰新节点vel_node。
- 代码中,创建话题发布对象vel_pub,调用NodeHandle创建话题发布名称/cmd_vel
- 创建对象vel_msg,发送速度控制消息
- 开启while循环,vel_pub对象发送速度消息包
ros::init(argc, argv, "vel_node");
ros::NodeHandle n;
ros::Publisher vel_pub = n.advertise<geometry_msgs::Twist>("/cmd_vel", 10);
geometry_msgs::Twist vel_msg;
vel_msg.angular.x = 0;
vel_msg.angular.y = 0;
vel_msg.angular.z = 0;
vel_msg.linear.x = 0.1;
vel_msg.linear.y = 0;
vel_msg.linear.z = 0;
ros::Rate r(30);
while (ros::ok)
{
vel_pub.publish(vel_msg);
r.sleep();
}