【自動化畢業設計】基于機械視覺控制的闆球控制裝置
大四自動化專業畢業設計,斷斷續續制作了三個月,中途參加了校招和其他雜事,按照一般工作強度制作大概需要3個星期。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL90TUOdHNXlFd5cEZxYkMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zRQpkL4kTM0ITM1kTM1ITMxgTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
【實作功能】
自平衡控制
定位控制
運動軌迹規劃控制
随動系統控制
【視訊示範】
https://www.bilibili.com/video/av36573493
https://www.bilibili.com/video/av36688397
【制作過程】
闆材:
所有黑色闆材都是用啞光(磨砂)亞克力闆。
400* 400* 3 一塊(藍色箭頭)
500* 600* 3 兩塊(紅色箭頭)
40 * 500* 3 四塊(綠色箭頭)
40 * 580* 3 四塊(綠色箭頭)
舵機固定架:
絲杆與闆材連接配接結構:
三個絲杆,M4 (2支) 、M8(1支)、M3螺絲+M3螺帽數個
25T金屬舵機擺臂 2
連杆頭2:
10 10mm(1個)、55mm(2個)萬向節:
M8絲杆底座(關鍵字:管道支架):
用ab膠粘牢後組裝效果圖:
如果覺得有松動的話可以适當加上杜邦線擰緊,會有減震效果
其餘元件:
舵機 2(串行總線舵機、普通的模拟舵機都行,自行制作一個下位機即可)
usb攝像頭1
氧化锆小球12mm * 1
之是以選用氧化锆小球,是我做了很多實驗得出的結果
表面越光滑的小球,可控制程度越高。比如我設定底盤傾角為5°,乒乓球在上面可能會保持靜止,而氧化矽小球可能在1°的時候就會發生運動。如果可控度低,在控制算法上就要用大量算法解決這個問題。攝像頭我采用1920*1080分辨率采集圖像資料,大概是30fps。
完成機械機構标準是,小球的底盤盡量不能出現在垂直Z軸放向的轉動;調節舵機處于中值附近時底盤上可停留小球使其靜止(我會放出序列槽控制舵機的源碼供大家修改參考);底盤與相機畫面盡量平衡(如圖)
【程式框圖】
【圖像算法】
通過opencv擷取攝像頭畫面,初始化時設定平闆的左上與右下坐标,在之後的進行中即可排除無相關的環境。
/* 打開攝像頭 */
capture = VideoCapture(CV_CAP_DSHOW);
capture.open(cap);
/* 設定攝像頭 */
capture.set(CV_CAP_PROP_FOURCC, CV_FOURCC('M', 'J', 'P', 'G'));//設定為MJPG格式
capture.set(CV_CAP_PROP_FRAME_WIDTH, CAP_WIDTH);//寬度
capture.set(CV_CAP_PROP_FRAME_HEIGHT, CAP_HEIGHT);//高度
capture.set(CV_CAP_PROP_FPS, CAP_FPS);//幀率 幀/秒
capture.set(CV_CAP_PROP_BRIGHTNESS, 1);//亮度
capture.set(CV_CAP_PROP_CONTRAST, 40);//對比度 40
capture.set(CV_CAP_PROP_SATURATION, 50);//飽和度 50
capture.set(CV_CAP_PROP_HUE, 50);//色調 50
capture.set(CV_CAP_PROP_EXPOSURE, -6.5);//曝光
/* 擷取可識别範圍 */
Mat frame;
capture >> frame;
imshow("Vidio", frame);
cvSetMouseCallback("Vidio", OnMouseCallBack, &frame);
while (tmp2.y == -1) { waitKey(10); }
destroyWindow("Vidio");
broad_position1.x = tmp1.x;
broad_position1.y = tmp1.y;
broad_position2.x = tmp2.x;
broad_position2.y = tmp2.y;
/* 點選滑鼠執行 */
void OnMouseCallBack(int event, int x, int y, int flags, void *param)
{
static bool click_flag = false;
if (event == CV_EVENT_LBUTTONDOWN)
{
if (!click_flag)
{
tmp1.x = x;
tmp1.y = y;
click_flag = true;
}
else
{
tmp2.x = x;
tmp2.y = y;
click_flag = false;
}
}
}
這裡為了提高算法的可移植性,應該加上一個轉換系統,作為像素點與實際長度的轉換中間量,比如我的底盤長度是400mm的,圖像上占了600個像素點,那麼之間的比例系數就是1.5,往後的小球運算中輸入的都是mm為機關的資料。
/* 初始化平闆 */
exchange_value_x = REAL_HEIGHT / (broad_position2.x - broad_position1.x);
exchange_value_y = REAL_WIDTH / (broad_position2.y - broad_position1.y);
擷取到一幀圖像資料後,經過裁剪、灰階化、二值化,理想的圖檔應為:
再通過掃描像素點,判斷每行像素點中白色所占長度是否為預設的小球半徑,如果符合條件則得出小球x軸坐标與y軸坐标。小球的速度則是兩次通過兩次坐标差算出的。
capture >> frame; //将攝像頭的視訊流轉換成Mat格式的圖像
frame = frame(Range(broad_position1.y, broad_position2.y - 1), Range(broad_position1.x, broad_position2.x - 1)); //裁剪
cvtColor(frame2, frame, COLOR_RGB2GRAY); //彩色圖像灰階化
threshold(frame, frame, THRESH_BINARY_C_VALUE, THRESH_BINARY_H_VALUE, CV_THRESH_BINARY); //二值化
Point position;
for (int i = 0; i < frame.rows - 1; i++)
{
unsigned char *data1 = frame.ptr<uchar>(i);
for (int j = 0; j < frame.cols - 1; j++)
{
if (data1[j] >= 250)
{
int begin = j;
while (data1[j++] >= 250 && (j < frame.cols - 2));
if ((double)(j - begin)*exchange_value_x <= mindiameter || ((double)(j - begin)*exchange_value_x >= maxdiameter))//不是球,掃描下一行
{
continue;
}
position.x = (j + begin)/2;
position.y = i;
double radiu = j - begin;
radiu = exchange_value_x* radiu;
ball_state = true;
x = (double)position.x*exchange_value_x;
y = (double)position.y *exchange_value_y;
cout << "半徑=" << radiu << " ";
_x_speed = (x- position_x) ;
_y_speed= (y- position_y) ;
position_x = x;
position_y = y;
lasttime = newtime;
return true;
}
}
}
ball_state = false;
return false;
【控制算法】
采用的是“X/Y坐标位置外環——速度内環串級PID控制”與“X軸——Y軸并級PID控制”,系統結構框圖如下。速度環主要起着限速的作用,是以無需積分,控制精度由位置環的積分環節發揮主要作用。調試過程是先把解決速度PD環,首先加入比例參數,使關閉微分作用,速度設定值為0,把小球推置底盤中,觀察系統是否可把小球平衡至靜止狀态,調節幅度過大舵機反複震蕩則把比例系數減小,調節幅度過小球直接按照原速度方向滾下底盤則把比例系數增大。當系統可把小球穩定在底盤上時則開始調節微分系數。微分的作用是加快系統穩定速度,減少超調量,這個大家調試時候自行酌情調試吧。
外環的調試順序是P-D-I,比例系數和微分系數還是根據上述情況去調試,我在積分部分加上了積分分離算法和防止積分過飽和算法,積分是為了提高位置控制精度的,如果積分作用有過大的負面作用,可以适當降低精度要求。
最後的圓周運動,是在原有控制上加了一個半徑外環PI算法
【後序擴充】
我自己加了紅點識别做的随動系統和搖桿的控制、模式切換,這個大家可以自由發揮啦~
資源:
連結: https://pan.baidu.com/s/1NgEjScvQoY_u7rp_vTdHPA 提取碼: qumd