機(jī)器人操作系統(tǒng)(ROS2)入門與實(shí)踐 課件 第3章 ROS2編程基礎(chǔ)_第1頁(yè)
機(jī)器人操作系統(tǒng)(ROS2)入門與實(shí)踐 課件 第3章 ROS2編程基礎(chǔ)_第2頁(yè)
機(jī)器人操作系統(tǒng)(ROS2)入門與實(shí)踐 課件 第3章 ROS2編程基礎(chǔ)_第3頁(yè)
機(jī)器人操作系統(tǒng)(ROS2)入門與實(shí)踐 課件 第3章 ROS2編程基礎(chǔ)_第4頁(yè)
機(jī)器人操作系統(tǒng)(ROS2)入門與實(shí)踐 課件 第3章 ROS2編程基礎(chǔ)_第5頁(yè)
已閱讀5頁(yè),還剩25頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論