我正在尝试复制板外控制示例(在凉亭中工作正常),但发送全局坐标而不是本地 x、y、z。
我无法这样做,无人机进入“启用舷外”循环,但从未进入车辆武装或根本移动。
这是我正在使用的代码:
#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
主题获取数据。
我用 !
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 上获取 GPS 数据? 还有你是什么意思:
但 MAVROS 似乎无法将其转换为 PX4 的正确 MAVLINK 设定点消息
这听起来有点含糊,我们无法用这样的信息调试任何问题。
我正在使用 SITL,是的,启用了 GPS 模拟并且我能够在 ROS 中查看该主题。 至于 mavlink 的事情。 我的意思很简单,全局设置点似乎没有正确发送到 px4,因为我无法使用 Mavlink Inspector 看到它。
这不应该发布任何全局位置设置点,而是从全局转换为本地并作为本地位置设置点发布。 因此,您实际上从未看到全局设置点。
我能够推断出是的,而且我同样无法从 PX4 看到任何本地设置点。
嗯,这取决于你的节点是如何设置的,以及你发布或不发布到 MAVROS 的内容。 如果没有更多信息,就无法调试。
@eric1221bday还有什么要添加的,或者我们可以关闭它吗?
我会在我这边重新测试这个,然后回复你。
任何进展? 我遇到了同样的问题,似乎找不到解决方案。
确保您设置了 header.stamp 字段。 只有这样它才有效!
下午好! 谁能确认发布到主题 /mavros/setpoint_position/global 他们成功地控制了无人机的位置? 即使设置了 header.stamp 字段,我也遇到了同样的问题(没有得到响应,px4 似乎没有收到任何消息)
是的,它对我有用!
在这里也一样......(对我不起作用)
@tropappar你介意分享一些示例代码吗? 我正在运行类似于顶部的脚本,但在 rqt_graph 上,即使它已成功发布,我也没有看到从我的节点发布的任何主题。
干得好:
#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,
我已经在 /mavros/setpoint_raw/global 上工作了大约 4 天,但我无法通过提供纬度经度高度值来移动四轴飞行器。 你能告诉我你是怎么做的吗?
你能分享 /mavros/setpoint_raw/global 的参数吗? (坐标框架...)
很抱歉挖掘了一个旧线程,但我正在尝试做同样的事情。 我无法通过在 _mavros/setpoint_position/global_ 上发送位置设定点来控制车辆。 车辆武器,坐在地上旋转转子和超时后解除武装。 我可以确认rostopic echo /mavros/setpoint_position/global
显示我的代码中的设置点正在发布。 我还可以确认在 _mavros/setpoint_position/global_ 上发送本地坐标设置点工作正常。
我应该设置除 lat、lon 和 lat 之外的任何其他字段吗?
MAVROS 版本和平台
马夫罗斯:大师
ROS:旋律
Ubuntu:18.04
自动驾驶仪类型和版本
[ ] ArduPilot
[X] PX4
版本:大师
诊断
rostopic 回声示例:
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 版本和平台
马夫罗斯:大师
ROS:动力学
Ubuntu:16.04
自动驾驶仪类型和版本
[ ] ArduPilot
[X] PX4
版本:大师
诊断
rostopic echo /mavros/global_position/global 示例:
标题:
序列:206
邮票:
秒:1286
纳秒:28000000
frame_id: "base_link"
地位:
状态:0
服务:1
纬度:47.3977421
经度:8.5455932
海拔: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
@jungx148您需要检查您的 fmu 是否正在接收您发送的 mavlink 设置点。
@Jaeyoung-Lim 您好,非常感谢您为 Pixhawk 社区所做的一切努力以及快速响应。
我之前在将您之前发布的“modudculab_ros”项目(链接)转换为全局车外控制时遇到了问题,该项目是为本地车外控制而构建的。
关于您的评论,“您需要检查您的 fmu 是否正在接收您发送的 mavlink 设置点”,我通过 QGC 检查了一个参数“POSITION_TARGET_GLOBAL_INT (link) ”,并注意到 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*,并将最新的 mavros git 包保存在 catkin_ws/src 文件夹中。
嫌疑人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有关吗?
有人得出结论了吗??
我尝试发布这 3 个主题,但没有运气
“/mavros/setpoint_raw/global”
“/mavros/setpoint_raw/target_global”
“/mavros/setpoint_position/global”
注意:我只做凉亭模拟
好吧,我最近发现了这个错误:
好吧,主题/mavros/setpoint_position/global终于奏效了(但有高度偏移?)。 从rostopic info /mavros/setpoint_position/global
我发现我应该使用的消息类型是geography_msgs/GeoPoseStamped而不是mavros_msgs/GlobalPositionTarget我不知道为什么文档没有更新。
我也在尝试做同样的操作,即在 mavros/setpoint_raw/global 主题上发布 mavros_msgs::GlobalPositionTarget 消息,它工作正常。 无人机起飞并前往所需的航点。 我想问一下是否有人成功地将无人机导航到多个航点,我们是否需要一个逻辑来检查是否到达了航点?
我问这个的原因是我不确定凉亭如何设置它的起始位置,所以当无人机去到任何随机提供的纬度时,它会无限期地去那个航点。 有没有办法检查是否到达该航点,然后提供另一个航点?
任何建议将不胜感激。
提前致谢。
我也在尝试做同样的操作,即在 mavros/setpoint_raw/global 主题上发布 mavros_msgs::GlobalPositionTarget 消息,它工作正常。 无人机起飞并前往所需的航点。 我想问一下是否有人成功地将无人机导航到多个航点,我们是否需要一个逻辑来检查是否到达了航点?
我问这个的原因是我不确定凉亭如何设置它的起始位置,所以当无人机去到任何随机提供的纬度时,它会无限期地去那个航点。 有没有办法检查是否到达该航点,然后提供另一个航点?
任何建议将不胜感激。
提前致谢。
只需继续发布全局位置设定点,直到无人机位于可接受的区域内,例如 xy 平面约 50 厘米和 z 轴 10 厘米。 然后,发布另一点。
没跟上。 您能否发送一个简单的示例代码,以便我了解一下? 我尝试了几件事,但没有奏效。 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
主题获取数据。