diff --git a/libs/relast.jar b/libs/relast.jar index b194a775113a72e2a0c5ccaf7d175322fdc8eab7..b1a7542048dd1611db7f479307b0285efd8bb1f6 100644 Binary files a/libs/relast.jar and b/libs/relast.jar differ diff --git a/ros2rag.common/config.yaml b/ros2rag.common/config.yaml index 889bf22911b2406af758a9083c57a2ebb8d52a45..3c9ae2d959cf77ec1b02b362cda22db49e032542 100644 --- a/ros2rag.common/config.yaml +++ b/ros2rag.common/config.yaml @@ -21,16 +21,18 @@ panda_mqtt_connector: Link4: "panda::panda_link4" Link5: "panda::panda_link5" Link6: "panda::panda_link6" - Link7: "panda::panda_link7" - # LeftFinger: "panda::panda_leftfinger" + EndEffector: "panda::panda_link7" RightFinger: "panda::panda_rightfinger" end_effectors: panda: - EndEffector: "panda::panda_leftfinger" + LeftFinger: "panda::panda_leftfinger" goal_poses: - position: "0.6 0 0.6" - wait: "5000" + orientation: "0 1 1 0" + work: "5000" - position: "-0.6 0.0 0.6" - wait: "3000" + orientation: "0 1 1 0" + work: "3000" - position: "0.6 0.0 0.6" - wait: "4000" + orientation: "0 1 1 0" + work: "4000" diff --git a/ros2rag.common/src/main/java/de/tudresden/inf/st/ros2rag/common/DataConfiguration.java b/ros2rag.common/src/main/java/de/tudresden/inf/st/ros2rag/common/DataConfiguration.java index de0758b209fa013132163c178d911124629ad1e3..5586c9396d45398f6b2a2c2d6e2f453a71c63da4 100644 --- a/ros2rag.common/src/main/java/de/tudresden/inf/st/ros2rag/common/DataConfiguration.java +++ b/ros2rag.common/src/main/java/de/tudresden/inf/st/ros2rag/common/DataConfiguration.java @@ -34,6 +34,7 @@ public class DataConfiguration { } public static class DataWorkPose { public String position; - public String wait; + public String orientation; + public String work; } } diff --git a/ros2rag.goal/src/main/jastadd/Computation.jrag b/ros2rag.goal/src/main/jastadd/Computation.jrag index da1d21fae8d8891b554c8dec90da3e2d2549a4a9..446dfaa719d21e3579cae3ff821830aace9f152c 100644 --- a/ros2rag.goal/src/main/jastadd/Computation.jrag +++ b/ros2rag.goal/src/main/jastadd/Computation.jrag @@ -10,7 +10,17 @@ aspect Computation { for (WorkPose workPose : getWorkPoseList()) { MoveToStep moveToStep = new MoveToStep(); moveToStep.setId(index++); - moveToStep.setPosition(workPose.getPosition()); + moveToStep.setPosition(plan.TrajectoryOuterClass.Trajectory.Position.newBuilder() + .setX(workPose.getPositionX()) + .setY(workPose.getPositionY()) + .setZ(workPose.getPositionZ()) + .build()); + moveToStep.setOrientation(plan.TrajectoryOuterClass.Trajectory.Orientation.newBuilder() + .setX(workPose.getOrientationX()) + .setY(workPose.getOrientationY()) + .setZ(workPose.getOrientationZ()) + .setW(workPose.getOrientationW()) + .build()); lastStep.setSuccessor(moveToStep); result.addStep(moveToStep); @@ -60,18 +70,33 @@ aspect Computation { return getId(); } - syn DoublePosition Workflow.getNextPosition() { - return currentStep().nextPosition(); + syn plan.TrajectoryOuterClass.Trajectory Workflow.getNextTrajectory() { + return currentStep().nextTrajectory(); } - syn DoublePosition Step.nextPosition(); + syn plan.TrajectoryOuterClass.Trajectory Step.nextTrajectory(); // next position should not be called before step is advanced - eq StartStep.nextPosition() = DoublePosition.of(Double.NaN, Double.NaN, Double.NaN); - eq MoveToStep.nextPosition() = getPosition(); - eq WorkStep.nextPosition() = getPredecessor().nextPosition(); - eq FinishedStep.nextPosition() = getPredecessor().nextPosition(); + eq StartStep.nextTrajectory() = plan.TrajectoryOuterClass.Trajectory.newBuilder() + .addPose(plan.TrajectoryOuterClass.Trajectory.Pose.newBuilder() + .setPosition(plan.TrajectoryOuterClass.Trajectory.Position.newBuilder() + .setX(Double.NaN) + .setY(Double.NaN) + .setZ(Double.NaN) + .build()) + .build()) + .build(); + eq MoveToStep.nextTrajectory() = plan.TrajectoryOuterClass.Trajectory.newBuilder() + .addPose(plan.TrajectoryOuterClass.Trajectory.Pose.newBuilder() + .setPosition(getPosition()) + .setOrientation(getOrientation()) + .setMode(plan.TrajectoryOuterClass.Trajectory.PlanningMode.FLUID) + .build()) + .setLoop(true) + .build(); + eq WorkStep.nextTrajectory() = getPredecessor().nextTrajectory(); + eq FinishedStep.nextTrajectory() = getPredecessor().nextTrajectory(); private static final double MoveToStep.DELTA = 0.1; - private boolean MoveToStep.isNear(DoublePosition one, DoublePosition other) { + private boolean MoveToStep.isNear(plan.TrajectoryOuterClass.Trajectory.Position one, plan.TrajectoryOuterClass.Trajectory.Position other) { return Math.abs(one.getX() - other.getX()) < DELTA && Math.abs(one.getY() - other.getY()) < DELTA && Math.abs(one.getZ() - other.getZ()) < DELTA; diff --git a/ros2rag.goal/src/main/jastadd/GoalModel.relast b/ros2rag.goal/src/main/jastadd/GoalModel.relast index ada05c63e58672128740f3a1616f2bf5ed20cf59..03ec3fa01051855d8485444d6270591e7671ee9b 100644 --- a/ros2rag.goal/src/main/jastadd/GoalModel.relast +++ b/ros2rag.goal/src/main/jastadd/GoalModel.relast @@ -1,13 +1,13 @@ GoalModel ::= WorkPose* /Workflow/ RobotState ; -RobotState ::= <CurrentPosition:DoublePosition> <LastUpdate:long> ; +RobotState ::= <CurrentPosition:plan.TrajectoryOuterClass.Trajectory.Position> <LastUpdate:long> ; -WorkPose ::= <Position:DoublePosition> <Duration:long> ; // Position in [m,m,m], Duration in ms +WorkPose ::= <PositionX:double> <PositionY:double> <PositionZ:double> <OrientationX:double> <OrientationY:double> <OrientationZ:double> <OrientationW:double> <Duration:long> ; // Positions in m, Duration in ms -Workflow ::= Step* /<ReadyForThisStep:int>/ /<NextPosition:DoublePosition>/ <CurrentStep:LastUpdatedInteger> ; // NextPosition in [m,m,m]; CurrentStepStart in ms; ReadyForThisStep and CurrentStep are step ids +Workflow ::= Step* /<ReadyForThisStep:int>/ /<NextTrajectory:plan.TrajectoryOuterClass.Trajectory>/ <CurrentStep:LastUpdatedInteger> ; // ReadyForThisStep and CurrentStep are step ids abstract Step ::= <Id:int> ; // Started in ms -MoveToStep : Step ::= <Position:DoublePosition> ; // Position in [m,m,m] +MoveToStep : Step ::= <Position:plan.TrajectoryOuterClass.Trajectory.Position> <Orientation:plan.TrajectoryOuterClass.Trajectory.Orientation> ; // Position in [m,m,m] WorkStep : Step ::= <Duration:long> ; // Duration in ms StartStep : Step ; FinishedStep : Step ; diff --git a/ros2rag.goal/src/main/jastadd/GoalModel.ros2rag b/ros2rag.goal/src/main/jastadd/GoalModel.ros2rag index 8c1da3c6a493ea651fc94180bf110b2957cb794d..448e66a83e17b01f1039f3e36ca17e28a75f3816 100644 --- a/ros2rag.goal/src/main/jastadd/GoalModel.ros2rag +++ b/ros2rag.goal/src/main/jastadd/GoalModel.ros2rag @@ -2,20 +2,20 @@ * Version 2020-05-28 */ // --- update definitions --- -read RobotState.CurrentPosition using ParseRobotState, RobotStateToDoublePosition ; +read RobotState.CurrentPosition using ParseRobotState, RobotStateToTrajectoryPosition ; read RobotState.LastUpdate using TickWhenLinkState ; // Those two roles together encode an attribute-driven rewrite (via mqtt) write Workflow.ReadyForThisStep ; read Workflow.CurrentStep using ParseLastUpdatedInteger ; -write Workflow.NextPosition using CreateTrajectoryMessage, SerializeTrajectory ; +write Workflow.NextTrajectory using SerializeTrajectory ; // --- dependency definitions --- Workflow.ReadyForThisStep canDependOn RobotState.LastUpdate as LastUpdateDependency ; Workflow.ReadyForThisStep canDependOn RobotState.CurrentPosition as PositionDependency ; -Workflow.NextPosition canDependOn Workflow.CurrentStep as OnStepChangeDependency ; +Workflow.NextTrajectory canDependOn Workflow.CurrentStep as OnStepChangeDependency ; // --- mapping definitions --- ParseRobotState maps byte[] bytes to robot.RobotStateOuterClass.RobotState {: @@ -33,24 +33,29 @@ SerializeTrajectory maps plan.TrajectoryOuterClass.Trajectory t to byte[] {: return t.toByteArray(); :} -RobotStateToDoublePosition maps robot.RobotStateOuterClass.RobotState rs to DoublePosition {: +RobotStateToTrajectoryPosition maps robot.RobotStateOuterClass.RobotState rs to plan.TrajectoryOuterClass.Trajectory.Position {: // System.out.println("RobotStateToDoublePosition"); robot.RobotStateOuterClass.RobotState.Position p = rs.getPosition(); - return DoublePosition.of(p.getX(), p.getY(), p.getZ()); + return plan.TrajectoryOuterClass.Trajectory.Position.newBuilder() + .setX(p.getX()) + .setY(p.getY()) + .setZ(p.getZ()) + .build(); :} -CreateTrajectoryMessage maps DoublePosition dp to plan.TrajectoryOuterClass.Trajectory {: - // compute intermediate points at ROS side, not here - return plan.TrajectoryOuterClass.Trajectory.newBuilder() - .addPose(plan.TrajectoryOuterClass.Trajectory.Pose.newBuilder() - .setPosition(plan.TrajectoryOuterClass.Trajectory.Position.newBuilder() - .setX(dp.getX()) - .setY(dp.getY()) - .setZ(dp.getZ()) - .build()) - .build()) - .build(); -:} +// CreateTrajectoryMessage maps DoublePosition dp to plan.TrajectoryOuterClass.Trajectory {: +// // compute intermediate points at ROS side, not here +// return plan.TrajectoryOuterClass.Trajectory.newBuilder() +// .addPose(plan.TrajectoryOuterClass.Trajectory.Pose.newBuilder() +// .setPosition(plan.TrajectoryOuterClass.Trajectory.Position.newBuilder() +// .setX(dp.getX()) +// .setY(dp.getY()) +// .setZ(dp.getZ()) +// .build()) +// .build()) +// .setLooping(true); +// .build(); +// :} ParseLastUpdatedInteger maps int value to LastUpdatedInteger {: return LastUpdatedInteger.of(value); diff --git a/ros2rag.goal/src/main/jastadd/Printing.jrag b/ros2rag.goal/src/main/jastadd/Printing.jrag index b82655bd949e3d45efa6fdf229ef3d840ef8c628..af358c23b8e52bb141d141a985795f67d458a8b3 100644 --- a/ros2rag.goal/src/main/jastadd/Printing.jrag +++ b/ros2rag.goal/src/main/jastadd/Printing.jrag @@ -2,7 +2,9 @@ aspect Printing { syn String Step.prettyPrint() = getId() + ": " + prettyPrint0() + " ->[" + (getSuccessor() == null ? "/" : getSuccessor().getId()) + "]"; syn String Step.prettyPrint0(); eq StartStep.prettyPrint0() = "Start"; - eq MoveToStep.prettyPrint0() = "Move to " + getPosition(); + eq MoveToStep.prettyPrint0() = String.format("Move to pos(% .5f,% .5f,% .5f) ori(%.1f, %.1f, %.1f, %.1f)", + getPosition().getX(),getPosition().getY(),getPosition().getZ(), + getOrientation().getX(),getOrientation().getY(),getOrientation().getZ(),getOrientation().getW()); eq WorkStep.prettyPrint0() = "Work " + getDuration(); eq FinishedStep.prettyPrint0() = "Finish"; } diff --git a/ros2rag.goal/src/main/java/de/tudresden/inf/st/ros2rag/goal/GoalMain.java b/ros2rag.goal/src/main/java/de/tudresden/inf/st/ros2rag/goal/GoalMain.java index b8a4c7c29cb3c35a4d5a026fbacb943754b7d328..fc04dc9aeda6cc79222f1042a2d583abeeb86c6d 100644 --- a/ros2rag.goal/src/main/java/de/tudresden/inf/st/ros2rag/goal/GoalMain.java +++ b/ros2rag.goal/src/main/java/de/tudresden/inf/st/ros2rag/goal/GoalMain.java @@ -6,9 +6,11 @@ import de.tudresden.inf.st.ros2rag.common.Util; import de.tudresden.inf.st.ros2rag.goal.ast.*; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import plan.TrajectoryOuterClass; import java.io.File; import java.io.IOException; +import java.util.Arrays; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -35,17 +37,26 @@ public class GoalMain { for (DataWorkPose dataWorkPose : config.goal_poses) { WorkPose workPose = new WorkPose(); - double[] position = {0, 0, 0}; - String[] positionSplit = dataWorkPose.position.split(" "); - for (int i = 0; i < positionSplit.length; i++) { - position[i] = Double.parseDouble(positionSplit[i]); + String[] position = dataWorkPose.position.split(" "); + String[] orientation = dataWorkPose.orientation.split(" "); + if (position.length != 3) { + logger.error("Found invalid work pose position: {}", Arrays.toString(position)); } - workPose.setPosition(DoublePosition.of(position[0], position[1], position[2])); - workPose.setDuration(Long.parseLong(dataWorkPose.wait)); + if (orientation.length != 4) { + logger.error("Found invalid work pose orientation: {}", Arrays.toString(orientation)); + } + workPose.setPositionX(Double.parseDouble(position[0])); + workPose.setPositionY(Double.parseDouble(position[1])); + workPose.setPositionZ(Double.parseDouble(position[2])); + workPose.setOrientationX(Double.parseDouble(orientation[0])); + workPose.setOrientationY(Double.parseDouble(orientation[1])); + workPose.setOrientationZ(Double.parseDouble(orientation[2])); + workPose.setOrientationW(Double.parseDouble(orientation[3])); + workPose.setDuration(Long.parseLong(dataWorkPose.work)); model.addWorkPose(workPose); } RobotState robotState = new RobotState(); - robotState.setCurrentPosition(DoublePosition.of(0, 0, 0)); + robotState.setCurrentPosition(TrajectoryOuterClass.Trajectory.Position.newBuilder().build()); robotState.setLastUpdate(0); model.setRobotState(robotState); @@ -76,7 +87,7 @@ public class GoalMain { } }, config); // next position is not initialized, so don't send it - model.getWorkflow().connectNextPosition(config.topics.trajectory, false); + model.getWorkflow().connectNextTrajectory(config.topics.trajectory, false); model.getWorkflow().connectCurrentStep(config.topics.nextStep); // initial next step is sent, as soon as this is received, the workflow starts model.getWorkflow().connectReadyForThisStep(config.topics.nextStep, true);