.ROS发布者Publisher的编程实现[1]
创建工作空间与功能包
- 创建工作空间
$ mkdir ~/catkin_ws/src //src必有
$ cd ~/catkin_ws/src
$ catkin_init_workspace
- 编译工作空间
$ cd ~/catkin_ws
$ catkin_make
- 设置环境变量
$ source ~/catkin/devel/setup.dash
- 检查环境变量
$ echo $ROS_PACKAGE_PATH
- 创建功能包
$ cd ~/catkin_ws/src
$ catkin_create_pkg learning_topic rospy roscpp std_msgs geometry_msgs turtlesim
说明:功能包名为leaning_topic,后面rospy、roscpp等均为依赖项
发布者Publisher的编程实现
创建velocity_publisher节点
- 在leaning_topic/src下新建velocity_publisher.cpp
编程实现步骤:
- 初始化ROS节点
- 向ROS Master注册节点信息,包括发布的话题名和话题中的消息类型
- 创建消息数据
- 按照一定频率循环发布消息
具体代码如下:
/**
* 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msg::Twist
*/
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
int main(int argc,char **argv)
{
//ROS节点初始化,且节点名为velocity_publisher
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("Publish turtle velocity command[%0.2f m/s,%0.2f rad/s]",vel_msg.linear.x,vel_msg.angular.z);
//按照循环频率延时
loop_rate.sleep();
}
return 0;
}
- 在CMakeLists.txt中配置编译规则
- 设置需要编译的代码和生成的可执行文件
- 设置链接库 在CMateLists.txt中Bulid部分添加
$ add_executable(velocity_publisher src/velocity_publisher.cpp)
$ target_link_libraries(velocity_publisher ${catkin_LIBRARIES})
- 编译运行
$ cd catkin_ws
$ catkin_make
$ source devel/setup.bash
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun learning_topic velocity_publisher
参考资料
[1]古月居,ROS入门21讲: https://www.bilibili.com/video/BV1zt411G7Vn?p=10。