重要:ODEのAPI変更に伴い,dInitODE()で初期化し,終了するときは dCloseODE()で後処理をしなければエラーになります.これに対応したODE本のサンプルプ ログラムはナビゲーションバーのダウンロードカテゴリから入手できます.
「簡単!実践!ロボットシミュレーション」 出村公成著, 森北出版, ISBN978-4-627-84691-3 (以下,ODE本)の正誤表をPDFにしました.本当にすみませんが,ODE本の奥付をご覧になり対応する正誤表をダウンロードの上,修正をお願いします.また,誤りを見つけた方は正誤表に反映しますのでコメントを投稿してください.よろしくお願いします.第1刷が発行されてすぐ重版が決まったので第2刷ではバグがほとんど修正されませんでした.第3刷では講義で利用したり,読者の皆さんからフィードバックにより多くのバグを修正することができました.今後ともバグを見つけしだい正誤表を更新していきますのでよろしくお願いします.第2刷までの大きな誤りは「ねぶらさん」からご指摘頂いたP130のホロノミックとノンホロノミックの説明が逆になっている箇所です.ごめんなさい.お詫びして訂正します.
なお,誤りではありませんが,本中のサンプルプログラムは完全なソースコードではなく,主要な部分しか掲載していませんので,そのままではコンパイルできません.本サポートサイトから完全なソースコードをダウンロードしてコンパイル・実行してください.
版刷 | 発行日 | 正誤表 |
第1版第1刷 | 2007年5月18日 | 第1刷正誤表 |
第1版第2刷 | 2007年6月6日 | 第2刷正誤表 |
第1版第3刷 | 2008年2月10日 | 第3刷正誤表 |
(最終更新日 2008-08-29)
コメント
おいふぉりーさん,
はじめまして.どうもありがとうございます.
昨日,ODE本やODE講座のサンプルコードのうち衝突検出を含むもの(つまり,ほとんど全部)はODE0.10ではコンパイルできないことに気がつきました.dInitODE()はODE0.8(2007-1-22)から導入されていましたが,ODE本には発刊時期の関係で入れることができませんでした.ODE0.9まではこれを呼び出さなくてもサンプルコードをコンパイルすることができました.
しかし,ODE0.10からスレッドのサポートなどによりdInitODE2()が導入され,dInitODE()やdInitODE2(0)を呼び出さないとエラーになります.なお,dInitODEのソースコードは次のようになっていて,dInitODE2(0); dAllocateODEDataForThread(dAllocateMaskAll);を呼び出していますね.ODE付属のデモプログラムでは, main関数でdInitODE2(0)を呼び出し,start関数でdAllocateODEDataForThread(dAllocateMaskAll)を呼び出しています.
void dInitODE()
{
int bInitResult = dInitODE2(0);
dIASSERT(bInitResult);
dVARIABLEUSED(bInitResult);
int ibAllocResult = dAllocateODEDataForThread(dAllocateMaskAll);
dIASSERT(ibAllocResult);
dVARIABLEUSED(ibAllocResult);
}
また,ビルドのシステムも少し変わったのでサンプルコードに付属していたmakefileではコンパイルできません.現在,ODE0.10に付属していたpremakeを使ってサンプルコードをコンパイルさせようと作業しています.
でむ
はじめまして おいふぉりーといいます。
ODE 本の第1版第3刷を購入させていただきまして、早速サンプルのプログラムをコンパイルして実行していたのですが、プログラム 1.2 で、ボールが落ちて衝突検出が行われる瞬間に、次のような実行時エラーが発生いたしました。(他のソースでも同様な問題が発生すると思われます)
ODE INTERNAL ERROR 2
colliders array not initialized (…\ode-0.10.0\ode\src\collision_kernel.cpp:256)
このエラーは 32行目の dCollide() 呼び出し時に発生しているようです。
main() 関数のトップに次のコードを追加した所、エラーが発生しなくなりました。
dInitODE(); // ヘッダのコメントによると奨励されない
または
dInitODE2(0);
dAllocateODEDataForThread(dAllocateMaskAll);
私の環境ですが
コンパイラ Visual C++ 2005 Express Edition
ODE 0.10.0
です。
既にご存知だったかもしれませんが、念のため報告させていただきました。
けんつさん,
ご連絡ありがとうございます.第3刷になりバグがほとんどなくなったと思いましたがありますね.ODEは進化が速く,ODE本を執筆した2年前と比較して新しい機能が増えています.その点についてはこのブログで説明していきたいと考えています.
今後ともよろしくお願いします.
でむ
いつも、ODE本にお世話になっております.
毎日の様に活用させて貰っているせいか,
すでに本も擦り切れてきました.
お気づきでしたら申し訳ありませんが,
第一版 P87
dJointGetUniversalAngleRate1 → dJointGetUniversalAngle1Rate
dJointGetUniversalAngleRate2 → dJointGetUniversalAngle2Rate
という間違えに気づきましたので,報告させて頂きます.
AJさん,
ご指摘のとおりです.お詫びして訂正します.
でむ
p.24:プログラム1.3の49行目
「…z0+ball.r-0.5*leg.l…」
とありますが、
「…z0-ball.r-0.5*leg.l…」
と符号が間違っていると思います。
Webで配布しているプログラムは、ちゃんとマイナスになっていました。
確認お願いします。
チップさん
ご指摘ありがとうございます。
大変助かります。
でむ
p66の10行目
void dMasSet・・・ → void dMassSet・・・でしょうか?細かいですが・・・
ぽったーさん
おひさしぶりです.お元気ですか?
さて,ぽったーさんのご指摘のとおりです.訂正しました.
ODE本並びにdemura.netを丁寧に見ていただきありがとうございます.今後もよろしくお願いします.
おひさしぶりです,でむさん.
この正誤表の下から6番目の
P208 下から8行目
の訂正は,
P209 下から8行目
でしょうか?
ひびきのさん、
ご指摘ありがとうございます。そのとおりです。
なお、ODE0.9はまだリリースされていません。rc1 (release candidate 1)の段階です。
でむ さん
ODE 0.9 出ました。
それと、ODE本のp79(7行目)dGeomTriMeshDataCreate()が
dGeomTriMeshDateCreate()になってますよ。
あと、p219の式(9.7)の括弧が1個多いような気がします。
ジミーさん、
ご指摘ありがとうございます。
>1. p.167 line 8 from the bottom “リンク0、リンク1、リンク2、リンク3、リンク4。。。”
>There are four links but リンク4 does not exist because we >started counting from zero.
はい。リンク0から数えているのでリンク4は必要ありません。
> 2. p.178 line 8. Shouldn’t “式(6.48)…” be 式6.92?
はい。式(6.92)です。
>3. p.182 line 8. “Pcontrol関数”だと思います。
はい。
> 4. p.185 line 3 from the bottom. dy/dth1 = l2C1S2 “PLUS” l3C1S23
はい。 -でなく+です。
> 5. p.186 Sec 7.4 the line below Eqn 7.7. Shouldn’t it be J(theta dot) = p dot ?
はい。
>6. p.205. There is no need to worry about l0 because it is (0,0,0). Right?
はい。
>7. p.208 Step 4 of the walking algorithm. Please explain why the COM needs
>to move forward by 1/4 of the step length? Where did you get the 1/4?
このアルゴリズムでは重心(COM)を4歩で歩幅分移動しているからです。
>8. p.209 End of first paragraph. Shouldn’t it be z0 – z1?
はい。z0, z1は股関節からの長さなのでz0の方がz1より大きいです。
>9. p.209 2nd paragraph. According to Fig 8.5 on p.203, positive y points to
>the left of the robot. Shouldn’t it be “上体を右へ -y1 だけ。”? Similar problem
>with Table 8.6
いいえ。脚先の通過点は胴体重心を原点とした相対座標系で考えます。胴体を右へy1移動することは、脚先をy軸の正方向へy1移動することと同じです。
>10. p.216 Why the weight of けんせいちゃん was reduced by half?
開発中のヒューマノイドの仕様に合わせた結果です。なお、Kozoh4というヒューマノイドもこれとほぼ同じ仕様となっています。
>11. p.217 Figure 9.5 I think “S hat 5” and “S hat 6” should be reversed.
>Also, “S hat 4” should points in the same direction as “S hat 6”.
いいえ。S3hat, S4hat, S5hatはピッチ軸で同じ方向を向いており、S2hatとS6hatはロール軸となっています。このとり方は、運動学、逆運動学の計算を簡単にするためです。
>12. p.221 Please double check Equation 9.18
φ= atan2(P5x, sqrt((P5z)^2 + (P5y)^2))) に変更お願いします。
でむらさん、
ODE本に関して誤りであるように思える箇所があったので報告いたします.
1. p.167 line 8 from the bottom “リンク0、リンク1、リンク2、リンク3、リンク4。。。”
There are four links but リンク4 does not exist because we started counting from zero.
2. p.178 line 8. Shouldn’t “式(6.48)…” be 式6.92?
3. p.182 line 8. “Pcontrol関数”だと思います。
4. p.185 line 3 from the bottom. dy/dth1 = l2C1S2 “PLUS” l3C1S23
なお、 dy/dth2 = l2S1C2 + …
5. p.186 Sec 7.4 the line below Eqn 7.7. Shouldn’t it be J(theta dot) = p dot ?
6. p.205. There is no need to worry about l0 because it is (0,0,0). Right?
7. p.208 Step 4 of the walking algorithm. Please explain why the COM needs
to move forward by 1/4 of the step length? Where did you get the 1/4?
8. p.209 End of first paragraph. Shouldn’t it be z0 – z1?
9. p.209 2nd paragraph. According to Fig 8.5 on p.203, positive y points to
the left of the robot. Shouldn’t it be “上体を右へ -y1 だけ。”? Similar problem
with Table 8.6
10. p.216 Why the weight of けんせいちゃん was reduced by half?
11. p.217 Figure 9.5 I think “S hat 5” and “S hat 6” should be reversed.
Also, “S hat 4” should points in the same direction as “S hat 6”.
12. p.221 Please double check Equation 9.18
ひびきのさん
もしかして,むさしさんですか?
さて,これには全く気づいていませんでした.
ご指摘ありがとうございます.
p.61の一番上「ERP」が「EPR」になってますよ。
ねぶらさん,
出張中でODE本を持っていかなかったので返事が遅くなりました.
ご指摘のとおりです.お詫びして訂正致します.
どうもありがとうござました.
また,気がついた点があればご指摘ください.
ODE本に関して誤りであるように思える箇所があったので報告いたします.
P. 130: ページ下方のホロノミックとノンホロノミックの説明が逆だと思います.
P. 227: プログラム 9.1,31行目
endP[2] = k1 * (fz[i] + pos[2]);
は,
endP[2] = k1 * fz[i] + pos[2];
とすべきだと思います.また,これは web で配布しているコードについても同様です.
ご確認をお願いいたします.