Para comenzar, video de youtube para inspirarte:
Advertencia: el proyecto en el video es solo una muestra que se puede hacer de acuerdo con el tutorial del artículo con respecto a la visión estéreo y los "giros de cabeza". Los tanques con control remoto xbox no están incluidos.
A pesar de la claridad, la escasa historia del autor del proyecto en el video y la disponibilidad de enlaces, de inmediato para descubrir cómo funciona todo no es fácil. Si desea recopilar algo similar y en un formato mucho más conveniente, se recomienda leer.
* Inmediatamente haré una reserva, la persona en el video con YouTube no me es familiar, no transmití ningún dato secreto, cuál es el estado de su proyecto ahora, no lo sé.
** No controlaremos el movimiento del robot en la frambuesa en la superficie a través del control remoto desde xbox, esto puede tratarse de forma independiente.
*** Por favor, no arroje zapatos de lona, ya que el proyecto aún está en desarrollo.
Entonces, estamos interesados en dos cosas:
- cómo obtener una imagen estéreo en el teléfono en un casco;
- Cómo controlar los servos girando la cabeza.
El concepto que se usa en el video, si se resume, se ve así:
- 2 raspberry pi envían transmisiones de video a la red desde sus cámaras a través de servicios webrtc;
- el teléfono (en el casco) acepta transmisiones en 2 aplicaciones idénticas en el teléfono: aplicaciones flotantes.
- Al mismo tiempo, el teléfono controla los servidores conectados a la frambuesa.
Todo es simple Pero diablo, como sabes, está en los detalles y las molestias, a saber:
- necesita ejecutar 2 raspberry, controlar la configuración de 2 cámaras, power raspberry * 2.
- las aplicaciones flotantes se deslizan constantemente en el teléfono, debe alinear las imágenes en la pantalla.
- ...
Por lo tanto, nos transferiremos a stereopi, afortunadamente, apareció en tiendas rusas (espero que no desaparezca después de esta publicación):
Stereopi es el desarrollo de nuestro compatriota, que ahora está conquistando activamente el mercado.
Su encanto se deriva del nombre: puede conectar 2 cámaras CSI raspberry pi al mismo tiempo. Al mismo tiempo, todo esto funciona sobre la base de un módulo de cómputo raspberry pi. Desafortunadamente, el módulo en sí no está incluido en el paquete; debe comprarlo usted mismo.
Sobre stereopi hay artículos sobre Habré.
De él necesitaremos 2 transmisiones de video y control de servidores a través de GPIO.
Como base para estereopi usaremos el Módulo de cómputo Raspberry Pi 3+.
Preparación de estereopi
Después de ensamblar stereopi (inserte el módulo de cómputo en stereopi, cámaras), complete el software.
Utilizamos la imagen preparada para el módulo de cómputo raspberry pi: Raspbian (stretch). Está disponible en stereopi.com -
Raspbian Stretch OpenCV image, Google DriveLlénalo con frambuesa.
Si hay dificultades con el llenado, otros van a
wiki estereopi .
Instalando webrtc.
Instale el software webrtc en stereopi. Parcialmente, el material de instalación se toma de esta página:
Instalación para ARM (Raspberry Pi)
Evitaremos comentarios innecesarios que ya están en la página anterior y simplemente instalaremos todo lo que se requiera.
curl http://www.linux-projects.org/listing/uv4l_repo/lpkey.asc | sudo apt-key add - sudo nano /etc/apt/sources.list deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/stretch stretch main sudo apt-get update sudo apt-get install uv4l uv4l-raspicam sudo apt-get install uv4l-raspicam-extras sudo raspi-config Anvanced Options Memory Split 256 enter sudo apt-get install uv4l-server uv4l-uvc uv4l-xscreen uv4l-mjpegstream uv4l-dummy uv4l-raspidisp sudo apt-get install uv4l-webrtc sudo apt-get install uv4l-demos sudo apt-get install uv4l-xmpp-bridge sudo apt-get install uv4l-raspidisp-extras
Ahora necesita (en las instrucciones es) generar claves ssl, ya que Chrome puede no mostrar el video a través de la conexión http (solo a través de https):
openssl genrsa -out selfsign.key 2048 && openssl req -new -x509 -key selfsign.key -out selfsign.crt -sha256
* al generar claves, se harán preguntas sobre la empresa, la región, etc. - Puedes responderlas arbitrariamente.
Las claves generadas (selfsign.key y selfsign.crt aparecerán en la carpeta actual) deben colocarse en la carpeta:
/etc/ssl/private/
Todas las configuraciones de webrtc se almacenan en 2 archivos:
/etc/uv4l/uv4l-raspicam.conf /etc/uv4l/uv4l-raspidisp.conf
Para no cansarse de enumerar elementos en archivos que necesitan ser descomentados o
para solucionarlo, sobrescriba los archivos de configuración con su uv4l-raspicam.conf y uv4l-raspidisp.conf.
Reinicie raspberry e inicie sesión
en ip raspberry usando Chrome:
https://192.168.1.100:8080
WebRTC es un fanático de las posibilidades, pero nos limitaremos a una cosa: iremos a la pestaña webrtc:
Ahora verifique si el video funciona con estereopi.
Presione el botón "Llamar" en la parte inferior de la página web en el teléfono.
Debería aparecer un video de las cámaras estéreo.
Haga clic en el botón "Pantalla completa" debajo de la ventana con la imagen de las cámaras web:
* ¡No recargue la página en el teléfono! Si esto todavía sucedió, debe eliminar los procesos en frambuesa:
sudo killall uv4l
Y reinicie los servicios en él:
sudo service uv4l_raspidisp restart sudo service uv4l_raspicam restart
Por otra parte, en la página
del navegador
del teléfono, haga clic en "Llamar".
** La llamada no funcionará si no hay una cámara conectada a la frambuesa.
Nos ocuparemos de los servos.
Para administrar los servos en frambuesa desde el teléfono, necesita un código que se ejecutará en frambuesa y acciones en el teléfono.
Pero primero, decidamos sobre los servos. El video de YouTube utiliza servos conectados directamente a gpio raspberry. Dado que los servos son de baja potencia, probablemente pueda colgar 2 servos en frambuesa gpio. Estos trucos se pueden realizar fácilmente en servidores sg-90. No son exigentes en nutrición, pero tampoco son particularmente buenos para las cargas. En principio, deberían ser suficientes para mantener una suspensión con dos cámaras de estereopi. El cardán en sí se puede comprar en el mismo AliExpress, para la búsqueda "pan-tilt". Sin embargo, estos servos también tienen un serio inconveniente: "tiemblan de miedo". Es el efecto que observa el autor del video de YouTube. Aquí no se considerará por qué sucede esto y qué hacer con él.
En nuestro caso, se utilizan los servos mg-996n y la articulación del robot, que espero que no necesite en el futuro cercano.
* Mg-996N no "tiembla".
Stereopi tiene un diseño gpio similar al estándar en
frambuesa 3 .
Por lo tanto, los cables de señal de los servos irán a gpio, y es mejor tomar 5V no de frambuesa, sino desde el lado, combinar GND serv con GND de frambuesa y GND de una fuente externa.
Ahora lo más importante es el software
En frambuesa necesitamos un demonio, pero no el de Lermontov, sino pigpio. No es necesario que realice ningún paso especial para configurarlo, lo principal es saber que se cuelga en el puerto 8888 y primero debe ejecutarlo:
sudo systemctl start pigpiod.service
A continuación, cree un archivo que gestionará los servidores, recibiendo datos del socket, que él mismo crea:
datachannel_server_tele.py Se dejan comentarios en el texto para comprender de dónde vino el código y qué más se puede corregir.
El significado general del código es el siguiente:
- al inicio, los servos se colocan en la posición media.
- Hay 3 pines (gpio) en los que cuelgan los cables de señal de los servos. En nuestro caso, 2 pines (suspensión de 2 servos).
- Los gpio se controlan aplicando una señal en el rango PWM de 1000 a 2000.
- llega una línea desde el teléfono, que es analizada por json (puede hacer otra cosa), luego se toman los valores x e y. A continuación, estos valores se traducen en valores PWM para rotar los servos.
* El problema es que x toma valores de 0 a 360 (el teléfono gira alrededor de su eje), como y. Y estos valores deben estar vinculados a PWM, que toma valores de 1000 a 2000. El código usa la fórmula pitchPW = key1 * 5 + 500. 500 es el valor mínimo del servo PWM (aunque la suposición es 1000 en el código). Y la multiplicación por 5 es condicional. Este punto necesita ser mejorado, ya que en x = 360, el valor PWM es muchas veces mayor que el máximo. Los servos están protegidos de exceder los ángulos de rotación máximos para evitar daños, pero esto no es muy agradable.
Ejecute el código en la terminal de frambuesa:
sudo python3 datachannel_server_tele.py
Activaremos el GPS en el teléfono (cada teléfono tiene un ícono correspondiente en la configuración) y revisaremos ip raspberry.
https://192.168.1.100:8080/stream/webrtc
Haga clic en "Llamar". Después de establecer la conexión, en el teléfono en el navegador en la página, marque "enviar ángulos de orientación del dispositivo alfa, beta, gamma".
Los valores de x irán a la terminal con el script. Y, si gira el teléfono, cambiarán.
Los servos también se moverán.
* Actualmente uno de ellos (el segundo está comentado).
De los bonitos bonos, webrtc también te da la oportunidad :
- crea una apariencia de un telebridge entre el teléfono y la frambuesa (tu interlocutor será voluminoso),
- emitir sonido en ambas direcciones (no probado, pero tomado en cuenta en la configuración),
- Transmitir a una página web, youtube en 3d.
- crear una llamada de conferencia de varios amigos (jitsi meet).
- cambie la configuración de la cámara sobre la marcha a través de la interfaz web (¿por qué no funciona rotar! &?).
Ahora sobre lo triste.
1. Shalturit conectando dos cámaras diferentes con ojos de pez en la regla de la escuela no funcionó. Resulta que los peces tienen ojos diferentes. Necesitamos el mismo tipo de cámara:

2. No fue posible ampliar la imagen de las cámaras estéreo a través de la configuración de la interfaz web webrtc. Mientras que las imágenes son más angostas, como los pantalones de un francés.

3. El servo MG996N está limitado a ángulos de rotación de -180. De hecho, 160. Quizás alguien aconseje con 360, pero sin rotación continua.
4. El software requiere molienda.
5. La llamada a veces se cae, tienes que volver a conectarte.
Aplicación: