利用機(jī)器學(xué)習(xí)分析螞蟻的運(yùn)動來影響G代碼,用粘土打印物體
這個項目是由加泰羅尼亞高級建筑學(xué)院(IAAC)開發(fā)的,作為緊急未來設(shè)計碩士(MDEF)項目的一部分。
1. 介紹
在《Microchallenge II》中,我們的任務(wù)是探索智能的概念,即由智能系統(tǒng)處理輸入并生成輸出。我們的項目通過研究螞蟻的運(yùn)動模式和交流,將人工智能與生物智能相結(jié)合。我們探索兩種智能如何協(xié)作和相互告知,使用數(shù)字制造作為可視化的手段。
通過使用機(jī)器學(xué)習(xí)來分析螞蟻的運(yùn)動和相互作用,我們影響粘土3D打印的g代碼生成。結(jié)果是一個與自然共同設(shè)計的對象,回歸到螞蟻的運(yùn)動模式的啟發(fā)結(jié)構(gòu)。
2. 概念和系統(tǒng)圖
我們的系統(tǒng)捕捉螞蟻的運(yùn)動并將其轉(zhuǎn)化為可打印的形式,遵循以下關(guān)鍵步驟:
?跟蹤螞蟻的運(yùn)動-通過視頻分析記錄螞蟻的運(yùn)動。
?Python中的圖像映射-使用OpenCV將運(yùn)動數(shù)據(jù)覆蓋到單個圖像中。
?在Grasshopper (Firefly + Rhino)中生成3D表面-將圖像轉(zhuǎn)換為3D表面。
?G代碼生成在Grasshopper -準(zhǔn)備模型粘土3D打印。
?粘土印刷&回歸螞蟻-制作結(jié)構(gòu)并將其放回螞蟻棲息的環(huán)境中。
我們設(shè)計的主要原則是保留螞蟻使用的路徑,創(chuàng)造自由流動的區(qū)域,同時通過負(fù)空間定義邊界,確保它們的運(yùn)動不受限制。
3. 早期的實(shí)驗(yàn)
最初,我們探索了P5.js來映射螞蟻的運(yùn)動,這導(dǎo)致了它們軌跡的點(diǎn)云表示。我們還嘗試在Grasshopper中使用基于圖像的映射進(jìn)行直接處理。
從p5 .js生成的圖像中,我們使用Rhino 3D和Grasshopper來創(chuàng)建所需的區(qū)域,但是處理點(diǎn)云的復(fù)雜性使其不切實(shí)際。這促使我們探索其他方法,最終轉(zhuǎn)向Python和OpenCV。
4. Python和OpenCV的最終映射
我們在Python中實(shí)現(xiàn)了計算機(jī)視覺(OpenCV)(通過Visual Studio Code和Terminal執(zhí)行)來分析螞蟻的視頻片段。我們的工作流程:
?輸入視頻-兩只螞蟻移動的記錄。
?處理-識別螞蟻的黑暗區(qū)域,提取他們的質(zhì)心,并標(biāo)記他們的運(yùn)動。
?輸出圖像-疊加幀以捕獲其連續(xù)運(yùn)動。
初始輸出-稀疏點(diǎn)表示運(yùn)動。
熱圖(可以有未來的應(yīng)用)-顯示頻率和停留時間。
最終覆蓋-通過高斯濾波實(shí)現(xiàn)的連續(xù)統(tǒng)一區(qū)域,將單個軌道合并成一個有凝聚力的形狀。
這個最終輸出作為螞蟻運(yùn)動的理想映射,可以在Grasshopper中用于表面生成。
5. 將Python集成到Grasshopper中
我們的目標(biāo)是使管道自動化,消除手動圖像處理的需要。我們嘗試在Grasshopper中直接運(yùn)行Python,遇到了多種挑戰(zhàn):
Rhino 7問題:
Rhino 7中的Python腳本不允許執(zhí)行外部庫(如OpenCV)。
Rhino 7的Python解釋器使用一個單獨(dú)的目錄,需要在其特定的終端中安裝依賴項。
遠(yuǎn)程Python插件:
我們探索了Anaconda集成以調(diào)用外部Python腳本。
然而,在Grasshopper中仍然無法訪問OpenCV。
Rhino 8的改進(jìn):
Rhino 8中的Python腳本允許我們執(zhí)行OpenCV。我們設(shè)法在Grasshopper中安裝了所有的庫并運(yùn)行腳本,但下一步是將這些點(diǎn)轉(zhuǎn)移到Rhino中,而不是OpenCV預(yù)覽本身。由于時間原因,我們決定將原型分成兩步:首先,Python單獨(dú)運(yùn)行,生成圖像,然后在Grasshopper中處理圖像。
6. 從位圖到輪廓
使用Firefly for Grasshopper,我們處理了python生成的位圖:
?反轉(zhuǎn)區(qū)域以突出顯示路徑。
?根據(jù)亮度值生成基于高度的網(wǎng)格。
結(jié)果是一個懸崖狀的地形,白色的區(qū)域?qū)?yīng)于凸起的表面,留下螞蟻的路徑作為低地。
然而,由于位圖是基于像素的,而不是矢量化的,網(wǎng)格有過多的面,使其不切實(shí)際。為了解決這個問題:
?我們使用高斯模糊平滑過渡。
?我們用XY平面切割網(wǎng)格,提取干凈的輪廓線。
7. 生成G代碼的最終表面
為了生成用于粘土3D打印的g代碼,我們從預(yù)構(gòu)建的Grasshopper定義開始,該定義將表面轉(zhuǎn)換為可打印的工具路徑。
但是,Grasshopper沒有將輪廓擠壓識別為有效的表面,因此我們應(yīng)用了以下修復(fù):
簡化輪廓
?提取的曲線包含的點(diǎn)太多,處理困難。
?使用重建曲線,我們減少不必要的點(diǎn),同時保持形狀的保真度。
表面識別問題
?Grasshopper最初沒能識別出擠壓出來的形狀是一個表面。
?簡化后,它成功地識別了單獨(dú)的表面。
合并單獨(dú)的表面(我們探索了兩種解決方案)
?為結(jié)構(gòu)的完整性創(chuàng)造了堅實(shí)的基礎(chǔ)。
?添加外部邊界以統(tǒng)一形狀。
8. 打印測試
9. 原型
?第一次混合:500g粘土+ 30g水+ 5g + 5g
?第二次混合:第一次混合+ 3g
?第三種混合:500g粘土+ 34g水+ 5g + 3g
?第四次混合:第三次混合+ 8g
?第五次混合:第3次混合+ 5g(最后一次)
最后的原型
本文編譯自hackster.io