EGO-PLANNER安装问题记录以及如何在Ubuntu22.04LTS上安装ROS noetic

一、Ubuntu系统版本及ROS版本

笔者误操作升级系统版本到了Ubuntu22.04LTS,在这个版本中系统不支持ROS1的安装,笔者尝试用ROS2运行ego-planner,并未运行成功,从原理上讲,ROS2应该是可以运行ego-planner的,但是至少笔者没有找到正确的方法,而且由于ROS2使用的是colcon构建,与ROS的catkin构建并不相同,因此指令也大相径庭,按照教程使用颇为不变。

因此,倘若读者有升级Ubuntu系统的想法,笔者劝你看到本文之后尽快收手,在其他适配跟上之前不要盲目升级。如果你已经升级了,请看这里。

Ubuntu 22.04源码编译安装ROS Noetic_源码安装ros_Drknown的博客-CSDN博客

这篇博文看起来简单,但是实际操作起来笔者踩了很多坑。

在添加源部分,笔者并未遇到问题。

但是在安装编译依赖项时,笔者就遇到问题了

1.安装编译依赖项

sudo apt-get install python3-rosdep python3-rosinstall-generator python3-vcstools python3-vcstool build-essential
sudo pip3 install -U rosdep rosinstall_generator vcstool
sudo pip3 install --upgrade setuptools

第一句指令可以正常运行,第二句报错

ModuleNotFoundError: No module named 'distutils.cmd'

但是笔者使用指令

# 更新一下源
sudo apt-get update
# 安装 python3-distutils
sudo apt-get install python3-distutils

发现python3-distutils已经正常安装,就是无法运行。经过测试,自动安装的python3-distutils支持的是Python3.10及以上,但是笔者系统内有Python3.7和3.9,系统默认选择了其他版本的Python,因此可以使用指令

sudo pip3.10 install -U rosdep rosinstall_generator vcstool
sudo pip3.10 install --upgrade setuptools

2.拉取ROS Noetic源码

rosinstall_generator desktop --rosdistro noetic --deps --tar > noetic-desktop.rosinstall
mkdir ./src
vcs import --input noetic-desktop.rosinstall ./src

这里的第一句指令是用于生成一个 ROS 工作区的 .rosinstall 文件,其中包括 ROS Noetic 的桌面完整安装以及所有依赖项。该文件可以用于使用 wstool 下载所有必要的软件包。但是由于网络原因,需要多次尝试才能下载下来,常常因为超时中断,笔者尝试在超时提供的网页链接上直接导出这个文件,但是其实格式不对,笔者直接把下好文件贴出来,这其实就是一个下载目录和下载链接,如果读者网络不好,可以直接取用。

https://download.csdn.net/download/reyssalee/87653433

第三句指令是用于将ROS安装文件(ROS install file)导入到ROS的软件包源代码目录(source code directory)中。具体来说,vcs import命令根据ROS安装文件中指定的各个软件包的信息,从指定的版本控制系统中下载相应的软件包源代码到本地的软件包源代码目录中。在这个命令中,--input参数指定了要导入的ROS安装文件的路径,而./src则是指定了软件包源代码目录的路径。原博主已经指出,如果网络不好,可以在所有的github前面加上k,笔者已经在上传的文档里加好了,这和墙内墙外关系不大,笔者尝试用墙外依旧报错,而用kgithub成功率很高。

但是单凭这个指令仍旧不能保证全部的包下载下来,依旧会有E报错,笔者是在后续的CMAKE报错中发现的,读者也可以在下载完之后,直接看自己的哪个文件夹是空的。

那么如何把需要下载的包补齐,可以回到noetic-desktop.rosinstall文档内,找到对应的链接,然后手动把这个包下载下来,放到他原本的目录下,这里用kgithub下载好像不太理想,使用github可以正常下载。

全部下载完成后,按照原博主的指令安装即可。

最后,一定要运行这个指令

source ~/ros_catkin_ws/install_isolated/setup.bash

如果不运行这个指令,ros是无法使用的,当然可能运行了这个指令也无法使用,读者可以打开~/.bashrs,确认里面是否添加了,如果没有,那么手动将上面的指令添加到最后一行即可。

二、ego-planner的安装

下载之后放在哪个目录都行,没有要求。

/src里有个CMakeLists.txt的链接,一开始会报错链接失效,这个无视即可,直接按照README.md里的指示运行catkin_make即可,但是笔者这里更推荐使用命令catkin_make -j1,会显示报错信息。

1.‘deque’ does not name a type

这里需要在报错文档的头文件里加上#include <deque>,即可解决

2.error: no match for ‘operator=’ (operand types are ‘Eigen::internal::enable_if<true, Eigen::IndexedView<Eigen::Matrix<double, -1, -1>, double, double> >::type’ {aka ‘Eigen::IndexedView<Eigen::Matrix<double, -1, -1>, double, double>’} and ‘double’) 238 | ) * (i - 2) * j * (j - 1) * (j - 2) * pow(ts, i + j - 5) / (i + j - 5);

这里在/ego-planner-master/src/planner/traj_utils/include/traj_utils/polynomial_traj.h的238行报错,将此处代码修改为

for (double i = 3; i < order; i += 1)
  for (double j = 3; j < order; j += 1)
  {
    mat_jerk.coeffRef(i, j) =
        i * (i - 1) * (i - 2) * j * (j - 1) * (j - 2) * pow(ts, i + j - 5) / (i + j - 5);
  }

3.报错缺少PCL相关文件

这里又回到了前面的ROS配置问题,Releases · ros-perception/perception_pcl · GitHub,在这里下载1.7.4版本,这是支持ROS1的,不要下最新版,最新版支持ROS2,编译会报错。将PCL文件下载到ros_catkin_ws里的src文件夹里,重新编译ROS,这样ROS里有了pcl之后,就可以正常编译ego-planner了。

但是在加入了PCL文件之后,cmake又会报错,这里缺少好几个依赖项,Tags · ros/geometry2 · GitHub,笔者只记得这一个依赖项了,缺少什么就上github上下载即可,上面都有。

后续笔者没有遇到其他错误,make完之后即可正常运行ego-planner。

  • 16
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Ego-Planner是一个基于ROS的路径规划器,它可以在给定的地图和起点、终点信息下,生成一条可行的路径。以下是Ego-Planner的代码框架: 1. 首先需要定义一个EgoPlanner类,其中包含了一些必要的成员变量和函数。 ```c++ class EgoPlanner { private: ros::NodeHandle nh_; ros::Subscriber sub_map_; ros::Subscriber sub_pose_; ros::Subscriber sub_goal_; ros::Publisher pub_path_; nav_msgs::OccupancyGrid map_; geometry_msgs::PoseStamped start_; geometry_msgs::PoseStamped goal_; public: EgoPlanner(); // 构造函数 ~EgoPlanner(); // 析构函数 void mapCallback(const nav_msgs::OccupancyGrid::ConstPtr& msg); // 地图回调函数 void poseCallback(const geometry_msgs::PoseStamped::ConstPtr& msg); // 当前位置回调函数 void goalCallback(const geometry_msgs::PoseStamped::ConstPtr& msg); // 目标位置回调函数 void plan(); // 路径规划函数 }; ``` 2. 在构造函数中,需要完成ROS节点的初始化、订阅和发布话题的设置。 ```c++ EgoPlanner::EgoPlanner() { nh_ = ros::NodeHandle("~"); sub_map_ = nh_.subscribe("map", 1, &EgoPlanner::mapCallback, this); sub_pose_ = nh_.subscribe("pose", 1, &EgoPlanner::poseCallback, this); sub_goal_ = nh_.subscribe("goal", 1, &EgoPlanner::goalCallback, this); pub_path_ = nh_.advertise<nav_msgs::Path>("path", 1); } ``` 3. 在地图、当前位置和目标位置的回调函数中,需要将接收到的信息保存到对应的成员变量中。 ```c++ void EgoPlanner::mapCallback(const nav_msgs::OccupancyGrid::ConstPtr& msg) { map_ = *msg; } void EgoPlanner::poseCallback(const geometry_msgs::PoseStamped::ConstPtr& msg) { start_ = *msg; } void EgoPlanner::goalCallback(const geometry_msgs::PoseStamped::ConstPtr& msg) { goal_ = *msg; } ``` 4. 在路径规划函数中,需要调用路径规划算法,生成一条可行的路径,并将路径发布出去。 ```c++ void EgoPlanner::plan() { // 调用路径规划算法,生成一条可行的路径 std::vector<geometry_msgs::PoseStamped> path = pathPlanning(map_, start_, goal_); // 将路径发布出去 nav_msgs::Path path_msg; path_msg.header.frame_id = "map"; path_msg.header.stamp = ros::Time::now(); path_msg.poses = path; pub_path_.publish(path_msg); } ``` 5. 在主函数中,创建EgoPlanner对象,并进入ROS循环。 ```c++ int main(int argc, char** argv) { ros::init(argc, argv, "ego_planner"); EgoPlanner planner; ros::Rate rate(10); while (ros::ok()) { planner.plan(); ros::spinOnce(); rate.sleep(); } return 0; } ``` 以上就是Ego-Planner的代码框架,其中路径规划算法需要根据具体情况进行选择和实现。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值