空地协同系统使用手册
目录
1 - 空地协同系统介绍 1.1 背景 1.2 系统简介 1.3 工作流程 1.4 关键技术 1.5 推广应用场景 1.6 小结
2 - AGV小车操作手册 2.1 产品概述 2.2 产品介绍 2.3 产品使用说明 2.4 安全使用注意事项
3 - 无人机(Dji RobomasterTT)操作手册 3.1 虚拟机与Linux系统的创建 3.2 安装Python开发环境 3.3 Robomaster Tello Talent使用介绍 3.4 YOLOv3视觉识别框架 3.5 样例
1 - 空地协同系统简介
1.1 背景
目前在公共区域常常会因为火灾在初始阶段没有被及时发现,导致火势蔓延,最后造成财产损失甚至是生命流逝的重大损失。对于居民楼、工厂、森林等各种公共区域,如何在火灾初期及时发现火灾并对工作人员预警,对避免火势的蔓延具有重要的现实意义。在这些公共区域中,若仅仅通过工作人员对其进行巡检,不仅需要耗费大量的人力物力,而且非常容易出现漏检的情况,使用机器人代替人工进行巡检是未来的发展趋势。
但是,地面移动机器人对环境进行感知时,因障碍物的遮挡会产生感知盲区。利用无人机的空中视角的信息可以减少地面无人平台的感知盲区,使地面无人平台可以对环境实现全方位感知。其中,空中无人机主要负责搜索、发现问题;地面无人车负责确认、解决问题,并为无人机提供起降平台。除此之外,由于移动机器人视野的局限性,对大范围的空间进行巡检花费的时间较久;而无人机拥有较大的视野,但负重有限,无法携带足够的资源。
空地协同可以将无人机和移动机器人的优点结合,利用无人机提供巡检视野,将结果通知工作人员,并发送指令给移动机器人,通过移动机器人携带相应的处理资源,从而更好的完成大规模场所的巡检任务。
1.2 系统简介
同济人工智能研究院研发的空地协同系统将自动导航小车(Automated Guided Vehicle)与大疆Robomaster Tello Talent教育无人机联动:无人机将AGV作为降落平台,平时由小车载着进行地面巡逻。在行进到小车不方便进入的地形或者预先设计好的巡逻点以后,无人机从AGV起飞,开始巡逻、警戒、探查任务。
空地系统的AGV部分使用ROS(Robot Operating System)进行操控和数据交互。小车可以事先通过cartographer算法对所处环境进行建图,再利用move_base等ros自带package完成定点导航和移动操作。而无人机部分则使用大疆提供的robomaster-SDK进行相关的程序编写工作。
第一代空地协同系统
第二代空地协同系统
硬件需求: AGV小车、Robomaster TT无人机、1台个人电脑(优先选装Linux系统)
1.3 工作流程
假定工作场景为研究院附近的公共区域,通过无人机、无人车空地协同合作检查该公共区域是否有出现火灾。其中,空中无人机主要负责搜索、发现火灾情况;地面无人车为无人机提供起降平台,并在收到无人机指令后负责确认火灾情况,并运输灭火设备消灭火灾。
空地协同系统的功能演示主要分为火灾巡检、火灾处理和自主返航三个部分,如图2所示。
具体步骤:
a.首先由无人车运载无人机从仓库出发,到达待检测区域后,无人机起飞离开无人车;
b.无人机在公共区域飞行搜索,检测是否存在火灾情况,并将读取到的图像传回终端控制系统(PC端),终端系统可实时显示无人机与无人车的位置和图像数据;
c.若无人机发现火灾情况,发出报警信号,并通知无人车携带灭火设备前往异常处进行处理;
d.无人车收到无人机传达的信息后,自主规划到异常处的路径,并在前往目标点的过程中实现动态避障;
e.无人车到达指定地点后,对火灾情况进行进一步确认。若火势较小,使用车载灭火设备消灭火灾;若无法解决,无人车协助消灭火灾使向终端发送报警信息,请求工作人员帮助;
f.无人机继续前往其他地点进行巡视,检查是否还存在其它火灾情况;
g.若无人机完成巡检任务或续航不足时,则请求返航。在返航过程中,无人机根据无人车当前的位置信息自主规划路径,最后通过视觉进行精准降落;若无人车正在灭火,则无人机请求返回至空闲无人车。
h.无人机降落在无人车后,可在车上进行充电,然后继续执行巡检任务或同无人车一起返回仓库。
1.4 关键技术
a.自主地图构建与定位(SLAM):从未知环境的未知地点出发,在运动过程中通过重复观测到的地图特征(比如,墙角,柱子等)定位自身位置和姿态,再根据自身位置增量式的构建地图。
b.轨迹规划与动态避障:探测障碍物,并对障碍物的移动轨迹跟踪(Moving Object Detection and Tracking ,一般缩写为MODAT)做出下一步可能位置的推算,最终绘制出一幅包含现存碰撞风险和潜在碰撞风险的障碍物地图。
c.仪表识别:无人机到达指定地点后,需对采集的仪表图像进行识别并读取其中数据。打印张贴数字表示仪表,使用opencv实现数字的分割和识别。
d.人脸检测与人脸识别:在执行安防任务时,需对工厂内人员进行检测与识别。可使用opencv库cv2.CascadeClassifier实现人脸检测,通过OpenCV的Eigenfaces算法进行人脸识别。
e.目标跟踪:无人机(车)发现目标后需持续跟踪目标。使用KCF算法在图像中跟踪目标,再根据目标在图像中位置大小,控制无人机(车)运动。
f.移动应用开发:在无人机(车)执行任务可通过APP实时监测无人机(车)的情况。通过DJI Mobile SDK开发安卓应用,实现无人机相机图像的实时传输。
g.控制终端:在PC端对地空系统进行可视化及必要控制。通过ROS rviz实现,无人机与无人车的位置信息通过ROS话题实时发布,无人机捕捉仪表图像后将图像及识别结果通过ROS传递到PC端并显示。
1.5 推广应用场景
空地协同技术的应用场景可以分为公共区域和工厂环境,具体的推广方案如下所示:
a.公共区域
空地协同除可参与火灾预警中,也可以应用于检测公共区域内更多的异常情况,如检测是否有人摔倒、打架斗殴等行为。无人机通过空中巡检公共区域,基于图像检测发现是否存在异常状况,从而向有关的工作人员发出警报,同时向移动机器人发出指令,让其携带必要的处理设备到达事故发生点进行下一步处理。
b.工厂环境
无人机可以在危险区域进行巡检,通过图像检测发现有故障的设备,如是否有气体泄漏等,从而向有关的工作人员发出警报,同时向移动机器人发出指令,使用其自带的机械臂对故障点进行维护,如果未能修复,可协助工作人员处理相关故障。
假定工作场景为大型工厂,该工厂中有大量仪器设备需要定期巡视检查。在该工厂中,空地协同系统可用于仪器巡检和安防,其中,空中无人机主要负责搜索、发现问题;地面无人车负责确认、解决问题,并为无人机提供起降平台。
2 - AGV小车操作手册
2.1 产品概述
本产品由同济人工智能(苏州)研究院自主研发,搭载移动机器人自主智能控制器,配备高性能计算机、 高精度激光雷达、深度摄像机等设备,具备环境感知与自主移动能力,涵盖机器视觉、SLAM、语言处理、 运动控制、路径规划等学科,面向教育研究领域,旨在为学生和教师提供高质量、高学科耦合度、高操作性 与可维护性的实验平台,以及为科研人员提供软硬件环境高度集成化、最新人工智能算法高度模块化、实验 编程操作高度可执行化的通用科研平台。
AI 全时全能在线,智慧互联无限可能!
2.2 产品介绍
2.2.1 产品外观与功能
机器人产品的外观如下图所示(具体型号以包装实物为准):
序号 | 名称 | 功能 |
---|---|---|
1 | 功能区 | 包含机器人的输入输出和开关按钮 |
2 | 外壳盖板 | - |
3 | 外壳侧板 | - |
4 | 激光雷达 | - |
5 | 空气开关 | - |
6 | 内部电源连接插口 | 机器人内部系统的供电插口 |
7 | 电池 | - |
8 | USB1 | 扩展接口 |
9 | USB2 | 扩展接口 |
10 | 网口 | 扩展接口 |
11 | HDMI | 扩展接口 |
12 | 启动开关 | 机器人的电源开关 |
13 | 急停开关 | 用于机器人的紧急制动 |
2.2.2 产品清单
序号 | 名称 | 示意图 | 数量 | 单位 |
---|---|---|---|---|
1 | 机器人本体 | - | 1 | 台 |
2 | 远程遥控手柄 | - | 1 | 个 |
3 | 电源适配器 | - | 1 | 个 |
4 | 产品手册 | - | 1 | 册 |
5 | 产品合格证 | - | 1 | 册 |
2.2.3 开机简易操控
开启机器人。首次开机时,请将机器人侧面的电池输出线与机器人电源插口连接,打开机器人侧面 的空气开关和顶部的急停开关,然后按下机器人顶部的启动开关,等待工控机自启动完成(约 30 秒);
手柄连接。按下手柄中间的红色按钮打开手柄,等待下方两个红点闪烁,表示连接中。当只有左侧 红点亮时表示手柄与机器人连接完成。如果没有连接成功,长按红色按钮,使手柄强制匹配机器人。
手柄操控。操控时,按住 X 键开启低速挡,最大线速度 0.4m;按住 A 键开启高速挡,最大线速度 0.5m。同时使用左侧摇杆控制机器人前进、后退以及转向。
机器人充电。机器人电量不足时,通过电源适配器连接机器人的充电插口进行充电。
2.3 产品使用说明
2.3.1 登录与总览
2.3.1.1 登录
将机器人顶部的启动开关按下,等待工控机自启动完成(约 30 秒)。使用平板、电脑等设备连接工 控机的自带热点。热点的默认名称为: TJNAV_01,热点默认密码为 robot123。若需要修改热点的 名称或密码,可在工控机的/etc/init.d/start_ap.sh 中进行编辑,保存并重启后生效。
输入网址“192.168.12.1:3000”,跳转至登录界面。推荐使用 chrome 谷歌浏览器。
分别输入用户名和密码,设备的默认用户名为“robot”,默认密码为“123”,即可登录成功。TJNAV 允许注册账户,目前对注册用户分为三级权限,分别是:开发者权限,调试者权限和使用者权限。 默认用户为开发者权限,若需要添加更高权限的用户名和密码,请与我们联系。
2.3.1.2 总览
界面的顶部有三栏可以点击选择,从上到下分别为“模式栏”,“功能栏”,“设置栏”。橙色框中的是“状态栏”,显示了设备当前的状态。
前端界面分为五大模式,(1)“UGV 系统”是关于整套设备的介绍,(2)“SLAM 系统”用于对环境的建图,(3)“地图编辑系统”能够对建好的地图进行手动修改,(4)“工厂模式系统”则用于在建好的地图上进行导航、循迹等一系列操作。(5)“本地终端”用于远程访问机器人。
接下来将分别对“SLAM 系统”、“地图编辑系统”、“工厂模式系统”、“设置栏”、“本地终端”进行介绍说 明。
2.3.2 SLAM系统 SLAM 系统用于建图、保存地图、载入地图等功能。
点击模式栏中的“SLAM 系统”,进入建图模式。建图步骤如下:
点击“开始建图”按钮,设备立即进入建图模式。
使用无线手柄或界面上的“底盘控制”,遥控设备建立环境地图。
在建图期间,可以随时点击“保存地图”按钮,在弹出的对话框中输入地图名称,点击“OK”,即保存地图成功。
在建图结束后,点击“结束建图”,建图模式结束。注意:结束建图不会自动保存地图,如需保存, 需要先点击“保存地图”,再点击“结束建图”。
地图保存后,设置栏中的地图管理中会显示出建立的新地图。可以点击“查看”按钮查阅建立的地图。
2.3.3 地图编辑系统
地图编辑系统用于编辑建立好的地图,对地图进行改进和修复。
点击模式栏中的“地图编辑系统”,进入地图编辑模式。
在地图编辑系统中,用户可以任意编辑建立好的地图,从而对建图过程中的一些瑕疵进行改进和修复。 用户可以使用“画图”工具,增加直线、多边形等多种形状和线条;可以使用“橡皮擦”工具,擦除地图中的个 别杂点和线条;可以在“线条宽度”中调整线条的粗细;可以在“画图方式”调整模式为描边或填充。
最后,在地图编辑完成后,点击“文件”栏中的“保存”按钮,保存地图。
2.3.4 工厂模式系统
点击模式栏中的“工厂模式系统”,进入工厂模式。工厂模式的功能如下: 1) “初始位置”:用于手动标定设备在地图上的初始位姿。
在地图上用鼠标点击设备大致所在的位置,并向设备正面大致所朝的方向拖拽箭头,就能够自动将 设备放在地图中正确的初始位置上。用户只需给出粗略的位置即可,一般情况下,控制机器人略微移动后,机器人即可自动校正自身定位。
- “任意目标”:用于给定任意目标点。
在地图上用鼠标点击目标点的位置,并向所期望设备面朝的方向拖拽箭头,即可为设备设定目标点的位姿。之后,界面上会自动规划出来一条轨迹线,即地图上的绿色线,设备会沿轨迹线移动至目 标点。
- “轨迹设置”:用于设计一条机器人移动的轨迹。 点击“添加新轨迹”,并为新轨迹起名。之后点击“添加轨迹点”,在地图上点击目标点来增加新的轨 迹点。若需要闭合轨迹,点击“闭合轨迹”,轨迹将自动首尾相连闭合,这样设备可以在轨迹上循环 行驶多次。在轨迹设计完成后,点击“保存轨迹”进行保存。保存后的轨迹可以在“地图管理”中看到。
另外,按住 CTRL 键并同时拖动轨迹点,可以重置轨迹点的位置;按住 SHIFT 键并同时拖动路径点,可以改变轨迹线的形状。
- “工作站”:用于在地图上添加工作站。
添加工作站有两种方式,(1)点击“机器人位置添加工作站”可以直接添加当前机器人位姿的地方为工作站,(2)点击“手动添加工作站”可以在地图上选点作为工作站。
- “充电桩”:用于在地图上添加充电桩。 添加充电桩的方式方法与 4)工作站 完全相同。
- “虚拟墙”:用于在地图上添加虚拟的不可达区域。 点击“添加新虚拟墙”,并为新虚拟墙起名。之后点击“添加虚拟点”,可以连续在地图上点击鼠标, 添加新的虚拟墙边界点。如果想要删除某个虚拟墙边界点,则可以点击“删除虚拟点”,然后在地图 上点击虚拟边界点,从而清除。在构造虚拟墙结束之后,点击“结束添加虚拟墙并保存”,虚拟墙保存完毕。添加的虚拟墙在地图上会以棕色的线来表示。
- “默认地图”:用于更改或加载默认地图。
若想把当前地图设置为默认地图,则点击“设置为默认地图”。若需要切换回默认地图,则点击“加 载默认地图”,一键切换(图 19左)。
- “保存配置”:用于保存在界面上的配置(图 19中)。
- “导航”:用于开始导航或终止导航(图 19右)。
- “停车”:用于紧急停车。
2.3.5 设置栏
设置栏包含“地图管理”、“底盘参数”、“轨迹参数”、“底盘控制”四部分设置。
- “地图管理”:用于载入不同的地图,添加轨迹,添加、前往工作站,添加、前往充电桩,以及添加 虚拟墙。
“已添加到地图上的”表示已经载入到当前地图中的元素。 “该地图下的所有”表示当前地图包含的所有对应元素(无论是否已经载入)。
- “底盘参数”:可以配置电机参数、电源管理以及超声波参数。
- “轨迹参数”:可以选择在导航时的避障策略,以及一系列导航时的可调参数。对参数调整后需要上 传到服务器才有效。
循环次数:机器人在轨迹上循环行进次数 站点等待时间:机器人行进到轨迹点后的等待时间 停车障碍范围:表示多少角度范围内有障碍物时,会触发停车 避障安全距离:表示车距离障碍物多少米时停车 规划安全距离:表示车辆停车后,会后退到距离障碍物多少米时重新规划路径
- “底盘控制”:包含两项功能:底盘控制和文本编辑器。 底盘控制:用于在界面直接遥控设备的行驶,以及设置直接遥控或者手柄遥控的前进速度和旋转速度。
文本编辑器:在该编辑器中,用户可以通过编程实现对机器人的信息获取、修改以及控制,可用于二次 开发。例如直接用代码控制机器人运动,或者读取机器人参数等。机器人提供丰富的封装函数,可直接调用 相关函数实现对应功能。封装函数在线说明文档见网址 http://121.229.2.136:5678/hardware_8h.html,编辑器 使用样例见工控机中 ugv_interface/examples 文件夹。目前文本编辑器暂时只支持 C++语言。
2.3.6 本地终端
本地终端用于对机器人进行远程访问。本地终端需要登录,账号和密码都是 tjark。注意:在本地的电脑 上使用浏览器第一次点击本地终端时,会显示被阻拦或网页无法打开,这是因为网页证书安全性不高,导致 功能被拦截。解决方法是:第一次使用前先手动输入以下网址:https://192.168.12.1:4200,若提示有风险, 则点击继续,从而便可以正常使用在线的本地终端功能。
2.4 安全使用注意事项
符号 | 说明 |
---|---|
⚠️ 警告 |
-
产品安装使用过程中,必须严格遵守国家和使用地区的各项电气全规定。 - 请使用厂家提供的电源适配器,电源适配器具体要求参见产品参数表。 - 为减少火灾或电击危险,请勿让产品受到雨淋或受潮。 - 为了避免热量积蓄,请保持设备周边通风流畅。请勿直接触碰设备散热部件,以免烫伤。 - 不要以任何方式拆卸或修改产品。(对未经认可的修改或维修导致的问题,本公司不承担任何责任)。 |
⚠️ 注意 |
-
请勿在极热、极冷、多尘、有腐蚀性、高盐碱或者高湿度的环境下使用产品,具体温、湿度要求参见产品的参数表。 - 请勿将设备放置于具有腐蚀性气体的环境,腐蚀性气体会对设备造成破坏。 - 避免将产品放在阳光直射地点、通风不良的地点,或如加热器或暖气等热源附近(忽视此项可能会导致火灾危险)。 |
ℹ️ 说明 |
-
对安装和维修人员的素质要求 具有从事机器人系统安装、维修的资格证书或经历,并有从事相关工作的资格, 此外还必须具有如下的知识和操作技能: - 具有机器人系统及组成部分的基础知识和安装技能; - 具有电子线路接线、网络及机构安装的基础知识和操作技能。 |
3 - 无人机(Dji RobomasterTT)操作手册
## 3.1 虚拟机与Linux系统的创建(可选)
方法一(推荐):安装Vmware Workstation Pro
简略的安装使用教程为: a.从官网下载VMware安装包,双击运行,按照指引安装; https://www.vmware.com/go/getworkstation-win a.1 下载
a.2 下载完成之后双击运行 exe文件,点击“下一步”
a.3 勾选“我接受许可协议”,点击下一步
a.4 默认安装路径是C盘,可以修改也可以不改。如果C盘小于250G,建议安装到非系统盘,点击“更改”修改安装路径
a.5 把哪两个√ 去掉,因为没有什么作用,点击“下一步”
a.6 点击“下一步”
a.7 点击”安装“开始安装Vmware
a.8 点击”许可证”以获取永久使用权
a.9 复制粘贴秘钥,后点击“输入”,安装完成
a.10 点击完成
a.11 双击桌面的Vmware图标打开应用,点击“帮助”菜单下的“关于VMware Workstation”选项
a.12 可以看到许可证为“永不过期”,安装到此完毕
b.下载你中意的Linux发行版安装镜像(我们推荐使用Debian系的发行版,如Ubuntu 18.04 LTS及以上版本); https://ubuntu.com/download/desktop
c.新建虚拟机,按照指引配置cpu核心数、内存、硬盘接口和大小; https://docs.vmware.com/cn/VMware-Workstation-Pro/16.0/workstation-pro-16-user-guide.pdf c.1 创建虚拟机
c.2 向导选择自定义
c.3 然后下一步再下一步,直到这里,稍后再安装系统
c.4 然后选择linux,注意这里下面的下拉选择Ubuntu64,因为我们下载的是64位的,如果你的电脑是32位的,就选Ubuntu即可。
c.5 选择安装位置,这里必须输入一个已存在的目录,不然后面会报错。
c.6 后面设置处理器和内存的,电脑配置好的可以试试,否则采用默认的,博主这里是采用默认的,然后下一步…,直到这里,选择将虚拟机存储为单个磁盘:
c.7 然后下一步,到如下页面,点击自定义硬件:
c.8 然后如下图选择我们第一步下载的Ubuntu镜像:
c.9 然后点击完成,向导设置完成
c.10 虚拟机已经配置完毕,接下来我们开启虚拟机:
c.11 然后就会来到如下界面,如果出现错误请看(四、可能遇到的错误),我们选择中文简体点击Install Ubuntu:
c.12 到了如下界面,我们点击继续:
c.13 然后点击,开始安装:
c.14 到了这界面,点击继续:
c.15 选择好你的语言和位置,开始安装。
方法二:如果你装有Windows10 (x64)1903 build 18362/(arm64)2004 build 19041及以上的版本,你可以选择使用Windows自带的WSL2子系统安装Ubuntu:
https://docs.microsoft.com/zh-cn/windows/wsl/install-win10 a.以管理员身份打开 PowerShell 并运行:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
b.下载安装WSL2内核更新包并以管理员权限安装: https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi c.将WSL2设为默认版本: wsl --set-default-version 2 d.从微软商店中获取Linux发行版并安装: https://www.microsoft.com/store/apps/9n6svws3rx71
e.启动安装好的发行版,并设置用户名密码,大功告成。
3.2 在Linux系统中(实机或虚拟机)安装Python环境
a.首先,安装构建 Python 所需的开发包 sudo apt update sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev curl
b.下载最新的稳定版本的 Python 3 访问官方 Python 网站并下载最新版本的 Python
3。下载完成后,你会有一个.tar.xz
归档文件(“tarball
”),其中包含 Python 的源代码。
c.解压 tarball 下载完成后,使用解压程序或 Linux 的 tar
命令解压压缩包,例如: tar -xf Python-3.?.?.tar.xz d.配置脚本 解压
Python 压缩包后,进入configure
脚本所在目录并在 Linux
终端中使用以下命令执行该脚本: cd Python-3.* ./configure e.开始构建过程
如果你的系统上已经安装了某个版本的 Python,并且希望同时安装新版本的
Python,请使用以下命令: sudo make altinstall
构建过程可能需要一些时间。
如果要使用此版本替换当前版本的 Python,那么应使用包管理器(例如
apt
或dnf
)卸载当前的 Python 包,然后安装:
sudo make install
但是,通常最好以软件包的形式(例如.deb
或.rpm
文件)来安装软件,以便系统可以为你跟踪和更新它。因为本文假设尚未打包最新的
Python,所以你可能没有这个选择。在这种情况下,你可以按照建议使用
altinstall
来安装 Python,或者使用最新的源代码重构现有的
Python
包。这是一个高级主题,并且特定于你的发行版,因此不在本文讨论范围之内。
f.验证安装 如果你没有遇到任何错误,那么现在你的 Linux 系统上已安装了最新的 Python。要进行验证,请在终端中输入以下命令之一: python3 --version 或者 python --version
g.创建虚拟环境(可选) Python 提供了名为 venv(虚拟环境)的软件包,可帮助你将程序目录或软件包与其他目录或软件包隔离。
要创建虚拟环境,请在 Python 终端中输入以下内容(在此示例中,假定你安装的 Python 版本为 3.8 系列): python3.8 -m venv example 该命令创建一个带有一些子目录的新目录(我将其命名为 example)。
要激活虚拟环境,请输入: source example/bin/activate 请注意,你的终端提示符($)现在以环境名称开头。
要停用虚拟环境,请使用 deactivate 命令: (example) $ deactivate
h.在Ubuntu中ctrl+alt+T打开命令行终端(实机、虚拟机或直接启动WSL2进入终端),输入以下命令安装pip包管理工具: sudo apt update sudo apt install python-is-python3 python3-pip i.使用刚装好的pip包管理工具安装所需要的库 pip install numpy opencv-python torch torchvision pillow matplotlib robomaster
##3.3 Robomaster Tello Talent 使用介绍
a.在官方GitHub上下载Robomaster-SDK的示例代码。 git clone https://github.com/dji-sdk/RoboMaster-SDK.git
b.RoboMaster SDK 和无人机建立连接 - 连接方式
教育无人机目前主要包括 Tello EDU 以及 Tello Talent,Robomaster SDK支持通过WIFI直连模式与这两款产品建立连接。
- Wi-Fi 直连 : 通过将机器人设置为直连模式,并连接机器人的 WIFI 热点进行接入,WIFI 直连模式下,机器人默认 IP 为 192.168.10.1
首先将机器人设置为 WIFI 直连模式
Tello EDU : 短按图中红色剪头所示电源按键,等待黄灯快闪开机完成,机器人出厂默认即为 WIFI 直连模式,如果开机时为组网模式, 可以通过电源按键重置 WIFI:在开机状态下,长按电源键 5s,期间状态指示灯将熄灭后再闪烁黄灯。 状态指示灯显示黄灯快闪后, WIFI 的 SSI 和密码将重置为出厂设置,默认无密码
Tello Talent :: 开启机器人电源,切换扩展模块的模式开关至 直连模式,如下图所示:
准备具有WIFI连接功能的设备连接教育无人机的 WIFI,例如:DJI 妙算、Jetson Nano 或 PC:
参考sdk代码 /examples/12_drone/01_ap_conn.py 目录下的例程
from robomaster import robot
if __name__ == '__main__':
# 如果本地IP 自动获取不正确,手动指定本地IP地址
# robomaster.config.LOCAL_IP_STR = "192.168.10.22"
tl_drone = robot.Drone()
# 初始化
tl_drone.initialize()
# 获取飞机SDK版本信息
version = tl_drone.get_sdk_version()
print("Drone SDK Version: {0}".format(version))
tl_drone.close()
运行结果: Drone SDK Version: xx.xx.xx.xx
- 组网模式 :
组网模式 :将机器人设置为组网模式,并连接SDK运行设备所在的局域网进行接入,
首先将飞机设置为 直连模式,并且与运行SDK的设备连接,具体操作参考上一小节
运行提供的示例程序 /examples/12_drone/23_set_sta.py (GitHub RoboMaster SDK repository), 将程序中的 ssid 与 password 参数改为当前使用的路由器的账号与密码
import robomaster
from robomaster import robot
if __name__ == '__main__':
tl_drone = robot.Drone()
tl_drone.initialize()
# 切换飞行器WiFi模式为组网模式,指定路由器SSID和密码
tl_drone.config_sta(ssid="RoboMaster_SDK_WiFi", password="12341234")
tl_drone.close()
切换扩展模块的模式开关至组网模式,之后机器会自动连接到指定的路由器所在的局域网内。
将运行SDK的设备也连接至该局域网内,此时SDK与机器即在同一网络内。
c.初始化机器人 在进行与机器人相关的操作之前,需要根据指定的配置初始化机器人对象。
首先从安装的 robomaster 包中导入 robot 模块:
from robomaster import robot
指定 RoboMaster SDK
的本地ip地址(如需手动指定),在本示例中,查询得到本地的ip地址为
192.168.2.20 (在命令行终端输入ip a
),
如需指定ip使用以下语句: robomaster.config.LOCAL_IP_STR = "192.168.2.20"
>大部分情况下SDK能够自动获取正确的本地ip,无需手动指定这一步骤,但是当SDK运行在多网卡同时使用的设备时,
自动获取的ip可能不是与机器人进行连接的ip,此时需要手动指定ip
创建 Drone 类的实例对象 tl_drone, tl_drone 即一个机器人的对象: tl_drone = robot.Drone()
初始化机器人,目前教育系列无人机的初始化不需要传入任何参数:
tl_drone.initialize()
至此,机器人的初始化工作就完成了,接下来可以通过相关接口对机器人进行信息查询、动作控制、多媒体使用等操作, 本文档将在后面的部分对几类接口的使用分别进行介绍
d.获取模块对象
部分 SDK 接口属于 Drone 对象本身,因此可以通过 Drone 对象直接调用, 但是一些接口属于 Drone 对象包含的其他模块,比如飞机电池的信息获取接口在 led 模块对象中, 飞行器的控制接口在 flight 模块对象中,等等。如果想使用这些接口需要首先获得相应的对象, 这里以获取 flight 模块对象举例,介绍如何获取这些对象
首先按照 初始化机器人 章节的介绍完成机器人对象的初始化操作
可以使用两种方法获取 flight 对象
方法一:直接使用 . 运算符从 Drone() 对象中获取 flight 对象:
tl_flight = tl_drone.flight
方法二:利用 Drone 对象的 get_module() 方法获得指定的对象:
tl_flight = tl_drone.get_module("flight")
获取了相关对象,便可以通过该对象调用其所包含的 SDK 接口
e.释放机器人资源
在程序的最后,应该手动释放机器人对象相关的资源,包括释放网络地址、结束相应后台线程、释放相应地址空间等, 在 Drone 对象中,提供了用来释放相关资源的方法 close(),使用方法如下:
tl_drone.close()
为了避免一些意外错误,记得在程序的最后调用 close() 方法哦!
f.动作类接口的使用
动作类接口是用来控制机器人执行某些指定动作的接口,根据动作本身特性的不同, SDK中包含即时动作控制与任务动作控制两类动作接口。 由于飞机类机器人本身的特性决定必须要起飞后才能进行控制, 因此本文档将首先会介绍任务动作控制,带领大家熟悉了飞行类动作之后会再介绍即时动作控制类的接口使用
- 任务动作控制:
任务动作是指需要持续一段时间才能完成的动作,比如控制底盘向前运动一米, 底盘对于该动作需要执行一段时间才能到达指定地点。通过 SDK 控制任务动作时, SDK 将对应的任务发送给机器人,机器人收到任务后会选择执行/拒绝执行(存在机器人当前时刻无法执行对应任务的情况)并通知 SDK, 如果选择执行任务,会在任务完成时再次告知 SDK。在使用任务动作控制接口时,用户需要注意以下两点:
任务动作接口的返回值为action
对象,action
对象提供 wait_for_completed(timeout)
方法, 用户可以通过
timeout
参数指定动作的超时时长。当调用
wait_for_completed(timeout)
方法时,
程序会阻塞在该语句,直至动作执行完毕或执行超时
同一模块同一时间只能执行一个动作,
因此同一模块的任务之间互斥;不同模块之间的相互独立,动作可以同时执行。
比如在使用任务动作控制接口后不立即调用 wait_for_completed()
方法时,用户在控制云台移动到指定角度的同时可以控制底盘移动到指定位置,
但是不支持在上次控制云台的任务动作还未完成时再次发送其他的控制云台的任务动作
>如果在使用任务动作控制接口时不马上调用
wait_for_completed()
方法,切记程序中要控制好逻辑,
避免在该任务执行完毕前发送与其互斥的其他任务动作命令! -
示例一:控制飞机起飞并前后飞行
在本例程中,首先需要控制飞机起飞,之后控制飞机起飞并向前飞行50cm
首先按照 初始化机器人 章节的介绍完成机器人对象的初始化操作
飞行控制接口属于 flight
模块,首先按照 获取模块对象
章节的介绍获取 flight
对象,
由于本示例中同时也会控制扩展led模块,因此也需要获取 led
模块, 本示例中使用方法一获取模块对象:
tl_flight = tl_drone.flight
tl_led = tl_drone.led
之后控制飞机起飞升空,控制起飞时通过调用任务动作接口返回的
action
中的 wait_for_completed()
方法阻塞程序直至起飞完成: tl_flight.takeoff().wait_for_completed()
接下来会控制飞机向前飞行50cm,本示例为了说明任务类动作的特点,在控制飞机飞行后会设置扩展led灯效。
使用 flight
对象中的 forward()
方法控制底盘向前飞行,该方法都只有一个参数 distance
,
用来指定飞行距离。 设置扩展led模块可以参考
示例一:设置机器人扩展led模块
。接下来本文档会使用三种方法使用任务动作接口
方法一:执行任务动作后,立即调用 wait_for_completed()
方法: tl_flight.forward(distance=50).wait_for_completed()
tl_led.set_led(r=255, g=0, b=0)
方法二:在执行其他命令后再调用 wait_for_completed()
方法: 1
2
3flight_action = tl_flight.forward(distance=50)
tl_led.set_led(r=255, g=0, b=0)
flight_action.wait_for_completed()wait_for_completed()
方法,利用延时来保证动作执行结束: flight_action =
tl_flight.forward(distance=50) tl_led.set_led(r=255, g=0, b=0)
time.sleep(8)
三种任务动作接口的调用形式对应机器人的行为不同,方法一 机器人会向前飞行到达指定地点后再将扩展led模块设置为红色, 而 方法二 与 方法三 向前飞行的过程中将扩展led模块设置为红色。
方法二 与 方法三 中,要注意不能在飞行过程使用其他
ack
为ok/error
的接口!
建议使用 方法一 以及 方法二 ,在合适的时机调用
wait_for_completed()
是比较安全的做法
飞机降落: tl_flight.land().wait_for_completed() 利用 释放机器人资源 章节的介绍释放相关资源
示例程序中提供了一个完整的控制底盘前后各飞行50cm的例程
examples/12_drone/07_forward_backward.py
, 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20import robomaster
from robomaster import robot
if __name__ == '__main__':
tl_drone = robot.Drone()
tl_drone.initialize()
tl_flight = tl_drone.flight
# 起飞
tl_flight.takeoff().wait_for_completed()
# 向前飞50厘米,向后飞50厘米
tl_flight.forward(distance=50).wait_for_completed()
tl_flight.backward(distance=50).wait_for_completed()
# 降落
tl_flight.land().wait_for_completed()
tl_drone.close()
即时控制类动作是指设置后马上生效的动作,特指宏观上是“瞬时”执行的动作, 接下来本文档将通过控制遥控器杆量带大家熟悉此类动作接口。
- 示例一:控制遥控器杆量
控制遥控器杆量是一种典型的即时控制,发出控制指令后机器人将会立即按照指定速度与方向飞行
首先按照 初始化机器人 章节的介绍完成机器人对象的初始化操作
飞行控制接口属于 flight
模块,首先按照
获取模块对象 章节的介绍获取 flight
对象,
本示例中使用方法一获取模块对象:
tl_flight = tl_drone.flight
之后控制飞机起飞升空,控制起飞时通过调用任务动作接口返回的
action
中的wait_for_completed()
方法阻塞程序直至起飞完成:
tl_flight.takeoff().wait_for_completed()
接下来会控制飞机以指定的速度向左飞行三秒钟然后停止。 使用
flight
对象中的 rc()
方法控制底盘向前飞行,方法有控制横滚、俯仰、油门、偏航四个速度的参数,可以通过api文档中的介绍详细了解,
本示例中令横滚的控制参数 a
的值为 20,
来达到飞机左飞的目的,
在三秒后将飞机的所有速度全设为0,达到停止飞行的目的:
tl_flight.rc(a=20, b=0, c=0, d=0)
time.sleep(4)
飞机降落:
tl_flight.land().wait_for_completed()
利用 释放机器人资源 章节的介绍释放相关资源
示例程序中提供了一个完整的通过遥控器杆量控制飞机飞行的例程
examples/12_drone/13_rc.py
,
import time
import robomaster
from robomaster import robot
if __name__ == '__main__':
tl_drone = robot.Drone()
tl_drone.initialize()
tl_flight = tl_drone.flight
# 起飞
tl_flight.takeoff().wait_for_completed()
# 左移
tl_flight.rc(a=20, b=0, c=0, d=0)
time.sleep(4)
# 右移
tl_flight.rc(a=-20, b=0, c=0, d=0)
time.sleep(3)
# 停止
tl_flight.rc(a=0, b=0, c=0, d=0)
# 降落
tl_flight.land().wait_for_completed()
tl_drone.close()
g.查询类接口的使用
查询类接口即数据获取类接口,用户可以通过该类接口获取机器人自身的状态信息以及传感器状态等信息, 接下来将从查询机器人SDK固件版本信息与查询机器人SN号两个例子来帮助用户掌握该类型接口的用法. - 示例一:查询机器人固件SDK版本
首先按照 初始化机器人 章节的介绍完成机器人对象的初始化操作
使用 Drone 对象的 get_sdk_version() 方法,方法的返回值即为代表机器人SDK固件版本号的字符串, 并且将获取到的版本号打印出来: drone_version = tl_drone.get_sdk_version() print("Drone sdk version: {0}".format(drone_version))
利用 释放机器人资源 章节的介绍释放相关资源
完整的程序参考示例文件
/examples/12_drone/02_get_version.py
import robomaster
from robomaster import robot
if __name__ == '__main__':
tl_drone = robot.Drone()
tl_drone.initialize()
# 获取飞机版本信息
drone_version = tl_drone.get_sdk_version()
print("Drone sdk version: {0}".format(drone_version))
tl_drone.close()
- 示例二:获取机器人SN号
首先按照 初始化机器人 章节的介绍完成机器人对象的初始化操作
利用 Drone 对象使用 get_sn()
方法,方法的返回值即为代表机器人SN号的字符串,
并且将获取到的SN号打印出来: SN = tl_drone.get_sn() print("drone sn:
{0}".format(SN)) 利用 释放机器人资源 章节的介绍释放相关资源
完整的程序参考示例文件 /examples/12_drone/03_get_sn.py
import robomaster
from robomaster import robot
if __name__ == '__main__':
tl_drone = robot.Drone()
tl_drone.initialize()
# 获取飞机SN信息
SN = tl_drone.get_sn()
print("drone sn: {0}".format(SN))
tl_drone.close()
h.设置类接口的使用
设置类接口可以完成对机器人的相关模块的设置,本文档接下来将通过设置扩展led模块讲解设置类接口的使用 >设置扩展led灯目前只有 Tello Talent 机器支持! - 示例一:设置机器人扩展led模块
下面介绍如何通过 SDK 实现设置机器人机器人扩展led模块的操作
首先按照 初始化机器人 章节的介绍完成机器人对象的初始化操作,
机器人的装甲灯设置接口属于 Drone
对象包含的
led
模块,因此首先需要获取 led
对象, 按照
获取模块对象 章节的介绍获取 led
对象,
本示例中使用方法一获取模块对象: tl_led = tl_robot.led
使用 led
对象中的 set_led()
方法设置机器人的扩展led灯效, 在使用 led
方法时,通过
r g b
参数可以指定led的颜色,这了将其指定为红色:
tl_led.set_led(r=255, g=0, b=0)
利用 释放机器人资源 章节的介绍释放相关资源
示例程序中提供了一个完整的设置装甲灯的例程
/examples/12_drone/20_led.py
,
例程中利用了for循环,实现了led灯的8次颜色变换,每次维持0.5秒钟
import time
import robomaster
from robomaster import robot
if __name__ == '__main__':
tl_drone = robot.Drone()
tl_drone.initialize()
tl_led = tl_drone.led
tl_led.set_led(r=0, g=0, b=0)
rgb_list = [(100, 100, 100), (255, 255, 255), (255, 0, 0), (0, 0, 255), (0, 255, 0), (255, 255, 0), (255, 0, 255), (0, 255, 255)]
for rgb_info in rgb_list:
tl_led.set_led(r=rgb_info[0], g=rgb_info[1], b=rgb_info[2])
time.sleep(0.5)
tl_drone.close()
i.多媒体接口的使用
教育系列无人机的多媒体部分主要指获取视频流 - 示例一:获取视频流
获取机器人采集到的视频流有助于实现一些非常实用的案例,下面本文档将介绍如何通过 SDK 获取视频流
首先按照 初始化机器人 章节的介绍完成机器人对象的初始化操作,
由于示例中会用到 camera
模块的相关定义,因此还需要导入
camera
模块:
from robomaster import camera
获取视频流相关的接口属于属于 camera 模块,首先按照 获取模块对象
章节的介绍获取 camera 对象, 本示例中使用获取模块对象
_
章节介绍的方法一获取模块对象:
tl_camera= tl_robot.camera
camera
模块的 start_video_stream 方法有两个参数,
display
参数指定是否显示获取到的视频流,在本示例中,向大家介绍两种获取视频流的方法,
方法一:获取视频流并直接播放显示十秒:
tl_camera.start_video_stream(display=True)
time.sleep(10)
tl_camera.stop_video_stream()
方法二:获取视频流,通过cv2提供的方法显示200帧图像:
tl_camera.start_video_stream(display=False)
for i in range(0, 200):
img = tl_camera.read_cv2_image()
cv2.imshow("Drone", img)
cv2.waitKey(1)
cv2.destroyAllWindows()
tl_camera.stop_video_stream()
第一种方法直接通过 camera
对象的
start_video_tream()
方法将机器人些采集到的视频流通过SDK获取并播放; 第二种方法通过
camera
对象的 start_video_stream
方法获取到视频流,之后通过 cv2.inshow()
播放获取到的视频流
利用 释放机器人资源 章节的介绍释放相关资源
示例程序中同时提供了一个完整的获取视频流之后利用cv2提供的方法显示图像的例程
examples/04_camera/01_video_with_display.py
from robomaster import robot
if __name__ == '__main__':
tl_drone = robot.Drone()
tl_drone.initialize()
tl_camera = tl_drone.camera
# 显示302帧图传
tl_camera.start_video_stream(display=False)
tl_camera.set_fps("high")
tl_camera.set_resolution("high")
tl_camera.set_bitrate(6)
for i in range(0, 302):
img = tl_camera.read_cv2_image()
cv2.imshow("Drone", img)
cv2.waitKey(1)
cv2.destroyAllWindows()
tl_camera.stop_video_stream()
tl_drone.close()
3.4 使用智能图像识别系统YOLOv3训练自己所需要的图集
开始之前
克隆这个 repo,下载教程数据集,并安装requirements.txt依赖项,包括Python>=3.8 和 PyTorch>=1.7。 git clone https://github.com/ultralytics/yolov3 # clone repo cd yolov3 pip install -r requirements.txt # install dependencies
训练自定义数据集
a.创建 dataset.yaml
COCO128是一个小型的教程数据集,由COCO train2017的前128张图片组成。这些相同的128张图片被用于训练和验证,以验证我们的训练管道是否能够过度拟合。data/coco128.yaml,如下图所示,是数据集的配置文件,它定义了1)一个可选的自动下载命令/URL,2)一个训练图片目录的路径(或带有训练图片列表的*.txt文件的路径),3)与我们的验证图片相同,4)类的数量,5)一个类名列表。
# download command/URL (optional)
download: https://github.com/ultralytics/yolov5/releases/download/v1.0/coco128.zip
# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: ../coco128/images/train2017/
val: ../coco128/images/train2017/
# number of classes
nc: 80
# class names
names: ['person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light',
'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow',
'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee',
'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard',
'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple',
'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch',
'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard',
'cell phone', 'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors',
'teddy bear', 'hair drier', 'toothbrush']
b.创建标签 Labels 使用CVAT、makesense.ai或Labelbox等工具为你的图像贴上标签后,将你的标签导出为YOLO格式,每张图像有一个 *.txt文件(如果图像中没有物体,则不需要 *.txt文件)。*.txt文件的格式要求是:
- 每个物体有一行
- 每行是
class x_center y_center width height
格式。 - 方框坐标必须是 normalized xywh
格式(从0-1)。如果你的框体是像素,
请将
x_center
和width
除以图像宽度,y_center
和height
除以图像高度。 - 类的序数是从0开始计的。
与上述图片相对应的标签label文件包含2个人(class 0)和一条领带(class 27)。
c.整理文件路径
根据下面的样例来整理你用于训练、取值的图片和标签。在这个例子中,我们假设/coco128
在/yolov3
目录的旁边。YOLOv3通过用/labels/
替换每个图像路径中的最后一个/images/
来自动定位每个图像的标签。比如说:
dataset/images/im0.jpg # image dataset/labels/im0.txt # label
d.选择模型
选择一个预训练的模型来开始训练。这里我们选择YOLOv3,这是目前最小和最快的模型。参见我们的README表,了解所有模型的全面比较。
e.开始训练
在COCO128上训练一个YOLOv3模型,指定数据集、批量大小、图像大小和预训练的--weight yolov3.pt
(推荐),或随机初始化的--weight '' --cfg yolov3.yaml
(不推荐)。预训练的权重是自动从最新的YOLOv3版本中下载的。
# Train YOLOv3 on COCO128 for 5 epochs
python train.py --img 640 --batch 16 --epochs 5 --data coco128.yaml --weights yolov3.pt
所有的训练结果都保存在running/train/
中,并有递增的运行目录,即running/train/exp2
,running/train/exp3
等。
可视化
Weights(权重) & Biases(偏差) 记录
权重与偏差(W&B)现在与YOLOv3集成,用于实时可视化和云记录训练运行。这允许更好的运行比较和内省,以及改善团队成员之间的可视性和协作。要启用W&B记录,请安装wandb
,然后正常训练(第一次使用时会有指导性设置)。
pip install wandb 训练过程中,你可以在https://www.wandb.com/
实时查看进度,还可以使用W&B报告工具创建详细的结果报告。
本地日志
所有的结果都默认记录在run/train
中,为每个新的训练创建一个新的实验目录,如run/train/exp2
、run/train/exp3
等。查看训练和测试的图片,可以看到马赛克、标签、预测和增强效果。请注意,Mosaic
Dataloader被用于训练(如下图所示),这是由Ultralytics开发的新概念,在YOLOv4中首次出现。
train_batch0.jpg
显示训练批次0的马赛克和标签。
test_batch0_labels.jpg
显示测试批次0的标签。
test_batch0_pred.jpg
显示测试批次0的预测结果。
训练损失和性能指标也被记录到Tensorboard和一个自定义的results.txt
日志文件,在训练完成后被绘制成results.png
(如下)。这里我们展示了YOLOv3在COCO128上训练到300个历时,从零开始(蓝色),以及从预训练的--weight yolov3.pt
(橙色)。
from utils.plots import plot_results
plot_results(save_dir='runs/train/exp') # plot results.txt as
results.png
3.5 运行无人机样例程序
a.获取空地协同系统无人机控制样例代码: git clone https://github.com/NessajCN/djiRobomasterTT-yolov3.git
b.将训练好的模型权重文件yolov3.weights放置在djiRobomasterTT-yolov3/ 目录下,将02_patrolnew.py中116和117行中的无线网卡名称改为你自己的网卡(使用ip a命令可以查看)。
c.挑选空旷处把挑战卡放到地上,无人机放在挑战卡上,开启无人机。将电脑的无线网络连接改为RMTT-**。
d.运行 python 02_patrolnew.py