Skip to content

Instantly share code, notes, and snippets.

@KobayashiRui
Last active June 1, 2018 08:04
Show Gist options
  • Save KobayashiRui/3e6fa9af415cc39b9ede1684b4cfbc0a to your computer and use it in GitHub Desktop.
Save KobayashiRui/3e6fa9af415cc39b9ede1684b4cfbc0a to your computer and use it in GitHub Desktop.
matlabのrobotics_system_toolboxに対する使用方法をまとめていく

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

多関節ロボットに関するワークフローをサポート
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 );

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に接続できる
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment