ROS小车实现介绍

原创文章,转载请注明: 转载自慢慢的回味

本文链接地址: ROS小车实现介绍

ROS机器人操作系统是一个很有前景的框架。通过实现一个ROS小车来了解机器人自主导航的原理。

第一部分 ROS地图的创建与导航

机器人在一个陌生的环境自主导航,就得通过自己的传感器和环境交互学习环境,进而创建环境地图,然后在地图上实现导航。不管是SLAM制图还是Teb局部规划,其核心的作用就是:因为运动和观察都有误差,我们通过优化参数来使得运动和观察的误差最小。

同时定位与制图-SlamGMapping 通过小车自带的里程计和激光雷达创建地图。
ROS导航-MoveBase ROS导航节点的主程序。MoveBase包通过全局规划器和局部规划器,利用代价地图costmap来实现当前地点到目标地点的导航。其中,costmap由map和小车传感器共同决定。现在通过对其的源码解读来了解这个框架是怎么完成这个任务的。
全局规划器-NavfnROS 机器人导航路径的规划可以分为两种:全局规划和局部规划。对事先已经知道的静态信息进行的规划为全局规划,如根据高清地图进行的规划,全局规划器就如同平时生活中的地图导航一样,这是一个大尺度的规划。基于传感器信息进行的机器人控制为局部路径规划,这是一个小尺度的规划。大范围内的静态信息不易改变,只需要定期更新高清地图就可以保证规划有效性。局部范围的动态信息则需要摄像头,激光雷达等设备及时回馈,变化频繁。
局部规划器-TebLocalPlannerROS 由于Teb算法能很好的支持阿克曼小车,即模型类似于汽车一样的机器人,这儿使用TebLocalPlannerROS进行局部规划。Teb局部规划器包(teb_local_planner)是作为一个局部规划器(base_local_planner)插件的形式融入2D导航栈的。它基于时间的弹性算法来优化局部轨迹,满足:轨迹的时间尽量短即速度和加速度尽量大;和障碍物能明显分离;以及必须满足机器人动力学约束。
非线性优化 非线性优化
G2O优化解析-手动微分 TebLocalPlannerROS依赖的G2O优化解析。G2O是一个开源的C++框架,用于优化基于图形的非线性误差函数。g2o被设计为易于扩展到各种各样的问题,一个新的问题通常可以在几行代码中指定。当前的实现为SLAM和BA的几个变体提供了解决方案,机器人技术和计算机视觉中的一系列问题都涉及到最小化可以用图形表示的非线性误差函数,典型的例子是同步定位和映射(SLAM)或束调整(BA)。这些问题的总体目标是最大限度地找到能够解释受到高斯噪声影响后的一组测量数据的参数或状态变量的配置。通过把优化问题设计成图的模式:带优化的变量称为顶点,对于待优量的限制条件为边。限制条件可理解成损失函数,这个函数是优化的关键,我们要通过不断的迭代获取最小的损失,从而推断出优化后的顶点而求解。G2O是一个开源的C++框架,用于解决非线性最小二乘问题。G2O的性能可与针对特定问题的最先进方法的实现相媲美。本文通过曲线上的点受高斯噪声影响后,利用G2O设计图模型,然后经过手动计算微分实现来重新拟合曲线。
G2O优化解析-自动微分 TebLocalPlannerROS依赖的G2O优化解析。上文G2O优化解析-手动微分我们学过用G2O来实现拟合曲线,但是大多情况下微分并不好计算,因为我们可能根本就不知道目标函数是什么,而是只知道一些断断续续的约束函数。导数主要以梯度和黑森函数的形式存在于机器学习中,自动微分(AD),也称为算法微分或简称“自动微分”,是一系列技术,类似于反向传播,但比反向传播更为普遍,用于高效、准确地计算以计算机程序表示的数值函数的导数。

第二部分 小车的下位机控制

在得到上位机发出的速度命令后,控制小车运动。这儿的下位机有STM32系统支持。

上位机与下位机通信 一般情况,上位机由ROS框架运行在Ubuntu的树莓派构成,下位机由STM32F103VET6芯片板载电机,舵机,陀螺仪,里程计等构成。里程计提供ROS需要的速度信息,陀螺仪提供加速度方向等信息给ROS,再加上连接到树莓派上的激光雷达,ROS就可以进行SLAM制图和导航了。下位机接收到ROS下发的速度信息后,转换成电机的PWM信号和舵机的PWM信号进行方向和速度控制。
小车电机和舵机控制 在STM32的代码中,通过运动学方程,从上位机得到的目标速度:Move_X, Move_Y, Move_Z中求解出阿克曼小车电机MOTOR_A,MOTOR_B的目标转速和舵机Servo的PWM值。从而控制驱动轮的电机电压来通过PID达到目标速度,控制舵机的角度来控制方向轮的角度从而控制小车方向。

本作品采用知识共享署名 4.0 国际许可协议进行许可。

发表回复