roscpp
joint_trajectory_controller
controller_manager
+ message_generation
)
## System dependencies are found with CMake's conventions
## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...)
## Generate messages in the 'msg' folder
-# add_message_files(
-# FILES
-# Message1.msg
-# Message2.msg
-# )
+add_message_files(
+ FILES
+ HardwareError.msg
+)
## Generate services in the 'srv' folder
-# add_service_files(
-# FILES
-# Service1.srv
-# Service2.srv
-# )
+add_service_files(
+ FILES
+ GetError.srv
+)
## Generate actions in the 'action' folder
# add_action_files(
# )
## Generate added messages and services with any dependencies listed here
-# generate_messages(
-# DEPENDENCIES
-# std_msgs # Or other packages containing msgs
-# )
+generate_messages(
+ DEPENDENCIES
+ std_msgs
+)
################################################
## Declare ROS dynamic reconfigure parameters ##
## Add cmake target dependencies of the executable
## same as for the library above
-# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
+add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
## Specify libraries to link a library or executable target against
target_link_libraries(${PROJECT_NAME}_node
#include <hardware_interface/joint_state_interface.h>
#include <hardware_interface/robot_hw.h>
#include "std_srvs/SetBool.h"
+#include "wt_open_manipulator/GetError.h"
#define I2C_FILE "/dev/i2c-2"
#define I2C_ADDR (0x60>>1)
#define XM_OPERATING_MODE 11
#define XM_TORQUE_ENABLE 64
+#define XM_HARDWARE_ERROR_STATUS 70
#define XM_GOAL_CURRENT 102
#define XM_PROFILE_ACCELERATION 108
#define XM_PROFILE_VELOCITY 112
uint8_t mode=255;
this->nh = nh;
torque_enable_service = nh.advertiseService("torque_enable", &WtOpenManipulatorI2C::cbTorqueEnable, this);
+ get_error_service = nh.advertiseService("get_error", &WtOpenManipulatorI2C::cbGetError, this);
// connect and register the joint state interface
hardware_interface::JointStateHandle state_handle_1("joint1", &pos[0], &vel[0], &eff[0]);
double pos[5] = {0, 0, 0, 0, 0};
double vel[5] = {0, 0, 0, 0, 0};
double eff[5] = {0, 0, 0, 0, 0};
- ros::ServiceServer torque_enable_service;
+ ros::ServiceServer torque_enable_service, get_error_service;
std::mutex comm_mutex;
int dynamixel_write(uint8_t *write_data, int write_num, uint8_t *read_data, int read_num) {
return 255;
}
- bool cbTorqueEnable(std_srvs::SetBool::Request &req, std_srvs::SetBool::Response &res) {
+ bool cbTorqueEnable(std_srvs::SetBool::Request &req, std_srvs::SetBool::Response &res) {
ROS_INFO("Setting torque enable=%d", req.data);
res.success = torque_enable(req.data);
return true;
}
+
+ bool cbGetError(wt_open_manipulator::GetError::Request &req, wt_open_manipulator::GetError::Response &res) {
+ ROS_INFO("Reading Hardware Error Status");
+
+ for(int id=11, i=0; id<=15; id++, i++) {
+ wt_open_manipulator::HardwareError hw_error;
+ uint8_t value;
+ if (dynamixel_readbyte(id, XM_HARDWARE_ERROR_STATUS, &value) != 1) {
+ ROS_ERROR("I2C dynamixel id=%d reading hardware error status", id);
+ return false;
+ }
+ hw_error.id = id;
+ hw_error.inputVoltage = value & (1<<0);
+ hw_error.overHeating = value & (1<<2);
+ hw_error.motorEncoder = value & (1<<3);
+ hw_error.electricalShock = value & (1<<4);
+ hw_error.overload = value & (1<<5);
+ res.errors.push_back(hw_error);
+ }
+
+ return true;
+ }
};