URDF/SRDFとロボットモデルの仕様

URDF

ロボットの関節、リンク、干渉形状、関節角度制限などを記述するROSのロボットモデル記述形式です。

詳しい仕様は、以下の外部ドキュメントを参照してください。

https://wiki.ros.org/urdf/XML

SRDF

MoveIt!がURDFに加えて利用するロボットモデルの記述形式です。 グループ、キネマティックチェーン、エンドエフェクタ名、干渉ペアの指定を行います。

詳しい仕様は、以下の外部ドキュメントを参照してください。

https://wiki.ros.org/srdf

SRDFファイルは、MoveIt Setup Assistantを使って生成できます。詳しくは以下の外部ドキュメントを参照してください。

http://docs.ros.org/melodic/api/moveit_tutorials/html/doc/setup_assistant/setup_assistant_tutorial.html

モデルローダー

URDFとSRDFファイルをロードするユーティリティクラスです。運動学プラグインのロードにも使われます。

class robot_model_loader::RobotModelLoader

パブリック関数

RobotModelLoader(const Options &opt = Options())

デフォルトのコンストラクタ。

const robot_model::RobotModelPtr &getModel() const

planning_models::RobotModelを取得します。

const std::string &getRobotDescription() const

ロボットモデルのパラメーター名を取得します。

const urdf::ModelInterfaceSharedPtr &getURDF() const

パース済みのURDFモデルを取得します。

const srdf::ModelSharedPtr &getSRDF() const

パース済みSRDFモデルを取得します。

const rdf_loader::RDFLoaderPtr &getRDFLoader() const

モデルの読み込みに使用されたrdf_loader::RDFLoaderのインスタンスを取得します。

const kinematics_plugin_loader::KinematicsPluginLoaderPtr &getKinematicsPluginLoader() const

運動学ソルバーのプラグインローダーを取得します。

注意

このプラグインローダーは変数スコープ内に維持する必要があります。そうしないと、運動学ソルバーがアンロードされる可能性があります。

void loadKinematicsSolvers(const kinematics_plugin_loader::KinematicsPluginLoaderPtr &kloader = kinematics_plugin_loader::KinematicsPluginLoaderPtr())

運動学ソルバーを運動学モデルにロードします。これは、コンストラクターに渡されるオプションによって明示的に無効にされない限り、デフォルトで行われます。

struct Options

RobotModelLoaderコンストラクターに渡されるオプション。

公開メンバー

std::string robot_description_

URDFがロードされるROSパラメーターに対応する文字列名。パラメータ名に「_planning」サフィックスを使用して、追加の構成を指定できます(追加のジョイント制限など)。パラメータサーバからのロードは、文字列からのロードが失敗した場合にのみ試行されます。

std::string urdf_string_

URDFおよびSRDFドキュメントの文字列コンテンツ。文字列からのロードは、XMLからのロードが失敗した場合にのみ試行されます。

bool load_kinematics_solvers_

指定されたROSパラメーターを使用して、キネマティクスソルバーもロードする必要があるかどうかを示すフラグ。

ロボットモデル

class moveit::core::RobotModel

ロボット運動学モデルの定義。このクラスはスレッドセーフではありませんが、複数のインスタンスを作成できます。

関節モデルへのアクセス

const JointModel *getRootJoint() const

ルート関節を取得します。モデルが空でない限り、1つのルート関節が存在します。これはSRDFから抽出されるか、タイプ指定されていない場合は固定関節が想定されます。

const std::string &getRootJointName() const

ルート関節の名前を返します。ルート関節がない場合、例外をスローします。

bool hasJointModel(const std::string &name) const

関節が存在するかどうかを確認します。存在する場合はtrueを返します。

const JointModel *getJointModel(const std::string &joint) const

名前を指定して関節を取得します。関節が存在しない場合は、エラーが出力され、NULLが返されます。

const JointModel *getJointModel(int index) const

