1、 创 新 实 验 学 院 实 践 报 告研究室名称: 传感器与人机交互研究室 课 程 名 称 : 机电专题研究(一) 立 项 题 目:基于传感器的飞行器姿态控制系统院 系: 创新实验学院 班 级: 创电 0901 学生姓名: 王瑜敏 学 号: 200901207 完成日期: 2011 年 12 月 10 日大连理工大学创新实验学院分数: 1基于传感器的飞行器姿态控制系统一、 设计内容综述四旋翼飞行器是一种电动的、能够垂直起降的、多旋翼式飞行器。由于具有广阔的军事和民用前景,使其成为了当前的研究热点。四旋翼飞行器有两个关键问题:飞行器姿态解算和飞行控制。姿态解算的精度将直接影响飞行控制算法的稳定
2、性、可靠性和实现的难易程度,所以姿态解算是飞行控制实现的前提。随着MEMS 技术以及计算机技术的发展,小型飞行器航姿测量普遍采用低成本的捷联惯性导航技术测量单元(IMU),其主要由低成本的陀螺仪、加速度传感器和电子罗盘组成。陀螺仪具有温度漂移特性,加速度传感器会受到飞行器飞行过程中机体振动的影响,同时电子罗盘是一种磁阻传感器,容易受到外部磁场的干扰。因此,如何融合IMU 多传感器的数据,滤除外部干扰,得到高可靠性、高精度的姿态数据,是一项非常具有挑战性的工作。扩展卡尔曼滤波器算法是一种高精度,在飞行器中应用非常广泛的姿态解算算法,但是建立其稳定可靠的更新方程是比较困难的,而且其计算量很大,对处
3、理器的运算速度和精度要求很高,不适合小型飞行器的嵌入式微控制器。互补滤波器算法以其简单可靠的优点,在飞行器姿态解算中的应用愈加广泛。互补滤波器对惯性器件的精度要求较低,特别适合于廉价的IMU。本文基于互补滤波器算法,设计了适合四旋翼飞行器的姿态解算算法。实验结果表明,本算法能够长时间输出高精度姿态数据,完全满足飞行控制的要求。2、 总体架构小型四旋翼飞行器涉及到飞行器设计、传感器技术、机器人技术、嵌入式系统开发、自动控制理论和应用的等诸多技术领域。如右图图一所示为小型四旋翼飞行器的整体框架:图一 总体框架 2在飞行器航姿参考系统中,根据三轴陀螺仪的角速度输出,使用斱向余弦矩阵法解算小型四旋翼飞
4、行器的姿态,采用高效的单位正交化算法对斱向余弦矩阵进行校正;根据陀螺仪和加速度传感器、数字罗盘的测量结果在频域上的特点,使用互补滤波器对多传感器结算结果进行数据融合,有效提高了姿态测量的精度。图 2 飞行器姿态控制系统我们设计通过使用如下的传感器对飞行器的飞行姿态进行测量:虽然陀螺仪动态响应良好,但是测量姿态时会产生积累误差。相比陀螺仪,数字罗盘和加速度传感器最大的优点就是输出丌会随时间发生漂移,没有积累误差,但是动态响应较差。两者在频域上具有互补特性,满足互补滤波器的使用条件,可以采用互补滤波器对三种传感器的姿态数据进行融合,以提高测量精度3、 各模块原理、方法及实现飞行器的偏航角不会影响重
5、力加速度矢量的方向,而且滚转角和俯仰角也不会影响飞行器的航向,所以两路校正之间是解耦的,不会相互干扰,分为两路的策略是合理的。四旋翼飞行器大部分时间处于悬停、匀速飞行阶段,此时加速度传感器只受机体高频振动的干扰,而且在起飞、降落和加减速阶段,其加速度相对重力加速度较小,而且持续时间很短,最终会被互补滤波器滤除。因此,可以将加速度传感器的数据作为机体重力加速度的测量结果。由互补滤波器估计的重力加速度矢量3为旋转矩阵R 的第3 行,其与加速度传感器测量的重力加速度的单位矢量的偏差,即为俯仰和滚转角误差,其值为两个矢量的叉乘。以上小型四旋翼飞行器的动力学模型,使用加速度斱程描述飞行器的位移,使用角加
6、速度斱程描述飞行器的姿态角,因此飞行控制算法需要完成对位置和姿态两个环节的控制。在动力学模型的基础上,将小型四旋翼飞行器实时控制算法分为两个控制回路,即位置控制回路和姿态控制回路。4、 讨论和计划通过大三上学期的学习与制作,我们对基于传感器的飞行器姿态控制系统有了整体的设计框架,学习了传感器:加速度传感器、陀螺仪和数字罗盘,在本学期也制作了一个基于 ADXL345 加速度传感器的指控小车,运用操作简单的 89C51 单片机进行控制,通过对 ADXL345 的控制读取 x,y,z 轴的加速度数值,一方面显示到1602 液晶屏上进行实时的监测控制,另一方面通过单片机控制小车遥控模块,实现手拿加速度
7、传感器便可以如实的模拟控制小车向前、向后、左转、右转,设计独特新颖。通过实物的设计与调试,我学会了熟练使用的 ADXL345 加速度传感器,并能够通过 II2C 总线模式控制传感器。如下是我们的设计框图:4图 3 基于 ADXL345 加速度传感器的指控小车原理框图在上学期学习了项目所需的硬件知识后,我们将会按照如下分工进行实物的制作与调试: 组长:惠明通 负责硬件电路的设计与制作 组员:王瑜敏 负责相关传感器的操作,学习 ARM32 的使用 组员:罗 进 负责软件编程 这学期学会了使用 ADXL345 加速度传感器后,我会在下学期的时候努力学习陀螺仪、数字罗盘的使用,与组员们团结协作,将实物
8、在下学期的时候制作出来并进行调试与检测。5附录: (原理图、PCB、源代码等,不超过 3 页)1、利用 ADXL345 传感器制作的指控小车的实物图2、以下代码为使用 ADXL345 加速度传感器获取 x,y,z 轴的加速度值,通过89SC51 单片机控制液晶屏显示的部分程序:/*ADXL345.C#include #include /Keil library #include #include#include#include#includevoid main() unsigned int i;delay(500);init_com();Init_ADXL345();while(1) /循环d
9、elay(100);Multiple_read_SHEBEI(0xA6,0x32);display_x(); /-显示 X 轴display_y(); /-显示 Y 轴display_z(); /-显示 Z 轴6delay(100); /*xianshi.H /*Reluctance.h*void Single_Write_SHEBEI(uchar SlaveAddress,uchar REG_Address,uchar REG_data) IIC_Start(); /起始信号SHEBEI_SendByte(SlaveAddress); /发送设备地址+写信号SHEBEI_SendByte(R
10、EG_Address); /内部寄存器地址,请参考中文 pdf SHEBEI_SendByte(REG_data); /内部寄存器数据,请参考中文 pdfIIC_Stop(); /发送停止信号/*void Multiple_read_SHEBEI(uchar SlaveAddress,uchar address) uchar i;IIC_Start(); /起始信号SHEBEI_SendByte(SlaveAddress); /发送设备地址+写信号SHEBEI_SendByte(address); /发送存储单元地址,从 0x32 开始IIC_Start(); /起始信号SHEBEI_Send
11、Byte(SlaveAddress+1); /发送设备地址+读信号for (i=0; i6; i+) /连续读取 6 个地址数据,存储中 BUFBUFi = SHEBEI_RecvByte(); /BUF0存储 0x32 地址中的数据if (i = 5)SHEBEI_SendACK(1); /最后一个数据需要回 NOACKelseSHEBEI_SendACK(0); /回应 ACK IIC_Stop(); /停止信号Delay5ms();void Init_ADXL345() Single_Write_SHEBEI(0xA6,0x31,0x0B); /测量范围,正负 16g,13 位模式Sin
12、gle_Write_SHEBEI(0xA6,0x2C,0x08); /速率设定为 12.5 参考 pdf13 页Single_Write_SHEBEI(0xA6,0x2D,0x08); /选择电源模式 参考 pdf24 页Single_Write_SHEBEI(0xA6,0x2E,0x80); /使能 DATA_READY 中断Single_Write_SHEBEI(0xA6,0x1E,0x00); /X 偏移量 根据测试传感器的状态写入 pdf29 页Single_Write_SHEBEI(0xA6,0x1F,0x00); /Y 偏移量 根据测试传感器的状态写入 pdf29 页Single_
13、Write_SHEBEI(0xA6,0x20,0x05); /Z 偏移量 根据测试传感器的状态写入 pdf29 页/*dingyi.h7#define uchar unsigned char#define uint unsigned int#define DataPort P0 /LCD1602 数据端口sbit SCL=P10; /IIC 时钟引脚定义sbit SDA=P11; /IIC 数据引脚定义sbit RS=P20; /LCD1602 命令端口sbit RW=P21; /LCD1602 命令端口sbit E=P22; /LCD1602 命令端口 /#define SlaveAddre
14、ss 0x3C /定义器件在 IIC 总线中的从地址/uchar SlaveAddress;typedef unsigned char BYTE;typedef unsigned short WORD;BYTE BUF8; /接收数据缓存区 uchar ge,shi,bai,qian,wan; /显示变量int dis_data; float X1;float Y1;float Z1;int x;int y;int z;int Hx;int Hy;void DisplayOneChar(uchar X,uchar Y,uchar DData)YXif(Y)X|=0x40;X|=0x80;write_commend(X);write_data(DData);void init_com()RW =0;delay(10);write_commend(0x02);delay(10);write_commend(0x38);delay(10);write_commend(0x38);delay(10);write_commend(0x38);write_commend(0x0c);write_commend(0x06);write_commend(0x01);write_commend(0x01);