Mavros: Exemple de commande externe setpoint_position/global non armé

Créé le 21 déc. 2017  ·  38Commentaires  ·  Source: mavlink/mavros

Détails du problème

J'essaie de reproduire l' exemple de contrôle externe (qui fonctionne bien dans le gazebo) mais en envoyant des coordonnées globales au lieu de x,y,z locaux.
Je ne peux pas le faire, le drone entre dans une boucle de "Offboard Enabled" mais ne passe jamais en véhicule armé ou ne se déplace pas du tout.

Voici le code que j'utilise :

#include <ros/ros.h>
#include <geometry_msgs/PoseStamped.h>
#include <mavros_msgs/SetMode.h>
#include <mavros_msgs/CommandBool.h>
#include <mavros_msgs/State.h>
#include <mavros_msgs/GlobalPositionTarget.h>

mavros_msgs::State current_state;
void state_cb(const mavros_msgs::State::ConstPtr& msg){
    current_state = *msg;
}

int main(int argc, char **argv)
{
    ros::init(argc, argv, "offb_node");
    ros::NodeHandle nh;

    ros::Subscriber state_sub = nh.subscribe<mavros_msgs::State>
            ("mavros/state", 10, state_cb);
    //ros::Publisher local_pos_pub = nh.advertise<geometry_msgs::PoseStamped>
    //        ("mavros/setpoint_position/local", 10);
    ros::Publisher global_pos_pub = nh.advertise<mavros_msgs::GlobalPositionTarget>
            ("mavros/setpoint_position/global", 10);
    ros::ServiceClient arming_client = nh.serviceClient<mavros_msgs::CommandBool>
            ("mavros/cmd/arming");
    ros::ServiceClient set_mode_client = nh.serviceClient<mavros_msgs::SetMode>
            ("mavros/set_mode");

    //the setpoint publishing rate MUST be faster than 2Hz
    ros::Rate rate(20.0);

    // wait for FCU connection
    while(ros::ok() && current_state.connected){
        ros::spinOnce();
        rate.sleep();
    }

    geometry_msgs::PoseStamped pose;
    pose.pose.position.x = 0;
    pose.pose.position.y = 0;
    pose.pose.position.z = 2;

    mavros_msgs::GlobalPositionTarget target;
    target.latitude = 42.3005867;
    target.longitude = -6.73246288;
    target.altitude = 288;

    //send a few setpoints before starting
    for(int i = 100; ros::ok() && i > 0; --i){
        //local_pos_pub.publish(pose);
        global_pos_pub.publish(target);
        ros::spinOnce();
        rate.sleep();
    }

    mavros_msgs::SetMode offb_set_mode;
    offb_set_mode.request.custom_mode = "OFFBOARD";

    mavros_msgs::CommandBool arm_cmd;
    arm_cmd.request.value = true;

    ros::Time last_request = ros::Time::now();

    while(ros::ok()){
        if( current_state.mode != "OFFBOARD" &&
            (ros::Time::now() - last_request > ros::Duration(5.0))){
            if( set_mode_client.call(offb_set_mode) &&
                offb_set_mode.response.mode_sent){
                ROS_INFO("Offboard enabled");
            }
            last_request = ros::Time::now();
        } else {
            if( !current_state.armed &&
                (ros::Time::now() - last_request > ros::Duration(5.0))){
                if( arming_client.call(arm_cmd) &&
                    arm_cmd.response.success){
                    ROS_INFO("Vehicle armed");
                }
                last_request = ros::Time::now();
            }
        }

        //local_pos_pub.publish(pose);
        global_pos_pub.publish(target);



        ros::spinOnce();
        rate.sleep();
    }

    return 0;
}

Version et plateforme MAVROS

Mavros : 0,22
ROS : cinétique
Ubuntu : 16.04

Type et version du pilote automatique

[ ] ArduPilot
[X] PX4

Version : 1.72

Journaux de nœud

