Adams/Car和Matlab聯合模擬
網上給的Adams/Car+Matlab/Simulink聯合模擬教程很多,但是我自己調卻仍然出各種問題,最後終於成功,感慨中間全是細節……
本人是個Adams小白,之前完全沒接觸過,所以才出各種問題,大神們勿噴。
言歸正傳,記錄一下步驟和我遇到過的問題,給大家一個參考。
聯合模擬教程
首先確保Adams/Car和Matlab都是32位或都是64位,否則會出錯誤,以下我以64位為例。然後確保兩者工作路徑一致,這裡可以直接在兩個程式的桌面快捷方式右鍵->屬性->起始位置中定義。程式開啟後的儲存路徑就預設為你設定的工作路徑了。把Adams安裝目錄下Controls\win64\adams_plant.mexw64複製到你之前設定的工作路徑中,防止後面出錯。
在啟動Adams/Car之前,你需要先到C:\User(使用者)\xxx(你的使用者名稱)\.acar,在最上面Desired user mode中輸入如下:
這樣你才能在Adams/Car中開啟View介面。!----------------------------------------------------------------------! ! Desired user mode (standard/expert) ENVIRONMENT MDI_ACAR_USERMODE standard ENVIRONMENT MDI_ACAR_USERMODE expert ENVIRONMENT MDI_ACAR_PLUS_AVIEW yes ! !----------------------------------------------------------------------!
然後我這必須先啟動一個License Server(沒細究為什麼),然後啟動Adams/Car,File->Open->Assembly,在Assembly Name白框中右鍵->Search-><acar_shared>/assemblies.tbl開啟MDI_Demo_Vehicle.asy官方例車。
隨後開始進行聯合模擬設定:
1.輸入輸出變數定義
正常來說,自己新建的模型中需要自定義變數,新建變數參考百度文庫這篇。但是例車上已有了相應變數,因此只需將其指定為輸入輸出變數即可。這裡以輸出body_velocity_x為例,按照需求自行調整。注意:加粗部分很關鍵!!!
首先,Tools->Plugin Manager中Adams/Controls的兩個框打鉤。
然後,Tools->Adams/View Interface開啟另一檢視,確保此時左偏上的下拉選單顯示的是MDI_Demo_Vehicle.testrig。
稍微解釋下上面的原因,我的理解是整車裝配會把包括SDI和車體各個部分的變數全部從整車模型的介面中引出,所以控制器中的變數你都可以在MDI_Deno_Vehicle.testrig中找到。而如果你輸出變數直接從SDI中定義,你會發現輸出的.m檔案中介面號都是0,即無法連線到對應介面。所有輸入輸出變數都必須從MDI_Demo_Vehicle下的變數定義。
點選上方標籤欄Elements左側的Pout定義輸出變數,Plant Output Name改為.MDI_Demo_Vehicle.testrig.POUTPUT_speed(這裡隨便起),Id按自動生成的,Comment不用填,Variable Name框裡右鍵->Variable Class->Browse,選擇MDI_Demo_Vehicle->testrig->body_velocity_x,OK確定。
同樣,點選上方標籤欄Elements左側的Pin定義輸入變數。右側邊欄Browse->Elements->Data Elements中能夠看到四個例車中定義的輸出變數,其中包括driver_demands一項。雙擊開啟,能夠看到Variable Name中包括
.MDI_Demo_Vehicle.testrig.vas_steering_demand.variable,
.MDI_Demo_Vehicle.testrig.vas_throttle_demand.variable,
.MDI_Demo_Vehicle.testrig.vas_brake_demand.variable,
.MDI_Demo_Vehicle.testrig.vas_gear_demand.variable,
.MDI_Demo_Vehicle.testrig.vas_clutch_demand.variable
這五項。而這五項則是模擬激勵輸出中各控制策略的5個輸入。這5個變數將在第三節中詳細介紹,這裡僅給出結論:通過實際測試,發現只有當輸入變數是例車中的這5個輸入時,才會對輸出產生影響,即在生成的Simulink檔案中改變輸入,在輸出端看到了變化。而將其他一些量作為輸入,發現模擬的輸出並沒有改變。這裡僅是我個人的嘗試結果,如果有其他見解請務必留言交流,非常感謝!
Plant Output Name改為.MDI_Demo_Vehicle.testrig.PINPUT_brake,Id按自動生成的,Comment不用填,Variable Name框裡右鍵->Variable Class->Browse,選擇MDI_Demo_Vehicle->testrig->vas_brake_demand->variable,OK確定。
2.整車模型輸出
標籤欄切換到Plugins,點選Controls->Plant Export,彈出視窗中修改File Prefix為car_1(隨便寫,後面匹配即可),點選Input_Signal處From Pinput,新增MDI_Demo_Vehicle中的PINPUT_torque,確保變數在下面框中第一行(我的默認出現在第二行,會報錯)。同樣步驟操作右側框,新增MDI_Demo_Vehicle中的PINPUT_angle。然後修改Target Software為MATLAB,Adams/Solver Choice改成Fortran(C++沒試過),確定。此時你的工作路徑中應該出現了acar.txt(操作記錄),car_1.m檔案和adams_plant.mexw64。
3.模擬激勵輸出
左上Tools->Select Mode->Switch to A/Car Standard Interface切換回介面,Simulate->Full-Vehicle Analysis->File Driven Events,設定Output Prefix為speed,Simulation Mode設為files_only,Driver Control Files中右鍵<acar_shared>/driver_controls.tbl,你可以看到彈出的資料夾中包含很多.dcf檔案,這些就是例車的駕駛控制檔案。請按照此路徑開啟資料夾,複製其中的一個.dcf並重命名為test.dcf,用記事本開啟,參照這篇教程中第8章駕駛機器部分對檔案進行修改。讀完教程後,你應當就對上面的5個輸入變數有了一定認識,這裡我的理解是整輛車只有這5個變數是自變數,其他所有變數都是因變數,故而你對其他變數輸入的數值會被計算數值所覆蓋,而這5個變數則是可以輸入的介面。這裡我簡單的將所有5個輸入改成開環控制,完整文字如下:
$---------------------------------------------------------------------MDI_HEADER
[MDI_HEADER]
FILE_TYPE = 'dcf'
FILE_VERSION = 2.0
FILE_FORMAT = 'ASCII'
(COMMENTS)
{comment_string}
'DCF file for cosimulation'
$--------------------------------------------------------------------------UNITS
[UNITS]
LENGTH = 'meter'
FORCE = 'newton'
ANGLE = 'deg'
MASS = 'kg'
TIME = 'sec'
$---------------------------------------------------------------------EXPERIMENT
[EXPERIMENT]
EXPERIMENT_NAME = 'COSIMULATION'
STATIC_SETUP = 'STRAIGHT'
INITIAL_SPEED = 16.667
INITIAL_GEAR = 3
INITIAL_CLUTCH = 0
(MINI_MANEUVERS)
{mini_manuever abort_time step_size}
'COSIMULATION' 12.0 0.1
$--------------------------------------------------------------------COSIMULATION
[COSIMULATION]
(STEERING)
ACTUATOR_TYPE = 'ROTATION'
METHOD = 'OPEN'
MODE = 'ABSOLUTE'
CONTROL_TYPE = 'CONSTANT'
CONTROL_VALUE = 0
(THROTTLE)
METHOD = 'OPEN'
MODE = 'ABSOLUTE'
CONTROL_TYPE = 'CONSTANT'
CONTROL_VALUE = 0
(BRAKING)
METHOD = 'OPEN'
MODE = 'ABSOLUTE'
CONTROL_TYPE = 'CONSTANT'
CONTROL_VALUE = 0
(GEAR)
METHOD = 'OPEN'
MODE = 'ABSOLUTE'
CONTROL_TYPE = 'CONSTANT'
CONTROL_VALUE = 3
(CLUTCH)
METHOD = 'OPEN'
MODE = 'ABSOLUTE'
CONTROL_TYPE = 'CONSTANT'
CONTROL_VALUE = 0
(END_CONDITIONS)
{measure test value allowed_error filter_time delay_time group}
'VELOCITY' '<<' 1 0.1 0.0 0.0
這裡推薦在修改完成後,先把上文的Simulation Mode設為interactive,執行後用Review->Animation Controls進行模擬,觀察自己的設定是否正確(也可以在Review->PostProcessing Window中顯示變數變化曲線),以確定.dcf檔案修改正確。然後刪除掉除工作路徑中除步驟2中提到的檔案外的其他檔案,重新執行模擬激勵輸出,Simulation Mode設為files_only,繼續下面的步驟。
files_only輸出後,你在Message Windows中應該看不到任何Error並提示written successfully,如果有請重複輸出一遍,還有就請檢查你的變數設定。檢查你的工作路徑,這時應當出現了名為speed_test(即以test為.dcf檔案的名為speed的檔案)的6個檔案(包括.acf和.m檔案)和名為speed_test_controls的.acf檔案。
4.聯合模擬實現
開啟Matlab,開啟工作路徑中的car_1.m檔案,ADAMS_prefix = 'car_1' 修改為ADAMS_prefix = 'speed_test' ,ADAMS_init = 'file/command=car_1_controls.acf' 修改為ADAMS_init = 'file/command=speed_test_controls.acf' ,儲存檔案。
在Matlab命令列視窗中輸入car_1,此時應當顯示
%%% INFO : ADAMS plant actuators names :
1 xxxxxxxx
%%% INFO : ADAMS plant sensors names :
1 xxxxxxxx
並且在右側載入了很多變數。在命令列中繼續輸入adams_sys,應當彈出Simulink視窗,包括兩個紅色框和一個名為adams_sub的橙色框。左上角新建模型,將adams_sub(橙色框)複製進去,新增階躍輸入,輸出接示波器,然後點選執行。模型底部一開始會顯示compiling,當顯示running後表面模型編譯成功,此時就可以開啟示波器檢視引數了。推薦輸入用一個階躍輸入,輸入數值要大(因為預設單位較小,比如速度單位是mm/s,力矩單位N·mm),我的例子中設定為了10000,看到了明顯變化。
以上就是聯合模擬的全部步驟,下面就可能遇到的問題給出說明。
可能遇到的問題
1.Adams/Car模擬激勵輸出錯誤
Adams中問題報錯:
ERROR: Invalid operand in expression
ERROR: ( <<,>>.__MDI_SDI_TESTRIG.steering_wheel_torque )
並且沒有輸出curve_crc.m和curve_crc_controls.acf,開啟car_1.m檔案後,ADAMS_uy_ids的兩個量都是0。
解決方法:輸入輸出變數設定部分,應當選擇MDI_Demo_Vehicle->testrig下的變數。
2.Simulink中S-function不存在
Simulink中問題報錯:
Error reported by S-function 'adams_plant':S-Function 'adams_plant' does not exist
解決方法:將Adams安裝路徑下controls->win64下的adams_plant.mexw64拷貝到工作路徑中
3.Simulink中S-function啟動失敗
Simulink中問題報錯:
Error reported by S-function 'adams_plant' in xxxxx:Error in Adams(server) simulation startup.
解決方法:仍然應該是輸入輸出變數的定義部分出現錯誤,請仔細按照教程檢查。
4.Simulink編譯成功,執行中終止
Simulink中問題報錯:
Error reported by S-function 'adams_plant' in 'untitled/adams_sub/ADAMS Plant/S-Function':
AEI_Outputs: Adams output evaluation failure at time 0.005000
解決方法:這裡是由於你在第三步中設定的引數出現錯誤所導致的。具體原理我不太懂,估計是車做不到按你設定的引數運動。