揭秘:CATIA中实时跟踪机械手的实现原理

前两天,Up发了这么一段视频:

CATIA机械手模型实时跟踪手部动作

视频发出之后,收到很多反馈,比如:

  • 我怀疑屏幕里放的是录像
  • 你的手上有传感器吧
  • xxx软件也能实现
  • ……

但更多的小伙伴,还是对此表示出极大的兴趣,希望了解它背后的原理。所以今天,Up特意再写一篇文章,简述一下上面动图演示的效果是如何实现的。

其实,Up发的视频下面,已经有这么一段文字描述:

    摄像头采集手部画面,通过计算机视觉相关算法,得到手部landmarks信息。对该信息处理计算,进而控制catia中的模型进行相应的运动。

今天的文章,便是在上述内容的基础上详细展开。

先说下前提,我们的代码都是在Python环境下编写的。原因很简单,我们可以站在巨人的肩膀上,直接pip安装很多现成的库,借助其中的函数,来实现我们需求的功能。

cut-off

第一部分 图像采集

我们的原理是通过计算机视觉的相关算法,去计算、分析、提取一张图片里的信息。

所以第一步,就是给它一张图片!

当然,你可以拍一张手的静态照片,输入给它。

但我们需要一个动态的跟踪效果,所以,这里我们使用 opencv 这个库来通过摄像头采集图像。

请不要纠结图像与视频的区别,因为,视频的本质就是一帧一帧的图。

至于python里用opencv通过摄像头采集画面并显示,网上已经有无数的教程,这里不再赘述,仅给出关键代码。

import cv2 cap=cv2.VideoCapture(0) while True:    success,img=cap.read()    cv2.imshow('Image', img)    cv2.waitKey(1)

通过上述代码,我们即可实现下面动图所示的效果。

Python中通过摄像头捕捉画面

cut-off

第二部分 图像分析

现在,对于视频里的每一帧,我们相当于已经有了包含一只手的图片。那么如何通过图片,分析出这只手的信息呢?

我们继续踩着“巨人”的肩部往上爬!这里,我们要用到一个叫 mediapipe 的库。如同你使用手机发微信刷短视频,无需了解内部的芯片工作原理,我们也无需知道这个库里面的算法,直接调用它的函数,即可从一张图片中提取出手的信息。

import mediapipe as mp mpHands=mp.solutions.hands hands=mpHands.Hands() mpDraw=mp.solutions.drawing_utils imgRGB=cv2.cvtColor(img,cv2.COLOR_BGR2RGB) results=hands.process(imgRGB)

但问题是,从img对象里得到的这个results是个啥,我们不得而知。别着急,一步一步来。

首先,我们可以用 mediapipe 库里的 draw_landmarks,将得到的结果画在输出的图像上。

mpDraw = mp.solutions.drawing_utils for handLms in results.multi_hand_landmarks:    mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS)

将上述几段代码整合起来,我们便可以得到下面的效果。 

将手部landmark信息体现在画面中

但这个输出结果,只是视觉上让我们直观地感受到了:程序捕捉到了手!我们如果想进一步计算分析,还是要从结果中拿到数据的。

事实上,如果你print一下 handLms.landmark 对象的话:

print(handLms.landmark)

你会得到这样的输出结果——一组包含21个xyz坐标的数据。

[x: 0.4078216850757599 y: 1.1648612022399902 z: 3.967853672293131e-07 , x: 0.44470182061195374 y: 1.1646361351013184 z: -0.030627014115452766 , x: 0.47610029578208923

y: 1.1487294435501099

…………

z: -0.05056781694293022]

其实,这些数据,对应的就是手部的一些关键点的信息,这些关键点,也就是我们前面反复提到的landmark。

手部landmark对应的21个点

至此,我们得到了足够的信息,来支撑我们进行下一步的计算。

cut-off

第三部分 CATIA模型执行动作

事实上,如果我们单纯地将这些坐标在part里建成点,便可以实现映射到CATIA的效果。而关于Python通过Automation开发的方式控制CATIA,之前Up以及发过太多视频教程,甚至还写了一本书!所以这方面的内容也不再多说,直接看效果。

在Catia Part文件中建立landmark点,连线并不断更新

不过,不断地更改参数、更新模型,速度实在太慢,尤其当我们想在part里将手部模型绘制得稍微复杂/逼真一些的时候。

再简单点说:不够酷!

所以,Up从网上下载了这样一个机械手的模型:

网上随便下载的机械手3D模型

但想驱动这个模型,可能不是像在Part里改个点坐标那么简单。考虑到前面提到的更新速度问题,我们这里采用Automation开发驱动DMU的方式

所以,Up又为这个手加了一那么一丢丢的DMU运动副:

给每个关节处添加了独立驱动的DMU运动副

(哎呀!一不小心摆了个糟糕的手势……)

接下来,我们就需要用前面得到的21组xyz坐标,做进一步的计算了。

比方说,通过lm9,lm10,lm11这三个点,我们可以得到中指的两个指节的方向向量Vec1,Vec2,进而求出两个指节的夹角Angel。而这一角度,正是在lm10关节处的DMU旋转副的驱动。

通过landmark关键点进一步计算所需信息

其他关节同理。

cut-off

结束语

至此,关于【CATIA机械手模型通过摄像头追踪手部运动】这一话题的技术细节,我们就都介绍完了!

但Up更希望的是,通过这个视频,以及这篇文章,引发大家对软件、对行业、对未来的思考!

在这个例子中:

  • CATIA软件作为动作的执行端,仅相当于人的手脚;
  • Automation Object相当于控制端,相当人的神经与肌肉;
  • 而真正核心的内容,是上端计算及发出的决策指令,它相当于人的大脑。

基于这种理解,小编还做过下面这些实例:

语音控制CATIA建模

用CATIA做个赛车游戏

……

所以,抛开CATIA软件不谈。

你的设想中,未来是什么样的呢?!

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空