[飛控]姿態控制-加速度轉傾斜角和四元數轉軸角函數解析
APM的姿態控制部分有大量的用於變換的函數,最近分析了兩個常用的函數,以前看代碼只看框架,覺得不就是姿態嗎,不就是歐拉角,四元數,旋轉矩陣嗎?現在看過演算法細節才知道每個演算法的實現背後都是嚴謹的物理假設和數學推導,基礎知識太重要,還有太多需要學習。
函數名:AC_PosControl::accel_to_lean_angles
位置:librariesAC_AttitudeControlAC_PosControl.cpp
用途:將NED坐標系下的期望加速度轉換成機體坐標系下的傾斜角度(pitch,roll)源程序:void AC_PosControl::accel_to_lean_angles(float accel_x_cmss, float accel_y_cmss, float& roll_target, float& pitch_target) const
{
float accel_right, accel_forward;
// rotate accelerations into body forward-right frame
accel_forward = accel_x_cmss*_ahrs.cos_yaw() + accel_y_cmss*_ahrs.sin_yaw();
accel_right = -accel_x_cmss*_ahrs.sin_yaw() + accel_y_cmss*_ahrs.cos_yaw();
// update angle targets that will be passed to stabilize controller
pitch_target = atanf(-accel_forward/(GRAVITY_MSS * 100.0f))*(18000.0f/M_PI);
float cos_pitch_target = cosf(pitch_target*M_PI/18000.0f);
roll_target = atanf(accel_right*cos_pitch_target/(GRAVITY_MSS * 100.0f))*(18000.0f/M_PI);
}
數學推導:
假設飛行器z軸受力平衡,即在z軸上保持靜止。
已知NED坐標系下期望加速度accel_x_cmss,accel_y_cmss(融合之後的加速度數據為NED坐標系下)和遙控輸入的yaw,求機體坐標系下pitch角和roll角。1.需要先將yaw角進行補償,即只剩下傾斜角。將NED坐標系下的水平加速度做繞z旋轉,得到沒有旋轉只有傾斜的中間狀態,該狀態下的x軸方向加速度為accel_forward,y軸加速度為accel_righ。NED坐標系轉機體坐標系繞z軸旋轉矩陣為: