以下是一个基本的 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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录