================================================================================ 画轨迹 · 折线绘制 · 开始虚拟轨迹 —— 详细教程 Drawing Routes, Polylines & Starting Virtual Playback — Step-by-Step Tutorial ================================================================================ 适用版本 / Version : 1.1.1 前置阅读 / First : USAGE.txt(安装、启动、连接 iPhone) 本文件纯文本、中英双语:中文在前,英文在后。 英文部分从第 652 行开始(搜「PART 2」可跳转)。 Plain text and bilingual: Chinese first, English second. English starts at line 652 (search for "PART 2" to jump there). ================================================================================ 第一部分:中文 ================================================================================ -------------------------------------------------------------------------------- 目录 -------------------------------------------------------------------------------- A. 开始之前:三件事必须先做完 B. 认识界面:每个按钮在哪、干什么 C. 地图基本操作 D. 三种造轨迹的方式 D1. 折线绘制(最直接,推荐先学这个) D2. 途经点 + OSRM 路线规划(最贴近真实道路) D3. 导入 GPX(复用别人/别的软件画好的轨迹) E. 编辑轨迹:撤销 / 删除 / 移动 / 排序 F. 出行模式与播放倍速 G. 真实感模拟参数逐个讲清楚 H. 开始虚拟轨迹播放 I. 播放过程中的控制:暂停 / 继续 / 拖进度 / 停止 J. 结束与恢复真实定位 K. 保存与复用路线 L. 快捷键总表 M. 常见问题与错误提示对照 N. 参数速查表 ================================================================================ A. 开始之前:三件事必须先做完 ================================================================================ 没做完这三件事,后面点「播放」一定会失败。请按顺序确认: A1. 设备已连接 顶部右上角的「连接设备」按钮点过了吗? 点完之后,顶部中间的设备卡片会显示手机名称和 iOS 版本, 右上角的连接状态会从「未连接」变成已连接。 如果没变成,先看 USAGE.txt 的「常见问题」章节。 A2. 开发者镜像已挂载 iOS 17 及以上,虚拟定位依赖「开发者镜像」。 正常情况下点「连接设备」时会自动处理,不用你管。 如果日志里出现 "Failed to verify the disk image signature" 之类的报错, 手动点一次左下角的「挂载开发者镜像」按钮, 过程会实时输出到右侧「运行日志」面板。 A3. 手机放在手边,屏幕亮着 播放开始后,手机屏幕上会出现定位图标。 这是判断"到底有没有生效"最直接的证据,别把手机锁屏扔一边。 ── 做完这三件事,右侧运行日志里应该有类似这样的几行: [真机] DVT 虚拟定位会话已就绪(iOS 17+ / RSD ...,长连接保持中) [信息] 设备已连接:iPhone 11 看到「会话已就绪」就说明一切正常,可以开始画轨迹了。 ================================================================================ B. 认识界面:每个按钮在哪、干什么 ================================================================================ 界面分四块,从上到下、从左到右: ┌─────────────────────────────────────────────────────────────────────┐ │ 顶部工具条 │ │ 刷新设备 重新扫描 USB / 网络上的 iOS 设备 │ │ 连接设备 建立隧道 + 打开 DVT 定位会话(画轨迹前必须先点) │ │ 断开 释放会话,手机恢复真实定位 │ ├──────────────┬───────────────────────────────┬──────────────────────┤ │ 左:轨迹设置 │ 中:地图 │ 右:运行日志 │ │ │ │ │ │ 出行模式 │ ┌ 地图工具条 ─────────────┐ │ 出问题先看这里 │ │ 播放倍速 │ │ 选择 添加途经点 折线绘制 │ │ │ │ 真实感模拟 │ │ 撤销 删除选中点 全览 │ │ │ │ 路线概览 │ └─────────────────────────┘ │ │ │ 途经点列表 │ │ │ │ 底图/隧道 │ ┌ 状态标签 ───────────────┐ │ │ │ │ │ 未播放 进度 速度 坐标 │ │ │ │ 加载 OSRM │ └─────────────────────────┘ │ │ │ 清空 导入导出│ │ │ ├──────────────┴───────────────────────────────┴──────────────────────┤ │ 底部播放条 │ │ 播放 暂停 继续 停止 │ 进度条 │ 已用 剩余 序号 │ 实时速度 坐标 倍速 │ └─────────────────────────────────────────────────────────────────────┘ 记住三个最关键的位置,后面教程会反复用到: ① 地图工具条上的「折线绘制」 —— 画轨迹的入口 ② 左下角的「加载 OSRM 路线」 —— 用途经点生成真实道路路线 ③ 底部播放条上的「播放」 —— 开始虚拟轨迹 ================================================================================ C. 地图基本操作 ================================================================================ 这些操作在**任何**绘制模式下都可用: 拖拽 按住鼠标左键拖动 → 平移地图 缩放 滚轮上下滚 → 放大 / 缩小 全览 点工具条「全览」→ 自动缩放到刚好装下整条轨迹 切换底图 左侧「底图」下拉框 高德矢量(带标注,国内最清晰) 高德卫星(含路网标注) Esri 全球卫星(英文标注,全球可用) OSM(国内可能连不上) 查看坐标 鼠标在地图上移动,中间状态标签的「坐标」会实时跟着变 【一个很实用的技巧】先跳到学校/目标区域,再开始画 左侧「快速定位到坐标」输入框,填「纬度, 经度」然后点「跳转」。 例如: 30.2741, 120.1551 注意顺序是**纬度在前、经度在后**,用英文逗号或空格分隔。 跳转**只是把地图移过去**,不会改变手机定位 —— 放心点。 常用地点可以点「记住此地」存下来,下次在下拉框里选中,点「前往」直接过去。 ================================================================================ D. 三种造轨迹的方式 ================================================================================ 你可以用下面任意一种方式得到一条轨迹。三条路都能直接播放。 ┌──────────────┬────────────────────┬──────────────────┬──────────────┐ │ 方式 │ 适合场景 │ 路线是否贴合道路 │ 操作量 │ ├──────────────┼────────────────────┼──────────────────┼──────────────┤ │ D1 折线绘制 │ 操场绕圈、校园小路 │ 否(走直线) │ 最少,最快 │ │ D2 途经点 │ 马路跑步、真实通勤 │ 是(走真实道路) │ 中等 │ │ D3 导入 GPX │ 复用现成轨迹文件 │ 取决于文件 │ 最少 │ └──────────────┴────────────────────┴──────────────────┴──────────────┘ -------------------------------------------------------------------------------- D1. 折线绘制(最直接,推荐先学这个) -------------------------------------------------------------------------------- 这是最常用、最直观的方式:在地图上点一串点,连成一条线,然后让手机沿这条线跑。 【第 1 步】点工具条上的「折线绘制」 按钮会高亮,工具提示会变成: 「折线绘制中:点击加点,双击或 Esc 结束」 同时日志面板会输出: [信息] 开始折线绘制:连续点击地图加点,双击或 Esc 结束 ⚠️ 注意:进入折线绘制模式后,**双击放大被自动关掉了** —— 因为双击要用来"结束绘制"。想放大请用滚轮。 【第 2 步】在地图上依次点击 每点一下,就加一个轨迹点,地图上会立刻把已画的线段用橙色连起来。 工具提示会实时更新成: 「折线绘制中:已加 7 点,双击或 Esc 结束」 日志里每加一个点也会记一行,带精确坐标: [信息] 折线加点 7:116.397500, 39.908700 画的时候注意: · 点与点之间是**直线连接**,不会自动绕开建筑物 · 点越密,轨迹越贴合你想要的形状;但也没必要太密, 直线段中间的点对最终效果没有影响 · 拐弯处多点几个点,弧度会更自然 · 操场绕圈那种场景,绕一圈点 20~40 个点就够了 【第 3 步】结束绘制 三种方式任选: · 在最后一个点上**双击** · 按 键 · 点工具条上其它任意工具(比如「选择」),会自动结束 结束后会自动做三件事: 1. 地图自动缩放到刚好装下整条折线 2. 工具自动切回「选择」模式,双击缩放恢复 3. 弹出提示「折线绘制完成,可直接播放或导出 GPX」 ⚠️ 如果只点了 0 个或 1 个点就结束,会提示「折线至少需要 2 个点」, 这条折线会被丢弃。至少要 2 个点。 【第 4 步】检查一下 左侧「路线概览」区域现在应该有了数字: 总距离 例如 2.41 km 路径点数 你刚才点的点数 途经点 0(折线模式不走途经点) 路线引擎 直线(因为没走 OSRM) 状态标签的「轨迹点」也应该显示你的点数。 ✔ 到这里折线就画好了,可以直接跳到 H 节开始播放。 -------------------------------------------------------------------------------- D2. 途经点 + OSRM 路线规划(最贴近真实道路) -------------------------------------------------------------------------------- 折线走的是直线,会"穿墙过楼"。如果测试的是跑步 App,轨迹最好贴着真实马路, 这时候用途经点 + OSRM 路线规划。 【第 1 步】点工具条上的「添加途经点」 工具提示变成「添加途经点:在地图上点击添加」 【第 2 步】在地图上点选关键位置 不需要点很密 —— 只要点"路线要经过的地方": 起点 → 第一个路口 → 拐弯处 → 途经的标志物 → 终点 一般 4~8 个点就够。点之间怎么走,交给 OSRM 去算。 【第 3 步】确认途经点列表 左侧「途经点列表」会出现你点的每一个点: 起 第一个点(绿色标记) 2 中间点 终 最后一个点 每一个点右边有按钮,鼠标移上去会显示: 定位到此处 把地图移到这个点 (还有删除按钮) 【第 4 步】点左下角的「加载 OSRM 路线」 这一步会**联网**请求 OSRM 路径规划服务,把点与点之间补成真实道路。 按钮会变成加载中状态,完成后: · 地图上的直线变成贴合道路的曲线 · 「路线引擎」从「直线」变成「OSRM」 · 「路径点数」会大幅增加(几百到几千,取决于距离) · 日志输出规划结果 ⚠️ 最少需要 2 个途经点,否则提示「至少需要 2 个途经点才能规划路线」。 ⚠️ OSRM 需要联网。连不上时会自动退化成直线连接, 路线仍然可用,只是不贴合道路。 【想调整路线怎么办】 调整途经点后,**必须重新点一次「加载 OSRM 路线」**, 否则地图上还是旧路线。 【微调途经点位置】 切到「选择」工具 → 在地图上**拖拽**途经点标记即可移动。 或者在左侧列表里**双击**某一行的坐标,直接输入精确经纬度。 【重新排序】 左侧途经点列表支持**拖拽排序** —— 抓住每行最左边的「⋮⋮」图标上下拖。 顺序变了之后同样要重新点「加载 OSRM 路线」。 -------------------------------------------------------------------------------- D3. 导入 GPX(复用现成轨迹) -------------------------------------------------------------------------------- 如果你已经有一条画好的轨迹(自己以前导出的、或者从别处拿到的 GPX 文件), 直接导进来最省事。 【操作】 点左下角的「导入 GPX」→ 在弹出的文件选择框里选 .gpx 文件。 导入后,轨迹会同时填充到「途经点列表」里,你可以继续编辑。 【注意】 · 只支持 GPX(.gpx / .xml) · 点位很多的 GPX(比如几千个点)导入后会比较卡, 因为每个点都会变成列表里的一行 · 导入的轨迹不走 OSRM 重新规划,直接按文件里的点走 【导出】 点「导出 GPX」把当前轨迹存成 .gpx 文件, 可以拿去别的软件看,或者分享给别人。 ================================================================================ E. 编辑轨迹:撤销 / 删除 / 移动 / 排序 ================================================================================ 画错了不用从头再来。 撤销 点工具条「撤销」,或按快捷键。每点一次回退一步。 折线绘制完成时会自动存一个还原点, 所以"画完发现不对"可以直接撤销重画。 删除单个途经点 切到「选择」工具 → 在地图上点一下要删的点(会高亮)→ 点工具条「删除选中点」,或直接按 键。 也可以在左侧途径点列表里点该行的删除按钮。 移动途经点 切到「选择」工具 → 直接**拖拽**地图上的点标记。 修改精确坐标 左侧「途经点列表」里**双击**某一行的坐标文字 → 输入新的经纬度。 整体清空 点左下角的「清空」(红色文字那个),会清掉当前轨迹的全部点和路线。 这个操作**不可撤销**,想留着就先「保存」(见 K 节)。 缩放查看 点「全览」自动适配;手工缩放用滚轮。 ================================================================================ F. 出行模式与播放倍速 ================================================================================ 【出行模式】决定了轨迹的**基础速度**,也就是"手机以多快的速度移动"。 驾车 约 13.9 m/s(50 km/h) 骑行 约 5.5 m/s(20 km/h) 步行 约 1.4 m/s(5 km/h) 飞行 很快(适合大跨度场景) 切换模式后,「路线概览」里的「按速度预计」会立刻更新 —— 那是"按这个速度跑完全程要多久"。 【两个一键预设】懒人用法: 校园跑预设 步行 1.4 m/s、下发 10Hz、漂移 4m、浮动 ±8%、不循环 长跑预设 骑行 5.5 m/s、下发 10Hz、漂移 6m、浮动 ±10% 点了之后上面所有参数会被一次性设好,直接可以播。 校园跑 / 打卡类测试直接用「校园跑预设」就行。 【播放倍速】是**回放速度**,和出行模式是两回事: · 出行模式 = 手机"真实"移动多快(影响上报给 App 的速度) · 播放倍速 = 你多快看完这整条轨迹 1.0x 按真实时间播(2km 步行要跑 24 分钟) 10x 10 倍速,2km 只要 2.4 分钟 0.1x ~ 50x 可调范围,指数刻度 默认 1.0x ⚠️ 倍速调太高时,上报速度也会跟着变大, 有些 App 会认为"超出人类极限"而判定异常。 测跑步类 App,建议倍速不要超过 3~5x。 「路线概览」里的「按倍速播放」会显示当前倍速下大约要播多久。 【循环播放】 勾上「循环播放(到达终点后回到起点)」,跑到终点会自动回到起点继续, 适合长时间挂机测试。不勾则跑到终点自动停。 ================================================================================ G. 真实感模拟参数逐个讲清楚 ================================================================================ 这一组参数决定"轨迹看起来像不像真人跑出来的"。默认值已经比较合理, 刚开始可以完全不管,直接用默认值。下面解释每个参数到底在做什么。 ── G1. 定位漂移(默认勾选,半径默认 4 米) 现实中的 GPS 定位不是精确的点,而是在真实位置附近**缓慢游走**。 勾上这个,程序会让上报的坐标在设定半径内随机漂移。 半径怎么选: 4 米 一般手机在开阔地的水平精度,最自然,推荐 0 米 完全贴线走,轨迹会非常"完美",反而假 10+ 米 手机信号差的环境(高楼间、树下),漂移明显 实现上是多尺度噪声(慢漂 + 中尺度 + 快抖), 所以漂移是**平滑游走**的,不会出现瞬间跳变。 ── G2. 速度浮动(默认勾选,幅度默认 ±8%) 真人跑步不可能每秒钟都精确保持同一速度。 勾上后,瞬时速度会在设定值上下波动。 幅度怎么选: ±8% 自然的配速波动,推荐 ±20%+ 体力不支那种忽快忽慢 0% 精确匀速,一眼假 ── G3. 发送节奏抖动(默认勾选) 真实 GPS 上报不是"精确每秒一次",而是有细微的时间抖动, 偶尔还会丢一两个采样点。勾上会更真实。 一般不用动它。 ── G4. 速度由位移推算(默认勾选) iOS 上报的速度不是独立字段,而是**由两个定位点之间的距离除以时间**算出来的。 勾上这个,程序也用同样方式推算速度, 保证「速度 / 位移 / 时间」三者自洽 —— 这是防作弊 App 最容易检查的地方。 建议保持勾选。 ── G5. 注入粗差跳点(默认不勾,概率默认 2%) 有时会故意上报一个明显偏离的坐标(比如突然跳到 30 米外), 下一秒又跳回来。真实 GPS 偶尔确实会这样。 这个参数的用途是**测你自己 App 的过滤逻辑**: 如果你的 App 应该滤掉这种跳点,就打开它,看看滤不滤得掉。 平时测试**不要开**。概率建议 2%~5%,调高了轨迹会很难看。 ── 参数组合建议 测校园跑 / 打卡 → 直接用「校园跑预设」,或: 漂移 4m、浮动 ±8%、节奏抖动开、速度推算开、粗差关 测轨迹平滑算法 → 漂移调大(10~20m),看你的算法能不能平滑掉 测防作弊 / 过滤 → 粗差打开,概率 5%,看能不能识别 追求"最像真人" → 全部保持默认即可 ================================================================================ H. 开始虚拟轨迹播放 ================================================================================ 【前置检查】播放前请确认: ☑ 顶部设备卡片显示已连接,不是「未连接」 ☑ 右侧日志最后几行有「DVT 虚拟定位会话已就绪」 ☑ 地图上已经有轨迹(折线、OSRM 路线,或导入的 GPX 都行) ☑ 手机上「开发者模式」已开 ☑ 爱思助手 / i4Tools / Xcode 等同类工具已关闭 【第 1 步】设置参数 按 F、G 两节的说明把「出行模式」「播放倍速」「循环播放」 「真实感模拟」调好。第一次用可以什么都不动,直接用默认值。 【第 2 步】(可选) 给轨迹起个名字 左侧「轨迹名称」输入框,填一个记得住的名字,最多 60 字。 方便之后保存和复用。 【第 3 步】点底部的「播放」按钮 也可以直接按 <空格> 键。 如果一切正常,你会看到: · 底部「播放状态」从「未播放」变成正在播放 · 进度条开始从 0% 向右走 · 「已用 / 剩余」时间开始倒数 · 「序号」显示当前跑到第几个点,例如 137 / 4210 · 地图上的轨迹会被**逐段染成已播放的颜色**, 还有一个移动的标记跟着走 · 中间状态标签的「速度」「进度」「坐标」实时更新 · 右侧日志出现:「[信息] 开始播放:2.41 km,倍速 1.0x」 然后每隔一段时间输出「已下发 lat=..., lon=...(第 N 次)」 **最重要的一步**:看手机屏幕。 手机上的定位图标应该开始沿着你画的路线移动。 这是唯一能证明"真的生效了"的证据。 【第 4 步】确认手机真的动了 打开手机上的地图 App(高德 / 苹果地图都行), 看蓝点是不是在按你画的路线走。 如果手机没动,先别急着调参数,去看 M 节的排查清单。 ── 播放失败时的常见提示 「请先添加至少 2 个途经点,或绘制折线、加载路线」 → 地图上还没有轨迹。回到 D 节先画一条。 「请先连接设备」 → 顶部没点「连接设备」,或者会话已经断了。 「设备响应超时,请检查连接后重试」 → DVT 连接断了(可能被别的工具抢了)。 点「断开」再点「连接设备」重连,然后重新播放。 ================================================================================ I. 播放过程中的控制 ================================================================================ 全部在底部播放条上。 ── 暂停 点「暂停」或按 <空格>。 手机**停在当前位置不动**(不会恢复真实定位)。 进度条和序号保留。 ── 继续 点「继续」,从暂停的位置接着播。 ── 跳转到任意位置(seek) 直接**拖动进度条**到想要的位置。 手机定位会立刻跳到轨迹上的对应点,然后从那里继续。 适合"我就想测第 3 公里那一段"。 ── 停止 点「停止」。播放结束,**手机立刻恢复真实定位**。 这跟「暂停」不一样 —— 暂停是停在虚拟位置,停止是回到真实位置。 ── 播放中实时看到的数字 底部右侧三格: 实时速度 当前上报给手机的速度(m/s 或 km/h) 当前坐标 当前下发到手机的经纬度 倍速 当前播放倍速 中间状态标签: 未播放/播放中 播放状态 进度 百分比 速度 同上 坐标 鼠标所在位置的坐标(注意:这个跟着鼠标走,不是播放位置) 轨迹点 总点数 ── 播放中改参数会怎样? 大部分真实感参数(漂移、浮动等)在 `play.start` 时就一起下发了, 播放中改滑块**不会**立刻影响正在播放的这次。 要让它生效,停止后重新点「播放」。 播放倍速同理 —— 停止重播才会用新的倍速。 ================================================================================ J. 结束与恢复真实定位 ================================================================================ 有三种情况会让手机恢复真实定位,任何一种都可以: 1. 点底部「停止」 2. 点左下角的「恢复真实定位」按钮 3. 点顶部的「断开」,或直接关掉程序 ⚠️ 程序关闭时会自动恢复真实定位,**不会**把手机卡在虚拟位置。 万一遇到程序崩溃没恢复,重新打开程序点一次「恢复真实定位」即可。 ⚠️ 但有一种情况恢复不了:DVT 会话被别的工具挤断了。 这时候虚拟定位本身也已经失效,手机通常会自动回到真实位置。 如果手机还停在虚拟位置,重启一次手机就能恢复。 ================================================================================ K. 保存与复用路线 ================================================================================ 画一条满意的轨迹不容易,可以存起来反复用。 【保存到本地】 左侧「本地保存的路线」下拉框旁边: · 点「保存」→ 当前轨迹存进浏览器 localStorage · 点「载入」→ 载入下拉框里选中的那条 · 点「删除」→ 删掉选中的那条 · 也可以直接**双击**下拉框快速载入 ⚠️ 存在浏览器的 localStorage 里,所以: · 换浏览器 / 清浏览器数据 / 换电脑 → 路线会丢 · 想长期保存请用「导出 GPX」存成文件 【导出成文件】 点「导出 GPX」,得到一个 .gpx 文件。 这是跨机器、跨软件最可靠的保存方式。 【复用流程】 下次打开程序 → 点「导入 GPX」选那个文件 → 直接播放。 ================================================================================ L. 快捷键总表 ================================================================================ ┌────────────┬──────────────────────────────────────────┐ │ 按键 │ 作用 │ ├────────────┼──────────────────────────────────────────┤ │ 空格 │ 播放 / 暂停 │ │ Esc │ 结束折线绘制 │ │ Del │ 删除当前选中的途经点 │ │ Backspace │ 同上 │ │ 双击 │ 折线绘制中 = 结束绘制;其它模式 = 放大 │ └────────────┴──────────────────────────────────────────┘ 提示:焦点在输入框里时,空格键会输入空格而不会播放。 点一下地图空白处再按空格。 ================================================================================ M. 常见问题与错误提示对照 ================================================================================ ── 画轨迹相关 Q: 点「折线绘制」后点地图没反应 · 确认工具条上「折线绘制」是**高亮**状态 · 确认点的是地图区域,不是左侧面板 · 看日志有没有「折线加点 N」—— 有就说明点上了,只是视觉没看出来 Q: 双击想放大,结果结束了绘制 这是设计如此。折线绘制模式下双击 = 结束绘制,放大请用滚轮。 想放大又不想结束,先按 Esc 结束绘制,再双击放大。 Q: 提示「折线至少需要 2 个点」 你只点了 0 或 1 个点就结束了。至少点 2 个。 Q: 点「加载 OSRM 路线」没反应 / 还是直线 · 途经点少于 2 个 · 网络连不上 OSRM 服务(会自动退化成直线,日志里会有说明) · 改了途经点顺序后忘了重新点这个按钮 Q: 导入 GPX 后界面很卡 文件点数太多(几千个),每个点都会渲染成列表的一行。 可以用文本编辑器把 GPX 抽稀后再导入,或者改用折线绘制。 ── 播放相关 Q: 点「播放」没反应,提示要"添加至少 2 个途经点" 地图上还没有轨迹。先用 D1 / D2 / D3 任意一种方式造一条。 Q: 播放了,但手机定位没动 按顺序排查: 1) 手机屏幕上有没有出现定位图标?没有 → 会话没建立,重连设备 2) 右侧日志有没有「已下发 lat=..., lon=...」?没有 → 播放没真正开始 3) 日志里最后一次下发的坐标,是不是你轨迹上的点? 4) 手机上的地图 App 打开看看,蓝点在不在动 5) 部分 App 有独立定位源(比如蓝牙 GPS),不受系统定位影响 6) 手机是不是被别的工具连着(爱思助手等),抢走了 DVT 连接 Q: 播到一半手机定位跳回真实位置 Windows 的用户态隧道偶尔会静默断开。 · 程序有保活:设了点但没在播放时每 15 秒重发一次 · 播放中断开的话,点「断开」→「连接设备」重连,再重新播放 · 长距离测试建议勾上「循环播放」,播放中连接更稳定 Q: 播放速度和我设的不一样 · 检查「播放倍速」(1.0x 才是真实时间) · 检查「出行模式」—— 它决定了基础速度 · 「实时速度」显示的是**上报给手机的速度**, 和"你看到轨迹移动的快慢"(受倍速影响)是两回事 Q: 拖进度条后手机没跟着跳 seek 需要一点时间下发,等 1~2 秒。 如果一直不动,说明连接断了,重连后重试。 Q: 停止后手机定位没恢复 点一次左下角「恢复真实定位」。 还不行就点「断开」,或者重启手机(一定有效)。 ================================================================================ N. 参数速查表 ================================================================================ ┌──────────────────────┬──────────────┬────────┬────────────────────────┐ │ 参数 │ 位置 │ 默认 │ 建议 │ ├──────────────────────┼──────────────┼────────┼────────────────────────┤ │ 出行模式 │ 左侧第一块 │ 驾车 │ 按 App 类型选;跑步选 │ │ │ │ │ 步行 / 骑行 │ │ 播放倍速 │ 左侧 │ 1.0x │ 跑步类 ≤ 3~5x │ │ 循环播放 │ 左侧 │ 关 │ 长时间挂机测试时开 │ │ 定位漂移 │ 真实感模拟 │ 开 4m │ 4m(开阔地) │ │ 速度浮动 │ 真实感模拟 │ 开 ±8% │ ±8% │ │ 发送节奏抖动 │ 真实感模拟 │ 开 │ 保持开 │ │ 速度由位移推算 │ 真实感模拟 │ 开 │ 保持开(防作弊关键) │ │ 注入粗差跳点 │ 真实感模拟 │ 关 2% │ 只在自己测过滤时开 │ │ 轨迹名称 │ 左侧 │ 空 │ 建议填,方便保存复用 │ └──────────────────────┴──────────────┴────────┴────────────────────────┘ 首次使用的最短路径: 点「校园跑预设」→ 画折线 → 点「播放」。 三个动作就能跑起来。 ================================================================================ 英文部分从下面开始 / English section starts below ================================================================================ ================================================================================ PART 2: ENGLISH ================================================================================ -------------------------------------------------------------------------------- Contents -------------------------------------------------------------------------------- A. Before you start: three must-dos B. UI overview: what every button does C. Basic map controls D. Three ways to create a route D1. Polyline drawing (simplest — start here) D2. Waypoints + OSRM routing (follows real roads) D3. Import a GPX file E. Editing a route: undo / delete / move / reorder F. Travel mode and playback speed G. The realism parameters, explained one by one H. Starting virtual playback I. Controls during playback: pause / resume / seek / stop J. Finishing and restoring the real location K. Saving and reusing routes L. Keyboard shortcuts M. Troubleshooting and error messages N. Parameter quick-reference table ================================================================================ A. Before you start: three must-dos ================================================================================ Skip any of these and "Play" will fail. Check them in order: A1. The device is connected Have you clicked "Connect device" (top-right)? Once it succeeds, the device card in the middle of the top bar shows the phone name and iOS version, and the connection pill changes from "not connected". If it doesn't, see the Troubleshooting section of USAGE.txt. A2. The developer disk image is mounted On iOS 17+ virtual location depends on the developer disk image. This is normally handled automatically when you click "Connect device". If the log shows something like "Failed to verify the disk image signature", click "Mount developer image" (bottom of the left panel) manually — progress streams into the "Run log" panel on the right. A3. The phone is next to you with the screen on Once playback starts a location arrow appears on the phone. That is the most direct evidence that it is actually working — don't lock it and walk away. -- When all three are done, the run log should contain lines like: [真机] DVT 虚拟定位会话已就绪(iOS 17+ / RSD ...,长连接保持中) [信息] 设备已连接:iPhone 11 Seeing "session ready" means everything is fine. Start drawing. ================================================================================ B. UI overview: what every button does ================================================================================ The window has four regions: +---------------------------------------------------------------------+ | Top bar | | Refresh devices rescan USB / network for iOS devices | | Connect device build the tunnel + open the DVT session | | (required before drawing) | | Disconnect release the session, restore the real location | +--------------+-------------------------------+----------------------+ | LEFT | CENTER: map | RIGHT: run log | | Route setup | | | | | +- Map toolbar -------------+ | Check here first | | Travel mode | | Select Add waypoint | | when anything fails | | Speed | | Polyline | | | | Realism | | Undo Delete point Fit | | | | Route stats | +---------------------------+ | | | Waypoints | | | | Basemap | +- Status chips -----------+ | | | | | idle progress speed | | | | Build OSRM | | coords track points | | | | Clear/Import | +---------------------------+ | | +--------------+-------------------------------+----------------------+ | Bottom playback bar | | Play Pause Resume Stop | progress | elapsed remaining index | | live speed | current coords | speed multiplier | +---------------------------------------------------------------------+ Remember these three locations; the tutorial uses them constantly: (1) "Polyline" on the map toolbar — how you draw a route (2) "Build OSRM route" (bottom-left) — turns waypoints into real roads (3) "Play" on the bottom playback bar — starts virtual playback ================================================================================ C. Basic map controls ================================================================================ These work in every drawing mode: Pan hold left mouse button and drag Zoom mouse wheel up / down Fit click "Fit" on the toolbar to frame the whole route Basemap "Basemap" dropdown on the left: AMap vector (with labels — clearest in China) AMap satellite (with road overlay) Esri world imagery (English labels, global) OSM (may be unreachable from mainland China) Coordinates move the mouse over the map; the "coords" chip follows it [Very useful tip] Jump to your target area before drawing Use "Jump to coordinates" in the left panel: type "latitude, longitude" and click "Go". For example: 30.2741, 120.1551 Order is latitude first, then longitude, separated by a comma or space. Jumping only moves the map — it does not change the phone's location, so it is completely safe to click around. Click "Remember this place" to save a spot; pick it from the dropdown and click "Go" next time. ================================================================================ D. Three ways to create a route ================================================================================ +--------------+--------------------+------------------+--------------+ | Method | Best for | Follows roads? | Effort | +--------------+--------------------+------------------+--------------+ | D1 Polyline | tracks, campus | No (straight) | Lowest | | D2 Waypoints | street running, | Yes (real roads) | Medium | | | real commutes | | | | D3 GPX | reusing an | Depends on file | Lowest | | | existing track | | | +--------------+--------------------+------------------+--------------+ -------------------------------------------------------------------------------- D1. Polyline drawing (simplest — start here) -------------------------------------------------------------------------------- The most direct method: click a series of points on the map to form a line, then let the phone travel along it. [Step 1] Click "Polyline" on the map toolbar The button highlights and the hint changes to: "Polyline drawing: click to add, double-click or Esc to finish" The log also prints: [info] start polyline: click repeatedly to add points, double-click or Esc to end NOTE: entering polyline mode disables double-click zoom, because double-click is used to finish the drawing. Use the wheel to zoom instead. [Step 2] Click points on the map one by one Every click adds a track point and the line is drawn immediately in orange. The hint updates live: "Polyline drawing: 7 points added, double-click or Esc to finish" Each point is also logged with its exact coordinates: [info] polyline point 7: 116.397500, 39.908700 While drawing: - Segments are straight lines; they do not route around buildings - More points = a shape that follows your intent more closely, but there is no need to overdo it — extra points along a straight segment change nothing - Add a few extra points at curves so the corners look natural - For a loop around a track, 20-40 points is plenty [Step 3] Finish the drawing Any of these: - Double-click on the last point - Press - Click any other tool (e.g. "Select") — drawing ends automatically Finishing does three things: 1. The map zooms to frame the whole line 2. The tool switches back to "Select" and double-click zoom is restored 3. A toast appears: "Polyline complete — you can play it or export GPX" NOTE: with 0 or 1 points you get "a polyline needs at least 2 points" and the line is discarded. Two points minimum. [Step 4] Sanity check The "Route overview" block on the left should now show numbers: Total distance e.g. 2.41 km Path points the number you just clicked Waypoints 0 (polyline mode does not use waypoints) Route engine Straight line (OSRM was not used) The "track points" chip should match too. Done — you can jump straight to section H to start playback. -------------------------------------------------------------------------------- D2. Waypoints + OSRM routing (follows real roads) -------------------------------------------------------------------------------- A polyline goes straight and will cut through buildings. If you are testing a running app, the track should hug real streets — use waypoints plus OSRM. [Step 1] Click "Add waypoint" on the map toolbar [Step 2] Click the key positions on the map You do not need many points — only the places the route must pass through: start -> first junction -> the turn -> a landmark -> finish Four to eight points is usually enough. OSRM fills in the path between them. [Step 3] Check the waypoint list The "Waypoint list" on the left now shows every point: Start the first point (green marker) 2 intermediate points End the last point Hovering a row reveals its buttons: "Center here" and delete. [Step 4] Click "Build OSRM route" (bottom-left) This makes a network request to the OSRM routing service and replaces the straight lines with real roads. When it finishes: - The straight lines become road-following curves - "Route engine" changes from "straight" to "OSRM" - "Path points" jumps to hundreds or thousands - The log prints the result NOTE: at least 2 waypoints are required, otherwise you get "at least 2 waypoints are needed to plan a route". NOTE: OSRM needs network access. If it is unreachable the app falls back to straight lines automatically — the route still works, it just won't follow roads. [Adjusting the route] After changing waypoints you MUST click "Build OSRM route" again, otherwise the map still shows the old route. [Fine-tuning waypoint positions] Switch to the "Select" tool and drag the markers on the map. Or double-click a row's coordinates in the left list and type exact values. [Reordering] The waypoint list supports drag-and-drop — grab the "||" handle on the left of a row and move it. Reorder, then click "Build OSRM route" again. -------------------------------------------------------------------------------- D3. Import a GPX file -------------------------------------------------------------------------------- If you already have a prepared track (something you exported earlier, or a file from elsewhere), importing is the least work. [How] Click "Import GPX" (bottom-left) and choose a .gpx file. The track also populates the waypoint list, so you can keep editing it. [Notes] - Only GPX (.gpx / .xml) is supported - A GPX with thousands of points will feel sluggish, because every point becomes a row in the list - Imported tracks are not re-routed through OSRM; the file's own points are used [Export] Click "Export GPX" to save the current track as a .gpx file you can open in other software or share. ================================================================================ E. Editing a route: undo / delete / move / reorder ================================================================================ You do not have to start over when you make a mistake. Undo Click "Undo" on the toolbar, or use the shortcut. One step per click. Finishing a polyline stores a restore point, so "drew it wrong" can simply be undone. Delete a single waypoint Switch to "Select", click the point on the map to highlight it, then click "Delete point" or press . You can also use the delete button on the row in the left list. Move a waypoint Switch to "Select" and drag the marker on the map. Edit exact coordinates Double-click the coordinate text on a row in the waypoint list. Clear everything Click "Clear" (red text, bottom-left). This removes all points and the route. It CANNOT be undone — click "Save" first if you want to keep it (section K). Zoom to view Click "Fit" to auto-frame, or use the wheel. ================================================================================ F. Travel mode and playback speed ================================================================================ [Travel mode] sets the BASE speed — how fast the phone "really" moves. Driving ~13.9 m/s (50 km/h) Cycling ~5.5 m/s (20 km/h) Walking ~1.4 m/s (5 km/h) Flight very fast (good for long distances) Switching mode instantly updates "Estimated at this speed" in the route overview — that is how long the route takes at that speed. [Two one-click presets] Campus run walking 1.4 m/s, 10 Hz, drift 4 m, jitter +-8%, no loop Long run cycling 5.5 m/s, 10 Hz, drift 6 m, jitter +-10% Clicking one sets everything above at once. For check-in / campus-run style testing, just use "Campus run". [Playback speed] is the PLAYBACK RATE — a different thing entirely: - Travel mode = how fast the phone "really" moves (affects reported speed) - Playback speed = how fast you watch the whole route 1.0x real time (a 2 km walk takes 24 minutes) 10x 10x faster, so 2.4 minutes 0.1x - 50x adjustable, exponential scale Default 1.0x NOTE: at high multipliers the reported speed scales up too, and some apps flag that as superhuman. For running apps keep it at 3-5x or below. "Playback at this multiplier" in the route overview shows the approximate duration at the current multiplier. [Loop] Tick "Loop (return to start after the end)" and playback restarts from the beginning when it reaches the end — handy for long unattended tests. Leave it off and playback stops at the end. ================================================================================ G. The realism parameters, explained one by one ================================================================================ These decide whether the track looks like a real person produced it. The defaults are sensible; you can ignore them entirely at first. -- G1. GPS drift (on by default, radius 4 m) Real GPS is not a precise point; it wanders slowly around the true position. With this on, reported coordinates drift randomly within the chosen radius. 4 m typical phone accuracy in the open — most natural, recommended 0 m perfectly on the line; looks too clean, and therefore fake 10+ m poor signal (downtown, under trees) It uses multi-scale noise (slow wander + medium + fast jitter), so the drift is a smooth wander rather than sudden jumps. -- G2. Speed jitter (on by default, +-8%) A real runner cannot hold exactly the same pace every second. With this on the instantaneous speed fluctuates around the set value. +-8% natural pace variation, recommended +-20%+ visibly tiring, speeding up and slowing down 0% perfectly constant — obviously synthetic -- G3. Timing jitter (on by default) Real GPS does not report exactly once per second; intervals vary slightly and samples are occasionally dropped. This makes that realistic. Usually no need to touch it. -- G4. Derive speed from displacement (on by default) iOS does not report speed as an independent field — it is computed as the distance between two fixes divided by the time between them. With this on the app computes speed the same way, keeping speed / displacement / time mutually consistent. That is the first thing a cheat-detecting app will check. Leave it on. -- G5. Inject gross errors (off by default, 2% probability) Occasionally reports a coordinate clearly off the line (say 30 m away) and then snaps back the next second. Real GPS does this sometimes. The purpose is to TEST YOUR OWN APP'S FILTERING: if your app is supposed to discard such jumps, turn this on and see whether it does. For normal testing keep it OFF. 2-5% is plenty; higher makes the track ugly. -- Suggested combinations Campus run / check-in -> use the "Campus run" preset, or: drift 4 m, jitter +-8%, timing on, derive on, gross off Testing smoothing -> raise drift (10-20 m) and see if your algorithm copes Testing anti-cheat -> gross errors on at 5%, see if it gets detected "Most realistic" -> keep every default ================================================================================ H. Starting virtual playback ================================================================================ [Pre-flight checklist] [ ] The device card at the top shows connected, not "not connected" [ ] The run log ends with "DVT session ready" [ ] A route exists on the map (polyline, OSRM route or imported GPX) [ ] Developer Mode is enabled on the phone [ ] 3uTools / i4Tools / Xcode and similar are closed [Step 1] Set the parameters Configure travel mode, playback speed, loop and realism per sections F and G. For a first run you can leave everything at its default. [Step 2] (Optional) Name the route Type a memorable name in "Route name" (max 60 characters) so it is easy to save and reuse later. [Step 3] Click "Play" on the bottom bar Or just press . If everything is fine you will see: - The playback state changes from idle to playing - The progress bar starts moving right from 0% - Elapsed / remaining times start counting - The index shows the current point, e.g. 137 / 4210 - The route on the map is progressively tinted as it plays, with a moving marker following it - The speed / progress / coords chips update live - The log prints "[info] playback started: 2.41 km, speed 1.0x" and then "sent lat=..., lon=... (N)" periodically MOST IMPORTANT: look at the phone. The location arrow should start moving along the route you drew. That is the only proof it actually works. [Step 4] Confirm the phone really moves Open a map app on the phone (AMap or Apple Maps) and watch the blue dot travel along your route. If the phone does not move, do not start tweaking parameters — go to the troubleshooting list in section M. -- Common failure messages "Please add at least 2 waypoints, or draw a polyline, or load a route" -> There is no route on the map yet. Go back to section D. "Please connect a device first" -> "Connect device" was not clicked, or the session dropped. "Device response timed out, check the connection and retry" -> The DVT connection dropped (possibly taken over by another tool). Click "Disconnect", then "Connect device", then play again. ================================================================================ I. Controls during playback ================================================================================ All on the bottom playback bar. -- Pause Click "Pause" or press . The phone STAYS at its current virtual position (it does not restore the real one). Progress and index are preserved. -- Resume Click "Resume" to continue from where you paused. -- Seek Drag the progress bar to any position. The phone jumps to the corresponding point on the route and continues from there. Handy for "I only want to test the third kilometre". -- Stop Click "Stop". Playback ends and the phone IMMEDIATELY returns to its real location. This differs from Pause: pause leaves it at the virtual position, stop restores the real one. -- Live numbers Bottom-right three cells: Live speed current speed reported to the phone (m/s or km/h) Current coords coordinates currently sent to the phone Multiplier current playback speed multiplier Status chips in the middle: idle / playing playback state progress percentage speed same as live speed coords the MOUSE position, not the playback position track points total point count -- What if I change parameters mid-playback? Most realism parameters are sent with `play.start`, so moving a slider during playback does NOT affect the run in progress. To apply them, stop and click Play again. The same applies to playback speed — stop and restart to use the new value. ================================================================================ J. Finishing and restoring the real location ================================================================================ Any of these restores the phone's real location: 1. Click "Stop" on the bottom bar 2. Click "Restore real location" (bottom-left) 3. Click "Disconnect" at the top, or simply close the app NOTE: closing the app restores the real location automatically — the phone is never left stuck at a fake position. If the app ever crashes without restoring, just reopen it and click "Restore real location". NOTE: one case cannot be recovered — when another tool evicts the DVT session. Virtual location is already dead at that point and the phone usually returns to its real position by itself. If it is still stuck, restart the phone. ================================================================================ K. Saving and reusing routes ================================================================================ A good route is worth keeping. [Save locally] Next to the "Saved routes" dropdown on the left: - "Save" stores the current route in browser localStorage - "Load" loads the selected entry - "Delete" removes the selected entry - You can also double-click the dropdown to load quickly NOTE: this lives in the browser's localStorage, so switching browsers, clearing site data, or moving to another machine loses it. For long-term storage use "Export GPX" to write a file. [Export to a file] Click "Export GPX" to get a .gpx file — the most portable way to keep a route. [Reusing] Next time: "Import GPX", pick the file, hit Play. ================================================================================ L. Keyboard shortcuts ================================================================================ +------------+-------------------------------------------------+ | Key | Action | +------------+-------------------------------------------------+ | Space | Play / Pause | | Esc | Finish polyline drawing | | Del | Delete the selected waypoint | | Backspace | Same as Del | | Double-clk | In polyline mode: finish; otherwise: zoom in | +------------+-------------------------------------------------+ Tip: when the focus is inside a text input, Space types a space instead of playing. Click an empty part of the map first. ================================================================================ M. Troubleshooting and error messages ================================================================================ -- Drawing Q: Clicking the map does nothing in polyline mode - Make sure "Polyline" is highlighted on the toolbar - Make sure you are clicking the map, not the left panel - Check the log for "polyline point N" — if it is there, clicks are registering Q: I double-clicked to zoom but it finished the drawing instead That is by design. In polyline mode double-click means "finish". Use the wheel to zoom, or press Esc first. Q: "A polyline needs at least 2 points" You finished with 0 or 1 points. Add at least two. Q: "Build OSRM route" does nothing / the line stays straight - Fewer than 2 waypoints - OSRM is unreachable (the app falls back to straight lines and says so in the log) - You reordered waypoints but forgot to click the button again Q: The UI lags after importing a GPX Too many points (thousands); each one becomes a list row. Decimate the GPX in a text editor, or use polyline drawing instead. -- Playback Q: Clicking "Play" does nothing but asks for "at least 2 waypoints" There is no route on the map. Create one with D1 / D2 / D3 first. Q: It plays but the phone's location does not move Check in order: 1) Does a location arrow appear on the phone? No -> session is not up; reconnect the device 2) Does the log show "sent lat=..., lon=..."? No -> playback never really started 3) Is the last sent coordinate on your route? 4) Open a map app on the phone — is the blue dot moving? 5) Some apps use an independent location source (e.g. a Bluetooth GPS) and ignore the system location 6) Is another tool (3uTools etc.) holding the DVT connection? Q: Halfway through, the phone reverts to its real location The Windows userspace tunnel occasionally drops silently. - The app has a keepalive: when a location is set but playback is stopped, it re-sends every 15 seconds - If it drops mid-playback, click "Disconnect" then "Connect device", then play again - For long routes, enable "Loop" — the connection is more stable while actively playing Q: The playback speed is not what I set - Check the playback multiplier (only 1.0x is real time) - Check the travel mode — it sets the base speed - "Live speed" is what is reported TO THE PHONE; how fast the track visually moves is a separate thing controlled by the multiplier Q: Dragging the progress bar does not move the phone Seeking takes a moment to send — wait 1-2 seconds. If it never moves, the connection is down; reconnect and retry. Q: After Stop the phone did not restore Click "Restore real location" (bottom-left). If that fails, click "Disconnect", or restart the phone (always works). ================================================================================ N. Parameter quick-reference table ================================================================================ +----------------------+--------------+--------+---------------------------+ | Parameter | Location | Default| Recommendation | +----------------------+--------------+--------+---------------------------+ | Travel mode | left, top | Driving| Match your app; walking | | | | | or cycling for running | | Playback multiplier | left | 1.0x | <= 3-5x for running apps | | Loop | left | Off | On for long unattended | | GPS drift | realism | On 4 m | 4 m (open sky) | | Speed jitter | realism | On +-8%| +-8% | | Timing jitter | realism | On | Leave on | | Derive speed | realism | On | Leave on (anti-cheat key) | | Gross errors | realism | Off 2% | Only when testing filters | | Route name | left | empty | Fill it in for reuse | +----------------------+--------------+--------+---------------------------+ Shortest path for a first run: Click "Campus run preset" -> draw a polyline -> click "Play". Three actions and it runs. ================================================================================ 链接 / Links ================================================================================ 仓库 / Repo : https://github.com/jbjf6666/ios-location-track 使用说明 : USAGE.txt(安装 / 连接设备 / 常见问题) Windows 文档 : docs/README-WINDOWS.md(中) / README-WINDOWS.en.md(英) 问题反馈 : https://github.com/jbjf6666/ios-location-track/issues ================================================================================