diff --git a/build.gradle b/build.gradle index 5f86f7d094af70ac9fc2241e78dbd8df18c53c4d..1e6f7df9fb271213f83812bc233ae3193af58a44 100644 --- a/build.gradle +++ b/build.gradle @@ -43,4 +43,9 @@ subprojects { testImplementation group: 'org.hamcrest', name: 'hamcrest-junit', version: '2.0.0.0' } + test { + useJUnitPlatform() + maxHeapSize = '1G' + } + } diff --git a/ros2rag.common/build.gradle b/ros2rag.common/build.gradle new file mode 100644 index 0000000000000000000000000000000000000000..6d0657ba2384835d8ffd8cd8f283535753f96822 --- /dev/null +++ b/ros2rag.common/build.gradle @@ -0,0 +1,37 @@ +apply plugin: 'com.google.protobuf' + +sourceCompatibility = 1.8 + +repositories { + jcenter() +} + +buildscript { + repositories.jcenter() + dependencies { + classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.12' + } +} + +sourceSets.main.java.srcDir "src/gen/java" + +dependencies { + implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: "${jackson_version}" + implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: "${jackson_version}" + api group: 'com.google.protobuf', name: 'protobuf-java', version: '3.0.0' +} + +test { + useJUnitPlatform() + + maxHeapSize = '1G' +} + +protobuf { + // create strange directories, so use default here +// generatedFilesBaseDir = "$projectDir/src/gen/java" + protoc { + // The artifact spec for the Protobuf Compiler + artifact = 'com.google.protobuf:protoc:3.0.0' + } +} diff --git a/ros2rag.common/config.yaml b/ros2rag.common/config.yaml index e5c9b018dbe4bab7ffc0124edfb184cb81c48e02..889bf22911b2406af758a9083c57a2ebb8d52a45 100644 --- a/ros2rag.common/config.yaml +++ b/ros2rag.common/config.yaml @@ -1,11 +1,11 @@ panda_mqtt_connector: - server: "tcp://localhost:1883" + server: "tcp://0.0.0.0:1883" robot_speed_factor: .7 robot_planning_mode: "fluid_path" # "fluid_path" or "cartesian_path" - default_trajectory: "<none>" # "square" or "circle", everything else is ignored + default_trajectory: "<none>" # "square" or "circle", everything else is ignored + data_publish_rate: 50.0 # publish every x'th robot state message topics: robotConfig: "robotconfig" - dataConfig: "dataconfig" trajectory: "trajectory" nextStep: "ros2rag/nextStep" zone_size: 0.5 @@ -21,15 +21,16 @@ panda_mqtt_connector: Link4: "panda::panda_link4" Link5: "panda::panda_link5" Link6: "panda::panda_link6" - LeftFinger: "panda::panda_leftfinger" + Link7: "panda::panda_link7" + # LeftFinger: "panda::panda_leftfinger" RightFinger: "panda::panda_rightfinger" end_effectors: panda: - EndEffector: "panda::panda_link7" + EndEffector: "panda::panda_leftfinger" goal_poses: - - position: "0.4 0.3 0.1" + - position: "0.6 0 0.6" wait: "5000" - - position: "0.4 0.0 0.1" + - position: "-0.6 0.0 0.6" wait: "3000" - - position: "0.4 -0.3 0.1" + - position: "0.6 0.0 0.6" wait: "4000" diff --git a/ros2rag.common/proto/dataconfig.proto b/ros2rag.common/proto/dataconfig.proto deleted file mode 100644 index 472b8c6bda8637ec7f637909b33322933a61a053..0000000000000000000000000000000000000000 --- a/ros2rag.common/proto/dataconfig.proto +++ /dev/null @@ -1,13 +0,0 @@ -syntax = "proto3"; - -package config; - -message DataConfig { - - bool enablePosition = 1; - bool enableOrientation = 2; - bool enableTwistLinear = 3; - bool enableTwistAngular = 4; - - int32 publishRate = 5; -} diff --git a/ros2rag.common/proto/linkstate.proto b/ros2rag.common/proto/linkstate.proto deleted file mode 100644 index dc95138ba49f35497f4bdf061496145168292c9d..0000000000000000000000000000000000000000 --- a/ros2rag.common/proto/linkstate.proto +++ /dev/null @@ -1,38 +0,0 @@ -syntax = "proto3"; - -package panda; - -message PandaLinkState { - - string name = 1; - - message Position { - float positionX = 1; - float positionY = 2; - float positionZ = 3; - } - - message Orientation { - float orientationX = 1; - float orientationY = 2; - float orientationZ = 3; - float orientationW = 4; - } - - message TwistLinear { - float twistLinearX = 1; - float twistLinearY = 2; - float twistLinearZ = 3; - } - - message TwistAngular { - float twistAngularX = 1; - float twistAngularY = 2; - float twistAngularZ = 3; - } - - Position pos = 2; - Orientation orient = 3; - TwistLinear tl = 4; - TwistAngular ta = 5; -} diff --git a/ros2rag.common/proto/robotconfig.proto b/ros2rag.common/proto/robotconfig.proto deleted file mode 100644 index c3e0862e0216e5ea00f79966dff8d5ce434f3dac..0000000000000000000000000000000000000000 --- a/ros2rag.common/proto/robotconfig.proto +++ /dev/null @@ -1,16 +0,0 @@ -syntax = "proto3"; - -package config; - -message RobotConfig { - - double speed = 1; - bool loopTrajectory = 2; - - enum PlanningMode { - FLUID = 0; - CARTESIAN = 1; - } - - PlanningMode planningMode = 3; -} diff --git a/ros2rag.common/proto/trajectory.proto b/ros2rag.common/proto/trajectory.proto deleted file mode 100644 index 2724b79c3ba3ed20efa99b6c66e6d415e8f3075d..0000000000000000000000000000000000000000 --- a/ros2rag.common/proto/trajectory.proto +++ /dev/null @@ -1,14 +0,0 @@ -syntax = "proto3"; - -package plan; - -message Trajectory { - - message Position { - double x = 1; - double y = 2; - double z = 3; - } - - repeated Position pos = 1; -} 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 352db521149f5d305ad16dc1d5ec6a2091aea2ab..de0758b209fa013132163c178d911124629ad1e3 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 @@ -1,5 +1,7 @@ package de.tudresden.inf.st.ros2rag.common; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + import java.util.List; import java.util.Map; import java.util.SortedMap; @@ -9,8 +11,10 @@ import java.util.SortedMap; * * @author rschoene - Initial contribution */ +@JsonIgnoreProperties(ignoreUnknown = true) public class DataConfiguration { public ActualConfiguration panda_mqtt_connector; + @JsonIgnoreProperties(ignoreUnknown = true) public static class ActualConfiguration { public String server = "tcp://localhost:1883"; public DataTopics topics; @@ -25,7 +29,6 @@ public class DataConfiguration { } public static class DataTopics { public String robotConfig; - public String dataConfig; public String trajectory; public String nextStep; } diff --git a/ros2rag.common/src/main/java/de/tudresden/inf/st/ros2rag/common/Util.java b/ros2rag.common/src/main/java/de/tudresden/inf/st/ros2rag/common/Util.java index 471c21abdb1a7cf8c5dc0cd193e9db8d542d1209..7c6d930aefa358a24b53be7349e1d667fc681380 100644 --- a/ros2rag.common/src/main/java/de/tudresden/inf/st/ros2rag/common/Util.java +++ b/ros2rag.common/src/main/java/de/tudresden/inf/st/ros2rag/common/Util.java @@ -1,7 +1,13 @@ package de.tudresden.inf.st.ros2rag.common; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; +import com.fasterxml.jackson.dataformat.yaml.YAMLParser; import de.tudresden.inf.st.ros2rag.common.DataConfiguration.ActualConfiguration; +import java.io.File; import java.io.IOException; import java.util.Map; import java.util.SortedMap; @@ -13,6 +19,14 @@ import java.util.SortedMap; */ public class Util { + public static ActualConfiguration parseConfig(File configFile) throws IOException { + System.out.println("Using config file: " + configFile.getAbsolutePath()); + ObjectMapper mapper = new ObjectMapper( + new YAMLFactory().configure(JsonParser.Feature.ALLOW_YAML_COMMENTS, true) + ); + return mapper.readValue(configFile, DataConfiguration.class).panda_mqtt_connector; + } + public static void setMqttHost(SetHost handler, ActualConfiguration config) throws IOException { HostAndPort hostAndPort = split(config.server); handler.setHost(hostAndPort.host, hostAndPort.port); diff --git a/ros2rag.common/src/main/proto/config.proto b/ros2rag.common/src/main/proto/config.proto new file mode 100644 index 0000000000000000000000000000000000000000..38cb5d0a25b02c96dcbdf30f685212ea972feee6 --- /dev/null +++ b/ros2rag.common/src/main/proto/config.proto @@ -0,0 +1,7 @@ +syntax = "proto3"; + +package config; + +message RobotConfig { + double speed = 1; +} \ No newline at end of file diff --git a/ros2rag.common/src/main/proto/robot_state.proto b/ros2rag.common/src/main/proto/robot_state.proto new file mode 100644 index 0000000000000000000000000000000000000000..6630631f16e00493be3f50307c9092e56184e9c6 --- /dev/null +++ b/ros2rag.common/src/main/proto/robot_state.proto @@ -0,0 +1,37 @@ +syntax = "proto3"; + +package robot; + +message RobotState { + + message Position { + double x = 1; + double y = 2; + double z = 3; + } + + message Orientation { + double x = 1; + double y = 2; + double z = 3; + double w = 4; + } + + message LinearTwist { + double x = 1; + double y = 2; + double z = 3; + } + + message AngularTwist { + double x = 1; + double y = 2; + double z = 3; + } + + string name = 1; + Position position = 2; + Orientation orientation = 3; + LinearTwist linear_twist = 4; + AngularTwist angular_twist = 5; +} \ No newline at end of file diff --git a/ros2rag.common/src/main/proto/trajectory.proto b/ros2rag.common/src/main/proto/trajectory.proto new file mode 100644 index 0000000000000000000000000000000000000000..4a7f375e1ae37ba386f45e1149dc38990d0c7a0e --- /dev/null +++ b/ros2rag.common/src/main/proto/trajectory.proto @@ -0,0 +1,33 @@ +syntax = "proto3"; + +package plan; + +message Trajectory { + + message Position { + double x = 1; + double y = 2; + double z = 3; + } + + message Orientation { + double x = 1; + double y = 2; + double z = 3; + double w = 4; + } + + enum PlanningMode { + FLUID = 0; + CARTESIAN = 1; + } + + message Pose { + Position position = 1; + Orientation orientation = 2; + PlanningMode mode = 3; + } + + repeated Pose pose = 1; + bool loop = 2; +} diff --git a/ros2rag.goal/build.gradle b/ros2rag.goal/build.gradle index c6ee36c57fce4032365deb999b3e72393dd31b9c..c124190b772948fa6bdcff959c4fdc68769d793a 100644 --- a/ros2rag.goal/build.gradle +++ b/ros2rag.goal/build.gradle @@ -1,8 +1,5 @@ apply plugin: 'jastadd' apply plugin: 'application' -apply plugin: 'com.google.protobuf' - -sourceCompatibility = 1.8 mainClassName = 'de.tudresden.inf.st.ros2rag.goal.GoalMain' @@ -14,7 +11,6 @@ buildscript { repositories.jcenter() dependencies { classpath 'org.jastadd:jastaddgradle:1.13.3' - classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.12' } } @@ -23,27 +19,16 @@ configurations { } sourceSets.main.java.srcDir "src/gen/java" -jar.manifest.attributes('Main-Class': 'de.tudresden.inf.st.ros2rag.goal.GoalMain') dependencies { implementation project (':ros2rag.base') implementation project (':ros2rag.common') baseRuntimeClasspath project (':ros2rag.base') - api group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: "${jackson_version}" - api group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: "${jackson_version}" - implementation group: 'net.sf.beaver', name: 'beaver-rt', version: '0.9.11' - api group: 'com.google.protobuf', name: 'protobuf-java', version: '3.0.0' api group: 'org.fusesource.mqtt-client', name: 'mqtt-client', version: '1.15' jastadd2 "org.jastadd:jastadd:2.3.4" } -test { - useJUnitPlatform() - - maxHeapSize = '1G' -} - // Input files for relast def relastFiles = ["src/gen/jastadd/Grammar.relast"] @@ -135,12 +120,3 @@ jastadd { // Workflow configuration for phases generateAst.dependsOn relastToJastAdd relastToJastAdd.dependsOn ros2rag - -protobuf { - // create strange directories, so use default here -// generatedFilesBaseDir = "$projectDir/src/gen/java" - protoc { - // The artifact spec for the Protobuf Compiler - artifact = 'com.google.protobuf:protoc:3.0.0' - } -} diff --git a/ros2rag.goal/src/main/jastadd/Computation.jrag b/ros2rag.goal/src/main/jastadd/Computation.jrag index ffa46d6323e2552f36e1da7442991f1fc8c5da61..da1d21fae8d8891b554c8dec90da3e2d2549a4a9 100644 --- a/ros2rag.goal/src/main/jastadd/Computation.jrag +++ b/ros2rag.goal/src/main/jastadd/Computation.jrag @@ -64,7 +64,8 @@ aspect Computation { return currentStep().nextPosition(); } syn DoublePosition Step.nextPosition(); - eq StartStep.nextPosition() = null; // next position should not be called before step is advanced + // 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(); diff --git a/ros2rag.goal/src/main/jastadd/GoalModel.ros2rag b/ros2rag.goal/src/main/jastadd/GoalModel.ros2rag index 188b6bfc7c757c3e1553f260ab6062c65bf026df..8c1da3c6a493ea651fc94180bf110b2957cb794d 100644 --- a/ros2rag.goal/src/main/jastadd/GoalModel.ros2rag +++ b/ros2rag.goal/src/main/jastadd/GoalModel.ros2rag @@ -2,7 +2,7 @@ * Version 2020-05-28 */ // --- update definitions --- -read RobotState.CurrentPosition using ParseLinkState, LinkStateToDoublePosition ; +read RobotState.CurrentPosition using ParseRobotState, RobotStateToDoublePosition ; read RobotState.LastUpdate using TickWhenLinkState ; // Those two roles together encode an attribute-driven rewrite (via mqtt) @@ -18,13 +18,13 @@ Workflow.ReadyForThisStep canDependOn RobotState.CurrentPosition as PositionDepe Workflow.NextPosition canDependOn Workflow.CurrentStep as OnStepChangeDependency ; // --- mapping definitions --- -ParseLinkState maps byte[] bytes to panda.Linkstate.PandaLinkState {: -// System.out.println("ParseLinkState"); - return panda.Linkstate.PandaLinkState.parseFrom(bytes); +ParseRobotState maps byte[] bytes to robot.RobotStateOuterClass.RobotState {: +// System.out.println("ParseRobotState"); + return robot.RobotStateOuterClass.RobotState.parseFrom(bytes); :} TickWhenLinkState maps byte[] bytes to long {: - System.out.println("TickWhenLinkState"); +// System.out.println("TickWhenLinkState"); return System.currentTimeMillis(); :} @@ -33,21 +33,23 @@ SerializeTrajectory maps plan.TrajectoryOuterClass.Trajectory t to byte[] {: return t.toByteArray(); :} -LinkStateToDoublePosition maps panda.Linkstate.PandaLinkState pls to DoublePosition {: - System.out.println("LinkStateToDoublePosition"); - panda.Linkstate.PandaLinkState.Position p = pls.getPos(); - return DoublePosition.of(p.getPositionX(), p.getPositionY(), p.getPositionZ()); +RobotStateToDoublePosition maps robot.RobotStateOuterClass.RobotState rs to DoublePosition {: +// System.out.println("RobotStateToDoublePosition"); + robot.RobotStateOuterClass.RobotState.Position p = rs.getPosition(); + return DoublePosition.of(p.getX(), p.getY(), p.getZ()); :} CreateTrajectoryMessage maps DoublePosition dp to plan.TrajectoryOuterClass.Trajectory {: // compute intermediate points at ROS side, not here return plan.TrajectoryOuterClass.Trajectory.newBuilder() - .addPos(plan.TrajectoryOuterClass.Trajectory.Position.newBuilder() - .setX(dp.getX()) - .setY(dp.getY()) - .setZ(dp.getZ()) - .build()) - .build(); + .addPose(plan.TrajectoryOuterClass.Trajectory.Pose.newBuilder() + .setPosition(plan.TrajectoryOuterClass.Trajectory.Position.newBuilder() + .setX(dp.getX()) + .setY(dp.getY()) + .setZ(dp.getZ()) + .build()) + .build()) + .build(); :} ParseLastUpdatedInteger maps int value to LastUpdatedInteger {: 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 75db6261c62fb5464484a99baf1f032906f5e3af..b8a4c7c29cb3c35a4d5a026fbacb943754b7d328 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 @@ -1,15 +1,11 @@ package de.tudresden.inf.st.ros2rag.goal; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; +import de.tudresden.inf.st.ros2rag.common.DataConfiguration.ActualConfiguration; import de.tudresden.inf.st.ros2rag.common.DataConfiguration.DataWorkPose; import de.tudresden.inf.st.ros2rag.common.Util; import de.tudresden.inf.st.ros2rag.goal.ast.*; -import de.tudresden.inf.st.ros2rag.common.DataConfiguration; -import de.tudresden.inf.st.ros2rag.common.DataConfiguration.ActualConfiguration; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import plan.TrajectoryOuterClass; import java.io.File; import java.io.IOException; @@ -32,9 +28,7 @@ public class GoalMain { // --- No configuration below this line --- - ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); - System.out.println("Using config file: " + configFile.getAbsolutePath()); - ActualConfiguration config = mapper.readValue(configFile, DataConfiguration.class).panda_mqtt_connector; + ActualConfiguration config = Util.parseConfig(configFile); model = new GoalModel(); Util.setMqttHost(model::MqttSetHost, config); diff --git a/ros2rag.goal/src/main/proto b/ros2rag.goal/src/main/proto deleted file mode 120000 index bb7d2bae29902b994e92987325a878a0fe318c69..0000000000000000000000000000000000000000 --- a/ros2rag.goal/src/main/proto +++ /dev/null @@ -1 +0,0 @@ -../../../ros2rag.common/proto/ \ No newline at end of file diff --git a/ros2rag.receiverstub/build.gradle b/ros2rag.receiverstub/build.gradle index da0cc2314042c7ed9d58af5f604d41fbfef3679a..db37ca24aa4b861c2153967a3092f38f685a5dfa 100644 --- a/ros2rag.receiverstub/build.gradle +++ b/ros2rag.receiverstub/build.gradle @@ -1,7 +1,4 @@ apply plugin: 'application' -apply plugin: 'com.google.protobuf' - -sourceCompatibility = 1.8 mainClassName = 'de.tudresden.inf.st.ros2rag.receiverstub.ReceiverMain' @@ -11,30 +8,11 @@ repositories { buildscript { repositories.jcenter() - dependencies { - classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.12' - } } sourceSets.main.java.srcDir "src/gen/java" -jar.manifest.attributes('Main-Class': 'de.tudresden.inf.st.ros2rag.receiverstub.ReceiverMain') dependencies { implementation project(':ros2rag.starter') implementation project(':ros2rag.common') } - -test { - useJUnitPlatform() - - maxHeapSize = '1G' -} - -protobuf { - // create strange directories, so use default here -// generatedFilesBaseDir = "$projectDir/src/gen/java" - protoc { - // The artifact spec for the Protobuf Compiler - artifact = 'com.google.protobuf:protoc:3.0.0' - } -} diff --git a/ros2rag.receiverstub/src/main/java/de/tudresden/inf/st/ros2rag/receiverstub/ReceiverMain.java b/ros2rag.receiverstub/src/main/java/de/tudresden/inf/st/ros2rag/receiverstub/ReceiverMain.java index 8487e621e28b26dd5abc7b78757f797f6f56a411..0ea8aa94ea831952b846cb99bd8451d64ebca12c 100644 --- a/ros2rag.receiverstub/src/main/java/de/tudresden/inf/st/ros2rag/receiverstub/ReceiverMain.java +++ b/ros2rag.receiverstub/src/main/java/de/tudresden/inf/st/ros2rag/receiverstub/ReceiverMain.java @@ -1,20 +1,15 @@ package de.tudresden.inf.st.ros2rag.receiverstub; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import com.google.protobuf.InvalidProtocolBufferException; -import config.Dataconfig.DataConfig; -import config.Robotconfig.RobotConfig; -import de.tudresden.inf.st.ros2rag.starter.ast.MqttHandler; -import de.tudresden.inf.st.ros2rag.common.Util; -import de.tudresden.inf.st.ros2rag.common.DataConfiguration; +import config.Config.RobotConfig; import de.tudresden.inf.st.ros2rag.common.DataConfiguration.ActualConfiguration; +import de.tudresden.inf.st.ros2rag.common.Util; +import de.tudresden.inf.st.ros2rag.starter.ast.MqttHandler; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import panda.Linkstate.PandaLinkState; -import plan.TrajectoryOuterClass; import plan.TrajectoryOuterClass.Trajectory; +import robot.RobotStateOuterClass.RobotState; import java.io.File; import java.io.IOException; @@ -29,10 +24,8 @@ public class ReceiverMain { public static void main(String[] args) throws Exception { ReceiverMain main = new ReceiverMain(); - ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); File configFile = new File(args[0]); - System.out.println("Using config file: " + configFile.getAbsolutePath()); - ActualConfiguration config = mapper.readValue(configFile, DataConfiguration.class).panda_mqtt_connector; + ActualConfiguration config = Util.parseConfig(configFile); main.run(config); } @@ -44,7 +37,6 @@ public class ReceiverMain { Util.setMqttHost(receiver::setHost, config); receiver.waitUntilReady(2, TimeUnit.SECONDS); receiver.newConnection(config.topics.robotConfig, this::printRobotConfig); - receiver.newConnection(config.topics.dataConfig, this::printDataConfig); receiver.newConnection(config.topics.trajectory, this::printTrajectory); receiver.newConnection(config.topics.nextStep, this::printNextStep); @@ -74,29 +66,21 @@ public class ReceiverMain { private void printPandaLinkState(byte[] bytes) { try { logger.debug("Got a joint message, parsing ..."); - PandaLinkState pls = PandaLinkState.parseFrom(bytes); - PandaLinkState.Position tmpPosition = pls.getPos(); - PandaLinkState.Orientation tmpOrientation = pls.getOrient(); - PandaLinkState.TwistLinear tmpTwistLinear = pls.getTl(); - PandaLinkState.TwistAngular tmpTwistAngular = pls.getTa(); + RobotState pls = RobotState.parseFrom(bytes); + RobotState.Position position = pls.getPosition(); + RobotState.Orientation orientation = pls.getOrientation(); + RobotState.LinearTwist linearTwist = pls.getLinearTwist(); + RobotState.AngularTwist angularTwist = pls.getAngularTwist(); // panda::panda_link0: pos(-3.0621333E-8,-1.5197388E-8,3.3411725E-5), orient(0.0,0.0,0.0,0.0), twist-linear(0.0,0.0,0.0), twist-angular(0.0,0.0,0.0) - logger.printf(Level.INFO,topicPattern + ": pos(% .5f,% .5f,% .5f), ori(%.1f,%.1f,%.1f,%.1f)," + + logger.printf(Level.INFO,topicPattern + + ": pos(% .5f,% .5f,% .5f), ori(%.1f,%.1f,%.1f,%.1f)," + " twL(%.1f,%.1f,%.1f), twA(%.1f,%.1f,%.1f)", pls.getName(), - tmpPosition.getPositionX(), - tmpPosition.getPositionY(), - tmpPosition.getPositionZ(), - tmpOrientation.getOrientationX(), - tmpOrientation.getOrientationY(), - tmpOrientation.getOrientationZ(), - tmpOrientation.getOrientationW(), - tmpTwistLinear.getTwistLinearX(), - tmpTwistLinear.getTwistLinearY(), - tmpTwistLinear.getTwistLinearZ(), - tmpTwistAngular.getTwistAngularX(), - tmpTwistAngular.getTwistAngularY(), - tmpTwistAngular.getTwistAngularZ()); + position.getX(), position.getY(), position.getZ(), + orientation.getX(), orientation.getY(), orientation.getZ(), orientation.getW(), + linearTwist.getX(), linearTwist.getY(), linearTwist.getZ(), + angularTwist.getX(), angularTwist.getY(), angularTwist.getZ()); } catch (InvalidProtocolBufferException e) { e.printStackTrace(); } @@ -106,25 +90,7 @@ public class ReceiverMain { try { logger.debug("Got a robotConfig message, parsing ..."); RobotConfig robotConfig = RobotConfig.parseFrom(bytes); - logger.info("robotConfig: speed = {}, loopTrajectory = {}, planningMode = {}", - robotConfig.getSpeed(), - robotConfig.getLoopTrajectory(), - robotConfig.getPlanningMode().toString()); - } catch (InvalidProtocolBufferException e) { - e.printStackTrace(); - } - } - - private void printDataConfig(byte[] bytes) { - try { - logger.debug("Got a dataConfig message, parsing ..."); - DataConfig dataConfig = DataConfig.parseFrom(bytes); - logger.info("dataConfig: position = {}, orientation = {}, twistLinear = {}, twistAngular = {}, publishRate = {}", - dataConfig.getEnablePosition(), - dataConfig.getEnableOrientation(), - dataConfig.getEnableTwistLinear(), - dataConfig.getEnableTwistAngular(), - dataConfig.getPublishRate()); + logger.info("robotConfig: speed = {}", robotConfig.getSpeed()); } catch (InvalidProtocolBufferException e) { e.printStackTrace(); } @@ -135,14 +101,29 @@ public class ReceiverMain { logger.debug("Got a trajectory message, parsing ..."); if (logger.isInfoEnabled()) { Trajectory trajectory = Trajectory.parseFrom(bytes); - StringBuilder sb = new StringBuilder("trajectory:"); - for (Trajectory.Position pos : trajectory.getPosList()) { - sb.append(" pos(") - .append(String.format("% .5f,", pos.getX())) - .append(String.format("% .5f,", pos.getY())) - .append(String.format("% .5f", pos.getZ())) - .append(")"); + StringBuilder sb = new StringBuilder("trajectory: ["); + boolean first = true; + for (Trajectory.Pose pose : trajectory.getPoseList()) { + Trajectory.Position position = pose.getPosition(); + Trajectory.Orientation orientation = pose.getOrientation(); + Trajectory.PlanningMode mode = pose.getMode(); + sb.append(String.format( + "pos(% .5f,% .5f,% .5f), ori(%.1f,%.1f,%.1f,%.1f) plan: %s", + position.getX(), + position.getY(), + position.getZ(), + orientation.getX(), + orientation.getY(), + orientation.getZ(), + orientation.getW(), + mode.name())); + if (first) { + first = false; + } else { + sb.append(" | "); + } } + sb.append("] loop: ").append(trajectory.getLoop()); logger.info(sb.toString()); } } catch (InvalidProtocolBufferException e) { diff --git a/ros2rag.senderstub/build.gradle b/ros2rag.senderstub/build.gradle index 8a0b44120af2f5f4a907533dafc077c5985622bf..063f22ec23add73ccaaf1c50fbab95b2510c425c 100644 --- a/ros2rag.senderstub/build.gradle +++ b/ros2rag.senderstub/build.gradle @@ -1,7 +1,4 @@ apply plugin: 'application' -apply plugin: 'com.google.protobuf' - -sourceCompatibility = 1.8 mainClassName = 'de.tudresden.inf.st.ros2rag.senderstub.SenderMain' @@ -11,31 +8,11 @@ repositories { buildscript { repositories.jcenter() - dependencies { - classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.12' - } } sourceSets.main.java.srcDir "src/gen/java" -jar.manifest.attributes('Main-Class': 'de.tudresden.inf.st.ros2rag.senderstub.SenderMain') dependencies { implementation project(':ros2rag.starter') - - protobuf files("$projectDir/../ros2rag.example/src/main/proto") -} - -test { - useJUnitPlatform() - - maxHeapSize = '1G' -} - -protobuf { - // create strange directories, so use default here -// generatedFilesBaseDir = "$projectDir/src/gen/java" - protoc { - // The artifact spec for the Protobuf Compiler - artifact = 'com.google.protobuf:protoc:3.0.0' - } + implementation project(':ros2rag.common') } diff --git a/ros2rag.senderstub/src/main/java/de/tudresden/inf/st/ros2rag/senderstub/SenderMain.java b/ros2rag.senderstub/src/main/java/de/tudresden/inf/st/ros2rag/senderstub/SenderMain.java index f540f1cc8825fcec1c357c7046ed94e47a24cbe7..e767cdd92c57d713597ddf69c414a0308f24f1e4 100644 --- a/ros2rag.senderstub/src/main/java/de/tudresden/inf/st/ros2rag/senderstub/SenderMain.java +++ b/ros2rag.senderstub/src/main/java/de/tudresden/inf/st/ros2rag/senderstub/SenderMain.java @@ -1,7 +1,7 @@ package de.tudresden.inf.st.ros2rag.senderstub; import de.tudresden.inf.st.ros2rag.starter.ast.MqttHandler; -import panda.Linkstate; +import robot.RobotStateOuterClass.RobotState; import java.nio.file.Files; import java.nio.file.Paths; @@ -47,13 +47,9 @@ public class SenderMain { } private static void publish(MqttHandler sender, String topic, float x, float y, float z) { - Linkstate.PandaLinkState pls = Linkstate.PandaLinkState.newBuilder() + RobotState pls = RobotState.newBuilder() .setName(topic) - .setPos(Linkstate.PandaLinkState.Position.newBuilder() - .setPositionX(x) - .setPositionY(y) - .setPositionZ(z) - .build()) + .setPosition(RobotState.Position.newBuilder().setX(x).setY(y).setZ(z).build()) .build(); final byte[] message = pls.toByteArray(); sender.publish(topic, message); diff --git a/ros2rag.starter/build.gradle b/ros2rag.starter/build.gradle index a2e813046f9481e19f079cb31e47a56daff2d199..88f304aa3177f09de185f0bafe0e507e80a2d919 100644 --- a/ros2rag.starter/build.gradle +++ b/ros2rag.starter/build.gradle @@ -1,8 +1,5 @@ apply plugin: 'jastadd' apply plugin: 'application' -apply plugin: 'com.google.protobuf' - -sourceCompatibility = 1.8 mainClassName = 'de.tudresden.inf.st.ros2rag.starter.StarterMain' @@ -14,7 +11,6 @@ buildscript { repositories.jcenter() dependencies { classpath 'org.jastadd:jastaddgradle:1.13.3' - classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.12' } } @@ -23,28 +19,16 @@ configurations { } sourceSets.main.java.srcDir "src/gen/java" -jar.manifest.attributes('Main-Class': 'de.tudresden.inf.st.ros2rag.starter.StarterMain') dependencies { implementation project (':ros2rag.base') implementation project (':ros2rag.common') baseRuntimeClasspath project (':ros2rag.base') -// implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-xml', version: "${jackson_version}" - api group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: "${jackson_version}" - api group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: "${jackson_version}" - implementation group: 'net.sf.beaver', name: 'beaver-rt', version: '0.9.11' - api group: 'com.google.protobuf', name: 'protobuf-java', version: '3.0.0' api group: 'org.fusesource.mqtt-client', name: 'mqtt-client', version: '1.15' jastadd2 "org.jastadd:jastadd:2.3.4" } -test { - useJUnitPlatform() - - maxHeapSize = '1G' -} - // Input files for relast def relastFiles = ["src/gen/jastadd/Grammar.relast"] @@ -136,12 +120,3 @@ jastadd { // Workflow configuration for phases generateAst.dependsOn relastToJastAdd relastToJastAdd.dependsOn ros2rag - -protobuf { - // create strange directories, so use default here -// generatedFilesBaseDir = "$projectDir/src/gen/java" - protoc { - // The artifact spec for the Protobuf Compiler - artifact = 'com.google.protobuf:protoc:3.0.0' - } -} diff --git a/ros2rag.starter/src/main/jastadd/Definitions.ros2rag b/ros2rag.starter/src/main/jastadd/Definitions.ros2rag index 99aec4416578d7af313846eb2ed33645b58cc358..eff6850999375f3a57e8d74d614da8dd4059da24 100644 --- a/ros2rag.starter/src/main/jastadd/Definitions.ros2rag +++ b/ros2rag.starter/src/main/jastadd/Definitions.ros2rag @@ -1,35 +1,31 @@ -/** - * Version 2020-05-28 - */ +/* Version 2020-07-15 */ // --- update definitions --- -read Link.CurrentPosition using ParseLinkState, LinkStateToIntPosition ; +read Link.CurrentPosition using ParseRobotState, RobotStateToIntPosition ; write RobotArm.AppropriateSpeed using CreateSpeedMessage, SerializeRobotConfig ; // --- dependency definitions --- RobotArm.AppropriateSpeed canDependOn Link.CurrentPosition as dependency1 ; // --- mapping definitions --- -ParseLinkState maps byte[] bytes to panda.Linkstate.PandaLinkState {: -// System.out.println("ParseLinkState"); - return panda.Linkstate.PandaLinkState.parseFrom(bytes); +ParseRobotState maps byte[] bytes to robot.RobotStateOuterClass.RobotState {: +// System.out.println("ParseRobotState"); + return robot.RobotStateOuterClass.RobotState.parseFrom(bytes); :} -SerializeRobotConfig maps config.Robotconfig.RobotConfig rc to byte[] {: +SerializeRobotConfig maps config.Config.RobotConfig rc to byte[] {: // System.out.println("SerializeRobotConfig"); return rc.toByteArray(); :} -LinkStateToIntPosition maps panda.Linkstate.PandaLinkState pls to IntPosition {: -// System.out.println("LinkStateToIntPosition"); - panda.Linkstate.PandaLinkState.Position p = pls.getPos(); - return IntPosition.of((int) (Math.round(p.getPositionX() * 2)), (int) (Math.round(p.getPositionY() * 2)), (int) (Math.round(p.getPositionZ() * 2 - 0.5))); +RobotStateToIntPosition maps robot.RobotStateOuterClass.RobotState rs to IntPosition {: +// System.out.println("RobotStateToIntPosition"); + robot.RobotStateOuterClass.RobotState.Position p = rs.getPosition(); + return IntPosition.of((int) (Math.round(p.getX() * 2)), (int) (Math.round(p.getY() * 2)), (int) (Math.round(p.getZ() * 2 - 0.5))); :} -CreateSpeedMessage maps double speed to config.Robotconfig.RobotConfig {: +CreateSpeedMessage maps double speed to config.Config.RobotConfig {: // System.out.println("CreateSpeedMessage"); - return config.Robotconfig.RobotConfig.newBuilder() + return config.Config.RobotConfig.newBuilder() .setSpeed(speed) - .setLoopTrajectory(true) - .setPlanningMode(config.Robotconfig.RobotConfig.PlanningMode.FLUID) .build(); :} diff --git a/ros2rag.starter/src/main/java/de/tudresden/inf/st/ros2rag/starter/StarterMain.java b/ros2rag.starter/src/main/java/de/tudresden/inf/st/ros2rag/starter/StarterMain.java index 63e9ea7ab7f933b0e6c41b8669c43aef195144f9..7627ac005d67c1332323f95866b5f55703cfb532 100644 --- a/ros2rag.starter/src/main/java/de/tudresden/inf/st/ros2rag/starter/StarterMain.java +++ b/ros2rag.starter/src/main/java/de/tudresden/inf/st/ros2rag/starter/StarterMain.java @@ -1,12 +1,8 @@ package de.tudresden.inf.st.ros2rag.starter; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; -import config.Dataconfig; +import de.tudresden.inf.st.ros2rag.common.DataConfiguration.ActualConfiguration; import de.tudresden.inf.st.ros2rag.common.Util; import de.tudresden.inf.st.ros2rag.starter.ast.*; -import de.tudresden.inf.st.ros2rag.common.DataConfiguration; -import de.tudresden.inf.st.ros2rag.common.DataConfiguration.ActualConfiguration; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -27,14 +23,11 @@ public class StarterMain { private Model model; public void run(String[] args) throws IOException, InterruptedException { - File configFile = new File(args.length == 0 ? "common/config.yaml" : args[0]); + File configFile = new File(args.length == 0 ? "../ros2rag.common/config.yaml" : args[0]); // --- No configuration below this line --- - ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); - System.out.println("Using config file: " + configFile.getAbsolutePath()); - ActualConfiguration config = mapper.readValue(configFile, DataConfiguration.class).panda_mqtt_connector; - + ActualConfiguration config = Util.parseConfig(configFile); model = new Model(); Util.setMqttHost(model::MqttSetHost, config); @@ -68,7 +61,7 @@ public class StarterMain { robotArm.addLink(link); } link.setName(name); - link.setCurrentPosition(makePosition(0, 0, 0)); + link.setCurrentPosition(IntPosition.of(0, 0, 0)); link.containingRobotArm().addDependency1(link); link.connectCurrentPosition(topic); }, config); @@ -87,8 +80,6 @@ public class StarterMain { mainHandler.newConnection("exit", bytes -> exitCondition.countDown()); mainHandler.newConnection("model", bytes -> logStatus(new String(bytes), robotArm)); - sendInitialDataConfig(mainHandler, config.topics.dataConfig); - Runtime.getRuntime().addShutdownHook(new Thread(this::close)); exitCondition.await(); @@ -96,17 +87,6 @@ public class StarterMain { this.close(); } - private void sendInitialDataConfig(MqttHandler mainHandler, String dataConfigTopic) { - Dataconfig.DataConfig dataConfig = Dataconfig.DataConfig.newBuilder() - .setEnablePosition(true) - .setEnableOrientation(false) - .setEnableTwistAngular(false) - .setEnableTwistLinear(false) - .setPublishRate(100) - .build(); - mainHandler.publish(dataConfigTopic, dataConfig.toByteArray(), true); - } - private void logStatus(String prefix, RobotArm robotArm) { StringBuilder sb = new StringBuilder(prefix).append("\n") .append("robotArm.isInSafetyZone: ").append(robotArm.isInSafetyZone()) @@ -119,10 +99,6 @@ public class StarterMain { logger.info(sb.toString()); } - private static IntPosition makePosition(int x, int y, int z) { - return IntPosition.of(x, y, z); - } - private void close() { logger.info("Exiting ..."); mainHandler.close(); diff --git a/ros2rag.starter/src/main/proto b/ros2rag.starter/src/main/proto deleted file mode 120000 index bb7d2bae29902b994e92987325a878a0fe318c69..0000000000000000000000000000000000000000 --- a/ros2rag.starter/src/main/proto +++ /dev/null @@ -1 +0,0 @@ -../../../ros2rag.common/proto/ \ No newline at end of file diff --git a/ros2rag.tests/build.gradle b/ros2rag.tests/build.gradle index 724c10a6b88a941125b36b08b276d95202fbbc95..efff9a553b1da39904b80933df36e4e4d809f526 100644 --- a/ros2rag.tests/build.gradle +++ b/ros2rag.tests/build.gradle @@ -1,7 +1,6 @@ import org.jastadd.relast.plugin.RelastPlugin import org.jastadd.relast.plugin.RelastTest apply plugin: 'jastadd' -apply plugin: 'com.google.protobuf' apply plugin: RelastPlugin sourceCompatibility = 1.8 @@ -14,12 +13,12 @@ buildscript { repositories.jcenter() dependencies { classpath 'org.jastadd:jastaddgradle:1.13.3' - classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.12' } } dependencies { implementation project(':ros2rag.base') + implementation project(':ros2rag.common') runtime group: 'org.jastadd', name: 'jastadd', version: '2.3.4' testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.4.0' @@ -27,7 +26,6 @@ dependencies { testImplementation group: 'org.assertj', name: 'assertj-core', version: '3.12.1' testImplementation group: 'org.fusesource.mqtt-client', name: 'mqtt-client', version: '1.15' testImplementation group: 'net.sf.beaver', name: 'beaver-rt', version: '0.9.11' - testImplementation group: 'com.google.protobuf', name: 'protobuf-java', version: '3.0.0' } test { @@ -57,15 +55,6 @@ sourceSets { } } -protobuf { - // create strange directories, so use default here - generatedFilesBaseDir = "$projectDir/src/test/java-gen/proto" - protoc { - // The artifact spec for the Protobuf Compiler - artifact = 'com.google.protobuf:protoc:3.0.0' - } -} - // --- Test: Example --- task preprocessExampleTest(type: JavaExec, group: 'verification') { doFirst { @@ -221,5 +210,5 @@ testClasses.dependsOn compileRead2Write1Test compileRead2Write1Test.dependsOn preprocessRead2Write1Test clean { - delete 'src/test/02-after-ros2rag/*/', 'src/test/03-after-relast/*/' + delete 'src/test/02-after-ros2rag/*/', 'src/test/03-after-relast/*/', 'src/test/java-gen/*/' } diff --git a/ros2rag.tests/src/test/01-input/example/Test.jadd b/ros2rag.tests/src/test/01-input/example/Test.jadd index c355f57814c9def67657a148a5a28061e2569d28..b62b9aee7cb344c587993feefccdd64ab0bf6e4b 100644 --- a/ros2rag.tests/src/test/01-input/example/Test.jadd +++ b/ros2rag.tests/src/test/01-input/example/Test.jadd @@ -60,14 +60,14 @@ aspect GrammarTypes { inh Model RobotArm.model(); eq Model.getRobotArm().model() = this; - inh RobotArm Joint.containingRobotArm(); - eq RobotArm.getJoint().containingRobotArm() = this; + inh RobotArm Link.containingRobotArm(); + eq RobotArm.getLink().containingRobotArm() = this; eq RobotArm.getEndEffector().containingRobotArm() = this; syn boolean RobotArm.isInSafetyZone() { TestCounter.INSTANCE.numberInSafetyZone += 1; - for (Joint joint : getJointList()) { - if (model().getZoneModel().isInSafetyZone(joint.getCurrentPosition())) { + for (Link link : getLinkList()) { + if (model().getZoneModel().isInSafetyZone(link.getCurrentPosition())) { return true; } } @@ -78,13 +78,7 @@ aspect GrammarTypes { syn boolean ZoneModel.isInSafetyZone(IntPosition pos) { for (Zone sz : getSafetyZoneList()) { for (Coordinate coordinate : sz.getCoordinateList()) { - IntPosition inside = coordinate.getPosition(); - if (inside.getX() <= pos.getX() && - inside.getY() <= pos.getY() && - inside.getZ() <= pos.getZ() && - pos.getX() <= inside.getX() + getSize().getX() && - pos.getY() <= inside.getY() + getSize().getY() && - pos.getZ() <= inside.getZ() + getSize().getZ()) { + if (coordinate.getPosition().equals(pos)) { return true; } } diff --git a/ros2rag.tests/src/test/01-input/example/Test.relast b/ros2rag.tests/src/test/01-input/example/Test.relast index ea347d0ec303a8d3555cd0118d403b53664ffe33..b8d932ae470e4bf3dc433f8610eec1f05016e595 100644 --- a/ros2rag.tests/src/test/01-input/example/Test.relast +++ b/ros2rag.tests/src/test/01-input/example/Test.relast @@ -1,13 +1,13 @@ Model ::= RobotArm ZoneModel ; -ZoneModel ::= <Size:IntPosition> SafetyZone:Zone* ; +ZoneModel ::= SafetyZone:Zone* ; Zone ::= Coordinate* ; -RobotArm ::= Joint* EndEffector /<AppropriateSpeed:double>/ ; +RobotArm ::= Link* EndEffector /<AppropriateSpeed:double>/ ; -Joint ::= <Name:String> <CurrentPosition:IntPosition> ; +Link ::= <Name:String> <CurrentPosition:IntPosition> ; -EndEffector : Joint; +EndEffector : Link; Coordinate ::= <Position:IntPosition> ; diff --git a/ros2rag.tests/src/test/01-input/example/Test.ros2rag b/ros2rag.tests/src/test/01-input/example/Test.ros2rag index 5c929386c01052f3e9cfc2bcd81fe45482ea8446..c916bfdca59f605ed090fa1171dc5e068fe23a8f 100644 --- a/ros2rag.tests/src/test/01-input/example/Test.ros2rag +++ b/ros2rag.tests/src/test/01-input/example/Test.ros2rag @@ -1,31 +1,31 @@ -/* Version 2020-04-17 */ +/* Version 2020-07-15 */ // --- update definitions --- -read Joint.CurrentPosition using ParseLinkState, LinkStateToIntPosition ; +read Link.CurrentPosition using ParseRobotState, RobotStateToIntPosition ; write RobotArm.AppropriateSpeed using CreateSpeedMessage, SerializeRobotConfig ; // --- dependency definitions --- -RobotArm.AppropriateSpeed canDependOn Joint.CurrentPosition as dependency1 ; +RobotArm.AppropriateSpeed canDependOn Link.CurrentPosition as dependency1 ; // --- mapping definitions --- -ParseLinkState maps byte[] bytes to panda.Linkstate.PandaLinkState {: +ParseRobotState maps byte[] bytes to robot.RobotStateOuterClass.RobotState {: TestCounter.INSTANCE.numberParseLinkState += 1; - return panda.Linkstate.PandaLinkState.parseFrom(bytes); + return robot.RobotStateOuterClass.RobotState.parseFrom(bytes); :} -SerializeRobotConfig maps config.Robotconfig.RobotConfig rc to byte[] {: +SerializeRobotConfig maps config.Config.RobotConfig rc to byte[] {: TestCounter.INSTANCE.numberSerializeRobotConfig += 1; return rc.toByteArray(); :} -LinkStateToIntPosition maps panda.Linkstate.PandaLinkState pls to IntPosition {: +RobotStateToIntPosition maps robot.RobotStateOuterClass.RobotState rs to IntPosition {: TestCounter.INSTANCE.numberLinkStateToIntPosition += 1; - panda.Linkstate.PandaLinkState.Position p = pls.getPos(); - return IntPosition.of((int) (10 * p.getPositionX()), (int) (10 * p.getPositionY()), (int) (10 * p.getPositionZ())); + robot.RobotStateOuterClass.RobotState.Position p = rs.getPosition(); + return IntPosition.of((int) (Math.round(p.getX() * 10)), (int) (Math.round(p.getY() * 10)), (int) (Math.round(p.getZ() * 10))); :} -CreateSpeedMessage maps double speed to config.Robotconfig.RobotConfig {: +CreateSpeedMessage maps double speed to config.Config.RobotConfig {: TestCounter.INSTANCE.numberCreateSpeedMessage += 1; - return config.Robotconfig.RobotConfig.newBuilder() + return config.Config.RobotConfig.newBuilder() .setSpeed(speed) .build(); :} diff --git a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/ExampleTest.java b/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/ExampleTest.java index 0315358c9afade8d98b8b09782913ee985d85f2d..9b1ebceb541bddd4cafc3648b10c940af79bc952 100644 --- a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/ExampleTest.java +++ b/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/ExampleTest.java @@ -1,12 +1,12 @@ package org.jastadd.ros2rag.tests; import com.google.protobuf.InvalidProtocolBufferException; -import config.Robotconfig.RobotConfig; +import config.Config.RobotConfig; import example.ast.*; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import panda.Linkstate; +import robot.RobotStateOuterClass.RobotState; import java.io.IOException; import java.util.concurrent.TimeUnit; @@ -26,8 +26,8 @@ public class ExampleTest extends AbstractMqttTest { private Model model; private RobotArm robotArm; - private Joint joint1; - private Joint joint2; + private Link link1; + private Link link2; private MqttHandler handler; private ReceiverData data; @@ -72,7 +72,7 @@ public class ExampleTest extends AbstractMqttTest { // still in safety zone, so no update should have been sent TestUtils.waitForMqtt(); - assertEquals(makePosition(2, 2, 2), joint1.getCurrentPosition()); + assertEquals(makePosition(2, 2, 2), link1.getCurrentPosition()); assertEquals(1, TestCounter.INSTANCE.numberParseLinkState); assertEquals(1, TestCounter.INSTANCE.numberLinkStateToIntPosition); assertEquals(2, TestCounter.INSTANCE.numberInSafetyZone); @@ -86,7 +86,7 @@ public class ExampleTest extends AbstractMqttTest { sendData(TOPIC_JOINT2, 0.3f, 0.4f, 0.5f); TestUtils.waitForMqtt(); - assertEquals(makePosition(3, 4, 5), joint2.getCurrentPosition()); + assertEquals(makePosition(3, 4, 5), link2.getCurrentPosition()); assertEquals(2, TestCounter.INSTANCE.numberParseLinkState); assertEquals(2, TestCounter.INSTANCE.numberLinkStateToIntPosition); assertEquals(3, TestCounter.INSTANCE.numberInSafetyZone); @@ -100,7 +100,7 @@ public class ExampleTest extends AbstractMqttTest { sendData(TOPIC_JOINT2, 0.33f, 0.42f, 0.51f); TestUtils.waitForMqtt(); - assertEquals(makePosition(3, 4, 5), joint2.getCurrentPosition()); + assertEquals(makePosition(3, 4, 5), link2.getCurrentPosition()); assertEquals(3, TestCounter.INSTANCE.numberParseLinkState); assertEquals(3, TestCounter.INSTANCE.numberLinkStateToIntPosition); assertEquals(3, TestCounter.INSTANCE.numberInSafetyZone); @@ -113,7 +113,7 @@ public class ExampleTest extends AbstractMqttTest { sendData(TOPIC_JOINT2, 1.3f, 2.4f, 3.5f); TestUtils.waitForMqtt(); - assertEquals(makePosition(13, 24, 35), joint2.getCurrentPosition()); + assertEquals(makePosition(13, 24, 35), link2.getCurrentPosition()); assertEquals(4, TestCounter.INSTANCE.numberParseLinkState); assertEquals(4, TestCounter.INSTANCE.numberLinkStateToIntPosition); assertEquals(4, TestCounter.INSTANCE.numberInSafetyZone); @@ -142,7 +142,7 @@ public class ExampleTest extends AbstractMqttTest { // still in safety zone, hence, no value should have been sent TestUtils.waitForMqtt(); - assertEquals(makePosition(2, 2, 2), joint1.getCurrentPosition()); + assertEquals(makePosition(2, 2, 2), link1.getCurrentPosition()); assertEquals(1, TestCounter.INSTANCE.numberParseLinkState); assertEquals(1, TestCounter.INSTANCE.numberLinkStateToIntPosition); assertEquals(2, TestCounter.INSTANCE.numberInSafetyZone); @@ -154,7 +154,7 @@ public class ExampleTest extends AbstractMqttTest { sendData(TOPIC_JOINT2, 0.3f, 0.4f, 0.5f); TestUtils.waitForMqtt(); - assertEquals(makePosition(3, 4, 5), joint2.getCurrentPosition()); + assertEquals(makePosition(3, 4, 5), link2.getCurrentPosition()); assertEquals(2, TestCounter.INSTANCE.numberParseLinkState); assertEquals(2, TestCounter.INSTANCE.numberLinkStateToIntPosition); assertEquals(3, TestCounter.INSTANCE.numberInSafetyZone); @@ -168,7 +168,7 @@ public class ExampleTest extends AbstractMqttTest { sendData(TOPIC_JOINT2, 0.33f, 0.42f, 0.51f); TestUtils.waitForMqtt(); - assertEquals(makePosition(3, 4, 5), joint2.getCurrentPosition()); + assertEquals(makePosition(3, 4, 5), link2.getCurrentPosition()); assertEquals(3, TestCounter.INSTANCE.numberParseLinkState); assertEquals(3, TestCounter.INSTANCE.numberLinkStateToIntPosition); assertEquals(3, TestCounter.INSTANCE.numberInSafetyZone); @@ -181,7 +181,7 @@ public class ExampleTest extends AbstractMqttTest { sendData(TOPIC_JOINT2, 1.3f, 2.4f, 3.5f); TestUtils.waitForMqtt(); - assertEquals(makePosition(13, 24, 35), joint2.getCurrentPosition()); + assertEquals(makePosition(13, 24, 35), link2.getCurrentPosition()); assertEquals(4, TestCounter.INSTANCE.numberParseLinkState); assertEquals(4, TestCounter.INSTANCE.numberLinkStateToIntPosition); assertEquals(4, TestCounter.INSTANCE.numberInSafetyZone); @@ -202,12 +202,8 @@ public class ExampleTest extends AbstractMqttTest { } private void sendData(String topic, float x, float y, float z) { - handler.publish(topic, Linkstate.PandaLinkState.newBuilder() - .setPos(Linkstate.PandaLinkState.Position.newBuilder() - .setPositionX(x) - .setPositionY(y) - .setPositionZ(z) - .build()) + handler.publish(topic, RobotState.newBuilder() + .setPosition(RobotState.Position.newBuilder().setX(x).setY(y).setZ(z).build()) .build() .toByteArray() ); @@ -221,8 +217,8 @@ public class ExampleTest extends AbstractMqttTest { assertTrue(handler.waitUntilReady(2, TimeUnit.SECONDS)); // add dependencies - robotArm.addDependency1(joint1); - robotArm.addDependency1(joint2); + robotArm.addDependency1(link1); + robotArm.addDependency1(link2); robotArm.addDependency1(robotArm.getEndEffector()); data = new ReceiverData(); @@ -238,15 +234,14 @@ public class ExampleTest extends AbstractMqttTest { }); robotArm.connectAppropriateSpeed(TOPIC_CONFIG, writeCurrentValue); - joint1.connectCurrentPosition(TOPIC_JOINT1); - joint2.connectCurrentPosition(TOPIC_JOINT2); + link1.connectCurrentPosition(TOPIC_JOINT1); + link2.connectCurrentPosition(TOPIC_JOINT2); } private void createModel() { model = new Model(); ZoneModel zoneModel = new ZoneModel(); - zoneModel.setSize(makePosition(1, 1, 1)); IntPosition firstPosition = makePosition(0, 0, 0); IntPosition secondPosition = makePosition(-1, 0, 0); @@ -261,20 +256,20 @@ public class ExampleTest extends AbstractMqttTest { robotArm = new RobotArm(); - joint1 = new Joint(); - joint1.setName("joint1"); - joint1.setCurrentPosition(firstPosition); + link1 = new Link(); + link1.setName("joint1"); + link1.setCurrentPosition(firstPosition); - joint2 = new Joint(); - joint2.setName("joint2"); - joint2.setCurrentPosition(secondPosition); + link2 = new Link(); + link2.setName("joint2"); + link2.setCurrentPosition(secondPosition); EndEffector endEffector = new EndEffector(); endEffector.setName("gripper"); endEffector.setCurrentPosition(makePosition(2, 2, 3)); - robotArm.addJoint(joint1); - robotArm.addJoint(joint2); + robotArm.addLink(link1); + robotArm.addLink(link2); robotArm.setEndEffector(endEffector); model.setRobotArm(robotArm); }