Mavros: Teleoperación con joystick

Creado en 25 ago. 2014  ·  72Comentarios  ·  Fuente: mavlink/mavros

En encuadernado. Necesitará ayuda en la parte de anulación RC.

extras feature request

Comentario más útil

@vooon haciendo una prueba ahora. Mi mapa de ejes es diferente, eso es fácil de cambiar, pero veo que algunos canales están invertidos. También debe agregar un parámetro para invertir el canal, sin tener que ir al modo de control y hacer algo como z=-yaw .

Nota: en mi caso, mi mapa de ejes es:

axes_map = {
    'roll': 3,
    'pitch': 2,
    'yaw': 0,
    'throttle': 1
}

y en modo de control de vel:

twist.twist.linear = Vector3(x=-roll, y=pitch, z=throttle)
twist.twist.angular = Vector3(z=-yaw)

Todos 72 comentarios

Creo que es mejor no un complemento, sino un nodo de script que usa el complemento rc_io.

¿Incluirá eso cosas de punto de ajuste?

No estoy muy acostumbrado a los scripts como viste, realmente preferiría un complemento. Pero puedo enviarte esto como un complemento y luego puedes convertirlo en un script si quieres.

Simplemente no quiero código duplicado que ya existe (y funciona).

En mi opinión, este nodo debería suscribirse al tema del joystick y producir mensajes de anulación de rc (o punto de ajuste).
Envíeme, por favor, qué datos debo enviar a rc / setpoint y escribo el script (mapa de canales, etc.).

Ok, lo haría de inmediato

@vooon te envió el correo electrónico ahora;)

Ok, lo veré mañana.

Seguro: +1: ¡Gracias!

Podría agregar un nodo similar que tengo para esto si es necesario. @ TSC21

@tonybaltovski por favor

@tonybaltovski Ya inicié un plugin, que envié a @vooon para que se adapte como él quiera. Estaba casi listo para el control del punto de ajuste, pero la parte de anulación RC se la dejé a @vooon.

¿Cuál es el estado de esto? Realmente me gustaría echarle una mano en esto, así que para probar los puntos de ajuste también :)

Quizas mañana...

@ TSC21 Es solo una prueba de concepto, pero debería funcionar.

¡Lo intentaré, gracias! :) Pero mi prioridad es probar los puntos de ajuste usando el joystick. Si por favor puede agregar la posibilidad de control de posición y velocidad, se lo agradecería.

Para velocidad, envíe cmd_vel como TwistStamped para ser suscrito por setpoint_velocity ;

El control de posición es simple: en lugar de cmd_vel envía position como PoseStamped pero este tiene que ser un caso particular - tiene que sumar el valor de posición anterior enviado para que puede incrementar o disminuir la posición (por lo que los valores de x , y , z no están limitados a -1..1; lo que está limitado es el valor que se agrega a último valor; así que si el joystick siempre envía +1 , en cada iteración suma +1 -> la única duda que tengo aquí es si tenemos que limitar la tasa en este caso, por lo que las iteraciones no aumentan los valores demasiado rápido).
Este está suscrito por setpoint_position .

Actualización: con respecto al tema /joy : no puedo recuperar ningún dato de mi joystick usando el script mavteleop . Pero usando el lanzamiento universal_teleop puedo. Entonces debe faltar algo en el guión.

¿Ejecutas el joy_node?

rosrun joy joy_node

2014-08-27 18:17 GMT + 04: 00 TSC21 [email protected] :

Actualización: con respecto al tema / joy: no puedo recuperar ningún dato de
mi joystick usando el script mavteleop. Pero usando el universal_teleop
lanzar puedo. Entonces debe faltar algo en el guión.

-
Responda a este correo electrónico directamente o véalo en GitHub
https://github.com/vooon/mavros/issues/133#issuecomment -53578566.

¡No! Sí, funciona ahora. Olvidé el joy_node . ¿No se puede incluir eso en el guión que se lanzará?

De acuerdo ahora con respecto a la anulación en sí: hacer eco de /mavros/rc/override no estaba obteniendo ningún dato porque olvidó el prefijo / aquí:

override_pub = rospy.Publisher(args.mavros_ns + "/rc/override", OverrideRCIn, queue_size=10)

Necesito corregir eso o hago un PR.
Pero todavía no hay RC anulado en la FCU, ya que los motores ni siquiera cambian la velocidad. Continuará verificando lo que está sucediendo.

@vooon RC override no está funcionando. El script se publica en /rc/override , que está suscrito por rc_io.cpp . Hacer eco de /mavros/rc/override me da valores de canal que cambian, pero no sucede nada en el lado de la FCU (no hay cambios de giro del motor).

Mi prioridad no es la anulación de RC, aunque me gustaría configurarla. Pero parece que no puedo encontrar cuál es el problema. Mientras tanto, ¿puede implementar el control de posición y velocidad de consigna, por favor? (basado en el comentario anterior que hice con respecto a las especificaciones de este tipo de control)
¡Gracias!

Tengo el mismo problema con la anulación RC. La FCU no lo usa.

@tonybaltovski, ¿puedes intentar depurar el motivo? Estoy ocupado con otras cosas relacionadas con POSCTL.

Cuando pruebo anulaciones con APM, descubrí que cae silenciosamente si el mensaje de anulación proviene de system_id! = SYSID_MYGCS (predeterminado: 255).

Así que lo cambio a 1 (valores predeterminados de mavros) y funciona. O podríamos cambiar mavros system_id.

Entonces, ¿qué está mal? system_id o comp_id ? ¿Qué se necesita en el caso de PX4?

Quizás PX4 no maneja los mensajes de anulación de RC, no puedo encontrar el controlador para el mensaje MAVLINK_MSG_ID_RC_CHANNELS_OVERRIDE .

Quizás PX4 no maneja los mensajes de anulación de RC, no puedo encontrar el controlador para el mensaje MAVLINK_MSG_ID_RC_CHANNELS_OVERRIDE .

Sí, parece que no. Bueno, muy mal, creo que podemos pedir la implementación, pero preferiría que los puntos de ajuste funcionen. ¿Puedes echar una mano
¡Gracias por adelantado!

@vooon Lo intentaré de nuevo con mi APM mañana y te lo haré saber.

Intentaré hacerlo mañana.

¡Muchas gracias @vooon!

@ TSC21 Casi

¡Gracias @vooon! : D cuando haya terminado por favor avíseme! ¡Estaré encantado de probar esto!

Ya puede probar todos los modos excepto -pos (y tal vez -vel ).

@vooon haciendo una prueba ahora. Mi mapa de ejes es diferente, eso es fácil de cambiar, pero veo que algunos canales están invertidos. También debe agregar un parámetro para invertir el canal, sin tener que ir al modo de control y hacer algo como z=-yaw .

Nota: en mi caso, mi mapa de ejes es:

axes_map = {
    'roll': 3,
    'pitch': 2,
    'yaw': 0,
    'throttle': 1
}

y en modo de control de vel:

twist.twist.linear = Vector3(x=-roll, y=pitch, z=throttle)
twist.twist.angular = Vector3(z=-yaw)

Use el parámetro ~axes_scale/<name> para revertir (configúrelo en -1.0).

Oh, está bien, no lo comprobé. ¡Gracias!

¿Puede integrar rosrun joy joy_node al iniciar el script en lugar de agregarlo al archivo launch ?

@vooon otra cosa que debe estar funcionando: el nodo debe estar siempre enviando los datos, incluso si es 0.0, es decir, por ejemplo, cmd_vel siempre debe estar publicando incluso si no movemos los swtiches en el joystick, porque el modo OFFBOARD tiene un tiempo de espera de 0,5 segundos y, al estar recibiendo datos constantemente, permanece en ese modo o se invierte al modo anterior.

