DoctorReid / StarRailOneDragon

崩坏:星穹铁道 - 一条龙 Honkai Star Rail - One Dragon | 全日常自动 | 支持黄泉 | 支持第九宇宙 | 星穹铁道锄大地 | 星穹铁道模拟宇宙 | 星穹铁道脚本 | 基于图像识别 | Star Rail Script
GNU General Public License v3.0
840 stars 30 forks source link

第九宇宙反向寻路bug #302

Closed HCID274 closed 4 months ago

HCID274 commented 5 months ago

使用版本

2.2.1

问题分类

问题宇宙

问题楼层

路线名称

使用的yolo模型:yolov8n-960-simuni-0512

问题描述

在模拟宇宙9中,寻路判定有bug,如果怪离得过远,小地图没有红点时,脚本不会往小地图正北方寻路,而是会朝东南或者西南方向(2种方向我都遇到过),反向寻路,一直进行方向的调整。 即使完成了第一层怪物的剿灭,地图上能看见出口,但是仍然会优先执行反向寻路的操作,这里很怪,不知道是不是还在测试的原因 微信图片_20240519081021 这次的反向是向西南方向移动: 微信截图_20240519101648

[10:04:29] [detector.py 213] [INFO]: 识别完毕 得到结果 0个。预处理耗时 0.007s, 推理耗时 0.049s, 后处理耗时 0.000s [10:04:29] [init.py 719] [INFO]: 指令[ 区域-战斗 ] 节点 识别敌人 返回状态 识别不到任何内容 [10:04:31] [init.py 719] [INFO]: 指令[ 区域-战斗 ] 节点 转动找目标 返回状态 成功 [10:04:31] [init.py 719] [INFO]: 指令[ 区域-战斗 ] 节点 画面检测 返回状态 小地图有红点 [10:04:31] [init.py 274] [INFO]: 指令[ 向红点移动 ] 执行成功 返回状态 已到达 [10:04:31] [init.py 719] [INFO]: 指令[ 区域-战斗 ] 节点 向红点移动 返回状态 已到达 [10:04:34] [init.py 274] [INFO]: 指令[ 模拟宇宙 进入战斗 ] 执行成功 返回状态 未发现敌人 [10:04:34] [init.py 719] [INFO]: 指令[ 区域-战斗 ] 节点 进入战斗 返回状态 未发现敌人 [10:04:34] [init.py 140] [INFO]: 当前角度: 270.00度 目标角度: 140.36度 转动朝向: -129.64度 [10:04:35] [init.py 719] [INFO]: 指令[ 区域-战斗 ] 节点 战斗后处理 返回状态 成功 [10:04:35] [init.py 719] [INFO]: 指令[ 区域-战斗 ] 节点 画面检测 返回状态 小地图无红点 [10:04:35] [detector.py 213] [INFO]: 识别完毕 得到结果 0个。预处理耗时 0.006s, 推理耗时 0.040s, 后处理耗时 0.000s [10:04:35] [init.py 719] [INFO]: 指令[ 区域-战斗 ] 节点 识别敌人 返回状态 识别不到任何内容 [10:04:36] [init.py 719] [INFO]: 指令[ 区域-战斗 ] 节点 转动找目标 返回状态 成功 [10:04:36] [init.py 719] [INFO]: 指令[ 区域-战斗 ] 节点 画面检测 返回状态 小地图有红点 [10:04:37] [init.py 274] [INFO]: 指令[ 向红点移动 ] 执行成功 返回状态 已到达 [10:04:37] [init.py 719] [INFO]: 指令[ 区域-战斗 ] 节点 向红点移动 返回状态 已到达

[10:04:38] [init.py 276] [ERROR]: 指令[ 模拟宇宙 进入战斗 ] 执行失败 返回状态 人工结束 [10:04:38] [init.py 719] [INFO]: 指令[ 区域-战斗 ] 节点 进入战斗 返回状态 人工结束 [10:04:38] [init.py 276] [ERROR]: 指令[ 区域-战斗 ] 执行失败 返回状态 人工结束 [10:04:38] [init.py 719] [INFO]: 指令[ 模拟宇宙 第九世界 挑战楼层 ] 节点 区域 返回状态 人工结束 [10:04:38] [init.py 276] [ERROR]: 指令[ 模拟宇宙 第九世界 挑战楼层 ] 执行失败 返回状态 人工结束 [10:04:38] [init.py 719] [INFO]: 指令[ 模拟宇宙 第九世界 ] 节点 挑战楼层 返回状态 人工结束 [10:04:38] [init.py 276] [ERROR]: 指令[ 模拟宇宙 第九世界 ] 执行失败 返回状态 人工结束 [10:04:38] [init.py 719] [INFO]: 指令[ 模拟宇宙 ] 节点 通关 返回状态 人工结束 [10:04:38] [init.py 276] [ERROR]: 指令[ 模拟宇宙 ] 执行失败 返回状态 人工结束 [10:04:38] [init.py 719] [INFO]: 指令[ 开拓力 ] 节点 挑战模拟宇宙 返回状态 人工结束 [10:04:38] [init.py 276] [ERROR]: 指令[ 开拓力 ] 执行失败 返回状态 人工结束

其他

DoctorReid commented 5 months ago

应该是任务的红点导致认为那边有敌人

恭喜你发现了一个正确的bug

HCID274 commented 5 months ago

噢噢,原来如此,能否加个跟小地图形状相符的圆形遮罩判定范围呢,鄙人薄见

DoctorReid commented 5 months ago

试了下好像不是,已经有圆形的判断了。

日志看不出来问题。

有没有印象是不是小地图刚好覆盖在红色的下层入口上面,导致认为小地图还有红点?

HCID274 commented 5 months ago

好像不是,在其他宇宙中都是正常的,唯独第九宇宙,只要小地图没有红点,那么就会执行反向寻路。

我测试了2遍,第一次是距离过远,小地图没有红点,脚本自动朝右后也就是小地图东南方向寻路,手动转视角也行不通,一直卡在这个状态;

第二次是小地图一开始就有红点,打完所有怪后,小地图没红点了,就开始朝西南方向寻路,也就是本次issue的截图。

我晚上再多测试几次第九宇宙,我也找找原因

DoctorReid commented 5 months ago

逻辑是这样的

  1. 进图记录最原始的方向
  2. 找红点或者用yolo识别怪的方向,有的话记录方向
  3. 1里面没有识别到的话,按上一次记录的方向往前走一段距离
  4. 往前一段距离还是没有的话就开始转圈
  5. 转一圈还是没有就再按之前的方向往前走一段
  6. 最多转两圈后失败
HCID274 commented 5 months ago

image 我发现如果用脚本打开游戏的话,模拟宇宙九可以运行大部分内容(之前卡住是我手动打开游戏,再管理员权限打开脚本,原因可能是这个)

但是,在又一次测试中,脚本会卡在这个场景,这个场景很特殊,怪物确实在正前方,但是阴间地图会卡住人物,不让人物过去。人物要过去得右移几步,才能通过空气墙。

以往非yolo的寻路逻辑在模拟宇宙九之前我记得是奏效的,就是不断走半径越来越大的逆时针正方形,直到脱困,这里不知道是yolo和小地图红点冲突了还是怎么回事,这个逻辑没有奏效

感谢讲解代码逻辑!

错误日志: [18:06:03] [init.py 222] [INFO]: 寻路中 当前点: (0, 0) 目标点: (2, -44) [18:06:04] [init.py 140] [INFO]: 当前角度: 271.37度 目标角度: 272.60度 转动朝向: 1.23度 [18:06:04] [init.py 222] [INFO]: 寻路中 当前点: (0, 0) 目标点: (2, -44) [18:06:04] [init.py 140] [INFO]: 当前角度: 271.37度 目标角度: 272.60度 转动朝向: 1.23度 [18:06:04] [init.py 222] [INFO]: 寻路中 当前点: (0, 0) 目标点: (2, -44) [18:06:04] [init.py 140] [INFO]: 当前角度: 271.37度 目标角度: 272.60度 转动朝向: 1.23度 [18:06:04] [init.py 222] [INFO]: 寻路中 当前点: (0, 0) 目标点: (2, -44) [18:06:04] [init.py 140] [INFO]: 当前角度: 271.37度 目标角度: 272.60度 转动朝向: 1.23度 [18:06:04] [init.py 222] [INFO]: 寻路中 当前点: (0, 0) 目标点: (2, -44) [18:06:05] [init.py 140] [INFO]: 当前角度: 271.37度 目标角度: 272.60度 转动朝向: 1.23度 [18:06:05] [init.py 222] [INFO]: 寻路中 当前点: (0, 0) 目标点: (2, -44) [18:06:05] [init.py 140] [INFO]: 当前角度: 271.37度 目标角度: 272.60度 转动朝向: 1.23度 [18:06:05] [init.py 222] [INFO]: 寻路中 当前点: (0, 0) 目标点: (2, -44) [18:06:05] [init.py 140] [INFO]: 当前角度: 271.37度 目标角度: 272.60度 转动朝向: 1.23度 [18:06:05] [init.py 222] [INFO]: 寻路中 当前点: (0, 0) 目标点: (2, -44)

