ようこそゲストさん

たぶん駄文

2012/01/28(土) CADで正確なサイズのARマーカを作る方法

はてブ 2012/01/28 27:06 CADnucho
ARtoolkitを使ってカメラからマーカまでの距離を算出するとき、位置計測の精度をちょっとでも高めるために正確な大きさのマーカが欲しかったりしますよね。
gimpとかでもできるのでしょうけど、いまいち思った大きさで印刷できなくてどうにも困ったので、今回はAR CADを使って正確なサイズのARマーカを作ってみました。
もうやっている人もいそうな感じですが、30秒くらい探してみても見つからなかったためテキトーにまとめておきます。

AR CADはフリーウェアの二次元CADで、またwineでも動いてくれてUbuntuで使用することもできるステキなCADです。
とても使いやすくお絵描き感覚で使えるので、これまでCADを使ったことない人なんかにもおすすめですよー。

AR CADでマーカの雛形を描く

ar_cad2ar_marker
  1. 左側のツールバーで「矩形」を選びます。
  2. ツールバーの上らへんで大きさ80mm,80mmと指定します
  3. パターンを「純色」色を「黒」とします。
  4. 右クリックして「中中」を選択し、シートの上で左クリックしたら黒い四角が描かれます。
  5. もういっぺん大きさ40mm,40mmと指定します。
  6. パターンを「純色」色を「白」とします。
  7. さっき置いた黒い四角の上の真ん中へんで左クリックしたら白い四角が描かれます。(「中点」の場所でカーソルがとまります)
↓こんな感じにマーカの雛形ができあがります。
ar_cad2ar_marker2

自分で図形を描く場合

まずはマーカの中身を描く用に、塗りつぶしなしで40mmx40mmの四角をおきます。
その中にARマーカとして許される範囲で好き勝手な図形を描けばいいですね。
ちなみに図形の塗りつぶしはハッチングという処理で行うことができます。

ar_cad2ar_marker3

そして、左側のツールバーで「要素選択」を選んで先ほど描いた図形を全て選択し、準備したARマーカの雛形の中に重ね合わせれば完成。
ar_cad2ar_marker5

あとは印刷するときに拡縮倍率が100%になっていることだけ確認すればおっけーです。

画像を合わせる場合

同じようにマーカの中身を描くための四角を、塗りつぶしなしで40mmx40mmでおきます。
「ファイル -> インポート -> テキトーな画像形式」で画像ファイルをインポートします。

左側のツールバーで「要素選択」を選び、インポートした画像の端っこを摘んで形を変形させて、40mmx40mmの四角に合わせます。
ar_cad2ar_marker6

そして、マーカ画像全体を選択して、準備したARマーカの雛形の中に重ね合わせれば完成ですね。
ar_cad2ar_marker7

あとは同じように印刷すればおしまいです。

パターンファイルをつくる

ここから先は通常通りなのですが、一応流れで書いておきます。
作成したマーカをARtoolkitなどで利用するにはパターンファイルというものを生成しなくてはなりません。

まずはAR CADで「ファイル -> エクスポート -> pngファイル」で作ったARマーカを画像として出力します。
Marker Generator Onlineへ行き、「select -> Load marker image」で出力した画像を選択。
すると、自動でマーカを認識してくれるので「Get Pattern -> Save Current」でパターンファイルを取得することができます。

これで、正確なサイズのARマーカを利用することができるようになりましたね。やったぜ!

2012/01/12(木) Ubuntu10.04にlatex環境を構築するまとメモ

はてブ 2012/01/12 10:03 Ubuntunucho
初エントリですね。皆様あけましておめでとうございます。
今年こそ何か面白いものを作るこということを目標に頑張っていきたいと思いますので、よろしくお願い致します。

といいつつ今回は全然モノに関係のない記事ですけど…。

latexをインストール

まずはこちらを参考に、latexをインストールします。
sudo apt-get install latex-env-ja
sudo apt-get install latex-extra-ja
sudo jisftconfig add

dviファイルをpdfに変換するツールであるdvipdfmxを使用するために、以下の作業を行います。
cd /etc/texmf/dvipdfmx
sudo cp -p dvipdfmx.cfg dvipdfmx.cfg_org
sudo gedit dvipdfmx.cfg
ファイルの最終行に"f jis-cjk.map"を追加。

ln -s /var/lib/defoma/gs.d/dirs/CMap ~/.texmf-var/fonts/cmap
これで、
platex test.tex
dvipdfmx test.dvi
というように、tex文書からpdfを作成することができます。
文字コードがEUCでないとダメなのに注意。

tex文書の中にpngやjpeg画像を貼り付けられるようにする

latexは初期のままだとpngやjpeg画像を貼り付けることができません。
これではちょっと不便なので画像が使用しやすくなるような作業を行います。

まず,こちらのサイトここを右クリックで保存するか、ページ全体をコピーしてエディタに貼り付け「mediabb.sty」という名前で保存します。
そしてこれをどこかに配置すればいい…と思うのですが、ちょっとどこに置けばいいのかわかりませんでした。。
まぁとりあえずtex文書と同じディレクトリに配置しておきます。

mediabb.styを配置したら、あとはtex文書の上の方で
\usepackage[dvipdfmx]{graphicx, color}
\usepackage{mediabb}
と読み込んで,画像を貼り付けたい場所に
\includegraphics[autoebb,scale=1.0]{test.png}
と記述することで画像を貼り付けることができます。

コンパイルは以下のように引数をつけて行います。
platex -shell-escape test.tex

texlipseをインストール

長い文章など書くときはテキストエディタだけでは辛いので、eclipse上でtex文書を書くことができるtexlipseをインストールします。

texlipse自体のインストールはここに従って行いました。

設定

Window -> Preferences -> General -> Content Types -> Text -> LaTex Fileを選択
Addボタンから「*.bib」を追加、Default encodingに「EUC-JP」と入力してUpgradeボタンを押す。

Window -> Preferences -> Texlipse -> Builder Settingを選択
Latex Program の設定を「/usr/bin/platex」「-interaction=nonstopmode --src-specials -shell-escape %input」とする
Dvipdf Program の設定を「/usr/bin/dvipdfmx」とする。

これで、いい感じにtex文書からpdfまで変換することができるようになりました。

2011/12/12(月) mbed向けにAD-128160-UARTのライブラリ作った

はてブ 2011/12/12 18:14 mbednucho
aitendoには高速1.77インチ液晶モジュールというとても便利そうなLCDモジュールが売っています。

このLCDの特徴としては
  • 3.3V単電源で駆動できる
  • 少ない信号線で制御できる(txとresetの二線のみ)
  • 点、直線、四角形、円などの図形を高速に描画できる
  • ASCIIフォントが組み込まれている。(設定を行うことで日本語も書き込めるみたいです)
  • miniUSB端子が付いており、PCからもコマンドを送ることで制御できる
などなど嬉しいことずくめです。これは一家にひとつ常備しておかなくてはなりませんね。知りませんけど。

というようにスペック上は魅力あふるるLCDなのですが、発売後数ヶ月経ってもaitendoが碌にデータシートを公開していないため、これまでは真っ暗な液晶を眺めながら可能性を想像する程度の置物レベルの価値しかありませんでした。
現在はGingaXさんが使い方をまとめてくださって、基本的な使い方はわかるようになったので今回はmbed用にライブラリをつくってみたという次第です。

使ってみる

写真

RIMG0592_org

回路図

AD_128160_UART_circuit

プログラム

#include "mbed.h"
#include "AD128160.h"

AD128160 lcd(p9,p20);//tx reset

//2バイトRGBをつくるための関数
int rgb565(int r, int g,int b)
{
    int rgb;
    
    rgb = (r & 0xF8) << 8;        /* RRRRR----------- */
    rgb |= (g & 0xFC) << 3;       /* -----GGGGGG----- */
    rgb |= b >> 3;                /* -----------BBBBB */
    
    return rgb;
}

