Xamarin 方向传感器矢量角

2024-04-03

我在用着Xamarin.Essentials.OrientationSensor在我的项目中,我无法解释QuaternionAPI 为我提供了新的读物。

问题描述

Here's a figure describing my problem: Orientation vector

我需要确定方向向量v与手机平面垂直/正交(即从手机背面出来的矢量)。然后我需要转换这个向量v进入 3D 状态空间(纬度、经度、海拔)。这将使我能够计算手机方向和距离向量之间的角度d到某个固定点F, where d = F - P。然后可以通过使用点积、余弦和大小来获得角度v and d.

到目前为止我所拥有的

根据官方文档 https://learn.microsoft.com/en-us/xamarin/essentials/orientation-sensor,手机的本地坐标系描述如下:

设备(通常是手机或平板电脑)具有 3D 坐标系 具有以下轴:正 X 轴指向右侧 以纵向模式显示。 Y 轴正方向指向顶部 设备处于纵向模式。正 Z 轴指向 屏幕。

这意味着向量v我正在寻找的是v=(0,0,-1)在手机的本地坐标系中。

In 这个问题 https://stackoverflow.com/questions/54540095/xamarin-orientation-sensor-quaternion,我已经了解到,给定的四元数是相对的,我需要一个参考四元数centerQ对于我的转变:

void onNewOrientation(Quaternion q)
{
    if (centerQ == Quaternion.Identity)
    {
        centerQ = Quaternion.Inverse(q);
        return;
    }
}

然后我可以使用Quaternion.Transform(v, centerQ)转变v进入地球坐标系,根据文档定义为

地球的 3D 坐标系有以下轴: 正 X 轴与地球表面相切并且点 东方。正 Y 轴也与地球表面相切 并指向北。正 Z 轴垂直于表面 地球并指向上方。

然而我需要转型v进入 WGS+海拔,这就是棘手的地方。

我试图定义两个额外的四元数对于从地球坐标系(如文档中所述)到 WGS 的转换,如下所示:

var phi = -1 * lastloc.Latitude * Util.DEGTORAD;
var lam = lastloc.Longitude * Util.DEGTORAD;

var qLat = Quaternion.CreateFromAxisAngle(new Vector3(1, 0, 0), (float)phi);
var qLon = Quaternion.CreateFromAxisAngle(new Vector3(0, 1, 0), (float)lam);

因为纬度基本上分别是绕 x 轴旋转和经度绕 y 轴旋转。

然后我必须将三个四元数相乘centerQ, qLat and qLon。然而,我已经尝试了这三者之间所有可能的顺序组合,结果都没有任何意义。我知道四元数乘法是不可交换的。

到目前为止,这是我的代码

namespace Foo.ViewModels
{
    public class DebugViewModel : BaseViewModel
    {
        private Quaternion centerQ;
        private static Vector3 vec3out = new Vector3(0f, 0f, -1f);
        private static Location fixPos;
        private Location lastloc;

        public DebugViewModel()
        {
            centerQ = Quaternion.Identity;
            lastloc = null;

            fixPos = new Location()
            {
                Latitude = 0,  // anonymized
                Longitude = 0, // anonymized
                Altitude = 0   // anonymized
            };

            // Create reactive observable
            Observable.FromEventPattern<OrientationSensorChangedEventArgs>(
                    ev => OrientationSensor.ReadingChanged += ev,
                    ev => OrientationSensor.ReadingChanged -= ev)
                .Select(eventPattern => eventPattern.EventArgs.Reading.Orientation)
                //.Throttle(TimeSpan.FromMilliseconds(20))
                .Subscribe(this.onNewOrientation);

            OrientationSensor.Start(SensorSpeed.UI);
        }

