iT邦幫忙

2022 iThome 鐵人賽

DAY 21
0

在上篇文章提到Unity在train model使用的是Unity ML-Agents Toolkit,但我們之後會棄用,因為該Toolkit對於ML model與套件的選用有些限制。
https://ithelp.ithome.com.tw/upload/images/20221006/20005722QiWY5U6huw.png
未來會以python來控制Unity Model的環境設定與action,
並使用socket or gRPC寫Unity Model training資料的匯出與python溝通。

等於我們自己create一個Agent取代mlagents:

class Agent():
    def __init__(self, q_lr, pi_lr, gamma, rho, server, action_space, input_dims=17, n_actions=4, layer1_size=400, layer2_size=300, batch_size=100, chpt_dir='Model/DDPG'):

    def update_network_parameters(self, rho=None):

    def choose_actions(self, observation, init=0):

    def learn(self):

    def save_models(self, tag):

    def load_models(self, tag):

以下我們使用Reinforcement Learning做為案例。

  1. 首先使用update_network_parameters,去設定類神經網路的參數。我們library使用PyTorch。
  2. 設定環境的target(車子要到達的目標)。
new_target = {'title': 'new target', 'content': {
            'pos': {'x': self.target_pos[0], 'y': 0, 'z': self.target_pos[1]}}}
  1. choose_actions選擇車子的動作,設定8個馬達的參數。
actions_msg = {'title': 'action', 'content': {'voltage': actions_}}
  1. learn是開始訓練。
  2. 訓練(Training)後會得到output,再去推斷(Inference),產生新的Model參數。
  3. 然後進行100次後,會把trained好的model透過save_models存成pickle檔案。
  4. 再下一次的訓練可以再透過load_models讀取任一Model檔案。

以上的過程透過一個socket thread(之後會改成grpc protobuf)將在Unity執行的結果訊息取出來,在Python中處理。程式碼如下:

obs = None
for i in range(100):
    init = env.restart_episode(obs)
    if init:
        t = CustomThread(s)  # socket thread
        t.start()
        t.join()
        obs = t.message
        obs = processFeature(obs, env.target_pos)

    done = False
    score = 0
    while (not done):
        actions = agent.choose_actions(obs)
        reward, new_state, done = env.step(obs)
        score += reward
        obs = new_state.copy()

(以上為成大學生嘉軒提供)


上一篇
[虛實整合]Unity+ML雲端運算的設計與AWS support
下一篇
[虛實整合]FRC NetworkTables的程式設計
系列文
IoT Cloud Computing on robotic vehicle30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言