用手控制设备:自动电影制作设备

5,129

114.

12.

简介:手动控制装置:自动胶片制作装置

简介:自学成才的各种数码+物理制造商。

如果视频无法播放,请按照“youtube”按钮的“观看”按钮或使用此操作链接

短暂的

我一直在思考与机器进行直观互动的新方法。电影通常是寻找这种轻松、未来主义互动的灵感的好地方。这个很可能是从钢铁侠那里偷来的!

在这个项目中,我为我的相机创建了一个机动滑块和缩放装置,然后使用Kinect传感器(和相当多的代码)创建它与我的手之间的接口,以及其他有线/无线设备,如飞利浦Hue灯。

您可以通过指向灯光来打开和关闭灯光,或将灯光拖离灯光以增加其亮度。你可以通过在远处“抓住它”将相机沿导轨放置,你可以轻触它,使其朝向/远离你。您还可以用双手“拉伸”手势精确控制缩放。

有形交互语义

我喜欢模仿真实的、可关联的动作的交互语义,比如指向、抓、拉和拉伸。我坚信未来在于混合现实互动而不是纯粹的虚拟,因为数字事物其实做某事在现实世界中,用户体验设计更令人愉快,更易于理解。

你在这里看到的一切我都是在网上学会的。我把很多不同的项目放在一起,因此,与其做一个详尽的指南来复制这些项目,我认为以更普遍的方式分享我的奋斗和成功更有用,这样你就可以把这些交互带到其他地方去——人机界面和用户体验/交互设计还有很多令人兴奋的事情要做。这些概念可以应用于任何可以通过API进行黑客攻击或访问的设备;或者用Arduino之类的东西来创造你自己。

章节

»制作超便宜的滑块和缩放装置

»套接字作为一个非常有用的连接概念

»使用Kinect和Unity——追踪骨骼并制作基本的3D用户界面

»通过NodeJS(一个连接框架)将事物连接在一起,创建一个通用枢纽,用于网络无线物联网设备(如飞利浦Hue)和本地设备(如Arduino)

代码

将来,我想在我可以维护的时候分享我构建的通信框架。但目前,我不确定它的用户友好程度,也不能保证它能在其他平台上运行。有很多东西需要解释,希望下面的指导能有所帮助。

供应:

用于手/身体跟踪

»Kinect V1* (Xbox 360)或Kinect V2* (Xbox One)或Kinect Azure

*对于V1和V2,您也需要购买PC适配器,因为它们最初是为Xbox构建的。

Kinect传感器(目前)可能是骨骼跟踪的最佳窗口。它们对于3D重建也很有用,因为它们有深度相机;可以将物理对象扫描到纹理网格中。

随着升级,它们变得更贵,但性能也更强。我曾在许多项目中使用过Kinect V1,如果你对控制逻辑有创意的话,它绝对可以在互动中发挥作用。它可以实时检测两个用户身体的关节,但它不能检测手的手势。我通过使用虚拟光标和提示来解决这个问题,比如检查用户是否举起了手,或他们的身体指向的方向,以知道他们何时想要进行交互。

在这个项目中,我选择了Kinect V2,它的功能略有改进。重要的是,与V1不同,它可以天生识别多种手部状态,比如张开/握紧拳头和“套索”指向。这是一个非常有用的步骤,因为我需要“停止移动”或“开始抓取”等动作的精确提示。我还没有接触到Kinect Azure,但它似乎要比它好上一大步。

用于创建连接的设备

现在有很多开发板选项,所以我的深度是不可能的。滑块和Zoom钻机正在运行在USB上控制的标准Arduino Mega,但是使其无线非常容易。我发现粒子板完全直观地用于过去这种事情,它们足够快,可以从传感器将数据流式传输到网页或将控制信号发送到WiFi上的电机。

用于步进电机

如果你正在寻找步进电机驱动器,在亚马逊上搜索“9-42V步进驱动器”。他们还没有在我身上失败,我已经把他们用在集成上,像一个CNC,他们已经运行了几个小时。他们有良好的被动冷却,在输入电压方面非常通用,并且很容易在项目之间重用。

步骤1:制作一个超级便宜的滑块和缩放钻机

滑块和变焦装置的成本非常低,因为你可以去-它做的工作,并已经受住了很多敲打。它比大多数滑块需要的要长一点。

建造

我为跑步者使用钢角,为面板使用9毫米中密度纤维板,为跑步者使用3D打印滚轮。在相机的重量下,这个系统是稳定的,但如果你想要最好的,你会想要一个平滑的线性轨道系统。

驱动系统

G2皮带现在相对便宜,因为每个人都在制作3D打印机。如果我再次制作它,我会带这个。然而,当我建立它时,我想尝试使用您可以在较长的部分 - 用于窗帘的标准珠链中购买的替代方案。您在第一张照片中看到的驱动器齿轮是一系列激光切割板块由两个圆盘固定到位,每个板块都以珠子之间抓住绳索的方式脱颖而出。它是一个强大的驱动系统,非常适合您可能想要的大规模机电一体化。我注意到的是,在绳索上有一些较慢的速度,你得到了显着的振动(实际上是大站立波)。

缩放装备更简单。它使用一条缠绕在变焦环上的小同步带和一个直接安装在步进电机轴上的小MDF齿轮。

电源系统

电池和电源可能会很贵,所以我选择了完全免费的无线方式。这个滑块是为了在车间拍摄而制作的,所以无论如何,让它靠钻电池运行是有意义的。我拿了一块电池,复制了它的电池干的尺寸。然后我从一个扭力弹簧上切割和打磨一些钢条,创造出一对触点,使电池的每个触点都发生偏转。这种方法工作得非常好,在很长的工作周期中没有任何问题。我想这是因为我用了弹簧钢。只要确保触点之间绝缘,并观察电池电压/增加电压警报。

控制信号

滑块和缩放的步进器都是从单个Arduino Mega运行的,因此为了能够在滑块移动时进行放大和缩小,您必须以特定的方式进行移动。每个步进电机都依靠短数字脉冲来指示一个步进,但在Arduino的处理器上一次只能做一件事。对于单个步进电机,您可以使用标准的步进程序库,但您会发现,当您添加更多步进电机并同时运行它们时,它们会相互减慢,因为信号阻塞。

因此,解决方案是轮流,移动每个电机的一个增量,并在高频轮询,以检查是否是时候移动另一个步骤。克服这个问题的最简单方法是使用AccelStepper库。然而,我只是想要恒定的速度移动,所以我不想要所有的包装。我创建了自己的实现,也使用了直接端口操作来提高速度。当你处理低电平信号时,这是一个有用的技术,因为你可以同时写入8个引脚,在这种情况下,允许我在一个命令中更新两个步进器(略快于digitalWrite)。

如果你使用Mega 2560和端口操作,可能有用,因为绑定是不同的。

滑块的一端有限位开关,当接触到限位开关时,会触发中断无论Arduino正在做什么,它都会立即起作用,阻止电机移动太远。它允许我定义沿着滑块的移动范围,并在每次关机后有一个一致的重置点。在启动时,滑块运行一个归航序列,让计算机知道它准备好了。

串行命令

我曾经使用过GRBL,对于具有多个步进器的更复杂系统,这是一个完美的解决方案。它提取了所有步进控制信号,并具有非常健壮的命令界面。

但是在这里没有必要。我这样做是为了让每个轴,滑块和缩放,从0到1之间的位置设置。您通过串行发送一个值,如“0.45s”或“0.8z”,以移动到特定位置,在本例中,滑块移动到0.45或缩放到0.8。您还可以发送启动或停止移动的命令,滑块将继续向最大范围的方向移动。

第2步:套接字:连接的非常有用的概念

学习套接字解锁了连接的东西的全部编程能力。它们是一个基本上是一个通用的“跳线”,可以高速地将数据从一个程序或设备移植到另一个程序。他们是互联网的下面的内容 - 如果没有它们,就不会成为视频电话。例如,您可以将微控制器发送给您的Web浏览器,通过网络发送实时视频,或者计算机上的两个应用程序,例如,彼此交谈。

关于套接字的伟大事物是它们是一个通用的构造,即它们在大多数语言中都有这样的实现。如果你最初尝试忽略行话,他们实际上非常简单,并且一旦你理解了一般的想法,它们就可以轻松地应用于任何其他语言,因为一切概念上(甚至句法)在很大程度上是相同的。

通过这种方式,他们也是一种欺骗代码的好方法。最初,当我想开始使用Kinect时,我发现源代码是用C ++编写的,但我当时只知道Python。因此,我意识到我可以拍摄这个C ++代码,而不是尝试学习整个新语言,并仅省略如何包含基本套接字实现。这样,我可以用很少的努力从C ++应用程序中抓取骨架数据,并将其发送到Python,在那里它更加易于处理,但也非常令人遗憾的是,我对原型高级交互逻辑更快。这也意味着我添加到我的程序中的任何代码都不会减慢围绕骨架跟踪所涉及的底层处理,因为它们是在不同的过程中完成的。

他们如何工作

套接字允许您高速交换消息。这些信息可以包含书写,例如图像中的像素或传感器中的值;任何可以表示为文本并最终表示为二进制的内容。为了在两个设备之间创建套接字连接,你真正需要建立的两件事是每个设备的“位置”和它们将用于通信的“语言”,因为数据必须经过编码才能在设备之间发送。

而“位置”,则是由一个独特的地址和一个港口,允许您针对您想要与之对话的特定设备,而不是其他许多可能也在网络上监听的设备。

'语言'真的由一个组成协议编码.协议解释了发送和接收消息的过程,比如“发送一条消息,等我回复”或“在每条消息的末尾说停止”。编码决定了在收到编码的二进制消息后如何从它们中恢复数据。

最常用的协议称为TCP。在这种类型的套接字中,在服务器和一个客户.通常情况下,服务器运行在后台的“主”设备上,并总是侦听可能想要通信的客户端。具有正确地址的客户端可以尝试连接,服务器将处理这些正在建立的新连接,以及在断开时断开的旧连接。

一旦这种“握手”成功,您就可以开始以二进制数据的形式来回发送数据。更安全的做法是将信息分成更小的消息或“块”,以防丢失或损坏。

对于大多数事情,TCP就足够了。它非常可靠,因为它涉及到一些检查,以确保所有的数据正确地通过。您可能想了解的另一种选择是UDP,它抛弃了一些检查,并对绑定客户机和服务器的概念采取了稍微不同的方法。当您需要超低延迟,并且不介意偶尔丢失数据时(比如流媒体视频),它非常适合。

步骤3:使用Kinect(以及一点团结)

Kinect

玩Kinect最好的方法是从SDK浏览器中找到的例子开始,不过你需要在c#或c++中愉快地工作。我在过去为Python做的第三方绑定方面绝对没有运气,所以正如我前面提到的,我最初通过采用一个基本的套接字实现并将数据从c++移植到Python来解决这个问题。最后我选择了c#,这是一种更好的工作方式,因为你可以处理传感器的定位和连接/断开事件。

Kinect有多个您可能想要访问的流,无论是单独还是单独访问。这些是颜色,红外,深度和身体框架(包含跟踪骨架的体框架)。使用这样的传感器的吸引力是所有校准都是为您完成的。这意味着在不同帧之间有一种通用映射:您可以在3D空间中取出一点,并找出它是什么颜色,或在颜色框架中找到形状,并找出它有多远。我希望将来实施的一件事正在使用您的手指作为真实的彩色拾取器/移液器工具,所以你看一下身体框架,找到凸起的手指的位置并将其映射到色彩空间以找到附近的颜色你是指示的。

第一个动画显示了Kinect Studio中的彩色深度视图,覆盖了我的骨架。当我举起双手握紧拳头或指向食指和中指时,它会改变我手的颜色,以显示它认为我握着的手的状态。

团结

最近我想再做一次飞跃,学习一种有用的3D工具。如果我不能用Unity来可视化它,那么为这个交互映射交互空间将会非常麻烦。它可以很快地提取,并且可以很好地抽象底层内容。这是我用它做的第一个项目。如果您不熟悉Unity,它是一个游戏引擎,实际上可以用于更多的事情,比如建筑可视化、模拟和交互设计。重要的是,Kinect V2有一个插件。它被标记为专业版专用,因为在旧版发布时,您必须拥有Unity的付费许可证。现在情况不再如此,你可以免费下载Unity和插件。

