方法示意圖:
控制率公式:
其中theta是當前航向角與路徑航向角之差,e為橫向誤差,v為車輛速度,lambda為控制引數。
演算法步驟如下:
1. 根據當前定位結果找到路徑最鄰近點。
2. 計算該點與定位結果橫向誤差e與航線誤差theta。
3. 根據控制率公式計算出前輪轉角。
4. 將前輪轉角轉化為航向角,帶入運動模型計算出下一時刻的位姿。
matlab**如下:
clear all;close all;clc;結果如下:v = 1
;lambda = 3
;dt = 0.1
;l=2.5
;curp=[000
];x = 0:0.1:50
;y = sin(x/5
);path = [x'y'
];for i=2
:length(path)
dx = path(i,1)-path(i-1,1
); dy = path(i,2)-path(i-1,2
); path(i-1,3) =atan2(dy,dx);
endpath(length(path),
3) = path(length(path)-1,3
);plot(path(:,
1),path(:,2),'r.'
);hold on;
for i=1
:length(path)
d = path(:,1:2) - curp(1:2
); dis = d(:,1).^2 + d(:,2).^2
; [~,ind] = min(dis); %找路徑最近點索引
dx = curp(1) - path(ind,1
); dy = curp(2) - path(ind,2
);
e = (sin(curp(3) - atan2(dy,dx)))*sqrt(dx*dx+dy*dy); %橫向偏差
u = (path(ind,3) - curp(3)) + atan2(lambda*e,v); %期望前輪轉角
curp(
1) = curp(1) + dt*v*cos(curp(3
)); curp(
2) = curp(2) + dt*v*sin(curp(3
)); curp(
3) = curp(3) + dt*v*tan(u)/l;
plot(curp(
1),curp(2),'g.'
);end
綠色為跟蹤路徑,紅色為已知路徑。
參考:
matlab練習程式(DBSCAN)
和kmeans相比,不需要事先知道資料的類數。以程式設計的角度來考慮,具體演算法流程如下 1.首先選擇乙個待處理資料。2.尋找和待處理資料距離在設定半徑內的資料。3.將找到的半徑內的資料放到乙個佇列中。4.拿佇列頭資料作為當前待處理資料並不斷執行第2步。5.直到遍歷完佇列中所有資料,將這些資料記為一...
matlab練習程式(c c 呼叫matlab)
就我目前了解的c 呼叫matlab有兩種方法。第一種是通過matlab引擎呼叫,也就是這裡用到的方法。第二種是用matlab將m檔案編譯為相應的h lib dll檔案再加以呼叫。使用engine所用到的h和lib檔案基本在d program files matlab r2010b extern裡面,...
matlab練習程式(SUSAN檢測)
susan運算元既可以檢測角點也可以檢測邊緣,不過角點似乎比不過harris,邊緣似乎比不過canny。不過思想還是有點意思的。主要思想就是 首先做乙個和原影象等大的目標影象。然後用乙個圓形的模板,用模板去遍歷原影象每個畫素,把模板內的每個畫素都和模板中心畫素比較,如果灰度小於乙個閾值,那麼就對目標...