32 #include <boost/assign.hpp> 34 #include <boost/math/special_functions/round.hpp> 44 #define TICKS_PER_RADIAN_ENC_3_STATE (20.50251516) // used to read more misleading value of (41.0058030317/2) 45 #define QTICKS_PER_RADIAN (ticks_per_radian*4) // Quadrature ticks makes code more readable later 47 #define VELOCITY_READ_PER_SECOND \ 48 10.0 // read = ticks / (100 ms), so we have scale of 10 for ticks/second 49 #define LOWEST_FIRMWARE_VERSION 28 59 boost::assign::list_of(
"left_wheel_joint")(
"right_wheel_joint");
61 for (
size_t i = 0; i < joint_names.size(); i++) {
68 joint_state_handle, &
joints_[i].velocity_command);
127 for (
size_t i = 0; i <
sizeof(
joints_) /
sizeof(
joints_[0]); i++) {
145 ROS_FATAL(
"Firmware version %d, expect %d or above",
147 throw std::runtime_error(
"Firmware version too low");
167 int16_t odomLeft = (odom >> 16) & 0xffff;
168 int16_t odomRight = odom & 0xffff;
184 std_msgs::Int32 left;
185 std_msgs::Int32 right;
187 int16_t leftSpeed = (speed >> 16) & 0xffff;
188 int16_t rightSpeed = speed & 0xffff;
190 left.data = leftSpeed;
191 right.data = rightSpeed;
220 ROS_WARN(
"right PWM limit reached");
224 ROS_DEBUG(
"left Integral limit reached");
228 ROS_DEBUG(
"right Integral limit reached");
232 ROS_WARN(
"left Maximum speed reached");
236 ROS_WARN(
"right Maximum speed reached");
247 sensor_msgs::BatteryState bstate;
250 bstate.current = std::numeric_limits<float>::quiet_NaN();
251 bstate.charge = std::numeric_limits<float>::quiet_NaN();
252 bstate.capacity = std::numeric_limits<float>::quiet_NaN();
253 bstate.design_capacity = std::numeric_limits<float>::quiet_NaN();
254 bstate.percentage = std::max(0.0, std::min(1.0, (bstate.voltage - 20.0) * 0.125));
255 bstate.power_supply_status = sensor_msgs::BatteryState::POWER_SUPPLY_STATUS_UNKNOWN;
256 bstate.power_supply_health = sensor_msgs::BatteryState::POWER_SUPPLY_HEALTH_UNKNOWN;
257 bstate.power_supply_technology = sensor_msgs::BatteryState::POWER_SUPPLY_TECHNOLOGY_UNKNOWN;
268 ROS_WARN(
"Motor power has gone from inactive to active. Most likely from ESTOP switch");
273 ROS_WARN(
"Motor power has gone inactive. Most likely from ESTOP switch active");
279 std_msgs::Bool estop_message;
305 int32_t
data = (left_speed << 16) | (right_speed & 0x0000ffff);
308 std_msgs::Int32 smsg;
309 smsg.data = left_speed;
353 ROS_INFO(
"setting hardware_version to %x", (
int)hardware_version);
363 ROS_INFO(
"setting Estop PID threshold to %d", (
int)estop_pid_threshold);
367 mm.
setData(estop_pid_threshold);
373 ROS_INFO(
"setting estop button detection to %x", (
int)estop_detection);
388 ROS_INFO(
"setting max motor forward speed to %d", (
int)max_speed_fwd);
398 ROS_INFO(
"setting max motor reverse speed to %d", (
int)max_speed_rev);
408 ROS_INFO(
"setting max motor PWM to %x", (
int)max_pwm);
417 ROS_ERROR(
"setting deadman to %d", (
int)deadman_timer);
426 ROS_ERROR(
"setting deadzone enable to %d", (
int)deadzone_enable);
446 std::vector<MotorMessage> commands;
464 commands.push_back(p);
474 commands.push_back(i);
485 commands.push_back(d);
496 commands.push_back(v);
507 commands.push_back(denominator);
520 commands.push_back(winsize);
525 if (commands.size() != 0) {
531 std::vector<MotorMessage> commands;
541 commands.push_back(led1);
551 commands.push_back(led2);
561 double encoderFactor = 1.0;
580 using diagnostic_msgs::DiagnosticStatus;
585 stat.
summary(DiagnosticStatus::ERROR,
"No firmware version reported. Power may be off.");
588 stat.
summary(DiagnosticStatus::WARN,
"Firmware is older than recommended! You must update firmware!");
591 stat.
summary(DiagnosticStatus::OK,
"Firmware version is OK");
599 std::stringstream stream;
601 std::string daycode(stream.str());
603 stat.
add(
"Firmware Date", daycode);
604 stat.
summary(DiagnosticStatus::OK,
"Firmware daycode format is YYYYMMDD");
611 stat.
summary(DiagnosticStatus::OK,
"Limits reached:");
612 if (left_pwm_limit) {
613 stat.
mergeSummary(DiagnosticStatusWrapper::ERROR,
" left pwm,");
614 left_pwm_limit =
false;
616 if (right_pwm_limit) {
617 stat.
mergeSummary(DiagnosticStatusWrapper::ERROR,
" right pwm,");
618 right_pwm_limit =
false;
620 if (left_integral_limit) {
621 stat.
mergeSummary(DiagnosticStatusWrapper::WARN,
" left integral,");
622 left_integral_limit =
false;
624 if (right_integral_limit) {
625 stat.
mergeSummary(DiagnosticStatusWrapper::WARN,
" right integral,");
626 right_integral_limit =
false;
628 if (left_max_speed_limit) {
629 stat.
mergeSummary(DiagnosticStatusWrapper::WARN,
" left speed,");
630 left_max_speed_limit =
false;
632 if (right_max_speed_limit) {
633 stat.
mergeSummary(DiagnosticStatusWrapper::WARN,
" right speed,");
634 right_max_speed_limit =
false;
636 if (param_limit_in_firmware) {
638 stat.
mergeSummary(DiagnosticStatusWrapper::WARN,
" firmware limit,");
639 param_limit_in_firmware =
false;
644 stat.
add(
"Battery Voltage", battery_voltage);
645 if (battery_voltage < 22.5) {
646 stat.
summary(DiagnosticStatusWrapper::WARN,
"Battery low");
648 else if (battery_voltage < 21.0) {
649 stat.
summary(DiagnosticStatusWrapper::ERROR,
"Battery critical");
652 stat.
summary(DiagnosticStatusWrapper::OK,
"Battery OK");
658 stat.
summary(DiagnosticStatusWrapper::ERROR,
"Motor power on");
661 stat.
summary(DiagnosticStatusWrapper::WARN,
"Motor power off");
668 stat.
summary(DiagnosticStatusWrapper::OK,
"High resolution encoders");
671 stat.
summary(DiagnosticStatusWrapper::OK,
"Standard resolution encoders");
void registerInterface(T *iface)
bool right_integral_limit
void limit_status(diagnostic_updater::DiagnosticStatusWrapper &stat)
#define MIN_FW_FIRMWARE_DATE
void setEstopDetection(int32_t estop_detection)
void setHardwareVersion(int32_t hardware_version)
bool left_max_speed_limit
#define LOWEST_FIRMWARE_VERSION
MotorDiagnostics motor_diag_
ros::Publisher battery_state
float battery_voltage_offset
void summary(unsigned char lvl, const std::string s)
void setHardwareID(const std::string &hwid)
void setData(int32_t data)
void battery_status(diagnostic_updater::DiagnosticStatusWrapper &stat)
int transmitCommand(MotorMessage command)
hardware_interface::JointStateInterface joint_state_interface_
bool estop_motor_power_off
void add(const std::string &name, TaskFunction f)
void requestFirmwareDate()
int32_t pid_moving_buffer_size
int transmitCommands(const std::vector< MotorMessage > &commands)
int16_t calculateSpeedFromRadians(double radians) const
bool estop_motor_power_off
ros::Publisher rightError
ros::Publisher motor_power_active
void setDeadzoneEnable(int32_t deadzone_enable)
void firmware_status(diagnostic_updater::DiagnosticStatusWrapper &stat)
bool right_max_speed_limit
static FirmwareParams firmware_params
int32_t controller_board_version
MotorMessage::MessageTypes getType() const
void publish(const boost::shared_ptr< M > &message) const
struct MotorHardware::Joint joints_[2]
std::vector< std::string > V_string
void setMaxRevSpeed(int32_t max_speed_rev)
#define ROS_WARN_ONCE(...)
void setDeadmanTimer(int32_t deadman)
#define VELOCITY_READ_PER_SECOND
int32_t estop_pid_threshold
double calculateRadiansFromTicks(int16_t ticks) const
float battery_voltage_multiplier
void setDebugLeds(bool led1, bool led2)
void setParams(FirmwareParams firmware_params)
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
void motor_power_status(diagnostic_updater::DiagnosticStatusWrapper &stat)
void registerHandle(const JointStateHandle &handle)
void requestFirmwareVersion()
static CommsParams serial_params
#define MIN_FW_PID_V_TERM
void mergeSummary(unsigned char lvl, const std::string s)
void setMaxPwm(int32_t max_pwm)
void setRegister(MotorMessage::Registers reg)
#define MIN_FW_RECOMMENDED
void setMaxFwdSpeed(int32_t max_speed_fwd)
hardware_interface::VelocityJointInterface velocity_joint_interface_
#define TICKS_PER_RADIAN_ENC_3_STATE
#define QTICKS_PER_RADIAN
void setType(MotorMessage::MessageTypes type)
void setEstopPidThreshold(int32_t estop_pid_threshold)
MotorMessage receiveCommand()
bool param_limit_in_firmware
diagnostic_updater::FrequencyStatus odom_update_status
void firmware_date_status(diagnostic_updater::DiagnosticStatusWrapper &stat)
void add(const std::string &key, const T &val)
MotorSerial * motor_serial_
void firmware_options_status(diagnostic_updater::DiagnosticStatusWrapper &stat)
MotorMessage::Registers getRegister() const
diagnostic_updater::Updater diag_updater
void writeSpeedsInRadians(double left_radians, double right_radians)
FirmwareParams prev_fw_params
MotorHardware(ros::NodeHandle nh, CommsParams serial_params, FirmwareParams firmware_params)
static const int32_t MOT_POW_ACTIVE