基于嵌入式Linux的移動機(jī)器人控制系統(tǒng)
摘要:以嵌入式Linux開發(fā)平臺為基礎(chǔ),根據(jù)模糊控制算法進(jìn)行機(jī)器人路徑規(guī)劃,同時將兩自由度云臺和超聲波測距模塊相結(jié)合,擴(kuò)大了障礙物檢測范圍。根據(jù)測試,移動機(jī)器人可以根據(jù)操作人員的語音指令,實(shí)現(xiàn)前進(jìn)、后退、測量距離等動作,并通過MP3播放功能播放出所測量到的距離值和機(jī)器人當(dāng)前的運(yùn)行狀態(tài)。在運(yùn)行過程中,機(jī)器人可以自動檢測方位并修正,實(shí)現(xiàn)無碰撞行駛。
本文引用地址:http://m.butianyuan.cn/article/201609/304733.htm引言
隨著科學(xué)技術(shù)的發(fā)展和社會的需要,移動機(jī)器人技術(shù)得到了迅速發(fā)展,正在滲透到各行各業(yè)中,使人們的生活更加便利?,F(xiàn)今以單片機(jī)為核心的移動機(jī)器人存在處理數(shù)據(jù)量有限、控制系統(tǒng)速度低、人機(jī)交互機(jī)制單一等缺點(diǎn),不能滿足機(jī)器人多任務(wù)的要求。系統(tǒng)中增加協(xié)處理器的系統(tǒng)結(jié)構(gòu)也得到了廣泛應(yīng)用,雖然可以管理多種傳感器,但這種結(jié)構(gòu)卻增加了硬件的冗余度和復(fù)雜度,見參考文獻(xiàn)。為此,提出了以嵌入式處理器S3C2440為核心的多任務(wù)機(jī)器人控制系統(tǒng)。
1 控制系統(tǒng)硬件設(shè)計(jì)
控制系統(tǒng)選用兩輪獨(dú)立驅(qū)動小車為移動式機(jī)器人平臺,后輪為一個尼龍萬向輪。處理器為三星公司的S3C2440,系統(tǒng)主頻最高可達(dá)533 MHz,外接512 MB的NAND Flash和64 MB的SDRAM,支持SPI、I2C、UART等接口,滿足移動機(jī)器人控制系統(tǒng)的需求,如圖1所示。
整個控制系統(tǒng)工作過程如下:語音識別芯片LD3320通過SPI總線接口接入ARM處理器,處理器可以對識別的結(jié)果進(jìn)行分析和匯總,并通過查表提取出操作人員的命令碼;同時,處理器通過串口讀取機(jī)器人當(dāng)前的航向信息;超聲波測距和紅外線地面檢測模塊由處理器的GPIO引腳控制;通過控制兩自由度的云臺,可以進(jìn)行多方位的超聲波障礙物檢測,利用LD3320模塊的MP3播放功能播放所檢測到的障礙物距離和路況信息??刂葡到y(tǒng)根據(jù)傳感器的數(shù)據(jù)和所識別的操作人員的命令碼,利用信息融合技術(shù)提取環(huán)境特征,通過路徑規(guī)劃技術(shù)作出決策,控制電機(jī)狀態(tài),最終控制機(jī)器人的姿態(tài)。
2 控制系統(tǒng)軟件設(shè)計(jì)
在軟件設(shè)計(jì)中,將系統(tǒng)中所有要處理的任務(wù)劃分為不同的、相互獨(dú)立的任務(wù)模塊。根據(jù)系統(tǒng)的性能指標(biāo)和技術(shù)要求,可將任務(wù)劃分為:語音識別、航向測量與計(jì)算、超聲波測距、電機(jī)控制、信息處理等任務(wù)。
2.1 進(jìn)程的創(chuàng)建與狀態(tài)轉(zhuǎn)換
移動機(jī)器人控制系統(tǒng)在初始化完成后,利用系統(tǒng)調(diào)用fock機(jī)制分別為語音識別、航向測量與計(jì)算和超聲波測距等任務(wù)產(chǎn)生相應(yīng)的子進(jìn)程,實(shí)現(xiàn)方式如圖2所示。進(jìn)程創(chuàng)建成功后,操作系統(tǒng)會根據(jù)調(diào)度算法進(jìn)行進(jìn)程調(diào)度,這使系統(tǒng)在行駛過程中,能夠及時響應(yīng)語音命令。
2.2 進(jìn)程間通信機(jī)制
在信息處理進(jìn)程中,需要對不同任務(wù)返回的有效數(shù)據(jù)進(jìn)行信息處理和融合。由于不同進(jìn)程的數(shù)據(jù)段、堆棧段是相互隔離的,因此,采用共享內(nèi)存的進(jìn)程間通信方式,在程序中可以使用shmget從系統(tǒng)中取出一塊未使用的物理內(nèi)存并映射到用戶空間,如圖3所示。
在兩個進(jìn)程之間建立共享內(nèi)存的具體實(shí)現(xiàn)步驟如下:
①在調(diào)用fock()前,使用shmget創(chuàng)建新的共享內(nèi)存,返回值為共享內(nèi)存標(biāo)識碼:
shmid=shmget(IPC PRIVATE,1,PERM) //申請一個字節(jié)共享內(nèi)存
②調(diào)用fock()函數(shù),創(chuàng)建子進(jìn)程,根據(jù)fock()的返回值區(qū)分父進(jìn)程和子進(jìn)程,并分別在兩個進(jìn)程中使用shmat映射一塊共享內(nèi)存,即允許當(dāng)前進(jìn)程訪問創(chuàng)建的共享內(nèi)存:
if(fock()) p_addr=shmat(shmid,0,0);//將共享內(nèi)存映射到父進(jìn)程
else{c_addr=shmat(shmid,0,0);}//將共享內(nèi)存映射到子進(jìn)程
其中,shmid為shmget()函數(shù)的返回值,即共享內(nèi)存標(biāo)識碼。
從用戶的角度看,在父進(jìn)程中可以對p_addr進(jìn)行讀寫操作,實(shí)際訪問的是申請的共享內(nèi)存。子進(jìn)程則可以對c_addr進(jìn)行讀寫,從而實(shí)現(xiàn)兩個進(jìn)程間的通信。共享內(nèi)存的映射和進(jìn)程之間的關(guān)系,如圖4所示。
2.3 系統(tǒng)控制流程
在程序初始化完成后,為每項(xiàng)任務(wù)創(chuàng)建了相應(yīng)的進(jìn)程,并建立了共享內(nèi)存,如圖5所示。在每個進(jìn)程中采用循環(huán)執(zhí)行方式,語音識別進(jìn)程中利用select函數(shù)監(jiān)控是否有識別結(jié)果輸出,并將識別結(jié)果寫入到相應(yīng)的共享內(nèi)存區(qū)。
航向測量和計(jì)算進(jìn)程循環(huán)讀取陀螺儀的角度信息并存儲。超聲波測距進(jìn)程在接收到信息處理進(jìn)程的控制命令后進(jìn)行測距并將數(shù)據(jù)返回至信息處理進(jìn)程。信息處理進(jìn)程融合了多傳感器的數(shù)據(jù),根據(jù)設(shè)定的路徑規(guī)劃方案,將控制信息傳輸?shù)诫姍C(jī)控制進(jìn)程,實(shí)現(xiàn)機(jī)器人姿態(tài)的調(diào)整。
2.4 語音識別
在系統(tǒng)運(yùn)行過程中,語音識別進(jìn)程獨(dú)立完成對語音模塊的初始化和讀取識別結(jié)果的任務(wù),因此,能夠及時響應(yīng)操作人員發(fā)出的語音指令。程序中使用了select()函數(shù)監(jiān)控read()是否可讀。當(dāng)語音識別模塊LD3320有識別結(jié)果時,將在中斷引腳輸出高電平以觸發(fā)系統(tǒng)中斷,結(jié)束驅(qū)動程序中的等待狀態(tài),同時應(yīng)用程序可以通過read()函數(shù)讀取LD3320的識別結(jié)果,并寫入到相應(yīng)共享內(nèi)存區(qū)M中。在沒有中斷時,read()函數(shù)將被阻塞,如圖6所示。
評論