以前の記事では、Embodied AIの分野で近年注目を集めている「Vision-Language-Action Models(VLA)」について紹介しました。VLAのように、ロボットが視覚・言語・行動を統合して現実世界でタスクを遂行する「Physical AI〔フィジカルAI〕(現実世界で物体を知覚・操作できるAI)」の研究開発を進めるためには、データの収集や学習、および検証の土台となるロボットアームの実機が欠かせません。

本記事では、ACCESSが研究開発のために導入したEnactic, Inc.の「OpenArm」について、製品の概要から調達・開封・セットアップ、そしてリーダー・フォロワー構成による遠隔操縦(テレオペレーション)を実行するまでの流れを追っていきます。

OpenArmとは

OpenArm 7自由度双腕ロボットアーム
画像出典:https://openarm.dev

OpenArmは、東京に拠点を置くEnactic, Inc.が開発しているフルオープンソースの7自由度双腕ロボットアームです。Physical AIの研究開発などをターゲットに設計されており、リーダー・フォロワー構成による双腕テレオペレーション、模倣学習、シミュレーション、実世界でのデータ収集といったユースケースに利用できます。人間の上半身を模した形状で、アーム2本が中央の背骨に相当するフレームに固定された構造をしています。

OpenArmの主な仕様
自由度(DOF) 7 DOF
アームリーチ 633 mm
ペイロード 6.0 kg(ピーク)/4.1 kg(定格)
アクチュエータ DAMIAO製QDD BLDCモータ
価格 約$6,500(USドル)

OpenArm最大の特徴は、CADデータ、ファームウェア、制御コード、シミュレーションモデルのすべてがオープンソースで公開されていることです。そのため自社の要件に合わせて、機構からソフトウェアまでを自由にカスタムして利用することができます。主要なリポジトリは以下の通りで、それぞれ用途に応じたライセンス(Apache-2.0、CERN-OHL-S-2.0)のもとで公開されています。

openarm
プロジェクトメイン(Issue・Discussion・全体ドキュメント)
openarm_hardware
STL / STEP / Fusion 360 アセンブリを含む完全な CAD データ
openarm_description
URDF / xacro によるロボット記述ファイル
openarm_can
SocketCAN を使った低レイヤモータ制御 C++ ライブラリ(Python バインディングあり)
openarm_ros2
ROS 2 統合パッケージ
openarm_teleop
Enactic, Inc.による遠隔操縦環境

QDDによる特徴

高バックドライバビリティ

各関節にはDamiao製QDD(Quasi Direct Drive) BLDCモータが採用されており、アームに外力が加わった時、柔らかく追従してモータが回ります。これはリーダー・フォロワー方式の遠隔操縦を実用に近いタスクへ適用する際に有用な性質であり、ゲインが適切に調整されたシステムは人間が無意識で行う力加減のような柔らかさを得ることができます。

双方向力覚フィードバック

OpenArmは遠隔操縦の枠組みの中にバイラテラル制御も実装されており、リーダー・フォロワー間で双方向の力覚フィードバックが可能です。フォロワー側が物体に触れた際の反力がリーダー側に伝わるため、接触を伴うタスク(拭き掃除、差し込み、柔らかい物体の把持など)における人間の微妙な力加減に合わせたデータ収集が可能になります。

sim2realギャップの埋めやすさ

近年盛んに研究開発が進められている四脚ロボットにおいてもQDDは広く利用されています。これは減速比の低さや遊星ギア減速機に起因する質量分布によって、シミュレータ内のモータの振る舞いと実機の振る舞いの差を比較的小さくしやすいためです。これにより、シミュレータ内でロボットに所望の動作を獲得させることができれば、比較的低いハードルで実機へ適用することができます。

私たちのR&Dの目標

  • 自前の遠隔操縦で収集したデータセットに対して各論文などで提案された手法・オープンなモデルを適用し、実用的なタスクの遂行性能を評価・検証する。

  • Isaac Labなどの物理シミュレータで複雑な振る舞いを獲得させ、これを実機に適用したときの性能を検証する。同時にこのsim2realデプロイにおけるノウハウを蓄積する。

  • 既存の広く公開された技術とACCESSが持つ組み込みや通信の独自ノウハウを組み合わせ、新しい価値のあるロボット技術やシステムを創出する。

