Linux Ubuntu 16.04 安装 yaml-cpp & ROS 下参数服务器及yaml-cpp实现参数读写

这篇博客记录了在Ubuntu 16.04上安装yaml-cpp库的过程,以及如何在ROS Kinetic中使用.yaml文件进行参数的读写操作。通过roslaunch加载.yaml文件参数,并展示了如何使用yaml-cpp库在代码中直接读写.yaml文件。

个人笔记_2019.05.19

因为需要,在网上查了一圈相关技术贴,但是很多都不能正常安装成功和运行,要么就是版本问题,要么就是转帖写的不完善…终于搞定了所以来写个帖子Mark一下,分享给需求的朋友。

===============================================================

0. 准备工作

  1. Linux Ubuntu :uubuntu-16.04.6-desktop-amd64,可在清华大学镜像站下载:ubuntu-16.04.6-desktop-amd64
  2. ROS:ros-kinetic-desktop-full,安装参考:ros.wiki::kinetic.
  3. yaml-cpp:yaml-cpp-yaml-cpp-0.6.0 **(注意:0.5.0以前版本不适用本文)**在GitHub下载: yaml-cpp-yaml-cpp-0.6.0.
  4. 一份好心情

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了。

更多的扩展大家可以自己尝试或者查找相关资料。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值