在进行
了人工智能实验之后,
我的坦克 的自动驾驶仪决定退后一步,学习如何导航好老式的卫星。
图片已上演,暗示任何GPS传输都可以在导航器的控制下自发热。

树莓派+ GPS
首先,购买了一个简单的USB GPS模块。
在有关
Adafrukt的文章的指导下,我开始执行。
尽管该文章是6年前写的,但老式导航的世界并没有发生太大变化。
只有一些细微差别不匹配:
- 一块铁被发现为/ dev / ttyACM0而不是/ dev / ttyUSB0
- 在安装gpsd时,我自己没有找到该设备,事实证明有必要在/ etc / default / gpsd中进行注册:
DEVICES="/dev/ACM0"
- 对于python-3 gps,必须手动交付软件包,但不能与gpsd一起使用
设备本身看起来像普通的USB闪存驱动器:

然后我卡了很长时间,因为我的GPS无法看到坐标。
该设备正常工作,报告了版本,制造商和其他有用信息,但仅此而已。
起初我以为他还是有缺陷的。 从以前的实验来看,我仍然有Raspbian 2017的SD卡,GPS可以在该卡上工作。
从中启动,然后-瞧瞧-GPS栩栩如生,闪烁了一个灯泡,并在对数坐标中沐浴。
我费了一个星期的时间,比较所有配置,开始在新的越野车Raspbian上犯错,并准备在调试中重建gpsd,当时突然在Raspberry论坛上,有关GPS问题的主题之一(并且有很多),我遇到了建议将设备取出来天气晴朗时,在街上寻找卫星,这可能需要长达半小时的时间。
这个主意浮现在我的脑海,但显然天气还不够晴朗,但随后一切都重合了,这台设备开始变得生动起来。 如果您进行更深入的研究,可能会发现有关卫星的必要信息已缓存在设备的固件中,而Raspbian无法控制这些信息。
我的应用程序如何获取历书/星历表/伪距数据?
抱歉,还没有通过GPSD进行这些操作的简便方法。 原因是没有一致的方法使GPS接收器报告此信息。
许多人根本不发货。 其他设备(包括某些但不是所有运送SiRF二进制数据包的设备)偶尔会以SUBFRAME信息发送它,但是您必须确切地知道如何在SUBFRAME字段中进行粗略的获取,以及如何在IS-GPS-200E中进行归档(以上-GPS卫星使用的空中协议非常晦涩。 还有一些报告有所不同 以相当简单明了的方式对历书/星历表/伪距数据的子集进行处理,但在卖方专有的句子中,这些句子对于特定的接收者类型来说是极其特定的,记录或未记录的非常少,并且通常需要被同样特定甚至更糟的控制序列激活记录下来。
这个棘手的机制已经奏效,现在是时候利用它了。
在python中从gpsd读取数据的脚本非常简单:
import gps gs = gps.gps("localhost", "2947") gs.stream(gps.WATCH_ENABLE | gps.WATCH_NEWSTYLE) for i in range(0,10): report = gs.next() print (report)
Google Maps API
我通过手机控制水箱,因此我不得不学习如何使用Google Maps。
Google在简化地图工作方面做得很好,因此没有问题。
Android Studio可以使用地图创建一个空项目,从那里必须将所有重要细节仔细地转移到主项目。
Google需要进行
密钥注册才能使用Maps API,此操作是免费的(目前)。
我扩展了坦克的REST接口,以便它可以给出其坐标,将坐标传输到地图,绘制一个坦克图标,一切看起来都还不错。
接下来,您需要铺平道路。
地图上的一个点会选择目标并将其输入
Directions API中 。
Directions是一个Web服务,它获取两点的坐标,并作为响应转储有关所走路线的一堆信息,包括地址,值得注意的名称和说明。 但是我只需要一系列步骤。 我们选择坐标并将其绘制在地图上。
现在,视觉控制和管理已具备所有必要条件。

GPS导航
从电话到坦克的路线的第一点被传输。
战车有一个小问题-最初,它不知道方向。
指南针可以轻松解决问题,但是任何人都可以使用指南针...
坦克可能会在最初的几秒钟内就从前方驶过,从而接收到路径起点和终点的坐标并从中计算出其方向,这是有可能实现的。 值得注意的是,可以直接从GPS获得相同的数据,其中有一个跟踪场,它显示了从角度到北极的偏差。
但是无论如何,为了使此事以后得以解决,就需要移动。
计算方向:
def azimuth(pos1, pos2): lat1 = toRadians(pos1["lat"]) lon1 = toRadians(pos1["lon"]) lat2 = toRadians(pos2["lat"]) lon2 = toRadians(pos2["lon"]) dlat = lat2 - lat1 dlon = lon2 - lon1 x = math.sin(dlon) * math.cos(lat2) y = math.cos(lat1) * math.sin(lat2) - math.sin(lat1) * math.cos(lat2) * math.cos(dlon) return math.atan2(x, y)
我注意到GPS并非总是能够准确地工作,并且很可能会证明测试路径的起点和终点的坐标会出现误差,从而使测量变得毫无意义(即使向前移动时,路径终点的坐标也会落后)。
在这种情况下,GPS会非常可靠地给出通过轨道的方向,因此默认情况下使用此字段,如果不存在该字段,则必须通过坐标差进行导航。
定向到地形后,坦克会在必要时大约旋转(大约-因为没有指南针或陀螺仪很难准确确定方向),并移动了几秒钟。 然后他再次接收坐标,检查方向,转弯,骑行。 依此类推,直到目标在误差范围内。
通常,最大的问题是GPS坐标中的错误,因此坦克会迷失方向并开始向不同的方向冲。
事实证明,没有指南针,您将无法生存。
参考文献
- 关于为Raspberry Pi设置GPS模块的介绍性文章
- 在Linux上使用GPS的服务
- 有用的站点,带公式,可通过两点的坐标来计算距离和方向
- GPS坦克固件源代码
- 适用于Android的Google Maps文档