利用机器学习分析蚂蚁的运动来影响G代码,用粘土打印物体
扫描二维码
随时随地手机看文章
这个项目是由加泰罗尼亚高级建筑学院(IAAC)开发的,作为紧急未来设计硕士(MDEF)项目的一部分。
1. 介绍
在《Microchallenge II》中,我们的任务是探索智能的概念,即由智能系统处理输入并生成输出。我们的项目通过研究蚂蚁的运动模式和交流,将人工智能与生物智能相结合。我们探索两种智能如何协作和相互告知,使用数字制造作为可视化的手段。
通过使用机器学习来分析蚂蚁的运动和相互作用,我们影响粘土3D打印的g代码生成。结果是一个与自然共同设计的对象,回归到蚂蚁的运动模式的启发结构。
2. 概念和系统图
我们的系统捕捉蚂蚁的运动并将其转化为可打印的形式,遵循以下关键步骤:
•跟踪蚂蚁的运动-通过视频分析记录蚂蚁的运动。
•Python中的图像映射-使用OpenCV将运动数据覆盖到单个图像中。
•在Grasshopper (Firefly + Rhino)中生成3D表面-将图像转换为3D表面。
•G代码生成在Grasshopper -准备模型粘土3D打印。
•粘土印刷&回归蚂蚁-制作结构并将其放回蚂蚁栖息的环境中。
我们设计的主要原则是保留蚂蚁使用的路径,创造自由流动的区域,同时通过负空间定义边界,确保它们的运动不受限制。
3. 早期的实验
最初,我们探索了P5.js来映射蚂蚁的运动,这导致了它们轨迹的点云表示。我们还尝试在Grasshopper中使用基于图像的映射进行直接处理。
从p5 .js生成的图像中,我们使用Rhino 3D和Grasshopper来创建所需的区域,但是处理点云的复杂性使其不切实际。这促使我们探索其他方法,最终转向Python和OpenCV。
4. Python和OpenCV的最终映射
我们在Python中实现了计算机视觉(OpenCV)(通过Visual Studio Code和Terminal执行)来分析蚂蚁的视频片段。我们的工作流程:
•输入视频-两只蚂蚁移动的记录。
•处理-识别蚂蚁的黑暗区域,提取他们的质心,并标记他们的运动。
•输出图像-叠加帧以捕获其连续运动。
初始输出-稀疏点表示运动。
热图(可以有未来的应用)-显示频率和停留时间。
最终覆盖-通过高斯滤波实现的连续统一区域,将单个轨道合并成一个有凝聚力的形状。
这个最终输出作为蚂蚁运动的理想映射,可以在Grasshopper中用于表面生成。
5. 将Python集成到Grasshopper中
我们的目标是使管道自动化,消除手动图像处理的需要。我们尝试在Grasshopper中直接运行Python,遇到了多种挑战:
Rhino 7问题:
Rhino 7中的Python脚本不允许执行外部库(如OpenCV)。
Rhino 7的Python解释器使用一个单独的目录,需要在其特定的终端中安装依赖项。
远程Python插件:
我们探索了Anaconda集成以调用外部Python脚本。
然而,在Grasshopper中仍然无法访问OpenCV。
Rhino 8的改进:
Rhino 8中的Python脚本允许我们执行OpenCV。我们设法在Grasshopper中安装了所有的库并运行脚本,但下一步是将这些点转移到Rhino中,而不是OpenCV预览本身。由于时间原因,我们决定将原型分成两步:首先,Python单独运行,生成图像,然后在Grasshopper中处理图像。
6. 从位图到轮廓
使用Firefly for Grasshopper,我们处理了python生成的位图:
•反转区域以突出显示路径。
•根据亮度值生成基于高度的网格。
结果是一个悬崖状的地形,白色的区域对应于凸起的表面,留下蚂蚁的路径作为低地。
然而,由于位图是基于像素的,而不是矢量化的,网格有过多的面,使其不切实际。为了解决这个问题:
•我们使用高斯模糊平滑过渡。
•我们用XY平面切割网格,提取干净的轮廓线。
7. 生成G代码的最终表面
为了生成用于粘土3D打印的g代码,我们从预构建的Grasshopper定义开始,该定义将表面转换为可打印的工具路径。
但是,Grasshopper没有将轮廓挤压识别为有效的表面,因此我们应用了以下修复:
简化轮廓
•提取的曲线包含的点太多,处理困难。
•使用重建曲线,我们减少不必要的点,同时保持形状的保真度。
表面识别问题
•Grasshopper最初没能识别出挤压出来的形状是一个表面。
•简化后,它成功地识别了单独的表面。
合并单独的表面(我们探索了两种解决方案)
•为结构的完整性创造了坚实的基础。
•添加外部边界以统一形状。
8. 打印测试
9. 原型
•第一次混合:500g粘土+ 30g水+ 5g + 5g
•第二次混合:第一次混合+ 3g
•第三种混合:500g粘土+ 34g水+ 5g + 3g
•第四次混合:第三次混合+ 8g
•第五次混合:第3次混合+ 5g(最后一次)
最后的原型
本文编译自hackster.io