转 第十三章 正向运动学:行走(1)(as3.0)

mechanisms:各种机制的正向运动学集合 机制 几种流行的机制的集合,它们的正向运动学,逆向运动学,工作区等。 立即下载

 前面章节介绍的都是 ActionScript 交互动画的基础,也可以说是一些高级“基础”。
现在开始,我们进入另一条有趣的技术之路,运动学。
    到底什么是运动学呢?我所找到的一些资料看起来都有些让人望而却步,  这是一项基于
高级 3D 动画编程的技术。上网搜索一下,会发现其涉及到的方程中到处都是些陌生符号,
这也成为了我们学习的最大障碍,似乎前面所学的内容都像是很基础的算法。  首先,我要说,
运动学并没有那么可怕。前面章节中只介绍了我们所需的一些基本知识,  现在就要将它们加
以组合。
    运动学研究物体的运动,但不考虑施加在物体上的质量或力,基本上是数学的一个分支。
所以,无非就是速度,方向,速度向量等等。听起来不难哈?虽然这是个非常简单的定义,
但是蕴藏在里面的内容是比较复杂的,但是要完成我们的目标已经足够了。
    当人们在计算机科学,图形及游戏等领域谈论运动学的时候, 无非就是在讨论运动学的
两个特殊的分支:正向运动学和反向运动学。让我们就从这里开始吧。

正向和反向运动学介绍
    总体而言,正向和反向运动学系统都是由相互连接的零部件构成,  如一串链条或一串由
关节相连的手臂。它们要负责整个系统的运动,以及某个零件相对于其它零件和整个系统的
运动。
    通常一个运动学系统都有两个末端:固定端(base)和自由端(free)。带有关节的手
臂通常有一端被固定住,而另一端则用于伸出去抓东西。一串链条也许有一两个末端都连在
某个东西上,或者什么都不连。
    正向运动学(Forward kinematics,缩写:FK)中的运动是以系统的固定端为起始,在
自由端进行运动。反向运动学(Inverse kinematics,缩写:IK)则是向反的:运动以自由
端为起始,回退到固定端,如果有的话。
    通常情况下,下肢在行走时都看作是正向运动学。大腿的移动带动小腿的运动,小腿的
移动带动脚的运动,最终让脚产生运动。脚的运动不会决定其它部分的运动,它所带动的就
是它本身,其位置根据下肢的位置来确定。
    一个反向运动学的例子,就是用手拉某人。这里,力作用于自由端—— 手 ——控制手,
前臂,大臂,以致整个身体的位置和运动。
    说得更细一点,例如反向运动学是一支手伸出去拿东西,  而手就传动了这个系统。当然,
也可以说,大臂和前臂也是运动的,它们控制了手的位置。没错,不过最直接的目的是把手
放在某个特定的位置。这就是传动力。它不是一种实际的力,而是一种意图。前臂和大臂只
是根据结构的需要通过排列它们的位置来设置手的位置。
    我们会在下一章通过具体的例子弄清二者间的差别。  不过现在,要记住拖动和伸臂是一
般的反向运动学,而一个重复的循环运动,如行走,则是最常见的正向运动学,也就是本章
的课题。

正向运动学编程准备
     两种运动学编程都有如下基本要素:
■ 系统部件。我们称为关节(Segment)。
■ 各关节的位置。
■ 各关节的旋转。
   例子中的每个关节都是一个长方形,就像前臂、大臂,或大腿的一部分。当然,最末端
的关节可以是任意的形状,比如手,脚,钳子,刺或是入侵者的绿色激光炮。
    每个关节的都会有一个末端作为枢轴,围绕它可以进行旋转。如果这个关节还有其它子
关节的话,子关节还会以它们的另一末端作为旋转的枢轴。就像大臂绕着肩膀旋转,小臂绕
着肘部旋转,手绕着手腕旋转一样。
    当然,在很多现实的系统中,这种绕轴旋转可以有多个方向。想一想我们有多少种方法
可以让手绕着手腕旋转。到本书的最后,大家也许会在 Flash 中亲自进行一下尝试。但是,
现在,我们这个系统完全是二维的。

