# 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 + 总结出一种适用于所有驱动的初始化方式