MOOS-ivp 實驗三 MOOS簡介(2)

鐵血豆丁發表於2020-09-29

MOOS-ivp 實驗三 MOOS簡介(2)

繼上一篇文章繼續對實驗進行記錄



四、Launching a Mission with pAntler

一組MOOS應用通常需要多個終端介面來進行打,這使得其操作變得很麻煩,而pAntler可以將這些內容通過一個mission檔案進行表達,在這個檔案中,一行程式碼宣告的所有app都可以通過呼叫pAntler來啟動。pAntler

1.Basic pAntler Usage

基本上所有的.moos檔案的配置程式的第一部分都是pAntler。一般使用ProcessConfig = Anlter宣告如下內容:

ProcessConfig = ANTLER
{
MSBetweenLaunches = 200
Run = MOOSDB  @ NewConsole = true/false
Run = AnotherApp  @ NewConsole = true/false
...
Run = AnotherApp  @ NewConsole = true/false
}

其中,MSBetweenLaunches = 200是設定啟動程式之間的毫秒數,這裡設定為200毫秒。其後每一行都指定了需要開啟的應用以及是否為其開啟控制檯視窗。除了普通的啟動配置之外,啟動配置還包括了用別名給應用進行啟動以及配置更詳細的引數進行啟動,具體內容可以參見網站的文件。

2.An Example: Launching the MOOSDB along with uXMS

這裡做一個實驗,我們使用pAntler來啟動MOOSDB的同時啟動uXMS。

1.首先先建立一個mission檔案並且將其儲存為db_and_uxms.moos。其內容為:

// (wget http://oceanai.mit.edu/2.680/examples/db_and_uxms.moos)
ServerHost = localhost
ServerPort = 9000
Community = alpha
ProcessConfig = ANTLER
{
MSBetweenLaunches = 200
Run = MOOSDB  @ NewConsole = false
Run = uXMS  @ NewConsole = true
}
ProcessConfig = uXMS
{
AppTick  = 4
CommsTick = 4
VAR  = DB_CLIENTS, DB_UPTIME, DB_TIME
DISPLAY_SOURCE = true
DISPLAY_TIME  = true
COLOR_MAP  = DB_CLIENTS, red
}

當然也可以通過更簡單的方式獲得輸入以下命令,從官網中下載示例檔案:

wget --no-check-certificate http://oceanai.mit.edu/2.680/examples/db_and_uxms.moos

接下來輸入以下命令進行執行

pAntler db_and_uxms.moos

這位uXMS開啟了一個新的命令控制視窗,並且通過初始配置開啟了source和time,但是沒有community
如下圖所示:
在這裡插入圖片描述
3.uXMS的配置塊內容可以通過在命令列輸入:

uXMS --example

來進行檢視,此時實驗要求對啟動檔案進行修改,使其可以檢視DB_UPTIME變數的歷史訊息記錄,以及開啟一個新的控制檯視窗。修改啟動檔案如下:

ServerHost = localhost
ServerPort = 9000
Community  = alpha

ProcessConfig = ANTLER
{
  MSBetweenLaunches = 200

  Run = MOOSDB     @ NewConsole = false
  Run = uXMS       @ NewConsole = true
}

ProcessConfig = uXMS
{
  AppTick   = 4
  CommsTick = 4

  history_var    = DB_UPTIME
  DISPLAY_SOURCE = true
  DISPLAY_TIME   = true
  COLOR_MAP      = DB_UPTIME, red
  content_mode = history    // default (or history,procs)
}

新增進去了啟動模式為history,修改了scope的變數,修改之後輸出介面為:
在這裡插入圖片描述

五、Scripted Pokes to the MOOSDB

1.uTimerScript解讀

因為此部分內容需要知道一些關於uTimerScript模組引數的配置,所以需要先對其進行格式上的學習,具體資料可以參考網站:

uTimerScript
uTimerScript模組可以讓使用者編寫一些預先配置好的設定釋出到MOOSDB中,以下是配置事件列表的具體格式

event = var=<MOOSVar>, val=<value>, [time=<time-of-event>]

關鍵詞event、val、var、time都不區分大小寫,但是<>中的內容需要注意大小寫。

1.設定時間範圍 time-of-evet
此時間設定必須是一個大於等於零的值,其代表含義是啟動app或者從暫停狀態再啟動之後所經歷的時間。在配置表中列舉的配置內容不需要自己進行排列,uTimerScript會按照順序執行。而我們在設定時間的時候可以把時間設定成如下形式,其中5:10的意思是在5s-10s的時間內概率平均的發生此事件。

event = var=COUNTER_A, val=10, time=5:10

2.重置指令碼
一個指令碼的重置,可以通過指令碼之外的變數重置來實現,或者指令碼內部來進行設定。 外部設定UTS_RESET為“reset 或者“ture”可以對指令碼進行重置。如果要重置這個引數的名字,用另外的引數進行替代,可以用呼叫以下格式:

reset var = <moos-variable> // Default is UTS RESET

設定reset的時間引數,這個引數也可以設定為all-posted,表示所有時間釋出結束後重置,當UTS_RESET發生設定的時候,不論reset的時間設定為多少都會立即重置:

reset time = <time-or-condition> // Default is "none"

以下引數用來配置可以重置的最大次數,一般預設是nolimit不對其進行限制:

reset max = <amount> // Default is "nolimit"

以下配置可以在重新啟動時指定指令碼重新計算相關的時間引數

shuffle = false // Default is "true"

如果要對指令碼進行暫停可以使用以下命令,其引數是一個bool量,為真時暫停,為假時關閉暫停。而下面的命令是對外部應用釋出控制暫停的變數進行命名,預設是UTS_PAUSE

