์คํ ๋ณด๋ ์ ์ด ์์ (๊ฐ์ ๋ณด์์ ์ ์๋ ํจ)๋ฅผ ๋ณต์ ํ๋ ค๊ณ ํ์ง๋ง ๋ก์ปฌ x, y, z ๋์ ์ ์ญ ์ขํ๋ฅผ ๋ณด๋
๋๋ค.
๊ทธ๋ ๊ฒ ํ ์ ์์ต๋๋ค. ๋๋ก ์ด "Offboard Enabled"๋ฃจํ์ ๋ค์ด๊ฐ์ง๋ง Vehicle Armed์ ๋ค์ด๊ฐ๊ฑฐ๋ ์ ํ ์์ง์ด์ง ์์ต๋๋ค.
์ด๊ฒ์ ๋ด๊ฐ ์ฌ์ฉํ๋ ์ฝ๋์ ๋๋ค.
#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;
}
๋ง ๋ธ๋ก์ค : 0.22
ROS : ํค๋คํฑ
Ubuntu : 16.04
[] ArduPilot
[X] PX4
๋ฒ์ : 1.72
[ 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
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"
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
๋จผ์ while(ros::ok() && current_state.connected){
๋ while(ros::ok() && !current_state.connected){
์ด์ด์ผํฉ๋๋ค.
๋ํ-https: //github.com/mavlink/mavros/blob/master/mavros/src/plugins/setpoint_position.cpp#L69-$ global_position/global
์ฃผ์ ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์๋์ง ํ์ธํ์ญ์์ค.
๋๋ while ๋ฃจํ๋ฅผ!
rostopic echo global_position / global์ ์ฌ๋ฐ๋ฅธ ์ถ๋ ฅ์ ๋ฐํํฉ๋๋ค.
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
๊ทธ๋ฌ๋ ์ฌ์ ํ ์๋ํ์ง ์์ต๋๋ค. ์ฝ๋๋ฅผ ์คํํ๋ฉด ๋ฌด์ฅํ๊ฑฐ๋ ์คํ ๋ณด๋๋ฅผ ํ์ฑํํ์ง ์๊ณ ์๋ฃ๋ฉ๋๋ค.
์์ฑ๋๋ ์ ์ผํ ๊ฒฝ๊ณ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
[ WARN] [1514991840.139563807, 7583.766000000]: SPG: sp not sent.
INFO [tone_alarm] negative
[ WARN] [1514991840.303175629, 7583.928000000]: CMD: Unexpected command 176, result 1
์ ์ญ์์ ๋ก์ปฌ๋ก ๋ฒ์ญ ํ ๋ค์ mavros / setpoint_position / local๋ก ๋ณด๋ด์ผํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ํ์ง ์์ต๋๋ค.
๊ถ๊ธํ๋ฐ์ด ๋ฌธ์ ๊ฐ์๋ ๊ฑด ๋๋ฟ์ธ๊ฐ์? ๋๊ตฐ๊ฐ mavros / setpoint_position / global์ ๊ฒ์ํ๋ ๊ฒ๋ง์ผ๋ก ํญ๊ณต๊ธฐ ์คํ ๋ณด๋ ์์ ๋ฅผ ์ฌํ ํ ์ ์์ต๋๊น?
@mzahana ์์ ๋ฌธ์ ์ ๋ํด @danividanivi ๋ฅผ ์๋ดํด
๋๋ ๋ํ์ด ๋ฌธ์ ์ ์ง๋ฉดํ๋ค๋ ๊ฒ์ ์ธ๊ธํ๊ณ ์ถ์ต๋๋ค. ์ฌ๋ฐ๋ฅธ ์ฃผ์ ๋ก ๊ฒ์ํ๊ณ ์์์ ํ์ธํ ์ ์์์ง๋ง MAVROS๋ PX4์ ๋ํ ์ฌ๋ฐ๋ฅธ MAVLINK ์ค์ ๊ฐ ๋ฉ์์ง๋ก ๋ณํ ํ ์์๋ ๊ฒ ๊ฐ์ต๋๋ค. QGroundcontrol์ ์ฌ์ฉํ์ฌ ํ์ธํ ๊ฒฐ๊ณผ ๋ก์ปฌ์ ์ฌ์ฉํ ๋ PX4์ ๊ฒ์๋๋ ์ค์ ๊ฐ ๋ฉ์์ง ๋ง ๋ณผ ์์์์ต๋๋ค.
@mzahana ๊ตฌํ์ ๋ค์ ์ค์ ํ๊ณ ์๋ํ๋์ง ํ์ธํ ์ ์์ต๋๊น? ๊ฐ์ฌ
@ eric1221bday ๋น ๋ฅธ ์ง๋ฌธ :
๊ทธ๋ฌ๋ MAVROS๋ PX4์ ๋ํ ์ฌ๋ฐ๋ฅธ MAVLINK ์ค์ ๊ฐ ๋ฉ์์ง๋ก ๋ณํ ํ ์์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ชจํธํ๊ฒ ๋ค๋ฆฌ๋ฉฐ ์ด์ ๊ฐ์ ์ ๋ณด๋ก ๋ฌธ์ ๋ฅผ ๋๋ฒ๊น ํ ์ ์์ต๋๋ค.
SITL์ ์ฌ์ฉํ๊ณ ์์๋๋ฐ, GPS ์๋ฎฌ๋ ์ด์ ์ด ํ์ฑํ๋์๊ณ ROS์์ ์ฃผ์ ๋ฅผ ๋ณผ ์์์์ต๋๋ค. mavlink์ ๊ดํด์๋. ๋ด๊ฐ ์๋ฏธํ๋ ๋ฐ๋ Mavlink Inspector๋ฅผ ์ฌ์ฉํ์ฌ ๋ณผ ์ ์์๊ธฐ ๋๋ฌธ์ ์ ์ญ ์ค์ ์ ์ด px4๋ก ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ก๋์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๊ฒ์ ์ ์ญ ์์น ์ค์ ์ ์ ๊ฒ์ํ๋ ๊ฒ์ด ์๋๋ผ ์ ์ญ์์ ๋ก์ปฌ๋ก ๋ณํํ๊ณ ๋ก์ปฌ ์์น ์ค์ ์ ์ผ๋ก ๊ฒ์ํ๋๋ก๋์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ์ค์ ๋ก ์ ์ญ ์ค์ ๊ฐ์ ๋ณผ ์ ์์ต๋๋ค.
์๋ผ๊ณ ์ถ๋ก ํ ์ ์์๊ณ ๋ง์ฐฌ๊ฐ์ง๋ก PX4์์๋ ๋ก์ปฌ ์ค์ ๊ฐ์ ๋ณผ ์ ์์์ต๋๋ค.
๊ทธ๊ฒ์ ๋ ธ๋๊ฐ ์ค์ ๋๋ ๋ฐฉ๋ฒ๊ณผ MAVROS์ ๊ฒ์ํ๊ฑฐ๋ ๊ฒ์ํ์ง ์๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ์ถ๊ฐ ์ ๋ณด ์์ด๋ ๋๋ฒ๊น ํ ์ ์์ต๋๋ค.
@ eric1221bday ์ถ๊ฐ ํ ๋ค๋ฅธ ๊ฒ์ด ์๊ฑฐ๋ ๋ซ์ ์ ์์ต๋๊น?
๋๋ ์ด๊ฒ์ ๋ด ํธ์์ ๋ค์ ํ ์คํธํ๊ณ ๋น์ ์๊ฒ ๋์๊ฐ ๊ฒ์ ๋๋ค.
์ง์ ์ด ์์ต๋๊น? ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ฌ ํด๊ฒฐ์ฑ ์ ์ฐพ์ ์์๋ ๊ฒ ๊ฐ์ต๋๋ค.
header.stamp ํ๋๋ฅผ ์ค์ ํ๋์ง ํ์ธํ์ญ์์ค. ๊ทธ๋์ผ๋ง ์๋ํฉ๋๋ค!
์๋ ํ์ธ์! ๋๊ตฌ๋ ์ง / mavros / setpoint_position / global ์ฃผ์ ์ ๊ฒ์ํ์ฌ ๋๋ก ์ ์์น๋ฅผ โโ์ฑ๊ณต์ ์ผ๋ก ์ ์ด ํ ์ ์์๋์ง ํ์ธํ ์ ์์ต๋๊น? header.stamp ํ๋๋ฅผ ์ค์ ํด๋ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค (์๋ต ์์, px4๊ฐ ๋ฉ์์ง๋ฅผ ์์ ํ์ง ์๋ ๊ฒ ๊ฐ์).
์, ์ ์๊ฒ ํจ๊ณผ์ ์ ๋๋ค!
์ฌ๊ธฐ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค ... (๋์๊ฒ ์ ํฉํ์ง ์์)
@tropappar ์ํ ์ฝ๋๋ฅผ ๊ณต์ ํด ์ฃผ
์ฌ๊ธฐ ์์ต๋๋ค :
#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;
}
์๋ ํ์ธ์! ๋๊ตฌ๋ ์ง / mavros / setpoint_position / global ์ฃผ์ ์ ๊ฒ์ํ์ฌ ๋๋ก ์ ์์น๋ฅผ โโ์ฑ๊ณต์ ์ผ๋ก ์ ์ด ํ ์ ์์๋์ง ํ์ธํ ์ ์์ต๋๊น? header.stamp ํ๋๋ฅผ ์ค์ ํด๋ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค (์๋ต ์์, px4๊ฐ ๋ฉ์์ง๋ฅผ ์์ ํ์ง ์๋ ๊ฒ ๊ฐ์).
๋๋ํ์ง๋ง / mavros / setpoint_raw / global ์ฃผ์ ๋ ์ ์์ ์ผ๋ก ์๋ํ์ต๋๋ค.
์๋
zxz0622,
์ฝ 4 ์ผ ๋์ / mavros / setpoint_raw / global์์ ์์
ํ์ง๋ง ์๋ ๊ฒฝ๋ ๊ณ ๋ ๊ฐ์ ์ ๊ณตํ์ฌ ์ฟผ๋ ์ฝฅํฐ๋ฅผ ์ด๋ํ ์ ์์์ต๋๋ค. ์ด๋ป๊ฒํ๋์ง ๋ง์ํด ์ฃผ์๊ฒ ์ต๋๊น?
/ mavros / setpoint_raw / global์ ๋งค๊ฐ ๋ณ์๋ฅผ ๊ณต์ ํ ์ ์์ต๋๊น? (์ขํ _ ํ๋ ์ ...)
์ค๋๋ ์ค์ ํํค์ณ ์ ๋ฏธ์ํ์ง๋ง ๋๋ ๋๊ฐ์ดํ๋ ค๊ณ ๋
ธ๋ ฅํ๊ณ ์์ต๋๋ค. _mavros / setpoint_position / global_์์ ์์น ์ค์ ๊ฐ์ ์ ์กํ์ฌ ์ฐจ๋์ ์ ์ด ํ ์ ์์ต๋๋ค. ์ฐจ๋ ํ, ํ์ ํ๋ ๋กํฐ์ ์์ ํ์ ์์ ํ ํด์ ๋ฉ๋๋ค. rostopic echo /mavros/setpoint_position/global
์์ ๋ด ์ฝ๋์ ์ค์ ๊ฐ์ด ๊ฒ์๋๊ณ ์์์ ํ์ธํ ์ ์์ต๋๋ค. ๋ํ _mavros / setpoint_position / global_์์ ๋ก์ปฌ ์ขํ ์ค์ ๊ฐ์ ๋ณด๋ด๋ ๊ฒ์ด ์๋ฒฝํ๊ฒ ์๋ํ๋์ง ํ์ธํ ์ ์์ต๋๋ค.
์๋, ๊ฒฝ๋ ๋ฐ ์๋ ์ด์ธ์ ๋ค๋ฅธ ํ๋๋ฅผ ์ค์ ํด์ผํฉ๋๊น?
MAVROS ๋ฒ์ ๋ฐ ํ๋ซํผ
Mavros : ๋ง์คํฐ
ROS : ๋ฉ๋ก๋
Ubuntu : 18.04
Autopilot ์ ํ ๋ฐ ๋ฒ์
[] ArduPilot
[X] PX4
๋ฒ์ : ๋ง์คํฐ
์ง๋จ
rostopic echo์ ์ํ :
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
๊ถ๊ธํ ์ ์ด ์์ต๋๋ค. frame_id ํ๋๊ฐ ์ด๋ค ์ญํ ์ํฉ๋๊น? _local_origin_๋ ์๋ํ์ง๋ง ํจ๊ณผ๊ฐ ์์์ต๋๋ค.
๊ฐ์ฌ.
๋๋ก ์ ๊ณ ๋๋ณด๋ค ๋์ ์ง์ ์ ๊ฒ์ํด์ผํฉ๋๋ค. ์ด๋ฆฌ์์ ์ ์์ฒ๋ผ ๋ณด์ด์ง๋ง GPS ๊ณ ๋๊ฐ ์ง์ญ ๊ณ ๋๋ณด๋ค ํจ์ฌ ๋์ ์ ์๋ค๋ ์ฌ์ค์ ์์ ์ ์์ต๋๋ค.
@swaroophangal ์์ @tropappar ์์ ์ ๊ณต ํ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ณ ๊ตฐ๋ถํฌํ๊ณ ์์ต๋๋ค.
์ฆ, "mavros / setpoint_position / global"์ ํตํด ์์น๋ฅผ ์ค์ ๊ฐ์ผ๋ก ์ ์กํจ์ผ๋ก์จ ์ฐจ๋์ ์ฑ๊ณต์ ์ผ๋ก ์คํ ๋ณด๋ ๋ฐ ์ฌ์ง์ด ํ์ ์ง์
ํ์ง๋ง ์ง์์ ์์ต๋๋ค.
์์น ์ค์ ๊ฐ "mavros / setpoint_raw / global"๋ ๋ณด๋ด๋ ค๊ณ ํ์ง๋ง ๋์ผํ ํ์์ผ๋ก ์คํจํ์ต๋๋ค (์ฆ, ์ฐจ๋์ด ์ฑ๊ณต์ ์ผ๋ก ์คํ ๋ณด๋์ ์ง์
ํ๊ณ ์ฌ์ง์ด ํ์ ์ง์
ํ์ง๋ง์ง๋ฉด์ ์์ต๋๋ค).
@ burak-yildizoz ๋ํ ๊ฒ์ ๋ ์ง์ ์ด ๋๋ก ์ GPS ๊ณ ๋ ์์ ์๋์ง ๋ค์ ํ์ธํ์ต๋๋ค (์์ @tropappar ์์ ์ ๊ณต ํ ์ฝ๋๋ "goal_position.altitude = goal_position.altitude + 5.0;"์ ์ฌ์ฉํ์ฌ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํจ). ํนํ "+5"๋ฅผ ๋ค๋ฅธ ๊ฐ์ผ๋ก ๊ฐ์ง๊ณ ๋์์ง๋ง ์ฑ๊ณตํ์ง ๋ชปํ์ต๋๋ค.
๋๊ตฐ๊ฐ ๋์ธ ์ ์์ต๋๊น?
๊ฐ์ฌํฉ๋๋ค!
-
MAVROS ๋ฒ์ ๋ฐ ํ๋ซํผ
Mavros : ๋ง์คํฐ
ROS : ํค๋คํฑ
Ubuntu : 16.04
Autopilot ์ ํ ๋ฐ ๋ฒ์
[] ArduPilot
[X] PX4
๋ฒ์ : ๋ง์คํฐ
์ง๋จ
rostopic echo / mavros / global_position / global์ ์ํ :
๋จธ๋ฆฌ๊ธ:
seq : 206
์ฐํ:
์ด : 1286
nsec : 28000000
frame_id : "base_link"
์ํ:
์ํ : 0
์๋น์ค : 1
์๋ : 47.3977421
๊ฒฝ๋ : 8.5455932
๊ณ ๋ : 535.327916774
์์น _ ๊ณต๋ถ์ฐ : [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]
position_covariance_type : 2
rqt_graph
@ jungx148 fmu ๊ฐ ์ ์ก์ค์ธ mavlink ์ค์ ๊ฐ์ ์์ ํ๊ณ ์๋์ง ํ์ธํด์ผํฉ๋๋ค.
@ Jaeyoung-Lim ์๋ ํ์ธ์, Pixhawk ์ปค๋ฎค๋ํฐ๋ฅผ์ํ ๋ชจ๋ ๋ ธ๋ ฅ๊ณผ ๋น ๋ฅธ ๋ต๋ณ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๋ก์ปฌ ์คํ ๋ณด๋ ์ ์ด๋ฅผ ์ํด ๋น๋ ๋ ์ด์ ์ ๊ฒ์ ๋ "modudculab_ros"ํ๋ก์ ํธ ( ๋งํฌ) ๋ฅผ ๊ธ๋ก๋ฒ ์คํ ๋ณด๋ ์ ์ด ์ค ํ๋๋ก ๋ณํํ๋ ์์ ์ํ๋ ๋์ ์ด์ ์ ๋ฌธ์ ๋ฅผ ์ธ๊ธํ์ต๋๋ค.
"๊ทํ์ fmu๊ฐ ์ ์ก์ค์ธ mavlink ์ค์ ๊ฐ์ ์์ ํ๊ณ ์๋์ง ํ์ธํด์ผํฉ๋๋ค."๋ผ๋ ์๊ฒฌ๊ณผ ๊ด๋ จํ์ฌ QGC๋ฅผ ํตํด "POSITION_TARGET_GLOBAL_INT (๋งํฌ) "๋งค๊ฐ ๋ณ์๋ฅผ ํ์ธํ ๊ฒฐ๊ณผ, ๋ง์ํ์ ๋๋ก fmu๊ฐ ์ค์ ๋ก ์์ ํ mavlink ์ค์ ๊ฐ์ด ์์์ ํ์ธํ์ต๋๋ค. QGC ํ๋ฉด์์ ์บก์ฒ ํ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ต๋๋ค.
๋ํ ์๋์ roslaunch modudculab_ros ctrl_pos_gazebo_offb.launch
์ ์ถ๋ ฅ์ ์ฒจ๋ถํ์ต๋๋ค.
` sunghunjung2 @ gcs : ~ $ roslaunch modudculab_ros ctrl_pos_gazebo_offb.launch
... /home/sunghunjung2/.ros/log/c7421548-ea08-11ea-8a18-b052161d0343/roslaunch-gcs-16794.log์ ๋ก๊น
๋์คํฌ ์ฌ์ฉ๋์ ๋ํ ๋ก๊ทธ ๋๋ ํ ๋ฆฌ๋ฅผ ํ์ธํฉ๋๋ค. ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
์ค๋จํ๋ ค๋ฉด Ctrl-C๋ฅผ ๋๋ฅด์ธ์.
๋ก๊ทธ ํ์ผ ๋์คํฌ ์ฌ์ฉ๋ ํ์ธ์ ์๋ฃํ์ต๋๋ค. ์ฌ์ฉ๋์ 1GB ๋ฏธ๋ง์
๋๋ค.
roslaunch ์๋ฒ http : // gcs : 35869 / ์์
๋งค๊ฐ ๋ณ์
๋
ธ๋
/
mavros (mavros / mavros_node)
offb_node (modudculab_ros / pub_setpoints_traj)
ROS_MASTER_URI = http : // localhost : 11311
ํ๋ก์ธ์ค [mavros-1] : pid๋ก ์์๋จ [16811]
ํ๋ก์ธ์ค [offb_node-2] : pid๋ก ์์๋จ [16812]
`
-
์ด ๋ฌธ์ ์ ๊ด๋ จํ์ฌ ๋ค์ ๋ ๋ถ๋ถ์ด ์์ฌ๋ฉ๋๋ค.
์์ฌ 1 :
์ด ๋ฌธ์ ๋ ๋ด ๋ฐ์คํฌํฑ์ ์ค์น๋ MAVROS ๋ฒ์ ๊ณผ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
apt ๋ช
๋ น์ ์ฌ์ฉํ์ฌ ros-kinetic-mavros *๋ฅผ ์ค์นํ๊ณ catkin_ws / src ํด๋์ ์ต์ mavros git ํจํค์ง๋ฅผ ์ ์ฅํ์ต๋๋ค.
์์ฌ 2 :
๋ด๊ฐ ์ฌ์ฉํ์ ๋
ros::Publisher goal_pos_pub = nh.advertise < mavros_msgs::GlobalPositionTarget > ("mavros/setpoint_position/global", 10);
,
๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ฐ์์ต๋๋ค.
[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.
๊ทธ๋ฆฌ๊ณ ๋๋ ๊ทธ๊ฒ์
ros::Publisher goal_pos_pub = nh.advertise < mavros_msgs::GlobalPositionTarget > ("geographic_msgs/GeoPoseStamped", 10);
์ค๋ฅ ๋ฉ์์ง๊ฐ ๋ฐ์ํ์ง ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ์ชฝ์ด๋ "POSITION_TARGET_GLOBAL_INT"๋งค๊ฐ ๋ณ์๋ QGC mavlink ๊ฒ์ฌ๊ธฐ์ ๋ํ๋์ง ์์ต๋๋ค.
๋ค์ ํ ๋ฒ์ด ๋ฌธ์ ๋ฅผ ๊ฒํ ํ๋ ๋ฐ ๊ท์คํ ์๊ฐ์ ๋ด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์๊ธฐ ๋๋ฌธ์ mavros_msgs๋ฅผ ์ฌ์ฉํ์ฌ QGC์์ ์จ์ด ํฌ์ธํธ๋ฅผ ๊ฐ์ ธ์ค๊ณ , ์ธ๋ถ์์ ๊ณ์ฐ ๋ ์ ๊ฐ๋๋ฅผ ์ฝ์ ํ๊ณ , ๊ฒฐํฉ ๋ ์จ์ด ํฌ์ธํธ (์ธ๋ถ์์ ๊ณ์ฐ ๋ ์ ๊ฐ๋๋ก QGC์์ ๊ฐ์ ธ์จ ์จ์ด ํฌ์ธํธ)๋ฅผ ํธ์ํ๋๋ก ๋ณ๊ฒฝํ์ต๋๋ค.
์ด๋ฐ ์์ผ๋ก ์ํ๋๋๋ก MAV๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์ ์ด ํ ์ ์์ต๋๋ค. ๋๋จํ ๊ฐ์ฌํฉ๋๋ค.
@ jungx148 ๊ทธ๊ฒ์ ํด๊ฒฐ์ฑ ์ด ์๋๋ฉฐ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋๋ค.
์ ์ก์ค์ธ ์ค์ ๊ฐ์ด fmu์ ๋๋ฌํ๋์ง ํ์ธ ํ์ต๋๊น?
@ jungx148 ๋ฌธ์ ๊ฐ # 1414์ ๊ด๋ จ์ด์์ ์ ์์ต๋๊น?
์๋ฌด๋ ์์ง ๊ฒฐ๋ก ์ ๋๋ฌ ํ์ต๋๊น ??
์ด ์ธ ๊ฐ์ง ์ฃผ์ ์ ๋ํด ๊ฒ์๋ฅผ ์๋ํ์ง๋ง ์ด์ด ์์์ต๋๋ค.
"/ mavros / setpoint_raw / global"
"/ mavros / setpoint_raw / target_global"
"/ mavros / setpoint_position / global"
NB : ๋๋ ์ ๋ง๋ ์๋ฎฌ๋ ์ด์ ๋งํ๊ณ ์์ต๋๋ค.
์ต๊ทผ์์ด ์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค.
๊ธ์์ / mavros / setpoint_position / global ์ด๋ผ๋ ์ฃผ์ ๊ฐ ๋ง์นจ๋ด ์๋ํ์ต๋๋ค (๊ทธ๋ฌ๋ ๊ณ ๋ ์คํ์
์ด ์์ต๋๊น?). rostopic info /mavros/setpoint_position/global
์์ ์์
ํด์ผํ๋ ๋ฉ์์ง ์ ํ์ด mavros_msgs / GlobalPositionTarget์ด ์๋ geographic_msgs / GeoPoseStamped ๋ผ๋ ๊ฒ์ ์์์ต๋๋ค. ์ค๋ช
์ ๊ฐ ์
๋ฐ์ดํธ๋์ง ์์ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋๋ ๋ํ mavros / setpoint_raw / global ์ฃผ์ ์ mavros_msgs :: GlobalPositionTarget ๋ฉ์์ง๋ฅผ ๊ฒ์ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋์ผํ ์กฐ์์ ์๋ํ๊ณ ์์ผ๋ฉฐ ์ ๋๋ก ์๋ํฉ๋๋ค. ๋๋ก ์ด ์ด๋ฅํ์ฌ ์ํ๋ ์จ์ด ํฌ์ธํธ๋ก ์ด๋ํฉ๋๋ค. ๋๋ก ์ ์ฌ๋ฌ ์จ์ด ํฌ์ธํธ๋ก ์ฑ๊ณต์ ์ผ๋ก ์ด๋ ํ ์ฌ๋์ด ์๋์ง, ์จ์ด ํฌ์ธํธ์ ๋๋ฌํ๋์ง ํ์ธํ๋ ๋ก์ง์ด ํ์ํ์ง ๋ฌผ์ด๋ณด๊ณ ์ถ์์ต๋๋ค.
๋ด๊ฐ ์ด๊ฒ์ ๋ฌป๋ ์ด์ ๋ ์ ๋ง๋๊ฐ ํ ์์น๋ฅผ ์ด๋ป๊ฒ ์ค์ ํ๋์ง ํ์คํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ก ์ด ์ ๊ณต๋ ์์์ ์๋ ๊ณ ๋๋ก ์ด๋ํ๋ฉด ํด๋น ์จ์ด ํฌ์ธํธ๋ก ๋ฌด๊ธฐํ ์ด๋ํฉ๋๋ค. ํด๋น ์จ์ด ํฌ์ธํธ์ ๋๋ฌํ๋์ง ํ์ธํ ๋ค์ ๋ค๋ฅธ ์จ์ด ํฌ์ธํธ๋ฅผ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
์ด๋ค ์ ์์ด๋ผ๋ ๋๋จํ ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
๋ฏธ๋ฆฌ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๋๋ ๋ํ mavros / setpoint_raw / global ์ฃผ์ ์ mavros_msgs :: GlobalPositionTarget ๋ฉ์์ง๋ฅผ ๊ฒ์ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋์ผํ ์กฐ์์ ์๋ํ๊ณ ์์ผ๋ฉฐ ์ ๋๋ก ์๋ํฉ๋๋ค. ๋๋ก ์ด ์ด๋ฅํ์ฌ ์ํ๋ ์จ์ด ํฌ์ธํธ๋ก ์ด๋ํฉ๋๋ค. ๋๋ก ์ ์ฌ๋ฌ ์จ์ด ํฌ์ธํธ๋ก ์ฑ๊ณต์ ์ผ๋ก ์ด๋ ํ ์ฌ๋์ด ์๋์ง, ์จ์ด ํฌ์ธํธ์ ๋๋ฌํ๋์ง ํ์ธํ๋ ๋ก์ง์ด ํ์ํ์ง ๋ฌผ์ด๋ณด๊ณ ์ถ์์ต๋๋ค.
๋ด๊ฐ ์ด๊ฒ์ ๋ฌป๋ ์ด์ ๋ ์ ๋ง๋๊ฐ ํ ์์น๋ฅผ ์ด๋ป๊ฒ ์ค์ ํ๋์ง ํ์คํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ก ์ด ์ ๊ณต๋ ์์์ ์๋ ๊ณ ๋๋ก ์ด๋ํ๋ฉด ํด๋น ์จ์ด ํฌ์ธํธ๋ก ๋ฌด๊ธฐํ ์ด๋ํฉ๋๋ค. ํด๋น ์จ์ด ํฌ์ธํธ์ ๋๋ฌํ๋์ง ํ์ธํ ๋ค์ ๋ค๋ฅธ ์จ์ด ํฌ์ธํธ๋ฅผ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
์ด๋ค ์ ์์ด๋ผ๋ ๋๋จํ ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
๋ฏธ๋ฆฌ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๋๋ก ์ด xy ํ๋ฉด์์ ~ 50cm, z ์ถ์์ 10cm์ ๊ฐ์ด ํ์ฉ ๊ฐ๋ฅํ ์์ญ ๋ด์์์ ๋๊น์ง ์ ์ญ ์์น ์ค์ ์ ์ ๊ณ์ ๊ฒ์ํ์ญ์์ค. ๊ทธ๋ฐ ๋ค์ ๋ค๋ฅธ ์์ ์ ๊ฒ์ํ์ญ์์ค.
์ ๋ฐ๋ฅด์ง ์์์ต๋๋ค. ์์ด๋์ด๋ฅผ ์ป์ ์ ์๋๋ก ๊ฐ๋จํ ์ํ ์ฝ๋๋ฅผ ๋ณด๋ด ์ฃผ์๊ฒ ์ต๋๊น? ๋ช ๊ฐ์ง ์๋ํ์ง๋ง ์๋ํ์ง ์์์ต๋๋ค. Z ์ถ 10cm ๋๋ m?
๊ฐ์ฌ.
์ ๋ฐ๋ฅด์ง ์์์ต๋๋ค. ์์ด๋์ด๋ฅผ ์ป์ ์ ์๋๋ก ๊ฐ๋จํ ์ํ ์ฝ๋๋ฅผ ๋ณด๋ด ์ฃผ์๊ฒ ์ต๋๊น? ๋ช ๊ฐ์ง ์๋ํ์ง๋ง ์๋ํ์ง ์์์ต๋๋ค. Z ์ถ 10cm ๋๋ m?
๊ฐ์ฌ.
๋๋ ๋จ์ง ๋น์ ์๊ฒ ์์ด๋์ด๋ฅผ์ฃผ๊ธฐ ์ํด ๊ทธ๊ฒ์ ์ผ์ต๋๋ค. ์ง๊ต ์ขํ๋ก ๋ณํํ๊ฑฐ๋ ๋๋ก ๊ณผ ์ํ๋ ์ง์ ์ ์ฐจ์ด๊ฐ ์๊ณ ๊ฐ๋ณด๋ค ๋ฎ๋๋ก 1e-6 ์ฃผ๋ณ์ ์๋ / ๊ฒฝ๋๋ก ์๊ณ ๊ฐ์ ์ง์ ํ์ฌ ๊ธ๋ก๋ฒ ์์น๋ฅผ ๊ตฌ๋ ํ์ญ์์ค. ๊ณ ๋๊ฐ ์๋๋ผ ๋ฏธํฐ ๋จ์์ด๋ฏ๋ก ๊ณ ๋๋ฅผ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํด์ผํฉ๋๋ค. ๋๋ก ์ด ์์ ์์ ์์ผ๋ฉด ์จ์ด ํฌ์ธํธ์ ๋๋ฌ ํ ๊ฒ์ ๋๋ค.
ํ์ฌ ์ ๋ sensor_msgs :: NavSatFix๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ก ์ ์์น๋ฅผ โโํ์
ํ๊ณ ์์ต๋๋ค. ๊ธ๋ก๋ฒ ํฌ์ง์
์ ๊ตฌ๋
ํ๋ค๊ณ ๋งํ ๋์ด ๊ตฌ๋
์์ ๋ํด ๋งํ๋ ๊ฒ์
๋๊น?
๋ํ 0.000001 ์ฃผ๋ณ์ ์๋ / ๊ฒฝ๋๋ก ์๊ณ ๊ฐ์ ๋ง๋๋ ๋ฐฉ๋ฒ๊ณผ ๋๋ก ์ด ์์ ์์ ์๋์ง ํ์ธํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์กฐ๊ธ ์์ธํ ์ค๋ช
ํด ์ฃผ์๋ฉด ์ ๋ง ๋์์ด ๋ ๊ฒ์
๋๋ค.
์ด๋ฏธ ๊ตฌํ ํ ๊ฒฝ์ฐ ์ธ๊ธํ๊ณ ์๋ ๋ก์ง์ ์ผ๋ถ๋ฅผ ๊ณต์ ํด ์ฃผ์๊ฒ ์ต๋๊น? ๊ทธ๊ฒ์ ์ผ์ ํจ์ฌ ์ฝ๊ฒ ๋ง๋ค ๊ฒ์
๋๋ค.
๊ฐ์ฌํฉ๋๋ค.
์๋
ํ์ธ์ ์ฌ๋ฌ๋ถ,
๊ธ๋ก๋ฒ ํ๋ ์์ ์ฌ๋ฌ ์จ์ด ํฌ์ธํธ๊ฐ์๋ ๋๋ก ์ ๋ด๋น๊ฒ์ด์
์ ํด๊ฒฐ ํ ์ฌ๋์ด ์๋ค๋ฉด [ https://github.com/mavlink/mavros/issues/1553 }์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ฃผ์ธ์. ๋๋ ๋ช ์ฃผ ๋์ ๊ทธ๊ฒ์ ๊ตฌํํ๋ ค๊ณ ๋
ธ๋ ฅํ์ง๋ง ํด๊ฒฐ์ฑ
์ ์ฐพ์ง ๋ชปํ์ต๋๋ค. lat lon alt๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์จ์ด ํฌ์ธํธ๋ก ๋๋ก ์ ํ์ํ๊ณ ์ถ์ต๋๋ค.
๋ฏธ๋ฆฌ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋จผ์
while(ros::ok() && current_state.connected){
๋while(ros::ok() && !current_state.connected){
์ด์ด์ผํฉ๋๋ค.๋ํ-https: //github.com/mavlink/mavros/blob/master/mavros/src/plugins/setpoint_position.cpp#L69-$
global_position/global
์ฃผ์ ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์๋์ง ํ์ธํ์ญ์์ค.