рдирдорд╕реНрддреЗ!
рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣рд╡рд╛рдИ рдЬрд╣рд╛рдЬ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рд╣реИ, рдЬреЛ рдЖрд░рдУрдПрд╕ рд╡рд┐рд╖рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреБрдЫ рдЙрдбрд╝рд╛рди рдЬрд╛рдирдХрд╛рд░реА рднреЗрдЬрддрд╛ рд╣реИред рдореИрдВ рдЗрд╕реЗ рд▓реЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ 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 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдЕрдЧреНрд░рд┐рдо рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж,
рдкрд╛рдмреНрд▓реЛ
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);
рдпрд╣ рд╡рд┐рдзрд┐ рдХреЗрд╡рд▓ рдХрд╕реНрдЯрдо рд╕рдВрджреЗрд╢ рднреЗрдЬ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдХреЛрдИ рдЬреЛрдЦрд┐рдо рд╣реИ? @рд╡реВрди
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдХрд╕реНрдЯрдо
gcs_bridge
рд▓рд┐рдЦрдирд╛ рднреА рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣рд╛рдВ рдЖрдкрдХреЗ рдкрд╛рд╕MAVConnInterface
рдХреНрд▓рд╛рд╕ рд╣реИ, рдЬрд╣рд╛рдВ рдЖрдк рдЕрдкрдирд╛ рд╕рдВрджреЗрд╢ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ: