Skip to content

Commit 0179f40

Browse files
author
Saurav Agarwal
committed
Add data generator
1 parent 3d56f37 commit 0179f40

9 files changed

Lines changed: 485 additions & 3 deletions

File tree

cppsrc/main/CMakeLists.txt

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
cmake_minimum_required(VERSION 3.15)
2+
3+
project(CoverageControlMain VERSION 0.3 LANGUAGES CUDA CXX)
4+
set(CMAKE_CXX_STANDARD 17)
5+
set(CMAKE_CXX_STANDARD_REQUIRED True)
6+
set(CMAKE_COLOR_DIAGNOSTICS ON)
7+
8+
find_package(Torch REQUIRED)
9+
find_package(TorchVision REQUIRED)
10+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS} -Wall -Wextra -Wshadow -Wformat=2 -Wunused -pedantic")
11+
12+
find_package(OpenMP REQUIRED)
13+
find_package(Eigen3 REQUIRED)
14+
find_package(GeographicLib REQUIRED)
15+
find_package(CGAL REQUIRED)
16+
find_package(yaml-cpp REQUIRED)
17+
find_package(CoverageControlCore REQUIRED)
18+
find_package(CoverageControlTorch REQUIRED)
19+
20+
#################
21+
## Executables ##
22+
#################
23+
24+
add_library(compiler_flags INTERFACE)
25+
target_compile_features(compiler_flags INTERFACE cxx_std_17)
26+
27+
set(gcc_like_cxx "$<COMPILE_LANG_AND_ID:CXX,ARMClang,AppleClang,Clang,GNU,LCC>")
28+
set(msvc_cxx "$<COMPILE_LANG_AND_ID:CXX,MSVC>")
29+
target_compile_options(compiler_flags INTERFACE
30+
"$<${gcc_like_cxx}:$<BUILD_INTERFACE:-Wall;-Wextra;-Wshadow;-Wformat=2;-Wunused;-pedantic>>"
31+
"$<${msvc_cxx}:$<BUILD_INTERFACE:-W3>>"
32+
)
33+
add_executable(data_generation data_generation.cpp)
34+
target_link_libraries(data_generation PRIVATE compiler_flags CoverageControlCore CoverageControlTorch)
35+
install(TARGETS data_generation DESTINATION ${CMAKE_INSTALL_BINDIR})

cppsrc/main/data_generation.cpp

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
#include <torch/script.h>
2+
#include <torch/torch.h>
3+
#include <torchvision/vision.h>
4+
#include <iostream>
5+
6+
#include <iomanip>
7+
#include <iostream>
8+
#include <random>
9+
#include <filesystem>
10+
11+
#include <CoverageControlTorch/coverage_system.h>
12+
#include <CoverageControlTorch/generate_dataset.h>
13+
14+
using CoverageControl::Point2;
15+
using CoverageControl::BivariateNormalDistribution;
16+
using CoverageControl::WorldIDF;
17+
using namespace torch::indexing;
18+
19+
namespace CC = CoverageControl;
20+
namespace CCT = CoverageControlTorch;
21+
22+
int main(int argc, char** argv) {
23+
/* if (argc != 2) { */
24+
/* std::cout << "Usage: ./data_generation <path_to_resizer_model>" << std::endl; */
25+
/* std::cout << "TorchVision JIT Transformer is required\n"; */
26+
/* return 1; */
27+
/* } */
28+
29+
/* // Read first argument as path to resizer model */
30+
/* std::string resizer_model_path = argv[1]; */
31+
/* if (!std::filesystem::exists(resizer_model_path)) { */
32+
/* std::cout << "Error: " << resizer_model_path << " does not exist\n"; */
33+
/* return 1; */
34+
/* } */
35+
36+
/* Parameters params; */
37+
38+
/* std::vector <Point2> robot_positions; */
39+
/* robot_positions.push_back(Point2(100, 100)); */
40+
/* robot_positions.push_back(Point2(100, 10)); */
41+
/* robot_positions.push_back(Point2(10, 70)); */
42+
43+
/* WorldIDF world_idf(params); */
44+
/* params.pNumRobots = robot_positions.size(); */
45+
/* world_idf.AddNormalDistribution(BivariateNormalDistribution(Point2(95, 95), 10)); */
46+
47+
/* CCT::CoverageSystem env (params, world_idf, robot_positions); */
48+
/* torch::Tensor local_maps = torch::empty({2, params.pNumRobots, params.pLocalMapSize, params.pLocalMapSize}); */
49+
/* std::cout << std::setprecision(10) << std::endl; */
50+
/* env.GetAllRobotsLocalMaps(local_maps[0]); */
51+
/* env.GetAllRobotsLocalMaps(local_maps[1]); */
52+
/* print(local_maps[0].sum()); */
53+
/* std::cout << local_maps.sum() << std::endl; */
54+
/* std::cout << "shape: " << local_maps.sizes(); */
55+
/* torch::save(local_maps[0], "test.pt"); */
56+
57+
/* torch::jit::script::Module resizer_model; */
58+
/* resizer_model = torch::jit::load(resizer_model_path); */
59+
60+
/* std::cout << "shape of local_maps: " << local_maps[0][0].sizes() << std::endl; */
61+
62+
/* std::vector<torch::jit::IValue> inputs; */
63+
/* inputs.push_back(local_maps); */
64+
/* torch::Tensor resized_maps = resizer_model.forward(inputs).toTensor(); */
65+
/* std::cout << "resized_maps: " << resized_maps.sizes() << std::endl; */
66+
67+
/* torch::Tensor comm_maps = torch::zeros({params.pNumRobots, 32, 32}); */
68+
/* env.GetAllRobotsCommunicationMaps(comm_maps, 32); */
69+
/* std::cout << "shape of comm_maps: " << comm_maps.sizes() << std::endl; */
70+
71+
/* auto sparse_comm_maps = comm_maps.to_sparse(); */
72+
/* std::cout << sparse_comm_maps << std::endl; */
73+
74+
/* std::cout << torch::nonzero(comm_maps) - 16 << std::endl; */
75+
76+
/* torch::Tensor test_tensor = torch::zeros({5}); */
77+
/* test_tensor[0] = 1; */
78+
/* test_tensor[1] = 2; */
79+
/* test_tensor[2] = 3; */
80+
/* std::cout << test_tensor << std::endl; */
81+
/* auto test_tensor2 = test_tensor.index({Slice(0, 3)}); */
82+
/* std::cout << test_tensor2 << std::endl; */
83+
/* test_tensor2[0] = 10; */
84+
/* std::cout << test_tensor << std::endl; */
85+
86+
87+
CCT::GenerateDataset dataset_generator("/root/CoverageControl_ws/data/pure_coverage/data_params.yaml");;
88+
89+
90+
return 0;
91+
92+
}

