首页 > 其他分享 >ego_planner代码运行结构

ego_planner代码运行结构

时间:2024-08-23 16:19:18浏览次数:8  
标签:nh planner PlanningVisualization 函数 代码运行 参数 ego ros

ego_planner_node.cpp

1.1 初始化节点,设置句柄,并进入初始化函数

  ros::init(argc, argv, "ego_planner_node");
  ros::NodeHandle nh("~");

  EGOReplanFSM rebo_replan;

  rebo_replan.init(nh);

ego_replan_fsm.cpp

2.1 设置waypoint参数

nh.param("fsm/waypoint" + to_string(i) + "_x", waypoints_[i][0], -1.0);
  • 尝试从参数服务器中获取名为"fsm/waypoint" + to_string(i) + "x"的参数,并将其值赋给waypoints[i][0]。如果参数服务器中没有这个参数,那么waypoints_[i][0]将被设置为-1.0。
<param name="fsm/waypoint0_x" value="$(arg point0_x)" type="double"/>
  • 在plan_manager/lunch/advanced_param.xml文件中,定义了一个名为fsm/waypoint0_x的参数,其值来源于启动文件中的point0_x参数或变量,并且这个参数的类型是双精度浮点数。这样的定义允许在ROS节点之间共享和访问这个参数,使得不同的节点可以使用相同的路径点坐标。
<arg name="point0_x" value="15" />
  • 在plan_manager/lunch/single_run_in_sim文件中,arg标签用于在启动文件中定义参数,这些参数可以在启动文件的后续部分被引用,以配置节点或其他组件的行为。

2.2 模块初始化,以规划可视化初始化为例

PlanningVisualization(ros::NodeHandle &nh);
  • PlanningVisualization 类的一个构造函数,它接受一个 ros::NodeHandle 类型的引用作为参数
typedef std::shared_ptr<PlanningVisualization> Ptr;
  • 这意味着 Ptr 现在可以用作 std::shared_ptr 的简短别名,使得代码更加简洁易读.PlanningVisualization 是一个自定义的类,用于执行某种规划算法的可视化。通过使用 std::shared_ptr 作为其智能指针类型。
PlanningVisualization::Ptr visualization_;
  • 定义了一个指向PlanningVisualization类型对象的智能指针,名为visualization_
visualization_.reset(new PlanningVisualization(nh));
  • reset方法用于将智能指针重新指向一个新的对象(或空指针),并释放它当前指向的对象(如果有的话)。创建一个新的PlanningVisualization对象。

2.3 定时回调函数

exec_timer_ = nh.createTimer(ros::Duration(0.01), &EGOReplanFSM::execFSMCallback, this);
  • createTimer:这是NodeHandle类的一个成员函数,用于创建一个定时器。第一个参数表示定时器的时间间隔0.01秒。第二个参数是一个函数指针,指向当定时器到期时应该调用的回调函数。第三个参数(在这个例子中是this)是指向类实例的指针,用于在回调函数内部访问类的成员变量和成员函数。这是因为回调函数是类的成员函数,需要知道是哪个类的实例在调用它。在回调函数execFSMCallback中,根据不同的状态运行不同的程序。

2.4 飞行模式选择,如果是MANUAL_TARGET,就跳转到waypointCallback

