精华内容
下载资源
问答
  • rf2o_laser_odometry

    千次阅读 2019-08-09 15:03:11
    https://github.com/MAPIRlab/rf2o_laser_odometry <...node pkg="rf2o_laser_odometry" type="rf2o_laser_odometry_node" name="rf2o_laser_odometry" output="screen"> <param nam...

    https://github.com/MAPIRlab/rf2o_laser_odometry 

    <launch>
    
      <node pkg="rf2o_laser_odometry" type="rf2o_laser_odometry_node" name="rf2o_laser_odometry" output="screen">
        <param name="laser_scan_topic" value="scan"/>        # topic where the lidar scans are being published
        <param name="odom_topic" value="odom_rf2o" />              # topic where tu publish the odometry estimations
        <param name="publish_tf" value="true" />                   # wheter or not to publish the tf::transform (base->odom)
        <param name="base_frame_id" value="base_link"/>            # 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="" /> # (Odom topic) Leave empty to start at point (0,0)
        <param name="freq" value="5.0"/>                            # Execution frequency.
        <param name="verbose" value="true" />                       # verbose
      </node>
      
    </launch>

    解决([rf2o] ERROR: Eigensolver couldn't find a solution. Pose is not updated) 如果激光扫描数据包含+/- Inf和/或NaNs,则无法计算odom协方差且没有任何反应 

    https://github.com/artivis/rf2o_laser_odometry/commit/ae010765627e0446930599e3376a45ecaea2b422

    @@ -292,7 +292,7 @@ void CLaserOdometry2D::createImagePyramid()
            //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,7 +316,7 @@ void CLaserOdometry2D::createImagePyramid()
            //Boundary
            else
            {
              --  if (dcenter > 0.f)
              ++  if (std::isfinite(dcenter) && dcenter > 0.f)
              {
                float sum = 0.f;
                float weight = 0.f;

     

    展开全文
  • 激光里程计:rf2o_laser_odometry 建图:gmapping 对于很多刚入门的同学,购买一台带有高精度轮式里程计的ROS小车经济上往往不允许。但是大多数同学都接触过那种基于51或Arduino之类的简易智能小车,就是那种做...
    • ROS环境:ubuntu16.04 & ROS kinetic
    • 激光雷达:EAI-X4 or RPlidar-A1
    • 激光里程计:rf2o_laser_odometry
    • 建图:gmapping

    对于很多刚入门的同学,购买一台带有高精度轮式里程计的ROS小车经济上往往不允许。但是大多数同学都接触过那种基于51或Arduino之类的简易智能小车,就是那种做寻迹比赛的小车(不带里程计解析算法和ROS驱动接口),如图1。那么能不能在这种简易智能小车上只用一个激光雷达就能进行SLAM建图呢?答案是肯定的,下面一步步教你怎么做。

    图1  简易智能车

     

    1.将激光雷达安装到你的小车上

    理论上讲,选择哪种型号的激光雷达都是可以的,只是安装雷达ROS驱动时会有所不同而已。不过市面上比较常见的是EAI-X4或者Rrplidar-A1这种低成本激光雷达,我这里用的是EAI-X4这款雷达,就以这个为例讲解吧。其实就是将激光雷达固定到你的小车上,然后找根USB线将雷达连接到电脑(电脑需支持ubuntu&ROS)就行了,如图2所示。

    图2  雷达有线连接

    那么问题来了,你的小车是要移动建图的,电脑与雷达之间这根烦人的USB线肯定是不行的。由于雷达基本都是USB串口协议通信的,找个USB串口透传模块就能轻松替代这根USB线,如下图3所示。

    图3  雷达无线连接

    2.安装激光雷达ROS驱动

    按上面连好雷达,就可以在电脑中安装雷达ROS驱动了,驱动到雷达原厂官网可以下载到,或者从购买渠道商家那里索取。下面是EAI-X4雷达的ROS驱动下载链接:

    https://www.ydlidar.cn/service_support/download.html

    下载好后,将驱动板解压到自己的ROS工作空间(比如路径~/catkin_ws/src/),然后编译。没有建立ROS工作空间或者不知道ROS工作空间的同学可以看我之前的教程(https://blog.csdn.net/hiram_zhang/article/details/88374505)。

    2.1编译

    #编译命令
    cd catkin_ws/
    catkin_make 

    2.2设置串口号及权限

    雷达插入电脑后通常被识别出的串口号为/dev/ttyUSB0,具体看你自己的情况(也可能是/dev/ttyUSB1或者/dev/ttyUSB2等等),需要将这个串口号赋予可读写权限。

    #赋予权限
    sudo chmod 777 /dev/ttyUSB0

    然后雷达驱动包里面路径为ydlidar/launch/lidar.launch的启动文件中port、frame_id和tf发布参数要修改,修改好的参数如下:

    <launch>
      <node name="ydlidar_node"  pkg="ydlidar"  type="ydlidar_node" output="screen">
        <param name="port"         type="string" value="/dev/ttyUSB0"/>  
        <param name="baudrate"     type="int"    value="115200"/>
        <param name="frame_id"     type="string" value="laser_frame"/>
        <param name="angle_fixed"  type="bool"   value="true"/>
        <param name="low_exposure"  type="bool"   value="false"/>
        <param name="heartbeat"    type="bool"   value="false"/>
        <param name="resolution_fixed"    type="bool"   value="true"/>
        <param name="angle_min"    type="double" value="-180" />
        <param name="angle_max"    type="double" value="180" />
        <param name="range_min"    type="double" value="0.08" />
        <param name="range_max"    type="double" value="16.0" />
        <param name="ignore_array" type="string" value="" />
        <param name="samp_rate"    type="int"    value="9"/>
        <param name="frequency"    type="double" value="7"/>
      </node>
      <node pkg="tf" type="static_transform_publisher" name="base_link_to_laser4"
        args="0.2245 0.0 0.2 0.0 0.0  0.0 /base_footprint /laser_frame 40" />
    </launch>

    2.3启动雷达

    #启动
    roslaunch ydlidar lidar.launch

    3.安装rf2o_laser_odometry激光里程计

    说起了rf2o_laser_odometry的工作原理也很简单,就是利用相邻两帧雷达数据匹配得到里程位移量。

    3.1下载rf2o_laser_odometry源码

    #依然是将rf2o_laser_odometry下载到ROS工作空间
    cd catkin_ws/src/
    git clone https://github.com/MAPIRlab/rf2o_laser_odometry.git

    3.2代码bug修复

    下载得到的原始rf2o_laser_odometry代码有两个问题,如果不修复会有下面这两个报错:

    #报错1:

    ERRO:“base_link” passed to lookupTransform argument source_frame does not exist. 或者 ERRO:Invalid argument passed to lookupTrasform argument source_frame in tf2 frame_ids cannot be empty

    #报错2:

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

    第1个错误是由于程序订阅/tf话题数据时超时,加个延迟就好了。在源码rf2o_laser_odometry/src/CLaserOdometry2DNode.cpp中第126行的上面添加下面这句:

    tf_listener.waitForTransform(base_frame_id,"laser_link",ros::Time(),ros::Duration(5.0));

    第2个错误是你的激光雷达上传来的数据包含Inf或NaNs非法格式数据,我亲测发现EAI-X4雷达没有这个问题,而Rplidar-A1雷达会有这个问题,以防万一还是修复一下吧。将源码rf2o_laser_odometry/src/CLaserOdometry2D.cpp中第292和316行的条件语句都改成下面这个:

    if (std::isfinite(dcenter) && dcenter > 0.f)

    3.3编译

    #编译命令
    cd catkin_ws/
    catkin_make

    3.4参数配置

    rf2o_laser_odometry/launch/rf2o_laser_odometry.launch中的雷达话题、里程计话题、各个frame_id等参数设置对,设置好的参数如下:

    <launch>
    
      <node pkg="rf2o_laser_odometry" type="rf2o_laser_odometry_node" name="rf2o_laser_odometry" output="screen">
        <param name="laser_scan_topic" value="/scan"/>        # topic where the lidar scans are being published
        <param name="odom_topic" value="/odom" />              # topic where tu publish the odometry estimations
        <param name="publish_tf" value="true" />                   # wheter or not to publish the tf::transform (base->odom)
        <param name="base_frame_id" value="base_link"/>            # 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="" /> # (Odom topic) Leave empty to start at point (0,0)
        <param name="freq" value="6.0"/>                            # Execution frequency.
        <param name="verbose" value="true" />                       # verbose
      </node>
      
    </launch>

    3.5启动激光里程计

    #启动
    roslaunch rf2o_laser_odometry rf2o_laser_odometry.launch

    4.安装gmapping建图

    到这里,你已经具有激光雷达数据和用激光雷达模拟出来的里程计数据,接下来只需要安装gmapping这个最简单的SLAM建图算法就可以构建出地图了。

    4.1下载并编译gmapping

    #依然是将gmapping下载到ROS工作空间
    cd catkin_ws/src/
    git clone https://github.com/ros-perception/slam_gmapping.git
    cd slam_gmapping
    git clone https://github.com/ros-perception/openslam_gmapping.git
    
    #编译
    cd catkin_ws/
    catkin_make

    4.2参数配置

    将slam_gmapping/gmapping/launch/slam_gmapping_pr2.launch中的雷达话题等参数设置对,设置好的参数如下:

    <launch>
        <param name="use_sim_time" value="true"/>
        <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen">
          <remap from="scan" to="/scan"/>
          <param name="map_update_interval" value="5.0"/>
          <param name="maxUrange" value="16.0"/>
          <param name="sigma" value="0.05"/>
          <param name="kernelSize" value="1"/>
          <param name="lstep" value="0.05"/>
          <param name="astep" value="0.05"/>
          <param name="iterations" value="5"/>
          <param name="lsigma" value="0.075"/>
          <param name="ogain" value="3.0"/>
          <param name="lskip" value="0"/>
          <param name="srr" value="0.1"/>
          <param name="srt" value="0.2"/>
          <param name="str" value="0.1"/>
          <param name="stt" value="0.2"/>
          <param name="linearUpdate" value="1.0"/>
          <param name="angularUpdate" value="0.5"/>
          <param name="temporalUpdate" value="3.0"/>
          <param name="resampleThreshold" value="0.5"/>
          <param name="particles" value="30"/>
          <param name="xmin" value="-50.0"/>
          <param name="ymin" value="-50.0"/>
          <param name="xmax" value="50.0"/>
          <param name="ymax" value="50.0"/>
          <param name="delta" value="0.05"/>
          <param name="llsamplerange" value="0.01"/>
          <param name="llsamplestep" value="0.01"/>
          <param name="lasamplerange" value="0.005"/>
          <param name="lasamplestep" value="0.005"/>
        </node>
    </launch>

    4.3启动建图

    #启动
    roslaunch gmapping slam_gmapping_pr2.launch

    4.4查看地图

    #打开rviz
    rviz

    在rviz订阅Map话题就能看到地图了,看到下面这张图就大功告成了。

    这时候可以用手持方式将激光雷达在水平上进行缓慢移动,或者用你小车提供的控制方式控制小车移动,这样上面的地图会有更新,恭喜你享受SLAM建图的乐趣吧。

    后记

    如果大家对博文的相关类容感兴趣,或有什么技术疑问,欢迎加入下面的《SLAMD导航机器人&零基础实战》QQ技术交流群(728661815),一起讨论学习^_^

    【也可以通过以下平台关注我发布的更多优质内容】:

    我的知乎专栏:https://zhuanlan.zhihu.com/c_1084087088789569536

    我的CSDN博客:https://blog.csdn.net/hiram_zhang

    我的B站视频:http://space.bilibili.com/66815220

    我的QQ讨论群:728661815

    我的某宝小店:miiboo机器人

    我的电子邮箱:robot4miiboo@163.com

     

     

    展开全文
  • 目录 ...(2)"Waiting for laser_scans...." (3)无法发布odom->base_footprint的tf信息 2.3 导航和建图 1.问题分析 由于编码器里程计在使用的时候误差较大,运行时间越长,累计误差越大,尤...

    目录

     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  导航和建图


     1.问题分析

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

    2.激光雷达里程计

    目前主流的激光雷达里程计包括laser_scan_matcher和rf2o_laser_odometry,其中laser_scan_matcher效果似乎不太好,这里不对其进行介绍,本文主要介绍rf2o_laser_odometry。

    2.1 代码下载

    git clone https://gitee.com/YaoFL/rf2o_laser_odometry

    2.2 使用方法

    首先运行激光雷达,再运行rf2o_laser_odometry,以我的激光雷达为例:

    roslaunch ydlidar_ros G2.launch
    
    roslaunch rf2o_laser_odometry rf2o_laser_odometry.launch 

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

    (1) 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_frame", ros::Time(), ros::Duration(5.0));
    tf_listener.lookupTransform("/base_footprint","/laser_frame", ros::Time(0), transform);

    (2)"Waiting for laser_scans...."

    无法获取雷达信息,一般激光雷达主题是/scan,修改launch为:

    <launch>
    
      <node pkg="rf2o_laser_odometry" type="rf2o_laser_odometry_node" name="rf2o_laser_odometry" output="screen">
        <param name="laser_scan_topic" value="/scan"/>                         # topic where the lidar scans are being published
        <param name="odom_topic" value="/odom" />                         # topic where tu publish the odometry estimations
        <param name="publish_tf" value="false" />                              # wheter or not to publish the tf::transform (base->odom)
        <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="" />  # (Odom topic) Leave empty to start at point (0,0)
        <param name="freq" value="10.0"/>                                       # Execution frequency.
        <param name="verbose" value="true"/>                                  # verbose
    
      </node>
      
    </launch>

    (3)无法发布odom->base_footprint的tf信息

    在rf2o_laser_odometry/src/CLaserOdometry2DNode.cpp中修改:

    在if (publish_tf)前添加
    publish_tf=1;

    2.3  导航和建图

    需要将driver.launch中发布odom的代码删除掉,不然可能出现机器人跳变,因为存在两个odom主题。

    1.启动机器人的driver.launch

    2.运行激光雷达

    3.roslaunch rf2o_laser_odometry rf2o_laser_odometry.launch

    4.运行导航和建图的luanch

    tf树和建图效果如下;

    后续将实现编码器里程计和激光雷达里程计的融合。

    展开全文
  • 在CLaserOdometry2DNode.cpp中找到如下代码 tf_listener.lookupTransform(base_frame_id,last_scan.header.frame_id,ros :: Time(0),transform) 修改1:把上面代码中last_scan.header.frame_id修改成自己的frame...
    1. 在CLaserOdometry2DNode.cpp中找到如下代码
    tf_listener.lookupTransform(base_frame_id,last_scan.header.frame_id,ros :: Time(0),transform)
    

    修改1:把上面代码中last_scan.header.frame_id修改成自己的frame_id,如我的是"/laser_frame"
    可利用rostopic echo /scan查看/scan的frame_id, /scan是你激光雷达节点发出来的有关激光雷达数据的话题。
    修改2:在代码前面添加tf_listener.waitForTransform(base_frame_id,your_frame_id,ros::Time(),ros::Duration(5.0));
    如下图,我的修改。
    在这里插入图片描述
    2. 在CLaserOdometry2DNode.cpp中添加publish_tf=1;
    或者在launch文件中,把false,改成true
    在这里插入图片描述
    3. 修改rf2o_laser_odometry.launch
    在这里插入图片描述
    具体参考github issuse

    展开全文
  • 运行rf2o_laser_odometry时出现错误

    千次阅读 2020-09-12 09:42:04
    或者 ERRO:Invalid argument passed to lookupTrasform argument source_frame in tf2 frame_ids cannot be empty 解决方案: 可能是无法在tf_listener.lookupTransform(base_frame_id,last_scan.header
  • rf2o_laser_odometry 代码地址 :`https://github.com/MAPIRlab/mapir-ros-pkgs` rf2o_laser_odometry相当于激光里程计 ---------------------------------------------------------------------------------------...
  • RF2O激光里程计算法原理

    千次阅读 2020-08-14 16:18:13
    RF2O根据传感器速度制定范围流约束方程,并最小化所得几何约束的鲁棒函数以获得运动估计。 设R(t,α)R(t,α)R(t,α)为范围扫描,其中ttt是时间,α∈[0,N)⊂Rα \in [0,N)⊂Rα∈[0,N)⊂R是扫描坐标,N是扫描...
  • 编码器推算里程计是可以,但是会有很多因素影响里程计的准确性,比如机械误差、定位累计误差等等,目前想到比较理想的解决办法是用...视觉里程计参考:http://wiki.ros.org/rf2o_laser_odometry   自行看wiki安...
  • 即:如果来自里程计的数据在时间t_0(> 0)可用,则来自imu的数据在时间t_1(> t_0)处获得,而来自视觉里程计的数据在时间t_2(> t_1)处获得,则在时间t_1对所有三组数据进行滤波。 该融合的传感器数据被转换为...
  • <div><p>I have a rplidar laser scanner which is rotated by z axis 180 in degree. When I use rf2o to publish the odom calculated from /scan, with correct TF, the ...MAPIRlab/rf2o_laser_odometry</p></div>
  • 我在网上查,有人表示这是得不到雷达数据(https://github.com/MAPIRlab/rf2o_laser_odometry/issues/15),但我跑的是google 官方的离线包, 应当不存在得不到数据的问题, 还望有大佬指导,谢谢。
  • ROS里程计的学习(odometry)

    千次阅读 2020-11-25 23:33:54
    什么是里程计?为什么需要里程计? 里程计是衡量我们从初始位姿到终点位姿的一个标准,通俗的说,我们要实现机器人的定位与导航,就需要...ROSgmapping导航包,要求有2 个 输入,一个是激光数据,另一个就是里程...
  • CMake Error at rf2o_laser_odometry/CMakeLists.txt:21 (find_package): By not providing FindMRPT.cmake in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided ...
  •  rm -rf ros_lib  rosrun rosserial_arduino make_libraries.py  就是说,这样的操作可以把ros的头文件,移植成arduino使用的头文件 看起来so easy , 让我们在win10下试试 (注:如果你是ubuntu那下面的...
  • 因为是在学习到第7章的时候,被有关G2O的安装和编译不通过给搞疯了,要成魔了,才想起了应该把踩过的坑记录下来,以供日后学习,也给后来者提供一个快速过坑的机会。 我的环境配置为: ubuntu18.04 + opencv-3.4.6 +...
  • 移动机器人开发--ROS框架

    千次阅读 2020-12-23 16:02:53
    开发思路: 完成移动移动机器人比赛,从零开始搭建ros框架,实现移动、定位导航、搬运等功能。...示例 TF变换+激光雷达:...https://github.com/MAPIRlab/rf2o_laser_odometry laser_scan_matcher_to_odom激光里程计改进:...
  • daohang

    2019-03-09 12:07:27
    --rf2o_Laser_Odometry--> $(find art_racecar)/launch/includes/rf2o.launch.xml" /> <!-- Robot_Localization --> <node pkg="robot_localization" type="ekf_localization_node" name="ekf_se" clear_params=...
  • 转载自 :原文链接:https://blog.csdn.net/u010918541/article/details/88718658 1,机械狗楼梯建图 ...,visual-inertial mapping framework https://github.com/ethz-asl/maplab 3...
  • ,visual-inertial mapping framework https://github.com/ethz-asl/maplab 3,icp mapping https://github.com/ethz-asl/ethzasl_icp_mapping https://github.com/ethz-asl/libpointmatcher 4 3d mapping ...
  • 2、插上USB转串口,在终端输入命令#dmesg | grep ttyUSB0,如果出现连接成功信息,则说明ubuntu系统已经识别该设备了。 然后如果这样的话,那么rosaria的USB0 而不是 S0. 工作站和先锋机器人IP设置 ...
  • msgs::Odometry::ConstPtr& odometry, const sensor_msgs::PointCloud2ConstPtr& laserCloud2) { laserCloudIn->clear(); laserCLoudInSensorFrame->clear(); pcl::fromROSMsg(*laserCloud2, *laserCloudIn); ...

空空如也

空空如也

1 2 3
收藏数 52
精华内容 20
关键字:

rf2o_laser_odometry