ACCESSでは、OpenArmを用いた研究開発において上記のような段階を踏んだゴールを設定しています。本記事ではその一歩目として、OpenArmの調達から設置、リーダー・フォロワーによるテレオペレーション環境の構築までを扱います。

OpenArmの調達

OpenArmはフルオープンソースのため、調達方法には大きく2つのバリエーションがあります。

組み立て済みハードウェアを購入する

製造ベンダーによりすでに組み立てられたハードウェアを購入する方法です。OpenArmの公式サイトで「Official Manufacturing Partners」として紹介されており、日本から購入する場合は以下のベンダーが候補となります。

ハードウェアを自作する

自身でパーツを調達して組み立てを行います。前述のとおりOpenArmはフルオープンソースのためCADの図面もすべて公開されており、それに従って自ら部材を製造業者へ発注し、モータなどの既製品をそれぞれ海外から直接購入して揃えます。CADへの理解や組み立ての技術など、専門的な知識が求められます。

ACCESSでは価格と納期のバランスを検討し、WowRobo Roboticsからの購入を選択しました。リードタイムは数週間程度で、ACアダプタやクランプなど小物類もすべてパッケージに含まれていた点も魅力の一つです。内容物についてどの部品までが含まれているかをメールで問い合わせした際も、迅速かつ丁寧に対応していただけました。

到着した製品の開梱

リーダーとフォロワーの両方を1体ずつ購入したので、それぞれが大きな段ボールに梱包されて届きました。2箱合わせて40kg近い重量があるため、受領後の移動や取り扱いには注意が必要です。

wowrobo社から届いた段ボール

梱包を解いて段ボールを開けると頑強なハードケースが現れます。OpenArmのハードウェアを移動する際やどこかへ持ち出す際には、このケースを外箱として使う想定のようです。

wowrobo社から届いた段ボールを開封した様子

ハードケースを開けると、組み立て済みのアームが格納されています。

輸送ケースにOpenArmが格納されている様子

本体の設置

OpenArmリーダーの外観
OpenArmリーダーをクランプで机に仮設置した様子

まずは本体が転倒しないように丈夫な台座へ固定する必要があります。公式ドキュメントのGeneral Dimensionsのページにある寸法を参考に、大型のクランプを調達して台座に固定します。台座はキャスター付きで移動に便利な業務用のプリンターラックを採用し、リーダーがタスクを実行しやすい高さで設置しました。

次は配線をします。アーム内部のモータ同士の配線、アーム間の配線は到着時点ですでに組み立て済みのため、公式ドキュメントのPower&CANページにある配線図を参考にPCおよびACアダプタとの接続のみを実施します。

腕1本につき、ACアダプタは350Wのものが1つ割り当てられます。リーダーとフォロワーの両方を同時に動かす際には最大で1400Wの電力が要求される可能性があるため、部屋内の電力容量には注意が必要です。

ソフトウェア環境の構築

OpenArmは現在Linuxでのみ動作可能です。

検証環境
  • Ubuntu 24.04.1 LTS (x86_64)
  • uv: 0.11.6 (x86_64-unknown-linux-gnu)
  • Python: 3.12.3
  • LeRobot: 0.4.5 (コミットハッシュ d324ffe8)

LeRobotを使用する場合

LeRobotをインストールします。本項ではPythonのパッケージマネージャとしてuvを使用しています。最新版のLeRobotではuv sync --extra damiaoの代わりにuv sync --extra openarmsでもインストール可能です。

# uv のインストール
curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.local/bin/env

# LeRobotのインストール
git clone https://github.com/huggingface/lerobot.git
cd ~/lerobot
uv sync --extra damiao

CANの使用に必要なユーティリティをインストールします。

sudo apt update
sudo apt install -y can-utils iproute2

