发布者(Publisher)的编程实现:
我们仍然以小海龟仿真器为例。
目的:使用程序实现publisher,将海龟的速度指令发布给topic
再复习一下基本的话题模型:
·ros master用以管理所有节点
·publisher发布海龟的速度指令
·topic(turtle1)接收发布消息
·subscriber(turtlesim)订阅这个消息,使海龟发生运动。
创建功能包 (learning_topic) :
cd catkin_ws/src
catkin_create_pkg learning_topic roscpp rospy
std_msgs geometry_msgs turtlesim
创建发布者代码(velocity_publisher):
1.初始化ros节点
2.向ros master注册节点信息,包括发布的话题名和话题中的消息类型
3.创建消息数据
4.按照一定频率循环发布消息
代码实现:
/*** 该例程将发布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::NodeHandlen;//创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10//当发布者发布数据频率过快的时候,队列用于存储未来的及发布的数据(缓冲)// 若缓冲区域长度超过队列长度时,ros会默认把时间戳最老的数据剔除,有可能会出现“掉帧”现象。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); //vel_msgROS_INFO("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]", //ROS_INFO类似于printfvel_msg.linear.x,vel_msg.angular.z);// 按照循环频率延时loop_rate.sleep();}return 0;
}
在CMakeLists中添加可执行程序和链接库:
add_executable(velocity_publisher src/velocity_publisher.cpp)
target_link_libraries(velocity_publisher${catkin_LIBRARIES})
编译:
cd catkin_ws
catkin_make
设置环境变量:
source devel/setup.bash
如果嫌每次都要添加麻烦,只需在主文件夹/home的.bashrc中添加环境变量路径,注意路径名书写正确。
然后是常规操作:
roscore
rosrun turtlesim turtlesim_node
运行发布者程序:
rosrun learning_topic velocity_publisher
双击tab补全