# ztlh-bot-x
**Repository Path**: coding-migration-project/ztlh-bot-x
## Basic Information
- **Project Name**: ztlh-bot-x
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2024-08-03
- **Last Updated**: 2024-08-03
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 1. move_ctrl.c
此文件包含底盘运动相关的控制函数:
根据用户指定参数控制底盘前后运动,参数包括运动距离和速度
根据用户指定参数控制底盘的斜向运动,方向包括左前、左后、右前、右后,运动参数包括角度和速度
根据用户指定参数控制底盘旋转一定的角度,参数包括方向和角度,速度未指定,使用默认值
根据用户指定参数控制底盘旋转一定的圈数,参数包括方向和圈数,速度未指定,使用默认值
根据用户指定参数修改轮子速度,参数包括速度方向和大小,左右轮的一共四个参数
根据用户指定的命令控制底盘刹车
## 2. rgb_ctrl.c
此文件包含RGB彩灯控制相关的函数:
根据用户指定的参数控制氛围灯的状态和颜色,状态包括正常和呼吸两个状态,颜色为每个通道256色
根据用户指定的参数控制生命灯的状态和亮度和颜色,状态包括静态、流水、呼吸、闪烁,亮度范围为1-100,颜色包括红橙黄绿青蓝紫白,和黑色(不亮,#000000)
RBG通道数值既控制颜色又控制亮度??
## 3. action_ctrl.c
此文件包含执行机构(舵机)的动作控制函数:
根据用户指定的参数控制机构进行暴击,具体动作先自定义
根据用户指定的参数控制机构旋转到某个角度,参数为角度(0-180)
## 4. user_action_task.c
此文件包含用户数任务执行函数,根据参数的更新情况来调用相应的执行函数
## 5. struct{} user_action_task_param_t
此结构体保存用户传入的参数,当收到新的指令后,会设置参数更新表示,同时更新相关的动作结束标志为0,动作执行完成后才将finish标志设置为1
收到指令的时候根据当前的ID来查询对应参数buffer,将参数写入buffer,并设置state状态
执行指令的时候,遍历所有的可执行函数,根据state中的标志来执行相应的函数
```
typedef struct{
uint8_t cmd;
uint8_t state;
uint8_t is_unbreakable;
uint8_t* param;
uint8_t len;
pf action_func;
}module_task_param_t;
```
### 5.1 用户指令执行函数分类
+ 动作执行分为几种类型:
第一种,即刻执行命令,后续不需要MCU参与。这种只需要mcu发出一个指令,硬件可以自动完成执行,后续不需要mcu的参与,可以即可执行完成,不支持打断执行
第二种,延时执行完成指令,此类动作执行分为两步,第一步是参数初始化,第二部是循环执行,是否可打断要看对应的标志变量
第三种,无限时执行指令,此类动作完需要mcu去发送开始执行命令,同时还需要mcu不断地去监控和调整执行的动作,直到动作被打断,例如底盘的运动控制,必须支持参数实时更新操作,否则将无限执行下去
第四种,混合型动作指令,此类动作包含了第二种和第三种指令的混合,往往是先完成第二种,再执行第三种
+ 状态标志:
为了实现流程的控制,需要几个标志变量来表示执行状态:
第一种,参数更新标志,在收到指令的之后,就设置此标志变量
第二种,是否可打断执行标志,在收到指令的时候,就设置此标志变量
第三种,任务正在执行标志,此标志在任务执行的时候置起,如果在执行过程中遇到参数更新标志,那就需要检查该任务是否可打断,然后确定是否忽略参数更新,知道此次任务执行完成。
### 5.2 旋转一定角度函数的实现
#### 5.2.1 旋转角度的处理
MPU输出的角度为相对于上电初始化那一刻的角度,输出范围为±180°,一旦超过这个范围。如果MPU一直朝一个方向运动,那么得到的角度曲线就是锯齿状的。需要通过软件上的处理,把这种锯齿状的角度处理成直线变化的角度,通过累加的方式,在±180°附近需要处理跳变的情况,如果是正数跳转到负数,就是角度增加,反之就是角度减少。目前车体定义的角速度正向为顺时针表示正向,需要检测是否和IMU的角度正向一致。
#### 5.2.2 角速度的规划
根据起始角度、目标角度和当前角度,规划计算运动过程中每一时刻的角速度。同时每一阶段有一个加速度,这都是根据当前的角度来控制的,在初始角度阶段,加速度为a0,当角度到达加速阶段的末尾后,停止加速,开始匀速,此时加速度为0,当角度到达减速阶段的时候,开始减速,直到角度到达相应的值,整个过程以角度为参考,而非时间。加速度a0的大小根据函数的执行周期、起始结束距离、电机性能等参数来计算,最大不应该超过电机的最大加速度。
### 5.3 旋转一定圈数函数的实现
转换为旋转一定角度的问题来计算
### 5.4 前进一段距离函数的实现
#### 5.4.1 直线距离的运算
通过编码器的累加来计算里程,编码器同样有跳变的问题,需要特殊处理
通过速度和IMU角度积分来计算里程来实现,这一步已经完成。
#### 5.4.2 线速度的规划
计算放和旋转一定角度的方法类似
### 5.5 旋转和前进函数顺序执行
旋转一定角度,然后直行一段距离,分为两步执行。第一步旋转一定的角度,角度旋转完成以后再进入下一个阶段,需要添加角度是否到位的判断;判断成功后进入下一步执行直行操作。
## 6. imu_datafusion.c
用四元素法可以实现imu yaw和pitch的获取,但是yaw轴会一直漂移(此方向加速度无法做补偿校准),需要在小车静止的时候获取数据曲线斜率以此来对imu yaw角度进行补偿。首先需要判断小车是否处于静止状态,综合几个因素来判断,加速度、yaw、pitch、角速度的变化等等。*IMU校准状态要通过LED来提示,此时不响应控制指令*
## 7. loader业务逻辑
### 7.1 laoder_main
包含固件升级的状态机,状态包括如下:
+ boot_csm_check_boot_type
检查boot状态,看是否有升级的意图,是否需要停留在loader里面;还是只是上电复位路过,经过倒计时后就进入app程序
+ boot_csm_down_count
根据倒计时参数倒计时相应的时间,时间到后检查app的crc32校验,校验通过之后就进入app
+ boot_csm_entry_app_chk
检查app的crc32校验,校验通过之后就进入app
+ boot_csm_entry_app
执行跳转到app的指令
+ boot_csm_stop_in_loader
在此状态下主要是每隔3s进行flash 闪烁频率的重置
--------------------------
## 1. 疑问
### 1.1 哪些命令需要返回数据包,返回的格式如何,返回码如何定义
除了明确要求回复的和升级数据包外,其余的都不用回复
### 1.2 版本号的格式是什么
版本号的格式是什么
### 1.3 遥控指令和用户指令是否是混合的,还是单独开一条指令
已经要求单独开一条指令
### 1.4 IMU输出的角度范围是否为±180,正向为顺时针还是逆时针
IMU角度输出,自己进行数据融合,顺时针旋转yaw角度减小
------------------------------
## 1. 外出办公设备
### 1.1 设备
电脑、电源、鼠标、U盘、逻辑分析仪、万用表、PCB、PCB配件等等
### 1.2 软件
原理图工程文件、源代码工程文件
--------------------------------
## 任务计划
2018.10.14 上午
+ 完成BMI角度获取 *已完成*
+ 先用他们做好的代码,然后自己同时研究IMU融合算法 *已完成*
+ 研究六轴加速度计的原理 *互补滤波*
+ 研究九轴加速度计的
+ 研究九轴加速度计+气压计
+ 研究九轴加速度计+气压计+GPS
2018.10.15 下午
+ 完成电池电量计算 *硬件有bug,上下臂电阻值交换*
+ 电池校准参数放在flash中的参数存储区
+ 实现user_action_task.c 文件中函数功能 *已完成*
2018.10.15 晚上
+ 实现小车的蓝牙配对 *已完成*
+ 配置蓝牙波特率为115200 *串口硬件配置有问题,无法正常通信*
2018.10.16 下午
+ 实现蓝牙通信控制小车运动 *板载蓝牙对AT指令没有反应*
+ 检查连接状态管脚 *可正常显示蓝牙连状态*
+ 在9600bps速率下,蓝牙接收每次只能透传20字节,透传转发周期为40ms,不管是9600还是115200都是如此 *取决于上位机的速率*
2018.10.16 晚上
+ 实现imu数据读取,yaw轴漂移校准算法 *已完成*
+ IMU角度超过±180度存在跳变,需要在软件上处理好 *已完成*
+ *校准后的IMU也有跳变现象,跳变角度为1.0左右*
2018.10.17 上午
+ 解决蓝牙无法响应at指令的问题
+ IMU旋转360测试,看返回的数据是否有问题
逆时针转一圈为351°,误差1.67%
逆时针转两圈为672°,误差6.0%
顺时针回一圈为318°,误差1.67%
顺时针回两圈为-41°,误差0.2%
逆时针转一圈为318°,误差0.2%
逆时针转一圈为683°,误差1.3%
重启
逆时针转一圈为358°,误差0.5%
+ 校准IMU角度零偏移
+ 角速度校准之后也不稳定,有正负跳变的现象
2018.10.17 下午
+ 解决蓝牙配置问题 *必须连着电脑的串口才可以完成配置,不连外部串口模块的情况下,经过mcu配置后就无法响应了,需要重启,需要用示波器观察波形*
+ 增加校准时候的灯效 *已完成*
2018.10.18 上午 下午
+ 蓝牙小车联调 *已完成*
2018.10.19 上午
+ 进一步修正陀螺仪的角度偏差 *已完成*
+ 检测翻转之后陀螺仪读数会不会不准确 *已解决*
+ 倾斜的时候角速度分量会一直存在 *已解决*
+ 调试角速度,角度控制PID
2018.10.19 晚上
+ 继续实现部分协议定义的内容
+ 通过码盘实现小车里程计算 *已完成*
+ 添加暴击指令
+ 添加走一段距离实现 *上位机如何知道程序已经执行完成,何时下发下一条指令*
+ 添加转一定角度实现
2018.10.22 上午
+ 继续实现协议规定的功能 *已完成*
2018.10.23 上午
+ 继续实现剩下的协议功能,并在新板子上测试
+ 测试第二块板子,3.3v变成2.5v
+ key_out电压偏低,只有0.64v,还接触不灵;改小keyout限流电阻 *需确认是否PCB问题*
2018.10.24 晚上
+ 测试LED显示代码 *已完成*
2018.10.26 上午
+ 修改LED显示灯条原理图,添加限流电阻,*需确定限流电阻多大*
+ 模拟测试RBG灯条效果 *已完成*
2018.10.29 下午
+ 测试其他功能函数
+ 公司对账 *已完成*
+ ~~准备路演信息~~
2018.10.30 上午
+ 测试升级功能
+ 测试舵机角度控制
2018.12.2
+ 遥控模式和编程模式下的速度规划如何区分
+ 遥控模式下是将遥感数据±10000映射成速度然后分配给小车,前进后退速度单位是rpm,旋转速度单位是deg/s
+ 编程模式是直接给出行走的距离和角度,距离单位是cm,角度单位是deg
+ 编程模式也可以直接制定轮子速度,单位为rpm,此时不经过速度规划,直接控制底层电机速度
+ 分析指令下发控制路径,手柄指令直接到base_move_ctrl(),编程指令则要经过速度规划才到达base_move_ctrl(),两者路径不同,因此需要给base_move_ctrl()添加一个参数来区分这两种情况
+ 如果调用者为js,则需要自己将遥感数据映射为具体的速度
+ 如果调用者为app,则需要自己进行速度单位转换
+ 改变一下思路,统一通过speed_plan()调用,js模式下距离和角度设置为无限远,调用两次
+ -> cm, deg -> \__user_action_move_ctrl -> speed_plan -> cm/s, deg/s -> base_move_ctrl -> yaw_ctrl & motor_speed_map -> rpm
2018.12.9
+ 查看碰撞中断的中断管脚是哪一个 INT1
+ 是否可以配置多个中断,触发同一个管脚电平变化,程序中如何检测是哪一个管脚
+ significant和orient寄存器的含义
2018.12.16
+ 周二下午需要演示:
+ 声效:开机,关机,碰撞,格斗,对骂等
+ 表情:高兴、愤怒、读秒
+ 可以演示撞击效果,各种人机互动效果
+ 灯光调节效果
2018.12.22
+ 测试app发现舵机控制滑块错误,并且在滑动的时候没有发送指令
+ 暴击指令发送后舵机运动的速度很慢,需要查找原因
+ 舵机滑块指令会触发表情指令0x42,然后表情指指令会使得舵机速度变慢??
+ *BUG:0x42指令会使得舵机strike模式速度变得很慢*->*已经修复*
2018.12.23
+ 统一本地调用和指令调用的函数接口,都调用同一套接口
+ 本地自动触发调用一套函数,用状态机控制,在什么状态调用哪几组函数
+ 定义好各种状态,用枚举变量,状态之间可以进行跳转,在app_main里面实现
+ user function后台有一直刷新,用户想要调用相关的函数,只能够通过修改参数表,而不是显示地调用函数
+ 声音播放存在一定的问题,有时候连续播放,有时候不播放
+ 每次只发送一条指令会比较稳定
+ 需要在底层实现emotion和rgb的分时控制,上层不用去分时
2018.12.24
+ 在主文件中定义好各种状态,每种状态下设置不同的生命灯、氛围灯、声音和表情的显示
+ 表情是静态地,可以一次性显示完成
+ 声音是周期性地,或者一次性地,或者随机地,要根据具体的状态来定
+ 生命灯的显示是动态地,可能**需要定义新的状态来控制,超出协议规定的那些条目**
+ 氛围灯的显示也是同上,需要自定义新增的功能函数
2018.12.26
+ 状态切换函数,如何进行状态切换逻辑编写
+ 关机状态检测,在关机前的一刻要播放关机声音和表情
+ 状态切换函数要运行在外部,监视整个系统的运行状态
+ 什么时候需要状体切换,就把状态切换函数放在什么地方
2018.12.31
+ 动态声音,动态表情如何实现,状态切换如何实现
+ 通过全局变量的标志来实现还是通过什么??
+ 改变状态只能够单次触发,不可以循环触发,否则会被反复修改
+ 喇叭响动的时候电流强度超过500mA
2019.1.1
+ pwm dma 要改为10ms刷新,自动发送的模式
+ 创建一个buffer,如果遇到dma正在执行,就把需要执行的dma通道暂时加入进去,待到dma中断结束再执行刚才没有执行的
+ OLED在更新的时候,会关闭中断,造成系统卡顿
+ 亮度和rgb灯的数量由当前电量来决定,输入的参数仅供参考
2019.1.2
+ LED根据血量来控制
+ 如果电量低了,就不再有氛围灯的变化,显示电量低的颜色
+ 或者每隔5s钟提示低电量状态
2019.1.20
+ 陀螺仪数据需要校准
+ iic需要改为硬件方式,不用模拟的方式
+ oled变化时快时慢
+ 喇叭声音不响,5v有电
+ timer1 ch2 ch3的dma和 iic 的 dma有冲突
+ rgb改为了timer1的2 3通道,未能成功点亮
+ timer1 中既包含rgb pwm,又包含servo pwm,不合理
2019.1.23
+ 添加adc电压读取功能
+ 添加测试手机app控制功能
+ 调试rgb颜色设置
+ 调试底盘运动
+ 软件库文件打包
2019.1.26
+ vscode intellisense 跳转有问题,有的可以跳转,有的跳转到错误的地方
+ 无法添加global.exe路径配置
+ 不知道如何在windows下运行ctags
+ 确定状态优先级和触发条件
+ 执行完了要有一个idle state,什么也不做
+ 如何知道已经执行完毕,一段声音播放完毕,一段动态led显示完毕,一段动态表情显示完毕???
+ 平时在idle status,如果有状态变化则进入相关的状态
+ 有时候启动的时候喇叭会没有声音,启动延时到5s也是这样
+ 发送出去了指令,但是audio芯片不一定响应,需要有三次重发机制
+ 重发也没有太大的作用,估计是内部会丢包,同时多发几包也会导致解包错误
2019.1.27
+ 状态控制问题,各种状态如何切换,如何中断和恢复
+ 低电量报警状态,休眠状态,充电状态,充满状态
+ 充满电充电管脚LED闪烁,增加GPIO的判断
2019.1.29
+ shell增加复位功能
+ 通过kfifo来控制状态切换
+ 从缓存里面读取新的状态,如果有新的状态存入,并且当前状态已经执行完毕的话,就可以载入新的状态
+ 需要新状态的切换不能连续调用,中间要有合理的时间间隔
-------------------
## TodoList
设计原则:尽量减少层与层之间的耦合,做到方便移植和理解
+ hal层(官方驱动库)
+ bps层 硬件接口层
+ module层(如果对象是复杂模块的话)
+ driver层
+ app层 用户通过driver层访问硬件读写操作,尽量不要直接调用底层函数
+ 对于一些层间的宏定义、结构体变量应该如何处理??
+ 需要修改bsp_uart.c结构体初始化中remap的实现方式,参考pw
+ 总结出一种适用于所有驱动的初始化方式