1
0
mirror of https://gitlab.com/obbart/universal_robots_ros_driver.git synced 2026-04-10 10:00:48 +02:00

Fixed an issue with using a simulated robot on firmware <= 1.8

This commit is contained in:
Thomas Timm Andersen
2015-10-20 12:16:38 +02:00
parent 8a4cdb51da
commit 1c3fe82116
3 changed files with 68 additions and 12 deletions

View File

@@ -54,6 +54,38 @@ enum robot_message_type {
} }
typedef robot_message_types::robot_message_type robotMessageType; typedef robot_message_types::robot_message_type robotMessageType;
namespace robot_state_type_v18 {
enum robot_state_type {
ROBOT_RUNNING_MODE = 0,
ROBOT_FREEDRIVE_MODE = 1,
ROBOT_READY_MODE = 2,
ROBOT_INITIALIZING_MODE = 3,
ROBOT_SECURITY_STOPPED_MODE = 4,
ROBOT_EMERGENCY_STOPPED_MODE = 5,
ROBOT_FATAL_ERROR_MODE = 6,
ROBOT_NO_POWER_MODE = 7,
ROBOT_NOT_CONNECTED_MODE = 8,
ROBOT_SHUTDOWN_MODE = 9,
ROBOT_SAFEGUARD_STOP_MODE = 10
};
}
typedef robot_state_type_v18::robot_state_type robotStateTypeV18;
namespace robot_state_type_v30 {
enum robot_state_type {
ROBOT_MODE_DISCONNECTED = 0,
ROBOT_MODE_CONFIRM_SAFETY = 1,
ROBOT_MODE_BOOTING = 2,
ROBOT_MODE_POWER_OFF = 3,
ROBOT_MODE_POWER_ON = 4,
ROBOT_MODE_IDLE = 5,
ROBOT_MODE_BACKDRIVE = 6,
ROBOT_MODE_RUNNING = 7,
ROBOT_MODE_UPDATING_FIRMWARE = 8
};
}
typedef robot_state_type_v30::robot_state_type robotStateTypeV30;
struct version_message { struct version_message {
uint64_t timestamp; uint64_t timestamp;
int8_t source; int8_t source;
@@ -115,6 +147,7 @@ private:
std::condition_variable* pMsg_cond_; //Signals that new vars are available std::condition_variable* pMsg_cond_; //Signals that new vars are available
bool new_data_available_; //to avoid spurious wakes bool new_data_available_; //to avoid spurious wakes
unsigned char robot_mode_running_;
double ntohd(uint64_t nf); double ntohd(uint64_t nf);
@@ -154,6 +187,8 @@ public:
bool isProtectiveStopped(); bool isProtectiveStopped();
bool isProgramRunning(); bool isProgramRunning();
bool isProgramPaused(); bool isProgramPaused();
unsigned char getRobotMode();
bool isReady();
void setDisconnected(); void setDisconnected();

View File

@@ -13,6 +13,7 @@ RobotState::RobotState(std::condition_variable& msg_cond) {
new_data_available_ = false; new_data_available_ = false;
pMsg_cond_ = &msg_cond; pMsg_cond_ = &msg_cond;
RobotState::setDisconnected(); RobotState::setDisconnected();
robot_mode_running_ = robotStateTypeV30::ROBOT_MODE_RUNNING;
} }
double RobotState::ntohd(uint64_t nf) { double RobotState::ntohd(uint64_t nf) {
double x; double x;
@@ -129,6 +130,9 @@ void RobotState::unpackRobotMessageVersion(uint8_t * buf, unsigned int offset,
version_msg_.svn_revision = ntohl(version_msg_.svn_revision); version_msg_.svn_revision = ntohl(version_msg_.svn_revision);
memcpy(&version_msg_.build_date, &buf[offset], sizeof(char) * len - offset); memcpy(&version_msg_.build_date, &buf[offset], sizeof(char) * len - offset);
version_msg_.build_date[len - offset] = '\0'; version_msg_.build_date[len - offset] = '\0';
if (version_msg_.major_version < 2) {
robot_mode_running_ = robotStateTypeV18::ROBOT_RUNNING_MODE;
}
} }
void RobotState::unpackRobotMode(uint8_t * buf, unsigned int offset) { void RobotState::unpackRobotMode(uint8_t * buf, unsigned int offset) {
@@ -355,6 +359,15 @@ bool RobotState::isProgramRunning() {
bool RobotState::isProgramPaused() { bool RobotState::isProgramPaused() {
return robot_mode_.isProgramPaused; return robot_mode_.isProgramPaused;
} }
unsigned char RobotState::getRobotMode() {
return robot_mode_.robotMode;
}
bool RobotState::isReady() {
if (robot_mode_.robotMode == robot_mode_running_) {
return true;
}
return false;
}
void RobotState::setDisconnected() { void RobotState::setDisconnected() {
robot_mode_.isRobotConnected = false; robot_mode_.isRobotConnected = false;

View File

@@ -193,19 +193,26 @@ private:
void goalCB( void goalCB(
actionlib::ServerGoalHandle< actionlib::ServerGoalHandle<
control_msgs::FollowJointTrajectoryAction> gh) { control_msgs::FollowJointTrajectoryAction> gh) {
std::string buf;
print_info("on_goal"); print_info("on_goal");
if (!robot_.sec_interface_->robot_state_->isPowerOnRobot()) { if (!robot_.sec_interface_->robot_state_->isReady()) {
result_.error_code = -100; //nothing is defined for this...? result_.error_code = -100; //nothing is defined for this...?
result_.error_string =
"Cannot accept new trajectories: Robot arm is not powered on"; if (!robot_.sec_interface_->robot_state_->isPowerOnRobot()) {
gh.setRejected(result_, result_.error_string); result_.error_string =
print_error(result_.error_string); "Cannot accept new trajectories: Robot arm is not powered on";
return; gh.setRejected(result_, result_.error_string);
} print_error(result_.error_string);
if (!robot_.sec_interface_->robot_state_->isRealRobotEnabled()) { return;
result_.error_code = -100; //nothing is defined for this...? }
result_.error_string = if (!robot_.sec_interface_->robot_state_->isRealRobotEnabled()) {
"Cannot accept new trajectories: Robot is not enabled"; result_.error_string =
"Cannot accept new trajectories: Robot is not enabled";
gh.setRejected(result_, result_.error_string);
print_error(result_.error_string);
return;
}
result_.error_string = "Cannot accept new trajectories. (Debug: Robot mode is " + std::to_string(robot_.sec_interface_->robot_state_->getRobotMode()) + ")";
gh.setRejected(result_, result_.error_string); gh.setRejected(result_, result_.error_string);
print_error(result_.error_string); print_error(result_.error_string);
return; return;
@@ -226,6 +233,7 @@ private:
print_error(result_.error_string); print_error(result_.error_string);
return; return;
} }
actionlib::ActionServer<control_msgs::FollowJointTrajectoryAction>::Goal goal = actionlib::ActionServer<control_msgs::FollowJointTrajectoryAction>::Goal goal =
*gh.getGoal(); //make a copy that we can modify *gh.getGoal(); //make a copy that we can modify
if (has_goal_) { if (has_goal_) {
@@ -280,7 +288,7 @@ private:
if (!has_limited_velocities()) { if (!has_limited_velocities()) {
result_.error_code = result_.INVALID_GOAL; result_.error_code = result_.INVALID_GOAL;
result_.error_string = result_.error_string =
"Received a goal with velocities that are higher than %f", max_velocity_; "Received a goal with velocities that are higher than " + std::to_string(max_velocity_);
gh.setRejected(result_, result_.error_string); gh.setRejected(result_, result_.error_string);
print_error(result_.error_string); print_error(result_.error_string);
return; return;