CAN FDのUSBアダプター用にgs_usbをロードします。ロードできたら、ipコマンドでcanデバイスがPCに認識されているか確認します。ACCESSの環境ではcan0can3として表示されました。

sudo modprobe gs_usb
ip link show

can0, can1can2, can3はそれぞれ2ch USB-CAN FDアダプターの組として認識されますが、どちらの組がリーダー側、どちらの組がフォロワー側になるかはLinuxのデバイス検出順に依存します。再起動やUSBコネクタの差し直しで入れ替わることがあるため、実行前にip link showなどで対応関係を確認してください。


CANデバイスとして認識されたら、CANのセットアップコマンドを実行します。

uv run lerobot-setup-can --mode=setup --interfaces=can0,can1,can2,can3

以下のコマンドで、モータの応答確認ができます。

uv run lerobot-setup-can --mode=test --interfaces=can0,can1,can2,can3

キャリブレーション

左右片方ずつに分かれているopenarm_leader/openarm_followerと、双腕を同時に動かすbi_openarm_leader/bi_openarm_followerがあります。片側の腕のみを動かしたい場合は前者を、両腕を動かしたい場合は後者を使用してください。

openarm_leader/openarm_followerのキャリブレーションは以下のコマンドで実行できます。

# リーダーのキャリブレーション(右側のみ)
uv run lerobot-calibrate \
--teleop.type=openarm_leader \
--teleop.port=can0 \
--teleop.id=my_openarm_leader_right

# リーダーのキャリブレーション(左側のみ)
uv run lerobot-calibrate \
--teleop.type=openarm_leader \
--teleop.port=can1 \
--teleop.id=my_openarm_leader_left

# フォロワーのキャリブレーション
uv run lerobot-calibrate \
--robot.type=openarm_follower \
--robot.port=can2 \
--robot.side=right \
--robot.id=my_openarm_follower_right

uv run lerobot-calibrate \
--robot.type=openarm_follower \
--robot.port=can3 \
--robot.side=left \
--robot.id=my_openarm_follower_left

bi_openarm_leader/bi_openarm_followerのキャリブレーションは以下のコマンドで実行できます。

uv run lerobot-calibrate \
--teleop.type=bi_openarm_leader \
--teleop.right_arm_config.port=can0 \
--teleop.left_arm_config.port=can1 \
--teleop.id=my_bimanual_leader

uv run lerobot-calibrate \
--robot.type=bi_openarm_follower \
--robot.left_arm_config.port=can3 \
--robot.left_arm_config.side=left \
--robot.right_arm_config.port=can2 \
--robot.right_arm_config.side=right \
--robot.id=my_bimanual_follower

バイラテラル制御(OpenArm公式の実装)を使用する場合

OpenArmが公式にリリースしているバイラテラル制御のパッケージを試します。こちらはROS 2環境のセットアップが必要です。

sudo apt update
sudo apt install -y can-utils iproute2
sudo apt install ‐y ros-jazzy-desktop
sudo apt install -y \
  ros-jazzy-controller-manager \
  ros-jazzy-gripper-controllers \
  ros-jazzy-hardware-interface \
  ros-jazzy-joint-state-broadcaster \
  ros-jazzy-joint-trajectory-controller \
  ros-jazzy-xacro

はじめに、ROS 2環境を有効化して、workspaceを固定します。

export ROS_DISTRO=jazzy
export ROS_WS=~/openarm_ros2_ws

mkdir -p $ROS_WS/src
cd $ROS_WS/src
source /opt/ros/$ROS_DISTRO/setup.bash

続いて、enactic/openarm_descriptionをcloneします。このリポジトリには、ROS 2用の記述パッケージが含まれています。

git clone https://github.com/enactic/openarm_description.git

cd $ROS_WS
colcon build

source $ROS_WS/install/setup.bash

enactic/openarm_teleopをcloneしてbuildします。このリポジトリには、テレオペレーションに必要なスクリプトが含まれています。

git clone https://github.com/enactic/openarm_teleop.git
cd openarm_teleop

