remote_interface.h
Go to the documentation of this file.
00001 /*
00002  * This file is part of the rc_dynamics_api package.
00003  *
00004  * Copyright (c) 2017 Roboception GmbH
00005  * All rights reserved
00006  *
00007  * Author: Christian Emmerich
00008  *
00009  * Redistribution and use in source and binary forms, with or without
00010  * modification, are permitted provided that the following conditions are met:
00011  *
00012  * 1. Redistributions of source code must retain the above copyright notice,
00013  * this list of conditions and the following disclaimer.
00014  *
00015  * 2. Redistributions in binary form must reproduce the above copyright notice,
00016  * this list of conditions and the following disclaimer in the documentation
00017  * and/or other materials provided with the distribution.
00018  *
00019  * 3. Neither the name of the copyright holder nor the names of its contributors
00020  * may be used to endorse or promote products derived from this software without
00021  * specific prior written permission.
00022  *
00023  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00024  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00025  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00026  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
00027  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00028  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00029  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00030  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00031  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00032  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00033  * POSSIBILITY OF SUCH DAMAGE.
00034  */
00035 
00036 #ifndef RC_DYNAMICS_API_REMOTEINTERFACE_H
00037 #define RC_DYNAMICS_API_REMOTEINTERFACE_H
00038 
00039 #include <string>
00040 #include <list>
00041 #include <memory>
00042 #include <iostream>
00043 #include <chrono>
00044 
00045 #include "roboception/msgs/frame.pb.h"
00046 #include "roboception/msgs/dynamics.pb.h"
00047 #include "roboception/msgs/imu.pb.h"
00048 #include "roboception/msgs/trajectory.pb.h"
00049 
00050 #include "data_receiver.h"
00051 #include "net_utils.h"
00052 #include "trajectory_time.h"
00053 
00054 namespace rc
00055 {
00056 namespace dynamics
00057 {
00079 class RemoteInterface : public std::enable_shared_from_this<RemoteInterface>
00080 {
00081 public:
00082   using Ptr = std::shared_ptr<RemoteInterface>;
00083 
00086   struct State
00087   {
00088     static const std::string IDLE;                      
00089     static const std::string RUNNING;                   
00090     static const std::string FATAL;                     
00091     static const std::string WAITING_FOR_INS;           
00092     static const std::string WAITING_FOR_INS_AND_SLAM;  
00093     static const std::string WAITING_FOR_SLAM;   
00094 
00095     static const std::string RUNNING_WITH_SLAM;  
00096     static const std::string UNKNOWN;            
00097   };
00098 
00099   struct ReturnCode
00100   {
00101     int value; 
00102     std::string message;
00103   };
00104 
00107   class InvalidState : public std::runtime_error
00108   {
00109   public:
00110     explicit InvalidState(std::string encountered_state)
00111       : runtime_error("Invalid state encountered: " + encountered_state)
00112     {
00113     }
00114   };
00115 
00117   class NotAccepted : public std::runtime_error
00118   {
00119   public:
00120     explicit NotAccepted(std::string service_name) : runtime_error("Service call not accepted: " + service_name)
00121     {
00122     }
00123   };
00124 
00126   class DynamicsNotRunning : public std::runtime_error
00127   {
00128   public:
00129     explicit DynamicsNotRunning(std::string state) : runtime_error("No data received: rc_dynamics is not running but in state: " + state)
00130     {
00131     }
00132   };
00133 
00135   class TooManyStreamDestinations : public std::runtime_error
00136   {
00137   public:
00138     explicit TooManyStreamDestinations(std::string msg) : runtime_error(msg)
00139     {
00140     }
00141   };
00142 
00144   class TooManyRequests : public std::runtime_error
00145   {
00146   public:
00147     explicit TooManyRequests(std::string url) : runtime_error("rc_visard returned http error code 429 (too many requests): " + url)
00148     {
00149     }
00150   };
00151 
00158   static Ptr create(const std::string& rc_visard_ip, unsigned int requests_timeout = 5000);
00159 
00160   virtual ~RemoteInterface();
00161 
00166   bool checkSystemReady();
00167 
00172   std::string getDynamicsState();
00173 
00178   std::string getSlamState();
00179 
00184   std::string getStereoInsState();
00185 
00193   std::string start();
00200   std::string startSlam();
00207   std::string restart();
00208 
00215   std::string restartSlam();
00216 
00222   std::string stop();
00223 
00230   std::string stopSlam();
00231 
00238   std::string resetSlam();
00239 
00245   ReturnCode saveSlamMap(unsigned int timeout_ms = 0);
00246 
00252   ReturnCode loadSlamMap(unsigned int timeout_ms = 0);
00253 
00259   ReturnCode removeSlamMap(unsigned int timeout_ms = 0);
00260 
00265   std::list<std::string> getAvailableStreams();
00266 
00275   std::string getPbMsgTypeOfStream(const std::string& stream);
00276 
00286   std::list<std::string> getDestinationsOfStream(const std::string& stream);
00287 
00295   void addDestinationToStream(const std::string& stream, const std::string& destination);
00296 
00304   void deleteDestinationFromStream(const std::string& stream, const std::string& destination);
00305 
00313   void deleteDestinationsFromStream(const std::string& stream, const std::list<std::string>& destinations);
00314 
00326   roboception::msgs::Trajectory getSlamTrajectory(const TrajectoryTime& start = TrajectoryTime::RelativeToStart(),
00327                                                   const TrajectoryTime& end = TrajectoryTime::RelativeToEnd(),
00328                                                   unsigned int timeout_ms = 0);
00329 
00351   DataReceiver::Ptr createReceiverForStream(const std::string& stream, const std::string& dest_interface = "",
00352                                             unsigned int dest_port = 0);
00353 
00354 protected:
00355   static std::map<std::string, RemoteInterface::Ptr> remote_interfaces_;
00356 
00357   RemoteInterface(const std::string& rc_visard_ip, unsigned int requests_timeout = 5000);
00358 
00359   void cleanUpRequestedStreams();
00360   void checkStreamTypeAvailable(const std::string& stream);
00362   std::string callDynamicsService(std::string service_name);
00363   ReturnCode callSlamService(std::string service_name, unsigned int timeout_ms = 0); 
00364   std::string getState(const std::string& node);
00365 
00366   std::string visard_addrs_;
00367   bool initialized_;     
00368   float visard_version_; 
00369   std::map<std::string, std::list<std::string>> req_streams_;
00370   std::list<std::string> avail_streams_;
00371   std::map<std::string, std::string> protobuf_map_;
00372   std::string base_url_;
00373   int timeout_curl_;
00374 };
00375 }
00376 }
00377 
00378 #endif  // RC_DYNAMICS_API_REMOTEINTERFACE_H


rc_dynamics_api
Author(s): Heiko Hirschmueller , Christian Emmerich , Felix Endres
autogenerated on Thu May 9 2019 02:13:50