DreamerDreamのブログ

夢想家の夢です。〜揚げたてのモヤっとしたものをラフレシアと共に〜

Djangoの使い方⑪Djangoからムームーメールで送信する

 前回はサイトをSSL化しました。

dreamerdream.hateblo.jp

 

さて、Djangoにはユーザー管理機能が付属していて、すごいのはurls.pyに

urlpatterns = [
  path('accounts/', include('django.contrib.auth.urls')),
]

とするだけで、エンドポイント

accounts/login/ [name='login']
accounts/logout/ [name='logout']
accounts/password_change/ [name='password_change']
accounts/password_change/done/ [name='password_change_done']
accounts/password_reset/ [name='password_reset']
accounts/password_reset/done/ [name='password_reset_done']
accounts/reset/<uidb64>/<token>/ [name='password_reset_confirm']
accounts/reset/done/ [name='password_reset_complete']

これらのアカウント管理機能が全て有効になることです。

 

もしパスワードを忘れた場合には登録メール宛にパスワードリセットメッセージが届く。

そんな便利機能も標準で搭載していますが、メール機能を利用するには当然Django側にメールの設定をする必用があります。

 

<参考>

[Python] Django 管理サイトのパスワードリセット機能を有効化する - Qiita

 

調べるとGmailでの設定例が多いのですが、ムームーメールの設定サンプルがありません。少々手間取ったので後の人のためにも備忘録として残します。

ムームーメールはムームドメインで取得した独自ドメインに対して付帯できるメールサービスで、アドレスは作り放題!なんと1ヶ月50円(1年600円)という驚異的な安さのメールサービスです。↓

(機能が違うので比較として適切かは疑問ですが、例えばConohaのメールサーバーなら500円/一ヶ月なので独自ドメインでメールを作るだけならかなりのお得感。) 

 

<参考>Gmailの設定はこちらが参考になります。

[Python] Django 管理サイトのパスワードリセット機能を有効化する - Qiita

 

ムームーメールの送信設定で必用なのは

  • メールアカウント
  • メールパスワード
  • メールサーバー(SMTP)名
  • サーバーポート

で、これらを[アプリ名]/settings.pyに書く事で機能します。

EMAIL_USE_SSL = True
EMAIL_HOST = 'smtp.muumuu-mail.com'
EMAIL_HOST_USER = '[ムームーメールユーザーID]'
EMAIL_HOST_PASSWORD = '[ムームーメールパスワード]'
EMAIL_PORT = 465
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'

参考ページと違うのは

  • EMAIL_USE_TLS ではなく、EMAIL_USE_SSLであること
  • ポート番号が違う事

です。

TLSSSLの違いは、SSLの発展形がTLSらしいのですが正直よくわかりません。

 

とりあえずこれで送信できます。が、そのままパスワードリセット機能でメール送信すると

送信先が「webmaster@localhost.~~」と奇妙なアドレスになります。

これの変更はsetting.pyから

DEFAULT_FROM_EMAIL = '[任意のアドレス]'

とすることで変更できます。

 

追記:ムームーメールをGmailに送信すると、Gmail側で「迷惑メール」フォルダーに分類されてしまう問題の解決策↓ 

dreamerdream.hateblo.jp

 

 

 

 

f:id:DreamerDream:20190222142847p:plain

ちなみに、これはモーモーメール

 

。。。。。。。orz今回は以上です。 

Djangoの使い方⑩サイトをhttps(SSL)サイトにする

以前記事から随分と時間が経ってしまいましたが、DjangoでWebサイトを構築しました。

dreamerdream.hateblo.jp

 

 

Webサイトの紹介はしませんが、今回はそのDjangoで作ったWebサイトをhttpsSSL)化します。

f:id:DreamerDream:20190221105409p:plain

 

ここ最近ではセキュリティーの関係でhttpプロトコルでのサイト接続は推奨されておらず、httpsSSL)として公開するのが望まれています。

 

しかしながら、https化するには「証明書」というものの発行が必用で、その証明書は結構高価なものなのです。

無料でなんとか利用出来ないか?と調べると

1.自前で用意する「オレオレ証明書」というものを利用する

2.無料の証明書発行機関を利用する

という2通りの方法があることが解ります。

1の方法は以前にラズパイサーバーで試しました。

dreamerdream.hateblo.jp

ですので、Apacheでのssl設定方法はなんとなーく解っているつもりでしたが・・・これがなかなか苦戦しました。

 

ひとまずしなければいけないことは

SSLが使う443ポートにアクセスできるようにすること。

これらの設定が済んでいることとして話を進めていきます。

SSLは無料証明書発行機関「Let's encrypt」を利用させていただきます。

Let's encryptは無料で90日間のSSL証明書を発行してくれる機関で、セキュアな通信を推進している有志の団体が提供してくれているものです。

Let's Encrypt - Wikipedia

え?90日間だけ?

と思われるかもしれませんが、実際には自動更新するというスクリプトを組んで運用する場合が多いようで、更新さえ出来ていれば半永久的に使える。という便利なもので、その更新さえも自動化出来るパッケージが提供されています。

今回はその便利で定評なcertbotクライアントをインストールして証明書の発行から更新まで行うことにします。

 

<参考リンク>

CentOS 7 + Apache 2.4 に Let&#8217;s Encrypt の証明書を導入する手順 | WEB ARCH LABO

とりあえずepelパッケージをインストール

yum install epel-release

したけど

No package epel-release available.

と怒られた?

ん?epel?何か聞覚えがるなー

と思ってブログを調べてみたら

 

dreamerdream.hateblo.jp

なんと!以前にここでインストールしてました!

んで、通常使用しない設定をしていたのでそこを変更。

nano /etc/yum.repos.d/epel.repo

の中身のenabled=0と上の記事でしていたのを

enabled=1

と変更するだけ。

 

epelがインストールされていたので、cerbotをインストール

$ sudo yum install certbot python-certbot-apache

f:id:DreamerDream:20190219133246p:plain

Complete!

無事にインストール出来ました!

 

では、早速証明書を取得しましょう。

sudo certbot certonly --webroot -w [ルートディレクトリ] -d [サイトアドレス]

 とするらしいです。

メールアドレス? 入力[メールアドレス]

同意書 同意なら[A]

メール送信? 必用なら[Y]

と入力すれば証明書が発行されー

To fix these errors, please make sure that your domain name was
entered correctly and the DNS A/AAAA record(s) for that domain
contain(s) the right IP address.

てないっ!?????

 

サクッと通るはずが何かエラーが出ました。

え?なんで??

 

調べましたところ、

<参考>

話題の無料SSL証明書!Let's Encryptで証明書の取得に失敗したときに確認すること | それからデザイン スタッフブログ

要は、「ルートディレクトリ」に指定したとこにcertbotが.well-knownというディレクトリを作って、その中身をWeb経由で発行機関が確認するそうな。

なるほど!ルートディレクトリは指定したけど、サイトがDjangoなどのフレームワークで運用してる場合、通常は不要なディレクトリにアクセス不可とするから(そういう設定にしてるから)アクセスして確認したいファイルにアクセスが出来ないってことですね!

よく見るとcertbotの吐いたレポートに

Domain: [アドレス]
Type: unauthorized
Detail: Invalid response from

http://[アドレス]/.well-known/acme-challenge/e(何らかの暗号キー)ep8:

と出ています。

通常の静的WebページであればApahe設定でDocumentRoot以下に.well-known/acme~~~というディレクトリを作れば外部からアクセスできるので問題無いようです。 

 

ということで、[サイトURL]/.well-known/~~ディレクトリにアクセス出来るようにしましょう。

dreamerdream.hateblo.jp

以前に書いたconf設定に任意のディレクトリを作り+.well-knownというディレクトリにアクセス許可を与えます。

(/var/www/django に指定した場合)

(上ブログのex.</etc/httpd/conf.modules.d/extra/vhost-draemon.conf>に 追記した場合)

Alias /.well-known /var/www/django/.well-known
<Directory /var/www/django/.well-known>
Require all granted
</Directory>

 

上の発行コマンド[ルートディレクトリ]に.well-knownを除いたディレクトリ名を 指定して実行!

sudo certbot certonly --webroot -w/var/www/django/ -d [アカウント]

とすると

f:id:DreamerDream:20190219203058p:plain

 今度は成功です!

 

sudo ls -l /etc/letsencrypt/live/[アドレス]

