2021-08-23 10:50:03 索炜达电子 912
项目编号:E480
文件大小:29M
源码说明:带中文注释
开发环境:C编译器
简要概述:
下位机STM32端无人船/无人车程序,配合树莓派、英伟达Jetson Nano等上位机端程序使用
系统架构方面:
STM32采用类操作系统式框架,任务可分不同频率被调用。优点是该框架可以提高系统灵活性,降低系统耦合性。这么做的还有许多无人机飞控厂家,如crazypony等。
下位机工程可选择编译,只需要改动一个宏定义,系统即可进行相应改变,自动选择传感器元件。主要应用于对GY901与MPU6050+HML5883两套惯性测量装置同时兼容,无缝切换。
传感器上电自动自检,自动校准,保障数据精度
GPS模块采用先进的UBX协议,系统上电前自动配置GPS输出必要信息,滤除不必要信息,大幅提高数据处理效率
系统核心方面:
上、下位机内部数据缓冲区采用先进的环形缓冲区,大幅降低数据高速传输时的丢包率,提高上下位机对数据处理速度
STM32采用有限状态机设计,可通过遥控器进入不同状态,执行不同操作。提高系统灵活性。
采用先进的Madgwick梯度下降姿态解算算法,较以前的卡尔曼滤波方法大幅降低了下位机对数据迭代的次数,采用此方法仅需10Hz的采样速度即可收敛至当前载具的姿态
Madgwick梯度下降姿态解算算法,这是最终实现的算法。首先它的好处就是对迭代次数、传感器采样频率要求很低,而这恰好弥补了Kalman滤波器的缺点——吃性能。由于下位机采用STM32F1系列,时钟频率最高72Mhz,这也就使想要在32上同时采用姿态解算算法和控制是不太可行的。梯度下降实际上是一种在机器学习中应用的比较广泛的算法,普遍用在优化问题上。也就是说,梯度下降中的“下降”可以理解为使一个函数的输出值与理论值之间误差逐步下降,用在姿态解算上也就是使解算姿态与真实姿态之间误差逐步下降。
GPS模块由于需要实时接收大量数据,严重占用MCU任务处理时间,因此加入了DMA。并且在工程中配置为DMA与中断处理两种可选方式选择编译,提高了效率、灵活性。
功能拓展方面:
可设置的载具模型(汽车模型、海上模型)可最优化使用GPS输出数据,GPS输出数据将根据所选模型进行适配。
可在Google Map上标点直接导出为载具轨迹
GPS模块使用Ublox的M8(有一块自带HMC5883磁力计的版本)
姿态传感器使用MPU6050
遥控器使用WFR07\WFT07 具体连线请参考本目录下的两幅图片
车体电机说明:
使用前两个轮子使用舵机转向(舵机型号与连线参考本目录下的舵机线.png)
后两个轮子各用一个电机驱动(使用PID控制两电机转速基本相同)。
如果车体不同,直接删掉原脚本,按照相类似的函数定义方法在脚本中修改即可
1.将本文件下载到某个文件夹下
2.打开Keil5,编译,下载到STM32中
3.按照【STM32资源使用情况.xlsx】表格,将相应的传感器连线
以上就可以了。此外,如果不连接上位机的话,将只能遥控控制;如果接了上位机,则可以进行定点巡航、采点等。
STM32型号为ZET6,由于使用了定时器8,因此必须使用大容量产品。
上位机负责和地面站通信,路线规划等等,可以移植到ROS上。
下位机就用比较简单的架构,大体上就是把姿态解算、电机控制等任务分5,10,50,100Hz的频率运行。
树莓派使用Python脚本在后台以进程的形式运行(如果使用的是非ROS版上位机程序的话)
建议使用非ROS版上位机程序,原因:开发环境容易配置(只需要Python),并且稳定性好。
开发无人船过程中参考的传感器手册以及算法资料
开发日志记录了项目从一开始的立项到后面一步步测试成功的大大小小细节。前后由于放弃了旧的姿态算法、选取了新的姿态算法,因此前期关于姿态的说明仅供参考用。
通信协议的部分已摘抄出来,放在该目录下。即:整体框架与通信协议.docx
Periphrals文件夹存储STM32的外设硬件部分代码
Software文件夹存储STM32软件部分代码,即PID算法等
CONFIGURATION.h头文件用于设置、条件编译等
initialize.c为STM32初始化时运行的代码
语音提示GPS连接情况、机体运行情况等。(只需要给上位机接一个小音箱)
使用遥控器控制
采集GPS坐标:此时在使用遥控器控制的同时,上位机在后台记录当前GPS坐标点
输入GPS坐标,自主导航。(输入坐标的方法可用Google Earth采点或使用之前采集的GPS坐标)
目录│文件列表:
│ CONFIGURATION.h
│ STM32资源使用情况.xlsx
│ WFR07.jpg
│ WFT07.jpg
│ 舵机线.png
├ Libraries
│ ├ CMSIS
│ │ │ License.doc
│ │ └ CM3
│ │ ├ CoreSupport
│ │ │ │ core_cm3.c
│ │ │ └ core_cm3.h
│ │ └ DeviceSupport
│ │ └ ST
│ │ └ STM32F10x
│ │ │ stm32f10x.h
│ │ │ system_stm32f10x.c
│ │ │ system_stm32f10x.h
│ │ └ startup
│ │ ├ arm
│ │ │ │ startup_stm32f10x_cl.s
│ │ │ │ startup_stm32f10x_hd.s
│ │ │ │ startup_stm32f10x_hd_vl.s
│ │ │ │ startup_stm32f10x_ld.s
│ │ │ │ startup_stm32f10x_ld_vl.s
│ │ │ │ startup_stm32f10x_md.s
│ │ │ │ startup_stm32f10x_md_vl.s
│ │ │ └ startup_stm32f10x_xl.s
│ │ ├ gcc_ride7
│ │ │ │ startup_stm32f10x_cl.s
│ │ │ │ startup_stm32f10x_hd.s
│ │ │ │ startup_stm32f10x_hd_vl.s
│ │ │ │ startup_stm32f10x_ld.s
│ │ │ │ startup_stm32f10x_ld_vl.s
│ │ │ │ startup_stm32f10x_md.s
│ │ │ │ startup_stm32f10x_md_vl.s
│ │ │ └ startup_stm32f10x_xl.s
│ │ ├ iar
│ │ │ │ startup_stm32f10x_cl.s
│ │ │ │ startup_stm32f10x_hd.s
│ │ │ │ startup_stm32f10x_hd_vl.s
│ │ │ │ startup_stm32f10x_ld.s
│ │ │ │ startup_stm32f10x_ld_vl.s
│ │ │ │ startup_stm32f10x_md.s
│ │ │ │ startup_stm32f10x_md_vl.s
│ │ │ └ startup_stm32f10x_xl.s
│ │ └ TrueSTUDIO
│ │ │ startup_stm32f10x_cl.s
│ │ │ startup_stm32f10x_hd.s
│ │ │ startup_stm32f10x_hd_vl.s
│ │ │ startup_stm32f10x_ld.s
│ │ │ startup_stm32f10x_ld_vl.s
│ │ │ startup_stm32f10x_md.s
│ │ │ startup_stm32f10x_md_vl.s
│ │ └ startup_stm32f10x_xl.s
│ └ STM32F10x_StdPeriph_Driver
│ ├ inc
│ │ │ misc.h
│ │ │ stm32f10x_adc.h
│ │ │ stm32f10x_bkp.h
│ │ │ stm32f10x_can.h
│ │ │ stm32f10x_cec.h
│ │ │ stm32f10x_crc.h
│ │ │ stm32f10x_dac.h
│ │ │ stm32f10x_dbgmcu.h
│ │ │ stm32f10x_dma.h
│ │ │ stm32f10x_exti.h
│ │ │ stm32f10x_flash.h
│ │ │ stm32f10x_fsmc.h
│ │ │ stm32f10x_gpio.h
│ │ │ stm32f10x_i2c.h
│ │ │ stm32f10x_iwdg.h
│ │ │ stm32f10x_pwr.h
│ │ │ stm32f10x_rcc.h
│ │ │ stm32f10x_rtc.h
│ │ │ stm32f10x_sdio.h
│ │ │ stm32f10x_spi.h
│ │ │ stm32f10x_tim.h
│ │ │ stm32f10x_usart.h
│ │ └ stm32f10x_wwdg.h
│ └ src
│ │ misc.c
│ │ stm32f10x_adc.c
│ │ stm32f10x_bkp.c
│ │ stm32f10x_can.c
│ │ stm32f10x_cec.c
│ │ stm32f10x_crc.c
│ │ stm32f10x_dac.c
│ │ stm32f10x_dbgmcu.c
│ │ stm32f10x_dma.c
│ │ stm32f10x_exti.c
│ │ stm32f10x_flash.c
│ │ stm32f10x_fsmc.c
│ │ stm32f10x_gpio.c
│ │ stm32f10x_i2c.c
│ │ stm32f10x_iwdg.c
│ │ stm32f10x_pwr.c
│ │ stm32f10x_rcc.c
│ │ stm32f10x_rtc.c
│ │ stm32f10x_sdio.c
│ │ stm32f10x_spi.c
│ │ stm32f10x_tim.c
│ │ stm32f10x_usart.c
│ └ stm32f10x_wwdg.c
├ obj
│ └ Template.hex
├ Output
│ └ UAS.hex
├ Project
│ │ Eastar_UAS.uvguix.85234
│ │ Eastar_UAS.uvoptx
│ │ Estello_UAS.uvguix.85234
│ │ Estello_UAS.uvoptx
│ │ Estello_UAS.uvprojx
│ │ EventRecorderStub.scvd
│ │ JLinkSettings.ini
│ │ Template.uvguix.85234
│ └ Template.uvoptx
└ User
│ Inclusion.h
│ initialize.c
│ main.c
│ stm32f10x_conf.h
│ stm32f10x_it.c
│ stm32f10x_it.h
│ system_stm32f10x.c
│ system_stm32f10x.h
├ COMPASS
│ │ COMPASS.c
│ └ COMPASS.h
├ DATAFUSION
│ │ DATAFUSION.c
│ └ DATAFUSION.h
├ Delay
│ │ delay.c
│ └ delay.h
├ EXT
│ │ ext.c
│ └ ext.h
├ FILTER
│ │ FILTER.c
│ └ FILTER.h
├ GeneralFunction
│ │ General_fucntion.c
│ └ General_fucntion.h
├ GPS
│ │ GPS.c
│ └ GPS.h
├ IIC
│ │ IIC.c
│ └ IIC.h
├ IMU
│ │ IMU.c
│ │ IMU.h
│ └ MPU6050.h
├ InputCapture
│ │ input_capture.c
│ └ input_capture.h
├ INPUT_CAPTURE
│ │ INPUT_CAPTURE.c
│ └ INPUT_CAPTURE.h
├ LoopSequence
│ │ Loop.c
│ └ Loop.h
├ Motor
│ │ Motor.c
│ └ Motor.h
├ NRF24L01
│ └ NRF24L01.c
├ PathPlanning
│ │ PathPlanning.c
│ └ PathPlanning.h
├ PID
│ │ PID.c
│ └ PID.h
├ PWM
│ │ pwm.c
│ └ pwm.h
├ RingBuff
│ │ ring_buff.c
│ └ ring_buff.h
├ TD
│ │ TD.c
│ └ TD.h
├ Usart
│ │ USART.c
│ └ USART.h
├ WDG
│ │ WDG.c
│ └ WDG.h
└ WirelessUSART
│ WirelessPort.c
└ WirelessPort.h