if (target_type_ == TARGET_TYPE::MANUAL_TARGET)
    {
      waypoint_sub_ = nh.subscribe("/move_base_simple/goal", 1, &EGOReplanFSM::waypointCallback, this);

2.5 waypointCallback

    Eigen::Vector3d end_wp(msg->pose.position.x, msg->pose.position.y, 1.0);
    planNextWaypoint(end_wp);
  • 从消息msg中获取坐标,并进行路标点规划planNextWaypoint

2.6 planNextWaypoint

success = planner_manager_->planGlobalTraj(odom_pos_, odom_vel_, Eigen::Vector3d::Zero(), next_wp, Eigen::Vector3d::Zero(), Eigen::Vector3d::Zero());
  • 跳转到planGlobalTraj

2.7 planGlobalTraj

Eigen::Vector3d inter_pt = points.at(i) * (1.0 - double(j) / id_num) + points.at(i + 1) * double(j) / id_num;
  • 如果两点距离大于设定值,使用贝塞尔曲线进行插值,中间插入点仍然为直线
gl_traj = PolynomialTraj::minSnapTraj(pos, start_vel, end_vel, start_acc, end_acc, time);
  • 使用minimun snap优化

2.8 进入planNextWaypoint函数,改变状态机,从WAIT_TARGET变成GEN_NEW_TRAJ。waypointCallback函数运行结束。
2.9 init函数顺序执行结束,并每隔0.05秒进入回调函数的相应状态。

execFSMCallback状态机GEN_NEW_TRAJ

3.1 进入planFromGlobalTraj,主要调用callReboundReplan函数,运行成功则返回true。
3.2 进入callReboundReplan函数,首先运行getLocalTarget函数,返回局部目标点和局部点速度。
3.3 进入reboundReplan函数,先将多项式路径转换为B样条曲线,再用initControlPoints将控制点移除障碍物,随后进入BsplineOptimizeTrajRebound函数,该函数主要调用rebound_optimize函数。该函数主要调用costFunctionRebound,costFunctionRebound再调用combineCostRebound。此时,可以看到代码:

    calcSmoothnessCost(cps_.points, f_smoothness, g_smoothness);
    calcDistanceCostRebound(cps_.points, f_distance, g_distance, iter_num_, f_smoothness);
    calcFeasibilityCost(cps_.points, f_feasibility, g_feasibility);
  • 分别用来计算光滑项,距离项和可行性。

3.4 在reboundReplan函数中继续运行,运行refineTrajAlgo函数,实现时间重分配。
3.5 回到callReboundReplan函数,bspline_pub_.publish(bspline)发布路径,在traj_server.cpp 中订阅该路径。

标签:nh,planner,PlanningVisualization,函数,代码运行,参数,ego,ros
From: https://www.cnblogs.com/navifree/p/18373273

相关文章

  • candence allego 差分信号设置
    一、设置差分对1、Logic→AssignDifferential;2、依次点击要建立差分对的走线,并在DiffPairname处给差分对命名。二、差分规则Setup→Constraint→ConstraintManager,进入线束约束管理器,在线束约束管理器界面,左侧有一个WorksheetSelector,在WorksheetSelector里选择Phys......
  • 20.04复现LeGo-LOAM
    首先恭喜你看到这篇博客,我已经把弯路走遍了,你可以直接少走30年弯路目录一、安装依赖二、安装编译gtsam三、安装编译LeGo-LOAM​​​​​​​四、LeGo-LOAM复现1.安装依赖项(我把过程中出现的报错整理放最后了,红色数字对应,请移步后面对应解决“报错问题”)(不记得报错3op......
  • 题解:P10844 [EGOI2024] Infinite Race / 无限赛跑
    题解:P10844[EGOI2024]InfiniteRace/无限赛跑有n个人在环形跑道上跑步,和q次超越别人或被别人超越,别人要么在Anika前面,要么在后面怎么说呢,建议降红由于只有重复超过一个人才肯定是跑过一圈的,所以一个数组就行了,每超过一次就打上标记,不然去掉标记。#include<bits/stdc......
  • legoEV3机器人场地赛如何按照规定路线运行(巡线)
    legoEV3机器人场地赛如何按照规定路线运行(巡线)在机器人场地赛中,巡线指让机器人按照固定线路(一般为白底黑线)运行的任务。而巡线也可以被称为“机器人场地赛的‘基本功’”,它既可以单独成为一类比赛项目也可以成为完成其他任务的“地基”。在这里我来给大家介绍两种颜色传感器巡线......
  • [Paper Reading] Single-to-Dual-View Adaptation for Egocentric 3D Hand Pose Estim
    名称Single-to-Dual-ViewAdaptationforEgocentric3DHandPoseEstimation时间:CVPR2024机构:TheUniversityofTokyoTL;DR多目3Dhandposeestimation数据比较难标注,作者核心思路是先训练单目模型,利用无监督的方法适配到双目场景,好处是a.无需标多目数据;b.可以适应任何......
  • 记录JSch连接SFTP Exception:Algorithm negotiation fail问题解决
    问题描述:关于正式环境访问外网连接不成功 1、首先检查是否开放防火墙(已确认开放),策略开放后,通过命令连接是否畅通: 通过telnet命令,可以得出,访问畅通。telnet192.168.1.122 2、查看生产环境日志,观察生产环境访问外网服务器异常:抛出异常,提示:算法协商失败com.jcraft.j......
  • 【后端】Beego使用教程
    目录一、Beego使用步骤1.1安装Beego1.2创建新项目        1.3进入项目目录1.4运行项目1.5创建控制器1.6定义路由1.7创建视图模板1.8修改控制器以渲染视图二、Beego高级功能2.1配置Beego2.2使用ORM2.3静态文件服务2.4中间件(Middleware)2.5......
  • iOS Object-C 创建类别(Category) 与使用
    有时候使用系统给出类或者第三方的类,但是呢它们自带的属性和方法又太少,不够我们的业务使用,这时候就需要给“系统的类或者第三方类”创建一个类别(Category),把自己的想添加的属性和方法写进来.Category模式用于向已经存在的类添加方法从而达到扩展已有类的目的一:创建Cate......
  • ssh 远程登录报错:Unable to negotiate with IP port 22: no matching host key type f
    最近在Mac上想要远程一台Linux服务器,结果不知怎么的就不能使用以前的ssh登录了iot@ios-iMac~%[email protected]:nomatchinghostkeytypefound.Theiroffer:ssh-rsa,ssh-dss ......
  • EGO-Swarm仿真环境搭建
    EGO-Swarm仿真环境搭建参考教程:https://github.com/ZJU-FAST-Lab/ego-planner-swarmEGO-Swarm是一种分散的异步系统解决方案,用于仅使用机载资源在未知的障碍物丰富的场景中进行多机器人自主导航。1.查看系统环境要运行本仿真程序,需要保证当前环境为ubuntu18.04+ros-melodic......