/*! * \brief Publishes the state of the powercube_chain as ros messages. * * Published to "/joint_states" as "sensor_msgs/JointState" * Published to "state" as "pr2_controllers_msgs/JointTrajectoryState" */ void publishState(bool update=true) { if (initialized_) { ROS_DEBUG("publish state"); if(update) {pc_ctrl_->updateStates();} sensor_msgs::JointState joint_state_msg; joint_state_msg.header.stamp = ros::Time::now(); joint_state_msg.name = pc_params_->GetJointNames(); joint_state_msg.position = pc_ctrl_->getPositions(); joint_state_msg.velocity = pc_ctrl_->getVelocities(); joint_state_msg.effort.resize(pc_params_->GetDOF()); pr2_controllers_msgs::JointTrajectoryControllerState controller_state_msg; controller_state_msg.header.stamp = joint_state_msg.header.stamp; controller_state_msg.joint_names = pc_params_->GetJointNames(); controller_state_msg.actual.positions = pc_ctrl_->getPositions(); controller_state_msg.actual.velocities = pc_ctrl_->getVelocities(); controller_state_msg.actual.accelerations = pc_ctrl_->getAccelerations(); std_msgs::String opmode_msg; opmode_msg.data = "velocity"; /// publishing joint and controller states on topic topicPub_JointState_.publish(joint_state_msg); topicPub_ControllerState_.publish(controller_state_msg); topicPub_OperationMode_.publish(opmode_msg); last_publish_time_ = joint_state_msg.header.stamp; } // check status of PowerCube chain if (pc_ctrl_->getPC_Status() != PowerCubeCtrl::PC_CTRL_OK) { error_ = true; } // check status of PowerCube chain if (pc_ctrl_->getPC_Status() != PowerCubeCtrl::PC_CTRL_OK) { error_ = true; } else { error_ = false; } // publishing diagnotic messages diagnostic_msgs::DiagnosticArray diagnostics; diagnostics.status.resize(1); // set data to diagnostics if(error_) { diagnostics.status[0].level = 2; diagnostics.status[0].name = n_.getNamespace();; diagnostics.status[0].message = pc_ctrl_->getErrorMessage(); } else { if (initialized_) { diagnostics.status[0].level = 0; diagnostics.status[0].name = n_.getNamespace(); //"schunk_powercube_chain"; diagnostics.status[0].message = "powercubechain initialized and running"; } else { diagnostics.status[0].level = 1; diagnostics.status[0].name = n_.getNamespace(); //"schunk_powercube_chain"; diagnostics.status[0].message = "powercubechain not initialized"; } } // publish diagnostic message topicPub_Diagnostic_.publish(diagnostics); }
/*! * \brief Executes the callback from the command_vel topic. * * Set the current velocity target. * \param msg JointVelocities */ void topicCallback_CommandVel(const brics_actuator::JointVelocities::ConstPtr& msg) { ROS_DEBUG("Received new velocity command"); if (!initialized_) { ROS_WARN("Skipping command: powercubes not initialized"); publishState(false); return; } if (pc_ctrl_->getPC_Status() != PowerCubeCtrl::PC_CTRL_OK) { publishState(false); return; } PowerCubeCtrl::PC_CTRL_STATUS status; std::vector<std::string> errorMessages; pc_ctrl_->getStatus(status, errorMessages); /// ToDo: don't rely on position of joint names, but merge them (check between msg.joint_uri and member variable JointStates) unsigned int DOF = pc_params_->GetDOF(); std::vector<std::string> jointNames = pc_params_->GetJointNames(); std::vector<double> cmd_vel(DOF); std::string unit = "rad"; /// check dimensions if (msg->velocities.size() != DOF) { ROS_ERROR("Skipping command: Commanded velocities and DOF are not same dimension."); return; } /// parse velocities for (unsigned int i = 0; i < DOF; i++) { /// check joint name if (msg->velocities[i].joint_uri != jointNames[i]) { ROS_ERROR("Skipping command: Received joint name %s doesn't match expected joint name %s for joint %d.",msg->velocities[i].joint_uri.c_str(),jointNames[i].c_str(),i); return; } /// check unit if (msg->velocities[i].unit != unit) { ROS_ERROR("Skipping command: Received unit %s doesn't match expected unit %s.",msg->velocities[i].unit.c_str(),unit.c_str()); return; } /// if all checks are successful, parse the velocity value for this joint ROS_DEBUG("Parsing velocity %f for joint %s",msg->velocities[i].value,jointNames[i].c_str()); cmd_vel[i] = msg->velocities[i].value; } /// command velocities to powercubes if (!pc_ctrl_->MoveVel(cmd_vel)) { error_ = true; error_msg_ = pc_ctrl_->getErrorMessage(); ROS_ERROR("Skipping command: %s",pc_ctrl_->getErrorMessage().c_str()); return; } ROS_DEBUG("Executed velocity command"); publishState(false); }