in simulation_ws/src/rover/hector_gazebo_plugins/src/gazebo_ros_magnetic.cpp [58:150]
void GazeboRosMagnetic::Load(physics::ModelPtr _model, sdf::ElementPtr _sdf)
{
world = _model->GetWorld();
// load parameters
if (_sdf->HasElement("robotNamespace"))
namespace_ = _sdf->GetElement("robotNamespace")->GetValue()->GetAsString();
else
namespace_.clear();
if (!_sdf->HasElement("topicName"))
topic_ = "magnetic";
else
topic_ = _sdf->GetElement("topicName")->Get<std::string>();
if (_sdf->HasElement("bodyName"))
{
link_name_ = _sdf->GetElement("bodyName")->GetValue()->GetAsString();
link = _model->GetLink(link_name_);
}
else
{
link = _model->GetLink();
link_name_ = link->GetName();
}
if (!link)
{
ROS_FATAL("GazeboRosMagnetic plugin error: bodyName: %s does not exist\n", link_name_.c_str());
return;
}
// default parameters
frame_id_ = link_name_;
magnitude_ = DEFAULT_MAGNITUDE;
reference_heading_ = DEFAULT_REFERENCE_HEADING * M_PI/180.0;
declination_ = DEFAULT_DECLINATION * M_PI/180.0;
inclination_ = DEFAULT_INCLINATION * M_PI/180.0;
if (_sdf->HasElement("frameId"))
frame_id_ = _sdf->GetElement("frameId")->GetValue()->GetAsString();
if (_sdf->HasElement("magnitude"))
_sdf->GetElement("magnitude")->GetValue()->Get(magnitude_);
if (_sdf->HasElement("referenceHeading"))
if (_sdf->GetElement("referenceHeading")->GetValue()->Get(reference_heading_))
reference_heading_ *= M_PI/180.0;
if (_sdf->HasElement("declination"))
if (_sdf->GetElement("declination")->GetValue()->Get(declination_))
declination_ *= M_PI/180.0;
if (_sdf->HasElement("inclination"))
if (_sdf->GetElement("inclination")->GetValue()->Get(inclination_))
inclination_ *= M_PI/180.0;
// Note: Gazebo uses NorthWestUp coordinate system, heading and declination are compass headings
magnetic_field_.header.frame_id = frame_id_;
#if (GAZEBO_MAJOR_VERSION >= 8)
magnetic_field_world_.X() = magnitude_ * cos(inclination_) * cos(reference_heading_ - declination_);
magnetic_field_world_.Y() = magnitude_ * cos(inclination_) * sin(reference_heading_ - declination_);
magnetic_field_world_.Z() = magnitude_ * -sin(inclination_);
#else
magnetic_field_world_.x = magnitude_ * cos(inclination_) * cos(reference_heading_ - declination_);
magnetic_field_world_.y = magnitude_ * cos(inclination_) * sin(reference_heading_ - declination_);
magnetic_field_world_.z = magnitude_ * -sin(inclination_);
#endif
sensor_model_.Load(_sdf);
// start ros node
if (!ros::isInitialized())
{
int argc = 0;
char** argv = NULL;
ros::init(argc,argv,"gazebo",ros::init_options::NoSigintHandler|ros::init_options::AnonymousName);
}
node_handle_ = new ros::NodeHandle(namespace_);
publisher_ = node_handle_->advertise<geometry_msgs::Vector3Stamped>(topic_, 1);
// setup dynamic_reconfigure server
dynamic_reconfigure_server_.reset(new dynamic_reconfigure::Server<SensorModelConfig>(ros::NodeHandle(*node_handle_, topic_)));
dynamic_reconfigure_server_->setCallback(boost::bind(&SensorModel3::dynamicReconfigureCallback, &sensor_model_, _1, _2));
Reset();
// connect Update function
updateTimer.Load(world, _sdf);
updateConnection = updateTimer.Connect(boost::bind(&GazeboRosMagnetic::Update, this));
}