Argon.js/A-Frame:来自 getEntityPose() 的局部坐标与 refereceFrame 无关

Argon.js/A-Frame: local coordinates from getEntityPose() are not relative to refereceFrame

我正在尝试使用 argon.js 将 lla 坐标从预定义的参考系转换为本地坐标。向我推荐的方法(据我了解)要求我从一组 lla 创建一个铯实体,然后在使用其他 lla 创建后续铯实体时使用该 ceisum 实体作为参考。

我尝试使用两种方法来做到这一点:第一种方法是在 argon.js 中创建参考铯实体,第二种方法是创建一个带有 geopose 的 a-frame 实体,然后抓取铯实体来自框架实体的组件列表。我使用 argon.js 进行所有后续转换。

在这两种方法中,我都成功地创建了参考铯实体,并且看起来(至少对我而言)转换后的铯实体包括参考实体作为它们的参考框架。但是,转换后的实体的 entityPose 仍然是 0、0、0。我的期望是参考实体是 0、0、0,并且转换后的实体将具有相对于该实体的局部坐标(例如 4、8、10) .此外,在每种情况下,实体的 poseStatus 均为 0,但 argon.js 文档仅将可能性列为 KNOWN = 1、FOUND = 2 和 LOST = 4。

我在下面包含了我的代码,以及检查员的一些反馈。返回的对象非常大,所以我只包含了我认为相关的内容,但如果还有其他我应该包含的属性,请告诉我。另请注意,该代码包含我上面列出的两个选项,第二个选项被注释掉了。

有关历史,请参阅:

<!DOCTYPE html>
<html>
  <head>
    <title>Hello world</title>
    <script src="/socket.io/socket.io.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/geolocator/2.1.0/geolocator.js"></script>
    <script src="arframe/main/resources/js/aframe.js"></script>
    <script src="arframe/main/resources/js/argon.min.js"></script>
    <script src="arframe/main/build.js"></script>
    <script src="arframe/main/resources/js/CSS3DArgonRenderer.js"></script>
    <script src="arframe/main/resources/js/CSS3DArgonHUD.js"></script>
    <script src="arframe/main/resources/js/aframe-look-at-component.js"></script>
  </head>
   <body>

<h1>Hello world</h1>

<ar-scene>
  <!--OPTION 2-->
  <!-- <a-entity id='madRefFrame' referenceframe='lla: -84.31169 33.756128'></a-entity> -->
</ar-scene>

<script>

  // OPTION 1
  var app = Argon.init();

  // OPTION 2
  //var scene = document.querySelector('ar-scene');
  //var app = scene.argonApp;

  var Cesium = Argon.Cesium;
  var Cartesian3 = Cesium.Cartesian3;
  var ConstantPositionProperty = Cesium.ConstantPositionProperty;
  var ReferenceFrame = Cesium.ReferenceFrame;
  var ReferenceEntity = Cesium.ReferenceEntity;

  app.context.setDefaultReferenceFrame(app.context.localOriginEastUpSouth);

  app.updateEvent.addEventListener(function (frame) {

    if (Argon.PoseStatus.KNOWN) {

      // OPTION 1
      var madRefData = { lla : { x : -84.31169, y : 33.756128, z : 299 }};
      var madRef = Cartesian3.fromDegrees(madRefData.lla.x, madRefData.lla.y, madRefData.lla.z);
      var options = { position: new ConstantPositionProperty(madRef, ReferenceFrame.FIXED),
                      orientation:  Cesium.Quaternion.IDENTITY
                    };
      var madRefEntity = new Cesium.Entity(options);

      console.log('madRefEntity');
      console.log(madRefEntity);

      var madRefEntityPose = app.context.getEntityPose(madRefEntity);

      console.log('madRefEntityPose');
      console.log(madRefEntityPose);

      // OPTION 2
      // var madRefEL = document.querySelector('#madRefFrame');
      // var madRefFrame = madRefEL.components['referenceframe'];
      // var madRefEntity = madRefFrame.cesiumEntity;
      // 
      // console.log('madRefEntity');
      // console.log(madRefEntity);
      // 
      // var madRefEntityPose = app.context.getEntityPose(madP1Entity);
      // 
      // console.log('madRefEntityPose');
      // console.log(madRefEntityPose);

      // USED IN OPTIONS 1 AND 2
      var madP1Data = { lla : { x : -84.31169, y : 33.755602, z : 297 }};
      var madP1Ref = Cartesian3.fromDegrees(madP1Data.lla.x, madP1Data.lla.y, madP1Data.lla.z);
      var options = { position: new ConstantPositionProperty(madP1Ref, madRefEntity),
                      orientation:  Cesium.Quaternion.IDENTITY
                    };
      var madP1Entity = new Cesium.Entity(options);

      console.log('madP1Entity');
      console.log(madP1Entity);

      var madP1EntityPose = app.context.getEntityPose(madP1Entity);

      console.log('madP1EntityPose');
      console.log(madP1EntityPose);

    } else {
      // if we don't know the user pose we can't do anything
      console.log("we don't know.");
      return;
    };

  });

</script>
</body>
</html>

检查员反馈:

A-Frame Version: 0.3.2 
three Version: ^0.76.1 
WebVR Polyfill Version: 0.9.15
Reality changed to: {"uri":"reality:empty","title":"Reality","providedReferenceFrames":["FIXED"]}
THREE.CSS3DArgonRenderer 76CSS3D
THREE.CSS3DArgonHUD 76CSS3D
THREE.WebGLRenderer 76
Reality changed to: {"uri":"reality:empty","title":"Reality","providedReferenceFrames":["FIXED"]}
reference frame changed to FOUND

madRefEntity
Object { _availability: undefined, 
       _id: "ae5fe824-12ea-4d7f-87e8-0eee0ca31008", 
       // METHOD 2
       // _id: "madRefFrame"
       _parent: undefined, 
       _propertyNames: Array[19], 
       ...
       _position:Object
        _definitionChanged:Object
        _referenceFrame:0
        _value:Object
          x:526169.6230387943
          y:-5282445.040716821
          z:3524154.8442182266
          // METHOD 2
          //x:526144.9834483624
          //y:-5282197.673182507
          //z:3523988.702129788
       ...
     }

madRefEntityPose
Object { position : { x: 0, y: 0, z: 0 },
       orientation: { w: 1, x: 0, y: 0, z: 0 },
       time: {dayNumber: 2457689, secondsOfDay : 81280.139927485},
       poseStatus: 0 }

madRefP1Entity
Object { _availability: undefined, 
      _id: "9ded96ab-961c-4ba3-b766-8c37e919877f", 
      ...
      _parent: undefined,
      _position: object
       _referenceFrame: object
         _id: "ae5fe824-12ea-4d7f-87e8-0eee0ca31008",
      // METHOD 2
      // _id: "madRefFrame"
         _orientation: object 
          _value: Object
           _w: 1,
           _x: 0,
           _y: 0
           _z: 0
         ...
         _position: Object
          _value:Object
            x:526169.6230387943
            y:-5282445.040716821
            z:3524154.8442182266
            // METHOD 2
            //x:526144.9834483624
            //y:-5282197.673182507
            //z:3523988.702129788
          ...
        ...
      ...
      _value:Object
        x:526172.6715934229
        y:-5282475.646478866
        z:3524105.2236363157
      ...
    }

madRefEntityPose
madRefEntityPose = { position : { x: 0, y: 0, z: 0 },
                  orientation: { w: 1, x: 0, y: 0, z: 0 },
                  time: {dayNumber: 2457689, secondsOfDay : 81281.12722016001},
                  poseStatus: 0 }

首先是一些简单的事情。要回答你关于 Argon.PoseStatus 的问题,它是一个位掩码,所以 0 隐含地 "none of the above" (所以,不知道,不只是被发现或丢失)。当姿势已知时设置 KNOWN,当状态刚刚在 KNOWN 和 not KNOWN 之间变化时设置 LOST 或 FOUND。

因此,您的行

if (Argon.PoseStatus.KNOWN) {

需要改为

if (userPose.poseStatus & Argon.PoseStatus.KNOWN) {

如果你想确保我们知道用户所在的位置,如果你想在本地坐标中做事,你需要这样做。

也就是说,madRefEntityPose 可能未被计算(poseStatus 为 0),因为用户的位置尚未确定。对于这两个选项。

现在,关于代码。选项 1 为您提供 FIXED 坐标中的实体(那些大数字可能是正确的,它们是地球表面该点位置的米值,使用地球的标准椭圆近似作为海拔 0)。如果用户的姿势已知,我希望 poseStatusKNOWN,并且 positionorientation 的值不为零。

选项2有点奇怪。您将大数字作为实体的位置,然后说它们是用前一个实体的坐标表示的。这意味着你可能告诉它把第二个实体放在外面 space,距离等于到地球中心的距离 ...

我记得你的目标是获得第二点相对于第一点的姿势。为此,您需要

  • 等到用户的姿势已知
  • 获取局部坐标中两个点的姿态(就像您对选项 1 所做的那样)
  • 从第二个(以及后续的)中减去第一个(或者你想要的任何一个作为你的 "local origin"),为你提供后续点相对于第一个点的小的基于米的偏移量(分配这给 madP1Ref).
  • 使用那些小仪表(现在在 madP1Ref 中)创建一个实体(如选项 2),就像您在那里做的那样。

据我了解,问题是虽然桌面浏览器会提供位置,但由于它不会提供方向,因此无法获得完整的 3D 姿势。因此,用户实体是针对任意参考系定义的。未来的版本将在没有方向时假定方向。

编辑:错误描述问题的性质。