ROS机器人制作(六)—— 扩展rf2o_laser_odometry和robot_localization

本文介绍了rf2o_laser_odometry,一个专用于激光里程计的节点,以及robot_localization包中的核心组件,如ekf_localization_node和ukf_localization_node,它们在机器人定位中的关键作用。还涵盖了navsat_transform_node的参数配置和整体架构。通过实例参数配置,展示了如何在实际应用中整合这些模块进行精准的机器人定位和状态估计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

rf2o_laser_odometry

代码地址 :`https://github.com/MAPIRlab/mapir-ros-pkgs`

rf2o_laser_odometry相当于激光里程计

在这里插入图片描述----------------------------------------------------------------------------------------------

robot_localization

代码地址:https://github.com/cra-ros-pkg/robot_localization
参考使用:https://www.freesion.com/article/51831322254/#_1

robot_localization是状态估计节点的集合
robot_localization是状态估计节点的集合

在robot_localization包中包含了两个状态估计节点

(1)ekf_localization_node 是一个扩展卡尔曼估计器,它使用一个三维测量模型随着时间生成状态,同时利用感知数据校正已经监测过的估计。

ekf_se_map:
  frequency: 20
  sensor_timeout: 1
  two_d_mode: true
  transform_time_offset: 0.0
  transform_timeout: 0.0
  print_diagnostics: false
  debug: false
  use_control: false

  map_frame: map
  odom_frame: odom
  base_link_frame: base_link
  world_frame: map
  
  odom0: /car/navsat_transform_map/odom
  odom0_config: [true, true, false,
                 false, false, false,
                 false,  false, false,
                 false, false, false,
                 false, false, false]
  odom0_queue_size: 1
  odom0_nodelay: true
  odom0_differential: false
  odom0_relative: false
  odom0_remove_gravitational_acceleration: true

  imu0: /car/imu
  imu0_config: [false, false, false,
                false, false, true,
                false, false, false,
                false, false, true,
                true,  false, false]
  imu0_nodelay: false
  imu0_differential: false
  imu0_relative: false
  imu0_queue_size: 1
  imu0_remove_gravitational_acceleration: true

  process_noise_covariance: [1e-3, 0,    0,    0,    0,    0,    0,     0,     0,    0,    0,    0,    0,    0,    0,
                             0,    1e-3, 0,    0,    0,    0,    0,     0,     0,    0,    0,    0,    0,    0,    0,
                             0,    0,    1e-3, 0,    0,    0,    0,     0,     0,    0,    0,    0,    0,    0,    0,
                             0,    0,    0,    0.3,  0,    0,    0,     0,     0,    0,    0,    0,    0,    0,    0,
                             0,    0,    0,    0,    0.3,  0,    0,     0,     0,    0,    0,    0,    0,    0,    0,
                             0,    0,    0,    0,    0,    0.01, 0,     0,     0,    0,    0,    0,    0,    0,    0,
                             0,    0,    0,    0,    0,    0,    0.5,   0,     0,    0,    0,    0,    0,    0,    0,
                             0,    0,    0,    0,    0,    0,    0,     0.5,   0,    0,    0,    0,    0,    0,    0,
                             0,    0,    0,    0,    0,    0,    0,     0,     0.1,  0,    0,    0,    0,    0,    0,
                             0,    0,    0,    0,    0,    0,    0,     0,     0,    0.3,  0,    0,    0,    0,    0,
                             0,    0,    0,    0,    0,    0,    0,     0,     0,    0,    0.3,  0,    0,    0,    0,
                             0,    0,    0,    0,    0,    0,    0,     0,     0,    0,    0,    0.3,  0,    0,    0,
                             0,    0,    0,    0,    0,    0,    0,     0,     0,    0,    0,    0,    0.3,  0,    0,
                             0,    0,    0,    0,    0,    0,    0,     0,     0,    0,    0,    0,    0,    0.3,  0,
                             0,    0,    0,    0,    0,    0,    0,     0,     0,    0,    0,    0,    0,    0,    0.3]

  initial_estimate_covariance: [1e-9, 0,    0,    0,    0,    0,    0,    0,    0,    0,     0,     0,     0,    0,    0,
                                0,    1e-9, 0,    0,    0,    0,    0,    0,    0,    0,     0,     0,     0,    0,    0,
                                0,    0,    1e-9, 0,    0,    0,    0,    0,    0,    0,     0,     0,     0,    0,    0,
                                0,    0,    0,    1.0,  0,    0,    0,    0,    0,    0,     0,     0,     0,    0,    0,
                                0,    0,    0,    0,    1.0,  0,    0,    0,    0,    0,     0,     0,     0,    0,    0,
                                0,    0,    0,    0,    0,    1e-9, 0,    0,    0,    0,     0,     0,     0,    0,    0,
                                0,    0,    0,    0,    0,    0,    1.0,  0,    0,    0,     0,     0,     0,    0,    0,
                                0,    0,    0,    0,    0,    0,    0,    1.0,  0,    0,     0,     0,     0,    0,    0,
                                0,    0,    0,    0,    0,    0,    0,    0,    1.0,  0,     0,     0,     0,    0,    0,
                                0,    0,    0,    0,    0,    0,    0,    0,    0,    1.0,   0,     0,     0,    0,    0,
                                0,    0,    0,    0,    0,    0,    0,    0,    0,    0,     1.0,   0,     0,    0,    0,
                                0,    0,    0,    0,    0,    0,    0,    0,    0,    0,     0,     1.0,   0,    0,    0,
                                0,    0,    0,    0,    0,    0,    0,    0,    0,    0,     0,     0,     1.0,  0,    0,
                                0,    0,    0,    0,    0,    0,    0,    0,    0,    0,     0,     0,     0,    1.0,  0,
                                0,    0,    0,    0,    0,    0,    0,    0,    0,    0,     0,     0,     0,    0,    1.0]
  

ekf_se_odom:
  frequency: 20
  sensor_timeout: 0.1
  two_d_mode: true #平面设置为true
  transform_time_offset: 0.0 #生成时间戳要用
  transform_timeout: 0.0
  print_diagnostics: false #如果为True则向/diagnostics话题发布数据,用于调试程序
  debug: false
  use_control: false #会监听/cmd_vel的geometry_msgs/Twist信息

  map_frame: map
  odom_frame: car/odom
  base_link_frame: car/base_link
  world_frame: car/odom
  
  imu0: /car/imu
    imu0_config: [false, false, false,
                false, false, true,
                false, false, false,
                false, false, true,
                false,  false, false]
  imu0_nodelay: false
  imu0_differential: false
  imu0_relative: false
  imu0_queue_size: 1
  imu0_remove_gravitational_acceleration: true

process_noise_covariance: [1e-3, 0,    0,    0,    0,    0,    0,     0,     0,    0,    0,    0,    0,    0,    0,
                             0,    1e-3, 0,    0,    0,    0,    0,     0,     0,    0,    0,    0,    0,    0,    0,
                             0,    0,    1e-3, 0,    0,    0,    0,     0,     0,    0,    0,    0,    0,    0,    0,
                             0,    0,    0,    0.3,  0,    0,    0,     0,     0,    0,    0,    0,    0,    0,    0,
                             0,    0,    0,    0,    0.3,  0,    0,     0,     0,    0,    0,    0,    0,    0,    0,
                             0,    0,    0,    0,    0,    0.01, 0,     0,     0,    0,    0,    0,    0,    0,    0,
                             0,    0,    0,    0,    0,    0,    0.5,   0,     0,    0,    0,    0,    0,    0,    0,
                             0,    0,    0,    0,    0,    0,    0,     0.5,   0,    0,    0,    0,    0,    0,    0,
                             0,    0,    0,    0,    0,    0,    0,     0,     0.1,  0,    0,    0,    0,    0,    0,
                             0,    0,    0,    0,    0,    0,    0,     0,     0,    0.3,  0,    0,    0,    0,    0,
                             0,    0,    0,    0,    0,    0,    0,     0,     0,    0,    0.3,  0,    0,    0,    0,
                             0,    0,    0,    0,    0,    0,    0,     0,     0,    0,    0,    0.3,  0,    0,    0,
                             0,    0,    0,    0,    0,    0,    0,     0,     0,    0,    0,    0,    0.3,  0,    0,
                             0,    0,    0,    0,    0,    0,    0,     0,     0,    0,    0,    0,    0,    0.3,  0,
                             0,    0,    0,    0,    0,    0,    0,     0,     0,    0,    0,    0,    0,    0,    0.3]

  initial_estimate_covariance: [1e-9, 0,    0,    0,    0,    0,    0,    0,    0,    0,     0,     0,     0,    0,    0,
                                0,    1e-9, 0,    0,    0,    0,    0,    0,    0,    0,     0,     0,     0,    0,    0,
                                0,    0,    1e-9, 0,    0,    0,    0,    0,    0,    0,     0,     0,     0,    0,    0,
                                0,    0,    0,    1.0,  0,    0,    0,    0,    0,    0,     0,     0,     0,    0,    0,
                                0,    0,    0,    0,    1.0,  0,    0,    0,    0,    0,     0,     0,     0,    0,    0,
                                0,    0,    0,    0,    0,    1e-9, 0,    0,    0,    0,     0,     0,     0,    0,    0,
                                0,    0,    0,    0,    0,    0,    1.0,  0,    0,    0,     0,     0,     0,    0,    0,
                                0,    0,    0,    0,    0,    0,    0,    1.0,  0,    0,     0,     0,     0,    0,    0,
                                0,    0,    0,    0,    0,    0,    0,    0,    1.0,  0,     0,     0,     0,    0,    0,
                                0,    0,    0,    0,    0,    0,    0,    0,    0,    1.0,   0,     0,     0,    0,    0,
                                0,    0,    0,    0,    0,    0,    0,    0,    0,    0,     1.0,   0,     0,    0,    0,
                                0,    0,    0,    0,    0,    0,    0,    0,    0,    0,     0,     1.0,   0,    0,    0,
                                0,    0,    0,    0,    0,    0,    0,    0,    0,    0,     0,     0,     1.0,  0,    0,
                                0,    0,    0,    0,    0,    0,    0,    0,    0,    0,     0,     0,     0,    1.0,  0,
                                0,    0,    0,    0,    0,    0,    0,    0,    0,    0,     0,     0,     0,    0,    1.0]

