Skip to content

MinecraftSTL/zust-wheelleg-team2

Repository files navigation

浙科轮腿二队

目录

开发流程

此仓库根据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

调参步骤

硬件

  1. 自行确保供电,I/O连接正常。

屏幕

  1. 硬件调参

  2. 上电

  3. 确保屏幕启动图为原神启动图

按钮

  1. 屏幕调参

  2. 上电

  3. 按下旋转编码器

  4. 确保菜单进入"main.carStatus"页

  5. 按下KEY_2

  6. 确保菜单"main.carStatus"页值为"start"

  7. 按下KEY_1

  8. 确保菜单进入"main"页

旋转编码器

  1. 屏幕调参

  2. 上电

  3. 顺时针旋转旋转编码器1格

  4. 确保菜单选择"main.config"页

  5. 逆时针旋转旋转编码器1格

  6. 确保菜单选择"main.carStatus"页

蜂鸣器

  1. 按钮调参

  2. 旋转编码器调参

  3. 调整菜单"main.config.volume"页值,确保值为1、2、3时有较大音量差异,3、4有较小音量差异

  4. 调整菜单"main.config.volume"页值为自己需要的音量

摄像头

  1. 蜂鸣器调参

  2. 上电

  3. 置菜单"main.arg.k.camera.bin.en"页值为0

  4. 确保摄像头原始图像正常

  5. 调整对焦

  6. 置菜单"main.arg.k.camera.bin.en"页值为1

磁编

  1. 蜂鸣器调参

  2. 上电

  3. 双向转动左轮,确保菜单"main.dat.encoder.l"页值正负和大致大小正常

  4. 双向转动右轮,确保菜单"main.dat.encoder.r"页值正负和大致大小正常

陀螺仪

  1. 蜂鸣器调参

  2. 上电

  3. 转动车模,确保菜单"main.dat.gyro.gyro.x_deg", "main.dat.gyro.gyro.y_deg", "main.dat.gyro.gyro.z_deg"页值正负和大致大小正常

  4. 转动车模,确保菜单"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"页值正负和大致大小正常

  5. 保持车模静止

  6. 菜单执行"main.config.mod.gyro"页函数

  7. 确保菜单"main.dat.gyro.gyro.vAx_rad", "main.dat.gyro.gyro.vAy_rad", "main.dat.gyro.gyro.vAz_rad"页值为0

  8. 转动车模,确保菜单"main.dat.gyro.gyro.xAx_deg", "main.dat.gyro.gyro.xAy_deg", "main.dat.gyro.gyro.xAz_deg"页值正负和大致大小正常

闪存

  1. 蜂鸣器调参

  2. 上电

  3. 菜单执行"main.debug.flash.write"页函数

  4. 更改菜单"main.config.volume"页值

  5. 断电

  6. 上电

  7. 确保菜单"main.config.volume"页值与更改后值相同

  8. 改回菜单"main.config.volume"页值

舵机

  1. 蜂鸣器调参

  2. 上电

  3. 置菜单"main.debug.forceLeg.enable"页值为1

  4. 调整菜单"main.debug.forceLeg.rt_bk","main.debug.forceLeg.rt_fd","main.debug.forceLeg.lt_fd","main.debug.forceLeg.lt_bk"页值,确保舵机转动方向和大致范围正常

  5. 置菜单"main.debug.legZero"页值为1

  6. 调整菜单"main.debug.forceLeg.rt_bk","main.debug.forceLeg.rt_fd","main.debug.forceLeg.lt_fd","main.debug.forceLeg.lt_bk"页值,记下舵机有响应时的最大值和最小值

  7. 置菜单"main.config.rb","main.config.rf","main.config.lf","main.config.lb"页值对应方向舵机记录的最大值和最小值的平均值

  8. 置菜单"main.debug.legZero"页值为0

  9. 置菜单"main.debug.forceLeg.enable"页值为0

无刷

  1. 磁编调参

  2. 上电

  3. 确保无刷电机左右接线不相反

  4. 置菜单"main.debug.forceSpeed.enable"页值为1

  5. 调整菜单"main.debug.forceSpeed.speed"页值,确保轮子转动大致速度正常

  6. 调整菜单"main.config.motor.lDir","main.config.motor.rDir"页值,确保轮子转动方向正常

  7. 置菜单"main.debug.forceSpeed.enable"页值为0

I/O

  1. 摄像头调参

  2. 陀螺仪调参

  3. 闪存调参

  4. 舵机调参

  5. 无刷调参

角速度环

  1. I/O调参

  2. 上电

  3. 置菜单"main.arg.PID.vAy"页pid值为0

  4. 置菜单"main.carStatus"页值为"start"

  5. 逐渐增大菜单"main.arg.PID.vAy.Kp"页值,并不断慢速晃动车模,在车模开始震荡时,此页值*=0.6

角度环

  1. 角速度环调参

  2. 上电

  3. 置菜单"main.arg.k.zero.k","main.arg.k.zero.x"页值为0

  4. 置菜单"main.arg.PID.xAy","main.arg.PID.WvVx","main.arg.PID.vVx"页pid值为0

  5. 置菜单"main.carStatus"页值为"balance"

  6. 逐渐增大菜单"main.arg.PID.xAy.Kp"页值,并不断扰动(先俯仰扰动,再俯仰滚转混合扰动)车模,在车模震荡无法收敛时,此页值*=0.6

  7. 调整"main.arg.k.zero.x"页值,确保车可以静止直立在原地

速度环

  1. 角度环调参

  2. 上电

  3. 置菜单"main.carStatus"页值为"balance"

  4. 逐渐增大菜单"main.arg.PID.WvVx.Ki"页值,并不断扰动(先俯仰扰动,再俯仰滚转混合扰动)车模,在车模开始震荡时,此页值*=0.6

  5. 逐渐增大菜单"main.arg.PID.WvVx.Kp"页值,并不断扰动(俯仰扰动)车模,在车模开始停止震荡时,停止增大

摄像头位置

  1. 角度环调参

  2. 将摄像头通过上方安装孔固定在三通上,三通底部距舵机顶面约30cm,摄像头底边距离碳杆约2块PCB板厚

  3. 上电

  4. 置菜单"main.carStatus"页值为"balance"

  5. 置菜单"main.arg.k.camera.show.cARL.alpha"页值为127

  6. 将车模放置于长直赛道后方中心,面向正前

  7. 调整摄像头角度,确保赛道边界线与红色半透明辅助线对齐

  8. 置菜单"main.arg.k.camera.show.cARL.alpha"页值为255

常见问题

预期 现象 问题 修复
腿转动顺畅,有适当均匀阻力,适当均匀惯性 腿在某些区间卡住,某些区间阻力非常小 舵机齿轮断裂 更换对应舵机
腿转动顺畅,有适当均匀阻力,适当均匀惯性 腿不响应输入,腿阻力轻微变化 舵机烧毁 更换对应舵机
腿转动顺畅,有适当均匀阻力,适当均匀惯性 腿惯性明显变小,细听失去舵机齿轮啮合音 腿内齿磨损 更换对应腿
无刷电机死区正常,出力正常 无刷电机死区增大,出力减小,转动手感顿挫明显 无刷电机缺一相 检查线和无刷驱动板问题
无刷电机死区正常,出力正常 无刷电机不响应输入 多种可能 使用mod键进一步确认缺相情况,若未缺相,为磁编相关问题
无刷驱动板正常运行 无刷驱动板小概率停止接受上位机下发的指令 无刷驱动程序指令解析部分问题 更新无刷驱动程序,或将指令缓存区改为队列/*这玩意儿我找了两天,修了两个小时*/
WiFi图传可以正常使用 WiFi图传在代码没有相关更改的情况下突然失效 你更新了逐飞助手 将对应芯片的开源库中的WiFi图传部分覆盖本地使用的
摄像头画面正常 摄像头画面全白 摄像头初始化时接触不良或供电不稳 打开放电开关关闭后再上电,按压fpc端子盖后再上电
摄像头画面正常 摄像头画面全黑 摄像头初始化时接触不良或供电不稳 打开放电开关关闭后再上电,按压fpc端子盖后再上电
摄像头画面正常 摄像头画面上方左右跳动 摄像头初始化时接触不良或供电不稳 打开放电开关关闭后再上电,按压fpc端子盖后再上电
摄像头画面正常 摄像头画面下方向右斜切 摄像头初始化时接触不良或供电不稳 打开放电开关关闭后再上电,按压fpc端子盖后再上电
摄像头画面正常 摄像头固定高度有一深色横线 摄像头帧率过高 调低摄像头帧率
摄像头画面正常 摄像头仅显示边线 摄像头接触不良 重新插入fpc排线后再上电,更换fpc排线后再上电,重焊fpc端子后再上电
可以正常使用碳纤维杆摄像头支架提起或转动车模 在车模在赛道上运行一段时间后触碰碳纤维杆会导致单片机死机,无刷电机高速转动,舵机在极限角度固定 你硬件干了好事 去问问我们一队遇到了什么
陀螺仪正常解算 陀螺仪小概率解算角度突然错误 陀螺仪接触不良 插紧陀螺仪排线
正常运行 冒烟|很香 多种可能 立即断电,有必要则拔下电池,后续排查。

编码规范

此代码混合使用多种编码规范,其中最抽象的一种解释如下:

A_b为函数名,其中A为大驼峰,B为小驼峰

则函数传参中thisA代替

联系方式

  •  QQ767752419
问题 答案
ServerID GitHub|Gitee
UUID GitHub用户名|Gitee用户名
Token _
  • 微信MinecraftSTL

比赛成绩

第十四届浙江省大学生智能汽车竞赛平衡轮腿组二等奖

赞助者

用户名 金额 初次赞助时间 金额达成时间 用户备注

比赛建议

赛前

建议准备两份备件,若担心漏件,可以拼三辆车测试过后把两辆拆成备件。

建议准备两份工具,若同组有两队,可以一队准备一份。

常见工具和临时备件(仅紧急更换时使用)列表:

  • 螺丝刀(电动)和扳手(十字,一字,外六角,内六角)

  • 镊子

  • 笔和记号笔

  • 万用表

  • 剥线钳

  • 斜口钳和尖嘴钳

  • 扎带和绝缘胶带

  • 电烙铁和锡丝

  • 蓝毛巾(2干2湿)和拖把

  • 电脑和烧录器

  • 无线串口和WiFi图传

赛中

  1. 进场前展开工具箱,备件箱,预热电烙铁,打开电动螺丝刀

  2. 进场前车模上电,测试IO设备(摄像头,陀螺仪,磁编,按钮,旋转编码器,闪存(内置),屏幕,舵机,无刷电机)是否正常

  3. 申请志愿者擦赛道,若不通过,进场硬件先擦赛道,软件验证元素跳转情况

  4. 正式发车前软件报”离场“,硬件离场,软件举手,按计时器

  5. 测试发车前软件报”测试“,硬件在软件没报”测试“且没作正式发车前准备时发车及时提醒

  6. 参数更改报给硬件,硬件按顺序记录,回滚时询问硬件

  7. 每圈跑完硬件报成绩和剩余时间,定期报剩余时间

参数报硬件格式应提前约定,如:

硬件姓名+ " " +参数名+ " " +参数原值+ "上" +参数新值

硬件姓名+ " " +参数名+ " " +参数原值+ "下" +参数新值

硬件姓名+ " 记 " +参数名+ " 为 " +参数新值

赛后

  • 可以把垃圾带走 //所有原来是主办方的东西而且现在主办方不要的东西都可以算垃圾

  • 可以拿剩下的餐券换饮料

上位机说明

为方便上位机调参,在增加参数时不需要单独编写解析函数,所有在菜单中的参数都有解析函数可以直接调用。

为防止单片机闪存失效(被置零|被随机|被擦除),单片机更换但未记录旧数据,所有在菜单中的参数通过菜单进行参数更改都会发送给上位机。

结合上两个特性,上位机可以进行参数备份,版本管理等功能。

数据包格式如下:

数据包帧长度不定,'^'为帧头,'$'为帧尾

参数上传格式为:

参数键(菜单路径(含根节点)) + "=" + 参数值

参数下传格式为:

参数键(菜单路径(不含根节点)) + "=" + 参数值

指令格式为:

"/" + 指令名

"/" + 指令名 + " " + 参数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 启动器,其中多线程高速下载器功能方便下载文件。
米哈游 上海米哈游影铁科技有限公司 给出 原神 游戏,其中启动图用作车模系统启动图。

姓名未被获奖名单公示,也未被其他方式公示,也未经询问同意实名的,名称为_

About

ZUST Wheel-Leg Team 2 Repository

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published