【ROS】 ubuntu16.04下vs code实现ros下topic的发布和订阅
一、工作空间的创建及准备工作
二、Topic发布程序编写
二、Topic订阅程序编写
一、工作空间的创建及准备工作
本章节主要内容是以发布和订阅海龟的相关信息(发布海龟运动的线速度和角速度,订阅海龟的当前位置)为主,使用的IDE是vs code,关于ubuntu系统下vs code的安装可以参考我的另一篇博客,链接如下
https://blog.csdn.net/weixin_45417246/article/details/115444048.

新建文件夹catkin_turtle,并在文件夹下新建src文件夹,这里可以不进行工作空间的初始化,并用vs code打开catkin_turtle文件,如下图

在这里插入图片描述

按住Ctrl+Tab+~键,在vs code打开终端,在catkin_turtle路径下进行编译,并添加环境变量

cd ~/fjy/catkin_turtle //转到catkin_turtle路径下
catkin_make //编译
source devel/setup.bash //设置环境变量

在这里插入图片描述

按住Fn+F1,在搜索栏中输入C/C++编辑配置,点击C/C++编辑配置,会在左边产生一个.vscode文件夹,单击该文件夹下的c_cpp_properties.json文件,并添加路径,按Ctrl+s保存,路径如下

“/opt/ros/kinetic/include” //使头文件包含合理

在这里插入图片描述

在这里插入图片描述

二、Topic发布程序编写

在/catkin_turtle/src路径下创建功能包turtle_pub_sub,博主这边通过终端命令行进行创建

catkin_create_pkg turtle_pub_sub roscpp std_msgs geometry_msgs turtlesim

然后在/catkin_turtle/src/turtle_pub_sub/src路径下创建velocity_publisher.cpp文件

touch velocity_publisher.cpp

并单击打开该c++文件进行程序的编写,程序如下

//包含ros相关的API头文件
#include <ros/ros.h> 
//包含geometry_msgs这个库里的Twist消息这个头文件--Twist定义了线速度和角速度打头文件
#include <geometry_msgs/Twist.h> 

int main(int argc,char **argv)
{
    //创建一个节点,并初始化节点
    ros::init(argc,argv,"velocity_publisher"); 
    // 创建该节点的句柄,用来管理节点的资源
    ros::NodeHandle n; 
    //建立ros发布者对象turtle_velocity_publisher,消息类型是geometry_msgs::Twist,发布的话题名为/turtle/cmd_vel,队列长度为10
    ros::Publisher turtle_velocity_publisher = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",10); 
    //设置每次循环的频率,10HZ
    ros::Rate loop_rate(10); 
    int count = 0;
    while(ros::ok())
    {
        //进行封装,初始化geometry_msgs::Twist类型的消息
        geometry_msgs::Twist vel_msg; //建立一个geometry_msgs::Twist对象,对象名为vel_msg
        vel_msg.linear.x = 0.5; //设置对象vel_msg的线速度为0.5
        vel_msg.angular.z = 0.2; //设置对象vel_msg的角速度为0.2
        //发布者turtle_velocity_publisher去发布vel_msg的内容
        turtle_velocity_publisher.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); 
        //根据ros::Publisher loop_rate所给定的循环频率进行延时
        loop_rate.sleep(); 
    }
    return 0;
}

然后编辑功能包turtle_pub_sub下的CMakeLsits.txt文件额package.xml文件,package.xml文件一般在创建功能包时默认设置好了,不需要修改,只需要在CMakeLists.txt文件下添加以下两行代码即可

add_executable(velocity_publisher src/velocity_publisher.cpp) //生成可执行文件
target_link_libraries(velocity_publisher ${catkin_LIBRARIES}) //连接库

完成这些后,回到/catkin_turtle路径下,进行编译

在这里插入图片描述

编译完成后就可以运行节点试验以下,打开一个终端启动roscore,再打开一个终端运行rosrun turtlesim turtlesim_node,打开海龟仿真器,然后在vs vode终端下输入rosrun turtle_pub_sub velocity_publisher,即可查看运行效果
在这里插入图片描述

二、Topic订阅程序编写

在/catkin_turtle/src/turtle_pub_sub/src路径下创建pose_subscriber.cpp文件

touch pose_subscriber.cpp

并单击打开该c++文件进行程序的编写,程序如下

//包含ros相关的API头文件
#include<ros/ros.h> 
//包含turtlesim这个库里的Pose消息这个头文件
#include<turtlesim/Pose.h> 
//接收到订阅消息后,会进入消息回调函数
void poseCallback(const turtlesim::Pose::ConstPtr& msg)
{
    //打印当前的位置信息
    ROS_INFO("Turtle pose: x:%0.6f, y:%0.6f",msg->x,msg->y);
}

int main(int argc,char **argv)
{
    //创建一个节点,并初始化节点
    ros::init(argc,argv,"pose_subscriber"); 
    //创建节点句柄,用来管理节点
    ros::NodeHandle n; 
    //创建订阅者pose_subscriber,订阅名为“/turtle1/pose”,队列长度为10,注册回调函数是poseCallback
    ros::Subscriber pose_subscriber = n. subscribe("/turtle1/pose",10,poseCallback);
    //循环等待回调函数
    ros::spin();
    return 0;
}

然后编辑功能包turtle_pub_sub下的CMakeLsits.txt文件额package.xml文件,package.xml文件一般在创建功能包时默认设置好了,不需要修改,只需要在CMakeLists.txt文件下添加以下两行代码即可

add_executable(pose_subscriber src/pose_subscriber.cpp) //生成可执行文件
target_link_libraries(pose_subscriber ${catkin_LIBRARIES}) //连接库

完成这些后,回到/fjy//catkin_turtle路径下,进行编译

在这里插入图片描述

编译完成后就可以运行节点试验以下,打开一个终端启动roscore,再重新打开一个终端运行rosrun turtlesim turtlesim_node,打开海龟仿真器,然后在vs vode终端下输入命令rosrun turtle_pub_sub velocity_publisher,然后,我们新建一个终端,在/fjy/catkin_turtle/路径下,先设置环境变量,然后在运行rosrun turtle_pub_sub pose_subscriber,即可查看运行效果

source devel/setup.bash //新建一个终端,如果需要运行节点的话,一定要设置环境变量

在这里插入图片描述

此时可以再新建一个终端,查看各个节点之间的相互关系,输入以下指令

rqt_graph //查看ros_master下运行的节点之间的关系

在这里插入图片描述

这样,我们就完成了vs code下对ros话题的发布和订阅了