Carro carro ROS Parte 2. Software

Publicaciones en la serie:
8. Controlamos desde el control del teléfono ROS, nodo GPS
7. Localización de robots: gmapping, AMCL, puntos de referencia en el mapa de la sala
6. Odometría con codificadores de rueda, mapa de habitación, lidar
5. Trabajamos en rviz y gazebo: xacro, nuevos sensores.
4. Cree una simulación de robot utilizando los editores rviz y gazebo.
3. Acelera, cambia la cámara, arregla la marcha
2. Software
1. hierro

Pasando a la sonrisa


Habiendo ensamblado la "hamburguesa" de acuerdo con el esquema de la última publicación , procedemos al contenido del software.

Como estamos recolectando para un proyecto ya completado, es lógico dar las instrucciones indicadas en él. Estan aqui

Todo es muy conveniente y en el mismo lugar puede descargar una imagen preparada de Raspbian Stretch + ROS + OpenCV, escribirla en una tarjeta SD para frambuesa. (ROS Kinetic, OpenCV 3.4.1. Sí, hay uno más nuevo, pero a veces es mejor tomar y llevar que recoger todo de la fuente).

Sin embargo, a pesar de la conveniencia, aún tenía que corregir ligeramente la imagen. Como resultó algunos detalles incómodos de la imagen original:

  • sin GUI (interfaz gráfica). Esto no es crítico, especialmente para ROS, pero para montar en una línea necesita calibrar la cámara en la propia frambuesa y ver cómo (la cámara) transmite colores (más sobre eso a continuación);
  • El ensamblaje OpenCV no muestra la imagen en la pantalla, incluso si instala la GUI usted mismo. Obviamente, en el proyecto rosbots, opencv se creó sin esta opción.
  • sin muletas pequeñas (VNC, editor de texto para notas, mc).
  • Por lo tanto, OpenCV fue reconstruido con soporte para salida de imagen en la GUI (compilado por openCV 3.4.3), se instaló una GUI, pequeñas muletas.

La imagen final está aquí , y se trabajará más sobre esta base.

Configure la red (wi-fi) y ROS-master en raspberry pi

.
Recomiendo encarecidamente que los experimentos usen un enrutador separado con su wi-fi. Simplemente puede crear un punto de acceso en su teléfono para estos fines. Esto se debe al hecho de que muchos paquetes volarán sobre wi-fi y, preferiblemente, no se hundirán en el tráfico general.

Después de cargar la imagen en la tarjeta SD de frambuesa, configure la red. La configuración inicial de la red es la siguiente:

interface wlan0 static ip_address=192.168.43.174/24 static routers=192.168.43.1 static domain_name_servers=192.168.43.1 

Contenido en /etc/dhcpcd.conf

Por lo tanto, no puede conectar las mangueras a la frambuesa para cambiar todo, simplemente cree un punto de acceso con el nombre y la contraseña del pathos 1234554321. La dirección de la frambuesa será 192.168.43.174. Además de ssh, también puede acceder a esta dirección a través de VNC: login - pi, contraseña - 123qweasdzxcV.

Vamos a configurar el maestro ROS

Un pequeño comentario para aquellos que no han encontrado ROS (sistema de operación robótica). Un maestro ROS es un intermediario a través del cual diferentes nodos se comunican en ros (nodos, servicios, etc.) Si el maestro ros no se está ejecutando o se está ejecutando en la dirección incorrecta, los nodos no se verán.

En nuestro sistema ROS, el asistente comienza automáticamente con la carga del sistema operativo, y todo lo que se requiere de nosotros es especificar la dirección IP para el asistente ROS en el archivo del sistema correspondiente.

Si no ha cambiado la configuración de red que se enumera arriba, entonces no necesita configurar nada.

De lo contrario, edite bashrc:

 nano ~/.bashrc 

Al final del archivo, corrija las direcciones IP (ambas) para su caso:

 export ROS_MASTER_URI=http://192.168.43.174:11311 export ROS_HOSTNAME=192.168.43.174 

Reiniciar

Ahora, al iniciar el terminal en el carrito, la salida será así (o lo que haya especificado en la configuración):

 For all slaves, "export ROS_MASTER_URI=http://192.168.43.174:11311" 

Esto significa que el maestro ROS trabaja en la dirección IP especificada.

Controlamos el carro en wi-fi


Comprobaremos desde el principio que los nodos funcionan para nosotros.

En terminal:

 rosnode list 

La salida será así:

/ rosout
/ uno_serial_node

Si no salió nada, verifique si registró ROS-master en la configuración como se describe anteriormente, si conectó la manguera usb a arduino, reinicie.

Después de verificar, ejecute el primer nodo responsable del movimiento:

 rosrun rosbots_driver part2_cmr.py 

* comando ros especial lanza el archivo part2_cmr.py del paquete python rosbots_driver

