-
joint_state_controller: This controller reads all joint positions and publish them on to the topic "/joint_states". This controller does not send any command to the actuators. Used as "joint_state_controller/JointStateController".
​
-
effort_controllers: Use when you want to send commands to an effort interface. This means that joint actuator you want to control accepts effort [current (or) voltage] command.
JointPositionController: Used as "effort_controllers/JointPositionController". This controller plugin accepts the position [radians (or) meters] value as input. Error (goal position - current position) is mapped to output effort command through a PID loop.
JointVelocityController: Used as "effort_controllers/JointVelocityController". This controller plugin accepts the velocity [radians/sec (or) meters/sec] values as input. Error (goal velocity - current velocity) is mapped to output effort command through a PID loop.
​
JointEffortController: Used as "effort_controllers/JointEffortController". This controller plugin accepts the effort [force (or) torque] values as input. The input effort is simply forwarded as output effort command to the joint actuator. The values of P, I and D have no effect on output effort.
​
JointGroupPositionController: Used as "effort_controllers/JointGroupPositionController". This controller functions same as effort_controllers/JointPositionController for a group of joints.
JointGroupEffortController: Used as "effort_controllers/JointGroupEffortController". This controller functions same as effort_controllers/JointEffortController for a group of joints.
-
velocity_controllers: Use when you want to send commands to an velocity interface. This means that joint actuator you want to control accepts velocity command directly.
JointPositionController: Used as "velocity_controllers/JointPositionController". This controller plugin accepts the position [radians (or) meters] value as input. Error (goal position - current position) is mapped to output velocity command through a PID loop.
​
JointVelocityController: Used as "velocity_controllers/JointVelocityController". This controller plugin accepts the velocity [radians/sec (or) meters/sec] values as input. The input velocity value is simply forwarded as output command to the joint actuator. The values of P, I and D have no effect on output command.
​
JointGroupVelocityController: Used as "velocity_controllers/JointGroupVelocityController". This controller functions same as velocity_controllers/JointVelocityController for a group of joints.
​
-
position_controllers: Use when you want to send commands to an position interface. This means that joint actuator you want to control accepts position command directly.
JointPositionController: Used as "position_controllers/JointPositionController". This controller plugin accepts the position [radians (or) meters] values as input. The input position value is simply forwarded as output command to the joint actuator. The values of P, I and D have no effect on output command.
JointGroupPositionController: Used as "position_controllers/JointGroupPositionController". This controller functions same as position_controllers/JointPositionController for a group of joints.​
​
-
joint_trajectory_controllers: This controller is used for executing joint-space trajectories on a group of joints. Trajectories are specified as a set of waypoints to be reached. Waypoints consist of positions, and optionally velocities and accelerations. For more information on this controller, click here.
effort_controllers: Used as "effort_controllers/JointTrajectoryController". This controller plugin is used for the joint actuators that accepts effort [current (or) voltage]. The position+velocity trajectory following error is mapped to the output effort commands through a PID loop.
velocity_controllers: Used as "velocity_controllers/JointTrajectoryController". This controller plugin is used for the joint actuators that accepts velocity command directly. The position+velocity trajectory following error is mapped to the output velocity commands through a PID loop.
​
position_controllers: Used as "position_controllers/JointTrajectoryController". This controller plugin is used for the joint actuators that accepts position command directly. The desired positions in the specified trajectory are simply forwarded to the joints. The values of P, I and D have no effect on output command.
-
Interfaces for Joint Actuators:
- EffortJointInterface : This interface is used for the joint actuators which accepts effort (voltage or current) command. As you might have guessed by now, this interface is used with the effort_controllers.
​
- VelocityJointInterface : This interface is used for the joint actuators which accepts velocity command directly. Used with the velocity_controllers.
- PositionJointInterface : This interface is used for the joint actuators which accepts position command directly. Used with the position_controllers.
-
Interfaces for Joint Sensors:
- JointStateInterface : This interface is used when you have senors for getting the current position or/and velocity or/and effort (force/torque) of the joints. Used with joint_state_controller. JointStateInterface is used in almost all robot because it gets the current joint positions of the robot which
data in-turn is used by the tf/tf2 to calculate forward kinematics of the robot.
​
- ImuSensorInterface : This interface is used when you have a IMU sensors which is used to get the orientation, angular velocity and linear acceleration of the joint/robot. This is used with imu_sensor_controller.
​
Based on the type of the motors and sensors you are using, you have to choose the interfaces accordingly. Now that we have understood the types of interfaces available for joint actuators and sensors, lets learn how to write the hardware_interface node (the software representation of our robot).
So lets assume a robot with three joints as example and will write hardware interface for that. Lets start.
All the projects I haves made are using ros_control. So you can check my projects for working examples of robots using ros_control.
​
We are half way through about ROS Control.
Good things take time. Visit again for complete material.
​
Work under progress....!!!!!!
​
​
The tricky part in understanding ros control is to write the hardware_interface node. Once we write the hardware abstraction node we
have every thing ready to control the robot.
So lets see how to write the hardware interface node.