第3步,設置CMakeLists.txt&package.xmlCMakeLists.txt:
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
)//告訴系統編譯本包時,需要找到這兩個包
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES study
CATKIN_DEPENDS roscpp std_msgs
# DEPENDS system_lib
)//聲明依賴本包同時需要里面這兩個ros包
add_executable(${PROJECT_NAME}_node src/study_listen_node.cpp)//編譯本包生成的可執行文件
add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})//鏈接可執行文件和依賴庫
//一般情況而已,CMakeLists.txt是創建包同時,系統自動生成的,然后,我們需要的工作,一般情況就是把上面基本地方去掉#號就行了(目的告訴系統,關于該包,在哪,依賴是啥)
package.xml:
roscppclass="hljs-name"build_depend>
std_msgsclass="hljs-name"build_depend>
roscppclass="hljs-name"exec_depend>
std_msgsclass="hljs-name"exec_depend>
//主要修改類似樣式,當然,本例子比較簡單,系統生成的,不需要做其他修改,但是,如果節點添加新的依賴,需要在這些地方添加相應的包
第4步,編譯
$ catkin_make #注意在要做工作空間的一級目錄下使用該指令
第5步,驗證
$ roscore & #運行一個ROS master
$ rosrun study study_node & #包名+節點名;由于測試listener的節點,所以需要啟動一個talker的node才行
$ rostopic echo #study_topic
data: "hello study world!432"
---
data: "hello study world!433" //表示發布成功
#開啟一個新終端
$ rosrun study study_listen_node #包名+節點名
[ INFO] [1606043574.419247936]: I can see you again,hello study world!178 //表示監聽成功
這時,從零開始創建的listener節點node,成功創建完成
- 自定義消息類型并發布演示
這里主要就是定義一個消息類型是重點,然后,在上面創建的talker以及listener包里面頭文件包含,然后在CMakeLists.txt&package.xml兩文件中,添加新的頭文件類型即可使用新定義的消息類型了。
第一步,創建一個包:
$ catkin_create_pkg study_msgs std_msgs roscpp
第二步,在包創建一個msg文件夾( 注意文件夾名稱一定是這樣子的,否則,在cmakelists要修改很多 )
第三步,在文件夾中新建文件,StudyMsg.msg
(注意命名方式以及后綴)
string detail
int32 id
注意,自定義的消息類型,記得一定不能寫其他說明性內容進去,否則發生編譯錯誤
第四步,設置CMakeLists.txt&package.xmlCMakeLists.txt:
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs message_generation
)
## Generate messages in the 'msg' folder//這里可以看出,系統只會在msg文件夾中查找,對應第二步
add_message_files(
FILES
StudyMsg.msg
)
## Generate added messages and services with any dependencies listed here
generate_messages(
DEPENDENCIES
std_msgs
)
package.xml:
<build_depend>message_generation<span class="hljs-name"build_depend>
<exec_depend>message_runtime<span class="hljs-name"exec_depend>
第五步,編譯,catkin_make
第六步,查看
$ cd include/study_msgs
$ ls
StudyMsg.h //表示該頭文件生成成功
這時候,自定義消息類型生成成功,并且,可以被其他包通過頭文件#include"study_msgs/StudyMsg.h"方式,就可以正常使用。下面,以發布一個talker節點來展示,并且發布的topic名稱為/study_topic_new當然,CMakeLists.txt&package.xml要做相應的補充,CMakeLists.txt:
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs study_msgs
)
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES study
CATKIN_DEPENDS roscpp std_msgs study_msgs
# DEPENDS system_lib
)
//兩者都是添加新消息類型study_msgs
package.xml:
study_msgsclass="hljs-name"build_depend>
study_msgsclass="hljs-name"exec_depend>
//添加新消息類型study_msgs
此時,study_node.cpp為:
#include"ros/ros.h"
#include"std_msgs/String.h"
#include
#include"study_msgs/StudyMsg.h"//使用自定義消息類型
int main(int argc,char **argv){
ros::init(argc,argv,"study_talker");//node's attribute name
ros::NodeHandle n;
ros::Publisher study_pub=n.advertise
終端查看:
$ rostopic echo /study_topic_new
---
detail: "hello study world! new"
id: 29975
---
開始展示之前,一定要記得在study_listen包的CMakeLists.txt&package.xml做好跟上面的talker包study一樣準備,保證可以使用自定義消息類型。
study_node.cpp:
#include"ros/ros.h"
#include"std_msgs/String.h"
#include
#include"study_msgs/StudyMsg.h"
int main(int argc,char **argv){
ros::init(argc,argv,"study_talker");//node's attribute name
ros::NodeHandle n;
ros::Publisher study_pub=n.advertise
study_listen_node.cpp:
#include"ros/ros.h"
#include"std_msgs/String.h"
#include"study_msgs/StudyMsg.h"
void studyCallback(const std_msgs::String::ConstPtr& msg){
ROS_INFO("I can see you again,%s ",msg->data.c_str());
}//測試是監聽study_topic成功與否
void studyCallback_new(const study_msgs::StudyMsg::ConstPtr& msg){
ROS_INFO("I think I cant forget you,%s,%d",msg->detail.c_str(),msg->id);
}//測試監聽自定義消息成功與否
void studyCallback_param(const study_msgs::StudyMsg::ConstPtr& msg){
ROS_INFO("I think I cant forget you,%s,%d",msg->detail.c_str(),msg->id);
}//測試rosparam參數中心是否工作成功
int main(int argc,char ** argv){
ros::init(argc,argv,"study_listener");
ros::NodeHandle n;
ros::Subscriber sub=n.subscribe("/study_topic",10,studyCallback);
ros::Subscriber sub_new=n.subscribe("study_topic_new",10,studyCallback_new);
ros::Subscriber sub_param=n.subscribe("/params_topic",10,studyCallback_param);
ros::spin();
return 0;
}
修改了上面的兩個文件,接下來就是編譯整個工作空間并成功,接著在終端執行
$ roscore & #啟動ros master
$ rosrun study study_node & #啟動talker節點
$ rosrun study_listen study_listen_node #啟動listener節點
[ INFO] [1606047990.464340880]: I can see you again,hello study world!99
[ INFO] [1606047990.464436530]: I think I cant forget you,hello study world! new,100
[ INFO] [1606047990.476383810]: I think I cant forget you,cc,100
這時候我們發現,上面我們定義的回調函數,都成功調用了(表示上面的talker/listener/自定義消息 類型都是編寫并運行正常的)當我們在終端2啟動參數中心rosparam設置參數:
$ rosparam set /myparam "yqy"
終端1的顯示調整為:
[ INFO] [1606048163.371016634]: I can see you again,hello study world!368
[ INFO] [1606048163.371113447]: I think I cant forget you,hello study world! new,369
[ INFO] [1606048163.394940978]: I think I cant forget you,yqy,369
也就是將周期第三個,cc調整為yqy了。
本章小結:創建一個包,需要定義好CmakeLists.txt 、package.xml兩個文件,主要就是告訴系統,我這個包編譯和運行時依賴是什么;talker和listener的編寫也是基本套路一樣的,重新發布的主題以及消息類型以及內容就發布ok了;listener的回調函數,注意是無返回類型的;重新自定義一個消息類型,注意文件夾命名以及文件后綴名稱。基本是這些。
-
仿真
+關注
關注
50文章
4114瀏覽量
133826 -
調試
+關注
關注
7文章
587瀏覽量
34021 -
ROS
+關注
關注
1文章
279瀏覽量
17043
發布評論請先 登錄
相關推薦
評論