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