自定義訊息的實作示例
文章目錄
- 自定義訊息的實作示例
- 一、功能包的創建
- 二、自定義話題訊息
- (1)創建自定義訊息檔案步驟
- (2)添加編譯選項步驟
- 三、創建發布者
- 四、創建訂閱者
- 五、添加編譯選項
- 六、編譯運行
- (1)編譯
- (2)運行
自定義一個型別為gps的訊息(包括位置x,y和作業狀態state資訊),一個node以一定頻率發布模擬的gps訊息,另一個node接收并處理,算出到原點的距離,

一、功能包的創建
-
1.進入src目錄
cd ~/作業空間名/srccd ~/catkin_ws/src -
2.創建功能包
使用命令catkin_create_pkg 功能包名 [依賴項1] [依賴項2] ...
話題編程所依賴的依賴項有:rospy、roscpp、std_msgs,catkin_create_pkg topic_demo roscpp rospy std_msg
二、自定義話題訊息
(1)創建自定義訊息檔案步驟
-
1.進入功能包目錄
cd ~/作業空間名/功能包名cd ~/catkin_ws/topic_demo -
2.創建msg檔案夾用來存放msg檔案
mkdir msg -
3.創建msg檔案
vi gps.msg -
4.編輯msg檔案
-
msg檔案內容:
string state #作業狀態 float32 x #x坐標 float32 y #y坐標 -
msg資料型別類似于結構體
在程式中對一個gps訊息進行創建修改的方法和對結構體的操作一樣,struct gps { string state; float32 x; float32 y; }
-
(2)添加編譯選項步驟
-
1.編輯
CMakeLists.txt- (1)在
find_package中添加message_generationfind_package(catkin REQUIRED COMPONENTS roscpp std_msgs message_generation #需要添加的地方 ) - (2)添加檔案夾生成命令
add_message_files(FILES gps.msg) #catkin在cmake之上新增的命令,指定從哪個訊息檔案生成 - (3)添加生成訊息的命令
generate_messages(DEPENDENCIES std_msgs) #catkin新增的命令,用于生成訊息 #DEPENDENCIES后面指定生成msg需要依賴其他什么訊息,由于gps.msg用到了flaot32這種ROS標準訊息,因此需要再把std_msgs作為依賴
- (1)在
-
2.編輯
package.xml
添加:<build_depend>message_generation</build_depend> <run_depend>message_runtime</run_depend> -
3.編譯后產生gps.h頭檔案,在include目錄下
三、創建發布者
- topic_demo/src/talker.cpp
#include <ros/ros.h> #include <topic_demo/gps.h> //自定義msg產生的頭檔案 int main(int argc, char **argv) { ros::init(argc, argv, "talker"); //用于決議ROS引數,第三個引數為本節點名 ros::NodeHandle nh; //實體化句柄,初始化node topic_demo::gps msg; //自定義gps訊息并初始化 ... ros::Publisher pub = nh.advertise<topic_demo::gps>("gps_info", 1); //創建publisher,往"gps_info"話題上發布訊息 ros::Rate loop_rate(1.0); //定義發布的頻率,1HZ while (ros::ok()) //回圈發布msg { ... //處理msg pub.publish(msg);//以1Hz的頻率發布msg loop_rate.sleep();//根據前面的定義的loop_rate,設定1s的暫停 } return 0; }
四、創建訂閱者
-
topic_demo/src/listener.cpp
#include <ros/ros.h> #include <topic_demo/gps.h> #include <std_msgs/Float32.h> void gpsCallback(const topic_demo::gps::ConstPtr &msg) { std_msgs::Float32 distance; //計算離原點(0,0)的距離 distance.data = sqrt(pow(msg->x,2)+pow(msg->y,2)); ROS_INFO("Listener: Distance to origin = %f, state: %s",distance.data,msg->state.c_str()); //輸出 } int main(int argc, char **argv) { ros::init(argc, argv, "listener"); ros::NodeHandle n; ros::Subscriber sub = n.subscribe("gps_info", 1, gpsCallback); //設定回呼函式gpsCallback ros::spin(); //ros::spin()用于呼叫所有可觸發的回呼函式,將進入回圈,不會回傳,類似于在回圈里反復呼叫spinOnce() //而ros::spinOnce()只會去觸發一次 return 0; }
五、添加編譯選項
CMakeLists.txt的修改
add_executable(talker src/talker.cpp) #生成可執行檔案talker
add_dependencies(talker topic_demo_generate_messages_cpp)
#表明在編譯talker前,必須先生編譯完成自定義訊息
#必須添加add_dependencies,否則找不到自定義的msg產生的頭檔案
#表明在編譯talker前,必須先生編譯完成自定義訊息
target_link_libraries(talker ${catkin_LIBRARIES}) #鏈接
add_executable(listener src/listener.cpp ) #聲稱可執行檔案listener
add_dependencies(listener topic_demo_generate_messages_cpp)
target_link_libraries(listener ${catkin_LIBRARIES})#鏈接
六、編譯運行
(1)編譯
-
進入作業空間
cd ~/catkin_ws -
編譯
catkin_make
(2)運行
-
運行發布者
rosrun topic_demo talker -
運行訂閱者
rosrun topic_demo listener
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/260959.html
標籤:AI
上一篇:Graph Embedding
