RustのロボットプログラミングフレームワークOpenRRを使う

## はじめに

[OpenRR](https://github.com/openrr/openrr) は私(@OTL)が代表取締役社長をやっているスマイルロボティクス株式会社が中心となって開発しています。
（Qiita的にこういう宣伝はOKらしいですが念の為）

## OpenRRとは

[OpenRR](https://github.com/openrr/openrr)はオープンソース（Apache-2)ライセンスのRust用のロボット開発フレームワークです。
Rustはロボットと相性のよい言語だと思います。ご参考：三年前のわたしの[Qiita記事](https://qiita.com/OTL/items/297451e88a99e7bcc929)

OpenRRは `arci` というロボット仮想化インタフェース(単なるtraitですが)を持っており、ロボットや外部フレームワークに直接依存することなくコードが書ける環境を用意します。
現状ではROS1と[urdf-viz](https://github.com/openrr/urdf-viz)での静的シミュレーション(ビューワー)に対応しています。ROS2への対応も予定しています。

### 特徴

特徴として、

* MacOS/Linux/Windows(WindowsのみROS非対応)で動く
* ROSがインストールされていなくてもROSが使える

なので、 **ROSがインストールされていないMacOSからLinux上のROSで動くロボットを動かす** ことが出来ます。これは世界初かもしれません。

ただ、これはrosrustがpure Rustで出来ていることに依るところが大きく、ROS2では無理かと思われます。

### アーキテクチャ

アーキテクチャ的には↓のような感じで、とにかく arci を使ってプログラム書こうぜ、arci を使った便利ライブラリ、フレームワークが OpenRR本体、って感じです。

![architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58926/fbaf7ec4-4c07-452f-8f27-b9e36aa900a7.png)

最終的なロボットとの通信の実装は仮想化されているのでROS1のプログラムを一瞬でROS2のプログラムに変更することが出来るようになる予定です。

### 発音

一応公式な発音は「オープナー」です。未来を切り開く的な思いが込められています。

### 開発状況

OpenRRは公開されているものの、まだまだ開発途中です。Rustのバージョンは通常0.1.0から始まるのですが、0.0.1くらいのバージョン番号をつけています。
ライブラリとして本格的に取り込むには変更が頻繁すぎてリスキーですが、いいものになるように （とくに`arci`のインタフェースについて） ご意見等頂ければありがたいです。

## OpenRR Appsを試してみる

OpenRRを使って作ったアプリがあるので紹介します。

### 準備

Linuxの人は[README.md](https://github.com/openrr/openrr)に従って依存ライブラリをインストールしておいてください。

#### Rustのインストール

https://rustup.rs/ にアクセスして、コマンドをターミナルにコピペしてrustをインストールしましょう。すでにインストールしてある人は念の為rustup updateしてください。
`source ~/.cargo/env` も忘れずに。

#### urdf-vizのインストール

必須ではないですが、ROSがないときのシミュレータ代わりのビューワーとして[urdf-viz](https://github.com/openrr/urdf-viz)をインストールしましょう。URDFファイルを可視化するには便利なツールです。同じくMacOS/Windowsでも動きます。(xacroやrospackが必要なurdf/xacroファイル(メッシュのパスが `package://` のもの)はLinuxでしか表示出来ないので、もし表示したければxacroはLinuxで出力し、package://はurdfからの相対パスか絶対パスに編集しておく必要があります。)

```bash
cargo install urdf-viz
```

#### openrr-appsのインストール

```bash
cargo install openrr-apps --features ros
```

Windowsの場合はROSが使えないので

```bash
cargo install openrr-apps
```

としてください（ROSは使えません）

#### 設定ファイルを用意

現在openrr-appsを使うには設定ファイルが必要です。[ここ](https://github.com/OTL/openrr-apps-config-sample)にコンフィグとサンプルURDFを置いたのでこれを使いましょう。

```bash
git clone https://github.com/OTL/openrr-apps-config-sample
cd openrr-apps-config-sample
```

ちなみにコンフィグの中身は↓のような感じです。

```toml
[[urdf_viz_clients_configs]]
name = "arm"
joint_names = ["l_shoulder_yaw", "l_shoulder_pitch", "l_shoulder_roll", "l_elbow_pitch", "l_wrist_yaw", "l_wrist_pitch"]

[openrr_clients_config]
# relative from this file or absolute path
urdf_path = "../urdf/robot.urdf"
self_collision_check_pairs = [
    "root:l_gripper_linear1",
    "root:l_gripper_linear2",
    "root:l_wrist_yaw",
    "root:l_wrist_pitch",
    "root:l_elbow_pitch",
    "root:l_shoulder_roll"
    ]

[[openrr_clients_config.collision_check_clients_configs]]
name = "arm_collision_checked"
client_name = "arm"

[[openrr_clients_config.ik_clients_configs]]
name = "arm_ik"
client_name = "arm_collision_checked"
solver_name = "arm_ik_solver"

[[openrr_clients_config.joints_poses]]
pose_name = "zero"
client_name = "arm_collision_checked"
positions = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

[[openrr_clients_config.joints_poses]]
pose_name = "pose1"
client_name = "arm_collision_checked"
positions = [0.0, 0.5, 0.0, -0.8, 0.0, 0.3]

[openrr_clients_config.ik_solvers_configs.arm_ik_solver]
ik_target = "l_tool_fixed"
```

### openrr_apps_joint_position_sender

まずは urdf-vizを立ち上げます。

```bash
urdf-viz urdf/robot.urdf &
```

![スクリーンショット 2021-02-18 16.47.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58926/43f23125-399d-23fb-ac5f-61d126ae89c6.png)


openrr_apps_joint_position_senderを立ち上げます。

```bash
openrr_apps_joint_position_sender config/robot.toml
```

![スクリーンショット 2021-02-18 16.47.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58926/2bd289f6-5db8-a50f-d7ab-0cf850bd671b.png)

どっかで見たことありそうなGUIですよね。

これはロボットの関節位置をロボットに送るGUIです。
`arm`と表示されているところを`arm_collision_checked`にすると、自己干渉チェックが行われてから姿勢がurdf-vizに送られます。

動作の様子

https://youtu.be/MpsGv-Fsawo


### openrr_apps_robot_command

こっちはコマンドラインインタフェースです。

関節角度の取得

```bash
$ openrr_apps_robot_command -c ./config/robot_config.toml get_state arm
Joint positions : [-0.64, 0.0, 0.0, 0.0, -1.17, 0.0]
```

いろんなコマンドを逐次実行。詳細はcommand/commands.txtを見てみてください。

```bash
openrr_apps_robot_command -c ./config/robot_config.toml load_commands ./command/commands.txt
```

動作の様子

https://youtu.be/r5L_LDWZbiE

どんなコマンドがあるかは`-h`で調べてみてください。

```bash
$ openrr_apps_robot_command -h
openrr_apps_robot_command 0.0.1
An openrr command line tool.

USAGE:
    openrr_apps_robot_command [OPTIONS] <SUBCOMMAND>

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
    -c, --config-path <config-path>

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                           Prints 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
    speak                          Speak text message
```

### 他の例

Universal RobotのUR10を使った例や、PR2で動かす例などもopenrrのリポジトリにはありますのでもし興味持っていただいたら（ハードル高いと思いますが）試していただけるとめっちゃうれしいです。

https://github.com/openrr/openrr/tree/main/openrr-apps

## ライブラリとして

ライブラリとして使うのが本当のOpenRRなのですが、まだサンプルと呼べるようなものはありません。openrr-apps自体が１つのサンプルではありますが、ちょっと複雑過ぎます。
Stay Tuned!

## 終わりに

以上でv0.0.1のOpenRRの紹介、解説は終わりです。興味を持って頂ければ幸いです。