とすると証明書含む5種類のファイルが確認できます。

  • cert.pem
  • chain.pem
  • fullchain.pem
  • privkey.pem
  • README

これらはシンボリックリンクで、証明書が更新されても名前が変わらないからそのままApacheに一度これを設定すれば更新の度に書き換えなくても良い仕様なのだそうです。

 

/etc/httpd/conf.d/ssl.conf

に先ほど確認した証明書を追記します。ファイルがなければopen-sslの導入が必用です。(オリジナルの項目は念のためコメントアウトで残しておきます)

SSL設定ふぁいるに上で出来たシンボリックリンクを設定します。

</etc/httpd/conf.d/ssl.conf>

#SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateFile /etc/letsencrypt/live/[サーバーアドレス]/cert.pem

 

#SSLCertificateKeyFile /etc/pki/tls/private/localhost.key

SSLCertificateKeyFile /etc/letsencrypt/live/[サーバーアドレス]/privkey.pem

 

#SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt

SSLCertificateChainFile /etc/letsencrypt/live/[サーバーアドレス]/chain.pem

 

OK!

これでhttps:[サーバーアドレス]で接続しますと!

f:id:DreamerDream:20190220121647p:plain


 

 

えええ???

 

調べて見たらわかりましたよ。

Djangoで開発したWebアプリケーションをLet's EncryptでSSL対応する(Apache編) | Gyobot Blog

 

SSLで公開するバーチャルホストの設定ファイル(上の.well-knownディレクトリの公開設定をしたconfファイル)にSSLEngineを追加する必用があったようです。

ex.</etc/httpd/conf.modules.d/extra/vhost-draemon.conf>

まずはポートを80からSSLポートの443に変更して

<VirtualHost *:443>

以下を追加

SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/[サーバーアドレス]/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/[サーバーアドレス]/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/[サーバーアドレス]/chain.pem

以上!

https://〜〜〜にアクセスすると〜、ちゃんと通りました!

 

 

じゃあ今までのhttpアクセスで動いていたサイトは紹介サイトなどのリンクがあれば全部書き直さないといけないのか?というとhttps接続先へ「リダイレクト」という方法で転送することが出来ます。

方法はHTMLファイルに書いてクライアントから飛ばす方法とApacheで設定してサーバーで飛ばす方法がありますが、サーバーからのほうが確実。(クライアントに委ねる場合はブラウザの環境次第では飛ばないことがあるらしい。)

ですので、

Apacheに同じアドレスで80ポートで接続できるhttp接続してきた時用のconfファイルを作って(静的ページでOK)

RedirectMatch 301 .* https://[サーバーアドレス]/

と追記するだけ。これでこれまでのhttpのトップページに接続してきたクライアントをhttpsに回せます。

 

 

今度は更新処理

SSL証明書の有効は90日なので更新手続が必用になります。

更新は期限切れの30日前から出来るようで、一度証明書を取得した段階で

sudo certbot renew

をすると

No renewals were attempted.

と怒られます。

 

ですのでの「ドライラン」を実行して、実際には更新せず、更新できるか?を確認しましょう。 

sudo certbot renew --dry-run

すると

All renewal attempts failed. The following certs could not be renewed:

 

というエラーが吐かれました。これはいけない!

更新時用には80番ポートへアクセスするようなのでディレクト

</var/www/django/.well-known>

が見れるように忘れずApacheからconfの設定しておく必用があるようです。

 

更新時には作成時と同じ80ポートへアクセスしてくるので、conf設定で

Alias /.well-known /var/www/django/.well-known
<Directory /var/www/django/.well-known>
Require all granted
</Directory>

RedirectMatch 301 .* https://[サーバーアドレス]/

と、リダイレクト設定よりも先に.well-knownへのアクセスを許可するように設定します。

これでドライランを実行して

Congratulations, all renewals succeeded. The following certs have been renewed:

と表示されれば成功です!

 

 

と、・・・・ここまでしてから気が付いた

DjangoアプリをSSLに設定する場合、

同じアドレスでhttpを使う予定が特に無いなら、最初からCertbotがhttpアクセスしてきた時に.well_knownパスを読み出すためだけの静的なページをApacheで1つ設置するだけでいいってことだったんだ!

なーんだ。こんなに苦労しなくてよかったんだ。。orz

 

 

さて、気を取り直して自動更新の設定をします。