Lo que veo es que cuando establecemos un canal en un valor, cmd_vel solo envía ese valor una vez. La implementación de PX4 necesita recibir datos constantemente, así que creo que lo que se puede hacer es que cmd_vel envíe siempre el valor del canal anterior, excepto cuando recibe un nuevo valor. Ese nuevo valor se almacena y se envía constantemente hasta que se establece un nuevo valor del canal (usando los sticks analógicos fuera de curso).

Agregue esto a su archivo de inicio para el nodo de alegría <param name="~autorepeat_rate" value="5" />

¡Gracias @tonybaltovski que funcionó! Pero todavía no puedo cambiar los parámetros usando el archivo de inicio. Así es como se ve mi archivo de inicio:

<launch>
    <!-- vim: ft=roslaunch -->
    <!-- example launch script for PX4 teleop -->

    <arg name="fcu_url" default="serial:///dev/ttyACM0:57600" />
    <arg name="gcs_url" default="" />
    <arg name="tgt_system" default="1" />
    <arg name="tgt_component" default="50" />

    <node pkg="mavros" type="mavros_node" name="mavros" required="true" clear_params="true" output="screen">
        <param name="fcu_url" value="$(arg fcu_url)" />
        <param name="gcs_url" value="$(arg gcs_url)" />
        <param name="target_system_id" value="$(arg tgt_system)" />
        <param name="target_component_id" value="$(arg tgt_component)" />

        <!-- px4 blacklist -->
        <rosparam command="load" file="$(find mavros)/launch/px4_blacklist.yaml" />

        <!-- enable heartbeat send and reduce timeout -->
        <param name="conn_heartbeat" value="5.0" />
        <param name="conn_timeout" value="10.0" />
        <!-- enable mavlink autostart on USB port -->
        <param name="startup_px4_usb_quirk" value="true" />

        <!-- joystick axis parameters -->

        <!-- joystick axis map -->
        <param name="~axes_map/roll" value="3" />
        <param name="~axes_map/pitch" value="2" />
        <param name="~axes_map/yaw" value="0" />
        <param name="~axes_map/throttle" value="1" />

        <!-- joystick axis scale -->
        <param name="~axes_scale/roll" value="-1.0" />
        <param name="~axes_scale/pitch" value="" />
        <param name="~axes_scale/yaw" value="-1.0" />
        <param name="~axes_scale/throttle" value="" />

    </node>

    <node pkg="joy" type="joy_node" name="joy" required="true">
        <param name="~/autorepeat_rate" value="50" />
    </node> 
</launch>

¿Quizás porque este es un script mavros_extras ? Pero al emitir rosparam list / obtengo:

/joy/autorepeat_rate
/mavros/axes_map/pitch
/mavros/axes_map/roll
/mavros/axes_map/throttle
/mavros/axes_map/yaw
/mavros/axes_scale/pitch
/mavros/axes_scale/roll
/mavros/axes_scale/throttle
/mavros/axes_scale/yaw

Entonces no puedo entender por qué no cambia el parámetro.

Por cierto @vooon , debería ser axis y no axes ;) Haré esa corrección y haré un PR si quieres.

Actualización: dios, mi ignorancia. ejes es plural de ejes (por lo que está bien como está)

Actualización: si hago rosparam get /mavros/axes_map/pitch obtengo 2 como se supone, así que creo que puede ser algo en mavteleop .

Si lo hago en su lugar:

load_map(axes_map, '/mavros/axes_map/')
load_map(axes_scale, '/mavros/axes_scale/')
load_map(button_map, '/mavros/button_map/')

en rosrun mavteleop :

[ERROR] [WallTime: 1409327711.720875] bad callback: <function joy_cb at 0xa5ce9cc>
Traceback (most recent call last):
  File "/opt/ros/hydro/lib/python2.7/dist-packages/rospy/topics.py", line 682, in _invoke_callback
    cb(msg)
  File "/home/vision/vision_ros_ws/src/mavros/mavros_extras/scripts/mavteleop", line 187, in joy_cb
    pitch = get_axis(joy, 'pitch')
  File "/home/vision/vision_ros_ws/src/mavros/mavros_extras/scripts/mavteleop", line 92, in get_axis
    return j.axes[axes_map[n]] * axes_scale[n]
