ardupilot开发 --- Jetson Orin Nano 后篇

在这里插入图片描述

我拼命加速,但贫穷始终快我一步

  • 0~19
  • 20. visp-d455:基于IBVS的Pixhawk无人机视觉伺服
    • 20.1 基础
      • 关于连接、通讯、UDP forward服务:
      • 一些相关的、有用的例程
      • Linux C++程序的gdb断点调试
      • 搭建仿真
      • 解决【testPixhawkDroneTakeoff.cpp例程能解锁但起飞命令无响应,断点模式下却有响应】问题
      • 解决【使用最新的mavsdk版本导致visp编译报错】问题
      • visp中的异步编程:std::promise和std::future
    • 20.2 视觉伺服
      • 知识储备
      • 分析与实践

0~19

请参考前篇。

20. visp-d455:基于IBVS的Pixhawk无人机视觉伺服

20.1 基础

在这里插入图片描述
参考:Tutorial: Image-based visual-servoing on a drone equipped with a Pixhawk
第三方库: MavSDK,librealsense
一些概念:

  • onboard computer:板载计算机、机载计算机

软件:

  • QGC 或 Mission Planner,安装在地面站PC上,windows系统或Ubuntu系统。
  • MavProxy ,安装在板载计算机上。

关于连接、通讯、UDP forward服务:

  • 板载计算机与飞控用USB连接。
  • 板载计算机与地面站PC:通过局域网连接,进行SSH。例如使用思翼科技的链路产品MK32实现局域网连接,使用MobaXterm实现SSH。
  • MavProxy
    运行在:板载计算机上,Ubuntu20.04,安装教程。
    与飞控的连接:USB,即--master=/dev/ttyACM0
    创建3个UDP forward服务,使得其他应用或程序能过通过UDP连接到飞控(与飞控通讯)!
    启动命令如:
    mavproxy.py --master=/dev/ttyACM0 --out=udpout:192.168.30.111:14550 --out=udpout:192.168.30.111:14551 --out=udpout:127.0.0.1:14552
    
  • Mission Planner 或 QGC
    运行在:地面站PC,windows系统或Ubuntu系统都可。
    与飞控的连接:通过mavproxy创建的UDP forward服务:192.168.30.111:14550,其中192.168.30.111是地面站PC的IP地址。
  • keyboard Control app:
    运行在:地面站PC,windows系统或Ubuntu系统都可。
    与飞控的连接:通过mavproxy创建的UDP forward服务:192.168.30.111:14551,其中192.168.30.111是app所在系统的IP地址。通讯使用MavSDK。
  • IBVS app
    视觉伺服程序,visp程序。
    运行在:板载计算机上,Ubuntu20.04.
    与飞控的连接:通过mavproxy创建的UDP forward服务127.0.0.1:14552,其中127.0.0.1是app所在系统的IP地址。通讯使用MavSDK。

一些相关的、有用的例程

  • testPixhawkDroneTakeoff.cpp
    简单的起飞然后降落。
  • testPixhawkDronePositionAbsoluteControl.cpp
    起飞,方形轨迹飞行
  • testPixhawkDronePositionRelativeControl.cpp
    起飞,以起飞点为中心进行方形轨迹飞行
  • testPixhawkDroneVelocityControl.cpp
    起飞之后是一个简单的轨迹,使用速度控制测试一些不同的动作。
  • autopilot_server.cpp

Linux C++程序的gdb断点调试

  • 1)用VSCode打开代码
  • 2)开始调试 在这里插入图片描述
    注意:
    【1】"program": "/home/jetson/shd/visp-ws/visp-build/modules/robot/testPixhawkDroneTakeoff"中不要使用~来表示用户目录,因为VSCode无法识别!!
    【2】编译时:cmake -DCMAKE_BUILD_TYPE=debug否则无法识别断点!

搭建仿真

  • 前提:
    Ardupilot仿真运行在WSL上,visp程序和mavproxy运行在Jetson Orin Nano上!
    WSL和Jetson Orin Nano在同一个局域网!
  • 1)在Jetson Orin Nano上安装mavproxy:
    sudo apt-get install python3-dev python3-pip python3-matplotlib python3-lxml python3-pygame
    pip3 install PyYAML mavproxy --user
    echo 'export PATH="$PATH:$HOME/.local/bin"' >> ~/.bashrc
    . ~/.bashrc
    
  • 2)已知Jetson Orin Nano的IP地址为:192.168.100.197
  • 3)在WSL上运行SITL仿真:
    sim_vehicle.py -v ArduCopter --console --out "192.168.100.197:14550" --out "127.0.0.1:14550" -w
    
    其中127.0.0.1:14550可用连接windows端的mission planner,便于查看飞行状态。
  • 4)在Jetson Orin Nano上启动MavProxy
    mavproxy.py --master=udp:192.168.100.197:14550 --out=udpout:127.0.0.1:14552
    
    注意:MavProxy生成的缓存文件mav.parm, mav.tlog ,mav.tlog.raw 要定时清理,这些文件保存在运行命令时的所在目录!不然会占用机载计算机的内存空间!
  • 5)testPixhawkDroneTakeoff.cpp例程调试和分析
    • /home/jetson/shd/visp-ws/visp/modules/robot/test/servo-pixhawk/testPixhawkDroneTakeoff.cpp
    • 构造一个mavsdk 对象;
    • 飞控已启动后,局域网已正常连接;
    • 建立一个TCP、UDP、串口连接,不成功会抛出异常并终止程序。
    • 发送指令之前先调用isRunning()函数,查看飞机是否在运行。
    • mavsdk的析构函数会导致飞机降落??
    • 使用类vpRobotMavsdk控制飞机飞行的方式:
      • 1)先使用setPositioningIncertitude()设置定位和偏航的不确定性参数,如:
        drone.setPositioningIncertitude(0.10, vpMath::rad(5.));
        位置和偏航不确定范围为0.1m和5deg。
        这些参数用于你判断飞机是否到设定的期望位置或偏航角期望值,可以用
      • 2)调用takeControl()让飞机进入guided(ardupilot)或off-board(PX4)模式。
      • 3)使用 setPosition() 或 setVelocity() 去控制飞机移动 。
      • 其他
        设置起飞高度:drone.setTakeOffAlt(5.);
        是否打印详细信息:drone.setVerbose(true);

解决【testPixhawkDroneTakeoff.cpp例程能解锁但起飞命令无响应,断点模式下却有响应】问题

在这里插入图片描述
解决:先用地面站将飞控设置为guided,再运行testPixhawkDroneTakeoff.cpp例程。

解决【使用最新的mavsdk版本导致visp编译报错】问题

背景:visp中的视觉伺服例程使用的固件是px4,跟本人正在使用Ardupilot有较大区别,例如px4中的off-board而Ardupilot中是guided模式,等等。
通过查阅mavsdk源码可知:mavsdk中对guided模式的一些定义和使用在src\mavsdk\core\ardupilot_custom_mode.h中,并且必须是最新的mavsdk源码版本即main分支。
使用最新的mavsdk代码,编译visp时报错,分析和解决如下:
在这里插入图片描述
解决方式:使用合适的构造函数代替:
cpp //mavsdk::Mavsdk m_mavsdk {}; mavsdk::Mavsdk m_mavsdk{mavsdk::Mavsdk::Configuration{mavsdk::Mavsdk::ComponentType::GroundStation}};
在这里插入图片描述
解决方式:
cpp #if (VISP_HAVE_MAVSDK_VERSION > 0x010412) passthrough.unsubscribe_message(MAVLINK_MSG_ID_HEARTBEAT,handle); #else passthrough.subscribe_message_async(MAVLINK_MSG_ID_HEARTBEAT, nullptr); #endif
一些条件编译中的报错处理方法大同小异:
大部分都是#if (VISP_HAVE_MAVSDK_VERSION > 0x010412)下面的代码报错,因为visp作者使用的是mavsdk1.4版本,在例程中执行的是else下面的代码if下的代码则不会被执行所以不会被发现,更新mavsdk到最新版本后再编译visp就会出现编译报错!!
解决方式:
在这里插入图片描述

