胡斯陽(yáng),周 俊
(上海工程技術(shù)大學(xué) 機(jī)械與汽車(chē)工程學(xué)院,上海 201620)
海洋蘊(yùn)含著豐富的資源,是人類生存的第二空間,合理利用、開(kāi)發(fā)和監(jiān)測(cè)海洋資源對(duì)于人類社會(huì)的可持續(xù)發(fā)展將起到巨大的作用。水下機(jī)器人為人類進(jìn)行海洋資源的開(kāi)發(fā)提供了強(qiáng)有力的工具[1]。水下機(jī)器人它是接近人類所不能到達(dá)的水下空間的唯一手段,其應(yīng)用范圍很廣[1]。但是我國(guó)水下機(jī)器人起步相對(duì)較晚,還處于行業(yè)發(fā)展初期,對(duì)操作簡(jiǎn)單、功能齊全的水下機(jī)器人進(jìn)行快速設(shè)計(jì)的方式還有待深入研究。
基于Simulink 建模與仿真,使用MATLAB/Simulink 軟件的MBD 技術(shù)對(duì)水下機(jī)器人的各模塊進(jìn)行研究和設(shè)計(jì)。首先在計(jì)算機(jī)上通過(guò)Simulink 搭建模型;然后用Simulink 進(jìn)行模型的仿真;再根據(jù)目標(biāo)需求對(duì)仿真結(jié)果進(jìn)行評(píng)價(jià)及驗(yàn)證;當(dāng)滿足設(shè)計(jì)要求后,利用TSP 工具生成嵌入式代碼。通過(guò)Simulink Coder/Embedded Coder 等模塊將代碼進(jìn)行優(yōu)化和測(cè)試來(lái)實(shí)現(xiàn)控制算法的開(kāi)發(fā)和驗(yàn)證,最后將代碼傳輸至目標(biāo)硬件開(kāi)發(fā)板中對(duì)硬件進(jìn)行調(diào)用,實(shí)現(xiàn)水下機(jī)器人的各模塊的快速設(shè)計(jì),提高設(shè)計(jì)的效率[2]。
水下機(jī)器人本體硬件主要由電控模塊、傳感器模塊、電源模塊、機(jī)械臂模塊和動(dòng)力模塊組成,其結(jié)構(gòu)分析圖如圖1 所示。
圖1 水下機(jī)器人的設(shè)計(jì)模塊
電控模塊的硬件主要包括Arduino 開(kāi)發(fā)板、擴(kuò)展模塊和電子調(diào)速器,負(fù)責(zé)接收傳感器的信號(hào)并通過(guò)電子調(diào)速器來(lái)調(diào)節(jié)電機(jī)的電壓大小來(lái)調(diào)節(jié)電機(jī)的轉(zhuǎn)速。
傳感器模塊的硬件主要包括流速傳感器、陀螺儀、溫度傳感器、姿態(tài)傳感器等,不同的傳感器能及時(shí)將不同的信號(hào)傳輸給主控制板,從而讓主控制板通過(guò)程序?qū)ζ渌南到y(tǒng)起到宏觀的調(diào)控。
機(jī)械臂模塊的硬件主要包括亞克力板和防水舵機(jī),機(jī)械臂由無(wú)線通信模塊進(jìn)行控制,可對(duì)一定樣品進(jìn)行抓取、回收或者放置。而電源模塊主要由鋰電池和繼電器模組組成,能夠?qū)崿F(xiàn)變壓和供電,為各個(gè)系統(tǒng)穩(wěn)定的持續(xù)供電。
動(dòng)力模塊主要由兩種型號(hào)不同的推進(jìn)器組成,一種叫游離推進(jìn)器負(fù)責(zé)在水平面上給予無(wú)人機(jī)動(dòng)力,另一種叫垂直推進(jìn)器負(fù)責(zé)維持無(wú)人機(jī)在垂直方向上的動(dòng)力,游離推進(jìn)器的動(dòng)力主要受到流速傳感器的控制,垂直推進(jìn)器的動(dòng)力受姿態(tài)傳感器和陀螺儀的控制。
推進(jìn)系統(tǒng)由游行推進(jìn)器和垂直推進(jìn)器組成。在經(jīng)過(guò)多方面的考察評(píng)估后,本系統(tǒng)采用無(wú)刷電機(jī)作為推進(jìn)系統(tǒng)的電機(jī)。無(wú)刷電機(jī)電動(dòng)機(jī)的定子繞組多為三相對(duì)稱星形接法,與同三相異步電動(dòng)機(jī)十分相似,但無(wú)刷直流電動(dòng)機(jī)是以自控式運(yùn)行的,所以不需要另加啟動(dòng)繞組,也不會(huì)在負(fù)載發(fā)生突變時(shí)產(chǎn)生振蕩或失步。
本設(shè)計(jì)中的主控制板采用Arduino Mega ADK 開(kāi)發(fā)板,其引腳資源豐富,從低端的LED 控制到要求比較高的用戶圖形界面設(shè)計(jì)都能滿足[3]。而且Arduino開(kāi)源電子平臺(tái)使用方便,同時(shí),MATLAB/Simulink 對(duì)Arduino 提供了豐富的硬件支持包,用戶可根據(jù)實(shí)際需求進(jìn)行選擇。
使用MBD 技術(shù)對(duì)無(wú)刷電機(jī)模塊進(jìn)行設(shè)計(jì),先模擬無(wú)刷電機(jī)在正常供電下的運(yùn)轉(zhuǎn),采用穩(wěn)定的電流電壓給電機(jī)供能,而Simulink 中Pulse Generator 模塊可以用于產(chǎn)生脈沖信號(hào),因此考慮使用Pulse Generator模擬電機(jī)輸出的脈沖信號(hào)進(jìn)行信號(hào)源輸入,并預(yù)設(shè)0 ~2 s 內(nèi)電機(jī)輸出頻率為50 Hz,幅值為1,占空比為0.5 的脈沖信號(hào)(100 個(gè)脈沖),其仿真模型圖如圖2 所示。
圖2 無(wú)刷電機(jī)仿真模型圖
根據(jù)Simulink 庫(kù)中的范例可以對(duì)無(wú)刷電機(jī)工作進(jìn)行仿真與測(cè)試,以下模型測(cè)試了無(wú)刷直流電機(jī)在一定條件下的速度。其速度與時(shí)間關(guān)系圖和扭矩與時(shí)間關(guān)系圖(圖3),可以得出負(fù)載扭矩是一個(gè)恒定值,始終與軸的旋轉(zhuǎn)方向相反的結(jié)論。
圖3 速度與時(shí)間關(guān)系圖和扭矩與時(shí)間關(guān)系圖
在根據(jù)模型的仿真結(jié)果規(guī)定了電機(jī)的速度與扭矩后,運(yùn)用TSP 工具箱進(jìn)行代碼的生成和運(yùn)行。完成代碼的生成后,再對(duì)Arduino 中的電子調(diào)速器以及PWM 信號(hào)的取值進(jìn)行優(yōu)化,并且根據(jù)輸入與速度的變化規(guī)定電機(jī)在不同工作條件下合適的信號(hào)輸入。
機(jī)械臂與傳感器的設(shè)計(jì)充分利用MBD 技術(shù)的優(yōu)勢(shì),通過(guò)Arduino 的硬件支持包提供的元件與引腳模塊,快速完成模型的建立與調(diào)試,為設(shè)計(jì)過(guò)程提供便利[4]。
機(jī)械臂的運(yùn)動(dòng)主要通過(guò)伺服電機(jī)的轉(zhuǎn)動(dòng)帶動(dòng)機(jī)械結(jié)構(gòu)的運(yùn)動(dòng)來(lái)實(shí)現(xiàn)(圖4)。先通過(guò)Simulink 中的Arduino 硬件支持包(TSP)直接在Simulink 中建立伺服電機(jī)的模型,如圖5 所示。單個(gè)伺服電機(jī)模型將Arduino 模擬引腳A0 的值映射為舵機(jī)轉(zhuǎn)動(dòng)角度,對(duì)舵機(jī)的角度實(shí)施控制。因?yàn)槟M引腳A0 的輸出范圍為0 ~1023,為了維持舵機(jī)轉(zhuǎn)動(dòng)在0 ~180°內(nèi),從Simulink Math Operations 庫(kù)將Gain 模塊拖到模型中,并將其放在連接Analog Input 和Standard Servo Write模塊的線上,將增益模塊的K值設(shè)置為0.1760。
水下機(jī)器人通過(guò)無(wú)線模塊建立通信系統(tǒng),使用WiFi 模塊來(lái)進(jìn)行模型建立與仿真,如圖5 所示。串口WIFI 模塊一般會(huì)包含射頻電路、MAC 地址、無(wú)線安全協(xié)議、WIFI 驅(qū)動(dòng)和協(xié)議、等多個(gè)部分。其功能是將串口或TTL 電平轉(zhuǎn)換為符合WIFI 無(wú)線網(wǎng)絡(luò)通信標(biāo)準(zhǔn)的數(shù)據(jù)傳輸模塊,從而實(shí)現(xiàn)無(wú)線數(shù)據(jù)傳輸、采集或控制。
圖5 WIFI 模塊仿真模型圖
在Simulink 中使用工具欄上的Deploy to Hardware 按鈕,等待WIFI Shield Link LED 亮起,若亮起則表示已成功連接到WIFI 網(wǎng)絡(luò)。再打開(kāi)TCP/IP 的主機(jī)發(fā)送模型,使用TCP/IP 發(fā)送塊,確保IP 地址和端口號(hào)與之前指定的WIFI Shield 設(shè)置相匹配。主機(jī)模型使用Instrument Control Toolbox 中的模塊向目標(biāo)硬件發(fā)送和接收TCP/IP 或UDP 消息。
對(duì)于水下機(jī)器人傳感器的使用這里采用一種測(cè)量水溫的溫度傳感器來(lái)制作傳感器的模型,Simulink中Arduino 硬件的支持包能使用I2C 接口與基于I2C的設(shè)備通信。所以選擇用數(shù)字溫度傳感器來(lái)通信,該傳感器通過(guò)I2C 總線與Arduino 板連接。默認(rèn)情況下,它將發(fā)送分辨率為0.0625 ℃的12 位溫度值。還可以將此傳感器配置為提供13 位溫度測(cè)量的擴(kuò)展模式,具體操作如下。
對(duì)溫度傳感器模塊的系統(tǒng)進(jìn)行建模(圖6),在此模型中數(shù)據(jù)類型轉(zhuǎn)換模塊將讀取的數(shù)據(jù)轉(zhuǎn)換至int16來(lái)處理溫度。Gain 模塊用于將int16 數(shù)據(jù)右移4 位(除以16)并將12 位數(shù)據(jù)與0.0625 的傳感器分辨率相乘,以獲得相應(yīng)的溫度(攝氏度為單位)。值為1 和0 的兩個(gè)Constant 模塊與Switch 模塊一起使用,將溫度讀數(shù)與27 ℃的閾值進(jìn)行比較。當(dāng)溫度傳感器讀數(shù)超過(guò)指定的溫度閾值時(shí),這會(huì)在引腳13 處點(diǎn)亮Arduino 的板載LED。
圖6 溫度傳感器仿真模型圖
在完成水下機(jī)器人的主要部件的建模與仿真后,需要完成模型向代碼轉(zhuǎn)化,由模型生成代碼的過(guò)程如圖8 所示。首先通過(guò)rtw build 命令將Simulink 模型轉(zhuǎn)化為rtw 文件,然后用Simulink Coder/Embedded Coder 中的目標(biāo)語(yǔ)言編譯器(Target Language Compiler)將rtw 文件轉(zhuǎn)換各類源文件(主要為C 文件,h 文件),在模型的源代碼生成之后,使用Simulink 提供的模版自動(dòng)生成makefile 來(lái)編譯各鏈接得到目標(biāo)文件,最終將目標(biāo)文件的程序代碼通過(guò)Arduino IDE 下載到開(kāi)發(fā)板中進(jìn)行仿真或?qū)崣C(jī)運(yùn)行[5]。如圖7 所示。
圖7 代碼生成流程圖
在完成模型向代碼的轉(zhuǎn)化后,需要將代碼燒錄進(jìn)Arduino 開(kāi)發(fā)板、或仿真平臺(tái),驗(yàn)證代碼的可靠性,本設(shè)計(jì)采用兼容Arduino 的一個(gè)模擬仿真平臺(tái)對(duì)生成的代碼進(jìn)行適用性的驗(yàn)證,其仿真的模型如圖8 所示。在進(jìn)行模擬仿真后確認(rèn)了生成的代碼能夠按照規(guī)定和需求對(duì)硬件實(shí)監(jiān)控與調(diào)整,達(dá)到了設(shè)計(jì)的目的和需求。
圖8 Arduino 各模塊模擬仿真
基于模型的設(shè)計(jì)方法,本設(shè)計(jì)通過(guò)調(diào)試數(shù)學(xué)函數(shù)模型建立目標(biāo)模型,并進(jìn)行仿真與調(diào)試,在仿真結(jié)果符合需求的前提下運(yùn)用TSP 工具進(jìn)行代碼的自動(dòng)生成與優(yōu)化,系統(tǒng)由MATLAB 發(fā)起連接請(qǐng)求并與Arduino 建立連接后,開(kāi)始數(shù)據(jù)的采集、分析與顯示。Arduino 端的數(shù)據(jù)預(yù)處理模塊功能如由MATLAB 來(lái)完成,則可省略,只需將所有原始數(shù)據(jù)由串口輸出即可。結(jié)果是優(yōu)化了開(kāi)發(fā)產(chǎn)品的過(guò)程,避免了在Arduino中的繁瑣的編程工作。但是MATLAB 的數(shù)據(jù)分析與處理模塊中涉及算法也需根據(jù)系統(tǒng)需求設(shè)計(jì),不能完全依賴于所設(shè)計(jì)的模型。使用這種設(shè)計(jì)研發(fā)方式節(jié)約了編寫(xiě)代碼和優(yōu)化代碼的時(shí)間,是一種可推廣的研發(fā)方式。
基于Simulink 的模型建造和仿真與Arduino 合作設(shè)計(jì)產(chǎn)品結(jié)合起來(lái)有助于快速建立系統(tǒng)研究所需的仿真環(huán)境。從設(shè)計(jì)階段就可以通過(guò)模型仿真對(duì)設(shè)計(jì)思想進(jìn)行早期驗(yàn)證,從而降低傳統(tǒng)開(kāi)發(fā)流程中到了測(cè)試階段發(fā)現(xiàn)問(wèn)題再回頭修改設(shè)計(jì)并重新進(jìn)行測(cè)試流程的風(fēng)險(xiǎn),而且自動(dòng)代碼生成消除了手寫(xiě)代碼引入的bug,提高了產(chǎn)品開(kāi)發(fā)和研究效率[6]。