MoveIt 2 は ROS 2 における動作計画のデファクトスタンダードであり、ロボットアームが衝突回避機能を備えた軌道の計画・実行・適応を行うことを可能にします。本ガイドでは、MoveIt 2.8.0 (2026年5月版)と ROS 2 Jazzy を用いて、インストール、設定、実用的なケース(基本的な計画から実時間制御まで)について解説します。
TL;DR
ros-jazzy-moveitを利用して MoveIt 2 をインストールするか、カスタマイズのためにソースからビルドします。- MoveIt Setup Assistant を使用して、ロボットの URDF/SRDF 設定ファイルを自動生成します。
- OMPL プランナー(例:
RRTConnectkConfigDefault)を用いて動作計画を行い、RViz で可視化します。 - MoveIt Servo を有効化して、実時間での軌道追従を
ros2_controlと連携させます。 - 知覚機能(例:カメラフィード)を ROS 2 トピックや
moveit_msgs/PlanningSceneを介して統合します。
1. インストールと MoveIt Setup Assistant
前提条件
- Ubuntu 24.04 (Noble Numbat) + ROS 2 Jazzy (インストールガイド)。
- Python 3.10+ (
moveit_commanderの更新に伴い MoveIt 2.8.0 では必須)。 - Git と colcon (ソースビルド用)。
環境を確認します:
echo $ROS_DISTRO # 「jazzy」と表示される必要があります
python3 --version # 3.10以上と表示される必要があります
MoveIt 2 のインストール
オプションA:バイナリインストール(推奨)
sudo apt update
sudo apt install ros-jazzy-moveit
source /opt/ros/jazzy/setup.bash
インストールを確認します:
ros2 pkg prefix moveit_ros # /opt/ros/jazzy と表示される必要があります
オプションB:ソースからのビルド(カスタマイズ用)
mkdir -p ~/moveit2_ws/src && cd ~/moveit2_ws/src
git clone https://github.com/ros-planning/moveit2.git -b main
vcs import < moveit2/moveit2.repos
cd ~/moveit2_ws && colcon build --symlink-install
source install/setup.bash
MoveIt デモの起動
Panda ロボット (MoveIt に標準搭載)をテストします:
ros2 launch moveit2_demos panda_moveit_demo.launch.py
- 期待される動作:RViz が開き、Panda アーム とプランニングシーンが表示されます。
- トラブルシューティング:RViz が起動しない場合は、
ros-jazzy-rviz2とros-jazzy-ogreを追加インストールしてください:sudo apt install ros-jazzy-rviz2 ros-jazzy-ogre
2. ロボットの設定(URDF/SRDF)
ステップ1:URDF の準備
MoveIt は URDF (ロボットの記述)と SRDF (セマンティックロボット記述)を必要とします。MoveIt Setup Assistant を使用して設定ファイルを自動生成します。
例:簡易化された Panda アームの URDF
<!-- panda.urdf.xacro -->
<robot name="panda" xmlns:xacro="http://www.ros.org/wiki/xacro">
<link name="world"/>
<joint name="panda_joint" type="fixed">
<parent link="world"/>
<child link="panda_link0"/>
</joint>
<!-- ロボットのジョイント・リンクを追加してください -->
</robot>
ステップ2:Setup Assistant の実行
ros2 run moveit_setup_assistant setup_assistant
- 入力内容:
- URDF ファイル:
path/to/your_robot.urdf.xacro - 出力ディレクトリ:
~/moveit2_ws/src/your_robot_moveit_config
- URDF ファイル:
- 出力ファイル:
config/srdf/(セマンティック記述)config/joint_limits.yaml(ジョイント制約)launch/(起動ファイル)
ステップ3:ビルドとソースの反映
cd ~/moveit2_ws && colcon build --packages-select your_robot_moveit_config
source install/setup.bash
ステップ4:ロボットを MoveIt で起動
ros2 launch your_robot_moveit_config demo.launch.py
- 期待される動作:RViz にロボットの運動学ツリーと衝突オブジェクトが表示されます。
トラブルシューティング
- ジョイント制限の未設定:ジョイントが動作しない場合は、
joint_limits.yamlを確認してください:joint_limits: panda_joint: has_velocity_limits: true max_velocity: 1.0 has_acceleration_limits: true max_acceleration: 2.0 - 衝突メッシュのエラー:URDF の
<collision>と<visual>タグに<geometry>が存在することを確認してください(例:<mesh filename="package://meshes/panda_link.dae"/>)。 - SRDF の検証:以下のコマンドを実行してください:
ros2 run srdfdom check_srdf your_robot.srdf
3. OMPL を用いた動作計画
ジョイント空間での軌道計画
moveit_commander (Python)または move_group (C++)を使用します。以下は Python の例です:
#!/usr/bin/env python3
import rclpy
from moveit_commander import MoveGroupCommander
def plan_joint_trajectory():
rclpy.init()
group = MoveGroupCommander("panda_arm") # SRDF からグループ名を指定
group.set_planner_id("RRTConnectkConfigDefault") # OMPL プランナー
# 目標ジョイント値(ラジアン単位)を設定
joint_goal = [0.0, -0.785, 0.0, -2.356, 0.0, 1.571, 0.785]
group.set_joint_value_target(joint_goal)
# 計画・実行
plan = group.go(wait=True)
if plan:
print("軌道が正常に実行されました!")
else:
print("計画に失敗しました。")
if __name__ == "__main__":
plan_joint_trajectory()
rclpy.shutdown()
MoveIt 2.8.0 で利用可能な主要な OMPL プランナー
| プランナー | 用途 | 備考 |
|---|---|---|
RRTConnectkConfigDefault | 一般目的 | 高速で冗長ロボットに適しています。 |
TRRT | 高次元空間 | 自由度の多いロボットに適しています。 |
ESTkConfigDefault | 高精度タスク | 遅いですが正確です。 |
PilzIndustrial | 工業用アーム(Pilz 互換) | moveit_pilz パッケージが必要です。 |
RViz で計画を可視化
- RViz で Motion Planning ディスプレイを追加します。
- グループ名(例:
panda_arm)を選択します。 - "Plan" をクリックして、赤線で軌道を確認します。
トラブルシューティング
- 計画失敗:
group.go()がFalseを返す場合は、以下を試してください:- プランナーを変更:
group.set_planner_id("TRRT")。 - プランナー設定の
max_iterationsを調整:# config/planning_pipelines/panda.srdf planner_configs: RRTConnectkConfigDefault: max_iterations: 1000000
- プランナーを変更:
- 自己衝突:URDF の
<collision>タグを確認してください。以下のコマンドでチェックします:ros2 run moveit_ros_planning_interface check_collisions
4. 衝突チェックとプランニングシーン
シーンにオブジェクトを追加
def add_box_to_scene():
scene = group.get_planning_scene()
box_pose = geometry_msgs.msg.PoseStamped()
box_pose.header.frame_id = "panda_link0"
box_pose.pose.position.z = 0.2 # エンドエフェクタからのオフセット
scene.add_box("box1", box_pose, (0.1, 0.1, 0.1)) # (x, y, z) のサイズ
scene.async_update() # 非同期更新
衝突チェック
def check_collision():
collision_state = group.get_current_state()
result = group.check_state_collision(collision_state)
print(f"衝突が検出されました: {result}")
シーンの保存・読み込み
# シーンをファイルに保存
scene.export_to_xml_file("scene.xml")
# シーンを読み込み
scene.load_from_xml_file("scene.xml")
トラブルシューティング
- 古いシーンデータ:変更後は必ず
scene.async_update()を呼び出してください。 - オブジェクトのフレーム:すべてのオブジェクトのポーズは有効なフレーム(例:
panda_link0)で指定してください。 - パフォーマンス:多数のオブジェクトを扱う場合は、
scene.async_update()を使用してブロックを避けてください。
5. カルテシアンパスとピックアンドプレイス
カルテシアンパスの計画
def plan_cartesian_path():
group.set_max_velocity_scaling_factor(0.5) # 精度向上のために速度を低減
waypoints = []
# 現在のポーズから開始
waypoints.append(group.get_current_pose().pose)
# 中間経由点を定義(6次元ポーズ:x,y,z,ロール,ピッチ,ヨー)
pose_target = geometry_msgs.msg.Pose()
pose_target.position.x = 0.3
pose_target.position.y = 0.1
pose_target.position.z = 0.2
pose_target.orientation.w = 1.0
waypoints.append(pose_target)
# 計画・実行
(plan, fraction) = group.compute_cartesian_path(
waypoints,
eef_step=0.01, # エンドエフェクタのステップサイズ
jump_threshold=0.0
)
group.execute(plan)
ピックアンドプレイスの例
def pick_and_place():
# オブジェクトに近づく
group.set_pose_target(pick_pose)
plan = group.go(wait=True)
# オブジェクトをアタッチ(シミュレーション)
group.attach_object("box1")
# プレイスポーズに移動
group.set_pose_target(place_pose)
plan = group.go(wait=True)
# オブジェクトをデタッチ
group.detach_object("box1")
トラブルシューティング
- フレームの不一致:すべてのポーズは同じフレーム(例:
base_link)で指定してください。 - 特異点:カルテシアンパスが特異点付近で失敗する場合は、以下を試してください:
group.set_goal_joint_tolerance(0.001) # 許容値を厳密に設定 - グリッパ制御:グリッパを使用する場合は、
ros2_controlインターフェース(第6節参照)を利用してください。
6. MoveIt Servo を用いたリアルタイム制御
MoveIt Servo は ros2_control を利用したリアルタイム軌道追従を可能にし、動的環境や高速タスクに不可欠です。
前提条件
ros2_controlとハードウェアインターフェースをインストールします:sudo apt install ros-jazzy-ros2-control ros-jazzy-ros2-controllers
Servo の設定
-
起動ファイルに Servo を追加します:
<!-- launch/servo_demo.launch.py --> <launch> <include file="$(find your_robot_moveit_config)/launch/demo.launch.py"/> <node pkg="moveit_servo" exec="servo_node" name="servo_node"> <param name="robot_description" type="string" command="$(param robot_description)"/> <param name="group_name" value="panda_arm"/> <param name="servo_period" value="0.01"/> <!-- 100Hz --> </node> </launch> -
Servo を実行します:
ros2 launch your_robot_moveit_config servo_demo.launch.py
リアルタイムコマンドの送信
def servo_cartesian_motion():
servo = MoveItServoCommander("panda_arm")
servo.start()
# ウェイポイントを定義
waypoint = geometry_msgs.msg.PoseStamped()
waypoint.header.frame_id = "base_link"
waypoint.pose.position.x = 0.4
# 100Hz で送信
servo.send_cartesian_waypoint(waypoint, 0.01) # 0.01秒間隔
トラブルシューティング
- 遅延:Servo は リアルタイムカーネル を使用して、10ms 未満の遅延を実現する必要があります。以下をインストールしてください:
sudo apt install ros-jazzy-ros2-realtime-tools - コントローラの調整:
servo_period(デフォルト:0.01秒)を調整してください。低い値はジッターを増加させます。 - ハードウェアの互換性:ロボットのドライバが
ros2_controlに対応していることを確認してください(例:Franka ロボットの場合はfranka_ros2を使用)。
