Skip to content

TeamSOBITS/sobits_teleop

Repository files navigation

JA | EN

Contributors Forks Stargazers Issues License

SOBITS TELEOP

目次
  1. 概要
  2. 環境構築
  3. 実行・操作方法
  4. マイルストーン

概要

ロボットをジョイスティック(PS4, PS5)、Meta Quest、またはキーボードで遠隔操作するためのパッケージ.
Meta Questのセットアップについてはこちらを参照.

本パッケージはロボット非依存です.ロボット固有の設定はすべて1つのconfigディレクトリ (config/{robot_name}/)にまとまっており,起動時にrobot_name:=<名前>で選択します. SOBITSロボット(sobit_homesobit_prosobit_edusobit_minisobit_light)用の configは同梱済みで,新しいロボットへの移植はこのディレクトリを作成するだけです — コードやlaunchの変更は不要です(新しいロボットへの移植参照).

対応入力デバイス:ps4ps5questkeyboard

(上に戻る)

環境構築

ここで,本レポジトリのセットアップ方法について説明します.

(上に戻る)

環境条件

まず,以下の環境を整えてから,次のインストール段階に進んでください.

System Version
Ubuntu 24.04 (Noble Numbat)
ROS Jazzy Jalisco
Python 3.12+

(上に戻る)

インストール方法

  1. ROSのsrcフォルダに移動します.

    cd ~/colcon_ws/src/
  2. 本レポジトリをcloneします.

    git clone -b jazzy-devel https://github.com/TeamSOBITS/sobits_teleop
  3. レポジトリの中へ移動します.

    cd sobits_teleop/
  4. 依存パッケージをインストールします.

    bash install.sh
  5. パッケージをビルドします.

    cd ~/colcon_ws/
    colcon build --symlink-install
    source ~/colcon_ws/install/setup.bash

(上に戻る)

実行・操作方法

基本的な流れ:

  1. ロボットと入力デバイスに対応するconfigファイルを確認・作成する.
  2. 入力デバイスをPCに接続する.
  3. 適切な引数を指定してテレオペノードを起動する.

(上に戻る)


configファイル作成

各ロボットのconfigはconfig/{robot_name}/以下に配置します. このディレクトリが本パッケージ内で唯一のロボット固有部分です:

ファイル 役割
robot.yaml ジョイントコントローラとcmd_velのトピック名
{device}.yaml 使用するデバイスのボタン・軸マッピング
arm_backend_plan.yaml Plan-and-replaceアーム追跡バックエンドのチューニング(Quest使用時のみ)
arm_backend_servo.yaml MoveIt Servoアーム追跡バックエンドのチューニング(Quest使用時のみ)
arm_scale_calibrator.yaml アームリーチキャリブレーションパラメータ(Quest使用時のみ)

アームの構成情報(アームの一覧・planning group・目標/エンドエフェクタのフレーム・ コントローラトピック)は{device}.yaml(アームごとのarm:ブロック)とrobot.yaml (trajectoryトピックのマップ)に一度だけ定義します.launcherが起動するバックエンドへ 注入するため,2つのarm_backend_*.yamlはチューニングのみを持ち,ほぼロボット非依存です.

robot.yaml(例)
/**:
  ros__parameters:
    robot_topic_name:
      joint_states_topic: joint_states
      joint_trajectory_topic:
        head:      head_position_controller/joint_trajectory
        body:      body_position_controller/joint_trajectory
        arm_left:  arm_left_position_controller/joint_trajectory
        arm_right: arm_right_position_controller/joint_trajectory
      cmd_vel_topic: cmd_vel
{device}.yaml(例)
/**:
  ros__parameters:

    control_joints:       # 操作するjoint_trajectory_controllerを定義
      groups:
        - head
        - arm_left
      head:
        names:
          - head_tilt_joint
          - head_pan_joint
        head_tilt_joint:
          button:      2    # 有効化ボタン
          fast_button: 6    # 押している間、高速モード
          axis:        1    # ジョイスティック軸
          axis_sign:   1    # 正負を反転する場合は-1
          speed:       0.1  # 通常速度
          fast_speed:  0.5  # 高速モード時の速度

    control_poses:        # 定義済みポーズへの移動
      trigger: 8
      pose_list:
        - initial_pose
        - pre_manipulation_pose
      initial_pose:
        button: 2

    control_velocity:     # 台車制御
      button:             5
      fast_button:        7
      linear_x_axis:      1
      linear_y_axis:      0
      angular_axis:       3
      axis_sign:          1
      linear_scale:       0.1
      angular_scale:      0.3
      fast_linear_scale:  0.2
      fast_angular_scale: 0.6

(上に戻る)


起動引数

すべての設定はCLI引数で指定します.launchファイルを直接編集する必要はありません.

引数 デフォルト 説明
robot_name sobit_home ロボット名(configディレクトリの選択に使用)
device ps4 入力デバイス:ps4ps5questkeyboard
joystick_device /dev/input/js0 ジョイスティックデバイスパス(PS4/PS5のみ)
ros_ip 0.0.0.0 Quest TCP接続用のPC IPアドレス
use_ds4drv True ds4drvを同時起動する(PS4のみ)
use_moveit false アーム追跡バックエンドを起動する(Questのみ)
use_servo false Plan-and-replaceの代わりにMoveIt Servoバックエンドを使用する(use_moveit:=trueが必要)
use_sim_time false シミュレーション時刻を使用する(Gazebo)

(上に戻る)


テレオペノード実行

PS4 / PS5

  1. コントローラをBluetoothでPCとペアリングする.
  2. jstest-gtkコマンドで接続を確認する.
  3. 起動する:
    ros2 launch sobits_teleop sobits_teleop.launch.py \
      robot_name:=sobit_home \
      device:=ps4

Note

Dockerコンテナ内でds4drvを使用する場合は、/dev/input//run/udevをマウントすること.

Meta Quest

  1. QuestとPCが同一Wi-Fiネットワークに接続されていることを確認する.
  2. PCのIPアドレスを確認する:
    hostname -I
  3. テレオペノードを起動する:
    ros2 launch sobits_teleop sobits_teleop.launch.py \
      robot_name:=sobit_home \
      device:=quest \
      ros_ip:=<PC_IPアドレス>
  4. Quest側でUnityプロジェクトを起動し、左コントローラのメニューボタンでROS_IPを入力・設定する.

Meta Questのセットアップはmeta_quest_teleoperationを参照.

キーボード

ros2 launch sobits_teleop sobits_teleop.launch.py \
  robot_name:=sobit_home \
  device:=keyboard

(上に戻る)


アーム追跡バックエンド(Meta Quest)

ハンドコントローラのTFポーズをリアルタイムで追従するバックエンドが2種類あります. どちらも同じインタフェース — {side}_target_link TFと /{robot_name}/{arm_name}/moveit_track_enabledstd_msgs/Bool,グリップボタンが 自動でパブリッシュ)— を使うため,launch引数1つで切り替えられます.

バックエンド 選択方法 追従方式
Plan-and-replace(moveit_arm_controller use_moveit:=true MoveIt2で短いCartesian計画をストリーミング;特異点付近はOMPLへフォールバック
MoveIt Servo(servo_node + servo_target_bridge use_moveit:=true use_servo:=true アームごとのmoveit_servoインスタンスが50Hzで微分IK
ros2 launch sobits_teleop sobits_teleop.launch.py \
  robot_name:=<robot_name> \
  device:=quest \
  ros_ip:=<PC_IPアドレス> \
  use_moveit:=true \
  use_servo:=true        # 省略するとPlan-and-replaceバックエンド

両launcherはlaunch/include/にあり,アーム構成をquest.yaml/robot.yamlから 注入するため,バックエンドのconfigはチューニングのみです.

Plan-and-replaceのチューニング — config/{robot_name}/arm_backend_plan.yaml

arm_teleop:
  update_rate_hz:          50.0   # 追従ループ周波数
  max_cartesian_step_m:    0.10   # 1サイクルの最大ステップ
  eef_step_m:              0.02   # Cartesian補間解像度
  min_cartesian_fraction:   0.2   # この値を下回るとOMPLにフォールバック
  replan_threshold_m:      0.03   # 目標がこの距離動いたら再計画
  preempt_threshold_m:     0.30   # 実行中の軌道をキャンセルする距離
  arrival_threshold_m:     0.03   # EEがこの距離以内なら計画をスキップ
  velocity_scaling:        0.90
  acceleration_scaling:    0.80
  publish_mode: topic             # 軌道ストリーミング(テレオペに最適)

Servoのチューニング — config/{robot_name}/arm_backend_servo.yaml

Servoスタック全ノードで1ファイル;共有の/**:セクションがチューニングを持ちます. 移植時に確認すべきロボット依存の項目:

moveit_servo:
  scale: {linear: 1.5, rotational: 3.0}  # EE速度上限 [m/s, rad/s]
  publish_joint_velocities: false  # アームのJTCが終端速度非ゼロの軌道を
                                   # 拒否する場合はfalseのまま
  lower_singularity_threshold: 50.0
  hard_stop_singularity_threshold: 200.0  # 無効化しないこと(関節ワインドアップ)
  joint_limit_margins: [0.02]

servo_bridge:
  pose_rate_hz: 100.0
  max_reach: 1.10   # 各アームの肩を中心としたリーチクランプ球の半径 [m]
                    # — 対象ロボットの肩→EEチェーン長の約90〜95%に設定

bridgeは目標をmax_reach球にクランプするため,届かない位置の手をアームが追いかけて 完全伸展の特異点に陥ることを防ぎます.アームごとのフレームやトピックはアーム名から 規約で導出されます(arm_rightright_target_linkhand_right_end_effector_linkarm_right_shoulder_tilt_linkなど). ロボットの命名が異なる場合はservo_bridge.{arm_name}.*のキーで上書きしてください.

Servoバックエンドにはros-$ROS_DISTRO-moveit-servoinstall.shでインストール)と, /{robot_name}名前空間で動作中のmove_groupが必要です — launcherが起動時に ロボットモデルをそこから取得します.

グリッパ操作(Quest,両バックエンド共通)

入力 動作
グリップボタン(arm_enable_axis 押している間アームを追従
ポーズボタン(hand_pose_button hand_pose_open/hand_pose_closeをトグル
トリガ + スティック左右 アダプティブ開閉
トリガ + スティック上下 把持タイプ関節(single_joint_name)を回転

(上に戻る)


新しいロボットへの移植

  1. config/{robot_name}/を作成し,robot.yaml(コントローラトピック)と使用する デバイスごとの{device}.yamlを用意する.
  2. Questでアームテレオペを行う場合,quest.yamlにアームごとのブロック(arm:target_frame_name:end_effector_frame_name:、グリッパのマッピング)を追加する — これが両バックエンド共通のアーム構成の単一定義源になります.
  3. 既存ロボットのarm_backend_plan.yaml/arm_backend_servo.yamlをコピーし, チューニングを調整する(max_reachをアーム長に合わせる;速度上限;しきい値).
  4. robot_name:={robot_name}で起動する — それ以外の変更は不要です.

前提条件:アームがjoint_trajectory_controllerのトピックインタフェースで駆動される こと(robot.yaml参照),アームごとに1つのplanning groupを持ち,SRDFの最後のリンクが エンドエフェクタであるMoveIt configがあること,/{robot_name}名前空間でmove_group が動作していること.

(上に戻る)


アームスケールキャリブレーション(Meta Quest)

quest.yamlscaleパラメータは人間のアームリーチとロボットのアームリーチを対応付けます.arm_scale_calibratorツールを使うと、適切なscale値を自動的に計算できます.

実行タイミング

オペレータごとに一度実行する(ロボットURDFのアームリーチが変わった場合も再実行).結果をconfig/{robot_name}/quest.yamlright.scaleleft.scaleに設定する.

設定ファイル

config/{robot_name}/arm_scale_calibrator.yaml

robot_arm_reach_m: 1.2926      # 肩からEEまでのフルキネマティックチェーン(URDFより)

right_frame:  "right_controller_odom"
left_frame:   "left_controller_odom"
parent_frame: "base_footprint"

grip_axis: 7                   # Joyメッセージにおける右グリップの軸インデックス

片腕ロボットの場合、使用しない側のフレームを""に設定する:

right_frame: "right_controller_odom"
left_frame:  ""   # 無効化 — 右アームのみ計測

起動方法

ros2 run sobits_teleop arm_scale_calibrator --ros-args \
  --params-file install/sobits_teleop/share/sobits_teleop/config/{robot_name}/arm_scale_calibrator.yaml \
  -p joy_topic:=/{robot_name}/joy

Note

{robot_name}は使用するロボット名に置き換える(例:sobit_home).

手順

ステップ1 — 開始位置の設定

  1. 両コントローラーを持ち、自然な立ち姿勢をとる.
  2. 両腕をまっすぐ前方に伸ばす(ロボットの方向を向くように).
  3. 右グリップボタンを押して離し、開始位置を記録する.

ステップ2 — T字ポーズへのスウィープ

  1. 両腕をゆっくりと左右真横に開いていく(肘を伸ばしたまま).
  2. T字ポーズで完全に腕が伸びたら、右グリップボタンを押して離す.

Note

スウィープは2秒以上かける必要がある.短すぎる場合は警告が表示され、再度試みることができる.

結果の確認

=== RESULTS ===
  Human arm reach used   : 0.9150 m
  Robot arm reach        : 1.2926 m

  Recommended scale = 1.2926 / 0.9150 = 1.4126

Update config/sobit_home/quest.yaml:
    scale: 1.4126   # (both right and left)

表示されたscale値をquest.yamlに設定する:

right:
  scale: 1.4126
left:
  scale: 1.4126

(上に戻る)


シミュレーションモード

Gazeboシミュレーションと組み合わせて使用する場合はuse_sim_time:=trueを指定する:

ros2 launch sobits_teleop sobits_teleop.launch.py \
  robot_name:=sobit_home \
  device:=keyboard \
  use_sim_time:=true

(上に戻る)

マイルストーン

  • 疑似逆運動学の追加

現時点のバグや新規機能の依頼はIssueページをご覧ください.

(上に戻る)

About

No description, website, or topics provided.

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors