add docker image and modefiy readme

Signed-off-by: jiangfan wu <jiangfanwu@stu.xjtu.edu.cn>
This commit is contained in:
jiangfan wu 2022-10-31 23:52:36 +08:00
parent 6c0a589102
commit f9cd3a52fc
367 changed files with 131 additions and 94941 deletions

View File

@ -0,0 +1,57 @@
# enviroment core
ARG OWNER=326737089@qq.com
ARG ROOT_CONTAINER=$OWNER/${ROS_DISTRO}-enviroment-core
FROM ubuntu as intermediate
# install git
RUN apt-get update
RUN apt-get install -y git
# add credentials on build
ARG SSH_PRIVATE_KEY
RUN mkdir /root/.ssh/
RUN echo "${SSH_PRIVATE_KEY}" > /root/.ssh/id_rsa
RUN chmod 600 /root/.ssh/id_rsa
# Add git providers to known_hosts
RUN touch /root/.ssh/known_hosts
RUN ssh-keyscan github.com >> /root/.ssh/known_hosts
RUN git clone --branch master git@github.com:tuw-robotics/rosaria.git p3dx/src/rosaria
RUN git clone --branch master git@github.com:tuw-robotics/tuw_p3dx.git p3dx/src/tuw_p3dx
FROM $ROOT_CONTAINER
USER root
ENV PRJ_DIR=${MY_HOME}/projects/p3dx
RUN apt-get update && apt-get -y upgrade
# Install locale and set
RUN apt-get install -y iputils-ping bash-completion
COPY --chown=${MY_USER}:${MY_USER} --from=intermediate /p3dx ${PRJ_DIR}
COPY --chown=${MY_USER}:${MY_USER} --from=intermediate /root/.ssh ${MY_HOME}/.ssh
RUN /bin/bash -c '. /opt/ros/${ROS_DISTRO}/setup.bash; cd ${PRJ_DIR}/; rosdep update; rosdep install -i --from-path src --rosdistro noetic -y'
# ros-${ROS_DISTRO}-hokuyo-node
USER ${MY_USER}
RUN /bin/bash -c '. /opt/ros/${ROS_DISTRO}/setup.bash; cd ${PRJ_DIR}; catkin_make'
RUN echo 'source ${PRJ_DIR}/devel/setup.bash' >> ~/.bashrc
RUN echo 'roslaunch tuw_p3dx aria_twist.launch' >> ~/.bash_history
# clean apt
USER root
RUN rm -rf ${MY_HOME}/.ros
#RUN apt-get autoclean && apt-get autoremove && rm -rf /var/lib/apt/lists/*
USER ${MY_USER}
WORKDIR ${PRJ_DIR}
ENV HOME=${MY_HOME}
COPY --chown=${MY_USER}:${MY_USER} ./cloud.sh /
ENTRYPOINT ["/cloud.sh"]
CMD [/bin/bash]

View File

@ -0,0 +1,8 @@
#!/bin/bash
#script to run with a host network
#export ROS_MASTER_URI=http://$(hostname --ip-address):11311
#export ROS_HOSTNAME=$(hostname --ip-address)
# setup ros environment
source "/opt/ros/$ROS_DISTRO/setup.bash"
source "${PRJ_DIR}/devel/setup.bash"
roslaunch tuw_multi_robot_demo Cloud.launch room:=cave nr_of_robots:=3

View File

@ -1,195 +0,0 @@
cmake_minimum_required(VERSION 2.8.3)
project(tuw_multi_robot_demo)
## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)
## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED)
## System dependencies are found with CMake's conventions
# find_package(Boost REQUIRED COMPONENTS system)
## Uncomment this if the package has a setup.py. This macro ensures
## modules and global scripts declared therein get installed
## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html
# catkin_python_setup()
################################################
## Declare ROS messages, services and actions ##
################################################
## To declare and build messages, services or actions from within this
## package, follow these steps:
## * Let MSG_DEP_SET be the set of packages whose message types you use in
## your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...).
## * In the file package.xml:
## * add a build_depend tag for "message_generation"
## * add a build_depend and a run_depend tag for each package in MSG_DEP_SET
## * If MSG_DEP_SET isn't empty the following dependency has been pulled in
## but can be declared for certainty nonetheless:
## * add a run_depend tag for "message_runtime"
## * In this file (CMakeLists.txt):
## * add "message_generation" and every package in MSG_DEP_SET to
## find_package(catkin REQUIRED COMPONENTS ...)
## * add "message_runtime" and every package in MSG_DEP_SET to
## catkin_package(CATKIN_DEPENDS ...)
## * uncomment the add_*_files sections below as needed
## and list every .msg/.srv/.action file to be processed
## * uncomment the generate_messages entry below
## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...)
## Generate messages in the 'msg' folder
# add_message_files(
# FILES
# Message1.msg
# Message2.msg
# )
## Generate services in the 'srv' folder
# add_service_files(
# FILES
# Service1.srv
# Service2.srv
# )
## Generate actions in the 'action' folder
# add_action_files(
# FILES
# Action1.action
# Action2.action
# )
## Generate added messages and services with any dependencies listed here
# generate_messages(
# DEPENDENCIES
# std_msgs # Or other packages containing msgs
# )
################################################
## Declare ROS dynamic reconfigure parameters ##
################################################
## To declare and build dynamic reconfigure parameters within this
## package, follow these steps:
## * In the file package.xml:
## * add a build_depend and a run_depend tag for "dynamic_reconfigure"
## * In this file (CMakeLists.txt):
## * add "dynamic_reconfigure" to
## find_package(catkin REQUIRED COMPONENTS ...)
## * uncomment the "generate_dynamic_reconfigure_options" section below
## and list every .cfg file to be processed
## Generate dynamic reconfigure parameters in the 'cfg' folder
# generate_dynamic_reconfigure_options(
# cfg/DynReconf1.cfg
# cfg/DynReconf2.cfg
# )
###################################
## catkin specific configuration ##
###################################
## The catkin_package macro generates cmake config files for your package
## Declare things to be passed to dependent projects
## INCLUDE_DIRS: uncomment this if your package contains header files
## LIBRARIES: libraries you create in this project that dependent projects also need
## CATKIN_DEPENDS: catkin_packages dependent projects also need
## DEPENDS: system dependencies of this project that dependent projects also need
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES tuw_multi_robot_demo
# CATKIN_DEPENDS other_catkin_pkg
# DEPENDS system_lib
)
###########
## Build ##
###########
## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
# include
# ${catkin_INCLUDE_DIRS}
)
## Declare a C++ library
# add_library(${PROJECT_NAME}
# src/${PROJECT_NAME}/tuw_multi_robot_demo.cpp
# )
## Add cmake target dependencies of the library
## as an example, code may need to be generated before libraries
## either from message generation or dynamic reconfigure
# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
## Declare a C++ executable
## With catkin_make all packages are built within a single CMake context
## The recommended prefix ensures that target names across packages don't collide
# add_executable(${PROJECT_NAME}_node src/tuw_multi_robot_demo_node.cpp)
## Rename C++ executable without prefix
## The above recommended prefix causes long target names, the following renames the
## target back to the shorter version for ease of user use
## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node"
# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")
## Add cmake target dependencies of the executable
## same as for the library above
# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
## Specify libraries to link a library or executable target against
# target_link_libraries(${PROJECT_NAME}_node
# ${catkin_LIBRARIES}
# )
#############
## Install ##
#############
# all install targets should use catkin DESTINATION variables
# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html
## Mark executable scripts (Python etc.) for installation
## in contrast to setup.py, you can choose the destination
# install(PROGRAMS
# scripts/my_python_script
# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )
## Mark executables and/or libraries for installation
# install(TARGETS ${PROJECT_NAME} ${PROJECT_NAME}_node
# ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
# LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
# RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )
## Mark cpp header files for installation
# install(DIRECTORY include/${PROJECT_NAME}/
# DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
# FILES_MATCHING PATTERN "*.h"
# PATTERN ".svn" EXCLUDE
# )
## Mark other files for installation (e.g. launch and bag files, etc.)
# install(FILES
# # myfile1
# # myfile2
# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
# )
#############
## Testing ##
#############
## Add gtest based cpp test target and link libraries
# catkin_add_gtest(${PROJECT_NAME}-test test/test_tuw_multi_robot_demo.cpp)
# if(TARGET ${PROJECT_NAME}-test)
# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME})
# endif()
## Add folders to be run by python nosetests
# catkin_add_nosetests(test)

View File

@ -1,6 +0,0 @@
map_topic: "/map"
map_inflation: 0.1
segments_topic: "/segments"
segment_length: 0.6
opt_crossings: 0.2
opt_end_segments: 0.5

View File

@ -1,6 +0,0 @@
map_topic: "/map"
map_smoothing: 5
segments_topic: "/segments"
segment_length: 0.7
crossingOptimization: 0.2
endSegmentOptimization: 0.4

View File

@ -1,6 +0,0 @@
image: map.pgm
resolution: 0.032
origin: [-8.000000, -8.000000, 0.000000]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.196

View File

@ -1,167 +0,0 @@
define hokuyolaser ranger
(
sensor(
# laser-specific properties
# factory settings for LMS200
range [ 0.0 5.0 ]
fov 270.0
samples 270
)
model
(
# generic model properties
size [ 0.07 0.07 0.05 ] # dimensions from LMS200 data sheet
color "blue"
obstacle_return 0
)
)
define floorplan model
(
# sombre, sensible, artistic
color "gray30"
# most maps will need a bounding box
boundary 1
gui_nose 0
gui_grid 0
obstacle_return 1
gui_outline 0
gripper_return 0
fiducial_return 0
laser_return 1
)
define background model
(
# sombre, sensible, artistic
color "red"
# most maps will need a bounding box
boundary 1
gui_nose 0
gui_grid 0
obstacle_return 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 [ 635.000 666.000 ] # in pixels
scale 36.995 # pixels per meter
center [ 0 0 ]
rotate [ 0 0 ]
show_data 1 # 1=on 0=off
)
# load an environment bitmap
floorplan
(
name "cave"
bitmap "map.pgm"
size [16.0 16.0 0]
pose [ 0 0 0 0 ]
)
define pioneer_base position
(
color "red" # Default color.
drive "diff" # Differential steering model.
gui_nose 0 # Draw a nose on the robot so we can see which way it points
obstacle_return 0 # Can hit things.
ranger_return 0.5 # reflects sonar beams
blob_return 1 # Seen by blobfinders
fiducial_return 1 # Seen as "1" fiducial finders
localization "gps"
localization_origin [0 0 0 0] # Start odometry at (0, 0, 0).
# alternative odometric localization with simple error model
# localization "odom" # Change to "gps" to have impossibly perfect, global odometry
# odom_error [ 0.05 0.05 0.1 ] # Odometry error or slip in X, Y and Theta
# (Uniform random distribution)
# four DOF kinematics limits
# [ xmin xmax ymin ymax zmin zmax amin amax ]
velocity_bounds [-1 1 0 0 0 0 -45.0 45.0 ]
acceleration_bounds [-1.0 1.0 0 0 0 0 -45 45.0 ]
)
define pioneer2dx_base_no_sonar pioneer_base
(
# actual size
size [0.44 0.38 0.22] # sizes from MobileRobots' web site
# the pioneer's center of rotation is offset from its center of area
origin [-0.04 0 0 0]
# draw a nose on the robot so we can see which way it points
gui_nose 0
# estimated mass in KG
mass 23.0
)
# as above, but with front sonar only
define pioneer2dx_no_sonar pioneer2dx_base_no_sonar
(
# simplified Body shape:
block(
points 8
point[0] [-0.2 0.12]
point[1] [-0.2 -0.12]
point[2] [-0.12 -0.2555]
point[3] [0.12 -0.2555]
point[4] [0.2 -0.12]
point[5] [0.2 0.12]
point[6] [0.12 0.2555]
point[7] [-0.12 0.2555]
z [0 0.22]
)
)
pioneer2dx_no_sonar
(
# can refer to the robot by this name
name "robot_0"
color "red"
pose [ -6 -6 0 45 ]
hokuyolaser(pose [ 0.225 0.000 -0.15 0.000 ])
)
pioneer2dx_no_sonar
(
# can refer to the robot by this name
name "robot_1"
color "blue"
pose [ 0 -6 0 45 ]
hokuyolaser(pose [ 0.225 0.000 -0.15 0.000 ])
)
pioneer2dx_no_sonar
(
# can refer to the robot by this name
name "robot_2"
color "green"
pose [ 6 6 0 45 ]
hokuyolaser(pose [ 0.225 0.000 -0.15 0.000 ])
)

View File

@ -1,3 +0,0 @@
use_segment_as_goal: true
allow_endpoint_off_segments: true
path_optimization_segment_no: 0

View File

@ -1,3 +0,0 @@
use_segment_as_goal: false
allow_endpoint_off_segments: true
path_optimization_segment_no: 1

View File

@ -1,3 +0,0 @@
use_segment_as_goal: true
allow_endpoint_off_segments: true
path_optimization_segment_no: 0

View File

@ -1,3 +0,0 @@
use_segment_as_goal: false
allow_endpoint_off_segments: true
path_optimization_segment_no: 1

View File

@ -1,5 +0,0 @@
robot_names: ["r1"]
robot_radius: [0.45]
use_segment_as_goal: false
allow_endpoint_off_segments: true
path_optimization_segment_no: 1

View File

@ -1,4 +0,0 @@
robot_name: r0
use_segment_as_goal: true
allow_endpoint_off_segments: true
path_optimization_segment_no: 0

View File

@ -1,4 +0,0 @@
robot_name: robot_0
use_segment_as_goal: true
allow_endpoint_off_segments: true
path_optimization_segment_no: 0

View File

@ -1,3 +0,0 @@
use_segment_as_goal: false
allow_endpoint_off_segments: true
path_optimization_segment_no: 1

View File

@ -1,3 +0,0 @@
use_segment_as_goal: false
allow_endpoint_off_segments: true
path_optimization_segment_no: 1

View File

@ -1,160 +0,0 @@
Panels:
- Class: rviz/Displays
Help Height: 78
Name: Displays
Property Tree Widget:
Expanded:
- /Global Options1
- /Status1
- /MultiRobotInfo1
- /RobotGoalArray1
Splitter Ratio: 0.5
Tree Height: 549
- Class: rviz/Selection
Name: Selection
- Class: rviz/Tool Properties
Expanded:
- /2D Pose Estimate1
- /2D Nav Goal1
- /Publish Point1
- /Goal Selector1
Name: Tool Properties
Splitter Ratio: 0.5886790156364441
- Class: rviz/Views
Expanded:
- /Current View1
Name: Views
Splitter Ratio: 0.5
- Class: rviz/Time
Experimental: false
Name: Time
SyncMode: 0
SyncSource: ""
Preferences:
PromptSaveOnExit: true
Visualization Manager:
Class: ""
Displays:
- Alpha: 0.5
Cell Size: 1
Class: rviz/Grid
Color: 160; 160; 164
Enabled: true
Line Style:
Line Width: 0.029999999329447746
Value: Lines
Name: Grid
Normal Cell Count: 0
Offset:
X: 0
Y: 0
Z: 0
Plane: XY
Plane Cell Count: 10
Reference Frame: <Fixed Frame>
Value: true
- Alpha: 0.699999988079071
Class: rviz/Map
Color Scheme: map
Draw Behind: false
Enabled: true
Name: Map
Topic: /map
Unreliable: false
Use Timestamp: false
Value: true
- Class: VoronoiGraph
Enabled: true
History Length: 1
Name: VoronoiGraph
Path Color: 50; 51; 204
Path Points Scale: 0.10000000149011612
Topic: /segments
Unreliable: false
Value: true
- Class: MultiRobotInfo
Color Pose: 204; 51; 0
Enabled: false
Keep Alive (s): 5
Keep Measurements: 5
Name: MultiRobotInfo
Robots:
{}
Scale Pose: 1
Topic: /robot_info
Unreliable: false
Value: false
- Class: RobotGoalArray
Color Pose: 78; 154; 6
Enabled: true
Name: RobotGoalArray
Scale Pose: 1
Topic: goals
Unreliable: false
Value: true
Enabled: true
Global Options:
Background Color: 48; 48; 48
Default Light: true
Fixed Frame: map
Frame Rate: 30
Name: root
Tools:
- Class: rviz/Interact
Hide Inactive Objects: true
- Class: rviz/MoveCamera
- Class: rviz/Select
- Class: rviz/FocusCamera
- Class: rviz/Measure
- Class: rviz/SetInitialPose
Topic: /initialpose
- Class: rviz/SetGoal
Topic: /move_base_simple/goal
- Class: rviz/PublishPoint
Single click: true
Topic: /clicked_point
- Class: Goal Selector
No. robtos: 3
Robot Goals:
{}
Robot Names:
Robot 0: robot_0
Robot 1: robot_1
Robot 2: robot_2
Value: true
Views:
Current:
Angle: 0
Class: rviz/TopDownOrtho
Enable Stereo Rendering:
Stereo Eye Separation: 0.05999999865889549
Stereo Focal Distance: 1
Swap Stereo Eyes: false
Value: false
Invert Z Axis: false
Name: Current View
Near Clip Distance: 0.009999999776482582
Scale: 14.808070182800293
Target Frame: <Fixed Frame>
Value: TopDownOrtho (rviz)
X: 1.6745421886444092
Y: 0.623544454574585
Saved: ~
Window Geometry:
Displays:
collapsed: false
Height: 846
Hide Left Dock: false
Hide Right Dock: false
QMainWindow State: 000000ff00000000fd000000040000000000000156000002b0fc0200000008fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005c00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000003d000002b0000000c900fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261000000010000010f000002b0fc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073000000003d000002b0000000a400fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000004b00000003efc0100000002fb0000000800540069006d00650100000000000004b00000025600fffffffb0000000800540069006d0065010000000000000450000000000000000000000354000002b000000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000
Selection:
collapsed: false
Time:
collapsed: false
Tool Properties:
collapsed: false
Views:
collapsed: false
Width: 1200
X: 601
Y: 131

View File

@ -1,23 +0,0 @@
<?xml version="1.0"?>
<launch>
<arg name="room" default="cave" />
<arg name="file" default="goals000.txt" />
<arg name="run_once" default="true" />
<arg name="loop_rate" default="1.0" />
<!-- Use this parameters if you like to run over a patch of goal file starting with goals000.txt to goals999.txt
<arg name="file" default="goals" />
<arg name="run_once" default="false" />
<arg name="loop_rate" default="1.0" />
-->
<!-- This node only reads the dxf and stores it a graph in a folder structrue usabe by the graph_generator -->
<node pkg="tuw_multi_robot_goal_generator" type="goals_server" name="goals_server">
<param name="file_name" value="$(find tuw_multi_robot_demo)/cfg/goals/$(arg room)/$(arg file)" />
<param name="run_once" value="$(arg run_once)" />
<param name="loop_rate" value="$(arg loop_rate)" />
</node>
</launch>

View File

@ -1,13 +0,0 @@
<?xml version="1.0"?>
<launch>
<!-- a map server must publish the map of the room <gridmal> first -->
<arg name="cfg" default="cave" />
<arg name="custom_graph_path" default="" /> <!-- used only on dxf generated graphs with the full path name such as /home/.../cache/graph -->
<node pkg="tuw_voronoi_graph" type="tuw_voronoi_graph_node" name="graph_generator" output="screen">
<param name="graph_cache_path" value="$(find tuw_multi_robot_demo)/cfg/graph/$(arg cfg)/cache/" />
<param name="custom_graph_path" value="$(arg custom_graph_path)" />
<rosparam command="load" file="$(find tuw_multi_robot_demo)/cfg/graph/$(arg cfg)/graph.yaml"/>
</node>
</launch>

View File

@ -1,7 +0,0 @@
<?xml version="1.0"?>
<launch>
<arg name="room" default="cave" />
<node pkg="map_server" type="map_server" name="map_server" args="$(find tuw_multi_robot_demo)/cfg/maps/$(arg room)/map.yaml"/>
</launch>

View File

@ -1,32 +0,0 @@
<?xml version="1.0"?>
<launch>
<arg name="cfg" default="default" />
<arg name="use_gdb" default="false" />
<arg name="priority_rescheduling" default="true" />
<arg name="speed_rescheduling" default="true" />
<arg name="collision_resolver" default="2" />
<arg name="publish_routing_table" default="true" />
<group if="$(arg use_gdb)">
<node launch-prefix="gdb -ex run --args" pkg="tuw_multi_robot_router" type="tuw_multi_robot_router_node" name="multi_robot_router" output="screen">
<param name="priority_rescheduling" value="$(arg priority_rescheduling)" />
<param name="speed_rescheduling" value="$(arg speed_rescheduling)" />
<param name="collision_resolver" value="$(arg collision_resolver)" />
<param name="publish_routing_table" value="$(arg publish_routing_table)" />
<rosparam command="load" file="$(find tuw_multi_robot_demo)/cfg/multi_robot_planner/$(arg cfg)/multi_robot.yaml" />
</node>
</group>
<group unless="$(arg use_gdb)">
<node pkg="tuw_multi_robot_router" type="tuw_multi_robot_router_node" name="multi_robot_router" output="screen">
<param name="priority_rescheduling" value="$(arg priority_rescheduling)" />
<param name="speed_rescheduling" value="$(arg speed_rescheduling)" />
<param name="collision_resolver" value="$(arg collision_resolver)" />
<param name="publish_routing_table" value="$(arg publish_routing_table)" />
<rosparam command="load" file="$(find tuw_multi_robot_demo)/cfg/multi_robot_planner/$(arg cfg)/multi_robot.yaml" />
</node>
</group>
</launch>

View File

@ -1,6 +0,0 @@
<?xml version="1.0"?>
<launch>
<arg name="cfg" default="default"/>
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find tuw_multi_robot_demo)/cfg/rviz/$(arg cfg).rviz" output="screen"/>
<!--<node pkg="rviz" type="rviz" name="rviz" output="screen"/> -->
</launch>

View File

@ -1,6 +0,0 @@
<?xml version="1.0"?>
<launch>
<arg name="room" default="cave"/>
<node pkg="stage_ros" type="stageros" name="stageros" args="$(find tuw_multi_robot_demo)/cfg/maps/$(arg room)/stage.world" output="screen"/>
</launch>

View File

@ -1,37 +0,0 @@
header:
seq: 0
stamp:
secs: 0
nsecs: 0
frame_id: ''
poses:
- id: ''
position:
x: -7.0
y: 1.0
z: 0.0
orientation:
x: 0.0
y: 0.0
z: 0.0
w: 0.0
- id: ''
position:
x: -4.0
y: -4.0
z: 0.0
orientation:
x: 0.0
y: 0.0
z: 0.0
w: 0.0
- id: ''
position:
x: 6.0
y: -3.0
z: 0.0
orientation:
x: 0.0
y: 0.0
z: 0.0
w: 0.0

View File

@ -1,11 +0,0 @@
<launch>
<arg name="robot_name" default="p3dx" />
<arg name="cfg" default="default" />
<node pkg="tuw_voronoi_map" type="tuw_voronoi_map_generator" name="tuw_segment_multi_robot_planner" output="screen">
<param name="map_name" value="voronoi_map"/>
</node>
</launch>

View File

@ -1,64 +0,0 @@
<?xml version="1.0"?>
<package>
<name>tuw_multi_robot_demo</name>
<version>0.0.0</version>
<description>Contains launch and config files to run a sample demo. </description>
<!-- One maintainer tag required, multiple allowed, one person per tag -->
<!-- Example: -->
<!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->
<maintainer email="benjamin.binder@tuwien.ac.at">Benjamin Binder</maintainer>
<maintainer email="markus.bader@tuwien.ac.at">Markus Bader</maintainer>
<maintainer email="florian.beck@tuwien.ac.at">Florian Beck</maintainer>
<!-- One license tag required, multiple allowed, one license per tag -->
<!-- Commonly used license strings: -->
<!-- BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->
<license>BSD</license>
<!-- Url tags are optional, but multiple are allowed, one per tag -->
<!-- Optional attribute type can be: website, bugtracker, or repository -->
<!-- Example: -->
<!-- <url type="website">http://wiki.ros.org/tuw_multi_robot_demo</url> -->
<!-- Author tags are optional, multiple are allowed, one per tag -->
<!-- Authors do not have to be maintainers, but could be -->
<!-- Example: -->
<!-- <author email="jane.doe@example.com">Jane Doe</author> -->
<author email="benjamin.binder@tuwien.ac.at">Benjamin Binder</author>
<!-- The *depend tags are used to specify dependencies -->
<!-- Dependencies can be catkin packages or system dependencies -->
<!-- Examples: -->
<!-- Use depend as a shortcut for packages that are both build and exec dependencies -->
<!-- <depend>roscpp</depend> -->
<!-- Note that this is equivalent to the following: -->
<!-- <build_depend>roscpp</build_depend> -->
<!-- <exec_depend>roscpp</exec_depend> -->
<!-- Use build_depend for packages you need at compile time: -->
<!-- <build_depend>message_generation</build_depend> -->
<!-- Use build_export_depend for packages you need in order to build against this package: -->
<!-- <build_export_depend>message_generation</build_export_depend> -->
<!-- Use buildtool_depend for build tool packages: -->
<!-- <buildtool_depend>catkin</buildtool_depend> -->
<!-- Use exec_depend for packages you need at runtime: -->
<!-- <exec_depend>message_runtime</exec_depend> -->
<!-- Use test_depend for packages you need only for testing: -->
<!-- <test_depend>gtest</test_depend> -->
<!-- Use doc_depend for packages you need only for building documentation: -->
<!-- <doc_depend>doxygen</doc_depend> -->
<buildtool_depend>catkin</buildtool_depend>
<run_depend>map_server</run_depend>
<run_depend>stage_ros</run_depend>
<!-- The export tag contains other, unspecified, tags -->
<export>
<!-- Other tools can request additional information be placed here -->
</export>
</package>

View File

@ -1,203 +0,0 @@
cmake_minimum_required(VERSION 2.8.3)
project(tuw_multi_robot_goal_generator)
## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)
add_compile_options(-std=c++17)
## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
nav_msgs
roscpp
tuw_geometry
tuw_multi_robot_msgs
)
## System dependencies are found with CMake's conventions
find_package(Boost REQUIRED COMPONENTS system)
## Uncomment this if the package has a setup.py. This macro ensures
## modules and global scripts declared therein get installed
## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html
# catkin_python_setup()
################################################
## Declare ROS messages, services and actions ##
################################################
## To declare and build messages, services or actions from within this
## package, follow these steps:
## * Let MSG_DEP_SET be the set of packages whose message types you use in
## your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...).
## * In the file package.xml:
## * add a build_depend tag for "message_generation"
## * add a build_depend and a exec_depend tag for each package in MSG_DEP_SET
## * If MSG_DEP_SET isn't empty the following dependency has been pulled in
## but can be declared for certainty nonetheless:
## * add a exec_depend tag for "message_runtime"
## * In this file (CMakeLists.txt):
## * add "message_generation" and every package in MSG_DEP_SET to
## find_package(catkin REQUIRED COMPONENTS ...)
## * add "message_runtime" and every package in MSG_DEP_SET to
## catkin_package(CATKIN_DEPENDS ...)
## * uncomment the add_*_files sections below as needed
## and list every .msg/.srv/.action file to be processed
## * uncomment the generate_messages entry below
## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...)
## Generate messages in the 'msg' folder
# add_message_files(
# FILES
# Message1.msg
# Message2.msg
# )
## Generate services in the 'srv' folder
# add_service_files(
# FILES
# Service1.srv
# Service2.srv
# )
## Generate actions in the 'action' folder
# add_action_files(
# FILES
# Action1.action
# Action2.action
# )
## Generate added messages and services with any dependencies listed here
# generate_messages(
# DEPENDENCIES
# nav_msgs# tuw_multi_robot_msgs
# )
################################################
## Declare ROS dynamic reconfigure parameters ##
################################################
## To declare and build dynamic reconfigure parameters within this
## package, follow these steps:
## * In the file package.xml:
## * add a build_depend and a exec_depend tag for "dynamic_reconfigure"
## * In this file (CMakeLists.txt):
## * add "dynamic_reconfigure" to
## find_package(catkin REQUIRED COMPONENTS ...)
## * uncomment the "generate_dynamic_reconfigure_options" section below
## and list every .cfg file to be processed
## Generate dynamic reconfigure parameters in the 'cfg' folder
# generate_dynamic_reconfigure_options(
# cfg/DynReconf1.cfg
# cfg/DynReconf2.cfg
# )
###################################
## catkin specific configuration ##
###################################
## The catkin_package macro generates cmake config files for your package
## Declare things to be passed to dependent projects
## INCLUDE_DIRS: uncomment this if your package contains header files
## LIBRARIES: libraries you create in this project that dependent projects also need
## CATKIN_DEPENDS: catkin_packages dependent projects also need
## DEPENDS: system dependencies of this project that dependent projects also need
catkin_package(
INCLUDE_DIRS include
LIBRARIES tuw_multi_robot_goal_generator
CATKIN_DEPENDS nav_msgs roscpp tuw_geometry tuw_multi_robot_msgs
# DEPENDS system_lib
)
###########
## Build ##
###########
## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
include
${catkin_INCLUDE_DIRS}
)
## Declare a C++ library
# add_library(${PROJECT_NAME}
# src/${PROJECT_NAME}/tuw_multi_robot_goal_generator.cpp
# )
## Add cmake target dependencies of the library
## as an example, code may need to be generated before libraries
## either from message generation or dynamic reconfigure
# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
## Declare a C++ executable
## With catkin_make all packages are built within a single CMake context
## The recommended prefix ensures that target names across packages don't collide
add_executable(goals_random src/multi_robot_goal_generator_node.cpp)
add_executable(goals_saver src/multi_robot_goal_saver_node.cpp src/multi_robot_goal_handler.cpp)
add_executable(goals_server src/multi_robot_goal_server_node.cpp src/multi_robot_goal_handler.cpp)
## Rename C++ executable without prefix
## The above recommended prefix causes long target names, the following renames the
## target back to the shorter version for ease of user use
## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node"
# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")
## Add cmake target dependencies of the executable
## same as for the library above
# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
## Specify libraries to link a library or executable target against
target_link_libraries(goals_random ${catkin_LIBRARIES} )
target_link_libraries(goals_saver ${catkin_LIBRARIES} )
target_link_libraries(goals_server ${catkin_LIBRARIES} )
#############
## Install ##
#############
# all install targets should use catkin DESTINATION variables
# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html
## Mark executable scripts (Python etc.) for installation
## in contrast to setup.py, you can choose the destination
# install(PROGRAMS
# scripts/my_python_script
# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )
## Mark executables and/or libraries for installation
# install(TARGETS ${PROJECT_NAME} ${PROJECT_NAME}_node
# ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
# LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
# RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )
## Mark cpp header files for installation
# install(DIRECTORY include/${PROJECT_NAME}/
# DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
# FILES_MATCHING PATTERN "*.h"
# PATTERN ".svn" EXCLUDE
# )
## Mark other files for installation (e.g. launch and bag files, etc.)
# install(FILES
# # myfile1
# # myfile2
# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
# )
#############
## Testing ##
#############
## Add gtest based cpp test target and link libraries
# catkin_add_gtest(${PROJECT_NAME}-test test/test_tuw_multi_robot_goal_generator.cpp)
# if(TARGET ${PROJECT_NAME}-test)
# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME})
# endif()
## Add folders to be run by python nosetests
# catkin_add_nosetests(test)

View File

@ -1,41 +0,0 @@
#ifndef TUW_RANDOM_GOAL_GENERATOR_NODE_H
#define TUW_RANDOM_GOAL_GENERATOR_NODE_H
#include <ros/ros.h>
#include "nav_msgs/OccupancyGrid.h"
#include "tuw_multi_robot_msgs/RobotGoalsArray.h"
#include "tuw_geometry/grid_map.h"
/**
* class to cover the ros communication
**/
class RadomGoalGeneratorNode {
public:
RadomGoalGeneratorNode ( ros::NodeHandle & n ); /// Constructor
void publish (); /// publishes the motion commands
void callback(const nav_msgs::OccupancyGrid::ConstPtr& msg);
private:
ros::NodeHandle n_;
ros::NodeHandle n_param_;
ros::Subscriber sub_map_;
ros::Publisher pub_goals_;
ros::Publisher pub_map_goals_;
tuw::GridMap<int8_t> map_;
tuw::GridMap<int8_t> map_goals_;
int max_resample_; /// retries/max_resample steps to find a free spot for a goal [m]
int nr_of_available_robots_; /// parameter count
double distance_boundary_; /// parameter [m]
double distance_between_robots_; /// parameter [m]
double distance_to_map_border_; /// parameter [m]
std::string robot_name_prefix_; /// parameter
std::string frame_id_; /// parameter
tuw_multi_robot_msgs::RobotGoalsArray robot_goals_array_;
nav_msgs::OccupancyGrid msg_map_goals_;
nav_msgs::OccupancyGrid::ConstPtr msg_map_;
void updateNrOfRobots(size_t nr_of_robots);
};
#endif // TUW_RANDOM_GOAL_GENERATOR_NODE_H

View File

@ -1,35 +0,0 @@
#ifndef TUW_MULTI_ROBOT_GOAL_HANDLER
#define TUW_MULTI_ROBOT_GOAL_HANDLER
#include <ros/ros.h>
#include "tuw_multi_robot_msgs/RobotGoalsArray.h"
/**
* class to cover the ros communication
**/
class GoalHandlerNode {
public:
enum Mode {
READ = 0,
WRITE = 1
};
GoalHandlerNode ( ros::NodeHandle & n, Mode mode );
void callback ( const tuw_multi_robot_msgs::RobotGoalsArray& msg );
void publish ();
private:
ros::NodeHandle n_;
ros::NodeHandle n_param_;
ros::Subscriber sub_goals_;
double loop_rate_; /// paramter
bool time_now_; /// parameter
bool run_once_; /// parameter
std::string file_name_; /// parameter
ros::Publisher pub_goals_;
tuw_multi_robot_msgs::RobotGoalsArray msg_;
int counter_;
void publishGoal ( );
};
#endif // TUW_MULTI_ROBOT_GOAL_HANDLER

View File

@ -1,75 +0,0 @@
<?xml version="1.0"?>
<package format="2">
<name>tuw_multi_robot_goal_generator</name>
<version>0.0.0</version>
<description>The tuw_multi_robot_goal_generator package was designed to generate, store, and read goal lists for the tuw_multi_robot_router.
The goal_saver is able to store publish goal msgs of type tuw_multi_robot_msgs::RobotGoalsArray in a human readable form.
The goal_server is able to read and publish this msgs and to read patches of saved goals for testing.
The goals_random node subscribes to the occupancy grid and is able to auto generate valid goals for testing.
</description>
<!-- One maintainer tag required, multiple allowed, one person per tag -->
<!-- Example: -->
<!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->
<maintainer email="markus.bader@tuwien.ac.at">Markus Bader</maintainer>
<!-- One license tag required, multiple allowed, one license per tag -->
<!-- Commonly used license strings: -->
<!-- BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->
<license>BSD</license>
<!-- Url tags are optional, but multiple are allowed, one per tag -->
<!-- Optional attribute type can be: website, bugtracker, or repository -->
<!-- Example: -->
<!-- <url type="website">http://wiki.ros.org/tuw_multi_robot_goal_generator</url> -->
<!-- Author tags are optional, multiple are allowed, one per tag -->
<!-- Authors do not have to be maintainers, but could be -->
<!-- Example: -->
<author email="markus.bader@tuwien.ac.at">Markus Bader</author>
<!-- The *depend tags are used to specify dependencies -->
<!-- Dependencies can be catkin packages or system dependencies -->
<!-- Examples: -->
<!-- Use depend as a shortcut for packages that are both build and exec dependencies -->
<!-- <depend>roscpp</depend> -->
<!-- Note that this is equivalent to the following: -->
<!-- <build_depend>roscpp</build_depend> -->
<!-- <exec_depend>roscpp</exec_depend> -->
<!-- Use build_depend for packages you need at compile time: -->
<!-- <build_depend>message_generation</build_depend> -->
<!-- Use build_export_depend for packages you need in order to build against this package: -->
<!-- <build_export_depend>message_generation</build_export_depend> -->
<!-- Use buildtool_depend for build tool packages: -->
<!-- <buildtool_depend>catkin</buildtool_depend> -->
<!-- Use exec_depend for packages you need at runtime: -->
<!-- <exec_depend>message_runtime</exec_depend> -->
<!-- Use test_depend for packages you need only for testing: -->
<!-- <test_depend>gtest</test_depend> -->
<!-- Use doc_depend for packages you need only for building documentation: -->
<!-- <doc_depend>doxygen</doc_depend> -->
<buildtool_depend>catkin</buildtool_depend>
<build_depend>nav_msgs</build_depend>
<build_depend>roscpp</build_depend>
<build_depend>tuw_geometry</build_depend>
<build_depend>tuw_multi_robot_msgs</build_depend>
<build_export_depend>nav_msgs</build_export_depend>
<build_export_depend>roscpp</build_export_depend>
<build_export_depend>tuw_geometry</build_export_depend>
<build_export_depend>tuw_multi_robot_msgs</build_export_depend>
<exec_depend>nav_msgs</exec_depend>
<exec_depend>roscpp</exec_depend>
<exec_depend>tuw_geometry</exec_depend>
<exec_depend>tuw_multi_robot_msgs</exec_depend>
<!-- The export tag contains other, unspecified, tags -->
<export>
<!-- Other tools can request additional information be placed here -->
</export>
</package>

View File

@ -1,136 +0,0 @@
#include "ros/ros.h"
#include <random>
#include "tuw_geometry/utils.h"
#include "tuw_multi_robot_goal_generator/multi_robot_goal_generator.h"
#include <algorithm>
RadomGoalGeneratorNode::RadomGoalGeneratorNode ( ros::NodeHandle & n )
: n_ ( n ),
n_param_ ( "~" ) {
int nr_of_robots = 0;
if ( ! n_param_.getParam ( "nr_of_robots", nr_of_robots ) ) {
ROS_ERROR ( "nr_of_robots is not set" );
return;
}
n_param_.param<int> ( "nr_of_available_robots", nr_of_available_robots_, -1 );
n_param_.param<std::string> ( "frame_id", frame_id_, "map" );
n_param_.param<std::string> ( "robot_name_prefix", robot_name_prefix_, "robot_" );
n_param_.param<double> ( "distance_boundary", distance_boundary_, 0.5 );
n_param_.param<double> ( "distance_between_robots", distance_between_robots_, 2. );
n_param_.param<double> ( "distance_to_map_border", distance_to_map_border_, 0.2 );
n_param_.param<int> ( "max_resample", max_resample_, 1000 );
updateNrOfRobots ( nr_of_robots );
pub_goals_ = n.advertise<tuw_multi_robot_msgs::RobotGoalsArray> ( "goals", 1, true );
pub_map_goals_ = n.advertise<nav_msgs::OccupancyGrid> ( "valid_goal_locations", 1, true );
sub_map_ = n.subscribe ( "map", 1, &RadomGoalGeneratorNode::callback, this );
}
void RadomGoalGeneratorNode::updateNrOfRobots ( size_t nr_of_robots ) {
ROS_INFO ( "nr_of_robots: %i", ( int ) nr_of_robots );
ROS_INFO ( "using prefix: %s", robot_name_prefix_.c_str() );
robot_goals_array_.robots.clear();
if((nr_of_available_robots_ > 0) && (nr_of_available_robots_ < nr_of_robots)){
ROS_ERROR( "nr_of_robots must be equal or less then nr_of_available_robots" );
return;
}
robot_goals_array_.robots.resize ( nr_of_robots );
if(nr_of_available_robots_ < 0){
ROS_INFO( "nr_of_available_robots < 0 and therefore ignored" );
for ( size_t i = 0; i < nr_of_robots; i++ ) {
tuw_multi_robot_msgs::RobotGoals &robot_check_points = robot_goals_array_.robots[i];
robot_check_points.robot_name = robot_name_prefix_ + std::to_string ( i );
}
} else {
std::set<std::string> available_robots;
for ( size_t i = 0; i < nr_of_available_robots_; i++ ) {
available_robots.insert(robot_name_prefix_ + std::to_string ( i ));
}
for ( size_t i = 0; i < nr_of_robots; i++ ) {
tuw_multi_robot_msgs::RobotGoals &robot_check_points = robot_goals_array_.robots[i];
int offset = rand() % available_robots.size();
std::set<std::string>::iterator it = available_robots.begin();
std::advance(it,offset);
robot_check_points.robot_name = *it;
available_robots.erase(it);
}
}
}
void RadomGoalGeneratorNode::callback ( const nav_msgs::OccupancyGrid::ConstPtr& msg ) {
msg_map_ = msg;
publish () ;
ros::shutdown();
}
void RadomGoalGeneratorNode::publish () {
map_.init ( msg_map_->info, msg_map_->data );
msg_map_goals_.header = msg_map_->header;
msg_map_goals_.info = msg_map_->info;
msg_map_goals_.data.resize ( msg_map_->data.size() );
map_goals_.init ( msg_map_goals_.info, msg_map_goals_.data );
std::copy ( msg_map_->data.begin(), msg_map_->data.end(), msg_map_goals_.data.begin() );
map_goals_.erode ( distance_boundary_ );
//std::cout << map_.infoHeader() << std::endl;
//std::cout << tuw::format(map_.Mw2m()) << std::endl;
//std::cout << tuw::format(map_.Mm2w()) << std::endl;
std::random_device rd; //Will be used to obtain a seed for the random number engine
std::mt19937 gen ( rd() ); //Standard mersenne_twister_engine seeded with rd()
std::uniform_real_distribution<> dis_x ( map_.min_x(), map_.max_x() );
std::uniform_real_distribution<> dis_y ( map_.min_y(), map_.max_y() );
std::uniform_real_distribution<> dis_alpha ( -M_PI, M_PI );
int total_retries = 0;
int max_retries = 0;
for ( tuw_multi_robot_msgs::RobotGoals &robot: robot_goals_array_.robots ) {
tuw::Pose2D pw;
int retries = 0;
bool valid_pose = false;
do {
pw.set ( dis_x ( gen ), dis_y ( gen ), 0 );
if ( map_goals_.isFree ( pw.position() ) ) {
if ( ( pw.x() > map_goals_.min_x() + distance_to_map_border_ ) && ( pw.x() < map_goals_.max_x() - distance_to_map_border_ ) && ( pw.y() > map_goals_.min_y() + distance_to_map_border_ ) && ( pw.y() < map_goals_.max_y() - distance_to_map_border_) ) {
valid_pose = true;
}
}
retries++;
} while ( !valid_pose && ( retries < max_resample_ ) );
total_retries += retries;
if ( retries < max_resample_ ) {
pw.theta() = dis_alpha ( gen );
//std::cout << pw << std::endl; //Each call to dis(gen) generates a new random double
robot.destinations.resize ( 1 );
map_goals_.circle ( pw.position(), distance_between_robots_, map_goals_.SPACE_OCCUPIED, -1 );
geometry_msgs::Pose &p = robot.destinations[0];
pw.copyToROSPose ( p );
} else {
ROS_WARN ( "Max retries on finding new free space for goals for robot: %s", robot.robot_name.c_str() );
}
if ( max_retries < retries ) {
max_retries = retries;
}
}
robot_goals_array_.header.frame_id = frame_id_;
robot_goals_array_.header.stamp = ros::Time::now();
pub_goals_.publish ( robot_goals_array_ );
pub_map_goals_.publish ( msg_map_goals_ );
ROS_INFO ( "Goal msg published: %i max retries and %i total retries on finding free space ", max_retries, total_retries );
}
int main ( int argc, char **argv ) {
ros::init ( argc, argv, "RandomGoalGenerator" );
ros::NodeHandle n;
RadomGoalGeneratorNode node ( n );
ros::spin();
return 0;
}