即使团结可以当你使用Kinect时,绕过c#界面有点棘手。也就是说,如果你能够集成插件自带的“身体源查看器”和“身体源管理器”脚本,你所要做的就是找到一种方法来获取你想要的数据。管理器脚本处理传感器连接并获取“框架”信息,以便查看器脚本可以在Unity对象中可视化框架,就像你在第二个动画中看到的那样。在这个测试中,我使用一个轻弹手势在手掌的位置创建球体。

交互区

同样在第二个动画中,我显示了虚拟“区域”,其中选择了每个交互输出(左灯,右灯或滑块)。这是使用统一的好处 - 我可以看看房间里的灯和滑块的位置,并迅速添加一些球体来代表他们的空间区域。然后我使用过对撞机用我的手和这些东西来找出我在触摸什么。

如果您正在实现类似的功能,请注意:我不得不说,我发现使用collider组件从一开始就相当麻烦且不直观。必须添加刚体零部件才能使其工作。如果你想有一个移动的对撞机,就像我手中的那个,它们也需要设置为“运动学”,碰撞检测模式应该是“连续推测”。您需要使用“FixedUpdate()”方法中的“MovePosition()”移动刚体,而不是简单地在紧随其后的“Update()”方法中编辑其变换组件。固定更新用于平滑设置物理组件的动画。

消除抖动

如果有一件重要的事情值得分享因为它适用于你可能构建的很多东西,那就是你需要对手部状态进行的处理。当我开始从传感器传输手的状态数据时(状态是“未知”、“无法追踪”、“闭合”、“打开”、“套索”),我注意到当你紧握拳头或使用套索时移动你的手,它会在几帧内失去跟踪。如果您正在为拖拽命令之类的东西编写交互逻辑,那么这可能会导致非常不稳定和脆弱的交互提示。

与对物理按钮进行“去抖动”的方式相同,在该按钮中,您可以清除信号,使其只注册一个简单的“开/关”,而不是单次按下的“开/关/开/关”,您可以在多个帧上对该状态数据进行平均,以清除结果。为此,我将一定数量的手框记录到一个队列中,该队列是一种数据结构,在其中一端添加项目,在另一端删除项目(先进先出)。我创建了一个平均方法,该方法对有效状态特别敏感,如打开/关闭拳头和套索,并将抛出“未知”状态,除非它们真的一致。

步骤4:使用NodeJS将所有内容捆绑在一起

神经元的框架

为了让所有这些不同的设备都能说话,我需要一个沟通框架。我不想只是为这个特定的演示快速地编写一个硬编码的解决方案——那样真的会浪费很多时间。相反,我一直在考虑为这类东西创建一个通用工具包,一个足够结构化的东西,从移动设备、串行设备、物联网设备到本地应用程序和网页:一个数字-物理结构。解决方法是采用仿生学方法,将所有设备的输入和输出看作神经元,将特定演示的可重构连接看作突触,可以有多个输入/输出的神经连接。这意味着我可以创建一个由容器(我称之为“通道”)组成的通用“实体”系统,它可以处理任何类型的设备及其数据流,但在构建演示时要配置细节。在这个例子中,Kinect是主要的输入神经元,它的活动会触发一些东西,比如滑块移动、摄像头放大或灯光变暗。

NodeJS

NodeJS是一种用于web开发的优秀语言,您可以用一种语言的价格获得两种语言(前端javascript和后端节点)。在我看来,它绝对是制造网络系统的最优雅的媒介。它速度快,具有大量服务器端操作功能,使用javascript语法,以干净的方式处理包和对象。

串行

我用了串行端口包来控制Arduino。它非常简单-它使用事件系统来通知您接收数据或建立/断开连接之类的事件。据我所知,Arduino串行命令用于ASCII编码,因此在设置端口时,请确保指定“ASCII”作为编码类型。如果您想要一种自动查找设备而不是硬编码设备路径的方法,请向下滚动至“静态方法”在这里并使用list()函数。

Http请求

实际上所有智能家居设备都使用RESTful架构,这是一个有效的方法来交换IoT设备和用户或服务器之间的状态信息。它们几乎总是依赖HTTP请求,而单击网页以及内容加载时,与会发生什么也没有什么不同。

Node非常适合做这类事情,因为它有助于异步进程——想象一下,您向网站发送了一个获取某些信息的请求,但速度非常慢——您希望在收到响应时继续处理其他内容,而不是等待。如果你真的想处理请求,有点像socket之类的东西,一旦你了解了它们是如何工作的,你真的可以用任何语言应用它们。最好的方法是玩一玩,并扩展你在互联网上找到的例子。请求库刚刚被弃用,因此如果您想要一个好的节点包,请尝试axios得到了

