Mavros: QGroundControl рдХреЛ MAVLink рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 14 рдЬреБрд▓ре░ 2016  ┬╖  14рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: mavlink/mavros

рдирдорд╕реНрддреЗ!

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣рд╡рд╛рдИ рдЬрд╣рд╛рдЬ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рд╣реИ, рдЬреЛ рдЖрд░рдУрдПрд╕ рд╡рд┐рд╖рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреБрдЫ рдЙрдбрд╝рд╛рди рдЬрд╛рдирдХрд╛рд░реА рднреЗрдЬрддрд╛ рд╣реИред рдореИрдВ рдЗрд╕реЗ рд▓реЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ MAVLink рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ QGroundControl рдкрд░ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдирдХрд▓реА рдмреИрдЯрд░реА рд╕реНрдерд┐рддрд┐ (mavros_msgs/BatteryStatus.msg) рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛:

1 - рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ gcs_url = udp://:[email protected] :14551 рдХреЗ рд╕рд╛рде mavros_node
2 - рдореИрдВ рдЕрдкрдирд╛ рдиреЛрдб рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рдЬреЛ рдмреИрдЯрд░реА рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ:

#include <ros/ros.h>
#include <mavros_msgs/BatteryStatus.h>

int main(int argc, char *argv[])

{
    ros::init(argc, argv, "battery_node");
    ros::NodeHandle n;
    ros::Publisher battery_pub = n.advertise<mavros_msgs::BatteryStatus>("/mavros/battery", 1000);
    ros::Rate loop_rate(10);

    while (ros::ok())
    {
        mavros_msgs::BatteryStatus baterry_msg;

        baterry_msg.voltage = 5;
        baterry_msg.current = 0.5;
        baterry_msg.remaining = 0.36;

        battery_pub.publish(baterry_msg);

        ros::spinOnce();
        loop_rate.sleep();
    }
    return 0;
}

3 - рдореИрдВ QGroundControl рдХреЛ UDP рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ: 127.0.0.1:14551

... рдФрд░ рдХреБрдЫ рдирд╣реАрдВ рд╣реЛрддрд╛ =/

рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдорд╛рд╡рд░реЛрд╕ рдФрд░ рдХреНрдпреВрдЬреАрд╕реА рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд░ рдореИрдВ 127.0.0.1:14540 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдордПрд╡реАрдкреНрд░реЛрдХреНрд╕реА рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд┐рдореБрд▓реЗрд╢рди рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рддреЛ рдорд╛рд╡рд░реЛрд╕ рдХреЛ "рдкреБрд▓" рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рд╡рд╛рдИ рдЬрд╣рд╛рдЬ рдХреЛ рдорд╛рдиреНрдпрддрд╛ рджреА рдЬрд╛рддреА рд╣реИред

рдореИрдВ рдХреНрдпрд╛ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ?

рдореИрдВ рдЙрдмрдВрдЯреВ 14, рдЖрд░рдУрдПрд╕ рдЗрдВрдбрд┐рдЧреЛ рдФрд░ рдХреНрдпреВрдЬреАрд╕реА 2.9.7 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдЕрдЧреНрд░рд┐рдо рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж,
рдкрд╛рдмреНрд▓реЛ

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдХрд╕реНрдЯрдо gcs_bridge рд▓рд┐рдЦрдирд╛ рднреА рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣рд╛рдВ рдЖрдкрдХреЗ рдкрд╛рд╕ MAVConnInterface рдХреНрд▓рд╛рд╕ рд╣реИ, рдЬрд╣рд╛рдВ рдЖрдк рдЕрдкрдирд╛ рд╕рдВрджреЗрд╢ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ:

auto gcs_link = MAVConnInterface::open_url("udp-b://@");

mavlink::common::msg::HEARTBEAT hb{};
// fill hb

gcs_link->send_message_ignore_drop(hb);

рд╕рднреА 14 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