int main() {
    lcd.backgroudColor(rgb565(255,0,0));//文字の背景色を赤に設定
    lcd.locate(2,lcd.rows()/2);         //大体真ん中あたりに移動して
    lcd.printf("Hello World!\n");       //お馴染みの文を表示
    
    lcd.color(rgb565(0,255,0)); //図形の色を緑に設定
    lcd.box(12,76,116,100,0);   //塗りつぶしなしで矩形表示
    lcd.box(8,120,124,146,1);   //塗りつぶしありで矩形表示
    
    lcd.color(rgb565(255,0,0)); //図形の色を赤に設定
    lcd.circle(16,40,16,0);     //塗りつぶしなしで円表示
    lcd.circle(48,40,16,1);     //塗りつぶしありで円表示
    lcd.circle(80,40,16,1);     //塗りつぶしありで円表示
    lcd.circle(112,40,16,0);    //塗りつぶしなしで円表示
}
細かいライブラリの使い方なんかはクラスリファレンスを読んでください。
ライブラリをつくるときにStreamクラスを継承して_putc()メンバー関数をLCDにあわせて作成することでprintfにもあっさり対応できてます。

画像も表示させてみる

RIMG0595_org
どのくらいの発色なんかなーと16bit bitmapデータを作って表示させてみました。
まーまー綺麗に表示できますね。

こちらのプログラムも一応ここに置いておきます。
試すときの128x128の16bit bitmapは各自準備してください。。

2011/12/06(火) DSO Nano v2が壊れたのでテキトー修理

はてブ 2011/12/06 6:21 電子工作nucho
フィジカルコンピューティング関連でアンテナを張っている方はご存知かもしれませんが、DSO Nano v2というちっちゃいオシロスコープがあります。
ちゃんとした計測器として使えるかどうかはさておいて、ちょっとした波形をみてキャプチャしたり、ちょっとしたPWMを出力したりなどと出来るため、そこそこ便利に使っていました。

しかしこのたび「うぇーいうぇーいアババ」とそこらのバカ学生顔負けの使い方をしていたらショートさせてしまい、PCと繋いでも認識されずに通信ができなくなってしまいました。
一応修理を行ったので、そのことを記録しておきます。もしも同じような壊し方をした人がいらっしゃれば参考に…。

修理

とりあえず分解してみると、
RIMG0547
のようにL2とL3が焦げていました。

回路図を確認するとこれらはフェライトビーズのようです。
フェライトビーズとはノイズをカットするための部品で、直流成分に対しては0.数Ωなのに対して100MHzには数百Ωになったりする偉いやつです。

しかしフェライトビーズが手元になかったので、「まぁノイズカットはなくても大丈夫っちゃ大丈夫だろ…大丈夫だよな…」と
RIMG0550
このようにジャンパしたら無事に?PCから認識されて通信が可能になりました。やってみるものですね。まぁ壊すときも同じような流れだったんですけど。

問題なくファームの更新なども行えることを確認しましたが、このままでは良い子も悪い子もあんまり真似しない方がいい状態かと思います。
フェライトビーズを置き換えれば完全に大丈夫なのでしょうが、どの値を付ければいいのかちょっとよくわかりません。サイズがおんなじこのあたりを使えば良いのかな。。

2011/10/25(火) rosserial_arduino使い方メモ

はてブ 2011/10/25 12:11 ROSnucho
rosserial arduinoの使い方メモです.ソースべたべたの真っ茶色の記事です.
ArduinoはDuemilanoveを使用しました.Japaninoだとうまく受信できなかったりしたので,クロックが16Mhzのものじゃないと駄目なのかも

Publisher,Subscriber

まずは基本的なPublisher,Subscriberの使い方から.
#include <ros.h>
#include <std_msgs/Int32MultiArray.h>
void messageCb( const std_msgs::Int32MultiArray& msg);

ros::NodeHandle nh;
std_msgs::Int32MultiArray array_msg;
ros::Subscriber<std_msgs::Int32MultiArray> s("array_sub", &messageCb);
ros::Publisher p("array_pub", &array_msg);

