转 第五章 速度与加速度(as3.0)

如何把MPU6050输出的加速度和角速度换算成角度 1 介绍 自己在研究一个题目,就是如何把MPU6050输出的加速度和角速度换算成角度。所以我想在市面上找一个MPU6050,可以自己输出的角度的,这样我就能做一个对比了。同时,能够把IIC引脚留出来的方便我自己开发MPU6050芯片。我在淘宝上找到了一款JY61模块。它内置的是MPU6050芯片。串口直接输出的很简单。给大家看下图片: JY61 2 MPU6050的工作过程 MPU6050 IMU在单芯 阅读详情

 恭喜各位!至此已经到了真正的动作编程部分,这就意味着:(a) 您已经坚持学习了前
面的所有章节;(b) 您感觉前面内容已经会过了,所以跳过前面的章节;(c) 您感觉无聊所
以跳过了。但是不管怎么样,要记得如果在日后的学习中遇到了相关的问题,可以回到前面
几章寻找答案。
    本章以基本运动为基础:速度,向量以及加速度。今后所有的 ActionScript 动画,几
乎都会用到这些概念。


速度向量(Velocity)
    物体运动的最基本属性就是速度。很多人把速度向量(velocity)和速度(speed)等同,
这是不对的,因为速度仅仅是速度向量的一部分,  速度向量的概念还包括一个非常重要的因
素:方向。速度向量的简单定义是:某个方向上的速度。
    如果我开车从 X 位置出发, 以每小时 30 英里的速度行驶一个小时,这时如果想找到我
可就难了。但是,如果我说以同样的速度向北行驶一个小时,那么大家就可以知道我实际的
位置了,这在动画中是非常重要的。
    这就是引入速度向量的原因,  如果知道物体在某一帧时的位置,那么只要知道它的运动
速度和方向,就可以知道物体下一帧所在的位置了。
    在介绍速度向量编码之前,先要为大家介绍一些向量的知识,  同时为速度向量做一个简
单的描述。

 

向量与速度向量
    向量由长度和方向组成。在速度向量中,长度就是速度。向量用带有箭头的线段表示,
箭头的长度就是向量的长度,箭头所指的方向就是向量的方向。

    需要注意的是,长度总是正数,如果一个长度为负数的向量只表示该向量的反方向.

    还要注意向量没有起点,向量不能说明哪里是起点哪里是终点,它仅仅表示出了物体移
动的速度与方向。因此,如果两个的方向及长度都相同,即使它们位于不同位置,那么它们
仍是两个相等的向量。

 

单轴速度
     首先,为了简化这个问题,把速度(向量)只放在一个轴上:x 轴(水平轴)。让物体向从
屏幕的左侧到右侧——这样会比较符合习惯, 移动速度就是物体每一帧移动的像素值。 因此,
如果说速度向量在 x 轴上为 5,就意味着物体在每一帧都会右移动 5 个像素。同样,如果
速度向量在 x 轴上为 -5,那么物体每一帧就会向左移动 5 个像素。
     到现在为止大家都能跟上吗?我们刚刚提到了向量长度等于负值, 科学地讲,速度向量
实际上应该为 5,而方向应为 180 度。同理, y 轴正半轴上的速度向量应为 90 度(垂直向
下),而负 y 轴负半轴上的速度向量应为 270 或 90 度(垂直向上)。
事实上,当计算 x,y 速度向量的分量时,通常可以记作正数或负数,比如“ x 速度向量为
-5”。在 x 轴上把减号看成“向左”的指示符,在 y 轴上则是“向上”的指示符。在本书
中,将用 vx 表示 x 轴的速度向量,用 vy 表示 y 轴的速度向量。 vx 为正数表示向右移
动,为负数表示向左移动, vy 为正数表示向下, vy 为负数表示向上。
     本章的许多例子都会让物体做出各种移动效果。为了不让每个例子都花时间绘制物体,
我们下面创建一个 Ball 类,这样就可以经常重复使用它了。
package {
 import flash.display.Sprite;
 public class Ball extends Sprite {
  public var radius:Number;
  private var color:uint;
  public function Ball(radius:Number=40,color:uint=0xff0000) {
    this.radius=radius;
    this.color=color;
    init();
  }
   public function init():void {
     graphics.beginFill(color);
     graphics.drawCircle(0,0,radius);
     graphics.endFill();
   }
  }
}
      今后无论何时引用这个类,都要把这个类与工程放在一起,这样只需要使用 new
Ball(size, color)就可以了创建一个小球了,或者可以把这个类放在一个特定的位置,并
将其所在目录加入类路径中。现在已经有了运动主体,以下是第一个速度向量的示例,文档
类 Velocity1.as :
package {
  import flash.display.Sprite;
  import flash.events.Event;
  public class Velocity1 extends Sprite {
   private var ball:Ball;
   private var vx:Number=5;
   public function Velocity1() {
     init();
   }
   private function init():void {
     ball=new Ball ;
     addChild(ball);
     ball.x=50;
     ball.y=100;
     addEventListener(Event.ENTER_FRAME,onEnterFrame);
   }
   private function onEnterFrame(event:Event):void {
     ball.x+= vx;
   }
  }
}
     在这个例子中,首先设置一个 x 轴速度向量(vx)等于 5。记住是指每一帧 5 像素,所
以,在每一帧中, vx 都会被加到 ball 的 x 属性中。 init 方法将小球放到舞台上并为
enterFrame 设置事件处理函数。每走一帧,小球都会在前一帧的位置基础上向右移动 5 个
像素。怎么样很不错吧,嗯?
给 vx 一个较大或较小的值,或者给个负数来试试,并观察一下物体运动的方向。
双轴上速度向量
     使用两个轴对物体进行移动也非常简单,只需要定义 vx 和 vy,并在每一帧将 vx 加