[ INFO] [1513871636.932979892, 18.704000000]: Offboard enabled
[ INFO] [1513871642.007625263, 23.756000000]: Offboard enabled
[ INFO] [1513871647.086730559, 28.802000000]: Offboard enabled
[ INFO] [1513871652.230028795, 33.854000000]: Offboard enabled
[ INFO] [1513871657.324560463, 38.904000000]: Offboard enabled
[ INFO] [1513871662.405701045, 43.952000000]: Offboard enabled
[ INFO] [1513871667.482897607, 49.002000000]: Offboard enabled
[ INFO] [1513871672.582290375, 54.054000000]: Offboard enabled
[ INFO] [1513871677.688265367, 59.104000000]: Offboard enabled
[ INFO] [1513871682.756627458, 64.152000000]: Offboard enabled
[ INFO] [1513871687.861573086, 69.204000000]: Offboard enabled
[ INFO] [1513871692.928765643, 74.252000000]: Offboard enabled
[ INFO] [1513871698.006964586, 79.304000000]: Offboard enabled
[ INFO] [1513871703.113995111, 84.354000000]: Offboard enabled
[ INFO] [1513871708.205142370, 89.404000000]: Offboard enabled
[ INFO] [1513871713.332829113, 94.454000000]: Offboard enabled
[ INFO] [1513871718.443985089, 99.504000000]: Offboard enabled

Diagnostique

header: 
  seq: 58
  stamp: 
    secs: 53
    nsecs:         0
  frame_id: ''
status: 
  - 
    level: 0
    name: "mavros: FCU connection"
    message: "connected"
    hardware_id: "udp://:14540<strong i="17">@localhost</strong>:14557"
    values: 
      - 
        key: "Received packets:"
        value: "19548"
      - 
        key: "Dropped packets:"
        value: "0"
      - 
        key: "Buffer overruns:"
        value: "0"
      - 
        key: "Parse errors:"
        value: "0"
      - 
        key: "Rx sequence number:"
        value: "94"
      - 
        key: "Tx sequence number:"
        value: "108"
      - 
        key: "Rx total bytes:"
        value: "808043"
      - 
        key: "Tx total bytes:"
        value: "26524"
      - 
        key: "Rx speed:"
        value: "15016.000000"
      - 
        key: "Tx speed:"
        value: "510.000000"
  - 
    level: 0
    name: "mavros: GPS"
    message: "3D fix"
    hardware_id: "udp://:14540<strong i="18">@localhost</strong>:14557"
    values: 
      - 
        key: "Satellites visible"
        value: "10"
      - 
        key: "Fix type"
        value: "3"
      - 
        key: "EPH (m)"
        value: "0.00"
      - 
        key: "EPV (m)"
        value: "0.00"
  - 
    level: 0
    name: "mavros: Heartbeat"
    message: "Normal"
    hardware_id: "udp://:14540<strong i="19">@localhost</strong>:14557"
    values: 
      - 
        key: "Heartbeats since startup"
        value: "48"
      - 
        key: "Frequency (Hz)"
        value: "0.900000"
      - 
        key: "Vehicle type"
        value: "Quadrotor"
      - 
        key: "Autopilot type"
        value: "PX4 Autopilot"
      - 
        key: "Mode"
        value: "AUTO.LOITER"
      - 
        key: "System status"
        value: "Standby"
  - 
    level: 0
    name: "mavros: System"
    message: "Normal"
    hardware_id: "udp://:14540<strong i="20">@localhost</strong>:14557"
    values: 
      - 
        key: "Sensor present"
        value: "0x00000000"
      - 
        key: "Sensor enabled"
        value: "0x00000000"
      - 
        key: "Sensor helth"
        value: "0x00000000"
      - 
        key: "CPU Load (%)"
        value: "0.0"
      - 
        key: "Drop rate (%)"
        value: "0.0"
      - 
        key: "Errors comm"
        value: "0"
      - 
        key: "Errors count #1"
        value: "0"
      - 
        key: "Errors count #2"
        value: "0"
      - 
        key: "Errors count #3"
        value: "0"
      - 
        key: "Errors count #4"
        value: "0"
  - 
    level: 0
    name: "mavros: Battery"
    message: "Normal"
    hardware_id: "udp://:14540<strong i="21">@localhost</strong>:14557"
    values: 
      - 
        key: "Voltage"
        value: "12.15"
      - 
        key: "Current"
        value: "-1.0"
      - 
        key: "Remaining"
        value: "100.0"
  - 
    level: 2
    name: "mavros: Time Sync"
    message: "No events recorded."
    hardware_id: "udp://:14540<strong i="22">@localhost</strong>:14557"
    values: 
      - 
        key: "Timesyncs since startup"
        value: "0"
      - 
        key: "Frequency (Hz)"
        value: "0.000000"
      - 
        key: "Last dt (ms)"
        value: "-9.905652"
      - 
        key: "Mean dt (ms)"
        value: "0.000000"
      - 
        key: "Last system time (s)"
        value: "48.740659000"
      - 
        key: "Time offset (s)"
        value: "4.147428739"

