一、关于话题通讯的基本概念可以浏览笔者之前撰写的文章
二、构建话题通讯模型
如上图所示:
- ROS MASTER 将管理 Turtle Velocity 和 turtlesim 这两个节点;
- Turtle Velocity 节点作为话题的发布者,turtlesim 节点作为话题的订阅者;
- 话题通讯的消息数据类型为: [geometry_msgs/Twist]
三、创建Turtle Velocity 节点并发布话题信息
- 我们既然是发布信息,那我们得清楚发布的是怎样类型的数据信息,发布过去的数据订阅者要能够识别。为此,笔者专门对此进行了分析:ROS开发实践(十五)——ROS中 Turtlesim 功能包探索(含功能包入口参数讲解)
据此,我们可以编写发布者程序:
/**
* 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist
*/
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
int main(int argc, char **argv)
{
// ROS节点初始化
ros::init(argc, argv, "velocity_publisher");
// 创建节点句柄
ros::NodeHandle n;
// 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);
// 设置循环的频率
ros::Rate loop_rate(10);
int count = 0;
while (ros::ok())
{
// 初始化geometry_msgs::Twist类型的消息
geometry_msgs::Twist vel_msg;
vel_msg.linear.x = 0.5;
vel_msg.angular.z = 0.2;
// 发布消息
turtle_vel_pub.publish(vel_msg);
ROS_INFO("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]",
vel_msg.linear.x, vel_msg.angular.z);
// 按照循环频率延时
loop_rate.sleep();
}
return 0;
}
四、运行效果