gpt4 book ai didi

python - 为机器人设计 TCP/IP 命令接口(interface)

转载 作者:可可西里 更新时间:2023-11-01 02:49:11 25 4
gpt4 key购买 nike

简介

我正在开发机器人采样应用程序。每个机器人都有一个带有电源、TCP/IP 和气体传感器管道的电缆接口(interface)。机器人在 ARM 平台上,我打算用 Python 进行大部分编程。机器人移动缓慢,上面没有任何计算密集型的运行。

每个机器人都应该执行这些“服务”:

  • 向左/向右移动(用于手动控制)
  • 向上/向下移动(用于手动控制)
  • 转到下一个扇区

每个机器人报告这些传感器读数或事件:

  • 温度
  • 结束开关向右
  • 停靠在 ID 为### 的扇区
  • 编码器计数[横向,纵向]
  • 错误事件

客户端-服务器架构

我将每个机器人视为客户端,将传感器中枢计算机视为服务器。服务器将有一个已知的 ip 和监听端口,并允许机器人连接。服务器将进行测量调度,并命令机器人从一个扇区移动到另一个扇区。

服务器可以使用包含以下内容的状态向量维护和更新每个机器人的模型:

[位置、开关、传感器读数、状态]

问题

通过调试串行通信,我体验到了拥有具有严格轮询-响应结构的人类可读通信接口(interface)的好处。然而,我不确定我们应该如何设计这个界面。

  • 在为此类设备设计通信接口(interface)时是否有任何最佳实践?
  • 我应该考虑数据包丢失和损坏,还是完全由 TCP 处理?
  • 我应该将所有内容设计为由服务器轮询的服务,还是应该让机器人广播它的传感器读数和事件?
  • 我是否应该执行命令的确认,例如转到下一节

对于广泛而模糊的问题表述,我深表歉意,这可能更像是一个哲学问题,而不是软件问题。但是,我将非常感谢您的想法、经验和建议。

TLDR

为客户端-服务器架构设计 TCP 通信协议(protocol)的指导原则是什么?

最佳答案

总体而言,我建议使用 python Twisted 来构建您的服务器和客户端(机器人端)应用程序 (https://twistedmatrix.com/trac/)。无论如何回答你的问题:

“在为这些设备设计通信接口(interface)时是否有任何最佳实践?”

在下面查看您其他问题的答案。

“我应该考虑数据包丢失和损坏,还是这完全由 TCP 处理?”

TCP 保证您获取的数据的完整性。要担心的主要事情是客户端/服务器是否已连接。您可以使用 ReconnectingClientProtocol 使您的连接在服务器重新启动时更加稳健(请参阅 Twisted 规范)。还要注意 TCP 是一种流式传输协议(protocol)(您可能无法一次获得整个消息),因此请确保在执行操作之前获得了整个消息。如果您正在快速发送消息,您的 TCP 缓冲区中可能还会有不止一条消息用于该客户端。

“我应该将所有内容设计为由服务器轮询的服务,还是机器人应该广播它的传感器读数和事件?”

避免轮询。当机器人启动时,它们应该与服务器建立持久的 TCP 连接。消息应该异步发送和接收(处理)。

“我应该执行命令确认,例如转到下一节”

不会受伤。对于您的应用程序内的流量控制以及从服务器或机器人重新启动且您无法确定消息是否已处理的情况中恢复将很有用。

“为客户端-服务器架构设计 TCP 通信协议(protocol)的指导原则是什么?”

可能需要为您的应用设计一个简单的命令响应协议(protocol)。从设计简单的消息集开始,从客户端到服务器,另一个从服务器到客户端。您可以使用简单的人类可读 XML 消息集,如下所示:

服务器到客户端

<SCMessage type="TurnRight"></SCMessage>
<SCMessage type="TurnLeft"></SCMessage>
<SCMessage type="NextSector"><param key="sectorName" value="B"/></SCMessage>
<SCMessage type="GetStatus"></SCMessage>
<SCMessage type="Ack"></SCMessage>

客户端到服务器

<SCMessage type="SensorUpdate"><param key="data" value="123"/></SCMessage>
<SCMessage type="StatusChanged"><param key="status" value="Good"/></SCMessage>
....
<SCMessage type="Ack"></SCMessage>

因此,在解析这些消息时,您可以通过查找 SCMessage 开始停止标记来区分它们。收到消息后,您就可以使用 XML 解析器来解析消息内容。或者,您可以使用 JSON,这实际上可能会容易得多(基本上您会来回发送小词典)。

你有很多书要做 ;) 我会先阅读一下 python Twisted,然后编写一些小玩具程序来熟悉一些东西。

关于python - 为机器人设计 TCP/IP 命令接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21999869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com