void messageCb( const std_msgs::Int32MultiArray& msg){
  array_msg = msg;
}

void setup()
{
  array_msg.data_length = 3;
  array_msg.data = (int32_t *)malloc(sizeof(int32_t)*3);
  array_msg.data[0] = 0;
  array_msg.data[1] = 0;
  array_msg.data[2] = 0;

  nh.initNode();
  nh.advertise(p);
  nh.subscribe(s);
}

void loop()
{
  p.publish(&array_msg);
  nh.spinOnce();
  delay(10);
}
というスケッチをArduinoに書き込み,PCのコンソールから

$ rosrun rosserial_python serial_node.py /dev/ttyUSB0
としてクライアントを起動させた後
$ rostopic pub array_sub std_msgs/Int32MultiArray [[['a',3,1]],0] [123,456,789]
publishing and latching message. Press ctrl-C to terminate
$ rostopiecho array_publayout: 
  dim: 
    - 
      label: 4
      size: 3
      stride: 1
  data_offset: 0
data: [123, 456, 789]
---
というようにして,Publishした値がちゃんと受け取られていることが確認できます.

ServiceServer

2011/12/6追記
change set 167あたりのサンプルプログラムに使い方が載っていました。
この記事を書いていた時点ではまだちゃんと実装されてなかったんですね。。。

次にServiceServerの使い方.こちらは実はよくわかってません.
#include <ros.h>
#include <std_msgs/Empty.h>
void myservice(const std_msgs::Empty& req, std_msgs::Empty& res );

ros::NodeHandle nh;
 
void myservice(const std_msgs::Empty& req, std_msgs::Empty& res ) {
}

ros::ServiceServer<std_msgs::Empty,std_msgs::Empty> service("service", &myservice);

void setup()
{
  nh.initNode();
  nh.advertiseService(service);
}

void loop()
{
  nh.spinOnce();
  delay(10);
}
このスケッチを書き込み,クライアントを起動させると期待していたServiceServerではなくSubscriverとして認識されます.
そして
$rostopic pub service std_msgs/Empty 
というようにPublishするとmyservice関数の中に入った後,resをPublishしてくれているようです.
どうやってresを受け取るのかはわかりません...

Parameter

次に便利なパラメータの使い方に関して.
#include <ros.h>
#include <std_msgs/Float32MultiArray.h>

ros::NodeHandle  nh;

std_msgs::Float32MultiArray data_msg;
ros::Publisher data_pub("data_pub", &data_msg);

void setup()
{
  nh.initNode();
  nh.advertise(data_pub);
  
  data_msg.data_length = 3;
  data_msg.data=(float*)malloc(sizeof(float)*3);

  while(!nh.connected()) {
    nh.spinOnce();
    delay(10);
  }

  if (!nh.getParam("param_test", data_msg.data,3)){ 
    //default values
    data_msg.data[0]=0;
    data_msg.data[1]=0;
    data_msg.data[2]=0; 
  }
}

void loop()
{
  data_pub.publish( &data_msg );
  nh.spinOnce();
  delay(10);
}
このスケッチを書き込んだら,クライアントを起動する前に,
$rosparam set param_test [1.23,4.56,7.89]
というようにあらかじめパラメータをセットしておきます.
試しているバージョン(changeset 143)の段階ではパラメータをセットしておかないとエラーでクライアントが落ちるので注意してください.
クライアントを起動したら
$ rostopic echo data_pub
layout: 
  dim: []
  data_offset: 0
data: [1.2300000190734863, 4.559999942779541, 7.8899998664855957]
---
というようにパラメータがセットできていることが確認できます.

ちなみに

mbedに移植したものでも同じように使うことができます.
mbedの場合だと
main()
{
  //setup()部分をここに
  while(1){
    //loop()部分をここに
  }
}
みたいな感じでちょっとの修正(delay()をwait_ms()にするとか)でそのまま使えます.便利!