




版權(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中的圖像視覺應(yīng)用第10章ROS2的三維視覺應(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ì)操作步驟:見教材P56-P66頁(yè)cd~/ros2_ws/srcros2pkgcreatemy_pkg3.1.1創(chuàng)建軟件包Package
命名新建文件為“my_node.cpp”。1、編寫節(jié)點(diǎn)代碼3.1節(jié)點(diǎn)Node和軟件包Package3.1.2編寫節(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ì)算和使用。
編寫話題發(fā)布者Publisher、話題訂閱者Subscriber的詳細(xì)操作步驟:見教材P67-P85頁(yè)cd~/ros2_ws/srcros2pkgcreatetopic_pkg1、創(chuàng)建軟件包
命名新建文件為“publisher_node.cpp”。2、編寫節(jié)點(diǎn)代碼3.2話題Topic和消息Message3.2.1編寫話題發(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編寫話題訂閱者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、編寫節(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打開第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),通過話題“/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)里,使用的都是過程式編程,可以很清晰的展示節(jié)點(diǎn)的運(yùn)行過程。但是在大量的開源項(xiàng)目中,最流行的是面向?qū)ο蟮木幊谭绞?。也就是將?jié)點(diǎn)Node封裝成類Class。
話題發(fā)布者Publisher的類封裝、話題訂閱者Subscriber的類封裝的詳細(xì)操作步驟:見教材P85-P91頁(yè)鑒于該部分內(nèi)容屬于進(jìn)階性質(zhì)的學(xué)習(xí)材料,故推薦采取自主學(xué)習(xí)的方式進(jìn)行掌握。
3.4Launch文件
在ROS2中,可以通過Launch文件一次啟動(dòng)多個(gè)節(jié)點(diǎn),省去了逐個(gè)節(jié)點(diǎn)輸入指令啟動(dòng)的繁瑣。在ROS2中,支持用三種語(yǔ)音來(lái)編寫Launch文件,分別是XML、YAML和Python。其中XML的語(yǔ)法和ROS1的Launch文件格式類似;YAML格式的Launch文件使用比較少;而在ROS2的開源社區(qū)中,則以Python語(yǔ)言的Launch文件最為流行。
分別使用XML、YAML和Python這三種語(yǔ)言構(gòu)建Launch文件的詳細(xì)操作步驟:見教材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編寫內(nèi)容:<launch>
<nodepkg="topic_pkg"exec="publisher_node"name="publisher_node"/>
<nodepkg="topic_pkg"exec="subscriber_node"name="subscriber_node"/></launch>4、在VSCode中打開[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)通過這個(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編寫內(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中打開[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)通過這個(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編寫內(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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 教育教學(xué)中個(gè)性化教學(xué)反思試題及答案
- 2024年運(yùn)城市三支一扶考試真題
- 2024年秦皇島市衛(wèi)生健康委直屬事業(yè)單位考試真題
- 未來(lái)智能汽車技術(shù)架構(gòu)試題及答案
- 教師教育教學(xué)反思的測(cè)評(píng)關(guān)鍵提問與解答
- 2023屆重慶市萬(wàn)州二中高三二模語(yǔ)文 含解析
- 大學(xué)物理2025年知識(shí)擴(kuò)展練習(xí)試題及答案
- 教資試題口訣大全及答案
- 物流三級(jí)試題及答案
- 新能源汽車技術(shù)人才需求分析試題及答案
- 德國(guó)政治制度簡(jiǎn)介課件
- 古詩(shī)《江上漁者》講課稿課件
- 高標(biāo)準(zhǔn)基本農(nóng)田建設(shè)項(xiàng)目監(jiān)理月報(bào)1期
- 溫泉度假設(shè)施造價(jià)預(yù)算
- 水質(zhì)自動(dòng)在線監(jiān)測(cè)系統(tǒng)技術(shù)協(xié)議1010審計(jì)
- DBJ04∕T 258-2016 建筑地基基礎(chǔ)勘察設(shè)計(jì)規(guī)范
- 七年級(jí)地理下雙向細(xì)目表
- 企業(yè)風(fēng)險(xiǎn)評(píng)估報(bào)告模板
- 網(wǎng)吧員工勞動(dòng)合同書
- Revit基礎(chǔ)入門課件
- 小升初英語(yǔ)奧數(shù)題
評(píng)論
0/150
提交評(píng)論