3GO模拟飞行网|3GO Cyber Air Force

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 38554|回复: 136

Freetrack on Wiimote(参数对比、实际效果对比视频、红外LED选择、主动/反射方案)

[复制链接]
发表于 2008-9-4 09:59:27 | 显示全部楼层 |阅读模式
本帖最后由 Akar 于 2011-3-30 19:34 编辑

看到了很多没必要的争论,提升并置顶此帖(2011.3.30)。
  • 另,请注意一楼贴的时间顺序是上面的最新(What's New模式);
  • 二楼是对比视频连接贴;
  • 再向后面的n楼有很多技术含量较高的帖子,建议全文阅读。


====================================================
补充:(2010.7.14)
1、DCS系列的BlackShark以及FC2.0(包括1.21版本)都可以使用WiiTrack方案,需要下载相应的补丁即可;
补丁地址:http://bbs.3gofly.com/bbs/attachment.php?aid=Njk5MzJ8ZjRjY2ZlNWZ8MTI3OTExMjU2N3wxOTMzVEx2MVo0YzRsd0VLQ0xYenlucWp2Vnk5L0hOT2sxZDFtYmpybUJYWENQbw%3D%3D
2、Win7(32/64)下使用Freetrack没有问题,记得win7的桌面DPI设定为100%,否则freetrack出错。
====================================================
加最新提醒:(2009.6.30)

Wiimote山寨版本只能识别两个红外LED点,无法实现Freetrack的高级功能!

实验者:xiebing08
帖子链接:http://bbs.3gofly.com/bbs/thread-179961-1-1.html
原装与山寨对比图(对比不准确,仅供参考):http://bbs.3gofly.com/bbs/thread-180108-1-1.html

建议对策:
请携带有蓝牙功能的笔记本,安装好freetrack,现场测试是否能识别4个点!
感谢xiebing08!

====================================================
加入最新试验结果(2009-4-1):
DSC02146-2.jpg
以上照片所示方案,只需4只LED照明(其他的LED挡住即可)即可满足反射方案所需的红外照明功率,减少到2只LED时,会有可靠性下降的现象.
====================================================

更新(2008-12-19):
反光条.JPG
购买照片中织物反光条的链接:http://auction1.taobao.com/auction/item_detail-0db2-e065892c32576d1f8211f1941988c7f2.jhtml
940纳米红外发射管,淘宝上也有不少,角度不满足要求的可以自己磨制.

====================================================

更新(2008-12-2):
这次更新要特别感谢BlackEagle的提醒,高频红外线(940nm属于此类)长时间照射对眼睛有害,容易诱发白内障,故此次改进的思路有两个:
1、减少照射功率,提高红外利用率;
2、改变照射角度,用帽檐遮挡红外线。
照片如下:
<---减小红外发射功率,增加效率

DSC02147-1.jpg <---提高照射角度,利用帽檐遮挡红外线。
改进与使用感受:
1、小电路板明显不发热了,9V供电由原来供4组、每组6个LED变为2组、每组7个LED,每组增加了一个可见光LED,大幅减少红外发射功率,电路板没有再发热过;
2、小电路板中间的孔留得小了,只给红外窗口留了空间,这样做是为了提高红外光利用率;
3、使用感受上没有什么变化;
4、由于帽檐遮挡,游戏中的绝大多数时间都没有被红外线照射到眼睛!
====================================================
更新(2008-12-1):

为了减少不必要的干扰信息,降低发生歧义的可能性,我把一些过时的信息做了删减,方便新来的飞友理解。====================================================
更新(2008-11-30):
为了防止忘记给红外照明断电,串接了一个可见光LED,新方案延长了红外LED的寿命,消除了一个火灾隐患!

IMG_2359-6x4.jpg
====================================================
更新(2008-11-28):基于FT2.2与Wiimote的3点式反光方案成熟
  • 基于FreeTrack2.2与Wiimote的3点式反光模式的效果在选取合适反光材料的情况下已经非常成熟,值得在飞友中推广使用了;
  • 在FreeTrack2.2中的3点式的速度表现要好于1点式速度表现!个人认为延迟已经达到性能极限了,造成这种结果的原因可能是因算法不同;
  • 如果有人想制作基于FreeTrack2.2和Wiimote的视角控制装置,我建议制作3点式的,无论速度表现还是功能上都强于1点式。
  • 如果只是拿Wiimote做红外摄像头应用的话,GlovePIE可以完全被FreeTrack2.2代替了!

实验所使用的3种反光材料照片:
reflection1.jpg
从上至下依次为:
1、纺织品用反光条。常被用作缝制在衣物、背包、鞋帽等穿戴物上,外观为灰色;
2、被卖家称为“钻石级”的3M反光贴;
3、用来贴在车上的反光贴纸;
结果来看,第一种织物用反光材料是比较理想的反光材料。

制作的帽子照片:
IMG_2309.jpg

这个帽子的例子并不完美,不必原样照搬,自行设计的时候注意不要让3个反光点被帽檐或者支架结构挡住就可以了。
附上TrackIR4的3点反光方案供参考:
222222.jpg
FreeTrack2.2的调试网上有很多热心网友做了翻译和整理,我就不再敖述了。
====================================================
更新:
Wii对850nm和940nm红外的实验数据摘录
来源:
http://www.wiimoteproject.com/  inio Wiki Admin

To determine the relative sensitivity of the Wii Remote, two leds with similar characteristics were used: SFH4231 (940nm, 180mW TRP @ 1A) and SFH4230 (850nm, 200mW TRP @ 1A).  Both devices provide an approximately Lambertian distribution of light, with a 1A maximum continuous current and 1.8V drop.

The LEDs were attached in series with a laboratory power supply, 5-digit ammeter, and 0.5-ohm resistor.  The LEDs were positioned vertically approximately 30cm apart, facing a Wii Remote approximately 5m away.  Measurements were taken with camera gain values between 0x10 to 0x40 and minimum blob size of 3.  For each configuration, the minimum current at which each LED became visible was recoded.  Gain values higher than 0x40 resulted in the 850nm LED being undetectable even at 1A.


  • Without filter window in place: The 940nm LED was detectable with approximately 12% the current required to detect the 850nm LED.
  • With filter window in place: The 940nm LED was detectable with approximately 15% the current required to detect the 850nm LED.
  • Executive summary:  The Wii Remote is at least 5 times more sensitive to 940nm than 850nm.

结论:
  • 无滤光片的情况下:940nm的LED需850nm12%的电流即可被wiimote探测到;
  • 有滤光片的情况下:940nm的LED需850nm15%的电流即可被wiimote探测到;
  • 对Wiimote来说,940nmLED有着至少5倍于850nmLED的被探测效率
  • 无论850nm抑或是940nm的LED都可以被wiimote探测到,但是要达到同样的效果,850nm的LED需至少5倍于940nmLED的功率。


既:940nm的红外LED全面大幅领先胜出!====================================================
更新(2008-11-16):
反光模式加入

照明板照片:
11111111.jpg

红外照明.jpg

反光片:
反光片.JPG

贴在眼镜上的反光片:
3333333.jpg

试用结论:

  • wiimote+Freetrack2.2的方案在调教之后几乎完美匹敌TrackIR3!
  • 此方案可用,但最新的3点式方案(2008-11-30)在功能和反应速度方面更好一些
====================================================
成本初步估计不超过280元
,使用效果很好!
  • 硬件:wii-remote(wiimote)、蓝牙适配器、波长940nm的大角度红外LED、反光布条(反光方案专用)、LED支架
  • 软件:FreeTrack2.2、蓝牙驱动、GlovePIE(可选)

几张图片:
wiimoteFrame1.jpg

wiimoteFrame2.jpg

有必要说一下GlovePIE,这个东西很多功能,模仿TrackIR只是其中的一种功能而已,有兴趣的读一下附件中的documentation.rar
  • 挑选红外LED除了要求是940nm的之外,还要注意角度问题,这里有图例:
3xLED.JPG
  • 左边2种是大角度的,右侧的这种是小角度的,不适用本例WiiTrack应用!
  • 如果大角度的940nmLED不好找,可以将小角度的LED顶部磨平代替

Why Wiimote? Why not cam?Why not TRx
1、wiimote的刷新率达到每秒100次,即100Hz。(TrackIR4不过是120Hz)
2、CPU占用率明显优于freetrack2.x+摄像头方案:
        • GlvovePIE的代码中("ar.XOffset = (Wiimote.Dot1x + Wiimote.Dot2x) / 2")wiimote.Dot1x就是一个从wiimote中直接送出来的数字形式的数据,而不是freetrack中的模拟图像数据,这样可以把把CPU很大程度上解放出来!
        • 实际使用时的CPU占用率也证明了上述理论推断是正确的。
        • 不是原因的原因:wiimote经过glovePIE的环境几乎能实现所有在Wii游戏机中的功能!电光枪、光剑、棒球、鼠标控制、方向盘、脚舵、数据手套、LED Pen……
        • TR4和wiimote性能几乎一样,TR5太贵了。


[ 本帖最后由 Akar 于 2009-6-30 11:58 编辑 ]

documentation.rar

91.63 KB, 下载次数: 523

评分

1

查看全部评分

 楼主| 发表于 2008-9-5 12:13:58 | 显示全部楼层

WiiTrack视频效果专贴!

WiiTrack在飞行游戏中的应用,从视频上看,是2轴应用;
http://www.youtube.com/watch?v=qbelXx-3dMA





WiiTrack在赛车游戏rfactor中的效果视频(看起来应该是2轴的效果):
http://www.youtube.com/watch?v=0_13eDWtQ1s&feature=related

正品TrackIR赛车游戏rfactor中的效果视频效果:
http://www.youtube.com/watch?v=fMd17ObRw7c&feature=related

上面两个是TrackIR与WiiTrack的效果对比,看起来区别不大,但TrackIR版本不明,延迟情况的视频请参考网友“空之”的视频!


WiiTrack的6DOF应用视频:
http://www.youtube.com/watch?v=Y1H_j-XcJDw

GlovePIE使用教学视频:
http://www.youtube.com/watch?v=dTvDMkt6ZJQ&NR=1

Freetrack配合30FPS摄像头的视频X2:
http://www.youtube.com/watch?v=6n20uX39dlc
http://www.youtube.com/watch?v=-2AtK-M7TRg&feature=related
看过上面2个视频之后,我开始敢用名誉保证这个和wiimote方案差的太多了,如果使用30FPS摄像头的freetrack的延迟如视频所示的话,那wiimote方案完全可以说是“没有延迟!”哈~~


再加上网友“空之”制作WiiTrack之后视频:
IL2:
http://you.video.sina.com.cn/b/16531108-1352823624.html
Live For Speed:
http://vhead.blog.sina.com.cn/player/outer_player.swf?auto=1&vid=16590615&uid=1352823624
测试反应速度的视频(很重要,这是wiitrack方案的显著优点——低延迟的展示):
http://vhead.blog.sina.com.cn/pl ... &uid=1352823624

[ 本帖最后由 Akar 于 2008-11-19 21:08 编辑 ]
 楼主| 发表于 2008-9-8 22:01:05 | 显示全部楼层

GlovePIE Code for 1 LED and 2 LEDs.

/*
This was Modified based on "PipoXYZ's 2Dof, 2Leds, Flight- and RaceScript."

Modifications:
1. "smooth()" was added;
2. var.Angle is initialized by 1200 instead of 200;
3. Beep when Pitch over 90 degree (at the edge of pitch in LockON)
4. Changed keys for sensitive and centerView


Keys:
NumPad- = Less Sensitive
NumPad+ = More Sensitive
NumPad5 = Set CenterView
Joystick2.button4 pressed = set var.Angle to 3000


Compatible with these games:
http://www.naturalpoint.com/trac ... nced-games-all.html
Emulates Yaw/Pitch


Setup:
Place your Wiimote near your monitor facing your head.
Wear two IR-leds on your head facing the Wiimote.
The leds can be attached to glasses, headphones, caps or something else.
*/


if starting then
   wait 200 ms
   PIE.FrameRate = 100Hz
   if Wiimote.dot2vis = true then
         var.XOffset = (Wiimote.Dot1x + Wiimote.Dot2x) / 2
         var.YOffset = (Wiimote.Dot1y + Wiimote.Dot2y) / 2
   else
      var.XOffset = Wiimote.Dot1x
      var.YOffset = Wiimote.Dot1y
   endif
   var.Angle = 1200
endif
//Sensitivity
if pressed(NumPadMinus) and var.Angle < 1200 then
   var.Angle = var.Angle + 50
   say (var.Angle)
else
   var.Angle = var.Angle
endif
if pressed(NumPadPlus) and var.Angle > 50 then
   var.Angle = var.Angle - 50
   say (var.Angle)
else
   var.Angle = var.Angle
endif
if Joystick2.button4 <> true and var.Angle > 1200 then
   var.Angle = 1200
endif
if Joystick2.button4 then //if Joystick1.button14 then
  var.Angle = 3000
endif
//Maprange
var.MinIRX = var.XOffset - var.Angle
var.MaxIRX = var.XOffset + var.Angle
var.MinIRY = var.YOffset - var.Angle
var.MaxIRY = var.YOffset + var.Angle
//Center View
if pressed(NumPad5) then
   if Wiimote.dot2vis = true then
      var.XOffset = (Wiimote.Dot1x + Wiimote.Dot2x) / 2
      var.YOffset = (Wiimote.Dot1y + Wiimote.Dot2y) / 2
   else
      var.XOffset = Wiimote.Dot1x - var.TempX
      var.YOffset = Wiimote.Dot1y - var.TempY
   endif
   say "居中"
endif
//Mapset
if Wiimote.dot2vis = true then
   var.TempDot2x = Wiimote.Dot2x
   var.TempDot1x = Wiimote.Dot1x
   var.TempDot2y = Wiimote.Dot2y
   var.TempDot1y = Wiimote.Dot1y
   var.X = (Wiimote.Dot1x + Wiimote.Dot2x) / 2
   var.Y = (Wiimote.Dot1y + Wiimote.Dot2y) / 2
   if var.TempDot1x < var.TempDot2x then
      var.TempX = (Wiimote.Dot2x - Wiimote.Dot1x) / 2
   else
      var.TempX = (Wiimote.Dot1x - Wiimote.Dot2x) / 2
   endif
   if var.TempDot1y < var.TempDot2y then
      var.TempY = (Wiimote.Dot2y - Wiimote.Dot1y) / 2
   else
      var.TempY = (Wiimote.Dot1y - Wiimote.Dot2y) / 2
   endif
else
   if var.TempDot1x < var.TempDot2x then
      var.X =  Wiimote.Dot1x + var.TempX
   else
      var.X =  Wiimote.Dot1x - var.TempX
   endif
   if var.TempDot1y < var.TempDot2y then
      var.Y =  Wiimote.Dot1y + var.TempY
   else
      var.Y =  Wiimote.Dot1y - var.TempY
   endif
endif
//smoothing
var.TrackIRYawOld = var.FakeTrackIRYaw
var.TrackIRPitchOld = var.FakeTrackIRPitch
var.FakeTrackIRYaw = ensureMapRange(var.X, var.MaxIRX, var.MinIRX , -360, 360)
var.FakeTrackIRPitch = ensureMapRange(var.Y, var.MinIRY, var.MaxIRY , -360, 360)
var.DiffX = max(var.TrackIRYawOld,var.FakeTrackIRYaw) - min(var.TrackIRYawOld,var.FakeTrackIRYaw)
if var.DiffX < 10 then
   FakeTrackIR.Yaw = smooth(var.FakeTrackIRYaw,30)
   //FakeTrackIR.Yaw = smooth(smooth(var.FakeTrackIRYaw,30),30)
  //FakeTrackIR.Yaw = kalman(smooth(var.FakeTrackIRYaw,30),0.4,0.04)
  //FakeTrackIR.Yaw = smooth(kalman(var.FakeTrackIRYaw,0.4,0.03),30)
endif
var.DiffY = max(var.TrackIRPitchOld,var.FakeTrackIRPitch) - min(var.TrackIRPitchOld,var.FakeTrackIRPitch)
if var.DiffY < 10 then
   FakeTrackIR.Pitch = 1.5 * smooth(var.FakeTrackIRPitch,30)
   //FakeTrackIR.Pitch = smooth(smooth(var.FakeTrackIRPitch,30),30)
  //FakeTrackIR.Pitch = kalman(smooth(var.FakeTrackIRPitch,30),0.4,0.04)
  //FakeTrackIR.Pitch = smooth(kalman(var.FakeTrackIRPitch,0.4,0.03),30)
endif
if FakeTrackIR.Pitch > 90 then
Beep(5000,6)
endif


以下是最新的单LED方案,也是一个速度优化版;

更新:
1、单LED,简化计算量;
2、删除注释,优化速度;
3、数字键盘的“8”和“2”分别是Zoom in 和 Zoom out;
4、NumPad5 = Set CenterView;
5、NumPad- = Less Sensitive;
6、NumPad+ = More Sensitive;
7、NumPad5 = Set CenterView;
8、Joystick2.button4 pressed = Freeze Aspect and Zoom in;


以下内容拷贝到GlovePIE中执行:

if starting then
   wait 200 ms
   PIE.FrameRate = 100Hz
   var.XOffset = Wiimote.Dot1x
   var.YOffset = Wiimote.Dot1y
   var.Angle = 1800
   var.Zoom = -0.4
endif
//Sensitivity
if pressed(NumPadMinus) and var.Angle < 1800 then
   var.Angle = var.Angle + 100
   say (var.Angle)
else
   var.Angle = var.Angle
endif
if pressed(NumPadPlus) and var.Angle > 100 then
   var.Angle = var.Angle - 100
   say (var.Angle)
else
   var.Angle = var.Angle
endif
//Zoom and Freeze
if pressed(NumPad8) and var.Zoom < 0.5  then var.Zoom = var.Zoom + 0.05
if pressed(NumPad2) and var.Zoom > -0.4 then var.Zoom = var.Zoom - 0.05
if Joystick2.button4 then
FakeTrackIR.z = 0.3    //这是当Joystick2.button4按下情况下的z轴值,可以根据自己需要调整
else
FakeTrackIR.z = var.Zoom   //这是当Joystick2.button4放开情况下的z轴值,可以根据自己需要调整

//Maprange
var.MinIRX = var.XOffset - var.Angle
var.MaxIRX = var.XOffset + var.Angle
var.MinIRY = var.YOffset - var.Angle
var.MaxIRY = var.YOffset + var.Angle
//Center View
if pressed(NumPad5) then
   var.XOffset = Wiimote.Dot1x
   var.YOffset = Wiimote.Dot1y
   say "校准居中"
endif
//Mapset
   var.TempDot1x = Wiimote.Dot1x
   var.TempDot1y = Wiimote.Dot1y
   var.X = Wiimote.Dot1x
   var.Y = Wiimote.Dot1y
   var.TempX = Wiimote.Dot1x
   var.TempY = Wiimote.Dot1y
//smoothing
var.TrackIRYawOld = var.FakeTrackIRYaw
var.TrackIRPitchOld = var.FakeTrackIRPitch
var.FakeTrackIRYaw = ensureMapRange(var.X, var.MaxIRX, var.MinIRX , -360, 360)
var.FakeTrackIRPitch = ensureMapRange(var.Y, var.MinIRY, var.MaxIRY , -360, 360)
FakeTrackIR.Yaw = smooth(var.FakeTrackIRYaw,30)
  //FakeTrackIR.Yaw = kalman(smooth(var.FakeTrackIRYaw,30),0.4,0.04)
FakeTrackIR.Pitch = 1.5 * smooth(var.FakeTrackIRPitch,30)
  //FakeTrackIR.Pitch = kalman(smooth(var.FakeTrackIRPitch,30),0.4,0.04)
if FakeTrackIR.Pitch > 90 then Beep(5000,6)
debug = var.Angle + ' Battery=' + Wiimote.Battery + ' Yaw=' + FakeTrackIR.Yaw + ' Pitch=' + FakeTrackIR.Pitch + ' Zoom=' +var.Zoom
endif  //endif for "if Joystick2.button4 then"

[ 本帖最后由 Akar 于 2008-10-10 22:25 编辑 ]
发表于 2008-9-9 20:57:30 | 显示全部楼层
好!!辛苦了!!!!!
 楼主| 发表于 2008-9-10 14:53:55 | 显示全部楼层

6DOF(6自由度)WiiTrack Code For GlovePIE

//Modified by Akar, Originally by Manuel Unternaehrer
// 6 Degrees of Freedom Headtracking with wiimote
// Inspired by Johnny Lee: http://www.cs.cmu.edu/~johnny/projects/wii/

wiimote.Leds = 3      //Choose whatever you like :-) ,需要3点led

var.DotDist = .18    //Distance left+right dot, in meters, 测量左右2只LED距离,如果你保证不了制作精度,做好之后再测量也可以。
var.DotDepth = 0.08  //Depth of middle dot,中间LED的“深度”,正值表示中间点在前,负值表示中间点在后;

//Adjust Smoothing, Amplifying (Factor) and Calibration
FakeTrackIR.x=-smooth(var.pos[1],50) //smooth(x,y)
FakeTrackIR.y=smooth(var.pos[2],50)

//FakeTrackIR.x(y,z,yaw,roll,pitch)
FakeTrackIR.z=smooth(var.pos[3],50)
FakeTrackIR.yaw=-smooth(var.yaw,50)*30
FakeTrackIR.roll=smooth(var.roll,50)
FakeTrackIR.pitch=-smooth((var.pitch - 30),50)*10

var.scenter = [1024,768,0]/2/1024      //Sensor's center

var.p1 = [wiimote.dot1x/1024,wiimote.dot1y/1024,0]
var.p2 = [wiimote.dot2x/1024,wiimote.dot2y/1024,0]
var.p3 = [wiimote.dot3x/1024,wiimote.dot3y/1024,0]

//Look for Left, Right and Middle dot;
if wiimote.dot1x < wiimote.dot2x then
   if wiimote.dot1x < wiimote.dot3x then
   var.pleft = var.p1
   var.pmid = 0
   else
   var.pleft = var.p3
   var.pmid = var.p1
   endif

   if wiimote.dot2x < wiimote.dot3x then //以下略,都是判断1,2,3点的位置并赋值的语句;
   var.pright = var.p3
   var.pmid = var.p2
   else
   var.pright = var.p2
      if var.pmid = 0 then var.pmid = var.p3
      endif
else
    if wiimote.dot2x < wiimote.dot3x then
    var.pleft = var.p2
    var.pmid = 0
    else
    var.pleft = var.p3
    var.pmid = var.p2
    endif

    if wiimote.dot1x < wiimote.dot3x then
    var.pright = var.p3
    var.pmid = var.p1
    else
    var.pright = var.p1
    if var.pmid = 0 then var.pmid = var.p3
    endif
endif

//Do the geometric stuff
if wiimote.dot1vis and wiimote.dot2vis and wiimote.dot3vis then
var.posZ = var.DotDist/Tan(Abs(var.pright-var.pleft)*45)
var.pos = ((var.pright+var.pleft)/2-var.scenter)*var.posZ + [0,0,var.posZ]

var.pmidoff = Abs((var.pright-var.pleft) cross (var.pmid-var.pleft))/Abs(var.pright-var.pleft)^2 //0..1,middle dot off-line
var.pmidcent = ((var.pright-var.pleft) dot (var.pmid-var.pleft))/Abs(var.pright-var.pleft)^2     //0..1, middle dot off-center

var.turn = aTan((0.5-var.pmidcent)/(var.DotDepth*Cos(var.pitch)/var.DotDist))
var.yaw = var.turn - 45*((var.pright+var.pleft)/2-var.scenter)[1]
var.pitch = aSin(var.pmidoff/(var.DotDepth/var.DotDist)) + 45*((var.pright+var.pleft)/2-var.scenter)[2]
var.roll = aSin((var.pright-var.pleft)[2]/Abs(var.pright-var.pleft))

debug = smooth(var.pos,50) + " " + smooth(var.yaw,50) + " " + smooth(var.pitch,50)+ " " + smooth(var.roll,50)

endif

//Test 3D Visualisation, comment out if not needed
obj4.colour= 0xFFFF00
obj4.cubesize= 10cm
obj4.x=0.
obj4.y=0.
obj4.z=1.3m
obj5.colour= 0xFFFFFF
obj5.cubesize= 2cm
obj5.x=0.
obj5.y=0.
obj5.z=1m

//cam.x=-smooth(var.pos[1],50)*5
cam.x=-smooth(var.pos[1],50)
//cam.y=smooth(var.pos[2],50)*5
cam.y=smooth(var.pos[2],50)
//cam.z=-smooth(var.pos[3],50)*3 +1
cam.z=-smooth(var.pos[3],50)
//cam.yaw=-smooth(var.yaw,50)
cam.yaw=-smooth(var.yaw,50)
//cam.roll=smooth(var.roll,50)
cam.roll=smooth(var.roll,50)
//cam.pitch=-smooth((var.pitch-30),50)
cam.pitch=-smooth((var.pitch-30),50)
 楼主| 发表于 2008-9-11 21:48:06 | 显示全部楼层

暂空

……

[ 本帖最后由 Akar 于 2008-9-17 12:45 编辑 ]
发表于 2008-9-12 20:06:52 | 显示全部楼层
。。。看不懂哦
发表于 2008-9-15 10:15:59 | 显示全部楼层
纯技术贴,需要仔细专研。
不懂。
发表于 2008-9-15 14:57:29 | 显示全部楼层
我看了一下,6DOF的视频,感觉头部幅度过大,而且好像有点丢帧................
发表于 2008-9-15 16:28:49 | 显示全部楼层
又是Johnny Lee的作品?这家伙开始搞Wii Remote的时候就牛掰得要死。Canegie Mellon净出牛人。
硬件Tracking比软件解算的确强出不只一星半点。道理就像光电鼠标一样,如果把鼠标的扫描头换成摄像头,要把鼠标垫的图象传回CPU才能算出光标动作,那电脑准得累死。
 楼主| 发表于 2008-9-15 21:23:08 | 显示全部楼层
原帖由 kuka 于 2008-9-15 14:57 发表
我看了一下,6DOF的视频,感觉头部幅度过大,而且好像有点丢帧................


参数可调,参数可能每个人都不同;
一个简单的参数实例就是在乘以一个放大系数来调节灵敏度
:)
 楼主| 发表于 2008-9-15 21:26:33 | 显示全部楼层
原帖由 RCtech 于 2008-9-15 16:28 发表
又是Johnny Lee的作品?这家伙开始搞Wii Remote的时候就牛掰得要死。Canegie Mellon净出牛人。
硬件Tracking比软件解算的确强出不只一星半点。道理就像光电鼠标一样,如果把鼠标的扫描头换成摄像头,要把鼠标垫的图 ...


嗯~说得没错!
不过我觉得6轴代码作者声明从Johnny Lee那里获得灵感是有原因的,我猜可能是源于FreeTrack的命运引起的……

[ 本帖最后由 Akar 于 2008-9-17 20:31 编辑 ]
发表于 2008-9-16 00:44:02 | 显示全部楼层
精确度和延迟时间的表现如何呢?这两项貌似最重要哦。从那个视频来看,延迟不比freetrack小,精度方面看不出来。
 楼主| 发表于 2008-9-17 20:43:43 | 显示全部楼层
原帖由 kazemaru 于 2008-9-16 00:44 发表
精确度和延迟时间的表现如何呢?这两项貌似最重要哦。从那个视频来看,延迟不比freetrack小,精度方面看不出来。


目前根据var.scenter = [1024,768,0]/2/1024      //Sensor's center 来推断,分辨率是1024x768的,比一般摄像头640x480起码是好很多的!

延迟时间的话,如果视频中使用了顺滑函数smooth(x,a)的话,如果a=30,那么意味着最终的输出结果是需要计算前30帧,然后进行平滑计算的,再根据PIE.FrameRate = 100Hz来推断,可能延迟大于0.3秒。

如果使用更优化的顺滑算法,延迟问题也许会迎刃而解!
不过从硬件能力上看,如果使用一般几十元的摄像头,取样速率小于30Hz,加上如果需要在此基础上进行“顺滑”计算,肯定延迟要更多,原因很简单,先天不足;如果换用分辨率更高,帧数高于30帧的高级摄像头,成本就和Wiimote差不多了,但是,即便如此也解决不了CPU占用率过高的问题,当然机器性能好的除外……

另外,至于延迟,我建议你看lofc的trk文件,这样可能比youtube上效果更精确一些。

欢迎提问!

:D
发表于 2008-9-17 22:14:35 | 显示全部楼层
表面看来,WiiRemote和TrackIR都是用独立硬件进行图象处理的,而且WiiRemote可以同时处理4个点的数据,感觉应该比TIR强劲才对,但是实际WiiRemote性能可能不如TIR,因为TIR本身定位就在6DOF追踪,而WiiRemote用途更为多样,因此在功能设计上是有折中的。

