ego-planner开源代码之simulator.xml介绍&分析

1. 源由

ego-planner开源代码之数据流分析工作的延续。

  • 对于算法逻辑的数据流,在前面已经初步做了整理,部分主要模块已经有比较清晰的认识。
  • 从数据流的角度,理解模块的工作逻辑,还是非常直观、简洁的。

如何从系统的角度,思考问题,尤其是一个系统由众多模块组成的复杂体系,要能够整体的理解,反而并不能一下子上手。

反之,若能够将整个系统作为一个模块来理解,入参和出参分别如何对应和理解呢?

2. simulator配置

2.1 配置入参

  <arg name="init_x" value="-18.0"/>
  <arg name="init_y" value="0.0"/>
  <arg name="init_z" value="0.0"/> 
  <arg name="obj_num" value="1" />
  <arg name="map_size_x_"/>
  <arg name="map_size_y_"/>
  <arg name="map_size_z_"/>
  <arg name="c_num"/>
  <arg name="p_num"/>
  <arg name="min_dist"/>
  <arg name="odometry_topic"/>

在启动文件中传递参数值给节点。每个 arg 标签定义了一个参数名和一个默认值(如果有的话),并且这些参数可以在启动节点时被传递和使用。

  1. <arg name="init_x" value="-18.0"/>

    • 含义: 初始位置的 x 坐标,值为 -18.0。
  2. <arg name="init_y" value="0.0"/>

    • 含义: 初始位置的 y 坐标,值为 0.0。
  3. <arg name="init_z" value="0.0"/>

    • 含义: 初始位置的 z 坐标,值为 0.0。
  4. <arg name="obj_num" value="1" />

    • 含义: 对象的数量,值为 1。
  5. <arg name="map_size_x_"/>

    • 含义: 地图在 x 方向上的大小。这里没有指定默认值,实际值需要在运行时传递。
  6. <arg name="map_size_y_"/>

    • 含义: 地图在 y 方向上的大小。这里没有指定默认值,实际值需要在运行时传递。
  7. <arg name="map_size_z_"/>

    • 含义: 地图在 z 方向上的大小。这里没有指定默认值,实际值需要在运行时传递。
  8. <arg name="c_num"/>

    • 含义: 参数 c 的数量。这里没有指定默认值,实际值需要在运行时传递。
  9. <arg name="p_num"/>

    • 含义: 参数 p 的数量。这里没有指定默认值,实际值需要在运行时传递。
  10. <arg name="min_dist"/>

    • 含义: 最小距离值。这里没有指定默认值,实际值需要在运行时传递。
  11. <arg name="odometry_topic"/>

    • 含义: 里程计数据的 ROS 话题名称。这里没有指定默认值,实际值需要在运行时传递。

simple_run.launch 中相关的覆盖值定义是:

  <arg name="map_size_x" value="40.0"/>
  <arg name="map_size_y" value="40.0"/>
  <arg name="map_size_z" value=" 3.0"/>

  <!-- topic of your odometry such as VIO or LIO -->
  <arg name="odom_topic" value="/visual_slam/odom" />

  <!-- use simulator -->
  <include file="$(find ego_planner)/launch/simulator.xml">
    <arg name="map_size_x_" value="$(arg map_size_x)"/>
    <arg name="map_size_y_" value="$(arg map_size_y)"/>
    <arg name="map_size_z_" value="$(arg map_size_z)"/>
    <arg name="c_num" value="200"/>
    <arg name="p_num" value="200"/>
    <arg name="min_dist" value="1.2"/>

    <arg name="odometry_topic" value="$(arg odom_topic)" />
  </include>

2.2 mockamap_node 地图生成节点

  <node pkg="mockamap" type="mockamap_node" name="mockamap_node" output="screen">  
      <remap from="/mock_map" to="/map_generator/global_cloud"/>

      <param name="seed" type="int" value="127"/>
      <param name="update_freq" type="double" value="0.5"/>

      <!--  box edge length, unit meter-->
      <param name="resolution" type="double" value="0.1"/>

      <!-- map size unit meter-->
      <param name="x_length" value="$(arg map_size_x_)"/>
      <param name="y_length" value="$(arg map_size_y_)"/>
      <param name="z_length" value="$(arg map_size_z_)"/>

      <param name="type" type="int" value="1"/>
      <!-- 1 perlin noise parameters -->
      <!-- complexity:    base noise frequency,
                              large value will be complex
                              typical 0.0 ~ 0.5 -->
      <!-- fill:          infill persentage
                 
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&amp; msg); // 地图回调函数 void poseCallback(const geometry_msgs::PoseStamped::ConstPtr&amp; msg); // 当前位置回调函数 void goalCallback(const geometry_msgs::PoseStamped::ConstPtr&amp; msg); // 目标位置回调函数 void plan(); // 路径规划函数 }; ``` 2. 在构造函数中,需要完成ROS节点的初始化、订阅和发布话题的设置。 ```c++ EgoPlanner::EgoPlanner() { nh_ = ros::NodeHandle(&quot;~&quot;); sub_map_ = nh_.subscribe(&quot;map&quot;, 1, &amp;EgoPlanner::mapCallback, this); sub_pose_ = nh_.subscribe(&quot;pose&quot;, 1, &amp;EgoPlanner::poseCallback, this); sub_goal_ = nh_.subscribe(&quot;goal&quot;, 1, &amp;EgoPlanner::goalCallback, this); pub_path_ = nh_.advertise&lt;nav_msgs::Path&gt;(&quot;path&quot;, 1); } ``` 3. 在地图、当前位置和目标位置的回调函数中,需要将接收到的信息保存到对应的成员变量中。 ```c++ void EgoPlanner::mapCallback(const nav_msgs::OccupancyGrid::ConstPtr&amp; msg) { map_ = *msg; } void EgoPlanner::poseCallback(const geometry_msgs::PoseStamped::ConstPtr&amp; msg) { start_ = *msg; } void EgoPlanner::goalCallback(const geometry_msgs::PoseStamped::ConstPtr&amp; msg) { goal_ = *msg; } ``` 4. 在路径规划函数中,需要调用路径规划算法,生成一条可行的路径,并将路径发布出去。 ```c++ void EgoPlanner::plan() { // 调用路径规划算法,生成一条可行的路径 std::vector&lt;geometry_msgs::PoseStamped&gt; path = pathPlanning(map_, start_, goal_); // 将路径发布出去 nav_msgs::Path path_msg; path_msg.header.frame_id = &quot;map&quot;; 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, &quot;ego_planner&quot;); EgoPlanner planner; ros::Rate rate(10); while (ros::ok()) { planner.plan(); ros::spinOnce(); rate.sleep(); } return 0; } ``` 以上就是Ego-Planner代码框架,其中路径规划算法需要根据具体情况进行选择和实现。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值