View File

@ -1,188 +0,0 @@
#include "ros/ros.h"
#include <random>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <ros/ros.h>
#include "tuw_multi_robot_goal_generator/multi_robot_goal_handler.h"
#include <boost/algorithm/string.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include "tuw_geometry/utils.h"
GoalHandlerNode::GoalHandlerNode ( ros::NodeHandle & n, Mode mode )
: n_ ( n ), n_param_ ( "~" ), counter_(0) {
n_param_.param<std::string> ( "file_name", file_name_, "/tmp/goals999.txt" );
n_param_.param<bool> ( "run_once", run_once_, "false" );
if (mode == READ) {
n_param_.param<double> ( "loop_rate", loop_rate_, 1.0 );
n_param_.param<bool> ( "time_now", time_now_, "true" );
pub_goals_ = n.advertise<tuw_multi_robot_msgs::RobotGoalsArray> ( "goals", 1 );
}
if (mode == WRITE) {
sub_goals_ = n.subscribe ( "goals", 1, &GoalHandlerNode::callback, this );
}
}
void GoalHandlerNode::callback ( const tuw_multi_robot_msgs::RobotGoalsArray& msg ) {
ROS_INFO ( "GoalHandlerNode::callback" );
msg_ = msg;
std::string frame_id_; /// parameter
std::ofstream file;
char file_name[0x1FF];
if(run_once_){
sprintf(file_name, "%s", file_name_.c_str());
} else {
sprintf(file_name, "%s%03i.txt", file_name_.c_str(), counter_);
}
file.open ( file_name );
ROS_INFO ( "Write file %s", file_name );
file << "tuw_multi_robot_msgs::RobotGoalsArray @" << boost::posix_time::to_iso_extended_string ( ros::Time::now().toBoost() ) << std::endl;
file << "frame_id: " << msg_.header.frame_id << std::endl;
file << std::setprecision ( std::numeric_limits<float>::digits10 + 1 );
file << std::setw ( 12 ) << msg_.header.stamp.sec << ", " << std::setw ( 12 ) << msg_.header.stamp.nsec << std::endl;
for ( size_t i = 0; i < msg_.robots.size(); i++ ) {
const tuw_multi_robot_msgs::RobotGoals &robot = msg_.robots[i];
file << robot.robot_name << std::endl;
for ( size_t j = 0; j < robot.destinations.size(); j++ ) {
const geometry_msgs::Pose p = robot.destinations[j];
file << std::setw ( 12 ) << p.position.x << ", " << std::setw ( 12 ) << p.position.y << ", " << std::setw ( 12 ) << p.position.z << ", ";
file << std::setw ( 12 ) << p.orientation.x << ", " << std::setw ( 12 ) << p.orientation.y << ", " << std::setw ( 12 ) << p.orientation.z << ", " << std::setw ( 12 ) << p.orientation.w << std::endl;
}
}
file.close();
counter_++;
if(run_once_) ros::shutdown();
}
void GoalHandlerNode::publish () {
ros::Rate loop_rate(loop_rate_);
do {
publishGoal();
ros::spinOnce();
loop_rate.sleep();
} while ( ros::ok() && (run_once_ == false));
}
void GoalHandlerNode::publishGoal ( ) {
char file_name[0x1FF];
if(run_once_){
sprintf(file_name, "%s", file_name_.c_str());
} else {
sprintf(file_name, "%s%03i.txt", file_name_.c_str(), counter_);
}
std::ifstream file ( file_name );
if ( !file.good() ) {
ROS_ERROR ( "File: %s does not exist!", file_name );
run_once_ = true;
return;
}
if ( !file.is_open() ) {
ROS_ERROR ( "Can't open file %s!", file_name );
return;
}
ROS_INFO ( "Reading file %s", file_name );
std::vector<std::string> columns;
std::string line;
// Titel
if ( getline ( file,line ) ) {
boost::erase_all ( line, " " );
boost::split ( columns, line, boost::is_any_of ( "@ " ) );
if ( ( columns.size() > 0 ) && boost::iequals ( columns[0],"tuw_multi_robot_msgs::RobotGoalsArray" ) ) {
ROS_DEBUG ( "Start reading tuw_multi_robot_msgs::RobotGoalsArray" );
} else {
ROS_ERROR ( "Missing keyword tuw_multi_robot_msgs::RobotGoalsArray" );
return;
}
} else {
ROS_ERROR ( "No header in File: %s!", file_name );
return;
}
// Header
if ( getline ( file,line ) ) {
boost::erase_all ( line, " " );
boost::split ( columns, line, boost::is_any_of ( ":" ) );
if ( ( columns.size() == 2 ) && boost::iequals ( columns[0],"frame_id" ) ) {
msg_.header.frame_id = columns[1];
} else {
ROS_ERROR ( "Missing keyword frame_id or frame_id value" );
}
} else {
ROS_ERROR ( "No header in File: %s!", file_name );
return;
}
// Timestamp
if ( getline ( file,line ) ) {
boost::erase_all ( line, " " );
boost::split ( columns, line, boost::is_any_of ( "," ) );
if ( columns.size() == 2 ) {
msg_.header.stamp.sec = std::stol ( columns[0] );
msg_.header.stamp.nsec = std::stol ( columns[1] );
} else {
ROS_INFO ( "Can't read timestamp" );
}
} else {
ROS_ERROR ( "No Timestamp in File: %s!", file_name );
return;
}
// Goals
tuw_multi_robot_msgs::RobotGoals::_destinations_type *destinations = NULL;
msg_.robots.clear();
while ( getline ( file,line ) ) {
boost::erase_all ( line, " " );
boost::split ( columns, line, boost::is_any_of ( "," ) );
// Robot name
if ( columns.size() == 1 ) {
if ( columns[0].size() > 0 ) {
tuw_multi_robot_msgs::RobotGoals robot;
robot.robot_name = line;
msg_.robots.push_back ( robot );
destinations = &msg_.robots.back().destinations;
} else {
ROS_ERROR ( "robot name to short!" );
return;
}
}
if ( ( columns.size() == 7 ) && ( destinations != NULL ) ) {
geometry_msgs::Pose p;
p.position.x = std::stod ( columns[0] );
p.position.y = std::stod ( columns[1] );
p.position.z = std::stod ( columns[2] );
p.orientation.x = std::stod ( columns[3] );
p.orientation.y = std::stod ( columns[4] );
p.orientation.z = std::stod ( columns[5] );
p.orientation.w = std::stod ( columns[6] );
destinations->push_back ( p );
}
if ( ( columns.size() == 4 ) && ( destinations != NULL ) ) {
geometry_msgs::Pose p;
p.position.x = std::stod ( columns[0] );
p.position.y = std::stod ( columns[1] );
p.position.z = std::stod ( columns[2] );
double alpha = std::stod ( columns[3] );
tuw::EulerYawToQuaternion ( alpha, p.orientation );
destinations->push_back ( p );
}
}
if(time_now_){
msg_.header.stamp = ros::Time::now();
}
ros::Time timeout = ros::Time::now() + ros::Duration(10);
int nr_of_subscribers = pub_goals_.getNumSubscribers();
while (ros::Time::now() < timeout && (nr_of_subscribers <= 0)){
ROS_INFO ( "NumSubscribers: %i", nr_of_subscribers );
ros::Duration(0.1).sleep();
nr_of_subscribers = pub_goals_.getNumSubscribers();
}
ROS_INFO ( "NumSubscribers: %i", nr_of_subscribers );
pub_goals_.publish ( msg_ );
file.close();
counter_++;
}

View File

@ -1,11 +0,0 @@
#include <ros/ros.h>
#include "tuw_multi_robot_goal_generator/multi_robot_goal_handler.h"
int main ( int argc, char **argv ) {
ros::init ( argc, argv, "GoalSaver" );
ros::NodeHandle n;
GoalHandlerNode node ( n , GoalHandlerNode::WRITE);
ros::spin();
return 0;
}

View File

@ -1,11 +0,0 @@
#include <ros/ros.h>
#include "tuw_multi_robot_goal_generator/multi_robot_goal_handler.h"
int main ( int argc, char **argv ) {
ros::init ( argc, argv, "GoalServer" );
ros::NodeHandle n;
GoalHandlerNode node ( n, GoalHandlerNode::READ);
node.publish();
return 0;
}

View File