sys_status : рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдорд╛рд╡рд░реЛрд╕ _publisher_ рд╣реИ, рдЧреНрд░рд╛рд╣рдХ рдирд╣реАрдВред

рд╣реИрд▓реЛ рд╡реВрди,

рдЖрдкрдХреЗ рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рд╕рдВрджреЗрд╢ рдирд╣реАрдВ рднреЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ ROS рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдФрд░ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпрд╛ рдореИрдВ рд╕рд╣реА рд╣реВрдБ?

рдХреНрдпрд╛ рдореИрдВ рдЙрди рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП _mavlink/to_ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?
рдореИрдВ рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рдерд╛?

рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдзрдиреНрдпрд╡рд╛рдж!

mavlink/to FCU, рдирд╣реАрдВ GCS рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдЖрдк gcs_bridge рдиреЛрдб рдФрд░ mavlink/from рд╡рд┐рд╖рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдлрд┐рд░ рд╕реЗ рдирдорд╕реНрдХрд╛рд░,

рдареАрдХ рд╣реИ, рдореИрдВрдиреЗ рдХреЛрдб рдмрджрд▓ рджрд┐рдпрд╛ рддрд╛рдХрд┐ рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рджрд┐рд▓ рдХреА рдзрдбрд╝рдХрди рд╕рдВрджреЗрд╢ рднреЗрдЬреЗ:

#include <ros/ros.h>
#include <mavros_msgs/Mavlink.h>

int main(int argc, char **argv){

    ros::init(argc, argv, "hertbeat_publisher");
    ros::NodeHandle n;

    ros::Publisher example_pub = n.advertise<mavros_msgs::Mavlink>("/mavlink/from", 1000);
    ros::Rate loop_rate(1); // 1 Hz

    mavros_msgs::Mavlink mavlink_msg;

    mavlink_msg.len = 2;
    mavlink_msg.sysid = 1;
    mavlink_msg.compid = 1;
    mavlink_msg.msgid = 0;

    std::vector<long unsigned int> payload64(7, 0);

    mavlink_msg.payload64 = payload64;

    while (ros::ok())
    {
        mavlink_msg.header.stamp = ros::Time::now();
        if (mavlink_msg.seq < 255){
            mavlink_msg.seq++;
        }
        else {mavlink_msg.seq = 0;}

        // publish message
        example_pub.publish(mavlink_msg);

        ros::spinOnce();
        loop_rate.sleep();
    }
    return 0;
}

1 - рдореИрдВ fcu_url=udp://:14540@ рдФрд░ gcs_url = udp://:[email protected] :14551 рдХреЗ рд╕рд╛рде рд╣реВрдВ :

[ INFO] [1468659493.280504313]: FCU URL: udp://:14540@
[ INFO] [1468659493.289025098]: udp0: Bind address: 0.0.0.0:14540
[ INFO] [1468659493.289457240]: GCS URL: udp://:[email protected]:14551
[ INFO] [1468659493.289691565]: udp1: Bind address: 0.0.0.0:14570
[ INFO] [1468659493.289824558]: udp1: Remote address: 127.0.0.1:14551
...
[ INFO] [1468659494.906066742]: MAVROS started. MY ID 1.240, TARGET ID 1.1

2 - рдореИрдВ gcs_bridge рдХреЛ gcs_url рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рддрд╛ рд╣реВрдВ:='udp://@127.0.0.1', рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

[ INFO] [1468659758.392659411]: udp0: Bind address: 0.0.0.0:14555
[ INFO] [1468659758.392800665]: udp0: Remote address: 127.0.0.1:14550

3 - рдореИрдВ рдЙрдкрд░реЛрдХреНрдд рдиреЛрдб рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, 1 рд╣рд░реНрдЯреНрдЬ рдкрд░/рдорд╛рд╡рд▓рд┐рдВрдХ/рд╕реЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддрд╛ рд╣реВрдВред
4 - рдореИрдВ рд╕рд┐рд╕реНрдЯрдо рдЖрдИрдбреА 1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ QGroundControl usign UDP 127.0.0.1:14550 рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реВрдВ

