テンセグリティ構造②:3Dデータ出力と3Dプリント

posted in: 3D Modeling, 3D Printing | 0

前回はテンセグリティ構造の3DデータをBlenderで作製しました。

今回はそのデータを3Dプリント用に出力し、印刷します。

【3Dプリント用に出力】

前回つくったBlenderデータはこんな感じでした

画像右下にあるように、単位はメートル法にして、単位の倍率は0.001 (1 mm)と設定します

これは印刷スケールをでかすぎず、小さすぎない大きさにするためです

印刷物がどれくらいの大きさになりそうかは、距離を測定するツール(左から選べる)で明らかにしておきましょう

この場合は横が0.02 m (2 cm)くらいですね

大きさが大丈夫そうなら、stl形式でエクスポートしておきましょう

この形式は3Dプリンタデータを作成するための、スライサーソフトで読み込める形式です

ELEGOO MARS 2 Proを購入した人は、付属のUSBにスライサーソフトであるCHITUBOXが入っています

これをインストールして起動し、右のメニューバーから設定を開いて、対応する3Dプリンターを選択しておきましょう

さっき保存したstlファイルを読み込むと、ビルドプラットフォームを床として、どれくらいの大きさになるかを表示してくれます

何個でも読み込めます

貼りだした部分は造形中に落ちてしまう可能性がありますので、このようにサポート材をつけておきましょう

サポート材のつけ方が分からない場合は、とりあえず右のメニューバーから「+すべて」を選択しておきましょう

それでも足りなさそうな箇所があれば、自分でサポート材を挿入していきます

保存したら、3Dプリンターに入れるUSBメモリのどこでもいいのでファイルを置いておきます

【実際に印刷】

キャリブレーションを行ったら、前回同様に印刷していきます

できあがっていく層が順に見えます。ワクワクですね

今回のデータは1時間くらいで印刷終了です

printed-parts

ビルドプラットフォームを見てみると、ちゃんとできあがっています

初めて印刷する場合はできないことも多いらしく、サポート材のつけかたを工夫しなければならないと一般には言うのですが、今回は一発で上手くいきました

ビルドプラットフォームを取り外すと、こんな感じです

ヘラをいれてとります

ペンチでサポート材から取り外します

これは二次硬化の前で大丈夫だと思います

二次硬化後だと、材料がタフすぎて切れにくいのではないでしょうか

二次硬化は10分としました

せこいですが、上下の接続部分はゴムなどをつかってつなぎとめ、完成です

中央の軸同士をとりあえずつなぎとめてから、周りの3本の糸(ゴム)を等しい長さでつなぎとめるのがポイントです

ちょっとバランスが狂うと、全然テンセグリティにならないです

まず注目すべきポイントは、中央の軸同士を結び付けるための切込みがちゃんと3Dプリントされているということです

これは定規で測ってみると、だいたい0.2 mmくらいです

素晴らしい精度ですね

そして、そんな窪みに入るような糸を探すのが大変でした

ドンキホーテまで行きましたがありませんでした

最終的にたどり着いた答えは、自分の髪の毛でした

ブリーチしてる上、めっちゃ細いのでぱっと見では分からないと思います

そして注目ポイント2つ目

浮いたような構造であるテンセグリティ構造になっています

構造的には、これは準安定状態ですね

ですので、ちょっと倒してみると、最安定状態である崩壊した構造(↓)に落ち着きます

ただし、本当に少しの力では揺れるだけで最初の準安定状態を保持します

(だから準安定状態と呼んでいます)

この挙動をグラフっぽく表してみると下のようになります

二値しかとらないということで、ロジスティック回帰で使われるようなシグモイダル関数のようになるわけです

加えて、これは推測ですが、このようにはっきりとした二状態をとれるテンセグリティ構造は、ヒモ部分がゴムであるからこそかもしえません

実際に、この記事より後のタイミングで作製した鎖型テンセグリティ構造だと、このような挙動を示していません

