您的位置:首页 > 编程语言 > Go语言

ROS机器人Diego 1#制作(十二)SLAM导航的配置

2016-12-11 23:32 615 查看
一提到导航,一般人都会把地图、定位、和导航都包含进来,但在ROS中这三部分是分别用三个包实现的,分别是:

gmapping —地图包,通俗一点这个包是用来画地图的,可以用这个包先把地图画出来,然后在用amcl和 move_base实现导航

amcl—定位包,就是根据传感器信息确定在地图上的位置

move_base—路径规划包,就是真正意义上的导航包,告诉机器人该怎么走

很多博客都是将这三部分分开讲的,但实际上他们都是有关联的,放在一起讲可能更容易理解,具体的理论请参见官方的教程或者很多前辈写的博客,这里就不讲了,还是实战讲解。

1.tf转换说明



上图是配置完成后diego1#机器人的tf转换图,在ROS中所以的信息是按照tf tree传递的,如果tf配置错了,信息的传递就会中断,就不会有预想到结果

a. map ->odom的tf转换是在gmapping中完成的,gmapping配置完成后map和odom就会被连接起来

b. odom->base_link是在 base_control中完成的,在diego 1#中就是在arduino_bridge中完成的,具体可以参见我前面的博文http://blog.csdn.net/mwlwlm/article/details/52979723

c. base_link->camera_base_link是需要我们自己来写代码发布他们的位置转换关系的,参见我前面的博文http://blog.csdn.net/mwlwlm/article/details/53463477

d. camera_base_link->laser也是需要我们自己写代码实现的,laser 是激光雷达的frame,代码如下,因为激光雷达是摄像头点云数据模拟出来的,所以tf坐标和摄像头是一样的,所以这里laser和camera_link的坐标偏移是0。当然也可要在launch中配置。

#include <ros/ros.h>
#include <tf/transform_broadcaster.h>

int main(int argc, char** argv){
ros::init(argc, argv, "robot_laser_tf_publisher");
ros::NodeHandle n;

ros::Rate r(10);

tf::TransformBroadcaster broadcaster;

while(n.ok()){
broadcaster.sendTransform(
tf::StampedTransform(
tf::Transform(tf::Quaternion(0, 0, 0, 1), tf::Vector3(0.0, 0.0, 0.0)),
ros::Time::now(),"camera_link", "laser"));
r.sleep();
}
}


至此Diego1#关于导航的tf就都联系起来了。

查看tf是否配置正确,可以用rviz来查看,把frame设置为map,TF status是否是ok的,如果有警告信息,则说明设置是有问题的



在rviz中如果把odom加进去一起显示,则可以看到tf的实体关系



2.相关模块的topic的订阅关系

先上一张配置好后的节点图:



a. gmapping订阅两个topic,发布一个主题

tf: 订阅laser的tf坐标转换

scan:激光雷达的数据,这里就是我们摄像头模拟出的数据camera/scan

gmapping订阅这两个主题,通过内部的算法会产生地图,并发布/map的主题

b.amcl订阅四个topic

tf:订阅tf坐标转换

scan:激光雷达数据

map: gmapping产生的map主题

initialpose:?这个还不是很清楚作用是什么,这里使用的default

amcl发布的主题:

amcl _pose位置主题

particlecloud 姿态的数据集,可以理解为一组位置信息

tf:发布的是odom到map的位置转换信息

c. move_base主要是根据导航算法发布cmd_vel主题,控制小车的行为

3.gmapping的配置

a. gmapping的安装

apt-get install ros-kinetic-gmapping


b. gmapping的配置,主要在launch文件中体现

<!-- gmapping node -->

<node pkg="gmapping" type="slam_gmapping" name="slam_gmapping">
<remap from="scan" to="camera/scan"/>
<param name="delta" value="0.1"/>
<param name="maxUrange" value="4.99"/>
<param name="xmin" value="-5.0"/>
<param name="ymin" value="-5.0"/>
<param name="xmax" value="5.0"/>
<param name="ymax" value="5.0"/>
<param name="particles" value="60"/>
<param name="srr" value="0"/>
<param name="srt" value="0"/>
<param name="str" value="0.05"/>
<param name="stt" value="0.05"/>
<param name="minimumScore" value="200"/>
<param name="map_update_interval" value="1"/>
<param name="lsigma" value="0.05"/>
</node>


具体参数的意义这里不讨论,需要仔细看官网的教程并在实践中不断理解。这里比较重要的是中一定要对应上激光数据发布的主题,这里是camera/scan

4.amcl的配置

<!-- amcl node -->
<node pkg="amcl" type="amcl" name="amcl" output="screen">

<remap from="scan" to="$camera/scan"/>
<!-- Publish scans from best pose at a max of 10 Hz -->
<param name="use_map_topic" value="true"/>
<param name="odom_model_type" value="omni"/>
<param name="odom_alpha5" value="0.1"/>
<param name="transform_tolerance" value="0.5" />
<param name="gui_publish_rate" value="10.0"/>
<param name="laser_max_beams" value="300"/>
<param name="min_particles" value="500"/>
<param name="max_particles" value="5000"/>
<param name="kld_err" value="0.1"/>
<param name="kld_z" value="0.99"/>
<param name="odom_alpha1" value="0.1"/>
<param name="odom_alpha2" value="0.1"/>
<!-- translation std dev, m -->
<param name="odom_alpha3" value="0.1"/>
<param name="odom_alpha4" value="0.1"/>
<param name="laser_z_hit" value="0.9"/>
<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_min_range" value="1"/>
<param name="laser_max_range" value="5"/>
<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="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>


这里也需要设置scan对应的主题为camera/scan

5 . move_base配置

a. 安装

sudo apt-get install ros-kinetic-navigation


b.launch文件

<!-- move_base node -->
<node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
<rosparam file="$(find diego_nav)/config/costmap_common_params.yaml" command="load" ns="global_costmap" />
<rosparam file="$(find diego_nav)/config/costmap_common_params.yaml" command="load" ns="local_costmap" />
<rosparam file="$(find diego_nav)/config/local_costmap_params.yaml" command="load" />
<rosparam file="$(find diego_nav)/config/global_costmap_params.yaml" command="load" />
<rosparam file="$(find diego_nav)/config/base_local_planner_params.yaml" command="load" />
</node>


c. costmap_common_params.yaml

obstacle_range: 2.5
raytrace_range: 3.0
footprint: [[0.14, 0.14], [0.14, -0.14], [-0.14, 0.14], [-0.14, -0.14]]
#robot_radius: ir_of_robot
inflation_radius: 0.55

observation_sources: point_cloud_sensor

point_cloud_sensor: {sensor_frame: base_pointcloud, data_type: PointCloud, topic: point_cloud_publisher, marking: true, clearing: true}


d. 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: 4.0
height: 6.0
resolution: 0.05


c. global_costmap_params.yaml

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


d. 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_
cbc4
y: 2.5

holonomic_robot: true


6 .资源占用情况



树莓派的cpu使用率已经已经相当高了,基本上保持在高位运行,这也导致电源消耗非常快,内存占用率在50%左右,还可以接受。但也证明树莓派通过深度相机,转换成激光数据跑SLAM是非常吃力的,CPU一直在高位运行,而且转换发布scan topic非常慢,从我的观察需要几秒钟才会有一笔scan数据,这样的发布频率,你就会看的ROS terminal上全是满屏的warning,地图是跑不出来的。如果要玩SLAM还是直接上激光雷达,直接处理laser scan数据,免去转换的环节。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息