... рдФрд░ рдлрд┐рд░ рд╕реЗ MAVLink рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдЦрд╛рд▓реА рд╣реИред

рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░, QGroundControl рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдлреЗрдВрдХрддрд╛ рд╣реИ:

рдПрдХ MAVLink рд╕рдВрд╕реНрдХрд░рдг рдпрд╛ рдмреЙрдб рджрд░ рдмреЗрдореЗрд▓ рд╣реИред рдХреГрдкрдпрд╛ рдЬрд╛рдВрдЪ рд▓реЗрдВ рдХрд┐ QGroundControl рдФрд░ рдЖрдкрдХреЗ рдСрдЯреЛрдкрд╛рдпрд▓рдЯ рдХреА рдмреЙрдб рджрд░реЗрдВ рд╕рдорд╛рди рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рддрд░рд╣ QGC рдЗрд╕ рддреНрд░реБрдЯрд┐ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ UDP рдкреЛрд░реНрдЯ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред

рдореИрдВ рдХреНрдпрд╛ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ?

рдзрдиреНрдпрд╡рд╛рдж!

a) рдорд╛рд╡рд░реЛрд╕ рдХреЗ gcs_url рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ! рдЖрдкрдХреЛ gcs_bridge рдХрдиреЗрдХреНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП!
b) Mavlink.msg рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦрд░рд╛рдм рдХреЛрдбред рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

mavlink::common::msg::HEARTBEAT hb{};
...

mavlink::mavlink_message_t msg;
mavlink::MsgMap map(msg);

hb.serialize(map);
mavlink::finalize_message_buffer(&msg, sysid, compid, ...);

mavros_msgs::Mavlink ml;
mavros_msgs::mavlink::convert(msg, ml);

рджреЗрдЦреЛ:

рдирдорд╕реНрддреЗ!

рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВрдиреЗ рдЖрдЦрд┐рд░рдХрд╛рд░ рдЗрд╕реЗ рдХрд╛рдо рдХрд░ рд▓рд┐рдпрд╛ред рдореИрдВрдиреЗ рд╡рд┐рднрд┐рдиреНрди рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЗрдВрдбрд┐рдЧреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдпрд╣рд╛рдВ рдХреЛрдб рдЫреЛрдбрд╝рддрд╛ рд╣реВрдВ, рдЕрдЧрд░ рдХреЛрдИ рдФрд░ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдореИрдВ рдПрдХ рджрд┐рд▓ рдХреА рдзрдбрд╝рдХрди рдФрд░ рдПрдХ рдКрдВрдЪрд╛рдИ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реВрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ QGroundControl рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВ:

1- fcu_url=udp://:14540@ рдФрд░ gcs_url= udp://:[email protected] :14551 рдХреЗ рд╕рд╛рде рдорд╛рд╡рд░реЛрд╕ рдиреЛрдб рд▓реЙрдиреНрдЪ рдХрд░реЗрдВред
2- gcs_bridge рдХреЛ gcs_url:=udp://@127.0.0.1:14560 рдХреЗ рд╕рд╛рде рд▓реЙрдиреНрдЪ рдХрд░реЗрдВред
3- рдЗрд╕ рдиреЛрдб рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ:

#include <ros/ros.h>
#include <mavconn/interface.h>
#include <mavros_msgs/Mavlink.h>
#include <mavros_msgs/mavlink_convert.h>

// General parameters
uint8_t system_id = 1;
uint8_t component_id = 1;
uint8_t type = 1;
uint8_t autopilot = 0;
uint8_t base_mode = 128;
uint32_t custom_mode = 0;
uint8_t system_status = 0;

// Parameters of the altitude message
float alt_monotonic = 10.0;
float alt_amsl = 100;
float alt_local = 10.0;
float alt_relative = 10.0;
float alt_terrain = 10;
float bottom_clearance = 0;

int main(int argc, char **argv){

    // Create heartbeat message
    mavlink_message_t msg_heartbeat;
    mavlink_msg_heartbeat_pack(system_id, component_id, &msg_heartbeat, type, autopilot, base_mode, custom_mode, system_status);

    mavros_msgs::Mavlink ml_heartbeat;
    mavros_msgs::mavlink::convert(msg_heartbeat, ml_heartbeat);

    // Create altitude message
    mavlink_message_t msg_altitude;
    mavros_msgs::Mavlink ml_altitude;

    ros::init(argc, argv, "telemetry_publisher");
    ros::NodeHandle n;

    ros::Publisher example_pub = n.advertise<mavros_msgs::Mavlink>("/mavlink/from", 1000);
    ros::Rate loop_rate(1); // 1 Hz

    while (ros::ok())
    {
        uint64_t time_stamp = ros::Time::now().nsec;

        // Finish altitude message
        mavlink_msg_altitude_pack(system_id, component_id, &msg_altitude, time_stamp, alt_monotonic, alt_amsl, alt_local, alt_relative, alt_terrain, bottom_clearance);
        mavros_msgs::mavlink::convert(msg_altitude, ml_altitude);

        // Publish messages
        example_pub.publish(ml_heartbeat);
        example_pub.publish(ml_altitude);

        ros::spinOnce();
        loop_rate.sleep();
    }
    return 0;
}

4- QGroundControl рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ рдФрд░ 127.0.0.1:14560 . рдкрд░ рдХрдиреЗрдХреНрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ

рдпрджрд┐ рдЖрдк рдорд╛рд╡рд▓рд┐рдВрдХ рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд▓рдЧрднрдЧ ~1Hz рдкрд░ рджрд┐рд▓ рдХреА рдзрдбрд╝рдХрди рдФрд░ рдКрдВрдЪрд╛рдИ рд╕рдВрджреЗрд╢ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдХреНрдпрд╛ рдХреЛрдИ рдореЗрд░реА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ?
рдЬрдм #рд╢рд╛рдорд┐рд▓ рд╣реЛ рддреЛ mavlink_msg_heartbeat_pack рдлрд╝рдВрдХреНрд╢рди рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПрд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реБрдЖ...
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ cmake рдореЗрдВ рдЧрд▓рдд рдерд╛?

#include "ros/ros.h"
#include <mavros_msgs/mavlink_convert.h>
#include <mavconn/interface.h>

int main(int argc, char **argv)
{
    ros::init(argc, argv, "talker");
    ros::NodeHandle n;
    ros::Publisher pub = n.advertise<mavros_msgs::Mavlink>("/mavlink/from", 1000);
    ros::Rate loop_rate(10);

    uint8_t system_id = 1;
    uint8_t component_id = 1;
    uint8_t type = 1;
    uint8_t autopilot = 0;
    uint8_t base_mode = 128;
    uint32_t custom_mode = 0;
    uint8_t system_status = 0;
    mavlink_message_t msg;
    mavlink_msg_heartbeat_pack(system_id, component_id, &msg, type, autopilot, base_mode, custom_mode, system_status);
  return 0;
}
cmake_minimum_required(VERSION 2.8.3)
project(talker)

find_package(catkin REQUIRED COMPONENTS mavros mavros_msgs mavlink)
catkin_package()
include(EnableCXX11)
include(MavrosMavlink)
include_directories(
  ${catkin_INCLUDE_DIRS}
  ${mavlink_INCLUDE_DIRS}
)

add_executable(talker talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})

рддреНрд░реБрдЯрд┐: 'mavlink_message_t' рдЗрд╕ рджрд╛рдпрд░реЗ рдореЗрдВ рдШреЛрд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
mavlink_message_t рд╕рдВрджреЗрд╢;
рддреНрд░реБрдЯрд┐: 'mavlink_msg_heartbeat_pack' рдЗрд╕ рджрд╛рдпрд░реЗ рдореЗрдВ рдШреЛрд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
mavlink_msg_heartbeat_pack(system_id, component_id, &msg, type, autopilot, base_mode, custom_mode, system_status);

