极速越野新人入门向浅谈——第十八届智能车竞赛越野组

一、前言

        我是从大二开始做智能车的,没有前辈引导也没有制作基础,连队友都是临时招募的,在做车方面,越野车是我的第一个作品。花了大二一年不到的时间完成了越野车的制作和调试,最后取得了令人遗憾的成绩/(ㄒoㄒ)/~~。

        入门方面我花费了挺长的时间,在硬件和软件方面看了不少视频和资料,才感觉摸到了一点越野的门道,此文仅为一些没有接触过越野的萌新所给出的我自己的入门经验和建议,大佬看到勿喷。


二、硬件设计方面

        由于硬件方面,主要是另一个队友负责,硬件部分我主要还是引用他的制作成果。我们的硬件的两块板子(主板和驱动板)都是基于逐飞科技的学习板,而初始材料采购是按照逐飞的学习套件去购买的(不过我们买的时候越野套件还没出,按照的是单车的套件)极速越野组之逐飞演示车模浅析

        (1)主板与驱动

            主板和驱动板都是直接由逐飞提供的硬件原理图改良而来,所谓改良也只是去掉了一些我们使用不到的接口和元器件罢了。注意由于逐飞驱动板自带的TC264芯片里是下载好代码的,设计驱动板的时候要考虑是否要保留那块芯片(不保留的话需要代码转移)。关于原理图和PCB图基本上照抄逐飞的就行了(布线和选择元器件的时候还是要稍微注意点,有些大电流的地方走线不要太细/(ㄒoㄒ)/~~)(主板的大小可以控制到嘉立创免费打板的范围内)。(两块板子上丝印记得按照比赛规则的形式,标上队名、学校和打板时间)

无刷电机驱动板
主板

        (2)其他外设

             舵机:舵机一般没有太多要求,但要注意安装好后的舵机位置,鲁莽乱设占空比可能会导致舵机打角堵转(逐飞的历程可能不能直接使用),建议先确定好安装在车上的舵机居中和左右极限占空比后再将机械结构连接件按上去使用。

             电机:室外越野由于场地广阔,可以使用无刷电机来达到更加高的速度。但具体是否使用无刷电机还要根据比赛规则和个人小队的分析情况来决定。如果比赛规则允许,且元素较多,车速可能无法达到过快的情况下,也可以考虑有刷电机,更加简单稳定的驱动板电路,能减少很多在硬件上的问题和花费的时间。

             屏幕和按键:屏幕没有太高的要求能显示数据就行,一般学习套件里的那种就行了,将能显示的数据尽量多的显示在屏幕上(例如:经纬度、航向角、舵机电机占空比、小车状态等),便于日常调试和分析问题。按键数量根据需求放置,一般3-4个足矣。

             遥控器:一定要买个遥控器(虽然比赛时不一定允许使用遥控器发车)!!!在车子失控时,能够手动暂停(不用一直追车跑,越野车的速度后面还是非常快的)。GPS采点的时候也能遥控采点,可以让平常采点轻松一点(尤其是暑假调车的时候)。此外,比赛结束的时候还可以把车模当遥控车来和别人玩ヾ(•ω•`)o。

        (3)其他材料准备

             元器件材料:做无刷驱动和主板的材料至少多买两份,一份是为了板子出问题(主板一般不容易坏)重新制作的材料,另一份成功后做备用板子的材料(万一驱动板烧了就浪费五分钟换一下,总比直接躺平等着下一块板子焊好快一些_〆(´Д` ))。

             亚克力板:稍微多准备一些(多的可以电赛做测控),给硬件做底板,也可以做顶板来起到防水的作用(透明的顶板不会挡住你看屏幕调参)。

             三防漆:可以给板子套上一层安全膜,但要注意别喷到一些要用的引脚上(喷到了据说可以用酒精或者洗洁精洗掉),喷完之后晾干,板子表面应该就会有一层油油的保护膜力。(注意三防漆的油膜可能会影响到部分元器件例如MOS管的散热情况)(另一种防水方式:基于家用保鲜膜的小车防水( •̀ ω •́ )y)

             散热片(风扇):刚刚接触到智能车的时候我采用的是传统的小蓝(7v锂电池)。但如果有速度上的追求可以选择电压和性能更加优越的3S电池。但在未改变主板电路(逐飞学习板)的情况下,板子会有个降压的过程导致其发热的比较厉害,其此在车子速度较快的情况下,驱动板上的元器件也会有部分的发热。为此有需求的可以在后期贴上散热片或风扇。


