ユーザー名:ashi
パスワード:HPのHの部分をアルファベットで
/home/ashi/OpenHRP/OpenHRP3.0.3
ターミナルを立ち上げる
Shift+Tabで立ち上がるGrxUIを立ち上げる
$ cd OpenHRP/OpenHRP3.0.3 $ ./GrxUI.sh
/home/ashi/OpenHRP/OpenHRP3.0.3/sample/makeMotionPattern/makeMotionPattern
コントローラー
/home/ashi/OpenHRP/OpenHRP3.0.3/Controller/rtc/KobakenSamplePD角度パターンファイル、ゲインファイル
/home/ashi/OpenHRP/OpenHRP3.0.3/Controller/rtc/KobakenSamplePD/etc
/home/ashi/backup/SVN
最新の状態に戻す
$ svn update既存のファイルに変更を加えた後コミットする
$ svn commit -m ""新規にファイルを追加する
$ svn add [ファイル名] $ svn commit -m ""チェックアウト
$ svn checkout file:///home/ashi/backup/SVN/OpenHRP [ディレクトリ名]
ControllerBridge?が起動せず、 OpenRTM関連のサンプルが動かない
[OpenHRP3home]/bin にパスを通しておく
http://www.openrtp.jp/openhrp3/jp/index.html
http://www.humanoidrobots.org/openhrp/users_forum/c-board.cgi
公式サイトの記述そのものだといろいろ不備があるので、
実行可能な形にしてまとめた。
下に添付しておいた。
環境変数を設定します。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 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) {
現状
matrix33 R = identity<matrix33>(); // 逆運動学計算 path->calcInverseKinematics(p, mat)
修整
matrix33 R = identity<matrix33>(); // 逆運動学計算 path->calcInverseKinematics(p, R)
現状
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); }
現状
--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]
サイズの変更はできないかわり計算が高速で、読みやすい書き方が可能。
型名 | 意味 | 例 | ||||
vector3 | 3次元ベクトル | Link.p (位置ベクトル) Link.v (速度ベクトル) | ||||
matrix33 | 3x3行列 | Link.R,(姿勢行列) Link.I (慣性テンソル) |
関数 | 意味 | |||
trans(R) | 転置行列 | |||
cross(a,b) | 外積 | |||
dot(a,b) | 内積 | |||
norm2(a) | ノルム(要素の自乗和のルート) | |||
normalize(a) | 正規化 | |||
rotFromRpy?(v) | ロールピッチヨーから回転行列を得る | |||
rpyFromRot?(R) | 回転行列からロールピッチヨーを得る | |||
R = identity<matrix33>() | 単位行列をセットする |
* [http://tvmet.sourceforge.net/index.html tvmetのドキュメント]
== 可変サイズの行列 ==
コンストラクタでサイズを決めることができます。
生成後もresize(row,column)によって自在にサイズを変えられます。
可変サイズ行列のサンプルプログラム [sample/test/dmatrix_test.cpp]
型名 | 意味 | 例 | ||||
dvector | 可変サイズのベクトル | ? | ||||
dmatrix | 可変サイズの行列 | ? |
* dmatrix66 m = dzeromatrix(6,6); * dmatrix m(row,col) = dzeromatrix(row,col); * dvector6 v = dzerovector(6); * dvector v(size) = dzerovector(size);
* dmatrix66 id6 = didentity(6,6); * dmatrix id(row,col) = didentity(row,col);
== 線形方程式の計算ルーチン ==
* 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を追加・削除するようなことも有り得るかもしれません。 そのような場合は、ポインタの管理はユーザプログラムの責任ということになります。