如果这没有意义,我深表歉意,因为我仍然是使用树莓派的新手,这是我第一次在 StackOverflow 上发帖。
我正在制作一个网络应用程序,它可以让我在树莓派之间传输视频,同时还可以让我发送密钥代码。发送的键码最终会让我控制无人机上的伺服系统。在搜索了互联网之后,我发现流式传输 2 路视频的最简单方法是使用 uv4l,因此我将它与 uv4l-webrtc 一起安装在我的树莓派上。我将一些 GPIO 引脚连接到飞行控制器,并使用 pigpio 向其发送 PWM 信号,然后我使用 CleanFlight 对其进行监控。
现在,如果我使用VNC远程访问 pi,我可以使用 python 脚本通过按键操作飞行控制器的滚动、俯仰等,但我希望最终能够通过我的自定义网页来做到这一点由 uv4l-server 提供服务。我正在尝试使用 WebRTC 数据通道,但我无法理解如何识别通过数据通道发送的消息。我知道发起视频通话时会打开数据通道,并且我已尝试在此链接中进行测试以查看我是否确实可以将密钥代码发送到 pi(并且我可以)。
我现在的问题是我不知道那些发送的消息去哪里了,也不知道如何获取它们,所以我可以将它们合并到我的 python 脚本中。我需要制作一个服务器来监听发送到 pi 的键码吗?
tl; dr 我在树莓派上有一个 python 脚本,可以使用按键和一个单独的网页来控制飞行控制器上的伺服系统,该网页使用 WebRTC 流式传输视频,但我不知道如何使用 WebRTC 数据通道将它们组合在一起。
感谢@adminkiam 的解决方案。这是现在侦听套接字的 python 脚本版本。它本质上是制作 pigpio 的人对该代码的一种变体:
import socket
import time
import pigpio
socket_path = '/tmp/uv4l.socket'
try:
os.unlink(socket_path)
except OSError:
if os.path.exists(socket_path):
raise
s = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET)
ROLL_PIN = 13
PITCH_PIN = 14
YAW_PIN = 15
MIN_PW = 1000
MID_PW = 1500
MAX_PW = 2000
NONE = 0
LEFT_ARROW = 1
RIGHT_ARROW = 2
UP_ARROW = 3
DOWN_ARROW = 4
LESS_BTN = 5
GREATER_BTN = 6
print 'socket_path: %s' % socket_path
s.bind(socket_path)
s.listen(1)
def getch(keyCode):
key = NONE
if keyCode == 188:
key = LESS_BTN
elif keyCode == 190:
key = GREATER_BTN
elif keyCode == 37:
key = LEFT_ARROW
elif keyCode == 39:
key = RIGHT_ARROW
elif keyCode == 38:
key = UP_ARROW
elif keyCode == 40:
key = DOWN_ARROW
return key
def cleanup():
pi.set_servo_pulsewidth(ROLL_PIN, 0)
pi.set_servo_pulsewidth(PITCH_PIN, 0)
pi.set_servo_pulsewidth(YAW_PIN, 0)
pi.stop()
while True:
print 'awaiting connection...'
connection, client_address = s.accept()
print 'client_address %s' % client_address
try:
print 'established connection with', client_address
pi = pigpio.pi()
rollPulsewidth = MID_PW
pitchPulsewidth = MID_PW
yawPulsewidth = MID_PW
pi.set_servo_pulsewidth(ROLL_PIN, rollPulsewidth)
pi.set_servo_pulsewidth(PITCH_PIN, pitchPulsewidth)
pi.set_servo_pulsewidth(YAW_PIN, yawPulsewidth)
while True:
data = connection.recv(16)
print 'received message"%s"' % data
time.sleep(0.01)
key = getch(int(data))
rollPW = rollPulsewidth
pitchPW = pitchPulsewidth
yawPW = yawPulsewidth
if key == UP_ARROW:
pitchPW = pitchPW + 10
if pitchPW > MAX_PW:
pitchPW = MAX_PW
elif key == DOWN_ARROW:
pitchPW = pitchPW - 10
if pitchPW < MIN_PW:
pitchPW = MIN_PW
elif key == LEFT_ARROW:
rollPW = rollPW - 10
if rollPW < MIN_PW:
rollPW = MIN_PW
elif key == RIGHT_ARROW:
rollPW = rollPW + 10
if rollPW > MAX_PW:
rollPW = MAX_PW
elif key == GREATER_BTN:
yawPW = yawPW + 10
if yawPW > MAX_PW:
yawPW = MAX_PW
elif key == LESS_BTN:
yawPW = yawPW - 10
if yawPW < MIN_PW:
yawPW = MIN_PW
if rollPW != rollPulsewidth:
rollPulsewidth = rollPW
pi.set_servo_pulsewidth(ROLL_PIN, rollPulsewidth)
if pitchPW != pitchPulsewidth:
pitchPulsewidth = pitchPW
pi.set_servo_pulsewidth(PITCH_PIN, pitchPulsewidth)
if yawPW != yawPulsewidth:
yawPulsewidth = yawPW
pi.set_servo_pulsewidth(YAW_PIN, yawPulsewidth)
if data:
print 'echo data to client'
connection.sendall(data)
else:
print 'no more data from', client_address
break
finally:
# Clean up the connection
cleanup()
connection.close()