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中配置。
至此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的安装
b. gmapping的配置,主要在launch文件中体现
具体参数的意义这里不讨论,需要仔细看官网的教程并在实践中不断理解。这里比较重要的是中一定要对应上激光数据发布的主题,这里是camera/scan
4.amcl的配置
这里也需要设置scan对应的主题为camera/scan
5 . move_base配置
a. 安装
b.launch文件
c. costmap_common_params.yaml
d. local_costmap_params.yaml
c. global_costmap_params.yaml
d. base_local_planner_params.yaml
6 .资源占用情况
树莓派的cpu使用率已经已经相当高了,基本上保持在高位运行,这也导致电源消耗非常快,内存占用率在50%左右,还可以接受。但也证明树莓派通过深度相机,转换成激光数据跑SLAM是非常吃力的,CPU一直在高位运行,而且转换发布scan topic非常慢,从我的观察需要几秒钟才会有一笔scan数据,这样的发布频率,你就会看的ROS terminal上全是满屏的warning,地图是跑不出来的。如果要玩SLAM还是直接上激光雷达,直接处理laser scan数据,免去转换的环节。
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数据,免去转换的环节。
相关文章推荐
- ROS机器人Diego 1#制作(十七)用moveit assistant生成配置包
- ROS机器人Diego 1#制作(七)ROS语音系统
- ROS机器人Diego 1#制作总结
- ROS机器人Diego 1#制作(十五)机械臂的控制---通过键盘控制机械臂舵机
- ROS机器人Diego 1#制作(十九)diego机器人的moveit驱动
- ROS机器人Diego 1#制作(二十三)搭载EAI F4激光雷达move_base路径规划
- ROS机器人Diego 1#制作(十一)将letv xtion点云数据转换成激光数据
- ROS机器人Diego 1#制作(十六)创建机器人的urdf模型描述文件
- ROS机器人Diego 1#制作(九)视觉系统之使用Xtion发布点云数据
- ROS机器人Diego 1#制作(十三)launch启动文件
- ROS机器人Diego 1#制作(三)base controller---ros_arduino_bridge
- ROS机器人Diego 1#制作(八)ROS语音系统之整合讯飞语音
- ROS机器人Diego 1#制作(二)base controller---rosserial_arduino
- ROS机器人Diego 1#制作(十四)机械臂的控制---arduino驱动
- ROS机器人Diego 1#制作(二十二)基于EAI F4激光雷达数据进行定位amcl
- ROS机器人Diego 1#制作(十八)模拟环境测试moveit
- ROS机器人Diego 1#制作(十)摄像头tf数据的发布
- ROS机器人Diego 1#制作(二十)搭载EAI F4激光雷达Hector创建室内地图
- ROS机器人Diego 1#制作(二十一)搭载EAI F4激光雷达gmapping创建室内地图
- ROS机器人Diego 1#制作(五)base controller---角速度的标定