单关节运动
      让我们从单个关节的运动入手。首先,需要一个像关节一样的物件。设想一下,它应该
是一个继承自 Sprite 的自定义类。因为 sprite 影片可以进行绘图,设定位置,旋转,加
入显示列表。以下是这个类 Segment.as:
package {
  import flash.display.Sprite;
  import flash.geom.Point;
  public class Segment extends Sprite {
   private var color:uint;
   private var segmentWidth:Number;
   private var segmentHeight:Number;
   public var vx:Number = 0;
   public var vy:Number = 0;
   public function Segment(segmentWidth:Number,
   segmentHeight:Number,
   color:uint = 0xffffff) {
     this.segmentWidth = segmentWidth;
     this.segmentHeight = segmentHeight;
     this.color = color;
     init();
   }
   public function init():void {
     // 绘制关节
     graphics.lineStyle(0);
     graphics.beginFill(color);
     graphics.drawRoundRect(-segmentHeight / 2,
     -segmentHeight / 2,
     segmentWidth + segmentHeight,
     segmentHeight,
     segmentHeight,
     segmentHeight);
  graphics.endFill();
  // 绘制两个“枢轴”
  graphics.drawCircle(0, 0, 2);
  graphics.drawCircle(segmentWidth, 0, 2);
}
public function getPin():Point {
  var angle:Number = rotation * Math.PI / 180;
     var xPos:Number = x + Math.cos(angle) * segmentWidth;
     var yPos:Number = y + Math.sin(angle) * segmentWidth;
     return new Point(xPos,yPos);
   }
  }
}
      用宽度、高度、颜色,以及绘制一个圆角矩形定义一个关节。再绘制两个小圆,一个放
在关节的注册点(0,0)位置上,另一个则放在相对的另一个末端,这两个“枢轴”用于关
节之间的相互连接。(大家也许注意到了两个公共变量 vx 和 vy。稍后在本章的“处理反
作用力”一节会做更多的介绍)下面一段代码使用不同的宽度和高度创建了若干个关节
(segment),给大家一些创建 Segment 类实例的启发:
var segment:Segment = new Segment(100, 20);
addChild(segment);
segment.x = 100;
segment.y = 50;
var segment1:Segment = new Segment(200, 10);
addChild(segment1);
segment1.x = 100;

segment1.y = 80;
var segment2:Segment = new Segment(80, 40);
addChild(segment2);
segment2.x = 100;
segment2.y =120;
这段代码的执行结果如图 13-1 所示。

转 <wbr>第十三章 <wbr>正向运动学:行走(1)(as3.0)

图 13-1 一些关节示例
    图 13-1 中一个要点是关节的宽度可以决定两个枢轴间的距离,关节实际的宽度超出了
二者的范围。我们可以看到每个关节都放在了 x 轴为 100 的位置上。虽然它们的左侧的边
没有排列整齐,但所有左侧的枢轴却排列得很整齐。当我们旋转关节时,则会绕着左侧的枢
轴进行旋转。
    我们同样注意了 Segment 类的代码有一个公共的 getPin() 方法,返回一个
flash.geom.Point 的实例。它将返回右侧枢轴的 x,y 坐标。显然,它会随着关节的旋转而
改变,所以我们使用一些基本的三角学来计算这个位置。这也就是下一个关节将连接上的位
置——我们会在本章看到下一个关节。
    对于第一个例子程序,SingleSegment.as,已经创建好了… …在舞台上放置单个关节。
同时,我还创建一个滑块类 SimpleSlider.as 加入到了这个项目中。大家可以从本书的下
载页面 www.friendsofed.com 中进行下载,这样我们就可以在任何时候自由地使用这个类
了,它用于在运行时对数值进行调整。对于这个滑块我们可以在构造函数中设置最小值,最
大值,以及当前取值。下面例子中,将最小值设为 -90,最大值设为 90,取值设为 0。这
个类文件结合了上述所有内容:
package {
  import flash.display.Sprite;
  import flash.events.Event;
  public class SingleSegment extends Sprite {
   private var slider:SimpleSlider;
   private var segment:Segment;
   public function SingleSegment() {
     init();
   }
   private function init():void {
     segment = new Segment(100,20);
     addChild(segment);
     segment.x = 100;
     segment.y = 100;
     slider = new SimpleSlider(-90,90,0);
     addChild(slider);
     slider.x = 300;
     slider.y = 20;
     slider.addEventListener(Event.CHANGE,onChange);
   }
   private function onChange(event:Event):void {
     segment.rotation = slider.value;
   }
  }
}



转 <wbr>第十三章 <wbr>正向运动学:行走(1)(as3.0)
图 13-2 动起来了!
    意思是说无论何时滑块(slider)的取值发生了改变,都将调用 onChange 方法,设置
segment 的 rotation 为当前滑块的值。测试一下,运行结果如图 13-2 所示。如果运行没
有问题,我们就完成了正向运动学的第一阶段。

双关节的运动
     现在我们要继续前进。最初的滑块和关节都命名为 slider0 和 segment0,再创建另一
个关节的实例,名为 segment1,还要创建一个滑块实例名为 slider1。新滑块将控制新关
节的运动,新关节的位置将由 segment0 的 getPin() 方法来确定。以下是代码,见
TwoSegments.as:
package {
  import flash.display.Sprite;
  import flash.events.Event;
  public class TwoSegments extends Sprite {
   private var slider0:SimpleSlider;
private var slider1:SimpleSlider;
private var segment0:Segment;
private var segment1:Segment;
public function TwoSegments() {
  init();
}
private function init():void {
  segment0 = new Segment(100,20);
  addChild(segment0);
  segment0.x = 100;
  segment0.y = 100;
  segment1 = new Segment(100,20);
  addChild(segment1);
  segment1.x = segment0.getPin().x;
  segment1.y = segment0.getPin().y;
  slider0 = new SimpleSlider(-90,90,0);
  addChild(slider0);
  slider0.x = 320;
  slider0.y = 20;
  slider0.addEventListener(Event.CHANGE,onChange);
  slider1 = new SimpleSlider(-90,90,0);
  addChild(slider1);
  slider1.x = 340;
  slider1.y = 20;
  slider1.addEventListener(Event.CHANGE,onChange);
}
private function onChange(event:Event):void {
  segment0.rotation = slider0.value;
  segment1.rotation = slider1.value;
  segment1.x = segment0.getPin().x;
     segment1.y = segment0.getPin().y;
   }
  }
}

转 <wbr>第十三章 <wbr>正向运动学:行走(1)(as3.0)

 

图 13-3 双关节正向运动
    快速浏览一下 onChange 方法,我们看到这里用 segment0.getPin() 的返回值来设置
segment1 的位置。与首次创建 segment1 时设置位置的代码相同。
    我们让 slider1 和 slider0 都来调用 onChange 方法。很明显,现在 segment1 的
rotation 要根据 slider1 来确定。
    测试一下,我们看到当旋转 segment0 时,segment1 依然与它的末端相连,如图 13-3
所示。要知道两者间没有实际的物理链接,而都是用数学的方法计算出来的。我们同样可以
使用 segment1 的滑块独立地对它进行旋转。为了好玩一点,改变每个关节的宽度和高度后,
程序仍可以完美地工作。不过,看起来有些奇怪,因为当 segment0 带动 segment1 运动时;
segment0 并没有带动 segment1 旋转。这就像安装了回旋稳定器,将它的方向稳定住了一
样。我不知道您是怎么样的,反正我的前臂没有装回旋稳定器(尽管可能会很酷),因此,
这样的运动看起来不太自然。真正的情况应该是,segment1 的旋转应等于 segment0 的
rotation 加上 slider1 的值。那么 TwoSegment2.as 文档类的函数应该是这样:
private function onChange(event:Event):void {
  segment0.rotation = slider0.value;
  segment1.rotation = segment0.rotation + slider1.value;
  segment1.x = segment0.getPin().x;
  segment1.y = segment0.getPin().y;
}
     现在,看起来像是真正的一条手臂了。当然,如果讨论人类的手臂,就不能像这个肘部
