ROS导航之参数配置和自适应蒙特卡罗定位
我們的機(jī)器人使用兩種導(dǎo)航算法在地圖中移動(dòng):全局導(dǎo)航(global)和局部導(dǎo)航(local)。這些導(dǎo)航算法通過代價(jià)地圖來處理地圖中的各種信息,導(dǎo)航stack使用兩種costmaps?http://www.cnblogs.com/zjiaxing/p/5543386.html存儲(chǔ)環(huán)境的障礙信息。一個(gè)costmap進(jìn)行全局規(guī)劃,在整個(gè)環(huán)境做長(zhǎng)期的規(guī)劃,而另一個(gè)是用于局部規(guī)劃和避障。
全局導(dǎo)航:
在已建立的地圖上做一個(gè)遠(yuǎn)距離目標(biāo)的路徑規(guī)劃。
局部導(dǎo)航:
在正在建立的地圖上做近距離目標(biāo)同時(shí)要實(shí)時(shí)避開障礙物的路徑規(guī)劃。
?
代價(jià)地圖的參數(shù)用于配置算法的計(jì)算行為。下面進(jìn)行分析:
基本參數(shù)的的配置:
在你的launch(launch文件編寫http://www.cnblogs.com/zjiaxing/p/5542614.html)里,首先創(chuàng)建一個(gè)costmap_common_params.yaml文件,內(nèi)容:
obstacle_range: 2.5raytrace_range: 3.0 footprint: [[x0, y0], [x1, y1], ... [xn, yn]] #robot_radius: ir_of_robot inflation_radius: 0.55observation_sources: laser_scan_sensor point_cloud_sensorlaser_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}
?
這個(gè)文件主要用于配置基本的參數(shù),這些參數(shù)會(huì)被用于local_costmap和global_costmap.
obstacle_range 和raytrace_range:表示傳感器的最大探測(cè)距離,并在代價(jià)地圖中引入探測(cè)障礙物信息。obstacle_range用于障礙物探測(cè),例如機(jī)器人檢測(cè)到一個(gè)距離小于2.5m的障礙物,就會(huì)將這個(gè)障礙物引入到代價(jià)地圖中 raytrace_range用于機(jī)器人運(yùn)動(dòng)過程中,實(shí)時(shí)清除代價(jià)地圖中的障礙物,例如該機(jī)器人將清除前面距離3m(傳感器獲取的數(shù)據(jù))的障礙物。并更新可移動(dòng)的自由空間數(shù)據(jù)。其實(shí)我們用激光傳感器是無法感知物體的形狀和大小的,但是,這個(gè)測(cè)量結(jié)果足夠定位的了。
footprint:將機(jī)器人的幾何參數(shù)告訴導(dǎo)航功能包集。這樣,機(jī)器人和障礙物之間保持一個(gè)合理的距離,也就是說,例如前方有個(gè)門,要提前探知機(jī)器人是否能穿過這個(gè)門。
inflation_radius:給定機(jī)器人與障礙物之間必須要保持的最小距離。按照機(jī)器人的內(nèi)切半徑對(duì)障礙物進(jìn)行膨脹處理。
observation_sources:設(shè)定導(dǎo)航包所使用的傳感器。
laser_scan_sensor和point_cloud_sensor:對(duì)傳感器的坐標(biāo)系和數(shù)據(jù)進(jìn)行配置。這個(gè)也會(huì)用于代價(jià)地圖添加和清除障礙物。例如,你可以用激光雷達(dá)傳感器用于在代價(jià)地圖添加障礙物,再添加kinect用于導(dǎo)航和清除障礙物。
?
全局代價(jià)地圖的配置:
創(chuàng)建一個(gè)global_costmap_params.yaml文件,內(nèi)容:
global_costmap: global_frame: /map robot_base_frame: base_link update_frequency: 5.0 static_map: true
global_costmap和robot_base_frame:定義機(jī)器人和地圖之間的坐標(biāo)變換,建立全局代價(jià)地圖必須使用這個(gè)變換。
update_frequency:地圖更新的頻率。
static_map:?是否使用一個(gè)地圖或者地圖服務(wù)器來初始化全局代價(jià)地圖,如果不使用靜態(tài)地圖,這個(gè)參數(shù)為false.
局部代價(jià)地圖的配置:
創(chuàng)建一個(gè)local_costmap_params.yaml 文件,內(nèi)容:
publish_frequency:發(fā)布信息的頻率,也就是costmap可視化信息發(fā)布的頻率。
rolling_window:在機(jī)器人運(yùn)動(dòng)過程中,代價(jià)地圖始終以機(jī)器人為中心,這個(gè)在源碼里是個(gè)if函數(shù)。
width、height、resolution:代價(jià)地圖的的尺寸和分辨率,單位都是m.一般情況下resolution的數(shù)值與建的static map的一致。
?
基本局部規(guī)劃器配置:
創(chuàng)建base_local_planner_params.yaml 文件,內(nèi)容:
?
這個(gè)配置文件設(shè)定了機(jī)器人的最大和最小速度限制值,也設(shè)定了加速度的限值。
holonomic_robot:?如果你的機(jī)器人是全向移動(dòng)機(jī)器人那么此值為true,筆者的為差分型的。
?
為了運(yùn)行導(dǎo)航功能包集,還需要?jiǎng)?chuàng)建個(gè)啟動(dòng)文件 move_base.launch ,內(nèi)容:
<launch> <master auto="start"/><!-- Run the map server --> <node name="map_server" pkg="map_server" type="map_server" args="$(find your_map_package)/your_map.pgm your_map_resolution.yaml"/><!--- Run AMCL --> <include file="$(find amcl)/examples/amcl_diff.launch.launch" /> <node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen"> <rosparam file="$(find your_nav_package)/launch/costmap_common_params.yaml" command="load" ns="global_costmap" /> <rosparam file="$(find your_nav_package)/launch/costmap_common_params.yaml" command="load" ns="local_costmap" /> <rosparam file="$(find your_nav_package)/launch/local_costmap_params.yaml" command="load" /> <rosparam file="$(find your_nav_package)/launch/global_costmap_params.yaml" command="load" /> <rosparam file="$(find your_nav_package)/launch/base_local_planner_params.yaml" command="load" /> </node> </launch>?
利用自適應(yīng)蒙特卡羅定位(AMCL)算法完成機(jī)器人定位,此方法是一種在2D環(huán)境下移動(dòng)機(jī)器人的概率統(tǒng)計(jì)方法,這種方法在ROS系統(tǒng)中的具體實(shí)現(xiàn)是通過在已知地圖的基礎(chǔ)上使用粒子濾波算法跟蹤機(jī)器人的位姿。如果你在rviz里不通過2D Pose Estimate 按鈕設(shè)定初始位姿,則AMCL會(huì)假定你的機(jī)器人從坐標(biāo)原點(diǎn)開始運(yùn)行。這個(gè)包默認(rèn)激光雷達(dá)數(shù)據(jù),你也可以修改源碼,適應(yīng)如雙目之類的傳感器。amcl_diff.launch.launch是專用于支持差分驅(qū)動(dòng)機(jī)器人平臺(tái)的?https://github.com/ros-planning/navigation/tree/indigo-devel/amcl?內(nèi)容如下:
?
<launch> <node pkg="amcl" type="amcl" name="amcl" output="screen"> <!-- Publish scans from best pose at a max of 10 Hz --> <param name="odom_model_type" value="diff"/> <param name="odom_alpha5" value="0.1"/> <param name="transform_tolerance" value="0.2" /> <param name="gui_publish_rate" value="10.0"/> <param name="laser_max_beams" value="30"/> <param name="min_particles" value="500"/> <param name="max_particles" value="5000"/> <param name="kld_err" value="0.05"/> <param name="kld_z" value="0.99"/> <param name="odom_alpha1" value="0.2"/> <param name="odom_alpha2" value="0.2"/> <!-- translation std dev, m --> <param name="odom_alpha3" value="0.8"/> <param name="odom_alpha4" value="0.2"/> <param name="laser_z_hit" value="0.5"/> <param name="laser_z_short" value="0.05"/> <param name="laser_z_max" value="0.05"/> <param name="laser_z_rand" value="0.5"/> <param name="laser_sigma_hit" value="0.2"/> <param name="laser_lambda_short" value="0.1"/> <param name="laser_lambda_short" value="0.1"/> <param name="laser_model_type" value="likelihood_field"/> <!-- <param name="laser_model_type" value="beam"/> --> <param name="laser_likelihood_max_dist" value="2.0"/> <param name="update_min_d" value="0.2"/> <param name="update_min_a" value="0.5"/> <param name="odom_frame_id" value="odom"/> <param name="resample_interval" value="1"/> <param name="transform_tolerance" value="0.1"/> <param name="recovery_alpha_slow" value="0.0"/> <param name="recovery_alpha_fast" value="0.0"/> </node> </launch>?
min_particles和max_particles:設(shè)定算法運(yùn)行所允許的粒子的最小和最大數(shù)量,如果粒子數(shù)多,就算會(huì)更加精確,當(dāng)然也后悔更加消耗cpu資源。
laser_model_type:配置激光雷達(dá)類型。也可以設(shè)置beam光束雷達(dá)。
laser_likelihood_max_dist:設(shè)置地圖中障礙物膨脹的最大距離。
總結(jié)
以上是生活随笔為你收集整理的ROS导航之参数配置和自适应蒙特卡罗定位的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米、华为、苹果都已支持 北斗导航已覆盖
- 下一篇: 高端家政人才缺口巨大 月薪可达3万:比I