機器人操作系統(tǒng)(ROS2)入門與實踐 課件 第8章 ROS2中的NAV2自主導(dǎo)航_第1頁
機器人操作系統(tǒng)(ROS2)入門與實踐 課件 第8章 ROS2中的NAV2自主導(dǎo)航_第2頁
機器人操作系統(tǒng)(ROS2)入門與實踐 課件 第8章 ROS2中的NAV2自主導(dǎo)航_第3頁
機器人操作系統(tǒng)(ROS2)入門與實踐 課件 第8章 ROS2中的NAV2自主導(dǎo)航_第4頁
機器人操作系統(tǒng)(ROS2)入門與實踐 課件 第8章 ROS2中的NAV2自主導(dǎo)航_第5頁
已閱讀5頁,還剩44頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

機器人操作系統(tǒng)(ROS2)入門與實踐機器人操作系統(tǒng)(ROS2)入門與實踐第1章LinuxUbuntu入門基礎(chǔ)第2章ROS2安裝與系統(tǒng)架構(gòu)第3章ROS2編程基礎(chǔ)第4章ROS2機器人運動控制第5章激光雷達在ROS2中的使用第6章IMU在ROS2中的使用第7章ROS2中的SLAM環(huán)境建圖第8章ROS2中的NAV2自主導(dǎo)航第9章ROS2中的圖像視覺應(yīng)用第10章ROS2的三維視覺應(yīng)用第11章ROS2的機械臂應(yīng)用第12章基于ROS2的綜合應(yīng)用第8章8.3開源導(dǎo)航插件的使用

第8章ROS2中的NAV2自主導(dǎo)航8.2使用NAV2進行自主導(dǎo)航8.1NAV2的組成結(jié)構(gòu)8.4本章小結(jié)8.1NAV2的組成結(jié)構(gòu)1、MapServer地圖服務(wù)器2、Planner路徑規(guī)劃器3、Smoother路徑平滑器4、AMCL定位器5、Controller運動控制器6、Recovery導(dǎo)航恢復(fù)行為7、VelocitySmoother速度平滑器8、BTNavigator行為樹管理器8.1NAV2的組成結(jié)構(gòu)1、MapServer地圖服務(wù)器:導(dǎo)航需要地圖作為路徑規(guī)劃的依據(jù),這個地圖數(shù)據(jù)是由MapServer地圖服務(wù)器提供了。它會將上一章保存的地圖文件加載進來,如所示,然后發(fā)布到“/map”話題中,供其他節(jié)點訂閱獲取。8.1NAV2的組成結(jié)構(gòu)2、Planner路徑規(guī)劃器:路徑規(guī)劃器Planner負責生成全局導(dǎo)航路徑。它先從地圖服務(wù)器的“/map”話題獲取全局地圖,再從機器人的激光雷達話題獲取雷達測距的障礙物點云。將兩者疊加后,生成避障用的全局代價地圖。8.1NAV2的組成結(jié)構(gòu)如圖所示,全局代價地圖里,在障礙物的邊緣會膨脹出一層半透明的漸變區(qū)域,這個代表的就是機器人可能與障礙物發(fā)生碰撞的隱性“代價”。越靠近障礙物,與障礙物碰撞的風險越大,于是顏色越鮮艷,隱性“代價”越大。生成了代價地圖之后,路徑規(guī)劃器Planner使用A*和Dijkstra’s這類路徑規(guī)劃算法生成一條連接起始點和目標點的路徑曲線(對應(yīng)圖中的①),這就是規(guī)劃出來的全局導(dǎo)航路徑。8.1NAV2的組成結(jié)構(gòu)3、Smoother路徑平滑器:路徑規(guī)劃器Planner生成的路徑曲線是一條理論路線,有可能包含一些急轉(zhuǎn)彎、銳角轉(zhuǎn)折等特征(對應(yīng)圖中的②)。需要路徑平滑器Smoother對路徑進行優(yōu)化,在不碰撞障礙物情況下讓路徑的折線部分盡可能圓潤。