(2) ukf_localization_node 是一个无迹卡尔曼滤波估计器,它使用一系列sigma点通过非线性变换生成状态,并使用这些估计过的sigma点覆盖状态估计点和协方差,这个估计使用雅克比矩阵并使得估计器更加稳定。然而缺点是比ekf_localization_node耗费更大的计算量。

(3)navsat_transform_node节点

navsat_transform:
  frequency: 20
  #计算从GPS坐标到机器人世界坐标的转换之前等待的时间(秒)。
  delay: 0.0 
  
  #此参数指如果尚不可用坐标转换,需要等待的时间,默认为0,不等待
  #The value 0 means we just get us the latest available (see tf2 implementation) transform,
  transform_timeout: 1.0 

 #如果您的IMU未考虑磁偏角,请在此处输入您所在位置的值。如果你不知道,
 #此参数是必需的。
 #看http://www.ngdc.noaa.gov/geomag-web/(请确保将该值转换为弧度)。
 # For lat/long 55.944831, -3.186998
  magnetic_declination_radians: 0  
 
 #IMU的偏航,一旦magentic_declination_radians值被添加到它
 #当面向东方时,应该报告0。如果是
 #如果没有,请在此处输入偏移量。默认值为0。 
  yaw_offset: 0 
  
  #如果这是真的,则输出里程计信息中的高度设置为0。默认为false。
  zero_altitude: true
  
  #如果这是真的,将广播变换world_frame->utm变换以供其他节点使用。
  #默认为false。
  broadcast_utm_transform: false
  
  #如果这是真的,将发布utm->world_frame变换,而不是world_frame->utm变换。
  #请注意,仍然必须启用广播utm转换。默认为false。
  broadcast_utm_transform_as_parent_frame: false  

 #如果为true,navsat_transform_节点也会将机器人的世界坐标系(如地图)
 #位置转换回GPS坐标,
 #并在/GPS/filtered主题上发布sensor_msgs/NavSatFix消息。  
  publish_filtered_gps: true 
  
  use_odometry_yaw: false
  wait_for_datum: true # 设置为false,下方datum不需要定义,每次加载出来的小车起点都在地图的起点处!为true时,datum的经纬读就是地图的起点,小车的位置要和datum的经纬度比较。
  #datum: [34.8063928, 113.4973400, 0.0] #定义起点处经纬度
  #datum: [31.75669642, 117.18576584, 0.0]
  datum: [31.756573,117.18815044,0.0]

