室外定位无人机软件开发

室外定位无人机软件开发

主要步骤
遇见问题

1.0 前置知识

  • 硬件平台:凌霄飞控,GPS。
  • 前置知识:C语言

1.1 步骤

  1. 接收 GPS 信息的驱动。
  2. PID 控制器调整。
  3. 路径写入。

1.2 驱动

1.2.0 GPS 协议 NMEA 和 UBlox 区分

主流 GPS 分为两种协议 NMEA 和 UBlox。NMEA 以 $ 开头 * 结束以字符串类型输出,UBlox 主要是以二进制输出,有专门的帧头,具体的协议解析要看相关文档。输出信息主要有用的数据是位置也就是经纬度、海拔高度、速度和相关精度。协议中一般会把这些关键数据放在一帧中方便使用。

1.2.1 GPS 对外接口

一般使用串口输出,不同协议除了输出也有专门的控制帧输入到 GPS 中,然后控制输出的数据可以专门输出一帧,或者设置波特率等等。

1.2.3 驱动程序

  1. NMEA可以通过最后异或校验,通过数逗号判断是哪个数据,然后将字符串转成数字。
  2. 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 坚持

通过这次其实是个大创项目,我们前期没有意识到时间的重要性,以为有一年时间,一拖再拖。最后遇到飞控的问题,几乎都绝望了,但是我们没有放弃,坚持下去,最终完成了这个项目。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值