目录
1.问题分析
2.激光雷达里程计
2.1 代码下载
2.2 使用方法
(1) ERRO:“base_link” passed to lookupTransform argument source_frame does not exist.
(2)"Waiting for laser_scans...."
(3)无法发布odom->base_footprint的tf信息
2.3 导航和建图
由于编码器里程计在使用的时候误差较大,运行时间越长,累计误差越大,尤其当主动轮是充气轮时,误差更大,所以本文将介绍激光雷达里程计的使用。
目前主流的激光雷达里程计包括laser_scan_matcher和rf2o_laser_odometry,其中laser_scan_matcher效果似乎不太好,这里不对其进行介绍,本文主要介绍rf2o_laser_odometry。
git clone https://gitee.com/YaoFL/rf2o_laser_odometry
首先运行激光雷达,再运行rf2o_laser_odometry,以我的激光雷达为例:
roslaunch ydlidar_ros G2.launch
roslaunch rf2o_laser_odometry rf2o_laser_odometry.launch
但是基本上都会出现各种问题,一般分为三个:
主要是因为base_link到雷达没有连接起来,导致无法获取雷达信号。
在rf2o_laser_odometry/src/CLaserOdometry2DNode.cpp中修改:
找到如下代码:tf_listener.lookupTransform(base_frame_id, last_scan.header.frame_id, ros::Time(0), transform);
在此之前添加代码:
tf_listener.waitForTransform("/base_footprint","/laser_frame", ros::Time(), ros::Duration(5.0));
其中"/laser_frame"是激光雷达的frame_id,利用rostopic echo /scan查看/scan的frame_id。
同时将tf_listener.lookupTransform(base_frame_id, last_scan.header.frame_id, ros::Time(0), transform);中的frame_id修改成自己的。例如:
tf_listener.waitForTransform("/base_footprint","/laser_frame", ros::Time(), ros::Duration(5.0));
tf_listener.lookupTransform("/base_footprint","/laser_frame", ros::Time(0), transform);
无法获取雷达信息,一般激光雷达主题是/scan,修改launch为:
# topic where the lidar scans are being published
# topic where tu publish the odometry estimations
# wheter or not to publish the tf::transform (base->odom)
# frame_id (tf) of the mobile robot base. A tf transform from the laser_frame to the base_frame is mandatory
# frame_id (tf) to publish the odometry estimations
# (Odom topic) Leave empty to start at point (0,0)
# Execution frequency.
# verbose
在rf2o_laser_odometry/src/CLaserOdometry2DNode.cpp中修改:
在if (publish_tf)前添加
publish_tf=1;
需要将driver.launch中发布odom的代码删除掉,不然可能出现机器人跳变,因为存在两个odom主题。
1.启动机器人的driver.launch
2.运行激光雷达
3.roslaunch rf2o_laser_odometry rf2o_laser_odometry.launch
4.运行导航和建图的luanch
tf树和建图效果如下;
后续将实现编码器里程计和激光雷达里程计的融合。