@shawinmihail рдорд╛рд╡рд░реЛрд╕ рдХрд╛ рдХреМрди рд╕рд╛ рд╕рдВрд╕реНрдХрд░рдг? 0.18+ рдореЗрдВ рдХреЗрд╡рд▓ mavlink_helpers.h рдФрд░ C++11 lib рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗред

рдореБрдЭреЗ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓ рдЧрдпрд╛ рд╣реИред рд╢рд╛рдпрдж, рдорд╛рд╡рд░реЛрд╕ v0.18+ рдХреЗрд╡рд▓ рдорд╛рд╡рд▓рд┐рдВрдХ v2.0 рд╣реЗрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдХреЛрдИ рднреА рд╕рдВрджреЗрд╢ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ msg_name_pack () рдХреЗ рдмрдЬрд╛рдп MsgMap.serialize () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

    mavlink::mavlink_message_t msg;
    mavlink::MsgMap map(msg);
    mavlink::groupcontrol::msg::GROUP_COEFFS_PART1 msgPart1 //my custom msg;

    msgPart1.kc = kc;
    msgPart1.ks = ks;
        //........................... - fill msg

         msgPart1.serialize(map);
    map.reset();
    auto mi = msgPart1.get_message_info();
    mavlink::mavlink_finalize_message(&msg, system_id, component_id, mi.min_length, mi.length, mi.crc_extra);

    mavros_msgs::Mavlink mavrosMsg;
    mavros_msgs::mavlink::convert(msg, mavrosMsg);

рд╢рд╛рдпрдж рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдЗрд╕реЗ рд▓рд┐рдЦреЗрдВред
рд╕рдВрдХреЗрдд рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

Message::serialize() рдХрд░рддрд╛ рд╣реИ MsgMap::reset() , рдЗрд╕реЗ рд╕реАрдзреЗ рдХреЙрд▓ рди рдХрд░реЗрдВ! рдпрд╣ рд╕рдВрджреЗрд╢ рддреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИред

рдХрд╕реНрдЯрдо gcs_bridge рд▓рд┐рдЦрдирд╛ рднреА рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣рд╛рдВ рдЖрдкрдХреЗ рдкрд╛рд╕ MAVConnInterface рдХреНрд▓рд╛рд╕ рд╣реИ, рдЬрд╣рд╛рдВ рдЖрдк рдЕрдкрдирд╛ рд╕рдВрджреЗрд╢ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ:

auto gcs_link = MAVConnInterface::open_url("udp-b://@");

mavlink::common::msg::HEARTBEAT hb{};
// fill hb

gcs_link->send_message_ignore_drop(hb);

@vooon , рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рдорд╛рд╡рд▓рд┐рдВрдХ v1.0 рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рд╛рде рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЕрдм рдореИрдВ рдирдпрд╛ рдмрдирд╛рддрд╛ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реВрдВ, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!

#include "ros/ros.h"
#include <mavros_msgs/mavlink_convert.h>
#include <mavconn/interface.h>
#include <iostream>
#include <mavlink/v2.0/mavlink_helpers.h>


float kc = 0.0f; /*< gravity coeff */
float ks = 0.0f; /*< repulsive coeff */
float ka = 0.0f; /*< speed alignment coeff */
float kp = 0.0f; /*< chasing coeff */
float km = 0.0f; /*< waypoint gravity coeff */
float kh = 0.0f; /*< rotate speed coeff */
float vmax = 0.0f; /*< max autopilot velocity */
float rn = 0.0f; /*< search radius of groupmate  */
float rs = 0.0f; /*< repulsiveOn radius */
float rm = 0.0f; /*< getting waypoint radius */
float rmb = 0.0f; /*< change gravity law radius */

