深入解读Fast-Planner算法看这一篇就够!(含Ubuntu20.04 + Ros noetic 环境下 Fast-planner 算法仿真环境的配置与真机效果演示。)

这篇具有很好参考价值的文章主要介绍了深入解读Fast-Planner算法看这一篇就够!(含Ubuntu20.04 + Ros noetic 环境下 Fast-planner 算法仿真环境的配置与真机效果演示。)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

目录

目录

声明

前言

相关资源

论文与代码链接:

论文解读

算法仿真

1. 下载源码

2. 安装库与相关包

3. 编译过程问题解答 

3.1.1 使用catkin_make指令编译

3.1.2 采用catkin build编译

3.2 运行程序时可能发生的问题

算法真机测试

1. 编译问题

2. 程序话题修改(以比赛为例子)

2.1 修改订阅话题

2.2 修改发布话题

3. 程序启动步骤

4. 无人机真机展示

总结

参考文章

授权说明


声明

本文为小陈同学原创,本人为路径规划方向的研狗一枚,曾拜读了Fast-Planner算法论文并在Ubuntu20.04+Ros noetic的环境下配置了Fast-Planner的仿真环境、Jetson Xavier NX中配置了真机运行环境并在比赛环境下完美运行,特此总结整个配置过程踩过的坑,希望能够对您有所帮助,转载请阅读文末的“授权说明”,学习笔记为连载,不定期分享路径规划的知识,欢迎转载、关注、点赞👍 

前言

Fast-Planner的论文由香港科技大学相关团队发表于2019年,其快速穿越森林的应用场景令人惊叹,Fast-Planner算法需要全局地图信息,其核心是“快速矩阵式A*”(Fast Matrix-Style A*)的搜索算法,可以类比为混合A*算法,区别在于其构建的代价函数有所不同,这是对无人机路径规划领域极大的贡献。以下将分为三大部分(论文解读仿真环境配置算法真机测试)介绍Fast-Planner算法。希望对大家有所帮助!

相关资源

论文与代码链接:

Robust and Efficient Quadrotor Trajectory Generation for Fast Autonomous Flight | IEEE Journals & Magazine | IEEE Xplorehttps://ieeexplore.ieee.org/document/8758904

GitHub - HKUST-Aerial-Robotics/Fast-Planner: A Robust and Efficient Trajectory Planner for Quadrotorshttps://github.com/HKUST-Aerial-Robotics/Fast-Planner

论文解读

笔者将解读流程记在了语雀中,此处就不再赘述了,具体点击即可链接查看:

https://www.yuque.com/adamas-tavq8/mxxg0h/dv0qz41m9eu177cbhttps://www.yuque.com/adamas-tavq8/mxxg0h/dv0qz41m9eu177cb

 

算法仿真

仿真环境:Ubuntu20.04 + ROS noeric + g++ 9.4.0 + Eigen 3.3.7

1. 下载源码

mkdir -p competition_ws/src
cd competition_ws/src
catkin_init_workspace
git clone https://github.com/HKUST-Aerial-Robotics/Fast-Planner.git

2. 安装库与相关包

  • 第一种方法是用apt软件仓库输入命令sudo apt install ros-noetic-nlopt直接安装
  • 第二种方法是下载源码用cmake安装。

(eg:如果是ubuntu16.04或者ubuntu18.04可以直接从apt安装,比源码安装方便。但是ubuntu20.04用第一种方法安装会报错用不了,(不信可以试试)所以得用源码安装)

sudo apt install libarmadillo-dev //安装线性库

git clone https://github.com/stevengj/nlopt.git//非线性优化库安装
cd nlopt
mkdir build && cd build
cmake ..
make
sudo make install

(eg:若配置的仿真环境为ubuntu18.04 + ROS melodic,可以直接采用catkin make或者catkin build 编译文件并运行即可,但在ubuntu80.04 + ROS noetic环境下会出现以下问题,跟着笔者一步步解决即可)

3. 编译过程问题解答 

3.1.1 使用catkin_make指令编译

(eg:若采用catkin build指令编译则浏览3.1.2)

  • 问题1:pcl包无法找到:

    解决1:指定编译的c++版本标准为c++14,在每一个CMakeLists.txt文件中在projrct后面加入以下代码:

set(CMAKE_CXX_STANDARD 14)
  • 问题2:nlopt包找不到(如下图所示)

    深入解读Fast-Planner算法看这一篇就够!(含Ubuntu20.04 + Ros noetic 环境下 Fast-planner 算法仿真环境的配置与真机效果演示。),算法

     解决2:由于bspline_opt中的CMakeLists.txt找的是ros-noetic-nlopt,所以需要修改一下bspline_opt中的CMakeLists.txt,找到用源码安装的nlopt,修改后的CMakeLists.txt文件如下所示:

cmake_minimum_required(VERSION 2.8.3)
project(bspline_opt)
find_package(NLopt REQUIRED)
set(NLopt_INCLUDE_DIRS ${NLOPT_INCLUDE_DIR})

find_package(Eigen3 REQUIRED)
find_package(PCL 1.7 REQUIRED)

find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
visualization_msgs
cv_bridge
plan_env
)

catkin_package(
INCLUDE_DIRS include
LIBRARIES bspline_opt
CATKIN_DEPENDS plan_env
#  DEPENDS system_lib
)

include_directories( 
SYSTEM 
include 
${catkin_INCLUDE_DIRS}
${Eigen3_INCLUDE_DIRS} 
${PCL_INCLUDE_DIRS}
${NLOPT_INCLUDE_DIR}
)

set(CMAKE_CXX_FLAGS "-std=c++14 ${CMAKE_CXX_FLAGS} -O3 -Wall")

add_library( bspline_opt 
src/bspline_optimizer.cpp 
)
target_link_libraries( bspline_opt
${catkin_LIBRARIES} 
${NLOPT_LIBRARIES}
)  

3.1.2 采用catkin build编译

由于catkin build是多线程同时编译,catkin_make按照顺序进行编译,导致出现了以下问题:

深入解读Fast-Planner算法看这一篇就够!(含Ubuntu20.04 + Ros noetic 环境下 Fast-planner 算法仿真环境的配置与真机效果演示。),算法

据本人分析,此问题是因为头文件所在的文件夹由于不是按顺序编译导致没有先生成头文件就先调用,所以会报错,所以要先编译需要调用的文件所在的功能包,可以先编译指定功能包

catkin build multi_map_server

单独编译此文件夹时,又出现了以下错误:

深入解读Fast-Planner算法看这一篇就够!(含Ubuntu20.04 + Ros noetic 环境下 Fast-planner 算法仿真环境的配置与真机效果演示。),算法

分析可能由两个原因导致找不到功能包中写好的包:

  • 第一个原因是功能包中不存在此文件
  • 第二个原因是没有把对应的.so文件安装到系统

(eg:此处采用第一种方法将libpose_utils.so文件复制到/usr/local/lib路径下,当然也可以修改CMakeLists.txt文件,使其在编译时就直接完成安装,此时即可成功编译)

catkin build multi_map_server
catkin build

3.2 运行程序时可能发生的问题

  • 问题1:运行程序时出现以下报错

深入解读Fast-Planner算法看这一篇就够!(含Ubuntu20.04 + Ros noetic 环境下 Fast-planner 算法仿真环境的配置与真机效果演示。),算法

        解决1:到/Fast-Planner/uav_simulator/Utils/odom_visualization/src/odom_visualization.cpp中把/world前面的/去掉,ubuntu20.04对/敏感。改完编译运行后会看到小飞机出来了,但是还出现了问题2.

  • 问题2:函数返回值错误,报错#6如下:

深入解读Fast-Planner算法看这一篇就够!(含Ubuntu20.04 + Ros noetic 环境下 Fast-planner 算法仿真环境的配置与真机效果演示。),算法

        解决2:到/Fast-Planner/fast_planner/path_searching/src/kinodynamic_astar.cpp里搜KinodynamicAstar::timeToIndex函数,可以看到函数返回值是int,但是函数体没有return,修改完如下:

int KinodynamicAstar::timeToIndex(double time)
{
    int idx = floor((time - time_origin_) * inv_time_resolution_);
    return idx;
}

        到Fast-Planner/fast_planner/plan_env/include/edt_environment.h第69和71行,把返回值类型改成void,再去cpp文件中84到118行做同样修改,修改后的代码如下:

void interpolateTrilinear(double values[2][2][2], const Eigen::Vector3d& diff,
                                                     double& value, Eigen::Vector3d& grad);
void evaluateEDTWithGrad(const Eigen::Vector3d& pos, double time,
                                                    double& dist, Eigen::Vector3d& grad);
void EDTEnvironment::interpolateTrilinear(double values[2][2][2],
                                                                   const Eigen::Vector3d& diff,
                                                                   double& value,
                                                                   Eigen::Vector3d& grad) {
  // trilinear interpolation
  double v00 = (1 - diff(0)) * values[0][0][0] + diff(0) * values[1][0][0];
  double v01 = (1 - diff(0)) * values[0][0][1] + diff(0) * values[1][0][1];
  double v10 = (1 - diff(0)) * values[0][1][0] + diff(0) * values[1][1][0];
  double v11 = (1 - diff(0)) * values[0][1][1] + diff(0) * values[1][1][1];
  double v0 = (1 - diff(1)) * v00 + diff(1) * v10;
  double v1 = (1 - diff(1)) * v01 + diff(1) * v11;

  value = (1 - diff(2)) * v0 + diff(2) * v1;

  grad[2] = (v1 - v0) * resolution_inv_;
  grad[1] = ((1 - diff[2]) * (v10 - v00) + diff[2] * (v11 - v01)) * resolution_inv_;
  grad[0] = (1 - diff[2]) * (1 - diff[1]) * (values[1][0][0] - values[0][0][0]);
  grad[0] += (1 - diff[2]) * diff[1] * (values[1][1][0] - values[0][1][0]);
  grad[0] += diff[2] * (1 - diff[1]) * (values[1][0][1] - values[0][0][1]);
  grad[0] += diff[2] * diff[1] * (values[1][1][1] - values[0][1][1]);
  grad[0] *= resolution_inv_;
}

void EDTEnvironment::evaluateEDTWithGrad(const Eigen::Vector3d& pos,
                                                                  double time, double& dist,
                                                                  Eigen::Vector3d& grad) {
  Eigen::Vector3d diff;
  Eigen::Vector3d sur_pts[2][2][2];
  sdf_map_->getSurroundPts(pos, sur_pts, diff);

  double dists[2][2][2];
  getSurroundDistance(sur_pts, dists);

  interpolateTrilinear(dists, diff, dist, grad);
}

完成上述步骤后运行以下指令即可正常运行仿真:

source devel/setup.bash
roslaunch plan_manage rviz.launch
roslaunch plan_manage kino_replan.launch

深入解读Fast-Planner算法看这一篇就够!(含Ubuntu20.04 + Ros noetic 环境下 Fast-planner 算法仿真环境的配置与真机效果演示。),算法

算法真机测试

首先在Jetson Xavier NX 中配置好Ubuntu20.04 + ROS noeric + g++ 9.4.0 + Eigen 3.3.7运行环境,其下载编译流程与仿真环境中的编译大同小异,但是由于Jetson Xavier NX为arm架构,会出现一些问题:

1. 编译问题

  • 问题1:动态库版本错误: 

深入解读Fast-Planner算法看这一篇就够!(含Ubuntu20.04 + Ros noetic 环境下 Fast-planner 算法仿真环境的配置与真机效果演示。),算法

        解决1:由于libpose_utils.so是已经在x86_64中已经编译好的库文件,所以不能够直接在arm架构中直接使用,所以找到pose_utils文件夹,在arm中直接编译得到.so文件,然后再编译文件夹中的devel/lib中找到编译好的.so文件直接替代掉原有文件,然后复制一份到usr/lib中再次编译即可。

  • 问题2:真机运行时,规划过程中的高度一直维持在1米:

        解决2:修改keno_replan_fsm.cpp文件中的第74行,更改为:

end_pt_ << msg->poses[0].pose.position.x, msg->poses[0].pose.position.y, msg->poses[0].pose.position.z;

        并将launch文件中的参数改为1:

 <arg name="flight_type" value="1" />

2. 程序话题修改(以比赛为例子)

实际上Fast-Planner订阅了三个话题,并发布了一个位置控制话题,需要调用Fast-Planner时我们仅需要修改相应的话题即可。

2.1 修改订阅话题

(eg:一定要确保消息类型相同,不同时要转换)

  • 订阅无人机位置话题:/state_ukf/odom

        消息类型:nav_msgs/Odometry

        修改为:/iris_0/mavros/odometry/in(以笔者的里程计话题为例)

  • 订阅无人机的相机深度信息:/pcl_render_node/depth

        消息类型:sensor_msgs/Image

        修改为:/iris_0/realsense/depth_camera/depth/image_raw(以笔者深度相机话题为例)

  • 订阅无人机相机姿态话题:/pcl_render_node/camera_pose

        消息类型:geometry_msgs/PoseStamped

        修改为:/iris_0/mavros/vision_pose/pose(此处以笔者的相机姿态为例)

2.2 修改发布话题

(eg:一定要确保消息类型相同,不同时要转换)

  • 发布无人机的位置控制话题:/planning/pos_cmd

        消息类型:quadrotor_msgs/PositionCommand

        修改为:/pose_cmd

        同时在traj_server.cpp文件中添加以下代码发布控制指令

ros::Publisher pose_cmd_pub;
geometry_msgs::Pose pose_cmd;

  pose_cmd.position.x = pos(0);
  pose_cmd.position.y = pos(1);
  pose_cmd.position.z = pos(2);

  pose_cmd.orientation.x = 0.0; 
  pose_cmd.orientation.y = 0.0;
  pose_cmd.orientation.z = sin(yaw/2);
  pose_cmd.orientation.w = cos(yaw/2);
  //发送一个geometry_msgs::Pose类型的消息
  pose_cmd_pub.publish(pose_cmd);
  
  pose_cmd_pub = nh.advertise<geometry_msgs::Pose>("/pose_cmd", 50);

3. 程序启动步骤

(1)将无人机起飞到一定高度,切换为off board模式

(2)启动fast_palnner节点:

roslaunch plan_manage kino_replan.launch

(3)发布目标点话题即可

4. 无人机真机展示

Fast-Planner真机测试_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1UN411i7XQ/?vd_source=36dee4ded45786e3aecb0d68988cd462


总结

        至此,已经完成了Fast-Planner仿真与真机测试,祝大家能够顺利完成所有步骤,本人在运行Fast-Planner算法时发现当速度限制在2m/s以下时,生成的轨迹是无法运行的,在真机上运行时大家一定要注意安全!!!

       此文是笔者对于Fast-Planner算法理解的叙述与仿真的记录,所有内容皆是原创,加上论文解读已超过万字,所有内容都是笔者一个一个敲出来的,希望对大家理解Fast-Planner算法能够有所帮助,感谢CSDN的大佬们,初入路径规划,请多多包含!

        如果在测试过程中遇到问题,欢迎留言区交流,我不一定会,但是我会努力解决!文章来源地址https://www.toymoban.com/news/detail-713517.html


授权说明

  1. 原创文章在发布三天内禁止转载;
  2. 转载本人文章禁止声明原创;
  3. 转载必须标明作者与来源,本人保留追诉权利;
  4. 若非直接转载而是改变排版后转载,请联系本人,获得本人同意后即可转载。

到了这里,关于深入解读Fast-Planner算法看这一篇就够!(含Ubuntu20.04 + Ros noetic 环境下 Fast-planner 算法仿真环境的配置与真机效果演示。)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 史上最详细的KMP算法教程,看这一篇就够了

    🧑‍💻 文章作者:Iareges 🔗 博客主页:https://blog.csdn.net/raelum ⚠️ 转载请注明出处 ⚠️ 本文讨论的下标均从 0 0 0 开始。 字符串匹配又称模式匹配(pattern matching)。该问题可以概括为「给定字符串 s s s 和 t t t ,在主串 s s s 中寻找子串 t t t 」。字符串 t t t 称为 模式串

    2024年03月27日
    浏览(57)
  • 深入探索Python的scipy库:强大的科学计算工具集(学scipy看这一篇文章就够了)

    引言: Python是一种功能强大且受欢迎的编程语言,广泛应用于科学计算、数据分析和工程应用领域。在Python生态系统中,scipy库是一个重要的工具,提供了许多用于科学计算的高级功能。本文将深入探索scipy库,介绍其主要功能和用法,并提供相应的代码示例和相关资源。 一、

    2024年02月09日
    浏览(55)
  • 【排序算法】 快速排序(快排)!超详细看这一篇就够了”保姆级教学“

    🎥 屿小夏 : 个人主页 🔥个人专栏 : 算法—排序篇 🌄 莫道桑榆晚,为霞尚满天! 什么是快排?快排的速度到底有多快呢?它们的思想和实现是什么样的? 本文会对这快速排序进行详解,绝对细致入微!让你彻底搞懂快排! 英国计算机科学家Tony Hoare在1960年为了解决计算

    2024年02月05日
    浏览(53)
  • 最优化算法对偶单纯形法的matlab实现(对偶单纯形法看这一篇就够了)

    最优化算法对偶单纯形法的matlab实现: 要读懂本文代码需要了解:nchoosek,setdiff,eye等函数在matlab中的作用,以及/符号在矩阵运算中的作用。 在高等教育出版社《最优化方法》一书中提到的单纯形法表格如下图所示: 其中:c为目标函数系数, A为约束方程组系数矩阵, b为约

    2023年04月16日
    浏览(42)
  • CSS基础——看这一篇就够了

    目录 一、CSS简介 1.CSS是什么? 2.CSS的作用 3.CSS的构成 二、CSS选择器 1.基础选择器 (1).标签选择器 (2)类选择器 (3)标签选择器 (4) 通配符选择器 2.复合选择器 (1)后代选择器(包含选择器) (2)子选择器 (3)并集选择器 (4)伪类选择器  三、基本属性 1.字体属性

    2024年02月09日
    浏览(71)
  • 精通线程池,看这一篇就够了

    当我们运用多线程技术处理任务时,需要不断通过new的方式创建线程,这样频繁创建和销毁线程,会造成cpu消耗过多。那么有没有什么办法 避免频繁创建线程 呢? 当然有,和我们以前学习过多连接池技术类似,线程池通过提前创建好线程保存在线程池中, 在任务要执行时取

    2023年04月17日
    浏览(96)
  • SourceTree使用看这一篇就够了

     你梦想有一天成为git大师,然而面对复杂的git命令,你感觉TMD这我能记得住吗?你曾经羡慕从命令行敲git命令,才会更加炫酷,然而时间一长,TMD命令我有忘了。那么今天我介绍的这款工具会让你从git命令中解救出来,这就是git可视化工具SourcTree。 事实上Git的功能十分强大

    2024年02月08日
    浏览(63)
  • ElasticSearch常见用法,看这一篇就够了

    2024送书福利正式起航 关注「哪吒编程」,提升Java技能 文末送3本《一本书讲透Elasticsearch:原理、进阶与工程实践》 大家好,我是哪吒。 ElasticSearch是一款由Java开发的开源搜索引擎,它以其出色的实时搜索、稳定可靠、快速安装和方便使用的特性,在Java开发社区中赢得了广

    2024年03月19日
    浏览(70)
  • 还不会二分查找?看这一篇就够了

    二分查找分为整数二分和浮点数二分,一般所说的二分查找都是指整数二分。 满足单调性的数组一定可以使用二分查找,但可以使用二分查找的数组不一定需要满足单调性。 不妨假设我们找到了条件 C 1 C_1 C 1 ​ ,它和它的 对立条件 C 2 C_2 C 2 ​ 能够将数组 a a a 一分为二,

    2024年01月19日
    浏览(51)
  • 还不会拓扑排序?看这一篇就够了

    拓扑排序是一种有向无环图(DAG)的顶点排序方法,它将一个有向无环图中的所有顶点排成一个线性序列,使得图中 任意一条有向边上的起点排在终点的前面 。 这样说还不够具体,我们先来看一个例子。假设某大学的课程安排如下: 课程编号 课程名称 先修课程 1 1 1 高等数

    2023年04月08日
    浏览(109)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包