在windows下做桌面应用开发,常用.ini文件
在做ros开发中遇到了同样的问题,一些参数需要根据需求修改,但是修改频率又不是很高,这时候可以配置一个yaml文件读取参数
如果不是ros的话需要在电脑上配置好yaml的库,ros里已经包含了yaml的库,直接跳到下面添加yaml文件
目录
下载yaml-cpp并编译
GitHub上下载yaml-cpp的源码GitHub - jbeder/yaml-cpp: A YAML parser and emitter in C++
git clone https://github.com/jbeder/yaml-cpp.git
然后进入目录创建build文件编译安装
mkdir build
cd build
cmake ..
make -j4
sudo make install
这时候在ros工程包中就可以包含yaml-cpp了
有了yaml库,在CMakeLists.txt中加入,
link_directories(/usr/local/lib)
include_directories(/usr/local/include/yaml-cpp)
然后在代码中添加头文件
#include <yaml-cpp/yaml.h>
这时候发现可以跳转到yaml了
ros中添加yaml文件读取配置参数
在路径下新建一个.yaml文件
例如:
config.yaml
#摄像头参数
cam:
FRAME_WIDTH : 1920
FRAME_HIGH : 1080
#16mm 1920*1080参数
fc_x : 5586
fc_y : 5586
cc_x : 960
cc_y : 540
新建launch文件,将参数文件配置到launch中
<?xml version="1.0"?>
<launch>
<node pkg="test_yaml" name="test_yaml_node" type="test_yaml" output="screen"/>
<rosparam file="$(find test_yaml)/launch/config.yaml"/>
</launch>
接着在代码中添加:
#include <ros/ros.h>
using namespace std;
//读取参数模板
template<typename T>
T getParam(const std::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.
}
int main(int argc, char **argv)
{
ros::init(argc,argv,"test_tf_node");
ros::NodeHandle nh;
int FRAME_WIDTH=0;
double fc_x = 0.0f;
getParam<int>("cam/FRAME_WIDTH",0);
getParam<double>("cam/fc_x",0.0f);
return 1;
}
在编译运行就能获取到yaml中的参数了