如何从cmd的rosparam参数获取列表元素?

时间:2018-10-19 16:17:03

标签: ros

我加载了这个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},但没有任何效果。

1 个答案:

答案 0 :(得分:0)

这是一个古老的问题,但我正在回答,因为在此处提出答案仍然有用。

使用给出的示例,boxes是列表(YAML syntax)的列表。通过rosparam命令行工具, 我们不能 进一步处理rosparam get /boxesgrep和正则表达式除外)。通常,我们可以在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命令行语法。