到 x 属性上, vy 加到 y 属性上。下面一个示例(Velocity2.as):
package {
  import flash.display.Sprite;
  import flash.events.Event;
  public class Velocity2 extends Sprite {
   private var ball:Ball;
   private var vx:Number=5;
    private var vy:Number=5;
   public function Velocity2() {
     init();
   }
   private function init():void {
     ball=new Ball ;
     addChild(ball);
     ball.x=50;
     ball.y=100;
     addEventListener(Event.ENTER_FRAME,onEnterFrame);
   }
   private function onEnterFrame(event:Event):void {
     ball.x+= vx;
     ball.y+= vy;
   }
  }
}
大家可以试着改变一下速度变量,别忘了还有负数。


角速度
    假如想让物体以每帧 3 像素的速度向 45 度的位置移动,在这个描述中我们看不到 vx,vy
的影子。但是,大家已经学习了使用 vx 和 vx 移动物体的例子,回忆一下第三章所讲的三
角学,每一帧让小球以 3 像素的速度向 45 度角的位置移动。在这个图中加入一条边后,

这就是一个由已知角度与斜边构成的直角三角形!

      请注意,这个三角形的两条位于 x,y 轴上的直角边。事实上, x 轴上的直角边长度等
于小球所要移动的 x 距离, y 轴上的直角边等于 y 距离。不要忘记,在直角三角形中,
只要知道一条边和一个角,就可以求出其它所有边和角的信息。因此,已知角度为 45 度,
斜边长为 3 像素,就可以使用 Math.cos 和 Math.sin 求出 vx 和 vy 的长度。
      角的邻边长度为 vx,因为角的余弦值等于邻边/斜边。也可以说,邻边等于角的余弦值
乘以斜边。同样,对边长为 vy 的边,因为角的正弦值等于对边/斜边,或是对边等于正弦
乘以斜边。实际使用的代码:
vx = Math.cos(angle) * speed;
vy = Math.sin(angle) * speed;
      在使用 Math 函数之前你还敢忘记将 45 度角转换为弧度值吗!一旦获得了 vx 和 vy
的值,就可以将它们加到物体的 x,y 坐标上,这样就运动起来了。下面一个示例
(VelocityAngle.as)代码如下:
package {
  import flash.display.Sprite;
  import flash.events.Event;
  public class VelocityAngle extends Sprite {
   private var ball:Ball;
   private var angle:Number=45;
   private var speed:Number=3;
   public function VelocityAngle() {
     init();
   }
   private function init():void {
     ball=new Ball
     addChild(ball);
     ball.x=50;
     ball.y=100;
     addEventListener(Event.ENTER_FRAME,onEnterFrame);
   }
   private function onEnterFrame(event:Event):void {
     var radians:Number=angle * Math.PI / 180;
     var vx:Number=Math.cos(angle) * speed;
     var vy:Number=Math.sin(angle) * speed;
     ball.x+= vx;
     ball.y+= vy;
   }
  }
}
      与前面 vx,vy 主要不同的地方是变成了 angle 和 speed,计算出的速度向量作为局部
变量被使用。当然,由于是一个简单的示例,角度(angle)和速度(speed)都不变,那么完全
可以只计算一次,然后保存在类中作为变量。而对于更高级的运动来说,角度和速度会是应
是不断变化的,所以 vx 和 vy 的值也是变化的。
只需要改变角度(angle)与速度(speed),就可以改变物体运动的速度及角度。下面,让从向
量的角度审视一下这个例子。

向量加法
    当在一个平面坐标中有两个向量时,使用向量加法可以求出两个向量的合成向量。合成
向量是一条从第一个向量的起点连接到最后一个向量终点的向量。 可以看到三个向量相加

及一个合成向量。
    结果与向量所在的位置无关。可以说物体是先沿着这条路前进,再沿那条路前进,然后
再到另一条路,顺序可以任意选择,或者可以说物体在这三条路上都走过一次。只要给出速
度及方向就可以让物体向终点移动。
    在上一节例子中,如果将 x 轴的速度向量向右,再将 y 轴的速度向量竖直向下,那么
合成向量就是全部向量的总合。

 

鼠标跟随
     让我们使用速度向量的概念解释一下早前的一个问题。回到第三章,我们曾使用一个箭
头指向鼠标位置的例子, 在这个示例中使用 Math.atan2 计算鼠标与箭头之间的夹角,并使
箭头旋转到这个角度上。再根据刚才所学的知识,计算出当前角度的速度向量。这个示例中
同样使用 Arrow 类,所以大家要把它找出来,然后与 FollowMouse.as 文档类放在同一目
录下:
package {
  import flash.display.Sprite;
  import flash.events.Event;
  public class FollowMouse extends Sprite {
   private var arrow:Arrow;
   private var speed:Number = 5;
   public function FollowMouse() {
     init();
   }
   private function init():void {
     arrow = new Arrow();
     addChild(arrow);
     addEventListener(Event.ENTER_FRAME, onEnterFrame);
   }
   private function onEnterFrame(event:Event):void {
     var dx:Number = mouseX - arrow.x;
     var dy:Number = mouseY - arrow.y;
     var angle:Number = Math.atan2(dy, dx);
     arrow.rotation = angle * 180 / Math.PI;
     var vx:Number = Math.cos(angle) * speed;
     var vy:Number = Math.sin(angle) * speed;
     arrow.x += vx;
     arrow.y += vy;
   }
  }
}
    这是一个相当复杂的效果,不过这里大家都能够看懂。先要计算出箭头与鼠标的 x 距
离和 y 距离,并使用 Math.atan2 计算出它们的夹角。然后使用这个角度使箭头旋转,再
使用 Math.cos 和 Math.sin 与速度相乘计算出 x,y 速度向量,最后将它们加到箭头的坐
标上。

