|
发之前先认真学习了北侠机器人管理规定第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
|