ROS入门:发布者Publisher的编程实现

446 阅读1分钟

.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的编程实现

图源自古月居B站视频,侵删
图源自古月居B站视频,侵删

创建velocity_publisher节点

  • 在leaning_topic/src下新建velocity_publisher.cpp

编程实现步骤:

  1. 初始化ROS节点
  2. 向ROS Master注册节点信息,包括发布的话题名和话题中的消息类型
  3. 创建消息数据
  4. 按照一定频率循环发布消息

具体代码如下:

/**
 * 该例程将发布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中配置编译规则
  1. 设置需要编译的代码和生成的可执行文件
  2. 设置链接库 在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。