無人駕駛筆記系列(五):gflags的使用和設置

一、Gflags簡介

Gflags是一種命令行解析工具,主要用於解析用命令行執行可執行文件時傳入的參數。就是這個功能。

二、安裝

候補

三、先貼個例子

#include <iostream>
#include <gflags/gflags.h>

DEFINE_bool(isvip, false, "If Is VIP");
DEFINE_string(ip, "127.0.0.1", "connect ip");
DECLARE_int32(port);
DEFINE_int32(port, 80, "listen port");

int main(int argc, char** argv)
{
  google::ParseCommandLineFlags(&argc, &argv, true);
  std::cout<<"ip:"<<FLAGS_ip<<std::endl;
  std::cout<<"port:"<<FLAGS_port<<std::endl;
  if (FLAGS_isvip)
  {
      std::cout<<"isvip:"<<FLAGS_isvip<<std::endl;
  }
  google::ShutDownCommandLineFlags();
  return 0;
}

鏈接時使用 -gflags ,運行使用./gflags -ip="211.152.52.106" -port=8080 -isvip=true

輸出結果如下:

ip:211.152.52.106
port:8080
isvip:1

四、flag變量的使用

用DEFINE宏定義的flag都可以像普通的變量一樣進行調用,定義的變量是以FLAGS_爲前綴,如上述例子中定義了兩個變量FLAGS_ipFLAGS_port,可以像普通的變量一樣對其進行讀寫。

DEFINE_string(ip, "127.0.0.1", "connect ip");
DEFINE_int32(port, 80, "listen port");

std::cout<<"ip:"<<FLAGS_ip<<std::endl;
std::cout<<"port:"<<FLAGS_port<<std::endl;

五、apollo 框架如何調用flag變量

在另外一個文件中如果想要使用上述定義的FLAGS_port,只需要在該文件的頭部進行如下聲明

DECLARE_int32(port);

上述聲明從功能上等價於

extern FLAGS_port; 

如果其他文件需要使用定義好的flag,就在.h頭文件中進行DECLARE聲明,然後只需要#include該頭文件即可,這樣是一種顯示的依賴關係,並且該flag成爲一個全局變量。

我們以apollomsf_localization模塊配置參數加載過程說明:

申明

// modules/localization/common/localization_gflags.h
#pragma once

#include "gflags/gflags.h"

DECLARE_string(localization_module_name);

DECLARE_double(localization_publish_freq);

DECLARE_string(localization_config_file);
DECLARE_string(rtk_adapter_config_file);
DECLARE_string(msf_adapter_config_file);
DECLARE_string(msf_visual_adapter_config_file);

定義

// modules/localization/common/localization_gflags.cc
#include "modules/localization/common/localization_gflags.h"

DEFINE_string(localization_module_name, "localization",
              "localization module name");

DEFINE_double(localization_publish_freq, 100,
              "localization publishing frequency.");

DEFINE_string(rtk_adapter_config_file,
              "/apollo/modules/localization/conf/rtk_adapter.conf",
              "rtk adapter configuration");

DEFINE_string(localization_config_file,
              "/apollo/modules/localization/conf/localization_config.pb.txt",
              "localization config file");

DEFINE_string(msf_adapter_config_file,
              "/apollo/modules/localization/conf/msf_adapter.conf",
              "msf adapter configuration");

DEFINE_string(msf_visual_adapter_config_file,
              "/apollo/modules/localization/conf/msf_visual_adapter.conf",
              "msf visualization adapter configuration");

引用

這樣我們就可以直接使用這個參數了。

// modules/localization/msf/msf_localization_component.cc

#include "modules/localization/msf/msf_localization_component.h"

#include "modules/common/math/quaternion.h"
#include "modules/common/time/time.h"

#include "modules/common/adapters/adapter_gflags.h"
#include "modules/localization/common/localization_gflags.h"

bool MSFLocalizationComponent::InitConfig() {
  lidar_topic_ = FLAGS_lidar_topic;
  bestgnsspos_topic_ = FLAGS_gnss_best_pose_topic;
  gnss_heading_topic_ = FLAGS_heading_topic;

  if (publisher_->InitConfig() != true) {
    AERROR << "Init publisher config failed.";
    return false;
  }

  if (localization_.Init().ok() != true) {
    AERROR << "Init class MSFLocalization failed.";
    return false;
  }

  return true;
}

六、參數是怎麼來的?

你是不是有好多問號了?雖然用起來了,但是它怎麼來的了?

一切都得從這句指令開始

啓動指令

cyber_launch modules/localization/launch/msf_localization.launch

launch文件

// modules/localization/launch/msf_localization.launch

<cyber>
    <module>
        <name>localization</name>
        <dag_conf>/apollo/modules/localization/dag/dag_streaming_msf_localization.dag</dag_conf>
        <process_name>localization</process_name>
    </module>
</cyber>

dag文件

//modules/localization/dag/dag_streaming_msf_localization.dag

# Define all coms in DAG streaming.
module_config {
    module_library : "/apollo/bazel-bin/modules/localization/msf/libmsf_localization_component.so"

    components {
      class_name : "MSFLocalizationComponent"
      config {
        name : "msf_localization"
        //請注意這條配置
        flag_file_path : "/apollo/modules/localization/conf/localization.conf"
        readers: [
          {
            channel: "/apollo/sensor/gnss/imu"
            qos_profile: {
              depth : 10
            }
            pending_queue_size: 50
          }
        ]
      }
    }
}

conf文件

// modules/localization/conf/localization.conf

# The pointcloud topic name.
# type: string
# default: /apollo/sensor/velodyne64/compensator/PointCloud2
--lidar_topic=/apollo/sensor/pandar64/compensator/PointCloud2

# The lidar extrinsics file
# type: string
# default: /apollo/modules/localization/msf/params/velodyne_params/velodyne128_novatel_extrinsics.yaml
--lidar_extrinsics_file=/apollo/modules/drivers/pandar/params/v4/pandar64_novatel_extrinsics.yaml

# The lidar height file
# type: string
# default: /apollo/modules/localization/msf/params/velodyne_params/velodyne64_height.yaml
--lidar_height_file=/apollo/modules/localization/msf/params/velodyne_params/pandar64_height.yaml

好了,到現在一起一目瞭然了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章