Vérifier l'identité

OK. I got messages from 1:1.

---
Received 5370 messages, from 1 addresses
sys:comp   list of messages
  1:1     0, 1, 2, 140, 141, 147, 24, 30, 31, 32, 33, 74, 76, 77, 85, 87, 102, 230, 105, 111, 241, 242, 245

PX4 question setpoint

Commentaire le plus utile

Tout d'abord, while(ros::ok() && current_state.connected){ doit être while(ros::ok() && !current_state.connected){ .
Aussi - https://github.com/mavlink/mavros/blob/master/mavros/src/plugins/setpoint_position.cpp#L69 - assurez-vous que vous obtenez des données du sujet global_position/global .

Tous les 38 commentaires

Tout d'abord, while(ros::ok() && current_state.connected){ doit être while(ros::ok() && !current_state.connected){ .
Aussi - https://github.com/mavlink/mavros/blob/master/mavros/src/plugins/setpoint_position.cpp#L69 - assurez-vous que vous obtenez des données du sujet global_position/global .

J'ai corrigé la boucle while avec le !
rostopic echo global_position/global renvoie la sortie correcte :

header: 
  seq: 283
  stamp: 
    secs: 193
    nsecs: 832815640
  frame_id: "base_link"
status: 
  status: 0
  service: 1
latitude: 42.3005867
longitude: -6.7324631
altitude: 2120.89452234
position_covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
position_covariance_type: 1

Cependant, cela ne fonctionne toujours pas. lorsque j'exécute le code, il se termine sans armer ni activer hors-bord.
Le seul avertissement qu'il produit est :

[ WARN] [1514991840.139563807, 7583.766000000]: SPG: sp not sent.
INFO  [tone_alarm] negative
[ WARN] [1514991840.303175629, 7583.928000000]: CMD: Unexpected command 176, result 1

Je dois traduire du global au local, puis envoyer mavros/setpoint_position/local sinon cela ne fonctionnera pas.
Je suis curieux, est-ce moi le seul à avoir ce problème ? Quelqu'un est-il capable de reproduire l'exemple hors-bord de l'avion simplement en le publiant dans mavros/setpoint_position/global ?

@mzahana pouvez-vous s'il vous plaît guider @danividanivi sur le problème ci-dessus ? Merci

Je voudrais juste mentionner que j'ai également rencontré ce problème. J'ai pu confirmer que je publiais dans le bon sujet, mais MAVROS ne semble pas être en mesure de le traduire en un message de point de consigne MAVLINK correct pour le PX4. J'ai vérifié à l'aide de QGroundcontrol et n'ai pu voir qu'un message de point de consigne publié sur le PX4 lors de l'utilisation de local.

@mzahana pouvez-vous tester votre implémentation et vous assurer qu'elle fonctionne ? Merci

@eric1221bday question rapide : obtenez-vous des données GPS sur MAVROS ? Que veux-tu dire aussi par :

mais MAVROS ne semble pas pouvoir le traduire en un message de consigne MAVLINK correct pour le PX4

Cela semble un peu vague et nous ne pouvons déboguer aucun problème avec des informations comme celle-ci.

J'utilisais SITL, et oui, la simulation GPS était activée et j'ai pu visualiser le sujet dans ROS. Quant à la chose mavlink. Ce que je voulais dire, c'est simplement qu'il ne semblait pas que le point de consigne global était envoyé correctement au px4, car je ne pouvais pas le voir à l'aide de Mavlink Inspector.

Ceci n'est pas censé publier une consigne de position globale, mais plutôt convertir de global en local et publier en tant que consigne de position locale. Vous ne voyez donc jamais de point de consigne global.

J'ai pu en déduire que oui, et je n'ai pas non plus pu voir de points de consigne locaux à partir du PX4.

Eh bien, cela dépend de la façon dont votre nœud est défini et de ce que vous publiez ou non sur MAVROS. Cela ne peut pas être débogué sans plus d'informations.

@eric1221bday autre chose à ajouter ou pouvons-nous fermer cela ?

Je vais re-tester ça de mon côté et je reviens vers vous.

Aucun progrès? J'ai le même problème et je n'arrive pas à trouver de solution.

Assurez-vous de définir le champ header.stamp. Alors seulement ça marche !

