此处公告通常对读者进行申明或对该WIKI某些规则进行公告,请在确认后修改本通告
本WIKI编辑权限开放,欢迎收藏起来防止迷路,也希望有爱的小伙伴和我们一起编辑哟~
编辑帮助:目录 • BWIKI反馈留言板
此处公告通常对读者进行申明或对该WIKI某些规则进行公告,请在确认后修改本通告。本WIKI编辑权限开放,欢迎收藏起来防止迷路,也希望有爱的小伙伴和我们一起编辑哟~
GPS自动驾驶
阅读
2022-05-04更新
最新编辑:LucasZ3214
阅读:
更新日期:2022-05-04
最新编辑:LucasZ3214
按右上角“WIKI功能→编辑”即可修改页面内容。
游戏坐标系统
初始岛(Coastguard Outpost Beginner)会生成在地图的原点(0, 0)
,其余岛屿根据地图种子生成。
东西方向为x轴,南北方向为y轴。东对应x轴正向,北对应y轴正向。
输入模块
GPS模块
指南北针模块
提供电力后该模块可提供箭头方向与正北的夹角,单位为圈数。
不镜像变换,正面朝上,同时箭头向前地放置模块。于是对于载具的不同朝向,有正北输出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 | 建议的偏航值。可供手动控制时确认目标相对方位。 |
微控板构造
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