速度向量扩展
      Sprite 影片,影片剪辑或任何的显示对象都有许多属性可以使用,而这些属性大多数
都有比较大的取值范围,可以让我们制作出多种多样的动画。也许,速度向量一词用于这些
属性上并不合适,但是在概念上是相同的,所以我也通常使用 v(velocity) 为变量命名的
首字母。 在一个影片旋转的例子中,通常在每一帧上将物体的 rotation 属性增加一些数值,
只要加入更大的数值就可以让物体旋转得更快,反之就会更慢。不论正确与否,我通常将旋
转速度变量命名为 vr,表示旋转速度。同样使用 Arrow 影片,文档类
RotationalVelocity.as:
package {
  import flash.display.Sprite;
  import flash.events.Event;
  public class RotationalVelocity extends Sprite {
   private var arrow:Arrow;
   private var vr:Number = 5;
   public function RotationalVelocity() {
     init();
   }
   private function init():void {
     arrow = new Arrow();
     addChild(arrow);
     arrow.x = stage.stageWidth / 2;
     arrow.y = stage.stageHeight / 2;
     addEventListener(Event.ENTER_FRAME, onEnterFrame);
   }
   private function onEnterFrame(event:Event):void {
     arrow.rotation += vr;
   }
  }
}
      速度向量值为 5,方向为顺时针运动。同样的道理,可以将其它属性也加以改变,变量
名仍使用 v 字系列,就像这样:
arrow.x += vx;
arrow.y += vy;
arrow.alpha += vAlpha;
arrow.rotation += vr;
arrow.scaleX = arrow.scaleY += vScale;
// etc.
      在本书中看到很多这样的示例,所以希望大家原谅我经常使用 v 字母作开头,它的意
思只是指它们是速度向量的“兄弟”。下面来学习加速度。

 

加速度
    通常认为加速度就是使速度加快,减速度就是使速度减慢。没错,在本书中,为加速度
作了一个更为科学的定义。
     速度(向量)和加速度有很多相同之处, 它们都是向量(或矢量)。 速度(向量)和加速度(向
量)都用量值(大小)和方向进行定义。然而,速度向量是改变物体位置的,而加速度是改变
其速度向量的。
     想象一下,你坐在车上,然后启动车子,踩油门。什么是加速度?踩下油门以后(等同
于加速),速度向量开始发生变化(速度开始加快,方向的变化于方向盘决定)。过一两秒后,
速度将提升至每小时 4 到 5 英里,随后时速会变为 10 英里,20 英里,30 英里等等。发动机
以其速度向量驱动汽车前进。
    因此,加速度的通俗定义是:增加到物体速度向量上的力量。用 ActionScript 术语可
以表示为,加速度就是一个增加到速度向量上的数值。
     举一个例子,假如有一架火箭要从 A 星球飞到 B 星球。  它的方向于 A 星球与 B 星球
的位置决定,调整好方向后,开始点燃火箭。当火箭点燃后前进速度就会越来越快,当指挥
官认为火箭的速度已经足够快了,为了保持燃料,就要让火箭慢下来。假设宇宙空间中不存
在阻力,火箭以同样的速度继续飞行。当火箭不再点火时,就没有更多的力来驱动它了。因
此,就失去了加速度,速度就不再发生变化。
当火箭接近目标时, 就需要减慢速度。 指挥官应该怎么做?不能使用刹车—也不可能抓住什
么东西。这时,指挥官会让火箭转回去,就是朝相反的方向运动,并再次点火。这就使用了
负加速度,或者说反方向的加速度。然后这股力量继续改变速度,但是这时是将速度减小,
速度会越来越小,最终到达零。理想来说,这时火箭应该正处于星球地面几英寸的位置。

单轴加速度
  让我们将前面学过的知识溶入到 Flash 中进行一下实践。与第一个速度向量示例相同,
第一个加速度也只在一个轴上。回到 Ball 类中,下面是第一个示例的代码
(Acceleration1.as):
package {
  import flash.display.Sprite;
  import flash.events.Event;
  public class Acceleration1 extends Sprite {
   private var ball:Ball;
    private var vx:Number=0;
    private var ax:Number=.2;
   public function Acceleration1() {
     init();
   }
   private function init():void {
     ball=new Ball ;
     addChild(ball);
     ball.x=50;
     ball.y=100;
     addEventListener(Event.ENTER_FRAME,onEnterFrame);
   }
   private function onEnterFrame(event:Event):void {
     vx+= ax;
     ball.x+= vx;
   }
  }
}
      开始的速度向量(vx)为零,加速度(ax)为 0.2,在每一帧中加速度都被加入到速度向量
中,再加到小球的位置上。
      测试一下这个示例,我们会看到小球开始移动得非常慢,而后就会非常快速地向右侧飞
行,从而移动出舞台范围。
      下面制作一个小球的示例,允许小球拥有加速度和反加速度。在这里使用方向键,我们