一样向两个方向弯曲。我们只需要改变 slider1 的范围,让最小值等于 -160 让最大值为
0,那么看上去就更加正常了,代码如下:
     slider1 = new SimpleSlider(-160, 0, 0);
     现在应该是重新思考正向运动学的最佳时机了。这个系统的固定端是 segment0 的枢轴
点,自由端是 segment1 的自由端。这时我们可以想象一下手臂。固定端的旋转和位置决定
了 segment1 的位置。 segment1 的旋转和位置决定了其自由端的位置。
                     而                                            自由端在哪无所
谓,它只是来凑凑热闹而已。因此,控制就是从固定端向前运动到自由端。
自动化过程
      这些滑块给了我们控制旋转的权力,但是我们所创建的则是像机械结构中的液压杠杆,
让零件产生运动。如果想实现真正的行走,就需要加入一些自动控制。
      只需要让每个关节平稳地前后摇摆,并让它们保持同步。听起来就像正弦波一样。
      在 Walking1.as 中,我用三角函数代替了滑块。设置一个正弦循环变量(初始为 0)
乘以 90,让数值的变化从 90 到 -90。循环变量是实时累加的,这样就可以实现摆动。接
下来就可以使用计算出的角度变量来控制两个关节了。加入 enterFrame 函数来控制动作,
这样运动就是持续的了。
package {
  import flash.display.Sprite;
  import flash.events.Event;
  public class Walking1 extends Sprite {
   private var segment0:Segment;
   private var segment1:Segment;
   private var cycle:Number = 0;
   public function Walking1() {
     init();
   }
   private function init():void {
     segment0 = new Segment(100,20);
     addChild(segment0);
     segment0.x = 200;
     segment0.y = 200;
     segment1 = new Segment(100,20);
     addChild(segment1);
     segment1.x = segment0.getPin().x;
     segment1.y = segment0.getPin().y;
      addEventListener(Event.ENTER_FRAME,onEnterFrame);
   }
    private function onEnterFrame(event:Event):void {
      cycle += .05;
      var angle:Number = Math.sin(cycle) * 90;
      segment0.rotation = angle;
      segment1.rotation = segment0.rotation + angle;
      segment1.x = segment0.getPin().x;
      segment1.y = segment0.getPin().y;
    }
  }
}

创建自然行走循环
     OK,现在我们已经可以让胳膊运动了。接下来把它变成腿。进行如下的调整:
1.将 segment0 的旋转增加 90 度,将范围减小到从 90 度开始到每个方向 45 度。
2.每个关节都要有不同的角度,因此要声明两个角度 angle0 和 angle1。
3.将 angle1 的范围减少到 45 度, 然后再增加 45 度。这样就使最终的范围变为 0 到 90
度,因此只能向一个方向弯曲,像是真正的膝关节。光这样说不能完全解释清楚,请大家试
着观察加或不加 45 度有何区别,或试着加入其它的数值,直到感觉都合适为止。
     完成的结果见 Walking2.as。下面列出 onEnterFrame 方法,其它地方没有改变:
private function onEnterFrame(event:Event):void {
  cycle += .05;
  var angle0:Number = Math.sin(cycle) * 45 + 90;
  var angle1:Number = Math.sin(cycle) * 45 + 45;
  segment0.rotation = angle0;
  segment1.rotation = segment0.rotation + angle1;
  segment1.x = segment0.getPin().x;
  segment1.y = segment0.getPin().y;
}
     OK,成功,如图 13-4 所示。开始变得像条腿了,至少运动起来像是条腿。

转 <wbr>第十三章 <wbr>正向运动学:行走(1)(as3.0)


图 13-4 循环行走
    看起来还是不像真正在走路。也许它是在漫不经心地踢球,或是在练习芭蕾舞,但就是
不像在走路。这是因为两个关节在同一时刻内向同一方向运动。它们是完全同步的,而真正
的行走过程,并不是这样的。
    关节的同步是因为它们都使用了相同的循环变量来计算各自的角度。要让它们不再同
