Mavros: Einstellen der PX4-Parameter mit MAVROS

Erstellt am 31. Aug. 2017  ·  10Kommentare  ·  Quelle: mavlink/mavros

Hi

Ich versuche, einige Parameter auf einem PX4-Flugstapel mit MAVROS zu ändern.

Ich kann den Parameter mit mavros auslesen mit
rosservice-Aufruf /mavros/param/get MPC_LAND_SPEED

Ich kann es jedoch nicht mit Mavros einstellen. Ich weiß nicht, was seine korrekte Syntax ist

Ich habe es versucht
rosservice-Aufruf /mavros/param/set MPC_LAND_SPEED '0.4'
es gibt mir jedoch einen Fehler. Wenn jemand helfen kann wäre ich sehr dankbar!

Dankeschön

Sebastian

question

Hilfreichster Kommentar

Dies liegt daran, dass Sie versuchen, die set-Methode über einen Dienst aufzurufen.

Über einen Dienst ist der ROS-Weg:

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

Alle 10 Kommentare

Haben Sie das mavparam Skript ausprobiert? rosrun mavros mavparam set MPC_LAND_SPEED 0.4 ?

Dies liegt daran, dass Sie versuchen, die set-Methode über einen Dienst aufzurufen.

Über einen Dienst ist der ROS-Weg:

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

Scheinbar hast du zwei Arbeitsoptionen @shening. Schließen

Dies liegt daran, dass Sie versuchen, die set-Methode über einen Dienst aufzurufen.

Über einen Dienst ist der ROS-Weg:
rosservice-Aufruf /param/set "param_id: 'MPC_LAND_SPEED'
Wert:
Ganzzahl: 0
echt: 0,4"

Mit Hilfe der obigen Methode wird hier eine genauere Methode beschrieben.

Der obige Befehl macht in meiner Testversion einen Fehler. Aber es funktionierte, nachdem ein Leerzeichen vor 'integer' und 'real' hinzugefügt wurde. Und '/mavros' wie folgt hinzugefügt:

rosservice-Aufruf /mavros/param/set "param_id: 'SENS_EN_THERMAL'
Wert:
Ganzzahl: 55
echt: 0.0"

cf) In diesem Kommentareditor kann ein Leerzeichen eingefügt werden, indem   anstelle von ' '(Leerzeichen) geschrieben wird.

@bigbellmercy Ist dieses Problem nur in Befehlszeilenargumenten offensichtlich? oder gilt das auch, wenn Sie rosservice-Aufrufe über roscpp verwenden?

@bigbellmercy Tatsächlich war das vor 3 Jahren und der Leerraum war nicht offensichtlich, ich habe nur ``` drum herum hinzugefügt und jetzt ist es offensichtlich. Die typische Art und Weise, wie ich rosservice benutze, ist, es missbräuchlich zu verwendenum Tippfehler zu vermeiden :lach:

@bigbellmercy Ist dieses Problem nur in Befehlszeilenargumenten offensichtlich? oder gilt das auch, wenn Sie rosservice-Aufrufe über roscpp verwenden?

@Jaeyoung-Lim Ich konnte mit den obigen Befehlszeilen nicht "rosservice call over roscpp" ausführen.

Der folgende Code funktioniert jedoch für die Änderung der PX4-Parameter in roscpp:

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

@Jaeyoung-Lim Ich meinte roscpp mit den ros-Dienstaufrufen , nicht mit Befehlszeilenargumenten

@Jaeyoung-Lim Ich konnte in meinen Versuchen keine Lösung dafür finden.

Mit roscpp Service Calls konnte ich auch keinen PX4-Parameter direkt

[/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

Muss der Parameter-ID ein Präfix hinzugefügt werden?

Mit dem mavparam- Skript hat es ohne Probleme
rosrun mavros mavparam -n /mavros get MPC_XY_VEL_MAX

Ich möchte es jedoch programmatisch machen. Ich habe eine Problemumgehung gefunden, indem ich die Parameter in ROS gezogen, die gewünschten Änderungen vorgenommen und dann alle zurückgeschoben habe:

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!");
}
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen