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

2010年7月30日 (金)

URGライブラリをC#で使えるようにする(2)

引き続き、URGライブラリをC#で使えるようにするための作業を進めています。先日の日記で、URGライブラリをDLL化できたところまで報告しました。

DLL化したURGライブラリの関数をC#から呼び出せるようにするためのコードを書き始めましたが、これがなかなか難しい。というのは、プラットフォーム呼び出しを行うには、マネージドコードとアンマネージドコード、マーシャリング等について十分理解しておく必要があるからです。

例えばURGライブラリを使用するときに一番最初に呼び出すべき、初期化関数を考えます。初期化関数の書式は、 void urg_initialize(urg_t* urg) です。この引数にあるurg_t は構造体なので、C#で扱うためにはC#のソースコード中でこれを再度定義してやる必要があります。この urg_t はメンバとしてさらに別の構造体をもっているので、その構造体も定義する。手間がかかりますね。それだけならいいのですが、引数がポインタ型なので、これをC#でどうやって扱ったらいいか困りました。

とりあえずこんな感じかなぁということで、下記のように書いてみました。

[DllImport("UrgLibDll.dll")]
public extern static void _urg_initialize(ref urg_t urg);

そして、テストプログラムでは次のように呼び出してみました。

UrgLib4CS.UrgLib4CS.urg_t   urg = new UrgLib4CS.UrgLib4CS.urg_t();            UrgLib4CS.UrgLib4CS._urg_initialize(ref urg);

ビルドは通ったのですが、実行してみると"SafeArrayTypeMismatchException" という例外が発生してしましました。予想としては、C++の構造体メンバで char だったものを、C#でもそのまま char にしたことによるのではないかと思います。C++のcharは、C#では byte型に置き換えなきゃいけないみたいですね。

続きはまた明日。

2010年7月28日 (水)

URGライブラリをDLL化する

先日の日記の続きです。

URGライブラリをDLL化するラッパー用のソースコードとdefファイルを作成しました。ちゃんとしたテストはしていませんが、一応動いているっぽいので公開します。

対象となるURGライブラリのバージョンは、urg-0.8.11 です。URGライブラリの本体は、北陽電気のサイトから入手してください。DLLの作り方はネット上で検索すれば沢山出てくるのでここでは説明しません。

ついでに、テスト用のソースコードもUpしておきます。

C言語でURGライブラリをDLL呼び出しができるようになったので、続いてC#でDLL呼び出しできることを確認する予定です。

A gift from ITO EN / 伊藤園からの贈り物

ITO EN is a Japanse beverage company, which is famous for its green tea. I found a gift sent by ITO EN to me today, and I wandered what it was. After opening the box, I realized that I have some stocks of ITO EN. This gift was for their stockholders. Thanks, ITO EN.

今日、伊藤園からゆうパックが届きました。なんだろな?と思ってあけて見たところ、株主優待のドリンクギフトセットでした。そういえば、伊藤園の株持ってたっけ。完全にほったらかしだったので忘れていました。配当金がもらえるのもいいですが、こういうギフトもいいですね。

Itoen_gift

2010年7月24日 (土)

つくばチャレンジ2010説明会

行ってきました。説明会。参加申し込み時は「試走あり」で申し込んだのですが、肝心なロボットのほうが全然準備できていなくて、コース見学&説明会になりました。コースの写真はこちらにUpしてあります

2010年度のコースについては、そのうちNTFのホームページにコースの見取り図が出ると思います。今年度から追加された「一旦停止」ですが、スタート地点からゴール地点までの間に5か所あます。自転車が通る場所に出たり、横切ったりする地点に一旦停止のラインを配置したようです。一旦停止のラインでロボットが停止した後は、オペレータの操作により走行を再開させることになっています。ということで、非常停止スイッチだけでなく、走行開始スイッチもロボットの外から見える所に設ける必要がありそうです。

あんまり暑かったので、ゴール地点であるつくばサイエンスインフォメーションセンターのロビーに居座って、冷たいものを飲みつつクーラーで涼んでしましましたhappy02

以下、説明会で出たQ&Aです。

Q1: 一旦停止場所ではロボットが自動的に停止し、オペレータの操作により走行を再開するとのこと。では、つくばサイエンスインフォメーションセンター入口の自動ドア前でロボットが一時停止した場合、ドアが開いた後はオペレータの指示で走行を再開するのか?

A1: 一旦停止場所と自動ドアは別で考えていただきたい。

Q2: ゴール地点の直前で往路のコースが交差する。その場合、どちらのロボットを優先するのか?

A2: ルール上どちらを優先するか決めないことにしたい。というのは、ロボットが自らの判断で待つか行くかしてほしいため。ただし、本当にぶつかりそうなときはオペレータがロボットを止めることになるだろう。ロボット同士のルールはいくらでも作れるが、そうして作られたルールはあくまでつくばチャレンジ内のローカルルールに過ぎない。つくばチャレンジではそのようなルールを世の中に先行して作るつもりはない。

Q3: 中央公園の車止めに関して。コースを歩きながら説明していただいた際には、1か所目はあけておき、2か所目は閉じておくとのことだったがそれで正しいか?

A3: 正しい。2か所目の車止めは、事前にやってみたところ容易には開かなかったので閉じたままにしようということになった。しかし、今日は連絡が徹底できず、走行実験の途中で2か所目の車止めが開いた状態なった。今後、車止めを開けるように変更する場合は事前に連絡する。

URGライブラリをC#で使えるようにする

URGライブラリというのは、北陽電気のレーザーレンジスキャナを簡単に扱うためのCおよびC++用のライブラリです。あくまでC/C++用で、スタティックリンク用のライブラリなので、C#からは呼び出せません。でも使いたい。DLLなら、C#から呼び出せるらしい。

ということで、簡単なラッパーを作ってDLLにでっち上げることにしました。DLLそのものは以前仕事で作ったことがあったのですが、でもちょっと困りました。私が仕事でDLLを作った時は Visual Studio 6.0を使っていたのですが、今手元にある開発環境はVisual Studio 2005で、かなり設定の仕方が変わってしまっています。インターネット上で DLL関連の検索をかけると古い情報から新しい情報まで一緒に出てくるので、どの情報が私の開発環境に合った情報なのか見分けるのに一苦労です。

一番困ったことは、.defファイルをプロジェクトに組み込んであるのに .libファイルが生成されないことです。最終的には、Visual Studio のヘルプを漁って見つけました。MSDNライブラリなら、このページに書いてあることです。リンカオプションで、「モジュール定義ファイル」を指定してあげないと .def ファイルがリンカに渡らないのですね。

とりあえずurg_initialize関数をラッピングした_urg_initialize関数(先頭にアンダーバーをつけただけ)を、Cで書いたDLLテストプログラムで呼び出しできることまで確認できました。

C#からDLLの関数を呼び出すには、DllImport を使うようです。ま、なんとかなるでしょ。

2010年7月22日 (木)

戦略変更を考えたほうがいいかもしれない

ここのところしばらく Visual C++ 2005 で boost::thread を動かそうと格闘してきましたが、うまくいかないので諦めたほうがよいと思うようになってきました。しょうがないから .NET FrameworkのSystem::Threading::Thread を使おうと思って試してみましたが、こちらもまたひと悶着。

.NET のThread はマネージドクラスしか相手にしてくれないようです。普通のC++のつもりで作ったクラスをマネージドクラスにするには、class 宣言の頭に __gc をつけて、コンパイルオプションで「共通言語ランタイムサポート、古い構文(/clr:oldSyntax)」をつけてやる必要があります。で、やって見たんですがうまくビルドされません。おそらく、ヘッダファイルの多重インクルードを避けるために前方参照宣言だけを集めたヘッダファイル(fwd_declaration.h)を作ったので、これがインクルードされている cpp ファイルは全部「古い構文」を選ばなきゃいけない。でもそれをやると、共通言語ランタイムサポートを使用したくないやつら(Apache log4cxx、boost)などがビルドできなくなる。厄介ですね。

かみやんさんから「CのライブラリをPInvokeで、C#からコールするっていう手もありますよ」とのアドバイスをいただいたので、ここらで戦略転換して昨年度開発したC#ベースに戻ったほうがいいのではないかと思い始めました。ここ何カ月か分は無駄になりますが、使える時間も減ってきたので去年の開発済み資産を使いまわしたほうが早いという理由もあります。boostライブラリは「使ってみたかった」というだけの話なので、C++で作る戦略は捨ててしまったほうが先に進めそうです。

2010年7月19日 (月)

boost::threadをあきらめようか

先ほど書いた日記の続きです。

ここにあるとおりに future.hpp を直してみたのですが、それでプロジェクトをビルドするとこんなエラーが出るようになりました。

エラー 5 error LNK2022: メタデータの操作に失敗しました (8013119F) : 対応する TypeDef を含んでいなければならないところ、含んでいない TypeRef が存在します: (dummy): (0x01000019)。 Device.obj

おそらく、ヘッダファイルを変更したのにboostライブラリのビルド済みライブラリファイルが昔のままなので、「同じ名前でも定義が矛盾している」と、リンカに怒られたのだと思います。それならライブラリもビルドしなおせばいいと思ったのですが、boostライブラリ自体のビルド方法がわかりません。さて困った。

余談ですが、boostは基本的にはヘッダファイルのみでできているみたいですね。それでも、ヘッダファイルだけでは収まりきらない11のライブラリは bjamというツールを使ってビルドするみたいです。

ということで、bjamの使い方をググって見ました。ありますね。まだ諦めるには早そうです。

boost::thread でコンパイルエラー C2666

Joystick(ゲーム用のコントローラの総称)をC++から扱うのがこんなに面倒だとは知りませんでした。去年C#でJoystickを扱ったときは、本当にすぐに動いたのに。

さらに話をややこしくしているのが、boostライブラリの thread です。Joystickの接続監視と状態監視をするために thread を使ってやろうと思ったのですが、次のようなコンパイルエラーが出てしまいました。

警告 1 warning C4267: '初期化中' : 'size_t' から 'unsigned int' に変換しました。データが失われているかもしれません。 D:\Program Files\boost\boost_1_42\boost\thread\future.hpp 411
エラー 2 error C2666: 'boost::scoped_array<T>::operator []' : 2 のオーバーロード関数があいまいです。(新しい機能 ; ヘルプを参照) D:\Program Files\boost\boost_1_42\boost\thread\future.hpp 414
エラー 3 error C2666: 'boost::scoped_array<T>::operator []' : 2 のオーバーロード関数があいまいです。(新しい機能 ; ヘルプを参照) D:\Program Files\boost\boost_1_42\boost\thread\future.hpp 427
エラー 4 error C2228: '.unlock' の左側はクラス、構造体、共用体でなければなりません D:\Program Files\boost\boost_1_42\boost\thread\future.hpp 427

(以下省略)

googleってみると、おそらくこのエラーと同じものだと思います。Visual Studio 8.0というのは、Visual Studio 2005のことですね。ちなみに私の開発環境は以下の通り。

  • OSはWindows Vista Business + Serivce Pack 2
  • 統合開発環境は Visual Studio 2005 Standard Edition + Service Pack 1
  • C/C++コンパイラは Visual C++ 2005
  • Boostライブラリのバージョンは 1.42
  • その他、DirectXライブラリ、Apache log4cxxライブラリも使用

上記リンク先の掲示板(実際はメーリングリスト)では質問者自身が「こうやったらコンパイルエラーを止められたけど、それって安全なの?」とさらなる質問をしていますね。もうちょっとそのソースコードを読んでみて、安全なようならfuture.hppに修正を入れてしまおうと思います。

だめなら、ちょっと汚くなるけど.NET の Thread を使おうかな。

2010年7月11日 (日)

知らなければ損をする仕組み(生命保険)

生命保険の話です。いわゆる、「得をしそびれる」といういみではなくて、「ぼったくられていることに気づかない」というい意味の「損をする」話です。

以前、コンビニの立ち読みで週刊ダイアモンドで生命保険の特集を目にしました。その時、国内大手生保の主力商品であるアカウント型の保険が最悪だと書いてありました。私が社会人になってからすぐに入った生命保険(住友生命のライブワン)がズバリそれだったので、これを機会に保険を見直そうかなぁと思っていました。

そんな話を富士山に登った時に保険屋さんをやっている友人に話したところ、後日、生命保険の仕組みについてレクチャーしてもらえました。なるほど、積立利率変動型終身保険(いわゆるアカウント型)というのは、終身保険と書いてあるけど本当は「保険料払込満了時にアカウント部分を終身保険に切り替えられますよ保険」だったのですね。

しかし、支払っている保険料を見てみると、このアカウント部分(=主契約)がたったの500円しかありません。後は特約部分で11,000円以上積んであるわけです。毎月500円を30年積み立てたとしても、500×12×30 = 180000で18万円です。18万円くらいなら保険にする必要ない金額です。死亡時に支払われる金額は積み立てた分に過ぎないので、主契約部分はあっても意味が無い

特約部分は掛け捨てですが、果たす役割から考えればこちらが保険の本体といってもいいでしょう。むしろ、保険の本質が「万が一の際の互助」であることを考えれば掛け捨てでよいと思います。それにしても、いろんな特約が付いています。それぞれ単品で見たときに掛け金が妥当なのかどうかよくわかりません。最初から掛け捨てでよいなら、会社の労組で勧めているこくみん共済でいいんじゃないかと。パンフレットを見る限りでは、今入っている保険の補償内容と比較して見劣りしない内容で、掛け金が半分以下です。

そもそも私は保険に貯蓄性を求めていないので、生保に年金機能を期待する気もありません。

インターネット上で生命保険の基礎について調べると、どこもかしこも「売り手」が発信した情報ばかりなので売り手に都合の悪いことは書いてありませんね。友人によると、「内側の人間が都合の悪いことを書くと、他社批判でコンプライアンス違反になってしまう」とのこと。生命保険の仕組みについてもうちょっと勉強してから、どうするか決めたいと考えています。

2010年7月10日 (土)

日本メンタルヘルス協会って・・・

先日友人から「これを聞いてみろ!」というCDをもらいました。衛藤さんという方の講演だそうです。で、ちょっとだけ聞いてみた感想です。

出だしで感じたのは、「宗教臭さ」です。友人には申し訳ないのですが。司会進行役が衛藤氏を「年間公演数が200回」とか「海外で資格を取得された」とかやたらと誉めちぎって紹介しているのがこの「臭さ」の原因かもしれません。衛藤氏本人は、医療行為としてのカウンセリングではない、と言っているので案外冷静で、周りの人間が「衛藤先生を崇拝しちゃってる」感じで宗教臭さが出ているのかもしれません。もしくは、自己啓発セミナー系の匂いなのかもしれません。

私は知らなかったのですが、日本には心理学関連の国家資格がまだないのですね

この手の話が胡散臭く感じてしまう原因は、議論をしていないところなのではないかと思います。ちなみに、導入部以外はそれほど宗教臭さを感じませんでした。

2010年7月 2日 (金)

近況。

雑多な近況報告です。

まずは液晶TV。社内販売で買いました。kakaku.comの最安値より安く。わけあり品ですが。届くのは再来週なので、まだブラウン管のTV使ってます。画面が大きく高精細になったら、サラウンドシステムも欲しくなるでしょう。

続いて山登り。今年は富士山に最低3回は登ることになりそうです。1回のぼりゃ十分だろうとは思いますが、遠足みたいなものだと思って登ります。1回目は次の日曜日です。

つくばチャレンジ。準備が全然進んでいません。完璧主義が悪いのだと思います。PC上で動作するナビゲーションプログラムをC++で最初から書き直しているのですが、それがまだほとんど骨組みもできていないレベルです。これじゃあ、7/24の試走会でデータ収集するのに間に合わないかも。いや、間に合うにはどうするか考えて工夫しましょう。

つくばチャレンジ関連でもう一つ。7/24の2010年度要綱説明会兼、試走会に参加するのに提出する書類がいくつかあります。締め切りは7/5。なのですが、安全管理責任者をどうするか、まだ決めていません。これを決めて届け出ておかないとロボットを走らせることができません。昨年まではかみやんさんにお願いしていたのですが、今年度は参加されないということなのでほかの人にお願いする必要があります。候補としては、事務局に相談するか、他チームの方にお願いするか、くらいです。今週末はRTさんにお邪魔する予定なので、そこでちょっと相談してみようと思ってます。

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

最近の写真