Linux Ubuntu 16.04 安装 yaml-cpp & ROS 下使用.yaml文件实现参数读写
个人笔记_2019.05.19
因为需要,在网上查了一圈相关技术贴,但是很多都不能正常安装成功和运行,要么就是版本问题,要么就是转帖写的不完善…终于搞定了所以来写个帖子Mark一下,分享给需求的朋友。
===============================================================
0. 准备工作
- Linux Ubuntu :uubuntu-16.04.6-desktop-amd64,可在清华大学镜像站下载:ubuntu-16.04.6-desktop-amd64
- ROS:ros-kinetic-desktop-full,安装参考:ros.wiki::kinetic.
- yaml-cpp:yaml-cpp-yaml-cpp-0.6.0 **(注意:0.5.0以前版本不适用本文)**在GitHub下载: yaml-cpp-yaml-cpp-0.6.0.
- 一份好心情
1. 安装yaml-cpp
默认已经正确安装好了Ubuntu 16.04以及ROS Kinetic,开始安装yaml-cpp,首先将下载下来的压缩包文件解压,得到名为yaml-cpp-yaml-cpp-0.6.0的文件目录,然后:
cd yaml-cpp-yaml-cpp-0.6.0/
mkdir build
cd build
cmake ..
make
sudo make install
运行完成后即可完成yaml-cpp的安装;
2. ROS中使用.yaml文件实现参数读写
可以通过ROS参数服务器读取.yaml文件从而进行参数配置,可以参考:rosparam和ROS参数服务
2.1 使用“roslaunch”加载.yaml文件参数
采用roslaunch启动ROS程序,撰写.launch文件,下面是一个例子:
<launch>
<node pkg="xxx" type="xx" name="xx" output="screen">
<rosparam file="$(find xxx)/config/config.yaml" command="load"/>
</node>
</launch>
这里我通过roslaunch启动一个节点,程序包名字为“xxx”,type和name均为节点名字:“xx”,output为输出的类型,具体可以参加ROS Wiki.
用< rosparam …>加载了一个.yaml文件,该文件名为config.yaml,存放在xxx/config/目录下。文件包括参数名和参数值:
ID: 2
IP_ADDR: "192.168.1.1"
注意:.yaml文件中参数值后不能带空格,否则会出错。
这里不禁想提一句,就是写完需要的参数后我一般会多产生一行空行,如上所示,因为在写msg文件的时候好像如果不在结尾多空一行会生成不成功。
然后在终端进入ws目录,运行
roslaunch fly_sim fly_sim.launch
就可以了,.yaml文件中的参数已经被加入到参数服务器中。可以通过检查参数服务器参数来验证。
载入后,可以通过NodeHandle.getParam()来为变量赋上参数服务器中的参数值:
int id_own;
ros::NodeHandle nh_private("~");
nh_private.getParam("ID",id_own);
这样in_own变量就被赋上了参数服务器中“ID”的值,也就是“2”。
也可以通过NodeHandle.setParam()来为参数服务器中的参数赋值:
int id_new = 1;
ros::NodeHandle nh_private("~");
nh_private.setParam("ID", id_new);
这样,参数服务器中的ID值就被赋为了“1”。
2.2 使用yaml-cpp来读写.yaml文件
首先,需要在CMakeLists.txt中添加:
link_directories(/usr/local/lib)
include_directories(/usr/local/include/yaml-cpp)
FIND_LIBRARY(YAML_CPP_LIBRARIES yaml-cpp)
target_link_libraries( xx
${YAML_CPP_LIBRARIES}
)
上面那个target_link_libraries中的xx是你的节点名。
然后在代码中可以这样:
#include <yaml-cpp/yaml.h>
#include <fstream>
YAML::Node config = YAML::LoadFile("/home/dji/uav_ws/src/adhoc/config/config.yaml");
ofstream fout("/home/username/x_ws/src/xxx/config/config.yaml");
config["ID"] = 99;
fout << config;
fout.close();
cout<< "ID is "<< config["ID"].as<int>() <<endl;
可以看到,参数ID就被修改为99了。
更多的扩展大家可以自己尝试或者查找相关资料。
这篇博客记录了在Ubuntu 16.04上安装yaml-cpp库的过程,以及如何在ROS Kinetic中使用.yaml文件进行参数的读写操作。通过roslaunch加载.yaml文件参数,并展示了如何使用yaml-cpp库在代码中直接读写.yaml文件。


被折叠的 条评论
为什么被折叠?



