BlueBoat Navigator - Jetson UART 连接

我正在尝试在导航飞行计算机和 Jetson 之间建立串行连接,以便向自动驾驶仪发送控制消息。我已经实现了单向通信,既可以使用本地 Python 脚本(使用 pyserial 转发消息)也可以通过配置 MAVLink-Server 端点来实现。然而,在这两种情况下,虽然 Jetson 可以读取 mavlink 消息,但其返回的命令却无法被确认。

我最近尝试配置 MAVLinkRouter 串行端点,但创建失败,并出现错误 AUTOPILOT_ENDPOINT_CREATE_FAIL。

有没有关于这些错误的文档,或者我之前错过的帖子?非常感谢您的帮助!

image

需要注意的是,Navigator 并非“飞行计算机”,而仅仅是自动驾驶仪所需传感器的主机 PCB。

请问您是在尝试在 Raspberry Pi + Navigator 和 Jetson 之间建立通信连接吗?

您可能更幸运地通过以太网/TCP/IP 建立此连接,添加指向 Jetson IP 地址的UDP 客户端端点?

你能分享一下/ttyS0是什么设备吗?它看起来不像是Navigator的串口或USB适配器……

是的,我使用的是 BlueBoat 的 Raspberry Pi + Navigator 的默认配置,并希望通过串口将其连接到 Jetson 进行控制。我使用 Navigator 的串口 1根据技术细节,并使用一个适配 Jetson UART 引脚的 JST-GH。我知道无论如何这都会带来一些延迟,但我正在尝试通过串口连接来尽量减少延迟。

由于树莓派的端口正在用于板载路由器,因此不推荐使用以太网连接。我测试过通过板载网络与 Jetson 进行通信,并使用一个指向其地址的端点,但连接可靠性存在问题。

如果我能弄清楚为什么无法发送命令,串口就完美了。奇怪的是,我可以用 MAVLink-Server 端点建立连接并读取 Jetson 上的数据,但我的消息却无法返回到自动驾驶仪。

在 Jetson 端,连接如下所示:

if host == 'uart':
    self.master = mavutil.mavlink_connection('/dev/ttyTHS1', baud=115200)
elif host == 'network':
    self.master = mavutil.mavlink_connection('udp:0.0.0.0:14551')

/dev/ttyTHS1 是 Jetson 上的 UART 地址。通过网络连接时,我所有的控制功能都运行正常,但通过 UART 连接时,命令无法返回。

告诉我这是否合理,以及我是否可以提供更多信息。谢谢你的帮助!

BlueBoat 里有以太网交换机吗?这样 Pi 就能和 Jetson 连到同一个网络,通信速度也更快……这种方法有什么不可靠的地方吗?

可能值得尝试导航器上的序列 3 或序列 4,序列 1 与其他资源共享。

不,我们的 BlueBoat 没有以太网交换机。我之前说错了,我之前用无线方式(不是以太网)把 Jetson 连接到船的网络,我觉得连接瓶颈在于 mavlink 消息的数量。我通过 BlueBoat 网络 SSH 到 Jetson,当船距离我超过 5 米时,连接就卡住了。Jetson 和船本身之间的连接可能没问题(无法确认),但我需要保持这个 SSH 连接。

以太网交换机似乎是一个很好的解决方案,但我真的想先尝试所有我能用串行实现的方法。

我刚刚重新测试了序列 1、3 和 4,遇到了同样的问题 - 读取 Jetson 上的数据但无法发回任何内容。

BlueBoat 本身不具备 WiFi 网络,除非您指的是树莓派上 BlueOS 创建的热点。正如您所发现的,BlueBoat 的覆盖范围不会太广——您应该通过 BaseStation 和 Mikrotik WiFi 连接访问 BlueOS。

如果您想通过远程无线电链路通过 SSH 连接到 Jetson,那么以太网交换机绝对是首选解决方案!它还能让您处理单元间比串行连接提供的更多带宽。

也就是说,你实际上并没有以正确的方式设置串行连接……MAvlink 端点用于通过串行方式将 BlueOS 连接到外部控制客户端或自动驾驶仪硬件。对于连接到自动驾驶仪本身的串行连接,请删除你可能已添加的任何串行路由,并只需调整以下自动驾驶仪参数:
Serial#_Protocol= Mavlink
Serial#_Baud = 115200(对于短距离和更大带宽,值越高越好!)

大多数串口已经设置为 MAVLink2 了,这样对吗?我这样配置了串口 3,但没有成功。没有收到心跳或任何消息。

image

我需要在另一端进行什么更改吗?或者我是否应该能够像上面记录的那样在 Jetson 上连接 pymavlink?

我忘记在测试手动通信时从自驾仪上移除了一些串口。现在把这些串口重新添加到自驾仪上后,我又能收到消息了,但仍然无法发送任何消息。

你能分享一下发送消息的代码吗?你可能没有输入正确的设备ID,或者其他什么原因导致自动驾驶仪忽略了你的消息……

#state machine callback
def state_callback(self, msg: String):
    mode = msg.data; self.current_mode = mode
    self.get_logger().info(f'Mode: {mode}')
    mode_id = self.master.mode_mapping().get(mode)
    if mode_id is not None:
        self.master.mav.set_mode_send(
            self.master.target_system,
            mavutil.mavlink.MAV_MODE_FLAG_CUSTOM_MODE_ENABLED,
            mode_id
        )

        self.get_logger().info(f'Sent mode ID {mode_id}: {mode}')
    else:
        self.get_logger().warn(f'Unknown mode: {mode}')

当我通过网络连接到 mavlink 时,此操作完美运行(self.master = mavutil.mavlink_connection(‘udp:0.0.0.0:14551’)),但当我通过串行连接时,此操作不起作用(self.master = mavutil.mavlink_connection(’/dev/ttyTHS1’, baud=115200))。

您是否认为target_system是错误的?

我已经通过短路 RX/TX 的环回测试和使用 Arduino 监控输出来测试 Jetson 独立写入的能力。

为了进一步调试,您可以:

  • 停止自动驾驶过程,然后使用screen /dev/tty<S0|AMA1|AMA2..> <baudrate> 或任何其他串行监视器与另一端的电路板通信,仅用于验证串行通信本身,无需 mavlink
  • stty -F /dev/tty<PORT> 会告诉你正在使用的端口是否使用了正确的波特率
  • fuser /dev/tty<PORT> 将显示是否有其他进程占用了端口

禁用自动驾驶仪后,我尝试通过终端测试通信。我首先测试了从 BlueBoat 向 Jetson 发送消息。在 BlueBoat 上,我会使用“echo “test” > /dev/ttyAMA1”发送一条消息,然后在 Jetson 上使用“screen /dev/ttyTHS1”读取该消息。我首先确保它们的波特率相同。这很有效,但一旦我切换角色,在 BlueBoat 的终端上就什么也看不到了。我检查了串口 3 和 4。我还检查了没有其他进程正在使用该端口。

我还通过使用 Arduino 直接读取消息重新测试了 Jetson 的 tx 引脚,结果显示一切正常。

只是想跟进一下,看看你对调试这个问题还有什么想法吗?导航器有可能损坏了吗?