Sarafun Behavior Trees package  1
Behavior trees for the SARAFun project
 All Data Structures Namespaces Functions Variables Enumerations Enumerator
tree_generator.cpp
1 #include <ros/ros.h>
2 #include <ros/package.h>
3 #include <tree_generator/TreeFromKF.hpp>
4 #include <tree_generator/YamlCreator.hpp>
5 #include <sarafun_msgs/BTGeneration.h>
6 
7 tree_generator::TreeFromKF *create_json;
8 std::string tree_name;
9 
10 /*
11  Get a keyframe list and create the respective json file
12 */
13 bool keyframeCallback(sarafun_msgs::BTGeneration::Request &req,
14  sarafun_msgs::BTGeneration::Response &res)
15 {
16  if (req.keyframe_sequence.size() == 0)
17  {
18  ROS_ERROR("Received an empty keyframe sequence!");
19  res.success = false;
20  return true;
21  }
22  try
23  {
24  std::string label;
25  tree_generator::YamlCreator create_yaml;
26 
27  for (int i = 0; i < req.keyframe_sequence.size(); i++)
28  {
29  label = req.keyframe_sequence[i].label;
31  create_yaml.addField(label, "idx", req.keyframe_sequence[i].idx);
32  }
33 
34  json tree = create_json->createTree(req.keyframe_sequence);
35  std::ofstream file;
36  std::string tree_path = ros::package::getPath("tree_generator") + "/data/generated/" + tree_name + ".json";
37 
38  file.open(tree_path);
39  file << tree.dump(2);
40  file.close();
41 
42  std::string params_path = ros::package::getPath("tree_generator") + "/data/generated/" + tree_name + ".yaml";
43  create_yaml.writeFile(params_path);
44 
45  res.success = true;
46  return true;
47  }
48  catch(std::logic_error &e)
49  {
50  ROS_ERROR("Tried to create a tree, but got the logic error: %s", e.what());
51  return false;
52  }
53  catch(...)
54  {
55  ROS_ERROR("Tried to create a tree, but got an unknown error!");
56  return false;
57  }
58 }
59 
60 int main(int argc, char ** argv)
61 {
62  ros::init(argc, argv, "tree_generator");
63  ros::NodeHandle nh;
64  std::string kf_service;
65  std::string node_name = ros::this_node::getName();
66 
67  if (!nh.getParam(node_name + "/keyframe_service_name", kf_service))
68  {
69  ROS_ERROR("Tree generator started without a keyframe service name in the parameter server! Aborting (%s/keyframe_service_name)", node_name.c_str());
70  ros::shutdown();
71  return -1;
72  }
73 
74  if (!nh.getParam(node_name + "/name", tree_name))
75  {
76  ROS_ERROR("Tree generator requires a name for the generated trees! (%s/name)", node_name.c_str());
77  ros::shutdown();
78  return -1;
79  }
80 
81  create_json = new tree_generator::TreeFromKF;
82  ros::ServiceServer tree_generation_service = nh.advertiseService(kf_service, keyframeCallback);
83  ROS_INFO("Started the tree generator node");
84  ros::spin();
85  return 0;
86 }
void replaceWithUnderscore(std::string &label)
Definition: TreeFromKF.cpp:15
json createTree(const std::vector< sarafun_msgs::KeyframeMsg > &keyframes_list)
Definition: TreeFromKF.cpp:119
void writeFile(std::string file_path)
Definition: YamlCreator.cpp:21
void addField(std::string label, std::string field, int value)
Definition: YamlCreator.cpp:8