Entrando en Aeronet Episodio 2: Homing Drone


En el artículo anterior, examinamos el procedimiento para lanzar un dron virtual autónomo al aire. Bajo la guía del maestro, incluso los escolares logran lanzar el dron de acuerdo con estas instrucciones. Surge la pregunta: ¿qué sigue? Bueno, drone, bien elevado. Por otra parte, virtual - en juguetes y simuladores y más bellamente pintados.


Como siguiente paso, proponemos crear un avión no tripulado capaz de ver su objetivo y lograrlo con éxito. Es más fácil usar un globo de color como objetivo.


Tal tarea (hacer estallar una pelota con un dron autónomo) fue llevada a cabo recientemente por equipos en la sección Aeronet del Robocross All-Russian -2019 . Nos inspiró la canción "Seek and destroy" del álbum debut de un grupo estadounidense que fue muy popular durante mi turbulenta juventud.
En la próxima serie de artículos, veremos cómo enseñar a un dron autónomo a seguir instrucciones simples del estribillo de la canción mencionada anteriormente.


Entonces, necesitamos lo siguiente:


  1. Un dron volador que podemos controlar desde el programa
  2. Sistema de reconocimiento y orientación de objetivos
  3. Combina los dos puntos anteriores juntos y, voila, puedes competir, cuyo dron volará más rápido y más bolas.

A continuación, lo primero es lo primero.


jMAVSim controlado por teclado


Imagina un dron viendo una pelota, como en la imagen de arriba. La cámara del dron está mirando al frente.


Para volar sobre una pelota, nuestro dron debe ser capaz de: avanzar / retroceder, girar a izquierda y derecha, volar más alto y más bajo. La pelota se moverá en la lente de la cámara no solo por las ráfagas de viento, sino también por la inclinación del dron al rodar y lanzar, sino que descuidamos estas inclinaciones hasta ahora.


Controlaremos la velocidad del dron, enviando mensajes a través de mavros al tema /mavros/setpoint_velocity/cmd_vel_unstamped .


Para manipular el dron desde el teclado, utilizamos el módulo de maldiciones ( descripción en ruso , en inglés ).


El algoritmo es simple: los valores actuales de las velocidades deseadas se almacenan en una variable setvel de tipo geometry_msgs.msg.Twist . Al presionar un botón en el teclado, aumentamos / disminuimos el componente de velocidad deseado. Por el temporizador 20 veces por segundo publicamos la velocidad en el tema especificado.


Para la velocidad de avance (en relación con el dron), se requiere una aclaración. El hecho es que las velocidades de vuelo deben establecerse en el sistema de coordenadas local del "mundo" en el que vuela nuestro dron. Por lo tanto, debe rastrear la posición actual (pose) del dron en este sistema de coordenadas. El eje X del dron se gira en relación con el eje X del "mundo" en un cierto ángulo de guiñada. Mavros publica la posición actual del dron en las coordenadas del "mundo" en el tema /mavros/local_position/pose . Después de obtener el ángulo de guiñada desde la posición para obtener y publicar la velocidad deseada del dron en coordenadas mundiales, multiplicamos la velocidad de avance deseada setvel_forward por cos (guiñada) para el eje X y sin (guiñada) para el eje Y del mundo, respectivamente.



Texto completo del programa:
 #!/usr/bin/env python # coding=UTF-8 import rospy import mavros import mavros.command as mc from mavros_msgs.msg import State from geometry_msgs.msg import PoseStamped, Twist, Quaternion from mavros_msgs.srv import CommandBool from mavros_msgs.srv import SetMode import tf.transformations as t import math current_state=State() current_pose = PoseStamped() current_vel = Twist() def localpose_callback(data): global current_pose current_pose = data def publish_setvel(event): global current_pose, setvel_pub, setvel, setvel_forward q=current_pose.pose.orientation.x, current_pose.pose.orientation.y,current_pose.pose.orientation.z,current_pose.pose.orientation.w roll, pitch, yaw = t.euler_from_quaternion(q) setvel.linear.x = setvel_forward * math.cos(yaw) setvel.linear.y = setvel_forward * math.sin(yaw) setvel_pub.publish(setvel) def main(): global current_pose, setvel, setvel_pub, setvel_forward rospy.init_node("offbrd",anonymous=True) rate=rospy.Rate(10) pose_sub=rospy.Subscriber("/mavros/local_position/pose",PoseStamped,localpose_callback) setvel_pub=rospy.Publisher("/mavros/setpoint_velocity/cmd_vel_unstamped",Twist,queue_size=1) arming_s=rospy.ServiceProxy("/mavros/cmd/arming",CommandBool) set_mode=rospy.ServiceProxy("/mavros/set_mode",SetMode) setvel=Twist() setvel_forward = 0 arming_s(True) set_mode(0,"AUTO.TAKEOFF") print 'Taking off.....\r' rospy.sleep(5) # keyboard manipulation import curses stdscr = curses.initscr() curses.noecho() stdscr.nodelay(1) stdscr.keypad(1) for i in range (0,10): setvel_pub.publish(setvel) rate.sleep() set_mode(0,"OFFBOARD") setvel_timer = rospy.Timer(rospy.Duration(0.05), publish_setvel) while (rospy.is_shutdown()==False): rate.sleep() # keyboard hcommands handling c = stdscr.getch() if c == ord('q'): break # Exit the while() elif c == ord('u'): setvel.linear.z += 0.25 elif c == ord('d'): setvel.linear.z -= 0.25 elif c == curses.KEY_LEFT: setvel.angular.z += 0.25 elif c == curses.KEY_RIGHT: setvel.angular.z -= 0.25 elif c == curses.KEY_UP: setvel_forward += 0.25 elif c == curses.KEY_DOWN: setvel_forward -= 0.25 elif c == ord('s'): setvel_forward=setvel.linear.z=setvel.angular.z=0 if c!=curses.ERR: print setvel,'\r' curses.endwin() set_mode(0,"AUTO.LAND") print 'Landing.......\r' if __name__=="__main__": main() 

