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

34 篇文章 11 订阅
7 篇文章 0 订阅

更多创客作品,请关注笔者网站园丁鸟,搜集全球极具创意,且有价值的创客作品


一提到导航,一般人都会把地图、定位、和导航都包含进来,但在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_y: 2.5  
 
  holonomic_robot: true

6 .资源占用情况
这里写图片描述

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DiegoRobot

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值