ROS導航之參數配置和自適應蒙特卡羅定位


我們的機器人使用兩種導航算法在地圖中移動:全局導航(global)和局部導航(local)。這些導航算法通過代價地圖來處理地圖中的各種信息,導航stack使用兩種costmaps http://www.cnblogs.com/zjiaxing/p/5543386.html存儲環境的障礙信息。一個costmap進行全局規划,在整個環境做長期的規划,而另一個是用於局部規划和避障。

全局導航:

在已建立的地圖上做一個遠距離目標的路徑規划。

局部導航:

在正在建立的地圖上做近距離目標同時要實時避開障礙物的路徑規划。

 

代價地圖的參數用於配置算法的計算行為。下面進行分析:

基本參數的的配置:

在你的launch(launch文件編寫http://www.cnblogs.com/zjiaxing/p/5542614.html)里,首先創建一個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}

 

這個文件主要用於配置基本的參數,這些參數會被用於local_costmap和global_costmap.

obstacle_range 和raytrace_range:表示傳感器的最大探測距離,並在代價地圖中引入探測障礙物信息。obstacle_range用於障礙物探測,例如機器人檢測到一個距離小於2.5m的障礙物,就會將這個障礙物引入到代價地圖中 raytrace_range用於機器人運動過程中,實時清除代價地圖中的障礙物,例如該機器人將清除前面距離3m(傳感器獲取的數據)的障礙物。並更新可移動的自由空間數據。其實我們用激光傳感器是無法感知物體的形狀和大小的,但是,這個測量結果足夠定位的了。

footprint:將機器人的幾何參數告訴導航功能包集。這樣,機器人和障礙物之間保持一個合理的距離,也就是說,例如前方有個門,要提前探知機器人是否能穿過這個門。

inflation_radius:給定機器人與障礙物之間必須要保持的最小距離。按照機器人的內切半徑對障礙物進行膨脹處理。

observation_sources:設定導航包所使用的傳感器。

laser_scan_sensor和point_cloud_sensor:對傳感器的坐標系和數據進行配置。這個也會用於代價地圖添加和清除障礙物。例如,你可以用激光雷達傳感器用於在代價地圖添加障礙物,再添加kinect用於導航和清除障礙物。

 

全局代價地圖的配置:

創建一個global_costmap_params.yaml文件,內容:

global_costmap:
global_frame: /map
robot_base_frame: base_link
update_frequency: 5.0
static_map: true


global_costmap和robot_base_frame:定義機器人和地圖之間的坐標變換,建立全局代價地圖必須使用這個變換。

update_frequency:地圖更新的頻率。

static_map: 是否使用一個地圖或者地圖服務器來初始化全局代價地圖,如果不使用靜態地圖,這個參數為false.


局部代價地圖的配置:


創建一個local_costmap_params.yaml 文件,內容:

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


publish_frequency:發布信息的頻率,也就是costmap可視化信息發布的頻率。

rolling_window:在機器人運動過程中,代價地圖始終以機器人為中心,這個在源碼里是個if函數。

width、height、resolution:代價地圖的的尺寸和分辨率,單位都是m.一般情況下resolution的數值與建的static map的一致。

 

基本局部規划器配置:


創建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: false

 

這個配置文件設定了機器人的最大和最小速度限制值,也設定了加速度的限值。


holonomic_robot: 如果你的機器人是全向移動機器人那么此值為true,筆者的為差分型的。

 

為了運行導航功能包集,還需要創建個啟動文件 move_base.launch ,內容:

<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>

 

利用自適應蒙特卡羅定位(AMCL)算法完成機器人定位,此方法是一種在2D環境下移動機器人的概率統計方法,這種方法在ROS系統中的具體實現是通過在已知地圖的基礎上使用粒子濾波算法跟蹤機器人的位姿。如果你在rviz里不通過2D Pose Estimate 按鈕設定初始位姿,則AMCL會假定你的機器人從坐標原點開始運行。這個包默認激光雷達數據,你也可以修改源碼,適應如雙目之類的傳感器。amcl_diff.launch.launch是專用於支持差分驅動機器人平台的 https://github.com/ros-planning/navigation/tree/indigo-devel/amcl 內容如下:

 

<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:設定算法運行所允許的粒子的最小和最大數量,如果粒子數多,就算會更加精確,當然也后悔更加消耗cpu資源。

laser_model_type:配置激光雷達類型。也可以設置beam光束雷達。

laser_likelihood_max_dist:設置地圖中障礙物膨脹的最大距離。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM