Apollo如何添加一个子节点

How_to_add_a_subnode

  1. 添加文件
    • modules/perception/obstacle/onboard新建两个文件,我这里分别是zuo_test_subnode.cczuo_test_subnode.h

    这里写图片描述

  2. 实现基础代码
    • 添加一个子节点类,我们这里假定是放在perception模块下,那要记得加namespace

    • 除此之外,因为整体的子节点框架是用多态的方法来调用的,所以我们的子类要继承Subnode

    • 既然是继承了,记得要实现父类的纯虚函数。

    • 这里假设我的节点名为ZuoTestSubnode,具体代码如下:

      //-- zuo_test_subnode.h
      
      
      #ifndef MODULES_PERCEPTION_OBSTACLE_ONBOARD_ZUO_TEST_SUBNODE_H_
      
      
      #define MODULES_PERCEPTION_OBSTACLE_ONBOARD_ZUO_TEST_SUBNODE_H_
      
      
      //-- 子节点基类(抽象类)public继承自Thread
      
      #include "modules/perception/onboard/subnode.h"
      
      
      /**
      * Zuo add on 2018-04-02
      * How to add a subnode
      */
      namespace apollo {
      namespace perception {
      
      class ZuoTestSubnode : public Subnode {
      public:
      ZuoTestSubnode() = default;
      ~ZuoTestSubnode() = default;
      
      //-- Zuo commented on 2018-04-02
      //-- 如果不需要用到事件处理函数,那么就如下实现即可。
      //-- 如果需要用到事件处理,可以参考VisualizationSubnode的实现
      //-- ProcEvents()会在Subnode::Run()被调用
      apollo::common::Status ProcEvents() override {
       return apollo::common::Status::OK();
      }
      private:
      bool InitInternal() override;
      };
      
      //-- 节点注册
      REGISTER_SUBNODE(ZuoTestSubnode);
      
      }  // namespace perception
      }  // namespace apollo
      //-- zuo_test_subnode.cc
      
      #include "modules/perception/obstacle/onboard/zuo_test_subnode.h"
      
      
      namespace apollo {
      namespace perception {
      
      bool ZuoTestSubnode::InitInternal() {
      //-- Zuo add a test info output --//
      AINFO << "===== Zuo test info on zuo_test_subnode.cc InitInternal =====";
      return true;
      }
      
      }  // namespace perception
      }  // namespace apollo
  3. 注册节点

    ​ 可以看到,在头文件zuo_test_subnode.h后面我添加了

    REGISTER_SUBNODE(ZuoTestSubnode)

    ​ 这里是为了注册这个子节点,它是一个宏定义,展开会生成一些函数和类,具体可以在/apollo-master/modules/perception/lib/base/registerer.h里面找到定义。如下:

    
    #define REGISTER_CLASS(clazz, name)                                           \
    
     class ObjectFactory##name : public apollo::perception::ObjectFactory {      \
      public:                                                                    \
       virtual ~ObjectFactory##name() {}                                         \
       virtual perception::Any NewInstance() {                                   \
         return perception::Any(new name());                                     \
       }                                                                         \
     };                                                                          \
     inline void RegisterFactory##name() {                                       \
       perception::FactoryMap &map = perception::GlobalFactoryMap()[#clazz];     \
       if (map.find(#name) == map.end()) map[#name] = new ObjectFactory##name(); \
     }

    ​ 这里的注册,实际是定义一些实例化对象的函数,如GetInstanceByName, GetUniqInstanceName, NewInstance等等。本质上都是在头文件中宏展开,这些在registerer.h文首有一个关于如何使用Registerer的简短教程,大家可自行查阅。这里稍微解释下,上文中的##是字符串拼接的作用,可以将前后的字符串拼接在一起,例如这里我们调用的时候,name参数传入的是ZuoTestSubnode,所以RegisterFactory##name()实际会是RegisterFactoryZuoTestSubnode()

    Apollo里面大量的用到了##拼接加宏定义,展开为类、函数的方法,虽然它能大大增加了代码的复用率,但是也有一个很不好的缺点,由于是拼接的函数名,所以IDE不能跳转找到,甚至都不会搜索到,如果你不熟悉此方法,可能一开始会有点晕头转向。

    ​ 在perception.cc里面增加子节点的头文件:

    
    #include "modules/perception/obstacle/onboard/zuo_test_subnode.h"
    

    ​ 在perception.cc::RegistAllOnboardClass()里面调用RegisterFactoryZuoTestSubnode函数:

    void Perception::RegistAllOnboardClass() {
    /// regist sharedata
    RegisterFactoryLidarObjectData();
       ......
       //-- Zuo add on 2018-04-03 --//
    RegisterFactoryZuoTestSubnode();
    AINFO << " Zuo Register TestSubnode successfull ";
    //-- Zuo add on 2018-04-03 --//
    }
  4. 修改BUILD文件
    • BUILD里面增加一个zuo_test_subnode编译单元。在/apollo-master/modules/perception/obstacle/onboard/BUILD里面增加一个代码块,如下:

      cc_library(
       name = "zuo_test_subnode",
       srcs = [
           "zuo_test_subnode.cc",
       ],
       hdrs = [
           "zuo_test_subnode.h",
           "object_shared_data.h",
       ],
       deps = [
           ":perception_obstacle_shared_data",
           "//modules/common:log",
           "//modules/common/adapters:adapter_manager",
           "//modules/perception/common",
           "//modules/perception/lib/config_manager",
           "//modules/perception/onboard",
           "@eigen",
           "@opencv2//:core",
           "@ros//:ros_common",
       ],
      )

      这里有些依赖项没必要加,但是我也放在这里做一个实例。

      这是bazel的写法,和cmake有所区别,但是原理大致相同,各个标签意思如下:

      • name: 模块名字,用来在上一级BUILD文件的引用**
      • srcs/hdrs: 对应的实现文件和头文件**
      • deps: 依赖项
      • bazel Guide Doc
    • perceptionBUILD的依赖项里面增加子节点。如下:

      cc_library(
       name = "perception_lib",
       srcs = ["perception.cc"],
       hdrs = [
           "perception.h",
       ],
       deps = [
          "//modules/common",
          ......
           "//modules/perception/obstacle/onboard:zuo_test_subnode",
          ......
       ],
      )
  5. 修改config文件
    • /apollo-master/modules/perception/conf/dag_camera_obstacle_vis.config里面增加一段TestNode的信息。例如:

      subnode_config {
      
      ......
      
       # Test node. Zuo added on 2018-04-08
       # id 我是随便设置的不重复的
       # name 节点的类名
       # device_id 跟节点头文件里面的device_id对应上
       subnodes {
           id: 4
           name: "ZuoTestSubnode"
           reserve: "device_id:ZuoTest;publish:1;"
           type: SUBNODE_IN
       }
      
      ......
      
      }
      

      这里因为我执行的是scripts/perception_offline_visualizer.sh,因为在脚本里面设置了--dag_config_path="./conf/dag_camera_obstacle_vis.config",所以我这里需要在对应的config文件里面增加ZuoTestSubnode

  6. 流程图
    1. 启动
      这里写图片描述
    2. Topic配置
      这里写图片描述2.
Apollo一个开源的自动驾驶软件平台,旨在提供强大的感知、决策和控制功能,为车辆实现全自动驾驶。在自动驾驶过程中,添加参考线是一个重要的步骤。 参考线是指车辆行驶时所依据的路径线,它可以是道路中心线、车道线或者其他指示线。添加参考线的目的是为了提供车辆定位和路径规划的依据,使车辆能够准确地跟踪所选择的路径。 在 Apollo 中,添加参考线可以通过多种方式实现。首先,可以利用传感器技术获取道路信息。Apollo 配备了多个传感器,如摄像头、激光雷达和雷达等,这些传感器可以收集到道路的相关信息,例如道路中心线、车道线和交通标识等。 接下来,在感知模块中,Apollo 可以使用算法对传感器数据进行处理,提取出道路的几何信息,并生成参考线。通过对图像、点云等数据的处理,Apollo 可以检测道路边界,识别车道线,并将其表示为车辆所需要跟踪的参考线。 最后,在路径规划模块中,Apollo 使用参考线来生成车辆的路径规划。基于车辆当前位置和目标位置,Apollo 可以根据参考线生成一条最优路径,并通过路径规划算法将车辆引导沿着这条路径行驶。 综上所述,Apollo 添加参考线是为了提供车辆定位和路径规划的依据。通过传感器数据的处理和算法的运算,Apollo 可以获取道路信息,生成参考线,并将其用于车辆行驶的辅助工具。这些参考线使得 Apollo 能够实现更加精确的定位和路径规划,为全自动驾驶提供了可靠的支持。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值