定期的な動作といえばcronですね。

sudo crontab -e

としたいところだけど

コチラのブログの警告のように

crontab -e は「絶対に」使ってはいけない - ろば電子が詰まつてゐる

間違ってeの隣のrで

crontab -r

としてしまうと、何の警告も成しにcronが消えるという取り返しのつかない事になるらしい。いろいろな予防策があるけど、

sudo crontab -l > crontab.back

としてバックアップを取っておくと良い。

これでホームディレクトリにバックアップが保存される。

リストアするには

sudo crontab crontab.back

これだけで安全対策になる。

このクセをつけておくと最悪の場合でも一度でもバックアップ取った状態にまではリストアできる。

cronには先のブログほぼそののまま、 

#certbot Let's encrypt renew
00 01 * * 2 root /usr/bin/certbot renew --post-hook "service httpd restart"

 

現在、certbot-auto ではなく、certbotになっていることに注意。

ひとまずこれで記述して期限切れの水曜日1時に更新できているか?確認してみることにする。

 

<追記>

上のように設定してたけど、もともとroot権限でcronする設定なので、

00 01 * * 3 /usr/bin/certbot renew --post-hook "service httpd restart" 2> /var/log/lets_encrypt_error.log &

として、追加で動作確認のためエラーログを残すようにした。

期限内に更新しようとしたら、ログに

Cert not yet due for renewal

と出ていたので一応正常にcron動作はしている様子。

 

 

なぜ1週間ごと?

certbotはあまり頻繁に更新しちゃダメだから期間を開けたいんだけど、1ヶ月ごとだと、もしサーバーの再起動とかでタイミングが悪いと更新できない期間があるかもしれないからとりあえず1週間ごとが妥当かな?それと更新時にネットワークエラーで更新できてなければ何度かチャンスがあるし他のエラーでもある程度対処出来るだろうし、という考えです。

 

今回は以上です。

 

 <追記>実際の更新時にエラーメールが来ました。

dreamerdream.hateblo.jp

 

 

<追記>SSLサイトにしたら必ず安全!

ということもありません。セキュリティーレベルのチェックをしてより安全な設定を施しましょう↓

dreamerdream.hateblo.jp

 

3Dスキャンの方式いろいろ

3Dプリンターと同じように3Dスキャナも発展途中の技術ですので「これがカンペキ!」といったものは無く、スキャンにも様々な方法があります。

f:id:DreamerDream:20190115094725p:plain

 

 

 

<ストラクチャードライト>

3Dスキャンの際に一定のパターンの光を照射して距離を計測する3Dスキャン方法です。


Ajile Color 3D Scanning

 

iPhoneXにフロントカメラとして搭載されているTrueDepthカメラもこの方法で奥行きを取得しています。


iPhone X TrueDepth camera video from apple

 

TrueDepthカメラ作動中に赤外線カメラで見るとストラクチャードライトが見えます。なんと3万以上の赤外線ドットを照射しているようですが赤外線なので見えません。


Using An Infrared Camera To Show How Face ID Works

  

<ToF>

Time of Flightと呼ばれる方式で、一定周波数の信号を光(赤外線)に乗せて照射して帰ってくるまでの時間を計測する方法です。

モジュールとしては1点のみ計測できるものと、

ToFカメラとしてモジュール化されたものがあります。

かなり精度の良いスキャンが出来るようで、時期iPhoneに搭載か?と噂されましたが、スマホに搭載するにはまだ技術的に早いようで見送られています。

 

<レーザー>

ラインレーザーによる深度の計測方法で、レーザー以外特別な装置を必用としないため自作の3Dスキャナによく使われる方法です。

dreamerdream.hateblo.jp

 

<複数台のカメラ>

カメラを2つ使って得られた画像から3D化する方法です。


Instant 3D Photography (Extended teaser)

 

複数台のカメラで3D化する方法(設備)です。

 
This Device Can 3D-Scan Your Body In 0.1 Seconds

 

<カメラ1台と背景マップ>

こちらの3Dスキャンアプリはスマホのカメラを利用したもので、スキャンする対象物をスキャン用マップの上に載せるという方法でスキャンします。

dreamerdream.hateblo.jp

 

 

 

一言で3Dスキャンといっても色々な方法がありますね。

