1 of 13

ros_control

自分のロボットをROSで操作しよう!

Ron Tajima

2 of 13

ros_controlとは?

  • もともとpr2_mechanism
  • HWの操作と制御部分の分離
  • 制御部分は共通化

  • ROSの機能とつなげやすい
    • /joint_states (関節情報)
    • MoveIt!
    • Gazeboとの接続
    • rqtで制御部分の開始、停止

3 of 13

かなり情報が少ないが…

4 of 13

全体像(ざっくりと)

  • 自分のロボットに合わせて書く部分
  • ROSノードです
  • ハードウェアの操作(I/O)
    • 指令のwrite
    • 応答のread
  • たいがい書かなくていい部分
  • プラグイン(ノードではない)
  • PIDなどの制御則
  • actionlibを使ったコントローラも
  • オリジナルの制御則等書くときはここに
  • ros_controller_manager
  • 使うだけの部分

5 of 13

ハードウェアの操作部分は?

  • ハードウェアの操作ノード(ドライバ)を書く
    • hardware_interface::RobotHWを継承
    • hardware_interface::JointState, JointHandle, PositionJoint, VelocityJoint, etc.
    • コンストラクタ内でそれぞれの資源(関節とかモータ)を登録
    • 資源に名前をつけて登録する(joint_0, joint_1とか)
    • read/write関数でそれぞれのハードウェアと値を結びつける
  • 作ったノード(ドライバ)を起動する
    • joint_0, joint_1はこのドライバが扱う
    • コントローラに接続されなければ指令値は変化しない
  • ros_controllersの中のコントローラを起動
    • ROSパラメータでコントローラの名前やパラメータを割り当て(yaml)
    • 関節(joint_0, joint_1)に対してそれぞれコントローラを割り当て
    • 関節に対する資源管理
      • 関節のドライバがなければ起動を待つ
      • 関節に対するコントローラがダブったらエラーが出る

6 of 13

ハードウェアのインターフェース(主なもの)

  • Joint Command Interfaces
    • Effort Joint Interface
      • 力(トルク)指令を受け取るハードウェア
      • トルクFFが入るモータドライバとか?
    • Velocity Joint Interface
      • 速度指令を受け取るハードウェア
      • 車輪とか
    • Position Joint Interface
      • 角度(変位)指令を受け取るハードウェア
      • RCサーボモータや位置制御モータドライバ
  • Joint State Interfaces
    • 関節の変位や速度の実際の状態(応答)を取得するインタフェース
    • ハードウェアからposition, effort, velocity の値を設定するだけ

7 of 13

ハードウェアのインターフェース(その他)

  • Transmission
    • Actuator - 減速器 - Joint のような構成の場合に使用
    • 今は単にした指令値・センサ値を減速比でスケール変換(?)
    • Actuator Command Interfaces
      • Effort Actuator Interface
      • Velocity Actuator Interface
      • Position Actuator Interface
    • Actuator State Interfaces
  • Joint Limits
    • 関節角、速度、加速度などの制限値を設定する場合に使用
  • その他センサ
    • Force-torque sensor Interface
    • IMU sensor Interface

8 of 13

ros_controllers - PIDによる制御則

  • joint_state_controller
    • joint_state_controller - 関節の状態を/joint_statesにpublishする
  • controllerの方式はinterfaceの方式に対応
  • effort_controllers - effort joint interface用
    • joint_effort_controller
    • joint_velocity_controller ←入力 Effort / 出力 Velocity
    • joint_position_controller ←入力 Effort / 出力 position
  • velocity_controllers - velocity joint interface用
    • joint_velocity_controller
    • joint_position_controller ←入力 Velocity / 出力 position
  • position_controllers - position joint interface用
    • joint_position_controller

9 of 13

ros_controllers - 軌道追従制御、台車制御

  • joint_trajectory_controller
    • 関節の時系列軌道の指令値に追従するためのコントローラ
    • actionlibを使用 (control_msgs/FollowJointTrajectory)
  • gripper_action_controller
    • 1自由度グリッパを開閉するためのコントローラ
    • effortを見ながらギュッとつかめたかを判定するなど
    • actionlibを使用(control_msgs/GripperCommand)
  • diff_drive_controller
    • 差動2輪台車の速度制御用のコントローラ
    • オドメトリとか自動で出してくれるらしい

10 of 13

controller_manager

  • controllerの読み込み、起動、停止、終了を管理
  • rqt_controller_manager

11 of 13

例:KONDOサーボ

  • 近藤科学のロボット用サーボモータ
    • 形状:標準タイプ、キューブタイプ
    • ギヤ比:高トルクタイプ、速度タイプ
    • 電圧:7.4Vタイプ、12Vタイプ
  • ICS(Interactive Communication System)
    • 半二重のシリアルバス
  • ROSにDynamixelのパッケージはあるがKONDOサーボのパッケージは無い
    • libkondo4 - Cのライブラリはある(かなりBuggy)

Dual USB アダプターHS

KRS4034HV

12 of 13

kondo_driver

https://github.com/longjie/kondo_driver

13 of 13

おわりに

  • まとめ
    • ros_controlのインターフェースを使おう
    • あとで楽ができるかも
    • 最新情報はコードを見た方がいい (wikiも更新しよう)
    • kondo_driver使ってね (dynamixelに負けるな!)

  • 今後の興味
    • 制御則、追従則を自分で書いていきたい
    • リアルタイム性はどうやって確保するのかね?
    • もっと複雑なロボットだと破綻しそう