« 2010年7月 | トップページ | 2010年9月 »

2010年8月19日 (木)

次は地磁気センサだ

DLL化したURGライブラリをC#から呼び出して、Top-URGで計測した距離データを取得できる目処がつきました。本当に必要最低限しかサポートしていませんが、とりあえず今はそれでよいことにして、次は地磁気センサからデータを取得する部分に着手しました。

地磁気センサについては、去年まではV2Xeを使っていました。これは2軸のセンサなのですが、前回のつくばチャレンジシンポジウム「3軸の地磁気センサを使えば、地磁気ベクトルの傾きから地磁気が乱れている場所を特定できる」という話を聞いてきたので、今年度は秋月で購入したTDS01Vを使うことにしました。このデバイスについては、すでにかみやんさんがC#用のプログラムを書いて公開して下さっているので、ありがたく使わせてもらおうと思っています。

仕事が期間限定でプチ忙しくなってしまったので、今週と来週はあまりロボット開発に費やす時間を確保できないかもしれません。

2010年8月17日 (火)

配列のマーシャリング

お盆休み中、実家に帰っている間に本年度の開発構想書をUpdateしていました。しかし、PPTファイルを開きっぱなしで作業をしていてちゃんとセーブしておかなかったため、またもや悲劇が起こりました。私が知らない間にノートPCが勝手にWindows Updateを実行してPCを再起動しており、計画を練り直した分を失って、モチベーションが下がりまくりでした。

第2回の走行実験も残り20日を切ったので、とりあえず9/4までの計画を惹きなおして開発再開です。そして、今日はやっと、このあたりや、このあたりで書いていた、DLL化したURGライブラリをC#から呼び出すことに成功して、URGで計測した距離データを取得できるようになりました。といっても、未解決な問題点はまだまだありますが・・・。

今日一番悩んだ部分は、Cの関数で引数に配列がある場合、C#で配列をどのようにマーシャリングするかです。具体的には、DLL用のプロトタイプ宣言が次のような関数があります。

int  APIENTRY _urg_receiveData (urg_t *urg, long data[], int data_max);

これをC#から呼び出すためにはどうしたらよいか。答えはこうでした。

[DllImport("UrgLibDll.dll")]
public static extern unsafe int _urg_receiveData(ref urg_t urg, [In] int[] data, int data_max);

そして、使い方はこう。

n = UrgLib._urg_receiveData(ref urg, data, data_max);

わかってしまえばなんてことはないのですが、MSDNのこの説明が理解できなくてずっと悩んでました。

2010年8月13日 (金)

2学期の受講科目登録申請

8/5から第2学期の受講科目登録が始まりました。登録申請はシステムWAKABAでできます。受講したい科目が沢山あるのですが、いろいろと制約条件があって科目選択は難しいなぁと感じています。

制約条件の一つ目は、試験日です。同じ日の同じ時間帯に試験がある科目は、登録不可です。システム的には登録できるのかもしれませんが、試していません。登録できたとしても、片方の試験を捨てなきゃいけなくなりますね。

制約条件の二つ目は、これも試験日です。試験日が土日になっている科目は問題無いのですが、平日の試験はできれば避けたい。できれば、同じ日に試験日が集中したほうが都合がいい。最悪なのは、火、水、木みたいに平日に分散して試験があるパターンです。これは避けたい。

制約条件の三つ目は、今期受講する科目数です。1学期やってみて、2科目は良いペースで予習、聴講できることがわかりました。3科目くらいならなんとかなると思いますが、4科目になるとちょっと厳しいかもしれません。特に、数学のように自分の手で計算してみる必要がある科目は予習に時間がかかると思うので。

制約条件の四つ目は、講義がインターネットで配信されていることです。放送大学の講義は、基本はTVかラジオで放送される放送授業なのですが、平日の真昼間に放送されても受講できないので、そういう場合は全国にある学習センターでDVDやCDを借りて授業を受けます。私が所属する静岡学習センターはうちから歩いて10分くらいのところにあるので近いといえば近いのですが、最近始まったインターネット配信授業のほうがはるかに自由度が高いので、1学期はインターネット配信に頼っていました。

いろいろ迷った結果、2学期は「線形代数学(’09)」、「統計学(’09)」と「財政学(’10)」を受講することにしました。線形代数と統計学は、私の趣味に絡んだ話です。財政学は、日本国の借金てどうなの?と思ったので受講する気になりました。

他にもおもしろそうな講義が沢山あるのですが、一度には勉強しきれないので、今後の楽しみに取っておきます。

2010年8月12日 (木)

XBOX360でシステムエラー E74

自主的に年休を入れて作った早めのお盆休みで、実家に帰ってました。

実家から戻ってきたら、XBOXがこんなエラーを出すようになっていました。ちょっと検索したらいろいろと情報がでてきたので、メジャーな不具合なのだと思います。中身としてはハードウェア障害で、この障害に関しては保証書に記載された購入日から3年間は無償修理をしてくれるそうです。

それにしても。XBOX360の不具合は、他のコンシューマゲーム機に比べてはるかに多いようですね。XBOXのWebサイトで修理依頼を出したので、これから修理に出します。修理されて返ってくるのは(お盆休みを挟むので)2週間後位になるものと予想しています。その間ゲームはできないわけで、おそらく、ロボット開発に集中しなさいという意味なのだと思います。

2010年8月 6日 (金)

開発構想書の更新

ただいま今年度の開発構想書を更新中です。というのは、最初に考えていたことと、今の進捗レベルでこれからできること、やるべきことがかなり乖離してきたからです。

昨年の反省で、「計画がずれた際に計画の更新を怠った。その結果、スケジュールがコントロールから外れたままになった。」というマネージメント面の反省項目があったので、今年度は忘れないうちに計画を見直して、しっかり進捗を管理していきたいと考えています。

2010年8月 5日 (木)

100km歩け歩け大会にエントリーした

来る10月23日、24日に第15回三河湾チャリティー100km歩け歩け大会が開催されます。友人に誘われて、私も今年は参加することにしました。で、いまさっき、RUNNETで参加登録しました。

単に「ダイエットのために運動を~」とかいうより、明確な目標があるほうがモチベーションが上がります。100kmを歩き切れるよう体作りを通して、その御利益としてダイエットできればいいんじゃないかと思っています。

2010年8月 3日 (火)

bh8921@gmail.com is identified as a spam bot.

bh8921@gmail.com is identified as a spam bot.

IP Address : 188.187.102.74

2010年8月 1日 (日)

配列を含むC++の構造体をC#で使うには

これの続きです。

URGライブラリの構造体にはいくつか charの配列があります。C#からこの構造体を扱えるようにするために、C#のソースコード中で同じ構造体を定義してやる必要がありますが、その時この配列が、C++と同じように記述できないという問題にぶち当たりました。

例えば、urg_parameter_t という構造体は、C++では

typedef struct {
  char sensor_type[SensorTypeLineMax]; /*!< Sensor type */
  long distance_min_;                  /*!< DMIN Information */
  long distance_max_;                  /*!< DMAX Information */
  int area_total_;                     /*!< ARES Information */
  int area_min_;                       /*!< AMIN Information */
  int area_max_;                       /*!< AMAX Information */
  int area_front_;                     /*!< AFRT Information */
  int scan_rpm_;                       /*!< SCAN Information */
} urg_parameter_t;

と定義されていますが、C#で素直に

public struct urg_parameter_t {
  public byte sensor_type[SensorTypeLineMax]; /*!< Sensor type */
  public long distance_min_;                  /*!< DMIN Information */
  public long distance_max_;                  /*!< DMAX Information */
  public int area_total_;                     /*!< ARES Information */
  public int area_min_;                       /*!< AMIN Information */
  public int area_max_;                       /*!< AMAX Information */
  public int area_front_;                     /*!< AFRT Information */
  public int scan_rpm_;                       /*!< SCAN Information */
}

と記述しようとすると、この配列の部分でコンパイルエラーとなります。C#流の配列は、

public byte [] sensor_type = new byte[ SensorTypeLineMax ];

なのですが、これを構造体の中に書くとこれもコンパイルエラーです。どうにかならないかといろいろ探してみたところ、MSDNでこのような情報を見つけました。このページでは、構造体メンバの配列の要素数を設定する方法が書かれています。

それに従えば、上記の構造体はこう書けばいいわけですね。

        [StructLayout(LayoutKind.Sequential)]
        public struct urg_parameter_t
        {
            [ MarshalAs( UnmanagedType.ByValArray, SizeConst=SensorTypeLineMax ) ]
            public byte[] sensor_type;                /*!< Sensor type */
            public long distance_min_;              /*!< DMIN Information */
            public long distance_max_;              /*!< DMAX Information */
            public int area_total_;                /*!< ARES Information */
            public int area_min_;                  /*!< AMIN Information */
            public int area_max_;                  /*!< AMAX Information */
            public int area_front_;                /*!< AFRT Information */
            public int scan_rpm_;                  /*!< SCAN Information */
        }

他の構造体についても同様に書き換えて、charが使われている部分はすべてbyteに置き換えてみたところ、テスト用プログラムから

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

を実行しても例外が発生しなくなりました。

« 2010年7月 | トップページ | 2010年9月 »

最近の写真