同時在一些危險路段讓路徑線路盡可能遠離障礙物,避免機器人因為定位誤差或者控制不善導(dǎo)致與障礙物發(fā)送剮蹭。8.1NAV2的組成結(jié)構(gòu)4、AMCL定位器:有了導(dǎo)航路徑之后,還需要機器人知道自己在地圖中的位置。在NAV2中,使用的AMCL進行機器人的自我定位,這是一種基于概率統(tǒng)計的粒子濾波算法。8.1NAV2的組成結(jié)構(gòu)8.1NAV2的組成結(jié)構(gòu)5、Controller運動控制器:運動控制器會從路徑平滑器Smoother獲取優(yōu)化后的最終路徑曲線(對應(yīng)圖中的③),然后根據(jù)AMCL定位器給出的機器人定位信息,規(guī)劃出機器人當前位置的運動策略,盡量貼合這條路徑曲線。運動控制器Controller按照策略計算出機器人的運動速度,然后通過話題發(fā)送速度消息包給速度平滑器(對應(yīng)圖中的④)。最終由速度平滑器來控制機器人進行運動。8.1NAV2的組成結(jié)構(gòu)6、Recovery導(dǎo)航恢復(fù)行為:導(dǎo)航恢復(fù)行為Recovery的作用是讓機器人從極端情況下脫離險境。這些恢復(fù)行為包括:ClearingActions、nav2_behaviors/Spin、nav2_behaviors/Wait、nav2_behaviors/BackUp,這些行為也是通過話題發(fā)送速度消息包給速度平滑器(對應(yīng)圖中的⑥),由速度平滑器來驅(qū)動機器人進行移動的。8.1NAV2的組成結(jié)構(gòu)7、VelocitySmoother速度平滑器:速度平滑器的作用是將上游運動控制器發(fā)送來的速度進行平滑處理,避免出現(xiàn)控制數(shù)值的突變,盡量保護硬件設(shè)備的安全運行。速度平滑器通常會運行在一個比較高的頻率,數(shù)倍于上游運動控制器的控制頻率。這樣它就能夠?qū)⑸嫌慰刂瓢l(fā)來的速度值,進行離散插值,將一個突變的數(shù)值變化過程,分解成一個逐步變化的過程。8.1NAV2的組成結(jié)構(gòu)8、BTNavigator行為樹管理器:上圖描述的只是NAV2的默認處理流程,這個流程是通過一種名為BehaviorTree行為樹的形式來組織的。NAV2的默認行為樹已經(jīng)設(shè)計得相當簡潔完善。簡單調(diào)整一些參數(shù)數(shù)值,就能夠滿足大部分導(dǎo)航任務(wù)的要求,直接使用就行。8.2使用NAV2進行自主導(dǎo)航

要在ROS2中使用NAV2,需要先安裝相應(yīng)的軟件包。在終端中執(zhí)行如下指令;sudoaptinstallros-humble-navigation2ROS2官方建議安裝一個NAV2的Bringup軟件包,借助這個軟件包的Launch文件來啟動NAV2。如圖8-9所示,這個軟件包的安裝指令是:sudoaptinstallros-humble-nav2-bringup使用NAV2進行自主導(dǎo)航的詳細操作步驟:見教材P208-P231頁8.2.1NAV2的安裝8.2使用NAV2進行自主導(dǎo)航8.2.2使用NAV2實現(xiàn)自主導(dǎo)航1、準備地圖文件source~/ros2_ws/install/setup.bashros2launchwpr_simulation2slam.launch.py啟動終端Terminator:打開第二個命令行窗口:source~/ros2_ws/install/setup.bashros2runwpr_simulation2keyboard_vel_cmd保持Terminator終端窗口位于所有窗口的前邊,且第二個窗口的標題欄為紅色,這樣才能讓鍵盤控制節(jié)點始終能夠接收到鍵盤按下的信號

。

機器人在場景里巡游一遍之后,可以看到建好的地圖了。8.2使用NAV2進行自主導(dǎo)航ros2runnav2_map_servermap_saver_cli-fmap在終端窗口的當前路徑下創(chuàng)建兩個地圖文件:map.pgm和map.yaml。將這兩個文件拷貝到wpr_simulation2的maps文件夾下,后面將從這個文件夾加載地圖文件。8.2使用NAV2進行自主導(dǎo)航啟動終端Terminator:2、編寫導(dǎo)航Launch文件cd~/ros2_ws/srcros2pkgcreatenav_pkg在軟件包中創(chuàng)建一個Launch文件,命名為“l(fā)aunch”。在[launch]文件夾新建文件,命名為“nav.launch.py”。8.2使用NAV2進行自主導(dǎo)航importosfromlaunchimportLaunchDescriptionfromlaunch_ros.actionsimportNodefromament_index_python.packagesimportget_package_share_directoryfromlaunch.actionsimportIncludeLaunchDescriptionfromlaunch.launch_description_sourcesimportPythonLaunchDescriptionSource

