標(biāo)注:本文來(lái)自本實(shí)驗(yàn)室胡宗盛的研究成果。
GPS系統(tǒng)數(shù)字孿生建模的仿真模型實(shí)時(shí)同步數(shù)據(jù)中,實(shí)時(shí)與仿真時(shí)間之間存在差異,模擬世界擁有自己的時(shí)鐘和時(shí)間,由服務(wù)器來(lái)執(zhí)行, 計(jì)算兩個(gè)模擬步驟需要一些實(shí)時(shí)的時(shí)間,但是在這兩個(gè)模擬時(shí)刻之間也存在時(shí)間跨度, 即時(shí)間步長(zhǎng),服務(wù)器只有在等待一個(gè)客戶端發(fā)送的 world_tick() 后才會(huì)計(jì)算下一個(gè) step, 為了搜集同步的數(shù)據(jù),要同時(shí)設(shè)置同步模式和固定時(shí)間步。
可變的時(shí)間步長(zhǎng)
下面是 carla 中的默認(rèn)模式,步驟之間經(jīng)過(guò)的仿真時(shí)間將是服務(wù)器計(jì)算這些步驟所花費(fèi)的時(shí)間:
settings=world.get_settings()
settings.fixed_delta_seconds=None
world.apply_settings(settings)
設(shè)置時(shí)間步長(zhǎng)為 0:python3 config.py –delta-seconds 0
固定時(shí)間步
步驟之間經(jīng)過(guò)的時(shí)間保持不變,如果將其設(shè)置為 0.05 秒,則每秒鐘模擬 20 幀,在每個(gè)步驟上都使用相同的時(shí)間增量是模擬手機(jī)數(shù)據(jù)的最佳方法,物理和傳感器數(shù)據(jù)將對(duì)應(yīng)于易于理解的仿真時(shí)刻。同樣,如果服務(wù)器足夠快,則可以在較短的時(shí)間內(nèi)模擬更長(zhǎng)的時(shí)間段。
settings=world.get_settings()
settings.fixed_delta_seconds=0.05
world.apply_settings(settings)
或者使用提供的腳本進(jìn)行設(shè)置時(shí)間步長(zhǎng)為 0.05:python3 config.py –delta-seconds 0.05。
記錄模擬的提示
carla 具有記錄器功能,可以記錄模擬然后重新執(zhí)行。但是在尋找精度時(shí)候,需要考慮一些因素。使用固定時(shí)間步的話,重新制定將會(huì)很容易,可以將服務(wù)器設(shè)置為原始模擬中使用的相同時(shí)間步;有了可變的時(shí)間步,事情就變得更加復(fù)雜了。
如果服務(wù)器以可變的時(shí)間步長(zhǎng)運(yùn)行,則該時(shí)間步長(zhǎng)將不同于原始時(shí)間步長(zhǎng),因?yàn)檫壿嬛芷谟袝r(shí)候會(huì)不同,然后將使用記錄的數(shù)據(jù)對(duì)信息進(jìn)行插值;如果服務(wù)器被迫重現(xiàn)完全的時(shí)間步長(zhǎng),則模擬的步長(zhǎng)將相同,但是它們之間的實(shí)時(shí)時(shí)間會(huì)改變。時(shí)間步應(yīng)該要一一隨之改變,這些原始時(shí)間步是原始模擬盡可能快的運(yùn)行的結(jié)果,由于表示這些事件所花費(fèi)的時(shí)間將大部分不同,因此模擬必然會(huì)隨著怪異的時(shí)間波動(dòng)而重現(xiàn);可變時(shí)間步長(zhǎng)會(huì)引入浮點(diǎn)算術(shù)錯(cuò)誤,仿真運(yùn)行的時(shí)間步長(zhǎng)等實(shí)際時(shí)間步長(zhǎng),實(shí)時(shí)是一個(gè)連續(xù)變量,在模擬中用一個(gè) float 值表示,該值具有十進(jìn)制限制,累計(jì)在每個(gè)步驟上的時(shí)間會(huì)累積,從而使得模擬無(wú)法精確重復(fù)發(fā)生的事情。
客戶端-服務(wù)器同步
carla 建立在客戶端-服務(wù)器體系結(jié)構(gòu)之上,服務(wù)器運(yùn)行模擬,客戶端獲取信息,并要求對(duì)世界進(jìn)行改變。默認(rèn)情況下,carla 在異步模式下運(yùn)行,服務(wù)器盡可能快的模擬運(yùn)行,無(wú)需等待客戶端;在同步模式下,服務(wù)器在更新到下一步模擬步驟之前要先等待客戶端的準(zhǔn)備就緒的消息。
設(shè)定同步模式在同步模式和異步模式之間切換僅僅是布爾狀態(tài)的問(wèn)題。
settings=world.get_settings()
settings.synchronous_mode=True
world.apply_settings(settings)
如果要禁用同步模式,只需要將變量設(shè)置為 false,或者使用腳本 python3 config.py–np。需要注意的是不能夠使用腳本來(lái)啟用同步模式,只能夠禁用。啟用同步模式會(huì)使服務(wù)器等待客戶端應(yīng)答。使用此腳本,用戶無(wú)法在需要時(shí)發(fā)送報(bào)價(jià)。
使用同步模式同步模式與慢速客戶端應(yīng)用程序相關(guān),并且當(dāng)需要不同元素之間的同步時(shí),如果客戶端太慢而服務(wù)器不等待,會(huì)出現(xiàn)信息溢出,客戶端無(wú)法管理所有內(nèi)容,并且將丟失或混淆所有內(nèi)容。以下代碼段擴(kuò)展了上一個(gè)代碼段。客戶端創(chuàng)建一個(gè)攝像頭傳感器,將當(dāng)前步驟的圖像數(shù)據(jù)存儲(chǔ)在隊(duì)列中,并且在隊(duì)列中檢索服務(wù)器后對(duì)服務(wù)器進(jìn)行打勾。
可能的配置如果是同步模式和可變時(shí)間步長(zhǎng),基本上可以確定這是沒(méi)有什么希望的,因?yàn)楫?dāng)時(shí)間步長(zhǎng)大于 0.1s 時(shí),物理學(xué)將會(huì)無(wú)法正常運(yùn)行,如果服務(wù)器必須等待客戶端計(jì)算步驟,則很可能會(huì)發(fā)生這種情況,仿真時(shí)間和物理原理不會(huì)同步, 模擬將會(huì)變得不可靠。
如果是同步模式和固定時(shí)間步長(zhǎng),客戶將負(fù)責(zé)模擬,時(shí)間步長(zhǎng)固定,在客戶端發(fā)送報(bào)價(jià)之前,服務(wù)器將不計(jì)算下一步,當(dāng)同步性和精度相關(guān)時(shí),這是最佳的模式了,尤其是在于慢速客戶或者其他元素檢索信息時(shí)。 如果是異步模式和可變時(shí)間步長(zhǎng),這個(gè)是 carla 的默認(rèn)狀態(tài),客戶端和服務(wù)器端是異步的,模擬時(shí)間根據(jù)實(shí)時(shí)時(shí)間流逝,當(dāng)我們重新執(zhí)行仿真時(shí),需要考慮浮點(diǎn)運(yùn)算錯(cuò)誤以及服務(wù)器之間時(shí)間步長(zhǎng)的可能差異。 如果是異步模式和固定時(shí)間步長(zhǎng),服務(wù)器將盡可能快速的運(yùn)行,檢索到的信息將很容易與模擬中的準(zhǔn)確時(shí)刻相關(guān)聯(lián),如果服務(wù)器足夠快,則此配置可以以短得多的實(shí)時(shí)時(shí)間來(lái)模擬長(zhǎng)時(shí)間。 |
結(jié)果顯示用 pygame 將收集到的數(shù)據(jù)顯示出來(lái),打印出服務(wù)器端的fps 和客戶端的 fps:
可以看到服務(wù)器的 fps 是 30,客戶端的 fps 是 20 左右。同步模式下客戶端不會(huì)自動(dòng)計(jì)算下一個(gè) step,它只有在接收一個(gè) world.tick() 之后才會(huì)計(jì)算下一個(gè) step,然后暫停仿真,繼續(xù)等待下一個(gè) world.tick()。
本文結(jié)合數(shù)字孿生仿真建模工具carla,對(duì)自動(dòng)駕駛GPS 傳感器進(jìn)行建模,主要指獲取自動(dòng)駕駛汽車的GPS 數(shù)據(jù),位置信息,星歷數(shù)據(jù)等,在此基礎(chǔ)上嘗試獲取同步的傳感器數(shù)據(jù),要求服務(wù)器端與客戶端同步,固定時(shí)間步長(zhǎng),設(shè)置同步模式,借助pygame,在carla 自動(dòng)駕駛仿真模擬器中實(shí)現(xiàn)GPS 傳感器和定位信息的實(shí)時(shí)可視化建模,實(shí)現(xiàn)數(shù)據(jù)的實(shí)時(shí)交互和呈現(xiàn)。
fqj
-
自動(dòng)駕駛
+關(guān)注
關(guān)注
783文章
13687瀏覽量
166154 -
數(shù)字孿生
+關(guān)注
關(guān)注
4文章
1280瀏覽量
12207
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論