ROS 自定义 msg 类型及发布消息笔记
本文所用代码为个人独自编写仅用于测试的代码,实现效果为:循环打印某位学生的成绩及其评价。
一、创建工作空间
首先打开终端 ( Ctrl + Alt + T),创建工作文件夹 (catkin_ws
为工作文件夹名称,可以自定义):mkdir -p ~/catkin_ws/src
输入后,我们可以在文件管理的主目录中,找到一个名为 catkin_ws
的文件夹,这个就是我们刚才创建的工作空间:
进入 src 文件夹:cd ~/catkin_ws/src/
使当前文件夹具有 ros 工作空间属性:catkin_init_workspace
然后返回工作空间主目录:cd ~/catkin_ws/
进行编译:catkin_make
编译完成后,你再打开 catkin_ws
文件夹,你会发现多出了很多的文件:
为了方便后期使用,我们需要添加 source:echo "source ~/catkin_ws/devel/setup.zsh" >> ~/.zshrc
我用的终端是 zsh,如果你的终端是 bash 的话,把
.zsh
改为.bash
,.zshrc
改为.bashrc
即可
二、创建及配置 msg 文件
首先进入 src 文件夹:cd ~/catkin_ws/src/
创建一个功能包,其中的 ros_topic
可以自定义名称:catkin_create_pkg ros_topic roscpp rospy std_msgs
进入该功能包:cd ~/catkin_ws/src/ros_topic/
在该功能包下,我们创建一个 msg 文件夹,这个文件夹用来存放 .msg
文件:mkdir msg
进入该 msg 文件夹:cd ~/catkin_ws/src/ros_topic/msg/
创建 .msg 文件,score
可自定义:gedit score.msg
在弹出的框中,粘贴如下测试代码并保存:
string student_name
float32 score
string evaluation
string good = "good"
string bad = "bad"
好了,到这一步,我们已经把 msg 文件创建好了,代码也输入进去了,现在需要修改 package.xml
文件进行相应的配置:gedit ~/catkin_ws/src/ros_topic/package.xml
在 <exec_depend>std_msgs</exec_depend>
代码下面粘贴如下代码并保存:
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
粘贴完成后效果如图:
然后我们再对 CMakeLists.txt
文件进行相应的配置:gedit ~/catkin_ws/src/ros_topic/CMakeLists.txt
在弹出的框中,找到 find_package
,添加 message_generation
:
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
找到已被注释的 add_message_files
,删掉它前面的注释符号,并修改为如下:
add_message_files(
FILES
score.msg
)
同样的,找到已被注释的 generate_messages
,删掉它前面的注释符号,并修改为如下:
generate_messages(
DEPENDENCIES
std_msgs
)
找到 catkin_package
并修改为如下:
catkin_package(
CATKIN_DEPENDS
message_runtime
# INCLUDE_DIRS include
# LIBRARIES ros_topic
# CATKIN_DEPENDS roscpp rospy std_msgs
# DEPENDS system_lib
)
三、创建及配置发布者 Publisher
我们开始新建 cpp 文件:gedit ~/catkin_ws/src/ros_topic/src/publisher_score.cpp
在弹出的框中,粘贴如下测试代码并保存:
#include "ros/ros.h"
#include "ros_topic/score.h"
int main(int argc, char **argv) {
// 初始化 ROS 节点
ros::init(argc, argv, "publisher_score");
// 创建节点句柄
ros::NodeHandle n;
// 创建一个 Publisher
ros::Publisher score_pub = \
n.advertise<ros_topic::score>("/score", 10);
// 设置一个循环 1Hz
ros::Rate loop_rate(1);
while (ros::ok()) {
// 初始化 learning_topic::score 类型的消息
ros_topic::score score_msg;
// 创建一个人物以及他的成绩
score_msg.student_name = "LiHua";
score_msg.score = 90.5;
score_msg.evaluation = ros_topic::score::good;
// 发布消息
score_pub.publish(score_msg);
ROS_INFO("%s got %.1f points in the exam and was rated as %s", \
score_msg.student_name.c_str(),\
score_msg.score, \
score_msg.evaluation.c_str());
// 按照循环频率延时
loop_rate.sleep();
}
return 0;
}
现在,我们打开文件管理器,打开 /主目录/catkin_ws/src/ros_topic/src
,就可以看到刚才创建的 cpp 文件了:
接下来,我们再次配置 CMakeLists.txt
文件:gedit ~/catkin_ws/src/ros_topic/CMakeLists.txt
下拉到最后一行,添加如下代码并保存:
add_executable(publisher_score src/publisher_score.cpp)
add_dependencies(publisher_score ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(publisher_score ${catkin_LIBRARIES})
到此,我们就全部配置完毕,先返回工作空间主目录下:cd ~/catkin_ws/
进行编译:catkin_make
编译完成后,启动 roscore
:roscore
然后再打开一个终端 ( Ctrl + Alt + T),输入:rosrun ros_topic publisher_score
就会看到如下效果,那么我们就完成了: