Pixhawk學習10 2 多旋翼位置控制

2021-10-05 11:56:24 字數 4195 閱讀 3854

10.1中介紹了目標位置點的計算邏輯,知道下一時刻的目標位置後,飛控需要根據當前位置進行計算,依次得到期望速度,期望拉力向量,期望姿態。至此就完成了多旋翼的位置控制。

1、期望速度計算

上篇計算得到期望位置之後,根據飛機當前位置,可知道位置差向量。在位置速度串級pid中,位置環只採用了比例,速度環採用了pid。

/* run position & altitude controllers, if enabled (otherwise use already computed velocity setpoints) */

if(_run_pos_control)

if

(_run_alt_control)

得到期望速度之後,主要進行了以下三步操作,用來規範真正的期望速度:

#限制最大水平速度

確保水平速度向量和大小在限制範圍內,對水平兩個速度進行等比例縮小;

/* make sure velocity setpoint is saturated in xy*/

float vel_norm_xy =

sqrtf

(_vel_sp(0

)*_vel_sp(0

)+_vel_sp(1

)*_vel_sp(1

));if

(vel_norm_xy > _params.

vel_max(0

))

#限制最大垂直速度確保垂直速度在限制範圍內,對垂向速度進行限制。

/* make sure velocity setpoint is saturated in z*/if(

_vel_sp(2

)<

-1.0f

* _params.vel_max_up)if(

_vel_sp(2

)> _params.vel_max_down)

#限制期望速度變化量(加速度)對當前和之前的期望速度做差,限制其變化量,即限制加速度值。

// limit total horizontal acceleration

math::vector<

2> acc_hor;

acc_hor(0

)=(_vel_sp(0

)-_vel_sp_prev(0

))/ dt;

acc_hor(1

)=(_vel_sp(1

)-_vel_sp_prev(1

))/ dt;if(

(acc_hor.

length()

> _params.acc_hor_max)

&!_reset_pos_sp)

// limit vertical acceleration

float acc_v =

(_vel_sp(2

)-_vel_sp_prev(2

))/ dt;if(

(fabsf

(acc_v)

>

2* _params.acc_hor_max)

&!_reset_alt_sp)

_vel_sp_prev = _vel_sp;

_global_vel_sp.vx =

_vel_sp(0

);_global_vel_sp.vy =

_vel_sp(1

);_global_vel_sp.vz =

_vel_sp(2

);

2.期望拉力向量計算拉力向量由期望速度和當前速度的差進行pid計算得到。

thrust_sp = vel_err.

emult

(_params.vel_p)

+ _vel_err_d.

emult

(_params.vel_d)

+ thrust_int;

得到期望拉力向量之後,又需要進行以下三種操作得到最終的實際期望拉力向量:

#確保公升力大於最小值

確保拉力向量的幅值不能小於最小拉力值,不至於飛機掉下去。

/* limit min lift */if(

-thrust_sp(2

)< thr_min)

#保證飛機不超過最大傾斜角限制最大傾斜角。利用z向的拉力值乘以最大傾斜角的正切,得到最大水平速度。並根據實際的水平和速度的幅值等比例縮小水平兩個速度。

/* limit max tilt */

if(thr_min >=

0.0f

&& tilt_max < m_pi_f /2-

0.05f)}

}

#限制最大推力如果拉力向量的幅值大於最大拉力,那麼讓水平期望拉力為零,z向拉力為拉力。

if(-

thrust_sp(2

)> thr_max)

else

3.期望姿態計算pix中的期望姿態由期望拉力向量和期望航向來計算。期望航向已經在路徑規劃時得到。

期望拉力向量其實是指定了機體的期望z軸,期望航向是指定了機體的期望z軸。

即,將拉力向量歸一化,就是往姿態矩陣 的第三列。

/* desired body_z axis = -normalize(thrust_vector) */

math::vector<

3> body_x;

math::vector<

3> body_y;

math::vector<

3> body_z;

if(thrust_abs > sigma)

else

將期望航向角通過三角函式變換在於姿態矩陣r_sp 的第三列叉乘就能得r_sp 的第一列。

/* vector of desired yaw direction in xy plane, rotated by pi/2 */

math::vector<

3>

y_c(

-sinf

(_att_sp.yaw_body)

,cosf

(_att_sp.yaw_body)

,0.0f);

if(fabsf

(body_z(2

))> sigma)

body_x.

normalize()

;

再通過叉乘r_sp 的第三列和第一列,就能得到完整的姿態矩陣。

/* desired body_y axis */

body_y = body_z % body_x;

/* fill rotation matrix */

for(

int i =

0; i <

3; i++

)

至此,就得到了期望的姿態矩陣,可將r轉換為四元數,或者直接求解水平期望姿態角。

/* copy quaternion setpoint to attitude setpoint topic */

matrix::quatf q_sp = r;

memcpy

(&_att_sp.q_d[0]

, q_sp.

data()

,sizeof

(_att_sp.q_d));

_att_sp.q_d_valid =

true

;/* calculate euler angles, for logging only, must not be used for control */

matrix::eulerf euler = r;

_att_sp.roll_body =

euler(0

);_att_sp.pitch_body =

euler(1

);

PX4飛行模式 多旋翼

遙控器輸入被轉換為橫滾 俯仰和偏航速度,當搖桿回中時飛行器不會保持平衡,可以用於翻滾等特技飛行。遙控器輸入在極限區域被轉換為橫滾 俯仰的角度和偏航的速度,否則被轉換為橫滾 俯仰和偏航角度。遙控器輸入被轉換為橫滾 俯仰的角度和偏航的速度,當搖桿回中後飛行器會保持平衡,之後會隨風或其他因素漂移。橫滾 俯...

空心杯四旋翼TinyLeaf 學習目錄

有一些內容已經寫好,但是部分內容與筆者的畢業設計相關,為避免 在查重時遇到麻煩,有一些章節要等到 查重結束後才能發布,敬請諒解!目錄 一級目錄 二級目錄 最後更新時間 介紹研討群 準備中 2020 1 14 github 準備中 2020 1 14 tinyleaf介紹 2020 1 18 教程ti...

多旋翼無人機拋飛實現流程 APM韌體

呼叫流程 arducopter.cpp fast loop update flight mode fight mode.cpp throw run 當機架構型為 或多旋翼機已經arm時,取消初始化。禁止進入拋飛模式 拋飛過程有兩個重要內容 1 手持無人機拋飛時,使電機不轉 保證安全 2 無人機處於空...