- メッセージ仕様
- API認証
- API認証(oAuth)
- 管理画面認証
- 管理画面認証(EntraID)
- 管理画面UI設計
- 管理項目の確定
- クライアント側アクション実行
- サーバ側のデータ管理
- 性能測定
複数のロボットを管理する仕組み
- ロボットのメトリクス状態の表示は Grafana で行う(cabot-grafana)
- ロボットの遠隔操作は、Grafanaとは別に用意するこちらの管理画面で行う
- ロボット(dashboard-client)
- ロボットの状態を取得する
- ロボットの操作を実行する
- サーバー (dashboard-server)
- ロボットの状態を表示する
- ロボットの操作を指示する
- 概要図
graph TB
subgraph "開発環境"
Dev[開発者]
LocalDocker[ローカルDocker]
end
subgraph "Azure"
ACR[Azure Container Registry]
WebApp[Azure Web App for Container]
Webhook[Webhook]
end
subgraph "ロボット"
ROS[ROS]
ClientDocker[Clientコンテナ]
end
subgraph "運営"
PC[PC]
Smartphone[スマートフォン]
end
Dev -->|Dockerイメージをpush| LocalDocker
LocalDocker -->|イメージをpush| ACR
ACR -->|イメージ変更を通知| Webhook
Webhook -->|自動デプロイ| WebApp
ACR -->|イメージをpull| WebApp
ACR -->|イメージをpull| ClientDocker
ROS -->|起動| ClientDocker
PC -->|アクセス| WebApp
Smartphone -->|アクセス| WebApp
PC -->|WebSocket接続| WebApp
Smartphone -->|WebSocket接続| WebApp
ClientDocker -->|WebSocket接続| WebApp
classDef azure fill:#0072C6,stroke:#fff,stroke-width:2px,color:#fff;
class ACR,WebApp,Blob,Webhook azure;
-
構成要素はDockerで管理
- Serverはクラウド上に構築しDockerコンテナで起動
- ClientはAIスーツ側に配置しDockerコンテナで起動(ROS or Ubuntu)
-
ロングポーリングで通信
- ロボットとダッシュボードの間でメッセージをやり取りする
-
Pythonで実装
- サーバサイドは、FastAPIのフレームワークを利用
-
API認証方式
- APIキー認証
-
管理画面認証方式
- ID、パスワードによるログイン認証
- ID、パスワードは、JSONファイルで管理とし、複数ユーザ管理できる
- ログインセッションのタイムアウトは環境変数で設定とする
- ログインするとダッシュボードの右上にIDを表示
- ログアウトボタンでログアウトする
ロボットからのメッセージは以下のJSON形式で送信されます:
項番 | 操作 | Command | CommandOption |
---|---|---|---|
1 | ROS起動 | ros-start | |
2 | ROS停止 | ros-stop | |
3 | システム再起動 | system-reboot | |
4 | システム電源OFF | system-poweroff | |
5 | Debug1 | debug1 | |
6 | Debug2 | debug2 |
{
"target": ["cabot1", "cabot2"],
"command": "restart",
"commandOption": {"ProcessName": "ROS"},
"timestamp": "2024-06-27T12:34:56Z"
}
cabot_dashboard_server.py
を実行してサーバーを起動します。cabot_dashboard_client.py
を実行してロボットをシミュレートします。
sequenceDiagram
participant Dashboard
participant Server
participant Robot
loop Polling
Robot->>Server: GET /poll/{client_id}
alt Command available
Server-->>Robot: Command
Robot->>Robot: Execute command
Robot->>Server: POST /send/{client_id} (Status update)
else No command
Server-->>Robot: Wait until timeout
end
end
Dashboard->>Server: GET /receive
Server-->>Dashboard: Robot info, messages, events
Dashboard->>Server: POST /send_command/{cabot_id}
Server->>Server: Add command to queue
Server-->>Dashboard: Command receipt confirmation
Note over Server,Robot: Command will be sent on next polling
Robot->>Server: GET /poll/{client_id}
Server-->>Robot: Retrieve command from queue
Robot->>Robot: Execute command
Robot->>Server: POST /send/{client_id} (Command execution result)
Dashboard->>Server: GET /receive
Server-->>Dashboard: Updated robot info, messages, events
起動
# docker-compose up -d --build
docker-compose up -d --build server
docker-compose up -d --build client
終了
docker-compose down
-
azコマンドで ACR へ loginしておく
-
Dockerイメージタグをつける
docker tag local-image-name:tag azure-image-name:tag
- Azure Container Resistoryにpush
docker push azure-image-name:tag
- Azure Web App for Containersにデプロイ
-
お試し環境
- dev01-miraikan-dashboard-webapp
- ACRへPushすると自動でデプロイ(インスタンス削除してる場合は再設定必要)
-
環境変数
-
WEBSITES_PORT = 8000
-
CABOT_DASHBOARD_LOG_LEVEL=INFO
-
CABOT_DASHBOARD_LOG_TO_FILE=false
-
CABOT_DASHBOARD_API_KEY=[api key]
-
CABOT_DASHBOARD_SESSION_TIMEOUT=1800
-
CABOT_DASHBOARD_MAX_ROBOTS=20 # Maximum number of connected robots
-
CABOT_DASHBOARD_POLL_TIMEOUT=30 # Timeout period (seconds)
-
CABOT_DASHBOARD_DEBUG_MODE=false
-
CABOT_DASHBOARD_ALLOWED_CABOT_IDS
-
~~ WEBSITES_WEBSOCKETS_ENABLED = 1 ~~
-
https://learn.microsoft.com/ja-jp/answers/questions/1602711/azureappservice-4
- AppServiceのTimeout240秒で変更不可の模様
-
- ロボット側で Azure Container Registry から pull
- 環境変数
- CABOT_DASHBOARD_SERVER_URL=[URL]
- CABOT_DASHBOARD_API_KEY=[api key]
- CABOT_DASHBOARD_LOG_LEVEL=INFO
- CABOT_DASHBOARD_LOG_TO_FILE=false
- CABOT_DASHBOARD_POLLING_INTERVAL=1
- CABOT_DASHBOARD_CABOT_ID=cabot10
- サーバ側に実装
- ID、Passwordは、JSONファイルで管理とし、複数ユーザ管理できる
- 現状利用できるアカウント
- ID: user
- 現状利用できるアカウント
※dockerで動かす場合はここは不要
Pythonの仮想環境を構築するコマンド。Pythonがすでにインストールされているという前提。
- 仮想環境を作成する:
python -m venv env
ここで、env
は仮想環境の名前です。好きな名前に変更できます。
- 仮想環境を有効化する:
Windowsの場合:
myenv\Scripts\activate
macOSやLinuxの場合:
source myenv/bin/activate
- 仮想環境が有効化されたら、必要なパッケージをインストールできます:
pip install fastapi uvicorn websockets
- 仮想環境を終了する場合:
deactivate