< >
Home » ROS机器人Diego制作 » ROS机器人Diego制作12-SLAM导航的配置

ROS机器人Diego制作12-SLAM导航的配置

ROS机器人Diego制作12-SLAM导航的配置

说明:

  • 介绍说明如何实现SLAM
  • 导航,由地图、定位、和导航,三个包实现的,分别是:
    • gmapping — 地图包,用来画地图的,先用这个包把地图画出来,然后再用amcl和move_base实现导航
    • amcl — 定位包,就是根据传感器信息确定在地图上的位置
    • move_base — 路径规划包,就是真正意义上的导航包,告诉机器人该怎么走

TF转换说明

  • 图示:

请输入图片描述

  • 图为配置完成后机器人的tf转换图,在ROS中所以的信息是按照tf tree传递
  • 如果tf配置错了,信息的传递就会中断,就不会有预想到结果
  • TF转换说明:
    • map ->odom的tf转换是在gmapping中完成的,gmapping配置完成后map和odom就会被连接起来
    • odom->base_link是在 base_control中完成的,在arduino_bridge中完成的,具体参考第三节
    • base_link->camera_base_link是需要我们自己来写代码发布他们的位置转换关系的,具体参考第十节
    • camera_base_link->laser也是需要我们自己写代码实现的,laser是激光雷达的frame

实现camera_base_link和laser的FT联系:

  • 因为激光雷达是摄像头点云数据模拟出来的,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();
  }
}
  • 关于导航的tf就都联系起来了

查看TF是否配置正确

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

请输入图片描述

  • 在rviz中如果把odom加进去一起显示,则可以看到tf的实体关系, 效果图:
    请输入图片描述

  • 相关模块的topic的订阅关系, 配置好后的节点图:

请输入图片描述

  • 节点关系说明:

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

      • tf: 订阅laser的tf坐标转换
      • scan:激光雷达的数据,这里就是我们摄像头模拟出的数据camera/scan
      • gmapping订阅这两个主题,通过内部的算法会产生地图,并发布/map的主题
    • amcl订阅四个topic

      • tf:订阅tf坐标转换
      • scan:激光雷达数据
      • map: gmapping产生的map主题
      • initialpose:初始化位姿,这里使用的default
    • amcl发布的主题:

      • amcl _pose位置主题
      • particlecloud 姿态的数据集,可以理解为一组位置信息
      • tf:发布的是odom到map的位置转换信息
  • move_base主要是根据导航算法发布cmd_vel主题,控制小车的行为。

gmapping的配置

  • gmapping的安装
apt-get install ros-kinetic-gmapping
  • 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

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

move_base配置

  • move_base安装
sudo apt-get install ros-kinetic-navigation
  • 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>
  • 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}
  • 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
  • global_costmap_params.yaml
global_costmap:  
 global_frame: /map  
 robot_base_frame: base_link  
 update_frequency: 5.0  
 static_map: false
  • 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

资源占用情况

  • 图示:
    请输入图片描述

  • 树莓派的cpu使用率已经已经相当高,基本上保持在高位运行,这也导致电源消耗非常快,内存占用率在50%左右。

  • 但也证明树莓派通过深度相机转换成激光数据跑SLAM是非常吃力的,CPU一直在高位运行,而且转换发布scan topic非常慢

  • 从我的观察需要几秒钟才有一笔scan数据,这样的发布频率你就会看到terminal上全是满屏的warning,地图是跑不出来

  • 如果要玩SLAM还是直接上激光雷达,直接处理laser scan数据,免去转换的环节。

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ros机器人diego制作