defgenerate_launch_description():map_file=os.path.join(get_package_share_directory('wpr_simulation2'),'maps','map.yaml')nav_param_file=os.path.join(get_package_share_directory('wpr_simulation2'),'config','nav2_params.yaml')nav2_launch_dir=os.path.join(get_package_share_directory('nav2_bringup'),'launch')8.2使用NAV2進行自主導(dǎo)航navigation_cmd=IncludeLaunchDescription(PythonLaunchDescriptionSource([nav2_launch_dir,'/bringup_launch.py']),launch_arguments={'map':map_file,'use_sim_time':'True','params_file':nav_param_file}.items(),)rviz_file=os.path.join(get_package_share_directory('wpr_simulation2'),'rviz','navi.rviz')rviz_cmd=Node(package='rviz2',executable='rviz2',name='rviz2',arguments=['-d',rviz_file])

ld=LaunchDescription()ld.add_action(navigation_cmd)ld.add_action(rviz_cmd)

returnld8.2使用NAV2進行自主導(dǎo)航在nav_pkg的CMakeLists.txt文件里,添加如下安裝規(guī)則:3、設(shè)置安裝規(guī)則install(DIRECTORYlaunchDESTINATIONshare/${PROJECT_NAME})4、編譯軟件包cd~/ros2_wscolconbuild8.2使用NAV2進行自主導(dǎo)航8.2.3仿真環(huán)境運行自主導(dǎo)航sourceinstall/setup.bashros2launchwpr_simulation2robocup_home.launch.py8.2使用NAV2進行自主導(dǎo)航打開第二個命令行窗口:sourceinstall/setup.bashros2launchnav_pkgnav.launch.py8.2使用NAV2進行自主導(dǎo)航設(shè)置機器人初始位置需要使用RViz2的工具欄里的[2DPosEstimate]按鈕。8.2使用NAV2進行自主導(dǎo)航設(shè)置好機器人的初始位置后,使用Rviz2界面上方工具條里的[Nav2Goal]按鈕,為機器人指定導(dǎo)航的目標地點和朝向。全局規(guī)劃器會自動規(guī)劃出一條紫色的路徑。這條路徑從機器人當前點出發(fā),避開障礙物,一直到導(dǎo)航目標點結(jié)束。8.2使用NAV2進行自主導(dǎo)航路徑規(guī)劃完成后,機器人模型會開始沿著這條路徑移動。切換到仿真窗口,可以看到機器人也開始沿著這條路徑移動。機器人到終點后,會原地旋轉(zhuǎn),調(diào)整航向角,如圖8-44所示,最終朝向剛才設(shè)置目標點時綠色箭頭的方向。8.3開源導(dǎo)航插件的使用

本節(jié)介紹一款開源的地圖導(dǎo)航可視化插件,可以在地圖上設(shè)置多個目標航點。然后通過簡單的消息發(fā)送,就能驅(qū)使機器人導(dǎo)航前往指定的航點。極大提升ROS2中調(diào)用NAV2導(dǎo)航服務(wù)的開發(fā)體驗。詳細操作步驟見教材P232-P257頁8.3開源導(dǎo)航插件的使用8.3.1安裝導(dǎo)航插件

在使用前,需要下載插件源碼并編譯安裝。cd~/ros2_ws/srcgitclone/6-robot/wp_map_tools.gitgitclone/s-robot/wp_map_tools.git

源碼下載完畢后,進入到這個插件源碼目錄的scripts文件夾中,安裝編譯這個項目需要的依賴項:cd~/ros2_ws/src/wp_map_tools/scripts/./install_for_humble.sh

編譯剛才下載的插件源碼包:cd~/ros2_ws/colconbuild8.3開源導(dǎo)航插件的使用

在使用前,首先需要按照8.2.2的步驟建好環(huán)境地圖,并把地圖文件拷貝到wpr_simulation2的maps文件夾里。8.3.2添加航點8.3開源導(dǎo)航插件的使用cd~/ros2_ws/srcsourceinstall/setup.bash打開一個終端:ros2launchwp_map_toolsadd_waypoint_sim.launch.py回車執(zhí)行會啟動RViz2窗口,如圖所示,窗口里可以看到之前創(chuàng)建的地圖。8.3開源導(dǎo)航插件的使用在Rviz2工具欄的右邊,可以看到新增了一個[AddWaypoint]按鈕,單擊[AddWaypoint]按鈕,就可以在地圖上添加航點,在RViz2窗口里的地圖找到要添加航點的位置,單擊鼠標左鍵并按住不放,會出現(xiàn)一個綠色箭頭,箭頭的尾部就是所添加航點的坐標位置。拖動鼠標,綠色箭頭會跟著旋轉(zhuǎn),箭頭指向就是航點的朝向。8.3開源導(dǎo)航插件的使用使用上述方法,在地圖上設(shè)置更多的航點:8.3開源導(dǎo)航插件的使用執(zhí)行完畢后,在用戶的主文件夾下會生成一個名為“waypoints.yaml”的文件。打開第2個子窗口:sourceinstall/setup.bashros2runwp_map_toolswp_saver8.3開源導(dǎo)航插件的使用如圖所示,這個文件里保存的就是設(shè)置的航點信息,雙擊打開這個文件對其內(nèi)容進行編輯。8.3開源導(dǎo)航插件的使用8.3.3啟動導(dǎo)航服務(wù)

在wp_map_tools軟件包中準備了兩個節(jié)點可以簡化這個調(diào)用過程:

wp_edit_node節(jié)點。這個節(jié)點會從主文件夾下的“waypoints.yaml”文件中獲取之前保存的航點信息,供其他節(jié)點查詢使用。

wp_navi_server節(jié)點。這個節(jié)點會從話題“/waterplus/navi_waypoint”中獲取導(dǎo)航的目標航點名稱,然后從wp_edit_node節(jié)點查詢該航點的坐標和朝向,接著調(diào)用NAV2的原生導(dǎo)航接口,完成導(dǎo)航任務(wù)。導(dǎo)航完成后,會向話題“/waterplus/navi_result”發(fā)送信息“navidone”提示導(dǎo)航已經(jīng)完成。

有了這兩個節(jié)點,就可以通過話題通訊完成導(dǎo)航任務(wù),下面將介紹如何使用這兩個節(jié)點。

編寫導(dǎo)航Launch文件在nav_pkg軟件包中的[launch]文件夾新建文件,命名為“waypoint_nav.launch.py”。8.3開源導(dǎo)航插件的使用8.3開源導(dǎo)航插件的使用importosfromlaunchimportLaunchDescriptionfromlaunch_ros.actionsimportNodefromament_index_python.packagesimportget_package_share_directoryfromlaunch.actionsimportIncludeLaunchDescriptionfromlaunch.launch_description_sourcesimportPythonLaunchDescriptionSource

defgenerate_launch_description():map_file=os.path.join(get_package_share_directory('wpr_simulation2'),'maps','map.yaml')nav_param_file=os.path.join(get_package_share_directory('wpr_simulation2'),'config','nav2_params.yaml')nav2_launch_dir=os.path.join(get_package_share_directory('nav2_bringup'),'launch')8.3開源導(dǎo)航插件的使用navigation_cmd=IncludeLaunchDescription(PythonLaunchDescriptionSource([nav2_launch_dir,'/bringup_launch.py']),launch_arguments={'map':map_file,'use_sim_time':'True','params_file':nav_param_file}.items(),)

rviz_file=os.path.join(get_package_share_directory('wp_map_tools'),'rviz','navi.rviz')rviz_cmd=Node(package='rviz2',executable='rviz2',name='rviz2',arguments=['-d',rviz_file])8.3開源導(dǎo)航插件的使用wp_edit_cmd=Node(package='wp_map_tools',executable='wp_edit_node',name='wp_edit_node')

wp_navi_server_cmd=Node(package='wp_map_tools',executable='wp_navi_server',name='wp_navi_server')

ld=LaunchDescription()ld.add_action(navigation_cmd)ld.add_action(rviz_cmd)ld.add_action(wp_edit_cmd)ld.add_action(wp_navi_server_cmd)

returnld8.3開源導(dǎo)航插件的使用8.3.4構(gòu)建航點導(dǎo)航程序

下面會編寫一個節(jié)點,向話題“/waterplus/navi_waypoint”發(fā)送導(dǎo)航目的地的航點名稱,激活wp_navi_server節(jié)點的導(dǎo)航功能,完成導(dǎo)航任務(wù)。1、編寫節(jié)點代碼在VSCode中找到nav_pkg軟件包,在

“src”文件夾新建文件,命名為“waypoint_navigation.cpp”。8.3開源導(dǎo)航插件的使用#include<rclcpp/rclcpp.hpp>#include<std_msgs/msg/string.hpp>

std::shared_ptr<rclcpp::Node>node;

voidResultCallback(conststd_msgs::msg::String::SharedPtrmsg){if(msg->data=="navidone"){RCLCPP_INFO(node->get_logger(),"Arrived!");}}

intmain(intargc,char**argv){rclcpp::init(argc,argv);node=std::make_shared<rclcpp::Node>("waypoint_navigation_node");8.3開源導(dǎo)航插件的使用autonavigation_pub=node->create_publisher<std_msgs::msg::String>("/waterplus/navi_waypoint",10);autoresult_sub=node->create_subscription<std_msgs::msg::String>("/waterplus/navi_result",10,ResultCallback);

rclcpp::sleep_for(std::chrono::milliseconds(1000));

std_msgs::msg::Stringwaypoint_msg;waypoint_msg.data="1";navigation_pub->publish(waypoint_msg);

rclcpp::spin(node);

rclcpp::shutdown();return0;}

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論