ServerFixture.hh
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2012-2016 Open Source Robotics Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16 */
17 #ifndef _GAZEBO_SERVER_FIXTURE_HH_
18 #define _GAZEBO_SERVER_FIXTURE_HH_
19 
20 #pragma GCC diagnostic ignored "-Wswitch-default"
21 #pragma GCC diagnostic ignored "-Wfloat-equal"
22 #pragma GCC diagnostic ignored "-Wshadow"
23 
24 // The following is needed to enable the GetMemInfo function for OSX
25 #ifdef __MACH__
26 # include <mach/mach.h>
27 #endif // __MACH__
28 
29 #include <sdf/sdf.hh>
30 
31 #include <gtest/gtest.h>
32 #include <boost/thread.hpp>
33 #include <boost/filesystem.hpp>
34 
35 #include <map>
36 #include <string>
37 #include <vector>
38 
39 #include <ignition/math/Pose3.hh>
40 
41 #include "gazebo/transport/transport.hh"
42 
45 #include "gazebo/common/Console.hh"
46 #include "gazebo/physics/World.hh"
49 #include "gazebo/sensors/sensors.hh"
50 #include "gazebo/rendering/rendering.hh"
51 #include "gazebo/msgs/msgs.hh"
52 
55 
56 #include "gazebo/gazebo_config.h"
57 #include "gazebo/Server.hh"
58 #include "gazebo/util/system.hh"
59 
60 #include "test_config.h"
61 
62 namespace gazebo
63 {
64  std::string custom_exec(std::string _cmd);
65 
66  class GAZEBO_VISIBLE ServerFixture : public testing::Test
67  {
69  protected: ServerFixture();
70 
72  protected: virtual ~ServerFixture();
73 
75  protected: virtual void TearDown();
76 
78  protected: virtual void Unload();
79 
82  protected: virtual void Load(const std::string &_worldFilename);
83 
88  protected: virtual void Load(const std::string &_worldFilename,
89  bool _paused);
90 
98  protected: virtual void Load(const std::string &_worldFilename,
99  bool _paused, const std::string &_physics,
100  const std::vector<std::string> &_systemPlugins = {});
101 
106  protected: virtual void LoadArgs(const std::string &_args);
107 
112  protected: void RunServer(const std::vector<std::string> &_args);
113 
116  protected: rendering::ScenePtr GetScene(
117  const std::string &_sceneName = "default");
118 
121  protected: void OnStats(ConstWorldStatisticsPtr &_msg);
122 
124  protected: void SetPause(bool _pause);
125 
128  protected: double GetPercentRealTime() const;
129 
133  protected: void OnPose(ConstPosesStampedPtr &_msg);
134 
138  protected: math::Pose GetEntityPose(const std::string &_name);
139 
143  protected: bool HasEntity(const std::string &_name);
144 
151  protected: void PrintImage(const std::string &_name, unsigned char **_image,
152  unsigned int _width, unsigned int _height,
153  unsigned int _depth);
154 
159  protected: void PrintScan(const std::string &_name, double *_scan,
160  unsigned int _sampleCount);
161 
170  protected: void FloatCompare(float *_scanA, float *_scanB,
171  unsigned int _sampleCount, float &_diffMax,
172  float &_diffSum, float &_diffAvg);
173 
182  protected: void DoubleCompare(double *_scanA, double *_scanB,
183  unsigned int _sampleCount, double &_diffMax,
184  double &_diffSum, double &_diffAvg);
185 
195  protected: void ImageCompare(unsigned char *_imageA,
196  unsigned char *_imageB,
197  unsigned int _width, unsigned int _height,
198  unsigned int _depth,
199  unsigned int &_diffMax, unsigned int &_diffSum,
200  double &_diffAvg);
201 
208  private: void OnNewFrame(const unsigned char *_image,
209  unsigned int _width, unsigned int _height,
210  unsigned int _depth,
211  const std::string &/*_format*/);
212 
218  protected: void GetFrame(const std::string &_cameraName,
219  unsigned char **_imgData, unsigned int &_width,
220  unsigned int &_height);
221 
225  protected: physics::ModelPtr SpawnModel(const msgs::Model &_msg);
226 
231  protected: template<typename T>
232  static void CheckPointer(boost::shared_ptr<T> _ptr)
233  {
234  ASSERT_TRUE(_ptr != NULL);
235  }
236 
255  protected: void SpawnCamera(const std::string &_modelName,
256  const std::string &_cameraName,
257  const math::Vector3 &_pos, const math::Vector3 &_rpy,
258  unsigned int _width = 320, unsigned int _height = 240,
259  double _rate = 25,
260  const std::string &_noiseType = "",
261  double _noiseMean = 0.0, double _noiseStdDev = 0.0,
262  bool _distortion = false, double _distortionK1 = 0.0,
263  double _distortionK2 = 0.0, double _distortionK3 = 0.0,
264  double _distortionP1 = 0.0, double _distortionP2 = 0.0,
265  double _cx = 0.5, double _cy = 0.5);
266 
282  protected: void SpawnRaySensor(const std::string &_modelName,
283  const std::string &_raySensorName,
284  const math::Vector3 &_pos, const math::Vector3 &_rpy,
285  double _hMinAngle = -2.0, double _hMaxAngle = 2.0,
286  double _vMinAngle = -1.0, double _vMaxAngle = 1.0,
287  double _minRange = 0.08, double _maxRange = 10,
288  double _rangeResolution = 0.01, unsigned int _samples = 640,
289  unsigned int _vSamples = 1, double _hResolution = 1.0,
290  double _vResolution = 1.0,
291  const std::string &_noiseType = "", double _noiseMean = 0.0,
292  double _noiseStdDev = 0.0);
293 
301  protected: sensors::SonarSensorPtr SpawnSonar(const std::string &_modelName,
302  const std::string &_sonarName,
303  const ignition::math::Pose3d &_pose,
304  const double _minRange,
305  const double _maxRange,
306  const double _radius);
307 
323  protected: void SpawnGpuRaySensor(const std::string &_modelName,
324  const std::string &_raySensorName,
325  const math::Vector3 &_pos, const math::Vector3 &_rpy,
326  double _hMinAngle = -2.0, double _hMaxAngle = 2.0,
327  double _minRange = 0.08, double _maxRange = 10,
328  double _rangeResolution = 0.01, unsigned int _samples = 640,
329  const std::string &_noiseType = "", double _noiseMean = 0.0,
330  double _noiseStdDev = 0.0);
331 
345  protected: void SpawnImuSensor(const std::string &_modelName,
346  const std::string &_imuSensorName,
347  const math::Vector3 &_pos, const math::Vector3 &_rpy,
348  const std::string &_noiseType = "",
349  double _rateNoiseMean = 0.0, double _rateNoiseStdDev = 0.0,
350  double _rateBiasMean = 0.0, double _rateBiasStdDev = 0.0,
351  double _accelNoiseMean = 0.0, double _accelNoiseStdDev = 0.0,
352  double _accelBiasMean = 0.0, double _accelBiasStdDev = 0.0);
353 
361  protected: void SpawnUnitContactSensor(const std::string &_name,
362  const std::string &_sensorName,
363  const std::string &_collisionType, const math::Vector3 &_pos,
364  const math::Vector3 &_rpy, bool _static = false);
365 
374  protected: void SpawnUnitImuSensor(const std::string &_name,
375  const std::string &_sensorName,
376  const std::string &_collisionType,
377  const std::string &_topic, const math::Vector3 &_pos,
378  const math::Vector3 &_rpy, bool _static = false);
379 
388  protected: void SpawnUnitAltimeterSensor(const std::string &_name,
389  const std::string &_sensorName,
390  const std::string &_collisionType,
391  const std::string &_topic,
392  const ignition::math::Vector3d &_pos,
393  const ignition::math::Vector3d &_rpy,
394  bool _static = false);
395 
404  protected: void SpawnUnitMagnetometerSensor(const std::string &_name,
405  const std::string &_sensorName,
406  const std::string &_collisionType,
407  const std::string &_topic,
408  const ignition::math::Vector3d &_pos,
409  const ignition::math::Vector3d &_rpy,
410  bool _static = false);
411 
416  private: void launchTimeoutFailure(const char *_logMsg,
417  const int _timeoutCS);
418 
429  protected: void SpawnWirelessTransmitterSensor(const std::string &_name,
430  const std::string &_sensorName,
431  const math::Vector3 &_pos,
432  const math::Vector3 &_rpy,
433  const std::string &_essid,
434  double _freq,
435  double _power,
436  double _gain,
437  bool _visualize = true);
438 
450  protected: void SpawnWirelessReceiverSensor(const std::string &_name,
451  const std::string &_sensorName,
452  const math::Vector3 &_pos,
453  const math::Vector3 &_rpy,
454  double _minFreq,
455  double _maxFreq,
456  double _power,
457  double _gain,
458  double _sensitivity,
459  bool _visualize = true);
460 
465  protected: void WaitUntilEntitySpawn(const std::string &_name,
466  unsigned int _sleepEach,
467  int _retries);
468 
473  protected: void WaitUntilSensorSpawn(const std::string &_name,
474  unsigned int _sleepEach,
475  int _retries);
476 
482  protected: void WaitUntilIteration(const uint32_t _goalIteration,
483  const int _sleepEach,
484  const int _retries) const;
485 
491  protected: void WaitUntilSimTime(const common::Time &_goalTime,
492  const int _ms,
493  const int _maxRetries) const;
494 
511  protected: void SpawnLight(const std::string &_name,
512  const std::string &_type,
513  const math::Vector3 &_pos, const math::Vector3 &_rpy,
514  const common::Color &_diffuse = common::Color::White,
515  const common::Color &_specular = common::Color::White,
516  const math::Vector3 &_direction = -math::Vector3::UnitZ,
517  double _attenuationRange = 20,
518  double _attenuationConstant = 0.5,
519  double _attenuationLinear = 0.01,
520  double _attenuationQuadratic = 0.001,
521  double _spotInnerAngle = 0,
522  double _spotOuterAngle = 0,
523  double _spotFallOff = 0,
524  bool _castShadows = true);
525 
531  protected: void SpawnCylinder(const std::string &_name,
532  const math::Vector3 &_pos, const math::Vector3 &_rpy,
533  bool _static = false);
534 
542  protected: void SpawnSphere(const std::string &_name,
543  const math::Vector3 &_pos, const math::Vector3 &_rpy,
544  bool _wait = true, bool _static = false);
545 
555  protected: void SpawnSphere(const std::string &_name,
556  const math::Vector3 &_pos, const math::Vector3 &_rpy,
557  const math::Vector3 &_cog, double _radius,
558  bool _wait = true, bool _static = false);
559 
566  protected: void SpawnBox(const std::string &_name,
567  const math::Vector3 &_size, const math::Vector3 &_pos,
568  const math::Vector3 &_rpy, bool _static = false);
569 
577  protected: void SpawnTrimesh(const std::string &_name,
578  const std::string &_modelPath, const math::Vector3 &_scale,
579  const math::Vector3 &_pos, const math::Vector3 &_rpy,
580  bool _static = false);
581 
587  protected: void SpawnEmptyLink(const std::string &_name,
588  const math::Vector3 &_pos, const math::Vector3 &_rpy,
589  bool _static = false);
590 
593  protected: void SpawnModel(const std::string &_filename);
594 
597  protected: void SpawnSDF(const std::string &_sdf);
598 
602  protected: void LoadPlugin(const std::string &_filename,
603  const std::string &_name);
604 
608  protected: physics::ModelPtr GetModel(const std::string &_name);
609 
612  protected: void RemoveModel(const std::string &_name);
613 
616  protected: void RemovePlugin(const std::string &_name);
617 
621  protected: void GetMemInfo(double &_resident, double &_share);
622 
626  protected: std::string GetUniqueString(const std::string &_prefix);
627 
631  protected: void Record(const std::string &_name, const double _data);
632 
636  protected: void Record(const std::string &_prefix,
637  const math::SignalStats &_stats);
638 
642  protected: void Record(const std::string &_prefix,
643  const math::Vector3Stats &_stats);
644 
646  protected: Server *server;
647 
649  protected: boost::thread *serverThread;
650 
653 
656 
659 
662 
665 
667  protected: std::map<std::string, math::Pose> poses;
668 
670  protected: boost::mutex receiveMutex;
671 
673  private: unsigned char **imgData;
674 
676  private: int gotImage;
677 
679  protected: common::Time simTime, realTime, pauseTime;
680 
682  private: double percentRealTime;
683 
685  private: bool paused;
686 
688  private: bool serverRunning;
689 
691  private: int uniqueCounter;
692  };
693 
695  {
696  // Documentation inherited.
697  public: virtual void SetUp();
698  };
699 } // namespace gazebo
700 #endif // define _GAZEBO_SERVER_FIXTURE_HH_
boost::shared_ptr< Model > ModelPtr
Definition: PhysicsTypes.hh:88
static const Vector3 UnitZ
math::Vector3(0, 0, 1)
Definition: Vector3.hh:54
static const Color White
(1, 1, 1)
Definition: Color.hh:39
Encapsulates a position and rotation in three space.
Definition: Pose.hh:37
The Vector3 class represents the generic vector containing 3 elements.
Definition: Vector3.hh:39
Definition: ServerFixture.hh:66
boost::thread * serverThread
Pointer the thread the runs the server.
Definition: ServerFixture.hh:649
boost::shared_ptr< Subscriber > SubscriberPtr
Definition: TransportTypes.hh:53
boost::mutex receiveMutex
Mutex to protect data structures that store messages.
Definition: ServerFixture.hh:670
std::string custom_exec(std::string _cmd)
Server * server
Pointer the Gazebo server.
Definition: ServerFixture.hh:646
Collection of statistics for a scalar signal.
Definition: SignalStats.hh:124
Collection of statistics for a Vector3 signal.
Definition: Vector3Stats.hh:37
default namespace for gazebo
Definition: ServerFixture.hh:694
transport::NodePtr node
Pointer to a node for communication.
Definition: ServerFixture.hh:652
static void CheckPointer(boost::shared_ptr< T > _ptr)
Check that a pointer is not NULL.
Definition: ServerFixture.hh:232
transport::PublisherPtr factoryPub
Factory publisher.
Definition: ServerFixture.hh:661
#define NULL
Definition: CommonTypes.hh:31
boost::shared_ptr< Node > NodePtr
Definition: TransportTypes.hh:57
Defines a color.
Definition: Color.hh:36
boost::shared_ptr< Scene > ScenePtr
Definition: RenderTypes.hh:80
Definition: Server.hh:41
common::Time simTime
Current simulation time, real time, and pause time.
Definition: ServerFixture.hh:679
boost::shared_ptr< Publisher > PublisherPtr
Definition: TransportTypes.hh:49
std::map< std::string, math::Pose > poses
Map of received poses.
Definition: ServerFixture.hh:667
transport::PublisherPtr requestPub
Request publisher.
Definition: ServerFixture.hh:664
transport::SubscriberPtr poseSub
Pose subscription.
Definition: ServerFixture.hh:655
#define GAZEBO_VISIBLE
Use to represent "symbol visible" if supported.
Definition: system.hh:59
transport::SubscriberPtr statsSub
World statistics subscription.
Definition: ServerFixture.hh:658
std::shared_ptr< SonarSensor > SonarSensorPtr
Definition: SensorTypes.hh:107
A Time class, can be used to hold wall- or sim-time.
Definition: Time.hh:44