三、软件设计方面

        (1)陀螺仪

           我采用的是六轴的ICM2060,在比赛前的一个月左右我才知道能用自带解算的陀螺仪,于是还买了个MPU9250(虽然最后还是没用上),推荐采用九轴的陀螺仪(九轴更加精准,比六轴多出来的三轴是地磁,使用地磁可以免去对北的步骤,但用地磁三轴时需要注意架高陀螺仪,避免受到磁场影响)。

            对于不带解算的ICM(6轴),我采用了四元数的方法去解算它的值(我当时参考的博客《十二.四轮车驱动开发之五: 由浅至深理解6轴陀螺仪姿态解算算法<上>》,他的代码好像是不能直接采用的,我重新写了代码,更改了参数和调试)。

               以下我的定义部分以及去零漂的代码,主体解算代码我就不拿出来献丑了,大家可以参考我上面的那份资料编写。(注意最后要将陀螺仪解算放到定时器里去)

//陀螺仪解算
float icm_data_acc_x,icm_data_acc_y,icm_data_acc_z;
float icm_data_gyro_x,icm_data_gyro_y,icm_data_gyro_z;
float icm_kp=0.008;        //自己改
float icm_ki=0.002;        //自己改
float dt=0.01;
float Q_info_q0=1,Q_info_q1=0,Q_info_q2=0,Q_info_q3=0;
float I_ex,I_ey,I_ez;
volatile float eulerAngle_yaw,eulerAngle_pitch,eulerAngle_roll;
//获取的数据初步处理
void icmGetValues(void)
{
    float alpha = 0.3;
    icm20602_get_acc();                                                         // 获取ICM20602的加速度测量数值
    icm20602_get_gyro();                                                        // 获取ICM20602的角速度测量数值
    //一阶低通滤波,单位g
    icm_data_acc_x = (((float) icm20602_acc_x) * alpha) / 4096 + icm_data_acc_x * (1 - alpha);
    icm_data_acc_y = (((float) icm20602_acc_y) * alpha) / 4096 + icm_data_acc_y * (1 - alpha);
    icm_data_acc_z = (((float) icm20602_acc_z) * alpha) / 4096 + icm_data_acc_z * (1 - alpha);

    // 下面这段是去零漂要把那几个数字根据自己的情况改掉嗷
    //陀螺仪角速度必须转换为弧度制角速度: deg/s -> rad/s
    icm_data_gyro_x = ((float) icm20602_gyro_x -10.5) * PI / 180 / 16.4;
    icm_data_gyro_y = ((float) icm20602_gyro_y +3.0) * PI / 180 / 16.4;
    icm_data_gyro_z = ((float) icm20602_gyro_z +1.5) * PI / 180 / 16.4;
}

        (2)GPS

              通过对逐飞的历程的学习可以轻松掌握GPS相关数据的获取(经纬度、航向角、当前卫星颗数等),再通过对逐飞GPS的库的查阅,实现GPS采点并存入Flash(掉电不丢失)的目的。由于GPS的精度不足所以采出来的点可能会有较大的偏移(甚至你走一圈回到起点,位置都不一样),对此,需要自己去采用一些方法去处理数据(我们一开始以为简单的拟合GPS采的点就能完成(TAT))。

               GPS陀螺仪融合:单纯的使用GPS采点的原始数据和陀螺仪的航向角能够做到简单的向一个目的地前进。但这还不够,不能完美的绘制出你所需要的整条路线(毕竟从各个方面来说都有一堆误差)。这时候就需要融合算法来将你取得的GPS数据与陀螺仪相融合。由于我自己的融合部分做的不够好,所以就不拿出来误导大家了,在CSDN上还是有很多大佬的博客讲解的。

        (3)其他部分

             Cellular-Z:这是一个手机软件,它可以看到你现在所处位置的经纬度,以及定位精度。我自己是通过安卓手机在应用商店下载的(软件里有一点点广告弹出,但是在可以接受的范围内)。底下的图片是我在室内截的图,所以定位精度在60米左右。

             状态机编写:由于赛道由不同的元素构成,因此小车在行程的过程中会有不同的状态(例如:S弯绕弯、调头、上坡等)。至于状态机这个词语,不熟的同学可以参考一下这篇博客《分层状态机学习》它的讲解还是比较形象的。理解之后编写其实并不难,大家可以根据自己的情况去分解小车状态。

             PID控制:这个不论是哪个智能车的组别都会使用到的方法,根据具体的需求去编写和调试自己的车以达到丝滑的程度。由于我们采用的是单电机驱动(室内是差速轮,双电机),所以我们只需要调试舵机的PD控制。不了解 PID的可以先看看这篇文章《PID算法的特点及原理讲解》。我们的车由于速度变化情况较少,因此重心都放在角度环上了。

              电机缓启动:在电机加速过快的时候(我们好像是40占空比),突然的速度变化可能会烧坏无刷驱动的电路板,因此设置一个缓启动(缓加速)十分必要。我的比较粗鲁简单,就是在加速值超过阈值时,通过中断去累加速度,直到达到指定速度,以起到缓加速的过程。

              摄像头:通过对第十八届比赛的规则分析,我选择不采用摄像头。关于摄像头的算法和文章有很多,CSDN上可以找到一堆。除去大津法,这里推荐一篇我看过的摄像头的算法讲解《智能车八邻域图像算法》,有兴趣的同学可以去了解一下。


