« 2010年8月 | トップページ | 2010年10月 »

2010年9月30日 (木)

計画を立て直す

先日の試走会(公開走行実験)に開発が間に合わなかった反省を踏まえて、本番までの計画を見直しました。

計画を見直してみると、このままでは完走を目指すのは無理だと気付きました。なので、当初予定していたいくつかの機能を思い切って捨てることにしました。また、SI2010の予行原稿の入稿期限が 10/8(金)なので(※)、この原稿作成もスケジュールに入れました。

※ 入稿期限が 10/15(金)に延長されたことをメールで知りました。

機能を削ってスケジュールを引き直してみましたが、プロジェクトバッファが3日しかありません。これはコケるプロジェクト計画の典型みたいなスケジュールですね。しかし、これ以上は機能を削れないので、やり方を工夫してなんとか間に合うようにしたいと思います。

2010年9月28日 (火)

DLLを読み込めないという問題(解決)

連日 blog に書いてきた問題が解決しました。

要点をまとめると次のようになります。(Visual Studio 2005を使用している場合です)

  1. 原因を究明するためには、エラーメッセージを丹念に追え。
  2. カレントディレクトリにDLLを配置したのにDllNotFoundExceptionが発生する場合は、そのDLLが動くために必要な他のDLLが不足している可能性がある。
  3. 必要なDLLを分析するには Dependency Walker を使えばよい。
    • Dependency Walkerは開発したプログラムが動作するターゲット環境で使用すること。これ大切。(開発用のPC上で動かしても意味がない。)
  4. Dependency Walkerで分析した結果、不足するDLLにMSVCR80D.DLLが含まれている場合、そのDLLはDebugモードでビルドされたもの。Releaseモードでビルドしなおそう。
    • MSVCR80D.DLLは再配布禁止なので、ネット上で探してもダウンロードできないはず。
    • MSVCR80.DLLが不足している場合は、再配布可能パッケージをインストールすればよい。
  5. DLL開発時はDLLをテストするためだけの単体プログラムを別途用意しておくこと。
  6. DebugモードでビルドしたDLLなら単体テストがOKなのに、Releaseモードでビルドすると単体テストがNGになる場合、コンパイラオプションやリンカオプションがReleaseモードでも正しく設定されているか確認する。
    • とくに、リンカオプションでモジュール定義ファイルが設定されているか確認すること。

プログラムの動きとしてはまだ不満なところがありますが、DLLが読み込めないという問題に関してはこれで解決できました。

DLLを読み込めないという問題(3)

さらに続きです。ちょっとだけ進展がありました。

まず、UrgLibDll.dllがReleaseモードでなぜうまく動かなかったのか解明できました。それは、Releaseモードのリンカの入力設定で、モジュール定義ファイルが空欄になっていたことが原因でした。Debugモードではちゃんとモジュール定義ファイルを指定していたのにReleaseモードでは指定していなかった。だから、ReleaseモードでビルドしてできたDLLは、公開すべき関数をExportできていなかった、というわけです。

上記の修正で作りなおしたUrgLibDll.dllを制御用PC上にもっていき、Dependency Walkerで依存関係を洗ってみたところ、また別の問題を見つけました。それは、制御用PCにVisual C++ 2005再配布可能パッケージをインストールしたはずなのに、MSVCR80.DLLが見つからないという問題です。今思えば、インストールが始まる感じはあったのに完了したという通知がないままダイアログボックスが消えてしまっていたので、インストールがうまくいっていなかったようです。そこで、こんどは再配布可能パッケージ(SP1)をインストールしてみました。はい、今度はインストールが終わった後にPCの再起動を求めてきました。おそらくインストールできたのだと思います。

制御用PCを再起動したのち、Depedency WalkerでUrgLibDll.dllの依存関係を解析しなおしてみたところ、不足しているDLLからMSVCR80.DLLが消えました。

これで解決できていることを願って、新しいUrgLibDll.dllを制御プログラムのディレクトリに入れてからプログラムを起動してみたところ、今まで出ていた例外がでなくなりました。そこから先は未確認ですが、とりあえず一歩前進です。(EFSADU.DLL、IESHIMS.DLL、WER.DLLは無くても動きそうですね。)

2010年9月27日 (月)

DLLを読み込めないという問題(2)

昨日の続きです。そもそも何がおかしいのか、丹念にエラーメッセージを追うことにしました。

制御用PCでプログラムが吐きだした例外のメッセージは次のようなものでした。

System.DllNotFoundException: DLL 'UrgLibDll.dll' を読み込めません: このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。アプリケーションを再度インストールすることにより問題が解決する場合があります。 (HRESULT からの例外: 0x800736B1)
   場所 UrgLib4CS.UrgLib._urg_initialize(urg_t& urg)
   場所 AIModule.Device.LaserRangeScanner..ctor()
   場所 AIModuleApp.Form1.Form1_Shown(Object sender, EventArgs e) 

(以下省略。)

