嚴(yán)毓培 馬維旻 楊裕 尹雪梅 潘強(qiáng) 湯佩豫 黎偉
摘要:為了節(jié)省機(jī)器人開(kāi)發(fā)的成本和功耗,工業(yè)領(lǐng)域一般采用非ROS系統(tǒng)開(kāi)發(fā)機(jī)器人,本文闡述的倉(cāng)儲(chǔ)物流機(jī)器人的設(shè)計(jì)基于ARM架構(gòu)的S5PV210的CPU,運(yùn)行嵌入式Linux操作系統(tǒng),降低了硬件成本,節(jié)省了電池功耗,同時(shí)根據(jù)定制需求開(kāi)發(fā),實(shí)時(shí)性比較高。機(jī)器人的ARM主板和單片機(jī)主板間通過(guò)定制的通信協(xié)議通信,外接了各種傳感器以加強(qiáng)機(jī)器人的感知能力,通過(guò)嵌入式Linux下多進(jìn)程的開(kāi)發(fā)以實(shí)現(xiàn)多功能同步,圖形界面采用嵌入式QT開(kāi)發(fā),通過(guò)mjpeg-streamer實(shí)現(xiàn)web遠(yuǎn)程視頻監(jiān)控,并設(shè)計(jì)了安卓APP以提供操控的便攜性。
關(guān)鍵詞:物流機(jī)器人;ARM;嵌入式Linux;單片機(jī);QT圖形界面
*基金項(xiàng)目:
1)廣東省普通高校特色創(chuàng)新類項(xiàng)目(自然科學(xué))(2018GKTSCX056)
2)廣東普通高校重點(diǎn)項(xiàng)目(自然科學(xué))(2019GZDXM014)
3)珠海城市職業(yè)技術(shù)學(xué)院2021年科研項(xiàng)目(KY2021Y01Z)
4)2020年教育部高等學(xué)校項(xiàng)目(2020ITA03008)
5)2022年廣東省科技創(chuàng)新戰(zhàn)略專項(xiàng)資金(pdjh2022b0992)
6)2021年校級(jí)質(zhì)量工程師資項(xiàng)目(ZLJS2020120622,ZLJS2020120623,ZLJS2020120624)
0 引言
目前大部分的機(jī)器人都是基于 ROS 系統(tǒng)實(shí)現(xiàn),一般 ROS 在 Ubuntu 系統(tǒng)中的穩(wěn)定性最好,因此需要 Intel或者高性能 ARM 架構(gòu)的 CPU 的支撐,但存在的問(wèn)題是硬件成本高,功耗高,產(chǎn)品的體積大。同時(shí) ROS 系統(tǒng)中有很多功能對(duì)于某些特定的應(yīng)用場(chǎng)景而言是冗余的,這些冗余的功能會(huì)使系統(tǒng)龐大,占用很多內(nèi)存和 CPU的資源,而且機(jī)器人反應(yīng)不夠靈敏,實(shí)時(shí)性較差。如果將 ROS 移植到基于 ARM 架構(gòu)的低成本低功耗的 CPU上,或者對(duì) ROS 系統(tǒng)進(jìn)行裁剪以去掉冗余的部分,存在工作難度大周期長(zhǎng)的問(wèn)題,而且 ROS 后期運(yùn)行時(shí)不夠穩(wěn)定。因此要設(shè)計(jì)一款在特定應(yīng)用場(chǎng)景中運(yùn)行的低成本低功耗的機(jī)器人,不應(yīng)采用 ROS 系統(tǒng)開(kāi)發(fā),而應(yīng)根據(jù)具體需求采用適用于特定應(yīng)用場(chǎng)景下的定制化的軟硬件設(shè)計(jì)方案,在降低成本功耗體積的同時(shí)可以提高系統(tǒng)的穩(wěn)定性和實(shí)時(shí)性。
1硬件設(shè)計(jì)
本文中所設(shè)計(jì)的物流機(jī)器人如圖1所示,硬件部分由 ARM 主板和單片機(jī)電路板組成,具體的硬件框架如圖2所示。
其中 ARM 主板采用了 S5PV210的 CPU,帶有512 MB 的 RAM和512 M 的flash,LCD 觸摸屏,SD 卡插槽,3個(gè) USB 接口和4個(gè)串口,運(yùn)行嵌入式 Linux 操作系統(tǒng)[1],如圖3所示。利用該主板可實(shí)現(xiàn)機(jī)器人的激光雷達(dá)掃描,LCD 觸摸屏顯示,機(jī)器人與手機(jī) APP 之間的藍(lán)牙通信,運(yùn)行mjpeg-streamer 的實(shí)時(shí) web 遠(yuǎn)程視頻監(jiān)控等功能。
ARM 主板的 CPU 是 S5PV210,運(yùn)行嵌入式 Linux 系統(tǒng),嵌入式 Linux 系統(tǒng)是非實(shí)時(shí)系統(tǒng),無(wú)法準(zhǔn)確讀取25 kHz 的光電編碼器的脈沖,因此用單片機(jī)進(jìn)行電機(jī)控制和光電編碼器的脈沖讀取,單片機(jī)與 ARM 主板之間用自定義的通信協(xié)議傳輸光電編碼器讀取的數(shù)據(jù)[2],如圖4所示。
機(jī)器人外接模塊可以為機(jī)器人提供更加豐富的功能,如圖5所示,其中 USB 攝像頭用來(lái)提供機(jī)器人現(xiàn)場(chǎng)的視頻,USB-Wi-Fi 模塊用來(lái)將攝像頭的視頻傳輸?shù)竭h(yuǎn)程客戶端的 web 頁(yè)面,串口藍(lán)牙模塊用來(lái)和手機(jī) APP 連接,飛控模塊包含 GPS,陀螺儀,電子羅盤,加速度計(jì)等傳感器,并內(nèi)置了傳感器融合等算法,為室內(nèi)機(jī)器人判斷運(yùn)動(dòng)方向提供參考[3]。
機(jī)器人可連接激光傳感器,該傳感器可以掃描周圍的環(huán)境,得到周圍6 m 范圍內(nèi)的每個(gè)障礙物的角度和距離,如圖6所示。
2軟件設(shè)計(jì)
2.1單片機(jī)的軟件設(shè)計(jì)
機(jī)器人的直流電機(jī)連接著減速電機(jī),因此光電編碼器一秒鐘可以讀入25 kHz 的脈沖,但嵌入式 Linux 操作系統(tǒng)是非實(shí)時(shí)的操作系統(tǒng),讀取脈沖不夠準(zhǔn)確[4],因此用單片機(jī)來(lái)讀取25 kHz 的脈沖,并將脈沖值通過(guò)串口自定義的簡(jiǎn)單協(xié)議傳給 ARM 開(kāi)發(fā)板。
單片機(jī)采用 STC15F2K60S2,其中外部中斷0和外部中斷1分別用來(lái)讀取左右兩個(gè)電機(jī)的光電編碼器的脈沖,定時(shí)器0設(shè)置為8位重裝用以設(shè)置波特率為115200。定時(shí)器1每4 ms中斷一次,在中斷服務(wù)程序里,生成可以驅(qū)動(dòng)直流電機(jī)轉(zhuǎn)速的占空比,每200 ms計(jì)算一次輪子的速度,假設(shè)兩個(gè)電機(jī)的光電編碼器的脈沖數(shù)為 P,輪子轉(zhuǎn)一圈是25000個(gè)脈沖,輪子的半徑是 r,則輪子的速度為2×3.14×9/25000,并進(jìn)行1 s 的定時(shí)[5]。
串口中斷服務(wù)程序根據(jù)從 ARM 板獲取到的串口信息控制兩個(gè)電機(jī)的啟動(dòng)停止、轉(zhuǎn)動(dòng)方向、設(shè)定速度,如圖7所示,可通過(guò)手機(jī) APP 或者機(jī)器人的液晶觸摸屏上的按鈕控件來(lái)發(fā)送這些指令,因點(diǎn)擊按鈕是間斷性的動(dòng)作,同時(shí)發(fā)送兩次設(shè)定速度的按鈕的時(shí)間間隔會(huì)比較久,所以在獲取設(shè)定速度時(shí)如果 buffer[2]的值有可能等于13,即’/r’,也不會(huì)認(rèn)為這是新的一條指令。
主程序每秒鐘發(fā)送兩個(gè)電機(jī)的速度到 ARM 板,因嵌入式 Linux 系統(tǒng)底層讀取串口數(shù)據(jù)是不定時(shí)的,很多情況下會(huì)讀取到一個(gè)不完整的包[6],考慮到機(jī)器人的速度不可能達(dá)到 65 535 mm/s,因此可以將通信協(xié)議簡(jiǎn)單設(shè)計(jì)如下:
當(dāng)嵌入式 Linux 讀到兩個(gè)連續(xù)的 0xFF,則認(rèn)為是一個(gè)新的包的開(kāi)始,將后面接收到的數(shù)據(jù)存放起來(lái),直到讀滿 6 個(gè)字節(jié)再開(kāi)始計(jì)算兩個(gè)輪子的速度。
主程序中每秒將計(jì)算設(shè)定速度的上下限,上限是設(shè)定速度的 105%,下限是設(shè)定速度的 95%,當(dāng)電機(jī)的速度在上下限之間不需調(diào)節(jié)占空比,否則每 200 ms調(diào)節(jié)一次占空比。
2.2 嵌入式Linux的軟件設(shè)計(jì)
系統(tǒng)從 QT 的TMainForm進(jìn)入后分別對(duì)mjpegstreamer,GPIO,串口,液晶屏,攝像頭進(jìn)行初始化,并啟動(dòng) QT 的定時(shí)器,每 1 s 刷新一次控件。
在robot_start的進(jìn)程中設(shè)置一個(gè)死循環(huán),不斷從串口 0 連接的串口藍(lán)牙模塊來(lái)獲取手機(jī) APP 發(fā)送過(guò)來(lái)的命令并加以執(zhí)行,同時(shí)不斷從串口 3 連接的單片機(jī)來(lái)獲取機(jī)器人的速度,通過(guò)與設(shè)定的速度對(duì)比后向單片機(jī)發(fā)送占空比,并根據(jù)累積的脈沖數(shù)計(jì)算機(jī)器人行走的總里程和某時(shí)刻的朝向。
由于 GPS 傳感器、陀螺儀、加速度計(jì)、磁力計(jì)和電子羅盤等傳感器在室內(nèi)無(wú)法使用 [7],該方法使用里程計(jì)信息對(duì)機(jī)器人的位置和角度進(jìn)行計(jì)算,因此機(jī)器人的朝向可以通過(guò)剛體的運(yùn)動(dòng)計(jì)算得出。
移動(dòng)機(jī)器人的輪子由電機(jī)帶動(dòng),輪子的直徑為 D,則輪子的周長(zhǎng)為πD,電機(jī)轉(zhuǎn)動(dòng)的圈數(shù) m 可以由光電編碼器獲取,當(dāng)機(jī)器人在前進(jìn)或者后退狀態(tài),移動(dòng)機(jī)器人移動(dòng)的距離 S 可以由 S = m×πD得到。
機(jī)器人在每 1 s 求 1 次角度,并計(jì)算角度的累計(jì)和,以此判斷出機(jī)器人的朝向,因?yàn)榧す鈹?shù)據(jù)處理的進(jìn)程也會(huì)對(duì)角度數(shù)據(jù)進(jìn)行讀寫操作,因此在以上流程執(zhí)行前需要加上互斥鎖mutex_lock,執(zhí)行完畢后關(guān)閉互斥鎖 [8]。
串口 3 連接飛控模塊,根據(jù)模塊提供的通信協(xié)議,每 1 s 獲取 1 次飛控模塊的經(jīng)緯度的數(shù)據(jù),經(jīng)度和緯度數(shù)據(jù)都是 4 個(gè)字節(jié),需要拼接后得到十進(jìn)制的經(jīng)緯度,當(dāng)機(jī)器人如果到室外運(yùn)動(dòng)時(shí)可以通過(guò)經(jīng)緯度對(duì)機(jī)器人進(jìn)行粗略的定位。
機(jī)器人每 1 s 也會(huì)判斷設(shè)定速度是否發(fā)生改變,如果改變了就會(huì)根據(jù)新的設(shè)定速度計(jì)算占空比并下發(fā)到單片機(jī),如果機(jī)器人按照設(shè)定速度來(lái)調(diào)整占空比,會(huì)出現(xiàn)機(jī)器人的速度忽大忽小的情況,因此將速度上限定為設(shè)定速度的105%,速度下限定為設(shè)定速度的95%,誤差率為±5%,當(dāng)機(jī)器人的速度在速度的上下限范圍內(nèi)則不用調(diào)整占空比,機(jī)器人可以運(yùn)行得更平穩(wěn)[9]。
機(jī)器人的液晶觸摸屏采用 QT 的圖形界面進(jìn)行設(shè)計(jì),其中界面布局可以在 QT designer 中完成,并在 QT designer 中直接添加槽函數(shù)[10],可通過(guò)qt_second()函數(shù)每秒鐘對(duì)界面的控件進(jìn)行刷新,當(dāng)按鈕單擊后按鈕文本會(huì)發(fā)生變化,可通過(guò)PushButton->setText函數(shù)完成按鈕文本的設(shè)計(jì),同樣設(shè)定速度的輸入框可以通過(guò) LineEdit1->setText(QString::number(setup_speed)); 完成設(shè)計(jì),單擊+、-兩個(gè)按鈕可以修改機(jī)器人的設(shè)定速度,當(dāng)機(jī)器人的設(shè)定速度大于1 m/s 或者小于0時(shí),彈出警告框QMessageBox::information(this,”Error ”, “speed should be in range 0-999 mm/s ”);,設(shè)定速度、兩個(gè)電機(jī)的速度、經(jīng)緯度數(shù)據(jù)可通過(guò)以下 TextLabel2->setText(QString::number(setup_speed)+”mm/s ”);等函數(shù)完成顯示。
機(jī)器人通過(guò)以上mjpeg-streamer 組件的代碼完成了web 遠(yuǎn)程視頻監(jiān)控的功能,可在遠(yuǎn)程打開(kāi)firefox瀏覽器看到機(jī)器人上攝像頭拍到的視頻[11],相關(guān)實(shí)現(xiàn)代碼如下:
if(webcamera==0)
{
int mjpg_streamer2;
char arg[40]=”/mjgp-streamer/start_uvc_yuv.
sh”;
mjpg_streamer2=system(arg);
if((mjpg _ streamer2==127)||(mjpg _ streamer2<0))
webcamera=0;
else
webcamera=1;
printf(“the mjgp_streamer2 is %i\n ”,mjpg_ streamer2);
}
激光探頭可以測(cè)量到周圍障礙物的距離和角度,當(dāng)激光探頭發(fā)現(xiàn)在320~40的范圍內(nèi),在距離激光探頭1 m 的范圍內(nèi)有移動(dòng)障礙物,則變量stop_forward=1,否則該變量為0,該角度和距離可以根據(jù)實(shí)際機(jī)器人的情況做相應(yīng)調(diào)整。同理當(dāng)激光探頭發(fā)現(xiàn)在40到140的范圍內(nèi),在距離激光探頭1 m 的范圍內(nèi)有障礙物,則變量stop_right =1,否則該變量為0。如果變量 stop_ forward =1,則此時(shí)機(jī)器人需要旋轉(zhuǎn)到某個(gè)角度,從周圍障礙物的縫隙中出去。
根據(jù)表1的內(nèi)容,移動(dòng)機(jī)器人可判斷下一秒是前進(jìn)、右轉(zhuǎn)、左轉(zhuǎn)或者后退,如果沿著終點(diǎn)角度的方向有障礙物,則根據(jù)表2的判斷,移動(dòng)機(jī)器人計(jì)算出一個(gè)與終點(diǎn)角度最近且縫隙間隔大于機(jī)器人寬度的角度,沿著該角度的中線方向移動(dòng)出去[12]。
if(angle<last_data[0]){
new_start=1;
if((max_data[1]>=40.0)&&
(max_data[1]<=140.0))
turning_right++;
else if((max_data[1]>=220.0)&&
(max_data[1]<=320.0))
turning_left++;}
if((angle>320)||(angle<40)){
if((distance<800.0)&&(distan
ce>0.0)){
stop_forward++;}}
if((destination _ angle >40)&&(destination _
angle<320)){
if(angle<=(360-destination_
angle+30))&&(angle>=(360-destination_angle-30))){
if((distance<1000.0)&&(dista
nce>0.0)){
stop_destination++;}}}
可利用狀態(tài)機(jī)處理該部分代碼,一共有3種狀態(tài),第1種是在左轉(zhuǎn)或者右轉(zhuǎn)中以尋找終點(diǎn)方位的狀態(tài),第2種是前進(jìn)或者后退中不斷向終點(diǎn)靠近,第3種狀態(tài)是
尋找新的空隙的狀態(tài)。
2.3安卓端的軟件設(shè)計(jì)
機(jī)器人通過(guò)串口藍(lán)牙模塊和安卓手機(jī)連接,主要修改的文件是安卓系統(tǒng)里的 BluetoothChat.java 文件,以下是控件的初始化:
mInputEditText =(EditText) findViewById(R . id.editText1);
mInputEditText.setGravity(Gravity.TOP);?? mInputEditText .setSelection(mInputEditText .
getText().length(),
mInputEditText.getText().length());
mInputEditText.clearFocus();
mInputEditText.setFocusable(false);
mStartButton=(Button)super .findViewById(R . id.button_start);
forward=(ImageButton)super .findViewById(R . id.imageButton_forward);
backward=(ImageButton)super.findViewById(R. id.imageButton_backward);
left=(ImageButton)super .findViewById(R . id.imageButton_left);
right=(ImageButton)super .findViewById(R . id.imageButton_right);
mS tartButton . s etOnClickListener(newShowStart());
f o r w a r d . s e t O n C l i c k L i s t e n e r(n e w ShowForward());
right.setOnClickListener(new ShowRight());
ba c kward . se t OnCli c kList e ne r(ne wShowBackward());
left.setOnClickListener(new ShowLeft());
mTitle =(TextView) findViewById(R .id .title_ left_text);
mTitle.setText(R.string.app_name);
mTitle =(TextView) findViewById(R .id .title_ right_text);
HEXCheckBox =(CheckBox) findViewById(R. id.radioMale);
breakButton=(Button) findViewById(R . id.button_break);
m Bl u e t o ot hAdapt e r = Bl u e t o ot hAdapt e r . getDefaultAdapter();
checkBox_sixteen =(CheckBox) findViewById(R.id.checkBox_sixteen);
如果在 APP 上按下啟動(dòng)按鈕,按鈕的文本會(huì)變成“停止”,同時(shí)向機(jī)器人的串口藍(lán)牙模塊發(fā)送”Start ”字符串,機(jī)器人通過(guò)串口收到后調(diào)用 start()函數(shù)啟動(dòng)機(jī)器人,以下是安卓端的具體實(shí)現(xiàn)。
class ShowStart implements OnClickListener{
public void onClick(View v){
String message1;
if(system_start==true){
system_start=false;
mStartButton.setText(“Start ”);
message1=“stop\r ”;
}
else{
system_start=true;
mStartButton.setText(“Stop”);
message1=“start\r ”;
}
try {
message1.getBytes(“ISO_8859_1”);} catch(UnsupportedEncodingExceptione){
e.printStackTrace();}
sendMessage(message1);}}
APP 的其他控件介紹如下:buletooth data buffer 區(qū)域顯示的是機(jī)器人和安卓手機(jī)通過(guò)藍(lán)牙通信的數(shù)據(jù),full screen 按鈕可將該區(qū)域全屏顯示,hex display 單選框可以切換該區(qū)域數(shù)據(jù)的十六進(jìn)制和十進(jìn)制的顯示,clear screen 按鈕可以清空該區(qū)域的數(shù)據(jù)顯示,connect 按鈕可以啟動(dòng)或者關(guān)閉安卓手機(jī)和機(jī)器人之間的連接,stop 按鈕可以啟動(dòng)或者停止機(jī)器人,speed(mm/s)用來(lái)顯示機(jī)器人的實(shí)時(shí)速度,hex output 單選框用來(lái)切換速度的十六進(jìn)制或十進(jìn)制的顯示,longitude 顯示機(jī)器人所在位置的經(jīng)度,latitude 顯示機(jī)器人所在位置的緯度,angle 需要輸入機(jī)器人相對(duì)于導(dǎo)航終點(diǎn)的朝向角度,distance 需要輸入機(jī)器人相對(duì)于導(dǎo)航終點(diǎn)的距離,這是一種角坐標(biāo)的表示,有了這兩個(gè)數(shù)據(jù)就可以確定導(dǎo)航終點(diǎn)相對(duì)于機(jī)器人的具體位置,laser scan stop 按鈕可以切換激光傳感器的啟動(dòng)和停止,send speed 按鈕可以發(fā)送機(jī)器人的設(shè)定速度,send position 按鈕會(huì)將 angle 輸入框和 distance 輸入框的內(nèi)容發(fā)送到機(jī)器人,以便機(jī)器人了解導(dǎo)航終點(diǎn)的位置,navigation 按鈕用來(lái)切換手動(dòng)移動(dòng)和自動(dòng)導(dǎo)航模式,整體界面左下方的上下左右四個(gè)箭頭按鈕可以控制機(jī)器人前進(jìn),后退,左轉(zhuǎn)和右轉(zhuǎn),界面右下方顯示機(jī)器人的實(shí)時(shí)速度,電機(jī)1和電機(jī)2的速度,以及距離機(jī)器人最近的障礙物的距離。
3結(jié)束語(yǔ)
本文闡述了一種非 ROS 系統(tǒng)的定制化物流機(jī)器人的軟硬件設(shè)計(jì)方案,該設(shè)計(jì)方案可以節(jié)省機(jī)器人的成本和功耗,并增強(qiáng)了系統(tǒng)的穩(wěn)定性和實(shí)時(shí)性,通過(guò)實(shí)驗(yàn)驗(yàn)證,機(jī)器人運(yùn)行穩(wěn)定高效,說(shuō)明該設(shè)計(jì)方案具有一定的實(shí)用性和可靠性。
參考文獻(xiàn):
[1]毛文平,李帥永,謝現(xiàn)樂(lè),等.基于自適應(yīng)機(jī)制改進(jìn)蟻群算法的移動(dòng)機(jī)器人全局路徑規(guī)劃[J].控制與決策,2022,(2):19-25.
[2]潘圓媛.物聯(lián)網(wǎng)環(huán)境下的移動(dòng)機(jī)器人定位的應(yīng)用[J].科技資訊,2022,20(16):20.
[3]蘇青.多機(jī)器人路徑規(guī)劃與協(xié)同避碰研究[D].南京:南京郵電大學(xué),2014.
[4]鮑敦橋.仿真類人機(jī)器人設(shè)計(jì)及高層決策方法的研究[D].合肥:合肥工業(yè)大學(xué),2009.
[5]馬斌奇.多機(jī)器人協(xié)作與控制策略研究[D].西安:西安電子科技大學(xué),2009.
[6]朱可平,王菲菲,吳加.移動(dòng)機(jī)器人核心技術(shù)發(fā)展趨勢(shì)[J].物流技術(shù)與應(yīng)用,2022,27(9):5.
[7]毛福新,閆光輝,陳俏銳,等.智能物流場(chǎng)景搬運(yùn)機(jī)器人系統(tǒng)優(yōu)化[J].天津職業(yè)技術(shù)師范大學(xué)學(xué)報(bào),2022,32(3):7.
[8]韓雪峰.導(dǎo)盲機(jī)器人[D].哈爾濱:哈爾濱工程大學(xué),2009.
[9]馬斌奇.多機(jī)器人協(xié)作與控制策略研究[D].西安:西安電子科技大學(xué),2009.
[10]李橙,衛(wèi)星,周游,等.基于激光視覺(jué)引導(dǎo)的智能物流分揀機(jī)器人控制研究[J].激光雜志,2022,43(8):43.
[11]張文輝,齊乃明,尹洪亮.自適應(yīng)神經(jīng)變結(jié)構(gòu)的機(jī)器人軌跡跟蹤控制[J].控制與決策,2011,26(4):4-6.
[12]付曉艷,白雪,魏博凝.基于機(jī)器學(xué)習(xí)的物流自動(dòng)分揀機(jī)器人定位精度檢測(cè)算法[J].自動(dòng)化與儀器儀表,2022(8):5-9.