在ROS中处理yaml文件

2023-05-16

ROS中的参数服务器(Parameter Server)的相关操作可参见roscpp_tutorials/Tutorials/Parameters。

如果想要载入参数,可以通过编写yaml文件,然后在launch文件中加入


<rosparam file="$(find readyaml)/rosYaml.yaml" command="load"/>  

可以写个模板类来加载参数:

template<typename T>
T getParam(const string& name,const T& defaultValue)  //This name must be namespace+parameter_name
{
    T v;
    if(ros::param::get(name,v))  //get parameter by name depend on ROS.
    {
        ROS_INFO_STREAM("Found parameter: "<<name<<",\tvalue: "<<v);
        return v;
    }
    else 
        ROS_WARN_STREAM("Cannot find value for parameter: "<<name<<",\tassigning default: "<<defaultValue);
    return defaultValue;  //if the parameter haven't been set,it's value will return defaultValue.
}

 

在ROS系统中,参数读写一般通过xml或者yaml格式的文件,其中yaml用得比较多。这是一种可读性高,轻量级的标记语言,简单好用。
对于yaml文件,ros中用的较早版本的yaml-cpp库,最新的可在github上下载,并按照readme中所述的方法编译安装。

特别留意的是,如果需要生成共享库,cmake的时候后面一定要加上 -DBUILD_SHARED_LIBS=ON 这句话。

 

有了yaml库,在CMakeLists.txt中加入,

link_directories(/usr/local/lib)
include_directories(/usr/local/include/yaml-cpp)

最后别忘了在链接库target_link_libraries时,加上yaml-cpp。
关于库的使用,github上有一些简单的tutorial教程。
 

以下是简单的yaml文件读写操作示例。

#include <ros/ros.h>
#include <yaml-cpp/yaml.h>
#include <iostream>
#include <fstream>

int main(int argc, char **argv)
{
    std::string fin = "/home/user/param/param.yaml";       //yaml文件所在的路径
    YAML::Node yamlConfig = YAML::LoadFile(fin);
    int int_param = yamlConfig["int_param"].as<int>();
    std::cout << "  node size: " << yamlConfig.size() << std::endl;
    std::cout << yamlConfig["bool_param"].as<bool>() << "\n";
    yamlConfig["bool_param"] = !yamlConfig["bool_param"].as<bool>();
    yamlConfig["str_param"] = "test";
    std::ofstream file;
    file.open(fin);
    file.flush();
    file << yamlConfig;
    file.close();

    return 0;
}

其中,yaml文件里的内容为:

bool_param: true
int_param: 2
double_param: 0.5
str_param: "123"

也可采用Emit来生成yaml文件,代码如下:

#include <ros/ros.h>
#include <yaml-cpp/yaml.h>
#include <iostream>
#include <fstream>

int main(int argc, char **argv)
{
    std::ofstream fout("/home/user/param/param.yaml");
    YAML::Emitter out(fout);
    out << YAML::BeginMap;
    out << YAML::Key << "int_param";
    out << YAML::Value << 1;
    out << YAML::Key << "double_param";
    out << YAML::Value << 0.5;
    out << YAML::Key << "bool_param";
    out << YAML::Value << false;
    out << YAML::Comment("bool parameter");
    out << YAML::Key << "str_param";
    out << YAML::Value << "test";
    out << YAML::EndMap;
    
    return 0;
}

 

yml文件的其他操作可参见博文《.yaml参数文件的编写和使用》,

其综合运用的案例可参见博文:ros-opencv-qt-yaml综合运用之滤波

 

Enjoy!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在ROS中处理yaml文件 的相关文章

随机推荐