visp中的异步编程:std::promise和std::future

std::promise和 std::future 是怎么配合工作的?以及它们在异步编程中扮演的角色是什么?参考百度。

20.2 视觉伺服

知识储备

  • 坐标变换矩阵 = 坐标旋转矩阵+坐标平移矩阵
    Rotation Matrix
    本质:坐标变换本质上是一种投影变换,是一种投影关系!从系a转换到系b即把系a中的坐标投影到系b.
    应用:2维,3维,n维
    举例:Xb = Tr * Xa + Tt * Xa
    旋转译自rotation平移译自translations转换译自transformation
    坐标旋转的表示方式有多种:方向余弦矩阵、欧拉角、四元素等等,可参考坐标旋转篇。
    在这里插入图片描述
  • 单应性矩阵(单应矩阵、齐次矩阵、投影变换矩阵)
    Homogeneous Matrix
    本质:是一种坐标转换关系,是两个图像坐标系之间的转换关系矩阵。
    应用:图像投影。
    什么是图像投影?有什么作用?
    对于3D空间的一系列点(某个场景),在不同视觉角度拍摄得到的图像分别记作P1、P2,P1P2中的同一个点p在P1P2的图像坐标系(2D的)的坐标记作【x1,y1】、【x2,y2】,那么它们之间的转换关系可以用单应矩阵表示:【x2,y2】= H * 【x1,y1】
    应用场景:交通场景中,例如需要获得俯视视角下的街道平面各智能体的坐标。而摄像机的位置可能无法做到完全俯视。此时可以标注一些地标,例如地板正方形瓷砖的角作为对应点,之后通过确定的H矩阵来将摄像机的影像转换为俯视视角的坐标。
    参考:Homography matrix(单应矩阵)简介
    计算方式:
    在visp中单应矩阵可以通过3D空间坐标旋转矩阵得到,如:
    vpRxyzVector c1_rxyz_c(vpMath::rad(-10.0), vpMath::rad(0), 0);
    vpRotationMatrix c1Rc(c1_rxyz_c); // Rotation between (c1) and (c)  //c1->c的3d空间坐标旋转矩阵
    vpHomogeneousMatrix c1Mc(vpTranslationVector(), c1Rc); // Homogeneous matrix between (c1) and (c) //c1->c的2d图像(平面)坐标旋转矩阵,即单应矩阵
    
    对于单应矩阵的估计请参考:这里或Tutorial: Homography estimation from points
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 图像矩(Image Moments)
    • 源自:数学学科中随机变量的矩

    • 领域:数字图像处理、计算机视觉、深度学习

    • 对象:二值图像、灰度图像

    • 概念:图像的矩可以概括为图像的某些像素点的灰度值(像素值,在灰度图中像素值即灰度值)的加权平均值,或者是图像具有类似功能或意义的属性的加权平均值。
      意义:可以通过图像的矩来获得图像的一些有用的性质,包括面积、轮廓、几何中心(重心、质心)、方向(特征向量、主轴)等信息 ,这些信息对于图像识别、形状匹配和目标跟踪等应用非常有用。

    • 分类:

      • 原点矩
        (p+q)阶原点矩:
        在这里插入图片描述
      • 中心距
        (p+q)阶原点矩:
        在这里插入图片描述
      • 中心归一化距
        (p+q)阶中心归一化距:
        在这里插入图片描述
    • 矩的应用:

      • 目标区域的面积 = 目标区域的像素个数 = m00
        与零阶混合原点矩有关!
      • 目标区域的质心坐标 =【m01/m00, m10/00】
        与 一阶混合原点矩有关!
      • 目标区域的方向
        与二阶混合中心距有关!
        主轴斜率 = mu20/mu11
        副轴斜率 = mu11/mu20
        在这里插入图片描述
    • opencv中的图像矩介绍
      空间矩:double m00,m10,m01,m20,m11,m02,m30,m21,m12,m03
      中心矩:double mu20,mu11,mu02,mu30,mu21,mu12,mu03
      中心归一化矩:double nu20,nu11,nu02,nu30,nu21,nu12,nu03

    • 参考文献
      https://zh.wikipedia.org/wiki//wiki/矩_(图像)
      https://zhuanlan.zhihu.com/p/519713049
      https://blog.csdn.net/weixin_43212588/article/details/132674015
      https://blog.csdn.net/shuiyixin/article/details/104646531/

