DJI ONBOARD SDK—— 基础控制功能 Joystick的讲解,使用和扩展

DJI ONBOARD SDK/DJI OSDK ROS—— 基础控制功能 Joystick的使用

概述

使用OSDK/OSDK_ROS 的无人机飞行控制功能,能够设置并获取无人机各项基础参数,控制无人机执行基础飞行动作,通过Joystick 功能控制无人机执行复杂的飞行动作。

Joystick 功能

Joystick 是一个无人机综合控制功能,使用Joystick 功能时,开发者根据实际的应用需要,通过调用Joystick 中的接口,同时设置无人机使用的坐标系、水平控制的模式、垂直控制的模式、yaw角度控制的模式和悬停模式,才能设计出满足使用需求的无人机飞行控制逻辑。

1. 设置坐标系

机体坐标系
机体坐标系以无人机的重心为原点,无人机机头前进的方向为X轴,机头前进方向的右侧为Y轴,Z轴与X轴、Y轴相互垂直交于重心且指向无人机下方(遵循“右手法则”)。在机体坐标下,无人机围绕X轴、Y轴和Z轴旋转时的飞行动作,可称为横滚(无人机仅绕X轴旋转)、俯仰(无人机仅绕Y轴旋转)和偏航(无人机仅绕Z轴旋转)。

大地坐标系
大地坐标系也称世界坐标系或当地水平坐标系,在该坐标系中,无人机指向地球正北的方向为X轴,正东的方向为Y轴,X轴与Y轴相互垂直,Z轴竖直指向无人机下方,在满足“右手法则”的前提下,Z轴将根据无人机飞行的实际情况调节角度,因此该坐标系也称为“北-东-地(N-E-D)坐标系”。

2. 设置水平控制模式

姿态角控制模式:在该模式下,水平方向的指令为无人机的姿态角。(在机体坐标系下,该角度为roll 和pitch)
速度控制模式:在该模式下,水平方向的指令为无人机的速度
位置控制模式:在该模式下,水平方向的指令为无人机的位置
角速度控制:在该模式下,水平方向的指令为无人机的旋转角速度

说明: 当位置指令的模不为0时,无人机会以指定的速度向前飞行,否则,无人机将悬停在指定的位置。

3.设置垂直控制模式

速度控制模式:控制无人机垂直方向的速度
位置控制模式:控制无人机垂直方向的位置,该位置为相对于起飞点的绝对位置
油门控制模式:控制无人机的油门

4. 设置yaw角度控制模式

角度控制模式:在该模式下,yaw方向旋转的指令为yaw 的角度
角速率控制模式:在该模式下,yaw方向旋转的指令为yaw 的角速率

5. 设置无人机悬停模式

仅在水平控制模式中的速度控制模式下,开发者可以设置无人机的悬停模式:

开启稳定模式:开启稳定模式后,无人机将在指定的位置上悬停
关闭稳定模式:关闭稳定模式后,无人机将按照速度命令飞行,当无人机的前进速度为0时候,无人机可能会随风飘动

使用Joystick飞行控制功能

使用Joystick 功能需要先设置Joystick 的模式和对应的控制指令,再执行Joystick 指令,实现对无人机的控制。 如下代码以在dji_osdk_ros例子中,使用Joystick 功能控制无人机。

设置joystick的模式 1:

void velocityAndYawRateCtrl(const JoystickCommand &offsetDesired, uint32_t timeMs)
{double originTime  = 0;double currentTime = 0;uint64_t elapsedTimeInMs = 0;SetJoystickMode joystickMode;JoystickAction joystickAction;joystickMode.request.horizontal_mode = joystickMode.request.HORIZONTAL_VELOCITY;joystickMode.request.vertical_mode = joystickMode.request.VERTICAL_VELOCITY;joystickMode.request.yaw_mode = joystickMode.request.YAW_RATE;joystickMode.request.horizontal_coordinate = joystickMode.request.HORIZONTAL_GROUND;joystickMode.request.stable_mode = joystickMode.request.STABLE_ENABLE;set_joystick_mode_client.call(joystickMode);joystickAction.request.joystickCommand.x = offsetDesired.x;joystickAction.request.joystickCommand.y = offsetDesired.y;joystickAction.request.joystickCommand.z = offsetDesired.z;joystickAction.request.joystickCommand.yaw = offsetDesired.yaw;originTime  = ros::Time::now().toSec();currentTime = originTime;elapsedTimeInMs = (currentTime - originTime)*1000;while(elapsedTimeInMs <= timeMs){currentTime = ros::Time::now().toSec();elapsedTimeInMs = (currentTime - originTime) * 1000;joystick_action_client.call(joystickAction);}
}
设置水平控制模式:
joystickMode.request.horizontal_mode = joystickMode.request.HORIZONTAL_VELOCITY;
设置水平控制模式:
 joystickMode.request.vertical_mode = joystickMode.request.VERTICAL_VELOCITY;