步,我们应采用 cycle0 和 cycle1 变量,但是可以不做这么大的改变。只需要加入循环的
偏移量求出 angle1 即可,如下:
     var angle1:Number = Math.sin(cycle + offset) * 45 + 45;
     当然我们需要先定义好偏移(offset)的值。那么应该偏移多少呢?我也不知道。调整
到您认为满意为止吧。给大家一些提示:这个数应该在 Math.PI 到 –Math.PI (3.14 到
-3.14)之间。任何大于或小于这个范围的数,只是将这个数进行了重复而已。例如,我用 –
Math.PI / 2,将 angle0 向后推四分之一个周期。当然,-Math.PI / 2 大约为 -1.57,因
此我们可以试试其周边的一些数如 -1.7 或 -1.3,看看效果是好是坏。稍后,我们将放入
一个滑块来动态地进行调整。带有偏移的循环行走代码见 Walking3.as。
     “单腿行走”对我来说太残酷了,让我们加入另一条腿。需要再加入两个关节,名为
segment2 和 segment3。segment2 对象应与 segment0 位置相同,因为它也将是一个顶级
端或固定端,而 segment3 应该用 segment2 的 getPin() 方法来设置位置。
     下面,我将整个代码抽象为一个方法,名为 walk,这样比复制所有的代码让 segment0
和 segment1 运动要好得多:
private function walk(segA:Segment, segB:Segment, cyc:Number):void {
  var angleA:Number = Math.sin(cyc) * 45 + 90;
  var angleB:Number = Math.sin(cyc + offset) * 45 + 45;
  segA.rotation = angleA;
  segB.rotation = segA.rotation + angleB;
  segB.x = segA.getPin().x;
  segB.y = segA.getPin().y;
}
     注意这个函数有三个参数:两个关节,segA 和 segB,以及 cyc 代表 cycle。剩下的
代码都是我们用过的。现在让 segment0 和 segment1 行走,只需要这样调用:
     walk(segment0, segment1, cycle);
     现在,大家知道如何与它打交道了吧,那么就准备好让 segment2 和 segment3 也走起
来吧。onEnterFrame 方法如下:
private function onEnterFrame(event:Event):void {
  walk(segment0, segment1, cycle);
  walk(segment2, segment3, cycle);
  cycle += .05;
}
     如果这样做的话,就会惊奇地发现,第二条腿不见了。问题在于两条腿是完全同步的,
所以看上去像是只有一条腿。因此,要让它们不能同步运动。我们要将第二条腿与第一条腿
的运动周期进行偏移。 这就要改变 cycle 的值。只需要在 cycle 上面加上或减去一些值就
可以了,这样做比加入两个不同的变量要好得多。因此 onEnterFrame 就变成了这样:
private function onEnterFrame(event:Event):void {
  walk(segment0, segment1, cycle);
  walk(segment2, segment3, cycle + Math.PI);
  cycle += .05;
}
     为什么是 Math.PI?完整的回答是,这个值让第二条腿与第一条腿的同步相差了 180
度,因此在第一条腿向前走时,第二条腿正在向后走,反之亦然。简略的回答是,因为它奏
效了!大家可以试试其它的值,如 Math.PI / 2,观察一下这个运动,就像疾速飞跑,而不
是在行走或跑步。不过需要加以留心——说不定某一天会需要它呢!
     按照惯例文件保存在 Walking4.as 中,如图 13-5 所示。基础的关节("thighs"[大腿])
比末端关节("calves"[小腿])要稍大一些。请记住,由于我们使用的方法是动态的,所以
影片的运行与零件的大小无关。在下一个版本中,我们会用滑块使更多的部件变成动态的,
不过我强烈建议大家现在开始手动改变一下代码中变量的值,  观察一下不同的变量值所带来
的不同效果。
转 <wbr>第十三章 <wbr>正向运动学:行走(1)(as3.0)

图 13-5 看!走起来了!

