用 .NET 启动你的 DJI Ryze Tello 无人机_c# 大疆sdk-程序员宅基地

技术标签: c#  无人机  .net  CA周记  .NET 6  

大疆的 DJI Ryze Tello 是入门级的无人机,不仅在 STEM 教育中有非常广泛的应用,也可以作为编程入门的首选。 通过 UDP 协议调用 DJI Ryze Tello SDK 可以让 DJI Ryze Tello 无人机执行起飞,降落,转向以及不同的花式动作。 本文将会通过 .NET 创建应用控制 DJI Ryze Tello。

.NET UDP 编程

什么是 UDP

“UDP(用户数据报协议)是一个与IP 协议一起使用的长期协议,用于在传输速度和效率比安全性和可靠性更重要的场合下发送数据。 UDP 使用一个简单的、具有最小协议机制的无连接通信模型。 UDP 使用校验和保证数据完整性,使用端口号以区分数据发送方和接收方中不同的应用程序。它无需握手会话,即将不可靠的底层网络直接暴露给了用户的应用程序:不保证消息交付、不保证交付顺序也不保证消息不重复。如果需要网络接口层面的纠错功能,则应用程序可以使用为此目的设计的传输控制协议(TCP)或者流控制传输协议(SCTP)。”

在现场实时测控领域,如果有实时、抗干扰性、安全性等要求,都可以采用 UDP 传输数据。我想这也是 DJI Ryze Tello 为何使用 UDP 协议通信的原因。

C# 调用 UDP Client

在 System.Net.Sockets 下你可以通过类 UdpClient 来完成 UDP 协议的相关调用。 这是官方给我们的例子

UdpClient 类提供了在阻塞同步模式下发送和接收无连接 UDP 数据报的简单方法。 因为 UDP 是一种无连接的传输协议,所以在发送和接收数据之前不需要建立远程主机连接。 但是,您确实可以选择通过以下两种方式之一建立默认远程主机:

使用远程主机名和端口号作为参数创建 UdpClient 类的实例

创建 UdpClient 类的实例,然后调用 Connect 方法

您可以使用 UdpClient 中提供的任何发送方法将数据发送到远程设备。 使用 Receive 方法从远程主机接收数据。

用 .NET Polyglot Notebook 连接 DJI Ryze Tello

通过 Polyglot Notebook 可以完成 .NET 的交互式编程。在用 .NET 封装 DJI Ryze Tello SDK 之前我们可以用 Notebooks 连接 DJI Ryze Tello 做相关原型测试。

要连通 DJI Ryze Tello SDK ,需要通过 UDP 连通 192.168.10.1 以及端口 11111.

通过 C# 调用 UDPClient 连接的方式如下

string telloIP = "192.168.10.1";

int telloPort = 8889;

UdpClient udpClient = new UdpClient();

udpClient.Connect(telloIP,telloPort);

并封装好指令执行的方法

public  void Command(UdpClient udpClient,string cmd)
{

    Byte[] sendCmdBytes = null;
            
    sendCmdBytes = Encoding.UTF8.GetBytes(cmd);
      
    udpClient.Send(sendCmdBytes, sendCmdBytes.Length);
}

完成上面的设置,你就可以执行对应的指令完成控制 DJI Ryze Tello 的操作

Command(udpClient,"command");

Command(udpClient,"takeoff");

Command(udpClient,"land");

结合 .NET Polyglot Notebook 就可以完成对 DJI Ryze Tello 的操作以及相关技术测试。 以下视频是 Notebooks 控制 DJI Ryze Tello  的具体效果

.NET Notebooks 控制 DJI Tello

用 .NET MAUI 构建 DJI Ryze Tello 应用

.NET MAUI 是跨平台,跨设备的前端应用技术,开发团队使用一种编程语言 C# 就可以完成 iOS / Android / m

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u014388424/article/details/128905873

智能推荐

ajax上传文件、FormData上传文件、html5上传文件、多文件上传_ajajx提交文件到php-程序员宅基地

文章浏览阅读448次。首先简单了解一下 FormData,点击链接:https://developer.mozilla.org/zh-CN/docs/Web/API/FormData/Using_FormData_ObjectsIE浏览器版本最好为:IE10+,因为 FormData 兼容性问题然后查看示例,代码如下↓html 代码:<!DOCTYPE html><html lan..._ajajx提交文件到php

端口扫描技术_在端口扫描中隐蔽扫描能够更精准的判断出端口是否开启-程序员宅基地

文章浏览阅读3.6k次。(79条消息) 端口扫描原理和划分_HideInTime的博客-程序员宅基地_扫描器通过什么来判断端口的状态一、端口分类固定端口(0-1023):TCP的21(ftp),80(http),139(netbios),UDP的7(echo),69(tftp)等等动态端口(1024-49151):这些端口并不被固定的捆绑于某一服务,操作系统将这些端口动态的分配给各个进程, 同一进程两次分配有可能分配到不同的端口二、常用端口扫描技术1. 全TCP连接Connect()扫描此扫描试图与每一..._在端口扫描中隐蔽扫描能够更精准的判断出端口是否开启

Android apk 分析工具:APK Analyzer_什么工具可以比较两个apk 之间的差异-程序员宅基地

