【RM2020 圆桌】第二期 步兵代码的那些问题
11207
1
124
2020-01-07
面对官方已开源的步兵代码,你是有如神助,还是依旧满头问号呢?
现在给你机会,来向我们的攻城狮提出你所有的困惑!
60分钟实时问答圆桌,等你来一次问个够!
【圆桌时间】:2020年1月9日(周四) 19:30-20:30
【圆桌主题】:步兵代码的那些问题
【圆桌嘉宾】:论坛ID @陈小豪右边童鞋
DJI嵌入式工程师
【主持人】:@RoboMaster赛务
【圆桌流程】:19:30-20:30 实时问答环节 (嘉宾与论坛网友)
(是的,你没看错,本期全由你们来做主提问,所以快来问问题吧!可在此帖下面留言问题,攻城狮会优先回答哦)
【相关内容】RoboMaster 2020官方机器人文件说明
温馨提示:
在直播期间,大家可以直接移步至论坛活动版块,https://bbs.robomaster.com/forum-technology-1.html,直播墙会自动实时更新文字内容。
我们将挑选出三位优秀提问者送出电机福袋各一份~
本期获得福袋的三个ID是:
Evan-GH
superdoggy
北极星耀
请联系微信赛务号邮寄信息(附上自己的ID截图哦)
华丽分割线
主持人:分享一个重大的好消息:RoboMaster开发板C型嵌入式软件教程文档以及例程今天在Github上刚刚开源,大家速速前往查看:https://github.com/RoboMaster/Development-Board-C-Examples。 请大家火速扩散!
1. Q:关于CAN控制电机的问题我比较好奇,也有些疑惑……希望能够得到解答。
例程在CAN控制电机方面,似乎是使用了中断接收CAN回报的各种信息,如果我没有记错的话是1kHz发送的报文。然后在RTOS中开了一个线程来尽可能快的解析收到的信息并计算PID,向电机发出PID计算出的目标电流值,并且这个线程执行速度应该远快于1kHz。
所以如果说电机回报的速度是1kHz,那么理论上PID的执行频率如果大于1kHz,是否可以说PID计算出来的信息就是重复的呢?如果是重复的,那以1kHz的速度发送控制数据包,是否可以达到同样的控制效果?
另外在我自己实验的时候发现,单纯发送一帧数据哪怕电流给到最大值,电机也不会转动。只有当以一定频率(印象中是100Hz)发送的时候,电机才会转动。但是无论是以100Hz的频率发送数据包还是以1kHz的频率发送数据包,电机的转速都没有显著的变化。
其中电调对CAN控制的处理机制让我很不解,查阅大量资料未果,希望得到一些解答。例如,是否一帧控制帧在电调内有着一定时间的生命周期,每包在下一包到来之前都会维持当前电流环目标值一定的时间?如果能略加指点,不胜感激!
例程在CAN控制电机方面,似乎是使用了中断接收CAN回报的各种信息,如果我没有记错的话是1kHz发送的报文。然后在RTOS中开了一个线程来尽可能快的解析收到的信息并计算PID,向电机发出PID计算出的目标电流值,并且这个线程执行速度应该远快于1kHz。
所以如果说电机回报的速度是1kHz,那么理论上PID的执行频率如果大于1kHz,是否可以说PID计算出来的信息就是重复的呢?如果是重复的,那以1kHz的速度发送控制数据包,是否可以达到同样的控制效果?
另外在我自己实验的时候发现,单纯发送一帧数据哪怕电流给到最大值,电机也不会转动。只有当以一定频率(印象中是100Hz)发送的时候,电机才会转动。但是无论是以100Hz的频率发送数据包还是以1kHz的频率发送数据包,电机的转速都没有显著的变化。
其中电调对CAN控制的处理机制让我很不解,查阅大量资料未果,希望得到一些解答。例如,是否一帧控制帧在电调内有着一定时间的生命周期,每包在下一包到来之前都会维持当前电流环目标值一定的时间?如果能略加指点,不胜感激!
A:控制频率应该与数据反馈频率相一致,对于不一致场景 ,通常是使用串级PID ,外内环频率不一致,但对应PID频率应该是需要一致的,对于控制不了电机问题,应该检测CAN发送函数,或者使用逻辑分析仪采集发送的can包,以确认是否消息发送,或者使用一些官方demo程序,发送全固定值进行检测。
补充一下: 电调内部是做了CAN消息处理,在一段时间未收到CAN消息后,停止转动
2. Q:我们的步兵云台有pitch轴电机、摩擦轮电机,拨弹盘电机四个电机,全都用的can控制,但是每次运行时要么只有pitch动要么只有摩擦轮和拨弹盘动,代码里谁的输出在前面谁动,每个电机都有反馈,都有输出,id也没有问题,不动的电机的输出一直显示最大(pitch电机单独一个can发送,两个摩擦轮和拨弹电机一个can发送)。有人说是can发送队列太多,导致发送错误,我们云台一共两个电机的can发送、两个给底盘数据的can发送,四个应该不多吧,底盘的can队列比云台还要多也没有问题。如果确实是队列太多,应该怎么解决,每个can发送最多几个队列。我们尝试过在两个电机can发送之间加了1ms的延时,几个电机都可以动了,但是延时不应该在程序里留着,不是长久之策。几个电机、电调、电路板都是好的,全都单独测试过,也更换过,一直出现同样的错误。
A:CAN带宽应该是够的,应该是程序或者硬件问题, 试着使用一些demo例程进行检查
3. Q:官方开源的是github的还是robomaster.com官网2016开源的代码?官方代码是直接适用开发板A型吗?开发板A型是427芯片,若移植到407会需要哪些修改?谢谢!
A:官方开源过ICRA以及2016 2019,2020外赠步兵程序,本次以外赠步兵代码讲解, ICRA程序不在本次圆桌谈论, 移植到407需要修改对应的硬件配置,接口配置等。
4. Q:步兵电控组在和视觉组对接时,视觉组会给我们传回pitch轴和yaw轴的数据,视觉组传来的数值不是固定的,一直在一定的范围内变化(可能是云台不稳造成的),所以使云台一直抖动(pitch轴一直上下震,因为pitch一直追视觉那个变化的值)这个问题只靠调内外环pid可以解决吗,还是应该先处理数值,像取个平均值,还有那个卡尔曼滤波加上之后,好像没有什么变化,甚至有的时候更加的震。如果需要处理数据有什么好办法。
5. Q:在步兵刚刚检测到装甲板的时候,视觉传回的pitch轴的数有一个越变,突然数值变得很大,云台就会使劲震一下,在不到1秒之后数值恢复到正常范围,云台也恢复正常。我们应该怎样处理这个值,有什么好办法。
4&5A:不推荐在嵌入式端进行处理, 对于视觉的数据,应该由视觉的同学来保证数据稳定性, 基本的要求都应该是数据应该是收敛的, 如果需要嵌入式端进行处理,我觉得这个可以使用一下中值滤波,去除反复跳变的数据
6. Q: 目前参赛队伍的机器人主控采用的多为STM32,STM32的CAN收发器Fifo的深度仅有3,这就导致了如果CAN线上设备过多则容易试得在某些时刻丢失掉部分数据,或者是CAN线上有一个发送速率很快(比如远超1KHz)的设备持续发送信息也会导致有时无法解析到其他设备(电调等设备都是1KHz)的报文信息,请问官方在这一方面有什么方法解决吗?
A: 如果是stm32未能及时处理,可以试试将CAN的中断优先级提高,或者添加临界区保证不被其他任务打断
7. Q:B版的官方程序 枪口热量还有底盘功率的数据来源于哪里?裁判系统里面并没有赋值也有没有调用呀(小哥哥 回复我一下)
A:来源于裁判系统的电源模块上的用户串口,需要用3pin串口线连接到C板的3pin串口,故而需要需要一套裁判系统主控和裁判系统电源模块
8. Q:想知道CAN总线控制电机和PWM控制电机的区别,就除了接线数量的差别外,还有什么呢?对这个不是特别了解
A:使用CAN可以获取到电机的转速 角度等消息,但需要自己实现控制,如果PWM控制电机,内置控制器,可以认为是当一个舵机使用
9. Q: c620的dome的
MX_FREERTOS_Init();
osKernelStart();
这两函数缺少一个都不行,debug测试第二个函数是发送数据的能详细说一下这两个函数吗
A: 这两句是cubemx软件生成的, 第一句是创建对应的任务,第二句是开启操作系统的运行, 如果少第一句,操作系统只会运行idle任务, 少第二句,操作系统都没有启动
MX_FREERTOS_Init();
osKernelStart();
这两函数缺少一个都不行,debug测试第二个函数是发送数据的能详细说一下这两个函数吗
A: 这两句是cubemx软件生成的, 第一句是创建对应的任务,第二句是开启操作系统的运行, 如果少第一句,操作系统只会运行idle任务, 少第二句,操作系统都没有启动
10. Q:官方开源的步兵代码中PID计算采用的是位置式PID,官方是否有对比过在不同控制情况下(比如功率控制)采用增量式PID和位置式PID达到稳态的控制过程中哪个控制效果更好吗?
A:增量型和位置型PID并没有哪个更好的说法, 对于不同的应用场景,应该选择不同的PID类型
11. Q:请问为什么做键盘鼠标控制时,即使是鼠标左右直接控制底盘的旋转模式下,在调试的时候步兵底盘 转的一卡一卡的(遥控器控制的时候正常),还有就是用键盘控制的时候,在不给信号后,电机就会突然制动,感觉对电机伤害很大,在做键盘控制的时候,在程序逻辑上有什么需要注意的地方吗?谢谢
A:鼠标一卡一卡,没有遇见过,程序中遥控器的赋值控制地方和鼠标赋值控制的地方是一样的吗会不会两个地方处理的时间不同,或者灵敏度的问题, 在键盘控制控制上 对于底盘应该设置控制目标值应该是逐步增大,使用斜波或者一阶滤波方式给定会比较好
12. Q:请问官方代码有在控制端做视觉自瞄角度的滤波以及预测处理吗
A:没有,外赠步兵的代码没有对视觉的处理
A:没有,外赠步兵的代码没有对视觉的处理
13. Q:官方开源的步兵代码中,对于Dbus的空闲中断接收采用了双缓冲区处理,这样做有什么好处吗?
A:正常情况下,区别不大,但是在如果进DBUS中断,又被另一个中断打断,另一个中断处理后,返回DBUS中断,这时候DBUS又来一帧数据,可能导致数据处理错误防止程序如果在处理中
14. Q:做视觉C++比python好吗?
A:因人而异
A:因人而异
15. Q:请问云台控制线程的运行频率在多少会比较适合,还是要需要根据装甲检测的频率来动态调整吗?
A:设置1000Hz或者500Hz, 视觉的装甲检测频率? ,可以对视觉进行控制目标的优化
A:设置1000Hz或者500Hz, 视觉的装甲检测频率? ,可以对视觉进行控制目标的优化
16. Q:请问一下,官方开源的步兵代码中的遥控器是运用PB6(uart1)接收数据,进行处理得到ch的值,那么用DMA中断比用串口直接中断有什么好处
A:节约CPU时间,同时减少进入中断次数
A:节约CPU时间,同时减少进入中断次数
17. Q:使用的是A板,上面18个GPIO口可以自己随意设置,想接受其他传感器返回的数据(支持AD或I2C),想问下大家是写的GPIO模拟口还是用的自己的板子?
A:18GPIO有ADC的IO,也有I2C spi接口,都可以,根据走线或者精度要求决定是不是使用stm32上的ADC
A:18GPIO有ADC的IO,也有I2C spi接口,都可以,根据走线或者精度要求决定是不是使用stm32上的ADC
18. Q:RoboMaster开发板C型的主芯片具体是什么型号?
A: stm32f407ig
A: stm32f407ig
19. Q:官方开源的步兵代码中OLED采用的是STM32的硬件IIC,然后网络上经常能看到对于STM32硬件IIC不好用的吐槽,在实际使用中也的确遇到过其硬件IIC总线宕机的情况,请问官方在测试过程中有没有遇到这个问题呢?又是如何解决的
A:I2C硬件是因为如果需要使用到DMA,如果使用模拟I2C 每次通信需要传输1025个字节,占CPU资源比较多,遇见过I2C死机,所以添加了detect任务,如果发现死机,重启I2C,目前自测觉得没有问题
A:I2C硬件是因为如果需要使用到DMA,如果使用模拟I2C 每次通信需要传输1025个字节,占CPU资源比较多,遇见过I2C死机,所以添加了detect任务,如果发现死机,重启I2C,目前自测觉得没有问题
20. Q: robomaster.com官网2016开源的代码会否有些过时?还是同样适用现在的开发板A、B板?
A:已经开源了2019 2020年外赠步兵,可以在帖子的顶楼的下载链接, 同时C板在GitHub开源一套教程文档和教程例程
A:已经开源了2019 2020年外赠步兵,可以在帖子的顶楼的下载链接, 同时C板在GitHub开源一套教程文档和教程例程
21. Q:代码中6020电机的数据返回 返回的是什么数据
A:详见6020说明书
A:详见6020说明书
22. Q:官方开源的步兵代码中,support文件夹下有一个名为mem_manager4.c的文件,而CubeMX软件生成工程时在FreeRTOS的中间层文件中也有一个关于内存分配的heap4.c文件,这里support文件夹下的文件作用是什么呢?
A:mem_manager4.c是使用单字节解包的裁判系统解包,的FIFO相关文件, heap4.c是freeRTOS内存管理相关文件
A:mem_manager4.c是使用单字节解包的裁判系统解包,的FIFO相关文件, heap4.c是freeRTOS内存管理相关文件
23. Q:可以简单讲解一下官方步兵代码对于小陀螺模式下的底盘运动控制方式吗,能否做到在小陀螺模式下正常的进行方向移动
A:使用到一个旋转角度操作,将底盘运动角度旋转到云台对应角度,可以看chassis_task.c内的follow_gimbal_yaw的相关代码
A:使用到一个旋转角度操作,将底盘运动角度旋转到云台对应角度,可以看chassis_task.c内的follow_gimbal_yaw的相关代码
24.Q: void CAN1_RX0_IRQHandler(void)
{
HAL_CAN_IRQHandler(&CAN1_Handler);
}
void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan)
小哥哥 从标准库转换到hal库对can中的这几个函数理解有点迷糊,能具体说一下吗
A:这个是hal生成的回调函数,hal为了将中断的一些消除标志位等等操作进行处理, 用户就只需要关心对应数据回调接口
{
HAL_CAN_IRQHandler(&CAN1_Handler);
}
void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan)
小哥哥 从标准库转换到hal库对can中的这几个函数理解有点迷糊,能具体说一下吗
A:这个是hal生成的回调函数,hal为了将中断的一些消除标志位等等操作进行处理, 用户就只需要关心对应数据回调接口
25. Q:请问官方的PID调参大概是怎样做的,有什么比较简单高效的方法或者技巧分享吗?
A: PID调试需要结合波形调试,多使用一些上位机显示波形工具,也可能看C型板教程中的 16章节,有对PID的参数进行讲解, 同时学习好理论知识也很有用
A: PID调试需要结合波形调试,多使用一些上位机显示波形工具,也可能看C型板教程中的 16章节,有对PID的参数进行讲解, 同时学习好理论知识也很有用
26. Q:官方开源的步兵中使用的IMU芯片和之前内测的RM陀螺仪配置很像,请问是同款吗?
A:是
A:是
27. Q:用官方代码后,某个电机掉线其他电机能否正常运行,并且以亮灯形式报错?
A:2020年机器人代码是以OLED屏幕 蜂鸣器 和USB串口三种方式, 2019是通过LED灯显示
A:2020年机器人代码是以OLED屏幕 蜂鸣器 和USB串口三种方式, 2019是通过LED灯显示
28. Q:云台控制时,斜坡信号输入有什么作用啊
A:一般是底盘斜坡输入,云台输入是一般是摇杆值和鼠标值 叠加到角度,相当与给了斜坡慢慢增加, 不过对视觉信号可能是阶跃信号,可根据情况进行处理吧
A:一般是底盘斜坡输入,云台输入是一般是摇杆值和鼠标值 叠加到角度,相当与给了斜坡慢慢增加, 不过对视觉信号可能是阶跃信号,可根据情况进行处理吧
29. Q:开源代码中的freeRTOS文件是关于什么的?我看着cube里面也有这个文件,作用一样吗
A:freeRTOS是cubemx生成的,2019年代码是标准库,需要移植freeRTOS官网的代码,freeRTOS文件夹便是放官网freeRTOS代码的
30. Q:代码以LED报错以后,其他没有掉线电机还能不能遥控呀
A:没有明白?应该是机器人在启动的时候,如果云台电机出现问题, 云台不能正常控制,同时底盘会认为云台没有启动,为了安全起见,将底盘也进入保护状态, 机器人正常使用都应该在所有电机正常运动中,如果需要特殊情况,需要修改代码
A:没有明白?应该是机器人在启动的时候,如果云台电机出现问题, 云台不能正常控制,同时底盘会认为云台没有启动,为了安全起见,将底盘也进入保护状态, 机器人正常使用都应该在所有电机正常运动中,如果需要特殊情况,需要修改代码
31. Q:底盘速度值反馈震动厉害 如果要是给速度滤波的话用什么滤波办法比较好,自己的车底盘跑起来感觉不是很顺滑,陀螺的室友云台也有频率比较高的颤抖 请问这是底盘PID输出震荡导致的吗
A:中值或者低通, 或者使用MATLAB设置数字滤波, 云台最好在底盘的几何中心,底盘震动, 云台当然也会受到干扰
32. Q:陀螺仪初始化部分,领飘处理能不能提前测好偏移量,然后每次上电都固定的减去那个偏移量。温度闭环对零飘的影响大吗
A:零漂有保存进入flash中,如果只使用flash保存零漂值,可以不使用开机校准的,使用开机能保证开机后的稳定 温度闭环有必要
A:零漂有保存进入flash中,如果只使用flash保存零漂值,可以不使用开机校准的,使用开机能保证开机后的稳定 温度闭环有必要
33. Q:请问这个c板咋烧录啊。。。。。那个usb没有识别成串口欸
A:可以使用SWD方式或者 DFU方式,其中SWD用到stlink 或者jlink, DFU需要更改boot配置
A:可以使用SWD方式或者 DFU方式,其中SWD用到stlink 或者jlink, DFU需要更改boot配置
34. Q:为什么rtos选择了freertos?和其他的比freertos优势有哪些?
A:开源,简单,cubemx学习起来方便,也不必拘泥操作系统类型,对其他操作系统有兴趣,也可以学习 以及 如果用xxx操作,这个问题就便是为什么是ucos?
A:开源,简单,cubemx学习起来方便,也不必拘泥操作系统类型,对其他操作系统有兴趣,也可以学习 以及 如果用xxx操作,这个问题就便是为什么是ucos?
35. Q:在使用FreeRTOS时,任务数比较多的情况下就需要考虑优先级和任务间隔时间,在实际使用中就有发生过某个任务一直被抢占的情况,请问官方在分配任务时一般会采用什么原则呢
A:重要的任务优先级高, rm机器人目前使用上的任务大都不是特别需要消耗cpu,对比较消耗CPU的任务,需要进行优化
A:重要的任务优先级高, rm机器人目前使用上的任务大都不是特别需要消耗cpu,对比较消耗CPU的任务,需要进行优化
36. Q: keil的编译器也支持c++,c和c++比,优势在哪里?
A:c++也能用,C++是C的超集(如果没有记错) 如果是觉得C++的继承和多态等特性,是你想需要使用到的功能,可以使用
A:c++也能用,C++是C的超集(如果没有记错) 如果是觉得C++的继承和多态等特性,是你想需要使用到的功能,可以使用
37. Q: C板的程序可以移植到A板上吗
A:可以
A:可以
关联专栏
RoboMaster 课程沙龙
文章标签
请问这篇文章对你有用吗?
【RM2020 圆桌】第二期 步兵代码的那些问题