已经学习过了侦听键盘事件的方法,也学过使用 keyCode 属性找到引发事件的事件对象,
再调用事件处理函数。然后与 flash.ui.Keyboard 类中的常量做比较,这个类中包括适合
用户读取的键码属性值,比如,Keyboard.LEFT, Keyboard.SPACE, Keyboard.SHIFT 等。目
前,只关心左右方向键,Keyboard.LEFT 和 Keyboard.RIGHT,使用它们来改变加速度。这
里是代码(Acceleration2.as):
package {
  import flash.display.Sprite;
  import flash.events.Event;
  import flash.events.KeyboardEvent;
  import flash.ui.Keyboard;
  public class Acceleration2 extends Sprite {
   private var ball:Ball;
   private var vx:Number = 0;
   private var ax:Number = 0;
   public function Acceleration2() {
     init();
   }
   private function init():void {
     ball = new Ball();
     addChild(ball);
     ball.x = stage.stageWidth / 2;
     ball.y = stage.stageHeight / 2;
     addEventListener(Event.ENTER_FRAME, onEnterFrame);
      stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
      stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
   }
    private function onKeyDown(event:KeyboardEvent):void {
      if (event.keyCode == Keyboard.LEFT) {
        ax = -0.2;
      } else if (event.keyCode == Keyboard.RIGHT) {
        ax = 0.2;
      }
    }
    private function onKeyUp(event:KeyboardEvent):void {
      ax = 0;
    }
   private function onEnterFrame(event:Event):void {
     vx += ax;
     ball.x += vx;
   }
  }
}
       在这个例子中,只需要检查是否按下了左右方向键。如果按下了左键,就为 ax 设置一
个负值。如果按下了右键,则是正值,如果没有按下则设为零。在 onEnterFrame 方法中,
将速度赋值到物体位置上。
       测试这个影片,会发现,我们不能完全控制物体的速度。也就是说,不能立即将影片停
止运动。如果将它的速度将得过低,就会向反方向运动。

 

双轴加速度
     与速度向量一样,可以同时在 x,y 轴使用加速度。只需要为每一个轴设置一个加速度
(用 ax 和 ay 作为变量名),将它们加入 vx 和 vy, 再将 vx,vy 赋给 x,y 属性。在上一
个例子中加入 y 轴非常简单,只需要加入:ay 和 vy 变量即可。
以下是代码(Accelertation3.as):
package {
  import flash.display.Sprite;
  import flash.events.Event;
  import flash.events.KeyboardEvent;
  import flash.ui.Keyboard;
  public class Acceleration3 extends Sprite {
   private var ball:Ball;
   private var vx:Number=0;
   private var vy:Number=0;
   private var ax:Number=0;
   private var ay:Number=0;
   public function Acceleration3() {
  init();
}
private function init():void {
  ball=new Ball ;
  addChild(ball);
  ball.x=stage.stageWidth / 2;
  ball.y=stage.stageHeight / 2;
  addEventListener(Event.ENTER_FRAME,onEnterFrame);
  stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDown);
  stage.addEventListener(KeyboardEvent.KEY_UP,onKeyUp);
}
private function onKeyDown(event:KeyboardEvent):void {
  switch (event.keyCode) {
    case Keyboard.LEFT :
     ax=-0.2;
     break;
    case Keyboard.RIGHT :
     ax=0.2;
     break;
    case Keyboard.UP :
     ay=-0.2;
     break;
    case Keyboard.DOWN :
     ay=0.2;
     break;
    default :
     break;
  }
}
private function onKeyUp(event:KeyboardEvent):void {
  ax=0;
     ay=0;
   }
   private function onEnterFrame(event:Event):void {
     vx+= ax;
     vy+= ay;
     ball.x+= vx;
     ball.y+= vy;
   }
  }
}
      请注意,本例中将上/下/左/右键的检查放到了 switch 语句中,这与 if 语句的功能
相同。
      这样就可以让小球在整个屏幕上移动了。试着让物体从左到右移动,然后按“上”键,
注意这时 x 速度向量没有受到影响,物体依然保持在 x 轴上的运动速度。

 

重力加速度
     到目前为止,已经讨论了物体对其自己施加的力量为加速度,如汽车和火箭。对于任何
通过加速度改变自身速度的力来说,还有很多种,例如重力,磁力,弹力,摩擦力等等。
     观察重力(Gravity)有两种方法。一种是从太阳系的广角镜头来看,重力就是两个天体
之间的吸引力, 这时必需要考虑两个天体间的角度和距离,才能计算出每个天体真正的加速
度。
     另一种观察重力的方法是使用特写镜头,发生在地球上。存在于现实生活中,  在地球上,
用物体间的距离决定重力的大小看起来是微乎其微的。 虽然科学来讲,  当我们在高空或高山
上重力会减小一些,但这些变化几乎是感觉不到的。因此,在水平面上模拟重力时,几乎只
使用一个固定的值,就像在前面例子中的加速度变量一样。同样也是因为,地球太大而人类
太小了, 这样一来实际的加速度方向就可以忽略不计了,只需要一个“向下”  的力就可以了。
换句话讲,无论物体在什么位置,我们都可以放心地在 y 轴上定义重力作为加速度。
     放到 ActionScript 代码上来说,只需要定义一个数值作为重力,并在每一帧加入到 vy
上,用一个分数就可以了,比如 0.5 或更小的数。如果用更大的数,物体就会显得太重了。
如果用更小的数值,物体看起来会像飘浮的羽毛。当然,这个效果也是很实用的,例如通过
不同的重力变化来模拟不同的星球。
下面这个例子加入了重力系统。完整代码在 Gravity.as ,在这里就不把它全部列出来了,
仅与 Acceleration3.as 有一点点不同。除了类以外,还有构造函数名也要变换一下,请在
最开始的变量列表中加入一个变量:
private var gravity:Number = 0.1;
在 onEnterFrame 方法中加入一句:
private function onEnterFrame(event:Event):void{
  vx += ax;
  vy += ay;
  vy += gravity;
  ball.x += vx;
  ball.y += vy;
}
    让重力值很小,是为了不让小球很快就离开屏幕,我们还可以使用方向键进行控制。前
面所制作的就是一个古老的月球登陆者的游戏。 再加入一些漂亮的图形和碰撞检测,就完成
了!(后面会学到碰撞检测,而图形就要自己完成了)
回到向量加法,如果以初始向量为起点出发,作为一个向量,每个加速度,重力,或其它附
加力都可以看作一个是添加到这个速度向量上的附加向量。 把它们全部相加后,就绘制出了
一条从起点到终点的连线,也就是合成向量,与加入到 x,y 的力是一样的。现在,想象一
下有一个热汽球的影片,也许应该加入一个名为 lift(上升) 的力,这也是一个加在 y 轴
上的加速度。不过,这次它是一个负数,表示“向上”。现在,这个物体上已经施加了三个
力:方向键的力,重力和上升力。为了让汽球上升,则上升力要略高于重力,这样也是符合
逻辑的——如果它们相等,则两种力会相互抵消掉,又回到了起点,这时只有方向键的力起
作用。
    还可以试一试风力,很明显,这是加在 x 轴上的力。取决于风吹去的方向,可以是正
向力也可以是反向力,方向从 0 度到 180 度。
角加速度
    我们说过,加速度由力和方向组成,在速度向量中的这两个要素需要分解为 x,y 。如
果大家加以留心,就会明白同样可以使用 Math.cos 和 Math.sin 的方法。代码如下:
var force:Number = 10;
var angle:Number = 45; // degrees. Need to convert!
var ax:Number = Math.cos(angle * Math.PI / 180) * force;
var ay:Number = Math.sin(angle * Math.PI / 180) * force;
      这样在每一个轴上都有了加速度,我们可以刷新每个轴上的速度向量,并更新为物体的
位置。
      继续使用本章的鼠标跟随示例,并使加速度应用在加速度上。回忆上次的示例,使用鼠
标与箭头间的夹角决定 vx 和 vy。这一次,使用同样的方法,计算 ax 和 ay,然后将加速
度值累加到速度向量中,再将速度向量赋给 x,y 属性。代码如下(FollowMouse2.as):
package {
  import flash.display.Sprite;
  import flash.events.Event;
  public class FollowMouse2 extends Sprite {
   private var arrow:Arrow;
   private var vx:Number = 0;
   private var vy:Number = 0;
   private var force:Number = 0.5;
   public function FollowMouse2() {
     init();
   }
   private function init():void {
     arrow = new Arrow();
     addChild(arrow);
     addEventListener(Event.ENTER_FRAME, onEnterFrame);
   }
   private function onEnterFrame(event:Event):void {
     var dx:Number = mouseX - arrow.x;
     var dy:Number = mouseY - arrow.y;
     var angle:Number = Math.atan2(dy, dx);
     arrow.rotation = angle * 180 / Math.PI;
     var ax:Number = Math.cos(angle) * force;
     var ay:Number = Math.sin(angle) * force;
     vx += ax;
     vy += ay;
     arrow.x += vx;
     arrow.y += vy;
   }
  }
}
      请注意,本例中将 speed 转为 force 并让它的值变得很小,是因为加速度是累加的,
我们希望让它开始的时候小一些,这个值很快就会增大。同样注意 vx,vy 被声明为类的变
量,可以由类的任意方法对其进行访问。早期它们都由每一帧重新进行计算,但是现在需要
它们保存自身的数值,并且每次要进行自加或自减操作。当然,也可以不使用 ax 和 ay 变
量,  只需要将正弦和余弦的结果直接加在速度向量上就可以,之所以这么写是为了让代码看
起来更清晰。
      目前,这些代码不是很复杂,对吗?但是回顾一下本章开始时给大家的示例,就可以发
现走了有多远。  通过学习这些基本规则,可以制作出成百上千的动态的效果——有些动画是
活灵活现的。这一章还没有完!
    OK,让我们齐心协力,看看到底能够走多远吧。

 

制作飞船
      接下来,制作一个模拟太空船的例子,计划如下。太空船专由一个类进行绘制,就像前
面用过的 Arrow 和 Ball 类一样。使用左右键控制飞船向左右旋转,上键用于点燃飞船。
当然,火箭是位于飞船尾部的。因此,火箭的力会使飞船在某个方向上进行加速运动。
      首先,需要一架飞船,在一个类中使用绘图 API 代码绘制四条白色的线,作为飞船模
型。如果大家比较有艺术天赋的话,可以用 PhotoShop 或 Swift 3D,制作一张位图,并使
用嵌入技术将其嵌入,至于嵌入外部位图请见第四章。代码如下(Ship.as):
package {
  import flash.display.Sprite;
  public class Ship extends Sprite {
   public function Ship() {
     draw(false);
   }
   public function draw(showFlame:Boolean):void {
     graphics.clear();
     graphics.lineStyle(1,0xffffff);
     graphics.moveTo(10,0);
     graphics.lineTo(-10,10);
     graphics.lineTo(-5,0);
     graphics.lineTo(-10,-10);
     graphics.lineTo(10,0);
     if (showFlame) {
      graphics.moveTo(-7.5,-5);
      graphics.lineTo(-15,0);
      graphics.lineTo(-7.5,5);
     }
   }
  }
}
    这是一个公共的 draw 方法,带有 true/false 两个值。这样,就得到了有点火和无点
火的飞船,用于表示飞船起动和熄火。图 5-8 和 5-9 所示,有点火的飞船和无点火的飞船。

飞船控制
      OK,飞船已经有了,接下来就要控制它了。刚才说过,要执行三种控制:左转,右转和
