三轮全向轮底盘SLAM挖坑系列-激光里程计

本文探讨了使用激光里程计优化机器人路径规划的方法,对比传统编码器和便宜陀螺仪的局限性,提出激光雷达是更优选择。通过ROS环境下的rf2o_laser_odometry节点配置,详细介绍了如何实现激光里程计的安装与应用。

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

编码器推算里程计是可以,但是会有很多因素影响里程计的准确性,比如机械误差、定位累计误差等等,目前想到比较理想的解决办法是用激光里程计。便宜的陀螺仪用卡尔曼滤波来算角度也未必有想象中那么靠谱,弄得不好还会引入误差。所以用一个好的激光雷达来推算里程计能够解决目前比较多的扎心问题。

视觉里程计参考:http://wiki.ros.org/rf2o_laser_odometry

 

自行看wiki安装配置好环境,然后看launch文件,由于时间关系,我暂时没有实际机器人测试激光里程计的效果:

<launch>

  <node pkg="rf2o_laser_odometry" type="rf2o_laser_odometry_node" name="rf2o_laser_odometry">
    <param name="laser_scan_topic" value="/laser_scan"/>        <!-- topic where the lidar scans are being published -->
    <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="freq" value="6.0"/>                            <!-- Execution frequency. See "Planar Odometry from a Radial Laser Scanner. A Range Flow-based Approach. ICRA'16"-->
  </node>
</launch>

 

### 里程计计算公式的解析 在SLAM(Simultaneous Localization and Mapping)领域,里程计用于估计机器人或车辆的位姿变化。通常情况下,里程计通过传感器数据来推导机器人的移动轨迹。对于差分驱动和全向三轮车等平台,其运动模型可以通过几何关系建立。 #### 差分驱动机器人里程计公式 假设差分驱动机器人有两个子,分别记录左和右的旋转角度增量 $\Delta \theta_L$ 和 $\Delta \theta_R$,以及对应的半径 $r$ 和两之间的距离 $L$: - **线速度**可以表示为: $$ v = r \cdot \frac{\Delta \theta_L + \Delta \theta_R}{2} $$ [^2] - **角速度**则由两个的速度差异决定: $$ \omega = r \cdot \frac{\Delta \theta_R - \Delta \theta_L}{L} $$ 基于上述线速度和角速度,可以在离散时间步长下更新机器人的位置 $(x, y)$ 和方向 $\phi$ 的状态方程如下: - 更新后的$x$坐标: $$ x_{new} = x_{old} + v \cdot \cos(\phi) \cdot \Delta t $$ - 更新后的$y$坐标: $$ y_{new} = y_{old} + v \cdot \sin(\phi) \cdot \Delta t $$ - 更新后的朝向$\phi$: $$ \phi_{new} = \phi_{old} + \omega \cdot \Delta t $$ 其中,$\Delta t$ 是采样周期。 #### 全向三轮里程计公式 对于全向三轮车,由于每个子都可以独立控制转向和速度,因此需要考虑三个子的速度矢量合成。设第$i$个子的速度为$v_i$,与车身中心的距离为$d_i$,夹角为$\alpha_i$,那么整体平移速度$(v_x, v_y)$和旋转速度$\omega$可表示为: - 平面内的线速度分解: $$ v_x = \sum_{i=1}^{3} (v_i \cdot \cos\alpha_i) / 3 $$ $$ v_y = \sum_{i=1}^{3} (v_i \cdot \sin\alpha_i) / 3 $$ - 转动速度: $$ \omega = \sum_{i=1}^{3} (v_i \cdot d_i \cdot \sin\alpha_i) / I $$ 这里$I$代表转动惯量。 以上公式适用于理想情况下的无滑动假设,在实际应用中还需要引入误差校正机制以提高精度。 ```python def update_pose(x_old, y_old, phi_old, delta_theta_l, delta_theta_r, r, L, dt): """ 使用差分驱动模型更新机器人位姿。 参数: x_old, y_old: 当前位置坐标 phi_old: 当前朝向角度(弧度制) delta_theta_l, delta_theta_r: 左右转过的角度增量 r: 胎半径 L: 两间距 dt: 时间间隔 返回: 新的位置和朝向 """ v = r * (delta_theta_l + delta_theta_r) / 2 omega = r * (delta_theta_r - delta_theta_l) / L x_new = x_old + v * math.cos(phi_old) * dt y_new = y_old + v * math.sin(phi_old) * dt phi_new = phi_old + omega * dt return x_new, y_new, phi_new ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值