我是靠谱客的博主 难过毛衣,最近开发中收集的这篇文章主要介绍rf2o_laser_odometry常见问题前言激光雷达里程计1、运行rf2o_laser_odometry出现Waiting for laser_scans…2、无法发布odom->base_footprint的tf信息3、运行rf2o时报错,pose不能更新以上为自身经历和对网上解决方案的总结,之后再作补充,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

二维激光雷达里程计 rf2o_laser_odometry 常见问题

  • 前言
  • 激光雷达里程计
    • 代码下载
    • 使用方法
  • 1、运行rf2o_laser_odometry出现Waiting for laser_scans....
    • [rf2o] Waiting for laser_scans...
  • 2、无法发布odom->base_footprint的tf信息
    • ERRO:“base_link” passed to lookupTransform argument source_frame does not exist.
  • 3、运行rf2o时报错,pose不能更新
    • [rf2o] ERROR: Eigensolver couldn't find a solution. Pose is not updated
  • 以上为自身经历和对网上解决方案的总结,之后再作补充


前言

由于编码器里程计在使用的时候误差较大,运行时间越长,累计误差越大,尤其当主动轮是充气轮时,误差更大,所以本文将介绍激光雷达里程计的使用。


激光雷达里程计

目前主流的激光雷达里程计包括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

但是基本上都会出现各种问题,一般分为三个:

1、运行rf2o_laser_odometry出现Waiting for laser_scans…

[rf2o] Waiting for laser_scans…

解决办法:
https://github.com/MAPIRlab/rf2o_laser_odometry/issues/8

<launch>
<node pkg="rf2o_laser_odometry" type="rf2o_laser_odometry_node" name="rf2o_laser_odometry" output="screen">
<param name="laser_scan_topic" value="/scan"/>
# 把这个话题改成你使用的雷达发出的话题
<param name="odom_topic" value="/odom_rf2o" />
# topic where tu publish the odometry estimations
<param name="publish_tf" value="true" />
# 改为true
<param name="base_frame_id" value="/base_footprint"/>
# frame_id (tf) of the mobile robot base. A tf transform from the laser_frame to the base_frame is mandatory
<param name="odom_frame_id" value="/odom" />
# frame_id (tf) to publish the odometry estimations
<param name="init_pose_from_topic" value="" /> #确保"初始姿势"参数为空(此参数仅用于设置里程表的初始姿势,如果留空,它将从姿势(0,0,0)开始。
<param name="freq" value="6.0"/>
# Execution frequency.
<param name="verbose" value="true" />
# verbose
</node>
</launch>

2、无法发布odom->base_footprint的tf信息

ERRO:“base_link” passed to lookupTransform argument source_frame does not exist.

要是因为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_link", ros::Time(), ros::Duration(5.0));
tf_listener.lookupTransform("/base_footprint","/laser_link", ros::Time(0), transform);

3、运行rf2o时报错,pose不能更新

[rf2o] ERROR: Eigensolver couldn’t find a solution. Pose is not updated

解决方案:
修改src/CLaserOdometry2D.cpp
292-298行修改成如下:

//Inner pixels
if ((u>1)&&(u<cols_i-2))
{
if (dcenter > 0.f)
if (std::isfinite(dcenter) && dcenter > 0.f)
{
float sum = 0.f;
float weight = 0.f;

316-322行修改成如下:

//Boundary
else
{
if (dcenter > 0.f)
if (std::isfinite(dcenter) && dcenter > 0.f)
{
float sum = 0.f;
float weight = 0.f;

以上为自身经历和对网上解决方案的总结,之后再作补充

最后

以上就是难过毛衣为你收集整理的rf2o_laser_odometry常见问题前言激光雷达里程计1、运行rf2o_laser_odometry出现Waiting for laser_scans…2、无法发布odom->base_footprint的tf信息3、运行rf2o时报错,pose不能更新以上为自身经历和对网上解决方案的总结,之后再作补充的全部内容,希望文章能够帮你解决rf2o_laser_odometry常见问题前言激光雷达里程计1、运行rf2o_laser_odometry出现Waiting for laser_scans…2、无法发布odom->base_footprint的tf信息3、运行rf2o时报错,pose不能更新以上为自身经历和对网上解决方案的总结,之后再作补充所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部