インデックス指定で関節を取得します。関節が存在しない場合は、エラーが出力され、NULLが返されます。

JointModel *getJointModel(const std::string &joint)

名前を指定して関節を取得します。関節が存在しない場合は、エラーが出力され、NULLが返されます。

const std::vector<const JointModel *> &getJointModels() const

RobotStateに格納されている順序で、関節のリストを取得します。

const std::vector<JointModel *> &getJointModels()

RobotStateに格納されている順序で、関節のリストを取得します。JointModelGroup::getJointModels()とは対照的に、すべてのタイプの関節(mimicおよび固定を含む)が含まれます。

const std::vector<std::string> &getJointModelNames() const

RobotStateに格納されている順序で、関節名のリストを取得します。

const std::vector<const JointModel *> &getActiveJointModels() const

このモデルのアクティブな(固定やmimicではない)関節のリストを取得します。

const std::vector<JointModel *> &getActiveJointModels()

このモデルのアクティブな(固定やmimicではない)関節のリストを取得します。

const std::vector<const JointModel *> &getSingleDOFJointModels() const

すべての単一自由度関節(mimic関節を含む)のリストを取得します

const std::vector<const JointModel *> &getMultiDOFJointModels() const

すべてのmulti-dof関節のリストを取得します。

const std::vector<const JointModel *> &getContinuousJointModels() const

無限回転する関節のリストを、RobotStateに格納されている順序で取得します。

const std::vector<const JointModel *> &getMimicJointModels() const

mimic関節のリストを、RobotStateに格納されている順序で取得します。

リンクモデルへのアクセス

const LinkModel *getRootLink() const

ロボットの物理的なルートリンクを取得します。

const std::string &getRootLinkName() const

ロボットのルートリンクの名前を取得します。

bool hasLinkModel(const std::string &name) const

リンクが存在するかどうかを確認します。存在する場合はtrueを返します。

const LinkModel *getLinkModel(const std::string &link) const

名前指定でリンクを取得します。リンクが見つからない場合は、エラーが出力され、NULLを返します。

const LinkModel *getLinkModel(int index) const

インデックス指定でリンクを取得します。リンクが見つからない場合は、エラーが出力され、NULLを返します。

LinkModel *getLinkModel(const std::string &link)

名前指定でリンクを取得します。リンクが見つからない場合は、エラーが出力され、NULLを返します。

const std::vector<const LinkModel *> &getLinkModels() const

リンクの配列を取得します。

const std::vector<LinkModel *> &getLinkModels()

リンクの配列を取得します。

const std::vector<std::string> &getLinkModelNames() const

(すべてのリンクの)リンク名を取得する

const std::vector<const LinkModel *> &getLinkModelsWithCollisionGeometry() const

干渉形状が関連付けられているリンクを取得します。

const std::vector<std::string> &getLinkModelNamesWithCollisionGeometry() const

干渉形状が関連付けられているリンクの名前を取得します。

const LinkModel *getRigidlyConnectedParentLinkModel(const LinkModel *link)

固定関節を介してのみ接続されているキネマティックツリーのもっとも根元にあるリンクを取得します。

updateStateWithLinkAt()を使用してリンクを特定のポーズに向ける必要がある場合に便利に使えます。 updateStateWithLinkAt()は、指定されたリンクとその子孫のみの向きを変えるため、リンクが抽象フレーム名の場合、目的を達成できない可能性があります。次の例を考えてみてください: root -> arm0 -> ... -> armN -> wrist grasp_frame palm -> エンドエフェクタ... ここで、updateStateWithLinkAt(grasp_frame)を呼び出しても、エンドエフェクタの向きは変わりません。代わりに、updateStateWithLinkAt(getRigidlyConnectedParentLinkModel(grasp_frame),...)とすると実際に手首(およびそのすべての子孫)の向きが変わります。

グループへのアクセス

bool hasJointModelGroup(const std::string &group) const

