Mavros: Configuración de los parámetros de PX4 usando MAVROS

Creado en 31 ago. 2017  ·  10Comentarios  ·  Fuente: mavlink/mavros

Hola

Estoy tratando de cambiar algunos parámetros en una pila de vuelo PX4 usando MAVROS.

Puedo leer el parámetro con mavros usando
rosservice call / mavros / param / get MPC_LAND_SPEED

sin embargo, no puedo configurarlo usando mavros. No se cual es la sintaxis correcta

Lo intenté
rosservice call / mavros / param / set MPC_LAND_SPEED '0.4'
sin embargo me da un error. ¡Si alguien puede ayudar, estaría muy agradecido!

Gracias

Sebastián

question

Comentario más útil

Es porque está intentando llamar al método set a través de un servicio.

A través de un servicio, la forma ROS es:

rosservice call /param/set "param_id: 'MPC_LAND_SPEED'
value:
  integer: 0
  real: 0.4" 

Todos 10 comentarios

¿Has probado el script mavparam ? rosrun mavros mavparam set MPC_LAND_SPEED 0.4 ?

Es porque está intentando llamar al método set a través de un servicio.

A través de un servicio, la forma ROS es:

rosservice call /param/set "param_id: 'MPC_LAND_SPEED'
value:
  integer: 0
  real: 0.4" 

Parece que tienes dos opciones de trabajo @shening. Clausura

Es porque está intentando llamar al método set a través de un servicio.

A través de un servicio, la forma ROS es:
rosservice call / param / set "param_id: 'MPC_LAND_SPEED'
valor:
entero: 0
real: 0.4 "

A partir de la ayuda del método anterior, aquí se describe un método más exacto.

El comando anterior comete un error en mi prueba. Pero funcionó después de que se agregó un espacio en blanco antes de 'integer' y 'real'. Y '/ mavros' agregó como:

rosservice call / mavros / param / set "param_id: 'SENS_EN_THERMAL'
valor:
entero: 55
real: 0.0 "

cf) En este editor de comentarios, se puede agregar un espacio en blanco escribiendo   lugar de '' (espacio).

@bigbellmercy ¿Es este problema aparente solo en los argumentos de la línea de comandos? ¿O esto también es cierto cuando usa llamadas rosservice sobre roscpp?

@bigbellmercy De hecho, eso fue hace 3 años y el espacio no era obvio, solo agregué `` alrededor y ahora es obvio. La forma típica en que uso rosservice es haciendo un uso abusivo depara evitar errores tipográficos: reír:

@bigbellmercy ¿Es este problema aparente solo en los argumentos de la línea de comandos? ¿O esto también es cierto cuando usa llamadas rosservice sobre roscpp?

@ Jaeyoung-Lim No pude 'rosservice llamadas sobre roscpp' usando las líneas de comando anteriores.

Pero el siguiente código funciona para el cambio de parámetro PX4 en roscpp:

system("rosrun mavros mavparam set SENS_EN_THERMAL 55");

@ Jaeyoung-Lim Me refería a roscpp usando las llamadas al servicio ros , no usando argumentos de línea de comando

@ Jaeyoung-Lim No pude encontrar la solución en mis pruebas.

Usando llamadas de servicio roscpp , tampoco pude obtener o establecer directamente un parámetro PX4. Siempre recibí el siguiente error:

[/mavros:std_plugins::ParamPlugin::get_cb]: PR: Unknown parameter to get: MPC_XY_VEL_MAX
[/mavros:std_plugins::ParamPlugin::set_cb]: PR: Unknown parameter to set: MPC_XY_VEL_MAX

¿Hay algún prefijo para agregar al ID del parámetro?

Funcionó sin problemas usando el script mavparam :
rosrun mavros mavparam -n /mavros get MPC_XY_VEL_MAX

Sin embargo, quiero hacerlo mediante programación. Encontré una solución extrayendo los parámetros a ROS, haciendo los cambios deseados y luego empujándolos todos hacia atrás:

ServiceClient pull_client = nh.serviceClient<mavros_msgs::ParamPull>("mavros/param/pull");
pull_client.waitForExistence();
mavros_msgs::ParamPull pull;
if (pull_client.call(pull)) {
    if (pull.response.success) {
        ROS_DEBUG("Pulled %d parameters from FCU", pull.response.param_received);
        nh.setParam("mavros/param/MPC_XY_VEL_MAX", max_velocity);
        ServiceClient push_client = nh.serviceClient<mavros_msgs::ParamPush>("mavros/param/push");
        push_client.waitForExistence();
        mavros_msgs::ParamPush push;
        if (push_client.call(push)) {
            if (push.response.success)
                ROS_DEBUG("Pushed %d parameters to FCU", push.response.param_transfered);
            else
                ROS_ERROR("Failed push parameters to FCU, cannot set maximum horizontal velocity!");
        }
        else {
            ROS_ERROR("Failed to push parameters to FCU, cannot set maximum horizontal velocity!");
        }
    }
    else {
        ROS_ERROR("Failed to pull parameters from FCU, cannot set maximum horizontal velocity!");
    }
}
else {
    ROS_ERROR("Failed to pull parameters from FCU, cannot set maximum horizontal velocity!");
}
¿Fue útil esta página
0 / 5 - 0 calificaciones