Bon après-midi! Quelqu'un pourrait-il confirmer que la publication dans le sujet /mavros/setpoint_position/global a réussi à contrôler la position du drone ? J'ai le même problème (aucune réponse obtenue, px4 ne semble recevoir aucun message) même en définissant le champ header.stamp

Oui, ça marche pour moi !

Idem ici... (ne fonctionne pas pour moi)

@tropappar cela vous dérange-

Voici:

#include <ros/ros.h>
#include <mavros_msgs/CommandBool.h>
#include <mavros_msgs/SetMode.h>
#include <mavros_msgs/State.h>
#include <mavros_msgs/GlobalPositionTarget.h>
#include <sensor_msgs/NavSatFix.h>

// global variables
mavros_msgs::State current_state;
sensor_msgs::NavSatFix global_position;
bool global_position_received = false;

// callback functions
void globalPosition_cb(const sensor_msgs::NavSatFix::ConstPtr& msg) {
    global_position = *msg;
    global_position_received = true;
    ROS_INFO_ONCE("Got global position: [%.2f, %.2f, %.2f]", msg->latitude, msg->longitude, msg->altitude);
}

void state_cb(const mavros_msgs::State::ConstPtr& msg) {
    current_state = *msg;
}

// main function
int main(int argc, char **argv) {
    ros::init(argc, argv, "test");
    ros::NodeHandle nh;

    ros::ServiceClient arming_client = nh.serviceClient < mavros_msgs::CommandBool > ("mavros/cmd/arming");
    ros::ServiceClient set_mode_client = nh.serviceClient < mavros_msgs::SetMode > ("mavros/set_mode");
    ros::Subscriber state_sub = nh.subscribe < mavros_msgs::State > ("mavros/state", 10, state_cb);
    ros::Subscriber global_pos_sub = nh.subscribe < sensor_msgs::NavSatFix > ("mavros/global_position/global", 1, globalPosition_cb);
    ros::Publisher goal_pos_pub = nh.advertise < mavros_msgs::GlobalPositionTarget > ("mavros/setpoint_position/global", 10);

    ros::Rate rate(10);

    // wait for fcu connection
    while (ros::ok() && !current_state.connected) {
        ROS_INFO_ONCE("Waiting for FCU connection...");
        ros::spinOnce();
        rate.sleep();
    }
    ROS_INFO("FCU connected");

    // wait for position information
    while (ros::ok() && !global_position_received) {
        ROS_INFO_ONCE("Waiting for GPS signal...");
        ros::spinOnce();
        rate.sleep();
    }
    ROS_INFO("GPS position received");

    // set target position
    mavros_msgs::GlobalPositionTarget goal_position;
    goal_position.latitude = global_position.latitude;
    goal_position.longitude = global_position.longitude;
    goal_position.altitude = global_position.altitude;

    // send a few setpoints before starting
    for (int i=0; i<20; ++i) {
        goal_position.header.stamp = ros::Time::now();
        goal_pos_pub.publish(goal_position);
        ros::spinOnce();
        rate.sleep();
    }

    // set mode
    mavros_msgs::SetMode offb_set_mode;
    offb_set_mode.request.base_mode = 0;
    offb_set_mode.request.custom_mode = "OFFBOARD";
    if (set_mode_client.call(offb_set_mode) && offb_set_mode.response.mode_sent) {
        ROS_INFO("OFFBOARD enabled");
    } else {
        ROS_ERROR("Failed to set OFFBOARD");
    }

    // arm
    mavros_msgs::CommandBool arm_cmd;
    arm_cmd.request.value = true;
    if (arming_client.call(arm_cmd) && arm_cmd.response.success) {
        ROS_INFO("Vehicle armed");
    } else {
        ROS_ERROR("Arming failed");
    }

    // take off to 5m above ground
    goal_position.altitude = goal_position.altitude + 5.0;
    while (ros::ok()) {
        goal_position.header.stamp = ros::Time::now();
        goal_pos_pub.publish(goal_position);
        ros::spinOnce();
        ROS_INFO_THROTTLE(1, "At altitude %.2f", global_position.altitude);
        rate.sleep();
    }

    return 0;
}

Bon après-midi! Quelqu'un pourrait-il confirmer que la publication dans le sujet /mavros/setpoint_position/global a réussi à contrôler la position du drone ? J'ai le même problème (aucune réponse obtenue, px4 ne semble recevoir aucun message) même en définissant le champ header.stamp