プログラムのカレントディレクトリにUrgLibDll.dllを配置しているのにそのDLLを読み込めない、というのが問題点なわけです。ここでの議論から、必要なDLLが足りないとDllNotFoundExceptionが発生するということなので、昨日は「開発用PC上で」Depenency WalkerでDLLの依存関係を調べて、IESHIMS.DLLが足りないという結論に達しました。

しかし、ここに落とし穴を発見。開発用PC上でDLLの不足を探しても意味ねーじゃん? そう気づいたので、制御用PC上でDependency Walkerを実行してみました。ちなみに、ここから手に入ります

その結果、次のDLLが見つからないことがわかりました。

ここで注目すべきは、MSVCR80D.DLLです。”D”が入っていますね。これはUrgLibDll.dllがDebugモードでビルドされたことを示しています。Relseaseモードでビルドしたらうまく動かなかったのは昨日の日記に書いたとおりです。デバッグ用のMSVCR80D.DLLを必要としているのであれば、VC++ 2005の再配布可能パッケージをインストールしても動かないのは納得できます。

ちなみに、EFSADU.DLLはNTFSのファイル暗号化に関するDLLのようです。IESHIMS.DLLとWER.DLLは、インターネットで検索するとその二つのファイルが見つからないという書き込みが山ほどでてきます。

上記を踏まえて試してみるべきこと。

  1. UrgLibDll.dllをReleaseモードでちゃんと動くようにする。(Releaseモードで動けば、依存関係がMSVCR80D.DLLからMSVCR80.DLLになるはず。)
  2. 制御用PCにVisual Studio 2005を入れる。

後者のほうが手っ取り早いかな。

2010年9月26日 (日)

DLLを読み込めないという問題

今日はつくばチャレンジの試走会(走行実験)の日でした。参加する予定だったのですが、前日までにプログラムの不具合が解決できず、参加を見送りました。

その不具合というのは、開発用のPCでビルドしたプログラムを制御用のPC上で動かそうとすると、次のような例外が発生してしまうというものです。

”DLL 'UrgLibDLL.dll' を読み込めません。:このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。アプリケーションを再度インストールすることにより、問題が解決することがあります。

私はVisual Studio 2005でC#を使っています。指摘されたUrgLibDLL.dll はURGライブラリをC#から使えるようにVisual C++でDLL化したもので、これに何か問題があるようです。DebugモードでビルドしてもReleaseモードでビルドしても状況が変わらないので、おそらく、PCが違うせいでUrgLibDLL.dll が動作するために必要なDLLが欠落しているのではないかと予想しました。

ちなみに、開発用のPCはOSがWindows Vista Business (SP2)でブラウザにIE8を使っており、Visual Studio 2005が入っています。一方、制御用のPCはWindows XP HomeでブラウザはIE6、開発環境は入っていません。

DLLの依存関係を洗うためにはDependency Walkerを使うらしいので、Visual Studio 2005に入っているDepends.exe を起動して、UrgLibDLL.dll の依存関係を解析してみました。しかしここでもまた問題が発生。Dependency Walker は、ディレクトリ名に日本語が入っていると解析してくれないようです。これに気付くのにかなり時間がかかってしまいました。USBメモリに入れた後のDLLなら解析してくれたので、これはディレクトリ名に日本語があるとダメなツールなのではないなと気付きました。

Dependency Walker で解析してみた結果、IESHIMS.DLL が「指定されたファイルが見つかりません」となっていました。このファイルは、ブラウザ(IE8)から導入されたDLLで、セキュリティ上問題のあるDLLのようです

上記を踏まえて、解決策について考えてみました。

  1. UrgLibDll.dll自体はブラウザに依存する機能を使っていないので、DllNotFoundExceptionをプログラム中で無視してしまう。
  2. それでもだめなら、制御用PCにIE8を入れてみる。
  3. それでもだめなら、どうしよう??

1から順に試して、その結果をまたこのblogで報告します。

------

え~、上記の1,2をやってみましたが全然解決策になっていませんでした。どうも、犯人はIESHIMS.DLLではなくて、MSVCR80.DLLではないかという気がしてきました。というのも、UrgLibDLL.dll がMSVCR80.DLLを使用しているにもかかわらず、制御用PCの C:\WINDOWS\system32 ディレクトリには MSVCR80.DLL が見つからなかったからです。

それなら解決策はこうなるでしょうか。

  1. MSVCR80.DLLを制御用PCにインストールする。(再配布可能パッケージを使う)
  2. そもそもMSVCR80.DLLに依存しないようにする

どちらかというと後者のほうが簡単なので、Visual Studioのプロジェクトの設定を変更してUrgLibDLL.dllを作りなおしてみました。Dependency Walker で解析してみたところ、依存関係からMSVCR80.DLLが無くなっています。しかし、これは失敗でした。UrgLibDLLのテストプログラムが実行に失敗してしまいます。いや、それ以前に ReleaseモードでビルドしたUrgLibDLL.dll 自体がUrgLibDLLのテストプログラムで実行できないことがわかりました。

Release モードでビルドしたUrgLibDLL.dllが正しく動くよういろいろやってみましたが、解決の糸口が見つかりません。それなら先に前者の解決策を試してしまったほうが早そうです。そう思って、Microsoft Visual C++ 2005 再頒布可能パッケージ (x86)をインストールしてみたのですが、結果は一緒でした。