TypeError: can't multiply sequence by non-int of type 'float'

¡Ok, el problema está resuelto! Esto es lo que hice:
En el archivo de lanzamiento tenía:

<!-- joystick axis scale -->
        <param name="~axes_scale/roll" value="-1.0" />
        <param name="~axes_scale/pitch" value="" />
        <param name="~axes_scale/yaw" value="-1.0" />
        <param name="~axes_scale/throttle" value="" />

que estaba dando el error anterior de multiplicar secuencia. cambiado a:

<!-- joystick axis scale -->
        <param name="~axes_scale/roll" value="-1.0" />
        <param name="~axes_scale/pitch" value="1.0" />
        <param name="~axes_scale/yaw" value="-1.0" />
        <param name="~axes_scale/throttle" value="1.0" />

La suscripción se solucionó cambiando mavteleop con esto:

load_map(axes_map, '/mavros/axes_map/')
load_map(axes_scale, '/mavros/axes_scale/')
load_map(button_map, '/mavros/button_map/')

Pronto haré un PR.

PR hecho en # 143.

Estaba confundido la forma plural de los ejes.

Aplica parámetros al nodo incorrecto. Simplemente hice un script de inicio.

Aplica parámetros al nodo incorrecto. Simplemente hice un script de inicio.

¡Sí, ahora lo entiendo! ¡Gracias! Cancelará PR entonces.

Uso:

  1. iniciar la conexión FCU: roslaunch mavros px4.launch
  2. iniciar teleoperación: roslaunch mavros_extras teleop.launch

O cree su propio lanzamiento con <include file="..."> para ambos archivos.

Uso:
iniciar la conexión FCU: roslaunch mavros px4.launch
iniciar teleoperación: roslaunch mavros_extras teleop.launch

¡Gracias! ¡Lo intentaré entonces!

Funciona bien ahora :) solo tuve que cambiar el yaml y listo (verifique 289fa6c - debería ser roll bot poll ). Ahora probaré esto en GCS HIL para ver cómo funciona. ¿Qué se debe hacer en la parte position @vooon?

Me estoy preparando para vuelos de fin de semana, así que en todo ..

Me estoy preparando para vuelos de fin de semana, así que en todo ..

Si me señalas myabe, puedo intentarlo

Arreglaré el error tipográfico.
También es necesario agregar límites de RC de carga de los parámetros de FCU.

Por cierto, ¡acabo de notar que el PX4Firmware tiene 500 bifurcaciones!

Por cierto, ¡acabo de notar que el PX4Firmware tiene 500 bifurcaciones!

: D No sorprende dada la enorme comunidad que utiliza proyectos derivados de Pixhawk y PX4.

Solo quería comentar sobre esto. Estaba a punto de escribir algo así como vi este problema. Es como si la comunidad me leyera la mente: D. Probado, funciona a las mil maravillas.

@pmukherj ¿Puede describir algunos pasos breves sobre cómo logró que esto funcione en un sistema limpio? Expandiré, probaré y adaptaré para incluir esto en la wiki.
Gracias.

@mhkabir Creo que es el mejor lugar en wiki: páginas de tutoriales (actualmente no existen en el espacio de mavros).

@vooon Quise decir PX4 wiki :) Puedo agregar una nota a README.

¡Cosa segura! Quiero asegurarme de no haber realizado ningún paso redundante (es posible que no haya sido necesario actualizar el firmware a la versión dev, etc.). Escribiré algo hoy.

@mhkabir No pude volar hoy debido al mal tiempo en Canadá, pero durante las pruebas de banco noté que cuando se envía un comando r, p, y distinto de cero (usando el joystick) no hay un cambio audible en la potencia del motor. Cuando controlo el empuje (a través del joystick f710), puedo escuchar los motores que suben y bajan. Cuando balanceo el cuerpo del quadrotor, puedo escuchar los motores quejarse y tratar de compensar. Sin embargo, cuando le doy un comando ar, p, y grande para apuntar a través del comando de punto de ajuste / actitud, no se escucha tal compensación. ¿Hay algún mensaje de retroalimentación implementado como parte de mavros, algo que reconozca que se está implementando un comando (¿tal vez las potencias del motor individual o algo así?).
Quiero asegurarme de que esto funcione antes de documentarlo, y prefiero probarlo en un banco y luego a través de un accidente: P.

