まだラズベリーパイを使用している初心者で、これが意味をなさない場合はお詫び申し上げます。これはStackOverflowでの初めての投稿です。raspberry-piからuv4l-webrtc datacannelに送信されたkeypressを解釈する
私はラズベリーパイとの間でビデオをストリームすることができ、またキーコードを送信させるウェブアプリケーションを作っています。送信されたキーコードは最終的に無人機でサーボを制御することになります。インターネットを精査した後、私は、2ウェイビデオをストリーミングする最も簡単な方法はuv4lを使用することであると考えていたので、uv4l-webrtcをラズベリーパイにインストールしました。私はいくつかのGPIOピンをフライトコントローラに接続し、私はpigpioを使ってPWM信号を送信しています。それからCleanFlightを使って監視します。
今、VNCを使って遠隔操作でpiにアクセスすると、飛行制御器のロール、ピッチなどを操作して、パイソンスクリプトを使用して操作することができますが、私は最終的にこれを行うことができますuv4l-serverによって提供されているWebページ。私はWebRTCデータチャネルを使用しようとしていますが、データチャネルを介して送信されたメッセージを認識するために何が必要かを理解するのに問題があります。私は、ビデオ通話が開始されたときにデータチャネルが開かれていることを知っています。このlinkのテストを試して、私が本当にpiにキーコードを送ることができるかどうかを確認します。
今私の問題は、送信されたメッセージがどこに行くのか、どうやって入手できるのかわからないことです。そこで、それらを私のpythonスクリプトに組み込むことができます。私はπに送られるキーコードを聞くサーバーを作る必要はありますか?
tl; dr私はキープレスとWebRTCを使用してビデオをストリームする別のWebページを使用して、フライトコントローラのサーボを制御するために、ラズベリーパイのpythonスクリプトを持っていますが、WebRTCデータチャネルを使用して、
解決策のための@adminkiamのおかげです。ここでは、ソケットをリッスンするPythonスクリプトのバージョンがあります。それは本質的にthis code by the person who made 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()
このリンクは質問に答えるかもしれないが、ここでは答えの重要な部分を含めると、リンクを提供することをお勧めします参考のため。リンクされたページが変更された場合、リンクのみの回答は無効になります。 –
「リンク専用」の回答ではありません。これは、より良い答えがない限り、本質的な部分の答えです。公式の例へのリンクもあります。これはOPの質問にも参照されています。 – adminkiam
あなたの答えを説明するコードの抜粋をここに追加してください。 –