基于VINS和EGO的室内自主路径规划无人机开发

基于VINS和EGO的室内自主路径规划无人机开发的技术分享。包括源代码参考、VINS-Fusion-GPU版本参考教程、VINS参数设置与外参标定、Ego-Planner实验等内容。

type
status
date
slug
summary
tags
category
icon
password

技术部分

源代码参考Fast-Lab:
GitHub - ZJU-FAST-Lab/Fast-Drone-250: hardware and software design of the 250mm autonomous drone
从零制作自主空中机器人 本文档是视频教程 从零制作自主空中机器人的配套文档,github链接为 https://github.com/ZJU-FAST-Lab/Fast-Drone-250 安全事项 四旋翼无人机具有较高的安全风险,请同学们严格遵守安全规范,不要在有人的室内或室外进行试验,对自己和他人的安全负责,本实验室完全免责。 本次课程是一套面向对自主空中机器人感兴趣的学生、爱好者、相关从业人员的免费课程,包含了从硬件组装、机载电脑环境设置、代码部署、实机实验等全套详细流程,带你从0开始,组装属于自己的自主无人机,并让它可以在未知的环境中自由避障穿行。本次课程所涉及的所有代码、硬件设计全部开源,严禁商用与转载,版权与最终解释权由浙江大学FASTLAB实验室所有。 本次课程的重心主要落在自主空中机器人的搭建、代码部署及调试上,关于自主空中机器人的一些理论基础,例如动力学模型,路径搜索,轨迹规划,地图构建等内容,高飞老师在深蓝学院有非常详尽而深入浅出的 课程 ,本次课程就不再赘述。 机器人本体相关配件及焊接用工具详见 purchase_list.xlsx,对硬件选型有相关疑问请看 番外一:硬件选型 一定要注意电调信号线顺序!!! 飞控箭头与机头同向为正向,任意方向旋转90°的倍数也可以,后续可以在飞控设置内调整,推荐和视频内相同朝向摆放。 强烈推荐使用硅胶杜邦线,常规杜邦线线材过硬,容易出现接触不良。 5V稳压模块注意贴黑胶带绝缘,周围注意贴一圈厚的海绵胶带来防止飞机降落时损坏5V模块,也可以考虑把5V模块用扎带扎在机臂旁边 使用V5+飞控或其他把模拟和数字输出分开的飞控(特点是输出口标号为A1A4 M1M4),如果要用Dshot协议,请插在A口上 请烧录本git项目下的/firmware/px4_fmu-v5_default.px4 固件,这个固件是官方1.11.0版本固件编译而来,如有需要可以自行编译。实测1.13版本固件存在BUG,不建议使用,更老的固件版本未经测试。 在飞控的sd卡的根目录下创建/etc/extras.txt ,写入 mavlink stream -d /dev/ttyACM0 -s ATTITUDE_QUATERNION -r 200 mavlink stream -d /dev/ttyACM0 -s HIGHRES_IMU -r 200 以提高imu发布频率 修改机架类型为 Generic 250 Racer ,代指250mm轴距机型。如果是其他尺寸的机架,请根据实际轴距选择机架类型 修改 dshot_config 为dshot600 修改 CBRK_SUPPLY_CHK为894281
GitHub - ZJU-FAST-Lab/Fast-Drone-250: hardware and software design of the 250mm autonomous drone
VINS-Fusion-GPU 版本参考教程:
 

试飞部分

第十章:VINS的参数设置与外参标定

  • 检查飞控mavros连接正常
    • ls /dev/tty*,确认飞控的串口连接正常。一般是/dev/ttyACM0
    • sudo chmod 777 /dev/ttyACM0,为串口附加权限
    • roslaunch mavros px4.launch
    • rostopic hz /mavros/imu/data_raw,确认飞控传输的imu频率在200hz左右
  • 检查realsense驱动正常
    • roslaunch realsense2_camera rs_camera.launch
    • 进入远程桌面,rqt_image_view
    • 查看/camera/infra1/image_rect_raw/camera/infra2/image_rect_raw/camera/depth/image_rect_raw话题正常
  • VINS参数设置
    • 进入realflight_modules/VINS_Fusion/config/
    • 驱动realsense后,rostopic echo /camera/infra1/camera_info,把其中的K矩阵中的fx,fy,cx,cy填入left.yamlright.yaml
    • 在home目录创建vins_output文件夹(如果你的用户名不是fast-drone,需要修改config内的vins_out_path为你实际创建的文件夹的绝对路径)
    • 修改fast-drone-250.yamlbody_T_cam0body_T_cam1data矩阵的第四列为你的无人机上的相机相对于飞控的实际外参,单位为米,顺序为x/y/z,第四项是1,不用改
  • VINS外参精确自标定
    • sh shfiles/rspx4.sh
    • rostopic echo /vins_fusion/imu_propagate
    • 拿起飞机沿着场地尽量缓慢地行走,场地内光照变化不要太大,灯光不要太暗,不要使用会频闪的光源,尽量多放些杂物来增加VINS用于匹配的特征点
    • vins_output/extrinsic_parameter.txt里的内容替换到fast-drone-250.yamlbody_T_cam0body_T_cam1
    • 重复上述操作直到走几圈后VINS的里程计数据偏差收敛到满意值(一般在0.3米内)
  • 建图模块验证
    • sh shfiles/rspx4.sh
    • roslaunch ego_planner single_run_in_exp.launch
    • 进入远程桌面 roslaunch ego_planner rviz.launch

