in robots/LoCoBot/locobot_control/src/locobot_controller.cpp [415:487]
void LoCoBotController::execute_joint_trajectory(const control_msgs::FollowJointTrajectoryGoalConstPtr &goal) {
ros::Time trajectoryStartTime = ros::Time::now();
ros::Rate loop_rate(25);
if (goal->trajectory.points.size() < 2) {
control_msgs::FollowJointTrajectoryResult result;
result.error_code = control_msgs::FollowJointTrajectoryResult::INVALID_GOAL;
smooth_joint_trajectory_server_->setSucceeded(result);
return;
}
bool result = false;
const char *log = NULL;
uint8_t id_array[group_motors_["arm"].size()];
uint8_t id_cnt = 0;
int32_t dynamixel_position[group_motors_["arm"].size()];
static uint32_t point_cnt = 0;
static uint32_t position_cnt = 0;
for (auto const &motor:group_motors_["arm"]) {
id_array[id_cnt++] = dynamixel_name_2ids_[motor];
}
for (int i = 0; i < goal->trajectory.points.size(); i++) {
//check for preempt requests from clients
if (smooth_joint_trajectory_server_->isPreemptRequested()) {
//preempt action server
smooth_joint_trajectory_server_->setPreempted();
ROS_INFO("Joint trajectory server preempted by client");
return;
}
while ((ros::Time::now() - trajectoryStartTime).toSec() < goal->trajectory.points[i].time_from_start.toSec()) {
continue;
}
for (uint8_t index = 0; index < id_cnt; index++) {
uint8_t id = id_array[index];
if (id <= 2) {
dynamixel_position[index] =
dxl_wb_->convertRadian2Value(id, goal->trajectory.points[i].positions[id - 1]);
} else if (id == 3) {
dynamixel_position[index] = dxl_wb_->convertRadian2Value(id,
-goal->trajectory.points[i].positions[1]);
} else {
dynamixel_position[index] =
dxl_wb_->convertRadian2Value(id, -goal->trajectory.points[i].positions[id - 2]);
}
}
{
std::unique_lock<std::mutex> lock(dynamixel_mutex_);
result = dxl_wb_->syncWrite(SYNC_WRITE_HANDLER_FOR_GOAL_POSITION,
id_array, id_cnt, dynamixel_position, 1, &log);
}
if (!result) {
ROS_ERROR("%s", log);
}
loop_rate.sleep();
}
control_msgs::FollowJointTrajectoryResult actionlib_result;
actionlib_result.error_code = control_msgs::FollowJointTrajectoryResult::SUCCESSFUL;
smooth_joint_trajectory_server_->setSucceeded(actionlib_result);
ROS_INFO("Trajectory goal execution took %fs.", (ros::Time::now() - trajectoryStartTime).toSec());
}