cppsrc/setup.sh

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ done
1515
BUILD_DIR=${COVERAGECONTROL_WS}/build
1616
INSTALL_DIR=${COVERAGECONTROL_WS}/install
1717

18-
CMAKE_END_FLAGS="-DCMAKE_BUILD_TYPE=RelWithDebInfo"
18+
CMAKE_END_FLAGS="-DCMAKE_BUILD_TYPE=RelWithDebInfo -G Ninja"
1919

2020
CleanBuild () {
2121
rm -rf ${BUILD_DIR}
@@ -36,7 +36,7 @@ InstallCoverageControl () {
3636

3737
echo "Successfully built and installed CoverageControlCore"
3838

39-
cmake -S ${COVERAGECONTROL_WS}/src/CoverageControl/cppsrc/torch -B ${BUILD_DIR}/CoverageControlTorch ${CMAKE_END_FLAGS}
39+
cmake -S ${COVERAGECONTROL_WS}/src/CoverageControl/cppsrc/torch -B ${BUILD_DIR}/CoverageControlTorch ${CMAKE_END_FLAGS} -DCMAKE_PREFIX_PATH=${Torch_DIR}
4040
cmake --build ${BUILD_DIR}/CoverageControlTorch -j$(nproc)
4141
if [ $? -ne 0 ]; then
4242
echo "CoverageControlTorch build failed"
@@ -61,6 +61,19 @@ InstallCoverageControl () {
6161
fi
6262

6363
echo "Successfully built and installed CoverageControlTests"
64+
65+
cmake -S ${COVERAGECONTROL_WS}/src/CoverageControl/cppsrc/main -B ${BUILD_DIR}/CoverageControlMain ${CMAKE_END_FLAGS} -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}
66+
cmake --build ${BUILD_DIR}/CoverageControlMain -j$(nproc)
67+
if [ $? -ne 0 ]; then
68+
echo "CoverageControlMain build failed"
69+
exit 1
70+
fi
71+
cmake --install ${BUILD_DIR}/CoverageControlMain
72+
if [ $? -ne 0 ]; then
73+
echo "CoverageControlMain install failed"
74+
fi
75+
76+
echo "Successfully built and installed CoverageControlMain"
6477
}
6578

6679
if [[ ${INSTALL} ]]

cppsrc/tests/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED True)
66
set(CMAKE_COLOR_DIAGNOSTICS ON)
77

88
find_package(Torch REQUIRED)
9+
find_package(TorchVision REQUIRED)
910
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}")
1011

1112
find_package(OpenMP REQUIRED)

cppsrc/tests/torch_map_conversion.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,11 @@ int main(int argc, char** argv) {
3939

4040
print(env_map_tensor[50][50]);
4141

42+
torch::save(env_map_tensor, "data/test/env_map.pt");
43+
44+
torch::Tensor env_map_tensor_loaded;
45+
torch::load(env_map_tensor_loaded, "data/test/env_map.pt");
46+
print(env_map_tensor_loaded[50][50]);
47+
4248
return 0;
4349
}

cppsrc/torch/CMakeLists.txt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@ set(CMAKE_CXX_STANDARD_REQUIRED True)
99
set(CMAKE_COLOR_DIAGNOSTICS ON)
1010

1111
find_package(Torch REQUIRED)
12+
find_package(TorchVision REQUIRED)
1213
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}")
1314

15+
find_package(OpenCV REQUIRED)
16+
1417
find_package(OpenMP REQUIRED)
1518
find_package(Eigen3 REQUIRED)
1619
find_package(yaml-cpp REQUIRED)
@@ -38,7 +41,7 @@ target_compile_options(compiler_flags INTERFACE
3841
set(sources_list base.cpp)
3942
list(TRANSFORM sources_list PREPEND "${CMAKE_CURRENT_SOURCE_DIR}/src/")
4043

41-
set(dependencies_list CoverageControlCore ${TORCH_LIBRARIES})
44+
set(dependencies_list CoverageControlCore ${TORCH_LIBRARIES} TorchVision::TorchVision)
4245

4346
add_library(CoverageControl_torch SHARED ${sources_list})
4447

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/**
2+
* Extends the CoverageControl coverage system to include a torch map
3+
*
4+
**/
5+
6+
#ifndef COVERAGECONTROLTORCH_COVERAGE_SYSTEM_H_
7+
#define COVERAGECONTROLTORCH_COVERAGE_SYSTEM_H_
8+
9+
#include <vector>
10+
#include <CoverageControl/coverage_system.h>
11+
#include <torch/torch.h>
12+
#include <torch/script.h>
13+
14+
#include "type_conversions.h"
15+
16+
using namespace torch::indexing;
17+
namespace CoverageControlTorch {
18+
19+
class CoverageSystem : public CoverageControl::CoverageSystem {
20+
21+
public:
22+
23+
CoverageSystem(Parameters const &params, size_t const num_features, size_t const num_robots) : CoverageControl::CoverageSystem(params, num_features, num_robots) { }
24+
25+
CoverageSystem(Parameters const &params, WorldIDF const &world_idf, std::string const &pos_file_name) : CoverageControl::CoverageSystem(params, world_idf, pos_file_name) { }
26+
27+
CoverageSystem(Parameters const &params, WorldIDF const &world_idf, std::vector <Point2> const &robot_positions) : CoverageControl::CoverageSystem(params, world_idf, robot_positions) { }
28+
29+
CoverageSystem(Parameters const &params, std::vector <BivariateNormalDistribution> const &dists, std::vector <Point2> const &robot_positions) : CoverageControl::CoverageSystem(params, dists, robot_positions) { }
30+
31+
torch::Tensor GetAllRobotsLocalMaps() {
32+
torch::Tensor maps = torch::zeros({num_robots_, params_.pLocalMapSize, params_.pLocalMapSize});
33+
#pragma omp parallel for
34+
for(size_t i = 0; i < num_robots_; i++) {
35+
maps[i] = EigenToLibTorch(robots_[i].GetRobotLocalMap());
36+
}
37+
return maps;
38+
}
39+
40+
void GetAllRobotsCommunicationMaps(torch::Tensor maps, size_t const &map_size) const {
41+
#pragma omp parallel for
42+
for(int i = 0; i < num_robots_; i++) {
43+
auto robot_neighbors_pos = GetRobotsInCommunication(i);
44+
double comm_scale = (params_.pCommunicationRange * 2.) / map_size;
45+
Point2 map_translation(map_size * comm_scale * params_.pResolution/2., map_size * comm_scale * params_.pResolution/2.);
46+
for(Point2 const& relative_pos:robot_neighbors_pos) {
47+
Point2 map_pos = relative_pos + map_translation;
48+
int pos_idx, pos_idy;
49+
MapUtils::GetClosestGridCoordinate(params_.pResolution * comm_scale, map_pos, pos_idx, pos_idy);
50+
if(pos_idx < map_size and pos_idy < map_size and pos_idx >= 0 and pos_idy >= 0) {
51+
maps.index_put_({i, pos_idx, pos_idy}, 1);
52+
}
53+
}
54+
}
55+
}
56+
};
57+
} // namespace CoverageControlTorch
58+
59+
#endif // COVERAGECONTROLTORCH_COVERAGE_SYSTEM_H_
60+

0 commit comments

Comments
 (0)