ROS2 と MoveIt2 ロボット腕統合: 実践的なガイド
ロボット腕を ROS2 と MoveIt2 <unk> URDF セットアップ, ros2_control,運動計画,そして遠隔操作セルボモードと統合する方法
[←ガイド]
URDFの作成から,Cartesian servo control を使って ROS2 Humble と MoveIt2 を用いて腕の統合のためのステップバイ・ステップウォークスルー.
必須条件
このガイドは,Humble の Ubuntu 22.04 LTS を ROS2 Humble Hawksbill (EOL 2027 年 5 月) と Python 3.10 と MoveIt2 のバイナリー リリース を **MoveIt2 に 対象としています.
- ROS2 謙虚なデスクトップフル:
T1 には rviz2, rqt,およびすべてのコアライブラリが含まれています. - 移動する2 移動する2 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動する 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動 移動
- ros2_control:
T3 硬件抽象で必須 - Python パッケージ:
T4 チュートリアルスニッペットで使用されるシナマティックユーティリティ用. - コルコーン:
T5 パーソナルパッケージの構築のために
URDFの設定
**統一ロボット説明形式 (URDF) **は,腕の動力学,動力学,ハードウェアインターフェースのための唯一の真実源である.よく作成された URDFは,ほとんどの計画失敗を防ぐ.
関節制限は,まず正しいことである.ソフト制限 (計画のためにMoveIt2によって使用される) はハード制限 (緊急停止のためにファームウェアによって使用される) の内側に 5°である必要があります.あなたの腕のJ2ハードウェア制限が -120°から +120°である場合は,URDF
**イネルシアテンソーは通常間違っているし,不安定なシミュレーション動力を引き起こす.半径 _r_と長さ _L_のシリンダーとして推定される質量 _m_のリンクでは,
視野対衝突幾何学: 視覚標籤に高ポリ網 (DAE/OBJ) と衝突標籤に簡素化された凸体船体網を使用する.MoveIt2のFCL衝突チェックは衝突幾何学に対して計画時に実行されます.
操作タグは,URDFの
- ハードウェアプラグイン: ドライバーに設定します.例えば, [OpenArm] (OpenArm)
T60 ) の腕に. - 位置制御のために
T17 を宣言する.また,ドライバーがサポートしている場合, T18 と T19 を宣言する. - 状態インターフェース:
T20 と T21 を常に宣言します. 硬件がトークフィードバックを提供した場合, T22 を追加します. - param tag: ハードウェア要素内のパラメータタグを通過する.
MoveIt2 核心概念
計画コードの単行列を書く前に これらの4つの概念を理解すれば 時間を節約できます
MoveGroupは,高度な計画インターフェースです.計画パイプライン,計画シーン,実行マネージャーを包みます.
** 計画パイプライン** は,プロパガンダープラグインをオプションのプリ・ポスト処理アダプターで連鎖します. 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 から開始し,実行時に更新され,衝突物体 (ボックス,球,マッシュ) が
制限計画: MoveIt2は経路制限 (例えば,端効果を動きを通して直立に保つ) 関節制限,位置制限,方向制限をサポートします.
運動計画 トチュリアル
この4段階の作業は 新しいターミナルから 衝突制御のカーテジアン経路を実行します
ステップ 1
ステップ2 計画シーンを設定する:
ステップ3
ステップ4
遠隔操作セルボモード
moveit_servoは,再計画なしにリアルタイムでカートセインの速度制御を可能にします.
腕のサーボモードを起動するには,サーボ設定 YAML でサーボノードを起動ファイルに追加します.
- move_group_name: 計画グループを servo
に移動する場合は,SRDFグループ名と一致する必要があります. - カーテシアン 命令 テーマ: 默认
T36 ダウンロード T37 を 50 100Hz で 公開する - joint_command_out_topic: 輸出
T38 は,ros2_controlに転送されます. - ** incoming_command_timeout:** 0.1s に設定します. このウィンドウ内でコマンドが受信されない場合,セルボは腕を停止します.
- 低_単位の値_値/ハード_ストップ_単位の値_値: 17 と 30 に設定 (条件数値値の値).腕は単位の値に近づくにつれてゆっくりと停止します.
[テレオペレーションデータ収集] (
共通 な 問題 や 解決
- コントローラタイムリング / "軌道の点は厳密に増加していない": 位置制御の腕のためのハードウェアインターフェースが
T39 (T40 ではなく) を実装することを確認してください.スピードインターフェースはUSBベースの腕が保証できない正確なタイムリングを必要とします. - 計画中に関節制限違反: 硬い制限内に
T41 と T43 を設定することで, 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 ヴォクセル) を設定します.
関連ガイド
- ロボットAPI統合ガイド -- ROS2を企業統合のための REST/WebSocket APIに包装する
- 力/トークセンサー選択 --F/Tデータを MoveIt2阻害制御と統合する
- [遠隔操作 Labを設定する方法] ROS2スタックに接続するハードウェアの設定
- 双手通信設定 - ROS2のテーマは双手同期化
- [予防維持]
T67 ) -- 維持後の校准検証手順
RCSVとの作業
RCSVは,販売およびサービスするすべてのアームプラットフォームに ROS2と MoveIt2 統合サポートを提供しています.
- OpenArm Resources --オープンソースの URDF,MoveIt2設定,および OpenArm 1 のros2_controlドライバー
- ハードウェアストア -- 予約設定されたROS2ドライバーのOpenArm 1 ($4,500) を購入
- 修理・メンテナンス --ROS2統合サービス,ドライバー開発,校准
- データプラットフォーム --MoveIt2セルボモードで収集されたテレオペレーションデータをアップロードする
- [私たちと連絡してください]
T72 ) - 腕のプラットフォームのための ROS2 統合サポートを要求します
建設 を 始める よう に 準備 し て い ます か
オープンアーム
[OpenArm資源]