moi aussi, mais le sujet /mavros/setpoint_raw/global a fonctionné normalement.

salut zxz0622,
Je travaille sur /mavros/setpoint_raw/global depuis environ 4 jours mais je ne pouvais pas déplacer le quadricoptère en donnant la valeur latitude longitude altitude. Pouvez-vous me dire comment vous faites s'il vous plaît ?
Pouvez-vous partager les paramètres du /mavros/setpoint_raw/global ? (coordonnées_cadre ...)

Désolé de déterrer un vieux fil, mais j'essaie de faire la même chose. Je ne parviens pas à contrôler le véhicule en envoyant des consignes de position sur _mavros/setpoint_position/global_. Le véhicule s'arme, s'assoit sur le sol, fait tourner les rotors et se désarme après le temps mort. Je peux confirmer que rostopic echo /mavros/setpoint_position/global montre que les points de consigne de mon code sont publiés. Je peux également confirmer que l'envoi de consignes de coordonnées locales sur _mavros/setpoint_position/global_ fonctionne parfaitement.
Suis-je censé définir un autre champ que lat, lon et lat ?

Version et plateforme MAVROS

Mavros : maître
ROS : mélodique
Ubuntu : 18.04
Type et version du pilote automatique

[ ] ArduPilot
[X] PX4

Version : maître

Diagnostique
un échantillon d'écho rostopique :
header: seq: 10 stamp: secs: 1861 nsecs: 652000000 frame_id: "base_footprint" pose: position: latitude: 19.1345485 longitude: 72.9122298 altitude: -48.3160189477 orientation: x: 0.0 y: 0.0 z: 0.0 w: 0.0
Juste curieux, le champ frame_id joue-t-il un rôle ? J'ai aussi essayé avec _local_origin_, sans effet.

Merci.

Assurez-vous de publier un point situé au-dessus de l'altitude du drone. Cela peut sembler une suggestion idiote, mais il est possible que l'on oublie que l'altitude GPS peut être bien au-dessus de l'altitude locale.

@swaroophangal J'ai également du mal à résoudre un problème similaire avec vous en utilisant un code donné par @tropappar ci-dessus.
C'est-à-dire qu'en envoyant à la position un point de consigne via "mavros/setpoint_position/global", le véhicule entre avec succès dans les bras hors-bord et même mais reste au sol.
J'ai également essayé d'envoyer une consigne de position "mavros/setpoint_raw/global", mais j'ai également échoué avec le même phénomène (c'est-à-dire que le véhicule entre avec succès en hors-bord et même dans les bras mais reste au sol.)

@burak-yildizoz De plus, j'ai revérifié que le point publié était au-dessus de l'altitude GPS du drone (le code donné par @tropappar ci-dessus a résolu ce problème en utilisant "goal_position.altitude = goal_position.altitude + 5.0;"). En particulier, j'ai joué avec le "+5" avec d'autres valeurs mais j'ai fini sans succès.

Quelqu'un pourrait-il aider?
Merci!

--
Version et plateforme MAVROS

Mavros : maître
ROS : cinétique
Ubuntu : 16.04
Type et version du pilote automatique

[ ] ArduPilot
[X] PX4

Version : maître

Diagnostique
un échantillon de rostopic echo /mavros/global_position/global :
entête:
séquence : 206
timbre:
secondes : 1286
ns : 2800000
frame_id : "base_link"
statut:
état : 0
service : 1
latitude: 47.3977421
longitude: 8.5455932
altitude : 535,327916774
position_covariance : [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]
position_covariance_type : 2

rqt_graph
rqt_graph

@ jungx148 Vous devez vérifier si votre fmu reçoit les points de consigne mavlink que vous envoyez.

@Jaeyoung-Lim Bonjour, merci beaucoup pour tous vos efforts pour la communauté Pixhawk et aussi pour la réponse rapide.

J'ai déjà signalé des problèmes pendant que je travaillais sur la conversion de votre projet "modudculab_ros" précédemment publié ( lien) qui a été conçu pour le contrôle local hors-bord en celui du contrôle global hors-bord.

En ce qui concerne votre commentaire, "Vous devez vérifier si votre fmu reçoit les points de consigne mavlink que vous envoyez", j'ai vérifié un paramètre, "POSITION_TARGET_GLOBAL_INT (lien) ", via QGC et j'ai remarqué qu'aucun point de consigne mavlink n'a été effectivement reçu par fmu comme vous l'avez indiqué comme le montre l'image ci-dessous capturée à partir de l'écran QGC.

QGC

De plus, j'ai joint la sortie de roslaunch modudculab_ros ctrl_pos_gazebo_offb.launch ci-dessous.

` sunghunjung2@gcs :~$ roslaunch modudculab_ros ctrl_pos_gazebo_offb.launch
... connexion à /home/sunghunjung2/.ros/log/c7421548-ea08-11ea-8a18-b052161d0343/roslaunch-gcs-16794.log
Vérification du répertoire du journal pour l'utilisation du disque. Cela peut prendre un peu de temps.
Appuyez sur Ctrl-C pour interrompre
Vérification de l'utilisation du disque du fichier journal. L'utilisation est <1 Go.

serveur roslaunch démarré http:// gcs :35869/

RÉSUMÉ

PARAMÈTRES

  • /mavros/conn_heartbeat : 5,0
  • /mavros/conn_timeout : 5.0
  • /mavros/fcu_url: udp://:14540@127....
  • /mavros/frame_id : monde
  • /mavros/gcs_url :
  • /mavros/mocap/use_pose : Faux
  • /mavros/mocap/use_tf : vrai
  • /mavros/startup_px4_usb_quirk : vrai
  • /mavros/target_component_id : 1
  • /mavros/target_system_id : 1
  • /rosdistro : cinétique
  • /rosversion : 1.12.15

NUDS
/
mavros (mavros/mavros_node)
offb_node (modudculab_ros/pub_setpoints_traj)

ROS_MASTER_URI= http://localhost :11311

processus[mavros-1] : démarré avec pid [16811]
process[offb_node-2] : démarré avec pid [16812]
`

--
Concernant ce problème, je soupçonne les deux parties suivantes.

SUSPECT 1 :
Je soupçonne que ce problème est lié à la version MAVROS installée sur mon bureau.
J'ai installé ros-kinetic-mavros* à l'aide de la commande apt et j'ai également enregistré le dernier package mavros git dans le dossier catkin_ws/src.

SUSPECT 2 :
Quand j'ai utilisé

ros::Publisher goal_pos_pub = nh.advertise < mavros_msgs::GlobalPositionTarget > ("mavros/setpoint_position/global", 10); ,

j'ai reçu le message d'erreur suivant

[ERROR] [1598713832.833795288, 426.168000000]: Client [/mavros] wants topic /mavros/setpoint_position/global to have datatype/md5sum [geographic_msgs/GeoPoseStamped/cc409c8ed6064d8a846fa207bf3fba6b], but our version has [mavros_msgs/GlobalPositionTarget/076ded0190b9e045f9c55264659ef102]. Dropping connection.

Et puis, je l'ai remplacé par

ros::Publisher goal_pos_pub = nh.advertise < mavros_msgs::GlobalPositionTarget > ("geographic_msgs/GeoPoseStamped", 10);

et cela n'a généré aucun message d'erreur. Cependant, dans les deux cas, le paramètre "POSITION_TARGET_GLOBAL_INT" n'apparaît pas dans l'inspecteur mavlink de QGC.

Encore une fois, merci beaucoup pour le temps précieux que vous avez consacré à l'examen de ce problème.

Je ne pouvais pas résoudre le problème ci-dessus, et je change donc pour utiliser mavros_msgs pour extraire des points de cheminement de QGC, insérer un angle de lacet calculé en externe et pousser des points de cheminement combinés (points de cheminement extraits de QGC avec un angle de lacet calculé en externe).

De cette façon, je pouvais contrôler avec succès MAV comme je le voulais. Merci beaucoup.

@ jungx148 Ce n'est pas la solution et juste une solution de contournement.

Avez-vous vérifié si les points de consigne que vous envoyez atteignent le fmu ?

@jungx148 Est-il possible que votre problème soit lié à #1414 ?

Est-ce que quelqu'un est déjà arrivé à une conclusion ??

J'ai essayé de publier sur ces 3 sujets mais sans succès

"/mavros/setpoint_raw/global"
"/mavros/setpoint_raw/target_global"
"/mavros/setpoint_position/global"

NB : je fais une simulation de gazebo uniquement

Eh bien, j'ai récemment trouvé cette erreur:

Eh bien, le sujet /mavros/setpoint_position/global a finalement fonctionné (mais avec un décalage d'altitude ?). À partir de rostopic info /mavros/setpoint_position/global j'ai découvert que le type de message avec lequel je devrais travailler est Geographic_msgs/GeoPoseStamped et non mavros_msgs/GlobalPositionTarget Je ne sais pas pourquoi la documentation n'est pas mise à jour.

J'essaie également de faire la même manœuvre, c'est-à-dire de publier le message mavros_msgs::GlobalPositionTarget sur le sujet mavros/setpoint_raw/global et cela fonctionne bien. Le drone décolle et se dirige vers le waypoint souhaité. Je voulais demander si quelqu'un a réussi à diriger le drone vers plusieurs points de cheminement et si nous avons besoin d'une logique pour vérifier si le point de cheminement est atteint ?
La raison pour laquelle je pose cette question est que je ne sais pas comment le belvédère définit sa position d'origine, donc lorsque le drone va à n'importe quel alt lat lon aléatoire fourni, il va à ce waypoint indéfiniment. Existe-t-il un moyen de vérifier si ce point de cheminement est atteint, puis de fournir un autre point de cheminement ?
Toutes les suggestions seraient très appréciées.
Merci d'avance.

J'essaie également de faire la même manœuvre, c'est-à-dire de publier le message mavros_msgs::GlobalPositionTarget sur le sujet mavros/setpoint_raw/global et cela fonctionne bien. Le drone décolle et se dirige vers le waypoint souhaité. Je voulais demander si quelqu'un a réussi à diriger le drone vers plusieurs points de cheminement et si nous avons besoin d'une logique pour vérifier si le point de cheminement est atteint ?
La raison pour laquelle je pose cette question est que je ne sais pas comment le belvédère définit sa position d'origine, donc lorsque le drone va à n'importe quel alt lat lon aléatoire fourni, il va à ce waypoint indéfiniment. Existe-t-il un moyen de vérifier si ce point de cheminement est atteint, puis de fournir un autre point de cheminement ?
Toutes les suggestions seraient très appréciées.
Merci d'avance.

Continuez simplement à publier les points de consigne de position globale jusqu'à ce que le drone se trouve dans une région acceptable, comme ~ 50 cm dans le plan xy et 10 cm dans l'axe z. Ensuite, publiez un autre point.

N'a pas tout à fait suivi. Pourriez-vous s'il vous plaît envoyer un exemple de code simple afin que je puisse avoir une idée? J'ai essayé quelques trucs mais ça n'a pas fonctionné. Axe Z 10cm ou m ?
Merci.

N'a pas tout à fait suivi. Pourriez-vous s'il vous plaît envoyer un exemple de code simple afin que je puisse avoir une idée? J'ai essayé quelques trucs mais ça n'a pas fonctionné. Axe Z 10cm ou m ?
Merci.

Je l'ai écrit juste pour vous donner une idée. Abonnez-vous à la position globale, soit convertissez en coordonnées cartésiennes ou ayez simplement un seuil en degrés lat/lon autour de 1e-6 de sorte que la différence entre le drone et le point souhaité soit inférieure à un seuil. Vous devez traiter l'altitude différemment, car sa valeur n'est pas en degrés mais en mètres. Si le drone est à l'intérieur d'une boîte, waypoint atteint.

Actuellement, j'utilise sensor_msgs::NavSatFix pour obtenir la position du drone. Quand vous dites, abonnez-vous à la position globale, parlez-vous de cet abonné ?
De plus, il serait vraiment utile que vous puissiez expliquer un peu comment créer un seuil en degrés lat/lon autour de 0,000001 et comment vérifier si le drone est à l'intérieur de la boîte ?
Si vous l'avez déjà mis en œuvre, pourriez-vous s'il vous plaît partager un petit extrait de la logique que vous mentionnez ? Cela rendrait les choses beaucoup plus faciles.
Merci beaucoup.

Bonjour à tous,
Si quelqu'un a résolu la navigation d'un drone avec plusieurs waypoints dans le cadre global, pourriez-vous jeter un œil à [ https://github.com/mavlink/mavros/issues/1553 } et m'aider à résoudre le problème. J'essaie de le mettre en œuvre depuis quelques semaines mais je n'arrive pas à trouver de solution. Je veux juste diriger le drone en utilisant lat lon alt vers plusieurs waypoints.
Merci d'avance.

Cette page vous a été utile?
0 / 5 - 0 notes