void packMavlinkMessage(const mavlink::Message& mavMsg, mavros_msgs::Mavlink &rosMsg)
{
    mavlink::mavlink_message_t msg;
    mavlink::MsgMap map(msg);
    mavMsg.serialize(map);
    auto mi = mavMsg.get_message_info();

    mavlink::mavlink_status_t *status = mavlink::mavlink_get_channel_status(mavlink::MAVLINK_COMM_0);
    status->flags |= MAVLINK_STATUS_FLAG_OUT_MAVLINK1;
    mavlink::mavlink_finalize_message_buffer(&msg, 1, 1, status, mi.min_length, mi.length, mi.crc_extra);

    mavros_msgs::mavlink::convert(msg, rosMsg);
}

void mavlinkCallback(const mavros_msgs::Mavlink& msg)
{
    mavlink::mavlink_message_t mavMsg;
    mavros_msgs::mavlink::convert(msg, mavMsg);

    if(mavMsg.msgid == mavlink::groupcontrol::msg::SET_GROUP_PARAMS::MSG_ID)
    {
        ROS_WARN("SET GROUP_PARAMS");
        mavlink::MsgMap map(mavMsg);
        mavlink::groupcontrol::msg::SET_GROUP_PARAMS setParamsMsg;
        setParamsMsg.deserialize(map);

        std::cout << setParamsMsg.kc;
    }
}

int main(int argc, char **argv)
{
    ros::init(argc, argv, "talker");
    ros::NodeHandle n;
    ros::Publisher pub = n.advertise<mavros_msgs::Mavlink>("/mavlink/from", 1000);
    ros::Subscriber sub = n.subscribe("mavlink/to", 1000, mavlinkCallback);
    ros::Rate loop_rate(10);

    ROS_INFO("%s", "Talker started");

    mavlink::groupcontrol::msg::GROUP_PARAMS msgPart1;
    msgPart1.kc = kc;
    msgPart1.ks = ks;
    msgPart1.ka = ka;
    msgPart1.kp = kp;
    msgPart1.km = km;
    msgPart1.kh = kh;
    msgPart1.vmax = vmax;
    msgPart1.rn = rn;
    msgPart1.rs = rs;
    msgPart1.rm = rm;
    msgPart1.rmb = rmb;

    while (ros::ok())
    {
        mavros_msgs::Mavlink mavrosMsg;
        packMavlinkMessage(msgPart1, mavrosMsg);
        pub.publish(mavrosMsg);
        ros::spinOnce();
        loop_rate.sleep();
    }


  return 0;
}

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреЛрдИ рдореЗрд░реА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИ
рдореИрдВ рдЕрдЬрдЧрд░ рд╕реЗ рдРрд╕рд╛ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
рдорд╛рд╡рд▓рд┐рдВрдХ рд╕рдВрджреЗрд╢ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдорд╛рд╡рд░реЛрд╕ рд╕рдВрджреЗрд╢ рдореЗрдВ рдмрджрд▓реЗрдВ?

рдХрд╕реНрдЯрдо gcs_bridge рд▓рд┐рдЦрдирд╛ рднреА рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣рд╛рдВ рдЖрдкрдХреЗ рдкрд╛рд╕ MAVConnInterface рдХреНрд▓рд╛рд╕ рд╣реИ, рдЬрд╣рд╛рдВ рдЖрдк рдЕрдкрдирд╛ рд╕рдВрджреЗрд╢ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ:

auto gcs_link = MAVConnInterface::open_url("udp-b://@");

mavlink::common::msg::HEARTBEAT hb{};
// fill hb

gcs_link->send_message_ignore_drop(hb);

рдпрд╣ рд╡рд┐рдзрд┐ рдХреЗрд╡рд▓ рдХрд╕реНрдЯрдо рд╕рдВрджреЗрд╢ рднреЗрдЬ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдХреЛрдИ рдЬреЛрдЦрд┐рдо рд╣реИ? @рд╡реВрди

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

jannsta1 picture jannsta1  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

SubMishMar picture SubMishMar  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

fionachui picture fionachui  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mtsakaguchi picture mtsakaguchi  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mohand150 picture mohand150  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