飞利浦色调

Philips有一个文档完备的API,允许您通过代码控制Hue灯。你可以每秒发送10个命令,改变每盏灯的颜色或亮度。你需要通过认证程序在这里为了得到一个令牌。一旦你有了一个令牌,你就可以请求发送POST请求来改变参数,比如色调或亮度。

第五步:收尾

我倾向于通过将项目分解为直接构建在我在网上看到的东西或我以前构建的东西上的组件来处理项目,这就是为什么我希望这是一个模糊但包罗万象的交互指南。我认为在旅途中找出你不知道的地方往往是加快学习速度的最好方法。希望这能给你一些一般性的指导,激发你自己相关项目的想法。如果你做的东西很酷,请发个短信,我很想看!

自动化竞赛

决赛选手
自动化竞赛

是第一个分享

    建议

    • 阀杆比赛

      阀杆比赛
    • 角色扮演游戏挑战

      角色扮演游戏挑战
    • CNC竞赛

      CNC竞赛

    12个评论

    0.
    尼尔

    5周前

    很棒的项目! !做得好!我投了你一票,希望能有所不同。
    你真的很有天赋!!!

    0.
    为车间

    五周前答复

    非常感谢,谢谢!

    0.
    尼尔

    3天前回复

    恭喜!希望你大赢:)

    0.
    为车间

    3天前回复

    那次投票起了作用!谢谢:)

    0.
    jeanniel1

    4星期前

    这是个好主意!如果电影中的手部动作也会影响拍摄组件呢?如何防止意外影响照明、缩放或相机移动?

    0.
    为车间

    4周前答复

    谢谢!这一点很有道理。

    当你移动你的手时,因为你还必须做一个特定的手势,比如握紧拳头,并且你必须指向物体的附近,实际上有一个很好的防御措施来防止意外触发灯光/变焦/相机移动。事实上,一开始我遇到了相反的问题,事情根本不会触发。对于我将用它拍摄的东西,记录我的制作,我真的不必担心它,因为我从来没有对着相机做过手势,我知道应该避免什么,但你是对的,在电影布景上这将是一个大问题。要解决这个问题,您只需稍微更改代码中定义交互的规则。例如,你可以使它只有一个特定的演员才能控制事物,或者你必须举起双手看着物体,或者朝着某个方向看——这使它更容易与仅仅做其他事情(比如指点)的人区分开来。

    如实,这不会很快就是功能性的:)

    0.
    CraigH23

    4星期前

    很不错的!很明显,你在这里花了很多时间在各种技术上,我将把它作为书签留待以后使用。有没有人听说过用普通处理器板上的立体声摄像机而不是kinect来实现这一点?也许现在它需要太多的处理能力

    0.
    为车间

    4周前答复

    嗨,克雷格,很高兴你喜欢。我个人能给出的最好答案是:如果你建立了自己的分类器,那么很多手势的东西肯定可以用一个只运行单一颜色流的标准网络摄像头来完成。OpenCV之类的工具甚至可以在树莓派上运行。它只是可能没有那么快或健壮。我们可以从Kinect的工作原理中借鉴一些有用的概念。以及深度,它捕捉红外视频,基本上显示人和房间照明没有任何强烈的阴影/方向照明,可能会干扰图像处理。所以你可以选择IR过滤摄像头板,而不是标准的网络摄像头(价格差不多)。这就是Leap Motion的工作原理,在某种程度上,我认为许多其他类似产品也是如此。我尝试过用OpenCV从立体相机重建一个深度图像,但在我看来效果不是很好。我不确定这是否重要,因为手势的位置是相对测量的。 The only thing the depth is providing is a consistent scaling for the measurements between my hands when I zoom or 'pinch'. This is something you could overcome with calibration in order to 'cheat' without stereoscopic. It also depends if you'd actually need to take measurements over a large range of distances. Hope that makes sense and helps a bit :)

    0.
    Sal-9000

    5周前

    真的很酷!做得好

    该死,这太棒了!多么漂亮的项目:)

    0.
    为车间

    五周前答复

    谢谢你的特写!