├── .gitignore
├── CMakeLists.txt
├── README.md
├── max_min_lp
├── CMakeLists.txt
└── package.xml
├── max_min_lp_core
├── CMakeLists.txt
├── include
│ └── max_min_lp_core
│ │ ├── MaxMinLPCore.hpp
│ │ ├── MaxMinLPDecentralizedCore.hpp
│ │ └── MaxMinLPSequentialCore.hpp
├── package.xml
└── src
│ ├── MaxMinLPCore (copy).cpp
│ ├── MaxMinLPCore.cpp
│ ├── MaxMinLPDecentralizedCore.cpp
│ └── MaxMinLPSequentialCore.cpp
├── max_min_lp_demo
├── CMakeLists.txt
├── include
│ └── max_min_lp_demo
│ │ └── MaxMinLPDemo.hpp
├── launch
│ └── test_max_min_lp.launch
├── package.xml
├── src
│ └── MaxMinLPDemo.cpp
└── yaml
│ ├── test_example.yaml
│ ├── test_example_2.yaml
│ ├── test_example_3.yaml
│ ├── test_example_num_targets.yaml
│ └── test_paper_example.yaml
├── max_min_lp_experiment
├── CMakeLists.txt
├── README.md
├── include
│ └── max_min_lp_experiment
│ │ ├── GreedyCentralNode.hpp
│ │ ├── GreedyRobotNode.hpp
│ │ └── TargetNode.hpp
├── launch
│ └── greedy_central.launch
├── package.xml
├── src
│ ├── GreedyCentralNode.cpp
│ ├── GreedyRobotNode.cpp
│ └── TargetNode.cpp
├── srv
│ ├── RobotRequest.srv
│ └── TargetRequest.srv
└── yaml
│ └── target_model.yaml
├── max_min_lp_msgs
├── CMakeLists.txt
├── msg
│ ├── general_node.msg
│ ├── general_node_array.msg
│ ├── layered_node.msg
│ ├── layered_node_array.msg
│ ├── primitive_node.msg
│ ├── server_to_robots.msg
│ ├── server_to_robots_array.msg
│ └── target_node.msg
└── package.xml
├── max_min_lp_simulation
├── CMakeLists.txt
├── data
│ ├── greedy
│ │ ├── results.txt
│ │ ├── results_for_debug.txt
│ │ ├── robots_0.txt
│ │ ├── robots_1.txt
│ │ ├── robots_2.txt
│ │ ├── robots_3.txt
│ │ ├── robots_4.txt
│ │ └── robots_5.txt
│ └── local
│ │ ├── results.txt
│ │ ├── robots_1.txt
│ │ ├── robots_2.txt
│ │ ├── robots_3.txt
│ │ ├── robots_4.txt
│ │ ├── robots_5.txt
│ │ └── targets.txt
├── gazebo_model
│ └── world
│ │ ├── target_spawn.world
│ │ └── target_spawn_journal.world
├── include
│ └── max_min_lp_simulation
│ │ ├── MaxMinLPCentralNode.hpp
│ │ ├── MaxMinLPCentralNodeSimulation.hpp
│ │ ├── MaxMinLPGreedyCentralNode.hpp
│ │ ├── MaxMinLPGreedyRobotNode.hpp
│ │ ├── MaxMinLPRobotNode.hpp
│ │ ├── MaxMinLPRobotNodeSimulation.hpp
│ │ ├── RobotGreedyJournal.hpp
│ │ ├── apply_motion_primitive.hpp
│ │ ├── apply_motion_primitive_journal.hpp
│ │ ├── get_odom.hpp
│ │ └── kalman.hpp
├── launch
│ ├── five_robot_twenty_target_case.launch
│ ├── greedy_robots_journal.launch
│ ├── greedy_server_to_robots.launch
│ ├── includes
│ │ ├── kobuki.launch.xml
│ │ └── moving_target.launch.xml
│ ├── journal.launch
│ ├── motion_primitive_test.launch
│ ├── server_to_robots.launch
│ ├── simulation_server_to_robots.launch
│ ├── single_robot_case.launch
│ ├── test_motion_primitive.launch
│ ├── three_robot_four_target_case.launch
│ ├── three_robot_four_target_case_failure_case.launch
│ └── two_robot_three_target_case.launch
├── package.xml
├── src
│ ├── MaxMinLPCentralNode.cpp
│ ├── MaxMinLPCentralNodeSimulation.cpp
│ ├── MaxMinLPGreedyCentralNode.cpp
│ ├── MaxMinLPGreedyRobotNode.cpp
│ ├── MaxMinLPRobotNode.cpp
│ ├── MaxMinLPRobotNodeSimulation.cpp
│ ├── RobotGreedyJournal.cpp
│ ├── animated_box.cc
│ ├── animated_box_journal.cc
│ ├── apply_motion_primitive.cpp
│ ├── apply_motion_primitive_journal.cpp
│ ├── get_odom.cpp
│ ├── get_result_target_num.cpp
│ ├── get_target_odom.cpp
│ ├── get_target_odom_journal.cpp
│ ├── kalman.cpp
│ └── motion_primitive_generator.cpp
├── srv
│ ├── GetOdom.srv
│ ├── GetTotalNumTarget.srv
│ ├── MessageRequest.srv
│ ├── MotionPrimitiveRequest.srv
│ └── MoveRobot.srv
└── urdf
│ ├── box.urdf.xacro
│ ├── box_library.urdf.xacro
│ └── kobuki.urdf.xacro
└── max_min_lp_visualization
├── CMakeLists.txt
├── log
├── general_graph.dot
├── general_graph.png
├── layered_graph.dot
└── layered_graph.png
├── package.xml
└── scripts
└── max_min_lp_plot.py
/.gitignore:
--------------------------------------------------------------------------------
1 | max_min_lp_demo/output/
2 | max_min_lp_demo/data/
3 |
--------------------------------------------------------------------------------
/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | /opt/ros/kinetic/share/catkin/cmake/toplevel.cmake
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # multi-robot_task_allocation
2 | Algorithms of a multi-robot task allocation for multi-target tracking are provided, which have been developed in ROS Kinetic on Ubuntu 16.04. This package provides several features for a multi-robot task allocation when tracking multiple targets. A local algorithm plays a key role in this algorithm where it provides nice properties on communication limitation and was referred by Floréen, Patrik, et al. "Local approximability of max-min and min-max linear programs." Theory of Computing Systems 49.4 (2011): 672-697.
3 |
4 | ## Run a demo
5 |
6 | Demo is included in max_min_lp_demo. In max_min_lp_demo/data there are several instances that you can test. Local algorithm is implemented in a sequential way, not in a distributed since one machine is used to test the performance of the algorithm.
7 |
8 | ```
9 | roslaunch max_min_lp_demo test_max_min_lp.launch
10 | ```
11 | In case you want to visualize an original and layered graphs of instance that you are testing, run the following.
12 |
13 | ```
14 | rosrun max_min_lp_visualization max_min_lp_plot.py
15 | ```
16 |
17 | Then, the result of the graph will be in the max_min_lp_visualization/log folder. The following will activate the demo.
18 |
19 | ```
20 | rostopic pub /robot_status std_msgs/String demo
21 | ```
22 |
23 | ## Two main algorithms
24 |
25 | There are two versions of multi-robot multi-target tracking algorithms. The first algorithm is a local algorithm based one, which is explained in the beginning. The second algorithm is a greedy one where each robot greedily track targets without considering other robots. For both a central node exists to simulate sensing and communication graphs. Each robot has its own node for local computation and getting odometry information from the gazebo simulation.
26 |
27 | ### Local algorithm
28 |
29 | Run the gazebo simulation first. This will spawn five (turtlebot) robots with thirty stationary and moving targets.
30 |
31 | ```
32 | roslaunch max_min_lp_simulation five_robot_twenty_target_case.launch
33 | ```
34 | Then, run the main algorithm.
35 |
36 | ```
37 | roslaunch max_min_lp_simulation simulation_server_to_robots.launch
38 | ```
39 |
40 | To initiate the algorithm,
41 |
42 | ```
43 | rostopic pub /robot_status std_msgs/String run
44 | ```
45 |
46 |
47 | ### Greedy algorithm
48 |
49 | Again, run the gazebo simulation first.
50 |
51 | ```
52 | roslaunch max_min_lp_simulation five_robot_twenty_target_case.launch
53 | ```
54 | Then, run the main algorithm.
55 |
56 | ```
57 | roslaunch max_min_lp_simulation greedy_server_to_robots.launch
58 | ```
59 |
60 | To initiate the algorithm,
61 | ```
62 | rostopic pub /robot_status std_msgs/String run
63 | ```
64 |
65 |
66 | ## Generating and testing motion primitives of a robot
67 |
68 | In this package, which is max_min_lp_simulation, turtlebot is used as a mobile platform. This feature allows to generate and test different sets of motion primitives of a robot while changing `cmd_vel` values with different time intervals. In our setting time interval is defined by the number of publishers applied to. First, run the following command.
69 |
70 | ```
71 | roslaunch max_min_lp_simulation single_robot_case.launch
72 | ```
73 |
74 | This will run the gazebo simulator with a single robot.
75 |
76 | ```
77 | rosrun max_min_lp_simulation motion_primitive_gerator
78 | ```
79 |
80 | Now you can feed `/robot/status` rostopic in order to move the robot. In the following the first command moves the robot `x direction` and the second one rotates the robot in the counter-clockwise. In the gazebo simulator the positive values for `x` is the forward direction to the robot while the positive values for `z` rotates the robot in the counter-clockwise.
81 |
82 | ```
83 | rostopic pub /robot_status std_msgs/String x
84 | rostopic pub /robot_status std_msgs/String z
85 | ```
86 |
87 | You can also check the odometry information of the robot by using `rostopic echo /robot_1/odom`.
88 |
--------------------------------------------------------------------------------
/max_min_lp/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | cmake_minimum_required(VERSION 2.8.3)
2 | project(max_min_lp)
3 | find_package(catkin REQUIRED)
4 | catkin_metapackage()
--------------------------------------------------------------------------------
/max_min_lp/package.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | max_min_lp
4 | 0.0.0
5 | The max_min_lp package
6 | Yoonchang Sung
7 | TODO
8 | catkin
9 | max_min_lp_core
10 | max_min_lp_msgs
11 | max_min_lp_demo
12 | max_min_lp_simulation
13 | max_min_lp_experiment
14 | max_min_lp_visualization
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/max_min_lp_core/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | cmake_minimum_required(VERSION 2.8.3)
2 | project(max_min_lp_core)
3 |
4 | find_package(catkin REQUIRED COMPONENTS
5 | max_min_lp_msgs
6 | )
7 |
8 | catkin_package(
9 | INCLUDE_DIRS include
10 | LIBRARIES max_min_lp_core
11 | CATKIN_DEPENDS max_min_lp_msgs
12 | DEPENDS
13 | )
14 |
15 | include_directories(
16 | include
17 | ${catkin_INCLUDE_DIRS}
18 | )
19 |
20 | add_library(${PROJECT_NAME}
21 | src/MaxMinLPCore.cpp
22 | src/MaxMinLPDecentralizedCore.cpp
23 | src/MaxMinLPSequentialCore.cpp
24 | )
25 |
26 | target_link_libraries(${PROJECT_NAME}
27 | ${catkin_LIBRARIES}
28 | )
29 |
30 | add_dependencies(${PROJECT_NAME} max_min_lp_msgs_generate_messages_cpp)
31 |
--------------------------------------------------------------------------------
/max_min_lp_core/include/max_min_lp_core/MaxMinLPCore.hpp:
--------------------------------------------------------------------------------
1 | #ifndef MAXMINLPCORE_HPP_
2 | #define MAXMINLPCORE_HPP_
3 |
4 | #include
5 | #include
6 | #include
7 | #include
8 | #include
9 | #include
10 | #include