1、機械手頭部相機與龍門架頭部相機的區別? 上篇文字講解了機械手頭部相機標定原理及方法,中間有提到只適用於龍門架,那為什麼呢? 答:龍門架在運動過程中,固定在龍門架上的移動相機相對與龍門架本身只有平移關係,而架在機械手上的相機存在角度旋轉;機械手在運動過程中機械臂J1與機械臂J2兩個的角度一直在變化 ...
1、機械手頭部相機與龍門架頭部相機的區別?
- 上篇文字講解了機械手頭部相機標定原理及方法,中間有提到只適用於龍門架,那為什麼呢?
- 答:龍門架在運動過程中,固定在龍門架上的移動相機相對與龍門架本身只有平移關係,而架在機械手上的相機存在角度旋轉;機械手在運動過程中機械臂J1與機械臂J2兩個的角度一直在變化,而龍門架的X,Y並沒有旋轉
2、原理分析
- 如上圖所示,J2上面掛載一個相機, 怎麼計算旋轉關係呢?
- 換個角度看問題,相機相對於P1點的相對位置從來就沒有改變,也就是說圖像坐標點相對於P1坐標點從來沒有改變。
- 假如新建一個坐標系W2,W2以P1為坐標系原點,J2臂延長方向為X軸,J2垂直方向為Y軸。那麼相機的圖像坐標系與W2存在固定的仿射變換關係(和固定相機一樣了)
- 而W2與機械手坐標系存在旋轉與平移的關係,平移關係可以通過P1的點位來確定,旋轉關係可以通過J1,J2的角度來確定。
- 通過這樣分解機械手頭部相機就變成了坐標系(平移+旋轉)+仿射變換了。
3、詳細步驟
- 從原理分析我們可以看到其實龍門架的頭部相機標定是機械手頭部相機標定的一個特例(無旋轉)
- 故其操作步驟和龍門架頭部相機標定是一樣的,只是後臺代碼有少許差異
- 詳細操作步驟請參考上篇文章《移動相機九點標定工具原理及實現(包涵部分源碼)》
4、源碼
private void updatePoiMatrix(Position pcbPoi,Position poi1, Position poi2,Position takePhotoPoi)
{
//更新對應的數組
imagePoiList.Add(new Position() { X = (poi1.X + poi2.X) / 2, Y = (poi1.Y + poi2.Y) / 2 });
//dstPoi- takePhotoPoi,獲取takePhoto的J1與J2,
System.Windows.Point p1=new System.Windows.Point();
p1.X = pcbPoi.X - takePhotoPoi.X;
p1.Y = pcbPoi.Y - takePhotoPoi.Y;
var jAngles=this.currentRobot.GetJAngle();
double angleJ = -jAngles[0] - jAngles[1];
System.Windows.Point p2= MatrixHelper.GetRotatePoint(p1, angleJ, new System.Windows.Point() { X = 0, Y = 0 });
Position newDstPoi = new Position();
newDstPoi.X = p2.X;
newDstPoi.Y = p2.Y;
robotPoiList.Add(newDstPoi);
}
/// <summary>
/// 逆時針旋轉,獲取旋轉後的點位
/// </summary>
/// <param name="p1">待旋轉的點</param>
/// <param name="angle">旋轉角度</param>
/// <param name="center">旋轉中心</param>
/// <returns></returns>
public static Point GetRotatePoint(Point p1, double angle, Point center)
{
//使用旋轉矩陣求值
RotateTransform rotateTransform = new RotateTransform(angle, center.X, center.Y);
Point p = new Point(p1.X, p1.Y);
System.Windows.Point p2 = rotateTransform.Transform(p);
return p2;
}
5. 後續計劃[敬請期待],如需完整代碼請微信聯繫
- 下相機定位演算法
- 基於頭部相機的載具定位演算法
- 基於頂部相機的塑盤取料演算法
- 基於頭部相機的檢測演算法實現
- 一種面向介面介面、依賴註入的運控框架的總體介紹及分層實現
作者:Bonker 出處:http://www.cnblogs.com/Bonker QQ:519841366 |