From 1754194dd2a8449afdc4a572cf77b2ed6e41678d Mon Sep 17 00:00:00 2001
From: Damon Kohler <damonkohler@google.com>
Date: Fri, 9 Nov 2012 13:54:45 +0100
Subject: [PATCH] Adds new tutorial that solves a maze in Stage.

---
 rosjava_tutorial_right_hand_rule/build.gradle |  24 +++++++
 rosjava_tutorial_right_hand_rule/manifest.xml |  10 +++
 .../RightHandRule.java                        |  61 +++++++++++++++++
 .../world/maze-erratic.world                  |  63 ++++++++++++++++++
 .../world/maze.png                            | Bin 0 -> 7098 bytes
 settings.gradle                               |   4 +-
 6 files changed, 160 insertions(+), 2 deletions(-)
 create mode 100644 rosjava_tutorial_right_hand_rule/build.gradle
 create mode 100644 rosjava_tutorial_right_hand_rule/manifest.xml
 create mode 100644 rosjava_tutorial_right_hand_rule/src/main/java/org/ros/rosjava_tutorial_right_hand_rule/RightHandRule.java
 create mode 100644 rosjava_tutorial_right_hand_rule/world/maze-erratic.world
 create mode 100644 rosjava_tutorial_right_hand_rule/world/maze.png

diff --git a/rosjava_tutorial_right_hand_rule/build.gradle b/rosjava_tutorial_right_hand_rule/build.gradle
new file mode 100644
index 00000000..16f16ee3
--- /dev/null
+++ b/rosjava_tutorial_right_hand_rule/build.gradle
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+apply plugin: 'application'
+
+mainClassName = 'org.ros.RosRun'
+
+dependencies {
+  compile project(':rosjava')
+}
+
diff --git a/rosjava_tutorial_right_hand_rule/manifest.xml b/rosjava_tutorial_right_hand_rule/manifest.xml
new file mode 100644
index 00000000..a8cd8f1a
--- /dev/null
+++ b/rosjava_tutorial_right_hand_rule/manifest.xml
@@ -0,0 +1,10 @@
+<package>
+  <description brief="rosjava_tutorial_right_hand_rule">
+     rosjava_tutorial_right_hand_rule is a simple example project that solves a maze in Stage.
+  </description>
+  <author>Damon Kohler</author>
+  <license>Apache 2.0</license>
+  <review status="unreviewed" notes="" />
+  <url>http://ros.org/wiki/rosjava_tutorial_right_hand_rule</url>
+</package>
+
diff --git a/rosjava_tutorial_right_hand_rule/src/main/java/org/ros/rosjava_tutorial_right_hand_rule/RightHandRule.java b/rosjava_tutorial_right_hand_rule/src/main/java/org/ros/rosjava_tutorial_right_hand_rule/RightHandRule.java
new file mode 100644
index 00000000..1bafae60
--- /dev/null
+++ b/rosjava_tutorial_right_hand_rule/src/main/java/org/ros/rosjava_tutorial_right_hand_rule/RightHandRule.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2012 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package org.ros.rosjava_tutorial_right_hand_rule;
+
+import org.ros.message.MessageListener;
+import org.ros.namespace.GraphName;
+import org.ros.node.AbstractNodeMain;
+import org.ros.node.ConnectedNode;
+import org.ros.node.topic.Publisher;
+import org.ros.node.topic.Subscriber;
+
+/**
+ * @author damonkohler@google.com (Damon Kohler)
+ */
+public class RightHandRule extends AbstractNodeMain {
+
+  @Override
+  public GraphName getDefaultNodeName() {
+    return GraphName.of("right_hand_rule");
+  }
+
+  @Override
+  public void onStart(ConnectedNode connectedNode) {
+    final Publisher<geometry_msgs.Twist> publisher =
+        connectedNode.newPublisher("cmd_vel", geometry_msgs.Twist._TYPE);
+    final geometry_msgs.Twist twist = publisher.newMessage();
+    final Subscriber<sensor_msgs.LaserScan> subscriber =
+        connectedNode.newSubscriber("base_scan", sensor_msgs.LaserScan._TYPE);
+    subscriber.addMessageListener(new MessageListener<sensor_msgs.LaserScan>() {
+      @Override
+      public void onNewMessage(sensor_msgs.LaserScan message) {
+        float[] ranges = message.getRanges();
+        float northRange = ranges[ranges.length / 2];
+        float northEastRange = ranges[ranges.length / 3];
+        double linearVelocity = 0.5;
+        double angularVelocity = -0.5;
+        if (northRange < 1. || northEastRange < 1.) {
+          linearVelocity = 0;
+          angularVelocity = 0.5;
+        }
+        twist.getAngular().setZ(angularVelocity);
+        twist.getLinear().setX(linearVelocity);
+        publisher.publish(twist);
+      }
+    });
+  }
+}
diff --git a/rosjava_tutorial_right_hand_rule/world/maze-erratic.world b/rosjava_tutorial_right_hand_rule/world/maze-erratic.world
new file mode 100644
index 00000000..f5b64778
--- /dev/null
+++ b/rosjava_tutorial_right_hand_rule/world/maze-erratic.world
@@ -0,0 +1,63 @@
+define topurg ranger
+(
+	sensor( 			
+    range [ 0.0  30.0 ]
+    fov 270.25
+   samples 1081
+  )
+
+  # generic model properties
+  color "black"
+  size [ 0.05 0.05 0.1 ]
+)
+
+define erratic position
+(
+  size [0.35 0.35 0.25]
+  origin [-0.05 0 0 0]
+  gui_nose 1
+  drive "diff"
+  topurg(pose [ 0.050 0.000 0 0.000 ])
+)
+
+define floorplan model
+(
+  # sombre, sensible, artistic
+  color "gray30"
+
+  # most maps will need a bounding box
+  boundary 0
+
+  gui_nose 0
+  gui_grid 0
+
+  gui_outline 0
+  gripper_return 0
+  fiducial_return 0
+  laser_return 1
+)
+
+# set the resolution of the underlying raytrace model in meters
+resolution 0.02
+
+interval_sim 100  # simulation timestep in milliseconds
+
+window
+( 
+  size [ 500.0 500.0 ] 
+  rotate [ 0.0 0.0 ]
+  scale 10.0 
+)
+
+# load an environment bitmap
+floorplan
+( 
+  name "maze"
+  bitmap "maze.png"
+  size [50.0 50.0 0.5]
+  pose [ 0.0 0.0 0 0.0 ]
+  gui_move 0
+)
+
+# throw in a robot
+erratic( pose [ 1.25 -25.0 0.0 90.0 ] name "era" color "blue")
diff --git a/rosjava_tutorial_right_hand_rule/world/maze.png b/rosjava_tutorial_right_hand_rule/world/maze.png
new file mode 100644
index 0000000000000000000000000000000000000000..ed9ab46dce6f7df6ac425089a154b150c5d2dd90
GIT binary patch
literal 7098
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
XPJ8>(>Y^?K0|SGntDnm{r-UW|Tau@K

literal 0
HcmV?d00001

diff --git a/settings.gradle b/settings.gradle
index 3bb6080f..f6287ece 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -17,5 +17,5 @@
 include 'rosjava_bootstrap', 'rosjava_messages', 'apache_xmlrpc_common',
         'apache_xmlrpc_client', 'apache_xmlrpc_server', 'rosjava',
         'rosjava_geometry', 'rosjava_tutorial_pubsub',
-        'rosjava_tutorial_services', 'rosjava_benchmarks',
-        'rosjava_test', 'docs'
+        'rosjava_tutorial_services', 'rosjava_tutorial_right_hand_rule',
+        'rosjava_benchmarks', 'rosjava_test', 'docs'
-- 
GitLab