実際にAmazonで購入可能な3Dスキャナは↓を参考にどうぞ

dreamerdream.hateblo.jp

 

人気のある3Dプリンター、2019年おすすめの3Dプリンターはコチラ

2019年、新年あけましておめでとうございます。

 

f:id:DreamerDream:20190111141503p:plain

 

メンテナンス情報も含め多くの人に支持されている商品はトラブル時のメーカーサポートや会社の存続にも希望が持てますので購入の参考になると思います。

そこで、購入者レビューからオススメランキングをご紹介します。

 

 

ますばオススメ第一位!

55件のレビューで評価が4.3と非常に評価の良い商品です。

50%を超える☆5評価!

サポート体制が好評のようで「これなら安心だろう」と購入された方が多いように見受けられます。

49,999円と5万を切る価格ながら金属ボディーというのも素晴らしい!剛性が期待でき、プリント性能も好評です!

剛性があるということは、スピードのあるプリントが期待できます。(↓過去記事参考)

dreamerdream.hateblo.jp

 

第二位

価格は執筆時点では在庫切れのため見えませんでした。

90%超えの文句無し☆5評価が付いています。

QIDIの3Dプリンターは最新モデルのこちらだけでなく、複数の改良モデルが出ており、そのどれもが多くの方に購入されておりますので実質1位としても良いと思われる商品です。

ボックス型の金属製フレームは外気温の影響から造形物を守り本体剛性を兼ね備えているためプリント物の精度に期待が持てます。

こちらもサポート体勢にかなり高評価です!

お金が許されれば僕も欲しい一品

 

 

3位以降

26,099円のこちら組み立て式のアクリル製3Dプリンター!

エントリーモデルとしては文句無しの低価格商品で、サポートも好評です。61件のレビュー数があるように使用者が多いので、組み立て式で情報が多いのは嬉しいですね。

 

 

残念ながらリンクイメージがありませんが、箱形金属筐体であり、3Dプリンターとしても、レーザー彫刻機としても使えるという欲張り仕様で83,900円!

サポート体勢が良く、ユーザーとの距離感が近いことに好評を持てるというレビューもあります。

 

アクリルとアルミを用いた筐体で23,580円と価格を抑えながらも精度も求め、モーターなども地道に改良するといったメーカー側の努力が見て取れます。

売りっぱなしではなく、サポートも好評のようです。

低価格ながら機能も申し分無い商品です。

 

 

2位のQIDIシリーズのデュアルヘッドモデル版です。

89,900円と9万以下で金属フレームにデュアルヘッド仕様という素晴らしい仕様です。

デュアルヘッドの魅力は2種類のフィラメントを出力できるので水溶性サポート材を使った精度の高い出力が出来ることです。

QIDIのモデルをリピートで複数購入されている方からのレビューもあるように精度は申し分無い製品のようです。

 

 

アルミ合金のフレーム型22,999円のこちらの組み立て式モデル。

いろいろ自分で弄りたい人には良い商品でしょう。

マニュアルが解り辛いというレビューもあります。

 

 

オシャレなオフィスに似合いそうな可愛いモデルの静音設計

レビュー数は37件と多めですが、サポートは音信不通という不安要素もあります。

 

 

読者の皆様が良い商品に出逢えますように。

 

dreamerdream.hateblo.jp

 

あなたはCMに騙されない自信がありますか? CMによるイメージ戦略とは

イメージ戦略は「消費者に勝手に商品が良いように思わせる戦略」です。

CMにより、我々が勝手に思い込まされて買っているであろう商品をいくつかピックアップしてみます。

f:id:DreamerDream:20181228152706p:plain

 

このページを見終えた後には少しTVのCMの見方が変わりますよ。

 

 

 

サイクロン式掃除機


2006年CM ダイソン 吸引力の変わらない、ただひとつの掃除機

 以前、ダイソンの掃除機について書きました。

dreamerdream.hateblo.jp

ダイソン掃除機のCMは「吸引力が変わらない」「他のどの掃除機よりも確実にゴミを吸い取ります」という文句をCM注意入れています。

「吸引力が変わらない」の秘密は上のブログの通りです。

「他のどの掃除機よりも確実に」の根拠となる比較メーカーのデータは公開されていませんし「他のどの<<対象条件>>掃除機」という大事な一文を含んでいないので「嘘」とも言えません。