[18:06:05] [init.py 140] [INFO]: 当前角度: 271.37度 目标角度: 272.60度 转动朝向: 1.23度 [18:06:05] [init.py 222] [INFO]: 寻路中 当前点: (0, 0) 目标点: (2, -44) [18:06:06] [init.py 140] [INFO]: 当前角度: 271.37度 目标角度: 272.60度 转动朝向: 1.23度 [18:06:06] [init.py 222] [INFO]: 寻路中 当前点: (0, 0) 目标点: (2, -44) [18:06:06] [init.py 140] [INFO]: 当前角度: 271.37度 目标角度: 272.60度 转动朝向: 1.23度 [18:06:06] [init.py 222] [INFO]: 寻路中 当前点: (0, 0) 目标点: (2, -44) [18:06:06] [init.py 140] [INFO]: 当前角度: 271.37度 目标角度: 272.60度 转动朝向: 1.23度 [18:06:06] [init.py 222] [INFO]: 寻路中 当前点: (0, 0) 目标点: (2, -44) [18:06:06] [init.py 140] [INFO]: 当前角度: 271.37度 目标角度: 272.60度 转动朝向: 1.23度 [18:06:06] [init.py 222] [INFO]: 寻路中 当前点: (0, 0) 目标点: (2, -44) [18:06:07] [init.py 140] [INFO]: 当前角度: 271.37度 目标角度: 272.60度 转动朝向: 1.23度 [18:06:07] [init.py 222] [INFO]: 寻路中 当前点: (0, 0) 目标点: (2, -44) [18:06:07] [init.py 140] [INFO]: 当前角度: 271.37度 目标角度: 272.60度 转动朝向: 1.23度 [18:06:07] [init.py 222] [INFO]: 寻路中 当前点: (0, 0) 目标点: (2, -44) [18:06:07] [init.py 140] [INFO]: 当前角度: 271.37度 目标角度: 272.60度 转动朝向: 1.23度 [18:06:07] [init.py 222] [INFO]: 寻路中 当前点: (0, 0) 目标点: (2, -44)

[18:06:07] [init.py 140] [INFO]: 当前角度: 271.37度 目标角度: 272.60度 转动朝向: 1.23度 [18:06:07] [init.py 222] [INFO]: 寻路中 当前点: (0, 0) 目标点: (2, -44) [18:06:07] [init.py 172] [ERROR]: 指令[ 向红点移动 ] 执行出错 相关截图保存至 SimUniMoveToEnemyByMiniMap_1716113167739 Traceback (most recent call last): File "sr\operation__init__.py", line 161, in execute File "sr\sim_uni\op\v2\sim_uni_move_v2.py", line 156, in _execute_one_round File "sr\sim_uni\op\v2\sim_uni_move_v2.py", line 180, in _add_pos File "sr\control__init.py", line 223, in move_towards File "sr\control\pc_controller.py", line 171, in start_moving_forward File "pyautogui\init.py", line 593, in wrapper File "pyautogui\init.py", line 1734, in failSafeCheck pyautogui.FailSafeException: PyAutoGUI fail-safe triggered from mouse moving to a corner of the screen. To disable this fail-safe, set pyautogui.FAILSAFE to False. DISABLING FAIL-SAFE IS NOT RECOMMENDED. [18:06:09] [init.py 274] [INFO]: 指令[ 尝试脱困 1 ] 执行成功 返回状态 成功 [18:06:09] [init.py 140] [INFO]: 当前角度: 271.37度 目标角度: 272.49度 转动朝向: 1.12度 [18:06:09] [init__.py 222] [INFO]: 寻路中 当前点: (0, 0) 目标点: (2, -46)

[18:06:11] [init.py 274] [INFO]: 指令[ 尝试脱困 2 ] 执行成功 返回状态 成功 [18:06:11] [init.py 140] [INFO]: 当前角度: 273.23度 目标角度: 272.66度 转动朝向: -0.57度 [18:06:11] [init.py 222] [INFO]: 寻路中 当前点: (0, 0) 目标点: (2, -43) [18:06:12] [init.py 276] [ERROR]: 指令[ 向红点移动 ] 执行失败 返回状态 人工结束 [18:06:12] [init.py 719] [INFO]: 指令[ 区域-战斗 ] 节点 向红点移动 返回状态 人工结束 [18:06:12] [init.py 276] [ERROR]: 指令[ 区域-战斗 ] 执行失败 返回状态 人工结束 [18:06:12] [init.py 719] [INFO]: 指令[ 模拟宇宙 第九世界 挑战楼层 ] 节点 区域 返回状态 人工结束

日志中出错的截图是这个评论的截图,是因为我没有停下脚本就进行截图引起的,所以不是这个的问题。

DoctorReid commented 5 months ago

这个图我知道,之前脱困逻辑是一左一右地进行,这个就刚好左右完之后还在原地,就一直出不去。

今天改成 左右右左 这样了,不过还没留意到这个图

HCID274 commented 5 months ago

刚刚测试了下2.2.2版本,模拟宇宙九有一个新bug image 在这个场景下,脚本会笔直往前,但是距离跟怪物又足够近,会出现明明出现了攻击标识,但是由于死角攻击不到,是不是换成近战就能避免这个bug?

image

HCID274 commented 5 months ago

另外,发现在模拟宇宙九部分精英怪层,击杀完领取沉浸奖励后,无法找到出口。

脚本每次旋转视角角度有些固定,并且视角动的有点快,如果出口刚好在视野的死角中,就会识别不到,可否修改为屏幕中间如果识别到绿色的像素,就减小每次旋转的角度,或者直接给旋转角度增加一个随机呢?