📝

【OpenRR】RustでRobot!#01 「OpenRRを使ってみる」

2022/06/17に公開

1-1. はじめに

はじめまして、Smile Roboticsでインターンをしている内山活です。OpenRRに興味をもっていただいてありがとうございます!不定期でOpenRRに関連した記事を執筆し、ネットの海にOpenRRの情報を置いていくと同時に私自身のOpenRRへの理解を深めていこうと思います。よろしくお願いいたします。

1-1-1. 環境

主にUbuntu 20.04 LTSを用いて開発をしています。

1-1-2. OpenRRのざっくりした概要

そもそも"OpenRR"(オープナー)とは"Open Rust Robotics"の略でSmile Robotics社を中心としてオープンに開発されているロボット開発用のフレームワークです。
2022年現在で世界中で使われているロボット用フレームワークとしてはROSがもっとも強力かつ有名だと思います。ROSをもとにした自動運転用のフレームワークもあるほどです。しかしROSが対応しているのはUbuntu等のLinuxがメインであり、仮想的にLinuxを扱うことのできるWSL2があるとはいえ、手軽に手を出すことが少し難しいように思います。
OpenRRでは内部的にarciという抽象化レイヤによってROSやROS2の有無やバージョン等による差異に関わらず、Rustさえ書ける環境があればロボットを扱えるようになっています。もしくは、なっていきます。そのおかげでOpenRRによってROSがなくてもROS対応のロボットを動かせるようになる、という訳です。
あとこれは個人的にいいなと思うポイントですが、インストールが非常に簡単です。ぜひ気軽にOpenRRで遊んでみてほしいです。

1-2. OpenRRの準備

1-2-1. Rustの準備

Rustの環境を作っていない場合は公式サイト(または日本語版公式サイト)や色々な方が書いている記事がありますので、それを参考に環境構築をしてください。OpenRR自体を扱うだけならば、Rustが動く環境が整っていれば十分といえば十分ですが、関連して他に用意されているアプリケーションがあります。今回はそれらを使うので一緒に準備していきましょう。

1-2-2. 可視化ツール "urdf-viz"

urdf-vizは名前の通りですが、URDFファイルをもとにロボットの構造などを可視化してくれるツールです。OpenRRと併せて開発されています。URDFはUnified Robotics Description Formatの略で、ロボットの物理的なモデルを明記してあるフォーマットという認識です。これはOpenRR独自のものというわけではなく、ROSやMATLABなど多くの場面で扱われているものです。ではurdf-vizをインストールしてみましょう。

cargo install urdf-viz

とするだけでインストールできます。これ以降は、ターミナルでurdf-vizと適当なパスを引数に打ち込むだけで実行できます。もちろん自分で書いたものや適当にネットで拾ってきたURDFファイルであっても表示させることができます。

1-2-3. ロボットをGUIで操作できる"openrr-apps"

openrr-appsはOpenRRを用いて作られた初のアプリケーションです。このアプリケーションでは、ロボットアームを動かしてみたり、ロボットを移動させてみたり、目標の姿勢を実現したりと先程のurdf-viz上でロボットを操作することができます。今回はGitHubにあるopenrrのリポジトリからインストールします。以下の3つのコマンドを実行してください。

git clone https://github.com/openrr/openrr
cd openrr
cargo install --path ./openrr-apps

とすればインストールできますが、Windows上で行っている方は3つ目を以下のように置き換えてください。

For Windows users
cargo install --path ./openrr-apps --no-default-features --features gui,assimp

これにてOpenRRの準備は完了です。次節からはREADMEに従いつつ、OpenRRを実際に扱っていこうと思います。

1-3. ロボットアームを動かしてみる

1-3-1. READMEの通りに動かしてみる

必要なURDFやコマンドなどのファイルは先程クローンしたOpenRRに入っているので、実は準備は完了しています。以降この記事では、カレントディレクトリはopenrrであるという前提のもと進めていきます。ではopenrr-appsのREADMEに従って実行してみましょう。まずurdf-vizでサンプルのロボットを出現させます。

urdf-viz ./openrr-planner/sample.urdf &

これで青色のウィンドウが出てきてアームのついたロボットが見られると思います。次はopenrr_apps_robot_commandです。これによってopenrr-apps/src/bin/robot_command.rsというファイルを実行しています。

openrr_apps_robot_command \
  --config-path=./openrr-apps/config/sample_robot_client_config_for_urdf_viz.toml \
  load_commands ./openrr-apps/command/sample_cmd_urdf_viz.txt