@pmukherj ¿Puedes
Hay un mensaje LOCAL_POSITION_TARGET_NED y un mensaje ATTITUDE_TARGET que no están en mavros. Lo parchearé como parte de la refactorización de código que queremos hacer para los complementos de punto de ajuste. Además, para estas transmisiones de destino del controlador, debe transmitirlas explícitamente en el lado PX4.
El control externo es experimental y este complemento no se ha probado, por lo que aún no estoy seguro de dónde van las cosas. Necesito más datos.

Lo siento, cierto, estaba ocupado haciendo algunos vuelos de DAQ.
Entonces, ATTITUDE_TARGET suena exactamente como lo que necesito para asegurarme de que el pixhawk está tratando de alcanzar los comandos del joystick que le estoy enviando. Tengo un 3DR, pixhawk con una computadora más grande montada a bordo (la pila px4 funciona fabulosamente por cierto, solo faltan algunos modos de vuelo).

Puedo investigar eso o tienes una bifurcación con esto implementado?

@pmukherj Estoy buscando obtener objetivos de actitud y posición en mi complemento de visualizador. Hay algunos problemas de tf, así que los estoy resolviendo.
¿Qué computadora complementaria de a bordo estás usando?
En cuanto a los objetivos, realmente no es necesario implementar nada. Simplemente use el puente UDP que tenemos en mavros y parchee un enlace a QGC en su computadora de desarrollo. Puede ver y trazar todo allí.

¡Perdón! Mudanza de oficinas durante los años nuevos.
Estoy probando con todo tipo de computadoras (odroides, TK1, etc.). Intentaré usar un puente UDP.
¿Supongo que puedo usar cualquiera de las conexiones de telemetría en el pixhawk? Además de la computadora complementaria, también tengo una conexión inalámbrica en uno de los puertos de telemetría (como es estándar con 3DR pixhawk).

Sí. ¡Verificado que los puntos de ajuste están realmente funcionando! Los puntos de ajuste internos lo están aceptando y las salidas del controlador también son visibles. Ahora para las pruebas de vuelo :). Deséame suerte.

@pmukherj Puede conectar el compañero a su puerto TELEM2 e iniciarlo a través de extras.txt en su tarjeta microSD.
Es bueno que los puntos de ajuste estén funcionando. Mucha suerte con los vuelos.
Consulte: http://www.pixhawk.org/dev/ros/mavros_offboard
En la parte inferior hay una línea de código en blanco, donde debe agregar el comando mavros que usó para cambiar al modo externo (como una opción para las personas si así lo desean)

Además, ¿puede agregar el pedido para las pruebas de vuelo aquí: http://www.pixhawk.org/dev/offboard_control/testing

Ponga los puntos y lo limpiaré.

@vooon El complemento del joystick funciona bien, pero se bloquea demasiado si uno de los ejes no se encuentra o está fuera de rango, etc.

Podemos agregar limitación mínima / máxima.

Tenga en cuenta que no era un complemento, node.

Cierto ;)
Creo que lo haré como un complemento, ya que el script / python parece bastante confuso + poco confiable.

No quiero plugin porque está reinventando la rueda. Reescritura máxima de python a C ++.
Pero realmente no es necesario cuando mavteleop se ejecuta en desctop y controla los mavros de OBC.

@vooon, ¿has pensado en una forma de resolver esto ?

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

TSC21 picture TSC21  ·  12Comentarios

zhahaoyu picture zhahaoyu  ·  12Comentarios

trishantroy picture trishantroy  ·  10Comentarios

tfoote picture tfoote  ·  5Comentarios

Tutorgaming picture Tutorgaming  ·  4Comentarios