problem using hardware interface

asked 2020-03-29 07:09:58 -0500

dinesh gravatar image

updated 2020-03-29 07:20:58 -0500

I am trying to implement a hardware interface for my robot.

Right now i'm tyring to make a hardware interface for rrbot_robot as a testing purpose. But i'm not able to list the command parametrs like that when i use rrbot_robot in simulation. i.e launching the robot in gazebo. To launch the hardware_interface alsong with the controllers and controller manager. github repository
i'm using thsi files: rrbot_control.yaml

rrbot:
  # Publish all joint states -----------------------------------
  joint_state_controller:
    type: joint_state_controller/JointStateController
    publish_rate: 50  

  # Position Controllers ---------------------------------------
  joint1_position_controller:
    type: effort_controllers/JointPositionController
    joint: joint1
    pid: {p: 100.0, i: 0.01, d: 10.0}
  joint2_position_controller:
    type: effort_controllers/JointPositionController
    joint: joint2
    pid: {p: 100.0, i: 0.01, d: 10.0}

rrbot_control.launch

<?xml version="1.0"?>

<launch>

  <!-- Load joint controller configurations from YAML file to parameter server -->
  <rosparam file="$(find rrbot_control)/config/rrbot_control.yaml" command="load"/>

  <!-- Load the URDF into the ROS Parameter Server -->
  <param name="robot_description"
    command="$(find xacro)/xacro --inorder '$(find rrbot_description)/urdf/rrbot.xacro'" />

  <!-- Run a python script to the send a service call to gazebo_ros to spawn a URDF robot -->
  <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
    args="-urdf -model rrbot -param robot_description"/>


  <!-- launch our hardware interface -->
    <node pkg="rrbot_control"
          type="rrbot_control"
          name="rrbot_control" output="screen" clear_params="true"
          required="true"/>


  <!-- load the controllers -->
  <node name="controller_spawner" pkg="controller_manager" type="spawner" respawn="false"
    output="screen" ns="/rrbot" args="joint_state_controller
                      joint1_position_controller
                      joint2_position_controller"/>

  <!-- convert joint states to TF transforms for rviz, etc -->
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"
    respawn="false" output="screen">
    <remap from="/joint_states" to="/rrbot/joint_states" />
  </node>

</launch>

rrbot_control.cpp

#include <hardware_interface/joint_command_interface.h>
#include <hardware_interface/joint_state_interface.h>
#include <hardware_interface/robot_hw.h>
#include <ros/ros.h>
#include <controller_manager/controller_manager.h>

class MyRobot : public hardware_interface::RobotHW
{
public:
  MyRobot() 
 { 
   // connect and register the joint state interface
   hardware_interface::JointStateHandle state_handle_a("joint1", &pos[0], &vel[0], &eff[0]);
   jnt_state_interface.registerHandle(state_handle_a);

   hardware_interface::JointStateHandle state_handle_b("joint2", &pos[1], &vel[1], &eff[1]);
   jnt_state_interface.registerHandle(state_handle_b);

   registerInterface(&jnt_state_interface);

   // connect and register the joint position interface
   hardware_interface::JointHandle pos_handle_a(jnt_state_interface.getHandle("joint1"), &cmd[0]);
   jnt_pos_interface.registerHandle(pos_handle_a);

   hardware_interface::JointHandle pos_handle_b(jnt_state_interface.getHandle("joint2"), &cmd[1]);
   jnt_pos_interface.registerHandle(pos_handle_b);

   registerInterface(&jnt_pos_interface);
  }

  void read() { std::cout<<"read"<<std::endl; };
  void write() { std::cout<<"write"<<std::endl; }; 

private:
  hardware_interface::JointStateInterface jnt_state_interface;
  hardware_interface::PositionJointInterface jnt_pos_interface;
  double cmd[2];
  double pos[2];
  double vel[2];
  double eff[2];
};

int main(int argc, char **argv)
{
  ros::init(argc, argv, "rrbot");
  ros::NodeHandle nh;  

  MyRobot robot;
  controller_manager::ControllerManager cm(&robot);
ros::Duration d(0.5);
  while (ros::ok())
  {
     robot.read();
     //cm.update(ros::Time::now().toSec(),d);
     robot.write();
     sleep(1);
  }
}

CMakeLIsts.txt

cmake_minimum_required(VERSION 2.8.3)

project(rrbot_control)

find_package(catkin REQUIRED
  roscpp
  urdf
  std_msgs
  message_generation
  hardware_interface
  controller_manager
)

include_directories(
  ${catkin_INCLUDE_DIRS}
  include
)


catkin_package()

install(DIRECTORY config
  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION})

install(DIRECTORY launch
  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION})

add_executable(${PROJECT_NAME} src/rrbot_control.cpp)
target_link_libraries(${PROJECT_NAME} ${catkin_LIBRARIES})

When i run the command ... (more)

edit retag flag offensive close merge delete

Comments

Hi @dinesh,

You may need to launch Gazebo, at least the Gzserver to properly control the robot. If you do not launch Gazebo there is no hardware interface to read and write.

Weasfas gravatar image Weasfas  ( 2020-03-29 08:03:23 -0500 )edit

i am trying to implement hardwre interface for the real robot. right now i'm testing its core functality.

dinesh gravatar image dinesh  ( 2020-03-29 08:52:54 -0500 )edit

Well, it does not matter, real or simulated. You may need a hardware interface to read and write. In case of Gazebo the communication is already provided but for a real platform you should implement the hardware communication with the real robot or at least implement a layer with the drivers running in the robot to communicate with ROS_control.

Weasfas gravatar image Weasfas  ( 2020-03-29 09:47:56 -0500 )edit