设置yaw角度控制模式:
joystickMode.request.yaw_mode = joystickMode.request.YAW_RATE;
设置yaw角度控制模式:
joystickMode.request.horizontal_coordinate = joystickMode.request.HORIZONTAL_GROUND;
设置坐标系:
  joystickMode.request.horizontal_coordinate = joystickMode.request.HORIZONTAL_GROUND;
设置无人机悬停模式:
joystickMode.request.stable_mode = joystickMode.request.STABLE_ENABLE;

通过参考JoystickMode所有参数可以获得所有备选参数。

设置joystick的模式2 :

bool moveByPosOffset(FlightTaskControl& task,const JoystickCommand &offsetDesired,float posThresholdInM,float yawThresholdInDeg)
{task.request.task = FlightTaskControl::Request::TASK_POSITION_AND_YAW_CONTROL;task.request.joystickCommand.x = offsetDesired.x;task.request.joystickCommand.y = offsetDesired.y;task.request.joystickCommand.z = offsetDesired.z;task.request.joystickCommand.yaw = offsetDesired.yaw;task.request.posThresholdInM   = posThresholdInM;task.request.yawThresholdInDeg = yawThresholdInDeg;task_control_client.call(task);return task.response.result;
}
使用常用的设置模式:
task.request.task = FlightTaskControl::Request::TASK_POSITION_AND_YAW_CONTROL;

这是一种快捷的设置方式,具体请参考JoystickMode相关

问题:

如何利用joystickMode功能,扩展出更强大和灵活的无人机飞行控制功能 ? 例如:如何实现控制无人机运动速度(包括运动方向)的同时也能控制其运动位移和方位角 ?
期待你的见解…

dji_osdk_ros例子
JoystickMode所有参数
JoystickMode常用模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/211354.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【精彩回顾】恒拓高科亮相第十一届深圳军博会

2023年12月6日-8日&#xff0c;由中国和平利用军工技术协会、全国工商联科技装备业商会、深圳市国防科技工业协会等单位主办以及政府相关部门支持&#xff0c;深圳企发展览有限公司承的“2023第11届中国&#xff08;深圳&#xff09;军民两用科技装备博览会&#xff08;深圳军博…

02 CSS基础入门

文章目录 一、CSS介绍1. 简介2. 相关网站3. HTML引入方式 二、选择器1. 标签选择器2. 类选择器3. ID选择器4. 群组选择器 四、样式1. 字体样式2. 文本样式3. 边框样式4. 表格样式 五、模型和布局1. 盒子模型2. 网页布局 一、CSS介绍 1. 简介 CSS主要用于控制网页的外观&#…

C#如何使用SqlSugar操作MySQL/SQL Server数据库

