天天看點

【自動化畢業設計】基于機械視覺控制的闆球控制裝置

【自動化畢業設計】基于機械視覺控制的闆球控制裝置

大四自動化專業畢業設計,斷斷續續制作了三個月,中途參加了校招和其他雜事,按照一般工作強度制作大概需要3個星期。

【自動化畢業設計】基于機械視覺控制的闆球控制裝置

【實作功能】

自平衡控制

定位控制

運動軌迹規劃控制

随動系統控制

【視訊示範】

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

繼續閱讀