此仓库根据commit顺序分为三部分,分别为:
| 车模 | 用途 | 功能 |
|---|---|---|
| F车模 | 校赛 | 仅巡线 |
| D车模 | 测试 | 仅平衡 |
| V车模 | 省赛 | 全部 |
省赛使用的代码为TC387_0100版代码改版,后续代码未经实测,仅确保过编译。
此文档以最新版理论效果为准
| 功能 | 算法 | 作用 |
|---|---|---|
| 蜂鸣时间控制 | 自研 | 控制蜂鸣时间 |
| 按键扫描 | 逐飞方案自研改版 | 扫描按键短按,长按,超长按(会先触发长按) |
| 闪存校验 | 实验室自研 | 确保闪存未被置零或被随机 |
| 陀螺仪去零漂 | 多次采样取平均值 | 去除陀螺仪在静止状态下的零点漂移 |
| 陀螺仪解算 | 四元数解算 | 将陀螺仪角速度解算为角度 |
| 陀螺仪加速度计融合滤波 | 互补滤波,卡方校验 | 去除陀螺仪累计误差 |
| 图像裁剪 | 自研 | 减少运算时间,调整中点 |
| 图像缩放 | 自研 | 减少运算时间 |
| 图像阴影补偿 | 自研 | 补偿图像下部较暗部分 |
| 图像暗角补偿 | 自研 | 补偿图像四角较暗部分 |
| 图像二值化 | 快速大津法 | 将图像转为仅黑白图像 |
| 图像梯形裁剪 | 自研 | 将图像上部裁剪为等腰梯形,上部其余区域置黑,防止爬不到圆环环岛和十字环岛/**得到一队队长高度肯定*/ |
| 图像找起点 | 自研 | 将连续长度最长且最靠近图像中心的白色两端的黑色起点找出,若无法找出,在上面一行重试 |
| 图像爬线 | 八邻域 | 从起点开始,将图像黑色部分边界线按顺序找出,并记录生长方向 |
| 图像重爬线 | 自研 | 若图像爬线爬到单边桥和小路障底部、赛道同边边缘、图像底边形成的小三角形等无效区域,重新找起点爬线 |
| 图像找边线 | 自研 | 将爬线结果转为赛道边线 |
| 图像爬线转线段 | 自研 | 将爬线结果转为带角度和中点位置的相连线段 |
| 图像边线丢线判断 | 自研 | 判断图像边线是否丢线 |
| 图像线段转角点 | 自研 | 将图像线段转为带朝向和位置的角点 |
| 角点滤波 | 自研 | 找出最小最大有效/*离图像顶端不过近*/角点索引 |
| 图像边线直线判断 | 自研 | 判断图像边线是否是直线 |
| 图像斑马线元素判断 | 实验室自研 | 判断斑马线 |
| 图像斑马线元素处理 | 自研 | 处理斑马线 |
| 图像十字元素处理 | 自研 | 判断十字,处理十字 |
| 图像小路障元素处理 | 自研 | 判断小路障,处理小路障 |
| 图像圆环元素处理 | 自研 | 判断圆环,处理圆环 |
| 图像坡道元素判断 | 斜率差值改版 | 判断坡道 |
| 图像坡道元素处理 | 自研,实验室自研 | 处理坡道 |
| 图像横断路障元素判断 | 自研 | 判断横断路障 |
| 图像横断路障元素处理 | 自研,实验室自研 | 处理横断路障 |
| 图像单边桥元素判断 | 自研 | 判断单边桥 |
| 图像单边桥元素处理 | 自研,队伍自研 | 处理单边桥 |
| 图像其他元素处理 | 自研 | 处理空元素,疑似元素 |
| 拐点方向判断 | 自研 | 将拐点方向转为拐点方向象限/*靠近坐标轴为0*/ |
| 角度标准化 | 自研,队伍自研 | 将弧度theta标准化到-PI <= theta && theta < PI |
| 元素置信控制 | 一阶低通滤波自研改版 | 通过计算元素置信分数决定是否跳转元素 |
| 图像边线连接补线 | 自研 | 将图像边线两点连接进行补线 |
| 图像边线上下补线 | 自研 | 将图像边线从给定点向上或向下延长补线 |
| 图像边线拟合补线 | 自研,最小二乘法 | 将图像边线给定区域以给定点的拟合直线补线 |
| 图像边线斜率补线 | 自研 | 将图像边线给定区域以给定斜率和截距直线补线 |
| 图像弯道速度决策 | 自研 | 将图像边线转为目标速度 |
| 图像前瞻决策 | 自研 | 将图像及特征值转为前瞻 |
| 图像边线转中线 | 自研 | 将图像边线转为中线,并预测丢线区域中线 |
| 图像中线转偏差 | 自研 | 将图像中线转为偏差 |
| 图像转RGB565图像 | 自研 | 将图像转为RGB565彩色图像 |
| RGB565图像清空 | 自研 | 将RGB565图像置黑 |
| RGB565图像画叉 | 自研 | 将RGB565图像以给定点和半径画叉 |
| RGB565图像画圆 | 自研 | 将RGB565图像以给定点和半径画圆 |
| RGB565图像画中线 | 自研 | 在RGB565图像上带前瞻画中线/**得到一队队长高度肯定*/ |
| 前瞻标定 | 自研,实验室自研 | 显示半透明参考线,通过与赛道边缘对齐来调整摄像头角度 |
| 帧率记录 | 循环队列 | 获取帧率,测试运行频率(在多线程读写有累计误差,但未出现过) |
| 五连杆运动学逆解 | 自研,队伍自研 | 将轮子坐标转为舵机弧度 |
| 滚转角平衡 | 自研 | 将滚转角和当前腿长度差转为目标长度差 |
| lpf0 | 一阶低通滤波自研改版 | 一个各方面都比一阶低通滤波更差的变化量限幅器 |
| 流程控制 | 自研 | 将给定时间转为流程索引和流程时间 |
| 旋转编码器输入 | 实验室自研 | 读取旋转编码器值 |
| PID | 公开自研改版 | PID控制,限位,允许初始化值,修正非数 |
| 菜单 | 自研 | 调参,限幅,显示 |
| RGB565图像画字符 | 逐飞方案自研改版 | 在RGB565上画字符,字符串,数字 |
引脚定义(不含逐飞库内)
| 功能 | 引脚 |
|---|---|
| 弱蜂鸣器 | P15_6 |
| 强蜂鸣器 | P15_7 |
| ICM42688_SPC_PIN | P20_11 |
| ICM42688_SDI_PIN | P20_14 |
| ICM42688_SDO_PIN | P20_12 |
| SMALL_DRIVER_RX | P20_3 |
| SMALL_DRIVER_TX | P21_6 |
| 右后舵机 | P11_6 |
| 右前舵机 | P11_9 |
| 左前舵机 | P11_10 |
| 左后舵机 | P11_11 |
| 旋转编码器L | P02_6 |
| 旋转编码器R | P02_7 |
无刷双驱要求左右编码器返回数据相反,且driver_config.h中
#define MOTOR_DRIVER_MODE FAST_FOC_MODE
#define DRIVER_RESPONSE_CYCLE (1)
#define USER_CONTROL_MODE (0)
#define DRIVER_ACTIVE_OUTPUT_SPEED DRIVER_ENABLE- 自行确保供电,I/O连接正常。
-
硬件调参
-
上电
-
确保屏幕启动图为
原神启动图
-
屏幕调参
-
上电
-
按下旋转编码器
-
确保菜单进入"main.carStatus"页
-
按下
KEY_2 -
确保菜单"main.carStatus"页值为"start"
-
按下
KEY_1 -
确保菜单进入"main"页
-
屏幕调参
-
上电
-
顺时针旋转旋转编码器1格
-
确保菜单选择"main.config"页
-
逆时针旋转旋转编码器1格
-
确保菜单选择"main.carStatus"页
-
按钮调参
-
旋转编码器调参
-
调整菜单"main.config.volume"页值,确保值为1、2、3时有较大音量差异,3、4有较小音量差异
-
调整菜单"main.config.volume"页值为自己需要的音量
-
蜂鸣器调参
-
上电
-
置菜单"main.arg.k.camera.bin.en"页值为0
-
确保摄像头原始图像正常
-
调整对焦
-
置菜单"main.arg.k.camera.bin.en"页值为1
-
蜂鸣器调参
-
上电
-
双向转动左轮,确保菜单"main.dat.encoder.l"页值正负和大致大小正常
-
双向转动右轮,确保菜单"main.dat.encoder.r"页值正负和大致大小正常
-
蜂鸣器调参
-
上电
-
转动车模,确保菜单"main.dat.gyro.gyro.x_deg", "main.dat.gyro.gyro.y_deg", "main.dat.gyro.gyro.z_deg"页值正负和大致大小正常
-
转动车模,确保菜单"main.dat.gyro.acc.x_g", "main.dat.gyro.acc.y_g", "main.dat.gyro.acc.z_g"或"main.dat.gyro.acc.aXx_mpss", "main.dat.gyro.acc.aXy_mpss", "main.dat.gyro.acc.aXz_mpss"页值正负和大致大小正常
-
保持车模静止
-
菜单执行"main.config.mod.gyro"页函数
-
确保菜单"main.dat.gyro.gyro.vAx_rad", "main.dat.gyro.gyro.vAy_rad", "main.dat.gyro.gyro.vAz_rad"页值为0
-
转动车模,确保菜单"main.dat.gyro.gyro.xAx_deg", "main.dat.gyro.gyro.xAy_deg", "main.dat.gyro.gyro.xAz_deg"页值正负和大致大小正常
-
蜂鸣器调参
-
上电
-
菜单执行"main.debug.flash.write"页函数
-
更改菜单"main.config.volume"页值
-
断电
-
上电
-
确保菜单"main.config.volume"页值与更改后值相同
-
改回菜单"main.config.volume"页值
-
蜂鸣器调参
-
上电
-
置菜单"main.debug.forceLeg.enable"页值为1
-
调整菜单"main.debug.forceLeg.rt_bk","main.debug.forceLeg.rt_fd","main.debug.forceLeg.lt_fd","main.debug.forceLeg.lt_bk"页值,确保舵机转动方向和大致范围正常
-
置菜单"main.debug.legZero"页值为1
-
调整菜单"main.debug.forceLeg.rt_bk","main.debug.forceLeg.rt_fd","main.debug.forceLeg.lt_fd","main.debug.forceLeg.lt_bk"页值,记下舵机有响应时的最大值和最小值
-
置菜单"main.config.rb","main.config.rf","main.config.lf","main.config.lb"页值对应方向舵机记录的最大值和最小值的平均值
-
置菜单"main.debug.legZero"页值为0
-
置菜单"main.debug.forceLeg.enable"页值为0
-
磁编调参
-
上电
-
确保无刷电机左右接线不相反
-
置菜单"main.debug.forceSpeed.enable"页值为1
-
调整菜单"main.debug.forceSpeed.speed"页值,确保轮子转动大致速度正常
-
调整菜单"main.config.motor.lDir","main.config.motor.rDir"页值,确保轮子转动方向正常
-
置菜单"main.debug.forceSpeed.enable"页值为0
-
摄像头调参
-
陀螺仪调参
-
闪存调参
-
舵机调参
-
无刷调参
-
I/O调参
-
上电
-
置菜单"main.arg.PID.vAy"页pid值为0
-
置菜单"main.carStatus"页值为"start"
-
逐渐增大菜单"main.arg.PID.vAy.Kp"页值,并不断慢速晃动车模,在车模开始震荡时,此页值*=0.6
-
角速度环调参
-
上电
-
置菜单"main.arg.k.zero.k","main.arg.k.zero.x"页值为0
-
置菜单"main.arg.PID.xAy","main.arg.PID.WvVx","main.arg.PID.vVx"页pid值为0
-
置菜单"main.carStatus"页值为"balance"
-
逐渐增大菜单"main.arg.PID.xAy.Kp"页值,并不断扰动(先俯仰扰动,再俯仰滚转混合扰动)车模,在车模震荡无法收敛时,此页值*=0.6
-
调整"main.arg.k.zero.x"页值,确保车可以静止直立在原地
-
角度环调参
-
上电
-
置菜单"main.carStatus"页值为"balance"
-
逐渐增大菜单"main.arg.PID.WvVx.Ki"页值,并不断扰动(先俯仰扰动,再俯仰滚转混合扰动)车模,在车模开始震荡时,此页值*=0.6
-
逐渐增大菜单"main.arg.PID.WvVx.Kp"页值,并不断扰动(俯仰扰动)车模,在车模开始停止震荡时,停止增大
-
角度环调参
-
将摄像头通过上方安装孔固定在三通上,三通底部距舵机顶面约30cm,摄像头底边距离碳杆约2块PCB板厚
-
上电
-
置菜单"main.carStatus"页值为"balance"
-
置菜单"main.arg.k.camera.show.cARL.alpha"页值为127
-
将车模放置于长直赛道后方中心,面向正前
-
调整摄像头角度,确保赛道边界线与红色半透明辅助线对齐
-
置菜单"main.arg.k.camera.show.cARL.alpha"页值为255
| 预期 | 现象 | 问题 | 修复 |
|---|---|---|---|
| 腿转动顺畅,有适当均匀阻力,适当均匀惯性 | 腿在某些区间卡住,某些区间阻力非常小 | 舵机齿轮断裂 | 更换对应舵机 |
| 腿转动顺畅,有适当均匀阻力,适当均匀惯性 | 腿不响应输入,腿阻力轻微变化 | 舵机烧毁 | 更换对应舵机 |
| 腿转动顺畅,有适当均匀阻力,适当均匀惯性 | 腿惯性明显变小,细听失去舵机齿轮啮合音 | 腿内齿磨损 | 更换对应腿 |
| 无刷电机死区正常,出力正常 | 无刷电机死区增大,出力减小,转动手感顿挫明显 | 无刷电机缺一相 | 检查线和无刷驱动板问题 |
| 无刷电机死区正常,出力正常 | 无刷电机不响应输入 | 多种可能 | 使用mod键进一步确认缺相情况,若未缺相,为磁编相关问题 |
| 无刷驱动板正常运行 | 无刷驱动板小概率停止接受上位机下发的指令 | 无刷驱动程序指令解析部分问题 | 更新无刷驱动程序,或将指令缓存区改为队列/*这玩意儿我找了两天,修了两个小时*/ |
| WiFi图传可以正常使用 | WiFi图传在代码没有相关更改的情况下突然失效 | 你更新了逐飞助手 | 将对应芯片的开源库中的WiFi图传部分覆盖本地使用的 |
| 摄像头画面正常 | 摄像头画面全白 | 摄像头初始化时接触不良或供电不稳 | 打开放电开关关闭后再上电,按压fpc端子盖后再上电 |
| 摄像头画面正常 | 摄像头画面全黑 | 摄像头初始化时接触不良或供电不稳 | 打开放电开关关闭后再上电,按压fpc端子盖后再上电 |
| 摄像头画面正常 | 摄像头画面上方左右跳动 | 摄像头初始化时接触不良或供电不稳 | 打开放电开关关闭后再上电,按压fpc端子盖后再上电 |
| 摄像头画面正常 | 摄像头画面下方向右斜切 | 摄像头初始化时接触不良或供电不稳 | 打开放电开关关闭后再上电,按压fpc端子盖后再上电 |
| 摄像头画面正常 | 摄像头固定高度有一深色横线 | 摄像头帧率过高 | 调低摄像头帧率 |
| 摄像头画面正常 | 摄像头仅显示边线 | 摄像头接触不良 | 重新插入fpc排线后再上电,更换fpc排线后再上电,重焊fpc端子后再上电 |
| 可以正常使用碳纤维杆摄像头支架提起或转动车模 | 在车模在赛道上运行一段时间后触碰碳纤维杆会导致单片机死机,无刷电机高速转动,舵机在极限角度固定 | 你硬件干了好事 | 去问问我们一队遇到了什么 |
| 陀螺仪正常解算 | 陀螺仪小概率解算角度突然错误 | 陀螺仪接触不良 | 插紧陀螺仪排线 |
| 正常运行 | 冒烟|很香 | 多种可能 | 立即断电,有必要则拔下电池,后续排查。 |
此代码混合使用多种编码规范,其中最抽象的一种解释如下:
以A_b为函数名,其中A为大驼峰,B为小驼峰
则函数传参中this用A代替
- QQ
767752419
| 问题 | 答案 |
|---|---|
ServerID |
GitHub|Gitee |
UUID |
GitHub用户名|Gitee用户名 |
Token |
_ |
- 微信
MinecraftSTL
第十四届浙江省大学生智能汽车竞赛平衡轮腿组二等奖
| 用户名 | 金额 | 初次赞助时间 | 金额达成时间 | 用户备注 |
|---|---|---|---|---|
建议准备两份备件,若担心漏件,可以拼三辆车测试过后把两辆拆成备件。
建议准备两份工具,若同组有两队,可以一队准备一份。
常见工具和临时备件(仅紧急更换时使用)列表:
-
螺丝刀(电动)和扳手(十字,一字,外六角,内六角)
-
镊子
-
笔和记号笔
-
万用表
-
剥线钳
-
斜口钳和尖嘴钳
-
扎带和绝缘胶带
-
电烙铁和锡丝
-
蓝毛巾(2干2湿)和拖把
-
电脑和烧录器
-
无线串口和WiFi图传
-
进场前展开工具箱,备件箱,预热电烙铁,打开电动螺丝刀
-
进场前车模上电,测试IO设备(摄像头,陀螺仪,磁编,按钮,旋转编码器,闪存(内置),屏幕,舵机,无刷电机)是否正常
-
申请志愿者擦赛道,若不通过,进场硬件先擦赛道,软件验证元素跳转情况
-
正式发车前软件报”离场“,硬件离场,软件举手,按计时器
-
测试发车前软件报”测试“,硬件在软件没报”测试“且没作正式发车前准备时发车及时提醒
-
参数更改报给硬件,硬件按顺序记录,回滚时询问硬件
-
每圈跑完硬件报成绩和剩余时间,定期报剩余时间
参数报硬件格式应提前约定,如:
硬件姓名+ " " +参数名+ " " +参数原值+ "上" +参数新值
硬件姓名+ " " +参数名+ " " +参数原值+ "下" +参数新值
硬件姓名+ " 记 " +参数名+ " 为 " +参数新值
-
可以把垃圾带走 //所有原来是主办方的东西而且现在主办方不要的东西都可以算垃圾
-
可以拿剩下的餐券换饮料
为方便上位机调参,在增加参数时不需要单独编写解析函数,所有在菜单中的参数都有解析函数可以直接调用。
为防止单片机闪存失效(被置零|被随机|被擦除),单片机更换但未记录旧数据,所有在菜单中的参数通过菜单进行参数更改都会发送给上位机。
结合上两个特性,上位机可以进行参数备份,版本管理等功能。
数据包格式如下:
数据包帧长度不定,'^'为帧头,'$'为帧尾
参数上传格式为:
参数键(菜单路径(含根节点))+ "=" +参数值参数下传格式为:
参数键(菜单路径(不含根节点))+ "=" +参数值指令格式为:
"/" +
指令名"/" +
指令名+ " " +参数0"/" +
指令名+ " " +参数0+ " " +参数1"/" +
指令名+ " " +参数0+ " " +参数1+ " " +参数2"/" +
指令名+ " " +参数0+ " " +参数1+ " " +参数2+ " " +...因为上传几乎不丢包,下传有较大概率丢包,所以下传参数成功后,下位机会执行上位机指令:
"received",
收到的参数下传数据包下位机指令默认有:
motion 格式:
command,目标前进速度,目标左转速度
在NodeTuner.jar给出了上位机编写示例,此代码未经混淆,但不开源。
实验室小精灵
赛道小精灵
~~_~~一桌
电池保护器
#include "Genshin.h"
#define zzz(x, z) ((x) > (z) ? (x) - (z) : (x) < -(z) ? (x) + (z) : 0)
#define lol(x, x0, x1, y0, y1) (((x) - (x0)) * ((y1) - (y0)) / ((x1) - (x0)) + (y0))角点识别算法是去另一个校区答疑的路上想出来的,在答疑过程中写出来的,回来验证的,还挺好用()
| 名称 | 身份 | 贡献 |
|---|---|---|
| 赵一鸣 | 本队硬件,同班同学 | 设计、焊接电路板。设计电池盒。设计、修改电路板、线路、电池、陀螺仪、摄像头固定、放置结构。轮胎制作。修理车模。给出软件修改建议。赛道设计,赛道铺设。赛前准备,赛中日志记录、剩余时间报告、赛道清洁。请我喝饮料。陪同调车。 |
| 陈浩杰 | 本队队员,本校学长 | 决赛赛道清洁。 |
| 孙俊翔 | 本校同组组员,一队队长 | 采购。管理。给出学习方向。给出部分算法。给出软硬件修改建议。给出参数修改建议。联系交流。给出内网转发路由器,方便查看图传。赛道铺设。陪同调车。 |
| 钱文杰 | 本校同组组员,一队软件 | 给出方案特性说明。给出轮胎制作方法。赛道铺设。陪同调车。 |
| 芦圣翔 | 本校同组组员,一队硬件 | 给出第一版主板电路图。电路板检查。更换舵机(单次)。请我喝饮料(单次)。 |
| 季茂渤 | 本校同学,独轮二队硬件 | 电路板检查。请我吃了一个肠粉,请我喝饮料。陪同调车。 |
| 王如飞 | 本校学长,独轮一队软件 | 电路板测试。多次下楼看我调车进度。 |
| 潘申奇 | 本校学长,独轮一队队员 | 早期学习时帮助。 |
| _ | 本校学长 | 重焊脱焊电源线(单次)。 |
| 杨海迪 | 本校学长,越野一队队员 | 为焊盘脱落 18P FPC 排线飞线(单次)。 |
| _ | 本校学长 | 给出早期学习时摄像头算法例程。 |
| 孙勇智 | 指导老师 | 专业问题指导。比赛经验指导。 |
| _ | 大一、大二班主任 | 推荐我进入智能车队。 |
| 交流学校车队 | 与我们交流,互有进步。 | |
| 逐飞科技 | 成都逐飞科技有限公司 | 给出 TriCore 开源库。给出逐飞助手上位机,方便查看图传。给出无刷驱动板电路图。给出无刷双驱开源代码。给出单边桥通过方案。 |
| je00 | VOFA+ 主要开发者 | 给出 VOFA+ 上位机,方便读写串口。 |
| 吴柏建 | Image2Lcd 开发者 | 给出Image2Lcd应用软件方便图片转换。 |
| 爱哭的热带鱼 | PC2LCD 开发者 | 给出PC2LCD应用软件方便字模转换。 |
| SJTU-AuTop | SJTU车队 | 给出摄像头部分开源算法。 |
| Python | 编程语言 | 用于五连杆运动学逆解算法验证。用于第一版菜单方案可行性验证。 |
| Microsoft | Microsoft | 给出Visual Studio Code方便Python编写与运行。 |
| Java | 编程语言 | 用于上位机编写。 |
| JetBrains | JetBrains | 给出 IntelliJ IDEA (Community Edition) IDE,方便上位机编写。 |
| Azul | Azul | 给出跨平台性能更好的 Azul JDK,方便上位机编写。 |
| deepseek | 杭州深度求索人工智能基础技术研究有限公司 | 给出开源语言大模型,用于简单代码编程,中等代码检查或验证,算法选择,常见算法接口适配,单片机数据手册翻译。 |
| Chatbox (Community Edition) | 应用软件 | 方便本地调用LLM接口。 |
| 7-zip | 应用软件 | 给出压缩软件,方便代码备份。 |
| Cloudreve | Cloudreve 开发团队 | 给出 Cloudreve 网盘服务系统,方便代码多设备备份。 |
| jeessy2 | ddns-go 主要开发者 | 给出 ddns-go ddns 服务系统,方便代码多设备备份。 |
| Yumao | MCSManager 主要开发者 | 给出 MCSManager 实例管理服务系统,方便同时管理 Cloudreve 和 ddns-go 服务,方便代码多设备备份。 |
| 龙腾猫跃 | PCL2 主要开发者 | 给出 PCL2 Minecraft 启动器,其中多线程高速下载器功能方便下载文件。 |
| 米哈游 | 上海米哈游影铁科技有限公司 | 给出 原神 游戏,其中启动图用作车模系统启动图。 |
姓名未被获奖名单公示,也未被其他方式公示,也未经询问同意实名的,名称为_。