/*-----------------------------------------------------------------------------------------------/

在官方文件中 params/dual_ekf_navsat_example.yaml包含了navsat_transform和ekf_se_odom 直接加载即可

<rosparam command="load" file="$(find robot_localization)/params/dual_ekf_navsat_example.yaml" />

整体架构
在这里插入图片描述节点的关系
在这里插入图片描述在这里插入图片描述

### ROS `robot_localization` 使用指南 #### 一、简介 `robot_localization` 是一组用于机器人状态估计的节点集合,适用于在三维空间内运动的机器人。该包主要提供两种非线性状态估计算法——扩展卡尔曼滤波(EKF)无迹卡尔曼滤波(UKF),分别对应于 `ekf_localization_node` `ukf_localization_node` 节点[^4]。 #### 二、安装方法 对于 Ubuntu 20.04 上使用 Noetic 版本的 ROS 用户来说,在终端执行如下命令可以完成 `robot_localization` 的安装: ```bash sudo apt-get update && sudo apt-get install ros-noetic-robot-localization ``` 如果遇到无法安装的情况,请确认系统的软件源配置正确,并尝试更新后再重试上述指令[^3]。 #### 三、基本配置文件结构 为了使 EKF 或 UKF 正常工作,通常需要创建一个 YAML 文件来定义传感器输入其他参数设置。下面是一个简单的例子,展示了如何为激光雷达里程计(odom)、IMU 数据以及 GPS 提供融合方案: ```yaml frequency: 30 sensor_timeout: 0.1 two_d_mode: false transform_time_offset: 0.0 print_diagnostics: true debug: false publish_tf: true map_frame: map # Static frame parented to the odom frame. odom_frame: odom # The estimated pose is published as a TF transform between odom and base_link frames. base_link_frame: base_footprint # Robot's "body" frame. world_frame: odom # This will be used for publishing the transformation. imu0: /imu/data # IMU topic name imu0_config: [false, false, false, true, true, true, false, false, false, true, true, true, true, true, true] imu0_queue_size: 5 imu0_remove_gravitational_acceleration: true odom0: /odometry/filtered # Odometer topic name (from LIDAR SLAM or wheel encoders) odom0_config: [true, true, true, false, false, false, false, false, false, false, false, true, false, false, false] gps: gps/fix # GPS fix message topic gps_config: [true, true, false, false, false, false, false, false, false, false, false, false, false, false, false] navsat_transform: magnetic_declination_radians: 0.08796 # Your area’s magnetic declination from http://www.magnetic-declination.com/ yaw_offset: 1.570796327 # IMU and compass convention difference zero_altitude: true # Set altitude offset to zero broadcast_utm_transform_as_parent_frame: true # Broadcast UTM->odom tf instead of navsat/UTM->odom delay: 3 # Delay in seconds before first GPS measurement is accepted ``` 此配置文件中的每一项都应根据具体应用场景调整优化。例如,当只关心二维平面内的定位精度时,则可开启 `two_d_mode` 参数;而涉及到室外导航任务时则需引入来自 GNSS 设备的位置信息并合理设定对应的转换关系等。 #### 四、启动实例 假设已经编写好了名为 `localization.yaml` 的配置文件,那么可以通过 roslaunch 来加载这个配置并启动相应的节点: ```xml <launch> <!-- Load parameters --> <param name="use_sim_time" value="$(arg use_sim_time)" /> <node pkg="robot_localization" type="ekf_localization_node" name="ekf_se_odom" clear_params="true"> <rosparam command="load" file="$(find my_robot)/config/localization.yaml"/> </node> </launch> ``` 以上 XML 片段展示了一个典型的 launch 文件片段,其中包含了对 `ekf_localization_node` 的调用及其关联的参数读取方式。实际应用中可能还需要额外加入其他必要的组件服务客户端等内容[^1]。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云影点灯大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值