室外定位无人机
室外定位无人机软件开发
主要步骤
遇见问题
1.0 前置知识
- 硬件平台:凌霄飞控,GPS。
- 前置知识:C语言
1.1 步骤
- 接收 GPS 信息的驱动。
- 坐标转换。
- 路径写入。
1.2 驱动
1.2.0 GPS 协议 NMEA 和 UBlox 区分
主流 GPS 分为两种协议 NMEA 和 UBlox。NMEA 以 $ 开头 * 结束以字符串类型输出,UBlox 主要是以二进制输出,有专门的帧头,具体的协议解析要看相关文档。输出信息主要有用的数据是位置也就是经纬度、海拔高度、速度和相关精度。协议中一般会把这些关键数据放在一帧中方便使用。
1.2.1 GPS 对外接口
一般使用串口输出,不同协议除了输出也有专门的控制帧输入到 GPS 中,然后控制输出的数据可以专门输出一帧,或者设置波特率等等。
1.2.3 驱动程序
- NMEA可以通过最后异或校验,通过数逗号判断是哪个数据,然后将字符串转成数字。
- UBlox可以通过和校验,通过一个联合体,一个是 char 类型数组作为串口接收数据,然后一个真实数据类型的结构体,自动完成类型转换。
1.3 坐标转换
这部分主要问题在坐标系类型转换,需要将以世界坐标系输出的速度转换成无人机坐标系进行输出。
1 | /* |
我主要使用比较简单的二维平面的坐标系变换,角度就只用 yaw 角。当然最好用四元数进行三个维度的转换更加准而且没万向锁问题。
1.4 路径
路径这一步是比较简单的就是第一步先起飞,然后飞向第一个航点,再依次飞行,最后再降落。
2.0 遇见问题
2.1 飞控硬件问题
一开始装上 GPS 进行定点模式下飞行。定住两三秒后就不太受控了,一直不知道什么问题,GPS 数据什么的看上去很正常,但是忽略了磁罗盘,甚至换了 GPS 以为是震动使它有问题,结果还是一样。最后换了一个飞控终于正常了。后来寄回检修发现是磁罗盘坏了。
2.2 快速三角函数问题
一开始使用这个三角函数以为传一个角度,结果它是一个快速三角函数通过多项式快速计算只能 -PI 到 +PI 转换,不然就会很大很大。
1 | double mx_sin(double rad) |
2.3 坚持
通过这次其实是个大创项目,我们前期没有意识到时间的重要性,以为有一年时间,一拖再拖。最后遇到飞控的问题,几乎都绝望了,但是我们没有放弃,坚持下去,最终完成了这个项目。