El sistema informará que el nodo se está ejecutando:



Aquí puede ver que se determina el radio de las ruedas y la distancia entre ellas. Puede corregir estos valores, así como otros relacionados con el movimiento en el archivo robot.py a lo largo de la ruta

 /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/examples/coursera_control_of_mobile_robots/part2/full/controller 

dado que part2_cmr.py en sí no tiene estos parámetros. Abra la segunda terminal e ingrese a la lista rostopic:



Aquí puede ver que ha aparecido el tema / part2_cmr / cmd_vel. En este tema, / part2_cmr "escucha" lo que otros nodos le dirán y, según lo que digan, controlará el movimiento. Lo que exactamente "escucha", pero no "habla" se puede entender usando el comando.

 rostopic info /part2_cmr/cmd_vel 



Aquí puede ver ese suscriptor / part2_cmr (suscrito) al tema y escucha.

* Puede "decir" algo sobre el tema usted mismo, sin nodos.

Por ejemplo:

 rostopic pub -1 /wheel_power_left std_msgs/Float32 '{data: 1.0}' 

girar hacia adelante con la rueda izquierda

 rostopic pub -1 /wheel_power_left std_msgs/Float32 '{data: 0.0}' 

detener la rueda izquierda

 rostopic pub -1 /wheel_power_left std_msgs/Float32 '{data: -1.0}' 

Gire de espaldas con una rueda

 rostopic pub -1 /wheel_power_left std_msgs/Float32 '{data: -0.5}' 

Gire hacia atrás con la rueda izquierda más lenta.

La sintaxis es: pub rostopic - deseo de hablar en el tema, -1 - deseo único, / wheel_power_left - tema donde decimos, std_msgs / Float32 - idioma (formato del mensaje), '{datos: -0.5}' - lo que decimos.

Ahora ejecute el que hablará en el tema / part2_cmr / cmd_vel. Este será el nodo de envío del comando de teclado.

Sin cerrar el terminal anterior con un nodo de trabajo, ejecute otro e ingrese:

 rosrun teleop_twist_keyboard teleop_twist_keyboard.py /cmd_vel:=/part2_cmr/cmd_vel 

* Dado que la publicación está por defecto en el tema / cmd_vel, la redirigimos usando
/ cmd_vel: = / part2_cmr / cmd_vel para que los mensajes se viertan en / part2_cmr / cmd_vel.

El nodo de control se inició y puede conducir presionando las teclas del teclado:



Si es imposible conducir, o hay un chirrido sutil debajo de las ruedas, debe aumentar la velocidad haciendo clic en "w" en la terminal con el nodo en funcionamiento. Lo mismo (aumentar o disminuir) se puede hacer con la velocidad de rotación: el botón "e". También es importante estar en una terminal con un nodo en ejecución si los botones de control no funcionan si cambia a otra terminal. El botón "k" en el terminal de control es una parada.

En una terminal separada, mire el tema / part2_cmr / cmd_vel:



Ahora en el tema / part2_cmr / cmd_vel hay un orador y un oyente.

Montando la línea en OpenCV


Antes de ir a algún lugar, debe asegurarse de que el robot viaje con el control del teclado. Se necesita un comentario importante aquí. Cuando se controla desde el teclado en el ejemplo anterior, girar a la izquierda debe corresponder a presionar la tecla j, a la derecha l (América l), adelante i, atrás, (coma). Si este no es el caso en su caso, entonces puede haber problemas con el viaje. Para que todo vuelva a la normalidad, es necesario cambiar los pares de cables que provienen del conductor del motor a las patas en arduino en nuestra hamburguesa 4,5,6,7 arduino: 4,5 para intercambiar con 6,7 o 4 y 5,6 y 7 cada uno con otro dependiendo de dónde girarán las ruedas. También puede hacer esto mediante programación ajustando el código para arduino a lo largo de la ruta - /home/pi/gitspace/rosbots_driver/platformio/rosbots_firmware/examples/motor_driver/src/main.cpp

 #define M_LEFT_PWM 6 #define M_LEFT_FR 7 #define M_RIGHT_PWM 5 #define M_RIGHT_FR 4 

y recargándolo en arduino con el comando:

 upload_firmware ~/gitspace/rosbots_driver/platformio/rosbots_firmware/examples/motor_driver 

Trabajemos con flores

Nuestra experiencia en jardinería consistirá en resaltar la línea en el piso por la que viajará el robot, para determinar su color. Por defecto, el robot no lo ve. Como línea, puede usar cinta adhesiva (amarilla) o cinta, o algo más con un color característico y bastante ancho. * Es poco probable que la cinta adhesiva transparente funcione, porque Será difícil distinguirlo del fondo.

Vayamos a la carpeta y ejecutemos el script:

 cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver python bgr-to-hsv.py 

