├── CMakeLists.txt ├── LICENSE ├── README.md ├── assets ├── Example_Environment.png ├── Example_Environment2.png └── testgif.gif ├── launch ├── open_world.launch └── request_publisher.launch ├── maps ├── test.pgm ├── test.yaml ├── test2.pgm └── test2.yaml ├── msgs ├── CMakeLists.txt └── collision_map_request.proto ├── package.xml ├── src ├── collision_map_creator.cc └── request_publisher.cc └── worlds ├── test.world └── test2.world /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.8.8) 2 | project(pgm_map_creator) 3 | 4 | set (CMAKE_CXX_FLAGS "-g -Wall -std=c++17") 5 | 6 | include (FindPkgConfig) 7 | if (PKG_CONFIG_FOUND) 8 | pkg_check_modules(GAZEBO gazebo) 9 | pkg_check_modules(SDF sdformat) 10 | endif() 11 | 12 | find_package(catkin REQUIRED COMPONENTS 13 | roscpp 14 | rospy 15 | ) 16 | 17 | find_package(Boost REQUIRED COMPONENTS system) 18 | find_package(Threads REQUIRED) 19 | 20 | 21 | catkin_package( 22 | # INCLUDE_DIRS include 23 | # LIBRARIES pgm_map_creator 24 | # CATKIN_DEPENDS roscpp rospy 25 | # DEPENDS system_lib 26 | ) 27 | 28 | 29 | include_directories( 30 | ${catkin_INCLUDE_DIRS} 31 | 32 | ${GAZEBO_INCLUDE_DIRS} 33 | ${SDF_INCLUDE_DIRS} 34 | ${CMAKE_CURRENT_BINARY_DIR}/msgs 35 | ) 36 | 37 | link_directories(${GAZEBO_LIBRARY_DIRS} ${CMAKE_CURRENT_BINARY_DIR}/msgs) 38 | add_subdirectory(msgs) 39 | 40 | add_executable(request_publisher src/request_publisher.cc) 41 | target_link_libraries(request_publisher collision_map_creator_msgs ${Boost_LIBRARIES} ${GAZEBO_LIBRARIES} ${SDF_LIBRARIES} Threads::Threads) # add Threads::Threads 42 | add_dependencies(request_publisher collision_map_creator_msgs) 43 | 44 | add_library(collision_map_creator SHARED src/collision_map_creator.cc) 45 | target_link_libraries(collision_map_creator collision_map_creator_msgs ${Boost_LIBRARIES} ${GAZEBO_LIBRARIES} ${SDF_LIBRARIES} Threads::Threads) # add Threads::Threads 46 | add_dependencies(collision_map_creator collision_map_creator_msgs) 47 | 48 | 49 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Jing Zongxin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 1、pgm_map_creator **Project Overview** 2 | This project is designed to generate PGM maps directly from Gazebo .world files. The generated PGM maps can be used as ground truth maps for testing the performance of SLAM algorithms. Additionally, they can serve as prior global maps for path planning algorithms. 3 | 4 | Below are the results generated by the example environment provided by the project. 5 | 6 | ![Example_Environment](assets/Example_Environment.png) 7 | 8 |

9 | ubuntu 11 | ROS 12 |

13 | 14 | 15 | ## (1) Features 16 | ① Ground Truth Maps: Create accurate PGM maps for evaluating SLAM algorithm performance. 17 | 18 | ② Prior Global Maps: Utilize the generated maps directly for path planning algorithms. 19 | 20 | ③ High-Quality Mapping: Produce high-quality prior maps for scenarios where SLAM algorithm performance is suboptimal or when using SLAM is inconvenient. 21 | 22 | ④ Convenience and Efficiency: Generate the necessary maps quickly and easily, enhancing the workflow of path planning tasks. 23 | 24 | ## (2) Use Cases 25 | ① Testing SLAM Algorithms: Evaluate and benchmark the performance of SLAM algorithms using the generated ground truth maps. 26 | 27 | ② Path Planning: Employ the generated PGM maps as prior global maps to improve the efficiency and accuracy of path planning algorithms. 28 | 29 | ③ Challenging Environments: Use this project to generate high-quality global maps in environments where SLAM algorithms may struggle or are impractical to deploy. 30 | 31 | ## (3) Testing Environment 32 | 33 | **Ubuntu 20.04, ROS Noetic, Boost 1.71,Gazebo 11, C++ 17** 34 | 35 | 36 | ## (4) Contribution Details 37 | 38 | This project is based on the open-source `pgm_map_creator` project by hyfan1116, available at: [pgm_map_creator](https://github.com/hyfan1116/pgm_map_creator). Due to updates in ROS, Boost, and Gazebo versions, the original project is no longer functional. Our main contribution is updating and fixing the project to ensure compatibility with Ubuntu 20.04, ROS Noetic, Boost 1.71, Gazebo 11, and C++ 17, allowing it to run smoothly in these environments. We extend our gratitude to hyfan1116 for the original `pgm_map_creator` project. 39 | 40 | 41 | 42 | 43 | # 2、**Project Installation** 44 | 45 | 46 | ## (1) Install the dependencies. 47 | 48 | ```bash 49 | sudo apt-get update 50 | ``` 51 | 52 | ```bash 53 | sudo apt-get install libboost-all-dev protobuf-compiler 54 | ``` 55 | 56 | ## (2) Clone the Package to your ROS workspace `src` folder: 57 | 58 | **Method 1**: Use the following command to quickly clone the package. Note that the default ROS workspace name is `catkin_ws`. If your workspace has a different name, please modify `catkin_ws` accordingly in the command below. 59 | 60 | ```bash 61 | cd ~/catkin_ws/src/ 62 | git clone https://github.com/JZX-MY/pgm_map_creator 63 | ``` 64 | 65 | **Method 2**: Manually download the project's source code as a zip file, then copy it to your ROS workspace's `src` folder and extract it. 66 | 67 | 68 | ## (3) Build the Package (First Compilation) 69 | 70 | To ensure the project works correctly, it needs to be compiled twice. First, navigate to your ROS workspace and compile the package: 71 | 72 | ```bash 73 | cd ~/catkin_ws/ 74 | catkin_make -DCATKIN_WHITELIST_PACKAGES="pgm_map_creator" 75 | ``` 76 | ## (4) Modify CMakeLists.txt 77 | 78 | Open the `CMakeLists.txt` file located in the `pgm_map_creator/msgs` directory and comment out the following three lines, then save the changes: 79 | 80 | ```bash 81 | ${PROTOBUF_IMPORT_DIRS}/vector2d.proto 82 | ${PROTOBUF_IMPORT_DIRS}/header.proto 83 | ${PROTOBUF_IMPORT_DIRS}/time.proto 84 | ``` 85 | 86 | The modified `CMakeLists.txt` file should look like this: 87 | 88 | ```bash 89 | find_package(Protobuf REQUIRED) 90 | 91 | set(PROTOBUF_IMPORT_DIRS) 92 | foreach(ITR ${GAZEBO_INCLUDE_DIRS}) 93 | if(ITR MATCHES ".*gazebo-[0-9.]+$") 94 | set(PROTOBUF_IMPORT_DIRS "${ITR}/gazebo/msgs/proto") 95 | endif() 96 | endforeach() 97 | 98 | set (msgs 99 | collision_map_request.proto 100 | #${PROTOBUF_IMPORT_DIRS}/vector2d.proto 101 | #${PROTOBUF_IMPORT_DIRS}/header.proto 102 | #${PROTOBUF_IMPORT_DIRS}/time.proto 103 | ) 104 | 105 | PROTOBUF_GENERATE_CPP(PROTO_SRCS PROTO_HDRS ${msgs}) 106 | add_library(collision_map_creator_msgs SHARED ${PROTO_SRCS}) 107 | target_include_directories(collision_map_creator_msgs PUBLIC ${PROTOBUF_INCLUDE_DIRS}) 108 | target_link_libraries(collision_map_creator_msgs ${PROTOBUF_LIBRARY}) 109 | ``` 110 | 111 | ## (5) Build the Project (Second Compilation) 112 | 113 | After modifying the `CMakeLists.txt` file, perform the second compilation: 114 | 115 | ```bash 116 | catkin_make -DCATKIN_WHITELIST_PACKAGES="pgm_map_creator" 117 | ``` 118 | 119 | 120 | # 3、**Verify if the Package is Functioning Correctly.** 121 | 122 | To verify if the package is functioning correctly, please execute the following two commands in sequence for testing. 123 | 124 | ```bash 125 | roslaunch pgm_map_creator open_world.launch 126 | ``` 127 | 128 | ```bash 129 | roslaunch pgm_map_creator request_publisher.launch 130 | ``` 131 | 132 | After the program runs successfully, a file named `map.pgm` will be generated in the `maps` folder, as shown in the dynamic demonstration of the testing process below: 133 | 134 | 135 |
136 | testgif.gif 137 |
138 | 139 | 140 | Note that the example environment mentioned above includes some third-party models. If these models are not downloaded on your computer, the Gazebo environment you open may be missing some parts compared to the illustrations above. Additionally, since the system may keep searching for the missing files, the time taken to open Gazebo could be longer. Taking this into consideration, we have added a new, simpler test example that does not include any third-party models, named 'test2.world'. Additionally, we have changed the default test file to this new file,as shown in the dynamic demonstration of the testing process below:. 141 | 142 | 143 | ![Example_Environment2](assets/Example_Environment2.png) 144 | 145 | 146 | # 4、**How to Use in Your Own .World File** 147 | 148 | ## (1) Copy your `.world` file to the `worlds` folder of the `pgm_map_creator` package. 149 | 150 | ## (2) Add the plugin to the .world file. 151 | 152 | Add the following code to your own `.world` file, just before the `` tag. 153 | 154 | ```xml 155 | 156 | ``` 157 | 158 | ## (3) Modify the `open_world.launch` file 159 | 160 | 161 | Open the `open_world.launch` file in the `launch` folder of the `pgm_map_creator` package, and change the referenced `.world` file to your own `.world` file. Replace `test.world` in the following line with the name of your own `.world` file and save the changes: 162 | 163 | ```xml 164 | 165 | ``` 166 | 167 | ## (4) Modify the `request_publisher.launch` file 168 | 169 | 170 | Open the `request_publisher.launch` file in the `launch` folder of the `pgm_map_creator` package. Based on your `.world` file, set the relevant parameters for the mapping area range: `xmin`, `xmax`, `ymin`, `ymax`, and the map resolution `resolution`. The commonly used default value for resolution is 0.05. 171 | 172 | 173 | ## (5) Use the `pgm_map_creator` package to generate the map 174 | 175 | After making the above modifications, you can now execute the following two commands sequentially to generate the pgm map file for your own `.world` file: 176 | 177 | ```bash 178 | roslaunch pgm_map_creator open_world.launch 179 | ``` 180 | 181 | ```bash 182 | roslaunch pgm_map_creator request_publisher.launch 183 | ``` 184 | 185 | 186 | Wait for the plugin th generate map. Track the progess in the terminal that spawns the world file. Once it is done, the pgm map would be in the `maps` folder of the `pgm_map_creator`. 187 | 188 | 189 | ## (6) Create the `yaml` file for the pgm map. 190 | 191 | You may also need a `yaml` file which provides the metadata of the map. 192 | 193 | ``` 194 | cd catkin_ws/src/pgm_map_creator/maps 195 | touch map.yaml 196 | ``` 197 | `map.yaml` 198 | ``` 199 | image: map.pgm 200 | resolution: 0.01 201 | origin: [-5.0, -12.0, 0.0] 202 | occupied_thresh: 0.65 203 | free_thresh: 0.196 204 | negate: 0 205 | ``` 206 | 207 | The parameters `resolution` and `origin` are based on the arguments in `request_publisher.launch`.The `image` parameter is the name of the map generated in the previous step. If you manually renamed the map, you need to update this parameter accordingly. In our provided example, it has been manually renamed to `test.pgm`. Alternatively, you can modify the `map_name` parameter in the `request_publisher.launch` file to directly generate a pgm map with the specified name. 208 | 209 | 210 | 211 | # 5、**Acknowledgments** 212 | 213 | 214 | This project is based on the open-source `pgm_map_creator` project by hyfan1116, available at: [pgm_map_creator](https://github.com/hyfan1116/pgm_map_creator). Due to updates in ROS, Boost, and Gazebo versions, the original project is no longer functional. Our main contribution is updating and fixing the project to ensure compatibility with Ubuntu 20.04, ROS Noetic, Boost 1.71, Gazebo 11, and C++ 17, allowing it to run smoothly in these environments. We extend our gratitude to hyfan1116 for the original `pgm_map_creator` project. 215 | 216 | 217 | 218 | 219 | -------------------------------------------------------------------------------- /assets/Example_Environment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZX-MY/pgm_map_creator/f5642e3848007cc535ac9e6273316c4de39ff696/assets/Example_Environment.png -------------------------------------------------------------------------------- /assets/Example_Environment2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZX-MY/pgm_map_creator/f5642e3848007cc535ac9e6273316c4de39ff696/assets/Example_Environment2.png -------------------------------------------------------------------------------- /assets/testgif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZX-MY/pgm_map_creator/f5642e3848007cc535ac9e6273316c4de39ff696/assets/testgif.gif -------------------------------------------------------------------------------- /launch/open_world.launch: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /launch/request_publisher.launch: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /maps/test.pgm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZX-MY/pgm_map_creator/f5642e3848007cc535ac9e6273316c4de39ff696/maps/test.pgm -------------------------------------------------------------------------------- /maps/test.yaml: -------------------------------------------------------------------------------- 1 | image: test.pgm 2 | resolution: 0.050000 3 | origin: [-5, -12.000000, 0.000000] 4 | negate: 0 5 | occupied_thresh: 0.65 6 | free_thresh: 0.196 7 | 8 | -------------------------------------------------------------------------------- /maps/test2.pgm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZX-MY/pgm_map_creator/f5642e3848007cc535ac9e6273316c4de39ff696/maps/test2.pgm -------------------------------------------------------------------------------- /maps/test2.yaml: -------------------------------------------------------------------------------- 1 | image: test2.pgm 2 | resolution: 0.050000 3 | origin: [-5, -12.000000, 0.000000] 4 | negate: 0 5 | occupied_thresh: 0.65 6 | free_thresh: 0.196 7 | 8 | -------------------------------------------------------------------------------- /msgs/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | find_package(Protobuf REQUIRED) 2 | 3 | set(PROTOBUF_IMPORT_DIRS) 4 | foreach(ITR ${GAZEBO_INCLUDE_DIRS}) 5 | if(ITR MATCHES ".*gazebo-[0-9.]+$") 6 | set(PROTOBUF_IMPORT_DIRS "${ITR}/gazebo/msgs/proto") 7 | endif() 8 | endforeach() 9 | 10 | set (msgs 11 | collision_map_request.proto 12 | ${PROTOBUF_IMPORT_DIRS}/vector2d.proto 13 | ${PROTOBUF_IMPORT_DIRS}/header.proto 14 | ${PROTOBUF_IMPORT_DIRS}/time.proto 15 | ) 16 | 17 | PROTOBUF_GENERATE_CPP(PROTO_SRCS PROTO_HDRS ${msgs}) 18 | add_library(collision_map_creator_msgs SHARED ${PROTO_SRCS}) 19 | target_include_directories(collision_map_creator_msgs PUBLIC ${PROTOBUF_INCLUDE_DIRS}) 20 | target_link_libraries(collision_map_creator_msgs ${PROTOBUF_LIBRARY}) 21 | -------------------------------------------------------------------------------- /msgs/collision_map_request.proto: -------------------------------------------------------------------------------- 1 | package collision_map_creator_msgs.msgs; 2 | import "vector2d.proto"; 3 | 4 | message CollisionMapRequest 5 | { 6 | required gazebo.msgs.Vector2d upperLeft = 1; 7 | required gazebo.msgs.Vector2d upperRight = 2; 8 | required gazebo.msgs.Vector2d lowerRight = 3; 9 | required gazebo.msgs.Vector2d lowerLeft = 4; 10 | required double height = 5; 11 | required double resolution = 6; 12 | optional string filename = 7 [default = ""]; 13 | optional int32 threshold = 8 [default = 255]; 14 | } 15 | -------------------------------------------------------------------------------- /package.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | pgm_map_creator 4 | 0.0.0 5 | This project is designed to generate PGM maps directly from Gazebo .world files. 6 | 7 | JZX-MY 8 | 9 | MIT 10 | 11 | catkin 12 | roscpp 13 | rospy 14 | roscpp 15 | rospy 16 | roscpp 17 | rospy 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /src/collision_map_creator.cc: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | #include "gazebo/gazebo.hh" 11 | #include "gazebo/common/common.hh" 12 | #include "gazebo/msgs/msgs.hh" 13 | #include "gazebo/physics/physics.hh" 14 | #include "gazebo/transport/transport.hh" 15 | #include "collision_map_request.pb.h" 16 | 17 | namespace gazebo 18 | { 19 | typedef const boost::shared_ptr< 20 | const collision_map_creator_msgs::msgs::CollisionMapRequest> 21 | CollisionMapRequestPtr; 22 | 23 | class CollisionMapCreator : public WorldPlugin 24 | { 25 | transport::NodePtr node; 26 | transport::PublisherPtr imagePub; 27 | transport::SubscriberPtr commandSubscriber; 28 | physics::WorldPtr world; 29 | 30 | public: void Load(physics::WorldPtr _parent, sdf::ElementPtr _sdf) 31 | { 32 | node = transport::NodePtr(new transport::Node()); 33 | world = _parent; 34 | // Initialize the node with the world name 35 | node->Init(world->Name()); 36 | std::cout << "Subscribing to: " << "~/collision_map/command" << std::endl; 37 | commandSubscriber = node->Subscribe("~/collision_map/command", 38 | &CollisionMapCreator::create, this); 39 | imagePub = node->Advertise("~/collision_map/image"); 40 | } 41 | 42 | public: void create(CollisionMapRequestPtr &msg) 43 | { 44 | std::cout << "Received message" << std::endl; 45 | 46 | std::cout << "Creating collision map with corners at (" << 47 | msg->upperleft().x() << ", " << msg->upperleft().y() << "), (" << 48 | msg->upperright().x() << ", " << msg->upperright().y() << "), (" << 49 | msg->lowerright().x() << ", " << msg->lowerright().y() << "), (" << 50 | msg->lowerleft().x() << ", " << msg->lowerleft().y() << 51 | ") with collision projected from z = " << 52 | msg->height() << "\nResolution = " << msg->resolution() << " m\n" << 53 | "Occupied spaces will be filled with: " << msg->threshold() << 54 | std::endl; 55 | 56 | double dX_vertical = msg->upperleft().x() - msg->lowerleft().x(); 57 | double dY_vertical = msg->upperleft().y() - msg->lowerleft().y(); 58 | double mag_vertical = 59 | sqrt(dX_vertical * dX_vertical + dY_vertical * dY_vertical); 60 | dX_vertical = msg->resolution() * dX_vertical / mag_vertical; 61 | dY_vertical = msg->resolution() * dY_vertical / mag_vertical; 62 | 63 | double dX_horizontal = msg->upperright().x() - msg->upperleft().x(); 64 | double dY_horizontal = msg->upperright().y() - msg->upperleft().y(); 65 | double mag_horizontal = 66 | sqrt(dX_horizontal * dX_horizontal + dY_horizontal * dY_horizontal); 67 | dX_horizontal = msg->resolution() * dX_horizontal / mag_horizontal; 68 | dY_horizontal = msg->resolution() * dY_horizontal / mag_horizontal; 69 | 70 | int count_vertical = mag_vertical / msg->resolution(); 71 | int count_horizontal = mag_horizontal / msg->resolution(); 72 | 73 | if (count_vertical == 0 || count_horizontal == 0) 74 | { 75 | std::cout << "Image has a zero dimensions, check coordinates" 76 | << std::endl; 77 | return; 78 | } 79 | double x,y; 80 | 81 | boost::gil::gray8_pixel_t fill(255-msg->threshold()); 82 | boost::gil::gray8_pixel_t blank(255); 83 | boost::gil::gray8_image_t image(count_horizontal, count_vertical); 84 | 85 | double dist; 86 | std::string entityName; 87 | ignition::math::Vector3d start, end; 88 | start.Z(msg->height()); 89 | end.Z(0.001); 90 | 91 | gazebo::physics::PhysicsEnginePtr engine = world->Physics(); 92 | engine->InitForThread(); 93 | gazebo::physics::RayShapePtr ray = 94 | boost::dynamic_pointer_cast( 95 | engine->CreateShape("ray", gazebo::physics::CollisionPtr())); 96 | 97 | std::cout << "Rasterizing model and checking collisions" << std::endl; 98 | boost::gil::fill_pixels(image._view, blank); 99 | 100 | for (int i = 0; i < count_vertical; ++i) 101 | { 102 | std::cout << "Percent complete: " << i * 100.0 / count_vertical 103 | << std::endl; 104 | x = i * dX_vertical + msg->lowerleft().x(); 105 | y = i * dY_vertical + msg->lowerleft().y(); 106 | for (int j = 0; j < count_horizontal; ++j) 107 | { 108 | x += dX_horizontal; 109 | y += dY_horizontal; 110 | 111 | start.X(x); 112 | end.X(x); 113 | start.Y(y); 114 | end.Y(y); 115 | ray->SetPoints(start, end); 116 | ray->GetIntersection(dist, entityName); 117 | if (!entityName.empty()) 118 | { 119 | image._view(i,j) = fill; 120 | } 121 | } 122 | } 123 | 124 | std::cout << "Completed calculations, writing to image" << std::endl; 125 | if (!msg->filename().empty()) 126 | { 127 | boost::gil::gray8_view_t view = image._view; 128 | 129 | // Write to png 130 | // boost::gil::png_write_view(msg->filename(), view); 131 | // Write to pgm (pnm p2) 132 | pgm_write_view(msg->filename(), view); 133 | } 134 | std::cout << "Output location: " << msg->filename() << std::endl; 135 | } 136 | 137 | public: void pgm_write_view(const std::string& filename, boost::gil::gray8_view_t& view) 138 | { 139 | // Write image to pgm file 140 | std::cout << "running" << std::endl; 141 | int h = view.height(); 142 | int w = view.width(); 143 | 144 | std::ofstream ofs; 145 | ofs.open(filename+".pgm"); 146 | ofs << "P2" << '\n'; // grayscale 147 | ofs << w << ' ' << h << '\n'; // width and height 148 | ofs << 255 << '\n'; // max value 149 | for (int y = 0; y < h; ++y){ 150 | for (int x = 0; x < w; ++x){ 151 | // std::cout << (int)view(x, y)[0]; 152 | ofs << (int)view(x, y)[0] << ' '; 153 | } 154 | ofs << '\n'; 155 | } 156 | ofs.close(); 157 | } 158 | }; 159 | 160 | // Register this plugin with the simulator 161 | GZ_REGISTER_WORLD_PLUGIN(CollisionMapCreator) 162 | } 163 | -------------------------------------------------------------------------------- /src/request_publisher.cc: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | #include "gazebo/gazebo.hh" 7 | #include "gazebo/common/common.hh" 8 | #include "gazebo/transport/transport.hh" 9 | #include "gazebo/physics/physics.hh" 10 | #include "gazebo/msgs/msgs.hh" 11 | 12 | #include "collision_map_request.pb.h" 13 | #include "vector2d.pb.h" 14 | 15 | using namespace std; 16 | 17 | bool createVectorArray(const char * vectorString, 18 | deque corners) 19 | { 20 | deque::iterator it; 21 | 22 | string cornersStr = vectorString; 23 | size_t opening=0; 24 | size_t closing=0; 25 | for (it = corners.begin(); it != corners.end(); ++it) 26 | { 27 | opening = cornersStr.find('(', closing); 28 | closing = cornersStr.find(')', opening); 29 | if (opening == string::npos || closing == string::npos) 30 | { 31 | std::cout << "Poorly formed string: " << cornersStr << std::endl; 32 | std::cout << "( found at: " << opening << " ) found at: " << closing << std::endl; 33 | return false; 34 | } 35 | string oneCornerStr = cornersStr.substr(opening + 1, closing - opening - 1); 36 | size_t commaLoc = oneCornerStr.find(","); 37 | string x = oneCornerStr.substr(0,commaLoc); 38 | string y = oneCornerStr.substr(commaLoc + 1, oneCornerStr.length() - commaLoc); 39 | (*it)->set_x(atof(x.c_str())); 40 | (*it)->set_y(atof(y.c_str())); 41 | } 42 | return true; 43 | } 44 | 45 | int main(int argc, char * argv[]) 46 | { 47 | if (argc > 4) 48 | { 49 | collision_map_creator_msgs::msgs::CollisionMapRequest request; 50 | deque corners; 51 | 52 | corners.push_back(request.mutable_upperleft()); 53 | corners.push_back(request.mutable_upperright()); 54 | corners.push_back(request.mutable_lowerright()); 55 | corners.push_back(request.mutable_lowerleft()); 56 | 57 | if (!createVectorArray(argv[1],corners)) 58 | { 59 | return -1; 60 | } 61 | 62 | request.set_height(atof(argv[2])); 63 | request.set_resolution(atof(argv[3])); 64 | request.set_filename(argv[4]); 65 | 66 | if (argc == 6) 67 | { 68 | request.set_threshold(atoi(argv[5])); 69 | } 70 | 71 | gazebo::transport::init(); 72 | gazebo::transport::run(); 73 | gazebo::transport::NodePtr node(new gazebo::transport::Node()); 74 | node->Init("default"); 75 | 76 | std::cout << "Request: " << 77 | " UL.x: " << request.upperleft().x() << 78 | " UL.y: " << request.upperleft().y() << 79 | " UR.x: " << request.upperright().x() << 80 | " UR.y: " << request.upperright().y() << 81 | " LR.x: " << request.lowerright().x() << 82 | " LR.y: " << request.lowerright().y() << 83 | " LL.x: " << request.lowerleft().x() << 84 | " LL.y: " << request.lowerleft().y() << 85 | " Height: " << request.height() << 86 | " Resolution: " << request.resolution() << 87 | " Filename: " << request.filename() << 88 | " Threshold: " << request.threshold() << std::endl; 89 | 90 | gazebo::transport::PublisherPtr imagePub = 91 | node->Advertise( 92 | "~/collision_map/command"); 93 | std::cout << "Waiting for connection ... " << std::endl; 94 | imagePub->WaitForConnection(); 95 | std::cout << "Connected." << std::endl; 96 | imagePub->Publish(request); 97 | 98 | gazebo::transport::fini(); 99 | return 0; 100 | } 101 | return -1; 102 | } 103 | -------------------------------------------------------------------------------- /worlds/test2.world: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1 5 | 0 0 10 0 -0 0 6 | 0.8 0.8 0.8 1 7 | 0.2 0.2 0.2 1 8 | 9 | 1000 10 | 0.9 11 | 0.01 12 | 0.001 13 | 14 | -0.5 0.1 -0.9 15 | 16 | 0 17 | 0 18 | 0 19 | 20 | 21 | 22 | 1 23 | 24 | 25 | 26 | 27 | 0 0 1 28 | 100 100 29 | 30 | 31 | 32 | 33 | 34 | 100 35 | 50 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 10 47 | 48 | 49 | 0 50 | 51 | 52 | 0 0 1 53 | 100 100 54 | 55 | 56 | 57 | 61 | 62 | 63 | 0 64 | 0 65 | 0 66 | 67 | 68 | 0 0 -9.8 69 | 6e-06 2.3e-05 -4.2e-05 70 | 71 | 72 | 0.001 73 | 1 74 | 1000 75 | 76 | 77 | 0.4 0.4 0.4 1 78 | 0.7 0.7 0.7 1 79 | 1 80 | 81 | 82 | 83 | EARTH_WGS84 84 | 0 85 | 0 86 | 0 87 | 0 88 | 89 | 90 | 7 0 0 0 -0 0 91 | 92 | 93 | 94 | 95 | 20.3 0.3 1 96 | 97 | 98 | 0 0 0.5 0 -0 0 99 | 10 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 0 0 0.5 0 -0 0 115 | 116 | 117 | 20.3 0.3 1 118 | 119 | 120 | 121 | 125 | 1 1 1 1 126 | 127 | 128 | 0 129 | 130 | 131 | -0 8 0 0 -0 0 132 | 0 133 | 0 134 | 0 135 | 136 | 137 | 138 | 139 | 140 | 6.14991 0.3 1 141 | 142 | 143 | 0 0 0.5 0 -0 0 144 | 10 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 0 0 0.5 0 -0 0 160 | 161 | 162 | 6.14991 0.3 1 163 | 164 | 165 | 166 | 170 | 1 1 1 1 171 | 172 | 173 | 0 174 | 175 | 176 | -6.769 4.775 0 0 -0 0 177 | 0 178 | 0 179 | 0 180 | 181 | 182 | 183 | 184 | 185 | 5.1001 0.5 1 186 | 187 | 188 | 0 0 0.5 0 -0 0 189 | 10 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 0 0 0.5 0 -0 0 205 | 206 | 207 | 5.1001 0.5 1 208 | 209 | 210 | 211 | 215 | 1 1 1 1 216 | 217 | 218 | 0 219 | 220 | 221 | 0.426 -5.638 0 0 -0 1.5708 222 | 0 223 | 0 224 | 0 225 | 226 | 227 | 228 | 229 | 230 | 2.90014 0.3 1 231 | 232 | 233 | 0 0 0.5 0 -0 0 234 | 10 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 0 0 0.5 0 -0 0 250 | 251 | 252 | 2.90014 0.3 1 253 | 254 | 255 | 256 | 260 | 1 1 1 1 261 | 262 | 263 | 0 264 | 265 | 266 | -0.957 -5.671 0 0 -0 0 267 | 0 268 | 0 269 | 0 270 | 271 | 272 | 273 | 274 | 275 | 1.64993 0.3 1 276 | 277 | 278 | 0 0 0.5 0 -0 0 279 | 10 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 0 0 0.5 0 -0 0 295 | 296 | 297 | 1.64993 0.3 1 298 | 299 | 300 | 301 | 305 | 1 1 1 1 306 | 307 | 308 | 0 309 | 310 | 311 | -0.379001 -4.33 0 0 -0 0 312 | 0 313 | 0 314 | 0 315 | 316 | 317 | 318 | 319 | 320 | 4.59988 0.25 1 321 | 322 | 323 | 0 0 0.5 0 -0 0 324 | 10 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 0 0 0.5 0 -0 0 340 | 341 | 342 | 4.59988 0.25 1 343 | 344 | 345 | 346 | 350 | 1 1 1 1 351 | 352 | 353 | 0 354 | 355 | 356 | -1.752 -7.055 0 0 -0 0 357 | 0 358 | 0 359 | 0 360 | 361 | 362 | 363 | 364 | 365 | 20.3 0.3 1 366 | 367 | 368 | 0 0 0.5 0 -0 0 369 | 10 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 0 0 0.5 0 -0 0 385 | 386 | 387 | 20.3 0.3 1 388 | 389 | 390 | 391 | 395 | 1 1 1 1 396 | 397 | 398 | 0 399 | 400 | 401 | -0 -8 0 0 -0 0 402 | 0 403 | 0 404 | 0 405 | 406 | 407 | 408 | 409 | 410 | 2.5 0.15 1 411 | 412 | 413 | 0 0 0.5 0 -0 0 414 | 10 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 0 0 0.5 0 -0 0 430 | 431 | 432 | 2.5 0.15 1 433 | 434 | 435 | 436 | 440 | 1 1 1 1 441 | 442 | 443 | 0 444 | 445 | 446 | -3.032 1.305 0 0 -0 0 447 | 0 448 | 0 449 | 0 450 | 451 | 452 | 453 | 454 | 455 | 1.25 0.15 1 456 | 457 | 458 | 0 0 0.5 0 -0 0 459 | 10 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 0 0 0.5 0 -0 0 475 | 476 | 477 | 1.25 0.15 1 478 | 479 | 480 | 481 | 485 | 1 1 1 1 486 | 487 | 488 | 0 489 | 490 | 491 | -4.207 0.755 0 0 -0 -1.5708 492 | 0 493 | 0 494 | 0 495 | 496 | 497 | 498 | 499 | 500 | 2.5 0.15 1 501 | 502 | 503 | 0 0 0.5 0 -0 0 504 | 10 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 0 0 0.5 0 -0 0 520 | 521 | 522 | 2.5 0.15 1 523 | 524 | 525 | 526 | 530 | 1 1 1 1 531 | 532 | 533 | 0 534 | 535 | 536 | -3.032 0.205 0 0 -0 0 537 | 0 538 | 0 539 | 0 540 | 541 | 542 | 543 | 544 | 545 | 4.85019 1 1 546 | 547 | 548 | 0 0 0.5 0 -0 0 549 | 10 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 0 0 0.5 0 -0 0 565 | 566 | 567 | 4.85019 1 1 568 | 569 | 570 | 571 | 575 | 1 1 1 1 576 | 577 | 578 | 0 579 | 580 | 581 | -2.959 0.719 0 0 -0 -1.5708 582 | 0 583 | 0 584 | 0 585 | 586 | 587 | 588 | 589 | 590 | 3 0.4 1 591 | 592 | 593 | 0 0 0.5 0 -0 0 594 | 10 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 0 0 0.5 0 -0 0 610 | 611 | 612 | 3 0.4 1 613 | 614 | 615 | 616 | 620 | 1 1 1 1 621 | 622 | 623 | 0 624 | 625 | 626 | 4.38319 5.80907 0 0 -0 0 627 | 0 628 | 0 629 | 0 630 | 631 | 632 | 633 | 634 | 635 | 1.25 0.6 1 636 | 637 | 638 | 0 0 0.5 0 -0 0 639 | 10 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 0 0 0.5 0 -0 0 655 | 656 | 657 | 1.25 0.6 1 658 | 659 | 660 | 661 | 665 | 1 1 1 1 666 | 667 | 668 | 0 669 | 670 | 671 | 6.716 2.842 0 0 -0 0 672 | 0 673 | 0 674 | 0 675 | 676 | 677 | 678 | 679 | 680 | 2.65 0.3 1 681 | 682 | 683 | 0 0 0.5 0 -0 0 684 | 10 685 | 686 | 687 | 688 | 689 | 690 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | 699 | 0 0 0.5 0 -0 0 700 | 701 | 702 | 2.65 0.3 1 703 | 704 | 705 | 706 | 710 | 1 1 1 1 711 | 712 | 713 | 0 714 | 715 | 716 | -7.206 4.789 0 0 -0 -1.5708 717 | 0 718 | 0 719 | 0 720 | 721 | 722 | 723 | 724 | 725 | 16.5 0.5 1 726 | 727 | 728 | 0 0 0.5 0 -0 0 729 | 10 730 | 731 | 732 | 733 | 734 | 735 | 736 | 737 | 738 | 739 | 740 | 741 | 742 | 743 | 744 | 0 0 0.5 0 -0 0 745 | 746 | 747 | 16.5 0.5 1 748 | 749 | 750 | 751 | 755 | 1 1 1 1 756 | 757 | 758 | 0 759 | 760 | 761 | -10 0 0 0 -0 -1.5708 762 | 0 763 | 0 764 | 0 765 | 766 | 767 | 768 | 769 | 770 | 3.14555 0.4 1 771 | 772 | 773 | 0 0 0.5 0 -0 0 774 | 10 775 | 776 | 777 | 778 | 779 | 780 | 781 | 782 | 783 | 784 | 785 | 786 | 787 | 788 | 789 | 0 0 0.5 0 -0 0 790 | 791 | 792 | 3.14555 0.4 1 793 | 794 | 795 | 796 | 800 | 1 1 1 1 801 | 802 | 803 | 0 804 | 805 | 806 | -8.45 4.1945 0 0 -0 -0.436605 807 | 0 808 | 0 809 | 0 810 | 811 | 812 | 813 | 814 | 815 | 4.25046 0.4 1 816 | 817 | 818 | 0 0 0.5 0 -0 0 819 | 10 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 829 | 830 | 831 | 832 | 833 | 834 | 0 0 0.5 0 -0 0 835 | 836 | 837 | 4.25046 0.4 1 838 | 839 | 840 | 841 | 845 | 1 1 1 1 846 | 847 | 848 | 0 849 | 850 | 851 | -0.581 2.276 0 0 -0 0 852 | 0 853 | 0 854 | 0 855 | 856 | 857 | 858 | 859 | 860 | 4.14966 0.3 1 861 | 862 | 863 | 0 0 0.5 0 -0 0 864 | 10 865 | 866 | 867 | 868 | 869 | 870 | 871 | 872 | 873 | 874 | 875 | 876 | 877 | 878 | 879 | 0 0 0.5 0 -0 0 880 | 881 | 882 | 4.14966 0.3 1 883 | 884 | 885 | 886 | 890 | 1 1 1 1 891 | 892 | 893 | 0 894 | 895 | 896 | 0.257999 2.939 0 0 -0 -1.5708 897 | 0 898 | 0 899 | 0 900 | 901 | 902 | 903 | 904 | 905 | 4.7 0.6 1 906 | 907 | 908 | 0 0 0.5 0 -0 0 909 | 10 910 | 911 | 912 | 913 | 914 | 915 | 916 | 917 | 918 | 919 | 920 | 921 | 922 | 923 | 924 | 0 0 0.5 0 -0 0 925 | 926 | 927 | 4.7 0.6 1 928 | 929 | 930 | 931 | 935 | 1 1 1 1 936 | 937 | 938 | 0 939 | 940 | 941 | 2.308 1.014 0 0 -0 0 942 | 0 943 | 0 944 | 0 945 | 946 | 947 | 948 | 949 | 950 | 4.15034 0.3 1 951 | 952 | 953 | 0 0 0.5 0 -0 0 954 | 10 955 | 956 | 957 | 958 | 959 | 960 | 961 | 962 | 963 | 964 | 965 | 966 | 967 | 968 | 969 | 0 0 0.5 0 -0 0 970 | 971 | 972 | 4.15034 0.3 1 973 | 974 | 975 | 976 | 980 | 1 1 1 1 981 | 982 | 983 | 0 984 | 985 | 986 | 2.811 -1.153 0 0 -0 -1.5708 987 | 0 988 | 0 989 | 0 990 | 991 | 992 | 993 | 994 | 995 | 3.86502 0.3 1 996 | 997 | 998 | 0 0 0.5 0 -0 0 999 | 10 1000 | 1001 | 1002 | 1003 | 1004 | 1005 | 1006 | 1007 | 1008 | 1009 | 1010 | 1011 | 1012 | 1013 | 1014 | 0 0 0.5 0 -0 0 1015 | 1016 | 1017 | 3.86502 0.3 1 1018 | 1019 | 1020 | 1021 | 1025 | 1 1 1 1 1026 | 1027 | 1028 | 0 1029 | 1030 | 1031 | 7.93249 -1.80896 0 0 -0 0.000539 1032 | 0 1033 | 0 1034 | 0 1035 | 1036 | 1037 | 1038 | 1039 | 1040 | 4.65012 0.3 1 1041 | 1042 | 1043 | 0 0 0.5 0 -0 0 1044 | 10 1045 | 1046 | 1047 | 1048 | 1049 | 1050 | 1051 | 1052 | 1053 | 1054 | 1055 | 1056 | 1057 | 1058 | 1059 | 0 0 0.5 0 -0 0 1060 | 1061 | 1062 | 4.65012 0.3 1 1063 | 1064 | 1065 | 1066 | 1070 | 1 1 1 1 1071 | 1072 | 1073 | 0 1074 | 1075 | 1076 | -8.462 -6.462 0 0 -0 0.785398 1077 | 0 1078 | 0 1079 | 0 1080 | 1081 | 1082 | 1083 | 1084 | 1085 | 2.25 0.15 1 1086 | 1087 | 1088 | 0 0 0.5 0 -0 0 1089 | 10 1090 | 1091 | 1092 | 1093 | 1094 | 1095 | 1096 | 1097 | 1098 | 1099 | 1100 | 1101 | 1102 | 1103 | 1104 | 0 0 0.5 0 -0 0 1105 | 1106 | 1107 | 2.25 0.15 1 1108 | 1109 | 1110 | 1111 | 1115 | 1 1 1 1 1116 | 1117 | 1118 | 0 1119 | 1120 | 1121 | -5.874 -4.924 0 0 -0 0 1122 | 0 1123 | 0 1124 | 0 1125 | 1126 | 1127 | 1128 | 1129 | 1130 | 4.15 0.3 1 1131 | 1132 | 1133 | 0 0 0.5 0 -0 0 1134 | 10 1135 | 1136 | 1137 | 1138 | 1139 | 1140 | 1141 | 1142 | 1143 | 1144 | 1145 | 1146 | 1147 | 1148 | 1149 | 0 0 0.5 0 -0 0 1150 | 1151 | 1152 | 4.15 0.3 1 1153 | 1154 | 1155 | 1156 | 1160 | 1 1 1 1 1161 | 1162 | 1163 | 0 1164 | 1165 | 1166 | 6.14998 -3.75792 0 0 -0 -1.5708 1167 | 0 1168 | 0 1169 | 0 1170 | 1171 | 1172 | 1173 | 1174 | 1175 | 2.1 0.5 1 1176 | 1177 | 1178 | 0 0 0.5 0 -0 0 1179 | 10 1180 | 1181 | 1182 | 1183 | 1184 | 1185 | 1186 | 1187 | 1188 | 1189 | 1190 | 1191 | 1192 | 1193 | 1194 | 0 0 0.5 0 -0 0 1195 | 1196 | 1197 | 2.1 0.5 1 1198 | 1199 | 1200 | 1201 | 1205 | 1 1 1 1 1206 | 1207 | 1208 | 0 1209 | 1210 | 1211 | 3.611 -3.078 0 0 -0 0 1212 | 0 1213 | 0 1214 | 0 1215 | 1216 | 1217 | 1218 | 1219 | 1220 | 16.5 0.5 1 1221 | 1222 | 1223 | 0 0 0.5 0 -0 0 1224 | 10 1225 | 1226 | 1227 | 1228 | 1229 | 1230 | 1231 | 1232 | 1233 | 1234 | 1235 | 1236 | 1237 | 1238 | 1239 | 0 0 0.5 0 -0 0 1240 | 1241 | 1242 | 16.5 0.5 1 1243 | 1244 | 1245 | 1246 | 1250 | 1 1 1 1 1251 | 1252 | 1253 | 0 1254 | 1255 | 1256 | 10 0 0 0 -0 -1.5708 1257 | 0 1258 | 0 1259 | 0 1260 | 1261 | 1262 | 1263 | 1264 | 1265 | 2.5 0.15 1 1266 | 1267 | 1268 | 0 0 0.5 0 -0 0 1269 | 10 1270 | 1271 | 1272 | 1273 | 1274 | 1275 | 1276 | 1277 | 1278 | 1279 | 1280 | 1281 | 1282 | 1283 | 1284 | 0 0 0.5 0 -0 0 1285 | 1286 | 1287 | 2.5 0.15 1 1288 | 1289 | 1290 | 1291 | 1295 | 1 1 1 1 1296 | 1297 | 1298 | 0 1299 | 1300 | 1301 | 3.513 -6.651 0 0 -0 -1.5708 1302 | 0 1303 | 0 1304 | 0 1305 | 1306 | 1307 | 1308 | 1309 | 1310 | 2.15018 0.3 2.5 1311 | 1312 | 1313 | 0 0 1.25 0 -0 0 1314 | 10 1315 | 1316 | 1317 | 1318 | 1319 | 1320 | 1321 | 1322 | 1323 | 1324 | 1325 | 1326 | 1327 | 1328 | 1329 | 0 0 1.25 0 -0 0 1330 | 1331 | 1332 | 2.15018 0.3 2.5 1333 | 1334 | 1335 | 1336 | 1340 | 1 1 1 1 1341 | 1342 | 1343 | 0 1344 | 1345 | 1346 | 3.571 -5.956 0 0 -0 0 1347 | 0 1348 | 0 1349 | 0 1350 | 1351 | 1352 | 1353 | 1354 | 1355 | 1.9996 0.4 1 1356 | 1357 | 1358 | 0 0 0.5 0 -0 0 1359 | 10 1360 | 1361 | 1362 | 1363 | 1364 | 1365 | 1366 | 1367 | 1368 | 1369 | 1370 | 1371 | 1372 | 1373 | 1374 | 0 0 0.5 0 -0 0 1375 | 1376 | 1377 | 1.9996 0.4 1 1378 | 1379 | 1380 | 1381 | 1385 | 1 1 1 1 1386 | 1387 | 1388 | 0 1389 | 1390 | 1391 | 4.49 5.03 0 0 -0 -1.5708 1392 | 0 1393 | 0 1394 | 0 1395 | 1396 | 1397 | 1398 | 1399 | 1400 | 2.45 0.6 1 1401 | 1402 | 1403 | 0 0 0.5 0 -0 0 1404 | 10 1405 | 1406 | 1407 | 1408 | 1409 | 1410 | 1411 | 1412 | 1413 | 1414 | 1415 | 1416 | 1417 | 1418 | 1419 | 0 0 0.5 0 -0 0 1420 | 1421 | 1422 | 2.45 0.6 1 1423 | 1424 | 1425 | 1426 | 1430 | 1 1 1 1 1431 | 1432 | 1433 | 0 1434 | 1435 | 1436 | -6.281 5.964 0 0 -0 0 1437 | 0 1438 | 0 1439 | 0 1440 | 1441 | 1 1442 | 1443 | 1444 | 107 437000000 1445 | 109 140123648 1446 | 1721455960 35264714 1447 | 107437 1448 | 1449 | 0 0 0 0 -0 0 1450 | 1 1 1 1451 | 1452 | 0 0 0 0 -0 0 1453 | 0 0 0 0 -0 0 1454 | 0 0 0 0 -0 0 1455 | 0 0 0 0 -0 0 1456 | 1457 | 1458 | 1459 | 7 0 0 0 -0 0 1460 | 1 1 1 1461 | 1462 | 7 8 0 0 -0 0 1463 | 0 0 0 0 -0 0 1464 | 0 0 0 0 -0 0 1465 | 0 0 0 0 -0 0 1466 | 1467 | 1468 | 0.231 4.775 0 0 -0 0 1469 | 0 0 0 0 -0 0 1470 | 0 0 0 0 -0 0 1471 | 0 0 0 0 -0 0 1472 | 1473 | 1474 | 7.426 -5.638 0 0 -0 1.5708 1475 | 0 0 0 0 -0 0 1476 | 0 0 0 0 -0 0 1477 | 0 0 0 0 -0 0 1478 | 1479 | 1480 | 6.043 -5.671 0 0 -0 0 1481 | 0 0 0 0 -0 0 1482 | 0 0 0 0 -0 0 1483 | 0 0 0 0 -0 0 1484 | 1485 | 1486 | 6.621 -4.33 0 0 -0 0 1487 | 0 0 0 0 -0 0 1488 | 0 0 0 0 -0 0 1489 | 0 0 0 0 -0 0 1490 | 1491 | 1492 | 5.248 -7.055 0 0 -0 0 1493 | 0 0 0 0 -0 0 1494 | 0 0 0 0 -0 0 1495 | 0 0 0 0 -0 0 1496 | 1497 | 1498 | 7 -8 0 0 -0 0 1499 | 0 0 0 0 -0 0 1500 | 0 0 0 0 -0 0 1501 | 0 0 0 0 -0 0 1502 | 1503 | 1504 | 3.968 1.305 0 0 -0 0 1505 | 0 0 0 0 -0 0 1506 | 0 0 0 0 -0 0 1507 | 0 0 0 0 -0 0 1508 | 1509 | 1510 | 2.793 0.755 0 0 0 -1.5708 1511 | 0 0 0 0 -0 0 1512 | 0 0 0 0 -0 0 1513 | 0 0 0 0 -0 0 1514 | 1515 | 1516 | 3.968 0.205 0 0 -0 0 1517 | 0 0 0 0 -0 0 1518 | 0 0 0 0 -0 0 1519 | 0 0 0 0 -0 0 1520 | 1521 | 1522 | 4.041 0.719 0 0 0 -1.5708 1523 | 0 0 0 0 -0 0 1524 | 0 0 0 0 -0 0 1525 | 0 0 0 0 -0 0 1526 | 1527 | 1528 | 11.3832 5.80907 0 0 -0 0 1529 | 0 0 0 0 -0 0 1530 | 0 0 0 0 -0 0 1531 | 0 0 0 0 -0 0 1532 | 1533 | 1534 | 13.716 2.842 0 0 -0 0 1535 | 0 0 0 0 -0 0 1536 | 0 0 0 0 -0 0 1537 | 0 0 0 0 -0 0 1538 | 1539 | 1540 | -0.206 4.789 0 0 0 -1.5708 1541 | 0 0 0 0 -0 0 1542 | 0 0 0 0 -0 0 1543 | 0 0 0 0 -0 0 1544 | 1545 | 1546 | -3 0 0 0 0 -1.5708 1547 | 0 0 0 0 -0 0 1548 | 0 0 0 0 -0 0 1549 | 0 0 0 0 -0 0 1550 | 1551 | 1552 | -1.45 4.1945 0 0 0 -0.436605 1553 | 0 0 0 0 -0 0 1554 | 0 0 0 0 -0 0 1555 | 0 0 0 0 -0 0 1556 | 1557 | 1558 | 6.419 2.276 0 0 -0 0 1559 | 0 0 0 0 -0 0 1560 | 0 0 0 0 -0 0 1561 | 0 0 0 0 -0 0 1562 | 1563 | 1564 | 7.258 2.939 0 0 0 -1.5708 1565 | 0 0 0 0 -0 0 1566 | 0 0 0 0 -0 0 1567 | 0 0 0 0 -0 0 1568 | 1569 | 1570 | 9.308 1.014 0 0 -0 0 1571 | 0 0 0 0 -0 0 1572 | 0 0 0 0 -0 0 1573 | 0 0 0 0 -0 0 1574 | 1575 | 1576 | 9.811 -1.153 0 0 0 -1.5708 1577 | 0 0 0 0 -0 0 1578 | 0 0 0 0 -0 0 1579 | 0 0 0 0 -0 0 1580 | 1581 | 1582 | 14.9325 -1.80896 0 0 -0 0.000539 1583 | 0 0 0 0 -0 0 1584 | 0 0 0 0 -0 0 1585 | 0 0 0 0 -0 0 1586 | 1587 | 1588 | -1.462 -6.462 0 0 -0 0.785398 1589 | 0 0 0 0 -0 0 1590 | 0 0 0 0 -0 0 1591 | 0 0 0 0 -0 0 1592 | 1593 | 1594 | 1.126 -4.924 0 0 -0 0 1595 | 0 0 0 0 -0 0 1596 | 0 0 0 0 -0 0 1597 | 0 0 0 0 -0 0 1598 | 1599 | 1600 | 13.15 -3.75792 0 0 0 -1.5708 1601 | 0 0 0 0 -0 0 1602 | 0 0 0 0 -0 0 1603 | 0 0 0 0 -0 0 1604 | 1605 | 1606 | 10.611 -3.078 0 0 -0 0 1607 | 0 0 0 0 -0 0 1608 | 0 0 0 0 -0 0 1609 | 0 0 0 0 -0 0 1610 | 1611 | 1612 | 17 0 0 0 0 -1.5708 1613 | 0 0 0 0 -0 0 1614 | 0 0 0 0 -0 0 1615 | 0 0 0 0 -0 0 1616 | 1617 | 1618 | 10.513 -6.651 0 0 0 -1.5708 1619 | 0 0 0 0 -0 0 1620 | 0 0 0 0 -0 0 1621 | 0 0 0 0 -0 0 1622 | 1623 | 1624 | 10.571 -5.956 0 0 -0 0 1625 | 0 0 0 0 -0 0 1626 | 0 0 0 0 -0 0 1627 | 0 0 0 0 -0 0 1628 | 1629 | 1630 | 11.49 5.03 0 0 0 -1.5708 1631 | 0 0 0 0 -0 0 1632 | 0 0 0 0 -0 0 1633 | 0 0 0 0 -0 0 1634 | 1635 | 1636 | 0.719 5.964 0 0 -0 0 1637 | 0 0 0 0 -0 0 1638 | 0 0 0 0 -0 0 1639 | 0 0 0 0 -0 0 1640 | 1641 | 1642 | 1643 | 0 0 10 0 -0 0 1644 | 1645 | 1646 | 1647 | 1648 | 4.25318 -8.63238 62.8998 3.14159 1.57079 3.14159 1649 | orbit 1650 | perspective 1651 | 1652 | 1653 | 1654 | 1655 | 1656 | --------------------------------------------------------------------------------