点火,分别由左右上三个键控制。本例的代码与 Acceleration3.as 非常相似,用到事件处
理函数 keyDown 和 keyUp 还有一个 switch 语句对按键进行分类处理。  先把所有代码给大
家,随后再进行解释(ShipSim.as):
package {
  import flash.display.Sprite;
  import flash.events.Event;
  import flash.events.KeyboardEvent;
  import flash.ui.Keyboard;
  public class ShipSim extends Sprite {
   private var ship:Ship;
   private var vr:Number=0;
   private var thrust:Number=0;
   private var vx:Number=0;
   private var vy:Number=0;
   public function ShipSim() {
     init();
   }
   private function init():void {
     ship=new Ship ;
     addChild(ship);
     ship.x=stage.stageWidth / 2;
     ship.y=stage.stageHeight / 2;
     addEventListener(Event.ENTER_FRAME,onEnterFrame);
     stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDown);
     stage.addEventListener(KeyboardEvent.KEY_UP,onKeyUp);
   }
private function onKeyDown(event:KeyboardEvent):void {

  switch (event.keyCode) {
   case Keyboard.LEFT :
    vr=-5;
    break;
   case Keyboard.RIGHT :
    vr=5;
    break;
   case Keyboard.UP :
    thrust=0.2;
    ship.draw(true);
    break;
   default :
    break;
  }
}
private function onKeyUp(event:KeyboardEvent):void {
  vr=0;
  thrust=0;
  ship.draw(false);
}
private function onEnterFrame(event:Event):void {
  ship.rotation+= vr;
  var angle:Number=ship.rotation * Math.PI / 180;
  var ax:Number=Math.cos(angle) * thrust;
  var ay:Number=Math.sin(angle) * thrust;
  vx+= ax;
  vy+= ay;
  ship.x+= vx;
  ship.y+= vy;
}
  }
}
首先定义 vr ,旋转速度向量,即飞船旋转的速度。初值为零,意思是没有旋转:
private var vr:Number = 0;
在 onKeyDown 方法中,如果 switch 语句发现按下了左右方向键,就赋值 vr 为-5 或 5。
case Keyboard.LEFT :
vr = -5;
break;
case Keyboard.RIGHT :
vr = 5;
break;
    然后在 onEnterFrame 处理函数中,加入 vr 作为飞船的当前旋转方向,当按下一个键
后,将 vr 重置为零。OK,以上就是旋转的问题。接下来,看一下 thrust(推力)。
    声明 thurst 变量指明每一次所用的力。很明显,只有在点火以后火箭才具有加速度,
所以在开始之前速度为零:
private var thrust:Number = 0;
    然后在 switch 语句,如果持续按着上键应将 thrust 设为较小的数值,如 0.2。在用
到推力(thrust)的时候,要绘制飞船的火焰:
case Keyboard.UP :
thrust = 0.2;
ship.draw(true);
break;
当按键释放后,设置 thrust 为零并消除火焰:
private function onKeyUp(event:KeyboardEvent):void {
  vr=0;
  thrust=0;
  ship.draw(false);
}
     认真思考 onEnterFrame 函数后,就会发现 rotation 的角度值于确定推力的大小。将
rotation 转换为弧度制并使用正余弦函数连同 thrust 一起,计算出每轴上的加速度:
private function onEnterFrame(event:Event):void {
ship.rotation += vr;
var angle:Number = ship.rotation * Math.PI / 180;
var ax:Number = Math.cos(angle) * thrust;
var ay:Number = Math.sin(angle) * thrust;
vx += ax;
vy += ay;
ship.x += vx;
ship.y += vy;
}
     测试后,让飞船飞行起来,你会惊喜地发现制作如此复杂的运动原来这么简单。如果大
家使用代码绘制飞船的话, 请不要忘记将背景色设置为黑色或其它深色,这样才能看出白色
的线条。

 

本章重要公式
在我们的工具箱中又多出了不少工具,来看看吧。
角速度转换为 x,y 速度向量:
vx = speed * Math.cos(angle);
vy = speed * Math.sin(angle);
角加速度(作用于物体上的 force )转换为 x,y 加速度:
ax = force * Math.cos(angle);
ay = force * Math.sin(angle);
将加速度加入速度向量:
vx += ax;
vy += ay;
将速度向量加入坐标:
movieclip._x += vx;
sprite.y += vy;

 

这章讲述了动量的基础 速度和加速度都是 物体运动不可少的 如果代码粘贴有误 请大家及时指出!!

多传感器融合定位 第五章 惯性导航原理及误差分析-不需要转台的IMU内参标定 多传感器融合定位 第五章 惯性导航原理及误差分析-不需要转台的IMU内参标定 参考博客:[深蓝学院-多传感器融合定位-第5章作业] 代码下载:https://github.com/kahowang/sensor-fusion-for-localization-and-mapping/tree/main/%E7%AC%AC%E4%BA%94%E7%AB%A0%20%E6%83%AF%E6%80%A7%E5%AF%BC%E8%88%AA%E5%8E%9F%E7%90%86%E5%8F%8A%E8%AF%AF%E 阅读详情

相关推荐

【超详细】基于大疆RoboMaster开发板C型的BMI088数据读取

这里以博世传感器公司产出的BMI088型号的IMU为例,其里面有3轴高精度加速度计和3轴高精度陀螺仪,其他的特性不再介绍同时这里的IMU是安装在大疆公司出产的RoboMaster开发板C型,单片机芯片是STM32F407IGH6,其外围电路已经设计好,只需要读取IMU数据即可。本篇不会介绍SPI、I2C等嵌入式通信协议,需要有一定嵌入式开发基础的同学来看文章末附代码。

lmh_12138的博客 1万+

as3 vector的运用

使用Vector类编程<br />一个array(数组)就像是把一套变量组织在一起的容器。单个数组可以含有许多不同的值。你可以储存和取得数组中的单个值(也就是数组elements(元素))。你也可以通过直接操作数组变量来成组地使用其值。最常见的是有序数组。你可以凭某个索引号从中获取值。Action Script3包括了用于索引数组的两个类。Array 类:一个可以包含各种值类型的索引数组,其包容度甚至可以允许你在同一个数组里混合各种值类型。 Vector类:也是索引数组。其元素必须都为同一个类的实例。Vec

程序人生,游戏人生! 1万+

指纹浏览器行为生物指纹(上):鼠标轨迹的物理引擎模拟(贝塞尔曲线与加速度)

