Guidesに戻る

ROS2 と MoveIt2 ロボット腕統合: 実践的なガイド

ロボット腕を ROS2 と MoveIt2 <unk> URDF セットアップ, ros2_control,運動計画,そして遠隔操作セルボモードと統合する方法

[←ガイド]

URDFの作成から,Cartesian servo control を使って ROS2 Humble と MoveIt2 を用いて腕の統合のためのステップバイ・ステップウォークスルー.

必須条件

このガイドは,Humble の Ubuntu 22.04 LTSROS2 Humble Hawksbill (EOL 2027 年 5 月) と Python 3.10MoveIt2 のバイナリー リリース を **MoveIt2 に 対象としています.

  • ROS2 謙虚なデスクトップフル: T1 には rviz2, rqt,およびすべてのコアライブラリが含まれています.
  • 移動する2 移動する2 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動
  • ros2_control: T3 硬件抽象で必須
  • Python パッケージ: T4 チュートリアルスニッペットで使用されるシナマティックユーティリティ用.
  • コルコーン: T5 パーソナルパッケージの構築のために

T6 はエラーを表示しないようにしてください. 単一のマシンで"ネットワーク設定"警告が表示されている場合は,マルチキャスト問題を防ぐために T7 を輸出してください.

URDFの設定

**統一ロボット説明形式 (URDF) **は,腕の動力学,動力学,ハードウェアインターフェースのための唯一の真実源である.よく作成された URDFは,ほとんどの計画失敗を防ぐ.

関節制限は,まず正しいことである.ソフト制限 (計画のためにMoveIt2によって使用される) はハード制限 (緊急停止のためにファームウェアによって使用される) の内側に 5°である必要があります.あなたの腕のJ2ハードウェア制限が -120°から +120°である場合は,URDF T8T9 (ラディアンで±120°) を設定し,MoveIt2関節制限を ±117°に T10に設定します.

**イネルシアテンソーは通常間違っているし,不安定なシミュレーション動力を引き起こす.半径 _r_と長さ _L_のシリンダーとして推定される質量 _m_のリンクでは,T11,T12,T13を使用します.外角線式用語は対称リンクではゼロです.誤ったイネルシア (例えば,全ゼロまたは場所保持値) はガゼボ物理学が爆発し,MoveIt2の衝突チェックを予測不能に振る舞わせます.

視野対衝突幾何学: 視覚標籤に高ポリ網 (DAE/OBJ) と衝突標籤に簡素化された凸体船体網を使用する.MoveIt2のFCL衝突チェックは衝突幾何学に対して計画時に実行されます.

操作タグは,URDFの T15要素内に表示されなければなりません.このタグは,ハードウェアドライバの制御インターフェースタイプとプラグインクラスを宣言します.

  • ハードウェアプラグイン: ドライバーに設定します.例えば, [OpenArm] (OpenArm) T60) の腕に.
  • 位置制御のために T17 を宣言する.また,ドライバーがサポートしている場合, T18T19 を宣言する.
  • 状態インターフェース: T20T21を常に宣言します. 硬件がトークフィードバックを提供した場合,T22を追加します.
  • param tag: ハードウェア要素内のパラメータタグを通過する.

MoveIt2 核心概念

計画コードの単行列を書く前に これらの4つの概念を理解すれば 時間を節約できます

MoveGroupは,高度な計画インターフェースです.計画パイプライン,計画シーン,実行マネージャーを包みます. T23 C++クラスまたはT24 Python 包装を通してそのと相互作用します.MoveGroupは,SRDF (例えば"腕","グリッパー") の名前を持つグループのために定義され,すべての計画要求の入口点として機能します.

** 計画パイプライン** は,プロパガンダープラグインをオプションのプリ・ポスト処理アダプターで連鎖します. MoveIt2 は,あなたのタスクに基づいて選択するプロパガンダーバックエンドを3つ送ります:

Planner Best For Limitations
OMPL (default) General-purpose, cluttered environments, no dynamics needed Non-deterministic; replanning may give different paths
CHOMP Smooth, gradient-optimized trajectories Can get stuck in local minima; slow in tight spaces
PILZ Industrial Motion Planner Deterministic LIN/PTP/CIRC industrial moves No obstacle avoidance; requires clear workspace

プランニングシーンは,環境の3Dライブ表示です. URDF から開始し,実行時に更新され,衝突物体 (ボックス,球,マッシュ) が T25 経由で追加されます. プランニング前に常に表,固定物,そして未知の物体を囲んでではなく,空き空間を介して MoveIt2 プランを計画する前に,シーンにテーブル,固定物,および既知の障害物を追加します.

制限計画: MoveIt2は経路制限 (例えば,端効果を動きを通して直立に保つ) 関節制限,位置制限,方向制限をサポートします. T26で制限が指定されています. OMPLの制限意識の計画には,T27プラグインが必要です. 方向性維持の簡単な目的 (例えば,移動中にグリッパーレベルを維持する) において,ピッチとロール軸の周りの許容度 ±10° の方向性制限は信頼性的に動作します.

運動計画 トチュリアル

この4段階の作業は 新しいターミナルから 衝突制御のカーテジアン経路を実行します

ステップ 1 デモを起動する: T28は,Panda デモアームで rviz2 を起動します. 起動ファイルを自分のアームの MoveIt2 構成パッケージに交換します (MoveIt2 セットアップアシスタントで生成されます).

ステップ2 計画シーンを設定する: T29T30 に メッセージを公開する. 作業テーブルを正常に表示するボックスを追加する. rviz2 の "計画シーン" 画面に表示されるのを確認する.

ステップ3 カルテジアン経路を計画する:** T31を使用する.この経路の最終効果子の移動のセンチメートルあたり1点の経路を意味する.返点値が1.0で,経路の100%が計算されたことを意味します.0.9未満の値は,通常,経路中途半端に関わる限界または衝突が起こったことを意味します.

ステップ4 衝突チェックで実行する: 軌道を軌道を実行管理者を通過する T33を呼び出す.管理者は設定された周波数 (通常は250500 Hz) でros2_controlへの共同コマンドをストリームします.監視された計画シーンによって実行中に衝突が検出された場合 (T34シーン更新ストリームを必要とする) MoveIt2は軌道を中止します.

遠隔操作セルボモード

moveit_servoは,再計画なしにリアルタイムでカートセインの速度制御を可能にします. T35メッセージを最大 100 Hzで受け入れて,連続して要求されたエンドエフェクター速度を追跡する関数速度コマンドを生成します.関数制限と単一性回避が適用されます.

腕のサーボモードを起動するには,サーボ設定 YAML でサーボノードを起動ファイルに追加します.

  • move_group_name: 計画グループを servo に移動する場合は,SRDFグループ名と一致する必要があります.
  • カーテシアン 命令 テーマ: 默认 T36 ダウンロード T37 を 50100Hz で 公開する
  • joint_command_out_topic: 輸出 T38は,ros2_controlに転送されます.
  • ** incoming_command_timeout:** 0.1s に設定します. このウィンドウ内でコマンドが受信されない場合,セルボは腕を停止します.
  • 低_単位の値_値/ハード_ストップ_単位の値_値: 17 と 30 に設定 (条件数値値の値).腕は単位の値に近づくにつれてゆっくりと停止します.

[テレオペレーションデータ収集] (T61) では,入力デバイス (VR コントローラー,SpaceMouse,または手袋) から得られたターストコマンドを一貫した100 Hzで公開します.コマンド周波数のジッターは,示範品質を低下させる速度間断を引き起こす.

