当前位置: 首页 > news >正文

完整教程:[无人机sdk] docs | Vehicle::init()

完整教程:[无人机sdk] docs | Vehicle::init()

链接:How to use OSDK ? - DJI Onboard SDK Documentation

在这里插入图片描述

10-17晚__湖南无人机烟花吉尼斯世界纪录

docs:Onboard-SDK

Onboard-SDK作为大疆无人机的中央控制系统,可编程化地与其高级功能进行交互。

它充当无人机的大脑,协调从飞行操控相机操作到接收实时遥测数据以及规划自主任务的一切功能。

通过抽象复杂的底层通信并适配多种硬件平台实现的,为开发者提供了统一的接口。

可视化

在这里插入图片描述

章节

  1. 飞行器
  2. 飞行控制器
  3. 任务管理器 & 航点任务/热点任务
  4. 相机模块 / 云台模块
  5. 高级感知
  6. 数据订阅
  7. 连接器
  8. 开放协议
  9. 内存管理单元 (MMU)
  10. 平台抽象层 (PAL)

第一章:飞行器

欢迎来到大疆机载SDK

如果你想用自己的代码控制大疆无人机,那么你来对地方了。在这第一章中,我们将认识Onboard-SDK中最重要的概念:飞行器(Vehicle)

什么是"飞行器"?(无人机的大脑)

想象你正在操控一架无人机。你有一个主遥控器,可以完成所有操作:让它飞行、拍照、移动相机、规划复杂航线,甚至查看无人机看到的画面。

Onboard-SDK中,Vehicle对象就是这样的主遥控器——它是大疆无人机的中央大脑

这是你的代码与无人机所有高级系统交互的主要方式。从程序启动的那一刻起,Vehicle对象就是你调用几乎所有无人机功能的接口。

为什么需要Vehicle

想想看:一架无人机有许多不同的部件。

有控制系统控制飞行,另一个系统控制相机,一个控制云台(相机稳定器),还有其他负责任务或获取数据的系统。

如果没有Vehicle对象,就必须分别与每个部件通信,这会非常复杂!

Vehicle抽象通过提供统一接口解决了这个问题。它将所有功能集中在一个屋檐下,让可以轻松地指挥无人机,而无需担心每个独立系统的复杂细节。

第一个任务:准备无人机

在让无人机起飞之前,你需要完成几个基本步骤:

  1. 连接无人机:建立计算机与无人机之间的通信
  2. 初始化SDK:准备好所有软件组件
  3. 激活无人机:告诉大疆你的程序被授权控制这架特定无人机
  4. 识别无人机:确定你的无人机型号和固件版本

Vehicle对象负责所有这些关键的第一步

如何使用Vehicle

让我们看看如何使用Vehicle对象开始与无人机交互。

第一步:创建Vehicle对象

首先,需要创建Vehicle类的实例。这就像从盒子里拿出你的遥控器。

#include <dji_vehicle.hpp>#include <dji_linux_helpers.hpp> // Linux设置// ... 在你的主函数中 ...// 设置环境(如串口、应用ID/密钥)LinuxSetup linuxEnvironment(argc, argv);DJI::OSDK::Vehicle* vehicle = linuxEnvironment.getVehicle();if (vehicle == NULL) {std::cout << "飞行器未初始化,退出。\n";return -1;}

说明:我们包含dji_vehicle.hpp,它定义了Vehicle

LinuxSetup助手(针对Linux平台)为我们创建并初始化Vehicle对象,处理初始通信设置。如果vehicleNULL,说明设置出了问题,我们无法继续。

第二步:激活无人机

激活无人机就像给你的遥控器一个特殊"密码",让它知道它被允许发送指令。

这确保只有授权的应用程序可以控制大疆无人机。

需要从大疆开发者账户获取App ID和App Key。

#include <dji_vehicle.hpp>// ... 其他包含文件 ...// ... 在主函数或辅助函数中 ...// 从环境设置获取激活数据DJI::OSDK::Vehicle::ActivateData* activateData = linuxEnvironment.getActivateData();// 调用飞行器对象的activate方法DJI::OSDK::ACK::ErrorCode ack = vehicle->activate(activateData, functionTimeout);if (DJI::OSDK::ACK::getError(ack)){DJI::OSDK::ACK::getErrorCodeMessage(ack, "activate");std::cout << "激活失败,退出。\n";return -1;}std::cout << "无人机激活成功!\n";

说明activate()方法将你的凭证发送给无人机

它返回一个ACK::ErrorCode,告诉你激活是否成功或有错误(如错误的App ID)。我们检查这个ack以确保我们被授权。

  • functionTimeout是一个参数,指定等待无人机响应的时长。

第三步:获取无人机版本信息

了解连接的无人机型号和固件版本通常很有用。这有助于代码适应不同的无人机型号或功能。

#include <dji_vehicle.hpp>// ... 其他包含文件 ...// ... 在主函数或辅助函数中 ...// 获取无人机版本信息DJI::OSDK::ACK::DroneVersion droneVersion = vehicle->getDroneVersion(functionTimeout);if (DJI::OSDK::ACK::getError(droneVersion.ack)) {DJI::OSDK::ACK::getErrorCodeMessage(droneVersion.ack, "getDroneVersion");std::cout << "获取无人机版本失败,退出。\n";return -1;}std::cout << "无人机硬件版本: " << droneVersion.data.hwVersion << std::endl;std::cout << "无人机固件版本: "<< (droneVersion.data.fwVersion >> 24) << "."<< ((droneVersion.data.fwVersion >> 16) & 0xFF) << "."<< ((droneVersion.data.fwVersion >> 8) & 0xFF) << "."<< (droneVersion.data.fwVersion & 0xFF) << std::endl;

说明getDroneVersion()请求无人机的型号和固件

droneVersion.data结构包含字段如hwVersion(硬件型号)和fwVersion(固件版本)。我们打印这些信息

fwVersion是一个整数,所以我们进行位操作提取主版本、次版本、补丁和构建号

内部机制:Vehicle如何工作

Vehicle对象不仅仅是一个占位符;它是一个协调者

当创建它并调用其初始化函数时,背后发生了很多事情来建立稳健的通信并管理无人机的所有功能

Vehicle初始化流程

以下是程序启动并初始化Vehicle对象时的简化流程:

在这里插入图片描述

说明

  1. 你的应用程序首先请求创建Vehicle对象。
  2. Vehicle然后设置底层的**连接器(Linker)**,负责与无人机的物理通信(如USB或串口)。
  3. Vehicle执行版本协商,了解连接的无人机型号和固件版本
  4. 关键的是,调用Vehicle::init(),然后创建并初始化所有专门的子模块,如:
    • 飞行控制器(FlightController):控制无人机移动。
    • 任务管理器(MissionManager):规划和执行自动化任务。
    • 相机模块/云台模块(CameraModule/GimbalModule):相机和云台操作。
    • 数据订阅(DataSubscription):接收各种遥测数据。
    • … soon Vehicle是访问所有这些的中心点。
  5. 建立心跳机制,持续检查与无人机的连接是否存活
  6. 最后,当调用Vehicle::activate()时,Vehicle处理将凭证发送给无人机,如果成功,配置连接器(Linker)使用加密进行安全通信。

代码聚焦:构建"大脑"

让我们看看SDK中的一些简化代码片段,展示Vehicle是如何构建的。