hcaptcha无感验证码逆向实战:从接口分析到环境补全 本文详细解析了hcaptcha无感验证码的逆向实战过程。通过分析核心接口与加密逻辑,重点介绍了采用环境补全策略来模拟真实浏览器环境,从而绕过验证码检测。文章提供了从接口抓包、剖析hsw.js加密核心到使用Node.js搭建模拟环境的完整步骤,为自动化操作提供了一种稳健的解决方案。 阅读详情

相关推荐

Ubuntu18.04环境搭建与疑难解析:从零复现YOLO-6D姿态估计算法

本文详细介绍了在Ubuntu18.04环境下从零开始复现YOLO-6D姿态估计算法的完整流程,包括系统配置、Conda环境搭建、PyTorch安装、依赖项管理、源代码获取、数据集准备以及训练验证过程。针对Singleshotpose算法的特殊需求,提供了详细的疑难解析和性能优化技巧,帮助开发者高效完成算法复现和应用部署。

weixin_30369041的博客 457

转 第十四章 反向运动学: 拖拽与伸展(as3.0)

第十三章介绍了一些基础的运动学以及正向与反向运动学之间的区别。  前一章我们讲了 正向运动学,本章就要学习与它关系紧密的反向运动学。涉及到的动作就是拖拽与伸展。     与正向运动学的例子相同,本章的例子也是从独立的关节开始建立系统。  我们从单个关 节开始,然后到多个关节

roadProgram的专栏 1840

银河麒麟v10(x86_64)升级openssh实操成功

本文详细介绍了在银河麒麟V10系统上将OpenSSH从8.2p1升级至9.9p2版本的全过程。主要内容包括:系统环境确认、安装telnet备用连接、备份配置、卸载旧版本、安装新版本、服务配置与验证等关键步骤。特别强调了安全注意事项,如必须安装telnet作为备用连接、重要配置备份等。升级后提供了安全加固建议,包括修改SSH端口、禁用root登录等。文章还包含详细的故障排查方法和恢复方案,确保升级过程安全可靠。通过本教程,用户可以顺利完成OpenSSH版本升级,提升系统安全性。

淘淘小窝 1094

机器人——正向运动学(Forward Kinematics)与逆向运动学(Inverse Kinematics)

正向运动学是指从机器人的关节运动推导出末端执行器的运动的过程,也就是从机器人的关节坐标计算出末端执行器的位置和姿态信息的过程。反向运动学:假设我们需要让机器人的末端执行器移动到一个特定的位置和姿态,已知机器人的结构和关节运动范围,我们可以通过反向运动学计算出每个关节应该旋转的角度,以实现末端执行器的目标位置和姿态。正向运动学:假设机器人3个关节的角度分别为30度、45度和60度,已知机器人末端执行器与机器人底座的相对位置和姿态,我们可以通过正向运动学计算出末端执行器的位置和姿态信息。

To be a better man 1万+

JS实例(三)图片的缓慢放大和缩小

  我们经常能看到在一些网站中可以通过按钮实现对图片的放大或者缩小,也有可能是鼠标经过时图片放大。在本例中就是通过JavaScript实现图片的放大和缩小。   首先是进行简单的页面布局 1 <div class="imagedispose"> 2 <img src="1.jpeg" id="imaged" width="400px" height="3...

weixin_34235105的博客 314

C#实战:手把手教你用SerialPort实现RS485 ModbusRTU通信(附完整代码)

本文详细介绍了如何使用C#的SerialPort类实现RS485 ModbusRTU通信,包括硬件准备、串口配置、数据收发核心逻辑及高级通信技巧。通过实战案例和完整代码,帮助开发者快速掌握工业级通信框架的构建方法,提升设备间通信的稳定性和效率。

weixin_29207533的博客 258

(二)正向运动学

正运动学 DH参数,PoE,现代机器人学

tjw191743的博客 1615

Zemax光机热集成分析:从FEA数据导入到光学性能评估实战