これらのイメージCMで消費者は「じゃあ吸引力が強いんだ!」と勝手にイメージさせられています。

 

 

サプリメントのCM

サプリメントはイメージ戦略のとても強い商品です。

「医薬品」ではなくあくまで栄養補助「食品」として売らなければいけませんのであの手この手用いられています。多くは「体験談」として場合によってはタレントを起用して「あくまで個人的な意見ですよ」というのが上等手段です。

その他にも以下のような手法があります。

例1)ブルーベリーアイ


【わかさ生活】ブルブルくん&アイアイちゃんのブルーベリーアイCM全集【全22種】

こちら、ブルーベリーのキャラクターが可愛いCMです。

さてこのCMの中でブルーベリーの効能は出て来るでしょうか?

答えは「いいえ」です。「うそ?」と思うかもしれませんが、もしCMに体験談ではなく効能が出て来ていたらそれは薬事法違反です。

目の大きなブルーベリーのキャラクターによって目力を強調したものですが、CMの中では一言も「目に良い」とか「目が良くなる」とは言っていません薬事法に引っかかるので言ってはイケナイのです。

サプリの中のアントシアニンの含有量は出て来ますがそれだけです。アントシアニンは目の細胞の中でも「明暗」に反応するロドプシンという物質に関わるものですから夜目が効きやすくなるのは確かですが、だからといって決して日常で見るための目が良くなるということはありません。 

我々が常識的に知っている目が良くなる=ブルーベリーというイメージを巧みに使ったCMです。

 

例2)グルコサミン


世田谷自然食品『グルコサミン+コンドロイチン』 CM 【舞の海】 2013/03

舞の海さんもぐるぐる体操」

はい、体操しているだけです。

これも「グルコサミン=膝に良い」という消費者の勝手なイメージを利用しただけのCMです。

グルコサミンは膝の軟骨を形成する元となる物質だけど体内ではブドウ糖から合成されるものですので、経口摂取すると一旦ブドウ糖まで分解され再び軟骨合成されないと使えないのです。実際どの程度膝の軟骨になるかと問われると答えられる人は居ないでしょう。「世田谷生まれの・・・」グルコサミンがどこで生まれようが関係無いです。

 

 

 ③低反発寝具


スリープテクノロジー™ 体圧分散

これも一時期流行りましたね。

不思議な低反発素材を使ったもので、なんとあのNASAが開発した素材です!

NASAが開発した」と聞くと消費者は「なんかすごそう!効果がありそう!」という勝手なイメージを抱きますよね。

低反発素材はNASA宇宙飛行士を宇宙船の衝撃から守るために開発した素材であって寝具用ではありません。

 

④栄養ドリンク


'79-89 栄養ドリンクCM集 リポビタンD

リポビタンDといえば「タウリン1000mg配合」ですよね。

よく考えてみてください。この1000mgって多いですか?少ないですか?

タウリンは人体で合成され、体重60Kgの人の場合約60g体内に存在するとされています。

1000mgって、単位を変えれば1gです。

タウリン1g配合」と書かれていたら凄そうに聞こえませんよね?これは凄そうに聞こえる数字のマジックです。

 

CMは嘘?

ここまでご覧になられた方は

「CMで嘘なんか出したらアウトなんじゃないの?」

という疑問が出て来ると思います。

極端に言えば「イメージです」や「個人の感想です」という一文をどこかに入れれば良いことになっています。

コーヒーに入れるフレッシュもCMでは木工ボンドが使われていましたし、ホイップリクームはシェービングジェル、グラスに食器用洗剤を入れてビールの泡立ちを良く見せる。パンケーキには防水スプレーでシロップが染み込まないようにする。

「フードコーディネーター」によるこういった手法はありとあらゆるCMに取り入れられています。

ですので、結論として「CMに嘘はあたりまえ」と覚えておきましょう。

 

小学生でもわかる!3Dスキャナーのしくみ

「3Dスキャナー」どうして物体の形状が3Dで取得できるのか不思議ですよね?

構造や理論が何やら難しそうと受け取られる方もあるでしょうけれど、回転テーブルとラインレーザーを使った3Dスキャナーの構造を数字や難しい用語を使わずに、出来るだけ易しく頭でイメージしていただけるように纏めてみました。

