generator.cpp
Go to the documentation of this file.
00001 #include <sstream>
00002 #include <stdexcept>
00003 #include <boost/bind.hpp>
00004 #include <boost/date_time.hpp>
00005 
00006 #include <Eigen/LU>
00007 
00008 #include <LinearMath/btMatrix3x3.h>
00009 #include <LinearMath/btQuaternion.h>
00010 
00011 #include <ros/ros.h>
00012 
00013 #include <walk_interfaces/yaml.hh>
00014 
00015 #include "geometry_msgs/Pose.h"
00016 #include "visualization_msgs/MarkerArray.h"
00017 #include "walk_msgs/Footprint2d.h"
00018 #include "walk_msgs/GetPath.h"
00019 
00020 #include <walk_msgs/conversion.hh>
00021 
00022 #include <walk_msgs/abstract-node.hh>
00023 
00024 using walk::HomogeneousMatrix3d;
00025 using walk::Posture;
00026 
00027 using walk_msgs::convertPoseToHomogeneousMatrix;
00028 using walk_msgs::convertPointToVector3d;
00029 using walk_msgs::convertTrajectoryToPath;
00030 using walk_msgs::convertTrajectoryV3dToPath;
00031 using walk_msgs::convertTrajectoryV2dToPath;
00032 
00033 std::string getParam (const std::string& param,
00034                       const std::string& defaultValue)
00035 {
00036   std::string result;
00037   ros::param::param(param, result, defaultValue);
00038   return result;
00039 }
00040 
00041 class GeneratorYamlNode :
00042   public walk_msgs::AbstractNode<
00043   walk::YamlReader<walk::DiscretizedPatternGenerator2d>,
00044   walk_msgs::Footprint2d,
00045   walk_msgs::GetPath>
00046 {
00047 public:
00048   explicit GeneratorYamlNode ();
00049   ~GeneratorYamlNode ();
00050 
00051   virtual void convertFootprint
00052   (patternGenerator_t::footprints_t& dst,
00053    const std::vector<footprintRosType_t>& src);
00054 
00055   virtual void
00056   setupPatternGenerator (walk_msgs::GetPath::Request& req);
00057 };
00058 
00059 GeneratorYamlNode::GeneratorYamlNode ()
00060   : walk_msgs::AbstractNode<
00061   walk::YamlReader<walk::DiscretizedPatternGenerator2d>,
00062   walk_msgs::Footprint2d,
00063   walk_msgs::GetPath>
00064     ("", getParam ("~world_frame_id", "/world"),
00065      walk::YamlReader<walk::DiscretizedPatternGenerator2d>
00066      (getParam ("~yaml", "")),
00067      false)
00068 {
00069   walk_msgs::GetPath::Response res;
00070   prepareTopicsData (res, patternGenerator().startWithLeftFoot());
00071   writeMotionAsParameter ();
00072   ROS_INFO ("motion parsed succesfully, "
00073             "starting to publish reference trajectories...");
00074 }
00075 
00076 GeneratorYamlNode::~GeneratorYamlNode ()
00077 {}
00078 
00079 void
00080 GeneratorYamlNode::convertFootprint (patternGenerator_t::footprints_t& dst,
00081                                  const std::vector<footprintRosType_t>& src)
00082 {
00083   using boost::posix_time::seconds;
00084   using boost::posix_time::milliseconds;
00085 
00086   dst.clear();
00087   std::vector<walk_msgs::Footprint2d>::const_iterator it = src.begin();
00088   for (; it != src.end(); ++it)
00089     {
00090       patternGenerator_t::footprint_t footprint;
00091       footprint.beginTime = (it->beginTime).toBoost();
00092       footprint.duration =
00093         seconds(it->duration.sec) + milliseconds(it->duration.nsec * 1000);
00094       footprint.position(0) = it->x;
00095       footprint.position(1) = it->y;
00096       footprint.position(2) = it->theta;
00097       dst.push_back(footprint);
00098     }
00099 }
00100 
00101 void
00102 GeneratorYamlNode::setupPatternGenerator (walk_msgs::GetPath::Request& req)
00103 {
00104 }
00105 
00106 
00107 int main(int argc, char **argv)
00108 {
00109   try
00110     {
00111       ros::init(argc, argv, "walk_msgs");
00112 
00113       if (getParam ("~yaml", "").empty ())
00114         {
00115           ROS_FATAL_STREAM
00116             ("Failed to start node, missing YAML motion.\n"
00117              << "Please provide a motion to load:\n"
00118              << "rosrun walk_msgs " << argv[0] << " _yaml:=/path/to/motion.yaml");
00119           return 1;
00120         }
00121 
00122       GeneratorYamlNode node;
00123       if (ros::ok())
00124         node.spin();
00125     }
00126   catch (std::exception& e)
00127     {
00128       std::cerr << "fatal error: " << e.what() << std::endl;
00129       ROS_ERROR_STREAM("fatal error: " << e.what());
00130       return 1;
00131     }
00132   catch (...)
00133     {
00134       ROS_ERROR_STREAM("unexpected error");
00135       return 2;
00136     }
00137   return 0;
00138 }
00139 


walk_msgs
Author(s): Thomas Moulard
autogenerated on Sat Dec 28 2013 17:05:25