第十一章:Ego-Planner的实验

  • 自动起飞:
    • sh shfiles/rspx4.sh
    • rostopic echo /vins_fusion/imu_propagate
    • 拿起飞机进行缓慢的小范围晃动,放回原地后确认没有太大误差
    • 遥控器5通道拨到内侧,六通道拨到下侧,油门打到中位
    • roslaunch px4ctrl run_ctrl.launch
    • sh shfiles/takeoff.sh,如果飞机螺旋桨开始旋转,但无法起飞,说明hover_percent参数过小;如果飞机有明显飞过1米高,再下降的样子,说明hover_percent参数过大
    • 遥控器此时可以以类似大疆飞机的操作逻辑对无人机进行位置控制
    • 降落时把油门打到最低,等无人机降到地上后,把5通道拨到中间,左手杆打到左下角上锁
  • Ego-Planner实验
    • 自动起飞
    • roslaunch ego_planner single_run_in_exp.launch
    • sh shfiles/record.sh
    • 进入远程桌面 roslaunch ego_planner rviz.launch
    • 按下G键加鼠标左键点选目标点使无人机飞行
  • 如果实验中遇到意外怎么办!!!
    • case 1: VINS定位没有飘,但是规划不及时/建图不准确导致无人机规划出一条可能撞进障碍物的轨迹。如果飞手在飞机飞行过程中发现无人机可能会撞到障碍物,在撞上前把6通道拨回上侧,此时无人机会退出轨迹跟随模式,进入VINS悬停模式,在此时把无人机安全着陆即可
    • case 2:VINS定位飘了,表现为飞机大幅度颤抖/明显没有沿着正常轨迹走/快速上升/快速下降等等,此时拨6通道已经无济于事,必须把5通道拨回中位,使无人机完全退出程序控制,回到遥控器的stablized模式来操控降落
    • case 3:无人机已经撞到障碍物,并且还没掉到地上。此时先拨6通道,看看飞机能不能稳住,稳不住就拨5通道手动降落
    • case 4:无人机撞到障碍物并且炸到地上了:拨5通道立刻上锁,减少财产损失
    • case 5绝招 反应不过来哪种case,或者飞机冲着非常危险的区域飞了,直接拨7通道紧急停桨。这样飞机会直接失去动力摔下来,对飞机机身破坏比较大,一般慢速情况下不建议。
炸机记录
 

代码学习

  1. Ceres学习
  1. Ceres LocalParameterization参数化
    1. 【Ceres】(二)LocalParameterization参数化_陋室逢雨的博客-CSDN博客_localparameter
      参考: [1] ceres-solver [2]《A Tutorial on Graph-Based SLAM》 [3]《流形与几何初步》 [4]《Quaternion kinematics for the error-state Kalman filter》 对于四元数或者旋转矩阵这种使用过参数化表示旋转的方式,它们是不支持广义的加法(因为使用普通的加法就会打破其 constraint,比如旋转矩阵加旋转矩阵得到的就不再是旋转矩阵),所以我们在使用ceres对其进行迭代更新的时候就需要自定义其更新方式了,具体的做法是实现一个 参数本地化的子类,需要继承于 LocalParameterization, LocalParameterization 是纯虚类,所以我们继承的时候要把所有的纯虚函数都实现一遍才能使用该类生成对象. 除了不支持广义加法要自定义参数本地化的子类外,如果你要对优化变量做一些限制也可以如法炮制,比如ceres中slam2d example中对角度范围进行了限制. 这里以四元数为例子,解释如何实现参数本地化,需要注意的是, QuaternionParameterization中表示四元数中四个量在内存中的存储顺序是[w, x, y, z],而Eigen内部四元数在内存中的存储顺序是[x, y, z, w],但是其构造顺序是[w, x, y, z](不要被这个假象给迷惑),所以就要使用另一种参数本地化类,即 EigenQuaternionParameterization,下面就以 QuaternionParameterization 为例子说明,如下: 1、GlobalSize() 表示参数 的自由度(可能有冗余),比如四元数的自由度是4,旋转矩阵的自由度是9 2、LocalSize() 表示 所在的正切空间(tangent space)的自由度,那么这个自由度是多少呢?下面进行解释, 正切空间是流形(manifold)中概念,对流形感兴趣的可以参考[2],参考论文[3],我们可以这么理解manifold: A manifold is a mathematical space that is not necessarily Euclidean on a global scale, but can be seen as Euclidean on a local scale 上面的意思是说, 空间是属于非欧式空间的,但是没关系,我们只要保证旋转的局部是欧式空间,就可以使用流形进行优化了.
      【Ceres】(二)LocalParameterization参数化_陋室逢雨的博客-CSDN博客_localparameter
     

    相关问题

    Ceres-solver 安装报错:
    sudo Ceres-solver最新版本为2.1.0,该版本已经取消
    针对于ROS Noetic版本,libcxsparse版本为3而不是3.1.2
     
    Anaconda与系统自带Python选择:
    VINS-Fusion OpenCV4迁移:
     
    VINS原代码从OpenCV3迁移到OpenCV4:
    catkin_make默认编译线程为CPU的物理线程数,可能会导致CPU跑满而卡死,建议编译设置选项-j,后面跟的数为最大值的一半即可。
     
     
     
     
    Loading...