ardupilot开发 --- Jetson Orin Nano 后篇

2024-06-21 13:28

本文主要是介绍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为什么会自动下降高度直到降落????
  • 如何将鼠标点击事件转换成命令行输入的形式?左击开始,再左击停止,右击停止并降落!!
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

这篇关于ardupilot开发 --- Jetson Orin Nano 后篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1081350

相关文章

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

C#图表开发之Chart详解

《C#图表开发之Chart详解》C#中的Chart控件用于开发图表功能,具有Series和ChartArea两个重要属性,Series属性是SeriesCollection类型,包含多个Series对... 目录OverviChina编程ewSeries类总结OverviewC#中,开发图表功能的控件是Char

鸿蒙开发搭建flutter适配的开发环境

《鸿蒙开发搭建flutter适配的开发环境》文章详细介绍了在Windows系统上如何创建和运行鸿蒙Flutter项目,包括使用flutterdoctor检测环境、创建项目、编译HAP包以及在真机上运... 目录环境搭建创建运行项目打包项目总结环境搭建1.安装 DevEco Studio NEXT IDE

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来