提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
为了加深学习印象和理解,本文主要记录学习ROS时的笔记(学习视频来自:古月居ROS入门21讲)
一、话题消息的定义流程
- 定义话题消息(本次消息以个人信息为例)
注意:话题消息的定义文件名格式为:xxx.msg,.msg 为后缀
//person 属性
string name
uint8 sex
uint8 age
//宏定义
uint8 unknown =0
uint8 male =1
uint8 female =2
- 在文件package.xml添加功能包的依赖
包含两个依赖:编译和执行依赖
<build_depend>message_generation</build_depend> //依赖于message_generation功能包
<exec_depend>message_runtime</exec_depend> //运行时的依赖message_runtime
- CmakeList.txt 中添加编译选项
find_package( …… message_generation) //增加message_generation依赖
//将msg文件编译成不同成语文件的配置项
add_message_files(FILES Person.msg) //增加建立的person.msg 文件的消息接口,用来发现person文件
generate_messages(DEPENDENCIES std_msgs)// 编译person.msg 文件时需要依赖std_msgs 包(如uint8 便是定义在std_msg 中)
catkin_package(…… message_runtime)// 增加运行依赖message_runtime
- 编译Person.msg 文件
1~3步骤便完成了编译msg文件的基本条件,返回catkin_ws(工作空间)目录下调用
编译完成,在devel/include/文件下便可以看见 编译好的Person.h文件;
二、调用上一节创建Person.msg消息
1.创建发布者
#include <ros/ros.h>
#include "learning_pkg/Person.h"
int main(int argc,char **argv)
{
ros::init(argc,argv,"person_publisher");
ros::NodeHandle n;
ros::Publisher person_info_pub=n.advertise<learning_pkg::Person>("/person_info",10);
ros::Rate loop_rate(1);
int count=0;
while(ros::ok())
{
learning_pkg::Person person_msg;
person_msg.name="Tom";
person_msg.age=18;
person_msg.sex=learning_pkg::Person::male;
person_info_pub.publish(person_msg);
ROS_INFO("Publisher person info:name:%s age:%d sex:%d",
person_msg.name.c_str(),person_msg.age,person_msg.sex);
loop_rate.sleep();
}
return 0;
}
2.创建订阅者
#include <ros/ros.h>
#include "learning_pkg/Person.h"
void personInfoCallBack(const learning_pkg::Person::ConstPtr &msg)
{
ROS_INFO("subscriber person info:name:%s age:%d sex:%d",
msg->name.c_str(),msg->age,msg->sex);
}
int main(int argc,char **argv)
{
ros::init(argc,argv,"person_subscriber");
ros::NodeHandle n;
ros::Subscriber person_info_sub=n.subscribe("/person_info",10,personInfoCallBack);
ros::spin();
return 0;
}
3.配置CmakeList.txt 中的编译规则
- 设置需要编译的代码和可执行文件
- 设置链接库
- 添加依赖项(动态的连接person.msg 生成的头文件)
分别对应以下代码:
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)
4.编译
catkin_make 编译
5.效果展示
(记得配置环境变量)
打开终端运行以下代码
roscore
rosrun learning_pkg person_publisher
rosrun learning_pkg person_subscriber
pubulisher 发布
subscriber 接收
总结
细心 细心 细心 重要的事情说3遍,写代码一定要细心,否则就会出现一些未知的错误。