-
Notifications
You must be signed in to change notification settings - Fork 308
controller_interface
bduffany edited this page Mar 16, 2014
·
23 revisions
In this example, we're writing a new controller for the PR2 Robot, that tracks a commanded position. Since the PR2 Robot provides the `EffortJointInterface`, we'll make our controller use that interface. This means that our controller will be usable for all robots that provide the `EffortJointInterface`, not just for the PR2 Robot.
#include <controller_interface/controller.h>
#include <hardware_interface/joint_command_interface.h>
#include <pluginlib/class_list_macros.h>
namespace controller_ns{
class PositionController : public controller_interface::Controller<hardware_interface::EffortJointInterface>
{
public:
bool init(hardware_interface::EffortJointInterface* hw, ros::NodeHandle &n)
{
// get joint name from the parameter server
std::string my_joint;
if (!n.getParam("joint", my_joint)){
ROS_ERROR("Could not find joint name");
return false;
}
// get the joint object to use in the realtime loop
joint_ = hw->getHandle(my_joint); // throws on failure
return true;
}
void update(const ros::Time& time, const ros::Duration& period)
{
double error = setpoint_ - joint_.getPosition();
joint_.setCommand(error*gain_);
}
void starting(const ros::Time& time) { }
void stopping(const ros::Time& time) { }
private:
hardware_interface::JointHandle joint_;
static const double gain_ = 1.25;
static const double setpoint_ = 3.00;
};
PLUGINLIB_DECLARE_CLASS(package_name, PositionController, controller_ns::PositionController, controller_interface::ControllerBase);
}//namespace