版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
機(jī)器人操作系統(tǒng)(ROS2)入門與實(shí)踐機(jī)器人操作系統(tǒng)(ROS2)入門與實(shí)踐第1章LinuxUbuntu入門基礎(chǔ)第2章ROS2安裝與系統(tǒng)架構(gòu)第3章ROS2編程基礎(chǔ)第4章ROS2機(jī)器人運(yùn)動(dòng)控制第5章激光雷達(dá)在ROS2中的使用第6章IMU在ROS2中的使用第7章ROS2中的SLAM環(huán)境建圖第8章ROS2中的NAV2自主導(dǎo)航第9章ROS2中的圖像視覺(jué)應(yīng)用第10章ROS2的三維視覺(jué)應(yīng)用第11章ROS2的機(jī)械臂應(yīng)用第12章基于ROS2的綜合應(yīng)用第3章3.3面向?qū)ο蟮墓?jié)點(diǎn)Node實(shí)現(xiàn)
第3章ROS2編程基礎(chǔ)3.2話題Topic和消息Message3.1節(jié)點(diǎn)Node和軟件包Package3.4Launch文件3.5本章小結(jié)
節(jié)點(diǎn)Node和軟件包Package是ROS2的程序的組織形式。其中節(jié)點(diǎn)Node相當(dāng)于一個(gè)ROS2的程序文件。當(dāng)我們運(yùn)行一個(gè)ROS2程序的時(shí)候,實(shí)際上運(yùn)行的就是一個(gè)或者多個(gè)節(jié)點(diǎn)文件。軟件包Package是節(jié)點(diǎn)文件的容器,通常是一個(gè)包含了一系列配置文件的目錄。而節(jié)點(diǎn)源碼文件,就放在軟件包目錄的某個(gè)子文件夾中(一般是src文件夾)。3.1節(jié)點(diǎn)Node和軟件包Package創(chuàng)建軟件包Package和節(jié)點(diǎn)Node的詳細(xì)操作步驟:見(jiàn)教材P56-P66頁(yè)cd~/ros2_ws/srcros2pkgcreatemy_pkg3.1.1創(chuàng)建軟件包Package
命名新建文件為“my_node.cpp”。1、編寫(xiě)節(jié)點(diǎn)代碼3.1節(jié)點(diǎn)Node和軟件包Package3.1.2編寫(xiě)節(jié)點(diǎn)Node#include"rclcpp/rclcpp.hpp"
intmain(intargc,char*argv[]){rclcpp::init(argc,argv);
autonode=std::make_shared<rclcpp::Node>("my_node");
RCLCPP_INFO(node->get_logger(),"Helloworld!");while(rclcpp::ok()){;}
rclcpp::shutdown();
return0;}
3.1節(jié)點(diǎn)Node和軟件包Package2、設(shè)置編譯規(guī)則3.1節(jié)點(diǎn)Node和軟件包Packagefind_package(rclcppREQUIRED)add_executable(my_nodesrc/my_node.cpp)ament_target_dependencies(my_node"rclcpp")install(TARGETSmy_nodeDESTINATIONlib/${PROJECT_NAME})
3、修改軟件包信息<depend>rclcpp</depend>4、編譯軟件包c(diǎn)d~/ros2_wscolconbuild3.1節(jié)點(diǎn)Node和軟件包Package3.1.3運(yùn)行節(jié)點(diǎn)Noderos2runmy_pkgmy_nodesourceinstall/setup.bash
3.2話題Topic和消息Message
在ROS2中,節(jié)點(diǎn)Node之間的通訊最常用的方式是話題Topic和消息Message。其中話題Topic可以理解為一個(gè)網(wǎng)絡(luò)聊天室。在這個(gè)話題聊天室里發(fā)言的節(jié)點(diǎn),可以稱為發(fā)布者Publisher。而聊天室中所有看到發(fā)言內(nèi)容的節(jié)點(diǎn),可以稱為訂閱者Subscriber。
在話題聊天室中傳送的發(fā)言內(nèi)容,就是消息Message。所以上述通訊機(jī)制可以概括為:1)發(fā)布者Publisher將要發(fā)生的數(shù)據(jù)打包成消息Message,然后發(fā)送到話題Topic中。2)訂閱者Subscriber訂閱一個(gè)話題Topic,從話題中獲取消息Message。然后把消息中的數(shù)據(jù)解析出來(lái),進(jìn)行后續(xù)的計(jì)算和使用。
編寫(xiě)話題發(fā)布者Publisher、話題訂閱者Subscriber的詳細(xì)操作步驟:見(jiàn)教材P67-P85頁(yè)cd~/ros2_ws/srcros2pkgcreatetopic_pkg1、創(chuàng)建軟件包
命名新建文件為“publisher_node.cpp”。2、編寫(xiě)節(jié)點(diǎn)代碼3.2話題Topic和消息Message3.2.1編寫(xiě)話題發(fā)布者Publisher#include"rclcpp/rclcpp.hpp"#include"std_msgs/msg/string.hpp"
intmain(intargc,char*argv[]){rclcpp::init(argc,argv);
autonode=std::make_shared<rclcpp::Node>("publisher_node");
autopublisher=node->create_publisher<std_msgs::msg::String>("/my_topic",10);
std_msgs::msg::Stringmessage;message.data="HelloWorld!";
rclcpp::Rateloop_rate(1);
while(rclcpp::ok()){publisher->publish(message);loop_rate.sleep();}rclcpp::shutdown();
return0;}3.2話題Topic和消息Message3、設(shè)置編譯規(guī)則4、修改軟件包信息5、編譯軟件包c(diǎn)d~/ros2_wscolconbuild3.2話題Topic和消息Messagefind_package(rclcppREQUIRED)find_package(std_msgsREQUIRED)add_executable(publisher_nodesrc/publisher_node.cpp)ament_target_dependencies(publisher_node"rclcpp""std_msgs")install(TARGETSpublisher_nodeDESTINATIONlib/${PROJECT_NAME})6、
運(yùn)行節(jié)點(diǎn)Node3.2話題Topic和消息Messagesourceinstall/setup.bashros2runtopic_pkgpublisher_node
在Terminator終端中,按下三個(gè)鍵盤組合鍵[Ctrl+Shift+O],會(huì)將終端分為上下兩個(gè)子窗口。其中上面的窗口仍然保持publisher_node運(yùn)行,下面的窗口可以輸入新的指令并運(yùn)行。ros2topiclistros2topicecho/my_topic
命名新建文件為“subscriber_node.cpp”。3.2話題Topic和消息Message3.2.2編寫(xiě)話題訂閱者Subscriber在上一節(jié)中,創(chuàng)建一個(gè)名為topic_pkg的軟件包,并在這個(gè)軟件包中實(shí)現(xiàn)了一個(gè)發(fā)布者節(jié)點(diǎn)。這一節(jié)中,將會(huì)在這個(gè)topic_pkg軟件包中添加一個(gè)訂閱者節(jié)點(diǎn)。1、添加節(jié)點(diǎn)代碼文件3.2話題Topic和消息Message2、編寫(xiě)節(jié)點(diǎn)代碼#include"rclcpp/rclcpp.hpp"#include"std_msgs/msg/string.hpp"
std::shared_ptr<rclcpp::Node>node;
voidCallback(conststd_msgs::msg::String::SharedPtrmsg){RCLCPP_INFO(node->get_logger(),"Receive:%s",msg->data.c_str());}
intmain(intargc,char*argv[]){rclcpp::init(argc,argv);
node=std::make_shared<rclcpp::Node>("subscriber_node");
autosubscriber=node->create_subscription<std_msgs::msg::String>("/my_topic",10,&Callback);
rclcpp::spin(node);rclcpp::shutdown();
return0;}3、設(shè)置編譯規(guī)則4、編譯軟件包c(diǎn)d~/ros2_wscolconbuild3.2話題Topic和消息Messageadd_executable(subscriber_nodesrc/subscriber_node.cpp)ament_target_dependencies(subscriber_node"rclcpp""std_msgs")install(TARGETSpublisher_nodesubscriber_nodeDESTINATIONlib/${PROJECT_NAME})5、
運(yùn)行節(jié)點(diǎn)sourceinstall/setup.bashros2runtopic_pkgpublisher_noderos2runtopic_pkgsubscriber_node打開(kāi)第2個(gè)子窗口:3.2話題Topic和消息Message上圖是訂閱者節(jié)點(diǎn)subscriber_node接收到發(fā)布者節(jié)點(diǎn)publisher_node發(fā)送來(lái)的消息內(nèi)容。說(shuō)明訂閱者subscriber_node和發(fā)布者publisher_node這兩個(gè)節(jié)點(diǎn),通過(guò)話題“/my_topic”建立起了數(shù)據(jù)通訊。使用std_msgs::msg::String類型的消息包在兩個(gè)節(jié)點(diǎn)間傳遞數(shù)據(jù)。
3.3面向?qū)ο蟮墓?jié)點(diǎn)Node實(shí)現(xiàn)
在前面的實(shí)驗(yàn)里,使用的都是過(guò)程式編程,可以很清晰的展示節(jié)點(diǎn)的運(yùn)行過(guò)程。但是在大量的開(kāi)源項(xiàng)目中,最流行的是面向?qū)ο蟮木幊谭绞?。也就是將?jié)點(diǎn)Node封裝成類Class。
話題發(fā)布者Publisher的類封裝、話題訂閱者Subscriber的類封裝的詳細(xì)操作步驟:見(jiàn)教材P85-P91頁(yè)鑒于該部分內(nèi)容屬于進(jìn)階性質(zhì)的學(xué)習(xí)材料,故推薦采取自主學(xué)習(xí)的方式進(jìn)行掌握。
3.4Launch文件
在ROS2中,可以通過(guò)Launch文件一次啟動(dòng)多個(gè)節(jié)點(diǎn),省去了逐個(gè)節(jié)點(diǎn)輸入指令啟動(dòng)的繁瑣。在ROS2中,支持用三種語(yǔ)音來(lái)編寫(xiě)Launch文件,分別是XML、YAML和Python。其中XML的語(yǔ)法和ROS1的Launch文件格式類似;YAML格式的Launch文件使用比較少;而在ROS2的開(kāi)源社區(qū)中,則以Python語(yǔ)言的Launch文件最為流行。
分別使用XML、YAML和Python這三種語(yǔ)言構(gòu)建Launch文件的詳細(xì)操作步驟:見(jiàn)教材P91-P104頁(yè)3.4.1XML格式的Launch文件3.4Launch文件1、在VSCode中找到前面實(shí)驗(yàn)構(gòu)建的topic_pkg軟件包。新建文件夾,命名為“l(fā)aunch”。2、在[launch]文件夾中,新建的文件,命名為“pub_sub.launch.xml”。3.4.1XML格式的Launch文件3.4Launch文件3、為這個(gè)pub_sub.launch.xml編寫(xiě)內(nèi)容:<launch>
<nodepkg="topic_pkg"exec="publisher_node"name="publisher_node"/>
<nodepkg="topic_pkg"exec="subscriber_node"name="subscriber_node"/></launch>4、在VSCode中打開(kāi)[topic_pkg]軟件包的[CMakeLists.txt]文件。在文件中添加如下安裝規(guī)則:install(DIRECTORYlaunchDESTINATIONshare/${PROJECT_NAME})3.4.1XML格式的Launch文件3.4Launch文件5、編譯軟件包c(diǎn)d~/ros2_wscolconbuild6、
運(yùn)行Launch文件sourceinstall/setup.bashros2launchtopic_pkgpub_sub.launch.xml可以看到,發(fā)布者和接收者節(jié)點(diǎn)通過(guò)這個(gè)XML格式的launch文件全都運(yùn)行起來(lái)了。3.4.2YAML格式的Launch文件3.4Launch文件1、在VSCode中找到前面實(shí)驗(yàn)構(gòu)建的topic_pkg軟件包。用鼠標(biāo)右鍵單擊其中的[launch]文件夾,在彈出的[菜單]對(duì)話框中選擇[新建文件…],命名為“pub_sub.launch.xml”。3.4.2YAML格式的Launch文件3.4Launch文件2、為這個(gè)pub_sub.launch.yaml編寫(xiě)內(nèi)容:launch:-node:pkg:"topic_pkg"exec:"publisher_node"name:"publisher_node"-node:pkg:"topic_pkg"exec:"subscriber_node"name:"subscriber_node"3、在VSCode中打開(kāi)[topic_pkg]軟件包的[CMakeLists.txt]文件。添加安裝規(guī)則:install(DIRECTORYlaunchDESTINATIONshare/${PROJECT_NAME})3.4.2YAML格式的Launch文件3.4Launch文件4、編譯軟件包c(diǎn)d~/ros2_wscolconbuild5、
運(yùn)行Launch文件sourceinstall/setup.bashros2launchtopic_pkgpub_sub.launch.yaml可以看到,發(fā)布者和接收者節(jié)點(diǎn)通過(guò)這個(gè)YAML格式的launch文件全都運(yùn)行起來(lái)了。3.4.3Python格式的Launch文件3.4Launch文件1、在VSCode中找到前面實(shí)驗(yàn)構(gòu)建的topic_pkg軟件包。用鼠標(biāo)右鍵單擊其中的[launch]文件夾,在彈出的[菜單]對(duì)話框中選擇[新建文件…],命名為“pub_sub.launch.py”。3.4Launch文件2、為這個(gè)pub_sub.launch.py編寫(xiě)內(nèi)容:fromlaunch_ros.actionsimportNodefromlaunchimportLaunchDescription
defgenerate_launch_description():
publisher_cmd=Node(package='topic_pkg',executable='publisher_node',name='publisher_node')
subscriber_cmd=Node(package='topic_pkg',executable='subscriber_
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 財(cái)務(wù)風(fēng)險(xiǎn)監(jiān)測(cè)與評(píng)估的工作重點(diǎn)計(jì)劃
- 加強(qiáng)人才培養(yǎng)機(jī)制的工作總結(jié)計(jì)劃
- 建建筑工程管理與實(shí)務(wù)課件新大綱
- 傳熱液行業(yè)相關(guān)投資計(jì)劃提議范本
- 內(nèi)鏡專用高頻電刀相關(guān)行業(yè)投資方案范本
- 課內(nèi)外結(jié)合的綜合活動(dòng)計(jì)劃
- 醫(yī)院信息安全工作總結(jié)與防護(hù)措施計(jì)劃
- 如何組織班級(jí)戶外拓展活動(dòng)計(jì)劃
- 車輛抵押借款合同三篇
- 《信息論與編碼新題》課件
- 2021年四川省眉山市公開(kāi)招聘警務(wù)輔助人員(輔警)筆試專項(xiàng)訓(xùn)練題試卷(2)含答案
- 《主題班會(huì):自信》課件
- 浙江大學(xué)醫(yī)學(xué)院附屬兒童醫(yī)院招聘人員筆試真題2023
- 學(xué)生乘公交車安全
- 護(hù)理不良事件的原因分析
- 2024年貴州省中考數(shù)學(xué)真題含解析
- 《藥物過(guò)敏反應(yīng)》課件
- 2024年輔警招錄考試模擬200題及答案
- UI設(shè)計(jì)(赤峰應(yīng)用技術(shù)職業(yè)學(xué)院)知到智慧樹(shù)答案
- 二零二四年度工業(yè)自動(dòng)化技術(shù)研發(fā)與轉(zhuǎn)讓合同3篇
- 江蘇省南通市2023-2024學(xué)年五年級(jí)(上)期末數(shù)學(xué)試卷
評(píng)論
0/150
提交評(píng)論