diff --git a/.dockerignore b/.dockerignore
index 6adaed3e3..87faeb72a 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -15,10 +15,10 @@ docker-compose.*
bez1_description/meshes/*.stl
bez2_description/meshes/*.stl
soccer_fieldline_detection/media
-soccerbot/bags/*
+#soccerbot/bags/*
!soccerbot/bags/*.sh
LICENSE
venv/
-*.webm
-soccer_perception/data/images/*
-soccer_perception/data/videos/*
+#*.webm
+#soccer_perception/data/images/*
+#soccer_perception/data/videos/*
diff --git a/.github/workflows/docker_image.yml b/.github/workflows/docker_image.yml
index 047f1d452..7a68f9076 100644
--- a/.github/workflows/docker_image.yml
+++ b/.github/workflows/docker_image.yml
@@ -72,7 +72,7 @@ jobs:
with:
context: .
push: true
- file: Dockerfile
+ file: tools/docker/Dockerfile
build-args: |
INSTALL_CUDA=true
tags: utrarobosoccer/soccerbot
diff --git a/.github/workflows/docker_image_arm.yml b/.github/workflows/docker_image_arm.yml
index 05d4c45fd..0a0785199 100644
--- a/.github/workflows/docker_image_arm.yml
+++ b/.github/workflows/docker_image_arm.yml
@@ -53,7 +53,7 @@ jobs:
with:
context: .
push: true
- file: Dockerfile
+ file: tools/docker/Dockerfile
platforms: linux/arm64
tags: utrarobosoccer/soccerbot:arm64
cache-from: type=registry,ref=utrarobosoccer/soccerbot:arm64
diff --git a/.github/workflows/docker_image_no_cuda.yml b/.github/workflows/docker_image_no_cuda.yml
index 65f7d40d4..8eb1582f3 100644
--- a/.github/workflows/docker_image_no_cuda.yml
+++ b/.github/workflows/docker_image_no_cuda.yml
@@ -44,9 +44,9 @@ jobs:
with:
context: .
push: true
- file: Dockerfile
+ file: tools/docker/Dockerfile
build-args: |
INSTALL_CUDA=false
tags: utrarobosoccer/soccerbot:no_cuda
- cache-from: type=registry,ref=utrarobosoccer/soccerbot
+ cache-from: type=registry,ref=utrarobosoccer/soccerbot:no_cuda
cache-to: type=inline
diff --git a/.gitignore b/.gitignore
index 599facc77..e3305e30f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,7 +7,7 @@
# Python compiled files
__pycache__/
*.pyc
-
+.idea/
# webots cache files
soccer_webots/protos/*.cache
soccer_webots/protos/Soccerbot_meshes/*.cache
@@ -34,5 +34,3 @@ venv/
.mypy_cache/
cuda-ubuntu2004.pin.1
*.webm
-
-.idea/
diff --git a/.gitmodules b/.gitmodules
index 636d754e3..4fafdf74c 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -8,9 +8,6 @@
[submodule "soccer_strategy/src/game_controller/RobocupProtocol"]
path = soccer_strategy/src/game_controller/RobocupProtocol
url = git@github.com:utra-robosoccer/RobocupProtocol.git
-[submodule "external/yolov5"]
- path = external/yolov5
- url = git@github.com:utra-robosoccer/yolov5.git
[submodule "external/hlvs_webots"]
path = external/hlvs_webots
url = git@github.com:utra-robosoccer/hlvs_webots.git
diff --git a/.idea/.gitignore b/.idea/.gitignore
deleted file mode 100644
index 73f69e095..000000000
--- a/.idea/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
-# Datasource local storage ignored files
-/dataSources/
-/dataSources.local.xml
-# Editor-based HTTP Client requests
-/httpRequests/
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index 76e3f6af2..3e22f4b71 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -2,7 +2,6 @@
-
@@ -20,6 +19,10 @@
+
+
+
+
@@ -28,11 +31,6 @@
-
-
-
-
-
@@ -49,5 +47,11 @@
+
+
+
+
+
+
-
+
\ No newline at end of file
diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
index 0f7bc519d..79ee123c2 100644
--- a/.idea/codeStyles/codeStyleConfig.xml
+++ b/.idea/codeStyles/codeStyleConfig.xml
@@ -2,4 +2,4 @@
-
+
\ No newline at end of file
diff --git a/.idea/deployment.xml b/.idea/deployment.xml
deleted file mode 100644
index fe490b533..000000000
--- a/.idea/deployment.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
index 756299869..a86eb75c1 100644
--- a/.idea/inspectionProfiles/Project_Default.xml
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -1,21 +1,69 @@
-
-
-
-
-
-
-
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
index cc5462daf..105ce2da2 100644
--- a/.idea/inspectionProfiles/profiles_settings.xml
+++ b/.idea/inspectionProfiles/profiles_settings.xml
@@ -3,4 +3,4 @@
-
+
\ No newline at end of file
diff --git a/.idea/jupyter-settings.xml b/.idea/jupyter-settings.xml
deleted file mode 100644
index 9d1e7f6b5..000000000
--- a/.idea/jupyter-settings.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/libraries/ROS.xml b/.idea/libraries/ROS.xml
deleted file mode 100644
index 5df2796bd..000000000
--- a/.idea/libraries/ROS.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/.idea/libraries/workspace.xml b/.idea/libraries/workspace.xml
deleted file mode 100644
index cc4cc660d..000000000
--- a/.idea/libraries/workspace.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 526f0ae95..566caa28a 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,11 +1,7 @@
-
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/.idea/other.xml b/.idea/other.xml
deleted file mode 100644
index e6dee4f4a..000000000
--- a/.idea/other.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/remote-mappings.xml b/.idea/remote-mappings.xml
index f9ba99f4f..f97a43e32 100644
--- a/.idea/remote-mappings.xml
+++ b/.idea/remote-mappings.xml
@@ -3,24 +3,10 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/.idea/ros.xml b/.idea/ros.xml
deleted file mode 100644
index b4ed18d11..000000000
--- a/.idea/ros.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea/runConfigurations/Python_tests_for_soccer_control_soccer_pycontrol_test_test_walking_TestWalking.xml b/.idea/runConfigurations/Python_tests_for_soccer_control_soccer_pycontrol_test_test_walking_TestWalking.xml
deleted file mode 100644
index a4ffbc64d..000000000
--- a/.idea/runConfigurations/Python_tests_for_soccer_control_soccer_pycontrol_test_test_walking_TestWalking.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/Python_tests_for_soccer_control_soccer_pycontrol_test_test_walking_TestWalking_test_imu_feedback_real.xml b/.idea/runConfigurations/Python_tests_for_soccer_control_soccer_pycontrol_test_test_walking_TestWalking_test_imu_feedback_real.xml
deleted file mode 100644
index 483a077e0..000000000
--- a/.idea/runConfigurations/Python_tests_for_soccer_control_soccer_pycontrol_test_test_walking_TestWalking_test_imu_feedback_real.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/Python_tests_for_soccer_control_soccer_pycontrol_test_test_walking_TestWalking_test_walk_1_real_robot.xml b/.idea/runConfigurations/Python_tests_for_soccer_control_soccer_pycontrol_test_test_walking_TestWalking_test_walk_1_real_robot.xml
deleted file mode 100644
index f4cdae6cd..000000000
--- a/.idea/runConfigurations/Python_tests_for_soccer_control_soccer_pycontrol_test_test_walking_TestWalking_test_walk_1_real_robot.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/Python_tests_for_soccer_localization_src_soccer_localization_test_test_simple.xml b/.idea/runConfigurations/Python_tests_for_soccer_localization_src_soccer_localization_test_test_simple.xml
deleted file mode 100644
index e55f782ad..000000000
--- a/.idea/runConfigurations/Python_tests_for_soccer_localization_src_soccer_localization_test_test_simple.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/Python_tests_for_soccer_msgs_test_game_engine_2d_Test.xml b/.idea/runConfigurations/Python_tests_for_soccer_msgs_test_game_engine_2d_Test.xml
deleted file mode 100644
index 54f81c371..000000000
--- a/.idea/runConfigurations/Python_tests_for_soccer_msgs_test_game_engine_2d_Test.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/Python_tests_for_soccer_perception_soccer_object_detection_test_test_object_detection.xml b/.idea/runConfigurations/Python_tests_for_soccer_perception_soccer_object_detection_test_test_object_detection.xml
deleted file mode 100644
index aedc04d92..000000000
--- a/.idea/runConfigurations/Python_tests_for_soccer_perception_soccer_object_detection_test_test_object_detection.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/Python_tests_for_soccer_perception_soccer_object_detection_test_test_object_detection2.xml b/.idea/runConfigurations/Python_tests_for_soccer_perception_soccer_object_detection_test_test_object_detection2.xml
deleted file mode 100644
index a3cc8e0be..000000000
--- a/.idea/runConfigurations/Python_tests_for_soccer_perception_soccer_object_detection_test_test_object_detection2.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/Python_tests_for_soccer_perception_soccer_object_detection_test_test_object_detection3.xml b/.idea/runConfigurations/Python_tests_for_soccer_perception_soccer_object_detection_test_test_object_detection3.xml
deleted file mode 100644
index db0fde26e..000000000
--- a/.idea/runConfigurations/Python_tests_for_soccer_perception_soccer_object_detection_test_test_object_detection3.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/Python_tests_for_soccer_perception_soccer_object_detection_test_test_object_detection_TestObjectDetection_test_object_detection_node.xml b/.idea/runConfigurations/Python_tests_for_soccer_perception_soccer_object_detection_test_test_object_detection_TestObjectDetection_test_object_detection_node.xml
deleted file mode 100644
index 054ea91fc..000000000
--- a/.idea/runConfigurations/Python_tests_for_soccer_perception_soccer_object_detection_test_test_object_detection_TestObjectDetection_test_object_detection_node.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/Python_tests_for_soccer_perception_soccer_object_localization_test_test_object_localization.xml b/.idea/runConfigurations/Python_tests_for_soccer_perception_soccer_object_localization_test_test_object_localization.xml
deleted file mode 100644
index 312fa0aa5..000000000
--- a/.idea/runConfigurations/Python_tests_for_soccer_perception_soccer_object_localization_test_test_object_localization.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/Python_tests_for_soccer_perception_soccer_object_localization_test_test_object_localization_TestObjectLocalization_test_goalpost_detection.xml b/.idea/runConfigurations/Python_tests_for_soccer_perception_soccer_object_localization_test_test_object_localization_TestObjectLocalization_test_goalpost_detection.xml
deleted file mode 100644
index 49c11617c..000000000
--- a/.idea/runConfigurations/Python_tests_for_soccer_perception_soccer_object_localization_test_test_object_localization_TestObjectLocalization_test_goalpost_detection.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/Python_tests_for_soccer_perception_soccer_object_localization_test_test_object_localization_TestObjectLocalization_test_hsv_filter.xml b/.idea/runConfigurations/Python_tests_for_soccer_perception_soccer_object_localization_test_test_object_localization_TestObjectLocalization_test_hsv_filter.xml
deleted file mode 100644
index 4d0786632..000000000
--- a/.idea/runConfigurations/Python_tests_for_soccer_perception_soccer_object_localization_test_test_object_localization_TestObjectLocalization_test_hsv_filter.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/Python_tests_for_soccer_perception_soccer_object_localization_test_test_object_localization_TestObjectLocalization_test_robot_detection.xml b/.idea/runConfigurations/Python_tests_for_soccer_perception_soccer_object_localization_test_test_object_localization_TestObjectLocalization_test_robot_detection.xml
deleted file mode 100644
index 6dc2842b2..000000000
--- a/.idea/runConfigurations/Python_tests_for_soccer_perception_soccer_object_localization_test_test_object_localization_TestObjectLocalization_test_robot_detection.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/Python_tests_for_soccer_strategy_test_test_game_engine_2d_TestGameEngine2D.xml b/.idea/runConfigurations/Python_tests_for_soccer_strategy_test_test_game_engine_2d_TestGameEngine2D.xml
deleted file mode 100644
index 49a2b4a45..000000000
--- a/.idea/runConfigurations/Python_tests_for_soccer_strategy_test_test_game_engine_2d_TestGameEngine2D.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/Python_tests_for_soccer_strategy_test_test_game_engine_2d_TestGameEngine2D_test_dummy_vs_dummy_strategy.xml b/.idea/runConfigurations/Python_tests_for_soccer_strategy_test_test_game_engine_2d_TestGameEngine2D_test_dummy_vs_dummy_strategy.xml
deleted file mode 100644
index ff0ceda13..000000000
--- a/.idea/runConfigurations/Python_tests_for_soccer_strategy_test_test_game_engine_2d_TestGameEngine2D_test_dummy_vs_dummy_strategy.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/Python_tests_for_soccer_trajectories.xml b/.idea/runConfigurations/Python_tests_for_soccer_trajectories.xml
deleted file mode 100644
index f91a15cfa..000000000
--- a/.idea/runConfigurations/Python_tests_for_soccer_trajectories.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/Python_tests_for_soccer_trajectories2.xml b/.idea/runConfigurations/Python_tests_for_soccer_trajectories2.xml
deleted file mode 100644
index f91a15cfa..000000000
--- a/.idea/runConfigurations/Python_tests_for_soccer_trajectories2.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/Python_tests_for_soccer_trajectories_trajectory.xml b/.idea/runConfigurations/Python_tests_for_soccer_trajectories_trajectory.xml
deleted file mode 100644
index 6c51316c1..000000000
--- a/.idea/runConfigurations/Python_tests_for_soccer_trajectories_trajectory.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/Python_tests_for_soccer_trajectories_trajectory2.xml b/.idea/runConfigurations/Python_tests_for_soccer_trajectories_trajectory2.xml
deleted file mode 100644
index 527c2297b..000000000
--- a/.idea/runConfigurations/Python_tests_for_soccer_trajectories_trajectory2.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/Python_tests_for_test_calibration_TestWalking_test_obtain_calibration_bez1.xml b/.idea/runConfigurations/Python_tests_for_test_calibration_TestWalking_test_obtain_calibration_bez1.xml
deleted file mode 100644
index 4d3925648..000000000
--- a/.idea/runConfigurations/Python_tests_for_test_calibration_TestWalking_test_obtain_calibration_bez1.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/Python_tests_for_test_integration_IntegrationTestInitial_test_game_start.xml b/.idea/runConfigurations/Python_tests_for_test_integration_IntegrationTestInitial_test_game_start.xml
deleted file mode 100644
index 7e1f6711e..000000000
--- a/.idea/runConfigurations/Python_tests_for_test_integration_IntegrationTestInitial_test_game_start.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/Python_tests_for_test_integration_IntegrationTestPlaying_test_annotate_ball.xml b/.idea/runConfigurations/Python_tests_for_test_integration_IntegrationTestPlaying_test_annotate_ball.xml
deleted file mode 100644
index d8855a4d4..000000000
--- a/.idea/runConfigurations/Python_tests_for_test_integration_IntegrationTestPlaying_test_annotate_ball.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/Python_tests_for_test_integration_IntegrationTestPlaying_test_annotate_net.xml b/.idea/runConfigurations/Python_tests_for_test_integration_IntegrationTestPlaying_test_annotate_net.xml
deleted file mode 100644
index 1fdd8425a..000000000
--- a/.idea/runConfigurations/Python_tests_for_test_integration_IntegrationTestPlaying_test_annotate_net.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/Python_tests_for_test_integration_IntegrationTestPlaying_test_kick_right.xml b/.idea/runConfigurations/Python_tests_for_test_integration_IntegrationTestPlaying_test_kick_right.xml
deleted file mode 100644
index f4895d002..000000000
--- a/.idea/runConfigurations/Python_tests_for_test_integration_IntegrationTestPlaying_test_kick_right.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/Python_tests_for_test_localization_test_freehicle_movement.xml b/.idea/runConfigurations/Python_tests_for_test_localization_test_freehicle_movement.xml
deleted file mode 100644
index cfa8d6674..000000000
--- a/.idea/runConfigurations/Python_tests_for_test_localization_test_freehicle_movement.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/Single_Simulation.xml b/.idea/runConfigurations/Single_Simulation.xml
deleted file mode 100644
index de6cdfcc1..000000000
--- a/.idea/runConfigurations/Single_Simulation.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/Unittests_for_soccer_msgs_test_game_engine_2d_Test.xml b/.idea/runConfigurations/Unittests_for_soccer_msgs_test_game_engine_2d_Test.xml
deleted file mode 100644
index 69f770d21..000000000
--- a/.idea/runConfigurations/Unittests_for_soccer_msgs_test_game_engine_2d_Test.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/Unittests_for_test_integration_IntegrationTest.xml b/.idea/runConfigurations/Unittests_for_test_integration_IntegrationTest.xml
deleted file mode 100644
index bc3edeaa2..000000000
--- a/.idea/runConfigurations/Unittests_for_test_integration_IntegrationTest.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/main.xml b/.idea/runConfigurations/main.xml
deleted file mode 100644
index f4536f212..000000000
--- a/.idea/runConfigurations/main.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/pytest_for_soccer_trajectories.xml b/.idea/runConfigurations/pytest_for_soccer_trajectories.xml
deleted file mode 100644
index 0887b6511..000000000
--- a/.idea/runConfigurations/pytest_for_soccer_trajectories.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/pytest_in_soccerbot.xml b/.idea/runConfigurations/pytest_in_soccerbot.xml
deleted file mode 100644
index b17977c12..000000000
--- a/.idea/runConfigurations/pytest_in_soccerbot.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations/train.xml b/.idea/runConfigurations/train.xml
deleted file mode 100644
index 15d995fe5..000000000
--- a/.idea/runConfigurations/train.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/soccerbot.iml b/.idea/soccerbot.iml
index b67516342..c39bdf1c4 100644
--- a/.idea/soccerbot.iml
+++ b/.idea/soccerbot.iml
@@ -3,36 +3,30 @@
-
-
-
-
-
+
-
-
-
-
-
-
+
+
-
-
+
-
-
-
-
+
+
+
+
-
+
+
+
+
\ No newline at end of file
diff --git a/.idea/soccerbot2.iml b/.idea/soccerbot2.iml
deleted file mode 100644
index e69de29bb..000000000
diff --git a/.idea/sshConfigs.xml b/.idea/sshConfigs.xml
deleted file mode 100644
index 3af219d04..000000000
--- a/.idea/sshConfigs.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
index b9f26bbe0..9436ac6c3 100644
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -1,7 +1,7 @@
-
+
@@ -12,5 +12,6 @@
+
\ No newline at end of file
diff --git a/.idea/webServers.xml b/.idea/webServers.xml
deleted file mode 100644
index 3342dbf6a..000000000
--- a/.idea/webServers.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Jason's Home
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/compose.yaml b/compose.yaml
index df5e792dd..7acddde51 100644
--- a/compose.yaml
+++ b/compose.yaml
@@ -1,6 +1,3 @@
-# Instructions
-# https://github.com/utra-robosoccer/soccerbot/wiki/Docker
-
x-gpu: &gpu
deploy:
resources:
@@ -10,92 +7,37 @@ x-gpu: &gpu
count: all
capabilities: [gpu, compute, utility, graphics]
-x-soccerbot: &soccerbot
- <<: *gpu
- image: utrarobosoccer/soccerbot
- privileged: true
- user: "1000"
- build:
- context: .
- target: builder
- args:
- - BUILDKIT_INLINE_CACHE=1
- cache_from:
- - utrarobosoccer/soccerbot
- cap_add:
- - SYS_PTRACE
- - SYS_NICE
- pid: "host"
- security_opt:
- - seccomp:unconfined
- command:
- /bin/bash -c "export ROS_MASTER_URI=http://$$(hostname -i):11311 && export ROS_IP=$$(hostname -i) &&
- bash ./src/soccerbot/soccerbot/scripts/start_competition.sh robot$$ROBOCUP_ROBOT_ID"
- volumes:
- - .:/home/$USER/catkin_ws/src/soccerbot
- - .:/home/robosoccer/catkin_ws/src/soccerbot
- - /tmp/.X11-unix:/tmp/.X11-unix:rw
- - /dev/dri:/dev/dri:rw
- - /dev/snd:/dev/snd:rw
- - /var/run/docker.sock:/var/run/docker.sock
-
services:
simulator:
<<: *gpu
- image: utrarobosoccer/webots
- stop_signal: SIGINT
- stop_grace_period: 10s
- privileged: true
- build:
- context: external
- args:
- - BUILDKIT_INLINE_CACHE=1
- cache_from:
- - utrarobosoccer/webots
- cap_add:
- - SYS_PTRACE
- pid: "host"
- command: bash -c "cd webots && ./webots --batch --sysinfo --log-performance=performance.log /usr/local/hlvs_webots/worlds/robocup.wbt"
- volumes:
- - /tmp/.X11-unix:/tmp/.X11-unix:rw
- - /dev/dri:/dev/dri:rw
- - /dev/snd:/dev/snd:rw
- - ./external/hlvs_webots/worlds:/usr/local/hlvs_webots/worlds:rw
- - ./external/hlvs_webots/controllers/referee/:/usr/local/hlvs_webots/controllers/referee/:rw
- - ./external/hlvs_webots/protos/:/usr/local/hlvs_webots/protos/:rw
- environment:
- DISPLAY: unix$DISPLAY
- JAVA_HOME: /usr
- XDG_RUNTIME_DIR: $XDG_RUNTIME_DIR
- # Specify in comma seperated list see https://github.com/utra-robosoccer/hlvs_webots/blob/16194d22c91b8dfcae3b3298524281bf895cab5d/controllers/referee/team.py#L36
- TEAM_1_PLAYERS_ON_FIELD: "1"
- TEAM_2_PLAYERS_ON_FIELD: ""
- ROBOT_MODEL: "bez1"
+ network_mode: host
+ extends:
+ file: tools/docker/compose.simulation.yaml
+ service: simulator
- friendly:
- <<: *soccerbot
- environment:
- ROBOCUP_ROBOT_ID: 1 # (see start_competition.sh for positions), not 1 https://discord.com/channels/462951096374132736/798238127588114462/954388600290685008
- ROBOT_MODEL: bez1
- ROBOCUP_TEAM_COLOR: "red"
- ROBOCUP_SIMULATOR_ADDR: "simulator:10001"
- ROBOCUP_GAMECONTROLLER_IP: "simulator"
- ROBOCUP_MIRROR_SERVER_IP: "simulator"
- ROBOCUP_TEAM_ID: 16
- PYTHONUNBUFFERED: 1
- DISPLAY: unix$DISPLAY
- XDG_RUNTIME_DIR: $XDG_RUNTIME_DIR
+ soccerbot_no_cuda:
+ network_mode: host
+ extends:
+ file: tools/docker/compose.autonomy.yaml
+ service: soccerbot_no_cuda
+
+ soccerbot:
+ <<: *gpu
+ network_mode: host
+ extends:
+ file: tools/docker/compose.autonomy.yaml
+ service: soccerbot
- opponent:
- <<: *soccerbot
- environment:
- ROBOCUP_ROBOT_ID: 1
- ROBOT_MODEL: bez1
- ROBOCUP_TEAM_COLOR: "blue"
- ROBOCUP_SIMULATOR_ADDR: "simulator:10021"
- ROBOCUP_GAMECONTROLLER_IP: "simulator"
- ROBOCUP_MIRROR_SERVER_IP: "simulator"
- ROBOCUP_TEAM_ID: 5
- PYTHONUNBUFFERED: 1
- DISPLAY: unix$DISPLAY
- XDG_RUNTIME_DIR: $XDG_RUNTIME_DIR
+ soccerbot_arm64:
+ extends:
+ file: tools/docker/compose.autonomy_arm64.yaml
+ service: soccerbot_arm64
+# soccerbot_test:
+# extends:
+# file: tools/docker/compose.testing.yaml
+# service: soccerbot_test
+#
+# simulator_test:
+# extends:
+# file: tools/docker/compose.testing.yaml
+# service: simulator
diff --git a/external/yolov5 b/external/yolov5
deleted file mode 160000
index eef90572b..000000000
--- a/external/yolov5
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit eef90572bf11602b17816a1721980cdb07a95eb2
diff --git a/pyproject.toml b/pyproject.toml
index 3ad54d3a5..dff35dc5b 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -13,7 +13,7 @@ description = "Main software for bez the humanoid soccer player"
readme = "README.md"
requires-python = ">=3.8"
license = {text = "BSD-3-Clause"}
-dynamic = ["version", "dependencies"]
+dynamic = ["version", "dependencies", "optional-dependencies"]
[project.urls]
"Homepage" = "https://utra-robosoccer.github.io/"
@@ -25,15 +25,19 @@ py-modules = []
package-data = {"sample" = ["*.dat"]}
[tool.setuptools.dynamic]
-dependencies = {file = ["requirements.txt"]}
+dependencies = {file = ["tools/setup/requirements.txt"]}
+optional-dependencies = {gpu = { file = ["tools/setup/requirements-gpu.txt"] }}
+
+[tool.distutils.egg_info]
+egg_base = "/tmp"
[tool.mypy]
warn_return_any = true
warn_unused_configs = true
ignore_missing_imports = true
check_untyped_defs = true
-exclude = "cmake-build-debug|setup.py|external"
-disable_error_code = "attr-defined"
+exclude = "cmake-build-debug|setup.py|external|soccer_strategy|soccer_common|soccer_msgs|soccer_localization|soccer_description|soccer_webots"
+disable_error_code = ["attr-defined", "import-untyped"]
[tool.coverage.run]
@@ -72,3 +76,6 @@ omit =[
"*/docs/*",
"*/scripts/*",
"*/cmake-build-debug/*"]
+
+[tool.pytest.ini_options]
+qt_api="pyqt6"
diff --git a/requirements.txt b/requirements.txt
deleted file mode 100644
index bb241db37..000000000
--- a/requirements.txt
+++ /dev/null
@@ -1,44 +0,0 @@
-osrf-pycommon
-pip>=21.0.1
-matplotlib==3.5.3
-numpy>=1.20.2
-roslibpy
-scipy>=1.10.1
-transforms3d~=0.4.1
-construct==2.10.67
-opencv-python>=4.5.5.62
-setuptools~=73.0.1
-pytest~=7.4.0
-protobuf==3.20.2
-pre-commit
-timeout_decorator
-filterpy~=1.4.5
-gdown==4.5.4
-
-pygame~=2.5.0
-ultralytics~=8.2.82
-
-# Control
-pin~=2.7.0
-placo~=0.6.2
-pybullet~=3.2.5; platform_machine == 'x86_64'
-mujoco~=3.2.0; platform_machine == 'x86_64'
-
-# object detection
-requests==2.32.03
-ipython==8.10.0
-Pillow==10.4.0
-psutil==5.9.8; platform_machine == 'x86_64'
-torch==2.3.1+cu121; platform_machine == 'x86_64'
-torchvision==0.18.1+cu121; platform_machine == 'x86_64'
-mypy-extensions~=1.0.0
-Cython~=3.0.10
-PyYAML~=6.0.1
-argparse~=1.4.0
-open3d~=0.17.0; platform_machine == 'x86_64'
-
-empy~=3.3.4
-
-catkin_pkg_modules==1.0.0
-catkin-pkg~=0.5.2
-rospkg~=1.5.1
diff --git a/soccer_control/soccer_pycontrol/config/bez1/bez1.yaml b/soccer_control/soccer_pycontrol/config/bez1/bez1.yaml
index 7e497550c..d68ff8a9a 100644
--- a/soccer_control/soccer_pycontrol/config/bez1/bez1.yaml
+++ b/soccer_control/soccer_pycontrol/config/bez1/bez1.yaml
@@ -48,6 +48,6 @@ foot_zmp_target_y: 0.0 # Reference target ZMP position in the foot [m]
# Limit parameters
walk_max_dtheta: 1 # Maximum dtheta per step [rad]
-walk_max_dy: 0.04 # Maximum dy per step [m]
-walk_max_dx_forward: 0.08 # Maximum dx per step forward [m]
-walk_max_dx_backward: 0.03 # Maximum dx per step backward [m]
+walk_max_dy: 0.1 # Maximum dy per step [m]
+walk_max_dx_forward: 0.1 # Maximum dx per step forward [m]
+walk_max_dx_backward: 0.1 # Maximum dx per step backward [m]
diff --git a/soccer_control/soccer_pycontrol/config/bez1/bez1_sim.yaml b/soccer_control/soccer_pycontrol/config/bez1/bez1_sim.yaml
index 7e497550c..a7320714c 100644
--- a/soccer_control/soccer_pycontrol/config/bez1/bez1_sim.yaml
+++ b/soccer_control/soccer_pycontrol/config/bez1/bez1_sim.yaml
@@ -12,7 +12,7 @@ arm_1_center: 2.512
walking_pitch_kp: 0.0 #2.3 1
walking_pitch_kd: 0 #1
walking_pitch_ki: 0.000
-walking_pitch_setpoint: -0.0
+walking_pitch_setpoint: -0.01
walking_pitch_offset: 0.0
walking_roll_kp: 0.0 #1.5 1
@@ -35,7 +35,7 @@ replan_timesteps: 10 # Replanning each n timesteps
# Posture parameters
walk_com_height: 0.21 # Constant height for the CoM [m]
walk_foot_height: 0.04 # Height of foot rising while walking [m]
-walk_trunk_pitch: 0.0 # Trunk pitch angle [rad]
+walk_trunk_pitch: 0.0 # Trunk pitch angle [rad] -0.15 good
walk_foot_rise_ratio: 0.2 # Time ratio for the foot swing plateau (0.0 to 1.0)
# Feet parameters
@@ -48,6 +48,6 @@ foot_zmp_target_y: 0.0 # Reference target ZMP position in the foot [m]
# Limit parameters
walk_max_dtheta: 1 # Maximum dtheta per step [rad]
-walk_max_dy: 0.04 # Maximum dy per step [m]
-walk_max_dx_forward: 0.08 # Maximum dx per step forward [m]
-walk_max_dx_backward: 0.03 # Maximum dx per step backward [m]
+walk_max_dy: 0.1 # Maximum dy per step [m]
+walk_max_dx_forward: 0.1 # Maximum dx per step forward [m]
+walk_max_dx_backward: 0.1 # Maximum dx per step backward [m]
diff --git a/soccer_control/soccer_pycontrol/config/bez1/bez1_sim_pybullet.yaml b/soccer_control/soccer_pycontrol/config/bez1/bez1_sim_pybullet.yaml
index 3be0d9bc5..4a85b9e25 100644
--- a/soccer_control/soccer_pycontrol/config/bez1/bez1_sim_pybullet.yaml
+++ b/soccer_control/soccer_pycontrol/config/bez1/bez1_sim_pybullet.yaml
@@ -35,7 +35,7 @@ replan_timesteps: 10 # Replanning each n timesteps
# Posture parameters
walk_com_height: 0.21 # Constant height for the CoM [m]
walk_foot_height: 0.04 # Height of foot rising while walking [m]
-walk_trunk_pitch: 0.0 # Trunk pitch angle [rad]
+walk_trunk_pitch: 0 # Trunk pitch angle [rad]
walk_foot_rise_ratio: 0.2 # Time ratio for the foot swing plateau (0.0 to 1.0)
# Feet parameters
@@ -48,6 +48,6 @@ foot_zmp_target_y: 0.0 # Reference target ZMP position in the foot [m]
# Limit parameters
walk_max_dtheta: 1 # Maximum dtheta per step [rad]
-walk_max_dy: 0.04 # Maximum dy per step [m]
-walk_max_dx_forward: 0.08 # Maximum dx per step forward [m]
-walk_max_dx_backward: 0.03 # Maximum dx per step backward [m]
+walk_max_dy: 0.1 # Maximum dy per step [m]
+walk_max_dx_forward: 0.1 # Maximum dx per step forward [m]
+walk_max_dx_backward: 0.1 # Maximum dx per step backward [m]
diff --git a/soccer_control/soccer_pycontrol/config/bez2/bez2_sim_pybullet.yaml b/soccer_control/soccer_pycontrol/config/bez2/bez2_sim_pybullet.yaml
index 1e769e06c..31164840c 100644
--- a/soccer_control/soccer_pycontrol/config/bez2/bez2_sim_pybullet.yaml
+++ b/soccer_control/soccer_pycontrol/config/bez2/bez2_sim_pybullet.yaml
@@ -49,5 +49,5 @@ foot_zmp_target_y: 0.0 # Reference target ZMP position in the foot [m]
# Limit parameters
walk_max_dtheta: 1 # Maximum dtheta per step [rad]
walk_max_dy: 0.04 # Maximum dy per step [m]
-walk_max_dx_forward: 0.08 # Maximum dx per step forward [m]
+walk_max_dx_forward: 0.1 # Maximum dx per step forward [m]
walk_max_dx_backward: 0.03 # Maximum dx per step backward [m]
diff --git a/soccer_control/soccer_pycontrol/doc/ClassDiagrams.md b/soccer_control/soccer_pycontrol/doc/ClassDiagrams.md
index 778d57dfc..38973702d 100644
--- a/soccer_control/soccer_pycontrol/doc/ClassDiagrams.md
+++ b/soccer_control/soccer_pycontrol/doc/ClassDiagrams.md
@@ -16,7 +16,7 @@ classDiagram
class IKCalc
}
namespace Walk {
- class WalkEngine
+ class Navigator
class FootStepPlanner
class Path
class Stabilize
@@ -40,17 +40,17 @@ classDiagram
%% Nav *--|> FootStepPlanner
- FootStepPlanner <|--* WalkEngine
+ FootStepPlanner <|--* Navigator
%% FootStepPlanner *--|> Path
Path <|--* FootStepPlanner
- WalkEngine *--|> Stabilize
+ Navigator *--|> Stabilize
Stabilize *--|> StabilizePhase
%% Nav *--|> World
- World <|--* WalkEngine
+ World <|--* Navigator
%% Nav *--|> Bez
- Bez <|--* WalkEngine
+ Bez <|--* Navigator
diff --git a/soccer_control/soccer_pycontrol/doc/README.md b/soccer_control/soccer_pycontrol/doc/README.md
index d6d39c4f0..d04ccd902 100644
--- a/soccer_control/soccer_pycontrol/doc/README.md
+++ b/soccer_control/soccer_pycontrol/doc/README.md
@@ -7,7 +7,7 @@
| `KinematicData` | Class to contain all relevant information about the kinematics of model. Uses pinnoccio to load from urdf |
| `IKActions` | Class for actions robot will do using ik |
| `IKCalculation` | Main inverse kinematic calculations. |
-| `WalkEngine` | Main loop for the walk engine. Interfaces with all classes to perform walking. |
+| `Navigator` | Main loop for the walk engine. Interfaces with all classes to perform walking. |
| `FootStepPlanner` | Class to interface with path for robot foot steps. |
| `Stabilize` | Manages PID loops for pitch, roll while standing and walking. |
| `StabilizePhase` | Experimental for a phase roll pid thingy. |
diff --git a/soccer_control/soccer_pycontrol/src/soccer_pycontrol/exp/placo_joint_tasks.py b/soccer_control/soccer_pycontrol/src/soccer_pycontrol/exp/placo_joint_tasks.py
index 2767cf9bd..695ded97d 100644
--- a/soccer_control/soccer_pycontrol/src/soccer_pycontrol/exp/placo_joint_tasks.py
+++ b/soccer_control/soccer_pycontrol/src/soccer_pycontrol/exp/placo_joint_tasks.py
@@ -6,7 +6,7 @@
from ischedule import run_loop, schedule
from placo_utils.visualization import point_viz, robot_frame_viz, robot_viz
-robot_model = "bez2"
+robot_model = "bez1"
model_filename = expanduser("~") + f"/catkin_ws/src/soccerbot/soccer_description/{robot_model}_description/urdf/robot.urdf"
robot = placo.HumanoidRobot(model_filename)
@@ -39,9 +39,14 @@
right_foot_task = solver.add_frame_task("right_foot", T_world_right)
right_foot_task.configure("right_foot", "soft", 1.0, 1.0)
-T_world_right_forearm = robot.get_T_world_frame("right_forearm")
-right_hand_task = solver.add_frame_task("right_forearm", T_world_right_forearm)
-right_hand_task.configure("right_forearm", "soft", 1.0, 1.0)
+# T_world_right_forearm = robot.get_T_world_frame("right_forearm")
+# right_hand_task = solver.add_frame_task("right_forearm", T_world_right_forearm)
+# right_hand_task.configure("right_forearm", "soft", 1.0, 1.0)
+
+# Look at ball
+look_at_ball = solver.add_axisalign_task("camera", np.array([1.0, 0.0, 0.0]), np.array([1.0, 0.0, 0.0]))
+look_at_ball.configure("look_ball", "soft", 1.0)
+
# right_forearm
# head_task = solver.add_joints_task()
# elbow = 2.512
@@ -58,24 +63,24 @@
# }
# )
# head_task.configure("joints", "soft", 1.0)
-x, y, z = T_world_right_forearm[:3, 3].copy()
-right_hand_y_traj = placo.CubicSpline()
-right_hand_y_traj.add_point(0.0, y, 0.0)
-right_hand_y_traj.add_point(0.5, y - 0.5, 0.0)
-right_hand_y_traj.add_point(1.0, y, 0.0)
-right_hand_y_traj.add_point(2.0, y, 0.0)
-
-right_hand_x_traj = placo.CubicSpline()
-right_hand_x_traj.add_point(0.0, x + 5, 0.0)
-right_hand_x_traj.add_point(0.5, x + 5, 0.0)
-right_hand_x_traj.add_point(1.0, x + 5, 0.0)
-right_hand_x_traj.add_point(2.0, x + 5, 0.0)
-
-right_hand_z_traj = placo.CubicSpline()
-right_hand_z_traj.add_point(0.0, z + 0.3, 0.0)
-right_hand_z_traj.add_point(0.5, z + 0.3, 0.0)
-right_hand_z_traj.add_point(1.0, z + 0.3, 0.0)
-right_hand_z_traj.add_point(2.0, z + 0.1, 0.0)
+# x, y, z = T_world_right_forearm[:3, 3].copy()
+# right_hand_y_traj = placo.CubicSpline()
+# right_hand_y_traj.add_point(0.0, y, 0.0)
+# right_hand_y_traj.add_point(0.5, y - 0.5, 0.0)
+# right_hand_y_traj.add_point(1.0, y, 0.0)
+# right_hand_y_traj.add_point(2.0, y, 0.0)
+#
+# right_hand_x_traj = placo.CubicSpline()
+# right_hand_x_traj.add_point(0.0, x + 5, 0.0)
+# right_hand_x_traj.add_point(0.5, x + 5, 0.0)
+# right_hand_x_traj.add_point(1.0, x + 5, 0.0)
+# right_hand_x_traj.add_point(2.0, x + 5, 0.0)
+#
+# right_hand_z_traj = placo.CubicSpline()
+# right_hand_z_traj.add_point(0.0, z + 0.3, 0.0)
+# right_hand_z_traj.add_point(0.5, z + 0.3, 0.0)
+# right_hand_z_traj.add_point(1.0, z + 0.3, 0.0)
+# right_hand_z_traj.add_point(2.0, z + 0.1, 0.0)
# Regularization task
# posture_regularization_task = solver.add_joints_task()
@@ -103,12 +108,16 @@ def loop():
# com_target[2] = 0.21 # T_world_trunk[2,3] - 0.1
# com_task.target_world = com_target
# Updating the target
- t_mod = t % 2.0
- target = right_hand_task.position().target_world
- # target[0] = right_hand_x_traj.pos(t_mod)
- # target[1] = right_hand_y_traj.pos(t_mod)
- # target[2] = right_hand_z_traj.pos(t_mod)
- right_hand_task.position().target_world = target
+ # t_mod = t % 2.0
+ # target = right_hand_task.position().target_world
+ # # target[0] = right_hand_x_traj.pos(t_mod)
+ # # target[1] = right_hand_y_traj.pos(t_mod)
+ # # target[2] = right_hand_z_traj.pos(t_mod)
+ # right_hand_task.position().target_world = target
+
+ ball = np.array([0.5 + np.cos(t) * 0.25, np.sin(t) * 0.7, 0.0])
+ camera_pos = robot.get_T_world_frame("camera")[:3, 3]
+ look_at_ball.targetAxis_world = ball - camera_pos
solver.solve(True)
robot.update_kinematics()
diff --git a/soccer_control/soccer_pycontrol/src/soccer_pycontrol/main.py b/soccer_control/soccer_pycontrol/src/soccer_pycontrol/main.py
index fe7945740..f223d4982 100755
--- a/soccer_control/soccer_pycontrol/src/soccer_pycontrol/main.py
+++ b/soccer_control/soccer_pycontrol/src/soccer_pycontrol/main.py
@@ -2,7 +2,7 @@
import psutil
from soccer_pycontrol.model.model_ros.bez_ros import BezROS
-from soccer_pycontrol.walk_engine.walk_engine_ros.walk_engine_ros import WalkEngineRos
+from soccer_pycontrol.walk_engine.walk_engine_ros.navigator_ros import NavigatorRos
pid = psutil.Process()
try:
@@ -25,7 +25,7 @@
rospy.loginfo("Initializing Soccer Control")
ns = "/robot1/"
bez = BezROS(ns=ns)
- walker = WalkEngineRos(bez)
+ walker = NavigatorRos(bez)
rospy.loginfo("Starting Control Loop")
try:
walker.walk(d_x=0.00, t_goal=10)
diff --git a/soccer_control/soccer_pycontrol/src/soccer_pycontrol/model/model_ros/sensors_ros.py b/soccer_control/soccer_pycontrol/src/soccer_pycontrol/model/model_ros/sensors_ros.py
index a316a038f..2ab008e23 100644
--- a/soccer_control/soccer_pycontrol/src/soccer_pycontrol/model/model_ros/sensors_ros.py
+++ b/soccer_control/soccer_pycontrol/src/soccer_pycontrol/model/model_ros/sensors_ros.py
@@ -1,7 +1,10 @@
import os
+import numpy as np
import rospy
import tf
+import tf2_py
+from nav_msgs.msg import Odometry
from sensor_msgs.msg import Imu
from soccer_pycontrol.model.sensors import Sensors
@@ -10,10 +13,13 @@
class SensorsROS(Sensors):
def __init__(self, ns: str = ""):
+ # TODO rework later
self.imu_msg = None
+ self.odom_msg = None
self.imu_subscriber = rospy.Subscriber(ns + "imu_filtered", Imu, self.imu_callback, queue_size=1)
self.imu_ready = False
self.tf_listener = tf.TransformListener()
+ self.pose_subscriber = rospy.Subscriber(ns + "base_pose_ground_truth", Odometry, self.odom_callback, queue_size=1)
def imu_callback(self, msg: Imu):
"""
@@ -25,6 +31,14 @@ def imu_callback(self, msg: Imu):
self.imu_ready = True
# TODO rework imu its a bit weird
+ def odom_callback(self, msg: Odometry):
+ """
+ Callback function for IMU information
+
+ :param msg: IMU Message
+ """
+ self.odom_msg = msg
+
def get_imu(self):
"""
Gets the IMU at the IMU link location.
@@ -46,3 +60,26 @@ def get_imu(self):
def get_foot_pressure_sensors(self, floor):
# TODO subscribe to foot pressure sensors
pass
+
+ def get_pose(self):
+ Transformation(pose=self.odom_msg.pose.pose)
+ return Transformation(pose=self.odom_msg.pose.pose)
+
+ def get_ball(self):
+ try:
+ time_stamp1 = self.tf_listener.getLatestCommonTime("world", "robot1/base_footprint_gt")
+
+ (trans1, rot) = self.tf_listener.lookupTransform("world", "robot1/base_footprint_gt", time_stamp1)
+ time_stamp2 = self.tf_listener.getLatestCommonTime("world", "robot1/ball_gt")
+ (trans2, rot) = self.tf_listener.lookupTransform("world", "robot1/ball_gt", time_stamp2)
+ trans = (np.array(trans2) - np.array(trans1)).tolist()
+ return Transformation(position=trans, orientation=rot)
+ except (
+ tf2_py.LookupException,
+ tf.LookupException,
+ tf.ConnectivityException,
+ tf.ExtrapolationException,
+ tf2_py.TransformException,
+ ) as ex:
+ rospy.logerr_throttle(5, "Unable to find transformation from world to ")
+ pass
diff --git a/soccer_control/soccer_pycontrol/src/soccer_pycontrol/model/sensors.py b/soccer_control/soccer_pycontrol/src/soccer_pycontrol/model/sensors.py
index e05c07b2d..17f208d15 100644
--- a/soccer_control/soccer_pycontrol/src/soccer_pycontrol/model/sensors.py
+++ b/soccer_control/soccer_pycontrol/src/soccer_pycontrol/model/sensors.py
@@ -42,6 +42,9 @@ def get_imu(self) -> Transformation:
self.imu_ready = True
return Transformation(pos, orientation).orientation_euler
+ def get_ball(self):
+ return Transformation()
+
def get_foot_pressure_sensors(self, floor: pb.loadURDF) -> List[bool]:
"""
Checks if 4 corners of the each feet are in contact with ground #
diff --git a/soccer_control/soccer_pycontrol/src/soccer_pycontrol/walk_engine/foot_step_planner.py b/soccer_control/soccer_pycontrol/src/soccer_pycontrol/walk_engine/foot_step_planner.py
index 440ee06c8..b1ac3b931 100644
--- a/soccer_control/soccer_pycontrol/src/soccer_pycontrol/walk_engine/foot_step_planner.py
+++ b/soccer_control/soccer_pycontrol/src/soccer_pycontrol/walk_engine/foot_step_planner.py
@@ -4,6 +4,7 @@
import numpy as np
import placo
+import pybullet as p
from placo_utils.visualization import footsteps_viz, frame_viz, line_viz, robot_viz
@@ -27,7 +28,6 @@ def __init__(self, robot_model: str, parameters: dict, funct_time, debug: bool =
self.trajectory = None
self.tasks = None
self.solver = None
-
if self.debug:
# Starting Meshcat viewer
self.viz = robot_viz(self.robot)
@@ -78,9 +78,9 @@ def setup_tasks(self):
self.tasks.initialize_tasks(self.solver, self.robot)
# Creating a joint task to assign DoF values for upper body
- elbow = -50 * np.pi / 180
+ elbow = 2.512 # -50 * np.pi / 180
shoulder_roll = 0 * np.pi / 180
- shoulder_pitch = 20 * np.pi / 180
+ shoulder_pitch = -0.45 # 20 * np.pi / 180
joints_task = self.solver.add_joints_task()
if self.robot_model == "bez2":
joints_task.set_joints(
@@ -110,6 +110,11 @@ def setup_tasks(self):
)
joints_task.configure("joints", "soft", 1.0)
+ # self.look_at_ball = self.solver.add_axisalign_task(
+ # "camera", np.array([1.0, 0.0, 0.0]), np.array([1.0, 0.0, 0.0])
+ # )
+ # self.look_at_ball.configure("look_ball", "soft", 1)
+
# Placing the robot in the initial position
print("Placing the robot in the initial position...")
self.tasks.reach_initial_pose(
@@ -126,6 +131,12 @@ def configure_planner(self, d_x: float = 0.0, d_y: float = 0.0, d_theta: float =
def setup_footsteps(self):
# Planning footsteps
+ # set init position
+ # self.robot.set_T_world_frame("right_foot", np.eye(4))
+ # self.robot.update_kinematics()
+ # self.last_display = self.funct_time()
+ # self.viz.display(self.robot.state.q)
+ self.init_foot = self.robot.get_T_world_right()
T_world_left = placo.flatten_on_floor(self.robot.get_T_world_left())
T_world_right = placo.flatten_on_floor(self.robot.get_T_world_right())
footsteps = self.repetitive_footsteps_planner.plan(placo.HumanoidRobot_Side.left, T_world_left, T_world_right)
@@ -146,13 +157,21 @@ def setup_walk(self, d_x: float = 0.0, d_y: float = 0.0, d_theta: float = 0.0, n
self.last_replan = 0
self.start_t = self.funct_time()
- def walk_loop(
+ def head_movement(self, target: List[float]):
+ # TODO clean up and add a cone or it breaks walking
+ ball = np.array(target)
+ camera_pos = self.robot.get_T_world_frame("camera")[:3, 3]
+ ball[2] -= camera_pos[2]
+ self.look_at_ball.targetAxis_world = ball
+
+ def plan_steps(
self,
t: float,
):
# Updating the QP tasks from planned trajectory
self.tasks.update_tasks_from_trajectory(self.trajectory, t)
+ # TODO add joints from sim for better feedback
# Invoking the IK QP solver
self.robot.update_kinematics()
qd_sol = self.solver.solve(True)
@@ -167,18 +186,21 @@ def walk_loop(
self.trajectory, t
):
- self.last_replan = t
- # Replanning footsteps from current trajectory
- supports = self.walk_pattern.replan_supports(self.repetitive_footsteps_planner, self.trajectory, t)
-
- # Replanning CoM trajectory, yielding a new trajectory we can switch to
- self.trajectory = self.walk_pattern.replan(supports, self.trajectory, t)
-
- self.update_viz(supports, self.trajectory)
+ self.replan(t)
# During the warmup phase, the robot is enforced to stay in the initial position
self.update_meshcat(t)
+ def replan(self, t: float):
+ self.last_replan = t
+ # Replanning footsteps from current trajectory
+ supports = self.walk_pattern.replan_supports(self.repetitive_footsteps_planner, self.trajectory, t)
+
+ # Replanning CoM trajectory, yielding a new trajectory we can switch to
+ self.trajectory = self.walk_pattern.replan(supports, self.trajectory, t)
+
+ self.update_viz(supports, self.trajectory)
+
def step(self, t: float):
# Spin-lock until the next tick
t += self.DT
@@ -190,8 +212,22 @@ def step(self, t: float):
def update_viz(self, supports: List[placo.Supports], trajectory: placo.WalkTrajectory):
if self.debug:
# Drawing footsteps
- footsteps_viz(supports)
-
+ footsteps_viz(supports) # TODO look for step vis
+ # TODO convert for ros
+ # steps = len(supports)
+ # T = np.eye(4)
+ # k = 0
+ # for footstep in supports:
+ # k += 1
+ # polygon = [(T @ [*xy, 0, 1])[:3] for xy in footstep.support_polygon()]
+ # polygon = np.array([*polygon, polygon[-1]])
+ #
+ # polygon[:, 1] -= self.init_foot[1, 3]/2
+ # p.addUserDebugLine(polygon[0], polygon[1], [1, 0,0], lifeTime=1)
+ # p.addUserDebugLine(polygon[1], polygon[2], [0, 1, 0], lifeTime=1)
+ # p.addUserDebugLine(polygon[2], polygon[3], [0, 0, 1], lifeTime=1)
+ # p.addUserDebugLine(polygon[0], polygon[3], [0, 1, 1], lifeTime=1)
+ # print("fsd")
# Drawing planned CoM trajectory on the ground
coms = [[*trajectory.get_p_world_CoM(t)[:2], 0.0] for t in np.linspace(trajectory.t_start, trajectory.t_end, 100)]
line_viz("CoM_trajectory", np.array(coms), 0xFFAA00)
diff --git a/soccer_control/soccer_pycontrol/src/soccer_pycontrol/walk_engine/navigator.py b/soccer_control/soccer_pycontrol/src/soccer_pycontrol/walk_engine/navigator.py
new file mode 100644
index 000000000..63b4331bb
--- /dev/null
+++ b/soccer_control/soccer_pycontrol/src/soccer_pycontrol/walk_engine/navigator.py
@@ -0,0 +1,265 @@
+import math
+import time
+from typing import List, Union
+
+import numpy as np
+import scipy
+from soccer_pycontrol.model.bez import Bez
+from soccer_pycontrol.pybullet_usage.pybullet_world import PybulletWorld
+from soccer_pycontrol.walk_engine.foot_step_planner import FootStepPlanner
+from soccer_pycontrol.walk_engine.stabilize import Stabilize
+
+from soccer_common import PID, Transformation
+
+
+# TODO change to trajectory controller
+class Navigator:
+ def __init__(self, world: PybulletWorld, bez: Bez, imu_feedback_enabled: bool = False):
+ self.world = world
+ self.bez = bez
+ self.imu_feedback_enabled = imu_feedback_enabled
+ self.func_step = self.world.step
+ self.foot_step_planner = FootStepPlanner(self.bez.robot_model, self.bez.parameters, time.time)
+
+ self.walk_pid = Stabilize(self.bez.parameters)
+ self.max_vel = 0.02
+ self.nav_x_pid = PID(
+ Kp=0.5,
+ Kd=0,
+ Ki=0,
+ setpoint=0,
+ output_limits=(-self.max_vel, self.max_vel),
+ )
+ self.nav_y_pid = PID( # TODO properly tune later
+ Kp=0.1,
+ Kd=0,
+ Ki=0,
+ setpoint=0,
+ output_limits=(-self.max_vel + 0.01, self.max_vel),
+ ) # TODO could also mod if balance is decreasing
+
+ self.nav_yaw_pid = PID(
+ Kp=0.05,
+ Kd=0,
+ Ki=0,
+ setpoint=0,
+ output_limits=(-1, 1),
+ )
+
+ self.error_tol = 0.01 # in m TODO add as a param and in the ros version
+
+ # TODO could make input a vector
+ def walk(self, target_goal: Union[Transformation, List], ball_mode: bool = False):
+ if isinstance(target_goal, Transformation):
+ if ball_mode:
+ self.walk_ball(target_goal)
+ else:
+ self.walk_pose(target_goal)
+ elif isinstance(target_goal, list): # [d_x: float = 0.0, d_y: float = 0.0, d_theta: float = 0.0, nb_steps: int = 10, t_goal: float = 10]
+ self.walk_time(target_goal)
+
+ self.ready()
+
+ def find_new_vel(self, goal_loc: list, curr_loc: list = (0, 0)):
+ x_error = abs(goal_loc[0] - curr_loc[0])
+ y_error = abs(goal_loc[1] - curr_loc[1])
+
+ if x_error > y_error:
+ dx = self.max_vel
+ dy = dx * (y_error / x_error)
+ elif x_error < y_error:
+ dy = self.max_vel
+ dx = dy * (x_error / y_error)
+ else:
+ dx = self.max_vel
+ dy = self.max_vel
+
+ return math.copysign(dx, goal_loc[0]), math.copysign(dy, goal_loc[1])
+
+ def walk_pose(self, target_goal: Transformation):
+ self.walk_pid.reset_imus()
+ self.nav_x_pid.reset()
+ self.nav_x_pid.setpoint = target_goal.position[0]
+
+ self.nav_y_pid.reset()
+ self.nav_y_pid.setpoint = target_goal.position[1]
+
+ self.nav_yaw_pid.reset()
+ self.nav_yaw_pid.setpoint = target_goal.orientation_euler[0]
+
+ pose = self.bez.sensors.get_pose() # can use self.foot_step_planner.trajectory.get_p_world_CoM(t)
+ dx, dy = self.find_new_vel(goal_loc=target_goal.position[:2])
+ # he = self.heading_error(target_goal.orientation_euler[0], pose.orientation_euler[0])
+ # dtheta = math.copysign(0.5, he)
+ self.foot_step_planner.setup_walk(dx, dy)
+ t = 0
+ # TODO fix and add to a nav could add a funct for pybullet or python
+ # TODO could have a balancing mode by default could use the COM
+ # TODO for ball could just remove
+
+ while (
+ self.position_error(pose.position[:2], target_goal.position[:2]) > self.error_tol
+ or abs(self.heading_error(target_goal.orientation_euler[0], pose.orientation_euler[0])) > self.error_tol
+ ): # self.bez.sensors.get_pose() #TODO about 20% or 40% error
+ pose = (
+ self.bez.sensors.get_pose()
+ ) # self.foot_step_planner.robot.get_T_world_trunk() # can use self.foot_step_planner.trajectory.get_p_world_CoM(t)
+ goal = Transformation()
+ goal.rotation_matrix = np.matmul(target_goal.rotation_matrix, scipy.linalg.inv(pose.rotation_matrix))
+ goal.position = pose.rotation_matrix.T @ target_goal.position - pose.rotation_matrix.T @ pose.position
+ # print(goal.position , pose.position)
+ x_error = target_goal.position[0] - pose.position[0]
+ y_error = target_goal.position[1] - pose.position[1]
+ head_error = self.heading_error(target_goal.orientation_euler[0], pose.orientation_euler[0])
+ # TODO replace with pure pursuit
+ # TODO make a 2d unit test
+ self.nav_x_pid.setpoint = goal.position[0]
+ self.nav_y_pid.setpoint = goal.position[1]
+ dx = self.nav_x_pid.update(0)
+ dy = self.nav_y_pid.update(0)
+ dtheta = self.nav_yaw_pid.update(pose.orientation_euler[0])
+ print(round(dx, 3), " ", round(dy, 3), " ", round(dtheta, 3), " ", round(x_error, 3), " ", round(y_error, 3), " ", round(head_error, 3))
+ self.foot_step_planner.configure_planner(dx, dy, dtheta)
+
+ # if t > 5:
+ #
+ # target_goal = Transformation(position=[-0.5,-0.5,0])
+ # dx, dy = self.find_new_vel(goal_loc=target_goal.position[:2], curr_loc=position[:2])
+ # self.foot_step_planner.configure_planner(dx, dy)
+
+ t = self.walk_loop(t)
+
+ def walk_ball(self, target_goal: Transformation):
+ self.walk_pid.reset_imus()
+ self.nav_x_pid.reset()
+ self.nav_x_pid.setpoint = target_goal.position[0]
+
+ self.nav_y_pid.reset()
+ self.nav_y_pid.setpoint = target_goal.position[1]
+
+ self.nav_yaw_pid.reset()
+ self.nav_yaw_pid.setpoint = 0 # TODO add yaw modes
+
+ dx, dy = self.find_new_vel(goal_loc=target_goal.position[:2])
+ # dx, dy = 0, 0
+ self.foot_step_planner.setup_walk(dx, dy)
+ t = 0
+ # TODO fix and add to a nav could add a funct for pybullet or python
+ # TODO could have a balancing mode by default could use the COM
+ # TODO for ball could just remove
+ while (
+ self.position_error(target_goal.position[:2]) > self.error_tol
+ or abs(self.heading_error(target_goal.orientation_euler[0], self.bez.sensors.get_pose().orientation_euler[0])) > self.error_tol
+ ):
+ target_goal = self.bez.sensors.get_ball()
+
+ # self.foot_step_planner.head_movement(target_goal.position)
+
+ self.nav_x_pid.setpoint = target_goal.position[0]
+ self.nav_y_pid.setpoint = target_goal.position[1]
+ x_error = target_goal.position[0]
+ y_error = target_goal.position[1]
+ head_error = self.heading_error(target_goal.orientation_euler[0], self.bez.sensors.get_pose().orientation_euler[0])
+ # TODO replace with pure pursuit
+ # TODO make a 2d unit test
+
+ dx = self.nav_x_pid.update(0)
+ dy = self.nav_y_pid.update(0)
+
+ dtheta = self.nav_yaw_pid.update(self.bez.sensors.get_pose().orientation_euler[0])
+ print(round(dx, 3), " ", round(dy, 3), " ", round(dtheta, 3), " ", round(x_error, 3), " ", round(y_error, 3), " ", round(head_error, 3))
+ self.foot_step_planner.configure_planner(dx, dy, dtheta)
+
+ t = self.walk_loop(t)
+
+ def walk_time(self, target_goal: list):
+ self.foot_step_planner.setup_walk(target_goal[0], target_goal[1], target_goal[2], target_goal[3])
+ self.walk_pid.reset_imus()
+ t = 0
+ while t < target_goal[4]:
+ # self.foot_step_planner.head_movement(self.bez.sensors.get_ball().position)
+ t = self.walk_loop(t)
+
+ def walk_loop(self, t: float):
+ self.foot_step_planner.plan_steps(t)
+ self.bez.motor_control.configuration = self.filter_joints()
+
+ if self.imu_feedback_enabled and self.bez.sensors.imu_ready:
+ [_, pitch, roll] = self.bez.sensors.get_imu()
+ self.stabilize_walk(pitch, roll)
+
+ self.bez.motor_control.set_motor()
+ self.func_step()
+
+ t = self.foot_step_planner.step(t)
+
+ # update joints in control # TODO investigate it has an effect but not sure how much also with step time
+ # for joint in self.bez.motor_control.motor_names:
+ # self.foot_step_planner.robot.set_joint(joint,
+ # self.bez.motor_control.configuration
+ # [self.bez.motor_control.motor_names.index(joint)])
+ # T = self.foot_step_planner.robot.get_T_world_fbase()
+ # T[0:3,0:3] = self.bez.sensors.get_pose().rotation_matrix
+ # self.foot_step_planner.robot.set_T_world_fbase(T)
+ # self.foot_step_planner.robot.update_kinematics()
+
+ return t
+
+ @staticmethod
+ def heading_error(theta_desired: float, theta_current: float) -> float:
+ """
+ Calculates the position and orientation error between a current pose and a desired pose.
+
+ :return: A tuple of (position_error, desired_yaw, heading_error) representing the errors.
+ """
+
+ head_error = theta_desired - theta_current
+
+ # Normalize the heading error to be between -pi and pi.
+ heading_error_norm = math.atan2(math.sin(head_error), math.cos(head_error))
+
+ return heading_error_norm
+
+ # @staticmethod
+ # def desired_yaw(self) -> float:
+ # # Calculate the desired yaw (angle of rotation) using the arctan2 function.
+ # numerator = self.goal_loc[1] - self.curr_loc[1]
+ # denominator = self.goal_loc[0] - self.curr_loc[0]
+ # return float(np.arctan2(numerator, denominator))
+
+ @staticmethod
+ def position_error(goal_loc: np.ndarray, curr_loc: np.ndarray = (0, 0)):
+ return float(np.linalg.norm(goal_loc - curr_loc))
+
+ def ready(self):
+ self.foot_step_planner.setup_tasks()
+ self.bez.motor_control.configuration = self.filter_joints()
+
+ self.bez.motor_control.set_motor()
+
+ def wait(self, step: int) -> None:
+ self.world.wait(step)
+
+ def stabilize_walk(self, pitch: float, roll: float) -> None:
+ error_pitch = self.walk_pid.walking_pitch_pid.update(pitch)
+ self.bez.motor_control.set_leg_joint_3_target_angle(error_pitch) # TODO retune
+ pass
+ error_roll = self.walk_pid.walking_pitch_pid.update(roll) # TODO retune
+ self.bez.motor_control.set_leg_joint_2_target_angle(error_roll)
+
+ def filter_joints(self) -> List[int]:
+ joints = [0] * self.bez.motor_control.numb_of_motors
+ for joint in self.bez.motor_control.motor_names:
+ joints[self.bez.motor_control.motor_names.index(joint)] = self.foot_step_planner.robot.get_joint(joint)
+ return joints
+
+
+if __name__ == "__main__":
+ world = PybulletWorld(
+ camera_yaw=90,
+ real_time=True,
+ rate=200,
+ )
+ bez = Bez(robot_model="bez1")
+ walk = Navigator(world, bez)
+ walk.walk(t_goal=100)
diff --git a/soccer_control/soccer_pycontrol/src/soccer_pycontrol/walk_engine/walk_engine.py b/soccer_control/soccer_pycontrol/src/soccer_pycontrol/walk_engine/walk_engine.py
deleted file mode 100644
index b687d2096..000000000
--- a/soccer_control/soccer_pycontrol/src/soccer_pycontrol/walk_engine/walk_engine.py
+++ /dev/null
@@ -1,70 +0,0 @@
-import time
-from typing import List
-
-from soccer_pycontrol.model.bez import Bez
-from soccer_pycontrol.pybullet_usage.pybullet_world import PybulletWorld
-from soccer_pycontrol.walk_engine.foot_step_planner import FootStepPlanner
-from soccer_pycontrol.walk_engine.stabilize import Stabilize
-
-
-class WalkEngine:
- def __init__(self, world: PybulletWorld, bez: Bez, imu_feedback_enabled: bool = True):
- self.world = world
- self.bez = bez
- self.imu_feedback_enabled = imu_feedback_enabled
- self.func_step = self.world.step
- self.foot_step_planner = FootStepPlanner(self.bez.robot_model, self.bez.parameters, time.time)
-
- self.pid = Stabilize(self.bez.parameters)
-
- # TODO need way to have no imu maybe unit tests
- def walk(self, d_x: float = 0.0, d_y: float = 0.0, d_theta: float = 0.0, nb_steps: int = 10, t_goal: float = 10):
- self.foot_step_planner.setup_walk(d_x, d_y, d_theta, nb_steps)
- self.pid.reset_imus()
- t = 0
- while t < t_goal:
- self.foot_step_planner.walk_loop(t)
-
- self.bez.motor_control.configuration = self.filter_joints()
-
- if self.imu_feedback_enabled and self.bez.sensors.imu_ready:
- [_, pitch, roll] = self.bez.sensors.get_imu()
- self.stabilize_walk(pitch, roll)
-
- self.bez.motor_control.set_motor()
- self.func_step()
-
- t = self.foot_step_planner.step(t)
-
- def ready(self):
- self.foot_step_planner.setup_tasks()
- self.bez.motor_control.configuration = self.filter_joints()
-
- self.bez.motor_control.set_motor()
-
- def wait(self, step: int) -> None:
- self.world.wait(step)
-
- def stabilize_walk(self, pitch: float, roll: float) -> None:
- error_pitch = self.pid.walking_pitch_pid.update(pitch)
- self.bez.motor_control.set_leg_joint_3_target_angle(error_pitch)
-
- error_roll = self.pid.walking_roll_pid.update(roll)
- self.bez.motor_control.set_leg_joint_2_target_angle(error_roll)
-
- def filter_joints(self) -> List[int]:
- joints = [0] * self.bez.motor_control.numb_of_motors
- for joint in self.bez.motor_control.motor_names:
- joints[self.bez.motor_control.motor_names.index(joint)] = self.foot_step_planner.robot.get_joint(joint)
- return joints
-
-
-if __name__ == "__main__":
- world = PybulletWorld(
- camera_yaw=90,
- real_time=True,
- rate=200,
- )
- bez = Bez(robot_model="bez1")
- walk = WalkEngine(world, bez)
- walk.walk(t_goal=100)
diff --git a/soccer_control/soccer_pycontrol/src/soccer_pycontrol/walk_engine/walk_engine_ros/walk_engine_ros.py b/soccer_control/soccer_pycontrol/src/soccer_pycontrol/walk_engine/walk_engine_ros/navigator_ros.py
similarity index 61%
rename from soccer_control/soccer_pycontrol/src/soccer_pycontrol/walk_engine/walk_engine_ros/walk_engine_ros.py
rename to soccer_control/soccer_pycontrol/src/soccer_pycontrol/walk_engine/walk_engine_ros/navigator_ros.py
index ef8a74613..e41bc7a95 100644
--- a/soccer_control/soccer_pycontrol/src/soccer_pycontrol/walk_engine/walk_engine_ros/walk_engine_ros.py
+++ b/soccer_control/soccer_pycontrol/src/soccer_pycontrol/walk_engine/walk_engine_ros/navigator_ros.py
@@ -2,21 +2,47 @@
from geometry_msgs.msg import PoseStamped
from soccer_pycontrol.model.model_ros.bez_ros import BezROS
from soccer_pycontrol.walk_engine.foot_step_planner import FootStepPlanner
+from soccer_pycontrol.walk_engine.navigator import Navigator
from soccer_pycontrol.walk_engine.stabilize import Stabilize
-from soccer_pycontrol.walk_engine.walk_engine import WalkEngine
+from soccer_common import PID
-class WalkEngineRos(WalkEngine):
+
+class NavigatorRos(Navigator):
def __init__(self, bez: BezROS, imu_feedback_enabled: bool = False):
self.imu_feedback_enabled = imu_feedback_enabled
self.bez = bez
self.foot_step_planner = FootStepPlanner(self.bez.robot_model, self.bez.parameters, rospy.get_time)
+ # TODO publish local odomtry from foot step planner
self.rate = rospy.Rate(1 / self.foot_step_planner.DT)
self.func_step = self.rate.sleep
- self.pid = Stabilize(self.bez.parameters)
-
+ self.walk_pid = Stabilize(self.bez.parameters)
+ self.max_vel = 0.09
+ self.nav_x_pid = PID(
+ Kp=0.5,
+ Kd=0,
+ Ki=0,
+ setpoint=0,
+ output_limits=(-self.max_vel, self.max_vel),
+ )
+ self.nav_y_pid = PID( # TODO properly tune later
+ Kp=0.5,
+ Kd=0,
+ Ki=0,
+ setpoint=0,
+ output_limits=(-0.05, 0.05),
+ ) # TODO could also mod if balance is decreasing
+ self.nav_yaw_pid = PID(
+ Kp=0.2,
+ Kd=0,
+ Ki=0,
+ setpoint=0,
+ output_limits=(-0.3, 0.3),
+ )
+
+ self.error_tol = 0.05 # in m TODO add as a param and in the ros version
self.position_subscriber = rospy.Subscriber(self.bez.ns + "goal", PoseStamped, self.goal_callback)
self.goal = PoseStamped()
diff --git a/soccer_control/soccer_pycontrol/test/test_placo.py b/soccer_control/soccer_pycontrol/test/test_placo.py
index 0044d7e6c..005417ba3 100644
--- a/soccer_control/soccer_pycontrol/test/test_placo.py
+++ b/soccer_control/soccer_pycontrol/test/test_placo.py
@@ -2,11 +2,11 @@
from soccer_pycontrol.model.bez import Bez
from soccer_pycontrol.pybullet_usage.pybullet_world import PybulletWorld
-from soccer_pycontrol.walk_engine.walk_engine import WalkEngine
+from soccer_pycontrol.walk_engine.navigator import Navigator
from soccer_common import Transformation
-REAL_TIME = False
+REAL_TIME = True
class TestPlaco(unittest.TestCase):
@@ -22,12 +22,16 @@ def test_bez1(self):
rate=200,
)
self.bez = Bez(robot_model="bez1", pose=Transformation())
- walk = WalkEngine(self.world, self.bez)
- walk.ready()
- self.bez.motor_control.set_motor()
- walk.wait(50)
- walk.walk(d_x=0.04, t_goal=10)
+ walk = Navigator(self.world, self.bez)
+ # walk.ready()
+ # self.bez.motor_control.set_motor()
+ # walk.wait(50)
+ target_goal = [0.08, 0, 0, 3, 500]
+ # target_goal = Transformation(position=[1, 0, 0], euler=[0, 0, 0])
+ walk.walk(target_goal)
+ # walk.wait(1000)
+ # TODO fix
def test_bez2(self):
self.world = PybulletWorld(
camera_yaw=90,
@@ -35,7 +39,7 @@ def test_bez2(self):
rate=200,
)
self.bez = Bez(robot_model="bez2", pose=Transformation())
- walk = WalkEngine(self.world, self.bez)
+ walk = Navigator(self.world, self.bez)
walk.walk(d_x=0.03, t_goal=10)
def test_bez1_start_stop(self):
@@ -45,7 +49,7 @@ def test_bez1_start_stop(self):
rate=200,
)
self.bez = Bez(robot_model="bez1", pose=Transformation())
- walk = WalkEngine(self.world, self.bez)
+ walk = Navigator(self.world, self.bez)
walk.walk(d_x=0.03, t_goal=5)
walk.wait(100)
walk.walk(d_x=0.03, t_goal=5)
@@ -58,7 +62,7 @@ def test_bez1_replan(self):
rate=200,
)
self.bez = Bez(robot_model="bez1", pose=Transformation())
- walk = WalkEngine(self.world, self.bez)
+ walk = Navigator(self.world, self.bez)
walk.foot_step_planner.setup_walk(d_x=0.03)
walk.pid.reset_imus()
t = 0
@@ -70,7 +74,7 @@ def test_bez1_replan(self):
walk.foot_step_planner.configure_planner(d_x=0.0, d_theta=0.4)
if t > 9:
walk.foot_step_planner.configure_planner(d_x=0.03, d_y=0.03)
- walk.foot_step_planner.walk_loop(t)
+ walk.foot_step_planner.plan_steps(t)
walk.bez.motor_control.configuration = walk.filter_joints()
walk.stabilize_walk(pitch, roll)
@@ -88,7 +92,7 @@ def test_bez1_ready(self):
)
# TODO should bez be init in walk_engine
self.bez = Bez(robot_model="bez1", pose=Transformation())
- walk = WalkEngine(self.world, self.bez)
+ walk = Navigator(self.world, self.bez)
walk.ready()
walk.world.step()
walk.wait(100)
diff --git a/soccer_control/soccer_pycontrol/test/test_pybullet.py b/soccer_control/soccer_pycontrol/test/test_pybullet.py
index 5429389cf..5623c8033 100644
--- a/soccer_control/soccer_pycontrol/test/test_pybullet.py
+++ b/soccer_control/soccer_pycontrol/test/test_pybullet.py
@@ -83,7 +83,7 @@ def test_bez_motor_range_single(self):
# def test_stand_plane(self):
# self.world = PybulletWorld(camera_yaw=0, real_time=REAL_TIME, rate=100)
# self.bez = Bez(pose=Transformation())
- # tf = WalkEngine(self.world, self.bez)
+ # tf = Navigator(self.world, self.bez)
# tf.wait(50)
# tf.bez.ready()
# tf.wait(50)
diff --git a/soccer_control/soccer_pycontrol/test/test_pybullet_walk.py b/soccer_control/soccer_pycontrol/test/test_pybullet_walk.py
index d0fd898e6..5629039a6 100644
--- a/soccer_control/soccer_pycontrol/test/test_pybullet_walk.py
+++ b/soccer_control/soccer_pycontrol/test/test_pybullet_walk.py
@@ -3,7 +3,7 @@
# import numpy as np
# from soccer_pycontrol.model.bez import Bez
# from soccer_pycontrol.pybullet_usage.pybullet_world import PybulletWorld
-# from soccer_pycontrol.walk_engine.walk_engine import WalkEngine
+# from soccer_pycontrol.walk_engine.navigator import Navigator
#
# from soccer_common import Transformation
#
@@ -13,7 +13,7 @@
# def custom_walk(cameraTargetPosition: list, start_pose: Transformation, goal_pose: Transformation, robot_model: str = "bez1"):
# world = PybulletWorld(camera_yaw=90, real_time=True, rate=100, cameraTargetPosition=cameraTargetPosition)
# bez = Bez(robot_model=robot_model)
-# tf = WalkEngine(world, bez)
+# tf = Navigator(world, bez)
# tf.bez.model.set_pose(start_pose)
# tf.wait(50)
# tf.ready()
@@ -25,7 +25,7 @@
# def test_foot_step_planner_fixed(self):
# world = PybulletWorld(path="", camera_yaw=90, real_time=True, rate=100, cameraTargetPosition=[0, 0, 0.25])
# bez = Bez(robot_model="bez1", fixed_base=True)
-# tf = WalkEngine(world, bez)
+# tf = Navigator(world, bez)
#
# # TODO fix with torso height or start pose
# tf.wait(50)
@@ -40,7 +40,7 @@
# def test_foot_step_planner_plane(self):
# world = PybulletWorld(camera_yaw=90, real_time=True, rate=100, cameraTargetPosition=[0, 0, 0.45])
# bez = Bez(robot_model="bez1")
-# tf = WalkEngine(world, bez)
+# tf = Navigator(world, bez)
# tf.wait(50)
# tf.ready()
# bez.motor_control.set_motor()
@@ -191,7 +191,7 @@
# def test_foot_step_planner_plane_dynamic(self):
# world = PybulletWorld(camera_yaw=90, real_time=True, rate=100)
# bez = Bez(robot_model="bez2")
-# tf = WalkEngine(world, bez)
+# tf = Navigator(world, bez)
# tf.wait(50)
# tf.ready()
# tf.wait(50)
diff --git a/soccer_control/soccer_pycontrol/test/test_walk_ros.py b/soccer_control/soccer_pycontrol/test/test_walk_ros.py
index 2ac775de2..bf037f060 100644
--- a/soccer_control/soccer_pycontrol/test/test_walk_ros.py
+++ b/soccer_control/soccer_pycontrol/test/test_walk_ros.py
@@ -1,10 +1,13 @@
import os
+import time
import unittest
import rospy
from geometry_msgs.msg import PoseStamped
from soccer_pycontrol.model.model_ros.bez_ros import BezROS
-from soccer_pycontrol.walk_engine.walk_engine_ros.walk_engine_ros import WalkEngineRos
+from soccer_pycontrol.walk_engine.walk_engine_ros.navigator_ros import NavigatorRos
+
+from soccer_common import Transformation
os.environ["ROS_NAMESPACE"] = "/robot1"
@@ -20,18 +23,16 @@ def test_walk_ros_local(self):
rospy.init_node("soccer_control")
bez = BezROS()
- walker = WalkEngineRos(bez)
+ walker = NavigatorRos(bez)
# walker.wait(50)
# walker.ready()
# bez.motor_control.set_motor()
# walker.wait(50)
# walker.goal_callback(PoseStamped())
- walker.walk(d_x=0.04, t_goal=10)
- walker.ready()
- # walker.walk(d_x=0.0, d_y=0.06, t_goal=5)
- # walker.walk(d_x=0.0, d_theta=0.3, t_goal=5)
- # walker.walk(d_x=-0.04, t_goal=5)
- # walker.walk(d_x=0.04, d_theta=0.2, t_goal=5)
+ # walker.walk(d_x=0.04, t_goal=10)
+ target_goal = Transformation(position=[1, 0, 0], euler=[0, 0, 0])
+ walker.walk(target_goal)
+
walker.wait(100)
@unittest.skipIf("DISPLAY" not in os.environ, "only local")
@@ -44,7 +45,8 @@ def test_walk_ros_webots(self):
ns = "/robot1/"
bez = BezROS(ns=ns)
tmp = rospy.Publisher(ns + "reset_robot", PoseStamped)
- walker = WalkEngineRos(bez)
+ # tmp = rospy.Publisher(ns + "reset_robot", PoseStamped)
+ walker = NavigatorRos(bez)
walker.bez.motor_control.reset_target_angles()
walker.bez.motor_control.set_motor()
walker.wait(50)
@@ -54,9 +56,12 @@ def test_walk_ros_webots(self):
# bez.motor_control.set_motor()
# walker.wait(50)
# walker.goal_callback(PoseStamped())
- walker.walk(d_x=0.05, t_goal=10)
- # walker.walk(d_x=0.0, d_y=0.06, t_goal=5)
- # walker.walk(d_x=0.0, d_theta=0.3, t_goal=5)
- # walker.walk(d_x=-0.04, t_goal=5)
- # walker.walk(d_x=0.04, d_theta=0.2, t_goal=5)
+ start = time.time()
+ # target_goal = Transformation(position=[1, 0, 0], euler=[0,0,0])
+ # walker.walk(target_goal)
+ walker.walk(bez.sensors.get_ball(), True)
+ # target_goal = [0.0, 0, 0, 10, 500]
+ # walker.walk(target_goal)
+ print("cm/s: ", 100 / (time.time() - start))
+ # walker.bez.sensors.get_ball(rospy.Time.now())
walker.wait(100)
diff --git a/soccer_perception/soccer_localization/src/soccer_localization/field.py b/soccer_perception/soccer_localization/src/soccer_localization/field.py
index 77be8b390..afe7670b6 100644
--- a/soccer_perception/soccer_localization/src/soccer_localization/field.py
+++ b/soccer_perception/soccer_localization/src/soccer_localization/field.py
@@ -133,6 +133,7 @@ def filterWorldFramePoints(self, current_transform: Transformation, point_cloud_
# TODO filter density
return world_frame_points
+ # TODO compare with open3d
def matchPointsWithMapIterative(
self, current_transform: Transformation, point_cloud_array: np.array, iterations=3, localizing=False
) -> Union[Tuple[Transformation, List[int]], None]:
diff --git a/Dockerfile b/tools/docker/Dockerfile
similarity index 69%
rename from Dockerfile
rename to tools/docker/Dockerfile
index dd429f20f..393bde184 100644
--- a/Dockerfile
+++ b/tools/docker/Dockerfile
@@ -1,13 +1,9 @@
ARG BASE_IMAGE=utrarobosoccer/noetic
+ARG INSTALL_CUDA=true
+ARG ARCHITECTURE=x86_64
+ARG OS=ubuntu2004
-FROM $BASE_IMAGE as dependencies
-WORKDIR /root/src
-RUN apt-get update && rosdep update --rosdistro noetic
-ADD . .
-RUN rosdep install --from-paths . --ignore-src -r -s | grep 'apt-get install' | awk '{print $3}' | sort > /tmp/catkin_install_list
-WORKDIR /root/dependencies
-
-FROM $BASE_IMAGE as builder
+FROM $BASE_IMAGE AS dependencies
SHELL ["/bin/bash", "-c"]
# Install dependencies
@@ -19,52 +15,16 @@ RUN apt-get update && \
echo debconf apt-fast/aptmanager string apt-get | debconf-set-selections && \
apt-get install -q -y apt-fast && \
apt-get clean
-RUN apt-get update && apt-fast install -y --no-install-recommends \
- screen \
- vim \
- python3-pip \
- python3-catkin-tools \
- python3-protobuf \
- protobuf-compiler \
- libprotobuf-dev \
- libjpeg8-dev \
- wget \
- ccache \
- dirmngr \
- gnupg2 \
- lsb-release \
- net-tools \
- iputils-ping \
- apt-utils \
- software-properties-common \
- sudo \
- unzip \
- ros-noetic-robot-state-publisher \
- curl \
- libxkbcommon-x11-0 \
- libxcb-icccm4 \
- libxcb-xkb1 \
- libxcb-icccm4 \
- libxcb-image0 \
- libxcb-render-util0 \
- libxcb-randr0 \
- libxcb-keysyms1 \
- libxcb-xinerama0 \
- qt5-default \
- qtbase5-dev \
- python3-pyqt5 \
- python-is-python3 \
- git \
- python3-setuptools
+
+COPY tools/setup/rosdep.txt /tmp/setup/
+RUN apt-get update && rosdep update --rosdistro noetic # TODO add an automated way
+RUN apt-fast install -y --no-install-recommends $(cat /tmp/setup/rosdep.txt)
RUN DEBIAN_FRONTEND=noninteractive apt-get -y --no-install-recommends install keyboard-configuration # This needs to be its own individual step
# CUDA Installation
# Architecture: Use sbsa for arm build
# CUDA Installation Ref: https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=20.04&target_type=deb_network
# CUDNN (Ref: https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html#installlinux)
-ARG INSTALL_CUDA=true
-ARG ARCHITECTURE=x86_64
-ARG OS=ubuntu2004
RUN if [[ "$INSTALL_CUDA" == "true" ]] ; then \
wget --progress=dot:mega https://developer.download.nvidia.com/compute/cuda/repos/$OS/$ARCHITECTURE/cuda-$OS.pin && \
mv cuda-$OS.pin /etc/apt/preferences.d/cuda-repository-pin-600 && \
@@ -99,19 +59,13 @@ RUN groupadd -g 1000 robosoccer && \
# Allow nice for all users TODO research
RUN echo "* - priority -20" >> /etc/security/limits.conf
-# Install apt dependencies
-COPY --from=dependencies /tmp/catkin_install_list /tmp/catkin_install_list
-RUN (apt-get update || echo "Apt Error") && apt-fast install -y --no-install-recommends $(cat /tmp/catkin_install_list)
-
# Install python dependencies
USER robosoccer
-COPY requirements.txt /tmp/requirements.txt
ENV PATH=/home/robosoccer/.local/bin:$PATH
-RUN pip3 install --upgrade pip
-RUN pip3 install -r /tmp/requirements.txt -f https://download.pytorch.org/whl/torch/ -f https://download.pytorch.org/whl/torchvision/
-
-RUN mkdir -p /home/robosoccer/catkin_ws/src
-WORKDIR /home/robosoccer/catkin_ws
+COPY tools/setup/requirements.txt tools/setup/requirements-gpu.txt /tmp/setup/
+RUN pip install --upgrade pip
+RUN pip install -r /tmp/setup/requirements.txt
+RUN if [[ "$INSTALL_CUDA" == "true" ]] ; then pip install -r /tmp/setup/requirements-gpu.txt ; fi
# Predownload neural networks
RUN mkdir -p /home/robosoccer/.cache/torch/hub/ && \
@@ -121,11 +75,20 @@ RUN mkdir -p /home/robosoccer/.cache/torch/hub/ && \
mv yolov5-master ultralytics_yolov5_master && \
rm -rf master.zip
+
+FROM dependencies AS builder
+RUN mkdir -p /home/robosoccer/catkin_ws/src/soccerbot
+WORKDIR /home/robosoccer/catkin_ws/src/soccerbot
+COPY --chown=robosoccer . .
+RUN sudo apt-get update && rosdep update --rosdistro noetic
+RUN apt-fast install -y --no-install-recommends $(rosdep install --from-paths . --ignore-src -r -s | grep 'apt-get install' | awk '{print $5}' | sort)
+WORKDIR /home/robosoccer/catkin_ws
+
# Build Python ROS Packages
-COPY --from=dependencies --chown=robosoccer /root/src src/soccerbot
RUN source /opt/ros/noetic/setup.bash && catkin config --cmake-args -DCMAKE_BUILD_TYPE=Debug
RUN source /opt/ros/noetic/setup.bash && catkin build --no-status soccerbot
RUN echo "source /home/robosoccer/catkin_ws/devel/setup.bash" >> ~/.bashrc
-ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/aarch64-linux-gnu/tegra:/usr/local/cuda/targets/aarch64-linux/lib/:/usr/local/cuda-10.2/lib64
-ENV PYTHONPATH=$PYTHONPATH:/home/robosoccer/.local/lib/python3.8/site-packages
+RUN sudo ln -s /home/robosoccer/catkin_ws/devel/lib/python3/dist-packages/soccer_msgs /opt/ros/noetic/lib/python3/dist-packages/
+ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/aarch64-linux-gnu/tegra:/usr/local/cuda/targets/aarch64-linux/lib/
+ENV PYTHONPATH=$PYTHONPATH:/home/robosoccer/.local/lib/python3.8/site-packages:/opt/ros/noetic/lib/python3/dist-packages:/home/robosoccer/catkin_ws/devel/lib/python3/dist-packages
diff --git a/tools/docker/compose.autonomy.yaml b/tools/docker/compose.autonomy.yaml
new file mode 100644
index 000000000..f784abafd
--- /dev/null
+++ b/tools/docker/compose.autonomy.yaml
@@ -0,0 +1,67 @@
+x-soccerbot: &soccerbot
+ image: utrarobosoccer/soccerbot
+ privileged: true
+ user: "1000"
+ build:
+ context: ../../.
+ dockerfile: tools/docker/Dockerfile
+ target: builder
+ args:
+ - BUILDKIT_INLINE_CACHE=1
+ cache_from:
+ - utrarobosoccer/soccerbot
+ cap_add:
+ - SYS_PTRACE
+ - SYS_NICE
+ pid: "host"
+ security_opt:
+ - seccomp:unconfined
+ command:
+ /bin/bash -c "export ROS_MASTER_URI=http://$$(hostname -i):11311 && export ROS_IP=$$(hostname -i) &&
+ bash ./src/soccerbot/soccerbot/scripts/start_competition.sh robot$$ROBOCUP_ROBOT_ID"
+ volumes:
+ - /home/$USER/catkin_ws/src/soccerbot:/home/robosoccer/catkin_ws/src/soccerbot
+ - /tmp/.X11-unix:/tmp/.X11-unix:rw
+ - /dev/dri:/dev/dri:rw
+ - /dev/snd:/dev/snd:rw
+ - /var/run/docker.sock:/var/run/docker.sock
+ - /dev:/dev
+
+services:
+ soccerbot:
+ <<: *soccerbot
+ environment:
+ ROBOCUP_ROBOT_ID: 1 # (see start_competition.sh for positions), not 1 https://discord.com/channels/462951096374132736/798238127588114462/954388600290685008
+ ROBOT_MODEL: bez1
+ ROBOCUP_TEAM_COLOR: "red"
+ ROBOCUP_SIMULATOR_ADDR: "simulator:10001"
+ ROBOCUP_GAMECONTROLLER_IP: "simulator"
+ ROBOCUP_MIRROR_SERVER_IP: "simulator"
+ ROBOCUP_TEAM_ID: 16
+ PYTHONUNBUFFERED: 1
+ DISPLAY: unix$DISPLAY
+ XDG_RUNTIME_DIR: $XDG_RUNTIME_DIR
+
+ soccerbot_no_cuda:
+ <<: *soccerbot
+ build:
+ context: ../../.
+ dockerfile: tools/docker/Dockerfile
+ target: builder
+ args:
+ - BUILDKIT_INLINE_CACHE=1
+ - INSTALL_CUDA=false
+ cache_from:
+ - utrarobosoccer/soccerbot:no_cuda
+ environment:
+ ROBOCUP_ROBOT_ID: 1 # (see start_competition.sh for positions), not 1 https://discord.com/channels/462951096374132736/798238127588114462/954388600290685008
+ ROBOT_MODEL: bez1
+ ROBOCUP_TEAM_COLOR: "red"
+ ROBOCUP_SIMULATOR_ADDR: "simulator:10001"
+ ROBOCUP_GAMECONTROLLER_IP: "simulator"
+ ROBOCUP_MIRROR_SERVER_IP: "simulator"
+ ROBOCUP_TEAM_ID: 16
+ PYTHONUNBUFFERED: 1
+ DISPLAY: unix$DISPLAY
+ XDG_RUNTIME_DIR: $XDG_RUNTIME_DIR
+ ZED: "false"
diff --git a/tools/docker/compose.autonomy_arm64.yaml b/tools/docker/compose.autonomy_arm64.yaml
new file mode 100644
index 000000000..861375b08
--- /dev/null
+++ b/tools/docker/compose.autonomy_arm64.yaml
@@ -0,0 +1,76 @@
+services:
+ soccerbot_arm64:
+ network_mode: host
+ extends:
+ file: compose.autonomy.yaml
+ service: soccerbot
+ image: utrarobosoccer/soccerbot:arm64
+ group_add:
+ - "1001"
+ build:
+ context: ../../.
+ dockerfile: tools/docker/Dockerfile
+ target: builder
+ platforms:
+ - linux/arm64
+ args:
+ - BUILDKIT_INLINE_CACHE=1
+ - BASE_IMAGE=arm64v8/ros:noetic-robot
+ - ARCHITECTURE=sbsa
+ cache_from:
+ - utrarobosoccer/soccerbot:arm64
+ volumes:
+ - /run/jtop.sock:/run/jtop.sock
+ - /usr/bin/tegrastats:/usr/bin/tegrastats
+ - /usr/bin/nvpmodel:/usr/bin/nvpmodel
+ - /usr/bin/jetson_clocks:/usr/bin/jetson_clocks
+ - /usr/lib/aarch64-linux-gnu/tegra:/usr/lib/aarch64-linux-gnu/tegra
+ - /usr/local/cuda:/usr/local/cuda
+ - /usr/local/cuda-11:/usr/local/cuda-11
+ - /usr/local/cuda-11.4:/usr/local/cuda-11.4
+ - /etc/alternatives/cuda:/etc/alternatives/cuda
+ - /etc/alternatives/cuda-11:/etc/alternatives/cuda-11
+ - /usr/lib/aarch64-linux-gnu/libcudnn.so:/usr/lib/aarch64-linux-gnu/libcudnn.so
+ - /usr/lib/aarch64-linux-gnu/libcudnn.so.8:/usr/lib/aarch64-linux-gnu/libcudnn.so.8
+ - /usr/lib/aarch64-linux-gnu/libcudnn.so.8.6.0:/usr/lib/aarch64-linux-gnu/libcudnn.so.8.6.0
+ - /usr/lib/aarch64-linux-gnu/libcudnn_adv_infer.so.8.6.0:/usr/lib/aarch64-linux-gnu/libcudnn_adv_infer.so.8.6.0
+ - /usr/lib/aarch64-linux-gnu/libcudnn_adv_train.so.8.6.0:/usr/lib/aarch64-linux-gnu/libcudnn_adv_train.so.8.6.0
+ - /usr/lib/aarch64-linux-gnu/libcudnn_cnn_infer.so.8.6.0:/usr/lib/aarch64-linux-gnu/libcudnn_cnn_infer.so.8.6.0
+ - /usr/lib/aarch64-linux-gnu/libcudnn_cnn_train.so.8.6.0:/usr/lib/aarch64-linux-gnu/libcudnn_cnn_train.so.8.6.0
+ - /usr/lib/aarch64-linux-gnu/libcudnn_ops_infer.so.8.6.0:/usr/lib/aarch64-linux-gnu/libcudnn_ops_infer.so.8.6.0
+ - /usr/lib/aarch64-linux-gnu/libcudnn_ops_train.so.8.6.0:/usr/lib/aarch64-linux-gnu/libcudnn_ops_train.so.8.6.0
+ - /usr/lib/aarch64-linux-gnu/libcudnn_adv_infer.so.8:/usr/lib/aarch64-linux-gnu/libcudnn_adv_infer.so.8
+ - /usr/lib/aarch64-linux-gnu/libcudnn_adv_train.so.8:/usr/lib/aarch64-linux-gnu/libcudnn_adv_train.so.8
+ - /usr/lib/aarch64-linux-gnu/libcudnn_cnn_infer.so.8:/usr/lib/aarch64-linux-gnu/libcudnn_cnn_infer.so.8
+ - /usr/lib/aarch64-linux-gnu/libcudnn_cnn_train.so.8:/usr/lib/aarch64-linux-gnu/libcudnn_cnn_train.so.8
+ - /usr/lib/aarch64-linux-gnu/libcudnn_ops_infer.so.8:/usr/lib/aarch64-linux-gnu/libcudnn_ops_infer.so.8
+ - /usr/lib/aarch64-linux-gnu/libcudnn_ops_train.so.8:/usr/lib/aarch64-linux-gnu/libcudnn_ops_train.so.8
+ - /usr/lib/aarch64-linux-gnu/libcudnn_adv_infer_static.a:/usr/lib/aarch64-linux-gnu/libcudnn_adv_infer_static.a
+ - /usr/lib/aarch64-linux-gnu/libcudnn_adv_train_static.a:/usr/lib/aarch64-linux-gnu/libcudnn_adv_train_static.a
+ - /usr/lib/aarch64-linux-gnu/libcudnn_cnn_infer_static.a:/usr/lib/aarch64-linux-gnu/libcudnn_cnn_infer_static.a
+ - /usr/lib/aarch64-linux-gnu/libcudnn_cnn_train_static.a:/usr/lib/aarch64-linux-gnu/libcudnn_cnn_train_static.a
+ - /usr/lib/aarch64-linux-gnu/libcudnn_ops_infer_static.a:/usr/lib/aarch64-linux-gnu/libcudnn_ops_infer_static.a
+ - /usr/lib/aarch64-linux-gnu/libcudnn_ops_train_static.a:/usr/lib/aarch64-linux-gnu/libcudnn_ops_train_static.a
+ - /usr/lib/aarch64-linux-gnu/libcudnn_adv_infer_static_v8.a:/usr/lib/aarch64-linux-gnu/libcudnn_adv_infer_static_v8.a
+ - /usr/lib/aarch64-linux-gnu/libcudnn_adv_train_static_v8.a:/usr/lib/aarch64-linux-gnu/libcudnn_adv_train_static_v8.a
+ - /usr/lib/aarch64-linux-gnu/libcudnn_cnn_infer_static_v8.a:/usr/lib/aarch64-linux-gnu/libcudnn_cnn_infer_static_v8.a
+ - /usr/lib/aarch64-linux-gnu/libcudnn_cnn_train_static_v8.a:/usr/lib/aarch64-linux-gnu/libcudnn_cnn_train_static_v8.a
+ - /usr/lib/aarch64-linux-gnu/libcudnn_ops_infer_static_v8.a:/usr/lib/aarch64-linux-gnu/libcudnn_ops_infer_static_v8.a
+ - /usr/lib/aarch64-linux-gnu/libcudnn_ops_train_static_v8.a:/usr/lib/aarch64-linux-gnu/libcudnn_ops_train_static_v8.a
+ - /dev:/dev
+ - /tmp/argus_socket:/tmp/argus_socket
+ - /var/nvidia/nvcam/settings/:/var/nvidia/nvcam/settings/
+ - /etc/systemd/system:/etc/systemd/system
+ # Command that runs when docker compose pull is executed
+ command:
+ /bin/bash -c "source ~/catkin_ws/devel/setup.bash && sudo chmod +s /usr/bin/nice &&
+ roslaunch soccerbot soccerbot.launch simulation:=false __ns:=robot$$ROBOCUP_ROBOT_ID || sleep infinity"
+# environment:
+# ROS_MASTER_URI: ${ROS_MASTER_URI}
+# ROS_IP: ${ROS_IP}
+# ROBOT_MODEL: ${ROBOT_MODEL:-bez1}
+# ROBOCUP_ROBOT_ID: ${ROBOCUP_ROBOT_ID:-2}
+# ROBOCUP_TEAM_COLOR: ${ROBOCUP_TEAM_COLOR:-"blue"}
+# ROBOCUP_TEAM_ID: ${ROBOCUP_TEAM_ID:-10}
+# PYTHONUNBUFFERED: 1
+# PYTHONPATH: /home/robosoccer/catkin_ws/devel/lib/python3/dist-packages:/opt/ros/noetic/lib/python3/dist-packages:/home/robosoccer/.local/lib/python3.8/site-packages
diff --git a/tools/docker/compose.simulation.yaml b/tools/docker/compose.simulation.yaml
new file mode 100644
index 000000000..23cd623ef
--- /dev/null
+++ b/tools/docker/compose.simulation.yaml
@@ -0,0 +1,37 @@
+x-simulator: &simulator
+ image: utrarobosoccer/webots
+ stop_signal: SIGINT
+ stop_grace_period: 10s
+ privileged: true
+ build:
+ context: ./../external
+ args:
+ - BUILDKIT_INLINE_CACHE=1
+ cache_from:
+ - utrarobosoccer/webots
+ cap_add:
+ - SYS_PTRACE
+ pid: "host"
+ command: bash -c "cd webots && ./webots --batch --sysinfo --log-performance=performance.log /usr/local/hlvs_webots/worlds/robocup.wbt"
+ volumes:
+ - /tmp/.X11-unix:/tmp/.X11-unix:rw
+ - /dev/dri:/dev/dri:rw
+ - /dev/snd:/dev/snd:rw
+ - ./external/hlvs_webots/worlds:/usr/local/hlvs_webots/worlds:rw
+ - ./external/hlvs_webots/controllers/referee/:/usr/local/hlvs_webots/controllers/referee/:rw
+ - ./external/hlvs_webots/protos/:/usr/local/hlvs_webots/protos/:rw
+ - /var/run/docker.sock:/var/run/docker.sock
+ - /dev:/dev
+
+services:
+ simulator:
+ <<: *simulator
+ environment:
+ PYTHONUNBUFFERED: 1
+ DISPLAY: unix$DISPLAY
+ JAVA_HOME: /usr
+ XDG_RUNTIME_DIR: $XDG_RUNTIME_DIR
+ # Specify in comma seperated list see https://github.com/utra-robosoccer/hlvs_webots/blob/16194d22c91b8dfcae3b3298524281bf895cab5d/controllers/referee/team.py#L36
+ TEAM_1_PLAYERS_ON_FIELD: "1"
+ TEAM_2_PLAYERS_ON_FIELD: ""
+ ROBOT_MODEL: "bez1"
diff --git a/tools/docker/compose.testing.yaml b/tools/docker/compose.testing.yaml
new file mode 100644
index 000000000..8644be776
--- /dev/null
+++ b/tools/docker/compose.testing.yaml
@@ -0,0 +1,40 @@
+networks:
+ evtol_network:
+ ipam:
+ config:
+ - subnet: 172.10.0.0/24
+services:
+ simulator_test:
+ networks:
+ evtol_network:
+ ipv4_address: 172.10.0.10
+ extends:
+ file: compose.simulation.yaml
+ service: simulator
+ command:
+ /bin/bash -c "export ROS_MASTER_URI=http://172.10.0.10:11311 && export ROS_IP=172.10.0.10 && source $$HOME/catkin_ws/devel/setup.bash && source $$HOME/.bashrc &&
+ source /home/evtol/catkin_ws/src/PX4-Autopilot/Tools/simulation/gazebo-classic/setup_gazebo.bash /home/evtol/catkin_ws/src/PX4-Autopilot /home/evtol/catkin_ws/src/PX4-Autopilot/build/px4_sitl_default &&
+ export ROS_PACKAGE_PATH=$$ROS_PACKAGE_PATH:/home/evtol/catkin_ws/src/PX4-Autopilot:/home/evtol/catkin_ws/src/PX4-Autopilot/Tools/simulation/gazebo-classic/sitl_gazebo-classic &&
+ if [[ $$DISPLAY != '' ]]; then export DISPLAY=unix$DISPLAY && roslaunch px4 mavros_posix_sitl.launch;
+ else export DISPLAY=unix:1 && Xvfb :1 -screen 0 1024x768x24 | (roslaunch px4 mavros_posix_sitl.launch gui:=false);
+ fi || sleep infinity"
+ # healthcheck:
+ # test: exit 0
+ # interval: 3s
+ # timeout: 3s
+ # retries: 1
+ # start_period: 0s
+ # start_interval: 3s
+
+ evtol_test:
+ networks:
+ evtol_network:
+ ipv4_address: 172.10.0.2
+ extends:
+ file: compose.autonomy.yaml
+ service: evtol_no_cuda
+ command:
+ /bin/bash -c "export ROS_MASTER_URI=http://172.10.0.10:11311 && export ROS_IP=172.10.0.2 && source $$HOME/catkin_ws/devel/setup.bash &&
+ pytest -s $$HOME/catkin_ws/src/evtol_software/test/test_integration.py::IntegrationTestInitial::${TEST_NAME:-test_arm}"
+ ports:
+ - 11311:11311
diff --git a/docker-compose.dual.yaml b/tools/docker/docker-compose.dual.yaml
similarity index 100%
rename from docker-compose.dual.yaml
rename to tools/docker/docker-compose.dual.yaml
diff --git a/docker-compose.full.yaml b/tools/docker/docker-compose.full.yaml
similarity index 100%
rename from docker-compose.full.yaml
rename to tools/docker/docker-compose.full.yaml
diff --git a/docker-compose.game_controller.yaml b/tools/docker/docker-compose.game_controller.yaml
similarity index 100%
rename from docker-compose.game_controller.yaml
rename to tools/docker/docker-compose.game_controller.yaml
diff --git a/docker-compose.override.yaml b/tools/docker/docker-compose.override.yaml
similarity index 100%
rename from docker-compose.override.yaml
rename to tools/docker/docker-compose.override.yaml
diff --git a/docker-compose.robot.yaml b/tools/docker/docker-compose.robot.yaml
similarity index 99%
rename from docker-compose.robot.yaml
rename to tools/docker/docker-compose.robot.yaml
index 4a2424dab..152d4daba 100644
--- a/docker-compose.robot.yaml
+++ b/tools/docker/docker-compose.robot.yaml
@@ -8,7 +8,7 @@ services:
service: friendly
image: utrarobosoccer/soccerbot:arm64
build:
- context: .
+ context: ../..
target: builder
args:
- BUILDKIT_INLINE_CACHE=1
diff --git a/docker-compose.test.kick.yaml b/tools/docker/docker-compose.test.kick.yaml
similarity index 100%
rename from docker-compose.test.kick.yaml
rename to tools/docker/docker-compose.test.kick.yaml
diff --git a/docker-compose.test.yaml b/tools/docker/docker-compose.test.yaml
similarity index 99%
rename from docker-compose.test.yaml
rename to tools/docker/docker-compose.test.yaml
index 2b91b7bcf..d01f74912 100644
--- a/docker-compose.test.yaml
+++ b/tools/docker/docker-compose.test.yaml
@@ -35,7 +35,7 @@ services:
image: utrarobosoccer/webots
privileged: true
build:
- context: external
+ context: ../../external
args:
- BUILDKIT_INLINE_CACHE=1
cache_from:
diff --git a/tools/setup/requirements-gpu.txt b/tools/setup/requirements-gpu.txt
new file mode 100644
index 000000000..14fca847c
--- /dev/null
+++ b/tools/setup/requirements-gpu.txt
@@ -0,0 +1,34 @@
+
+nvidia-cublas-cu12==12.1.3.1
+ # via
+ # nvidia-cudnn-cu12
+ # nvidia-cusolver-cu12
+ # torch
+nvidia-cuda-cupti-cu12==12.1.105
+ # via torch
+nvidia-cuda-nvrtc-cu12==12.1.105
+ # via torch
+nvidia-cuda-runtime-cu12==12.1.105
+ # via torch
+nvidia-cudnn-cu12==8.9.2.26
+ # via torch
+nvidia-cufft-cu12==11.0.2.54
+ # via torch
+nvidia-curand-cu12==10.3.2.106
+ # via torch
+nvidia-cusolver-cu12==11.4.5.107
+ # via torch
+nvidia-cusparse-cu12==12.1.0.106
+ # via
+ # nvidia-cusolver-cu12
+ # torch
+nvidia-nccl-cu12==2.20.5
+ # via torch
+nvidia-nvjitlink-cu12==12.6.68
+ # via
+ # nvidia-cusolver-cu12
+ # nvidia-cusparse-cu12
+nvidia-nvtx-cu12==12.1.105
+
+torch @ https://download.pytorch.org/whl/cu121/torch-2.3.1%2Bcu121-cp38-cp38-linux_x86_64.whl ; platform_machine == 'x86_64'
+torchvision @ https://download.pytorch.org/whl/cu121/torchvision-0.18.1%2Bcu121-cp38-cp38-linux_x86_64.whl ; platform_machine == 'x86_64'
diff --git a/tools/setup/requirements.txt b/tools/setup/requirements.txt
new file mode 100644
index 000000000..7bbabead8
--- /dev/null
+++ b/tools/setup/requirements.txt
@@ -0,0 +1,747 @@
+#
+# This file is autogenerated by pip-compile with Python 3.8
+# by the following command:
+#
+# pip-compile
+#
+absl-py==2.1.0
+ # via
+ # mujoco
+ # soccerbot (pyproject.toml)
+addict==2.4.0
+ # via
+ # open3d
+ # soccerbot (pyproject.toml)
+argparse==1.4.0
+ # via soccerbot (pyproject.toml)
+asttokens==2.4.1
+ # via
+ # soccerbot (pyproject.toml)
+ # stack-data
+attrs==24.2.0
+ # via
+ # jsonschema
+ # referencing
+ # service-identity
+ # soccerbot (pyproject.toml)
+ # twisted
+autobahn==23.1.2
+ # via
+ # roslibpy
+ # soccerbot (pyproject.toml)
+automat==24.8.1
+ # via
+ # soccerbot (pyproject.toml)
+ # twisted
+backcall==0.2.0
+ # via
+ # ipython
+ # soccerbot (pyproject.toml)
+beautifulsoup4==4.12.3
+ # via
+ # gdown
+ # soccerbot (pyproject.toml)
+blinker==1.8.2
+ # via
+ # flask
+ # soccerbot (pyproject.toml)
+catkin-pkg==0.5.2
+ # via
+ # rospkg
+ # soccerbot (pyproject.toml)
+certifi==2024.8.30
+ # via
+ # requests
+ # soccerbot (pyproject.toml)
+cffi==1.17.1
+ # via
+ # cryptography
+ # soccerbot (pyproject.toml)
+cfgv==3.4.0
+ # via
+ # pre-commit
+ # soccerbot (pyproject.toml)
+charset-normalizer==3.3.2
+ # via
+ # requests
+ # soccerbot (pyproject.toml)
+click==8.1.7
+ # via
+ # flask
+ # soccerbot (pyproject.toml)
+cmeel==0.53.3
+ # via
+ # cmeel-assimp
+ # cmeel-boost
+ # cmeel-console-bridge
+ # cmeel-octomap
+ # cmeel-qhull
+ # cmeel-tinyxml
+ # cmeel-urdfdom
+ # eigenpy
+ # eiquadprog
+ # hpp-fcl
+ # pin
+ # placo
+ # rhoban-cmeel-jsoncpp
+ # soccerbot (pyproject.toml)
+cmeel-assimp==5.3.1
+ # via
+ # hpp-fcl
+ # soccerbot (pyproject.toml)
+cmeel-boost==1.83.0
+ # via
+ # eigenpy
+ # eiquadprog
+ # hpp-fcl
+ # pin
+ # soccerbot (pyproject.toml)
+cmeel-console-bridge==1.0.2.2
+ # via
+ # cmeel-urdfdom
+ # soccerbot (pyproject.toml)
+cmeel-octomap==1.9.8.2
+ # via
+ # hpp-fcl
+ # soccerbot (pyproject.toml)
+cmeel-qhull==8.0.2.1
+ # via
+ # hpp-fcl
+ # soccerbot (pyproject.toml)
+cmeel-tinyxml==2.6.2.3
+ # via
+ # cmeel-urdfdom
+ # soccerbot (pyproject.toml)
+cmeel-urdfdom==3.1.1.1
+ # via
+ # pin
+ # soccerbot (pyproject.toml)
+comm==0.2.2
+ # via
+ # ipywidgets
+ # soccerbot (pyproject.toml)
+configargparse==1.7
+ # via
+ # open3d
+ # soccerbot (pyproject.toml)
+constantly==23.10.4
+ # via
+ # soccerbot (pyproject.toml)
+ # twisted
+construct==2.10.67
+ # via soccerbot (pyproject.toml)
+cryptography==43.0.1
+ # via
+ # autobahn
+ # pyopenssl
+ # service-identity
+ # soccerbot (pyproject.toml)
+cycler==0.12.1
+ # via
+ # matplotlib
+ # soccerbot (pyproject.toml)
+cython==3.0.11
+ # via soccerbot (pyproject.toml)
+dash==2.18.0
+ # via
+ # open3d
+ # soccerbot (pyproject.toml)
+dash-core-components==2.0.0
+ # via
+ # dash
+ # soccerbot (pyproject.toml)
+dash-html-components==2.0.0
+ # via
+ # dash
+ # soccerbot (pyproject.toml)
+dash-table==5.0.0
+ # via
+ # dash
+ # soccerbot (pyproject.toml)
+decorator==5.1.1
+ # via
+ # ipython
+ # soccerbot (pyproject.toml)
+distlib==0.3.8
+ # via
+ # soccerbot (pyproject.toml)
+ # virtualenv
+distro==1.9.0
+ # via
+ # rospkg
+ # soccerbot (pyproject.toml)
+docutils==0.20.1
+ # via
+ # catkin-pkg
+ # soccerbot (pyproject.toml)
+eigenpy==3.5.1
+ # via
+ # hpp-fcl
+ # soccerbot (pyproject.toml)
+eiquadprog==1.2.8
+ # via
+ # placo
+ # soccerbot (pyproject.toml)
+empy==3.3.4
+ # via soccerbot (pyproject.toml)
+etils[epath,epy]==1.3.0
+ # via
+ # mujoco
+ # soccerbot (pyproject.toml)
+exceptiongroup==1.2.2
+ # via
+ # pytest
+ # soccerbot (pyproject.toml)
+executing==2.1.0
+ # via
+ # soccerbot (pyproject.toml)
+ # stack-data
+fastjsonschema==2.20.0
+ # via
+ # nbformat
+ # soccerbot (pyproject.toml)
+filelock==3.16.0
+ # via
+ # gdown
+ # soccerbot (pyproject.toml)
+ # torch
+ # triton
+ # virtualenv
+filterpy==1.4.5
+ # via soccerbot (pyproject.toml)
+flask==3.0.3
+ # via
+ # dash
+ # soccerbot (pyproject.toml)
+fonttools==4.53.1
+ # via
+ # matplotlib
+ # soccerbot (pyproject.toml)
+fsspec==2024.9.0
+ # via
+ # soccerbot (pyproject.toml)
+ # torch
+gdown==4.5.4
+ # via soccerbot (pyproject.toml)
+glfw==2.7.0
+ # via
+ # mujoco
+ # soccerbot (pyproject.toml)
+hpp-fcl==2.4.4
+ # via
+ # pin
+ # soccerbot (pyproject.toml)
+hyperlink==21.0.0
+ # via
+ # autobahn
+ # soccerbot (pyproject.toml)
+ # twisted
+identify==2.6.0
+ # via
+ # pre-commit
+ # soccerbot (pyproject.toml)
+idna==3.8
+ # via
+ # hyperlink
+ # requests
+ # soccerbot (pyproject.toml)
+ # twisted
+importlib-metadata==8.5.0
+ # via
+ # dash
+ # flask
+ # soccerbot (pyproject.toml)
+importlib-resources==6.4.5
+ # via
+ # etils
+ # jsonschema
+ # jsonschema-specifications
+ # soccerbot (pyproject.toml)
+incremental==24.7.2
+ # via
+ # soccerbot (pyproject.toml)
+ # twisted
+iniconfig==2.0.0
+ # via
+ # pytest
+ # soccerbot (pyproject.toml)
+ipython==8.10.0
+ # via
+ # ipywidgets
+ # meshcat
+ # soccerbot (pyproject.toml)
+ipywidgets==8.1.5
+ # via
+ # open3d
+ # soccerbot (pyproject.toml)
+ischedule==1.2.7
+ # via
+ # placo
+ # soccerbot (pyproject.toml)
+itsdangerous==2.2.0
+ # via
+ # flask
+ # soccerbot (pyproject.toml)
+jedi==0.19.1
+ # via
+ # ipython
+ # soccerbot (pyproject.toml)
+jinja2==3.1.4
+ # via
+ # flask
+ # soccerbot (pyproject.toml)
+ # torch
+joblib==1.4.2
+ # via
+ # scikit-learn
+ # soccerbot (pyproject.toml)
+jsonschema==4.23.0
+ # via
+ # nbformat
+ # soccerbot (pyproject.toml)
+jsonschema-specifications==2023.12.1
+ # via
+ # jsonschema
+ # soccerbot (pyproject.toml)
+jupyter-core==5.7.2
+ # via
+ # nbformat
+ # soccerbot (pyproject.toml)
+jupyterlab-widgets==3.0.13
+ # via
+ # ipywidgets
+ # soccerbot (pyproject.toml)
+kiwisolver==1.4.7
+ # via
+ # matplotlib
+ # soccerbot (pyproject.toml)
+markupsafe==2.1.5
+ # via
+ # jinja2
+ # soccerbot (pyproject.toml)
+ # werkzeug
+matplotlib==3.5.3
+ # via
+ # filterpy
+ # open3d
+ # seaborn
+ # soccerbot (pyproject.toml)
+ # ultralytics
+matplotlib-inline==0.1.7
+ # via
+ # ipython
+ # soccerbot (pyproject.toml)
+meshcat==0.3.2
+ # via
+ # placo
+ # soccerbot (pyproject.toml)
+mpmath==1.3.0
+ # via
+ # soccerbot (pyproject.toml)
+ # sympy
+mujoco==3.2.2 ; platform_machine == "x86_64"
+ # via soccerbot (pyproject.toml)
+mypy-extensions==1.0.0
+ # via soccerbot (pyproject.toml)
+nbformat==5.7.0
+ # via
+ # open3d
+ # soccerbot (pyproject.toml)
+nest-asyncio==1.6.0
+ # via
+ # dash
+ # soccerbot (pyproject.toml)
+networkx==3.1
+ # via
+ # soccerbot (pyproject.toml)
+ # torch
+nodeenv==1.9.1
+ # via
+ # pre-commit
+ # soccerbot (pyproject.toml)
+numpy==1.24.4
+ # via
+ # cmeel-boost
+ # filterpy
+ # matplotlib
+ # meshcat
+ # mujoco
+ # open3d
+ # opencv-python
+ # pandas
+ # placo
+ # pyquaternion
+ # scikit-learn
+ # scipy
+ # seaborn
+ # soccerbot (pyproject.toml)
+ # torchvision
+ # transforms3d
+ # ultralytics
+ # ultralytics-thop
+nvidia-cublas-cu12==12.1.3.1
+ # via
+ # nvidia-cudnn-cu12
+ # nvidia-cusolver-cu12
+ # torch
+nvidia-cuda-cupti-cu12==12.1.105
+ # via torch
+nvidia-cuda-nvrtc-cu12==12.1.105
+ # via torch
+nvidia-cuda-runtime-cu12==12.1.105
+ # via torch
+nvidia-cudnn-cu12==8.9.2.26
+ # via torch
+nvidia-cufft-cu12==11.0.2.54
+ # via torch
+nvidia-curand-cu12==10.3.2.106
+ # via torch
+nvidia-cusolver-cu12==11.4.5.107
+ # via torch
+nvidia-cusparse-cu12==12.1.0.106
+ # via
+ # nvidia-cusolver-cu12
+ # torch
+nvidia-nccl-cu12==2.20.5
+ # via torch
+nvidia-nvjitlink-cu12==12.6.68
+ # via
+ # nvidia-cusolver-cu12
+ # nvidia-cusparse-cu12
+nvidia-nvtx-cu12==12.1.105
+ # via torch
+open3d==0.17.0 ; platform_machine == "x86_64"
+ # via soccerbot (pyproject.toml)
+opencv-python==4.10.0.84
+ # via
+ # soccerbot (pyproject.toml)
+ # ultralytics
+osrf-pycommon==2.0.2
+ # via soccerbot (pyproject.toml)
+packaging==24.1
+ # via
+ # matplotlib
+ # plotly
+ # pytest
+ # soccerbot (pyproject.toml)
+pandas==2.0.3
+ # via
+ # open3d
+ # seaborn
+ # soccerbot (pyproject.toml)
+ # ultralytics
+parso==0.8.4
+ # via
+ # jedi
+ # soccerbot (pyproject.toml)
+pexpect==4.9.0
+ # via
+ # ipython
+ # soccerbot (pyproject.toml)
+pickleshare==0.7.5
+ # via
+ # ipython
+ # soccerbot (pyproject.toml)
+pillow==10.4.0
+ # via
+ # matplotlib
+ # meshcat
+ # open3d
+ # soccerbot (pyproject.toml)
+ # torchvision
+ # ultralytics
+pin==2.7.0
+ # via
+ # placo
+ # soccerbot (pyproject.toml)
+pkgutil-resolve-name==1.3.10
+ # via
+ # jsonschema
+ # soccerbot (pyproject.toml)
+placo==0.6.2
+ # via soccerbot (pyproject.toml)
+platformdirs==4.3.2
+ # via
+ # jupyter-core
+ # soccerbot (pyproject.toml)
+ # virtualenv
+plotly==5.24.0
+ # via
+ # dash
+ # soccerbot (pyproject.toml)
+pluggy==1.5.0
+ # via
+ # pytest
+ # soccerbot (pyproject.toml)
+pre-commit==3.5.0
+ # via soccerbot (pyproject.toml)
+prompt-toolkit==3.0.47
+ # via
+ # ipython
+ # soccerbot (pyproject.toml)
+protobuf==3.20.2
+ # via soccerbot (pyproject.toml)
+psutil==5.9.8 ; platform_machine == "x86_64"
+ # via
+ # soccerbot (pyproject.toml)
+ # ultralytics
+ptyprocess==0.7.0
+ # via
+ # pexpect
+ # soccerbot (pyproject.toml)
+pure-eval==0.2.3
+ # via
+ # soccerbot (pyproject.toml)
+ # stack-data
+py-cpuinfo==9.0.0
+ # via
+ # soccerbot (pyproject.toml)
+ # ultralytics
+pyasn1==0.6.1
+ # via
+ # pyasn1-modules
+ # service-identity
+ # soccerbot (pyproject.toml)
+pyasn1-modules==0.4.1
+ # via
+ # service-identity
+ # soccerbot (pyproject.toml)
+pybullet==3.2.6 ; platform_machine == "x86_64"
+ # via soccerbot (pyproject.toml)
+pycparser==2.22
+ # via
+ # cffi
+ # soccerbot (pyproject.toml)
+pygame==2.5.2
+ # via soccerbot (pyproject.toml)
+pygments==2.18.0
+ # via
+ # ipython
+ # soccerbot (pyproject.toml)
+pyngrok==7.2.0
+ # via
+ # meshcat
+ # soccerbot (pyproject.toml)
+pyopengl==3.1.7
+ # via
+ # mujoco
+ # soccerbot (pyproject.toml)
+pyopenssl==24.2.1
+ # via
+ # soccerbot (pyproject.toml)
+ # twisted
+pyparsing==3.1.4
+ # via
+ # catkin-pkg
+ # matplotlib
+ # soccerbot (pyproject.toml)
+pyquaternion==0.9.9
+ # via
+ # open3d
+ # soccerbot (pyproject.toml)
+pysocks==1.7.1
+ # via
+ # requests
+ # soccerbot (pyproject.toml)
+pytest==7.4.4
+ # via soccerbot (pyproject.toml)
+python-dateutil==2.9.0.post0
+ # via
+ # catkin-pkg
+ # matplotlib
+ # pandas
+ # soccerbot (pyproject.toml)
+pytz==2024.2
+ # via
+ # pandas
+ # soccerbot (pyproject.toml)
+pyyaml==6.0.2
+ # via
+ # open3d
+ # pre-commit
+ # pyngrok
+ # rospkg
+ # soccerbot (pyproject.toml)
+ # ultralytics
+pyzmq==26.2.0
+ # via
+ # meshcat
+ # soccerbot (pyproject.toml)
+referencing==0.35.1
+ # via
+ # jsonschema
+ # jsonschema-specifications
+ # soccerbot (pyproject.toml)
+requests[socks]==2.32.3
+ # via
+ # dash
+ # gdown
+ # soccerbot (pyproject.toml)
+ # ultralytics
+retrying==1.3.4
+ # via
+ # dash
+ # soccerbot (pyproject.toml)
+rhoban-cmeel-jsoncpp==1.9.4.1
+ # via
+ # placo
+ # soccerbot (pyproject.toml)
+roslibpy==1.7.0
+ # via soccerbot (pyproject.toml)
+rospkg==1.5.1
+ # via soccerbot (pyproject.toml)
+rpds-py==0.20.0
+ # via
+ # jsonschema
+ # referencing
+ # soccerbot (pyproject.toml)
+scikit-learn==1.3.2
+ # via
+ # open3d
+ # soccerbot (pyproject.toml)
+scipy==1.10.1
+ # via
+ # filterpy
+ # scikit-learn
+ # soccerbot (pyproject.toml)
+ # ultralytics
+seaborn==0.13.2
+ # via
+ # soccerbot (pyproject.toml)
+ # ultralytics
+service-identity==24.1.0
+ # via
+ # soccerbot (pyproject.toml)
+ # twisted
+six==1.16.0
+ # via
+ # asttokens
+ # gdown
+ # python-dateutil
+ # retrying
+ # soccerbot (pyproject.toml)
+soupsieve==2.6
+ # via
+ # beautifulsoup4
+ # soccerbot (pyproject.toml)
+stack-data==0.6.3
+ # via
+ # ipython
+ # soccerbot (pyproject.toml)
+sympy==1.13.2
+ # via
+ # soccerbot (pyproject.toml)
+ # torch
+tenacity==9.0.0
+ # via
+ # plotly
+ # soccerbot (pyproject.toml)
+threadpoolctl==3.5.0
+ # via
+ # scikit-learn
+ # soccerbot (pyproject.toml)
+timeout-decorator==0.5.0
+ # via soccerbot (pyproject.toml)
+tomli==2.0.1
+ # via
+ # cmeel
+ # incremental
+ # pytest
+ # soccerbot (pyproject.toml)
+torch==2.3.1; platform_machine == 'x86_64'
+ # via
+ # torchvision
+ # ultralytics
+ # ultralytics-thop
+torchvision==0.18.1 ; platform_machine == 'x86_64'
+ # via ultralytics
+tornado==6.4.1
+ # via
+ # meshcat
+ # soccerbot (pyproject.toml)
+tqdm==4.66.5
+ # via
+ # gdown
+ # open3d
+ # soccerbot (pyproject.toml)
+ # ultralytics
+traitlets==5.14.3
+ # via
+ # comm
+ # ipython
+ # ipywidgets
+ # jupyter-core
+ # matplotlib-inline
+ # nbformat
+ # soccerbot (pyproject.toml)
+transforms3d==0.4.2
+ # via soccerbot (pyproject.toml)
+triton==2.3.1
+ # via
+ # soccerbot (pyproject.toml)
+ # torch
+twisted[tls]==24.7.0
+ # via
+ # roslibpy
+ # soccerbot (pyproject.toml)
+txaio==23.1.1
+ # via
+ # autobahn
+ # soccerbot (pyproject.toml)
+typing-extensions==4.12.2
+ # via
+ # automat
+ # dash
+ # etils
+ # soccerbot (pyproject.toml)
+ # torch
+ # twisted
+tzdata==2024.1
+ # via
+ # pandas
+ # soccerbot (pyproject.toml)
+u-msgpack-python==2.8.0
+ # via
+ # meshcat
+ # soccerbot (pyproject.toml)
+ultralytics==8.2.91
+ # via soccerbot (pyproject.toml)
+ultralytics-thop==2.0.6
+ # via
+ # soccerbot (pyproject.toml)
+ # ultralytics
+urllib3==2.2.2
+ # via
+ # requests
+ # soccerbot (pyproject.toml)
+virtualenv==20.26.4
+ # via
+ # pre-commit
+ # soccerbot (pyproject.toml)
+wcwidth==0.2.13
+ # via
+ # prompt-toolkit
+ # soccerbot (pyproject.toml)
+werkzeug==3.0.4
+ # via
+ # dash
+ # flask
+ # open3d
+ # soccerbot (pyproject.toml)
+widgetsnbextension==4.0.13
+ # via
+ # ipywidgets
+ # soccerbot (pyproject.toml)
+zipp==3.20.1
+ # via
+ # etils
+ # importlib-metadata
+ # importlib-resources
+ # soccerbot (pyproject.toml)
+zope-interface==7.0.3
+ # via
+ # soccerbot (pyproject.toml)
+ # twisted
+gitpython>=3.1.30
+# The following packages are considered to be unsafe in a requirements file:
+# setuptools
diff --git a/tools/setup/rosdep.txt b/tools/setup/rosdep.txt
new file mode 100644
index 000000000..f2387e463
--- /dev/null
+++ b/tools/setup/rosdep.txt
@@ -0,0 +1,60 @@
+screen
+vim
+python3-pip
+python3-catkin-tools
+python3-protobuf
+protobuf-compiler
+libprotobuf-dev
+libjpeg8-dev
+wget
+ccache
+dirmngr
+gnupg2
+lsb-release
+net-tools
+iputils-ping
+apt-utils
+software-properties-common
+sudo
+unzip
+curl
+libxkbcommon-x11-0
+libxcb-icccm4
+libxcb-xkb1
+libxcb-icccm4
+libxcb-image0
+libxcb-render-util0
+libxcb-randr0
+libxcb-keysyms1
+libxcb-xinerama0
+qt5-default
+qtbase5-dev
+python3-pyqt5
+python-is-python3
+git
+python3-setuptools
+default-jdk
+libprotobuf-dev
+libprotoc-dev
+protobuf-compiler
+python3-protobuf
+python3-scipy
+ros-noetic-amcl
+ros-noetic-control-msgs
+ros-noetic-cv-bridge
+ros-noetic-effort-controllers
+ros-noetic-foxglove-bridge
+ros-noetic-imu-complementary-filter
+ros-noetic-map-server
+ros-noetic-pointcloud-to-laserscan
+ros-noetic-robot-localization
+ros-noetic-robot-pose-ekf
+ros-noetic-ros-control
+ros-noetic-tf
+ros-noetic-tf2-ros
+ros-noetic-urdf
+ros-noetic-usb-cam
+ros-noetic-webots-ros
+ros-noetic-xacro
+ros-noetic-robot-state-publisher
+xterm