系統(tǒng)功能及應(yīng)用
本系統(tǒng)主要完成將智能車(chē)行駛過(guò)程中的各種狀態(tài)信息(如傳感器亮滅,車(chē)速,舵機(jī)轉(zhuǎn)角,電池電量等)實(shí)時(shí)地以無(wú)線串行通信方式發(fā)送至上位機(jī)處理,并繪制各部分狀態(tài)值關(guān)于時(shí)間的曲線。有了這些曲線就不難看出智能車(chē)在賽道各個(gè)位置的狀態(tài),各種控制參數(shù)的優(yōu)劣便一目了然了。尤為重要的是對(duì)于電機(jī)控制PID參數(shù)的選取,通過(guò)速度—時(shí)間曲線可以很容易發(fā)現(xiàn)各套PID參數(shù)之間的差異。對(duì)于采用CCD 傳感器的隊(duì)伍來(lái)說(shuō),該系統(tǒng)便成為了調(diào)試者的眼睛,可以見(jiàn)智能車(chē)之所見(jiàn),相信對(duì)編寫(xiě)循線算法有很大幫助。而且還可以對(duì)這些數(shù)據(jù)作進(jìn)一步處理,例如求取一階導(dǎo)數(shù),以得到更多的信息。
系統(tǒng)的硬、軟件設(shè)計(jì)
設(shè)計(jì)方案主要分成三部分:車(chē)載數(shù)據(jù)采集系統(tǒng),無(wú)線數(shù)傳系統(tǒng),上位機(jī)數(shù)據(jù)處理系統(tǒng)。系統(tǒng)基本構(gòu)建如圖1所示。
圖1智能實(shí)時(shí)監(jiān)測(cè)系統(tǒng)結(jié)構(gòu)框圖與流程圖
車(chē)載數(shù)據(jù)采集系統(tǒng)
車(chē)載數(shù)據(jù)采集系統(tǒng)主要由單片機(jī)負(fù)責(zé)采集賽車(chē)行駛過(guò)程中的速度、傳感器狀態(tài)、電池電壓、舵機(jī)轉(zhuǎn)角等信息。為了使監(jiān)測(cè)系統(tǒng)不占用S12單片機(jī)的內(nèi)部資源并且支持熱插拔,我們將除供電之外的監(jiān)測(cè)系統(tǒng)與智能車(chē)控制系統(tǒng)相分離。我們選擇ATMEL公司的ATMEGA16單片機(jī)作為該數(shù)據(jù)采集系統(tǒng)的處理器。二值型光電傳感器信號(hào)的采集直接使用該單片機(jī)的I/O口進(jìn)行采集,連續(xù)型光電傳感器、電池電壓及CCD攝像頭信號(hào)則采用該單片機(jī)的A/D口進(jìn)行采集,速度信息則通過(guò)光電編碼器和該單片機(jī)的計(jì)數(shù)器來(lái)采集。采集到的數(shù)據(jù)每20ms向上位機(jī)發(fā)送一次。
無(wú)線數(shù)傳系統(tǒng)
下位機(jī)向上位機(jī)傳輸?shù)氖且悦?0ms傳輸一組包含了光電編碼器值(speed),電池電壓(battery),舵機(jī)轉(zhuǎn)角值(angle),傳感器當(dāng)前狀態(tài) (sensor)的數(shù)據(jù),如果是在理想狀態(tài)下,上位機(jī)接收到的應(yīng)是上述各值循環(huán)出現(xiàn)的周期性數(shù)據(jù),此時(shí)上位機(jī)只需將這些數(shù)據(jù)按順序裝入各自的數(shù)組并畫(huà)圖即可。但在實(shí)際的無(wú)線傳輸過(guò)程中可能出現(xiàn)數(shù)據(jù)丟失現(xiàn)象。因此加入適當(dāng)?shù)臄?shù)據(jù)校驗(yàn)是必要的,否則會(huì)出現(xiàn)數(shù)據(jù)裝入錯(cuò)誤,造成畫(huà)圖的混亂。我們?cè)趯?shí)際過(guò)程中是在每組數(shù)據(jù)中加入0x00,0xff的幀頭,當(dāng)數(shù)據(jù)出現(xiàn)錯(cuò)誤時(shí),則舍棄該幀數(shù)據(jù)。
數(shù)據(jù)的無(wú)線收發(fā)部分采用的是SUNRAY公司的QC96型無(wú)線收發(fā)模塊,該模塊可以收發(fā)波特率為9600bps的串行數(shù)據(jù),距離可達(dá)100m。
上位機(jī)的數(shù)據(jù)接收及處理
上位機(jī)部份主要由四個(gè)模塊構(gòu)成:
·數(shù)據(jù)接收模塊
功能:上位機(jī)通過(guò)串口采集下位機(jī)發(fā)送的原始數(shù)據(jù)。
實(shí)現(xiàn):VC++中實(shí)現(xiàn)串口通信一般有二種方式,分別是MSComm控件和Windows API函數(shù)。MSComm簡(jiǎn)潔易用,適用于比較簡(jiǎn)單的系統(tǒng),Windows API函數(shù)應(yīng)用較廣但比較復(fù)雜繁瑣,由于此模塊的串口通信功能相對(duì)簡(jiǎn)單,本系統(tǒng)采用前者。在實(shí)際過(guò)程中使用的是事件驅(qū)動(dòng)的方式,這種方法響應(yīng)及時(shí),可靠性高,并且比查詢法占用更少的資源。
·存儲(chǔ)模塊
功能:可直接存儲(chǔ)采集到的原始數(shù)據(jù),以備以后更多的分析處理。
實(shí)現(xiàn):在每個(gè)OnComm事件被觸發(fā)后,將串口接收到的數(shù)據(jù)直接存入temp臨時(shí)文件,并且可以在用戶的要求下將temp臨時(shí)文件里的值存儲(chǔ)到指定文件。
·數(shù)據(jù)的分析和處理模塊
功能:將采集到的原始數(shù)據(jù)進(jìn)行用戶選定的分析和處理,主要包括丟棄錯(cuò)誤數(shù)據(jù),以及去除幀頭并進(jìn)行數(shù)據(jù)裝入任務(wù),同時(shí)也可以對(duì)已保存的數(shù)據(jù)進(jìn)行分析和處理。
實(shí)現(xiàn):將temp臨時(shí)文件或用戶指定文件的數(shù)據(jù)讀出并裝入,以下為主要程序代碼:
void CChuankokjDlg::find_data(car_data c_data[], BYTE c_source[], int c_length)
?。?
int i=0;
while(i
?。?if((c_source[i]==0x00)&&(c_source[i+1]==0 xff)&&(c_source[i+6]==0x0 0)&&(c_source[i+7]==0xff))//判斷幀頭并進(jìn)行數(shù)據(jù)裝入
?。?
c_data[length].speed_data=c_source[i+2];
c_data[length].battary_data=c_source[i+3];
c_data[length].direction_data=c_source[i+4];
c_data[length].sensor_data=c_source[i+5];
i=i+1;
?。?
else
i++;
?。?
?。?
·圖形顯示模塊
功能:以圖形界面來(lái)顯示處理后的數(shù)據(jù),以便更直觀地觀察智能車(chē)的運(yùn)行狀態(tài)。
實(shí)現(xiàn):將上一模塊中裝入各數(shù)組的數(shù)據(jù)在用戶的選擇的模式下進(jìn)行畫(huà)圖,可以只看一幅圖,也可以將四幅圖放在一起進(jìn)行對(duì)比觀看。實(shí)際的運(yùn)行界面及效果如圖2。
圖2 圖形顯示介面運(yùn)行模塊
結(jié)語(yǔ)
該系統(tǒng)通過(guò)添加無(wú)線收發(fā)模塊,將智能車(chē)的實(shí)時(shí)狀態(tài)信息傳到上位機(jī)上,通過(guò)VC++編程,用圖象直觀形象地將其表現(xiàn)出來(lái),很好地達(dá)到了對(duì)智能車(chē)狀態(tài)實(shí)時(shí)監(jiān)測(cè)的目的,極大地方便了我們調(diào)節(jié)PID等智能車(chē)參數(shù),對(duì)賽道記憶算法的研究提供了很大的幫助。