【Tello无人机】无人机编队操作面板实现

news2024/11/25 1:39:46

为了方便进行无人机的编队演示,以及在各种场景下实现队形的灵活切换,开发了一套专门的上位机控制平台。本文将重点介绍应用于tello无人机的编队操作面板及其核心功能。

操作面板页面
下图展示了操作面板,其中包含5种编队动作和3个可选位置设定。用户可以根据实际需求选择动作,并对动作参数进行配置。该平台嵌入了两套通讯系统:仿真系统和物理系统。用户可以在仿真环境中验证动作的合理性和安全性,然后在物理系统中进行实验。接下来将在仿真环境中介绍各个动作。

仿真动作
启动仿真

点击启动仿真,可运行嵌入系统中的pybullet组件,并初始化无人机位置如下:(复位即此位置)

位置1,一字排开,为执行动作4,动作5做准备

动作1
三个无人机滚动交换位置,实现三个无人机换位置的效果

代码实现:
 def shift_drone_positions(current_pos, target_position, task_stage_count):
     if np.all(target_position == None):
         target_position = current_pos
     if np.linalg.norm(current_pos - target_position) < 0.05:
         target_position = np.roll(target_position, 1, axis=0)
         task_stage_count += 1
     return target_position, task_stage_count
逻辑:

  1. 首先检查是否有指定的目标位置,如果没有,则将目标位置设定为当前位置。
  2. 计算当前位置与目标位置之间的欧几里得距离,如果小于 0.05,则执行下一步。
  3. 将目标位置在坐标轴上向前滚动一个单位,模拟位置的移动。
  4. 增加任务阶段计数。
  5. 返回更新后的目标位置和任务阶段计数。

动作2
无人机两两交换位置,同时采用CBF进行避障运动,保证运动的同时不会与其他无人机发生碰撞

代码实现:
 def swap_drone_positions(current_pos, target_position, swap_count):
     if np.all(target_position == None):
         target_position = current_pos
     new_drone_positions = np.copy(target_position)
     if np.linalg.norm(current_pos - target_position) < 0.05:
         if swap_count % 2 == 0:
             # 01-10
             temp = copy.deepcopy(new_drone_positions[0])
             new_drone_positions[0] = new_drone_positions[1]
             new_drone_positions[1] = temp
         elif swap_count % 2 == 1:
             # 12-21
             temp = copy.deepcopy(new_drone_positions[1])
             new_drone_positions[1] = new_drone_positions[2]
             new_drone_positions[2] = temp
         swap_count += 1
 
     return new_drone_positions, swap_count
逻辑:

  1. 首先,函数检查是否有指定的目标位置,如果没有,则将目标位置设定为当前位置。
  2. 然后,函数创建了一个新的数组 new_drone_positions,用于存储目标位置的副本。
  3. 接着,函数计算当前位置与目标位置之间的欧几里得距离,如果小于 0.05,则执行下一步。
  4. 如果 swap_count 是偶数,则执行第一个交换操作,将第一个和第二个飞行器的位置交换。
  5. 如果 swap_count 是奇数,则执行第二个交换操作,将第二个和第三个飞行器的位置交换。
  6. 每次执行交换操作后,增加 swap_count。
  7. 最后,返回更新后的飞行器位置和增加后的交换次数 swap_count。

动作3
圆形运动,三个无人机以设定的半径及角速度进行圆形机动,实现画圆的效果


代码实现:

def rotational_motion(current_pos, radius=0.5, delta_theta_val=0.003,
                       last_angle=np.zeros(3),
                       first_call=True):
     current_angle = np.arctan2(current_pos[:, 1], current_pos[:, 0])
     current_angle = (current_angle + 2 * np.pi) % (2 * np.pi)
     if first_call:
         first_call = False
         last_angle = copy.deepcopy(current_angle)
     delta_theta = np.array([delta_theta_val, delta_theta_val, delta_theta_val])
     R = radius
     new_angle = last_angle + delta_theta
     target_x = R * np.cos(new_angle)
     target_y = R * np.sin(new_angle)
     target_position = np.array([target_x, target_y, [current_pos[0][2]] * 3]).T
     return target_position, np.array(new_angle), first_call

点击【Tello无人机】无人机编队操作面板实现 - 古月居可查看全文

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

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

相关文章

2024深圳杯(东北三省)数学建模选题建议及各题思路来啦!

大家好呀&#xff0c;2024深圳杯数学建模&#xff08;东北三省数学建模联赛&#xff09;开始了&#xff0c;来说一下初步的选题建议吧&#xff1a; 首先定下主基调&#xff0c; 本次深圳杯&#xff08;东北三省&#xff09;建议选A。难度上D&#xff1e;B&#xff1e;C&#…

开源模型应用落地-chatglm3-6b-集成langchain(十)

一、前言 langchain框架调用本地模型&#xff0c;使得用户可以直接提出问题或发送指令&#xff0c;而无需担心具体的步骤或流程。通过LangChain和chatglm3-6b模型的整合&#xff0c;可以更好地处理对话&#xff0c;提供更智能、更准确的响应&#xff0c;从而提高对话系统的性能…

Linux中进程和计划任务管理(2)

一.进程命令 1.lsof lsof 命令&#xff0c;“list opened files”的缩写&#xff0c;直译过来&#xff0c;就是列举系统中已经被打开的文件。通过 lsof 命令&#xff0c;我们就可以根据文件找到对应的进程信息&#xff0c;也可以根据进程信息找到进程打开的文件。 格式&…

【详细实现】v1.0 随机点名应用

1.引言 前面对这个应用的功能做了详细的分析&#xff08;长什么样、能干什么&#xff09;&#xff0c;以先这样对一个项目最开始的分析成为需求分析&#xff0c;需求分析之后就是设计阶段。 那么一般的项目&#xff0c;在设计阶段都需要干什么呢&#xff1f;在需求分析阶段确定…

Linux系统中安装MySQL

1、在电脑中安装虚拟机 2、df -h查看光盘是否挂载&#xff0c;没挂载用mount -o ro /dev/sr0 /media命令挂载 3、进入etc/yum.repos.d目录查看仓是否配置&#xff0c;若配置进行下一一步&#xff0c;未配置则进行配置 配置软件仓库 [rootlocalhost yum.repos.d]# vim rhle.r…

423 世界读书日 和京东零售技术人一起读好书

我们正处于一个复杂、变化的世界&#xff0c;想要更好地理解、适应它&#xff0c;读书可能是最方便的方式之一。 4 月 23 日世界读书日&#xff0c;我们整理了 10 位零售技术人的书籍推荐给大家&#xff0c;欢迎大家一起来共读好书。愿大家在忙碌工作之余&#xff0c;都能够持…

Kubectl常见排查pod问题命令

一.查看命名空间pod及其日志 #查看命名空间pod kubectl get pods -n <命名空间名称> #该命令不加-n命名空间名称&#xff0c;默认是查看default命名空间的pod#查看对应pod的日志kubectl logs -f <pod-name> -n <namespace>#同样的如果查看的是default命名空…

在 vue3 中使用高德地图

前言&#xff1a;定位地图位置所需要的经纬度&#xff0c;可以通过 拾取坐标 获取。 一&#xff1a;快速上手 1. 安装依赖 npm install amap/amap-jsapi-loader # or pnpm add amap/amap-jsapi-loader # or yarn add amap/amap-jsapi-loader 2. 创建组件 src/components/Ma…

有关栈的练习

栈练习1 给定一个栈&#xff08;初始为空&#xff0c;元素类型为整数&#xff0c;且小于等于 109&#xff09;&#xff0c;只有两个操作&#xff1a;入栈和出栈。先给出这些操作&#xff0c;请输出最终栈的栈顶元素。 操作解释&#xff1a; 1 表示将一个数据元素入栈&#xff…

Mysql 存在多条数据,按时间取最新的那一组数据

1、数据如下&#xff0c;获取每个用户最近的一次登录数据 思路1&#xff1a;order by group by 先根据UserIdLogInTime排序&#xff0c;再利用Group分组&#xff0c;即可得到每个User_Id的最新数据。 1 SELECT * FROM login_db l ORDER BY l.user_id, l.login_time DESC; 排…

一款辅助应用助力盲人公交出行畅行无阻

在这个日新月异的时代&#xff0c;科技进步正以前所未有的速度改变着人们的生活方式&#xff0c;尤其是在提升特殊群体生活质量方面展现出巨大潜力。今日&#xff0c;我们将目光聚焦于盲人公交出行&#xff0c;探讨一款名叫蝙蝠避障的创新辅助应用如何以其实时避障与拍照识别功…

vben admin Table 实现表格列宽自由拖拽

更改BasicTable.vue文件 Table添加 resize-column“resizeColumn” 添加并 return resizeColumn const resizeColumn (w, col) > { setCacheColumnsByField(col.dataIndex, { width: w }); }; 在column中添加 resizable: true,

做一个答题pk小程序多少钱

在探讨“做一个答题pk小程序多少钱”这一问题时&#xff0c;我们首先需要明确的是&#xff0c;小程序的价格并非固定不变&#xff0c;而是受到多种因素的影响。这些因素包括但不限于小程序的复杂度、功能需求、开发周期、技术难度以及开发团队的规模和经验等。因此&#xff0c;…

单机单实例部署RocketMQ及测试

部署Apache RocketMQ需要准备NameServer、Broker、Proxy三个组件。它有几种部署模式&#xff1a; Local模式:Broker 和 Proxy 是同进程部署Cluster模式:Broker 和 Proxy 分别部署 为了部署简便&#xff0c;我们采用local模式。 RocketMQ部署 Dockerfile FROM ubuntu:22.04 …

Linux KASAN使用与实现原理

一、KASAN工具使用 KASAN工具&#xff1a;Kernel Address SANitizer(KASAN)是一种动态内存安全错误检测工具&#xff0c;主要功能是检查内存越界访问和使用已释放内存的问题。 1.1 KASAN宏控开关 KASAN有三种模式&#xff1a;1.通用KASAN&#xff1b;2.基于软件标签的KASAN&…

模版初阶【C++】

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

嵌入式Python基础1-2

嵌入式Python基础1-2 条件语句 if elif else 随机数random eval while循环 for循环 水仙花数 循环else list 列表常用方法 增删改查 加排序 append remove pop index() 升序sort(&#xff09;降序 sort(reverseTrue) 反转 reverse&#xff08;&#xff09;…

[Collection与数据结构] PriorityQueue与堆

1. 优先级队列 1.1 概念 前面介绍过队列&#xff0c;队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队列时&#xff0c;可能需要优先级高的元素先出队列&#xff0c;该中场景下&#xff0c;使用队列显然…

持续更新。。。

1、JAVA面试指南 https://javaguide.cn/ 简历优化&#xff1a;突出与应聘职位相关的项目经验、技术栈、技能证书和专业成就。确保简历中的技术关键词与JD&#xff08;Job Description&#xff09;相符。 自我评估&#xff1a;对照目标职位要求&#xff0c;梳理自身Java技能树&…

mac安装nvm管理node(手残流,git下载)

1. 准备 首先电脑里得有brew、git、vscode&#xff0c;看这里安装brew、git&#xff0c;看这里安装vscode。 我本人比较low&#xff0c;mac命令也记不熟&#xff0c;本篇就是git下载nvm&#xff0c;vscode看配置&#xff0c;省心不动脑子就可以了。 2. 清理node 如果mac里没…