お世話になります。
ロボットの制御の勉強の一環でchoreonoidを使用させて頂いております。
ロボットの回転関節にトルクを指令値とし、位置制御を行っています。その際、ロボットに加わる摩擦等の外力が回転関節の運動にどのような影響を及ぼしているか調査しようと考えております。そこで、ロボットに加わる摩擦等の外力がタイムステップごとに、どのような方向にどれくらいの力が加わっているか知りたいのですが、確認する方法があれば教えていただきたいです。
現状ではAISTSimulatorItemとSimpleControllerを使用する場合に、接触点ごとにかかる力を取得することができます。
AISTSimulatorItemを用いてプロジェクトを構成し、SimpleControllerのinitialize関数において、接触点を取得したいリンクに対して、
io->enableInput(link, LinkContactState);
としておきます。
するとシミュレーション実行中に、control関数において、io->body()から取得できる対象リンクの、contactPoints関数を用いて、接触点の情報を取得できます。contactPoints関数はLinkクラスにおいて以下のように定義されています。
const std::vector<ContactPoint>& contactPoints() const;
ここでContactPoint型は同じLinkクラス内で以下のように定義されているクラスです。
class ContactPoint
{
public:
ContactPoint(const Vector3& position, const Vector3& normal, const Vector3& force, const Vector3& velocity, double depth)
const Vector3& position() const;
//! The contact normal vector. The direction is from another object to this link.
const Vector3& normal() const;
//! The contact force vector. The direction is from another object to this link.
const Vector3& force() const;
//! The relative velocity of the contact point on this link based on the other link.
const Vector3& velocity() const;
double depth();
};
ここから接触点の位置や向き(法線)、力、接触速度、接触深さの情報を取得することができます。