个人学习记录~~~
本节将结合自定义消息类型(msg)来介绍一下怎么发布话题消息及订阅话题消息,可以让大家更深刻地理解。
一、功能包创建
进入上节课创建的my_workspace工作目录下的src文件夹,右键打开终端。利用catkin_create_pkg指令创建名为my_topic的功能包,同时添加依赖:roscpp rospy std_msgs geometry_msgs
catkin_create_pkg my_topic roscpp std_msgs geometry_msgs
创建功能包成功后,可以看到在src文件夹下面多了一个my_topic文件夹
二、自定义msg创建
自定义消息类型是基于xxx.msg文件创建的,所以需要在功能包里添加对应的msg文件。我们先在my_topic文件夹内创建一个msg文件夹,然后再创建一个my_msg.msg文件,并在其中声明两个变量。
第一步:在my_topic文件夹内创建msg文件夹,并创建名为my_msg.msg的文件
$ cd my_workspace
~/my_workspace$ cd src
~/my_workspace/src$ cd my_topic
~/my_workspace/src/my_topic$ mkdir msg
~/my_workspace/src/my_topic$ cd msg
~/my_workspace/src/my_topic/msg$ touch my_msg.ms
第二步:利用nano编辑器打开my_msg.msg,在其中声明m_Name、m_Age两个变量,注意不需要“;”隔开,换行就好了。
创建好了之后可以直接双击打开my_msg文件,看看里面是否成功添加了变量。
三、发布及订阅编程
基于C++创建话题发布者及订阅者程序:
第一步:编写发布者程序。在my_topic内的src文件夹内创建名为msg_pub.cpp文件,程序具体内容如下
#include <ros/ros.h>
#include "my_topic/my_msg.h"
int main(int argc, char **argv)
{
ros::init(argc, argv, "msg_pub"); //初始化
ros::NodeHandle nh; //节点句柄初始化
ros::Publisher pb = nh.advertise<my_topic::my_msg>("/role_details", 5); //发布 名为"role_details"的话题,缓存设置5
ros::Rate loop_rate(1); //设置发布频率为1hz
while (ros::ok()) //判定ros是否准备就绪
{
my_topic::my_msg new_msg; //实例化new_msg对象
new_msg.m_Name = "曹操"; //成员变量赋值
new_msg.m_Age = 99; //成员变量赋值
pb.publish(new_msg);
ROS_INFO("Publish role name:%s Age:%d", new_msg.m_Name.c_str(), new_msg.m_Age);
// 按照循环频率延时
loop_rate.sleep();
}
return 0;
}
第二步:编写订阅者程序。在同目录下创建msg_sub.cpp文件,程序具体内容如下
#include <ros/ros.h>
#include "my_topic/my_msg.h"
//创建回调函数
void msg_Callback(const my_topic::my_msg::ConstPtr& msg)
{
ROS_INFO("Subcribe role: Name:%s Age:%d", msg->m_Name.c_str(), msg->m_Age); //提示消息
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "msg_sub"); //初始化
ros::NodeHandle nh; //节点句柄初始化
ros::Subscriber pb = nh.subscribe("/role_details", 5, msg_Callback); //订阅"role_details"话题
// 循环等待回调函数
ros::spin();
return 0;
}
四、配置文件修改
在这部分主要对my_topic文件夹内的CMakeLists.txt、package.xml两个文件进行修改。
第一步:修改CMakeLists.txt
part1:打开my_topic文件夹内的CMakeLists.txt,在find_package的括号里,添加message_generation
part2:把我们创建的my_msg.msg文件加载进去,添加内容:
add_message_files(
FILES
my_msg.msg
)
generate_messages(
DEPENDENCIES
std_msgs
)
part3:找到catkin_package,找到# CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs,把注释符#删掉,同时在后面添加message_runtime
part4:把我们创建的发布者及订阅者cpp文件添加进去,拉倒下面添加如下字段。
add_executable(msg_pub src/msg_pub.cpp)
target_link_libraries(msg_pub ${catkin_LIBRARIES})
add_dependencies(msg_pub ${PROJECT_NAME}_generate_messages_cpp)
add_executable(msg_sub src/msg_sub.cpp)
target_link_libraries(msg_sub ${catkin_LIBRARIES})
add_dependencies(msg_sub ${PROJECT_NAME}_generate_messages_cpp)
第二步:修改package.xml
添加字段
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
五、运行
好了,基本改完了,历史惯例,回到工作空间根目录下面,利用catkin_make指令进行编译,看看有没有问题,有问题再根据提示逐一排查,跟着步骤来做一般不会有什么问题。
编译完成后,启动roscore
roscore
并依次运行my_topic下面的msg_pub以及msg_sub
rosrun my_topic msg_pub
rosrun my_topic msg_sub
可以看到自定义消息在发布及接收了~~我前面m_Name设置成了中文“曹操”,ros不支持中文显示,所以显示成了???哈哈哈哈,无伤大雅!
本章完结~
转载卖钱者,子无屁眼。