移动机器人(四)四轴飞行器

四轴飞行控制原理

四轴飞行器在空间上有6个自由度,分别是沿3个坐标轴进行平动和转动,通过对四个旋翼的转速控制来实现,6个自由度方向的运动姿态分别为:垂直升降、俯仰角度、前后飞行、横滚角度、左右侧向飞行。
四轴飞行器机体结构有“X”型和“+”型两种,我们通过“X”型进行飞行控制的讲解
移动机器人(四)四轴飞行器_第1张图片

类似麦克纳姆轮,螺旋桨转动产生的力除了垂直向上的升力,还有一个切向的空气的反作用力如图红色箭头),通过组合每一个螺旋桨的切向力,我们可以实现飞行器在空间中的运动。M1 和 M3 的螺旋桨物理结构上是相同的,M2 和 M4 相同(和前者是手性对称的,如果都相同机体不出意外也会跟着旋转),它们的旋转方向也是相反的。
移动机器人(四)四轴飞行器_第2张图片

(1)垂直升降:当四个电机输出平衡时飞行器垂直运动,这点我们通过设置相同的 PWM 值可能无法实现,因为电机的物理状况有所差异。为此我们引入 PID 闭环控制,并通过姿态传感器进行姿态的观测。
(2)俯仰/前后运动:M1 和 M2 电机输出更大,机体会出现如图的翻转,并且向后运动。
移动机器人(四)四轴飞行器_第3张图片

(3)横滚/左右运动类同(2),M1 和 M4 获得更大输出。
(4)偏航角度:M1 和 M3 获得更大输出,此时航向逆时针偏转。

动力分配

可以发现,机体的运动和机体姿态密切相关,机体向哪边倾斜,也会同时向哪边运动。因此,飞四轴时我们很大程度是通过控制姿态来控制它怎么飞。结合 code ,电机除了 thr_temp(throttle) 的一个基本动力分配外,还有结合姿态输出分配的控制量,约定输出为正时,绕相应坐标轴逆时针旋转。(代码和上面图片对电机的编号有出入)

	int16_t thr_temp;
	thr_temp = Remote.thr - 1000;	// 从遥控处接收油门值

	if (Remote.thr < 1020) // 油门过低
	{
		MOTOR1 = MOTOR2 = MOTOR3 = MOTOR4 = 0;
		break;
	}
	MOTOR1 = MOTOR2 = MOTOR3 = MOTOR4 = LIMIT(thr_temp, 0, 900); // 基本动力分配(垂直运动)

	MOTOR1 += +pidRateX.out - pidRateY.out - pidRateZ.out; // 结合姿态输出分配各个电机的控制量
	MOTOR2 += +pidRateX.out + pidRateY.out + pidRateZ.out;
	MOTOR3 += -pidRateX.out + pidRateY.out - pidRateZ.out;
	MOTOR4 += -pidRateX.out - pidRateY.out + pidRateZ.out;

IIC

移动机器人(四)四轴飞行器_第4张图片
I2C 属于两线式串行总线,由飞利浦公司开发用于 MCU 和外围设备进行通信的一种总线,属于一从多主的总线结构。总线上的每个设备都有一个特定的设备地址,以区分同一 I2C 总线上的其它设备。I2C 接口有串行时钟线(SCL)和串行数据线(SDA)组成,可用于发送和接收数据。通信均由主设备发起,从设备被动响应。

串级PID

移动机器人(四)四轴飞行器_第5张图片
PID 控制器属于无模型控制(十分神奇)。(仿真实验比较难模拟物理世界的“反馈”)
串级 PID是由两个 PID 模型“串联”而成,角度环(又称外环)的输出作为角速度环(又称内环)的输入。角速度由陀螺仪直接测出,不易受到干扰,相比角度通过多重传感器融合计算得到,反应更加迅速,解决飞行器失衡和跟随滞后问题。

参考

https://zhuanlan.zhihu.com/p/503219395 IIC通信(软硬件实现)

你可能感兴趣的:(机器人学,算法)