分析与实践

  • 代码:servoPixhawkDroneIBVS.cpp
    根据相机的位置来调整位置转换矩阵,例如:
    FLU body frame 和 相机坐标系之间的转换矩阵:
    在这里插入图片描述
    飞机机体坐标系,记作e,即终端坐标系:FLU
    最终的控制量:机体速度,也是要转换到FLU坐标系下。
    相机坐标,记作c
    中间坐标系:原点与c重合,轴与e同向,记作c1
    那么,c1与c的转换矩阵是由自己的安装位置决定的,是已知的。
    e跟c1的转换矩阵:只有位移关系,也是已知的。
    上面的转换矩阵最终求得e到c的转换关系矩阵:cVe
    在这里插入图片描述
    Xn:重心矩视觉特征的x分量误差!!!!!
    Yn:重心矩视觉特征的y分量误差!!!!!
    an:目标区域面积视觉特征误差!!!!!
    atan(1/rho)"):灭点视觉特征误差!!!!!
    在这里插入图片描述
    待续…

运行

cd ~/shd/visp-ws/visp-build/example/servo-pixhawk
./servoPixhawkDroneIBVS --tag-size 0.12 --co udp://:14550

在代码中引用外部库xxxx.h xxxx.so
CMakeLists.txt中:
在这里插入图片描述
pkg-config --cflags --libs gstreamer-1.0

等待解决的问题:

  • cVe坐标系的问题,为什么是相机系到FLU的而不是飞机机体系FRD?为什么视觉伺服计算得到的ve是FRD下表示的?
  • 推流如显示检测结果和误差曲线?
  • 二维码颠倒之后伺服控制量是否正常???
    与摆放位置无关!伺服控制量都是正常的!以第一次识别到二维码时的二维码姿态来计算初始灭点水平线!!!!!
  • 相机坐标系,图像坐标系的轴向?视觉伺服控制量坐标系的轴向??关系???
  • 由guided模式切换到其他模式如loiter和atlHold为什么会自动下降高度直到降落????
  • 如何将鼠标点击事件转换成命令行输入的形式?左击开始,再左击停止,右击停止并降落!!
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    一些疑问:
    位置估计和姿态估计是基于哪个坐标系下的?
    地固坐标系:NED local frame(或称 NED Ardupilot reference frame)
    飞机机体坐标系1:FRD body frame
    飞机机体坐标系2:FLU body frame
    位置估计:FRD body frame 原点在 NED local frame 中的坐标【posX,posY,posZ】
    姿态估计:FRD body frame 与 NED local frame 间的旋转关系,一般用欧拉角表示:【俯仰角,横滚角,偏航角】,航天航空领域一般使用东北天的旋转顺序来计算欧拉角。
    运动控制量是基于哪个坐标系下计算得到的?
    最终的控制量是基于按个坐标系下的量 ????
    姿态角、姿态角速度控制:body frame FRD
    速度控制:body frame FRD or Local frame NED ???
    位置控制:body frame FRD or Local frame NED ???
    位置、姿态测量传感器是基于哪个坐标系下的量?
    GPS:WGS84
    视觉定位Vicon:Vicon ENU reference frame
    动作捕捉器MoCAP:MoCAP ENU reference frame

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

unity-调用讯飞星火语音唤醒-新版windowsSDK

