前言
導入 EPSON 與 Basler 提供的 DLL ( C# 導入外部 DLL ), 建立開發環境, 整合後呼叫方法完成定點取像任務.
RCAPINet.dll 及 Basler.Pylon.dll
本文
Basler 擷取圖像
Epson Robot
- 座標軸
- 移動指令
- Jump
- Go
- Move
- Bgo
- …
定點取像
1. Basler 擷取圖像
Basler 的相機提供 USB 和乙太網路的連接方式, 透過官方軟件 - pylon 設定好 Camera 的 IP, 使開發環境在同一個網域內; 如下圖確認已經在同一個網域 (192.168.10.102) 後, 透過 Tool → Pylon IP Configurator 來確認是否判讀到裝置.
編寫操作方法,
加入 using:
1
using Basler.Pylon;
宣告 Camera 實例及方法(對應裝置 S/N 碼):
1
2
3
4
5
6
7
8
9
10
11namespace CCD
{
public class Basler
{
private Camera _camera;
public void camera_init(string camera_sn)
{
_camera = new Camera(camera_sn);
}
}
}開啟/關閉 攝像頭:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19public bool ccd_on()
{
try
{
int timeout = 1000;
_camera.Open(timeout, TimeoutHandling.ThrowException);
_camera.Parameters[PLCamera.PixelFormat].SetValue("Mono8");
return true;
}
catch(Exception ex)
{
return false;
}
}
public void ccd_off()
{
_camera.Close();
}擷取圖像:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public Bitmap GrabResult2Bmp(IGrabResult grabResult)
{
Bitmap b = new Bitmap(grabResult.Width, grabResult.Height, PixelFormat.Format32bppRgb);
BitmapData bmpData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, b.PixelFormat);
pxConvert.OutputPixelFormat = PixelType.BGRA8packed;
IntPtr bmpIntpr = bmpData.Scan0;
pxConvert.Convert(bmpIntpr, bmpData.Stride * b.Height, grabResult);
b.UnlockBits(bmpData);
return b;
}
public Bitmap take_one_picture(int exposure_time)
{
_camera.Parameters[PLCamera.ExposureTimeRaw].SetValue(exposure_time);
IGrabResult grab_pic = _camera.StreamGrabber.GrabOne(5000);
return GrabResult2Bmp(grab_pic);
}
呼叫方法 take_one_picture(int exposure_time) 就能夠得到 Bitmap 格式的圖像.
2. Epson Robot
座標軸:
不管四軸或者六軸手臂, 所謂的 座標點 皆是指機械手臂的末端位置, 而手臂本身就是座標系. 在此認知下, 可以定義出 座標點(x,y,z,u) 所代表的 3D 空間位置及當下位置的旋轉角度(u). 座標系可再分成機器人座標系、工具座標系及本地座標系, 但在此先不介紹.移動指令:
機械臂的移動大致分成 直線移動 和 點到點 (PTP) 移動:
Jump: 以門控動作移動至目標座標的動作 (PIP 動作), 優點可以避開障礙物.
Go: 用於在當前位置~指定位置之間以 PTP 動作 移動機械臂
Move: 用於在當前位置~指定位置之間以 直線插補動作 移動機械臂, 與 Go 最大不同在於所有關節同時移動.
BGo: 用於在已選擇的本地座標系上執行偏移 PTP 動作
…
宣告實例及變數:
1 | namespace Robot |
開啟方法:
1 | public void ini_robot_on() |
機械臂還有許多進階的指令如: 並行處理 !..!、 CP、 Till、 Local … 等等, 可以針對開發需求去優化機械臂, 例如可改寫 jump 方法如下透過監控 MemSw(1)、MemSw(2) 及 Sw(0) 的訊號來判斷是否暫停/繼續機械臂動作任務 :
1 | public void jump(string position) |
HINT:
更多詳細介紹參照 EPSON 的官方文件.
ex:
安裝完 EPSON SDK 後, 在 C:\EpsonRC70\manuals\English\ … 底下
1. e_SPEL+Ref73_r1.pdf
2. e_RC+API70_r9.pdf
3. …
3. 定點取像
整合上述兩個 dll 及方法後, 將攝像頭架設於機械臂的末端並完成定點 (P1點) 取像任務:
1 | public void capture_task(string camera_sn, string P1, int exposure_time) |