日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【UAV】光流传感器代码分析

發(fā)布時間:2025/4/5 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【UAV】光流传感器代码分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

圖片來源: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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。