KobayashiRui
5/12/2018 - 5:16 PM

matlab_robotics_system_toolbox

matlabのrobotics_system_toolboxに対する使用方法をまとめていく

ROSをmatlab・Simulinkにて使用する

matlab操作

  • rosinit : ROSマスターとグローバルノードを初期化する

simulink操作

Robotics System Toolbox(RST)/ROS内にて

Publisher関連

  • Blank Message : メッセージを作成する
  • Message type : Selectからメッセージの型を選択できる
  • サンプル時間 : 設定時間の周期でMessageを更新する=>Publishする(infにすると更新時のみ配信)
  • Bus Assignment
    : 基本的に上記のBlank Messageとならべて使用する BusにつなげたBlankMessageに値を入れるもの
  • バス内信号を割り当てられる信号に選択し、それ以外を削除するのが基本の流れ
  • Publish : Publisherの作成
  • Topic source
    • Select from ROS network : すでに存在するtopicに配信する
    • Specify your own : 新しいTopicを作成する
  • Topic : Topicの名前を指定する (ex /data_hogehoge )
  • Message type 配信するメッセージの型を選択 =>ここがつながっているBlank Messageと違う型だとエラーになるので注意

Subscriber関連

  • Subscribe : Subscriberの作成
  • Topic source : 使用方法としてはPublishと同じで自分で新しいものを作るかどうか
  • Topic : 購読するTopicの指定(ex /data_hogehoge)
  • Message type : 購読するTopicのメッセージの型を指定
  • Sample time : -1でシュミレータ内と同じ周期で更新の確認
  • Terminator : 出力信号で接続されていないものに関する警告を防ぐ
  • Enabled Subsystem
    : SubscribeのIsNewとEnableの部分を接続することでそのSubsystem内はIsNewがTrueの時のみ出力する : IsNewがTrueの時のみ動作させたい部分からサブシステムを作成し、Enableブロックをサブシステムに追加することでも作成可能
  • IsNew => 前のタイムステップ中に新しいメッセージを受信した場合にTrue
  • BusSelector : Bus Assignmentの逆版でメッセージ内のデータを取り出す

内部ネットワークと外部ネットワークのROSMaster

  • 内部ネットワーク(matlab内のローカルネットワーク)
    : 初期設定のままでOK rosinitをすれば準備完了
  • 外部ネットワーク(windows内のバーチャルPCなどローカルでないもの)
    : 外部でROS coreを起動している場合でそのROSを中心として使用したい時は下記の作業をする

外部のROS Masterに接続

  1. ROS coreを起動しているPCにて ROS_MASTER_URI を確認する
  2. http://IP:ポート/ となっている部分を確認するIPの部分が名前の場合はそのPCのIPアドレスをifconfigなどで調べる
  3. Simulinkにて [ツール] => [Robot Operating System] => [Configure ROS Network Addresses] の順で選択
  4. Network AddressCustom
  5. Hostname/IP Addressに 2で調べたIPアドレスを入れる
  6. Portに 2で調べたポート番号を入れる
  7. matlabにてrosshutdownをし起動中のglobal ROS node を閉じる
  8. matlabにてrosinitをし上記で設定したネットワークに接続する
    上記の内容で外部のROS Masterに接続できる

マニピュレータアルゴリズム

多関節ロボットに関するワークフローをサポート
urdfを使用して逆運動などを解くことができる

urdfのimport

robot = importrobot('URDFファイル名')

urdfファイルは拡張子まで全て入力する
char型なのでダブルクオーテーションで囲むとエラーをだす
上記のコードの場合,robotが今後RigidBodyTreeとして使用可能となる

逆運動学

大きく分けて二通りの方法がある

  • robotics.InverseKinematics : pose(位置と姿勢)を指定して角度を求める場合
  • robotics.GeneralizedInverseKinematics : 様々な指定をして角度を求めることができる
    上記のInverseKinematicsを使用するならmoveitで十分な気が...

GeneralizedInverseKinematicsの使用方法

各制約について

RigidBodyには逆運動計算において様々な条件(制約)を指定することが可能

  • AimingConstraint(aiming) : 照準制約
  • CartesianBounds(cartesian) : 直交座標の範囲
  • JointPositionBounds(joint) : ジョイント位置の範囲
  • OrientationTarget(orientation) : 方向ターゲット
  • PoseTarget
  • PositionTarget(position) : 位置ターゲット

制約オブジェクトの作成

軌道の作成方法

  • RigidBodyが生成する情報を行形式にする : 通常は各joint名と角度の構造体を返す => DataFormatをrowにすると角度データのみの配列となる
RigidBody.DataFormat = "row";
  • コンフィギュレーションの設定
  • homeConfiguration(RigidBodyTree) 指定したRigidBodyTreeのjointの初期角度を返す
  • repmat(行列, 数値1, 数値2) 行列をコピーして大きな行列を作成する行に対するコピー数(数値1),列に対するコピー数(数値2)
numWaypoints = 5;
q0 = homeConfiguration(RigidBodyTree);
qWaypoints = repmat(q0, numWaypoints,1 );