# Lighthouse-UESTC

# 

> [!WARNING]
>
> <u>**特别注意：最近发现SteamVR在重启后，本项目提供的配置文件会被覆盖，从而导致识别不正常。所以重新使用的时候需要重新覆盖配置文件。**</u>

描述：这个项目是利用valve的高精度激光定位系统Lighthouse实现对其他非高精度的定位设备进行误差评估的系统。Lighthouse的工作原理文档路径为`Docs\Lighthouse工作原理.md`。

## 一、硬件设备

### 1.1 设备的准备	

​		将Lighthouse用于定位参考设备，只需要准备如下即可，目前经过实验室的是1.0版本的9灯基站和以及1.0的手柄。

| 设备名              | 数量 | 备注                                                         |
| ------------------- | ---- | ------------------------------------------------------------ |
| HTC 激光基站 & 电源 | 2    | 根据情况可以选择1.0、2.0、3.0的版本，购买的时候一般商家会配套电源。二手产品需要注意购买电源 |
| HTC 手柄或者Tracker | 1    | 根据情况可以选择1.0、2.0、3.0的版本，购买的时候需要对应购买接收器。 |
| 激光基站的支架      | 2    | 基站的顶部需要额外增加万向转接头，可以调整基站方向。         |

### 1.2 Lightouse的安装与设置

​		Lighthouse基站安装一般推荐安装在较高的位置，可以俯瞰地面的设备。一般安装在2m以上的位置，可以选择天花板倒置安装，也可以选择支架安装。

![Lighthouse安装示意](./Image/Lighthouse的安装.png)

## 二、软件的准备

​		软件的核心安装步骤有3个步骤。主要容易出问题的是步骤2。目前提供的样例配置文件会针对特定的手柄设备，如果硬件ID不一样，可能需要通过2.1到2.3中的配置原理，进行变更。核心步骤如下：

1. Steam和SteamVR的安装
2. **更换配置文件，样例的配置文件在`Code\steamvr_config`目录下**，直接替换Steam下面的目录文件`C:\Program Files (x86)\Steam\steamapps\common`(默认)即可
3. Python安装以及openvr库的安装，运行Python读取坐标

### 2.1 软件的配置原理

​		软件方面主要需要安装Steam平台和SteamVR。理论上SteamVR底层的OpenVR可以支持各种语言。目前最简单的是采用python读取数据。

### 2.2 SteamVR的配置原理

​		正常来说，SteamVR的启动必须需要头显才能启动。所以，采取的方式有两种，第一种是绕过头盔启动。第二种方式是把控制器的虚拟为头盔。

#### 2.2.1 查看SteamVR的log

​		既然是设备是通过steamVR来驱动链接的，那么在steamVR启动的时候，肯定就要做设备初始化等等的工作，那么设备加载初始化的时候，到底是加载了那些文件了，导致非要加载头显HMD。我们可以通过查看log来查看SteamVR到底加载了那些驱动和设置。查看log的方式如下图所示：

<center>
    <img src="./Image/SteamVR Log Setting.png" alt="image-20231130113103087" style="zoom:100%;" >
</center>

#### 2.2.2 配置文件的修改——绕过头盔启动

​		在找到SteamVR的log后(log文件：`vrserver.txt`)，我们可以对log进行分析：

```shell
... [Settings] Load Default Json Settings from ...\common\SteamVR\drivers\htc\resources\settings\default.vrsettings
... [Settings] Load Default Json Settings from ...\common\SteamVR\drivers\lighthouse\resources\settings\default.vrsettings
... [Settings] Load Default Json Settings from ...\common\SteamVR\drivers\null\resources\settings\default.vrsettings
... [Settings] Load Default Json Settings from ...\common\SteamVR\resources\settings\default.vrsettings
... [Settings] Load Json Settings from C:\Program Files (x86)\Steam\config\steamvr.vrsettings
```

​		实际经过发现，**只需要修改2个文件就可以实现绕过头显启动，分别为上面的第3和第4个文件**。	

​	一般来说，SteamVR的驱动路径为`C:\Program Files (x86)\Steam\steamapps\common\SteamVR`，如果找不到也可以在Steam平台上找到SteamVR，然后选择`右键->管理->浏览本地文件`。

​		找到并修改`Resource\Settings\default.vrsettings`:

```json
// requireHmd == false可以使得SteamVR面板的头盔图标亮起, 但是一会儿就处于休眠状态
"requireHmd" : false
// 强制驱动为null driver, null driver是steamvr的一个空驱动
"forcedDriver" : "null"
// 强制多个驱动，估计是增加可以激活lighthouse的控制器
"activateMultipleDrivers" : true
```

​		找到`drivers\null\resources\settings\default.vrsettings`进行修改：

```json
{
	"driver_null" : {
		// 由false修改为ture
		"enable" : true,
		"serialNumber" : "Null Serial Number", 
		"modelNumber" : "Null Model Number",
		"windowX" : 0,
		"windowY" : 0,
		"windowWidth" : 2160,
		"windowHeight" : 1200,
		"renderWidth" : 1512,
		"renderHeight" : 1680,
		"secondsFromVsyncToPhotons" : 0.01111111,
		"displayFrequency" : 90.0
	}
}
```

#### 2.2.3  配置文件的修改——控制器的虚拟为头盔

​		配置文件完整样例在：`Code\steamvr_config`下，下面是修改的原理介绍以及实际修改方法。

​		**要将控制器虚拟为头盔，操作和2.2.2的配置一致，但是需要额外添加配置**。通过SteamVR的选项`菜单->设备->管理追踪器->管理定位器`，即可看到控制器的ID信息。如下图所示，本机的定位ID为：LHR-FFA35F47
<center>
​	<img src="./Image/控制器ID查看.png" style="zoom: 100%;" >
</center>

​		对应的修改配置文件，我们在配置文件接近结尾处，添加Json的键值对`TrackingOverrides`, 将控制器的路径映射到头显。值得注意的是，控制器的路径和设备有关，需要根据实际设备的信息调整，不能盲目修改。

```json
{
    // 上方省略
	// 这个地方添加了追踪映射
    "TrackingOverrides" : {
        // 注意LHR-FFA35F47一般是控制器设备的信息，根据实际设备进行填写
    	"/devices/htc/vive_trackerLHR-FFA35F47" : "/user/head"
    },
    // 以下不用修改
    "version": "1",
    "jsonid": "vrsettings"
}
```

### 2.3 启动SteamVR

​	在steam中启动SteamVR，等待一段时间后弹出：

![image-20250409165447198](./Image/steamVR启动.png)

​	按住手柄的启动按键，直到指示灯变绿：

![image-20250409165502084](./Image/手柄示意图.png)

​	等待软件搜索设备，即lighthouse基站（定位器）和手柄（追踪器），如果搜索不到则需要在两个基站之间晃动手柄。直到设备被全部搜索，如下图所示：

![image-20250409163545454](./Image/设备连接状态.png)

​	此时说明lighthouse配置完成且能够正常获取数据。

### 2.4 Python读取定位数据

```shell
# 安装openvr库
pip install openvr
# 进入工作目录 
cd Code/triad_openvr
# 获取指定设备的位置和姿态, 这里需要根据实际的设备类型对代码进行调整
python tracker_test.py
```



## 三、问题和解决方案

### 3.1 此设备目前不在定位，请确认其在一个定位器的定位范围内。

​		上述问题在SteamVR的面板显示如下图所示。这种问题产生的原因是因为基站的位置放置错误。两个基站放置的太近了，一般两个基站需要相距1米以上。

<center>
	<img src="./Image/Tracker Cannot locate.png" style="zoom:100%;" />
</center>
​		

### 3.2 SteamVR在重启后，会导致设备无法正常识别，从而不能正常使用。

​	SteamVR在重启后，本项目提供的配置文件会被覆盖，从而导致识别不正常。所以重新使用的时候需要重新覆盖配置文件。

​	解决方法：**更换配置文件，样例的配置文件在`Code\steamvr_config`目录下**，直接替换Steam下面的目录文件`C:\Program Files (x86)\Steam\steamapps\common`(默认)即可