このような形式の3Dスキャナーが対象です↓

dreamerdream.hateblo.jp

 

3Dスキャナーに対する子供からの質問に困ったときにご活用ください。

 

図はレーザーポインターの光の通過点を赤色とし、回転テーブルが黒色で表しています。

何も無い状態を真上から見た図と、下段にはカメラを通して見た回転テーブルの図を書いています。

f:id:DreamerDream:20181221132324p:plain

 

 

まず、この回転テーブルにスキャン対象物を置くと、レーザーが対象物に遮られ、対象物のレーザーが当たった点が反射して距離が解るのです。

下段の図では対象物は除外して、レーザーを認識した点のみをデータとして記録しています。

f:id:DreamerDream:20181221132338p:plain

何故距離が解るのかといいますと、何も無い状態であれば青色十字を超えてレーザーが走っていたのに対し、対象物がある場合は十字の手前でレーザーが遮られています。

遮られた点はレーザーの「反射」という型でカメラで認識できるので、ポイントとして記録することが出来ます。テーブルにポイントとして記録しています。

 

 

レーザーポインターは同じ位置のまま、テーブルと、先ほど記録したポイントを半時計回りに少し回転させて同じように点を記録します。

f:id:DreamerDream:20181221132347p:plain

すると、先ほどの点とズレた新しいポイントを記録することが出来ます。

4回、回転させて計5点記録するとこんな感じです。

f:id:DreamerDream:20181221132356p:plain

ポイントがどんどんズレてズラーっと並んでいますね。

 

ドンドン回転させて記録点を残して、半分回転させたぐらいのところで止めてみます。

f:id:DreamerDream:20181221132406p:plain

この記録データの軌跡を見ると「角」のある対象物であることが解りますね。

 

 

このように、レーザーポインターがあれば1点ずつポイントを記録することができ、回転テーブルで回転させることで物体の形状をある程度把握することが出来るということが解りました。

 

 

さて、今まで記録していたのは「平面」です。

これを「立体」にするにはどうすれば良いでしょうか?考えてみましょう。

 

答えは簡単!

レーザーポインターの数を上下に増やせば良いのです!

 

いくつかのレーザーポインター、もしくは1つのレーザーポインターを上下に移動させて平面と同じように一層ずつ記録して、各層を重ねるとこのように記録されます。

どうです?積み重ねられると立体に見えますよね?

f:id:DreamerDream:20181221132416p:plain

実際に、1つの測定ポイントを上下移動させ、平面として記録して3Dスキャナーを作成した人のムービーがあります。


Arduino 3D-Scanner

↑この作品はカメラではなく恐らくToFセンサーを使ったものでしょう。

 

 

レーザーポインターを無数に増やしたのが「ラインレーザー」です。

ラインレーザーは1つのレーザーをレンズにより1つのラインとして照射しているためある意味では無数の上下に積まれたレーザーポインターを照射しているのと同じです。

記録できる層の数はカメラの性能に依存します。大きな画像で取り込めればそれだけ層が細かく記録されます。

f:id:DreamerDream:20181221132426p:plain

回転テーブルとレーザーを使った3Dスキャナーではこのようにラインレーザーを対象物で反射させ、カメラで各反射ポイントをデータとして記録して3Dモデルを作り上げているのです。


Piclop (Raspberry Pi 2 + FreeLSS version of BQ Ciclop) 3d laser scanner in action

 

ですのでカメラとラインレーザーポインターの精度、対象物の反射率や透過率が重要な要素になるのです。

dreamerdream.hateblo.jp

 

3Dスキャナーを自作する ⑤取得データの編集

自作3Dスキャナで取得したデータは、さほど精度がよくありませんでした。 

dreamerdream.hateblo.jp

 

 

しかし、同じレーザー方式の3Dスキャナであれば結局どの機種でも同様にレーザーの反射しない箇所には穴が開きます。

 

例えば、こちらの2013年17万強で出ているスキャナー↓

を実際に使ってみたという記事ですが、

https://weekly.ascii.jp/elem/000/000/187/187238/

https://weekly.ascii.jp/elem/000/000/187/187230/131126_wamp_mbd_img13_cs1e1_480x.png

やはりレーザーの届かない場所の抜け、黒色部分の不検出になります。

