ROS导航之参数配置和⾃适应蒙特卡罗定位
全局导航:
在已建⽴的地图上做⼀个远距离⽬标的路径规划。
局部导航:
在正在建⽴的地图上做近距离⽬标同时要实时避开障碍物的路径规划。
代价地图的参数⽤于配置算法的计算⾏为。下⾯进⾏分析:
基本参数的的配置:
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>
<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:设置地图中障碍物膨胀的最⼤距离。