# Work To be done & optimized - **待完成**:不完成可能导致整车功能不完整 - **待优化**:对已有的功能进行性能提高/模块解耦/可维护性增强 - **待添加**:不紧急的/锦上添花的功能 **==标为黄色高亮的代表紧急程度高。==** ## assorted - [ ] 由于我们读写和传递的数据结构都不大,基本不会发生读写时任务切换的情况。典型的数据读写时间都是~μs,故没有对数据访问的接口添加互斥锁或关闭全局中断。后续有需求(如大量数据复制)可以添加。可以新增一个bsp_mutex或者module层的ds,提供相应支持。实际上freertos提供了一些供线程(任务)间进行数据交互的类型和函数,请查阅对应文档。 最简单的防止重入或数据竞争的方式是创建一个bool类型值实现互斥访问。当一个线程或中断要访问某个变量时,先检查这个变量对应的bool锁是否为1,若不为1则赋值为1表明当前有线程访问变量,之后可以开始对该变量的操作,结束读写后释放锁即赋0。不像osSemaphore或osMessageQueue等只允许在中断中添加消息或释放信号量/互斥量,这种变量锁可以在任意处加锁解锁。 若锁获取失败,则直接退出,或将当前线程挂起等待下一次唤醒。最常见的情况是一个线程需要从一块数据区或缓冲区读取数据而某个中断会向这个区域写入数据,线程在读取的时候很可能会被中断打断。那么中断进入时发现该数据已经被上锁,就不会强行写入。为了保证数据的实时性,你可以选择将数据存入队列或启动一个新的任务,当锁释放时再写入数据。如果数据量较小,你不在乎开销,则可以使用freerots提供的osMessageQueue或osMessageMailbox。 目前,我们在bsp_dwt中添加了一个位锁,防止中断中调用DWTGetDeltaT或DWTGetTimeline函数更新DWT维护的时间时打断任务中的相同函数导致计数被重复更新,或引起错误的DWT溢出检测。 ## BSP ### 待完成 ### 待优化 #### bsp_pwm - [ ] 是否允许修改预分频计数器? ### 待添加 #### bsp_iic - [ ] 添加10位地址的支持 #### bsp_blueteetch - [ ] 增加蓝牙功能,方便调试和测试 #### bsp_wifi - [ ] 增加无线局域网功能,方便调试和测试 --- ## Module ### 待完成 Unicom - [ ] 为键鼠/遥控器/ps手柄/视觉上位机等各种控制器提供一套统一的接口,把发来数据转化为标准的控制数据,包括底盘速度云台角度等等 - [ ] 给每个模块增加调试的条件编译,并增加bsp log的输出。或直接在运行时添加log等级,输出不同的信息。 #### ==servo_motor== 舵机模块,需要预先定义90/180/360连续旋转的电机类型,并且能够设定max和min位置。 - [x] 编写舵机模块(待测试和优化) - [ ] 可能需要串口舵机的支持? #### imu - [ ] 完善bmi088模块和算法的交互,添加异步量测更新的SO3上的IEKF > 继续使用四元数(S3)也许是一个更好的选择,改动较小且运算开销也较小。后续考虑修改一套ESKF_INS并移植到框架中。 #### ==master_machine== - [ ] 增加IMU数据的时间戳 - [ ] 增加加速度计数据 - [ ] 重构seasky protocol的接口 - [ ] 增加数据未更新的处理 需要一个更简单的协议以加快速度。若有必要,可能需要重新编写一个简单的调试上位机UI。 ### 待优化 #### buzzer > 是否需要在module层就和**daemon**模块配合? 当前实现为buzzer是单独的module,若需要蜂鸣器警报的module可以自行包含buzzer.h以创建不同情况下的警报,如电机离线、堵转、遥控器离线等。 也许还有其他方式提醒离线和异常。 目前急需一个无线遥控继电器,防止机器人的急停模式失效。 #### BMI088 - [ ] 完善和SO3 IEKF的交互,增加异步任务的唤醒和数据传递(IMU中断唤起任务) 根据BMI088的datasheet在初始标定完成后将gyro和acc都设置为中断触发,当数据准备好时传感器会在对应的引脚输出跳变,通过EXTI捕获跳变并触发中断,在回调函数中启动SPI DMA传输。陀螺仪数据来到时进行姿态的预测即propagation,加速度计数据到来时进行量测更新(correct)。 也许需要找到一种更好的方式构建INS任务以方便和其他模块、应用的交互。 另外,若要进一步提升自瞄效果,在姿态得到更新时(陀螺仪和imu的数据到来时),需要额外的引脚连接到相机上完成硬触发采集,以获得更好的时间对齐效果,防止视觉得到的姿态数据发生漂移。目前视觉端假设姿态更新的频率是1khz(当前每次完成姿态解算都会向上位机发送当前的姿态) #### remote_control - [ ] 增加长按/短按检测 (是否有必要?) #### message_center - [ ] 增加队列剩余信息和数据时间戳的支持 - [ ] 提供直接传递指针的接口? #### can_comm - [ ] 增加can_comm数据未更新的处理 #### controller - [ ] 将PID的初始化改写为PIDRegister的形式,在controller统一分配内存. #### dji_motor - [ ] 增加3508和2006的开环零位校准函数 - [ ] 为实例增加低通滤波系数变量,使不同电机有不同的配置 #### LKmotor - [ ] 正反转标志位设置,需要修改反馈量和pid计算 #### HTmotor - [ ] 正反转标志位设置,需要修改反馈量和pid计算 ### 待添加 #### unicomm - [ ] 完成初版构建 #### step_motor - [ ] 增加步进电机模块 #### referee_communication - [ ] 增加裁判系统多机通信功能 #### controller - [ ] 增加扰动观测器,可能需要新增模块 - [ ] 增加基于模型的控制器,可能需要新增模块 #### ws2816 - [ ] 通过bsp_pwm添加支持 --- ## APP ### 待完成 #### all app - [ ] 增加调试的条件编译,使得在没有连接其他应用时也可以假装有那些应用而正常调试运行 #### ==shoot== - [ ] 增加卡弹检测和反转 ### 待优化 #### robot_cmd - [ ] 优化消息发布和接收性能(若皆为异步并在robottask中执行,实际上可以只传递指针) #### gimbal - [x] 增加底盘速度前馈控制 #### chassis - [x] 根据电机的实际速度计算底盘的真实运动(轮式里程计) - [ ] 若为双板,根据IMU的数据对电机实际速度进行融合