我看過幾種三輪全方位底盤的控制方法,感覺不好了解,我在這裡簡單的分享一下我的一種思路。
對于場地坐标系的速度Vx,Vy推導到三個輪子的速度一共有兩個矩陣公式就能解決。
第一個公式,場地坐标系速度Vx,Vy,W轉換到機器人坐标系速度vx,vy,w公式:
角theta是機器人坐标系的x軸正方向與場地坐标系y軸正方向的夾角,最終theta所帶值為與陀螺儀偏航角有關的一個變量。
這個公式推導一下也是很友善的,無論定位系統如何安裝,這個公式不會變的!!!
第二個公式,這個公式需要你人為的推導一下。我舉一個典型例子:
1,機器人坐标系與機械結構關系如圖(x軸與2号輪平行)
将vx,vy分别分解到輪子方向速度,規定的輪子正方向如白色箭頭所示。
計算v1:
v1 = vx’ + vy’ +wL;(L為三輪底盤中心到輪中心的距離)
v1 = -vx * cos(60) - vy*sin(60) + w*L;
明顯v2 = vx + w*L;
另外将計算v3:
v3 = vx’+ vy’+ w*L;(L為三輪底盤中心到輪中心的距離)
即v3 = -vx*cos(60) + vy*sin(60) + w*L;
注意,分解速度的時候一定朝着規定的輪子正方向分解!!!
是以,第二個矩陣誕生了!基本上問題就得到解決了。
将第一個矩陣帶入第二個矩陣問題得解,之後可以通過三角公式進行化簡。便于我以後友善調試,我就當記筆記把後面的步驟寫下來吧!
将第一個矩陣帶入後得到下列方程:
計算得:
看到這些公式覺得親切嗎?
sin(A+B) = sin(A)*cos(B) + cos(A)*sin(B);
cos(A+B) = cos(A)*cos(B) - sin(A)*sin(B);
sin(A-B) = sin(A)*cos(B) - cos(A)*sin(B);
cos(A-B) = cos(A)*cos(B) + sin(A)*sin(B);
利用它們化簡得:
其他情況都這樣推導就行,第一個矩陣不會改變,我們隻需手演算即可。
這是我對該情況封裝的函數:
typedef struct
{
float v1;
float v2;
float v3;
}ActThreeVell;
ActThreeVell ThreeWheelVellControl2(float Vx, float Vy, float angularVell)
{
#define AFA 60
#define L 2ActThreeVell vell;
theta = ;
vell.v1 = (float)(-cos((AFA + theta) / *) * Vx - sin((theta + AFA) / *) * Vy + L * angularVell);
vell.v2 = (float)(cos(theta / *) * Vx + sin(theta /*) * Vy + L * angularVell);
vell.v3 = (float)(-cos((AFA - theta) / * ) * Vx + sin((AFA - theta) / *) * Vy + L * angularVell);
return vell;
}