Oculus_凝视在UI进行操作

本文介绍如何在Oculus VR应用中实现UI凝视功能,包括导入Oculus插件包、配置Unity项目、替换相机、调整输入模块、设置Canvas等步骤。

经过在网上百度,找到了点资料,由此记录一下,并且感谢原作者的分享,有侵权请联系!

Oculus研究第一天

1.实现UI凝视

前期配置

  1. 导入Oculus插件包OculusSampleFramework.unitypackage

  2. 若使用Unity 5.1或更新的版本,确保在Edit -> Project Settings -> Player : Other Setting -> Rendering设置里勾选Virtual Reality Supported

实现过程(可以点击space或者buttonone用来确认)

  • 替换相机

    1. 删除场景中的Camera
    2. 添加OVR/Prefabs/OVRCameraRig预置体到场景中作为相机
    3. 将相机调整到合适的位置
  • 更改输入模块

    1. 选择Hierarchy中的EventSystem对象
    2. 移除用于处理常规鼠标输入的StandaloneInputModule组件
    3. 添加OVRInspector/Scripts/OVRInputModule脚本
    4. OVRCameraRig对象下的CentreEyeAnchor拖到OVRInputModuleRayTransform属性上,使射线始终从双眼中间位置发出
    5. OVRInputModule中的JoyPadClickButtonGazeClickKey分别用于设置Touch手柄和键盘上操作UI的按键
  • 添加凝视指针

    1. 添加OVRInspector/Resources/Prefabs/GazePointerRing预置体到场景中来指示当前凝视的位置
    2. 预置体上除了OVRGazePointer脚本还有一个与粒子特效有关的脚本,如不需要可以删除
    3. OVRCameraRig对象下的CentreEyeAnchor拖放到OVRGazePointer脚本的RayTransform属性上,使指针跟随射线
  • 设置Canvas

    1. 将需要凝视操作的Canvas的Render Mode属性设置为World Space
    2. 将Canvas中的EventCamera设置为OVRCameraRig下的CenterEyeAnchor
    3. 移除Canvas绑定的用于监测鼠标与GUI元素交互的GraphicRaycaster组件
    4. 添加用于处理射线的OVRInspector/Scripts/OVRRaycaster脚本
    5. OVRRaycaster组件中,将Blocking Objects属性设为All,使凝视行为可以锁定场景中的其他可交互对象
  • 更改指针移动方式(从右手手柄发射射线) 
    若希望通过其他输入设备移动指针,则进行此步,以右手Touch控制器为例。

    1. 选择EventSystem对象,把OVRInputModuleRayTransform属性改为OVRCameraRig对象下的RightHandAnchor,使射线从右手的Touch控制器发出
    2. 选择GazePointerRing对象,将OVRGazePointer脚本的RayTransform属性改为OVRCameraRig对象下的RightHandAnchor,使指针跟随射线
  • 添加世界坐标下的鼠标 
    若需要为VR场景提供与凝视一起存在的鼠标操作UI的功能,则进行此步操作。

    1. OVRInspector/Resources/Prefabs/CanvasPointer预置体添加为Canvas对象的子对象
    2. 将Canvas对象的OVRRaycaster脚本中的Pointer属性设置为新添加的CanvasPointer对象
    3. 为Canvas对象添加OVRInspector/Scripts/OVRMousePointer脚本

<think>我们正在处理一个ROS相关的问题:从rosbag中提取特定主题的消息。用户要求提取主题为`/sonar_oculus_node/M750d/ping`的消息。 根据ROS的常用工具,我们可以使用`rosbag`命令行工具来过滤和提取特定主题的消息。 步骤: 1. 使用`rosbag filter`命令:这个命令可以根据条件过滤bag文件,并生成一个新的bag文件,其中只包含满足条件的消息。 2. 条件就是我们想要的主题。 具体命令格式: ```bash rosbag filter input.bag output.bag "topic == '/sonar_oculus_node/M750d/ping'" ``` 这里: - `input.bag`是输入的bag文件名。 - `output.bag`是输出的bag文件名,只包含指定主题的消息。 - 条件表达式用双引号括起来,里面写`topic == '/sonar_oculus_node/M750d/ping'`。 注意:主题名称必须完全匹配,包括斜杠和大小写。 另外,我们也可以使用`rosbag play`配合`rostopic echo`来将消息导出到其他格式(如文本文件),但这样会丢失时间戳等信息。如果只需要查看消息内容,可以: ```bash rostopic echo -b input.bag -p /sonar_oculus_node/M750d/ping > output.csv ``` 这个命令会将指定主题的消息以CSV格式(用逗号分隔)输出到`output.csv`文件中,包括时间戳和消息的各个字段。 但是,用户的问题中并没有明确要导出为什么格式,所以我们可以提供两种方式: 1. 提取为新的bag文件(保留原始消息格式,包括时间戳等,可以后续在ROS中使用) 2. 导出为文本或CSV文件(便于查看和分析) 根据用户的需求,我们可以建议: - 如果需要在ROS中继续使用(如回放、处理等),则用`rosbag filter`生成新的bag文件。 - 如果只需要查看消息内容,则用`rostopic echo`导出为文本或CSV。 考虑到用户的问题中只提到“提取”,并没有说明后续用途,我们可以提供两种方法。 另外,注意引用中提到的信息:用户之前提到过关于Oculus声呐和ROS框架的内容,但当前问题与声呐驱动没有直接关系,主要是关于rosbag的操作。因此,我们不需要在回答中涉及声呐驱动的细节。 相关问题生成: 1. 如何将rosbag中的消息导出为其他格式(如CSV)? 2. 如何从rosbag中提取多个主题的消息? 3. 如何查看rosbag文件中的主题列表?</think>### 从rosbag中提取特定主题消息的方法 在ROS中提取rosbag中特定主题的消息,可通过以下两种常用方法实现: #### 方法一:使用`rosbag filter`命令(推荐) ```bash rosbag filter input.bag output.bag "topic == '/sonar_oculus_node/M750d/ping'" ``` - **参数说明**: - `input.bag`: 原始rosbag文件名 - `output.bag`: 输出文件名(仅包含目标主题) - 引号内为过滤条件表达式 - **特点**: - 保留原始消息格式和时间戳 - 支持正则表达式(如`topic =~ '/sonar.*'`) - 可同时处理多个主题:`"topic == '/topic1' or topic == '/topic2'"` #### 方法二:使用`rostopic echo`导出文本 ```bash rostopic echo -b input.bag -p /sonar_oculus_node/M750d/ping > output.csv ``` - **参数说明**: - `-b`: 指定rosbag文件 - `-p`: 格式化输出为CSV - `>`: 重定向到文件 - **特点**: - 生成可读的CSV/文本文件 - 适合数据分析或导入Excel - 但会丢失二进制数据字段 #### 验证提取结果 ```bash rosbag info output.bag # 查看提取后的主题信息 rostopic type /sonar_oculus_node/M750d/ping # 确认消息类型 ``` > **注意**:根据引用[1][2],若涉及Oculus声呐设备,需确保消息类型与驱动兼容。声呐数据通常包含二进制图像流,建议优先使用`.bag`格式保留完整数据[^1][^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值