ROS机器人Diego制作12-SLAM导航的配置
ROS机器人Diego制作12-SLAM导航的配置
说明:
- 介绍说明如何实现SLAM
- 导航,由地图、定位、和导航,三个包实现的,分别是:
- gmapping — 地图包,用来画地图的,先用这个包把地图画出来,然后再用amcl和move_base实现导航
- amcl — 定位包,就是根据传感器信息确定在地图上的位置
- move_base — 路径规划包,就是真正意义上的导航包,告诉机器人该怎么走
TF转换说明
- 图示:
- 图为配置完成后机器人的tf转换图,在ROS中所以的信息是按照tf tree传递
- 如果tf配置错了,信息的传递就会中断,就不会有预想到结果
- TF转换说明:
实现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数据,免去转换的环节。
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号