@ -1,269 +0,0 @@
cmake_minimum_required(VERSION 2.8.3)
project(tuw_multi_robot_router)
## Compile as C++11, supported in ROS Kinetic and newer
add_compile_options(-std=c++14)
## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
dynamic_reconfigure
geometry_msgs
nav_msgs
roscpp
tf
tuw_multi_robot_msgs
tuw_voronoi_graph
)
## System dependencies are found with CMake's conventions
# find_package(Boost REQUIRED COMPONENTS system)
find_package(Eigen3 QUIET)
set(_opencv_version 4)
find_package(OpenCV 4 QUIET)
if(NOT OpenCV_FOUND)
message(STATUS "Did not find OpenCV 4, trying OpenCV 3")
set(_opencv_version 3)
endif()
find_package(OpenCV ${_opencv_version} REQUIRED
COMPONENTS
opencv_core
opencv_imgproc
opencv_imgcodecs
CONFIG
)
if(NOT EIGEN3_FOUND)
find_package(cmake_modules REQUIRED)
find_package(Eigen REQUIRED)
set(Eigen3_INCLUDE_DIRS ${EIGEN_INCLUDE_DIRS})
endif()
# Note that eigen 3.2 (on Ubuntu Wily) only provides EIGEN3_INCLUDE_DIR,
# not EIGEN3_INCLUDE_DIRS, so we have to set the latter from the former.
if(NOT Eigen3_INCLUDE_DIRS)
set(Eigen3_INCLUDE_DIRS ${EIGEN3_INCLUDE_DIR})
endif()
#check for OpenMP
#find_package(OpenMP)
#if(OPENMP_FOUND)
#message (STATUS "OpenMP found ${OpenMP_INCLUDE_DIRS}")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}" )
#else(OPENMP_FOUND)
#message (STATUS "OpenMP not found")
#endif()
## Uncomment this if the package has a setup.py. This macro ensures
## modules and global scripts declared therein get installed
## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html
# catkin_python_setup()
################################################
## Declare ROS messages, services and actions ##
################################################
## To declare and build messages, services or actions from within this
## package, follow these steps:
## * Let MSG_DEP_SET be the set of packages whose message types you use in
## your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...).
## * In the file package.xml:
## * add a build_depend tag for "message_generation"
## * add a build_depend and a run_depend tag for each package in MSG_DEP_SET
## * If MSG_DEP_SET isn't empty the following dependency has been pulled in
## but can be declared for certainty nonetheless:
## * add a run_depend tag for "message_runtime"
## * In this file (CMakeLists.txt):
## * add "message_generation" and every package in MSG_DEP_SET to
## find_package(catkin REQUIRED COMPONENTS ...)
## * add "message_runtime" and every package in MSG_DEP_SET to
## catkin_package(CATKIN_DEPENDS ...)
## * uncomment the add_*_files sections below as needed
## and list every .msg/.srv/.action file to be processed
## * uncomment the generate_messages entry below
## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...)
## Generate messages in the 'msg' folder
# add_message_files(
# FILES
# Message1.msg
# Message2.msg
# )
## Generate services in the 'srv' folder
# add_service_files(
# FILES
# Service1.srv
# Service2.srv
# )
## Generate actions in the 'action' folder
# add_action_files(
# FILES
# Action1.action
# Action2.action
# )
## Generate added messages and services with any dependencies listed here
# generate_messages(
# DEPENDENCIES
# geometry_msgs# nav_msgs
# )
################################################
## Declare ROS dynamic reconfigure parameters ##
################################################
## To declare and build dynamic reconfigure parameters within this
## package, follow these steps:
## * In the file package.xml:
## * add a build_depend and a run_depend tag for "dynamic_reconfigure"
## * In this file (CMakeLists.txt):
## * add "dynamic_reconfigure" to
## find_package(catkin REQUIRED COMPONENTS ...)
## * uncomment the "generate_dynamic_reconfigure_options" section below
## and list every .cfg file to be processed
## Generate dynamic reconfigure parameters in the 'cfg' folder
generate_dynamic_reconfigure_options(
cfg/router.cfg
# cfg/DynReconf1.cfg
# cfg/DynReconf2.cfg
)
###################################
## catkin specific configuration ##
###################################
## The catkin_package macro generates cmake config files for your package
## Declare things to be passed to dependent projects
## INCLUDE_DIRS: uncomment this if you package contains header files
## LIBRARIES: libraries you create in this project that dependent projects also need
## CATKIN_DEPENDS: catkin_packages dependent projects also need
## DEPENDS: system dependencies of this project that dependent projects also need
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES tuw_multi_robot_router
CATKIN_DEPENDS dynamic_reconfigure geometry_msgs nav_msgs roscpp tf tuw_multi_robot_msgs tuw_voronoi_graph
# DEPENDS system_lib
)
###########
## Build ##
###########
## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
include
${catkin_INCLUDE_DIRS}
${Eigen3_INCLUDE_DIRS}
${dynamic_reconfigure_PACKAGE_PATH}/cmake/cfgbuild.cmake
)
## Declare a C++ library
add_library(${PROJECT_NAME}
src/router.cpp
src/srr_utils.cpp
src/point_expander.cpp
src/multi_robot_router.cpp
src/multi_robot_router_threaded_srr.cpp
src/single_robot_router.cpp
src/segment_expander.cpp
src/route_coordinator_timed.cpp
src/traceback.cpp
src/robot_info.cpp
src/route_generator.cpp
src/backtracking_resolution.cpp
src/avoidance_resolution.cpp
src/empty_resolution.cpp
src/priority_scheduler.cpp
src/potential_calculator.cpp
src/speed_scheduler.cpp
src/route_coordinator.cpp
)
target_link_libraries(${PROJECT_NAME} ${catkin_LIBRARIES} ${OpenCV_LIBRARIES})
add_executable(tuw_multi_robot_router_node src/router_node.cpp)
target_link_libraries(tuw_multi_robot_router_node
${catkin_LIBRARIES}
${PROJECT_NAME}
)
## Add cmake target dependencies of the library
## as an example, code may need to be generated before libraries
## either from message generation or dynamic reconfigure
add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS} ${PROJECT_NAME}_gencfg)
## Declare a C++ executable
## With catkin_make all packages are built within a single CMake context
## The recommended prefix ensures that target names across packages don't collide
# add_executable(${PROJECT_NAME}_node src/tuw_global_router_node.cpp)
## Rename C++ executable without prefix
## The above recommended prefix causes long target names, the following renames the
## target back to the shorter version for ease of user use
## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node"
# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")
## Add cmake target dependencies of the executable
## same as for the library above
# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
## Specify libraries to link a library or executable target against
# target_link_libraries(${PROJECT_NAME}_node
# ${catkin_LIBRARIES}
# )
#############
## Install ##
#############
# all install targets should use catkin DESTINATION variables
# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html
## Mark executable scripts (Python etc.) for installation
## in contrast to setup.py, you can choose the destination
# install(PROGRAMS
# scripts/my_python_script
# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )
## Mark executables and/or libraries for installation
# install(TARGETS ${PROJECT_NAME} ${PROJECT_NAME}_node
# ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
# LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
# RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )
## Mark cpp header files for installation
# install(DIRECTORY include/${PROJECT_NAME}/
# DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
# FILES_MATCHING PATTERN "*.h"
# PATTERN ".svn" EXCLUDE
# )
## Mark other files for installation (e.g. launch and bag files, etc.)
# install(FILES
# # myfile1
# # myfile2
# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
# )
#############
## Testing ##
#############
## Add gtest based cpp test target and link libraries
# catkin_add_gtest(${PROJECT_NAME}-test test/test_tuw_global_planner.cpp)
# if(TARGET ${PROJECT_NAME}-test)
# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME})
# endif()
## Add folders to be run by python nosetests
# catkin_add_nosetests(test)

View File

@ -1,8 +0,0 @@
tuw_global_planner
tuw_voronoi_map
voronoi_segmentation
simple_velocity_controller
tuw_voronoi_rviz
stage (Testcases)
tuw_multi_robot_utils
grid_map

View File

@ -1,21 +0,0 @@
grid_map_topic: /voronoi_map
grid_map_visualizations:
- name: map
type: occupancy_grid
params:
layer: map
data_min: 0
data_max: 128
- name: distfield
type: occupancy_grid
params:
layer: distfield
data_min: 0
data_max: 128
- name: voronoi
type: occupancy_grid
params:
layer: voronoi
data_min: 0
data_max: 128

View File

@ -1,21 +0,0 @@
grid_map_topic: /voronoi_map
grid_map_visualizations:
- name: map
type: occupancy_grid
params:
layer: map
data_min: 0
data_max: 128
- name: distfield
type: occupancy_grid
params:
layer: distfield
data_min: 0
data_max: 220
- name: voronoi
type: occupancy_grid
params:
layer: voronoi
data_min: 0
data_max: 128

View File

@ -1,21 +0,0 @@
grid_map_topic: /voronoi_map
grid_map_visualizations:
- name: map
type: occupancy_grid
params:
layer: map
data_min: 0
data_max: 128
- name: distfield
type: occupancy_grid
params:
layer: distfield
data_min: 0
data_max: 220
- name: voronoi
type: occupancy_grid
params:
layer: voronoi
data_min: 0
data_max: 128

View File

@ -1,21 +0,0 @@
grid_map_topic: /voronoi_map
grid_map_visualizations:
- name: map
type: occupancy_grid
params:
layer: map
data_min: 0
data_max: 128
- name: distfield
type: occupancy_grid
params:
layer: distfield
data_min: 0
data_max: 220
- name: voronoi
type: occupancy_grid
params:
layer: voronoi
data_min: 0
data_max: 128

View File

@ -1,21 +0,0 @@
grid_map_topic: /voronoi_map
grid_map_visualizations:
- name: map
type: occupancy_grid
params:
layer: map
data_min: 0
data_max: 128
- name: distfield
type: occupancy_grid
params:
layer: distfield
data_min: 0
data_max: 220
- name: voronoi
type: occupancy_grid
params:
layer: voronoi
data_min: 0
data_max: 128

View File

@ -1,6 +0,0 @@
image: map.pgm
resolution: 0.050000
origin: [-15.000000, -15.000000, 0.000000]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.196

View File

