1、概述
ROS的二維導(dǎo)航功能包,簡單來說,就是根據(jù)輸入的里程計(jì)等傳感器的信息流和機(jī)器人的全局位置,通過導(dǎo)航算法,計(jì)算得出安全可靠的機(jī)器人速度控制指令。但是,如何在特定的機(jī)器人上實(shí)現(xiàn)導(dǎo)航功能包的功能,卻是一件較為復(fù)雜的工程。作為導(dǎo)航功能包使用的必要先決條件,機(jī)器人必須運(yùn)行ROS,發(fā)布tf變換樹,并發(fā)布使用ROS消息類型的傳感器數(shù)據(jù)。同時(shí),為了讓機(jī)器人更好的完成導(dǎo)航任務(wù),開發(fā)者還要根據(jù)機(jī)器人的外形尺寸和性能,配置導(dǎo)航功能包的一些參數(shù)。
2、硬件要求
盡管導(dǎo)航功能包設(shè)計(jì)得盡可能通用,但是仍然對機(jī)器人的硬件有以下三個(gè)要求:
(1)導(dǎo)航功能包僅對差分等輪式機(jī)器人有效,并且假設(shè)機(jī)器人可直接使用速度指令進(jìn)行控制,速度指令的格式為:x方向速度、y方向速度、速度向量角度。
(2)導(dǎo)航功能包要求機(jī)器人必須安裝有激光雷達(dá)等二維平面測距設(shè)備。
(3)導(dǎo)航功能包以正方型的機(jī)器人為模型進(jìn)行開發(fā),所以對于正方形或者圓形外形的機(jī)器人支持度較好,而對于其他外形的機(jī)器人來講,雖然仍然可以正常使用,但是表現(xiàn)則很有可能不佳。
3、機(jī)器人配置
導(dǎo)航功能包的結(jié)構(gòu)如上圖所示,在自己的機(jī)器人平臺上實(shí)現(xiàn)自主導(dǎo)航,簡單來說,就是按照上圖將需要的功能按照需求完成即可。其中白色的部分是ROS功能包已經(jīng)完成的部分,不需要我們?nèi)?shí)現(xiàn),灰色的是可選的部分,也由ROS完成,在使用中根據(jù)需求使用,需要關(guān)注的重點(diǎn)部分是藍(lán)色部分,這些需要我們根據(jù)輸入輸出的要求完成相應(yīng)的功能。
3.1、ROS
首先,請確保你的機(jī)器人安裝了ROS框架。
3.2、tf變換(sensortransforms)
導(dǎo)航功能包要求機(jī)器人以tf樹的形式發(fā)布各個(gè)相關(guān)參考系的變換關(guān)系。
3.3、傳感器信息(sensor sources)
導(dǎo)航功能包需要采集機(jī)器人的傳感器信息,以達(dá)到實(shí)時(shí)避障的效果。這些傳感器要求能夠通過ROS發(fā)布
sensor_msgs/LaserScan或者sensor_msgs/PointCloud 格式的消息,也就是二維雷達(dá)信息或者三維點(diǎn)云數(shù)據(jù)。ROS社區(qū)已經(jīng)支持大部分激光雷達(dá)、Kinect等設(shè)備的驅(qū)動(dòng),可以直接使用社區(qū)提供的驅(qū)動(dòng)功能包發(fā)布滿足要求的傳感器信息。如果你使用的傳感器沒有ROS支持,或者你想使用自己的驅(qū)動(dòng),也可以自己將傳感器信息封裝成要求的格式。
3.4、里程計(jì)信息(odometrysource)
導(dǎo)航功能包要求機(jī)器人發(fā)布nav_msgs/Odometry格式的里程計(jì)信息,同時(shí)在也要發(fā)布相應(yīng)的tf變換。
3.5、機(jī)器人控制器(base_controller)
導(dǎo)航功能包最終的輸出是針對機(jī)器人geometry_msgs/Twist格式的控制指令,這就要求機(jī)器人控制節(jié)點(diǎn)具備解析控制指令中速度、角度的能力,并且最終通過這些指令控制機(jī)器人完成相應(yīng)的運(yùn)動(dòng)目標(biāo)。
3.6、地圖(map_server)
地圖并不是導(dǎo)航功能所必需的。
4、導(dǎo)航功能包集的配置
在滿足以上條件的前提下,我們來針對導(dǎo)航功能進(jìn)行一些配置。
4.1、創(chuàng)建一個(gè)功能包
首先,我們需要?jiǎng)?chuàng)建一個(gè)功能包,用來存儲導(dǎo)航需要用到的所有的配置文件和launch啟動(dòng)文件。在創(chuàng)建功能包的時(shí)候,我們需要添加相關(guān)的所有依賴,包括機(jī)器人配置中使用到的功能包,當(dāng)然不要忘記了move_base功能包,因?yàn)樵摪泻芏辔覀兒竺嫘枰玫降?a target="_blank">接口。找到合適的位置,輸入以下命令來創(chuàng)建包:
catkin_create_pkg my_robot_name_2dnav move_base my_tf_configuration_depmy_odom_configuration_dep my_sensor_configuration_dep
4.2、創(chuàng)建機(jī)器人啟動(dòng)文件
現(xiàn)在,我們已經(jīng)有了一個(gè)存儲各種文件的工作空間,下一步,我們來創(chuàng)建一個(gè)機(jī)器人啟動(dòng)文件,用來啟動(dòng)機(jī)器人配置中所提到的所有硬件,并發(fā)布相應(yīng)的消息和變換關(guān)系。
打開編輯器,輸入以下格式的內(nèi)容,并保存為my_robot_configuration.launch命名的文件:
讓我們來詳細(xì)的解讀以上內(nèi)容的含義:
這部分代碼用來啟動(dòng)機(jī)器人的傳感器,根據(jù)以上格式,修改你所使用到的傳感器驅(qū)動(dòng)包名稱、類型、命名等信息,并且添加驅(qū)動(dòng)包節(jié)點(diǎn)需要使用到的參數(shù)。當(dāng)然,如果你需要使用多個(gè)傳感器,可以使用相同的方法,啟動(dòng)多個(gè)傳感器的驅(qū)動(dòng)節(jié)點(diǎn)。
這部分代碼用來啟動(dòng)機(jī)器人上的里程計(jì),根據(jù)需要修改功能包名、類型、節(jié)點(diǎn)名、參數(shù)。
這部分代碼需要啟動(dòng)機(jī)器人相關(guān)的坐標(biāo)變換。
4.3、代價(jià)地圖的配置 (local_costmap)& (global_costmap)
導(dǎo)航功能包使用兩種代價(jià)地圖存儲周圍環(huán)境中的障礙信息,一種用于全局路徑規(guī)劃,一種用于本地路徑規(guī)劃和實(shí)時(shí)避障。兩種代價(jià)地圖需要使用一些共同和獨(dú)立的配置文件:通用配置文件,全局規(guī)劃配置文件,本地規(guī)劃配置文件。以下將詳細(xì)講解這三種配置文件:
(1)通用配置文件(Common Configuration (local_costmap) &(global_costmap))
代價(jià)地圖用來存儲周圍環(huán)境的障礙信息,其中需要注明地圖關(guān)注的機(jī)器人傳感器消息,以便于地圖信息進(jìn)行更行。針對兩種代價(jià)地圖通用的配置選項(xiàng),創(chuàng)建名為costmap_common_params.yaml的配置文件:
obstacle_range: 2.5
raytrace_range: 3.0
footprint: [[x0, y0], [x1, y1], ... [xn, yn]]
#robot_radius: ir_of_robot
inflation_radius: 0.55
observation_sources: laser_scan_sensor point_cloud_sensor
laser_scan_sensor: {sensor_frame: frame_name, data_type: LaserScan, topic: topic_name, marking: true, clearing: true}
point_cloud_sensor: {sensor_frame: frame_name, data_type: PointCloud, topic: topic_name, marking: true, clearing: true}
詳細(xì)解析以上配置文件的內(nèi)容:
obstacle_range: 2.5
raytrace_range: 3.0
這兩個(gè)參數(shù)用來設(shè)置代價(jià)地圖中障礙物的相關(guān)閾值。obstacle_range參數(shù)用來設(shè)置機(jī)器人檢測障礙物的最大范圍,設(shè)置為2.5意為在2.5米范圍內(nèi)檢測到的障礙信息,才會(huì)在地圖中進(jìn)行更新。raytrace_range參數(shù)用來設(shè)置機(jī)器人檢測自由空間的最大范圍,設(shè)置為3.0意為在3米范圍內(nèi),機(jī)器人將根據(jù)傳感器的信息,清除范圍內(nèi)的自由空間。
footprint: [[x0, y0], [x1, y1], ... [xn, yn]]
#robot_radius: ir_of_robot
inflation_radius: 0.55
這些參數(shù)用來設(shè)置機(jī)器人在二維地圖上的占用面積,如果機(jī)器人外形是圓形,則需要設(shè)置機(jī)器人的外形半徑。所有參數(shù)以機(jī)器人的中心作為坐標(biāo)(0,0)點(diǎn)。inflation_radius參數(shù)是設(shè)置障礙物的膨脹參數(shù),也就是機(jī)器人應(yīng)該與障礙物保持的最小安全距離,這里設(shè)置為0.55意為為機(jī)器人規(guī)劃的路徑應(yīng)該與機(jī)器人保持0.55米以上的安全距離。
observation_sources: laser_scan_sensorpoint_cloud_sensor
observation_sources參數(shù)列出了代價(jià)地圖需要關(guān)注的所有傳感器信息,每一個(gè)傳感器信息都將在后邊列出詳細(xì)信息。
laser_scan_sensor: {sensor_frame: frame_name, data_type:LaserScan, topic: topic_name, marking: true, clearing: true}
以激光雷達(dá)為例,sensor_frame標(biāo)識傳感器的參考系名稱,data_type表示激光數(shù)據(jù)或者點(diǎn)云數(shù)據(jù)使用的消息類型,topic_name表示傳感器發(fā)布的話題名稱,而marking和clearing參數(shù)用來表示是否需要使用傳感器的實(shí)時(shí)信息來添加或清楚代價(jià)地圖中的障礙物信息。
(2)全局規(guī)劃配置文件(Global Configuration (global_costmap))
全局規(guī)劃配置文件用來存儲用于全局代價(jià)地圖的配置參數(shù),我們使用global_costmap_params.yaml來命名,內(nèi)容如下:
global_costmap:
global_frame: /map
robot_base_frame: base_link
update_frequency: 5.0
static_map:true
global_frame參數(shù)用來表示全局代價(jià)地圖需要在那個(gè)參考系下運(yùn)行,這里我們選擇了map這個(gè)參考系。robot_base_frame參數(shù)表示代價(jià)地圖可以參考的機(jī)器人本體的參考系。update_frequency參數(shù)絕地全局地圖信息更新的頻率,單位是Hz。static_map參數(shù)決定代價(jià)地圖是否需要根據(jù)map_server提供的地圖信息進(jìn)行初始化,如果你不需要使用已有的地圖或者map_server,最好將該參數(shù)設(shè)置為false。
(3)本地規(guī)劃配置文件(Local Configuration (local_costmap))
本地規(guī)劃配置文件用來存儲用于本地代價(jià)地圖的配置參數(shù),命名為local_costmap_params.yaml,內(nèi)容如下:
local_costmap:
global_frame: odom
robot_base_frame: base_link
update_frequency: 5.0
publish_frequency: 2.0
static_map:false
rolling_window: true
width: 6.0
height: 6.0
resolution:0.05
"global_frame", "robot_base_frame","update_frequency", 和 "static_map"參數(shù)的意義與全局規(guī)劃配置文件中的參數(shù)相同。
publish_frequency設(shè)置代價(jià)地圖發(fā)布可視化信息的頻率,單位是Hz。rolling_window參數(shù)是用來設(shè)置在機(jī)器人移動(dòng)過程中是否需要滾動(dòng)窗口,以保持機(jī)器人處于中心位置。"width," "height," 和"resolution" 設(shè)置設(shè)置代價(jià)地圖長(米)、高(米)和分辨率(米/格)。分辨率可以設(shè)置的與靜態(tài)地圖不同,但是一般情況下兩者是相同的。
4.4 本地規(guī)劃器配置
本地規(guī)劃器base_local_planner的主要作用是根據(jù)規(guī)劃的全局路徑,計(jì)算發(fā)布給機(jī)器人的速度指令。該規(guī)劃器需要我們根據(jù)機(jī)器人的規(guī)格,配置一些相應(yīng)的參數(shù)。我們創(chuàng)建名為base_local_planner_params.yaml的配置文件:
TrajectoryPlannerROS:
max_vel_x: 0.45
min_vel_x: 0.1
max_vel_theta: 1.0
min_in_place_vel_theta: 0.4
acc_lim_theta: 3.2
acc_lim_x: 2.5
acc_lim_y: 2.5
holonomic_robot: true
該配置文件聲明了機(jī)器人的本地規(guī)劃采用Trajectory Rollout算法。第一段設(shè)置了機(jī)器人的速度閾值,第二段設(shè)置了機(jī)器人的加速度閾值。
4.5 為導(dǎo)航功能包創(chuàng)建一個(gè)啟動(dòng)文件
到此為止,我們已經(jīng)創(chuàng)建完畢所有需要用到的配置文件,接下來我們需要?jiǎng)?chuàng)建一個(gè)啟動(dòng)文件,來啟動(dòng)所有需要的功能。創(chuàng)建move_base.launch的文件:
在該配置文件中,你需要修改的只有map-server輸入的地圖,以及如果使用差分驅(qū)動(dòng)的機(jī)器人,需要修改"amcl_omni.launch"成"amcl_diff.launch" 。
4.6 AMCL功能包的設(shè)置
AMCL有許多的參數(shù)設(shè)置,會(huì)影響機(jī)器人的定位效果,具體參考amcldocumentation。
5、運(yùn)行導(dǎo)航功能包
現(xiàn)在,我們已經(jīng)完成了所有需要的工作,最后一步,運(yùn)行啟動(dòng)文件,開始導(dǎo)航之旅:
roslaunch my_robot_configuration.launch
roslaunch move_base.launch
評論