文章浏览阅读1.2w次,点赞2次,收藏6次。前言Android studio 2.2 版本后自带有一个分析工具:APK Analyzer。这是一个专门分析 apk 的神器,主要作用如下: 1. (重要) 直观的看到 apk 中各个文件的大小 (比如 DEX,resource 等等)。我们可根据文件大小信息,减小 apk 的大小; 2. (重要) 学习大企业 app 的命名规范和目录架构规范,还可以查看大公司 app 使用了什么技术和第三方_什么工具可以比较两个apk 之间的差异

web使用自动扫描器_web目录扫描器-程序员宅基地

文章浏览阅读448次。4、有了关于现有漏洞的信息,我们可以跟踪引用并搜索已发布的漏洞,例如,如果我们在用户注册表中搜索CVE-2007-5106,这是一个XSS 漏洞,我们将在Security Focus中找到一个漏洞:https://www.securityfocus.com/bid/25769/exploit。1、我们将扫描Pruggia 漏洞应用程序,并将结果导出到一个HTML报告文件,该命令为:nikto -h http://192.168.120.129/peruggia/-o result.html。_web目录扫描器

解决升级JDK后:找不到sun.misc.Unsafe的类文件_jdk.unsupported位置-程序员宅基地

文章浏览阅读1.1k次。JDK9以后已经将sun.misc.Unsafe弃用,同时改进了lib文件的存储方式,将sun.misc.Unsafe全部存储在了jdk.unsupported里面。_jdk.unsupported位置

C++字符串相加出错:invalid operands of types ‘const char [759]‘ and ‘const char [15]‘ to binary ‘operator+‘_invaild operands oftypes-程序员宅基地

文章浏览阅读1.2k次。但“”括起来的字符串被当成是字符串类型的,而非string类型,而字符串类型与C语言一样是不允许相加的,因此需要强制将其中一个字符串转为String类型。在C语言中字符串是不能直接相加的,在C++中,字符串是一个String类,允许相加。_invaild operands oftypes

随便推点

Android 笔记:Error:A problem occurred configuring project ':app'.-程序员宅基地

文章浏览阅读8.4k次。原文作者:雪飘碧鸳 在github上导入项目,或其他地方导入Android Studio,出现Error:A problem occurred configuring project ‘:app’.的错误。其实这种错误有很多种原因,需要对每种情况进行不同的处理才行,这里说的一种情况是JNI的情况,即该项目使用到C/C++库,此时需要引入NDK才行,先看下错误提示Gradle ‘trunk’ ..._error:a problem occurred configuring project ':app'.

dataframe的groupby,agg,unstack应用_group by unstack-程序员宅基地

文章浏览阅读603次。groupby一个索引的比较简单,这里主要讲两个索引的:这里先设dataframe为下图然后根据第0列和第1列来进行分组,再对第二列进行数量统计,这里用了nunique函数来进行数量统计上图中最上面的2表示是根据原表的第3列即序号2的那一列使用的agg函数得到的结果。unstack是把一维表转换成二维表,即把(0,1)这对分组条件分别写成表的行列索引,一一对应agg函数得到的结果,如下图:stack是把二维表转换成一维表,类似花括号形式(就像是思维导图一层一层括出去),第一列写上原本的行索引_group by unstack

树莓派宝塔搭建NAS私有云盘nextcloud_宝塔做nas-程序员宅基地

文章浏览阅读2.2k次。宝塔新建网站:假设文件夹根目录为/home/nextcloud创建FTP,数据集。并且选择php版本。删除文件夹根目录/home/nextcloud下的两个html文件。下载nextcloud文件:官网链接可以使用wget:wget https://download.nextcloud.com/server/releases/nextcloud-20.0.0.zip,或者本地端下载后拖过去。多线程下载:sudo apt install axel axel -n 20 ht.._宝塔做nas

快学Scala 第一课 (变量,类型,操作符)-程序员宅基地

文章浏览阅读41次。Scala 用val定义常量,用var定义变量。常量重新赋值就会报错。变量没有问题。注意:我们不需要给出值或者变量的类型,scala初始化表达式会自己推断出来。当然我们也可以指定类型。多个值和变量可以一起声明:Scala 类型:Byte, Char, Short, Int, Long, Float, Double, BooleanScala不区分基...

Oracle分区查询_oracle查询分区数据-程序员宅基地

文章浏览阅读1.4w次,点赞4次,收藏19次。根据分区查询速度会快很多:分区查询:SELECT * FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = '表名'分区键查询:SELECT * FROM all_PART_KEY_COLUMNS where name='表名';根据分区名查询:select * from 表名 partition('分区名');根据分区键查询:select * from 表名 partition where ACTDATETIME>=to_date('2022_oracle查询分区数据

使用JS判断移动设备的终端类型(浏览器UserAgent)_user-agent判断终端类型-程序员宅基地

文章浏览阅读8.5k次。JavaScript 是如何判断移动设备的类型呢?答案是:User Agent。什么是 User Agent?懂一点网页制作的人应该都明白。简单的说,User Agent 就是用来识别浏览器名称、版本、引擎以及操作系统等信息的内容。 User Agent 的判断是识别浏览器的关键,不仅仅如此,移动互联网开发势头迅猛,通过 User Agent 判断桌面端设备或移动设备就变的很为重要。当然,通过_user-agent判断终端类型

推荐文章

热门文章

相关标签