开源!手把手教你搭建阿克曼自动驾驶小车(上)

在前面的推文中,我们基于Arduinomega2560扩展板做了两轮差速ROS底盘的搭建流程,前文也提到了我们的扩展板是带有2路舵机接口的,可以用来做二自由度云台控制,或者用于控制阿克曼底盘的前轮转向动力来源。
开源!手把手教你搭建阿克曼自动驾驶小车(上)-有驾
开源!手把手教你搭建阿克曼自动驾驶小车(上)-有驾
接下来这一篇将是关于Arduinomega2560底层控制用例里面的最后一篇,将分享如何通过ArduinoIDE实现阿克曼自动驾驶小车底盘的驱动部分。整个推文一共分为三个部分:
开源!手把手教你搭建阿克曼自动驾驶小车(上)-有驾
如上动态图所示,汽车的前轮由连接方向盘的转向机带动前轮拉杆左右移动,实现前轮转向功能。在我们制作阿克曼底盘的时候,可以使用舵机替代方向盘,完成前轮的转向控制,简单示意图如下。
开源!手把手教你搭建阿克曼自动驾驶小车(上)-有驾
因此我们需要简单了解一下舵机的控制方式,在Pinterest网站上找到了一个单片机控制的示意图如下:
开源!手把手教你搭建阿克曼自动驾驶小车(上)-有驾
所以需要我们在Arduino中编码,根据不同的角度需求产生不同占空比的脉冲。除此之外,我们需要注意的是,车轮转向的现象是车轮相对于居中位置偏转了多少度,然后在这个角度范围内,舵机输出轴需要转动多少度,最后便是应该给舵机多少占空比的脉冲信号。代码如下:
细心观察生活的同学可能会发现,当车辆转弯时内侧轮胎和外侧轮胎行驶的路径通常是不等长的,若转弯时后面两个轮胎以相同的转速转动,那会容易翻车。后来,前辈们发明了一种差速器的机械机构,让后轮在弯道中可以以不同的转速行驶,以此提升车辆行驶的稳定性(当然这也降低了凹凸路面的通过性哈,这里不多描述原因),先看一张传统燃油车的差速驱动后桥示意图:
开源!手把手教你搭建阿克曼自动驾驶小车(上)-有驾
虽然大多数的我们都不会设计和装配这么复杂的传动机构,但是,我们可以用两个独立的电机分别控制后轮的转速,通过车辆模型计算和模拟出正确的后轮转速,使得车辆在行驶的过程中可以足够稳定。
聊到这里,大家也许会联想到我们前面分享的推文中提及的两轮差速控制和阿克曼底盘后轮驱动很相似。答案是肯定的,但是阿克曼底盘后轮驱动有一个约束条件:就是任何时刻,后面两个独立电机的转动方向一定不可能反向。
neor_mini带转向的渲染图片
除此之外,阿克曼底盘因为前轮转向角度的原因,会有一个最小转弯半径,在《搭建ROS机器人之——阿克曼底盘里程计解算节点》中,我们做了简单的运动学计算,数学模型如下:
开源!手把手教你搭建阿克曼自动驾驶小车(上)-有驾
开源!手把手教你搭建阿克曼自动驾驶小车(上)-有驾
关于后轮驱动部分,为了和前面写的推文对照一致,这里Arduino中还是按照差速控制的方式实现后轮速度控制,关于阿克曼底盘约束放在上位机的ROS包中完成。若您使用小功率电机,比如:TT马达、37电机等,那么详细的驱动教程如以下推文所示:
开源!手把手教你搭建阿克曼自动驾驶小车(上)-有驾
若你想使用功率更大的直流减速电机,那么其控制方法如以下推文所示:
开源!手把手教你搭建阿克曼自动驾驶小车(上)-有驾
按照上述的方法完成电机搭建之后,接下来就是结合自己的电机调整电机PID速度控制的三个参数:P、I、D;我们也写了对应的步骤,推文如下所示:
开源!手把手教你搭建阿克曼自动驾驶小车(上)-有驾
有经验的小伙伴会发现,机器人大多会使用两个处理器,一个是计算能力相对较低的下位机处理器(Arduino、STM32等)负责电机控制、继电器控制、数据通信,主要是当做底层的执行机构;
另外一个是计算能力相对强的上位机处理器(PC、工控机、开源控制器等),其负责接收来自“四面八方”的各路传感器信息,通过运动学模型和传感器融合估计机器人当前的位置、使用规划算法(RRT、A*、Dijkstra等)完成全局的路径规划;通过控制算法(teb、DWA、MPC、PD、LQR等)完成实际的速度规划,保证机器人follow全局路径,最后实现一定的功能。
我们这一篇记录的就是如何通过“串口通信”的方式,实现上位机、下位机之间的数据交互,结合前面的内容,我简单绘制了一张框图:
开源!手把手教你搭建阿克曼自动驾驶小车(上)-有驾
为了实现上述的功能,如《开源!手把手教你将超声波数据用Rviz可视化》中添加超声波数据的方式,我们继续在这个开源的框架上添加上关于前轮转向舵机的数据传达,和上位机阿克曼运动学约束。
约定上下位机关于电机舵机的通讯格式如下:
Arduino端串口数据解析核心代码如下:
正向运动学解算:即订阅其他ROS节点发布的速度话题(线速度、角速度),然后根据车辆尺寸参数解算为后面左右电机的速度(V_L,V_R)、前面车轮需要转动的角度(Servo_angle),即符合阿克曼底盘的约束。
订阅速度“cmd_vel”的回调函数如下:
除此之外,上位机ROS包保持一定的频率通过串口查询电机实际转动的脉冲数,然后通过推算出电机的速度并积分,
开源!手把手教你搭建阿克曼自动驾驶小车(上)-有驾
大致估计出机器人当前时刻相对于起始点的位置和姿态。这里通过左右轮的速度信息,估计小车运动学中心速度(线速度、角速度)的计算过程便称为:逆向解算,我们把它称为小车的轮式里程计数据输出。
开源!手把手教你搭建阿克曼自动驾驶小车(上)-有驾
轮式里程计的核心代码如下:
彩蛋:
收到群里面小伙伴儿的建议,我们也推出了一款更容易上手的阿克曼实体自动驾驶小车,搭配我们强大的NEORmini仿真仓库,带领大家一步一步将仿真中涉及的章节在实体小车上一一复现。
开源!手把手教你搭建阿克曼自动驾驶小车(上)-有驾
展望:
在后面的推文中,我们将继续分享如何自己动手一步一步构建ROS自动驾驶小车。ROS上层的建图、导航、视觉循迹、目标检测与识别、UWB定位等等实体功能,多线激光雷达高阶示例。
创作不易,如果喜欢这篇内容,请您也转发给您的朋友,一起分享和交流创造的乐趣,也激励我们为大家创作更多的机器人研发攻略,让我们一起learningbydoing!
关注公众号(搜索:COONEO),了解更多机器人相关信息。
0

全部评论 (0)

暂无评论