Para ejecutar el programa para su ejecución, necesitamos ejecutar jMAVSim y conectarle mavros usando el comando roslaunch mavros (después de ejecutar roscore si no se inició automáticamente):


 roslaunch mavros mavros_sitl.launch fcu_url:="udp://@192.168.7.14:14580" 

Asegúrese de que estamos conectados mediante rostopic echo / mavros / state. El campo conectado debe ser = Verdadero.


Después de eso, guarde el código del programa en un archivo y ejecútelo con el python fly_mavsim.py . El quadrocopter virtual debe elevarse a una altura de aproximadamente 2 metros (la altura de despegue se establece en el parámetro MIS_TAKEOFF_ALT en QGroundControl) y se congela. Usando los botones del teclado, se puede controlar: flechas derecha-izquierda - girar, flechas arriba-abajo - movimiento hacia adelante / atrás, u - volar hacia arriba (ARRIBA), d - volar hacia abajo (ABAJO), s - colgar en su lugar (PARAR, todas las velocidades = 0), q - salga del programa (SALIR) y aterrice el quadrocopter.


Puede volar alrededor del mundo virtual, verifique cómo se comporta un dron virtual ideal en vuelo.


Dron en vuelo


Los cambios en las velocidades de las pulsaciones de teclas se resumen, puede hacer que el dron vuele en círculo, en espiral, alrededor de un cierto punto, simulando un sistema de orientación.


Entonces comienza la diversión: desde un dron esférico en el vacío, nos movemos al mundo real.


Drone real controlado por teclado


Hay muchas instrucciones en la red para ensamblar y configurar helicópteros en la pila PX4. Un proceso bastante detallado se describe en la documentación de los desarrolladores .


Como utilicé un dron listo para usar, esto me salvó de numerosas sentadillas durante el ensamblaje y la configuración preliminar del sistema.


Como computadora de a bordo, utilizamos Raspberry PI 3 Modelo B +, con Raspbian + ROS Kinetic instalado. Raspberry está conectado al controlador de vuelo Pixracer a través de uart, de acuerdo con el esquema:


Pixracer + Raspberry PI


El módulo GPS está conectado al puerto GPS del controlador de vuelo. Utilizo el módulo TS100 de Radiolink, la calidad es buena, el costo no es alto.


ROS Kinetic se puede instalar por su cuenta siguiendo las instrucciones . En Raspberry, debe configurar el acceso a través de Wifi y ssh ( aquí hay una instrucción, por ejemplo ).


También puede usar una imagen preparada para Raspberry de la compañía "Copter Express". En este caso, debe deshabilitar el paquete inteligente predeterminado, que no necesitamos:


 sudo systemctl stop clever sudo systemctl disable clever 

Aquí se describe otra imagen de Raspberry con ROS y OpenCV, no la he probado en mi trabajo, pero las herramientas utilizadas son similares.


Después de encender el dron y conectarnos a Raspberry a través de ssh, iniciamos mavros y verificamos la conexión con el controlador de vuelo:


 roslaunch mavros px4.launch fcu_url:='/dev/ttyAMA0:921600' gcs_url:='tcp-l://0.0.0.0:5760' rostopic echo /mavros/state 

Si todo funciona correctamente, una vez por segundo recibimos mensajes sobre el estado del controlador de vuelo con el campo Conectado = Verdadero.



El parámetro gcs_url en la llamada gcs_url es necesario para que podamos conectar el QGroundControl al controlador de vuelo del dron a través de WiFi a través del puente TCP. Los parámetros de conexión se establecen en QGroundControl:



Para preparar el dron para un vuelo autónomo, sigo algunos pasos simples:


1. Asegúrese de que el dron vuela bien en modo manual. Para hacer esto, se deben seleccionar los parámetros correctos y todos los sensores calibrados. El uso de un dron comercialmente disponible me salvó del problema en este momento. Usé el estimador LPE con GPS habilitado y un barómetro:



2. Si el sistema se inicia en un lugar nuevo o por primera vez, debe esperar a que el módulo GPS se "caliente". Con el trabajo regular en la calle, el GPS generalmente captura de 16 a 22 satélites.



3. Antes de volar a un nuevo lugar, y si el dron no tiene un punto, debe recalibrar la brújula:



Debe usar una brújula externa y asegurarse de que la orientación correcta esté establecida en la configuración:



Si todos los ajustes se realizan correctamente, el dron debe mantener con confianza el punto en el modo HOLD y volar establemente en el modo de posición.


Después de vuelos de prueba exitosos en modo manual, podemos verificar cómo funciona nuestro programa fly_jmavsim.py en un drone real: video .


Un dron real no vuela tan perfecto como uno virtual, pero también necesita obedecer los comandos del teclado: vuela en la dirección correcta y se detiene en el comando.


Si esto sucede, en lugar del control del teclado, podemos usar la visión por computadora, que discutiremos sobre la configuración en el próximo artículo. Las primeras pruebas de caza de pelotas se veían así .


La configuración de nuestro controlador de vuelo + código de programa se publica en el github .

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


All Articles