ロボットアームが動いたり、ロボットがぐるっと回ったりした最後、ターミナルに

Success
PrintSpeaker: "This is sample robot"

と出力されれば成功です。もし

Error: openrr-command: openrr-client: Arci(Other(ik solve not converged tried 300 times, position diff = ...

のような表示の後に位置や姿勢のベクトルが出力された場合は、何度か

openrr_apps_robot_command \
  --config-path=./openrr-apps/config/sample_robot_client_config_for_urdf_viz.toml \
  load_commands ./openrr-apps/command/sample_cmd_urdf_viz.txt

を実行すれば上手くいくことがあります。他のERRORが出た場合は改めてインストールやクローンし直すなどしてみてください。

↑これは./openrr-planner/sample.urdfをurdf-vizで表示させた際のウィンドウです。
urdf-vizのREADMEに色々なロボットを表示させた様子が載っているので興味があれば見てみてください。

1-3-2. ターミナルから動かしてみる

ではopenrr-apps/command/sample_cmd_urdf_viz.txtに何があるのか探っていきます。つい先程、

openrr_apps_robot_command \
  --config-path=./openrr-apps/config/sample_robot_client_config_for_urdf_viz.toml \
  load_commands ./openrr-apps/command/sample_cmd_urdf_viz.txt

を実行したことを覚えているでしょうか。--config-pathは無視しておいて、load_commandsで指定したファイルを覗いてみましょう。

openrr-apps/command/sample_cmd_urdf_viz.txt
openrr_apps_robot_command list

openrr_apps_robot_command send_joints_pose arm_collision_checked zero

openrr_apps_robot_command send_joints arm -j 0=1.2 -j 1=1.2 -j 2=0.0 -j 3=-1.8 -j 4=-0.5 -j 5=0.0
openrr_apps_robot_command send_joints arm -j 0=0.0 -j 1=0.0 -j 2=0.0 -j 3=0.0 -j 4=0.0 -j 5=0.0

openrr_apps_robot_command send_joints arm_collision_checked -j 0=1.2 -j 1=1.2 -j 2=0.0 -j 3=-1.8 -j 4=-0.5 -j 5=0.0
openrr_apps_robot_command send_joints arm_collision_checked -j 0=0.0 -j 1=0.0 -j 2=0.0 -j 3=0.0 -j 4=0.0 -j 5=0.0

openrr_apps_robot_command send_joints arm_ik -j 0=1.2 -j 1=1.2 -j 2=0.0 -j 3=-1.8 -j 4=-0.5 -j 5=0.0
openrr_apps_robot_command send_joints arm_ik -j 0=0.0 -j 1=0.0 -j 2=0.0 -j 3=0.0 -j 4=0.0 -j 5=0.0

openrr_apps_robot_command get_state arm
openrr_apps_robot_command get_state arm_collision_checked
openrr_apps_robot_command get_state arm_ik

openrr_apps_robot_command send_joints arm_ik -j 0=1.2 -j 1=1.2 -j 2=0.0 -j 3=-1.8 -j 4=-0.5 -j 5=0.0
openrr_apps_robot_command get_state arm_ik
openrr_apps_robot_command move_ik arm_ik --x=0.7 --y=0.6 --z=0.2 --roll=0.0 --pitch=0.0 --yaw=0.0
openrr_apps_robot_command get_state arm_ik
openrr_apps_robot_command move_ik arm_ik -i --x=0.7 --y=0.6 --z=0.8 --roll=0.0 --pitch=0.0 --yaw=0.0
openrr_apps_robot_command get_state arm_ik

openrr_apps_robot_command get_navigation_current_pose
openrr_apps_robot_command send_base_velocity 1.0 2.0 1.57 -d 3.0
openrr_apps_robot_command send_base_velocity 0.0 0.0 0.0 -d 3.0
openrr_apps_robot_command send_navigation_goal 0.0 0.0 0.0

openrr_apps_robot_command speak Default "This is sample robot"

openrr_apps_robot_command execute_command -- date

なるほど。ではターミナルで

openrr_apps_robot_command -h

と実行してみてください。次のような表示が返ってくると思います。

openrr_apps_robot_command 
An openrr command line tool

USAGE:
    openrr_apps_robot_command [OPTIONS] [SUBCOMMAND]

OPTIONS:
    -c, --config-path <CONFIG_PATH>
            Path to the setting file

        --config <CONFIG>
            Set options from command line. These settings take priority over the setting file
            specified by --config-path

    -h, --help
            Print help information

    -i, --interactive
            Use interactive mode

        --log-directory <LOG_DIRECTORY>
            Path to log directory for tracing FileAppender

        --show-default-config
            Prints the default setting as TOML

SUBCOMMANDS:
    cancel_navigation_goal         Cancel navigation gaol
    execute_command                Execute an external command
    get_navigation_current_pose    Get navigation current pose
    get_state                      Get joint positions and end pose if applicable
    help                           Print this message or the help of the given subcommand(s)
    list                           List available clients
    load_commands                  Load commands from file and execute them
    move_ik                        Move with ik
    send_base_velocity             Send base velocity
    send_joints                    Send joint positions
    send_joints_pose               Send predefined joint positions
    send_navigation_goal           Send navigation goal pose
    shell_completion               Shell completion
    speak                          Speak text message

さて、openrr-apps/command/sample_cmd_urdf_viz.txtはコマンドやサブコマンドの列挙されたテキストであることが伺えます。そうなれば、同じことを手動でターミナル上で行えばロボットを操作できそうです。試してみましょう。

urdf-viz ./openrr-planner/sample.urdf &

ここまでは同じです。できるだけ楽をしたいので、

export OPENRR_APPS_ROBOT_CONFIG_PATH=$(pwd)/openrr-apps/config/sample_robot_client_config_for_urdf_viz.toml

を実行し、--config-pathの部分の入力を省略させます。

openrr_apps_robot_command get_state arm

を実行すると次のように返ってきました。

Joint names : ["l_shoulder_yaw", "l_shoulder_pitch", "l_shoulder_roll", "l_elbow_pitch", "l_wrist_yaw", "l_wrist_pitch"]
Joint positions : [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

最初なので当たり前ですがアームは初期状態にあるようです。

openrr_apps_robot_command send_joints arm -j 0=1.2 -j 1=-1.2 -j 2=0.0 -j 3=1.2 -j 4=0.0 -j 5=0.0

を実行すれば、無事以下の画像の状態までアームを動かせました。

というようにして、openrr_apps_robot_command -h によって得られた情報から、アームを動かしてみても面白いと思います。ぜひいくつかのコマンドを試してみてください。しかしこれをずっと繰り返すのは骨が折れる作業ですね。素直にload_commandsを用いてtxtからコマンドを呼んでくるか別の形で自動でコマンドを送った方が現実的です。

1-3-3. GUIから動かしてみる

urdf-viz ./openrr-planner/sample.urdf &

ここまでは同じく今まで通りです。次からが今までと異なります。

openrr_apps_joint_position_sender --config-path=./openrr-apps/config/sample_robot_client_config_for_urdf_viz.toml

を実行すると、

が立ち上がってきます。あとは想像できる通りでスライドバーを動かすことでアームを操作することができます。Randomizeを押すとランダムな姿勢になります。

Zeroを押せば初期の状態に戻ってくれます。気づいた方もいるかもしれませんが、urdf-vizのウィンドウの右上の方に英語で何か書いてあることが分かると思います。対応するキーを入力することでロボットを操作することもできます。"z"キーは初期位置に戻したいときなどに便利です。

1-3-4. 正体

openrr-appsのCargo.tomlを覗いてみます。

openrr-apps/Cargo.toml
[[bin]]
name = "openrr_apps_robot_command"
path = "src/bin/robot_command.rs"

...

[[bin]]
name = "openrr_apps_joint_position_sender"
path = "src/bin/joint_position_sender.rs"
required-features = ["gui"]

60行目あたりに上のようなことが書いてあるので、openrr_apps_robot_commandやopenrr_apps_joint_position_senderの正体が分かりましたね。robot_command.rsやjoint_position_sender.rsというただのRustのファイルです。他にも同じようなものがあります。ターミナルからbinを実行することで、また別の操作が実現できそうです。次回以降にここらへんを深堀りしていきたいと思います。

1-4. 結び

今回はOpenRRの入門として実際のアプリケーションであるopenrr-appsを扱ってみました。扱ったものは一部である上にOpenRRは現在も開発が進んでいるため、将来的なOpenRR全体の機能で言えば塵のようなものかもしれません。今後の機能拡張が楽しみです。

更新歴

2022-05-13 完成

Discussion