in simulation_ws/src/rover/hector_gazebo_plugins/src/gazebo_ros_force_based_move.cpp [36:197]
void GazeboRosForceBasedMove::Load(physics::ModelPtr parent,
sdf::ElementPtr sdf)
{
parent_ = parent;
/* Parse parameters */
robot_namespace_ = "";
if (!sdf->HasElement("robotNamespace"))
{
ROS_INFO("PlanarMovePlugin missing <robotNamespace>, "
"defaults to \"%s\"", robot_namespace_.c_str());
}
else
{
robot_namespace_ =
sdf->GetElement("robotNamespace")->Get<std::string>();
}
command_topic_ = "cmd_vel";
if (!sdf->HasElement("commandTopic"))
{
ROS_WARN("PlanarMovePlugin (ns = %s) missing <commandTopic>, "
"defaults to \"%s\"",
robot_namespace_.c_str(), command_topic_.c_str());
}
else
{
command_topic_ = sdf->GetElement("commandTopic")->Get<std::string>();
}
odometry_topic_ = "odom";
if (!sdf->HasElement("odometryTopic"))
{
ROS_WARN("PlanarMovePlugin (ns = %s) missing <odometryTopic>, "
"defaults to \"%s\"",
robot_namespace_.c_str(), odometry_topic_.c_str());
}
else
{
odometry_topic_ = sdf->GetElement("odometryTopic")->Get<std::string>();
}
odometry_frame_ = "odom";
if (!sdf->HasElement("odometryFrame"))
{
ROS_WARN("PlanarMovePlugin (ns = %s) missing <odometryFrame>, "
"defaults to \"%s\"",
robot_namespace_.c_str(), odometry_frame_.c_str());
}
else
{
odometry_frame_ = sdf->GetElement("odometryFrame")->Get<std::string>();
}
torque_yaw_velocity_p_gain_ = 100.0;
force_x_velocity_p_gain_ = 10000.0;
force_y_velocity_p_gain_ = 10000.0;
if (sdf->HasElement("yaw_velocity_p_gain"))
(sdf->GetElement("yaw_velocity_p_gain")->GetValue()->Get(torque_yaw_velocity_p_gain_));
if (sdf->HasElement("x_velocity_p_gain"))
(sdf->GetElement("x_velocity_p_gain")->GetValue()->Get(force_x_velocity_p_gain_));
if (sdf->HasElement("y_velocity_p_gain"))
(sdf->GetElement("y_velocity_p_gain")->GetValue()->Get(force_y_velocity_p_gain_));
ROS_INFO_STREAM("ForceBasedMove using gains: yaw: " << torque_yaw_velocity_p_gain_ <<
" x: " << force_x_velocity_p_gain_ <<
" y: " << force_y_velocity_p_gain_ << "\n");
robot_base_frame_ = "base_footprint";
if (!sdf->HasElement("robotBaseFrame"))
{
ROS_WARN("PlanarMovePlugin (ns = %s) missing <robotBaseFrame>, "
"defaults to \"%s\"",
robot_namespace_.c_str(), robot_base_frame_.c_str());
}
else
{
robot_base_frame_ = sdf->GetElement("robotBaseFrame")->Get<std::string>();
}
ROS_INFO_STREAM("robotBaseFrame for force based move plugin: " << robot_base_frame_ << "\n");
this->link_ = parent->GetLink(robot_base_frame_);
odometry_rate_ = 20.0;
if (!sdf->HasElement("odometryRate"))
{
ROS_WARN("PlanarMovePlugin (ns = %s) missing <odometryRate>, "
"defaults to %f",
robot_namespace_.c_str(), odometry_rate_);
}
else
{
odometry_rate_ = sdf->GetElement("odometryRate")->Get<double>();
}
this->publish_odometry_tf_ = true;
if (!sdf->HasElement("publishOdometryTf")) {
ROS_WARN("PlanarMovePlugin Plugin (ns = %s) missing <publishOdometryTf>, defaults to %s",
this->robot_namespace_.c_str(), this->publish_odometry_tf_ ? "true" : "false");
} else {
this->publish_odometry_tf_ = sdf->GetElement("publishOdometryTf")->Get<bool>();
}
#if (GAZEBO_MAJOR_VERSION >= 8)
last_odom_publish_time_ = parent_->GetWorld()->SimTime();
last_odom_pose_ = parent_->WorldPose();
#else
last_odom_publish_time_ = parent_->GetWorld()->GetSimTime();
last_odom_pose_ = parent_->GetWorldPose();
#endif
x_ = 0;
y_ = 0;
rot_ = 0;
alive_ = true;
odom_transform_.setIdentity();
// Ensure that ROS has been initialized and subscribe to cmd_vel
if (!ros::isInitialized())
{
ROS_FATAL_STREAM("PlanarMovePlugin (ns = " << robot_namespace_
<< "). 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;
}
rosnode_.reset(new ros::NodeHandle(robot_namespace_));
ROS_DEBUG("OCPlugin (%s) has started!",
robot_namespace_.c_str());
tf_prefix_ = tf::getPrefixParam(*rosnode_);
if (publish_odometry_tf_)
transform_broadcaster_.reset(new tf::TransformBroadcaster());
// subscribe to the odometry topic
ros::SubscribeOptions so =
ros::SubscribeOptions::create<geometry_msgs::Twist>(command_topic_, 1,
boost::bind(&GazeboRosForceBasedMove::cmdVelCallback, this, _1),
ros::VoidPtr(), &queue_);
vel_sub_ = rosnode_->subscribe(so);
odometry_pub_ = rosnode_->advertise<nav_msgs::Odometry>(odometry_topic_, 1);
// start custom queue for diff drive
callback_queue_thread_ =
boost::thread(boost::bind(&GazeboRosForceBasedMove::QueueThread, this));
// listen to the update event (broadcast every simulation iteration)
update_connection_ =
event::Events::ConnectWorldUpdateBegin(
boost::bind(&GazeboRosForceBasedMove::UpdateChild, this));
}