2014年7月21日月曜日

Makers' Baseでレーザーカッターのトレーニングを受けてきた

もう一年以上前の話になりますが、 APC Paperに感化されて、シングルボードコンピュータを入れるための紙箱を作ったことがありました。2mm厚のボール紙を材料に使ったんですが、これを切り出すために、寸法を測り、目印をつけて、定規を当ててカッターで切る、という作業はすごく手間がかかるということ。垂直をとるように気をつけないといけないので、当然たくさん作るのも大変。それで当時、何とか楽にできる方法はないかと頭を悩ませ、裁断機を使うなんてことまで考えたんですが、いつしかレーザーカッターという文明の利器に頼ってはどうかと思い抱くようになりました。

暫くして、 レーザーカッターの使い方を教えてもらえるような場所を探しているうち、たどり着いたのが今回お邪魔した東京は目黒のMaker's Baseさんです。こちらでレーザーカッターのトレーニングを受講することで、それ以降施設のレーザーカッター設備を時間借りできるようになります。さらにレーザーカッターのみならず、木工や金工、陶芸、3Dプリンター、シルクスクリーンといった様々な工作、造形技術のトレーニングと設備の時間貸しを行っています。去年流行った言葉で言うところのパーソナルファブリケーションをするための施設と言えます。

さて、雨もそぼ降る初夏の候、Webからばっちり予約をしてレーザーカッターのトレーニングを実際に受講してきました。JR目黒駅を西へ出たら、タクシーがベタ踏みで登っていく大円寺横の行人坂を下り、雅叙園を横目に、春には桜が綺麗だったであろう目黒川を越えると、住宅街の一角にMaker's Baseさんがあります。


2階のレセプションでトレーニング受講に訪れた旨を伝え、簡単な質問票(アンケート?)記入の後、トレーニングへ。私のときは講師1名に受講者3名、濃厚な少人数制クラスで上達せざるを得ません。2時間枠のトレーニングで最初はテキストを使った講習、機材の使い方を覚えます。次に同施設の備品のタブレットPCを使いカットのためのベクターデータ作成。続いてタブレットからレーザーカッター本体へベクターデータ出力をし、実際にカット。最後に、自由制作です。


ところで、さっきからカット、カットと言っていますが、レーザーカッターでは素材のカットだけではなく表面への彫刻も可能です。濃淡は表現できず完全な二値画像としての出力になりますが、解像度は結構高いので、ハーフトーン等で多少の表現は可能と思われます。
実際に、アクリル板に画像ベースの彫刻を試してみました。↓の画像の手前にある方はたまたまタブレットの中に入っていた画像で、↑のレーザープリンタを撮影したものと思われます。タブレットにインストールされていたイラストエディターで(トーンマップ機能を使った突貫の)二値化をして出力させました。


最後に、せっかくなら誰もレーザーカッターで出力したことのなさそうなものを作ってレーザーカッター史に名を残そうと思い、某天才コメディアンの殿様をオマージュしてみました↓。


そんな感じでトレーニング用に支給いただいたアクリル板から3作品(?)切り出したところで時間いっぱいとなりました。今後、作業性アップのために鍛錬することが課題ですね。
切断する素材によって出力時にレーザーカッターのパワーとスピードを決めなければいけないので、厚紙カットのチャレンジはまた追い追い。


麺屋百式さんでラーメン食べて帰りました。

2014年7月13日日曜日

UDOO(i.MX6)用Ubuntu 13.10のSDカードセットアップ

UDOO公式で配布されているUbuntuのバージョンは12.04と若干古めなんですが、こちらのブログで13.04のファイルシステムが配布されているのをたまたま見つけたので、インストールしてみることに。とりあえずカーネルとU-Bootは公式のものをそのまま使い、ファイルシステムだけ13.04にしてみます。

作業はLinuxマシンで行います。

1.ルートファイルシステム、カーネル、カーネルモジュール、U-Bootのダウンロード


まずは必要なものをもろもろダウンロードしてきます。