sudo apt install -y software-properties-common
sudo add-apt-repository -y ppa:openarm/main
sudo apt update

sudo apt install -y libeigen3-dev libopenarm-can-dev liborocos-kdl-dev liburdfdom-dev \
  liburdfdom-headers-dev libyaml-cpp-dev
sudo apt install -y can-utils iproute2 libopenarm-can-dev openarm-can-utils

cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build

CANネットワークの初期化とキャリブレーション

CANネットワークの初期化とキャリブレーションは以下のコマンドで実行できます。openarm-can-zero-position-calibrationコマンドは、アームを物理的にゼロ位置に近い姿勢へ合わせて実行すると、自動的に動き出してゼロ位置を決定します。可動範囲には障害物や人が入らないように注意する必要があります。

# リーダー・フォロワー同時にCANネットワークを初期化
openarm-can-configure-socketcan-4-arms -fd

# can0のみCANネットワークを初期化
openarm-can-configure-socketcan can0 -fd

# キャリブレーションする場合
# leader right
openarm-can-zero-position-calibration --canport can0 --arm-side right_arm

# leader left
openarm-can-zero-position-calibration --canport can1 --arm-side left_arm

# follower right
openarm-can-zero-position-calibration --canport can2 --arm-side right_arm

# follower left
openarm-can-zero-position-calibration --canport can3 --arm-side left_arm

キャリブレーションが完了したら、モータとの通信に成功するか確認します。

openarm-can-motor-check 1 17 can0 -fd
openarm-can-motor-check 1 17 can1 -fd
openarm-can-motor-check 1 17 can2 -fd
openarm-can-motor-check 1 17 can3 -fd

遠隔操縦

LeRobotフレームワーク

片腕のみのテレオペレーションを試す場合は以下のコマンドを実行します。robot.id/teleop.idはキャリブレーション時のidにしてください。

# 右側のテレオペを試す例
uv run lerobot-teleoperate \
--robot.type=openarm_follower \
--robot.port=can2 \
--robot.side=right \
--robot.id=my_openarm_follower_right \
--teleop.type=openarm_leader \
--teleop.port=can0 \
--teleop.id=my_openarm_leader_right

両腕のテレオペレーションを同時に試す場合は以下のコマンドを実行します。

uv run lerobot-teleoperate \
--robot.type=bi_openarm_follower \
--robot.right_arm_config.port=can2 \
--robot.right_arm_config.side=right \
--robot.left_arm_config.port=can3 \
--robot.left_arm_config.side=left \
--robot.id=my_bimanual_follower \
--teleop.type=bi_openarm_leader \
--teleop.right_arm_config.port=can0 \
--teleop.left_arm_config.port=can1 \
--teleop.id=my_bimanual_leader

バイラテラル制御

ユニラテラル制御のテレオペレーションを行うには以下のコマンドを実行します。

cd ~/openarm_teleop
./script/launch_unilateral.sh right_arm can0 can2
./script/launch_unilateral.sh left_arm can1 can3

バイラテラルのテレオペレーションを行うには以下のコマンドを実行します。

cd ~/openarm_teleop
./script/launch_bilateral.sh right_arm can0 can2
./script/launch_bilateral.sh left_arm can1 can3

動作確認

バイラテラル制御を用いた遠隔操縦の様子を動画で紹介します。
今回は変形しやすい紙の空箱を持ち上げ、隣の段ボール箱の中へと移動することに成功しています。バイラテラル制御によりリーダーのハンドで反力がきちんと感じられた際には、作業者一同「おおー」と感嘆の声が上がりました。

今回の記事ではOpenArmの調達から設置、遠隔操縦の動作確認までを紹介しました。この実機を使い、今後はデータセット取得・ファインチューニング・実機デプロイとさらなる研究を進めていく予定です。ACCESSではPhysical AIの可能性や活用方法をこれからも積極的に研究開発していきます。Physical AIのビジネスへの活用・応用にご興味のあるかたは是非お気軽にご相談ください。