* Atención! Si usa la imagen original de rosbots, y no la mía, este programa no está allí.

Se abrirán dos ventanas:



Aquí están las gamas de colores en HSV. ¿Qué es hsv y por qué no rgb? Por favor, búscalo en Google.

h1, s1, v1 - inferior y h2, s2, v2 - respectivamente, el rango superior.

Ahora debe seleccionar una línea con cinta aislante (quizás no cinta sino cinta) en el piso moviendo los controles deslizantes en la ventana. Solo la línea de cinta aislante debe permanecer en la ventana de resultados:



La línea de cinta aislante es inusualmente blanca, todo lo demás es negro. Este resultado es necesario.
Registre, recuerde los números de los rangos HSV. Mi caso es 56,155,40 y 136,255,255. Los rangos de HSV serán diferentes bajo diferentes condiciones de iluminación cerca de la cámara del robot.

Cierre las ventanas ingresando ctrl + c en la terminal y agregue los rangos HSV al archivo follow_line_step_hsv.py:

 cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver nano follow_line_step_hsv.py 

En las lineas:

 lower_yellow = np.array([21,80,160]) upper_yellow = np.array([255,255,255]) 

Ponemos los números de nuestros rangos HSV.

Hora de andar en línea

Iniciamos el nodo motor en la terminal 1:

 rosrun rosbots_driver part2_cmr.py 

Inicie el nodo de la cámara en el segundo terminal:

 sudo modprobe bcm2835-v4l2 roslaunch usb_cam usb_cam-test.launch 

Ejecute el nodo opencv en el tercer terminal:

 cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver python follow_line_step_hsv.py 

Si todo salió bien, entonces el robot seguirá la línea y aparecerá una ventana adicional:



En esta ventana, la cinta aislante se marcará con un círculo rojo.

El significado general del código es seleccionar un segmento de color a cierta distancia de la cámara, dibujar un círculo rojo e ir a este círculo, tratando de mantenerlo en el centro.

Finalmente, sobre lo importante: sobre gatos y sonrisas


Como nuestro objetivo es ir al gato oa una persona sonriente, tendremos que usar algo más complicado en nuestro código. También necesitaremos gatos y personas sonrientes. El segundo ahora es más difícil: pocas personas sonríen en este momento difícil y alarmante. Entonces, comencemos con los gatos.

Para los experimentos, las fotos de gatos en la cara son adecuadas.

Ejecute el nodo de la cámara en el primer terminal:

 cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver python pi_camera_driver.py 

En el segundo terminal, el nodo motor:

 rosrun rosbots_driver part2_cmr.py 

En el tercer terminal del nodo de búsqueda cat:

 cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver python follow_cat2.py 

El carrito se moverá gradualmente hacia el gato:



Ahora necesita un voluntario que sepa sonreír. Tome un retrato de una figura pública poco conocida en un país pequeño.

En la tercera terminal del nodo de búsqueda del gato, puede cerrar - ctrl + c y en lugar de comenzar a buscar una sonrisa en la cara de una persona pública poco conocida:

 python follow_smile.py 

El carrito tendrá que conducir lenta e incrédulamente a la sonrisa de una persona poco conocida:



Como muchos ya habrán adivinado, los scripts que ejecutamos usan cascadas Haar. Por el mismo principio que con un viaje a lo largo de la línea, se resalta un cuadrado del área deseada y el programa intenta mantenerlo en el centro moviendo el robot.

Desafortunadamente, el rendimiento de la frambuesa 3b deja mucho que desear, a pesar de la configuración de la cámara de 320x240 y 15 Fps. Los retrasos son notables con el aumento del tiempo. No todos los gatos pueden soportarlo.

¿Cómo se puede mejorar esto?

Intente reconstruir opencv optimizado, como Adrian recomienda (https://www.pyimagesearch.com/2017/10/09/optimizing-opencv-on-the-raspberry-pi/)? ¿Utiliza recursos de PC externos para el procesamiento de imágenes? ¿Intenta no comprimir imágenes en jpeg que vuelan al controlador Haar? Y una gran desventaja más: los gatos deben ser grandes y estar al frente. Distancia de 15 cm en hoja A4. Al alejarse de la cámara, el gato ya es irreconocible e invulnerable. ¿Poner un monóculo de frambuesa en la cámara con 8 aumentos?

PD: Si tienes en tus manos los experimentos con la imagen que se muestra en el artículo, aún puedes viajar por diferentes partes del cuerpo, iniciando en lugar del nodo del gato:

 python follow_fullbody.py python follow_upperbody.py python follow_lowerbody.py 

cara u ojo:

 python follow_face.py python follow_right_eye.py 

Si está interesado en cómo alejarse suavemente para que el robot no derrame té, así como en cómo operarlo no con frambuesa, escriba.

Source: https://habr.com/ru/post/461131/


All Articles