Vehicle构造函数(简化自osdk-core/api/src/dji_vehicle.cpp

Vehicle类的构造函数接收一个指向Linker对象的指针。这突出了Vehicle从一开始就严重依赖Linker来建立和管理通信

// osdk-core/api/src/dji_vehicle.cpp
Vehicle::Vehicle(Linker* linker)
: linker(linker) // Vehicle存储一个指向Linker的指针
// ... 许多其他模块指针初始化为NULL ...
{
// 设置默认值和内部变量
}

说明:当创建Vehicle对象时,它立即获得一个与无人机通信的"通道"(linker)。这个linker对所有后续交互都至关重要。

Vehicle::init()(简化自osdk-core/api/src/dji_vehicle.cpp

Vehicle类中的init()方法是"大脑"连接到所有"器官"或"肢体"的地方。它是一系列初始化各种子模块的调用。

// osdk-core/api/src/dji_vehicle.cpp
bool Vehicle::init() {
if (!initOSDKHeartBeatThread()) return false;
if (!initLegacyLinker()) return false; // 用于旧协议
if (!initSubscriber()) return false;   // 处理数据订阅
if (!initBroadcast()) return false;    // 处理广播遥测
if (!initControl()) return false;      // 基本飞行控制
if (!initCamera()) return false;       // 相机操作
if (!initGimbal()) return false;       // 云台操作
if (!initMobileDevice()) return false; // 移动应用通信
if (!initMissionManager()) return false; // 自动化任务
// ... 以及其他许多模块的初始化调用 ...
return true;
}

说明:这个函数展示了Vehicle如何精心设置无人机的每个功能部分。每个initXxx()函数创建并配置一个特定模块(如SubscriberControlCameraMissionManager),让应用程序可以通过Vehicle对象使用它们。

结论

Vehicle对象是Onboard-SDK的基石

它充当中央控制面板,统一访问无人机的所有复杂系统。通过理解它在初始化、激活和管理子模块中的作用,已经掌握了使用SDK控制无人机的第一个重要步骤。

现在我们的Vehicle已经准备就绪,基本功能也已清晰,让我们深入了解如何让无人机真正动起来


下一章:飞行控制器

http://www.jsqmd.com/news/362522/

相关文章:

  • Linux命令-ls(显示目录内容列表)
  • 四川塑木地板怎么选?Top5厂家榜单,湿润气候适配+环保耐用 - 深度智识库
  • Linux命令-lsattr(查看文件的第二扩展文件系统属性)
  • 你觉得AI是泡沫?我靠它一个人干翻了一个团队的活
  • 从单点突破到全局智能:美团核销接口赋能自助体验商业升维
  • TDengine TSMA (窗口预聚集) 用户手册
  • 自助体验新时代,美团核销接口如何助力连锁品牌实现“无人”胜“有人”?
  • 2024提示工程架构师技能图谱:从技术到业务的硬实力
  • 解锁流量密码!美团核销接口如何成为自助品牌连锁化的“中枢神经”?
  • 2026国内最新医用敷贴TOP5推荐:术后修护/敏感肌护理优选榜单发布,资质合规 + 场景匹配 + 临床验证 + 稳定供应,专业靠谱之选 - 品牌推荐2026
  • 百度竞价开户推广代运营公司/服务商深度测评:深圳昊客网络凭什么成为行业标杆? - 专业GEO营销推广
  • HDMI 2.1接口:8K时代的必备技术与未来趋势
  • 即插即用系列(代码实践)| 2025 Strip R-CNN:大尺寸条形卷积——遥感目标检测新SOTA,专治细长目标(桥梁、船只)
  • 以孝治家利福塔镇官庄村:一餐热饭暖民心,一副春联迎佳节,一份义诊保健康
  • 禁止直接 update 业务关键字段
  • 2026国内最新修复面霜TOP5推荐:敏感肌/术后修护面霜权威榜单,资质合规 + 场景匹配 + 临床验证 + 稳定供应,专业配方赋能肌肤屏障健康 - 品牌推荐2026
  • LuatOS——camera摄像头功能库使用详解
  • 对标国际标杆,数字冰雹 智能作战想定编辑工具 定义“新一代”战场仿真
  • APP与小程序开发科普:深圳昊客网络如何帮企业打造数字化增长引擎? - 专业GEO营销推广
  • LangChain构建测试用例Agent实战
  • 深度解析波士顿动力Atlas:研究版终极敏捷测试落幕,量产版剑指工业场景
  • 深度解析宇树机器人在-47.4℃的阿勒泰极限测试:低成本高实用的演进之路
  • 推荐一些Skills
  • Chromium 完整安装指南(Windows 版)
  • 2026年AI大模型入门指南:收藏这份学习资料,小白也能成为数字伙伴!
  • 深度解读特斯拉2026 AI战略:打通自动驾驶与Optimus的神经世界模拟器
  • 快速降低氨氮的方法及污水处理应用要点
  • 树的重心 + 树的同构
  • 低代码平台选型指南:五大定位迥异的“数字搭档”解析
  • AES-GCM 2级秘钥管理