一. SqlSugar 连接MySQL数据库 public class MySqlCNHelper : Singleton<MySqlCNHelper>{public static SqlSugarClient CnDB;public void InitDB() {//--------------------MySQL--------------------CnDB new SqlSugarClient(new ConnectionConfig(){ConnectionString…

穷举问题-搬砖(for循环)

某工地需要搬运砖块&#xff0c;已知男人一人搬3块&#xff0c;女人一人搬2块&#xff0c;小孩两人搬1块。如果想用n人正好搬n块砖&#xff0c;问有多少种搬法&#xff1f; 输入格式: 输入在一行中给出一个正整数n。 输出格式: 输出在每一行显示一种方案&#xff0c;按照&q…

玩转大数据12:大数据安全与隐私保护策略

1. 引言 大数据的快速发展&#xff0c;为各行各业带来了巨大的变革&#xff0c;也带来了新的安全和隐私挑战。大数据系统通常处理大量敏感数据&#xff0c;包括个人身份信息、财务信息、健康信息等。如果这些数据被泄露或滥用&#xff0c;可能会对个人、企业和社会造成严重的损…

Unity 资源管理之Resources

Resources是一个特殊的文件夹&#xff0c;用于存放运行时加载的资源。 Resources文件夹中可以放置各种类型的资源文件&#xff0c;如纹理、模型、音频、预制体等&#xff0c;一般用来存储预制体和纹理信息。 通过API可以加载和访问该文件夹及其子文件夹中的资源。 当我们打包…

大数据Doris(三十五):Unique模型(唯一主键)介绍

文章目录 Unique模型(唯一主键)介绍 一、创建doris表 二、插入数据

【华为OD题库-076】执行时长/GPU算力-Java

题目 为了充分发挥GPU算力&#xff0c;需要尽可能多的将任务交给GPU执行&#xff0c;现在有一个任务数组&#xff0c;数组元素表示在这1秒内新增的任务个数且每秒都有新增任务。 假设GPU最多一次执行n个任务&#xff0c;一次执行耗时1秒&#xff0c;在保证GPU不空闲情况下&…

海外独立站站长常用的ChatGPT通用提示词模板

目标市场&#xff1a;如何确定目标市场&#xff1f; 用户需求&#xff1a;如何了解用户需求&#xff1f; 网站设计&#xff1a;如何设计一个优秀的网站&#xff1f; 用户体验&#xff1a;如何提升用户体验&#xff1f; 功能规划&#xff1a;请帮助我规划网站的功能。 内容…

linux 应用开发笔记---【标准I/O库/文件属性及目录】

一&#xff0c;什么是标准I/O库 标准c库当中用于文件I/O操作相关的一套库函数&#xff0c;实用标准I/O需要包含头文件 二&#xff0c;文件I/O和标准I/O之间的区别 1.标准I/O是库函数&#xff0c;而文件I/O是系统调用 2.标准I/O是对文件I/O的封装 3.标准I/O相对于文件I/O具有更…

SpringBoot 项目 Jar 包加密,防止反编译

1场景 最近项目要求部署到其他公司的服务器上&#xff0c;但是又不想将源码泄露出去。要求对正式环境的启动包进行安全性处理&#xff0c;防止客户直接通过反编译工具将代码反编译出来。 2方案 第一种方案使用代码混淆 采用proguard-maven-plugin插件 在单模块中此方案还算简…

调用别人提供的接口无法通过try catch捕获异常(C#),见鬼了

前几天做CA签名这个需求时发现一个很诡异的事情&#xff0c;CA签名调用的接口是由另外一个开发部门的同事(比较难沟通的那种人)封装并提供到我们这边的。我们这边只需要把数据准备好&#xff0c;然后调他封装的接口即可完成签名操作。但在测试过程中&#xff0c;发现他提供的接…

[后端卷前端2]

绑定class 为什么需要样式绑定呢? 因为有些样式我们希望能够动态展示 看下面的例子: <template><div><p :class"{active:modifyFlag}">class样式绑定</p></div> </template><script>export default {name: "goo…

人力资源服务展示网站作用有哪些

就业劳务问题往往是不少人群关注的问题&#xff0c;每个城市都聚集着大量求业者&#xff0c;而人力资源管理公司每年也会新增不少&#xff0c;对求业者来说&#xff0c;通过人力资源公司可以快速便捷的找到所需工作&#xff0c;而对公司来说&#xff0c;市场大量用户可以带来收…

C语言第十八集(动态内存管理)

1.malloc函数可以开辟一块空间,具体搜: 2.malloc函数申请的空间在内存的堆区 而且它只负责帮你申请空间,不负责帮你清理空间 3.free函数可以释放内存 4.free函数释放的是内存中的堆区,具体搜: 5.在free函数调用完后记得把对应的指针设为空指针 6.calloc函数跟malloc函数差…

揭秘字符串的奥秘:探索String类的深层含义与源码解读

文章目录 一、导论1.1 引言&#xff1a;字符串在编程中的重要性1.2 目的&#xff1a;深入了解String类的内部机制 二、String类的设计哲学2.1 设计原则&#xff1a;为什么String类如此重要&#xff1f;2.2 字符串池的概念与作用 三、String类源码解析3.1 成员变量3.2 构造函数3…

[今来] 神话故事:金马和碧鸡

文章目录 金马山和碧鸡山神话传说金马坊和碧鸡坊金马碧鸡 金马山和碧鸡山 昆明山明水秀&#xff0c;北枕蛇山&#xff0c;南临滇池&#xff0c;金马山和碧鸡山则东西夹峙&#xff0c;隔水相对&#xff0c;极尽湖光山色之美。金马山逶迤而玲珑&#xff0c;碧鸡山峭拔而陡峻&…

[Java][Map]linkedhashmap的引入

我们可以看到&#xff1a; linkedhashmap中元素的读取是有顺序的&#xff0c;基于这种双向链表 我们可以优先读取8索引bucket上的元素 然后读取3索引bucket上的元素&#xff0c;以及其挂载的元素 最后读取0索引bucket上的元素 bucket是hashbucket! 这种写法是很有序的 也是…

Pytorch初步使用

文章目录 创建张量指定设备沿轴计算 创建张量 如果说数组是numpy的操作对象&#xff0c;那么张量Tensor就是pytorch的操作单元&#xff0c;从数据内容来说&#xff0c;与高维数组是如出一辙的&#xff0c;但作为一个类&#xff0c;其构造函数支持通过声明张量的维度来进行初始…

clickhouse数据库磁盘空间使用率过高问题排查

一、前言 clickhouse天天触发磁盘使用率过高告警&#xff0c;所以需要进行排查&#xff0c;故将排查记录一下。 二、排查过程 1、连接上进入clickhouse 2、执行语句查看各库表使用磁盘情况 SELECT database, table, formatReadableSize(sum(bytes_on_disk)) as disk_space F…