in simulation_ws/src/rover/hector_gazebo_plugins/src/gazebo_ros_imu.cpp [69:225]
void GazeboRosIMU::Load(physics::ModelPtr _model, sdf::ElementPtr _sdf)
{
// Get the world name.
world = _model->GetWorld();
// load parameters
if (_sdf->HasElement("robotNamespace"))
namespace_ = _sdf->GetElement("robotNamespace")->GetValue()->GetAsString();
else
namespace_.clear();
if (_sdf->HasElement("bodyName"))
{
link_name_ = _sdf->GetElement("bodyName")->GetValue()->GetAsString();
link = _model->GetLink(link_name_);
}
else
{
link = _model->GetLink();
link_name_ = link->GetName();
}
// assert that the body by link_name_ exists
if (!link)
{
ROS_FATAL("GazeboRosIMU plugin error: bodyName: %s does not exist\n", link_name_.c_str());
return;
}
// default parameters
frame_id_ = link_name_;
topic_ = "imu";
if (_sdf->HasElement("frameId"))
frame_id_ = _sdf->GetElement("frameId")->GetValue()->GetAsString();
if (_sdf->HasElement("topicName"))
topic_ = _sdf->GetElement("topicName")->GetValue()->GetAsString();
if (_sdf->HasElement("biasTopicName"))
bias_topic_ = _sdf->GetElement("biasTopicName")->GetValue()->GetAsString();
else
bias_topic_ = (!topic_.empty() ? topic_ + "/bias" : "");
if (_sdf->HasElement("serviceName"))
serviceName = _sdf->GetElement("serviceName")->GetValue()->GetAsString();
else
serviceName = topic_ + "/calibrate";
accelModel.Load(_sdf, "accel");
rateModel.Load(_sdf, "rate");
yawModel.Load(_sdf, "yaw");
// also use old configuration variables from gazebo_ros_imu
if (_sdf->HasElement("gaussianNoise")) {
double gaussianNoise;
if (_sdf->GetElement("gaussianNoise")->GetValue()->Get(gaussianNoise) && gaussianNoise != 0.0) {
accelModel.gaussian_noise = gaussianNoise;
rateModel.gaussian_noise = gaussianNoise;
}
}
if (_sdf->HasElement("xyzOffset")) {
#if (GAZEBO_MAJOR_VERSION >= 8)
this->offset_.Pos() = _sdf->Get<ignition::math::Vector3d>("xyzOffset");
#else
this->offset_.pos = _sdf->Get<math::Vector3>("xyzOffset");
#endif
} else {
ROS_INFO("imu plugin missing <xyzOffset>, defaults to 0s");
#if (GAZEBO_MAJOR_VERSION >= 8)
this->offset_.Pos() = ignition::math::Vector3d(0, 0, 0);
#else
this->offset_.pos = math::Vector3(0, 0, 0);
#endif
}
if (_sdf->HasElement("rpyOffset")) {
#if (GAZEBO_MAJOR_VERSION >= 8)
this->offset_.Rot() = _sdf->Get<ignition::math::Quaterniond>("rpyOffset");
#else
this->offset_.rot = _sdf->Get<math::Vector3>("rpyOffset");
#endif
} else {
ROS_INFO("imu plugin missing <rpyOffset>, defaults to 0s");
#if (GAZEBO_MAJOR_VERSION >= 8)
this->offset_.Rot() = ignition::math::Quaterniond(0, 0, 0);
#else
this->offset_.rot = math::Vector3(0, 0, 0);
#endif
}
// fill in constant covariance matrix
#if (GAZEBO_MAJOR_VERSION >= 8)
imuMsg.angular_velocity_covariance[0] = rateModel.gaussian_noise.X()*rateModel.gaussian_noise.X();
imuMsg.angular_velocity_covariance[4] = rateModel.gaussian_noise.Y()*rateModel.gaussian_noise.Y();
imuMsg.angular_velocity_covariance[8] = rateModel.gaussian_noise.Z()*rateModel.gaussian_noise.Z();
imuMsg.linear_acceleration_covariance[0] = accelModel.gaussian_noise.X()*accelModel.gaussian_noise.X();
imuMsg.linear_acceleration_covariance[4] = accelModel.gaussian_noise.Y()*accelModel.gaussian_noise.Y();
imuMsg.linear_acceleration_covariance[8] = accelModel.gaussian_noise.Z()*accelModel.gaussian_noise.Z();
#else
imuMsg.angular_velocity_covariance[0] = rateModel.gaussian_noise.x*rateModel.gaussian_noise.x;
imuMsg.angular_velocity_covariance[4] = rateModel.gaussian_noise.y*rateModel.gaussian_noise.y;
imuMsg.angular_velocity_covariance[8] = rateModel.gaussian_noise.z*rateModel.gaussian_noise.z;
imuMsg.linear_acceleration_covariance[0] = accelModel.gaussian_noise.x*accelModel.gaussian_noise.x;
imuMsg.linear_acceleration_covariance[4] = accelModel.gaussian_noise.y*accelModel.gaussian_noise.y;
imuMsg.linear_acceleration_covariance[8] = accelModel.gaussian_noise.z*accelModel.gaussian_noise.z;
#endif
// Make sure the ROS node for Gazebo has already been initialized
if (!ros::isInitialized())
{
ROS_FATAL_STREAM("A ROS node for Gazebo has not been initialized, unable to load plugin. "
<< "Load the Gazebo system plugin 'libgazebo_ros_api_plugin.so' in the gazebo_ros package.");
return;
}
node_handle_ = new ros::NodeHandle(namespace_);
// if topic name specified as empty, do not publish (then what is this plugin good for?)
if (!topic_.empty())
pub_ = node_handle_->advertise<sensor_msgs::Imu>(topic_, 10);
if (!bias_topic_.empty())
bias_pub_ = node_handle_->advertise<sensor_msgs::Imu>(bias_topic_, 10);
#ifdef DEBUG_OUTPUT
debugPublisher = rosnode_->advertise<geometry_msgs::PoseStamped>(topic_ + "/pose", 10);
#endif // DEBUG_OUTPUT
// advertise services for calibration and bias setting
if (!serviceName.empty())
srv_ = node_handle_->advertiseService(serviceName, &GazeboRosIMU::ServiceCallback, this);
accelBiasService = node_handle_->advertiseService(topic_ + "/set_accel_bias", &GazeboRosIMU::SetAccelBiasCallback, this);
rateBiasService = node_handle_->advertiseService(topic_ + "/set_rate_bias", &GazeboRosIMU::SetRateBiasCallback, this);
// setup dynamic_reconfigure servers
if (!topic_.empty()) {
dynamic_reconfigure_server_accel_.reset(new dynamic_reconfigure::Server<SensorModelConfig>(ros::NodeHandle(*node_handle_, topic_ + "/accel")));
dynamic_reconfigure_server_rate_.reset(new dynamic_reconfigure::Server<SensorModelConfig>(ros::NodeHandle(*node_handle_, topic_ + "/rate")));
dynamic_reconfigure_server_yaw_.reset(new dynamic_reconfigure::Server<SensorModelConfig>(ros::NodeHandle(*node_handle_, topic_ + "/yaw")));
dynamic_reconfigure_server_accel_->setCallback(boost::bind(&SensorModel3::dynamicReconfigureCallback, &accelModel, _1, _2));
dynamic_reconfigure_server_rate_->setCallback(boost::bind(&SensorModel3::dynamicReconfigureCallback, &rateModel, _1, _2));
dynamic_reconfigure_server_yaw_->setCallback(boost::bind(&SensorModel::dynamicReconfigureCallback, &yawModel, _1, _2));
}
#ifdef USE_CBQ
// start custom queue for imu
callback_queue_thread_ = boost::thread( boost::bind( &GazeboRosIMU::CallbackQueueThread,this ) );
#endif
Reset();
// connect Update function
updateTimer.Load(world, _sdf);
updateConnection = updateTimer.Connect(boost::bind(&GazeboRosIMU::Update, this));
}