OpenHRP3


FrontPage

ヌーボー班PCに構築したUbuntu8.04における環境について

ユーザー名とパスワード

ユーザー名:ashi

パスワード:HPのHの部分をアルファベットで

OpenHRP3.0.3の場所

/home/ashi/OpenHRP/OpenHRP3.0.3

OpenHRP3.0.3の起動方法

ターミナルを立ち上げる

Shift+Tabで立ち上がる

GrxUIを立ち上げる

$ cd OpenHRP/OpenHRP3.0.3
$ ./GrxUI.sh

軌道生成用サンプルプログラム


場所

/home/ashi/OpenHRP/OpenHRP3.0.3/sample/makeMotionPattern/makeMotionPattern

実行

PDコントローラーサンプル

場所

コントローラー

/home/ashi/OpenHRP/OpenHRP3.0.3/Controller/rtc/KobakenSamplePD

角度パターンファイル、ゲインファイル

/home/ashi/OpenHRP/OpenHRP3.0.3/Controller/rtc/KobakenSamplePD/etc

使い方


バージョン管理ソフトSubversionの使い方

レポジトリの場所

/home/ashi/backup/SVN

詳しくはここ

Subversion

おおまかな使い方

最新の状態に戻す

$ svn update

既存のファイルに変更を加えた後コミットする

$ svn commit -m ""

新規にファイルを追加する

$ svn add [ファイル名] 
$ svn commit -m ""

チェックアウト

$ svn checkout file:///home/ashi/backup/SVN/OpenHRP [ディレクトリ名]

OpenHRP3 ver3.1betaについて


注意

ControllerBridge?が起動せず、 OpenRTM関連のサンプルが動かない

[OpenHRP3home]/bin にパスを通しておく

公式ウェブサイト

http://www.openrtp.jp/openhrp3/jp/index.html

掲示板

http://www.humanoidrobots.org/openhrp/users_forum/c-board.cgi

開発者用ウェブサイト

https://openrtp.jp/redmine/

公式サイトのサンプル


公式サイトのスケジューラ作成マニュアルのサンプルプログラム

公式サイトの記述そのものだといろいろ不備があるので、
実行可能な形にしてまとめた。
下に添付しておいた。

公式サイトのここがおかしい

3.1.0.betaのインストールページ

環境変数の設定

環境変数を設定します。Eclipseの起動スクリプトに記述しておくか、.bashrcの最後に追記しておきます。
export BIN_DIR=(CMAKE_INSTALL_PREFIXで指定したディレクトリ)/bin
export BIN_SFX=.sh
export PROJECT_DIR=(CMAKE_INSTALL_PREFIXで指定したディレクトリ)/share/OpenHRP-3.1/sample/project


最後の一行がおかしい。

export PROJECT_DIR=(CMAKE_INSTALL_PREFIXで指定したディレクトリ)/sample/project

とすべき

プログラミングマニュアル


スケジューラ作成法

templateの構文が間違っている

現状

template
X_ptr checkCorbaServer(std::string n, CosNaming::NamingContext_var &cxt)
{

修整

template<typename X, typename X_ptr>
X_ptr checkCorbaServer(std::string n, CosNaming::NamingContext_var &cxt)
{

モデル計算マニュアル

calcInverseKinematics?の仮引数が間違っている

現状

matrix33 R = identity<matrix33>();
// 逆運動学計算
path->calcInverseKinematics(p, mat)

修整

matrix33 R = identity<matrix33>();
// 逆運動学計算
path->calcInverseKinematics(p, R)

ユーザーズマニュアル


コントローラ作成ガイド

SamplePD.cpp内でのコンストラクタの実装部分で最後の中括弧"}"がひとつ足りない。

現状

SamplePD::SamplePD(RTC::Manager* manager)
: RTC::DataFlowComponentBase(manager),
// <rtc-template block="initializer">
m_angleIn("angle", m_angle),
m_torqueOut("torque", m_torque),   
// </rtc-template>
dummy(0),
qold(DOF)
{
...
// トルク, 関節角度ポートの長さをロボットの自由度分確保
m_torque.data.length(DOF);
m_angle.data.length(DOF);

修正

SamplePD::SamplePD(RTC::Manager* manager)
: RTC::DataFlowComponentBase(manager),
// <rtc-template block="initializer">
m_angleIn("angle", m_angle),
m_torqueOut("torque", m_torque),   
// </rtc-template>
dummy(0),
qold(DOF)
{
...
// トルク, 関節角度ポートの長さをロボットの自由度分確保
m_torque.data.length(DOF);
m_angle.data.length(DOF);
}

Ubuntu7.04では、コントローラーブリッジの起動スクリプト(SamplePD.sh)の--moduleの引数で.soを省略すると実行できない

現状

--module SamplePD 

修正

--module SamplePD.so 

実行環境:Ubuntu7.04,OpenRTM0.4.2 (Windowsの方は検証していない)

プログラマーズマニュアル

ロボットモデルデータの操作法を理解するため「はじめの一歩」となるサンプルプログラムです.~

Body型は[DynamicsSimulator?/server/Body.h DynamicsSimulator?/server/Body.h]に定義されています。
Body型へのポインタはスマートポインタのBodyPtr?型を使います。~

body->joint(i)は、Link型へのポインタです。

Link型は~[DynamicsSimulator?/server/Link.h ]に定義されています。~

モデルデータ読み込み・生成BodyPtr? body = loadBodyFromModelLoader?();
名前(Jointノード名)によるリンクの取得Link* link = body->link("LinkName?");
jointID(整数)による関節リンクの取得Link* link = body->joint(id); (id < body->numJoints() )
トップからの木探索順によるリンクアクセス(全リンクを含む)Link* link = body->link(i); (i < body->numLinks())
順運動学の計算body->calcForwardKinematics?();
順運動学の計算(位置+速度)body->calcForwardKinematics?(true);
順運動学の計算(位置+速度+加速度)body->calcForwardKinematics?(true,true);
全重量(モデル読み込み時に計算したもの)body->totalMass();
全重量計算し直しbody->calcTotalMass?();
重心位置の計算body->calcCM();
全並進運動量P・角運動量Lの計算body->calcTotalMomentum?(P, L);

== 逆運動学とヤコビアン ==

リンク経路の設定JointPathPtr? path = body->getJointPath?(fromLink, toLink);
逆運動学の計算path->calcInverseKinematics?(to_p, to_R);
逆運動学の計算(根本位置、姿勢も指定)path->calcInverseKinematics?(from_p, from_R, to_p, to_R);
ヤコビアンの計算 (Jはdmatrix)J = path->Jacobian();
ヤコビアンの計算(繰り返し行う場合)path->calcJacobian(J);
リンク経路の順運動学path->calcForwardKinematics?()
リンク経路上の関節数path->numJoints();
リンク経路上の関節path->joint(i); (i < path->numJoints() )

== 固定サイズの行列 ==

固定サイズの行列」用と「可変サイズの行列」用の2種類のライブラリを使い分けます.
固定サイズ行列のサンプルプログラム[sample/test/matrix_test.cpp]
サイズの変更はできないかわり計算が高速で、読みやすい書き方が可能。

型名意味
vector33次元ベクトルLink.p (位置ベクトル) Link.v (速度ベクトル)
matrix333x3行列Link.R,(姿勢行列) Link.I (慣性テンソル)
  • これらは[DynamicsSimulator?/server/tvmet3d.h tvmet3d.h]に定義されています。
関数意味
trans(R)転置行列
cross(a,b)外積
dot(a,b)内積
norm2(a)ノルム(要素の自乗和のルート)
normalize(a)正規化
rotFromRpy?(v)ロールピッチヨーから回転行列を得る
rpyFromRot?(R)回転行列からロールピッチヨーを得る
R = identity<matrix33>()単位行列をセットする
  • 行列計算ライブラリとしてtvmetが使われています。
    * [http://tvmet.sourceforge.net/index.html tvmetのドキュメント]

== 可変サイズの行列 ==

コンストラクタでサイズを決めることができます。
生成後もresize(row,column)によって自在にサイズを変えられます。
可変サイズ行列のサンプルプログラム [sample/test/dmatrix_test.cpp]

型名意味
dvector可変サイズのベクトル?
dmatrix可変サイズの行列?
  • 零行列(dzeromatrix), 零ベクトル(dzerovector)で初期化、代入
     * dmatrix66 m = dzeromatrix(6,6);
     * dmatrix m(row,col) = dzeromatrix(row,col);
     * dvector6 v = dzerovector(6);
     * dvector v(size) = dzerovector(size);
  • 単位行列(didentity)で初期化、代入
     * dmatrix66 id6 = didentity(6,6);
     * dmatrix id(row,col) = didentity(row,col);
  • これらは [DynamicsSimulator?/server/ublasCommonTypes?.h]に定義されています。

== 線形方程式の計算ルーチン ==

* dmatrix用の線形一次方程式の解と疑似逆行列の計算ルーチンです。使い方の例がサンプルにあります。[sample/test/dmatrix_test.cpp]
関数名意味
solveLinearEquation?(A, b, x)b = A*x を解く(汎用)
solveLinearEquationLU(A, b, x)b = A*x をLU分解で解く(Aは正方行列であること)
solveLinearEquationSVD(A, b, x)b = A*x を特異値分解で解く(Aが非正方行列でも可)
calcPseudoInverse?(A, pinvA)Aの疑似逆行列を求める(正方行列なら逆行列)
* これらの関数はここで定義されています。[DynamicsSimulator/server/MatrixSolvers.cpp MatrixSolvers.cpp]

== 行列演算における Alias について ==

alias とは、代入式において代入される変数がそのまま右辺でも使われており、その変数の値が計算中に干渉を起こしてしまうことをいいます。 干渉を起こすと結果がおかしくなってしまいます。 例として,xをベクトル,Aをマトリクスとして次のような計算を考えましょう.

x = A * x;

この場合,右辺と左辺のxが同じメモリ領域を使っているため,xの第2要素以降はめちゃくちゃな結果になってしまいます.この問題は以下のように書くことで解決できます.

alias(x) = A * x;

詳しくは以下を参照のこと。

tvmetはデフォルトで干渉することを想定していないので、パフォーマンスは高いのですが、干渉には十分注意する必要があります。 干渉している場合はテンポラリ変数を導入するか、代入される変数にalias()をつけます。

一方ublasはデフォルトで干渉することを想定しているため、通常問題は起こりません。 ただし干渉を起こしていない場合には速度的に損をすることになります。 この場合は代入される変数にnoalis()をつけると無駄なコピーを省くことができます。

== 無駄な計算に注意 ==

tvmet, ublas では expression template というテクニックを用いて、計算中に発生する無駄な一時変数を除去し、パフォーマンスをあげています。 ただしこのテクニックの特性によって、逆に無駄な計算が生じてしまうことがあります。 以下の説明を参照のこと。

== スマートポインタについて ==

OpenHRPで定義されているいくつかのクラスではそのスマートポインタの型が クラス名+Ptr という名前でtypedefされており、いくつかの関数ではこの型をパラメータや戻り値としています。

スマートポインタとは、簡単に言えば delete しなくてよいポインタです。 オブジェクトはそれを指すポインタがなくなる時に自動的にdeleteされます。 このようなポインタを実現するテンプレートクラスがboostライブラリに用意されています。 詳しくは ここ を読んでください。

OpenHRPでは、例えばBodyクラスでBodyPtr?、IKSolverクラスでIKSolverPtr?といったスマートポインタが定義されています。 これらはだいたいBody*, IKSolver* と同様に使え、delete を気にする必要がありません。 OpenHRPの関数がこれらの型を使っている場合は、基本的にユーザプログラムも同じ型を使うようにします。

なお、Link クラスに関しては LinkPtr? は定義しておらず、Link* を使うようにしています。 これは、

Linkオブジェクトは基本的に親リンクやBodyが所有するものであり、これら所有側がきちんとオブジェクトの寿命を管理してくれればよいから

モデル計算ではLinkオブジェクトを繰り返し扱うことになり、スマートポインタの微々たるオーバーヘッドもあえて取り除くことにした

という理由によります。 (ちなみに一般的にはスマートポインタのオーバーヘッドを気にする必要はありません。非常に微々たるものです。)

ただし、場合によってはユーザプログラムでダイナミックにLinkを追加・削除するようなことも有り得るかもしれません。 そのような場合は、ポインタの管理はユーザプログラムの責任ということになります。

意見はこちらまでどうぞ

  • わからんことはここに書け -- kanoh? 2009-04-21 (火) 18:32:51

最新の20件

2020-11-14
  • OpenHRP3
2009-06-06 2009-05-11 2009-03-25 2009-03-24 2009-02-27 2008-12-03 2008-11-03 2008-10-29 2008-08-17 2008-08-13

今日の6件

  • counter: 909
  • today: 1
  • yesterday: 0
  • online: 1