paused = <Boolean>
pause var = <MOOSVar> // Default is UTS PAUSE

使用邏輯條件來對指令碼進行暫停,下面是一個示例的用法

condition = <logic-expression>
condition  = NAV_DEPTH < 0.2

2.uTimerScript練習

1.練習要求:
(1)將程式碼進行改進,使得一開始是暫停狀態,可以通過uPokeDB來進行啟動
(2)同時開啟兩個uXMS介面進行變數觀察,觀察的變數分別命名為COUNTER_A和COUNTER_B,分別在兩個uTimerScript模組中進行計數
(3)加入一個邏輯條件語句來控制變數的計數,使得COUNTER_A>5的時候COUNTER_B開始進行計數。
(4)新增pLogger模組使得可以觀察指令碼執行的系統日誌

2.通過上面的解釋我們可以通過設定

paused=ture

來使得指令碼一開始處於暫停狀態,啟動指令碼可以輸入如下命令進行啟動:

uPokeDB UTS_PAUSE=false  utscript.moos

3.建立兩個uTimerScript模組需要分別起不同的名字,可以看到在是否啟動控制檯選項之後就可以對模組單獨進行起名。

ProcessConfig = ANTLER
{
  MSBetweenLaunches = 200

  Run = MOOSDB       @ NewConsole = false
  Run = uXMS         @ NewConsole = true ~uXMS_COUNTER_A
  Run = uXMS         @ NewConsole = true ~uXMS_COUNTER_B
  Run = uTimerScript @ NewConsole = false ~uTimerScript_COUNTER_A
  Run = uTimerScript @ NewConsole = false ~uTimerScript_COUNTER_B
  Run = pLogger      @ NewConsole = false
}

啟動介面時可以看到出現兩個控制檯,分別觀察兩個不同變數
在這裡插入圖片描述

4.需要加入一個條件語句來,使得COUNTER_A>5的時候COUNTER_B開始進行計數。

condition = COUNTER A > 5

5.在指令碼中,新增pLogger模組

ProcessConfig = pLogger
{
AsyncLog = true
WildCardLogging = true
WildCardOmitPattern = *_STATUS
}

執行結束之後可以找到指令碼日誌,可以通過下面的命令檢視跟變數相關的具體內容

aloggrep COUNTER_A COUNTER_B  MOOSLog_29_9_2020_____15_37_36/MOOSLog_29_9_2020_____15_37_36.alog

可以看到指令碼內容如下所示:
在這裡插入圖片描述
7.所有指令碼程式碼:

ServerHost = localhost
ServerPort = 9000
Community  = alpha

ProcessConfig = ANTLER
{
  MSBetweenLaunches = 200

  Run = MOOSDB       @ NewConsole = false
  Run = uXMS         @ NewConsole = true ~uXMS_COUNTER_A
  Run = uXMS         @ NewConsole = true ~uXMS_COUNTER_B
  Run = uTimerScript @ NewConsole = false ~uTimerScript_COUNTER_A
  Run = uTimerScript @ NewConsole = false ~uTimerScript_COUNTER_B
  Run = pLogger      @ NewConsole = false
}

ProcessConfig = uXMS_COUNTER_A
{
  AppTick   = 4
  CommsTick = 4

  VAR            = COUNTER_A, DB_CLIENTS, DB_UPTIME
  COLOR_MAP      = COUNTER_A, red
  HISTORY_VAR    = COUNTER_A
}

ProcessConfig = uXMS_COUNTER_B
{
  AppTick   = 4
  CommsTick = 4

  VAR            = COUNTER_B, DB_CLIENTS, DB_UPTIME
  COLOR_MAP      = COUNTER_B, red
  HISTORY_VAR    = COUNTER_B
}

ProcessConfig = uTimerScript_COUNTER_A
{
  AppTick   = 4
  CommsTick = 4

  paused = true
  pause_var = UTS_PAUSE
  event  = var=COUNTER_A, val=1,  time=0.5
  event  = var=COUNTER_A, val=2,  time=1.0
  event  = var=COUNTER_A, val=3,  time=1.5
  event  = var=COUNTER_A, val=4,  time=2.0
  event  = var=COUNTER_A, val=5,  time=2.5
  event  = var=COUNTER_A, val=6,  time=3.0
  event  = var=COUNTER_A, val=7,  time=3.5
  event  = var=COUNTER_A, val=9,  time=4.5
  event  = var=COUNTER_A, val=10, time=5.0

  reset_max  = nolimit
  reset_time = all-posted
}

ProcessConfig = uTimerScript_COUNTER_B
{
  AppTick   = 4
  CommsTick = 4

  paused = true
  pause_var = UTS_PAUSE
  condition = COUNTER_A > 5
  event  = var=COUNTER_B, val=1,  time=0.5
  event  = var=COUNTER_B, val=2,  time=1.0
  event  = var=COUNTER_B, val=3,  time=1.5
  event  = var=COUNTER_B, val=4,  time=2.0
  event  = var=COUNTER_B, val=5,  time=2.5
  event  = var=COUNTER_B, val=6,  time=3.0
  event  = var=COUNTER_B, val=7,  time=3.5
  event  = var=COUNTER_B, val=8,  time=4.0
  event  = var=COUNTER_B, val=9,  time=4.5
  event  = var=COUNTER_B, val=10, time=5.0

  reset_max  = nolimit
  reset_time = all-posted
}
ProcessConfig = pLogger
{
AsyncLog = true
WildCardLogging = true
WildCardOmitPattern = *_STATUS
}

總結

我以為兩個篇章能寫完,結果內容有點多,我擴充到三篇來寫吧。

相關文章