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

扫描二维码关注公众号,回复: 9675871 查看本文章

我用的终端是 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 "learning_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<learning_topic::score>("/score", 10);

    // 设置一个循环 1Hz
    ros::Rate loop_rate(1);

    while (ros::ok()) {
        
        // 初始化 learning_topic::score 类型的消息
        learning_topic::score score_msg;

        // 创建一个人物以及他的成绩
        score_msg.student_name = "LiHua";
        score_msg.score = 90.5;
        score_msg.evaluation = learning_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

编译完成后,启动 roscoreroscore

然后再打开一个终端 ( Ctrl + Alt + T),输入:rosrun ros_topic publisher_score

就会看到如下效果,那么我们就完成了:

猜你喜欢

转载自www.cnblogs.com/zhangxiaochn/p/ros_msg_publisher.html