本文揭示了现代风控系统如何通过动态交互行为(如鼠标轨迹)识别爬虫程序,并提出一种基于物理力学的生物拟态解决方案。文章指出,传统方法(如修改navigator.webdriver或模拟点击)已失效,风控系统通过高频采集鼠标移动数据,分析速度、加速度和加加速度等特征来区分人类与机器行为。作者强调,必须在宿主机端构建物理引擎,模拟人类肌肉运动的随机性和不完美性,通过极速IPC通道与浏览器底层交互,生成带生物特征的鼠标事件。文章分为四章,详细解析风控系统的检测原理、人类行为特征,以及如何利用贝塞尔曲线、Perlin

数据知道的博客 475

车辆动力学模型推导【看了也不一定会】

需要先理解车辆运动学模型好久不见!之前两篇文章把车辆运动学模型讲完了。这次讲一下车辆动力学模型:首先需要理解,车辆动力学模型和车辆运动学模型的不同,以及为什么要学这个:因为之前咱们推导的运动学模型,没有力,就纯纯是非常理想化的一个简易二维平面模型,不仅存在着各种误差,并且实际上无法进行控制。因为输入不能是速度,无论是电机还是发动机,输入都是力。(推导起来还是有一定难度哈,所以不要觉得自己笨。

weixin_48386130的博客 2673

陀螺仪与加速度计融合的卡尔曼滤波MATLAB完整仿真项目

简介:本项目为面向惯性导航与姿态估计的工程级MATLAB仿真实践,聚焦陀螺仪(角速度)与加速度计(线性加速度)数据的噪声抑制与最优融合。通过构建状态空间模型、设计观测方程、引入系统/测量噪声建模,并完整实现卡尔曼滤波的预测-更新闭环流程,直观展示滤波前后信号对比效果。项目包含可直接运行的M文件与可视化脚本,适用于传感器融合原理教学、嵌入式姿态解算预研及卡尔曼滤波算法入门与进阶实践。

weixin_42462474的博客 291

一篇讲透:豆包、元宝、DeepSeek、Kimi、WorkBuddy,职场里到底怎么分工

这篇文章深入分析了当前主流AI工具(WorkBuddy、豆包、腾讯元宝、DeepSeek、Kimi)的特点和使用场景,帮助读者根据不同工作需求选择合适的AI助手。核心观点包括: AI工具各有所长:豆包适合快速创作初稿,元宝擅长信息检索整理,DeepSeek强于逻辑分析,Kimi专精文本处理,WorkBuddy则更适合任务推进和成果交付。 使用前需明确需求:是要创意发散、信息整理,还是任务执行?不同阶段应选用不同工具组合。 提供了6个具体职场场景的解决方案,包括文章创作、课程设计、会议纪要等,并给出详细的操作

weixin_39284145的博客 1万+

Point类计算矢量

当要运算两点距离时,我见不少人都是用最原始的运算方法,其实2.0开始就有了Point类,可以计算两点间距离,除此之外,Point类还可 用于计算矢量,某些看似复杂的计算,用上Point类就会变得简单。当然,要巧用Point类,必需要有矢量的知识。虽然,3.0的Point类和2.0 的区别不大,但我之所以把这帖放在as3讨论区,是因为as3的Point类广泛地被其他类应用。最明显的是globalToLocal和 localToGlobal这两个方法,2.0这两个方法的参数和返回值都是Object,但3.

wkyb608的专栏 799

ArcGIS小白必看:5分钟搞定面要素转点要素+自动计算经纬度坐标(附常见报错解决方案)

本文为ArcGIS新手详细解析了面要素转点要素并自动计算经纬度坐标的完整流程。核心在于正确理解和使用坐标系,并掌握ArcToolbox中的“要素转点”等工具。文章深入剖析了常见报错(如坐标系未定义、字段计算失败)的根源,提供了从基础操作到Python脚本自动化的实战解决方案,确保数据转换的准确与高效。

weixin_29284885的博客 575

yocs_velocity_smoother介绍及参数说明

软件包摘要根据机器人速度和加速度限制绑定传入的速度消息。链接:https://github.com/yujinrobot/yujin_ocs.git(branch:indigo)速度平滑节点速度平滑节点与kobuki_node一起运行,它们将控制机器人的速度和加速度在发送到机器人之前进行限制,然后再应用到机器人。其也适用于任何其他通用ros移动底层控制。订阅主题(1)〜raw_cmd_vel(geo

Forrest's Space 1万+

vsomeip3 双机通信文件配置

验证环境 vsomeip地址Android运行命令,红色的地方需要和配置文件一样Linux运行命令,红色的地方需要和配置文件一样Linux service配置文件 ,红色的地方需要更改Android client配置文件,红色的地方需要更改,蓝色的地方可不要 ...

m0_37132481的博客 5223

Transformer论文解读

Transformer有多牛逼不用多说,时隔7年我们再来看看论文原文,看看这篇深刻改变世界的文章都说了什么。当然逐字逐句解读已经意义不大,我们只列考点。

xian0710830114的专栏 4407

加速度频域积分的实现及其局限性分析

qq

m0_38012497的博客 3153

告别LM2596!用LM5175打造400W自动升降压数控电源(附完整电路图与代码)

本文详细介绍了如何利用LM5175芯片设计400W自动升降压数控电源,替代传统的LM2596方案。通过四开关Buck-Boost拓扑结构,LM5175实现了高达98%的转换效率和400W大功率输出,支持无缝升降压切换。文章涵盖芯片选型、电路设计、PCB布局及STM32数控实现,为工程师提供完整的实践指南。

weixin_27032989的博客 600

MTM动画教程学习笔记1【第五章 速度和加速度】

第五章 速度和加速度 1. 速度:特定方向上的速率,改变对象的位置。  ball.x += vx; 加速度:改变对象速度的力。 vx += ax; 角速度和角加速度 2.可以通过三角函数来计算角速度分别作用于x轴和y轴上的速度,同理角加速度也是,通过三角计算分给作用于x和y上的加速度。 speed = 5; vx = Math.sin(angle) * speed; // ang

wyr0924的专栏 742

别再死磕NFP了!用Python+遗传算法搞定异形件自动排版(附完整代码)

本文介绍了如何利用Python和遗传算法实现异形件智能排版,解决传统NFP方法计算复杂的问题。通过Shapely库处理几何运算和DEAP库搭建遗传算法框架,结合模拟退火策略避免局部最优,显著提升材料利用率。附完整代码和优化技巧,适用于服装裁剪、金属加工等行业。

weixin_26965807的博客 236

第95节:多模型多卡推理管理

多模型推理:在同一硬件平台上同时部署多个不同或相同的深度学习模型,满足多任务需求。多卡推理:利用多块 GPU 资源,提升推理吞吐量与并发能力。目标:合理分配 GPU 资源,实现高效、低延迟的推理服务。

yumeiguo的博客 218

关于加速度计收藏的几篇文章

I2C通信之Arduino与加速度传感器ADXL345:https://blog.csdn.net/acktomas/article/details/88072797 Arduino学习笔记二三轴加速度传感器ADXL345:https://blog.csdn.net/u010216127/article/details/8974085 ADXL345加速度计使用心得(带中断唤醒):https:/...

acktomas的博客 852

网表导入virtuoso后发现pg pin忘记connect_pg_net/globalNetConnect怎么办?

数模混合项目中经常需要一些需要到virtuoso去连接的线,比如IO上的pg和一些信号线,除了在pr工作中设置skip route之外还需要做好net的赋值,告诉工具虽然我没在物理上有连接,但是实际上应该连什么net,这部分提现在网表里。在Default Net Name中也填写net name,因为这个net需要做global操作,即在顶层定义这个net,所以需要在net name后加个!打开schematic,删除指定cell pin所接net的label。

m0_61544122的博客 972

基于三周加速度传感器的计步器设计

佩戴者在跑步过程中,身体上下起伏,计步器内部的微控制器读取三轴加速度传感器的三组模拟量,通过计步算法分析,获取运动信息。佩戴者在跑步过程中,身体起伏重心高低产生变化,计步器内部的振动传感器就会将这一变化转换为数字量送至控制单元,从而获得佩戴者的运动信息。压力传感器是将压力的变化转化为电压的变化。利用这一特性,可将压力传感器内置在鞋的底部,当用户在行进过程中,压力传感器受到的压力不同(抬脚时脚对鞋无压力,放脚时脚对鞋有持续压力),这样,计步器的主控单元读取压力值,经过计步算法即可判断运动状态。

毕业作品网站 1770

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

惯性器件加速度计不基于转台的内参标定/多传感器融合第五章作业

加速度计内参模型 1、零偏 概念:加速度计输出中的常值偏移,及bias 2、刻度系数误差 概念:器件的输出往往为脉冲值或模数转换得到的值,需要乘以一个刻度系数才能转换成角速度或加速度值,若该系数不准,便存在刻度系数误差 3、安装误差 概念:如右图所示,b坐标系是正交的imu坐标系,g坐标系的三个轴是分别对应三个陀螺仪。由于加工工艺原因,陀螺仪的三个轴并不正交,而且和b坐标系的轴不重合,二者之间的偏差即为安装误差。 4、不需要转台的标定内参模型 上下三角模型转换: 构造函数中进行

dushib的博客 1606

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

加速度模块BMA220-Arduino详解

本文是针对DFRobot的BMA220模块资料学习的一部分补充,同时增加我个人的学习笔记

Hrilug的博客 680

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

《making things move 》第五章

《making things move 》第五章速度:在这一章里的速度,可以简单解释为 pixels per frame 。这是不太精确的,比如你做一些游戏或仿真的时候。由于帧频的不确定性(cpu占用,或过多的运动点会拖慢帧频)会发生一些问题,这些以后章节会讲,在这章,暂时用 pixels per frame向量:有大小和方向 ,大小相等,方向相同的两个向量就是相同的,跟位置没关 ,用箭头

573

【数控系统】第五章 速度前瞻

速度前瞻是数控加工中提升效率的关键技术,通过预判加工路径的速度变化实现提前加减速。研究重点包括前瞻段数确定、转接速度计算、动力学约束处理等难点。实现方案涵盖固定/自适应前瞻段数选择、S/T型加减速算法应用,以及机床动力学参数约束下的安全速度计算。实验数据表明,采用7段S型加减速的前瞻算法可显著优化加工轨迹。该技术解决了微小线段加工中的速度瓶颈问题,在保证精度的同时提高了加工效率。

两头大的博客 619

第五章、I2C总线接口设备及驱动

由于早期使用uart通信时,当进行多设备通信时,连接过于繁琐复杂,对于近距设备间通信,成本过高,所以在1982年由飞利浦公司开发出了一种基于总线的多设备通讯方式:I²C通信,总线由简洁的SCL时钟线与SDA数据线组成,多个设备都挂载到这两根上。I²C协议的设计初衷是通过减少连接线数量和简化硬件接口,实现低成本、高效的近距离设备通信。在I2C的Master模式下,STM32微控制器作为主设备,与从设备进行通信。在Memory模式下,STM32微控制器作为主设备,访问从设备的内存。以便以后的应用中使用!

a2123827797的博客 1623
上一篇: 转 第四章 渲染技术(2)(as3.0)
下一篇: 转 第六章 边界与摩擦力(as3.0)
coding_most
博客等级 码龄15年 13粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值