Mavros Offboard 控制 C++ 代码示例 - 使用 Mavros 库控制无人机
以下是一个基本的 Offboard 控制 C++ 代码示例,使用 mavros 库进行通信和控制:
#include <ros/ros.h>
#include <geometry_msgs/PoseStamped.h>
#include <mavros_msgs/CommandBool.h>
#include <mavros_msgs/SetMode.h>
#include <mavros_msgs/State.h>
// 回调函数,接收当前飞行状态
void state_cb(const mavros_msgs::State::ConstPtr& msg)
{
if (msg->mode != 'OFFBOARD') {
ROS_INFO("Offboard mode not set, current mode: %s", msg->mode.c_str());
}
}
int main(int argc, char **argv)
{
// 初始化 ROS 节点
ros::init(argc, argv, "offboard_control");
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::ServiceClient arming_client = nh.serviceClient<mavros_msgs::CommandBool>("mavros/cmd/arming");
// 调用设置模式服务
ros::ServiceClient set_mode_client = nh.serviceClient<mavros_msgs::SetMode>("mavros/set_mode");
// 等待连接
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;
// 设置发布频率
ros::Rate rate(20.0);
// 进入 offboard 模式
mavros_msgs::SetMode offboard_set_mode;
offboard_set_mode.request.custom_mode = "OFFBOARD";
set_mode_client.call(offboard_set_mode);
// 解锁
mavros_msgs::CommandBool arm_cmd;
arm_cmd.request.value = true;
arming_client.call(arm_cmd);
// 等待解锁
while (ros::ok() && !current_state.armed) {
ros::spinOnce();
rate.sleep();
}
// 开始发布期望位置
while (ros::ok()) {
pose.header.stamp = ros::Time::now();
local_pos_pub.publish(pose);
ros::spinOnce();
rate.sleep();
}
return 0;
}
这个示例程序中,首先创建了一个 ROS 节点,订阅了当前飞行状态、创建了一个发布期望位置的 Publisher 和调用解锁、设置模式服务的 ServiceClient。
在进入 offboard 模式和解锁之前,需要等待与飞行器的连接。进入 offboard 模式和解锁后,开始发布期望位置。
这个示例程序中,期望位置是固定的,为在 x-y 平面上的原点,高度为 2 米。实际应用中,需要根据具体需求设置期望位置。
需要注意的是,使用 mavros 进行 offboard 控制时,需要在起飞前先手动将飞行器起飞到一定高度,否则飞行器可能会飞到不可控的位置。
原文地址: https://www.cveoy.top/t/topic/oDSB 著作权归作者所有。请勿转载和采集!