        void onNewOrientation(Quaternion q)
        {
            if (centerQ == Quaternion.Identity)
            {
                centerQ = Quaternion.Inverse(q);
                return;
            }

            if (lastloc == null)
            {
                return;
            }

            var qi = Quaternion.Inverse(q);
            var qq = Quaternion.Multiply(centerQ, q);

            // get local quaternion
            var phi = -1 * lastloc.Latitude * Util.DEGTORAD;
            var lam = lastloc.Longitude * Util.DEGTORAD;

            var qLat = Quaternion.CreateFromAxisAngle(new Vector3(1, 0, 0), (float)phi);
            var qLon = Quaternion.CreateFromAxisAngle(new Vector3(0, 1, 0), (float)lam);
            var qLati = Quaternion.Inverse(qLat);
            var qLoni = Quaternion.Inverse(qLon);

            var q1 = Quaternion.Multiply(qLat, qLon);
            var q2 = Quaternion.Multiply(q1, qq);

            Vector3 aa = Vector3.Transform(vec3out, q2);

            Vector3 myP = new Vector3(
                (float)lastloc.Latitude, 
                (float)lastloc.Longitude, 
                (float)lastloc.Altitude);

            Vector3 drP = new Vector3(
                (float)twrPos.Latitude,
                (float)twrPos.Longitude,
                (float)twrPos.Altitude);

            Vector3 d = Vector3.Normalize(drP - myP);

            float alpha = Util.vecAngle(d, aa) * (float)Util.RADTODEG;
        }
    }
}

我很感激有关这个问题的任何提示或想法。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Xamarin 方向传感器矢量角 的相关文章

  • 读取进程的进程内存不会返回所有内容

    我正在尝试扫描第三方应用程序的内存 我已经查到地址了 现在是在0x0643FB78 问题是 从那以后我就再也爬不上去LPMODULEENTRY32 gt modBaseAddr is 0x00400000 and LPMODULEENTRY
  • 如何使用C#检测IIS版本?

    如何使用C 检测IIS版本 更新 我的意思是来自 winapp 实际上该场景是开发一个自定义安装程序 想要检查已安装 IIS 的版本以调用适当的 api 在这里找到了答案 链接文本 http forums iis net p 1162404
  • 了解左值到右值转换的示例

    我很难理解这段代码 来自 C 14 草案标准的示例 转换拉瓦尔 调用未定义的行为g false 为什么constexpr使程序有效 另外 不访问 是什么意思 y n 在两次通话中g 我们正在返回n数据成员那么为什么最后一行说它不能访问它呢
  • xamarin 谷歌地图不工作

    我使用以下链接创建了地图http developer xamarin com guides android platform features maps and location maps part 2 maps api http deve
  • 再次对存储库和持久性一无所知

    这就是我要做的 我有一个通用的存储库类Repository
  • 尝试从 C# 调用简单的 Python 脚本,但由于“无法获取 Python 编解码器”致命错误而失败。我怎样才能解决这个问题?

    相关的C 代码片段如下 static string CallPython string fileName Process p new Process p StartInfo new ProcessStartInfo C Python310
  • 创建新视图时如何初始化视图模型中的属性?

    我有一个应用程序 可以打开一个视图 允许您搜索数据 然而 为了进行搜索 用户必须选择他想要在什么类别下进行搜索 目前 我正在尝试弄清楚如何将所选类别从主视图模型 作为 int 传递到新搜索视图的视图模型 目前我正在尝试在主视图中使用类似的东
  • 为什么不能使用 C# 对象初始值设定项语法调用方法? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 .NET Core 中设置全局环境变量(用户范围或系统范围)

    在完整的 NET中我们可以通过EnvironmentVariableTarget枚举到Environment SetEnvironmentVariable call public enum EnvironmentVariableTarget
  • GoogleTest:如何跳过测试?

    使用 Google Test 1 6 Windows 7 Visual Studio C 如何关闭给定的测试 又名如何阻止测试运行 除了注释掉整个测试之外 我还能做些什么吗 The docs https github com google
  • ASP.NET MVC C#:将多个表/查询中的数据引入视图中

    好吧 我仍在掌握 ASP NET 和 MVC 框架的窍门 并将我的知识从经典的 ASP 和 VB 转换过来 所以请保持温柔 我的第一个视图 home details X 运行良好感谢之前的帮助为我指明了正确的方向 https stackov
  • 即使使用前向声明也会出现未定义的类型错误

    我正在阅读循环引用和前向声明 我确实知道在头文件中实现并不是一个好的设计实践 然而我正在尝试并且无法理解这种行为 使用以下代码 包含前向声明 我期望它能够构建 但是我收到此错误 Error 1 error C2027 use of unde
  • 学习 WPF 会提高我的 ASP.NET 技能吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我已经在 Windows 窗体领域工作了很多年 而且仍然如此 我完全不熟悉 ASP NET 技术 也不熟悉其他 Web 相关技术 我曾合作过 O
  • List.Except 不起作用

    我尝试减去 2 个列表 如下代码所示 assignUsers已获得 3 条记录assignedUsers有 2 行 后Except方法我仍然得到 3 行 尽管我应该得到 1 条记录 因为 2 行assignedUsers类似于assignU
  • LINQ 分组依据和选择集合

    我有这个结构 Customer has many Orders has many OrderItems 我想生成一个列表CustomerItems通过 LINQ 给出的子集OrderItems List of new Customer Li
  • HTTP 错误 500.35 - ANCM 同一进程中的多个进程内应用程序 ASP.NET Core 3

    从今天早上开始 没有对项目代码进行任何更改 一个非常简单的 Web API 一个控制器和 3 个方法 使用 Swagger 它不再启动 我收到错误 HTTP 错误 500 35 ANCM 同一进程中有多个进程内应用程序 事件查看器报告最无用
  • 以编程方式将 Word 文件另存为图片

    我想将Word文档的第一页另存为图片 使用 C 有什么方法可以做到这一点 您可以将 Word 文档打印到 XPS 文档 在 WPF Net 3 5 应用程序中打开它 并使用 WPF 框架的文档和图像功能将第一个内部固定页面对象转换为位图 如
  • STL迭代器是否保证集合更改后的有效性?

    假设我有某种集合 并且我在它的开头获得了一个迭代器 现在假设我修改了该集合 无论集合或迭代器的类型如何 我仍然可以安全地使用迭代器吗 为了避免混淆 以下是我讨论的操作顺序 获取集合的迭代器 修改集合 显然 不是其中的元素 而是集合本身 使用
  • 在 C 中打印字符串的所有排列

    我正在学习回溯和递归 并且我陷入了打印字符串所有排列的算法 我用以下方法解决了它贝尔算法 http programminggeeks com bell algorithm for permutation 用于排列 但我无法理解递归方法 我在
  • 通过网络共享的 SQL CE

    我之前见过这个问题 但找不到关于什么是可能 不可能以及什么解决方法可能可用的明确解释 我有一个现有的 C 应用程序 它使用 SQL CE 来存储本地信息 该数据库只能由单个应用程序访问 并存储在用户的 appdata 文件夹中 某些环境将

随机推荐

  • 从 ggplot 中消除 NA

    这是一个非常基本的问题 因为我刚刚开始使用 R 但我正在尝试在 ggplot2 中创建因子计数的条形图 并且在绘图时 得到 14 个代表我的实际水平的小彩色点 然后在end 代表样本中的 5000 个左右的 NA 这是来自仅适用于样本的约
  • 是否有任何API或方法可以在您的应用程序中获取whatsapp聊天消息[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Whatsapp 是否提供任何 API 可以让其他应用程序从官方 Whatsapp 应用程序中提取聊天消
  • 在 Swift 中视图从底部滑入?

    如果我的故事板中有一个视图设置 有没有一种方法可以在按下按钮时让该视图 自定义宽度和高度 从屏幕底部向上滑动 我希望屏幕只是重叠 这样您仍然可以按下面屏幕上的东西 我该如何设置呢 func isChecked let window UIAp
  • Cake 无法连接到数据库

    我正在使用 Wamp 服务器 并尝试安装 CakePHP 2 0 0 但遇到了问题 我把 CakePHP 2 0 0 文件放在我的wamp服务器文件夹 www 进而 cake 文件夹 当我输入地址时http localhost cake在我
  • 不使用 pip 安装 pandas

    是否可以在不安装 pip 的情况下安装 pandas 或是否有其他方法在不安装 pip 的情况下使用 pandas 提前致谢 pip 是一个包管理系统 用于安装和管理用 Python 编写的软件包 许多包可以在包及其依赖项的默认源中找到 这
  • 在通用 Windows 中将 IEnumerable 更改为 IQueryable 时出现 MissingRuntimeArtifactException

    在发布模式下 使用 AsQueryable 方法将 IEnumerable 源更改为 IQueryable 时 该方法会引发 System Reflection MissingRuntimeArtifactException 该代码在调试模
  • C++ Socket recv 未接收到正确的字节数?

    我对 C 很陌生 但我正在尝试学习 TCP 套接字编码的一些基础知识 不管怎样 我已经能够发送和接收消息 但我想在我的数据包前面加上数据包的长度前缀 就像我在过去制作的 C 应用程序中所做的那样 所以当我的窗口收到 FD READ 命令时
  • 在 Eclipse IDE 环境之外执行 Eclipse 插件 (jdt/ast)

    我可以执行吗Eclipse Java 开发工具 http www eclipse org jdt 作为一个独立的进程 我需要获取 Java 程序AST http www vogella com articles EclipseJDT art
  • SQL Server 2000:如何从存储过程将图像变量保存到文件系统中的文件

    我有一个存储过程 它接收 Data image范围 我想将它从存储过程保存到文件系统 知道怎么做吗 您可以使用 OLE 自动化 ADODB Stream 从 SQL Server 2000 存储过程写入二进制数据 如下所述here http
  • Windows Phone 7 按钮“边框”

    默认情况下 WP7 按钮被 5 像素左右的黑色空间包围 我想删除这个 但我尝试将 Margin BorderThickness Padding 属性设置为 Thinkness 为零 但这似乎对这个神秘的空间没有任何影响 任何线索这个空间到底
  • 如何子类化 WPF 的 TreeViewItem 并在 treevview 中使用它

    我创建了一个简单的依赖属性 我想将其附加到 TreeViewitem 我已经为其他控件 例如按钮 做了类似的事情 但无法弄清楚如何在树视图中使用 TreeViewItem 而不丢失我定义的样式 通过下面的代码 我得到 用于类型 ErrorT
  • 并发写入文件

    在go中 如何控制对文本文件的并发写入 我问这个问题是因为我将有多个 goroutine 使用相同的文件处理程序写入文本文件 我写了这段代码来尝试看看会发生什么 但我不确定我是否做得 正确 package main import os sy
  • iOS 中隐式动画具体什么时候发生?

    每个人和每本书都声称 CALayer 中存在隐式动画 然而 到目前为止 每次我想验证这一点时 我都会以硬性捕捉到设定值告终 根本没有动画 这是一个项目中没有发生任何其他事情的示例 我所做的就是创建一个视图 然后获取它的 CALayer 实例
  • 按照 Matlab 中出现的顺序读取文件夹中的所有文本文件

    我目前有 20 个文本文件 命名从 file1 到 file20 我正在使用 matlab 将它们读入 filePattern fullfile myFolder txt dataFiles dir filePattern for k 1
  • 使用 Typescript 在 Material-UI 中的 createMuiTheme 中向背景属性添加属性

    我正在尝试在 createMuiTheme 中添加一个新属性 但 Typescript 不让我这样做 我按照这里的说明进行操作 https next material ui com guides typescript customizati
  • 使用 Google reCaptcha 总是显示“in Correct-captcha-sol”

    我正在尝试在我的网站上使用 Google reCaptcha 在学习了几个教程后 我在 HTML 页面上使用如下 section class row div class col full div section
  • 如何将 @JsonSnakeCase 设置为 Dropwizard 中的默认配置

    我将如何配置 Jackson 在 dropwizard 中使用蛇形案例 而不是将 JsonSnakeCase 放在每个类中 最后我能够找到答案 只需添加以下配置 environment getObjectMapperFactory setP
  • 如何使用 Swift 刷新我的应用程序中的 Google 地图?

    我制作了一个选项卡栏应用程序 其中一个选项卡 MapTab 由 GoogleMap 组成 而另一个选项卡 ImageTab 则保存所有图像 现在 当图像保存在 ImageTab 中时 它会以标记的形式显示在 MapTab 上 现在我的问题是
  • NumPy 中的 ndarray 和 array 有什么区别?

    有什么区别ndarray https numpy org doc stable reference generated numpy ndarray html and array https numpy org doc stable refe
  • Xamarin 方向传感器矢量角

    我在用着Xamarin Essentials OrientationSensor在我的项目中 我无法解释QuaternionAPI 为我提供了新的读物 问题描述 Here s a figure describing my problem 我