前言:
考虑到传统方案是底盘运动控制是用单片机(下位机)完成,目标识别任务和决策是由nuc(上位机)完成,两者之间使用串口进行通信。
在ROS的学习和实践当中,有着明显的上下位机的界限,以stm32,mpu6050为例——stm32将imu的数据发送至上位机,上位机将底盘目标状态发送给stm32 。不难发现,在上下位机的方案中,数据的传输是非常浪费时间的。
那么简单的数据链是这样的:
mpu6050-(spi/i2c)->stm32-(uart)->nuc(计算)->stm32->执行机构(电机、舵机)
倘若使用无下位机方案:
mpu6050->nuc(计算)->执行机构(电机、舵机)
提问:
上下位机方案会导致系统不可避免地存在延时,为什么大家很少的采用无下位机方案,更多的是无上位机、上下位机这两种方案。
回答:
就我之见,因为系统不是实时的。也就是为什么会需要在stm32上运行RTOS。
倘若解决了上面这个问题,那么凭借着nuc远超单片机的性能,和PC端更多的可能性,我认为是可以采用无下位机方案的。
TODO
- RT-Preempt
常规意义上来讲,Linux并不算是一个实时操作系统,仅仅能实现软实时,我们可以通过打补丁的方式来实现硬实时,常用的补丁有:RT Preempt、Xenomai等。考虑在Ubuntu系统上打RT Preempt实时补丁来提高实时性。(安装链接:http://t.csdn.cn/6cotd)
https://docs.nvidia.com/jetson/archives/r35.1/DeveloperGuide/text/SD/Kernel/KernelCustomization.html#using-the-jetson-linux-real-time-kernel-package - PC的选择
这里的PC可以选nuc,树莓派,nvidia的边缘计算设备
我将使用NVIDIA Jetson Nano,配上由微雪出品的CAN/RS485拓展板 - imu的选择
Nano本身是有四个usb接口的,可以购买成品imu模块 - 执行机构的选择
结合现况,需要使用can总线电机
10月19日更新:
我使用的产品是jetson xavier nx 8Gb内存+16Gbemmc闪存版本,这里记录一下我的踩坑心得
- nx的板载CAN的使用
这里贴个链接
先看这个:http://t.csdn.cn/MGR6j
这个和上面对这看:http://t.csdn.cn/yXIcC
了解一下socketcan就好
吐槽一下,板载CAN接口:CAN_TX,CAN_RX,GND,3V3。实际上并不能直接和其他can设备相连,还得挂一个CAN控制器。不过回想起之前的经历,用的STM32F1的扳子,我也是在上面焊接了一个CAN控制器芯片,到也无所谓就是有点麻烦。 - nx的风扇不转
很无语的阿,刷机的时候选的jetpack包是5这个大版本,里面是ubuntu20,然后就和ubuntu18很不一样。具体的有人提问出来了http://t.csdn.cn/ZGTLm,总之是各种方法不能开机自动启动风扇。
最后的解决方法是重新刷系统,降到4.6,然后先安装jtop,http://t.csdn.cn/IZjcQ,然后在jtop里面,把风扇控制选择为默认,开启jetson时钟,然后加开机自启动。http://t.csdn.cn/av1yd - nx的系统迁移,将系统从emmc迁移到固态
不多说,贴链接http://t.csdn.cn/VwKBt,这篇博客里有个部分就是用的虚拟机,自己有双系统的就可以直接安装sdk_manager来刷系统。博客里面有两步没讲到,可以看看别的博客,例如这篇,http://t.csdn.cn/CAJYn,其中有一步叫做’弹出框选择manual setup->flash’,照着来就行。但是’可忽略错误’这里,点yes,然后等待一下就好了。