ROS系统 C++或Python实现话题消息的定义与使用
如何自定義話題消息
-
定義msg文件
-
在package.xml中添加功能包依賴
-
在CMakeLists.txt添加編譯選項
-
編譯生成語言相關文件
-
創建 msg 文件
在 msg目錄中創建 Person.msg 文件
在 Person.msg 文件中添加以下代碼:
在package.xml中添加功能包依賴
- build_depend:編譯依賴
- exec_depend:執行依賴
注意:部分ROS版本中的 exec_depend 需要改成 run_depend
在CMakeLists.txt添加編譯選項
- add_message_files:將定義的 Person.msg 作為接口
- generate_messages:生成依賴和服務
配置完成后,對工程目錄進行編譯
編譯完成后在 ~/catkin_ws/devel/include/learning_topic 目錄下生成 Person.h 頭文件。
以下是生成 Person.h 頭文件的內容。
通過以下代碼去調用生成的 Person.h 頭文件
在 src 目錄下創建 兩個 cpp文件
cd ~/catkin_ws/src/learning_topic/src創建 person_publisher.cpp 文件
touch person_publisher.cppperson_publisher.cpp 文件中的內容
代碼功能:發布/person_info話題,自定義消息類型learning_topic::Person
#include <ros/ros.h> #include "learning_topic/Person.h"int main(int argc, char **argv) {// ROS節點初始化ros::init(argc, argv, "person_publisher");// 創建節點句柄ros::NodeHandle n;// 創建一個Publisher,發布名為/person_info的topic,消息類型為learning_topic::Person,隊列長度10ros::Publisher person_info_pub = n.advertise<learning_topic::Person>("/person_info", 10);// 設置循環的頻率ros::Rate loop_rate(1);int count = 0;while (ros::ok()){// 初始化learning_topic::Person類型的消息learning_topic::Person person_msg;person_msg.name = "Tom";person_msg.age = 18;person_msg.sex = learning_topic::Person::male;// 發布消息person_info_pub.publish(person_msg);ROS_INFO("Publish Person Info: name:%s age:%d sex:%d", person_msg.name.c_str(), person_msg.age, person_msg.sex);// 按照循環頻率延時loop_rate.sleep();}return 0; }創建 person_subscriber.cpp 文件
touch person_subscriber.cppperson_subscriber.cpp 文件中的內容
代碼功能:訂閱/person_info話題,自定義消息類型learning_topic::Person
#include <ros/ros.h> #include "learning_topic/Person.h"// 接收到訂閱的消息后,會進入消息回調函數 void personInfoCallback(const learning_topic::Person::ConstPtr& msg) {// 將接收到的消息打印出來ROS_INFO("Subcribe Person Info: name:%s age:%d sex:%d", msg->name.c_str(), msg->age, msg->sex); }int main(int argc, char **argv) {// 初始化ROS節點ros::init(argc, argv, "person_subscriber");// 創建節點句柄ros::NodeHandle n;// 創建一個Subscriber,訂閱名為/person_info的topic,注冊回調函數personInfoCallbackros::Subscriber person_info_sub = n.subscribe("/person_info", 10, personInfoCallback);// 循環等待回調函數ros::spin();return 0; }如何配置CMakeLists.txt中編譯規則
- 設置需要編譯的代碼和生成的可執行文件
- 設置鏈接庫
- 添加依賴項
在CMakeLists.txt文件中添加以下代碼:
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)- add_executable:通過指定的源文件列表構建出可執行目標文件。
- target_link_libraries:該指令的作用為將目標文件與庫文件進行鏈接。
- add_dependencies:該指令的作用為鏈接動態庫或依賴項。
編譯工程項目
cd ~/catkin_ws catkin_make
通過以下命令查看到在 Person.msg 文件中具體的消息內容和 Person.msg 文件的位置
啟動ROS Master
roscore啟動自定義的訂閱者節點
rosrun learning_topic person_subscriber啟動自定義的發布者節點
rosrun learning_topic person_publisher用Python代碼實現方式
cd ~/catkin_ws/src/learning_topic/scripts創建 person_publisher.py 和 person_subscriber.py Python文件
touch person_publisher.py用Python創建發布者代碼:
以下代碼的功能:發布/person_info話題,自定義消息類型learning_topic::Person
注意:需要將Python設置為可執行文件。
用Python創建訂閱者代碼:
以下代碼的功能:訂閱/person_info話題,自定義消息類型learning_topic::Person
Python代碼不需要重新編譯,可以直接執行。
rosrun learning_topic person_publisher.py rosrun learning_topic person_subscriber.py總結
以上是生活随笔為你收集整理的ROS系统 C++或Python实现话题消息的定义与使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ROS系统 C++或Python实现订阅
- 下一篇: ROS系统 实现客户端Client和服务