智能车杂项

一些想要说但不好归类的杂项

杂项

  • 我们使用的是单核板,裸机工程。

  • 双核板需要额外时钟同步,可以使用两个IO设置和读取高低电平来进行同步。另外需要自己设计串口通信协议,帧头和帧尾最好设置为功能数据内容不会出现的数据。

  • 电池使用的是2S的航模电池

  • math.h中的isnan()isinf()inanf()isinff())可以用来判断浮点数是否是NAN或Inf

  • 九轴陀螺仪做AHRS(航姿参考系统)解算四元数,测试下来效果在智能车这个室内场景其实不如六轴。磁场传感器(IST8310磁力计)受地面影响很大,数据会很飘。

  • AHRS陀螺仪姿态解算算法大致分三类:Mahony互补滤波,扩展卡尔曼EKF姿态融合,梯度下降。强烈安利大家试一下梯度下降结算。运算量小并且收敛很快,调整学习率(步长)可以控制解算出的四元数抖动程度,真的很好用!

    Madgwick开源了梯度下降算法,可以下载下来自行验证下算法,并且也开源了互补滤波算法 https://x-io.co.uk/open-source-imu-and-ahrs-algorithms/

  • 陀螺仪安装最好要减震,不要直接热熔胶胶在底盘上,物理减震比算法处理效果要好些也要容易许多。

  • 可以开启编译器优化。-O0是无优化,随着数字的增大优化等级逐渐提高。不要要注意在有些高级别优化的时候,有可能会把程序中的延时优化掉,而产生一堆问题。要看调试的时候能不能打上断点,打不上断电就说明这一行被优化掉了没有被编译。可以使用volatile来修饰变量,和restrict修饰指针

  • 遇到单片机跑着跑着就重启,可以试下把固定用的铜柱换成尼龙柱,再换上纸垫片,说不定会有神奇的效果。

  • 我们那个程序的浮点数运算好像有迷之问题。把浮点运算的结果用串口发到电脑上大概一秒或是几秒就会出现特别大或是特别小的数还有Inf和NAN,还是偶然现象。搞不好是数组越界操作/堆栈溢出程序跑飞/内存溢出访问越界/中断处理错误balabala。但是就连最基本的PID和一阶低通滤波偶尔都会随机出问题,降成int整形就不会出现这种情况。查了大概俩月也没查出问题在哪里,这种随机隐患万一赛场上发生了会很要命,所以把很多运算都降成整形了

  • 陀螺仪大概在比赛前一周不到突然抽风,稳定了好久改都没改的程序读取陀螺仪数据突然就不正常了。出现问题的当天在过了一小段时间之后又突然自己好了,再就没出现过这个问题。正式比赛前高强度跑了完整流程十几次测试稳定性也都没有问题。嗯也是很随机的小概率问题 然后赛场上就又碰到了 并且赛后重新烧程序跑了也没事… 只能说天有不测风云啊

  • 不要像我们一样把变量定义拉成一个单独的.c和.h文件,还把所有头文件都放到一起,这个当时是为了解决最开始引用报错的问题,后来发现是工程设置的问题。就还蛮蠢的x

  • 比完赛后过一段时间再看自己的程序,还是有不少地方不满意的。比如四个电机结构体写成MortorTypedef_t Mortor[4]会比1-4这样写方便得多;再有就是陀螺仪的处理程序美观性真的挺一般的;还有就是变量和函数命名不是很规范等等等等。

    智能车这份程序是我从大一上实验室招新开始学单片机和C语言,一直写到暑假比赛结束,代码也是逐渐跟着学习进度叠起来的。即使是比完赛后过了不到半个学期再看自己的程序,还是能发现有不少地方蛮不满意的,那就更不用说做车的前辈和学长们了。赛后也想把程序整理下弄得工整和美观一些,不过车已经被下一届的预备役选手拆掉准备明年的比赛了,改完之后的程序也不能再上车验证一下,于是还是开源这份赛后稍加改动的程序吧!还有遗憾的地方就在明年的RoboMaster里完善好了!作用更多是抛砖引玉!