Conceito
Você já experimentou tal coisa que depois de sair de casa não lembra se desligou o ferro? Discutindo outro caso semelhante com um amigo, surgiu uma idéia cômica de fazer um robô para verificação visual remota das tarefas domésticas. E no geral eu queria fazer um robô “espião” controlado por uma câmera de um smartphone sobre meus joelhos. Há muito que temos essa ideia, mas só agora. E imediatamente fomos para o bar mais próximo para discussão. Não é totalmente correto chamá-lo de robô. Em vez disso, é uma plataforma autopropelida com controle de telemetria pela Internet. Mas o artigo usará o termo "robô" simplesmente porque é mais familiar.
A tecnologia WebRTC nos adequou perfeitamente, pois é muito fácil organizar a transferência de canais de vídeo, áudio e dados entre dois pares com um atraso mínimo de sinal. E não tínhamos experiência com essa tecnologia, então realmente queríamos experimentá-la.
Um diagrama simplificado de todo o sistema é mostrado na figura. Usuário - operador e robô - Raspberry PI cada um entra em sua própria página da web, conecta-se ao servidor de sinal, após o que uma sessão WebRTC é criada entre eles, por meio da qual o fluxo de vídeo do robô é transmitido ao usuário e os sinais de controle são transmitidos ao robô. Além disso, o robô envia sinais de controle para seu host local, onde outro serviço os processa e os envia para o GPIO para controlar os motores. Tudo parece simples. Aqui está o que temos neste estágio:
A seguir, trataremos de tudo isso com mais detalhes.
Componentes
, . , . , .
Raspberry Pi (3b 4), , OS Raspbian. , OpenCV, .. , .
()
- ( ), FPS . Logitech QuickCam Connect Logitech C270 12$. Raspicam, .
— — , -, . . , :
, .
, . .
Raspberry Pi . 3.7 DC-DC MT3608, , “”. - . Samsung. , . power- Xiaomi , - . Raspbery Pi4.
L9110, DC-DC , L293N. , . .
, "", -. “” 1$. Power- , . , Raspberry Pi. . , . , . -. - power-.
, , . . JavaScript Python. . , .
NodeJS . :
, .
, .. -.
SignalEmitter. . id - , isControl - . signalServer - uri . .
const se = new SignalEmitter({
id: searchParams.get('id'),
isControl: false,
signalServer: config.signalServer
});
WebRTC
RTC. - options SignalEmitter, . isControl - . platformSocket - uri localhost' .
const webrtc = new RTC({
isControl: false,
platformSocket: config.platformSocket},
se);
Vue.js, . /public. :
Selenium
, Selenium WebDriver + geckodriver headless . , robot-signal-server/selenium/index.js. , . , . /etc/network/if-up.d/ .
Python. - websocket , GPIO. , : [0…+-1, 0…+-1] JSON. .. , , -1 +1 0.01. , - . (. GItHub )
, . production- - , . , . .
3/4/5G , . :