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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(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)用第8章8.3開源導(dǎo)航插件的使用

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

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

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

。

機(jī)器人在場(chǎng)景里巡游一遍之后,可以看到建好的地圖了。8.2使用NAV2進(jìn)行自主導(dǎo)航ros2runnav2_map_servermap_saver_cli-fmap在終端窗口的當(dāng)前路徑下創(chuàng)建兩個(gè)地圖文件:map.pgm和map.yaml。將這兩個(gè)文件拷貝到wpr_simulation2的maps文件夾下,后面將從這個(gè)文件夾加載地圖文件。8.2使用NAV2進(jìn)行自主導(dǎo)航啟動(dòng)終端Terminator:2、編寫導(dǎo)航Launch文件cd~/ros2_ws/srcros2pkgcreatenav_pkg在軟件包中創(chuàng)建一個(gè)Launch文件,命名為“l(fā)aunch”。在[launch]文件夾新建文件,命名為“nav.launch.py”。8.2使用NAV2進(jìn)行自主導(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進(jìn)行自主導(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進(jìn)行自主導(dǎo)航在nav_pkg的CMakeLists.txt文件里,添加如下安裝規(guī)則:3、設(shè)置安裝規(guī)則install(DIRECTORYlaunchDESTINATIONshare/${PROJECT_NAME})4、編譯軟件包c(diǎn)d~/ros2_wscolconbuild8.2使用NAV2進(jìn)行自主導(dǎo)航8.2.3仿真環(huán)境運(yùn)行自主導(dǎo)航sourceinstall/setup.bashros2launchwpr_simulation2robocup_home.launch.py8.2使用NAV2進(jìn)行自主導(dǎo)航打開第二個(gè)命令行窗口:sourceinstall/setup.bashros2launchnav_pkgnav.launch.py8.2使用NAV2進(jìn)行自主導(dǎo)航設(shè)置機(jī)器人初始位置需要使用RViz2的工具欄里的[2DPosEstimate]按鈕。8.2使用NAV2進(jìn)行自主導(dǎo)航設(shè)置好機(jī)器人的初始位置后,使用Rviz2界面上方工具條里的[Nav2Goal]按鈕,為機(jī)器人指定導(dǎo)航的目標(biāo)地點(diǎn)和朝向。全局規(guī)劃器會(huì)自動(dòng)規(guī)劃出一條紫色的路徑。這條路徑從機(jī)器人當(dāng)前點(diǎn)出發(fā),避開障礙物,一直到導(dǎo)航目標(biāo)點(diǎn)結(jié)束。8.2使用NAV2進(jìn)行自主導(dǎo)航路徑規(guī)劃完成后,機(jī)器人模型會(huì)開始沿著這條路徑移動(dòng)。切換到仿真窗口,可以看到機(jī)器人也開始沿著這條路徑移動(dòng)。機(jī)器人到終點(diǎn)后,會(huì)原地旋轉(zhuǎn),調(diào)整航向角,如圖8-44所示,最終朝向剛才設(shè)置目標(biāo)點(diǎn)時(shí)綠色箭頭的方向。8.3開源導(dǎo)航插件的使用

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

源碼下載完畢后,進(jìn)入到這個(gè)插件源碼目錄的scripts文件夾中,安裝編譯這個(gè)項(xiàng)目需要的依賴項(xiàng):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添加航點(diǎn)8.3開源導(dǎo)航插件的使用cd~/ros2_ws/srcsourceinstall/setup.bash打開一個(gè)終端:ros2launchwp_map_toolsadd_waypoint_sim.launch.py回車執(zhí)行會(huì)啟動(dòng)RViz2窗口,如圖所示,窗口里可以看到之前創(chuàng)建的地圖。8.3開源導(dǎo)航插件的使用在Rviz2工具欄的右邊,可以看到新增了一個(gè)[AddWaypoint]按鈕,單擊[AddWaypoint]按鈕,就可以在地圖上添加航點(diǎn),在RViz2窗口里的地圖找到要添加航點(diǎn)的位置,單擊鼠標(biāo)左鍵并按住不放,會(huì)出現(xiàn)一個(gè)綠色箭頭,箭頭的尾部就是所添加航點(diǎn)的坐標(biāo)位置。拖動(dòng)鼠標(biāo),綠色箭頭會(huì)跟著旋轉(zhuǎn),箭頭指向就是航點(diǎn)的朝向。8.3開源導(dǎo)航插件的使用使用上述方法,在地圖上設(shè)置更多的航點(diǎn):8.3開源導(dǎo)航插件的使用執(zhí)行完畢后,在用戶的主文件夾下會(huì)生成一個(gè)名為“waypoints.yaml”的文件。打開第2個(gè)子窗口:sourceinstall/setup.bashros2runwp_map_toolswp_saver8.3開源導(dǎo)航插件的使用如圖所示,這個(gè)文件里保存的就是設(shè)置的航點(diǎn)信息,雙擊打開這個(gè)文件對(duì)其內(nèi)容進(jìn)行編輯。8.3開源導(dǎo)航插件的使用8.3.3啟動(dòng)導(dǎo)航服務(wù)

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

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

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

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

編寫導(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)建航點(diǎn)導(dǎo)航程序

下面會(huì)編寫一個(gè)節(jié)點(diǎn),向話題“/waterplus/navi_waypoint”發(fā)送導(dǎo)航目的地的航點(diǎn)名稱,激活wp_navi_server節(jié)點(diǎn)的導(dǎo)航功能,完成導(dǎo)航任務(wù)。1、編寫節(jié)點(diǎn)代碼在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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論