U-Boot。i.MX6 DualモデルとQuadモデルで違うので注意。
$ wget http://udoo.org/download/files/UDOO_Unico/u-Boot_Quad/u-boot-q.imx
次にカーネルイメージ。
$ wget http://udoo.org/download/files/UDOO_Unico/Kernel/uImage
それからカーネルモジュールも。
$ wget http://udoo.org/download/files/UDOO_Unico/Kernel/modules.tar.gz
後は件のルートファイルシステム(rootfs)。
$ wget http://stende.no-ip.info/jas/xubuntu_13_04_gpu.tar.gz

2. SDカードのパーティショニング


役者がそろったら、彼らに最高のステージを。SDカード。UDOOの場合はマイクロSDですな。たぶん2GBとかでもいけますけど、今日日Class10の16GBくらいじゃないと使う気になれませんね。笑
SDカードをカードリーダとかに挿してホストマシンに接続したら、dmesgとかでデバイス名を確認しておきます。パーティショニングはこの後すぐ!ホストマシンのHDDと間違えるなよ!絶対にだぞ!
 sdf: sdf1 
既存パーティションがある場合には上記のようにsdXのあとに数字のついたデバイスが見えるはず。いずれにせよ消しちゃうのであってもなくてもOK。

パーティショニングの作業はお好きなツールで。GUIならGpartedが便利ですよね。その昔、BeagleboardなんかいじってたころはfdiskでSDカードをフォーマットしたものです。最近はでっかいHDDをいじるときにfdiskがGPTに対応してなかったりするんで、私はpartedに移りつつあります。そんなわけでpartedを使ってやっていきましょう。
$ sudo parted /dev/sdf
まずはprintで中身を見てみる。
(parted) print                                                            
モデル: I-O DATA micro SD Reader (scsi)
ディスク /dev/sdf: 15.9GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos

番号  開始    終了    サイズ  タイプ   ファイルシステム  フラグ
 1    4194kB  15.9GB  15.9GB  primary  fat32             lba

既存のパーティション1をrmで削除。
(parted) rm 1
(parted) print                                                            
モデル: I-O DATA micro SD Reader (scsi)
ディスク /dev/sdf: 15.9GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos

番号  開始  終了  サイズ  タイプ  ファイルシステム  フラグ

次にmkpartでパーティションの作成。ファイルシステムはEXT3、サイズは先頭を10MiBほど空けて、後ろはSDカードサイズいっぱいにとってあげましょう。(パーティションテーブルをmsdosに直す場合はmklabelでできます。)
(parted) mkpart primary ext3 10MiB 15.9GB
(parted) print                                                            
モデル: I-O DATA micro SD Reader (scsi)
ディスク /dev/sdf: 15.9GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos

番号  開始    終了    サイズ  タイプ   ファイルシステム  フラグ
 1    10.5MB  15.9GB  15.9GB  primary

quitで終了。
(parted) quit
通知: 必要であれば /etc/fstab を更新するのを忘れないようにしてください。  

パーティショニングでEXT3指定をしましたが、mkfsもしたほうがいいっぽいので、
$ sudo mkfs.ext3 /dev/sdf1
はい。これで完了です。

3. SDカードへの書き込み


