【UAV】光流传感器代码分析
圖片來源:STM32四軸 學(xué)生 航模四軸 光流定點(diǎn)懸停 無人機(jī)DIY開源四軸開發(fā)板
文章目錄
- 光流分析
- 光流數(shù)據(jù)結(jié)構(gòu)體
- 光流輸出數(shù)據(jù)結(jié)構(gòu)體
- void Flow_Receive(u8 data) // 串口1解析光流模塊數(shù)據(jù)
- void Pixel_Flow_Fix(float dT) // mini光流數(shù)據(jù)濾波融合,dT 設(shè)定了 0.006
- void Flow_Pos_Controler(float dt) // 位置定點(diǎn)控制器 光流
- 程序流程圖
光流分析
光流數(shù)據(jù)結(jié)構(gòu)體
// 光流數(shù)據(jù)結(jié)構(gòu)體 struct _flow_ {float flow_x; // 光流原始數(shù)據(jù)float flow_y; // 光流原始數(shù)據(jù)float flow_x_i;float flow_y_i;u8 qual; // SQUAL 環(huán)境質(zhì)量u8 ok;float flow_High;u8 ssi;u8 ssi_cnt; // u8 err; }; struct _flow_ mini光流輸出數(shù)據(jù)結(jié)構(gòu)體
// 光流輸出數(shù)據(jù)結(jié)構(gòu)體 struct _pixel_flow_ {float x_i; // x軸積分原始值float y_i; // y軸積分原始值float fix_x_i; // x軸積分濾波值float fix_y_i; // y軸積分濾波值float ang_x; float ang_y; float gyr_x; float gyr_y; float out_x_i; // x軸積分輸出值float out_y_i; // y軸積分輸出值float out_x_i_o; float out_y_i_o; float dx; float dy; float x; // x軸速度原始值float y; // y軸速度原始值float fix_x; // x軸速度融合值float fix_y; // y軸速度融合值float loc_x;float loc_y;float loc_xs;float loc_ys;float fix_High; }; struct _pixel_flow_ pixel_flow; //光流輸出數(shù)據(jù)結(jié)構(gòu)體_flow_?mini\_flow\_ \Rightarrow mini_flow_?mini
_pixel_flow_?pixel_flow\_pixel\_flow\_ \Rightarrow pixel\_flow_pixel_flow_?pixel_flow
void Flow_Receive(u8 data) // 串口1解析光流模塊數(shù)據(jù)
這個函數(shù)主要是把原始光流數(shù)據(jù)讀取到 mini.flow_x, mni.flow_y 中,并累加到 mini.flow_x_i, mini.flow_y_i 變量中。
void Flow_Receive(u8 data) // 串口1解析光流模塊數(shù)據(jù) mini.flow_x = ((s16)(*(RxBuffer+3)<<8)|*(RxBuffer+2)); // 得到光流測量的 x 方向數(shù)據(jù) mini.flow_y = ((s16)(*(RxBuffer+5)<<8)|*(RxBuffer+4)); // 得到光流測量的 y 方向數(shù)據(jù)mini.flow_x_i += mini.flow_x ; mini.flow_y_i += mini.flow_y ;void Pixel_Flow_Fix(float dT) // mini光流數(shù)據(jù)濾波融合,dT 設(shè)定了 0.006
這個函數(shù)最后更新了兩個變量 pixel_flow.loc_x, pixel_flow.loc_y 和 pixel_flow.loc_xs, pixel_flow.loc_ys。
void Pixel_Flow_Fix(float dT) // mini光流數(shù)據(jù)濾波融合,dT 設(shè)定了 0.006 // 積分位移值單位轉(zhuǎn)換為:厘米 pixel_flow.loc_x = pixel_flow.out_x_i * cpi; pixel_flow.loc_y = pixel_flow.out_y_i * cpi;// 微分速度值單位轉(zhuǎn)換為:厘米/秒 pixel_flow.loc_xs = pixel_flow.fix_x * cpi; pixel_flow.loc_ys = pixel_flow.fix_y * cpi;void Flow_Pos_Controler(float dt) // 位置定點(diǎn)控制器 光流
了解此光流到控制的函數(shù)之前,先明確存儲數(shù)據(jù)的變量名稱:
外環(huán) Flow_PosPid_x, Flow_PosPid_y
內(nèi)環(huán) Flow_SpeedPid_x, Flow_SpeedPid_y
這里通過光流位置變量 pixel_flow.loc_x 達(dá)到更新內(nèi)環(huán)輸出 Flow_SpeedPid_x.desired 的目的。
注意,這里需要結(jié)合源代碼來看,因?yàn)檫€牽扯到控制邏輯
// 記錄位置 一次 Flow_PosPid_x.desired = pixel_flow.loc_x; // 記錄位置 // 刷新位置期望 Flow_PosPid_y.desired = pixel_flow.loc_y; // 記錄位置 // 刷新位置期望// 外環(huán)位置控制 Flow_PosPid_x.measured = pixel_flow.loc_x; // 實(shí)時位置反饋 pidUpdate(&Flow_PosPid_x,dt); // 位置運(yùn)算PID Flow_PosPid_y.measured = pixel_flow.loc_y; // 實(shí)時位置反饋 pidUpdate(&Flow_PosPid_y,dt); // 位置運(yùn)算PID// 內(nèi)環(huán)期望 Flow_SpeedPid_x.desired = LIMIT(Flow_PosPid_x.out,-1000,1000); // 位置PID輸出給速度期望 Flow_SpeedPid_y.desired = LIMIT(Flow_PosPid_y.out,-1000,1000); // 位置PID輸出給速度期望// 內(nèi)環(huán) Flow_SpeedPid_x.measured = pixel_flow.loc_x; // 速度反饋 pidUpdate(&Flow_SpeedPid_x,dt); // 速度運(yùn)算 Flow_SpeedPid_y.measured = pixel_flow.loc_y; // 速度反饋 pidUpdate(&Flow_SpeedPid_y,dt); // 速度運(yùn)算程序流程圖
總結(jié)
以上是生活随笔為你收集整理的【UAV】光流传感器代码分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python】利用 pytessera
- 下一篇: 【UAV】高度控制代码分析