我尝试用 PC 上的操纵杆通过 WiFi 操纵无人机。在船上,我有一个类似 Aruino 的板子,叫做 Particle Photon。我想通过 TCP 发送 3 个浮点数(俯仰、滚动、油门),我编造了这样的事情:
在 PC - python - 客户端,它只是以 20 FPS/50ms 的频率发送:
try:
s.sendall(bytearray(struct.pack("f", float(-20*axis0))))
s.sendall(bytearray(struct.pack("f", float(20*axis1))))
s.sendall(bytearray(struct.pack("f", float(axis2))))
except socket.error as e:
print("error while sending :: " + str(e))
其中s是我的套接字。
在服务器无人机方面,我有这个:
if (myIMU.delt_t >= 25)
{
if (TCPcomms && client.connected()){
// Check for 12 bytes (3 floats) from joystick input --
// if we have them, update roll, pitch and throttle references
if(client.available() >= 12){
byte tempBuff[4];
float newInput[3];
for(int j = 0; j < 3; j++){
for(int i = 0; i < 4; i++)
{
tempBuff[i] = client.read();
}
newInput[j] = *((float*)(tempBuff));
}
roll_reference = newInput[0];
pitch_reference = newInput[1];
throttle_reference = newInput[2];
...
无人机循环工作得更快,因此顶部的时间检查(无需经常检查)。现在,我以较慢的速度对其进行打印调试,一切似乎都很好。每当有 3 个浮动准备好时,无人机代码就会读取它们,如果没有,它就会继续。
但是我尝试以正常速度运行它的一半时间粒子板只是在一段时间后检查并完全断开连接。显然,只要有任何问题,它都会这样做,但它并不能很好地传达它是什么......
早些时候,我也有一种机制,可以在 X 秒后断开连接,但它也经常断开连接。我检查了 Wireshark,它总是与重新传输数据包同时发生。
我想我的问题是它是 WiFi/TCP 的错,它不适合这种类型的任务,还是我在做一些愚蠢的事情?有人对 Arduino 或 Particle 有类似的问题吗?