しかし表面はかなり滑らかにスキャン出来ているように見えます。「さすが10万超のマシン!」と思うことでしょう。

しかしレーザーでスキャンしたままのデータを元にソフト側で表面を滑らかに加工しているようにも見えます。

 

ということで、今回作った自作3Dスキャナーでもソフトで同程度の滑らかさが出せるのか?表面加工をしてみたいと思います。 

 

編集ソフトはフリーでオープンソースな「MeshLab」を利用します。

↓HP

MeshLab

MeshLabは1から3Dモデルを作り上げる事はできませんが、3Dメッシュデータの編集やファイルタイプの変換などが出来る便利なツールです。

 

モデルは体操ブーブー。

f:id:DreamerDream:20181218085430p:plain

amazonで普通に売られています。

 

スキャニング中....

f:id:DreamerDream:20181218085444p:plain

 

スキャン完了!表面キレーですねー。レーザーの検出出来なかった頭には穴が・・

f:id:DreamerDream:20181218085500p:plain

 

これをMeshLabで開くと

f:id:DreamerDream:20181218090348p:plain

あれ?あれ?表面がボコボコです。

 

 

なぜ、そういうふうに見えるかというと

実は3Dオブジェクトにはテクスチャという画像データが貼られています。

テクスチャが貼られていると、一見綺麗に見えるだけなのです。

VRとかだとそのまま使えるようなデータですが3Dプリントするのには難があります。

Blenderのテクスチャモードで開く)

f:id:DreamerDream:20181218134612p:plain

テクスチャを外してソリッドモデルで表すとこうなります↓

f:id:DreamerDream:20181218134626p:plain

ワイヤーフレームで表すと、各点が見えないぐらいぎっちりと詰まっています。↓逆にこの精度でスキャン出来ている事に驚きます。

f:id:DreamerDream:20181218134636p:plain

 

 

このデータを簡単にMeshLabで滑らかにしてみます。

方法は参考ページに載っている通りスムーズ化するだけです。

<参考>MeshLab(Smoothing) - PointCloud

 

結果

f:id:DreamerDream:20181218085524p:plain

かなーり表面が綺麗になりました。

 

先ほどのBlenderのソリッドモデルで見てもツルツルしています↓

f:id:DreamerDream:20181218135525p:plain

 

では?穴はどうやって塞ぎましょう?

MeshLabにはRemeshingという点群からソリッドを構築し直してくれる便利な機能があります。

<参考>MeshLabによる、3次元測定データの穴埋め - みたにっき@はてな

f:id:DreamerDream:20181218141816p:plain

 こんな感じ。灰色の部分が再構築されたソリッドです。凸凹も埋められています。

f:id:DreamerDream:20181218141906p:plain

すばらしい!これなら少し要らないところを削るだけで3Dプリンタでも出力できそうです。先ほどのスムーズ化と組み合わせると表面ツルツルになります。

 

実際には何回スキャンするかとか、スキャンの方向、スキャン時の環境、ソフトでどう平均値を取るかとかメーカー物にはノウハウが詰まっているので一丸に同程度とは言えませんがお手製のマシンでも工夫次第で近い結果を出す事が可能になるのです。

あとは精度を出す為にいろんな方向からスキャンして合成するという方法もあります。

高価なスキャナーはスキャナー自体の能力だけでなく、こういったソフトウェア側での穴埋め作業などを自動化してあったりと素人でも使いやすくしてあるようです。 

dreamerdream.hateblo.jp

僕の3Dスキャナの用途としては工作パーツの位置決めやカバーの作成など、おおよその位置関係とカーブ程度が解ればそれを参考にblenderでデータを作り直すので今回の自作3Dスキャナーでも充分な性能だと満足しています。

しかし、フィギュアの完全コピー等を目的とするなら到底満足出来ない結果だと思います。 

 

どんな方法にしろ3Dスキャナーで取得したデータを無加工で3Dプリンターで出力できるようなスキャニングは現実的にはほぼ不可能と思われますので3Dプリンター出力を目指すのであれば3Dモデリングツールを触れるようにしましょう。 

dreamerdream.hateblo.jp

 

全5回に渡り3Dスキャナーの自作、実践をしてみました。お付き合いありがとうございました。

精度はともかく、作るだけなら結構簡単な材料で出来ますので是非一度試してみてください。

kampa.me