室外定位无人机软件开发
主要步骤
遇见问题
1.0 前置知识
- 硬件平台:凌霄飞控,GPS。
- 前置知识:C语言
1.1 步骤
- 接收 GPS 信息的驱动。
- PID 控制器调整。
- 路径写入。
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 PID 控制器
这部分主要问题在坐标系类型转换,需要将以世界坐标系输出的速度转换成无人机坐标系进行输出。
/*
|x2| |cosx, -sinx| |x1|
| | = | | | |
|y2| |sinx, cosx| |y1|
*/
void rot_vec_2(float in[2], float sinx, float cosx, float out[2])
{
out[0] = in[0] * cosx - in[1] * sinx;
out[1] = in[1] * cosx + in[0] * sinx;
}
我主要使用比较简单的二维平面的坐标系变换,角度就只用 yaw 角。当然最好用四元数进行三个维度的转换更加准而且没万向锁问题。
1.4 路径
路径这一步是比较简单的就是第一步先起飞,然后飞向第一个航点,再依次飞行,最后再降落。
2.0 遇见问题
2.1 飞控硬件问题
一开始装上 GPS 进行定点模式下飞行。定住两三秒后就不太受控了,一直不知道什么问题,GPS 数据什么的看上去很正常,但是忽略了磁罗盘,甚至换了 GPS 以为是震动使它有问题,结果还是一样。最后换了一个飞控终于正常了。
2.2 快速三角函数问题
一开始使用这个三角函数以为传一个角度,结果它是一个快速三角函数通过多项式快速计算只能 -PI 到 +PI 转换,不然就会很大很大。
double mx_sin(double rad)
{
double sine;
if (rad < 0)
sine = rad * (1.27323954f + 0.405284735f * rad);
else
sine = rad * (1.27323954f - 0.405284735f * rad);
if (sine < 0)
sine = sine * (-0.225f * (sine + 1) + 1);
else
sine = sine * (0.225f * (sine - 1) + 1);
return sine;
}
2.3 坚持
通过这次其实是个大创项目,我们前期没有意识到时间的重要性,以为有一年时间,一拖再拖。最后遇到飞控的问题,几乎都绝望了,但是我们没有放弃,坚持下去,最终完成了这个项目。