王 彬
(池州職業(yè)技術(shù)學(xué)院 機(jī)電與汽車系,安徽 池州 247000)
巡線機(jī)器人的出現(xiàn)使人們的工作量得到了很大程度的減輕[1]。最初的機(jī)器人只是按照人們?cè)O(shè)計(jì)的固定程序做出對(duì)應(yīng)的動(dòng)作,無(wú)法根據(jù)外界條件改變已設(shè)置好的程序。隨著科技的進(jìn)步,機(jī)器人逐漸走向智能化。例如搭載傳感器的機(jī)器人擁有與人類相似的感官,并且有了一定的判斷能力,能在人類設(shè)定的原則內(nèi)修改自己的程序[2]。其中,基于實(shí)時(shí)操作系統(tǒng)(RTOS)的巡線機(jī)器人具有障礙物識(shí)別、運(yùn)動(dòng)軌跡控制和自主越障等能力,并能依靠?jī)?nèi)嵌的線路結(jié)構(gòu)參數(shù)進(jìn)行運(yùn)動(dòng)行為的規(guī)劃[3-4]。為了使機(jī)器人能夠同時(shí)完成多項(xiàng)任務(wù),具有一定的自我調(diào)節(jié)能力,在算法方面需要進(jìn)行合理的設(shè)計(jì)。其中,不同的控制算法對(duì)電機(jī)的控制性能存在較大差異[5]。本研究基于uC/OS-III操作系統(tǒng),以STM32F107型處理器為核心進(jìn)行多任務(wù)處理,采用光電檢測(cè)電路采集路徑信息,使用直流電機(jī)進(jìn)行驅(qū)動(dòng)設(shè)計(jì)了巡線機(jī)器人小車,以期為工業(yè)中的產(chǎn)品運(yùn)送、巡航和探索其他領(lǐng)域提供理論支撐。
與通用計(jì)算機(jī)系統(tǒng)相對(duì)應(yīng),嵌入式系統(tǒng)也被稱為嵌入式計(jì)算機(jī)系統(tǒng)[6]。其中,uC/OS-III擁有良好的移植性和可固化、可擴(kuò)展的特點(diǎn),并且還具有優(yōu)先搶占的實(shí)時(shí)性和強(qiáng)大的多任務(wù)內(nèi)核。與上一代相比它最大的改進(jìn)之處在于允許多個(gè)任務(wù)運(yùn)行于同一優(yōu)先級(jí)上,在同一個(gè)優(yōu)先級(jí)的各個(gè)任務(wù)會(huì)按時(shí)間片輪轉(zhuǎn)方式被調(diào)度,內(nèi)核對(duì)象的數(shù)量不受限制,終端禁用時(shí)鐘周期也被提升至幾乎為0。uC/OS-III支持無(wú)限多個(gè)任務(wù)、無(wú)限多個(gè)優(yōu)先級(jí)和無(wú)限多個(gè)信號(hào)量,同時(shí)支持互斥信號(hào)量、消息郵箱等任務(wù)間通信方式。uC/OS-III中的任務(wù)有兩個(gè)特點(diǎn),一是任務(wù)必須是無(wú)限循環(huán)的,二是每個(gè)任務(wù)對(duì)應(yīng)一個(gè)優(yōu)先級(jí),并且每個(gè)優(yōu)先級(jí)都是全局唯一的。從用戶角度來(lái)看,任務(wù)可以有5種狀態(tài):睡眠狀態(tài)、就緒狀態(tài)、運(yùn)行狀態(tài)、等待狀態(tài)、中斷服務(wù)狀態(tài)。
睡眠狀態(tài):即初始狀態(tài),此時(shí)任務(wù)還沒(méi)有被加載;就緒狀態(tài):調(diào)用OSTaskCreate,任務(wù)被初始化后等待內(nèi)核選擇并運(yùn)行;運(yùn)行狀態(tài):OSStat調(diào)用后,就緒狀態(tài)中優(yōu)先級(jí)最高的任務(wù)進(jìn)入運(yùn)行狀態(tài);等待狀態(tài):運(yùn)行狀態(tài)的任務(wù)調(diào)用了延時(shí)、任務(wù)同步/通信后進(jìn)入等待狀態(tài);中斷服務(wù)狀態(tài):運(yùn)行狀態(tài)的任務(wù)被中斷服務(wù)程序打斷,進(jìn)入該狀態(tài)。各個(gè)狀態(tài)之間滿足特定條件時(shí)可以相互轉(zhuǎn)換,任務(wù)轉(zhuǎn)換關(guān)系如圖1所示。
圖1 任務(wù)轉(zhuǎn)換關(guān)系
主要的巡線算法有PI算法、PID算法、模糊PID算法等,其控制流程見(jiàn)圖2。
圖2 控制算法設(shè)計(jì)流程
1.2.1PI算法
1.2.2PID算法
1.2.3模糊PID算法
模糊PID算法是在傳統(tǒng)PID算法的基礎(chǔ)上,對(duì)速度誤差和速度誤差微量進(jìn)行模糊控制的方法[9]。根據(jù)采集到的數(shù)據(jù)可以進(jìn)行更多計(jì)算,通過(guò)實(shí)時(shí)性任務(wù)調(diào)度,可以更快地對(duì)機(jī)器人進(jìn)行適當(dāng)調(diào)節(jié),使機(jī)器人能夠更好地完成預(yù)定工作。模糊PID算法的控制流程見(jiàn)圖2(c),其中控制參數(shù)中的輸入為速度誤差e和速度誤差的微分量ec。模糊控制的PID參數(shù)分別為kp(t+1)=kp(t)+Δkp,ki(t+1)=ki(t)+Δki,kd(t+1)=kd(t)+Δkd,其中Δkp、Δki和Δkd分別為各個(gè)時(shí)間周期內(nèi)的變化量。
1.3.1微處理器
在開(kāi)發(fā)板的選擇上,使用了以STM32F107(VX)型芯片為微處理器的開(kāi)發(fā)板。新型STM32的標(biāo)準(zhǔn)外設(shè)包括10個(gè)定時(shí)器、2個(gè)12位模數(shù)轉(zhuǎn)換器、2個(gè)12位數(shù)模轉(zhuǎn)換器、2個(gè)I2C接口、5個(gè)USART接口和3個(gè)SPI端口和3個(gè)高質(zhì)量數(shù)字音頻接口IIS。STM32F107型芯片具體參數(shù)如下:32位ARM Cortex-M3結(jié)構(gòu)優(yōu)化;72 MHz運(yùn)行頻率,1.25 DMIPS/MHz;硬件除法和單周期乘法;快速可嵌套中斷,6~12個(gè)時(shí)鐘周期;64~256 KB Flash,高達(dá)64 KB的SRAM;RJ45型網(wǎng)絡(luò)接口,支持10 M/100 M自適應(yīng)網(wǎng)絡(luò)。
1.3.2電機(jī)驅(qū)動(dòng)
智能車的動(dòng)力來(lái)自后方的電機(jī),使用L298N型電機(jī)驅(qū)動(dòng)芯片來(lái)控制帶有直流H橋的電路以實(shí)現(xiàn)電機(jī)的正反轉(zhuǎn),并通過(guò)調(diào)整輸入H橋的脈沖寬度來(lái)控制轉(zhuǎn)速,這樣操作起來(lái)比較方便而且穩(wěn)定性強(qiáng)。L298N型高電壓大電流驅(qū)動(dòng)芯片可以驅(qū)動(dòng)直流步進(jìn)電機(jī)等負(fù)載,可以接檢測(cè)電阻來(lái)反饋信息,還具有過(guò)壓、過(guò)流保護(hù)的功能,不用擔(dān)心燒壞電機(jī)。
1.3.3灰度傳感器
灰度傳感器被安裝在小車兩側(cè),用來(lái)檢測(cè)當(dāng)前小車所在的位置和路徑信息,并由處理器計(jì)算出電機(jī)驅(qū)動(dòng)的調(diào)整方式以調(diào)整電機(jī),使小車能正確識(shí)別路線并按照預(yù)設(shè)路線行駛?;叶葌鞲衅骺梢岳貌煌伾墓夥瓷鋵?duì)光敏電阻造成的阻值變化,以此進(jìn)行顏色深度檢測(cè)?;叶葌鞲衅魃嫌幸粋€(gè)發(fā)光二極管和一個(gè)光敏電阻,安裝在同一面上。工作時(shí),在有效距離內(nèi),檢測(cè)面會(huì)接收到由發(fā)光二極管發(fā)出的被反射后的光,光敏電阻會(huì)根據(jù)接收到的光線強(qiáng)度轉(zhuǎn)換為可識(shí)別信號(hào)。最終得到實(shí)際使用的小車,實(shí)物見(jiàn)圖3。
圖3 小車實(shí)物圖
本算法是基于uC/OS-III中的多任務(wù)管理和任務(wù)間通信機(jī)制設(shè)計(jì)的。本系統(tǒng)使用移植了uC/OS-III的STM32開(kāi)發(fā)板,由灰度傳感器采集所需要的路面信息后,通過(guò)開(kāi)發(fā)板的I/O接口交給處理器,處理器分析收集到的數(shù)據(jù)和馬達(dá)轉(zhuǎn)速,對(duì)馬達(dá)進(jìn)行調(diào)節(jié),使小車能巡線運(yùn)行。小車總體控制結(jié)構(gòu)見(jiàn)圖4。
圖4 小車控制結(jié)構(gòu)示意圖
1.4.1uC/OS-III的移植
首先要獲得STM32的庫(kù)文件和uC/OS-III的源碼,把STM32的庫(kù)文件放進(jìn)uC/OS-III文件夾中,用IAR創(chuàng)建一個(gè)工程,添加源文件,進(jìn)行IAR的參數(shù)設(shè)置。然后把主程序(main.c)中的#include "stm32_eval.h"語(yǔ)句刪除,找到stm32f10.h后選擇芯片。接下來(lái)全部重建(rebuild all),正式開(kāi)始移植uC/OS-III。在之前的uC/OS-III文件夾里建立bsp文件夾,從源代碼中復(fù)制uc-cpu、uc-lib、ucos-III到該文件夾下,將bsp.c和bsp.h復(fù)制到bsp文件夾下,添加源文件到IAR;刪除bsp.c里BSP_Init函數(shù)的內(nèi)容,屏蔽PendSV_Handler和SysTick_Handler函數(shù),修改os_cpu_c.c355行和os_cpu.h133行的函數(shù)名;修改os_cpu_a.asm的38行和133行代碼。編譯時(shí)會(huì)出現(xiàn)“無(wú)法打開(kāi)app_cfg.h”的提示,定位這句話并且刪除,如果出現(xiàn)“無(wú)法打開(kāi)os_type.h”的提示,則去源代碼目錄下將這個(gè)文件放進(jìn)工程的App目錄下。重新編譯時(shí),如出現(xiàn)別的錯(cuò)誤,則參考上述方法進(jìn)行對(duì)應(yīng)的刪除或添加文件操作。編譯時(shí)去掉對(duì)應(yīng)函數(shù)前面的static,也可以直接運(yùn)行。最后進(jìn)行系統(tǒng)測(cè)試。
1.4.2uC/OS-III的內(nèi)部任務(wù)
uC/OS-III的內(nèi)部任務(wù)主要包括空閑任務(wù)和時(shí)基任務(wù)。①空閑任務(wù):OS_IdleTask()是uC/OS-III最先創(chuàng)建的任務(wù),它獨(dú)占了最低優(yōu)先級(jí)。當(dāng)有新任務(wù)創(chuàng)建時(shí),OSTaskCreate()確保新任務(wù)的優(yōu)先級(jí)不為最低,并且當(dāng)CPU中無(wú)其他就緒任務(wù)運(yùn)行時(shí),空閑任務(wù)就開(kāi)始運(yùn)行??臻e任務(wù)運(yùn)行時(shí),處理器會(huì)處于低功耗模式,只要有其他就緒任務(wù)運(yùn)行,ISR就不會(huì)切換至空閑任務(wù),直到就緒任務(wù)都完成。等待事件發(fā)生前,系統(tǒng)切換到OSIdleTaskHook(),CPU進(jìn)入低功耗模式。②時(shí)基任務(wù):OS_TickTask()是個(gè)周期性任務(wù),它等待來(lái)自tick ISR的信號(hào)量,用于記錄任務(wù)等待期滿的時(shí)間或者等待內(nèi)核對(duì)象超時(shí),它的優(yōu)先級(jí)一般只略低于最重要任務(wù)。
1.4.3內(nèi)部任務(wù)管理
基于uC/OS-III的任務(wù)管理機(jī)制和系統(tǒng)的功能要求,把任務(wù)劃分為3個(gè)系統(tǒng)任務(wù),并設(shè)置每個(gè)任務(wù)的優(yōu)先級(jí)(表1)。其中,Start_Task獲取灰度傳感器采集到的數(shù)據(jù),使用PID算法進(jìn)行分析處理,得出電機(jī)驅(qū)動(dòng)參數(shù),并將參數(shù)賦值給全局變量,以在電機(jī)驅(qū)動(dòng)任務(wù)中使用。Start_Task1將灰度傳感器采集到的數(shù)據(jù)賦值給全局變量,以在PID算法分析任務(wù)中使用。Start_Task2對(duì)PID算法分析之后得出的電機(jī)驅(qū)動(dòng)參數(shù)進(jìn)行處理,更新輸出,完成機(jī)器人所需運(yùn)動(dòng)軌跡姿態(tài)的調(diào)整。
表1 各任務(wù)優(yōu)先級(jí)
以PID算法為例,在測(cè)試階段使用了如圖5所示的路徑對(duì)巡線機(jī)器人小車進(jìn)行性能測(cè)試。
圖5 測(cè)試路徑
實(shí)際測(cè)試時(shí)采取順時(shí)針和逆時(shí)針的方法,從不同的起點(diǎn)開(kāi)始運(yùn)行3圈。同樣方向和起點(diǎn)的測(cè)試進(jìn)行3次取平均值,所有測(cè)試結(jié)果取平均值后精確到秒,結(jié)果見(jiàn)表2。
表2 小車巡線測(cè)試結(jié)果
從表2可以看出,小車順時(shí)針運(yùn)行時(shí)主要進(jìn)行右轉(zhuǎn)和直行,逆時(shí)針運(yùn)行時(shí)則主要進(jìn)行左轉(zhuǎn)和直行。右轉(zhuǎn)所需的響應(yīng)時(shí)間比左轉(zhuǎn)要長(zhǎng)一些,故需要對(duì)小車右側(cè)傳感器位置進(jìn)行微調(diào)。調(diào)整傳感器位置后,小車在同一起點(diǎn)的順時(shí)針運(yùn)行和逆時(shí)針運(yùn)行用時(shí)基本一致。起點(diǎn)為B和D的測(cè)試用時(shí)比起點(diǎn)為A和C的測(cè)試用時(shí)長(zhǎng)一些,可能是因?yàn)槠瘘c(diǎn)在彎曲軌跡時(shí)對(duì)小車巡跡的影響稍大。
為了分析不同算法對(duì)機(jī)器人小車巡線性能控制的差異,以A為起點(diǎn),分別對(duì)PI算法、PID算法和模糊PID算法控制的機(jī)器人小車進(jìn)行順時(shí)針巡線測(cè)試。分別設(shè)置1圈、3圈、5圈、10圈和20圈共5組,每組平行測(cè)試3次,所有測(cè)試結(jié)果取平均值后精確到秒,結(jié)果見(jiàn)表3。
表3 不同控制算法的巡線測(cè)試結(jié)果
從表3可以看出,在測(cè)試圈數(shù)不變的情況下,完成測(cè)試用時(shí)由短至長(zhǎng)的排序?yàn)槟:齈ID算法、PID算法、PI算法。同一控制算法中,隨著測(cè)試圈數(shù)的增加,完成每圈測(cè)試的平均用時(shí)逐漸增加,說(shuō)明各個(gè)算法在長(zhǎng)時(shí)間運(yùn)行過(guò)程中可靠性逐漸降低,按照平均用時(shí)誤差由大至小排序?yàn)镻I算法、PID算法、模糊PID算法。其中,模糊PID算法的誤差最小,說(shuō)明模糊PID算法根據(jù)采集到的數(shù)據(jù)可以進(jìn)行更多計(jì)算,通過(guò)實(shí)時(shí)性任務(wù)調(diào)度,可以更快地對(duì)機(jī)器人小車進(jìn)行適當(dāng)調(diào)節(jié),使機(jī)器人小車能夠更好地完成預(yù)定工作。
本研究基于uC/OS-III實(shí)現(xiàn)巡線算法及數(shù)據(jù)處理,使用灰度傳感器進(jìn)行顏色深淺檢測(cè)從而判斷路徑。反饋的數(shù)據(jù)為數(shù)字信號(hào),易于使用,不需要進(jìn)行A/D轉(zhuǎn)換,可通過(guò)量化不同的反饋信息得到路徑信息。在控制速度的時(shí)候使用PID控制算法,在控制電機(jī)的時(shí)候?yàn)榱诉_(dá)到盡快加速或減速的目的,主要使用了P控制,在不同速度期望值下引入了不同PID參數(shù)。此外,分別采用PI算法、PID算法和模糊PID算法對(duì)機(jī)器人小車進(jìn)行巡線測(cè)試發(fā)現(xiàn),模糊PID算法更能滿足巡線機(jī)器人的工作需求。