Mavros: QGroundControl์— MAVLink ๋ฉ”์‹œ์ง€ ๋ณด๋‚ด๊ธฐ

์— ๋งŒ๋“  2016๋…„ 07์›” 14์ผ  ยท  14์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: mavlink/mavros

์•ˆ๋…•!

ROS ์ฃผ์ œ๋ฅผ ํ†ตํ•ด ์ผ๋ถ€ ๋น„ํ–‰ ์ •๋ณด๋ฅผ ๋ณด๋‚ด๋Š” ๋น„ํ–‰๊ธฐ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 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

... ๊ทธ๋ฆฌ๊ณ  ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค =/

mavros์™€ QGC ๊ฐ„์˜ ์—ฐ๊ฒฐ์ด ์ž‘๋™ํ•œ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. 127.0.0.1:14540์„ ํ†ตํ•ด MAVProxy๋กœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์‹คํ–‰ํ•˜๊ณ  mavros๋ฅผ "๋ธŒ๋ฆฌ์ง€"๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋น„ํ–‰๊ธฐ๊ฐ€ ์ธ์‹๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ญ˜ ์ž˜๋ชปํ•˜๊ณ  ์žˆ์ฃ ?

Ubuntu 14, ROS Indigo ๋ฐ QGC 2.9.7์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
ํŒŒ๋ธ”๋กœ

question

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋˜ํ•œ MAVConnInterface ํด๋ž˜์Šค๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž ์ •์˜ gcs_bridge ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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 : ๋ณด์‹œ๋‹ค์‹œํ”ผ mavros๋Š” ๊ตฌ๋…์ž๊ฐ€ ์•„๋‹Œ _publisher_์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” voun๋‹˜

๋‹ต๋ณ€ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ž˜ ์ดํ•ดํ–ˆ๋‹ค๋ฉด ์ด ๋ฉ”์‹œ์ง€๋Š” ๋ณด๋‚ผ ์ˆ˜ ์—†๊ณ , ROS์—์„œ๋งŒ ์ˆ˜์‹ ํ•ด์„œ ๋ณด์—ฌ์ฃผ๋Š”๋ฐ ๋งž๋‚˜์š”?

๊ทธ๋Ÿฐ ๋‹ค์Œ _mavlink/to_๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
์–ด๋–ป๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‹ค์‹œ ํ•œ๋ฒˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

mavlink/to ๋Š” GCS๊ฐ€ ์•„๋‹Œ FCU์— ๋ฉ”์‹œ์ง€ ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ 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_url:='udp://@127.0.0.1'๋กœ gcs_bridge๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋‹ค์Œ์„ ์–ป์Šต๋‹ˆ๋‹ค.

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

3 - ์œ„์˜ ๋…ธ๋“œ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ 1Hz์—์„œ /mavlink/from์— ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค.
4 - ์‹œ์Šคํ…œ ID 1์„ ์‚ฌ์šฉํ•˜์—ฌ UDP 127.0.0.1:14550์„ ์‚ฌ์šฉํ•˜์—ฌ QGroundControl์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

... ๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ 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);

๋ณด๋‹ค:

์•ˆ๋…•!

๊ฐ์‚ฌ! ๋“œ๋””์–ด ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. Indigo๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ •ํ™•ํžˆ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ถ๊ธˆํ•ดํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ์—ฌ๊ธฐ์— ์ฝ”๋“œ๋ฅผ ๋‚จ๊น๋‹ˆ๋‹ค. ํ•˜ํŠธ๋น„ํŠธ์™€ ๊ณ ๋„ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ณ  QGroundControl์—์„œ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค.

1- fcu_url=udp://:14540@ ๋ฐ gcs_url= udp://:[email protected] :14551๋กœ mavros ๋…ธ๋“œ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
2- gcs_url:=udp://@127.0.0.1:14560์œผ๋กœ gcs_bridge๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
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์—์„œ ์—ฐ๊ฒฐ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

MavLink Inspector๋ฅผ ์—ด๋ฉด ๋Œ€๋žต ~1Hz์—์„œ ํ•˜ํŠธ๋น„ํŠธ์™€ ๊ณ ๋„ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ์‹œ๋„ํ•˜์ง€๋งŒ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์™œ ๊ทธ๋Ÿฐ์ง€ ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๋„ ๋‚˜๋ฅผ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
mavlink_msg_heartbeat_pack ํ•จ์ˆ˜๋Š” #include ๋•Œ ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ์•Š์•˜๋‹ค...
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, ์œ ํ˜•, ์ž๋™ ์กฐ์ข… ์žฅ์น˜, base_mode, custom_mode, system_status);

@shawinmihail mavros์˜ ๋ฒ„์ „์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? 0.18+์—๋Š” mavlink_helpers.h ๋ฐ C++11 lib๋งŒ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

๋‚ด ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ mavros v0.18+๋Š” mavlink 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);

์–ด์ฉŒ๋ฉด ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด pls๋ฅผ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค.
ํžŒํŠธ๋ฅผ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

Message::serialize() ๋Š” MsgMap::reset() ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ์ง์ ‘ ํ˜ธ์ถœํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค! ๋ฉ”์‹œ์ง€๊ฐ€ ๊นจ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ MAVConnInterface ํด๋ž˜์Šค๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž ์ •์˜ gcs_bridge ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

gcs_link->send_message_ignore_drop(hb);

@vooon , ๋Œ“๊ธ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์†”๋ฃจ์…˜์ด mavlink 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;
}

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‚˜๋ฅผ ๋„์šธ ์ˆ˜ ์žˆ๊ณ  ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ํŒŒ์ด์ฌ์—์„œ ์–ด๋–ป๊ฒŒ ๊ฐ™์€ ์ผ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
mavlink msg๋ฅผ ์ƒ์„ฑํ•˜๊ณ  mavros msg๋กœ ๋ณ€ํ™˜ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ MAVConnInterface ํด๋ž˜์Šค๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž ์ •์˜ gcs_bridge ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

gcs_link->send_message_ignore_drop(hb);

์ด ๋ฐฉ๋ฒ•์€ ๋‹จ์ˆœํžˆ ์‚ฌ์šฉ์ž ์ง€์ • ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๊นŒ? @vooon

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