1. はじめに
本稿では、ブラウザ上から Blockly を使って ROS のロボット制御を行う方法をご案内します。
Blocklyとは、Google が提供しているビジュアルプログラミングのライブラリです。今回ご紹介する ros_blockly アプリケーションでは、Blockly ライブラリを元にして、Unitree Go1、AgileX LIMO、Dobot MG400 の基本的な操作に必要となるブロックも利用することができます。
Github ros_blockly: https://github.com/TechShare-inc/ros_blockly.git
2. 環境
外部PC:
OS – Windows 10 (64bit)
WSL2 – Linux Ubuntu 20.04
ROS – Noetic
Web ブラウザ – Google Chrome
3. 準備
(1) ROS のインストール
外部PCで各ロボット制御のための ROS パッケージを実行する場合、ROS をインストールしてください。
(2) ros_blockly のダウンロード
$ git clone https://github.com/TechShare-inc/ros_blockly.git
依存のファイルとして、roslib.js をros_blockly 内にダウンロードします。roslibjs はブラウザからROSを実行するためのJavascript のライブラリです。このファイルは index.html で読み込んでいます。
roslib.js ファイルは、下記のGithub リポジトリの build/roslib.js から見つけることができます。
Github roslibjs: https://github.com/RobotWebTools/roslibjs
(3) rosbridge のインストール
rosbridgeは、非ROSプログラム向けにROSへのJSON APIを提供しています。rosbridge websocket サーバーを利用すると、webブラウザ上からのプログラムでROS制御を行うことができます。
$ sudo apt-get install ros-<rosdistro>-rosbridge-server
ROS wiki: http://wiki.ros.org/rosbridge_suite
(4) ローカル web サーバーの起動
HTML ファイルをブラウザで直接読み込もうとすると、外部のファイルが読み込めない場合などうまく表示されないことがあります。そのため、ローカルで webサーバーを立ち上げて、HTML ファイルを読み込む必要があります。
ここでは、VS Code の拡張機能にある Live Server を利用します。Live Server は、簡易的にローカルサーバーを起動することができ、さらにVS Code でのファイルの変更に応じて即時にページを更新します。
メニューの「拡張機能」から Live Server をインストールした後、VS Code 画面右下の「Go Live」というボタンからローカルサーバーを立ち上げることができます。
ブラウザ上で「http://localhost:5500/ros_blockly/」を開くと ros_blockly のアプリケーションが表示されます。
4. 基本操作
ワークスペース
デフォルトで置かれているスタートブロックにつなげる形でブロックを配置し、プログラムを組みます。右下のごみ箱でブロックを削除できます。
ツールボックス
左のツールボックスのカテゴリーから、任意のブロックをドラッグ&ドロップでワークスペースに置くことができます。
用意されている各ロボットのブロックは以下の通りです。
ボタン
- Show Code: 作成したブロックのプログラムから生成されるコードを表示します。ros_blocklyでは、すべてのブロックのコードが Javascript で書かれています。
- Run: ブロックから生成されたコードを実行します。
- Restore: ブラウザを更新してワークスペースが初期化された際に、更新前のブロックを表示します。
5. 実行
MG400
(1) ROSのノードを立ち上げる
[MG400, Python] ROSでMG400を動かす方法 の 3.3 プログラムを実行する (1)~(3) に沿って、mg400_bringup を起動します。
$ roslaunch mg400_bringup mg400_bringup.launch robot_ip:=192.168.1.6
(2) rosbridge サーバーを立ち上げる
$ roslaunch rosbridge_server rosbridge_websocket.launch
(3) web サーバーを立ち上げ、ブラウザで ros_blockly を表示する
サンプルプログラム
※ ブロックからコマンドが送られても MG400 が動かない場合は、DobotStudioProで動くか確認することや、ターミナルから直接コマンドを送って動作を確認してください。「ResetRobot」ブロックで正常になることもあります。
動作の様子:
MG400 ファームウェア – v1.5.8.1
Go1
(1) ROS のノードを立ち上げる
Go1 の ROSノードを起動します。外部PC から制御したい場合は、【Unitree Go1】外部PC上から無線で unitree_ros_to_real を実行する:ハイレベル制御 の 3.4 実行 (1) までをご参照ください。
$ roslaunch unitree_legged_real real.launch ctrl_level:=highlevel
(2) rosbridge サーバーを立ち上げる
$ roslaunch rosbridge_server rosbridge_websocket.launch
(3) 一部ライブラリを読み込むために、PC をインターネットに接続します
(4) web サーバーを立ち上げ、ブラウザで ros_blockly を表示する
サンプルプログラム
※ Go1 を動かす際は、立ち上がっている状態でも「Stand Up」ブロックを上に配置してください。
※ Go1 の「Walk」ブロックは1回で永続的に歩かせ続けるため、「Stop moving」ブロックや他の動作ブロックなど、動作を止めるブロックを必ず配置する必要があります。
動作の様子:
Go1 機種 – R&D(Edu)/R&D+(Edu+)、unitree_legged_sdk – v3.8.6
LIMO
(1) 内部コンピューターに接続する
LIMO と外部 PC を同じWi-Fi に接続し、LIMO の IPアドレスを確認します。
その後、PC のターミナルから LIMO の内部に ssh 接続し、パスワードを入力します。
$ ssh agilex@<LIMOのIPアドレス>
(2) 内部コンピューターでROSのノードを立ち上げる
$ roslaunch limo_bringup limo_start.launch
LIMO の ROS制御のパッケージについては、【AgileX LIMO】ROS パッケージを実行する をご参照ください。
※ コマンド制御を可能にするために、コントローラーアプリ内のボタンでアプリからの制御をオフにしてください。
(3) index.html のIPアドレスを変更
index.html を開き、通信先の rosbridge サーバーの IPアドレスを localhost から ssh接続している LIMO の IPアドレスに変更します。
(4) 内部コンピューターにrosbridge をインストールし、rosbridge サーバーを立ち上げる
$ roslaunch rosbridge_server rosbridge_websocket.launch
(5) web サーバーを立ち上げ、ブラウザで ros_blockly を表示する
サンプルプログラム
※ LIMO の走行(Move、Turn)のスピードを保つためには、何度もブロックでコマンドを送る必要があります。ここでは、指定した秒数間ずっとコマンドを送るブロックを使用しています。
※ 上の前後運動のブロックで設定したスピードは、下の回転ブロックに引き継がれるため、その場で回転したい場合は一度、前後運動のブロックで0 m/s にスピードを設定し直す必要があります。回転ブロックで設定した場合も同様になります。
動作の様子:
LIMO 内部コンピュータ – Jetson Nano、OS – Ubuntu 18.04、ROS – Melodic