调用讯飞星火语音唤醒-新版windowsSDK 先贴一张在unity中 wins系统下成功调用新版的讯飞windowsSDK的运行截图 为什么要用讯飞的语音唤醒? 项目中需要在unity和win系统下进行语音唤醒开启语音对话,而语音唤醒比较成熟的方案大多都是在linux系统下的&…

vue实现的商品列表网页

一、商品列表效果如下 二、代码&#xff1b; vue实现的商品列表网页 &#xff0c; 图片在vue项目的Public文件夹里的 imgs中 <template><div class"common-layout"><!-- el-container:外层容器。 当子元素中包含 <el-header> 或 <el-foo…

【性能优化】表分桶实践最佳案例

分桶背景 随着企业的数据不断增长&#xff0c;数据的分布和访问模式变得越来越复杂。我们前面介绍了如何通过对表进行分区来提高查询效率&#xff0c;但对于某些特定的查询模式&#xff0c;特别是需要频繁地进行数据联接查或取样的场景&#xff0c;仍然可能面临性能瓶颈。此外…

Vitis Accelerated Libraries 学习笔记--OpenCV 运行测试

目录 1. 简介 2. 实例测试 2.1 实例介绍 2.1 创建工程 3 常见错误 3.1 核心共享库报错 4. 总结 1. 简介 在《Vitis Accelerated Libraries 学习笔记--OpenCV 安装指南-CSDN博客》一文中&#xff0c;我详尽地介绍了 OpenCV 的安装过程。尽管 Vitis Vision 库的实现本身并…

泽众云真机-平台即将升级支持华为机型HarmonyOS NEXT系统

具小编了解&#xff0c;泽众云真机即将升级支持华为机型HarmonyOS NEXT系统。有些人可能对HarmonyOS NEXT系统了解不多。 之前我们有个银行项目&#xff0c;客户要求测试华为HarmonyOS NEXT系统环境&#xff0c;当时我们云真机尚未有该系统的机型&#xff0c;然后技术人员向华为…

企业智慧办公管理平台

摘要 在之前的疫情中&#xff0c;大多数企业都受到了较大的冲击&#xff0c;然而一些公司却因为工作的特殊性可以居家远程办公&#xff0c;不过这些企业在管理员工的过程中却遇到了较大的困难&#xff0c;这是因为这些企业的管理系统根本大多都无法管理员工的工作项目&#xf…

【面试干货】 Java 中的 HashSet 底层实现

【面试干货】 Java 中的 HashSet 底层实现 1、HashSet 的底层实现2、 HashSet 的特点3、 总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; HashSet 是 Java 集合框架中的一个重要成员&#xff0c;它提供了不存储重复元素的集合。但是&am…

【AI作曲】毁掉音乐?早该来了!一个网易音乐人对于 AI 大模型音乐创作的思辨

引言&#xff1a;AI在创造还是毁掉音乐&#xff1f; 正如当初 midjourney 和 StableDiffusion 在绘画圈掀起的风波一样&#xff0c;suno 和 各大音乐大模型的来临&#xff0c;其实早该来了。 AI 在毁掉绘画&#xff1f;或者毁掉音乐&#xff1f; 没错&#xff0c;但也错了。…

SuperImage高级免费版本下载,简单纯粹没有广告!

SuperImage是一款功能强大、易于使用的基于神经网络的图像放大工具&#xff0c;适用于各种场景&#xff0c;如修复老照片、增大图片尺寸、智能修复破损等。基于AI技术&#xff0c;使用MNN深度学习框架和Real-ESRGAN算法&#xff0c;能够提供高质量的图像处理效果。通过设备的GP…

嵌入式Linux驱动开研发流程详细解析

大家好,今天主要给大家分享一下,嵌入式linux中重要的内容详解。 一、驱动概念 驱动与底层硬件直接打交道,充当了硬件与应用软件中间的桥梁。 具体任务 读写设备寄存器(实现控制的方式) 完成设备的轮询、中断处理、DMA通信(CPU与外设通信的方式) 进行物理内存向虚拟内存…

综合评价 | 基于因子分析和聚类分析的节点重要度综合评价(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 综合评价 | 基于因子分析和聚类分析的节点重要度综合评价&#xff08;Matlab&#xff09; 程序设计 完整程序和数据获取方式&#xff1a;私信博主回复基于因子分析和聚类分析的节点重要度综合评价&#xff08;Matlab…

Apache Arrow 和数据的未来:开放标准推动人工智能发展

Apache Arrow 是一种开源列式内存格式&#xff0c;适用于平面数据和分层数据。在现代数据湖中&#xff0c;开放数据格式&#xff08;如 Apache Arrow&#xff09;位于现代对象存储的存储层中。这些格式成为对象存储中的对象。 在最新版本中&#xff0c;Apache Arrow 宣布计划从…

碳钢酸洗线送酸槽蒸汽冷凝水PH计测量装置改进方法

碳钢酸洗线送酸槽蒸汽冷凝水PH计测量装置改进方法 一、项目提出前状况 1)立项背景 轧钢退火酸洗生产线的酸洗过程需要使用大量的硫酸、盐酸、硝酸、氢氟酸等酸液对钢带的表面进行清洗,酸洗过后产生较多的酸洗废水,酸洗废水需要经过处理达到污水排放标准后才能排放。其中酸…

蓝桥杯 经典算法题 实现归并排序

题目&#xff1a; 题解&#xff1a; 不断地将数组不断向下平均分为两部分&#xff0c;直到每个子数组中元素数量为1&#xff0c;这样就可以将相邻两个数组长度为1的数组看作是单调数组合并为一个大的单调数组&#xff0c;如此不断向上合并出最终的单调数组。 #include <bi…

百度地图3d区域掩膜,最常见通用的大屏地图展现形式

需求及效果 原本项目使用的是百度地图3.0,也就是2d版本的那个地图,客户不满意觉得不够好看,让把地图改成3d的,但是我们因为另外的系统用的都是百度地图,为了保持统一只能用百度地图做 经过3天的努力,最后我终于把这个效果实现了,效果如下: 如何引用GL版本 为了实现…

中国机器人产业崛起,德国市场面临30%的份额挑战

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 随着科技的不断进步&#xff0c;机器人行业正迎来前所未有的发展机遇。令人震惊的是&#xff0c;根据最新统计数据&#xff0c;中国机器人产业在…

蓝桥杯 经典算法题 求解完全背包问题

题目&#xff1a; 题解&#xff1a; 和01背包基本完全一样。小局部最优的策略也是一样&#xff1a;是否选当前局部的最后一项。唯一的不同点在于物品是无线的导致在表示选择当前物品的状态写法发生了改变&#xff1a;由dp[i-1][j-w[i]]变为了dp[i][j-w[i]]因为这样能够表示最后…

Android网络编程之Http通信

//使用HttpURLConnection打开连接 2.HttpURLConnection urlConn (HttpURLConnection) url.openConnection(); //得到读取的内容(流) 4.InputStreamReader in new InputStreamReader(urlConn.getInputStream()); // 为输出创建BufferedReader BufferedReader buffer new …

用户态协议栈04-定时arp-table的实现

之前有写过arp reply的实现&#xff0c;其中有写道&#xff0c;我们的系统内核中会维护一张ARP表&#xff0c;可以通过终端arp -a查看&#xff1a; 其中的dynamic和static是动态arp的类型&#xff0c;之前的udp实验就是添加了一条静态arp达到了发送的目的。在我们需要发送一个数…

android在线阅读代码网站

android在线阅读代码社区&#xff1a; Android 1.6 到 Android 10 的源码&#xff1a; Android OS 在线源代码 - https://www.androidos.net.cn10.0.0_r6 - Android社区 - https://www.androidos.net.cn/ AndroidXRef https://cs.android.com/ https://cs.android.com/android…