できたパーティションに先ほどダウンロードしたルートファイルシステムを書き込んでいきます。
まずはローカルにマウントポイントのディレクトリを作成し、マウント。
$ mkdir sdcard
$ sudo mount /dev/sdf1 sdcard
ルートファイルシステムをマウントしたSDカードのパーティションへ展開。sudoを忘れずに。
$ sudo tar -xzpf xubuntu_13_04_gpu.tar.gz -C sdcard/
続いてカーネルのコピー。
$ sudo cp uImage sdcard/boot
それからカーネルモジュール。既存のものを消してから。
$ sudo rm -rv sdcard/lib/modules/*
$ sudo cp -av lib sdcard/
ここまでできたら、アンマウントします。
$ sudo umount sdcard
最後に、SDカードにU-bootを書き込みます。
$ sudo dd if=u-boot-q.imx of=/dev/sdf bs=512 seek=2
これでSDカードの準備は完了。syncしてからSDカードを取り外し。
$ sync
ボードに挿して起動します。

(おまけ) Ethernetインタフェースのセットアップ


そのままだとEthernetに接続できませんが、/etc/network/interfacesに下記を追加し、
auto eth1
iface eth1 inet dhcp
下記でEthernetのインタフェースを起動すればOKです。
$ sudo ifup eth1

参考
I.MX6 - Ubuntu 13.04 with GPU acceleration - Tiny Devices
UDOO creating a bootable Micro SD card from precompiled binaries - eLinux.org
UDOOのUbuntuでネットワークに接続できない - Atelier Orchard

2014年5月20日火曜日

ウェブカメラのフォーカス

新しいウェブカメラを買いました。LogicoolのC920t。実勢で一万円ほどする高級ウェブカムですよ。Raspberry PiとかUDOOとかのARMシングルボードコンピュータとつなげて遊ぶウェブカムとしては、もともと持っていたバッファローのBSW32KM01Hを使っていたんですが、最近マクロ寄りの距離でタイムラプスを撮りたいとこっそり妄想していて、それができそうなウェブカムを探していたのです。
C920tは価格.comのWebカメラランキングでも上位にあるのですぐにアンテナにかかりましたが、決め手は
  • 最短7cmのとってもマクロな焦点距離
の他にも、
  • UVC対応
  • ハードウェアH.264エンコード
  • 海外のウェブカムハックでよく話に挙がっている
  • 三脚雲台ネジ穴
といったところがあります。ついでに言うと、「カールツァイスレンズ搭載」というのもこの製品の売りだそう。

さっそくボードにつないで実験してみるわけですが、ARMボードでの使用となれば、早々簡単にはいかない。uvccaptureで静止画撮影してみたんですが、Raspberry Piで撮るとやけに暗いし色もおかしい。UDOOだとそれなりにきれいに撮れるのに。uvccapture -vで調べてみた結果、BrightnessContrastSaturationGainの設定がおかしくなっていた。uvccaptureのソースを読んでみると、コマンドラインから前記のパラメータが指定されていない場合、v4l2ドライバへのioctlコールでパラメータリセットがかかる。そうなると、これがRPi固有の問題か、他のカーネルでも同じかわかんないけど、おかしな設定になってしまう。あとuvccaptureのソースを読んだついでに書いておくと、前記パラメータに0を指定すると無視されてリセットがかかり、やはりおかしな初期値が使われる。これはさすがにバグだと思う。

さて、UDOOを参考に
  • Brightness: 128
  • Contrast: 128
  • Saturation: 128
  • Gain: 1
で、RPiでもそれなりに素敵に撮れるようにできた。

でもまだ問題が残る。フォーカスである。

カメラの前に被写体として瓶を置いて撮ってみるものの、ピントが合ってない。さてどうしたものかと思っていろいろいじっていると、v4l2-ctlでフォーカスの設定ができそうなことに気づく。
$ v4l2-ctl --list-ctrls
...
                 focus_absolute (int)    : min=0 max=250 step=5 default=8189 value=0 flags=inactive
                     focus_auto (bool)   : default=1 value=1
...
これが使えるとしたら、UVCもなかなか気が利く。

まずはオートフォーカスをオフに。
$ v4l2-ctl --set-ctrl focus_auto=0
次にfocus_absoluteという値をいじってみる。今の設定値は
$ v4l2-ctl --get-ctrl focus_absolute
focus_absolute: 0
なので、ここから少しずつ刻みながら画像を確認してみる。
$ v4l2-ctl --set-ctrl focus_absolute=0
$ uvccapture -x1920 -y1080 -B128 -C128 -S128 -G1 -ofocus00.jpg
$ v4l2-ctl --set-ctrl focus_absolute=10
$ uvccapture -x1920 -y1080 -B128 -C128 -S128 -G1 -ofocus10.jpg
$ v4l2-ctl --set-ctrl focus_absolute=20
$ uvccapture -x1920 -y1080 -B128 -C128 -S128 -G1 -ofocus20.jpg
$ v4l2-ctl --set-ctrl focus_absolute=30
$ uvccapture -x1920 -y1080 -B128 -C128 -S128 -G1 -ofocus30.jpg
$ v4l2-ctl --set-ctrl focus_absolute=40
$ uvccapture -x1920 -y1080 -B128 -C128 -S128 -G1 -ofocus40.jpg
$ v4l2-ctl --set-ctrl focus_absolute=50
$ uvccapture -x1920 -y1080 -B128 -C128 -S128 -G1 -ofocus50.jpg
$ v4l2-ctl --set-ctrl focus_absolute=60
$ uvccapture -x1920 -y1080 -B128 -C128 -S128 -G1 -ofocus60.jpg
で、結果が下の画像。なおカメラから被写体までの距離は、チポトレソースが約10cm、シナモンシュガーが約20cm、ボトルのビールが約30cmです。(ちなみにこれらはアメリカのトレーダージョーで買い漁ってきた物。)

focus_absolute=0
focus_absolute=10
focus_absolute=20
focus_absolute=30
focus_absolute=40
focus_absolute=50
focus_absolute=60
撮影風景↓

まずfocus_absoluteに関してわかるのは、値が小さいほど無限遠側、大きいほどマクロ側のフォーカスとなること。それから10~30cm程度の近距離の被写体をうまく収める設定値はなさそう。10~40あたりの範囲で好みを調整するといいかもしれない。

オートフォーカスのときにどういう測距点を使っているのかわかりませんが、ちゃんと撮りたければマニュアルで設定してあげるほうがよさそうです。

2014年5月13日火曜日

MEncoderで動画変換

streamerコマンドを使って、Linuxコマンドラインでウェブカメラ録画をしてみた(関連記事)けど、うまいことエンコードできず無圧縮AVIのまま保存していたので、ファイルサイズがすごく大きい。

そこで、あとからでも圧縮できないかと思ってちょっと調べてみたところ、とりあえずMEncoderを使ってMPEG2にできた。

mencoderがインストールされていなければ、まずはインストール。
$ sudo apt-get install -y mencoder

で、AVI→MPEG2の圧縮が
$ mencoder input.avi -of mpeg -ovc lavc -lavcopts vcodec=mpeg1video  -oac copy -o output.mpg
でできた。元ファイルが320x240/10fpsの10秒のRGB24で約24MB、圧縮後が約820kBなので、だいたい1/30になった。

H.264とかもできたらいいなー。オプションとかいろいろ調べてみよう。

参考

Chapter 6. Basic usage of MEncoder - MPlayer - The Movie Player

ホワイトバランス設定してウェブカメラ録画

Linuxのコマンドラインでウェブカメラを使った動画撮影をする方法を昨日書いたんですが、若干ホワイトバランスが要調整という感じだった。ので、ホワイトバランス設定してから撮影する方法。

v4l2-ctlというツールを使います。インストールされていなければ
$ sudo apt-get install v4l-utils
でパッケージをインストール。

で、まずホワイトバランスを含め設定可能なパラメータの一覧を表示。
$ v4l2-ctl --list-ctrls
                     brightness (int)    : min=-64 max=64 step=1 default=0 value=0
                       contrast (int)    : min=0 max=64 step=1 default=32 value=32
                     saturation (int)    : min=0 max=128 step=1 default=67 value=67
                            hue (int)    : min=-40 max=40 step=1 default=0 value=0
 white_balance_temperature_auto (bool)   : default=1 value=1
                          gamma (int)    : min=72 max=150 step=1 default=110 value=110
                           gain (int)    : min=0 max=80 step=1 default=0 value=0
           power_line_frequency (menu)   : min=0 max=2 default=2 value=2
      white_balance_temperature (int)    : min=2800 max=6500 step=1 default=4600 value=4600 flags=inactive
                      sharpness (int)    : min=0 max=6 step=1 default=3 value=3
         backlight_compensation (int)    : min=0 max=2 step=1 default=1 value=1

現在の設定値の取得は
$ v4l2-ctl --get-ctrl white_balance_temperature
white_balance_temperature: 4600
オートホワイトバランスのON/OFF確認なら
$ v4l2-ctl --get-ctrl white_balance_temperature_auto
white_balance_temperature_auto: 1
でできる。

実際にホワイトバランスを設定してみる。オートホワイトバランスを切る必要があるので、white_balance_temperature_auto=0を入れる。で、色温度最低は
$ v4l2-ctl --set-ctrl=white_balance_temperature_auto=0,white_balance_temperature=2800
色温度最高なら
$ v4l2-ctl --set-ctrl=white_balance_temperature_auto=0,white_balance_temperature=6500
で設定できる。

あとは昨日書いた下記のコマンドで撮影してみると、違いがわかります。
$ streamer -c /dev/video0 -o test.avi -t 0:10 -s 320x240 -f rgb24

参考

Webcam settings on Ubuntu and Fedora Linux CLI from terminal - TechyTalk.info

2014年5月12日月曜日

Linuxコマンドラインでウェブカメラ動画撮影の実験

Raspberry PiのようなARMボードでも、x86マシンでも何でもいいんですが、ウェブカメラで動画撮影しようとして調べると、streamer、mencoder、gstreamer、v4l2-ctl、ffmpeg(avconv)などなど、いろんなツールがあるっぽい。ちょろっと試してみた結果、streamerでとりあえず録画できるやり方があったので、とりあえずメモ。
$ streamer -c /dev/video0 -o test.avi -t 0:10 -s 320x240 -f rgb24
avi / video: 24 bit TrueColor (LE: bgr) / audio: none
rate: queueing frame twice (18446511) -0.00s [0]
...
ただし、このコマンドだと無圧縮AVIになるので、すごくストレージ容量を食う。320x240サイズの10fpsが10秒で25MBくらい。より大きな解像度、高いフレームレート、長い時間で、と考えたら、おそろしいことに。
そこでstreamerのヘルプを見ると
$ streamer -h
...
movie writers:
...
  avi - Microsoft AVI (RIFF) format
    video formats:
      rgb15   15 bit TrueColor (LE)        [avi]
      rgb24   24 bit TrueColor (LE: bgr)   [avi]
      mjpeg   MJPEG (AVI)                  [avi]
      jpeg    JPEG (JFIF)                  [avi]
...
ということなのでMJPEGを試してみるんですが、
$ streamer -c /dev/video0 -o test.avi -t 0:10 -s 320x240 -f mjpeg
avi / video: MJPEG (AVI) / audio: none
no way to get: 320x240 MJPEG (AVI)
movie writer initialisation failed
となってしまう。何が足りないのかな。。
あとホワイトバランスも直さないとな。

なおウェブカメラの設定可能な解像度は下記コマンドで確認可能。
$ uvcdynctrl -d video0 -f

2014年5月7日水曜日

APTパッケージのソースを取得する。Raspberry Piで。

Raspberry PiのOS「Raspbian」で、apt-getでインストールするパッケージのソースを取得する方法。

いま手元で使っているバージョン(2014年1月版のイメージ、カーネル3.10.25+)だと、/etc/apt/sources.listに一行追加してやる必要がありました。
$ sudo vim /etc/apt/sources.list
deb http://mirrordirector.raspbian.org/raspbian/ wheezy main contrib non-free rpi
deb-src http://mirrordirector.raspbian.org/raspbian/ wheezy main contrib non-free rpi #この行を追加
これをしないと、「E: sources.list に 'ソース' URI を指定する必要があります」と言われます。

追加できたら、アップデート。
$ sudo apt-get update
あとはお好きなパッケージのソースをお落とし下さいませ、と。
$ apt-get source uvccapture streamer v4l-utils

参考

Raspbian Repository