JointModelGroupグループが存在するかどうかを確認します。

const JointModelGroup *getJointModelGroup(const std::string &name) const

名前指定でグループを取得します。

JointModelGroup *getJointModelGroup(const std::string &name)

名前指定でグループを取得します。

const std::vector<const JointModelGroup *> &getJointModelGroups() const

定義されたグループのリストを取得します。

const std::vector<JointModelGroup *> &getJointModelGroups()

定義されたグループのリストを取得します。

const std::vector<std::string> &getJointModelGroupNames() const

このモデルに定義されているすべてのグループの名前を取得します。

bool hasEndEffector(const std::string &eef) const

エンドエフェクタが存在するかどうかを確認します。

const JointModelGroup *getEndEffector(const std::string &name) const

特定のエンドエフェクタ名に対応するグループを取得します。

JointModelGroup *getEndEffector(const std::string &name)

特定のエンドエフェクタ名に対応するグループを取得します。

const std::vector<const JointModelGroup *> &getEndEffectors() const

エンドエフェクタ名とそれらが対応するグループ間のマップを取得します。

パブリック関数

RobotModel(const urdf::ModelInterfaceSharedPtr &urdf_model, const srdf::ModelConstSharedPtr &srdf_model)

パース済みのロボットモデルとグループのリストから運動学モデルを構築します。

~RobotModel()

デストラクタ。すべてのメモリをクリアします。

const std::string &getName() const

モデル名を取得します。

const std::string &getModelFrame() const

このモデルの基準座標を取得します(RobotStateを使用する場合)。この基準座標はルート関節に依存します。そのため、基準座標はSRDFから抽出されるか、ルート関節の名前であると想定されます。

bool isEmpty() const

モデルが空の場合、trueを返します(ルートリンクも関節もありません)

const urdf::ModelInterfaceSharedPtr &getURDF() const

パース済みのURDFモデルを取得します。

const srdf::ModelConstSharedPtr &getSRDF() const

パース済みSRDFモデルを取得します。

void printModelInfo(std::ostream &out) const

モデルに関する情報を出力します。

void getVariableRandomPositions(random_numbers::RandomNumberGenerator &rng, double *values) const

RobotStateのランダム値を計算します。

void getVariableDefaultPositions(double *values) const

RobotStateのデフォルト値を計算します。

void getVariableRandomPositions(random_numbers::RandomNumberGenerator &rng, std::vector<double> &values) const

RobotStateのランダム値を計算します。

void getVariableDefaultPositions(std::vector<double> &values) const

RobotStateのデフォルト値を計算します。

void getVariableRandomPositions(random_numbers::RandomNumberGenerator &rng, std::map<std::string, double> &values) const

RobotStateのランダム値を計算します。

void getVariableDefaultPositions(std::map<std::string, double> &values) const

RobotStateのデフォルト値を計算します。

std::size_t getVariableCount() const

このモデルを記述する変数の数を取得します。

const std::vector<std::string> &getVariableNames() const

この状態を記述する関節の変数名を取得します。固定関節には自由度がないため、ここには含まれませんが、mimic関節は含まれます。返される要素の数は常にgetVariableCount()と等しくなります

const VariableBounds &getVariableBounds(const std::string &variable) const

指定された変数の境界値を取得します。変数が見つからない場合、例外をスローします。

const JointBoundsVector &getActiveJointModelsBounds() const

すべてのアクティブな関節の境界値を取得します。

int getVariableIndex(const std::string &variable) const

ロボット状態の変数名のインデックス値を取得します。

const JointModel *getCommonRoot(const JointModel *a, const JointModel *b) const

引数として渡された2つの関節の共通の親であり、キネマティックツリーで最も深い関節を取得します。

void setKinematicsAllocators(const std::map<std::string, SolverAllocatorFn> &allocators)

運動学ソルバーとグループ名を関連付けたマップを登録する。