@ -1,159 +0,0 @@
define hokuyolaser ranger
(
sensor(
# laser-specific properties
# factory settings for LMS200
range [ 0.0 5.0 ]
fov 270.0
samples 270
)
model
(
# generic model properties
size [ 0.07 0.07 0.05 ] # dimensions from LMS200 data sheet
color "blue"
obstacle_return 0
)
)
define floorplan model
(
# sombre, sensible, artistic
color "gray30"
# most maps will need a bounding box
boundary 1
gui_nose 0
gui_grid 0
obstacle_return 1
gui_outline 0
gripper_return 0
fiducial_return 0
laser_return 1
)
define background model
(
# sombre, sensible, artistic
color "red"
# most maps will need a bounding box
boundary 1
gui_nose 0
gui_grid 0
obstacle_return 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 10 # simulation timestep in milliseconds
window
(
size [ 1500.000 1500.000 ]
rotate [ 0.000 0 ]
scale 50
show_data 1 # 1=on 0=off
)
# load an environment bitmap
floorplan
(
name "test_1"
bitmap "map.pgm"
size [16.0 16.0 0]
pose [ 0 0 0 0 ]
)
define pioneer_base position
(
color "red" # Default color.
drive "diff" # Differential steering model.
gui_nose 0 # Draw a nose on the robot so we can see which way it points
obstacle_return 0 # Can hit things.
ranger_return 0.5 # reflects sonar beams
blob_return 1 # Seen by blobfinders
fiducial_return 1 # Seen as "1" fiducial finders
localization "gps"
localization_origin [0 0 0 0] # Start odometry at (0, 0, 0).
# alternative odometric localization with simple error model
# localization "odom" # Change to "gps" to have impossibly perfect, global odometry
# odom_error [ 0.05 0.05 0.1 ] # Odometry error or slip in X, Y and Theta
# (Uniform random distribution)
# four DOF kinematics limits
# [ xmin xmax ymin ymax zmin zmax amin amax ]
velocity_bounds [-1 1 0 0 0 0 -45.0 45.0 ]
acceleration_bounds [-1.0 1.0 0 0 0 0 -45 45.0 ]
)
define pioneer2dx_base_no_sonar pioneer_base
(
# actual size
size [0.44 0.38 0.22] # sizes from MobileRobots' web site
# the pioneer's center of rotation is offset from its center of area
origin [-0.04 0 0 0]
# draw a nose on the robot so we can see which way it points
gui_nose 0
# estimated mass in KG
mass 23.0
)
# as above, but with front sonar only
define pioneer2dx_no_sonar pioneer2dx_base_no_sonar
(
# simplified Body shape:
block(
points 8
point[0] [-0.2 0.12]
point[1] [-0.2 -0.12]
point[2] [-0.12 -0.2555]
point[3] [0.12 -0.2555]
point[4] [0.2 -0.12]
point[5] [0.2 0.12]
point[6] [0.12 0.2555]
point[7] [-0.12 0.2555]
z [0 0.22]
)
)
pioneer2dx_no_sonar
(
# can refer to the robot by this name
name "robot_0"
color "red"
pose [ -7 -7 0 45 ]
hokuyolaser(pose [ 0.225 0.000 -0.15 0.000 ])
)
pioneer2dx_no_sonar
(
# can refer to the robot by this name
name "robot_1"
color "blue"
pose [ 7 7 0 45 ]
hokuyolaser(pose [ 0.225 0.000 -0.15 0.000 ])
)

View File

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="12">
<MapInfo class_id="0" tracking_level="0" version="0">
<mapName>map</mapName>
<distanceMapName>distfield</distanceMapName>
<voronoiMapName>voronoi</voronoiMapName>
<resolution>5.000000075e-02</resolution>
<cols>600</cols>
<rows>600</rows>
<origin_cols>2.235174179e-07</origin_cols>
<origin_rows>2.235174179e-07</origin_rows>
</MapInfo>
</boost_serialization>

View File

@ -1,7 +0,0 @@
image: map.pgm
resolution: 0.0889
origin: [-87.000000, -33.000000, 0.000000]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.196

View File

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="12">
<MapInfo class_id="0" tracking_level="0" version="0">
<mapName>map</mapName>
<distanceMapName>distfield</distanceMapName>
<voronoiMapName>voronoi</voronoiMapName>
<resolution>8.889999986e-02</resolution>
<cols>1654</cols>
<rows>1169</rows>
<origin_cols>-1.347970009e+01</origin_cols>
<origin_rows>1.896204948e+01</origin_rows>
</MapInfo>
</boost_serialization>

View File

@ -1,7 +0,0 @@
image: map.pgm
resolution: 0.010000
origin: [0.400000, 1.00000, 0.000000]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.196

View File

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="12">
<MapInfo class_id="0" tracking_level="0" version="0">
<mapName>map</mapName>
<distanceMapName>distfield</distanceMapName>
<voronoiMapName>voronoi</voronoiMapName>
<resolution>9.999999776e-03</resolution>
<cols>3737</cols>
<rows>2338</rows>
<origin_cols>1.908499908e+01</origin_cols>
<origin_rows>1.268999958e+01</origin_rows>
</MapInfo>
</boost_serialization>

View File

@ -1,6 +0,0 @@
image: map.pgm
resolution: 0.050000
origin: [-15.000000, -15.000000, 0.000000]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.196

View File

@ -1,167 +0,0 @@
define hokuyolaser ranger
(
sensor(
# laser-specific properties
# factory settings for LMS200
range [ 0.0 5.0 ]
fov 270.0
samples 270
)
model
(
# generic model properties
size [ 0.07 0.07 0.05 ] # dimensions from LMS200 data sheet
color "blue"
obstacle_return 0
)
)
define floorplan model
(
# sombre, sensible, artistic
color "gray30"
# most maps will need a bounding box
boundary 1
gui_nose 0
gui_grid 0
obstacle_return 1
gui_outline 0
gripper_return 0
fiducial_return 0
laser_return 1
)
define background model
(
# sombre, sensible, artistic
color "red"
# most maps will need a bounding box
boundary 1
gui_nose 0
gui_grid 0
obstacle_return 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 10 # simulation timestep in milliseconds
window
(
size [ 1500.000 1500.000 ]
rotate [ 0.000 0 ]
scale 50
show_data 1 # 1=on 0=off
)
# load an environment bitmap
floorplan
(
name "test_1"
bitmap "map.pgm"
size [16.0 16.0 0]
pose [ 0 0 0 0 ]
)
define pioneer_base position
(
color "red" # Default color.
drive "diff" # Differential steering model.
gui_nose 0 # Draw a nose on the robot so we can see which way it points
obstacle_return 0 # Can hit things.
ranger_return 0.5 # reflects sonar beams
blob_return 1 # Seen by blobfinders
fiducial_return 1 # Seen as "1" fiducial finders
localization "gps"
localization_origin [0 0 0 0] # Start odometry at (0, 0, 0).
# alternative odometric localization with simple error model
# localization "odom" # Change to "gps" to have impossibly perfect, global odometry
# odom_error [ 0.05 0.05 0.1 ] # Odometry error or slip in X, Y and Theta
# (Uniform random distribution)
# four DOF kinematics limits
# [ xmin xmax ymin ymax zmin zmax amin amax ]
velocity_bounds [-1 1 0 0 0 0 -45.0 45.0 ]
acceleration_bounds [-1.0 1.0 0 0 0 0 -45 45.0 ]
)
define pioneer2dx_base_no_sonar pioneer_base
(
# actual size
size [0.44 0.38 0.22] # sizes from MobileRobots' web site
# the pioneer's center of rotation is offset from its center of area
origin [-0.04 0 0 0]
# draw a nose on the robot so we can see which way it points
gui_nose 0
# estimated mass in KG
mass 23.0
)
# as above, but with front sonar only
define pioneer2dx_no_sonar pioneer2dx_base_no_sonar
(
# simplified Body shape:
block(
points 8
point[0] [-0.2 0.12]
point[1] [-0.2 -0.12]
point[2] [-0.12 -0.2555]
point[3] [0.12 -0.2555]
point[4] [0.2 -0.12]
point[5] [0.2 0.12]
point[6] [0.12 0.2555]
point[7] [-0.12 0.2555]
z [0 0.22]
)
)
pioneer2dx_no_sonar
(
# can refer to the robot by this name
name "robot_0"
color "red"
pose [ -6.5 -6.5 0 45 ]
hokuyolaser(pose [ 0.225 0.000 -0.15 0.000 ])
)
pioneer2dx_no_sonar
(
# can refer to the robot by this name
name "robot_1"
color "blue"
pose [ 7 7 0 45 ]
hokuyolaser(pose [ 0.225 0.000 -0.15 0.000 ])
)
pioneer2dx_no_sonar
(
# can refer to the robot by this name
name "robot_2"
color "green"
pose [ -1 -0.5 0 45 ]
hokuyolaser(pose [ 0.225 0.000 -0.15 0.000 ])
)

View File

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="12">
<MapInfo class_id="0" tracking_level="0" version="0">
<mapName>map</mapName>
<distanceMapName>distfield</distanceMapName>
<voronoiMapName>voronoi</voronoiMapName>
<resolution>5.000000075e-02</resolution>
<cols>600</cols>
<rows>600</rows>
<origin_cols>2.235174179e-07</origin_cols>
<origin_rows>2.235174179e-07</origin_rows>
</MapInfo>
</boost_serialization>

View File

@ -1,6 +0,0 @@
image: map.pgm
resolution: 0.050000
origin: [-15.000000, -15.000000, 0.000000]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.196

View File

@ -1,159 +0,0 @@
define hokuyolaser ranger
(
sensor(
# laser-specific properties
# factory settings for LMS200
range [ 0.0 5.0 ]
fov 270.0
samples 270
)
model
(
# generic model properties
size [ 0.07 0.07 0.05 ] # dimensions from LMS200 data sheet
color "blue"
obstacle_return 0
)
)
define floorplan model
(
# sombre, sensible, artistic
color "gray30"
# most maps will need a bounding box
boundary 1
gui_nose 0
gui_grid 0
obstacle_return 1
gui_outline 0
gripper_return 0
fiducial_return 0
laser_return 1
)
define background model
(
# sombre, sensible, artistic
color "red"
# most maps will need a bounding box
boundary 1
gui_nose 0
gui_grid 0
obstacle_return 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 10 # simulation timestep in milliseconds
window
(
size [ 1500.000 1500.000 ]
rotate [ 0.000 0 ]
scale 50
show_data 1 # 1=on 0=off
)
# load an environment bitmap
floorplan
(
name "test_1"
bitmap "map.pgm"
size [16.0 16.0 0]
pose [ 0 0 0 0 ]
)
define pioneer_base position
(
color "red" # Default color.
drive "diff" # Differential steering model.
gui_nose 0 # Draw a nose on the robot so we can see which way it points
obstacle_return 0 # Can hit things.
ranger_return 0.5 # reflects sonar beams
blob_return 1 # Seen by blobfinders
fiducial_return 1 # Seen as "1" fiducial finders
localization "gps"
localization_origin [0 0 0 0] # Start odometry at (0, 0, 0).
# alternative odometric localization with simple error model
# localization "odom" # Change to "gps" to have impossibly perfect, global odometry
# odom_error [ 0.05 0.05 0.1 ] # Odometry error or slip in X, Y and Theta
# (Uniform random distribution)
# four DOF kinematics limits
# [ xmin xmax ymin ymax zmin zmax amin amax ]
velocity_bounds [-1 1 0 0 0 0 -45.0 45.0 ]
acceleration_bounds [-1.0 1.0 0 0 0 0 -45 45.0 ]
)
define pioneer2dx_base_no_sonar pioneer_base
(
# actual size
size [0.44 0.38 0.22] # sizes from MobileRobots' web site
# the pioneer's center of rotation is offset from its center of area
origin [-0.04 0 0 0]
# draw a nose on the robot so we can see which way it points
gui_nose 0
# estimated mass in KG
mass 23.0
)
# as above, but with front sonar only
define pioneer2dx_no_sonar pioneer2dx_base_no_sonar
(
# simplified Body shape:
block(
points 8
point[0] [-0.2 0.12]
point[1] [-0.2 -0.12]
point[2] [-0.12 -0.2555]
point[3] [0.12 -0.2555]
point[4] [0.2 -0.12]
point[5] [0.2 0.12]
point[6] [0.12 0.2555]
point[7] [-0.12 0.2555]
z [0 0.22]
)
)
pioneer2dx_no_sonar
(
# can refer to the robot by this name
name "robot_0"
color "red"
pose [ -4.2 -5 0 90 ]
hokuyolaser(pose [ 0.225 0.000 -0.15 0.000 ])
)
pioneer2dx_no_sonar
(
# can refer to the robot by this name
name "robot_1"
color "blue"
pose [ 4 5 0 -90 ]
hokuyolaser(pose [ 0.225 0.000 -0.15 0.000 ])
)

View File

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="12">
<MapInfo class_id="0" tracking_level="0" version="0">
<mapName>map</mapName>
<distanceMapName>distfield</distanceMapName>
<voronoiMapName>voronoi</voronoiMapName>
<resolution>5.000000075e-02</resolution>
<cols>600</cols>
<rows>600</rows>
<origin_cols>2.235174179e-07</origin_cols>
<origin_rows>2.235174179e-07</origin_rows>
</MapInfo>
</boost_serialization>

View File

@ -1,6 +0,0 @@
image: map.pgm
resolution: 0.050000
origin: [-15.000000, -15.000000, 0.000000]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.196

View File

@ -1,169 +0,0 @@
define hokuyolaser ranger
(
sensor(
# laser-specific properties
# factory settings for LMS200
range [ 0.0 5.0 ]
fov 270.0
samples 270
)
model
(
# generic model properties
size [ 0.07 0.07 0.05 ] # dimensions from LMS200 data sheet
color "blue"
obstacle_return 0
)
)
define floorplan model
(
# sombre, sensible, artistic
color "gray30"
# most maps will need a bounding box
boundary 1
gui_nose 0
gui_grid 0
obstacle_return 1
gui_outline 0
gripper_return 0
fiducial_return 0
laser_return 1
)
define background model
(
# sombre, sensible, artistic
color "red"
# most maps will need a bounding box
boundary 1
gui_nose 0
gui_grid 0
obstacle_return 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 10 # simulation timestep in milliseconds
window
(
size [ 1500.000 1500.000 ]
rotate [ 0.000 0 ]
scale 50
show_data 1 # 1=on 0=off
)
# load an environment bitmap
floorplan
(
name "test_1"
bitmap "map.pgm"
size [16.0 16.0 0]
pose [ 0 0 0 0 ]
)
define pioneer_base position
(
color "red" # Default color.
drive "diff" # Differential steering model.
gui_nose 0 # Draw a nose on the robot so we can see which way it points
obstacle_return 0 # Can hit things.
ranger_return 0.5 # reflects sonar beams
blob_return 1 # Seen by blobfinders
fiducial_return 1 # Seen as "1" fiducial finders
localization "gps"
localization_origin [0 0 0 0] # Start odometry at (0, 0, 0).
# alternative odometric localization with simple error model
# localization "odom" # Change to "gps" to have impossibly perfect, global odometry
# odom_error [ 0.05 0.05 0.1 ] # Odometry error or slip in X, Y and Theta
# (Uniform random distribution)
# four DOF kinematics limits
# [ xmin xmax ymin ymax zmin zmax amin amax ]
velocity_bounds [-1 1 0 0 0 0 -45.0 45.0 ]
acceleration_bounds [-1.0 1.0 0 0 0 0 -45 45.0 ]
)
define pioneer2dx_base_no_sonar pioneer_base
(
# actual size
size [0.44 0.38 0.22] # sizes from MobileRobots' web site
# the pioneer's center of rotation is offset from its center of area
origin [-0.04 0 0 0]
# draw a nose on the robot so we can see which way it points
gui_nose 0
# estimated mass in KG
mass 23.0
)
# as above, but with front sonar only
define pioneer2dx_no_sonar pioneer2dx_base_no_sonar
(
# simplified Body shape:
block(
points 8
point[0] [-0.2 0.12]
point[1] [-0.2 -0.12]
point[2] [-0.12 -0.2555]
point[3] [0.12 -0.2555]
point[4] [0.2 -0.12]
point[5] [0.2 0.12]
point[6] [0.12 0.2555]
point[7] [-0.12 0.2555]
z [0 0.22]
)
)
pioneer2dx_no_sonar
(
# can refer to the robot by this name
name "robot_0"
color "red"
pose [ -5 -6.2 0 0 ]
hokuyolaser(pose [ 0.225 0.000 -0.15 0.000 ])
)
pioneer2dx_no_sonar
(
# can refer to the robot by this name
name "robot_1"
color "blue"
pose [ -3 -6.2 0 0 ]
hokuyolaser(pose [ 0.225 0.000 -0.15 0.000 ])
)
pioneer2dx_no_sonar
(
# can refer to the robot by this name
name "robot_2"
color "green"
pose [ 5 -6.2 0 180 ]
hokuyolaser(pose [ 0.225 0.000 -0.15 0.000 ])
)

View File

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="12">
<MapInfo class_id="0" tracking_level="0" version="0">
<mapName>map</mapName>
<distanceMapName>distfield</distanceMapName>
<voronoiMapName>voronoi</voronoiMapName>
<resolution>5.000000075e-02</resolution>
<cols>600</cols>
<rows>600</rows>
<origin_cols>2.235174179e-07</origin_cols>
<origin_rows>2.235174179e-07</origin_rows>
</MapInfo>
</boost_serialization>

View File

@ -1,6 +0,0 @@
image: map.pgm
resolution: 0.050000
origin: [-8.100000, -4.200000, 0.000000]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.196

View File

@ -1,169 +0,0 @@
define hokuyolaser ranger
(
sensor(
# laser-specific properties
# factory settings for LMS200
range [ 0.0 5.0 ]
fov 270.0
samples 270
)
model
(
# generic model properties
size [ 0.07 0.07 0.05 ] # dimensions from LMS200 data sheet
color "blue"
obstacle_return 0
)
)
define floorplan model
(
# sombre, sensible, artistic
color "gray30"
# most maps will need a bounding box
boundary 1
gui_nose 0
gui_grid 0
obstacle_return 1
gui_outline 0
gripper_return 0
fiducial_return 0
laser_return 1
)
define background model
(
# sombre, sensible, artistic
color "red"
# most maps will need a bounding box
boundary 1
gui_nose 0
gui_grid 0
obstacle_return 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 10 # simulation timestep in milliseconds
window
(
size [ 1500.000 1500.000 ]
rotate [ 0.000 0 ]
scale 50
show_data 1 # 1=on 0=off
)
# load an environment bitmap
floorplan
(
name "test_1"
bitmap "map.pgm"
size [16.15 7.85 0]
pose [0.15 0.1 0 0 ]
)
define pioneer_base position
(
color "red" # Default color.
drive "diff" # Differential steering model.
gui_nose 0 # Draw a nose on the robot so we can see which way it points
obstacle_return 0 # Can hit things.
ranger_return 0.5 # reflects sonar beams
blob_return 1 # Seen by blobfinders
fiducial_return 1 # Seen as "1" fiducial finders
localization "gps"
localization_origin [0 0 0 0] # Start odometry at (0, 0, 0).
# alternative odometric localization with simple error model
# localization "odom" # Change to "gps" to have impossibly perfect, global odometry
# odom_error [ 0.05 0.05 0.1 ] # Odometry error or slip in X, Y and Theta
# (Uniform random distribution)
# four DOF kinematics limits
# [ xmin xmax ymin ymax zmin zmax amin amax ]
velocity_bounds [-1 1 0 0 0 0 -45.0 45.0 ]
acceleration_bounds [-1.0 1.0 0 0 0 0 -45 45.0 ]
)
define pioneer2dx_base_no_sonar pioneer_base
(
# actual size
size [0.44 0.38 0.22] # sizes from MobileRobots' web site
# the pioneer's center of rotation is offset from its center of area
origin [-0.04 0 0 0]
# draw a nose on the robot so we can see which way it points
gui_nose 0
# estimated mass in KG
mass 23.0
)
# as above, but with front sonar only
define pioneer2dx_no_sonar pioneer2dx_base_no_sonar
(
# simplified Body shape:
block(
points 8
point[0] [-0.2 0.12]
point[1] [-0.2 -0.12]
point[2] [-0.12 -0.2555]
point[3] [0.12 -0.2555]
point[4] [0.2 -0.12]
point[5] [0.2 0.12]
point[6] [0.12 0.2555]
point[7] [-0.12 0.2555]
z [0 0.22]
)
)
pioneer2dx_no_sonar
(
# can refer to the robot by this name
name "robot_0"
color "red"
pose [ 0 0 0 0 ]
hokuyolaser(pose [ 0.225 0.000 -0.15 0.000 ])
)
pioneer2dx_no_sonar
(
# can refer to the robot by this name
name "robot_1"
color "blue"
pose [ -5 -2 0 0 ]
hokuyolaser(pose [ 0.225 0.000 -0.15 0.000 ])
)
pioneer2dx_no_sonar
(
# can refer to the robot by this name
name "robot_2"
color "green"
pose [ 5 -2 0 180 ]
hokuyolaser(pose [ 0.225 0.000 -0.15 0.000 ])
)

View File

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="12">
<MapInfo class_id="0" tracking_level="0" version="0">
<mapName>map</mapName>
<distanceMapName>distfield</distanceMapName>
<voronoiMapName>voronoi</voronoiMapName>
<resolution>5.000000075e-02</resolution>
<cols>330</cols>
<rows>167</rows>
<origin_cols>1.500001252e-01</origin_cols>
<origin_rows>-2.499993704e-02</origin_rows>
</MapInfo>
</boost_serialization>

View File

@ -1,6 +0,0 @@
image: map.pgm
resolution: 0.050000
origin: [-15.000000, -15.000000, 0.000000]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.196

View File

@ -1,159 +0,0 @@
define hokuyolaser ranger
(
sensor(
# laser-specific properties
# factory settings for LMS200
range [ 0.0 5.0 ]
fov 270.0
samples 270
)
model
(
# generic model properties
size [ 0.07 0.07 0.05 ] # dimensions from LMS200 data sheet
color "blue"
obstacle_return 0
)
)
define floorplan model
(
# sombre, sensible, artistic
color "gray30"
# most maps will need a bounding box
boundary 1
gui_nose 0
gui_grid 0
obstacle_return 1
gui_outline 0
gripper_return 0
fiducial_return 0
laser_return 1
)
define background model
(
# sombre, sensible, artistic
color "red"
# most maps will need a bounding box
boundary 1
gui_nose 0
gui_grid 0
obstacle_return 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 10 # simulation timestep in milliseconds
window
(
size [ 1500.000 1500.000 ]
rotate [ 0.000 0 ]
scale 50
show_data 1 # 1=on 0=off
)
# load an environment bitmap
floorplan
(
name "test_1"
bitmap "map.pgm"
size [16.0 16.0 0]
pose [ 0 0 0 0 ]
)
define pioneer_base position
(
color "red" # Default color.
drive "diff" # Differential steering model.
gui_nose 0 # Draw a nose on the robot so we can see which way it points
obstacle_return 0 # Can hit things.
ranger_return 0.5 # reflects sonar beams
blob_return 1 # Seen by blobfinders
fiducial_return 1 # Seen as "1" fiducial finders
localization "gps"
localization_origin [0 0 0 0] # Start odometry at (0, 0, 0).
# alternative odometric localization with simple error model
# localization "odom" # Change to "gps" to have impossibly perfect, global odometry
# odom_error [ 0.05 0.05 0.1 ] # Odometry error or slip in X, Y and Theta
# (Uniform random distribution)
# four DOF kinematics limits
# [ xmin xmax ymin ymax zmin zmax amin amax ]
velocity_bounds [-1 1 0 0 0 0 -45.0 45.0 ]
acceleration_bounds [-1.0 1.0 0 0 0 0 -45 45.0 ]
)
define pioneer2dx_base_no_sonar pioneer_base
(
# actual size
size [0.44 0.38 0.22] # sizes from MobileRobots' web site
# the pioneer's center of rotation is offset from its center of area
origin [-0.04 0 0 0]
# draw a nose on the robot so we can see which way it points
gui_nose 0
# estimated mass in KG
mass 23.0
)
# as above, but with front sonar only
define pioneer2dx_no_sonar pioneer2dx_base_no_sonar
(
# simplified Body shape:
block(
points 8
point[0] [-0.2 0.12]
point[1] [-0.2 -0.12]
point[2] [-0.12 -0.2555]
point[3] [0.12 -0.2555]
point[4] [0.2 -0.12]
point[5] [0.2 0.12]
point[6] [0.12 0.2555]
point[7] [-0.12 0.2555]
z [0 0.22]
)
)
pioneer2dx_no_sonar
(
# can refer to the robot by this name
name "robot_0"
color "red"
pose [ -2.9 -4 0 90 ]
hokuyolaser(pose [ 0.225 0.000 -0.15 0.000 ])
)
pioneer2dx_no_sonar
(
# can refer to the robot by this name
name "robot_1"
color "blue"
pose [ 2.4 5 0 -90 ]
hokuyolaser(pose [ 0.225 0.000 -0.15 0.000 ])
)

View File

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="12">
<MapInfo class_id="0" tracking_level="0" version="0">
<mapName>map</mapName>
<distanceMapName>distfield</distanceMapName>
<voronoiMapName>voronoi</voronoiMapName>
<resolution>5.000000075e-02</resolution>
<cols>600</cols>
<rows>600</rows>
<origin_cols>2.235174179e-07</origin_cols>
<origin_rows>2.235174179e-07</origin_rows>
</MapInfo>
</boost_serialization>

Some files were not shown because too many files have changed in this diff Show More