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

編譯完成后,啟動 roscoreroscore

然后再打開一個終端 ( Ctrl + Alt + T),輸入:rosrun ros_topic publisher_score

就會看到如下效果,那么我們就完成了:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM