北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 4259|回复: 27

[PyMud]地图高级技巧-地形匹配与惯性导航在北侠中的实现

[复制链接]
发表于 2023-6-6 11:24:13 | 显示全部楼层 |阅读模式
发之前先认真学习了北侠机器人管理规定第16条:
严禁分享包含单个区域5个以上房间的地图数据库。地图数据库是全自动机器人的基础,让玩家对某些版本的机器人产生依赖,根据地图数据库一直急速走路的机器人也会带来很大系统开销,为此北侠内置了walk,node等兼顾了玩家方便与系统开销的命令。北侠鼓励分享、讨论机器人技术,但不鼓励直接分享机器人程序和相关数据库。直接分享此类数据只会带来地图的持续更新与变化,请各位有能力的技术高手自觉维护北侠的活跃氛围。
基于上述规定,本文想探讨一下高级导航技术在北侠中的应用实践。
导航,简单来说,主要分为以下个步骤:
1、确定当前位置;
2、确定目标位置;
3、路径规划;
4、移动;
在上述步骤中,关于路径规划的研究很多,标准算法就是图论中的Djkstra算法、DFS和BFS三种,按照这个实现就好了。
导航中最大的难点,是确定当前位置。确定当前位置的技术有很多,比如大家都熟知的GPS和北斗;
但在航空领域,除卫星定位之外,还有另外几种导航技术可以用于确定当前位置。
1、地形匹配技术。地形匹配(TM, terrain matching)一般是与地形跟随(TF, terrain following)一起出现,称为TM/TF技术。但地形匹配除用于地形跟随之外,还可以实现辅助定位。其基本原理是,通过无线电高度表等设备,获取连续一段时间内地形高程数据信息,然后将信息与保存的地图数据库进行匹配运算,以判断当前所处位置;
2、惯性导航技术。惯性导航(inertial navigation),是通过加速度计测量加速度,并进行时间积分后,获得移动的方位与距离。惯性导航技术需要首先确定初始位置,后续都可以自动计算实现。
这两种技术也可以用到北侠的地图寻路中。
地形匹配大家都在用了,通过房间名、相对位置、描述、出口、NPC等信息,并与数据库进行比对,以确定当前位置;但这有以下几个缺点:
1、每次移动前都需要look,再进行数据库比对获取当前位置信息,对服务器的资源消耗较大;
2、碰到地形相同(比如名称、相对位置、出口、描述都相同)的,就无法确定当前位置,需要首先移动(人工或自动随机)到一个确定的位置才可以;
因此,可以设计一种惯性导航,在首次确定好当前位置后,在每一步移动时都可以明确确定当前位置。在这种情况下,每次移动前的定位,首先获取惯性导航位置信息,然后直接以此信息作为当前起始点即可。我使用了命令异步来处理。主要实现原理逻辑为:
1、首次确定当前位置(通过地形匹配确定)
2、移动时(不论是人工输入,还是)在将移动命令送到服务端之前,首先本地捕获,并根据上次已经确定的当前位置(地形匹配获取或上一次惯导获取),从数据库中查询该方向匹配的目的地。
3、执行移动指令(将移动命令发送到服务端),并检查该指令是执行成功(成功后会切换房间名)、失败(“这个方向没有出路”之类),或者重试(“你现在正忙着呢”)
4、根据移动指令的结果,确认是否更新惯导中的当前位置信息。
重复上述步骤即可。
使用惯导导航的好处:
1、除初次确定位置信息之外,其他时候都可以set brief 3以减少服务器压力;
2、任意位置(只要数据库有)都可以作为起点进行寻路;
大致原理如上,当然,为了解决多步骤路径(迷宫)、过河、坐车等等,还增加了额外的处理以进行实现全环节下的惯性导航。以下是实现的截图示例:

我使用的我自己开发的客户端PyMud,已发布到github,客户端持续更新中...
网址: https://github.com/crapex/pymud


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2023-6-6 11:40:26 | 显示全部楼层
进入部分迷宫,以及依赖描述的任务,还是要set breif 3的