今回のゴム型のテンセグリティ構造の挙動は、動画にしてYoutubeにアップロードしておきます

以上、3Dプリンターでテンセグリティを作る回でした

ここまで読んでくださり、ありがとうございました。

将来的には、ヒモ部分も3Dプリントでつくった鎖で置き換えるなどして、100%3Dプリント造形物のテンセグリティをつくろうと思います

そのためにはまず、鎖を3Dプリントで作製していくこととなります

Rによるk-近傍法のkの最適化

posted in: Machine Lerning | 0

k-近傍法(k-nearest neighbor algorithm, k-NN)という分類法があります。

与えられた任意のデータが、どのクラスに属するのかを決定する手法です。

クラスというのは例えば、花の種類とかです。

例えば図のようなデータがあったとします。ある特徴量1,2をもつ花は●なのか★なのかを分類したという、既知のデータです。

ここで、新たに✖というデータが入ってきたとき、✖は●なのか★なのかを決めたい、みたいな状況で有用な手法です。

もしk=2とするなら、2個の近傍法ということになるので、周りの2個を選んで、それと同じにしてしまおうというアルゴリズムになります。

この場合は、選ばれた2個が●なので、✖も●だろうということになります。

別パターンとして、もしk=6とするなら、★のほうが●より多く選ばれるので、✖は★だろうという多数決になります。

そういうわけで、kの値によって✖がどうなるのかは色々ありえます。

でも✖はどっちかしかないわけですから、これだと困りますよね。

ということで、どのkだと正答率が高いかは、自分で実験して明らかにするしかありません。

具体的には、実験とは訓練とテストのことを指します。

今あるデータから、kを自分で決めてみるということを訓練といいます。

そして、そのkが合っているかを確かめる作業をテストといいます。

訓練とテストを自分で行うということです。

正答率を出すためには、テストの解答は既に分かっているものを利用しないといけません。

ここでは、irisという、花の特徴量とクラスが予め判明しているデータフレームを使います。

このデータフレームはRで利用できるようになっていたと思います。R Studioというソフトを使うと便利です。

これを活用して、irisのデータフレーム(trainA)中のランダムな数行(testB)のクラスを最適なkで予測する関数k_optimizeをつくってみましょう。

コードの書き方

k_optimizeという関数の中身を説明します。

①まず、dataという名前にirisというデータフレームを代入したとします。

data(図では紫)は訓練データとテストデータに分ける必要があります。

そこで、10行だけをテストデータ(AnoTest)として選び、残りを訓練データ(AnoTrain)にします。

続いて、例えば、k=1として、訓練データ情報からテストデータのクラスを予測してみます。

これはRのパッケージであるknn()という関数が勝手にやってくれます。

knn(訓練データ、テストデータ、訓練データの正答クラス、k)という感じで書き、kekkaというオブジェクトに代入しておきましょう。

kekkaの内容は、テストデータの予測になります。

AnoTrainから得た情報で、AnoTestのクラス(花の情報)を予測してくれます。

kekkaが、元々分かっているテストデータのクラスとどれだけ合っているかは

kekka == AnoTest[,5]で判明します(5列目を選んでいるのは、5列目にクラスが入っているためです)。

10行テストしていますから、TRUE FALSE TRUE TURE…というように10個分の評価が返ってくるはずです。

TRUEは1で、FALSEは0ですから、sum()で合計すると、正答数になります。これを、length(AnoTest[,5)で割れば正答率です。

kが1のとき、この作業を終えたら、次にk=2, 3, 4…10と続くようにしておきます。

そういうわけで、for文を先頭に用意しておくのです。

それぞれのkの場合での正答率を記録しておく用のベクトルをつくっておかなければなりませんから、それは初めにseikai_counterとして用意しておきます。

for文の処理が終わる直前ごとに、seikai_counterの中身は正答率で置き換えるようにしておけばいいのです。

すると、kが10まで終わったころには、seikai_counterの中には全てのkについての正答率が記録されていますから、どのkのときが一番正答率が高かったかが分かります。

ということで、which.max()関数で、seikai_counterの中からインデックスをとってくれば、正答率の最も高いときのkの値をとってくることができます(インデックスがk=1,2,3…に対応しています)。

これはgood_kという名前にしておきます。

②good_kが決まったので、それをkとした場合の予測を行います。

受け取る引数は、訓練データ(trainA)とテストデータ(testB)です。

その結果、どれくらい合っているかは論理記号==で分かります。

以上をまとめますと、以下のようなコードになります。

k_optimize <- function(trainA, testB){
AnoID <- sample(nrow(trainA), 10)
AnoTest <- trainA[AnoID,]
AnoTrain <- trainA[-AnoID,]
seikai_counter <- rep(0,10) #各kの場合の正答率を格納するベクトル
for(k in 1:10){
kekka <- knn(AnoTrain[,-5], AnoTest[,-5], AnoTrain[,5], k)
print(kekka == AnoTest[,5]) #予測と実際がどれだけ合っているかを表示
print(sum(kekka == AnoTest[,5])/length(AnoTest[,5])) #正答率
seikai_counter[k] <- sum(kekka == AnoTest[,5])/length(AnoTest[,5])
}
good_k <- which.max(seikai_counter) #最も高い正答率のインデックスがkに対応
print(“good_k is”)
print(good_k)
final_result <- knn(trainA[,-5], testB[,-5], trainA[,5], good_k)
print(“showing result”)
return(final_result == testB[,5]) #最終的な予測と実際がどれだけ合っているかの表示
}

data <- iris

k_optimize(data, data[sample(nrow(data), 10),])

この場合、trainAを「irisの入ったdata」とし、testBを「trainAのランダムな10行」にしています。

実行してみると、例えば下のような応答が返ってきます。

k=1~10のそれぞれの場合の正答率が表示されていますが、k=4のとき最高の1 (100%)となっています。

このkをgood_kとして、dataが訓練データ、dataのランダムな10行がテストデータとなった場合の予測結果を表示させると、全てTRUEになったというわけです。

めでたし。

世界一わかりやすいk-近傍法のやり方でした。

テンセグリティ構造①:3Dモデリング

posted in: 3D Modeling | 1

テンセグリティ構造という建築用語があります。

テンセグリティ構造とは、糸によって土台と結ばれた天井が、張力によって落ちずにあたかも浮遊しているかのような振る舞いを示す構造のことです。

画像検索すれば、たくさんヒットしますが、ここではあえてBlenderで作製した概念図を載せます。

上下にある黒い物体がそれぞれ天井と床で、ピンクがそれらをつなぐヒモだと思ってください。

つまり、ヒモのようなやわらかいサポート材しかないにも関わらず、上側の天井は落ちずにその場にとどまる、ということになります。

なんでこのようなものをわざわざ3Dモデリングしたかというと、3Dプリントすることによってテンセグリティの振る舞いを検証するためです。

本記事では3Dプリントまではしないので、Blenderでテンセグリティを作製した際の設計だけお見せします。

マテリアルプレビューモードでの表示がこちらです(レンダリング後よりインスタ映えですね)。

上下の土台と天井はそれぞれ正三角形で、一辺を10の長さとします。

このとき、下側の正三角形の辺から60°方向に斜めに伸びる支柱的な部分の長さは8とします。

上側から生える支柱は辺からではなく頂点から伸びていますのでご注意を。

二つの支柱の間の長さはだいたい2.5になるように設計しています。

加えて、支柱にはあとでヒモをとりつけますから、くびれ部分をつけているというわけです。

以上、テンセグリティ設計の説明でした。

次回、この構造を3Dプリントしてみて本当にテンセグリティ的な振る舞いを示すか試してみます。