共通 な 問題 や 解決

  • コントローラタイムリング / "軌道の点は厳密に増加していない": 位置制御の腕のためのハードウェアインターフェースが T39 (T40ではなく) を実装することを確認してください.スピードインターフェースはUSBベースの腕が保証できない正確なタイムリングを必要とします.
  • 計画中に関節制限違反: 硬い制限内に T41T43 を設定することで, T41 に 5° (0.0873 rad) の安全差を適用する.これは,ハードウェアの制限スイッチを実行中期に触発する軌道を計画者に生成することを防ぐ.
  • **シミュレーションにおける不安定な動力:**誤った URDF 慣性値は最も一般的な原因です. T44 で各リンクの慣性を確認し, rqt ロボット説明ビューカーで慣性を確認してください.
  • MoveGroup は接続できず: 移動_グループノードが実行されていることを確認し,あなたの RMW (デフォルトサイクロン DDS) は他のノードと同じドメイン ID を持っていることを確認します. T46 を一貫して設定します.
  • Servoはジラキな動きを生成します. 固定速さで動作するセルボコマンドループを確認してください. T47とROS2タイマーを使用し, T48と一時ループを使用してください.

キーパッケージ 参照

Package Purpose Install
moveit_servo Real-time Cartesian servo / teleop Included in ros-humble-moveit
moveit_planners_ompl OMPL sampling-based planners Included in ros-humble-moveit
moveit_visual_tools rviz2 debugging markers and trajectory visualization ros-humble-moveit-visual-tools
joint_state_broadcaster Broadcasts /joint_states from ros2_control ros-humble-ros2-controllers
robot_state_publisher Publishes TF tree from URDF + joint states ros-humble-robot-state-publisher
moveit_ros_perception OctoMap integration for 3D obstacle avoidance Included in ros-humble-moveit

OpenArm 1 MoveIt2 設定

OpenArm 1 は,前もって構築された MoveIt2 構成を搭載しているが,その構造を理解することは,あなたの作業に合わせてカスタマイズする際に役立ちます.

  • URDF/XACRO: T49 は 6 つのリボート関節 + 1 つのプリズマティックグリッパー関節を定義しています.関節制限はハードウェア制限の内 5 度に設定されています.動力テンソーはCAD モデルから計算されます.
  • SRDF: T50 は"腕"計画グループ (関節 1-6) と"グリッパー"グループ (グリッパー関節) を定義する.この2つのポーズは"ホーム" (すべてのゼロ) と"ready" (関節は [0, -0.5, 0.7, 0, 0.8, 0] rad) である.
  • joint_limits.yaml: 遠隔操作の際の安全性のために速度の制限は1.0rad/sに設定します.
  • kinematics.yaml: KDL 解析器 デフォルトで. IK の 単一度近く の 要求 を 求める 作業 に は, T51: T52 に 切り替えて kinematics.yaml を 更新 する.

Python MoveGroupインターフェイス例

MoveIt2 Python API を使用してピックアンドプレイスシーケンスを計画し実行する完全な Python 例:

#!/usr/bin/env python3
"""MoveIt2 pick-and-place example for OpenArm 1."""
import rclpy
from rclpy.node import Node
from moveit2 import MoveIt2
from geometry_msgs.msg import PoseStamped
import numpy as np

class PickPlace(Node):
    def __init__(self):
        super().__init__("pick_place")
        self.moveit2 = MoveIt2(
            node=self,
            joint_names=[f"joint_{i}" for i in range(1, 7)],
            base_link_name="base_link",
            end_effector_name="gripper_link",
            group_name="arm",
        )
        # Wait for MoveIt2 to be ready
        self.moveit2.wait_for_execution(timeout=10.0)

    def execute(self):
        # 1. Move to ready pose
        self.moveit2.move_to_configuration(
            [0.0, -0.5, 0.7, 0.0, 0.8, 0.0]
        )
        self.moveit2.wait_for_execution()

        # 2. Move to pick pose (Cartesian)
        pick_pose = PoseStamped()
        pick_pose.header.frame_id = "base_link"
        pick_pose.pose.position.x = 0.3
        pick_pose.pose.position.y = 0.0
        pick_pose.pose.position.z = 0.05
        pick_pose.pose.orientation.w = 1.0
        self.moveit2.move_to_pose(pick_pose)
        self.moveit2.wait_for_execution()

        # 3. Close gripper
        self.moveit2.move_to_configuration(
            joint_positions=[0.0],  # closed
            joint_names=["gripper_joint"],
            group_name="gripper",
        )
        self.moveit2.wait_for_execution()

        # 4. Move to place pose
        place_pose = PoseStamped()
        place_pose.header.frame_id = "base_link"
        place_pose.pose.position.x = 0.3
        place_pose.pose.position.y = -0.2
        place_pose.pose.position.z = 0.1
        place_pose.pose.orientation.w = 1.0
        self.moveit2.move_to_pose(place_pose)
        self.moveit2.wait_for_execution()

        # 5. Open gripper
        self.moveit2.move_to_configuration(
            joint_positions=[0.04],  # open
            joint_names=["gripper_joint"],
            group_name="gripper",
        )
        self.moveit2.wait_for_execution()

def main():
    rclpy.init()
    node = PickPlace()
    node.execute()
    rclpy.shutdown()

if __name__ == "__main__":
    main()

カルテジアン経路計画:詳細な作業流程

3D空間における特定の軌道をたどる (擦り,描画,挿入) 目的要素を要する作業には,カーテジアン経路が不可欠である.

  • 滑らかな動きを可能にする T53 (1cm) を設定する.大きなステップ (5cm) は角に揺れ動く.小さなステップ (<5mm) は,目に見える改善なしに計画時間を増加させる.
  • ジャンプしきい値: 跳び検出器を無効にするために T54を設定する (ほとんどの作業に使用推奨). 隣接する路線点間のしきい値を超えて移動する関節が,関節限界に近い有効な経路を拒絶する場合は,ゼロ以外のしきい値が計画を中止します.
  • 割れチェック: T55は,要求された経路の達成可能な範囲を示す割れ (0.0-1.0) を返します.割れが <0.95であれば,経路は,おそらく関節制限または衝突境界を横切る.接近方向を調整するか,方向制限を緩和する.
  • カーテス運動中の方向性制限: 倒すか挿入するなどの作業では,グリッパーレベルを維持するために方向性制限を追加する. 振動軸とロール軸の周りに方向性許容度を +/-10 度に設定し,の 360 度自由を保持する.

衝突チェック: 計画現場に物体を追加する

MoveIt2 は,知っている物体と衝突を回避する.計画する前に常に作業場物体を追加します.

  • テーブル表面: テーブルに匹敵する寸法を持つ原始的な箱として追加し,正しい高度に配置します.これは最も頻繁に欠落する衝突物体であり,腕テーブルが衝突する原因です.
  • カメラマウンティング: 上のカメラとサイドカメラマウンティングに簡素なボックス形を追加します.腕がカメラにぶつかるまで,これらのものはしばしば忘れられます.
  • 固定された物体:** 握手が物体を握ると, T56 を使用して終力効果のリンクに固定する. これは,握手物体と環境を衝突させる経路を計画者に生成することを防ぐ. 置くとき離れる.
  • OctoMap (ダイナミック障害物): 移動障害物のある環境では,深度カメラのポイントクラウドを MoveIt2 の OctoMap 統合に供給します. MoveIt2 は 3D 居住地地図を作成し,その周りに計画します. 詳細と計画速度を良いバランスのために T57 を使用し, T58 (2 cm ヴォクセル) を設定します.

関連ガイド

RCSVとの作業

RCSVは,販売およびサービスするすべてのアームプラットフォームに ROS2と MoveIt2 統合サポートを提供しています.

  • OpenArm Resources --オープンソースの URDF,MoveIt2設定,および OpenArm 1 のros2_controlドライバー
  • ハードウェアストア -- 予約設定されたROS2ドライバーのOpenArm 1 ($4,500) を購入
  • 修理・メンテナンス --ROS2統合サービス,ドライバー開発,校准
  • データプラットフォーム --MoveIt2セルボモードで収集されたテレオペレーションデータをアップロードする
  • [私たちと連絡してください] T72) - 腕のプラットフォームのための ROS2 統合サポートを要求します

建設 を 始める よう に 準備 し て い ます か

オープンアーム を探求します オープンソースのロボットアームは,ROS2とMoveIt2の統合のために設計されています. 前もって構築された URDF,MoveIt2設定,およびros2_controlドライバーがあります.

[OpenArm資源]