另外数字id是个大坑。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2023-6-6 11:45:04 | 显示全部楼层
本帖最后由 newstart 于 2023-6-6 11:55 AM 编辑
jarlyyn 发表于 2023-6-6 11:40 AM
进入部分迷宫,以及依赖描述的任务,还是要set breif 3的

另外数字id是个大坑。 ...

1、我的实现是除了初始地形匹配外,全程set brief 3
2、我这个实现可以解决固定迷宫路径的行走(例如青竹林s;s出来、黑沼),但解决不了不确定路径的迷宫问题(例如万兽山庄),我只是辅助自己玩,迷宫我都是自己走的
3、依赖描述的任务好解决,因为惯导根本不依赖描述来定位。
4、数字ID只是在数据库里作为唯一ID,在行走时一般指定alias、城市名+房间名(中文)、房间类型(如bank、pawnshop)等来行走,当然也可以指定id
比如,在下面几张图中,我一共使用了4种方式,包括
别名方式 rt xf   

类型方式 rt bank

ID方式 rt 1

名称方式 rt 扬州北门




惯导的最大好处,是可以任意地点起始

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2023-6-6 11:51:17 | 显示全部楼层
newstart 发表于 2023-6-6 11:45 AM
1、我的实现是除了初始地形匹配外,全程set brief 3
2、我这个实现可以解决固定迷宫路径的行走(例如青竹 ...

可能你没明白我的意思。

实际机器做下去,算路径是算路径,移动(遍历)是移动。

最后应该都是

通过地图信息计算出路径(移动的路径或遍历路径)

通过挂载不同的钩子的标准移动模块来进行 行动 或 遍历。

一般来说,非迷路状态是不需要定位的。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2023-6-6 11:55:57 | 显示全部楼层
再换个实际点的说法吧。

北侠有一部分任务,比如天珠。

第一次路过房间时,如果不做任务的下一步而是错过,任务就失败了。

如果任务在扬州北门,你移动时如果路过了,那么就会导致失败。

所以,点对点的移动和遍历,在北侠不太适合做分开的两个模块。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2023-6-6 11:57:43 | 显示全部楼层
jarlyyn 发表于 2023-6-6 11:51 AM
可能你没明白我的意思。

实际机器做下去,算路径是算路径,移动(遍历)是移动。

我明白你的意思,实际确实大部分地点是不需要定位的
我只是探讨一下一种另外的实现可能

北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2023-6-6 12:04:48 | 显示全部楼层
jarlyyn 发表于 2023-6-6 11:55 AM
再换个实际点的说法吧。

北侠有一部分任务,比如天珠。

你这个问题在实现时是考虑到了的,
rt xxx,如果后面的xxx包含一系列房间,或者只是一个区域,会通过djkstra算法搜索到第一个符合条件的地点就会停下来,比如
rt 中原大驿道,会停在第一个这个名称的房间


rt 曲阜,会停在进入曲阜地区的第一个房间


另外,在进行看额外提醒的任务时,如天珠时,或者在遍历过程中,确实是在模块中增加了触发可以中止行走的。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2023-6-6 12:35:27 | 显示全部楼层
本帖最后由 newstart 于 2023-6-6 12:43 PM 编辑

另外,由于我使用了异步模式,而非使用回调方式,所以整体模块划分按高内聚,低耦合来进行,最终的行走函数实现非常简单,不论是添加、还是重新复制修改也非常简单,不会带来新的系统开销,也不会影响其他模块:)
以下是行走函数代码



遍历区域我就是懒得改行走代码,于是又复制了一份:)
跟行走相比,唯一区别就是前面加了NPC的触发定义,遍历循环过程中增加了一个找到判定:)



这两者的其他差异仅在于寻路算法,一个是djkstra,一个是带返回路径的DFS,其他都是一样的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2023-6-6 13:20:54 | 显示全部楼层
这异步,要出人命的……
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2023-6-6 13:32:41 | 显示全部楼层
jarlyyn 发表于 2023-6-6 01:20 PM
这异步,要出人命的……

还好吧
做好每一个单独的Command模块就可以了
反正目前运行下来没啥问题
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-4-28 10:13 PM , Processed in 0.010808 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表