camera_contains_plugin.cpp
Go to the documentation of this file.
1 
18 #include <algorithm>
19 
20 #include <yaml-cpp/yaml.h>
21 
24 
25 namespace gazebo {
26 
28  : logger_prefix_(getClassName<CameraContainsPlugin>()),
29  spinner_(1, &callback_queue_) {}
30 
31 void CameraContainsPlugin::Load(physics::WorldPtr _world,
32  sdf::ElementPtr _sdf) {
33  logger_prefix_ += _sdf->Get<std::string>("name") + ": ";
34  world_ = _world;
35 
36  // Get the list of track models
37  if (not _sdf->HasElement("trackedModels"))
38  gzthrow(logger_prefix_ + "Failed to get trackedModels");
39  YAML::Node node = YAML::Load(_sdf->Get<std::string>("trackedModels"));
40  for (const auto &model : node)
41  tracked_models_.push_back(model.as<std::string>());
42 
43  // Get the list of cameras
44  if (not _sdf->HasElement("cameras"))
45  gzthrow(logger_prefix_ + "Failed to get cameras");
46  node = YAML::Load(_sdf->Get<std::string>("cameras"));
47  for (const auto &camera : node) cameras_.push_back(camera.as<std::string>());
48 
49  // Get container pose
50  if (not _sdf->HasElement("pose"))
51  gzthrow(logger_prefix_ + "Failed to get pose");
52  auto pose = _sdf->Get<ignition::math::Pose3d>("pose");
53 
54  // Get container size
55  if (not _sdf->HasElement("size"))
56  gzthrow(logger_prefix_ + "Failed to get size");
57  auto size = _sdf->Get<ignition::math::Vector3d>("size");
58 
59  // Initialize container
60  container_ = ignition::math::OrientedBoxd(size, pose);
61 
62  if (not ros::isInitialized()) {
64  "A ROS node for Gazebo has not been initialized, unable to load "
65  "plugin. Load the Gazebo system plugin 'libgazebo_ros_api_plugin.so' "
66  "in the gazebo_ros package");
67  return;
68  }
69 
70  nh_ = boost::make_shared<ros::NodeHandle>();
71  nh_->setCallbackQueue(&callback_queue_);
72  spinner_.start();
73 
74  // Initialize publisher
75  if (not _sdf->HasElement("topic"))
76  gzthrow(logger_prefix_ + "Failed to get topic");
77  publisher_ = nh_->advertise<gazebo_video_monitor_msgs::Strings>(
78  _sdf->Get<std::string>("topic"), 10);
79  msg_.names = cameras_;
80 
81  // Initialize container visualizer
82  bool visualize = false;
83  if (_sdf->HasElement("visualize")) visualize = _sdf->Get<bool>("visualize");
84  if (visualize) {
86  std::make_shared<BoxMarkerVisualizer>(_sdf->Get<std::string>("name"));
87  container_visualizer_->spawnMarker(4, size, pose);
88  }
89 
90  // Get update rate
91  if (not _sdf->HasElement("updateRate"))
92  gzthrow(logger_prefix_ + "Failed to get updateRate");
93  double update_rate = _sdf->Get<double>("updateRate");
94  update_period_ = update_rate > 0 ? 1 / update_rate : 0;
95 
96  update_connection_ = event::Events::ConnectWorldUpdateBegin(
97  std::bind(&CameraContainsPlugin::onUpdate, this, std::placeholders::_1));
98 }
99 
100 bool CameraContainsPlugin::contains(const std::string &name) const {
101  auto model = world_->ModelByName(name);
102  if (not model) return false;
103  auto position = model->WorldPose().Pos();
104  return container_.Contains(position);
105 }
106 
107 void CameraContainsPlugin::onUpdate(const common::UpdateInfo &info) {
108  if (info.simTime - last_update_time_ < update_period_) return;
109  last_update_time_ = info.simTime;
110 
111  bool contains_model = std::any_of(
112  tracked_models_.begin(), tracked_models_.end(),
113  [&](const auto &name) -> bool { return this->contains(name); });
114 
115  if (contains_model) {
116  if (not contains_model_) {
118  contains_model_ = true;
119  }
120  } else {
121  contains_model_ = false;
122  }
123 }
124 
125 GZ_REGISTER_WORLD_PLUGIN(CameraContainsPlugin)
126 
127 } // namespace gazebo
gazebo
gazebo::CameraContainsPlugin::spinner_
ros::AsyncSpinner spinner_
Definition: camera_contains_plugin.h:67
ros::AsyncSpinner::start
void start()
ROS_FATAL_STREAM
#define ROS_FATAL_STREAM(args)
gazebo::CameraContainsPlugin::container_visualizer_
BoxMarkerVisualizerPtr container_visualizer_
Definition: camera_contains_plugin.h:73
gazebo::CameraContainsPlugin::publisher_
ros::Publisher publisher_
Definition: camera_contains_plugin.h:69
gazebo::CameraContainsPlugin::tracked_models_
std::vector< std::string > tracked_models_
Definition: camera_contains_plugin.h:61
camera_contains_plugin.h
ros::Publisher::publish
void publish(const boost::shared_ptr< M > &message) const
gazebo::CameraContainsPlugin::cameras_
std::vector< std::string > cameras_
Definition: camera_contains_plugin.h:62
utils.h
gazebo::CameraContainsPlugin::msg_
gazebo_video_monitor_msgs::Strings msg_
Definition: camera_contains_plugin.h:70
gazebo::CameraContainsPlugin::contains_model_
bool contains_model_
Definition: camera_contains_plugin.h:71
gazebo::CameraContainsPlugin::onUpdate
void onUpdate(const common::UpdateInfo &info)
Definition: camera_contains_plugin.cpp:107
ros::isInitialized
ROSCPP_DECL bool isInitialized()
gazebo::CameraContainsPlugin::container_
ignition::math::OrientedBoxd container_
Definition: camera_contains_plugin.h:63
gazebo::CameraContainsPlugin::callback_queue_
ros::CallbackQueue callback_queue_
Definition: camera_contains_plugin.h:66
gazebo::CameraContainsPlugin::contains
bool contains(const std::string &name) const
Definition: camera_contains_plugin.cpp:100
gazebo::CameraContainsPlugin::world_
physics::WorldPtr world_
Definition: camera_contains_plugin.h:59
gazebo::CameraContainsPlugin
Publishes a camera select message when a model enters a certain space.
Definition: camera_contains_plugin.h:48
gazebo::CameraContainsPlugin::update_period_
double update_period_
Definition: camera_contains_plugin.h:75
gazebo::CameraContainsPlugin::CameraContainsPlugin
CameraContainsPlugin()
Definition: camera_contains_plugin.cpp:27
getClassName
static std::string getClassName()
Definition: utils.h:38
gazebo::CameraContainsPlugin::last_update_time_
common::Time last_update_time_
Definition: camera_contains_plugin.h:76
gazebo::CameraContainsPlugin::nh_
ros::NodeHandlePtr nh_
Definition: camera_contains_plugin.h:65
gazebo::CameraContainsPlugin::Load
void Load(physics::WorldPtr _world, sdf::ElementPtr _sdf) override
Definition: camera_contains_plugin.cpp:31
gazebo::CameraContainsPlugin::update_connection_
event::ConnectionPtr update_connection_
Definition: camera_contains_plugin.h:77
gazebo::CameraContainsPlugin::logger_prefix_
std::string logger_prefix_
Definition: camera_contains_plugin.h:57


gazebo_video_monitor_plugins
Author(s): Nick Lamprianidis
autogenerated on Tue Oct 24 2023 02:12:50