此处公告通常对读者进行申明或对该WIKI某些规则进行公告,请在确认后修改本通告。本WIKI编辑权限开放,欢迎收藏起来防止迷路,也希望有爱的小伙伴和我们一起编辑哟~

全站通知:

GPS自动驾驶

阅读

    

2022-05-04更新

    

最新编辑:LucasZ3214

阅读:

  

更新日期:2022-05-04

  

最新编辑:LucasZ3214

来自风暴工程:建造与救援WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索
页面贡献者 :
LucasZ3214
我不会讲煲冬瓜
8f23

如果是第一次来,按"Ctrl+D"可以收藏随时查看更新~觉得WIKI好玩的话,请推荐给朋友哦~(◕ω<)☆
按右上角“WIKI功能→编辑”即可修改页面内容。

游戏坐标系统

初始岛(Coastguard Outpost Beginner)会生成在地图的原点(0, 0),其余岛屿根据地图种子生成。

东西方向为x轴,南北方向为y轴。东对应x轴正向,北对应y轴正向。

输入模块

GPS模块

GPS module colour.png
提供电力后该模块可提供方块所在坐标的的x值与y值。

指南针模块

Compass colour.png
提供电力后该模块可提供箭头方向与正北的夹角,单位为圈数。
不镜像变换,正面朝上,同时箭头向前地放置模块。于是对于载具的不同朝向,有正北输出0,正东输出-0.25,正南输出0.5/-0.5,正西输出+0.25。

导航基本思路

实现自动向目标点前进我们首先需要计算出目标和我们的相对坐标。
我们需要以下数据才能计算出这个数据:

  • 目标x位置
  • 目标y位置
  • 当前x位置
  • 当前y位置

当前位置我们可以通过GPS模块来获取。
目标位置可以由大键盘(尺寸1x1x2)来输入,因为它能快速读取在地图(M键)上所标出的路径点,把目标x与当前x相减以及把目标y与当前y相减,我们能获得与目标的相对位置(dx,dy),有了这个向量就可以使用atan函数(反正切运算)来计算出目标的方位角。应注意,反正切运算的结果与指南针模块的输出无法直接比较。

当方位角大于航向时,控制舵面使载具左转来对准目标;否则,控制舵面使载具右转来对准目标。

微控示例

在本示例中,我们使用Lua脚本来实现导航运算。在基本的导航功能以外,我们还实现了若干附加实用功能,读者可根据需要自行删改。经测试,该实例在v1.6.2 64bit版本有效。

输入参数与结果输出

序号 输入/输出 类型 名称 说明
1 输入 布尔 Enable 使能。用于控制是否使用自动导航。
2 输入 布尔 Nearing Warning Enable 接近示警使能。用于选择是否在靠近目标点附近示警。
3 输入 数值 GPS X 当前X坐标。从GPS组件获取。
4 输入 数值 GPS Y 当前Y坐标。从GPS组件获取。
5 输入 数值 Des X 目标点X坐标。
6 输入 数值 Des Y 目标点Y坐标。
7 输入 数值 Manual Yaw 手动偏航输入。连接至驾驶座或其他合适的输入设备。
8 输入 数值 Curr Heading 当前方向。从指南针组件获取。
9 输入 数值 Nearing Warning Distence 接近示警距离。用于设置示警范围。
10 输出 布尔 Nearing Warning 接近示警。接近目标点时示警。
11 输出 数值 Calcu Yaw 偏航输出。连接至船舵或其他的控制输出。值域为[-1, 1],可能需要根据实际进一步处理。
12 输出 数值 Distence 目标距离。
13 输出 数值 Recommend Yaw 建议的偏航值。可供手动控制时确认目标相对方位。

微控板构造

Auto Pilot Board.jpg

Lua脚本

开源于Github:点此访问


   function onTick()
       enable = input.getBool(1)
       warningEnable = input.getBool(2)
       dx = input.getNumber(5) - input.getNumber(3) -- des-curr
       dy = input.getNumber(6) - input.getNumber(4) -- des-curr
       manualYaw = input.getNumber(7)
       heading = input.getNumber(8)
       warningDis = input.getNumber(9)
   
       nearingWarn = false
       distence = 0
       calcYaw = 0
       recommendYaw = 0
   
       pilotDir = -math.atan(dx, dy) / (2 * math.pi)
       dirDiff = heading - pilotDir
       if(dirDiff > 0.5)
       then 
           dirDiff = dirDiff - 1
       elseif (dirDiff < -0.5)
       then 
           dirDiff = dirDiff + 1
       end
       if(dirDiff > 0.1)
       then 
           recommendYaw = 1
       elseif(dirDiff > -0.1)
       then 
           recommendYaw = 10 * dirDiff
       else
           recommendYaw = -1
       end
       distence = math.sqrt(dx * dx + dy * dy)
       if(enable)
       then 
           absManualYaw = math.abs(manualYaw)
           calcYaw = absManualYaw * manualYaw + (1 - absManualYaw)  * recommendYaw
           nearingWarn = warningEnable and distence < warningDis
       else
           calcYaw = manualYaw
       end
       output.setBool(1, nearingWarn)
       output.setNumber(2, distence)
       output.setNumber(3, calcYaw)
       output.setNumber(4, recommendYaw)
   end
   
   function onDraw()
   end