完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
4个回答
|
|
1.3 方案设计及创新点
本方案采用一个六旋翼无人机作为平台,该无人机可载重5kg到6kg。无人机主体结构采用碳纤维板材切割而成,强度高,密度小,有利于减轻无人机总重,连接部分采用铝合金外刷漆防锈制成,结构强度高。机臂部分采用六根20mm的碳纤管,末端连接电机和电调,既对称美观又不易在飞行过程中偏坠。无人机最上方安装有一个云台和激光雷达,用于生成障碍物点云图从而感知周围障碍物。无人机前下方倒置一个三轴云台和运动摄像机,用于操纵者观察正前方视频画面。无人机后部安装有机载电脑和机械臂舵机控制板,机载电脑用于对协助飞控对飞行过程中的各种传感器数据进行储存和分析,从而控制其他机载设备。舵机控制板采用arduino mega 2560,通过USB串口与机载电脑连接。机械臂部分采用双机械臂设计,由一个三自由度和六自由度的机械臂组成,三自由度机械臂采用遥控器远程控制,六自由度机械臂采用机载电脑自动化控制,并且六自由度机械臂具有环境感知的功能,可自动感知周围障碍物并规划运动路线。 创新点: 1.本项目解决了景区垃圾、危险核废料难处理的行业痛点问题,正如之前背景部分所描述的,自然风景区中山区、深水区等危险区域乃至核污染区域垃圾废料处理的难题一直耗费大量的人力物力成本。本项目基于无人机、机器学习、计算机视觉、自动控制等技术,有效解决了这一难题,具有较高的市场价值和行业前景。 2.多项创新和技术融合,综合应用了精准无人机定位、无人机自动控制等技术。采用强化学习中的Q学习算法和cartographer算法实现了稳定性高的精准避障。基于机械臂控制方面,应用了学术界最新的ikFast算法,极大的提高了机械臂运动速度和工作效率。 3.本项目采用了MANIFOLD 妙算机载电脑,拥有PC独立显卡级别的绘图能力,可以充分带动图像识别、自动控制、避障算法,高效准确地完成自动化、半自动化作业。 4.本项目自动化程度高,清理效率高。本项目基于强化学习、计算机视觉、无人机自动控制等技术,拥有较高的自动化程度。可以灵活高效地完成核废料清理险情抢救时关键设备布局等任务。 5.采用3+6自由度双机械臂配合作业,具有环境感知的功能,可自动感知周围障碍物并规划运动路线。 第二章 电路与通信部分实现 2.1 无人机主控制电路部分 2.1.1 大疆妙算 妙算为DJI第一代On-board SDK开发平台,配备了NVIDIA公司的低功耗性能嵌入式芯片Tegra K1 作为核心处理器,具备最高达到326GFLOPS的计算能力。妙算与DJI经纬M100飞行平台高度集成,可以为用户提供便捷的开发途径。并且妙算支持用户自己最大化性能。有UART 2/UART 3串口以连接经纬M100飞行平台上的UART串口。 2.1.2 云台电路 1.云台控制板 云台控制板采用stm32f103的最小系统板,基于arm cortex-m3微处理器,主频可达到168MHz,它具有64K字节的FLASH闪存器,最大64K字节的SRAM,功耗较低,拥有共12个DMA通道,以及多达15个通信接口,包括6个USART,3个SPI,2个CAN,以及一个SDIO接口,原理图如下图所示 2.云台电机 该三轴云台具有三个小功率微型精密减速电机,主要结构由传动齿轮,无刷直流电机构成,具有相应快速,起动转矩较大等特点,在水平,横滚,俯仰三个轴,通过stm32控制板的基于经典PID的闭环控制理论对云台进行增稳控制。 2.1.3 无人机图传电路 本无人机使用了两个模拟信号图传,分别是机载电脑图传与摄像头图传 1.机载电脑图传 机载电脑通过HDMI接口同步输出高清视频与双通道音频,介于HDMI无线数字图传需要技术方面比较苛刻,本项目采用HDMI转ypbpr的方式来对HDMI信号分离,进而通过模拟图传实现信号的远距离传输,模拟图传由于没有编码过程,因此在延时方面更有优势,该图传带有LC滤波器,能有效消除图传波纹干扰,做到视频信号滤波处理,该图传自带PA放大电路,总功率为2W,采用高增益平板天线代替普通天线起到信号放大的作用。 2.摄像头图传 采用AVL58的5.8G数字传输电台,该电台具有配套的地面端和空中端,具有频率切换的功能,本项目在接收机上新增了一个专用通道用于对数传进行频道切换,从而有效地避免同频道直接的干扰。 2.2 无人机机载机械臂 2.2.1 数字舵机电路 数字舵机可以将动力脉冲发送到舵机马达之前,对输入的信号根据特定的参数进行处理,做到优化舵机性能,该舵机采用PID优化算法,具有自锁功能,确保机械臂的稳定性。 2.2.2 舵机控制板电路 舵机控制是使用stm32f103实现的,其最高72MHz工作频率,在存储器的0等待周期访问时可达1.25DMips/MHZ。其运行速率可以满足本产品对机械臂底层驱动的要求,实现对机械臂稳定安全的驱动。 第三章 无人机机械设计 3.1 无人机机架设计 本项目无人机机架采用碳纤维材料,无人机自上而下共有四层碳纤维切割而成的板,碳纤板与碳纤管的连接采用金属件刷上防锈漆。电机座使用激光切割机切出形状后用铣刀钻出M4螺丝孔。本项目采用铝合金连接件固定电池板,电池板下倒置双机械臂。中心碳纤板上使用尼龙柱固定主分电板和24V降压模块,飞控和PMU固定于中心碳纤板后方,并通过铝合金连接件连接上方碳纤板。上方碳纤板固定机载电脑,OSD,图传等模块。最上方的板上装有单线激光雷达,周围无障碍物,可保证激光雷达测障的准确度。 3.2 机械臂设计 由于我们开发的带臂无人机目前有两种设计用途,一种为对某些物件的夹取搬运,另一种为高空作业、设备的简单检修,因此机械臂的设计中分为两类:夹取搬运类与空中作业类,每一类则可根据物件大小更换不同的“手指”型号,两类机械臂在闲置时都被折叠于机腹,在需要使用时才被调用张开。目前暂定夹取搬运类为两个展开状态长为80cm的4自由度机械臂,空中作业类则为一个展开长度为80cm的3自由度机械臂与展开长度为70cm的6自由度带摄像头机械臂。 在执行的任务为夹取搬运的时候,考虑到两只手一起搬运东西会更为稳健,同时仅一只手容易导致重心不平衡的问题,故采用双臂方案。同样地,机械臂的末端“手部”同样采取了模块化设计,根据需要夹持的目标物体大小可以快速地更换模块,以适应不同的抓取需求。既可以是抓取拥有把手的较大物体时使用的“双括号型”(《》),亦可以是捏取小型物体的“ll型”。“双括号型”在抓取时会扣住其把手,尽可能防止晃动,如果把手过于光滑而滑落,作为补救措施其亦不会掉出机械臂“手指”所构成的环。“ll型”亦如其名,为两根平行移动的机械手指,用于精确地捏取目标物体,或与另一只机械臂一同紧抓其两端将其取走。在机械臂的右臂上装有小型摄像头,以提供精准的物体定位服务,反馈至控制板以更精准地进行抓取。 执行任务为高空作业类时,机器人所搭载的机械臂为一长一短,自由度为3(长)+6(短)。考虑到空中风向风速多变、高空作业对于悬停稳定性要求较高,而目前无人机的悬停能力远达不到可以用于高空作业的稳定性,因而需使用长机械臂紧紧地抱住作业物体,稳定机身,再进行任务要求的作业。此机械臂末端手部全部采用类似于上文的“双括号型”设计,可以根据需要更换大小,当固定物为柱形时可以将其抱住,但考虑到有可能机械臂仅能固定在较小的长条形或柱形物体上,“手指”部位进行了改进,再指根部增加了小型的平口夹,用以紧紧夹住上述物体。用于执行动作作业的机械臂要求足够灵活,故采用6自由度机械臂设计,此机械臂上同样装备了摄像头,以便于足够精准地进行各个作业动作。其所装备的“手指”部分同样可以根据任务需求更换大小、型号。考虑到可能会有类似于拧螺丝的动作,其手指部位具有旋转270°的能力,以便于快速地完成需要转动某些部件的操作。 3.3 三轴云台设计 云台采用simpleBGC俄制三轴云台,具有三个小功率微型精密减速电机,含有水平(YAW),横滚(ROLL),俯仰(PITCH)三个轴,每个轴都由无刷直流电机组成,响应速度较快。其示意图如下: 本三轴云台下端附有mpu6050陀螺仪传感器,负责检测云台的实时姿态参数,原始加速度,陀螺仪数据,和温度数据,经过传递矩阵的相乘把数据传递至云台控制板。上端附有hmc5583指南针传感器,可以实时检测地磁场数据。 对三轴电机的控制采用经典pid的闭环控制理论,通过pid控制方程:Kp*e + Ki*∫edt + Kd*(de/dt)控制从mpu6050获得的加速度和角度信息。利用加速度计所获得的角度信息 θg 与陀螺仪积分后的角度θ 进行比较,将比较的误差信号经过比例Tg 放大之后与陀螺仪输出的角速度信号叠加之后再进行积分。对于加速度计给定的角度θg ,经过比例、积分环节之后产生的角度θ必然最终等于θg 。由于加速度计获得的角度信息不会存在积累误差,所以最终将输出角度θ中的积累误差消除了。加速度计所产生的角度信息θg 中会叠加很强的有四轴运动加速度噪声信号。为了避0免该信号对于角度 的影响,因此比例系数 Tg 应该非常小。这样,加速度的噪声信号经过比例、积分后,在输出角度信息中就会非常小了。所以可以精确的得到三轴的准确重力加速度gx,gy,gz加上从系统得到的delta T,使用一阶Runge-Kutta计算式: 得到旋转四元数q1,q2,q3,q4 来表明物体的空间角位置,按照下式: 计算出姿态阵,从而得到了云台的准确航向角,俯仰角和横滚角。 *** |
|
|
|
第四章 软件部分
4.1 ROS软件平台 4.1.1 ROS概述 ROS是一个用于编写机器人软件的灵活框架,它集成了大量的工具,库,协议,提供了类似操作系统所提供的功能,包括硬件抽象描述,底层驱动管理,消息传递等等。ROS被设计成为一种分布式结构,在这个框架中的每个功能模块都可以被单独设计,编译,运行时以松散耦合的方式结合在一起,而且ROS中的功能模块都封装于独立的功能包(Package)中,便于整理和编译。ROS的多语言特性使其能够支持多种语言,例如Java,Python,Lisp,C/C++等语言,使机器人的开发更为灵活便捷,并且ROS软件集成度较高,基于节点的程序设计,让模块的代码移植,复用更加便利。 ROS的架构如图所示,它并不是一个传统意义上的操作系统,而是需要依托在开源Linux系统上。Linux是一个通用系统,本身并没有针对机器人开发特殊的中间件,因此ROS在中间层做了大量工作,最重要的就是TCPROS /UDPROS的通信系统。 本项目采用的ROS搭载于ubuntu mate 16.04开源操作系统上,ROS版本为kinetic。 4.1.2 大疆Onboard SDK开发 SDK(Software Development Kit),即软件开发工具包,用于辅助开发某一类软件的开发工具集合。大疆的SDK开发分为三中,Mobile SDK,Onboard SDK的Guidance SDK。 本项目基于ROS机器人系统使用Onboard SDK实现对无人机的自主飞行,例如:设定目标地点后自动飞行至目标中心,故障时自动返航等等,为无人机空中作业的安全增加了一层保障。Onboard SDK使用飞控上的API串口,与机载电脑有线连接实现双向同步通信,传输除图像以外的所有数据。同时机载电脑将所需数据通过datalink数传无线发送到地面站,必要时可通过人工远程控制,实现了无人机机械臂的半自动化工作。 Onboard SDK搭载在妙算机载电脑的ROS工作空间中,该ROS工作空间同样也有Guidance SDK,两者通过ROS这个平台巧妙地实现了通信部分。Guidance 系统将获取到的深度相机数据以及超声数据经计算后输出点云信息至ROS,与此同时,Onboard SDK订阅该信息并通过API串口输出相关控制信号至飞控。飞控通过对电调的精准控制从而实现避障和精准路径规划等功能。 本项目将Onboard SDK移植到了ROS机器人系统上,通过二次开发,增加了一键自动返航,以及精准悬停等功能,并通过ROS的SLAM雷达导航的API实现了无人机的自动避障,利用机载计算机扩展了无人机的功能。 4.1.3 SLAM激光雷达环境感知 激光雷达的必要性:相比相机激光雷达的优点在于,其探测距离较远,而且能够准确获取物体的三维信息另外它的稳定性相当高,鲁棒性好。 本项目采用强化学习中的Q学习算法和RBPF的方法,效果较为稳定,根据激光雷达和里程计的信息,对环境地图进行感知构建,并实时对自身状态进行调整和估计。所以即使无人机在环境复杂的山区和灾区,也能够安全得进行飞行和空中作业。 无人机的自主化工作需要无人机对外界的环境有清晰的感知,需要利用小型机载激光雷达实现。本项目通过单线的激光雷达的实现辅助控制。并使用基于cartographer的图优化算法实现导航和SLAM即时建图等功能。 激光雷达采用三角测距技术,配合视觉采集处理机构,它可进行每秒 4000 次的测距动作。每次测量过程中,激光雷达发射经过调制的红外激光信号,该激光信号经目标物体漫反射后被激光雷达的视觉采集系统接收,然后激光雷达内部的 DSP 处理器实时数据处理,计算出目标物体到激光雷达的距离以及当前的夹角,通过UART通讯接口转USB输出给机载电脑。 雷达在直流无刷电机机构的驱动下,激光雷达测距核心将顺时针旋转,从而实现对周围环境的 360°全方位的扫描,从而得到所在空间的平面点云地图信息。本项目采用国产Delta-2B 激光雷达,旋转频率为 4~10hz (360rpm), 在典型旋转频率下可以实现 0.3 ~ 0.8°的角度分辨率,从而实现在 2D 平面的 2m ~8m 半径范围内进行 360°全方位扫描,采样频率5KHz并产生所在空间的平面点云地图信息。这些点云地图信息被用于无人机定位导航,同时采用基于carographer的开源SLAM库以及IMU模块实现2D和3D的室外SLAM建图,辅助机器人实现对未知环境,障碍物的感知能力。 由于仅仅依赖前端(里程计)的话有积累误差,并且很难修正。所以项目采用Cartographer理论模型来消除积累误差。 Cartographer主要依赖激光雷达以及惯性导航仪(IMU)实现二维和三维的SLAM建图,相对于gmapping来讲优势在于实现了相对较低的资源消耗,提高了实时优化速度,有利于无人机在高速运行时提高建图速度与质量。其算法关键点在于将分支限界算法(branch and bound)引入到loop closure的过程中,加快了闭环的查找,提高与之前submap比较的效率。 Cartographer的实现并没有采用以往的滤波算法,而是采用了类似图优化的模型进行姿态解算,最后通过loop closing非线性纠偏来消除这些误差,完成闭环反馈的控制。相对于karto来讲,两者都采取图优化框架,但采取的优化库不一致,karto采取的是spa或g2o,而cartographer采用的是google的ceres构建优化,采用4线程的后端优化相对于前者的单线程同时进行前后端的优化无论是速度还是准确度,都有明显的提升。 Cartographer采取双搜索的方式进行,先用一次三维窗口遍历寻优,再构建优化等式,利用ceres求解,并采用了submap的概念,依据一定熟练的扫描初始化一个submap,依据窗口大小,插入新的扫描数据,并更新submap,有地图缓存。相对来讲,karto无submap的概念,全部以扫描的方式储存在sensorManager.无地图缓存,但每次计算地图有计算消耗。 Delta-2B 激光雷达是通过 UART TTL 电平与外部设备通信的,仅支持单工通讯(即激光雷达主动发数据帧到机载电脑的ROS系统中),ROS系统只需从数据帧中提取有效数据即可,不需要做任何回应,通讯帧中的所有数据都是 16 进制格式数据。本项目利用激光雷达的单工通讯,在机载电脑端生成点云图,再由点云图,通过Onboard SDK 的接口辅助无人机完成对障碍物的规避。同时依赖Cartographer完成对环境地图的构建。此后,通过ROS的代码控制无人机完成和目标物体的距离控制。 任务切换:可以通过远端发送指令或在信号丢失的情况下,切换不同任务模式,从避障切换到标定静止时,在下一次任务之前可由机载电脑完全控制飞行。 通过以上的设计,最终实现对环境的感知还有无人机的自主控制。SLAM建图和和无人机的自主控制的设计,能保证无人机的安全飞行,即使在遥控信号丢失的情况下,依然能通过自主的控制保证飞行器的安全。 4.2 Moveit!机械臂控制部分 4.2.1 机械臂3D模型搭建与设计 Moveit!是ROS中一个重要的集成化开发平台,支持众多的机器人硬件平台,本项目基于ROS的Moveit!开发平台进行二次开发。本项目采用solidwork软件搭建六轴机械臂及三轴机械臂立体模型,并制作出1:1真实机械臂。本项目在这两个模型基础上,添加坐标系与转轴,设置关节运动范围,并利用solidwork导出各个组件到URDF文件中。导出后创建一个类似ROS的包,并移植到ROS机器人系统上面进行仿真与测试。 机械臂的设计采用SW2016软件,连接件通过3D打印机进行打印,其他部分为激光切割机加工的碳纤管。设计时尽可能地提高模块化,使得连接件可以通用,也便于在执行不同操作时,地面人员对于机械手的更换、维护。由于左右机械臂被一起固定在一个3D打印出的基部上,吊挂于无人机的下方,故基部与无人机的固定牢靠程度会十分地影响无人机作业时的精准度。因此除基部的拉伸筋连接固定二者之外,还留有四个槽,以连接金属结构的固定件,使得基部与无人机底盘紧密贴合、尽量减少晃动(如图)。本项目在六轴机械臂及三轴机械臂立体模型的基础上,添加坐标系与转轴,设置关节运动范围,并利用solidwork导出各个组件到URDF文件中。导出后创建一个类似ROS的包,并移植到ROS机器人系统上面进行仿真与测试,并制作出1:1真实机械臂。 在设计机械臂时,由于能力内能够设计出的理论上较为坚固的机械结构都略微臃肿、拥有较大重量,可能不便于吊挂上无人机,而较为轻便的结构又容易产生晃动,不足以进行需要一定精准度才能够完成的机械任务,因而需要通过对比以进行筛选,找出更为合适的结构。过程中使用Solidworks2016软件所带插件Simulation进行受力评测,以便于尽可能地优化设计,但机械上的问题,亦必将通过最终实体实验来证明其可靠性。 4.2.2 机械臂模拟仿真 Gazebo是一个3D的动态仿真软件,基于ROS机器人系统。本项目使用gazebo仿真环境对机械臂进行物理模拟仿真,可以通过仿真各个传感器,执行器的特性,最大程度上做到仿真结果的准确。 4.2.3 机械臂底层驱动 4.2.3 机械臂硬件驱动接口 ROS的moveit软件通过硬件抽象层来直接与机械臂驱动板实现双向同步通信。对于舵机手臂的位姿,我们通过编写相关功能包,直接发布规划路径的各个点数据就是在goalCB内把数据取出来,再用publisher 发布出去,实现对实体机械臂的驱动。 1.实体机械臂:STM32嵌入式控制器使用位置PID闭环算法来计算由硬件抽象层通过串口通信方式发过来的关节数据,并将计算好的数据直接发送给电机对其进行控制。 2.硬件抽象层:硬件抽象层和硬件直接打交道,通过write和read方法来完成对硬件的相关操作。硬件抽象层跟上面官方提供(红色的部分)的有一些不太一样的地方在于我并没有使用ROS Control提供的Transmissions(数据转换)和Joint Limits(关节限位)的API。 Transmissions就是机器人每个运动关节和电机之间的数学映射。因为机械臂关节结构的不同,会导致机器人上层规划所使用的Joint与Actuator数据之间存在明显的偏差。比如说有简单齿轮和同步带驱动的,有锥齿轮差动机构,四连杆机构等。Transmissions提供的接口中包含有解决上面这些结构进行数据转换的映射公式。 Joint Limits主要是维护了一个关节限位的数据结构,里面可以包含的数据种类不仅仅是常用的关节位置、速度、力矩、加速度等方面的限位,还可以储存具有安全作用的位置软限位、位置边界和速度边界等。 控制器管理器提供一种通用的接口来管理不同的ROS Controllers,它可以加载、开始运行、停止运行、卸载不同的Controller,并且提供了多种工具来完成这些操作。Controller Manager的输入就是ROS上层应用的输出。在这里面,我用到了Joint Command Controller和Joint State Controller,它们分别可以完成对每个关节的控制以及读取硬件接口中关节的状态。 Simulation和Hardware之上的Hardware Resource和Controller Manager是一样的,这很清晰地体现了ROS Control的底层无关性,即无论使用的是抽象的仿真还是具体的硬件,只要程序能继承RobotHW硬件抽象层的基类来做到数据接口的统一,Controller Manager就可以对相应的资源进行管理。 对于Simulation和Hardware来说,它们内部架构相似,但配置以及使用方式是不一样的。Simulation的RobotHW部分,Gazebo官方已经将其实现,并且提供了相应的ROS Control插件来从机械臂的URDF文件中载入所需的数据。用户只需写好URDF和YAML文件,并使用ROS Launch将其整合到一起就万事大吉了。 而对于Hardware这部分来说,除了上面说到的配置之外,我们还需要自己编写C++代码来继承RobotHW基类,并在里面分别使用命令和状态硬件接口句柄对相应的关节数据进行注册,然后再将不同的硬件接口注册到RobotHW上。最后,我们还要自己编写函数完成对关节和电机数据的相互转换,并且根据指定的通信协议,实现read和write函数。 仿真部分:使用gazebo仿真环境并启动Motion Control测试,运行后可使用键盘按键来控制机械臂每个关节的位姿。 硬件部分: (1)创建子类继承RobotHW父类,并且声明了一些函数和变量。 (2)初始化关节和电机数据,并使用Hardware Interface对相应的数据进行注册,最后初始化与串口通信有关的Topic。 (3)根据机械臂公式,实现关节和电机数据之间的互相转换。 (4)实现定制的read和write函数。 (5)加载关节名字到ROS的参数服务器中。 以上就是硬件接口层的全部内容了。作为整个机械臂软件架构最底层的部分,它的重要性不言而喻。根据我之前开发机械臂的经验,只有编写出稳定且鲁棒的的硬件接口层,才能为之上的运动规划提供强有力的保证。 在Rviz中,本项目使用末端执行器上的交互式Marker来移动机械臂到目标位置。接着,你可以在Planning Library的下拉式菜单中选择OMPL库中的某个特定规划算法(KDL数值解较差,本项目采用ikfast来代替)。点击Execute按钮,MoveIt!会将上一步规划出来的机械臂关节轨迹通过FollowJointTrajectoryAction接口发送给Gazebo中对应类型的Controller,使得Gazebo中的机械臂可以移动到目标位置(驱动真实机械臂时要将launch文件中对应gazebo接口更换成hardware接口)。 stm32f103是一款较为常用的单片机,它能满足本产品的要求。本产品决定使用PWM实现对舵机的驱动。 一般而言,舵机的基准信号都是周期为20ms,宽度为1.5ms。这个基准信号定义的位置为中间位置。其中间位置的脉冲宽度是一定的,那就是1.5ms。角度是由来自控制线的持续的脉冲所产生。这种控制方法叫做脉冲调制。脉冲的长短决定舵机转动多大角度。当舵机接收到一个小于1.5ms的脉冲,同品牌,甚至同一品牌的不同舵机,都会有不同的最大值和最小值。一般而言,最小脉冲为1ms,最输出轴会以中间位置为标准,逆时针旋转一定角度。接收到的脉冲大于1.5ms情况相反。不大脉冲为2ms。 本项目决定使用c++在stm32f103上进行代码编译实现从而实现对舵机的控制。首先要有一个与真实机械臂相一致的机器人模型文件。使用moveit配置助手生成配置文件。上一步生成的配置文件默认控制的是虚拟机械臂,需要修改部分文件,来告诉moveit!我们想要控制的是真实机械臂。首先demo.launch文件中参数fake_execution的值改为false。然后move_group.launch文件中,moveit_controller_manager在选择参数值时,“unless”前面那个value值要修改,写一个自己机器人名称作为前缀,例如“aubo_i5”。按照原先的设置,本应该启动fake_moveit_controller_manager.launch.xml,你可以去moveit配置文件夹下去找,这个文件是存在的,而现在,一个叫做aubo_i5_moveit_controller_manager.launch.xml将会被启动,而这个文件moveit也应该已经帮我们创建好了,当我们使用先前的moveit向导加载机器人模型时,机器人模型中写明的机器人名称(属性),就会作为前缀写入这个文件的文件名,所以,“aubo_i5”这个名称源自于你模型文件里写明的机器人名称,需要前后保持统一,理解各个文件之间的调用关系。 下一步修改aubo_i5_moveit_controller_manager.launch.xml文件。最后创建controllers.yaml配置文件。经过上述操作代码最后一句指向了config目录下一个叫做controllers.yaml的文件,这个文件很重要,决定了我们所使用的moveit控制器的基本参数。我们打开配置文件夹中的config目录,发现只有fake_controllers.yaml,所以,现在要做的就是复制一份这个文件,然后将名字改为controllers.yaml,现在要做的就是复制一份这个文件,然后将名字改为controllers.yaml,打开这个新文件,将文件修改。在这时候需要对一个文件进行修改,解决机械臂轨迹执行时超时的问题,经过我们的优化可以是机械臂稳定的运动。再通过action的配置,将action客户端的指令转化为机械臂能执行的控制命令。这样就可以实现对机械臂的硬件驱动。 |
|
|
|
4.2.4 六自由度机械臂运动路径规划
一.OMPL简介 OMPL(Open Motion Planning Library)是一个开源的运动路径规划库。OMPL由于其模块化设计,使得较复杂的多自由度运动路径规划问题简化。 OMPL是一个大类,里面有不同的算法.OMPL能做什么? 简单说,就是提供一个运动轨迹。给定一个机器人结构(假设有N个关节),给定一个目标(比如终端移到xyz),给定一个环境,那么OMPL会提供给你一个轨迹,包含M个数组,每一个数组长度是N,也就是一个完整的关节位置。沿着这个轨迹依次移动关节,就可以最终把终端移到xyz,当然,这个轨迹应当不与环境中的任何障碍发生碰撞。 二.OMPL运动规划层设计 运动规划层在机械臂的自主抓取中扮演了非常重要的角色。而对于运动规划本身来说,里面涉及了非常多的专业知识,比如运动学正逆解算、碰撞检测算法、3D环境感知、动作规划算法等。本项目采用逆运动学求解的方式,把终端位姿变成关节角度,给定终端位姿计算关节角度,q=IK§。p是终端位姿(xyz),q是关节角度。概括来说,MoveIt!是ROS中与移动操作相关的组件包的集合。它包含了运动规划、操作控制、3D感知,运动学,碰撞检测等。当然,最重要的是MoveIt!提供了非常友好的配置和调试界面。 move_group是MoveIT!最核心的部分,本质上还是一个ROS节点,使用参数服务器来获取以下三种信息。 URDF: move_group需要机械臂的URDF文件来进行运动规划。 SRDF: move_group在启动时会寻找机械臂的SRDF文件,它可以通过使用MoveIt! Setup Assistant自动生成。 MoveIt!配置: move_group在启动时会加载机械臂的关节限位、动力学、运动规划、感知以及其他相关信息。所有以上的配置信息都可以通过使用MoveIt! Setup Assistant自动生成。 move_group使用ROS中的Topic和Action两种机制来与机械臂进行数据通信。它可以获取当前机械臂的位置信息,点云数据以及其他传感器数据,并且发送命令给机械臂的Controller. 关节状态信息: move_group会监听机械臂的/joint_states主题来获取当前的状态信息。注意:move_group只管监听,你需要自己给机械臂配置好Joint State Controller。 坐标转换信息: move_group可以订阅机械臂的TF主题来确定机械臂内部各关节之间的位置变换关系。跟上面一样,你需要自己运行Robot State Publier节点来发布坐标转换。 控制器接口: move_group使用Follow Joint Trajectory类型的Action接口来与Controller进行数据通信。move_group自己是不带Action接口的,它是使用了一个特殊的插件来发布上述Follow Joint Trajectory类型的Action,而对于机械臂来说,你依然需要自己配置上述类型的Controller来订阅机械臂的数据。 规划场景: Planning Scene指的是机械臂本身以及其周围环境的表示(在Gazebo中显示)。 扩展能力: move_group的所有组件都是以独立插件的形式实现的,而且这些插件可以通过使用ROS的参数文件或插件库来进行配置,这使得move_group拥有了强大的定制以及可扩展能力。 三.Motion Planning介绍 在MoveIt!中,运动规划算法是由运动规划器算出来的。当然,运动规划算法有很多,每一个运动规划器都是MoveIt的一个插件,可以根据需求选用不同的规划算法。MoveIt!默认使用的是OMPL。OMPL(Open Motion Planning Library)是开源运动规划库的简写,它提供基于随机化的运动规划器。 运动规划请求: 在让运动规划器进行运动规划之前,我们要先发送一个运动规划的请求。这个请求可以是新的机械臂或末端执行器的位置。为了让运动规划器规划出来的轨迹符合要求,我们需要指定一些约束条件: 位置约束:约束机械臂Link的位置。 方向约束:约束机械臂Link的方向。 可见性约束:约束Link上的某点在某些区域的可见性。 关节约束:约束Joint的运动范围(实体机械臂取决于舵机可旋转角度,理论上小于等于机械臂可动角度)。 自定义约束:使用自定义的回调函数来指定约束条件。 四.运动规划结果 move_group节点最终将会根据上面的运动规划请求,生成一条运动轨迹。这条轨迹可以使机械臂移动到预想的目标位置。请注意:move_group输出的是一条轨迹,而不是路径。对于机械臂来说,路径是使末端执行器移动到目标位置的过程中,中间所经历的一系列独立的位置点。而轨迹则是在路径的基础上,通过加入速度、加速度约束以及时间参数来使机械臂运动的更加平滑。 五.规划请求适配器 在运动规划器的输入输出端分别有两个规划请求适配器。它们的作用分别是对规划请求和规划结果进行预处理和后期处理。MoveIt!提供了几种默认的适配器来完成一些特定的功能。 FixStartStateBounds: 当机械臂的一个或多个关节的初始状态稍微超出了URDF文件中所定义的Joint Limits后,为了能让运动规划器可以运行,FixStartStateBounds适配器会通过将关节状态移动到Joint Limits处来解决这个问题。不过,如果机械臂关节的偏差很大的话,这种靠软件方式修正的方式就不适用了。 以下为OMPL采用的适配器: FixWorkspaceBounds: 这个适配器会默认地生成一个10x10x10立方米的机械臂规划空间。 FixStartStateCollision: 如果已有的关节配置文件会导致碰撞,这个适配器可以采样新的配置文件,并根据摇摆因子来修改已有的配置文件,从而保证新的机械臂不会发生碰撞(三维环境感知与此结合,实时采样周围障碍物信息)。 FixStartStatePathConstraints: 如果机械臂的初始姿态不满足路径约束,这个适配器可以找到附近满足约束的姿态作为机械臂的初始姿态。 AddTimeParameterization: 这个适配器非常重要。它把从运动规划器中输出的空间路径按等距离进行划分,并在其中添加加速度、加速度约束,以及时间戳等必要信息。 Planning Scene用来表示机械臂周围的外部世界并且保存机械臂自己本身的状态。它通过监听对应的Topic来获取关节状态信息、传感器信息。并可以根据传感器信息和用户的输入,生成机器人周围3D世界空间的表示。 除此之外,本项目还采用了基于3D Perception的技术,使用插件来获取点云和深度图像数据,并据此生成OctoMap,为之后机械臂的碰撞检测提供基础。 本项目使用OMPL规划机械臂的运动轨迹。对于本项目的六自由度机械臂,采用OMPL进行自动路径规划,在程序中设定终端移动到的目标,通过OMPL即可计算出一个最适合的机械臂运动轨迹路线,包含多个数组,每个数组的长度恰好等于机械臂的自由度(在这里也就是六自由度)。通过计算好的这个轨迹,依次移动关节,最终机械臂终端(手部)将移动到设定的目标。采用ikfast运动学求解器对机械臂运动过程进行求解,因为ikfast是基于解析解的,求解速度以及准确度远大于KDL,同时我们也将配合3D Perception环境感知对路径进行优化,从而做到不与环境中的任何物体发生碰撞。 五.规划群 规划群(Planning Groups)是moveit的核心之一。 Kinematic Solver: 运动学求解工具,这个就是负责求解正向运动学(Forward Kinematics)和逆运动学(IK, 见1.3节)的。 一般我们选用KDL, The Kinematics and Dynamics Library。这是一个运动学与动力学的库,可以很好的解决6自由度以上的单链机械结构的正逆运动学问题。当然你也可以用其他IK Solver, 比如SRV或者IK_FAST,甚至你可以自己开发新的Solver然后插入进来,如果有空,我以后会发帖讲解如何创建新的运动学求解库并插入到MoveIt。 每一次移动标记,就运行了一次逆运动学IK求解过程。 因为OMPL是采样算法,由于其随机采样的特性,每次的路径是不同的,而且有可能失败。(因此运动学求解工具是 OMPL(开源路径规划库)的一部分,这也就相当于SIRF和opencv的关系) Search Resolution: 关节空间的采样密度 Search TImeout: 求解时间 Solver Attempts: 求解失败尝试次数,一般来说这三项使用默认值就可以。你也可以根据具体需要做出适当调整。 机器人预设位姿(Robot Poses),默认位姿应该为直立。 终端控制器(End Effectors)就是机械臂的手,在工作环境中直接控制的部分。 被动关节(Passive Joints)不配置电机的关节。 moveit的配置文件为SRDF,配合URDF使用。 4.2.5 机械臂防碰撞系统设计 MoveIt!使用CollisionWorld对象进行碰撞检测,采用FCL(Flexible Collision Library)功能包。碰撞检测是运动规划中最耗时的运算,往往会占用90%左右的时间,为了减少计算量,可以通过设置ACM(Allowed Collision Matrix)来进行优化。 碰撞免检矩阵 碰撞免检矩阵(Avoid Collision Matrix, ACM)是一个不会随环境变化而改变的检测算法。碰撞检测是非常复杂的运算过程。对于多关节机械臂或者类人机器人来说,机械结构复杂,肢体多,碰撞检测 需要涉及很多的空间几何计算。但是对于刚体机器人来说,有些肢体之间是不可能发生碰撞的,比如原本就相邻的肢体,比如类人机器人的脚和头。这里生成的 ACM就是告诉我们,这个URDF所描述的机器人,哪些肢体之间是不会发生碰撞的。那么在之后的碰撞检测算法中,我们就可以略过对这些肢体之间的检测,以提高检测效率。 三维环境感知 三维感知方式采用pointcloud2点云方式,生成一种octomap的方格三维地图,感知后的环境可以作为环境障碍物,机械臂规划路径时会主动避开有octomap地图的地方。Octomap以八叉树的的形式储存地图,地图由多个小方块构成。当分辨率较高的时候,方块很小,当分辨率较低的时候,方块较大。每个方块表示该格被占据的概率。通过查询某个方块或点“是否可以通过”,从而实现三维的路径规划。 OctoMap:一种基于八叉树的占据网格型地图,像是很多个小方块组成,可以在查询某一点能否通过时切换分辨率(方块大小)从而实现不同层次的导航,其设计思路具有以下几个优点 1.完整的3D模型:octomap不需要任何预设就可以为任意环境搭建模型。该模型同时包含了被占据空间和自由空间。即使是环境中的未知区域也包含在地图之中。我们知道,在机器人进行自主环境探索时未知空间的信息是非常重要的 2.可实时更新:octomap可以随时增加新信息或者传感器。建模和更新是以概率的方式进行的。这样可以解决由于物体运动引起的测量问题。同时,octomap还支持多个机器人共建一个地图,而以前记录的地图在探索新区域时可以进行扩展 3.灵活性:在简介中提到过,octomap支持实时切换分辨率实现不同层次导航,例如,高级规划可以使用粗映射,而本地规划则可以使用细分辨率操作,随时在粗分辨率视图和细分辨率特写之间切换 4.紧凑:octomap文件可以在内存和硬盘中高效存储,可以生成压缩文件。 本项目在Gazebo中给机器人的头部添加了深度传感器的插件,所以当障碍物放到深度相机前方的时候,MoveIt!可以立马从点云Topic中获取物体的信息,并在Rviz中生成可视化的OctoMap。在下一次做运动规划的时候,MoveIt!会将由正方体组成的OctoMap看成障碍物并考虑在内。 4.3 基于OpenCV的无人机双目视觉 OpenCV是 一个基于BSD许可(开源)发行的跨平台计算机视觉库,可用于Linux,Windows以及Mac OS等等操作系统上。它轻量级且高效,提供了MATLAB,Python等多种语言的接口,实现了图像处理和计算机视觉方面的很多统用算法。本项目基于ROS机器人系统并采用Opencv 4.0.0最新版本,通过guidance sdk以及Moveit等软件的API实现了无人机的目标图像识别,特征物体云台追踪以及三维环境感知等功能。 4.3.1 guidance sdk开发 Guidance是一套视觉导航传感系统,可感知附近的障碍物,让飞行器主动躲避。它配备有五组超声双目视觉传感器,在guidance系统的控制下,可实现分别调用五组视觉深度数据以及超声波感知距离参数等等。Guidance采用的高精度立体视觉算法,近地面精度可达厘米级别,在飞行器高速飞行状态下仍能提供准确的障碍物深度信息,距离等参数,为无人机的避障,三维环境感知提供了强有力的工具。 通过Guidance SDK,可以从 Guidance 硬件上获取到各种输出数据,包括实时三维速度、IMU 数据,五向超声波距离等等。可实时输出的数据如下: 1.实时机体状态数据,包括机体坐标系下的飞机三维速度以及三维位置,实时输出由图像和超声波数据融合得到的与最近障碍物的距离。 2.Guidance模块传感器数据,包括机体坐标系下的IMU数据,以及三自由度加速度和三自由度的陀螺仪角度,实时输出机体坐标系下到最近5个方向的超声波距离 (0.1m - 8m)。 3.图像数据,包括输出双目摄像头的8比特灰度图,分辨率为320*240,以及输出双目摄像头的16比特深度图,分辨率为320*240。 4.相机参数,包括双目摄像头的标定参数,获取并设置双目摄像头的曝光模式以及曝光参数。 图4.12 Guidance视觉导航传感系统 Guidance模块通过UART和USB串口传输相关数据(若使用UART串口则传输除图像外的全部数据),该模块自带高精度视觉里程计,用于描述Guidance在环境中的运动,对速度的测量精度高达厘米级别。本项目的SDK开发基于这些数据提升空中机器人应用的精度,以更好地适应更多的空中作业应用领域。 由FPGA硬件加速模块和两个ARM Cortex-A9核心构成了Guidance系统强大的计算平台,可实时处理多达10路摄像头数据,并且可以重新配置以便未来升级。Guidance模块通过CAN总线与manifold机载计算机连接,在Nvidia TK1的GPU上面通过获取稠密深度图来实时进行三维环境感知与全向障碍物动态分析,从而引导飞控系统及时修正轨迹,避免发生碰撞事故,为无人机在严酷的环境作业提供了强有力的安全保障。 本项目将guidance处理器通过CAN总线连接N3飞控,并通过USB连接至妙算机载计算机,guidance处理器将结合多组超声和深度相机数据并通过CAN连接N3,在飞控实现避障的同时,guidance处理器读取四个方位的黑白深度相机数据并通过USB/UART串口发送给妙算机载电脑,在opencv中调取各个方向的深度摄像头数据完成三维环境感知与未知地形探索等功能。 图4.13 无人机guidance处理器3 4.3.2 目标物体图像识别 使用python语言编译,结合机器学习进行视觉识别。主要通过与环境的交互并在其中进行学习,用极大化的从环境获得的评价性反馈信号为学习目标。较为陌生的环境下仍然具有较好的自适应性和鲁棒性。处理器提取对摄像头的关键帧图像进行提取、识别与匹配,当与目标匹配率达到一定程度时,即认为检测到了目标物体(垃圾、核废料等)。 4.3.3 基于各类目标跟踪算法的物体追踪 目前OpenCV有几种追踪算法,我们对以下五种算法进行了比较。 由于不同算法在不同环境下的跟踪效果不同。由于本项目应用于景区垃圾、危险核废料难处理,对于部分遮挡的要求较高,并且空中识别的速度要求不高,因此本项目采用TLD追踪算法进行物体追踪,同时传回跟踪物体的坐标信息,便于机械臂进行路径规划。 4.4 无人机地面站开发 4.4.1 QGC地面站概述 本项目无人机地面站基于QGroundControl(以下简称为QGC)进行二次开发而成。该地面站可通过无线数传将机载计算机以及飞控的信息传回地面站PC/移动端,实现对无人机的精准降落以及航点规划等,也可通过地面站控制机载stm32控制板,进而控制云台实现目标追踪或机械臂精准控制,也可通过地面站搭配机载HDMI图传实现实时视频广播等等。 QGC地面站可用于为无人机自主规划航线,空中作业时可自动飞向目标地点指定高度,从而减轻飞手的任务,提高作业效率。如上图所示,该截图显示了一个任务规划,该计划从规划起始位置起飞,飞过指定三个航点,然后落在最后一个航路点。 QGC地面站功能丰富,主工具栏上面提供对不同应用程序试图的访问,以及无人机的状态信息,包括IMU信息,磁罗盘信息,电池信息,遥测信号强度等等。也可通过地面站上的一键返航按钮实现自动返回起飞点。右上角的仪表板在无人机起飞后会实时更新当前无人机信息。QGC也可通过无人机飞控的UDP通讯协议连接支持RTP和RTSP视频流接收器,同时接收多路视频信号,实现飞手,机械臂操作手以及地面分析人员各自享有一路视频,互不干扰,最大程度上提高无人机作业效率。 4.4.2 地面站航点规划 对于本项目使用的无人机,遥控器上映射一个通道用于无人机一键返航。当操作者触发此通道按键时,无人机将调用GPS确定当前位置,并将起飞点(地面站若开启返航点刷新则以地面站GPS位置为准)与当前位置进行比较从而确定返航方向并自动规划返航航线,也可通过设置返航高度,在高精度气压计的监测下实现无人机定高返航,同时配合guidance视觉避障模块实现无人机返航过程的安全。QGC地面站可通过终端命令的方式通过数传实时修改无人机的航线,实现精准规划作业轨迹,提高了智能空中作业机器人自动化作业效率。 终端可输入航路点和其他命令,也可以用地面站的功能映射创建任务(Auto grid),飞机会来回在规划的任务区域飞行进行拍照收集照片,实现无人机的程序化自动控制。 Default Alt(默认高度):进入新航路点的默认高度,同事也是返航时候飞机的高度,返航时如果飞机没有达到这个高度,会先升高到这个默认的高度再返回,如果高过这个高度,飞机会保持当前高度飞到返航的位置,下降着陆。 Verify height(验证高度):就是地面站用谷歌地图拓扑数据调整你想期望的在每个航路点的高度去反映离地面的高度。因此如果你的航路点在一个小山上,你选择了验证高度在地面站上,设置的高度将会加上小山的高度,使用这种方式将会保证你的飞机不撞上山峰。 设置好你的航路点然后点击右边的“写入”,任务就写入了APM并寄存在存储器中,删除所有航路点,点击“读取”查看确定规划的航路点是否写入,如果写入,会在地图上显示你规划的路径。 4.4.3 Dronecode SDK开发 Dronecode 是一个开源无人机航空操作系统,基于Linux开发,可以根据VTOL,固定翼,直升机以及多旋翼等特性进行二次开发。QGC也可根据Dronecode进行定制型开发,也可通过MAVLink协议与无人机天空端通信。Dronecode框架与ROS类似,其模块化设计可经修改后作为ROS节点运行,同时辅助其他软件包(例如guidance SDK,onboard SDK以及lidar SDK等等)实现机载计算机全自动控制,也可将Dronecode在Gazebo仿真环境下进行仿真与测试,确定无人机各项功能是否有异常等等。 Dronecode源码主要语言为C++,可以使用插件扩展SDK,以添加任何其他所需的MAVLink API,也可通过API扩展dronecode从而实现遥测等功能。 4.4.4 MAVLink协议 MAVLink是为微型飞行器MAV(Micro Air Vehicle)设计的(LGPL)开源的通讯协议。是无人飞行器和地面站(Ground Control Station ,GCS)之间,以及无人飞行器之间通讯常用的协议。APM、PIXHAWK飞控,Mission Planner、QGroundControl地面站均使用了MAVLink协议进行通讯。 MAVLink传输时,以消息包作为基本单位,数据长度为8~263字节。消息数据包的结构如下: MAVLink采用校验的功能,当两个通讯终端之间(飞行器和地面站,或飞行器和飞行器)使用不同版本的MAVLink协议时,双方计算得到的校验码会不同,则不同版本的MAVLink协议之间将无法通讯。MAVLINK_MESSAGE_CRCS中存储了每种消息包对应的MAVLINK_CRC_EXTRA。这个MAVLINK_CRC_EXTRA在用python生成MAVLink代码时在common.h头文件中自动生成。 MAVLink定义了一些通用消息集,是大多数地面控制站(包括QGC)和自动驾驶仪实现的参考消息集。该消息集分为两部分:MAVLink Type Enumerations(MAVLink类型枚举 )和MAVLink Messages(MAVLink消息包)。这些消息在每个消息包的头文件#define中定义。 MAVLink采用心跳包的方式来判断该设备是否活跃,(一般以1Hz发送),消息接收端会根据是否及时收到了心跳包来判断是否和消息发送端失去了联系。 心跳包由6个数据成员组成,占用9个字节。 1、type:飞行器类型,表示了当前发消息的是什么飞行器,如四旋翼,直升机等。type的取值对应枚举类型MAV_TYPE(如四旋翼,对应数值2)。 2、autopilot:飞控类型,如apm,Pixhawk等,发送心跳包的飞行器的飞控类型。autopilot的取枚举类型MAV_AUTOPILOT。 3、base mode(基本模式):飞控现在所处的飞行模式,这个参数要看各个飞控自己的定义方式,会有不同的组合、计算方式。 4、custom mode(用户模式):飞控现在所处的飞行模式,这个参数要看各个飞控自己的定义方式,会有不同的组合、计算方式。 5、system status:系统状态,见MAV_STATE枚举变量。 6、mavlink version:消息发送端的MAVLink版本。 其余的消息也是类似的结构,基本消息的定义可以查看官方网页的说明(具体说明以各个飞控为准),也可查看各个消息包头文件的定义。 |
|
|
|
第五章 无人机全自动收纳充电仓
5.1 收纳充电仓设计 5.1.1 概述 通过 GPS 定位无人机飞行到地面中继站附近;固定在地面中继站上的摄像头对无人机进行 Kalman 滤波、定位捕捉、背景差分等操作;结合无人机和地面中继站回传的差分信息,确定无人机的精确位置,引导无人机自主降落。 图5.1 收纳充电仓机械外观图 收纳充电仓机载计算机为树莓派3B+,通过树莓派搭建 OpenCV 环境,运行计算机视觉相关的代码, 读取处理“三目摄像头”搜集的信息,然后计算出无人机的空间 坐标位置。最后实现树莓派和智龙 1C2000 主控板之间的串口。通过主控板控制树莓派的运行,读取树莓派传输的数据。对无人机的飞行位置做出调整。 5.1.2 模块化设计 电机模块由电机和电机控制电路组成,实现智龙 1C2000 主控板小信号控制大电机的功能,以大功率电机带动无人机回收舱系统的主要活动单元,保证无人机稳定的工作性能。 校正模块是通过无人机回收舱内部的机械结构,实现对已经降落到无人机回收舱中的无人机位置的机械校正,对降落后的无人机进行位置姿态的微调,方便后续的充电补给功能。 5.1.3 收纳充电仓自动充电设备 收纳充电仓的自动充电功能,分为机械式自动充电和太阳能自动充电,可以有效提高无人机的续航功能,并有效降低收纳充电仓能耗,起到节能,环保的作用。 通过对无人机充电接口的改装,在无人机降落校正后的地点安装受主控板控制的机械式自动充电装置, 对无人机的电量进行补给。无人机电池经改装使用专用充电接口,在易于插拔的同时增加其牢固性,与此同时,无人机电池仓设计成可抽取式结构,内卡扣的设计可使其更好地使电池卡在电池仓内避免滑落。同时抽取机械爪经过巧妙设计使其夹取电池两边时能同时将卡扣弹开,平滑地将电池取出又不至于跌落。 电池抽取机械爪被安置在一个可升降平台上。该升降平台可通过电动推杆实现连续升降,平台可由地面升至无人机电池仓下板处,在机械爪的推动下电池被平稳地推入电池仓,需要抓取时机械爪的两端会同时夹住电池两卡扣处使其松开,之后将电池取下,平台缓慢地降下来,而后机械爪将电池推入充电座处进行充电。 收纳充电仓外表面装有多块太阳能电池板。在光线充足时可对平台内通信设备及传感器充电,最大程度上做到节能,环保。 5.2 收纳充电仓视觉识别 5.2.1 系统模块 系统由3个部分组成:识别跟踪模块、运动控制模块、通信模块。 由识别跟踪识别模块识别目标,并以图像中心为原点,将目标的坐标作为输入传递给运动控制模块;运动控制模块将坐标转换为云台需要转过的相对角度并且要减少云台在目标附近的摆动;运动控制模块得到的角度作为串口通信模块的输入,后者对角度进行编码得到相应的字节流,以多个字节为一帧并加入帧校验字节。最终,数据通过串口传递给云台主控板。 5.2.2 视觉识别跟踪模块 该模块模块实现两个功能:识别和跟踪。 识别的目的是在程序首次运行或者跟踪失败的时候能够重新找回目标,一旦在视野中检测到了目标的存在,就进入跟踪模块。此后,检测模块不会再介入到跟踪模块的运行直到跟踪失败。 收纳充电仓上表面由红色LED灯柱围成一圈,中间由蓝色LED灯组成H型,并将其作为无人机识别收纳充电仓的依据 1.识别 目标检测模块将输入的彩色图像进行色彩空间变换,对转换后的HSV图像中的Hue分量阈值分割,得到二值图像,再通过形态学运算滤去噪声,最后找到目标。 2.形成目标的轮廓矩形 由摄像头输入的彩色图像经上述处理后得到了一个二值图像。进行比对后根据连通区域之间的距离和颜色相似性,将距离接近且相似性高的连通区域进行合并。通过不断迭代后,最后得到若干个连通合并后的矩形区域。 3.跟踪 跟踪模块选择采用KCF跟踪器进行跟踪。KCF是一种鉴别式追踪方法,通过不断的更新位置,保证无人机准确地降落在收纳充电仓中。 5.2.3 运动控制模块 运动控制模块的主要功能是将输入的坐标转换为云台须要转动的相对角度信息,主要的问题是克服云台在目标附近摆动,加快稳定速度,同时云台转动要足够迅速。为了解决这一问题,我们主要采取了两个措施:使用分段的线性函数进行坐标变换;提供快速和慢速两种工作模式。 如下图所示,x轴为输入坐标值,y轴为角度。当目标距离图像中心较近时,云台转动速度减慢,有利于云台的稳定;当目标较远时,快速转动,加快锁定目标的速度。当云台开始出现摆动现象时进入慢速模式。 这里使用简单的分段线性函数而不采用拟合度更高的非线性函数(如指数函数)的原因是,线性函数的参数调整更加方便,便于不断通过测试进行调优。 5.2.4 串口通信模块 该模块将float类型的角度编码为帧,并通过串口发送至云台主控。float类型数据最终须要存储到uchar类型的数组中,这一转换由如下语句完成。 unsigned char *x1=(unsigned char*)&nHangle; tmpchar[0] = *(x1); |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1621 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1546 浏览 1 评论
980 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
686 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1599 浏览 2 评论
1867浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
648浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
518浏览 3评论
534浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
506浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 18:10 , Processed in 0.914266 second(s), Total 84, Slave 67 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号