在精密光学系统设计中,环境温度变化和机械应力是导致像质恶化的关键因素,这涉及到光、机、热多物理场的耦合分析。其核心原理在于,通过有限元分析(FEA)软件(如ANSYS)模拟热与力学载荷下的结构变形和温度分布,并将这些物理场数据精准映射到光学设计软件(如Zemax)中,以评估其对调制传递函数(MTF)、点列图等核心光学指标的影响。这项技术的工程价值在于,它使设计从静态的理想模型跃升至动态的工程现实,能够在设计阶段就预测并补偿环境扰动,从而显著提升光学系统在航空航天、车载镜头、高功率激光等严苛工况下的可靠性与稳

weixin_30565327的博客 356

机器人正向运动学和D-H参数方法

1 概念 1.1 机器人 本文讨论的机器人,为空间开链连杆机构,其中的运动副(转动副或移动副)常称为关节,关节个数通常即为机器人的自由度数。 即:机器人由一系列关节(Joint)和连杆(Link)组成,这些关节可能是滑动(线性)的或旋转(转动)的,它们可以按任意的顺序放置并处于任意的平面,连杆也可以是任意的长度(包括为零),它可能被弯曲或扭曲,也可能位于任意平面上,所以任何一组关节和连杆都可以构成...

hangl_ciom的博客 6万+

blenderproc 制作位姿估计数据集

blenderproc 制作位姿估计数据集 准备工作 1.首先需要去下载blenderproc的源码blenderproc,按照作者的readme文件进行编译。 2.其次需要下载bop_toolkit源码,链接如下bop_toolkit 3.说明:blenderproc主要用来生成数据,包括depth,rgb,位姿标签文件(scene_gt.json),bop_toolkit主要用来生成mask和mask_visib,scene_gt_info.json,用于判断物体的可见区域比例,如果遮挡太多考虑去掉。做

qq_43814359的博客 5699

SAP VC 可配置物料超级BOM简介

在有些业务中比如:汽车、笔记本、电脑、电梯等产品中,其中组成产品的型号个框架是确认的 ,但是框架内部的BOM是可变的,在客户下销售订单的时候,选取对应的组件 ,让后通过MRP的计算优生产线对这样的销售订单提供生产。这个时候我们需要选择我们需要的内存和硬盘的型号,还记得我们前面创建的特征值对应的吗,A对应的8G、B对应16G、X对应1T硬盘、Y对应2T硬盘,这里我们填写对应的值,我们这里选择16G的内存和2T的硬盘,B和Y。3、当我们选择了可配置物料的生产模式时,基本上就选择了按单生产的生产模式了。

我小时候很黑的博客 1万+

正向运动学(FK)

正向运动学,原理与介绍

MOV的博客 2512

从零搭建 C# + YOLO 工业视觉系统:从模型训练到上位机部署(工业级落地)

做工业质检、自动化生产线的同学都懂:一套能用的工业视觉系统,既要“检测准”,又要“界面易操作”,还要“部署稳”。之前帮某电子厂做PCB缺陷检测,一开始用Python+YOLO做检测核心,QT做上位机,结果踩了无数坑:Python推理速度波动大,QT和Python跨语言集成繁琐,数据传递容易卡顿;后来换成C# + YOLO的组合,直接打通了“模型训练-上位机开发-工业部署”全流程——C#的WinForms/WPF开发上位机高效,工业相机SDK支持完善;

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 737

转 第十三章 正向运动学:行走(2)(as3.0)

动态调整     下面,让我们来真正体验一下在循环行走中改变各个值所带来的不一样的效果。 Walking5.as 又将 Slider 滑块类加入进来,用于动态改变这些变量。     本例中,在屏幕上创建并放置了五个滑块,如图 13-6 所示。 第十三章 正向运动学

roadProgram的专栏 1085

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【as3】ActionScript 3.0体验试教学视频教程

很不错的视频教程 原文地址: [url=http://blog.sina.com.cn/s/blog_3ecb9b1101009nx0.html]http://blog.sina.com.cn/s/blog_3ecb9b1101009nx0.html[/url]   全屏观看地址: [url=http://vhead.blog.sina.com.cn/player/outer_pla...

wangangie4 124

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: 转 第十二章 粒子引力与万有引力(as3.0)
下一篇: 转 第十三章 正向运动学:行走(2)(as3.0)
coding_most
博客等级 码龄15年 13粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值