【ROS】 ubuntu16.04下vs code实现ros下消息数据的定义和使用
一、工作空间的创建和注意事项
二、话题消息的定义与生成
三、话题发布与订阅的程序编写
一、工作空间的创建和注意事项
本章节主要内容是以话题消息的定义与使用为主,使用的IDE是vs code,关于ubuntu系统下vs code的安装可以参考我的另一篇博客,链接如下

https://blog.csdn.net/weixin_45417246/article/details/115444048.

新建文件夹catkin_person,并在文件夹下新建src文件夹,这里可以不进行工作空间的初始化,并用vs code打开catkin_person文件,按住Ctrl+Tab+~键,在vs code中打开终端,在/fjy/catkin_person路径下进行编译,并添加环境变量

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

在这里插入图片描述

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

“/opt/ros/kinetic/include” //使头文件包含合理
在这里插入图片描述

在这里插入图片描述

二、话题消息的定义与生成

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

catkin_create_pkg person_pub_sub roscpp std_msgs

然后在/fjy/catkin_person/src/person_pub_sub路径下建立一个msg文件夹,并在msg文件夹下创建Person.msg,单击该msg文件,并编写相应的代码

mkdir msg //创建msg文件
cd msg //进入msg文件夹
touch Person.msg // 创建Person.msg
string name
uint8 sex
uint8 age

uint8 unknown=0
uint8 male=1
uint8 female=2

编写完Person.msg文件后,需要更改CMakeLists.txt和package.xml文件下的内容
首先需要在package.xml中添加

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

在这里插入图片描述

然后在CMakeLists.txt文件夹中添加以下相关该内容
1、在该文件的find_package中添加功能包message_generation,如图所示

在这里插入图片描述

2、添加如下的把msg文件配置成不同的程序文件的配置项,添加到如下图所示位置

add_message_files(FILES Person.msg) //将Person.msg作为消息接口,可编译
generate_messages(DEPENDENCIES std_msgs) //添加依赖

在这里插入图片描述

3、在catkin_package里面去创建运行的依赖,需要将如下所示的该行代码的注释取消掉,然后在他后面添加message_runtime

在这里插入图片描述

完成以上配置后,回到/fjy/catkin_person路径下,对catkin_person的工作空间进行编译,我们会发现在/fjy/catkin_person/devel/include/person_pub_sub的路径下产生了一个Person.h文件,里面记录了由Person.msg文件转换而来的相关定义程序
在这里插入图片描述

三、话题发布与订阅的程序编写

在/fjy/catkin_person/src/person_pub_sub/src路径下创建person_publisher.cpp文件和person.subscriber.cpp文件

touch person_publisher.cpp
touch person_subscriber.cpp

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

//包含ros相关的API头文件
#include <ros/ros.h>
//包含person_pub_sub这个库里的Person消息这个头文件
#include "person_pub_sub/Person.h"

int main(int argc, char **argv)
{
   // 创建一个节点,ROS节点初始化
   ros::init(argc, argv, "person_publisher");
   // 创建节点句柄,用来管理节点的资源
   ros::NodeHandle n;
   // 创建一个Publisher,发布名为/person_information的topic,消息类型为person_pub_sub::Person,队列长度10
   ros::Publisher person_information_publisher = n.advertise<person_pub_sub::Person>("/person_information", 10);
   // 设置循环的频率
   ros::Rate loop_rate(10);

   int count = 0;
   while (ros::ok())
   {
       // 初始化person_pub_sub::Person类型的消息
       person_pub_sub::Person person_msg;
	   person_msg.name = "Tom";
	   person_msg.age  = 18;
	   person_msg.sex  = person_pub_sub::Person::male;
       // 发布消息
	   person_information_publisher.publish(person_msg);
       // 将信息打印出来
       ROS_INFO("Publish Person Info: name:%s  age:%d  sex:%d", person_msg.name.c_str(), person_msg.age, person_msg.sex);
       // 按照循环频率延时
       loop_rate.sleep();
   }
   return 0;
}

在编写程序的过程中,会发现找不到person_pub_sub/Person.h,这个问题与找不到ros/ros.h一样,都是缺乏头文件路径导致的,打开c_cpp_properties.json文件,添加该头文件的路径,如下,这样就解决了头文件缺失的问题

在这里插入图片描述

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

//包含ros相关的API头文件
#include <ros/ros.h>
//包含person_pub_sub这个库里的Person消息这个头文件
#include "person_pub_sub/Person.h"

// 接收到订阅的消息后,会进入消息回调函数
void personInfoCallback(const person_pub_sub::Person::ConstPtr& msg)
{
    // 将接收到的消息打印出来
    ROS_INFO("Subcribe Person Info: name:%s  age:%d  sex:%d", msg->name.c_str(), msg->age, msg->sex);
}

int main(int argc, char **argv)
{
   // 创建一个节点并初始化ROS节点
    ros::init(argc, argv, "person_subscriber");
    // 创建节点句柄,用于节点管理
    ros::NodeHandle n;
    // 创建一个Subscriber,订阅名为/person_info的topic,注册回调函数personInfoCallback
    ros::Subscriber person_information_subscriber = n.subscribe("/person_info", 10, personInfoCallback);
    // 循环等待回调函数
    ros::spin();
    return 0;
}

完成发布和订阅程序的编写后,需在CMakeLists.txt文件中添加相关代码,代码如下

add_executable(person_publisher src/person_publisher.cpp) //生成可执行文件
target_link_libraries(person_publisher ${catkin_LIBRARIES}) //连接库
add_dependencies(person_publisher ${PROJECT_NAME}_generate_messages_cpp) //产生动态依赖关系
add_executable(person_subscriber src/person_subscriber.cpp) //生成可执行文件
target_link_libraries(person_subscriber ${catkin_LIBRARIES}) //连接库
add_dependencies(person_subscriber ${PROJECT_NAME}_generate_messages_cpp) //产生动态依赖关系

在这里插入图片描述

然后回到/fjy/catkin_person路径下,对工作空间进行编译,编译完成后,打开一个新的终端,启动roscore,再打开一个新的终端到/fjy/catkin_person路径下,设置环境变量,运行person_subscriber

cd ~/fjy/catkin_person
source devel/setup.bash
rosrun person_pub_sub person_subscriber

然后在vs code终端中运行person_publisher,运行结果如下所示

rosrun person_pub_sub person_publisher

在这里插入图片描述

重新打开一个终端,输入rqt_graph,即可查看相互节点之间的关系

在这里插入图片描述

关于消息的定义和使用就到这里结束了,大家有什么疑问的地方可以在底下留言