困ったな。

2010年9月18日 (土)

振ってみまSHOW@題名の無い音楽会

久しぶりに長電話をしました。大学時代の友人から電話があって。声を聞いただけで誰が電話をしてきたのかわかるというのはいいですね。

その長電話の中で出てきた話です。「題名の無い音楽会」のとあるコーナーに動画を投稿したとのこと。

こんなコーナーがあるんですね。度胸があるなぁ。

2010年9月17日 (金)

第2学期の教科書が届いた

放送大学の第2学期の教科書が届きました。

Img_4079

今期私が受講する科目は、

  • 統計学
  • 入門線形代数
  • 財政学

の3科目です。第1学期に2科目受講してみて、2科目なら1週間で講義1回分ずつ予習、受講ができることを確認したので、今期は3科目に増やしてみました。

統計学は、仕事でも使うといえば使うけど、どちらかというとすでにロボット開発でカルマンフィルタ等の統計的フィルタを使っているので、既に知っていて当たり前のだったはずの知識を後から「どろなわ式」で学ぼうという魂胆。線形代数も、それに近いですね。どちらも大学時代に学んだはずなのに、当時は必要性がわからず、全く身につきませんでした。

一方、財政学は、「日本はこんなに国債を発行していてなんで破綻しないのだろう?」という疑問から勉強してみようと思いました。もしかするとこの疑問は、財政だけでなく金融、経済も合わせて勉強しないと理解できないかもしれないし、そもそも正しい答えが無いのかもしれない。けれど、何が妥当で何が妥当でないのか、どういう仕組みでそれが動いているのか、ニュースで報じられる情報を自分なりに解釈し、判断できるだけの見識が身につくことを期待しています。

2010年9月15日 (水)

再始動

しばらく仕事が忙しかったためロボット開発が中断していましたが、仕事のほうが大体片付いたのでそろそろロボット開発を再開します。

1ヶ月くらい時間が空いてしまうと、自分が何をやっていたか、どこまでできていたか、どんな問題があったか、すっかり忘れてます。まずは走行時のセンサデータをロギングして、ログファイルから自己位置推定に必要なカルマンフィルタのチューニングをするつもりだったことを思い出しました。今年は地磁気センサに秋月電子で買ってきたTDS01Vを使おうとしていたことも思い出しました

さっそく開発環境を立ち上げてソースコードを打ち始めようと思ったら、肝心なTDS01Vのデータシートが見つかりません。ああいうものは絶対に捨てないのでどこかにあるはずなのですが、見つからない。困ったな、諦めて去年まで使っていた地磁気センサを使おうかな、それとももう1個TDS01Vを買ってデータシートを入手しようかな、と思っていたら。見つかりました。

見つけたデータシートをさっそく見てみました。PC-評価ボード間のボーレートが 9600bpsだそうです。結構遅いのですね。地磁気センサの方位精度が±10 [deg]  と書かれていますが、X,Y,Zの3軸分の磁束密度を±120 [μT] の範囲で測れるようなので、アプリ側で計算してやればもうちょっとマシになるんじゃないかと思います。

第3回の試走会(走行実験)が9/25に迫っているので、今週末の連休で一気に遅れを取り戻せるよう頑張ります。

2010年9月 9日 (木)

SI2010講演申込しました

SI2010というのは、第11回 計測自動制御学会 システムインテグレーション部門講演会のことです。つくばチャレンジでは参加者のアイデアや経験を広く共有するために、SI部門の講演会でオーガナイズドセッションを設けて、参加者に学会発表することを推奨しています。

今年は東北大学なので、遠いからパス、ネタが無いからパス、と思っていたのですが、(参加者みんなに同じメールを送っているのだと思いますが)油田先生からメールをいただいてしまったので参加することにしました。ああでも、ネタが無い。ないけど無理やり考えて先ほど登録しました。去年も登録時に書いた概要と発表した中身がだいぶ違ったので、今年もそうなるんじゃないかと思います。

SI2010は12/23~25の3日間です。「お前クリスマスは暇だろ?」って言われた気がして参加登録しなかったような気もするのですが、せっかく東北大まで行くので、発表が終わったら山形蔵王温泉スキー場まで行って、スキーを楽しんでこようと思います。

2010年9月 3日 (金)

大切なことは先に片付けよう

久しぶりの日記です。お盆休み明けに急ぎの仕事が入ったせいで急に忙しくなり、ここ3週間くらいロボット開発が完全にストップしています。今週末は土日出勤になりそうです。

今週末の9/4 土曜日は第2回の公開走行実験(試走会)なのに、仕事の予定。出席します、と申しこんであったので、いけません、と、つくばチャレンジ事務局に連絡をしておかなきゃいけないのに、まだメール書いていません。同時に、試走会で安全管理責任者をやって下さる方にも連絡していません。まずいですね。こういうのは。

大切なことは、特に、他人との約束に関することは予定が変わった時点で早めに連絡を入れましょう。と自分に言ってみました。

« 2010年8月 | トップページ | 2010年10月 »

最近の写真