バイク屋さんに用事で行くと、購入したスーパーカブが納車に向け整備中でした。レッグシールドが外され華奢なフレームがあらわに…!(照)
もう一応自分のカブのはずですが、念の為許可をいただいてパシャパシャ撮りました。
レッグシールドがないとスリムな見た目。
とてもかわいい。造形が手塚治のキャラクターっぽいです。
走行距離349.7km…(笑)
購入時になかった佐世保市の仮ナンバーがついていました。
二輪車のエンジンをまじまじと見るのも初めてでした。
楽しみ!
バイク屋さんに用事で行くと、購入したスーパーカブが納車に向け整備中でした。レッグシールドが外され華奢なフレームがあらわに…!(照)
もう一応自分のカブのはずですが、念の為許可をいただいてパシャパシャ撮りました。
レッグシールドがないとスリムな見た目。
とてもかわいい。造形が手塚治のキャラクターっぽいです。
走行距離349.7km…(笑)
購入時になかった佐世保市の仮ナンバーがついていました。
二輪車のエンジンをまじまじと見るのも初めてでした。
楽しみ!
これまでも電動アシスト自転車のビビ・ストロングでうろうろしていました。普通四輪免許を取得して数週間、車を運転する機会はあったものの、狭い道が多い佐世保の街で普段使い用に乗るとなると四輪車はどうしても手軽感が薄れてしまいます。かといって自転車では、たとえ電動アシストとは言え山は越えられない…。そこで、手軽な足として原付を買おうと思いました。
学生時代に新聞奨学生をしていた私にとって、50ccの二輪といえばスーパーカブ。学生は自転車での配達でしたが、同じ営業所のおっちゃん達が乗っていたカブの軽やかなマフラー音が忘れられません。あれほど朝の鳥のさえずりに似合うマフラー音は他にないんじゃないかと思っています。
さて、手頃な値段の丸目カブ50を近所のバイク屋さん数店で探していたのですが、手頃なのは角目しか在庫がないようで、Goobikeを漁っていたところリトルカブの掲載を見つけました。
リトルカブは小さいイメージがあったので、どんなものかと一度跨らせてもらおうと思ってお店に連絡すると、掲載されていたリトルはすでに売約済み。代わりに勧められたのがこのカブです。
うわあああ、色がとってもビビット…!
2002年式スーパーカブ50DXで、走行距離は349kmでした。15年モノでそんなワケないので、走行距離疑惑車扱いでこの値段らしいです。
社外品は
で、エンジンはノーマルとのこと。
元々は、
こういう色の車体だったらしいですが、前オーナーの人が
これに塗っているそうです。シート下のガソリンタンク上部が確かに深緑。お店の方が丁寧に説明してくれました。
前から見たところ。後になって気付いたのですが、レッグシールドもホンダの純正品でした。
体が大きい自分にとって、このシートは魅力的。また、本体9.5万円っていうところにも想定してた予算10万円前後にぴったりです。
正直なところ、原付を買うのは初めてのことだし他のところはよく分かりません。
となると、あとは色か…!
30過ぎのオッサンが乗るにはちょっとポップすぎないか、カブと言えば労働者のバイク…!、油と泥と錆が似合うんじゃないのか!(※勝手なイメージです)
色だけに色々迷いましたが、詳しくもない以上、確固たるこだわりもありません。
よし買う!買っちゃいました!ヒャッホーィ!
こうなったら後は楽しむのみ!です…!
Linux で Google Drive を使う方法は google-drive-ocamlfuse
一択かなーと思っていたら、Grive というオープンソースのソフトを知ったので入れてみました。google-drive-ocamlfuse は fuse でマウントできるのに対し、Grive は Windows 版の Google Drive クライアントのように同期させるためのソフトです。(Google ドキュメントで作成したファイルは同期されません)
fuse でマウントすると、ローカルにデータを置いておかなくてもバックエンドで Google Drive にアクセスして省スペースになりますが、ネットワークが切れたり、通信コストを抑えたい場合に厄介です。Grive は二重にデータを保持するもののネットワーク環境がなくてもデータが利用可能ですし、Grive を単体で使うと自動同期もしないので、ユーザーが好きなタイミングで同期することができます。
自分にぴったり…! ピコーン (‘A`)
LMDEやDebianのリポジトリにあって、APT で降ってくる grive
を最初に入れたものの使えず、調べてみると新しいバージョンを使った方がいいらしいです。 ということで、Github から入手してビルドします。
インストール方法は、公式の手順のとおりです。
C++ 方面の団体さんがお着きです。
sudo apt-get install git cmake build-essential \
libgcrypt11-dev libyajl-dev libboost-all-dev \
libcurl4-openssl-dev libexpat1-dev libcppunit-dev \
binutils-dev
cd /tmp
git clone https://github.com/vitalif/grive2.git
cd grive2
mkdir build
cd build
cmake ..
make -j4
sudo make install
インストールすると次の位置にコマンドが配置されました。
$ sudo make install
[ 78%] Built target grive
[ 83%] Built target btest
[ 98%] Built target unittest
[100%] Built target grive_executable
Install the project...
-- Install configuration: ""
-- Installing: /usr/local/bin/grive
-- Installing: /usr/local/share/man/man1/grive.1
初回の Google アカウント認証は WWW ブラウザ経由で行います。 同期用のディレクトリは作成されないので、自分で作って移動します。 最初、ホームディレクトリで grive
コマンドを実行してしまい焦りました。(-p dir
オプションを指定することにより、ディレクトリを指定することも可能。省略時はカレントディレクトリです。)
$ mkdir ~/GoogleDrive
$ cd ~/GoogleDrive
$ /usr/local/bin/grive -a
-a
オプションが初回の認証を行うオプションです。認証用 URL が印字されるので、そのリンクを WWW ブラウザで開きます。
$ /usr/local/bin/grive -a
----------------------
Please go to this URL and get an authentication code:
https://accounts.google.com/o/oauth2/auth?... # ← 認証コード
-----------------------
Please input the authentication code here:
(ここに認証コードをコピペ)
Reading local directories
Reading remote server file list
Synchronizing files
...
認証コードを貼りつけた後は、Return キーを押してそのまま待ってください。手癖で C-d
などタイプしてしまったら、そのまま終了してしまいます(終了させてしまいました)。 あとは Google から降ってくるファイルを淡々と眺めていくだけです。
初回の同期に終了すると
Finished!
と表示されてコマンドが終わります。
あとは、
$ cd ~/GoogleDrive
$ /usr/local/bin/grive
または
$ /usr/local/bin/grive -p ~/GoogleDrive
とすれば、同期することができます。Ubuntu では grive-tools
パッケージを入れたら常駐型の GUI ソフトが入って自動同期してくれるようですね。僕の場合は、Git のプッシュとプルのようにマニュアル同期の方が助かるのでこれ以上の設定はしませんが、ユーザー権限で動く grive
を cron に登録しておけば自動同期も可能だと思います。
自分用の覚え書きです。
手順は大体ここに載っているとおり。ドメインが割り当てられたホストにログインして certbot を使って証明書を発行します。Debian の Jessie の場合、APT リポジトリに backports を追加します。
# echo 'deb http://ftp.debian.org/debian jessie-backports main' \
>> /etc/apt/sources.list
# apt update
backports から certbot をインストールします。
# apt -t jessie-backports install certbot
次にファイアウォールで外部から80番(HTTP)ポートにアクセスできるようにしておきます。Let’s Encrypt のホストがドメインを確認する時に接続し、certbot が実行されているホスト、申請内容が正しいかチェックするためです。iptables/ufw、各種クラウドサービスのインバウンド設定は割愛します。
certbot を実行します。 -d
オプションでドメインを指定します。複数個を指定して OK です。
# certbot certonly --standalone -d example.com -d www.example.com
画面に表示される手順に従って、項目を入力していきます。メールアドレスは、証明書の失効の通知などが届く連絡先になります。ここでは、HTTPD を止めると書いてありますが、私の環境では無停止でいけました。HTTPD が立ち上がってたらcertbot が80番でListenしなくなった、とかそういう事かな。
端末に
IMPORTANT NOTES:
とメッセージが出て、ドメインや失効日が表示されたら正常終了です。次の場所に証明書が保存されます。
/etc/letsencrypt/live/example.com/*.pem
設定ファイルの server 項目を下記のように編集します。
# -- snipped --
server {
listen *:80;
server_name example.com *.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
ssl on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# -- snipped --
非SSL(http://~)経由でのアクセスをSSL経由のアクセスをするようリダイレクトしています。また、SSL のプロトコル指定では、脆弱性がある SSLv3 を抜いて無効にしています。 コンフィグテストを行なって問題がないようであれば、リロードします。
# /etc/init.d/nginx configtest
[ ok ] Testing nginx configuration:.
# /etc/init.d/nginx reload
必要に応じて、外部から443番ポートへのアクセスを許可すれば完了です。
Let’s Encrypt が発行してくれる証明書は90日間で失効します。定期的に更新する必要があります。 手動で行うには certbot コマンドに renew
オプションを与えます。このホストに登録されている Let’s Encrypt のすべての証明書の有効期限を調べ、失効日が近いものを更新してくれます。 試しに実行してみると
# certbot renew
Saving debug log to /var/log/letsencrypt/letsencrypt.log
-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/example.com.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal
The following certs are not due for renewal yet:
/etc/letsencrypt/live/example.com/fullchain.pem (skipped)
No renewals were attempted.
#
となりました。先ほど作ったばかりの証明書なので、ここは「リニューアルする必要なし」です。
手動更新はアレですので、cron に登録しておきます。
# echo 'certbot renew && /etc/init.d/nginx reload' > /etc/cron.weekly/certbot
# /etc/init.d/cron reload
以上です。
メインマシンはデータ保存用に3TBのハードディスクを4本積んでいます。前回換装してから3年半ほどが経ち、使用時間が軒並3万2000時間を越えている状態です。 去年の10月に新しいマシンを組んだ際にハードディスクをそのまま移し騙し騙し使っていたのですが、先週になってとうとう1台がシステム側から認識しない自体が発生しました。システムを再起動すると正常に認識し、特に物理的なエラーも論理的なエラーも発生していなかったものの、良いタイミングだと思い換装することにしました。
将来の換装のためと全12TBのストレージ領域中5.5TBまでデータの整理を行なっていたので、新しい3TBストレージを4本準備してRAID10を組んでみます。
下記のものを4台購入しました。
これらを使って標準的な RAID10 構成にしたいと思います。新規のストレージをマシンに接続するとそれぞれ sdc, sdd, sde, sdf と認識されているとします。
システムから認識される論理デバイスは /dev/md0
になる予定です。ストレージの利用率は50%のミラーリング+ストライピング構成です。
早速、それぞれのストレージを parted を使って初期化します。以降はほぼずっと root 権限での作業になります。
for t in /dev/sd{c,d,e,f}; do \
parted --script $t "mklabel gpt"; \
parted --script $t "mkpart primary 0% 100%"; \
parted --script $t "set 1 raid on"; \
done
GPT に設定し、パーティションを作成後、RAID フラグを立てています。初期化に成功すると、
$ ls /dev/sd*1
/dev/sdc1
/dev/sdd1
/dev/sde1
/dev/sdf1
パーティションに対応するデバイスファイルが生成されます。
Linux でソフトウェア RAID を実現するには、例に漏れず mdadm
を使います。インストールは次のとおり。
apt update
apt install mdadm
実行します。
mdadm --create /dev/md0 -v --raid-devices=4 --level=raid10 \
/dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdf1
/dev/md0
は作成したい論理デバイスファイル名です。 --level=raid10
で RAID10 を指定しています。最後にデバイスを指定しています。 こちらの記事によると、デバイスの順序によってどのデバイス同士が RAID1 ペアなのかの構成が変わるようですね。 コマンドを実行すると、最終確認をしてくるので y
と入力。
mdadm: array /dev/md0 started.
と表示されシェルに戻ってくれば設定終了です。あとはバックグラウンドで初回の resync 処理が走るので
watch -n 5 -d cat /proc/mdstat
で進捗状況を見ましょう。私の環境では処理が終わるまでに6、7時間を要しました。resync している最中でも /dev/md0 を使うことは可能ですがパフォーマンスが凄く落ちてしまうので、できるだけ放っておく方が無難。処理している間に、アレイ情報をファイルに書き出しておきます。これをしないと次回起動時にアレイを正しく扱ってくれません。
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
mdadm.conf の内容は下記のようになりました。
# mdadm.conf
#
# Please refer to mdadm.conf(5) for information about this file.
#
# by default (built-in), scan all partitions (/proc/partitions) and all
# containers for MD superblocks. alternatively, specify devices to scan, using
# wildcards if desired.
#DEVICE partitions containers
# auto-create devices with Debian standard permissions
CREATE owner=root group=disk mode=0660 auto=yes
# automatically tag new arrays as belonging to the local system
HOMEHOST <system>
# instruct the monitoring daemon where to send mail alerts
MAILADDR root
# definitions of existing MD arrays
ARRAY /dev/md0 metadata=1.2 name=**********:0 UUID=********:********:********:********
末尾にアレイ情報が追記されています。これで再起動しても正しくアレイを認識できるようになります。なお、resync 中に再起動をかけると処理が最初からやり直しで、自動的に実行もしてくれないので手動で実行する必要があります。 アレイとしてスキャンしたいデバイスを明示的に指定したりするには、 DEVICE
部分を指定します。
resync 処理が完了したら /proc/mdstat
の内容が
cat /proc/mdstat
Personalities : [raid10]
md0 : active raid10 sdd1[0] sde1[3] sdf1[2] sdc1[1]
5860268032 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]
bitmap: 0/44 pages [0KB], 65536KB chunk
unused devices: <none>
となります。 [UUUU]
の部分が「4本すべて正常」を表しています。異常が出た場合には、この U
が _
(アンダースコア)になります。例えば、sed1 に異常があった場合は [U_UU]
という表示になります。
論理デバイスの /dev/md0
が使える状態になったので、後は通常どおりフォーマットしてマウントします。
mkfs.ext4 /dev/md0
mkdir /mnt/raid10
mount /dev/md0 /mnt/raid10
私の環境の場合、 df -h
で5.5TBボリュームとして認識しました。
mdadm をインストールすると、自動的に cron に定期チェックのスクリプトが登録されます。
cat /etc/cron.d/mdadm
#
# cron.d/mdadm -- schedules periodic redundancy checks of MD devices
#
# Copyright © martin f. krafft <madduck@madduck.net>
# distributed under the terms of the Artistic Licence 2.0
#
# By default, run at 00:57 on every Sunday, but do nothing unless the day of
# the month is less than or equal to 7. Thus, only run on the first Sunday of
# each month. crontab(5) sucks, unfortunately, in this regard; therefore this
# hack (see #380425).
57 0 * * 0 root if [ -x /usr/share/mdadm/checkarray ] && [ $(date +\%d) -le 7 ]; \
then /usr/share/mdadm/checkarray --cron --all --idle --quiet; fi
毎週日曜日の午前0時57分に実行され、その日が毎月7日より前…つまり毎月最初の日曜日であれば、 checkarray
コマンドが実行されます。「平日は避けたいけど、実行は月に1回だけでいい」という設定を crontab では素直に書けないのでコメントで軽くdisってますねー。実行するトリガーを決めるのは実行したいもの各々によって違うはずなので、cron は今以上高機能化する必要もない気もします。一方で「日付や曜日、何分毎…といったある程度の時間の概念を扱っているし、可読性が落ちてバグも増えるから、このくらい標準機能で出来てもいいじゃない」と言いたくなる気持ちも分かります。
cron にも登録されている /usr/share/mdadm/checkarray
はスケジュールを考慮しており、最近チェックが走ったアレイはチェックをスキップします。手動で強制的にチェックを行いたい場合は次のコマンドを実行します。
echo check > /sys/block/md0/md/sync_action
また、停止したい場合は
echo idle > /sys/block/md1/md/sync_action
を実行します。リビルド中に sync_action に書き込んでもエラーになって弾かれるため注意が必要です。
様子は構築時同様に cat /proc/mdstat
で確認することができます。
update-initramfs
の実行処理が帰って来なくなるようになってブートシーケンスを触るのは毎回どきどきします。まあ、ブートデバイス周りだけだから GRUB 設定だけでいけるのかな…。先週からスマホカメラ、USBカメラ×2台、Kinect 360 と深度マップ撮影をやっていて、とうとう Kinect One の購入に至ったので書いておきます。
Amazon で Kinect One 本体と専用の電源・USBアダプターを購入しました。本体が1,4000円に対して電源・USBアダプターが5250円というのはなかなかのお値段バランス。
ちなみに、Kinect 360 (v1) と Kinect One (v2) の違いについては次のページが詳しいです。
環境によるのかもしれませんが、Kinect 360 (v1) はホストマシンと USB 接続するとそのまま利用できていました。今回の Kinect One (v2) では、一般ユーザ権限で Kinect を使うのに udev の設定が必要だったので書いておきます。
root 権限で /lib/udev/rules.d/90-kinect2.rules
を新規作成し、公式にある次の内容を記述します。
# this file belongs in /etc/udev/rules.d/
# ATTR{product}=="Kinect2"
SUBSYSTEM=="usb", ATTR{idVendor}=="045e", ATTR{idProduct}=="02c4", MODE="0666"
SUBSYSTEM=="usb", ATTR{idVendor}=="045e", ATTR{idProduct}=="02d8", MODE="0666"
SUBSYSTEM=="usb", ATTR{idVendor}=="045e", ATTR{idProduct}=="02d9", MODE="0666"
udev のルールを再認識させるためには、root 権限で
udevadm trigger
した後に、Kinect を使いたい一般ユーザ権限の再ログイン・Kinect の再接続をすれば良いようです。 システム側には3つのデバイスとして認識されているようですね。RGBカメラ、Dカメラ、マイクかな。
参考までに、dmesg
は次のとおりになっていました。
[2319025.138813] usb 2-1: new SuperSpeed USB device number 9 using xhci_hcd
[2319025.156457] usb 2-1: New USB device found, idVendor=045e, idProduct=02d9
[2319025.156464] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[2319025.156469] usb 2-1: Product: NuiSensor Adaptor
[2319025.156473] usb 2-1: Manufacturer: Microsoft Corporation
[2319025.159153] hub 2-1:1.0: USB hub found
[2319025.159284] hub 2-1:1.0: 1 port detected
[2319025.494131] usb 1-7: new high-speed USB device number 31 using xhci_hcd
[2319025.624314] usb 1-7: New USB device found, idVendor=045e, idProduct=02d9
[2319025.624321] usb 1-7: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[2319025.624326] usb 1-7: Product: NuiSensor Adaptor
[2319025.624330] usb 1-7: Manufacturer: Microsoft Corporation
[2319025.625176] hub 1-7:1.0: USB hub found
[2319025.625337] hub 1-7:1.0: 1 port detected
[2319026.724222] usb 2-1.1: new SuperSpeed USB device number 10 using xhci_hcd
[2319026.740876] usb 2-1.1: New USB device found, idVendor=045e, idProduct=02c4
[2319026.740883] usb 2-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=4
[2319026.740888] usb 2-1.1: Product: Xbox NUI Sensor
[2319026.740892] usb 2-1.1: Manufacturer: Microsoft
[2319026.740896] usb 2-1.1: SerialNumber: XXXXXXXXXXXX
lsusb でも3つのデバイスとして認識されています。
Debian ベースである LMDE2 (Linux Mint Debian Edition) では、公式リポジトリにあるのは v1 向けの libfreenect だけです。そこで、Open Kinect Project の Github リポジトリから libfreenect2 を入手してビルドします。システム要件やビルド方法は README.md に書かれているとおりです。依存しているライブラリのほとんどは APT でインストールすることができます。 一点だけひっかかったのは、
Install libusb. The version must be >= 1.0.20.
の部分。 LMDE2 公式リポジトリは2017年3月現在、libusb のバージョンが 1.0.19 しか提供されていないようです。そこで、
ここから libusb の 1.0.20 のソースコードをダウンロードし、make install
しました。なお、Ubuntu の場合だったら deb パッケージがこちらで配布されています。 freenect2 のソースコードにある depends ディレクトリの中身にある程度依存関係をアレしてくれるスクリプトが入っているので、そちらを参考にしてもいいかもしれません。
参考にならないであろう私がインストールした経緯はこちらです。今回 Kinect One を買って無駄にならなかった…ぞ!!!
RTAB-Mapは公式マニュアルを参考にインストールします。
今見たら ROS 版や Docker 版もあるんですね…、私は APT で全部揃えて cmake しました。
LMDE2 (Linux Mint Debian Edition) に、X 上でマウスジェスチャを実現する Easystroke を入れました。
Ubuntu では公式リポジトリに登録されているので APT で入りますが、LMDE、Linux Mint、Debian などはありません。なので、公式を参考に自分でビルドします。
次のコマンドで必要なものを入れます。
sudo apt-get install g++ libboost-serialization-dev libgtkmm-3.0-dev libxtst-dev libdbus-glib-1-dev intltool xserver-xorg-dev
github.com から clone してきて、 make
します。 ./configure
は必要ありません。
git clone git@github.com:thjaeger/easystroke.git
cd easystroke
make
git を入れていない場合は、
wget https://github.com/thjaeger/easystroke/archive/master.zip
unzip master.zip
でも良いと思います。
ビルドが通ったらインストール。
$ sudo make install
install -Ds easystroke /usr/local/bin/easystroke
install -D -m 644 easystroke.svg /usr/local/share/icons/hicolor/scalable/apps/easystroke.svg
install -D -m 644 easystroke.desktop /usr/local/share/applications/easystroke.desktop
for f in po/cs/LC_MESSAGES/easystroke.mo po/he/LC_MESSAGES/easystroke.mo po/zh_CN/LC_MESSAGES/easystroke.mo po/de/LC_MESSAGES/easystroke.mo po/ja/LC_MESSAGES/easystroke.mo po/ca/LC_MESSAGES/easystroke.mo po/hu/LC_MESSAGES/easystroke.mo po/pl/LC_MESSAGES/easystroke.mo po/it/LC_MESSAGES/easystroke.mo po/ru/LC_MESSAGES/easystroke.mo po/zh_TW/LC_MESSAGES/easystroke.mo po/el/LC_MESSAGES/easystroke.mo po/ko/LC_MESSAGES/easystroke.mo po/vi/LC_MESSAGES/easystroke.mo po/es/LC_MESSAGES/easystroke.mo po/fi/LC_MESSAGES/easystroke.mo po/fr/LC_MESSAGES/easystroke.mo; do \
install -D -m 644 $f `echo $f | sed "s|^po/|/usr/local/share/locale/|"`; \
done
上記のようなファイルが入っていきました。
インストールが終わったら早速実行。
easystroke
とコマンドを打つと、設定画面が表示されます。
「アプリケーションを追加」を押すと、xkill のようにカーソルが十字になって、設定したいアプリケーションの画面をクリックすることによって指定できます。
LMDE cinnamon の標準ファイラである nemo にジェスチャを登録した様子です。私の環境だけかもしれませんが、最初にジェスチャ・ボタンが「ボタン 2」(つまり中ボタン)になっていてちょっと迷いましたが、「設定」の「動作」にある「ジェスチャ・ボタン」で右ボタンに変更することができました。
また、Google Chrome や Firefox など、それぞれでジェスチャを行なっているアプリと干渉させたくない場合は、「高度設定」の「動作」の
Only enable easystroke for applications listed on ‘Actions’ tab
にチェックを入れておけば、Easystroke で設定したアプリ内だけで有効になります。
あとは、お好みで「トレイアイコンを表示」「Easystroke を自動起動」などを有効にしておくと快適に使えます。
前回の記事の後半、RTAB-Map で freenect2 が使えない…と四苦八苦していましたが、そもそも今回購入した Microsoft XBox 360 Kinect センサーは v1 と呼ばれる古いものでした。なので、v2 用の freenect2 で動かなくて当然という…!なんということでしょう… (:3っ )っ
その事実に深夜に気付いて RTAB-Map のメニューから freenect を有効にして使ってみると…
ちゃんと理想通りのスキャンができました!
ちゃんと Kinect 自身の位置も情報として取得できているようで面白いですねー。スキャンしながらリアルタイムで位置合わせをしているのも興味深いです。(でも精度はそこそこ) スキャン後に改めて「Post processing」で自動位置合わせ処理を施すこともできるようです。
RTAB-Map から PCD 形式で出力し、pcl_viewer で表示した動画を置いておきます。
中古で5000円(うちケーブル代が3000円くらい)にしてはよく撮れているんじゃないでしょうか。
下記は Cloud Compare でノイズ除去、セグメンテーション調整(点群を切ったり貼ったり)、SSAO フィルタを有効にしてみた状態のスクリーンショットです。
近付いてみなければそれっぽい!
そういえば、
GoogleのAR技術Tangoに世界初対応のスマホ「Phab 2 Pro」がついに日本発売 – GIGAZINE
という記事も出ていることですし、もっとポイントクラウド関連が賑っていけばいいですね! 早速、RTAB-Map と連携させて空間スキャンしてる方がいらっしゃいました。
せっかく kinect v2 用の freenect2 をビルドして組み込んだので、
コイツを新品で注文してしまいました。TOF方式になって精度も(ホストの要求スペックも)上がっているらしいので楽しみ!
昨日、Amazon で中古で売ってあったMicrosoft Xbox 360 Kinect センサーが届いたので、早速 Linux で使ってみました。
OS は Linux Mint の Debian Edition です(略して LMDE )。 Ubuntu などの Debian 系の Linux なら同じ手順でいけるかもしれません。
とりあえず APT の公式リポジトリで freenect
(オープンソース版の Kinect ライブラリ)で検索すると libfreenect-bin
というパッケージがあったのでインストール。
sudo aptitude install libfreenect-bin
コマンドがいくつか追加されました。
$ sudo dpkg -L libfreenect-bin
--- snip ---
/usr/bin/freenect-cppview
/usr/bin/freenect-glpclview
/usr/bin/freenect-glview
/usr/bin/fakenect
/usr/bin/fakenect-record
--- snip ---
Kinect の電源を入れて、USB でホストと接続します。 dmesg
の様子は次のとおり。
$ dmesg
[1969221.943934] usb 1-7.2.2: new full-speed USB device number 98 using xhci_hcd
[1969222.056332] usb 1-7.2.2: New USB device found, idVendor=045e, idProduct=02b0
[1969222.056334] usb 1-7.2.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[1969222.056336] usb 1-7.2.2: Product: Xbox NUI Motor
[1969222.056337] usb 1-7.2.2: Manufacturer: Microsoft
[1969261.058907] usb 1-7.2.1: new high-speed USB device number 99 using xhci_hcd
[1969261.164501] usb 1-7.2.1: New USB device found, idVendor=045e, idProduct=02ad
[1969261.164503] usb 1-7.2.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[1969261.164504] usb 1-7.2.1: Product: Xbox Kinect Audio, © 2011 Microsoft Corporation. All rights reserved.
[1969261.164505] usb 1-7.2.1: Manufacturer: Microsoft
[1969261.164505] usb 1-7.2.1: SerialNumber: ****************
[1969262.592523] usb 1-7.2.3: new high-speed USB device number 100 using xhci_hcd
[1969262.699765] usb 1-7.2.3: New USB device found, idVendor=045e, idProduct=02ae
[1969262.699766] usb 1-7.2.3: New USB device strings: Mfr=2, Product=1, SerialNumber=3
[1969262.699768] usb 1-7.2.3: Product: Xbox NUI Camera
[1969262.699768] usb 1-7.2.3: Manufacturer: Microsoft
[1969262.699769] usb 1-7.2.3: SerialNumber: ****************
[1969263.711841] gspca_main: v2.14.0 registered
[1969263.712338] gspca_main: kinect-2.14.0 probing 045e:02ae
[1969263.712389] usbcore: registered new interface driver kinect
[1969716.950137] gspca_main: kinect-2.14.0 probing 045e:02ae
なんだかそのまま認識しているみたいですね!追加されたコマンドを実行してみます。
freenect-glview
ウィンドウが表示され、左に深度マップ、右に可視光線カメラ映像が表示されます。
上は左の部分だけのキャプチャです。意外にもすんなりと深度が出てますね! さすがにハードウェアで処理していることもあり、動きも滑らかです。
次に PCL (Point Cloud Library) を使ってるっぽいコマンドを実行してみます。
freenect-glpclview
リアルタイムに点群化されたものが見れました。これは楽しい…。
2016年までの記事では ROS 関係のパッケージを入れている方が多いようですが、今はなくてもいいのかな。
ここまで拍子抜けするほど順調だったので、調子に乗って部屋のスキャンをしてみるべく、RTAB-Map を導入しようとしました。流れとしては
cmake .
で LibUSB_LIBRARY がないとかで失敗。CameraFreenect2: no device connected or failure opening the default one! Note that rtabmap should link on libusb of libfreenect2. Tip, before starting rtabmap: "$ export LD_LIBRARY_PATH=~/libfreenect2/depends/libusb/lib:$LD_LIBRARY_PATH"
と出てカメラ初期化失敗。/usr/lib/x86_64-linux-gnu/
配下に(多分)古い libusb と思われるものを発見、移動したのち sudo ldconfig
。cmake
からやり直し、状況変わらず。ていうかそもそもハードが v2 に対応してないパターンじゃ…よ、よし寝よう (:3っ )っ
$ sudo make install
[ 3%] Built target generate_resources_tool
[ 89%] Built target freenect2
[100%] Built target Protonect
Linking CXX shared library CMakeFiles/CMakeRelink.dir/libfreenect2.so
Install the project...
-- Install configuration: "RelWithDebInfo"
-- Installing: /usr/local/lib/libfreenect2.so.0.2.0
-- Installing: /usr/local/lib/libfreenect2.so.0.2
-- Installing: /usr/local/lib/libfreenect2.so
-- Installing: /usr/local/include/libfreenect2
-- Installing: /usr/local/include/libfreenect2/frame_listener_impl.h
-- Installing: /usr/local/include/libfreenect2/frame_listener.hpp
-- Installing: /usr/local/include/libfreenect2/registration.h
-- Installing: /usr/local/include/libfreenect2/logger.h
-- Installing: /usr/local/include/libfreenect2/packet_pipeline.h
-- Installing: /usr/local/include/libfreenect2/libfreenect2.hpp
-- Installing: /usr/local/include/libfreenect2
-- Installing: /usr/local/include/libfreenect2/export.h
-- Installing: /usr/local/include/libfreenect2/config.h
-- Installing: /usr/local/lib/cmake/freenect2/freenect2Config.cmake
-- Installing: /usr/local/lib/pkgconfig/freenect2.pc
$ sudo make install
Making install in libusb
make[1]: Entering directory '/tmp/libusb-1.0.20/libusb'
make[2]: Entering directory '/tmp/libusb-1.0.20/libusb'
make[3]: Entering directory '/tmp/libusb-1.0.20/libusb'
/bin/mkdir -p '/usr/local/lib'
/bin/bash ../libtool --mode=install /usr/bin/install -c libusb-1.0.la '/usr/local/lib'
libtool: install: /usr/bin/install -c .libs/libusb-1.0.so.0.1.0 /usr/local/lib/libusb-1.0.so.0.1.0
libtool: install: (cd /usr/local/lib && { ln -s -f libusb-1.0.so.0.1.0 libusb-1.0.so.0 || { rm -f libusb-1.0.so.0 && ln -s libusb-1.0.so.0.1.0 libusb-1.0.so.0; }; })
libtool: install: (cd /usr/local/lib && { ln -s -f libusb-1.0.so.0.1.0 libusb-1.0.so || { rm -f libusb-1.0.so && ln -s libusb-1.0.so.0.1.0 libusb-1.0.so; }; })
libtool: install: /usr/bin/install -c .libs/libusb-1.0.lai /usr/local/lib/libusb-1.0.la
libtool: install: /usr/bin/install -c .libs/libusb-1.0.a /usr/local/lib/libusb-1.0.a
libtool: install: chmod 644 /usr/local/lib/libusb-1.0.a
libtool: install: ranlib /usr/local/lib/libusb-1.0.a
libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/sbin" ldconfig -n /usr/local/lib
----------------------------------------------------------------------
Libraries have been installed in:
/usr/local/lib
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,-rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
/bin/mkdir -p '/usr/local/include/libusb-1.0'
/usr/bin/install -c -m 644 libusb.h '/usr/local/include/libusb-1.0'
make[3]: Leaving directory '/tmp/libusb-1.0.20/libusb'
make[2]: Leaving directory '/tmp/libusb-1.0.20/libusb'
make[1]: Leaving directory '/tmp/libusb-1.0.20/libusb'
Making install in doc
make[1]: Entering directory '/tmp/libusb-1.0.20/doc'
make[2]: Entering directory '/tmp/libusb-1.0.20/doc'
make[2]: Nothing to be done for 'install-exec-am'.
make[2]: Nothing to be done for 'install-data-am'.
make[2]: Leaving directory '/tmp/libusb-1.0.20/doc'
make[1]: Leaving directory '/tmp/libusb-1.0.20/doc'
make[1]: Entering directory '/tmp/libusb-1.0.20'
make[2]: Entering directory '/tmp/libusb-1.0.20'
make[2]: Nothing to be done for 'install-exec-am'.
/bin/mkdir -p '/usr/local/lib/pkgconfig'
/usr/bin/install -c -m 644 libusb-1.0.pc '/usr/local/lib/pkgconfig'
make[2]: Leaving directory '/tmp/libusb-1.0.20'
make[1]: Leaving directory '/tmp/libusb-1.0.20'
わかりやすい。
heroku 上で Rails アプリが動くところまでざっと見てみました。てか、heroku の前にまともに Rails の勉強しなきゃ。
ほほう。
上の heroku の動画で vagrant を使っていて、docker や virtualbox はコマンドラインからガリガリ使っていたけど、vagrant は名前くらいしか知らなかったのでちょっとメモしておく。
うんうん、virtualbox のイメージも空から降ってくるべきですよね。
siren を mruby から MRI に移植してるんだけど、どうせなら SWIG で OpenCASCADE ラッパーな ruby-occt を作ってゴニョゴニョすべきかなと思いつつ
を見てたんだけど、PythonOCC では大量の SWIG 用ラッパーファイルで頑張ってらっしゃる。*.i
だけなら流用できるのかなー、でも python なんちゃらって文字があるぞ。めんどいなあ…。そもそも siren は OCCT の無駄に多いクラスや機能を適度にまとめて使えることが利点だから、フル機能の OCCT を使いたいんだったら PythonOCC やネイティブな OpenCASCADE を使えばいいと思ってたりして悩みどころです。
前々回と前回の OpenCV まわりに関連して、とうとう Kinect を購入しました。Kinect for Windows じゃなく 360 でもとりあえずは研究に使えるらしいし、ドライバや SDK が厳格そうな Windows で開発するわけでもない、360なら価格も中古で低価格程度ということで Amazon で5000円の中古をポチ。ヤフオクで2000円弱で出品されてるんですが、動作保証と電源ケーブル同梱版、手続きの早さで割高だけど Amazon のを購入しました。
月曜日(明日)届く予定です。楽しみ。Kinect の到着を待つ間、Python で書いていた(というかコピペしてた)ステレオマッチング処理を Ruby で書き直そうと思ってドキュメントを見てたら ruby-opencv には StereoSGBM()
がない模様。
こんな時に颯爽と実装してプルリクをぶん投げられる人になりたい…。
PS3、楽天 KOBO、NEC LifeTouch NOTE、Lavie Tab W 708 など使ってないデバイスを処分中。ハンディカムや液タブも売り出そうか悩み中です。