四、总结

        作为新手入门,前期不懂的硬件和软件就跟着逐飞和龙邱两个大腿走,小组内需要分工,但也不能分工的太过于明确,一开始核心板(TC264)的编程等基础每个组员都应掌握,其他如GPS,陀螺仪,串口传输等可以分工到个人头上(我们的分工是一硬件两软件)。大二开始做的话,一年的时间还是有机会做的很好的。前期一定要先把硬件两块板子做好调通(同时负责软件的编写算法),能尽早换上自己的板子调试就尽早(可以提前发现硬件问题)。此外,每个人都应掌握一些代码的含义作用(即使不是自己负责的部分),这样在调试有问题时可以集思广益,不至于一个人焦头烂额。(PS:赛前请神作用不大,我请了赛马娘和博尔特都没起作用)

        最后,预祝各位都能取得自己想要的成绩!

### 关于第十七届智能车竞赛极限越野源代码 官方渠道通常不会公开提供特定年份和别的完整源代码,尤其是最新一届的比赛。不过,可以根据以往的经验和技术文档来推测可能使用的编程框架和技术栈。 #### 可能的技术实现方向 1. **基于RTOS的任务调度** 使用实时操作系统(RTOS),如RT-Thread,可以帮助提高系统的稳定性和响应速度[^1]。通过创建多个任务处理不同的功能模块,比如传感器数据采集、路径规划、电机驱动等,能够有效提升程序结构的清晰度和维护性。 2. **传感器融合算法** 对于极限越野环境下的行驶,车辆需要依赖多种类型的传感器获取周围环境的信息。常见的有陀螺仪、加速度计、磁力计成的IMU惯性测量单元用于姿态估计;摄像头或激光雷达负责障碍物检测与避障决策;GPS/北斗定位系统则提供了全局位置参考[^4]。 3. **运动控制策略** 针对复杂地形的特点制定相应的动力学模型并据此调整四轮独立悬挂机构的动作参数,确保车身平稳过渡各种坡面起伏路段的同时保持良好的操控性能。此外还需考虑防滑措施以应对湿滑泥泞路况带来的挑战。 ```c++ // 假设C++作为主要开发语言 #include "rtthread.h" #include "sensor_fusion.hpp" void sensor_task(void *parameter){ while(1){ // 轮询读取各类传感器数值 float imu_data = read_imu(); double gps_positon = get_gps_location(); // 数据预处理... rt_thread_mdelay(50); // 模拟延时操作 } } int main(){ // 初始化工作... // 创建线程执行感知层逻辑 rt_thread_t tid_sensor = rt_thread_create("sensor", sensor_task, RT_NULL, 1024, 8, 20); if(tid_sensor != RT_NULL) rt_thread_startup(tid_sensor); return 0; } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值