我加载了这个Yaml文件:
num_boxes: 1
boxes: [[x: 0.349, y: 0.213, z: 0.117]]
使用rosparam load my_config.yaml
,然后我可以做rosparam get boxes
并得到:
- - {x: 0.349}
- {y: 0.213}
- {z: 0.117}
但是如何仅访问第一个列表或第二个列表中的元素?我尝试了box [0],box(0)和box {0},但没有任何效果。
答案 0 :(得分:0)
这是一个古老的问题,但我正在回答,因为在此处提出答案仍然有用。
使用给出的示例,boxes
是列表(YAML syntax)的列表。通过rosparam
命令行工具, 我们不能 进一步处理rosparam get /boxes
(grep
和正则表达式除外)。通常,我们可以在C++ / Python中访问参数服务器。
# Python
>>> import rospy
>>> boxes = rospy.get_param("/boxes"); boxes
[[{'x': 0.349}, {'y': 0.213}, {'z': 0.117}]]
# Boxes is a python list/array of list of dicts
>>> boxes[0]
[{'x': 0.349}, {'y': 0.213}, {'z': 0.117}]
>>> boxes[0][0]
{'x': 0.349}
// C++
#include <vector>
#include <ros/ros.h>
// yaml_list: [1, 2]
ros::NodeHandle *nh;
std::vector<int> yaml_list;
double x = 0.0;
int main(int argc, char** argv){
ros::init(argc, argv, "get_params_node");
nh = new ros::NodeHandle("");
nh->getParam("/yaml_list", yaml_list);
x = yaml_list[0];
// ...
return 0;
}
要拥有更深的数据结构,例如地图矢量的矢量,必须使用xmlrpcpp(.h / .cpp)接口。
// C++
#include <vector>
#include <map>
#include <string>
#include <ros/ros.h>
#include <xmlrpcpp/XmlRpcValue.h> // catkin component
ros::NodeHandle *nh;
XmlRpc::XmlRpcValue boxes; // std::vector<std::vector<std::map<std::string,double>>>
double x = 0.0;
int i = 0;
double point[3] = {0};
int main(int argc, char** argv){
ros::init(argc, argv, "get_params_node");
nh = new ros::NodeHandle("");
nh->getParam("/boxes", boxes);
if(boxes.getType() == XmlRpc::XmlRpcValue::Type::TypeArray && boxes.size() > 0){
// boxes[0] is a 'TypeArray' aka vector
if(boxes[0].getType() == XmlRpc::XmlRpcValue::Type::TypeArray && boxes[0].size() > 0){
// boxes[0][0] is a 'TypeStruct' aka map
if(boxes[0][0].getType() == XmlRpc::XmlRpcValue::Type::TypeStruct && boxes[0][0].hasMember("x")){
x = double(boxes[0][0]["x"]);
for(XmlRpc::XmlRpcValue::iterator it = boxes[0][0].begin(); it != boxes[0][0].end(); ++it){
point[i++] = double(*it);
}
}
}
}
// ...
return 0;
}
在标准用法中,<rosparam>
XML标记保持相同的YAML或rosparam
命令行语法。