在c++中使用yaml-cpp动态调参

使用yaml-cpp可以进行动态调参,无需重新编译,节省调试时间。

安装

安装yaml-cpp

1
2
3
4
5
6
git clone https://github.com/jbeder/yaml-cpp.git
cd yaml-cpp && mkdir build && cd build
cmake -DYAML_BUILD_SHARED_LIBS=on ..
sudo make
sudo make install
sudo ldconfig

头文件在/usr/local/include,库文件在/usr/local/lib

使用

  1. CmakeLists.txt

    1
    2
    3
    find_package(yaml-cpp REQUIRED)
    include_directories(${YAML_CPP_INCLUDE_DIR})
    target_link_libraries(your_file_name yaml-cpp)
  2. yaml文件

    1
    2
    3
    4
    5
    6
    7
    8
    kp:
    a: 500
    b: 300
    c: 200
    kd:
    a: 30
    b: 20
    c: 10
  3. 源文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #include <yaml-cpp/yaml.h>

    #define YAML_PATH "xxx.yaml"

    Mat3 _Kp, _Kd;

    void read_yaml()
    {
    YAML::Node config;
    try
    {
    config = YAML::LoadFile(YAML_PATH);
    } catch(YAML::BadFile &e)
    {
    std::cout << "read error, please change YAML_PATH in file State_Towr.cpp" << std::endl;
    return;
    }

    _Kp = Vec3(config["kp"]["a"].as<int>(), config["kp"]["b"].as<int>(), config["kp"]["c"].as<int>()).asDiagonal();
    _Kd = Vec3(config["kd"]["a"].as<int>(), config["kd"]["b"].as<int>(), config["kd"]["c"].as<int>()).asDiagonal();

    std::cout << "Change kp to ["
    << config["kp"]["a"].as<int>() << ", "
    << config["kp"]["b"].as<int>() << ", "
    << config["kp"]["c"].as<int>() << ", "
    << "]" << std::endl;
    std::cout << "Change kd to ["
    << config["kd"]["a"].as<int>() << ", "
    << config["kd"]["b"].as<int>() << ", "
    << config["kd"]["c"].as<int>() << ", "
    << "]" << std::endl;
    }

    void main()
    {
    read_yaml();
    }