ardupilot开发 --- Jetson Orin Nano 后篇

在这里插入图片描述

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:板载计算机、机载计算机
    • IBVS:基于图像的视觉伺服
    • Homogeneous Matrix:齐次变换矩阵
    • rotation 、translations、transformation:旋转、平移、转换
    • Image Moments:图像矩
  • 软件:

    • 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。

Jetson Orin Nano 与飞控的连接和测试

  • 使用usb线连接飞控的Type-C口与Jetson Orin Nano的USB口,用mavproxy测试是否能正常连接到飞控:mavproxy.py --master=/dev/ttyACM0
  • 错误提示:
    在这里插入图片描述
  • 解决方法:
    卸载 modemmanager 然后重启 Jetson Orin Nano.
    在这里插入图片描述

通过MK32提供的局域网SSH到Jetson Orin Nano

  • 1)将Jetson Orin Nano的网口与MK32天空端的LAN口用网线进行连接,注意Jetson Orin Nano的接口是RJ45,MK32天空端的接口是GH1.25-8P。若需要制作连接线,MK32天空端的接口定义请参考:A8mini云台相机篇,RJ45接口定义请百度查询。
      在这里插入图片描述在这里插入图片描述

  • 2)Jetson Orin Nano设置静态IP
    其实这一步可以省略,因为通过网线接入MK32天空端后 Jetson Orin Nano 会自动获得一个192.168.144.x的IP!
    IP:192.168.144.79(11,12,20,25,26已被占用)
    网关:192.168.144.1
    掩码:255.255.255.0
    MK32的局域网设置请参考:MK32使用手册
    在这里插入图片描述

  • 3)用网线将PC的网口连接到MK32遥控器的LAN口。

  • 4)PC设置静态IP
    IP:192.168.144.80(11,12,20,25,26已被占用)
    网关:192.168.144.1
    掩码:255.255.255.0

  • 5)PC端使用SSH工具进行远程登录到 Jetson Orin Nano
    SSH前先ping一下局域网内的其他IP,验证一下网络状况。
    在这里插入图片描述

一些相关的、有用的例程

  • 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就会出现编译报错!!
解决方式:
在这里插入图片描述
修改后的 vpRobotMavsdk.cpp .

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

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

20.2 视觉伺服

知识储备

  • 坐标变换矩阵即坐标齐次变换矩阵,包括:旋转变换、平移变换。
    Rotation Matrix
    本质:坐标变换本质上是一种投影变换,是一种投影关系!从系a转换到系b即把系a中的坐标投影到系b.
    应用:2维,3维,n维
    举例:Xb = 旋转矩阵*Xb + 系a原点在系b中的坐标 = Tr * Xa + Ao_b = 齐次变换矩阵 * 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
<think>好的,我现在需要帮助用户解决关于VisionMaster九点标定方法或错误的问题。首先,我应该回顾用户提供的引用内容,看看有没有相关的信息可以利用。 用户提供的引用[1]详细描述了九点标定的步骤,包括使用N点标定模块,设置标定板为九个点,调整旋转次数为0,手动输入机械手坐标,执行并检查误差。引用[2]提到了标定板的类型,基于圆形斑点检测,以及如何筛选特征点。引用[3]则涉及坐标设置的模拟和可能的代码调整,比如将第五点设为原点。 用户的问题主要集中在九点标定的方法和错误解决上。首先,我需要整理正确的操作步骤,确保涵盖标定板准备、坐标输入、参数设置等关键点。然后,针对常见的错误,比如特征点检测失败、误差过大或执行失败,需要分析可能的原因,并提供解决方案。 例如,特征点检测失败可能由于标定板不符合要求,需要检查打印质量、光照条件等。误差过大的问题可能来自机械手定位不准或标定板翘曲,这时建议重新走点或更换更稳定的标定板材质。执行失败可能与坐标系设置或参数输入错误有关,需要核对原点设置和坐标数据。 另外,用户提到的引用中有关于标定板类型和坐标模拟的内容,可能需要强调标定板的选择和坐标输入的正确性。例如,确保使用高对比度的圆形标定板,并严格按照步骤输入物理坐标,避免手动输入错误。 最后,生成相关问题时,要考虑用户可能进一步询问的内容,如优化误差、标定板制作细节、坐标系转换应用等,这样能帮助用户更深入地理解整个标定过程。</think>### VisionMaster九点标定方法及常见错误解决 #### **一、九点标定操作步骤** 1. **标定板准备** - 使用A4纸打印9个圆形标记的标定板,建议采用高对比度的黑白圆形(如白色背景+黑色圆),确保圆直径大于5mm[^2] - 将标定板固定在工作平面,避免翘曲或倾斜 2. **标定模块配置** ```python # 模拟坐标设置逻辑参考[^3] xworld = [0, step, 2*step, 0, step, 2*step, 0, step, 2*step] yworld = [0, 0, 0, step, step, step, 2*step, 2*step, 2*step] ``` - 在VisionMaster中添加"N点标定"模块 - 参数设置: - 平移次数:保持默认(对应3x3网格) - 旋转次数:设为0(仅平面标定)[^1] - 标定板类型:选择"圆形标定板" 3. **坐标输入** - 通过【铅笔图案】手动输入机械手示教的9个物理坐标,建议按Z字形顺序录入[^1] - 确保像素坐标与物理坐标一一对应 4. **标定执行与验证** - 执行标定后检查: - 评估标定误差状态必须为0 - 平移像素平均误差应小于0.5像素(理想值)[^1] - 通过标定结果可视化检查映射关系 5. **数据保存** - 生成标定文件时注意坐标系方向一致性 - 建议保存多个版本标定文件以便回滚 --- #### **二、常见错误及解决方法** | 错误现象 | 可能原因 | 解决方案 | |---------|----------|----------| | **特征点检测失败** | 1. 标定板对比度不足<br>2. 圆形尺寸不符合要求<br>3. 光照不均匀 | 1. 改用工业级打印标定板[^2]<br>2. 调整视觉参数中的斑点检测阈值<br>3. 增加环形光源照明 | | **误差超过0.5像素** | 1. 机械手定位偏差<br>2. 标定板翘曲<br>3. 坐标输入错误 | 1. 重新示教点位,确保重复定位精度<br>2. 改用亚克力板制作标定板<br>3. 使用CSV文件导入替代手动输入 | | **标定执行失败** | 1. 坐标系设置冲突<br>2. 非共面点检测<br>3. 奇异矩阵 | 1. 确认机械坐标与像素坐标原点一致性[^3]<br>2. 使用平面度检测工具验证标定板安装<br>3. 增加标定点冗余度 | | **映射关系异常** | 1. 旋转方向错误<br>2. 比例因子异常 | 1. 检查坐标系手系设置(左手/右手)<br>2. 验证标定板物理间距测量精度 | --- #### **三、优化建议** 1. 采用12点标定可提升鲁棒性(需修改第5点为原点[^3]) 2. 结合手眼标定补偿法兰盘中心偏移 3. 定期进行标定验证(建议每月一次) 4. 使用温度稳定性好的材料制作标定板
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值