Как получить элемент списка из параметра rosparam из cmd? - PullRequest
0 голосов
/ 19 октября 2018

Я загрузил этот файл 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}

Но как я могу получить доступ только к первому спискуили элементы во втором списке?Я пробовал ящики [0], ящики (0) и ящики {0}, но ничего не получалось.

1 Ответ

0 голосов
/ 06 августа 2019

Это старый вопрос, но я отвечаю на него, потому что здесь все еще полезно разместить ответ.

Используя приведенный пример, boxes представляет собой список списков ( синтаксис YAML ).Из инструмента командной строки 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;
}

При стандартном использовании тег XML XML <rosparam> сохраняет тот же синтаксис командной строки YAML или rosparam.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...