人机接口类设备都有相似的结构,它们内部在技术上是分层次的。
最底层是硬件实体。这层主要是硬件工程师设计的。负责电源分配、创建各元件基本工作环境、搭建数据物理通路等等。TrackIR和WiiRemote里的电路就是这层,结构大同小异。
在这之上是固件(firmware),是固化在硬件里的软件。它的最底层是硬件层,负责元器件基本功能模块的初始化,构建数据输入/输出接口模块,TrackIR和WiiRemote里,此层负责初始化主控芯片、摄相头、加速度传感器、USB通讯或射频通讯模块等等。两件产品里的这一层固件基本也是相似的。
再向上才是应用层。在这一层,我猜测两种产品存在着一些差异:
TrackIR应该是使用了基于DSP(数字信号处理器)的特制芯片,集成了摄像头接口、USB通讯接口与强劲的DSP内核。注意这个产品唯一的编程功能在PC端,而且是简单的函数映射关系,图象处理方面的参数对于PC端是不透明的。因此它的工作过程基本上是DSP从摄相头读入图象信号,直接在芯片内部利用相对固定不变的算法对图象进行滤波与解算。因为计算结果相对固定,估计连格式都是固定的,因此允许结构高度优化的固件结合高速的DSP内核,能保证巨大的数据吞吐量与优异的解算性能。
WiiRemote也可以解算出上述数据,但是其种类繁多的应用与教强的灵活性无形中增加了解算数据量。WiiRemote里面还使用了一颗Analog Devices生产的ADXL330三轴加速度传感器芯片,而其总价比TrackIR还要低,其主控芯片选型肯定不如TrackIR上档次。较低性能的硬件降低了数据处理速度。由于其功能多样,一些后续工作还需要PC端软件来进行选择处理。而PC上的Windows又不是实时操作系统,因此处理流程总体协调起来没有TrackIR流畅。
基于上述原因,单从6DOF应用上来看,WiiRemote性能不如TrackIR。但如果要买WiiRemote来做虚拟多枢轴控制、虚拟白板笔等等灵活的应用,当然是便宜划算了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|手机版|3GO模拟飞行网|3GO Cyber Air Force ( 沪ICP备08002287号|沪ICP备14050587号 )

GMT+8, 2024-5-18 10:08

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表