高速巡線演算法
A. 怎麼讓舵機停下來
以後程序記得寫清楚點,規范化一點,還有,需要有必要的注釋好不好,不然人家怎麼知道你的d1是幹嘛的?
這里我當做是你的筆誤吧
「
// oji1();
」
前面的「//」應該沒有的吧
你的意思應該是:
不斷執行oji1();
同時不斷檢測按鍵之類的。
你想想,你進入了oji1();
當你按下d1後,它怎麼能停下來呢,因為d1放在了oji1();的後面
而且你想要實現及時反應的話,你的演算法本身就有問題。
想過另外一個演算法吧。
要不就把問題補充詳細點,我幫你想一個。
對了我這里有個自己以前做巡線小車的程序,拿去看看吧
#include<reg52.h> //頭文件
#define uchar unsigned char //宏定義
#define uint unsigned int
sbit infl1=P3^4; //inf代表紅外對管,1為外,2為內。
sbit infl2=P3^5;
sbit infr2=P3^6;
sbit infr1=P3^7;
sbit pwm=P1^0; //信號線
uchar jd,count;
void time_init() //中斷初始化
{
TMOD=0x01;
TH0=0xff; //高電平單位脈沖時間定為方式1,晶振頻率為11.0592,0.1ms
TL0=0xa3;
IE=0x82;
TR0=1;
}
void time_ini()interrupt 1 //中斷函數
{
TH0=0xff; //重新賦新值
TL0=0xa3;
if(count<jd)
pwm=1;
else pwm=0;
count++;
count=count%200; //脈沖周期20ms
}
void keyscan() //按鍵掃描
{
if(infr1==0)
{
jd=11;
count=0;
while(infr1==0);
}
if(infr2==0)
{
jd=13;
count=0;
while(infr2==0);
}
if(infl1==0)
{
jd=19;
count=0;
while(infl1==0);
}
if(infl2==0)
{
jd=17;
count=0;
while(infl2==0);
}
}
void main()
{
jd=15; //舵機初始角度為90度,自己定義為0度
count=0;
time_init();
while(1)
{
keyscan();
}
}
B. 簡述激光雷達的結構原理分類及特點
激光雷達發射器先發射激光,經過物體( O b j e c t ObjectObject )反射後被 C M O S CMOSCMOS (一種圖像感測器,即圖中 I m a g e r ImagerImager )捕捉,設捕捉點為 x 2 x_2x
2
。現過焦點 O OO 作一條虛線平行於入射光線,交 I m a g e r ImagerImager 於 x 1 x_1x
1
,由於 β \betaβ 已知,所以可得到 x 1 x_1x
1
的位置。記 x 1 , x 2 x_1,x_2x
1
,x
2
之間距離為 x xx,易得左右兩個三角形相似,所以有:q f = s x \frac{q}{f}=\frac{s}{x}
f
q
=
x
s
,又有 s i n β = q d sin\beta=\frac{q}{d}sinβ=
d
q
,二者聯立可得 d = s f x s i n β d=\frac{sf}{xsin\beta}d=
xsinβ
sf
.
這樣就可得到物體到激光發射器的距離 d dd 了,激光雷達將這樣的發射器和接收器組裝在一起,經過機械旋轉360°即可得到一周障礙物的距離。
TOF測距原理
由三角測距的計算公式不難發現,當距離 d dd 很大時,每變化 δ d \delta dδd 引起的 x xx 變化很小,導致精度下降,這就限制了測量范圍。
而TOF(Time of flight)原理克服了測量距離這一難點,並且提高了精度:
TOF原理十分簡單,就是利用光速測距。首先激光發射器發射激光脈沖,計時器記錄發射時間;脈沖經物體反射後由接收器接受,計時器記錄接受時間;時間差乘上光速即得到距離的兩倍。
TOF原理看似簡單,但是實現起來確有很多難點:
計時問題:由於光速過快,測量時間會變得很短。據網上數據得:1cm的測量距離對應65ps的時間跨度。這需要計時器的精確度很高。
脈沖問題:發射器需要發射高質量的脈沖光,接收器接受脈沖光的時候需要盡量保持信號不失真。
對於同一距離的物體測距時,得到的回波信號可能不一樣,如下圖的黑白紙,這就需要特殊的處理方式來處理。
但總的來說TOF原理的精度遠遠超過三角測距,只是由於諸多難點導致成本略高。像大一立項時因為沒錢,所以用的三角測距的思嵐A1,精度不是很高。而ROBOCON戰隊里的sick激光雷達就是TOF原理,精度非常高,貴是有道理的~
雷達分類
機械激光雷達
機械激光雷達使用機械部件旋轉來改變發射角度,這樣導致體積過大,加工困難,且長時間使用電機損耗較大。但由於機械激光雷達是最早開始研發的,所以現在成本較低,大多數無人駕駛公司使用的都是機械激光雷達。
MEMS激光雷達
MEMS全稱Micro-Electro-Mechanical System,是將原本激光雷達的機械結構通過微電子技術集成到硅基晶元上。本質上而言MEMS激光雷達是一種混合固態激光雷達,並沒有做到完全取消機械結構。
主要原理為:通過MEMS把機械結構集成到體積較小的硅基晶元上,並且內部有可旋轉的MEMS微振鏡,通過微振鏡改變單個發射器的發射角度,從而達到不用旋轉外部結構就能掃描的效果。
大致原理如下圖:
相控陣激光雷達
兩列水波干涉時會出現某處高某處低的情形:
光學相控陣原理類似干涉,通過改變發射陣列中每個單元的相位差,合成特定方向的光束。經過這樣的控制,光束便可對不同方向進行掃描。雷達精度可以做到毫米級,且順應了未來激光雷達固態化、小型化以及低成本化的趨勢,但難點在於如何把單位時間內測量的點雲數據提高以及投入成本巨大等問題。
動態原理圖如下:
FLASH激光雷達
FLASH激光雷達原理非常簡單:在短時間內發射出一大片覆蓋探測區域的激光,再以高度靈敏的接收器,來完成對環境周圍圖像的繪制。
激光雷達的數據
分成N份
分成M份
N線點雲數據
1線點雲數據
時間戳
1個點雲數據
點雲數量M
X方向偏移量
Y方向偏移量
Z方向偏移量
反射強度
激光雷達數據的處理順序一般為:
數據預處理(坐標轉換,去雜訊)
聚類(根據點雲距離或反射強度)
提取聚類後的特徵,根據特徵進行分類等後處理工作。
激光雷達數據的處理順序一般為:
數據預處理(坐標轉換,去雜訊)
聚類(根據點雲距離或反射強度)
提取聚類後的特徵,根據特徵進行分類等後處理工作。