├── LICENSE ├── README.md ├── arduino └── MotorDriver │ └── MotorDriver.ino ├── docs └── media │ ├── autonomous_navigation.jpeg │ ├── ramu.jpg │ ├── ramu_cad.jpg │ └── simulation.png ├── mecanum_bot ├── CMakeLists.txt └── package.xml ├── mecanum_bot_bringup ├── CMakeLists.txt ├── config │ ├── mecanum_bot.yaml │ └── mecanum_bot_lds_2d.lua ├── launch │ ├── base_controller.launch.xml │ ├── cartographer.launch.py │ ├── joystick_teleop.launch.xml │ ├── mecanum_bot.launch.xml │ ├── navigation2.launch.py │ └── occupancy_grid.launch.py ├── map │ ├── map.png │ ├── map.yaml │ ├── map_house.pgm │ ├── map_house.yaml │ ├── map_old.pgm │ ├── map_old.yaml │ ├── office_old.pgm │ └── office_old.yaml ├── package.xml └── rviz │ ├── mecanum_bot_cartographer.rviz │ └── mecanum_bot_navigation2.rviz ├── mecanum_bot_controller ├── mecanum_bot_controller │ ├── __init__.py │ ├── mecanum_bot_controller.py │ └── robot.py ├── package.xml ├── resource │ └── mecanum_bot_controller ├── setup.cfg ├── setup.py └── test │ ├── test_copyright.py │ ├── test_flake8.py │ └── test_pep257.py └── mecanum_bot_description ├── CMakeLists.txt ├── launch └── view_robot.launch.py ├── mecanum_bot ├── meshes │ ├── mecanum_bot_chassis.mtl │ ├── mecanum_bot_chassis.obj │ ├── mecanum_bot_wheel.mtl │ ├── mecanum_bot_wheel.obj │ ├── ydlidar_x2l.mtl │ └── ydlidar_x2l.obj ├── model.config └── model.sdf ├── mecanum_bot_description_gazebo_paths.dsv.in ├── package.xml ├── rviz └── view_robot.rviz └── worlds └── example_world.sdf /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![](docs/media/ramu.jpg) 2 | 3 | ## RAMU (Really Awesome Mobile Unit) 4 | 5 | RAMU is a low-cost, wheel encoder-less, holonomic mobile base that is capable of autonomous navigation. RAMU is powered by ROS 2 and Navigation 2 systems. This repository contains some information on RAMU along with ROS 2 packages and launch files to get RAMU up and running. 6 | 7 | #### Click the image below to watch RAMU autonomously navigate in an indoor environment. 8 | 9 | [![](docs/media/autonomous_navigation.jpeg)](https://www.youtube.com/watch?v=9J7-lWX2Y_A&feature=youtu.be) 10 | 11 | 12 | ## Hardware Design 13 | 14 | ![](docs/media/ramu_cad.jpg) 15 | 16 | RAMU's chassis is constructed from 20x20 aluminium extrusion members which are connected together with 3D printed joints. The motor, battery, electronics and sensors mounts are also 3D printed. The CAD is open sourced via Onshape and can be accessed [here](https://cad.onshape.com/documents/ce8bdc9f696707bc50d70932/w/ef0d68341801b7ffe4e012c3/e/bb0d1657fc848bdd1addb320). 17 | 18 | Documentation of the build process is found [here](https://www.yadunundvijay.com/ramu) 19 | 20 | ### BOM 21 | 1. [Raspberry Pi 3B](https://www.raspberrypi.org/products/raspberry-pi-3-model-b/) 22 | 2. [Arduino Uno](https://store.arduino.cc/usa/arduino-uno-rev3) 23 | 3. [DC geared motors 178RPM x4](https://www.aliexpress.com/item/32999954820.html?spm=a2g0s.9042311.0.0.65cf4c4dNaN8tW) 24 | 4. [Motor drivers x2](https://www.aliexpress.com/item/4000099388630.html?spm=a2g0s.9042311.0.0.65cf4c4dNaN8tW) 25 | 5. [Mecanum wheels 96mm diameter x4](https://www.aliexpress.com/item/4001118452729.html?spm=a2g0s.9042311.0.0.65cf4c4dNaN8tW) 26 | 6. [2D lidar](https://www.aliexpress.com/item/4000018415971.html?spm=a2g0s.9042311.0.0.65cf4c4dNaN8tW) 27 | 28 | ## Electrical and Wiring 29 | 30 | RAMU's four wheels/motors follow the below numbering convention 31 | 32 | ``` 33 | ^ 34 | | 35 | w1---w2 36 | | | 37 | | | 38 | w3---w4 39 | ``` 40 | 41 | Each motor is controlled by a motor driver which receives PWM signals from the Arduino which in-turn receives motor velocities from the RPi. 42 | 43 | The RPi thus has the Arduino and 2D lidar plugged into its USB ports. These devices must be available on `/dev/ttyUSB1` and `/dev/ttyUSB0` respectively. A 12V to 5V DC-DC converter steps down the 12V battery voltage and powers the RPi. 44 | 45 | > TODO Add wiring diagram 46 | 47 | 48 | ## Software Setup 49 | 50 | ### Arduino 51 | 52 | RAMU's Arduino receives motor velocities in range [0,255] via serial from the RPi which is used to write PWM signals to the connected motors drivers. Expected format for incoming data: 53 | ``` 54 | "[w1, w2, w3, w4]" 55 | ``` 56 | 57 | where w1, w2, w3, w4 are the velocities of the wheels as seen in the arrangement above. 58 | 59 | 60 | The code to be uploaded to the arduino is located at `arduino/MotorDriver`. 61 | 62 | ### RPi 63 | RAMU's RPi is running Ubuntu 20.04 Server. The following binaries are installed on the RPi 64 | 65 | * [ROS 2 Foxy](https://index.ros.org/doc/ros2/Installation/Foxy/Linux-Install-Debians/) 66 | * [Navigation 2](https://navigation.ros.org/build_instructions/index.html#install) 67 | 68 | Other dependencies: 69 | ``` 70 | python3 -m pip install pyserial 71 | ``` 72 | 73 | Setup a ROS 2 workspace as follows 74 | 75 | ``` 76 | mkdir ~/ws_mecanum_bot/src -p 77 | cd ~/ws_mecanum_bot/src 78 | git clone https://github.com/Yadunund/mecanum_bot.git 79 | git clone https://github.com/Yadunund/ydlidar_ros.git -b X2l-foxy-devel 80 | ``` 81 | 82 | Install all ROS 2 dependencies 83 | ``` 84 | cd ~/ws_mecanum_bot 85 | rosdep install --from-paths src --ignore-src --rosdistro foxy -yr 86 | ``` 87 | 88 | Next build the workspace 89 | ``` 90 | cd ~/ws_mecanum_bot 91 | source /opt/ros/foxy/setup.bash 92 | colcon build --parallel-workers 1 93 | ``` 94 | 95 | ## Simulation 96 | ![](./docs/media/simulation.png) 97 | 98 | The `mecanum_bot` can be fully simulated with the latest [Gazebo](https://gazebosim.org/home). 99 | 100 | To launch a simple simulation world with the robot model loaded, 101 | ```bash 102 | cd ~/ws_mecanum_bot 103 | source install/setup.bash 104 | ros2 launch mecanum_bot_description view_robot.launch.py 105 | ``` 106 | > Note: Press the Play button in the bottom left corner of the Gazebo GUI to start the simulation. 107 | 108 | The simulated robot can be teleoperated by publishing `Twist` messages over `/cmd_vel`. 109 | Lidar data is published over `/scan` and odometry over `/odom`. 110 | 111 | ## Running stuff and having fun 112 | 113 | With the Arduino code uploaded and the RPi setup, we have various launch commands to get RAMU running. 114 | 115 | First launch the lidar node 116 | ``` 117 | cd ~/ws_mecanum_bot 118 | source install/setup.bash 119 | ros2 launch ydlidar lidar.launch.xml 120 | ``` 121 | 122 | Next launch the `base_controller` and `TF2` publishers 123 | ``` 124 | cd ~/ws_mecanum_bot 125 | source install/setup.bash 126 | ros2 launch mecanum_bot_bringup mecanum_bot.launch.xml 127 | ``` 128 | 129 | RAMU can now be teleoperated by publishing `geometry_msgs/Twist` messages over `/cmd_vel` topic. From a second machine with a joystick plugged in, 130 | ``` 131 | cd ~/ws_mecanum_bot 132 | source install/setup.bash 133 | ros2 launch mecanum_bot_bringup joystick_teleop.launch.xml 134 | ``` 135 | 136 | To map an environment using `Cartographer`, 137 | ``` 138 | cd ~/ws_mecanum_bot 139 | source install/setup.bash 140 | ros2 launch mecanum_bot_bringup cartographer.launch.xml 141 | ``` 142 | 143 | Save the map files into `mecanum_bot_bringup/map/` as `map.pgm` and `map.yaml`. 144 | 145 | To navigate autonomously, 146 | ``` 147 | cd ~/ws_mecanum_bot 148 | source install/setup.bash 149 | ros2 launch mecanum_bot_bringup navigation2.launch.xml 150 | ``` 151 | -------------------------------------------------------------------------------- /arduino/MotorDriver/MotorDriver.ino: -------------------------------------------------------------------------------- 1 | 2 | #define NUM_MOTORS 4 3 | // ^ 4 | //w1---w2 5 | //| | 6 | //| | 7 | //w3---w4 8 | 9 | int dir_pins[NUM_MOTORS] = {2, 4, 7, 12}; 10 | int pwm_pins[NUM_MOTORS] = {3, 5, 6, 11}; 11 | int dir_correction[NUM_MOTORS] = {1, -1, 1, -1}; 12 | String data; 13 | 14 | void setup() 15 | { 16 | Serial.begin(115200); 17 | // Set dir and pwm pins as output 18 | for (int i = 0; i < NUM_MOTORS; i++) 19 | { 20 | pinMode(dir_pins[i], OUTPUT); 21 | pinMode(pwm_pins[i], OUTPUT); 22 | 23 | digitalWrite(pwm_pins[i], 0); 24 | } 25 | } 26 | 27 | void loop() 28 | { 29 | data = ""; 30 | while(Serial.available()) 31 | { 32 | delay(1); 33 | if (Serial.available() > 0) 34 | { 35 | char c = Serial.read(); 36 | data += c; 37 | } 38 | } 39 | // We expect input data to be in the form 40 | // "[w1, w2, w3, w4]" 41 | if (data.length() > 0) 42 | { 43 | // Remove the brackets 44 | data = data.substring(1, data.length() - 1); 45 | 46 | int comma_indices[NUM_MOTORS -1] = {0, 0, 0}; 47 | int comma_count = 0; 48 | int wheel_speeds[NUM_MOTORS] = {0, 0, 0, 0}; 49 | 50 | for (int i = 0; i < data.length() - 1; i++) 51 | { 52 | if (data[i] == ',' && comma_count < 3) 53 | { 54 | comma_indices[comma_count] = i; 55 | comma_count++; 56 | } 57 | } 58 | 59 | Serial.print("Comma count: "); 60 | Serial.println(comma_count); 61 | for (int i = 0; i < NUM_MOTORS; i++) 62 | { 63 | String raw_data = ""; 64 | if (i == 0) 65 | raw_data = data.substring(0, comma_indices[i]); 66 | 67 | else if (i == NUM_MOTORS - 1) 68 | raw_data = data.substring(comma_indices[i -1] + 1, data.length()); 69 | 70 | else 71 | raw_data = data.substring(comma_indices[i-1] + 1, comma_indices[i]); 72 | 73 | Serial.println(raw_data); 74 | wheel_speeds[i] = raw_data.toInt(); 75 | } 76 | 77 | 78 | for (int i = 0; i < NUM_MOTORS; i++) 79 | { 80 | int corrected_val = wheel_speeds[i] * dir_correction[i]; 81 | if (corrected_val < 0) 82 | digitalWrite(dir_pins[i], 0); 83 | else 84 | digitalWrite(dir_pins[i], 1); 85 | analogWrite(pwm_pins[i], abs(corrected_val)); 86 | } 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /docs/media/autonomous_navigation.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yadunund/mecanum_bot/a52e4d82334a6b7e68430234b9a52073ac2e383f/docs/media/autonomous_navigation.jpeg -------------------------------------------------------------------------------- /docs/media/ramu.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yadunund/mecanum_bot/a52e4d82334a6b7e68430234b9a52073ac2e383f/docs/media/ramu.jpg -------------------------------------------------------------------------------- /docs/media/ramu_cad.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yadunund/mecanum_bot/a52e4d82334a6b7e68430234b9a52073ac2e383f/docs/media/ramu_cad.jpg -------------------------------------------------------------------------------- /docs/media/simulation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yadunund/mecanum_bot/a52e4d82334a6b7e68430234b9a52073ac2e383f/docs/media/simulation.png -------------------------------------------------------------------------------- /mecanum_bot/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.5) 2 | project(mecanum_bot) 3 | 4 | # find dependencies 5 | find_package(ament_cmake REQUIRED) 6 | 7 | ament_package() 8 | -------------------------------------------------------------------------------- /mecanum_bot/package.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | mecanum_bot 5 | 0.0.0 6 | Meta package for mecanum bot 7 | Yadunund 8 | Apache License 2.0 9 | 10 | ament_cmake 11 | 12 | mecanum_bot_bringup 13 | mecanum_bot_controller 14 | mecanum_bot_description 15 | 16 | 17 | ament_cmake 18 | 19 | 20 | -------------------------------------------------------------------------------- /mecanum_bot_bringup/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.5) 2 | project(mecanum_bot_bringup) 3 | 4 | find_package(ament_cmake REQUIRED) 5 | 6 | install( 7 | DIRECTORY config launch map rviz 8 | DESTINATION share/${PROJECT_NAME} 9 | ) 10 | 11 | ament_package() 12 | -------------------------------------------------------------------------------- /mecanum_bot_bringup/config/mecanum_bot.yaml: -------------------------------------------------------------------------------- 1 | amcl: 2 | ros__parameters: 3 | use_sim_time: False 4 | alpha1: 0.2 5 | alpha2: 0.2 6 | alpha3: 0.2 7 | alpha4: 0.2 8 | alpha5: 0.2 9 | base_frame_id: "base_footprint" 10 | beam_skip_distance: 0.5 11 | beam_skip_error_threshold: 0.9 12 | beam_skip_threshold: 0.3 13 | do_beamskip: false 14 | global_frame_id: "map" 15 | lambda_short: 0.1 16 | laser_likelihood_max_dist: 2.0 17 | laser_max_range: -1.0 18 | laser_min_range: -1.0 19 | laser_model_type: "likelihood_field" 20 | max_beams: 60 21 | max_particles: 2000 22 | min_particles: 100 23 | odom_frame_id: "odom" 24 | pf_err: 0.10 25 | pf_z: 0.50 26 | recovery_alpha_fast: 0.0 27 | recovery_alpha_slow: 0.0 28 | resample_interval: 1 29 | robot_model_type: "omnidirectional" 30 | save_pose_rate: 0.5 31 | sigma_hit: 0.2 32 | tf_broadcast: true 33 | transform_tolerance: 1.0 34 | update_min_a: 0.2 35 | update_min_d: 0.25 36 | z_hit: 0.5 37 | z_max: 0.05 38 | z_rand: 0.5 39 | z_short: 0.05 40 | scan_topic: scan 41 | 42 | amcl_map_client: 43 | ros__parameters: 44 | use_sim_time: False 45 | 46 | amcl_rclcpp_node: 47 | ros__parameters: 48 | use_sim_time: False 49 | 50 | bt_navigator: 51 | ros__parameters: 52 | use_sim_time: False 53 | global_frame: map 54 | robot_base_frame: base_link 55 | odom_topic: /odom 56 | default_bt_xml_filename: "navigate_w_replanning_and_recovery.xml" 57 | plugin_lib_names: 58 | - nav2_compute_path_to_pose_action_bt_node 59 | - nav2_follow_path_action_bt_node 60 | - nav2_back_up_action_bt_node 61 | - nav2_spin_action_bt_node 62 | - nav2_wait_action_bt_node 63 | - nav2_clear_costmap_service_bt_node 64 | - nav2_is_stuck_condition_bt_node 65 | - nav2_goal_reached_condition_bt_node 66 | - nav2_goal_updated_condition_bt_node 67 | - nav2_initial_pose_received_condition_bt_node 68 | - nav2_reinitialize_global_localization_service_bt_node 69 | - nav2_rate_controller_bt_node 70 | - nav2_distance_controller_bt_node 71 | - nav2_speed_controller_bt_node 72 | - nav2_truncate_path_action_bt_node 73 | - nav2_goal_updater_node_bt_node 74 | - nav2_recovery_node_bt_node 75 | - nav2_pipeline_sequence_bt_node 76 | - nav2_round_robin_node_bt_node 77 | - nav2_transform_available_condition_bt_node 78 | - nav2_time_expired_condition_bt_node 79 | - nav2_distance_traveled_condition_bt_node 80 | 81 | bt_navigator_rclcpp_node: 82 | ros__parameters: 83 | use_sim_time: False 84 | 85 | controller_server: 86 | ros__parameters: 87 | use_sim_time: False 88 | controller_frequency: 20.0 89 | min_x_velocity_threshold: 0.001 90 | min_y_velocity_threshold: 0.001 91 | min_theta_velocity_threshold: 0.001 92 | progress_checker_plugin: "progress_checker" 93 | goal_checker_plugin: "goal_checker" 94 | controller_plugins: ["FollowPath"] 95 | 96 | # Progress checker parameters 97 | progress_checker: 98 | plugin: "nav2_controller::SimpleProgressChecker" 99 | required_movement_radius: 0.5 100 | movement_time_allowance: 10.0 101 | # Goal checker parameters 102 | goal_checker: 103 | plugin: "nav2_controller::SimpleGoalChecker" 104 | xy_goal_tolerance: 0.6 105 | yaw_goal_tolerance: 100.0 106 | stateful: True 107 | # DWB parameters 108 | FollowPath: 109 | plugin: "dwb_core::DWBLocalPlanner" 110 | debug_trajectory_details: True 111 | min_vel_x: -0.4 112 | min_vel_y: -0.4 113 | max_vel_x: 0.4 114 | max_vel_y: 0.4 115 | max_vel_theta: 0.8 116 | min_speed_xy: -0.4 117 | max_speed_xy: 0.4 118 | min_speed_theta: -0.8 119 | acc_lim_x: 2.5 120 | acc_lim_y: 2.5 121 | acc_lim_theta: 3.2 122 | decel_lim_x: -2.5 123 | decel_lim_y: -2.5 124 | decel_lim_theta: -3.2 125 | vx_samples: 20 126 | vy_samples: 20 127 | vtheta_samples: 20 128 | sim_time: 1.7 129 | linear_granularity: 0.05 130 | angular_granularity: 0.025 131 | transform_tolerance: 0.2 132 | xy_goal_tolerance: 0.6 133 | trans_stopped_velocity: 0.25 134 | short_circuit_trajectory_evaluation: True 135 | stateful: True 136 | critics: ["RotateToGoal", "Oscillation", "BaseObstacle", "GoalAlign", "PathAlign", "PathDist", "GoalDist"] 137 | BaseObstacle.scale: 0.02 138 | PathAlign.scale: 32.0 139 | PathAlign.forward_point_distance: 0.1 140 | GoalAlign.scale: 24.0 141 | GoalAlign.forward_point_distance: 0.1 142 | PathDist.scale: 32.0 143 | GoalDist.scale: 24.0 144 | RotateToGoal.scale: 32.0 145 | RotateToGoal.slowing_factor: 5.0 146 | RotateToGoal.lookahead_time: -1.0 147 | 148 | controller_server_rclcpp_node: 149 | ros__parameters: 150 | use_sim_time: False 151 | 152 | local_costmap: 153 | local_costmap: 154 | ros__parameters: 155 | update_frequency: 5.0 156 | publish_frequency: 2.0 157 | global_frame: odom 158 | robot_base_frame: base_link 159 | use_sim_time: False 160 | rolling_window: true 161 | width: 3 162 | height: 3 163 | resolution: 0.05 164 | robot_radius: 0.185 165 | plugins: ["voxel_layer", "inflation_layer"] 166 | inflation_layer: 167 | plugin: "nav2_costmap_2d::InflationLayer" 168 | cost_scaling_factor: 3.0 169 | inflation_radius: 0.55 170 | voxel_layer: 171 | plugin: "nav2_costmap_2d::VoxelLayer" 172 | enabled: True 173 | publish_voxel_map: True 174 | origin_z: 0.0 175 | z_resolution: 0.05 176 | z_voxels: 16 177 | max_obstacle_height: 2.0 178 | mark_threshold: 0 179 | observation_sources: scan 180 | scan: 181 | topic: /scan 182 | max_obstacle_height: 2.0 183 | clearing: True 184 | marking: True 185 | data_type: "LaserScan" 186 | static_layer: 187 | map_subscribe_transient_local: True 188 | always_send_full_costmap: True 189 | local_costmap_client: 190 | ros__parameters: 191 | use_sim_time: False 192 | local_costmap_rclcpp_node: 193 | ros__parameters: 194 | use_sim_time: False 195 | 196 | global_costmap: 197 | global_costmap: 198 | ros__parameters: 199 | update_frequency: 1.0 200 | publish_frequency: 1.0 201 | global_frame: map 202 | robot_base_frame: base_link 203 | use_sim_time: False 204 | robot_radius: 0.185 205 | resolution: 0.05 206 | track_unknown_space: true 207 | plugins: ["static_layer", "obstacle_layer", "inflation_layer"] 208 | obstacle_layer: 209 | plugin: "nav2_costmap_2d::ObstacleLayer" 210 | enabled: True 211 | observation_sources: scan 212 | scan: 213 | topic: /scan 214 | max_obstacle_height: 2.0 215 | clearing: True 216 | marking: True 217 | data_type: "LaserScan" 218 | static_layer: 219 | plugin: "nav2_costmap_2d::StaticLayer" 220 | map_subscribe_transient_local: True 221 | inflation_layer: 222 | plugin: "nav2_costmap_2d::InflationLayer" 223 | cost_scaling_factor: 3.0 224 | inflation_radius: 0.55 225 | always_send_full_costmap: True 226 | global_costmap_client: 227 | ros__parameters: 228 | use_sim_time: False 229 | global_costmap_rclcpp_node: 230 | ros__parameters: 231 | use_sim_time: False 232 | 233 | map_server: 234 | ros__parameters: 235 | use_sim_time: False 236 | yaml_filename: "turtlebot3_world.yaml" 237 | 238 | map_saver: 239 | ros__parameters: 240 | use_sim_time: False 241 | save_map_timeout: 5000 242 | free_thresh_default: 0.25 243 | occupied_thresh_default: 0.65 244 | 245 | planner_server: 246 | ros__parameters: 247 | expected_planner_frequency: 20.0 248 | use_sim_time: False 249 | planner_plugins: ["GridBased"] 250 | GridBased: 251 | plugin: "nav2_navfn_planner/NavfnPlanner" 252 | tolerance: 0.5 253 | use_astar: false 254 | allow_unknown: true 255 | 256 | planner_server_rclcpp_node: 257 | ros__parameters: 258 | use_sim_time: False 259 | 260 | recoveries_server: 261 | ros__parameters: 262 | costmap_topic: local_costmap/costmap_raw 263 | footprint_topic: local_costmap/published_footprint 264 | cycle_frequency: 10.0 265 | recovery_plugins: ["spin", "backup", "wait"] 266 | spin: 267 | plugin: "nav2_recoveries/Spin" 268 | backup: 269 | plugin: "nav2_recoveries/BackUp" 270 | wait: 271 | plugin: "nav2_recoveries/Wait" 272 | global_frame: odom 273 | robot_base_frame: base_link 274 | transform_timeout: 0.1 275 | use_sim_time: False 276 | simulate_ahead_time: 2.0 277 | max_rotational_vel: 1.0 278 | min_rotational_vel: 0.4 279 | rotational_acc_lim: 3.2 280 | 281 | robot_state_publisher: 282 | ros__parameters: 283 | use_sim_time: False 284 | -------------------------------------------------------------------------------- /mecanum_bot_bringup/config/mecanum_bot_lds_2d.lua: -------------------------------------------------------------------------------- 1 | -- Copyright 2016 The Cartographer Authors 2 | -- 3 | -- Licensed under the Apache License, Version 2.0 (the "License"); 4 | -- you may not use this file except in compliance with the License. 5 | -- You may obtain a copy of the License at 6 | -- 7 | -- http://www.apache.org/licenses/LICENSE-2.0 8 | -- 9 | -- Unless required by applicable law or agreed to in writing, software 10 | -- distributed under the License is distributed on an "AS IS" BASIS, 11 | -- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | -- See the License for the specific language governing permissions and 13 | -- limitations under the License. 14 | 15 | -- /* Author: Darby Lim */ 16 | 17 | include "map_builder.lua" 18 | include "trajectory_builder.lua" 19 | 20 | options = { 21 | map_builder = MAP_BUILDER, 22 | trajectory_builder = TRAJECTORY_BUILDER, 23 | map_frame = "map", 24 | tracking_frame = "base_link", 25 | published_frame = "odom", 26 | odom_frame = "odom", 27 | provide_odom_frame = false, 28 | publish_frame_projected_to_2d = true, 29 | use_odometry = false, 30 | use_nav_sat = false, 31 | use_landmarks = false, 32 | num_laser_scans = 1, 33 | num_multi_echo_laser_scans = 0, 34 | num_subdivisions_per_laser_scan = 1, 35 | num_point_clouds = 0, 36 | lookup_transform_timeout_sec = 0.2, 37 | submap_publish_period_sec = 0.3, 38 | pose_publish_period_sec = 5e-3, 39 | trajectory_publish_period_sec = 30e-3, 40 | rangefinder_sampling_ratio = 1., 41 | odometry_sampling_ratio = 1., 42 | fixed_frame_pose_sampling_ratio = 1., 43 | imu_sampling_ratio = 1., 44 | landmarks_sampling_ratio = 1., 45 | } 46 | 47 | MAP_BUILDER.use_trajectory_builder_2d = true 48 | 49 | TRAJECTORY_BUILDER_2D.min_range = 0.12 50 | TRAJECTORY_BUILDER_2D.max_range = 3.5 51 | TRAJECTORY_BUILDER_2D.missing_data_ray_length = 3. 52 | TRAJECTORY_BUILDER_2D.use_imu_data = false 53 | TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true 54 | TRAJECTORY_BUILDER_2D.motion_filter.max_angle_radians = math.rad(0.1) 55 | 56 | POSE_GRAPH.constraint_builder.min_score = 0.65 57 | POSE_GRAPH.constraint_builder.global_localization_min_score = 0.7 58 | 59 | -- POSE_GRAPH.optimize_every_n_nodes = 0 60 | 61 | return options 62 | -------------------------------------------------------------------------------- /mecanum_bot_bringup/launch/base_controller.launch.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /mecanum_bot_bringup/launch/cartographer.launch.py: -------------------------------------------------------------------------------- 1 | # Copyright 2019 Open Source Robotics Foundation, Inc. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | # 15 | 16 | import os 17 | from ament_index_python.packages import get_package_share_directory 18 | from launch import LaunchDescription 19 | from launch.actions import DeclareLaunchArgument 20 | from launch_ros.actions import Node 21 | from launch.substitutions import LaunchConfiguration 22 | from launch.actions import IncludeLaunchDescription 23 | from launch.launch_description_sources import PythonLaunchDescriptionSource 24 | from launch.substitutions import ThisLaunchFileDir 25 | 26 | 27 | def generate_launch_description(): 28 | use_sim_time = LaunchConfiguration('use_sim_time', default='false') 29 | mecanum_bot_bringup_prefix = get_package_share_directory('mecanum_bot_bringup') 30 | cartographer_config_dir = LaunchConfiguration('cartographer_config_dir', default=os.path.join( 31 | mecanum_bot_bringup_prefix, 'config')) 32 | configuration_basename = LaunchConfiguration('configuration_basename', 33 | default='mecanum_bot_lds_2d.lua') 34 | 35 | resolution = LaunchConfiguration('resolution', default='0.05') 36 | publish_period_sec = LaunchConfiguration('publish_period_sec', default='1.0') 37 | 38 | rviz_config_dir = os.path.join(get_package_share_directory('mecanum_bot_bringup'), 39 | 'rviz', 'mecanum_bot_bringup.rviz') 40 | 41 | return LaunchDescription([ 42 | DeclareLaunchArgument( 43 | 'cartographer_config_dir', 44 | default_value=cartographer_config_dir, 45 | description='Full path to config file to load'), 46 | DeclareLaunchArgument( 47 | 'configuration_basename', 48 | default_value=configuration_basename, 49 | description='Name of lua file for cartographer'), 50 | DeclareLaunchArgument( 51 | 'use_sim_time', 52 | default_value='false', 53 | description='Use simulation (Gazebo) clock if true'), 54 | 55 | Node( 56 | package='cartographer_ros', 57 | node_executable='cartographer_node', 58 | node_name='cartographer_node', 59 | output='screen', 60 | parameters=[{'use_sim_time': use_sim_time}], 61 | arguments=['-configuration_directory', cartographer_config_dir, 62 | '-configuration_basename', configuration_basename]), 63 | 64 | DeclareLaunchArgument( 65 | 'resolution', 66 | default_value=resolution, 67 | description='Resolution of a grid cell in the published occupancy grid'), 68 | 69 | DeclareLaunchArgument( 70 | 'publish_period_sec', 71 | default_value=publish_period_sec, 72 | description='OccupancyGrid publishing period'), 73 | 74 | IncludeLaunchDescription( 75 | PythonLaunchDescriptionSource([ThisLaunchFileDir(), '/occupancy_grid.launch.py']), 76 | launch_arguments={'use_sim_time': use_sim_time, 'resolution': resolution, 77 | 'publish_period_sec': publish_period_sec}.items(), 78 | ), 79 | 80 | Node( 81 | package='rviz2', 82 | node_executable='rviz2', 83 | node_name='rviz2', 84 | arguments=['-d', rviz_config_dir], 85 | parameters=[{'use_sim_time': use_sim_time}], 86 | output='screen'), 87 | ]) 88 | -------------------------------------------------------------------------------- /mecanum_bot_bringup/launch/joystick_teleop.launch.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /mecanum_bot_bringup/launch/mecanum_bot.launch.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 14 | 15 | 16 | 18 | 19 | 20 | 21 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /mecanum_bot_bringup/launch/navigation2.launch.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2018 Intel Corporation 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | """This is all-in-one launch script intended for use by nav2 developers.""" 16 | 17 | import os 18 | 19 | from ament_index_python.packages import get_package_share_directory 20 | 21 | from launch import LaunchDescription 22 | from launch.actions import DeclareLaunchArgument, ExecuteProcess, IncludeLaunchDescription 23 | from launch.conditions import IfCondition 24 | from launch.launch_description_sources import PythonLaunchDescriptionSource 25 | from launch.substitutions import LaunchConfiguration, PythonExpression 26 | from launch_ros.actions import Node 27 | 28 | 29 | def generate_launch_description(): 30 | # Get the launch directory 31 | bringup_dir = get_package_share_directory('nav2_bringup') 32 | launch_dir = os.path.join(bringup_dir, 'launch') 33 | 34 | # Create the launch configuration variables 35 | slam = LaunchConfiguration('slam') 36 | namespace = LaunchConfiguration('namespace') 37 | use_namespace = LaunchConfiguration('use_namespace') 38 | map_yaml_file = LaunchConfiguration('map') 39 | use_sim_time = LaunchConfiguration('use_sim_time') 40 | params_file = LaunchConfiguration('params_file') 41 | default_nav_through_poses_bt_xml = LaunchConfiguration('default_nav_through_poses_bt_xml') 42 | default_nav_to_pose_bt_xml = LaunchConfiguration('default_nav_to_pose_bt_xml') 43 | autostart = LaunchConfiguration('autostart') 44 | 45 | # Launch configuration variables specific to simulation 46 | rviz_config_file = LaunchConfiguration('rviz_config_file') 47 | use_simulator = LaunchConfiguration('use_simulator') 48 | use_robot_state_pub = LaunchConfiguration('use_robot_state_pub') 49 | use_rviz = LaunchConfiguration('use_rviz') 50 | headless = LaunchConfiguration('headless') 51 | world = LaunchConfiguration('world') 52 | 53 | # Map fully qualified names to relative ones so the node's namespace can be prepended. 54 | # In case of the transforms (tf), currently, there doesn't seem to be a better alternative 55 | # https://github.com/ros/geometry2/issues/32 56 | # https://github.com/ros/robot_state_publisher/pull/30 57 | # TODO(orduno) Substitute with `PushNodeRemapping` 58 | # https://github.com/ros2/launch_ros/issues/56 59 | remappings = [('/tf', 'tf'), 60 | ('/tf_static', 'tf_static')] 61 | 62 | # Declare the launch arguments 63 | declare_namespace_cmd = DeclareLaunchArgument( 64 | 'namespace', 65 | default_value='', 66 | description='Top-level namespace') 67 | 68 | declare_use_namespace_cmd = DeclareLaunchArgument( 69 | 'use_namespace', 70 | default_value='false', 71 | description='Whether to apply a namespace to the navigation stack') 72 | 73 | declare_slam_cmd = DeclareLaunchArgument( 74 | 'slam', 75 | default_value='False', 76 | description='Whether run a SLAM') 77 | 78 | declare_map_yaml_cmd = DeclareLaunchArgument( 79 | 'map', 80 | default_value=os.path.join( 81 | get_package_share_directory('mecanum_bot_bringup'), 82 | 'map', 83 | 'map.yaml'), 84 | description='Full path to map file to load') 85 | 86 | declare_use_sim_time_cmd = DeclareLaunchArgument( 87 | 'use_sim_time', 88 | default_value='false', 89 | description='Use simulation (Gazebo) clock if true') 90 | 91 | declare_params_file_cmd = DeclareLaunchArgument( 92 | 'params_file', 93 | default_value=os.path.join( 94 | get_package_share_directory('mecanum_bot_bringup'), 95 | 'param', 96 | 'mecanum_bot.yaml'), 97 | description='Full path to the ROS2 parameters file to use for all launched nodes') 98 | 99 | default_nav_through_poses_bt_xml_cmd = DeclareLaunchArgument( 100 | 'default_nav_through_poses_bt_xml', 101 | default_value=os.path.join( 102 | get_package_share_directory('nav2_bt_navigator'), 103 | 'behavior_trees', 'navigate_through_poses_w_replanning_and_recovery.xml'), 104 | description='Full path to the behavior tree xml file to use') 105 | 106 | default_nav_to_pose_bt_xml_cmd = DeclareLaunchArgument( 107 | 'default_nav_to_pose_bt_xml', 108 | default_value=os.path.join( 109 | get_package_share_directory('nav2_bt_navigator'), 110 | 'behavior_trees', 'navigate_to_pose_w_replanning_and_recovery.xml'), 111 | description='Full path to the behavior tree xml file to use') 112 | 113 | declare_autostart_cmd = DeclareLaunchArgument( 114 | 'autostart', default_value='true', 115 | description='Automatically startup the nav2 stack') 116 | 117 | declare_rviz_config_file_cmd = DeclareLaunchArgument( 118 | 'rviz_config_file', 119 | default_value=os.path.join( 120 | bringup_dir, 'rviz', 'nav2_default_view.rviz'), 121 | description='Full path to the RVIZ config file to use') 122 | 123 | declare_use_simulator_cmd = DeclareLaunchArgument( 124 | 'use_simulator', 125 | default_value='False', 126 | description='Whether to start the simulator') 127 | 128 | declare_use_robot_state_pub_cmd = DeclareLaunchArgument( 129 | 'use_robot_state_pub', 130 | default_value='False', 131 | description='Whether to start the robot state publisher') 132 | 133 | declare_use_rviz_cmd = DeclareLaunchArgument( 134 | 'use_rviz', 135 | default_value='False', 136 | description='Whether to start RVIZ') 137 | 138 | declare_simulator_cmd = DeclareLaunchArgument( 139 | 'headless', 140 | default_value='False', 141 | description='Whether to execute gzclient)') 142 | 143 | rviz_cmd = IncludeLaunchDescription( 144 | PythonLaunchDescriptionSource( 145 | os.path.join(launch_dir, 'rviz_launch.py')), 146 | condition=IfCondition(use_rviz), 147 | launch_arguments={'namespace': '', 148 | 'use_namespace': 'False', 149 | 'rviz_config': rviz_config_file}.items()) 150 | 151 | bringup_cmd = IncludeLaunchDescription( 152 | PythonLaunchDescriptionSource( 153 | os.path.join(launch_dir, 'bringup_launch.py')), 154 | launch_arguments={'namespace': namespace, 155 | 'use_namespace': use_namespace, 156 | 'slam': slam, 157 | 'map': map_yaml_file, 158 | 'use_sim_time': use_sim_time, 159 | 'params_file': params_file, 160 | 'default_nav_through_poses_bt_xml': default_nav_through_poses_bt_xml, 161 | 'default_nav_to_pose_bt_xml': default_nav_to_pose_bt_xml, 162 | 'autostart': autostart}.items()) 163 | 164 | # Create the launch description and populate 165 | ld = LaunchDescription() 166 | 167 | # Declare the launch options 168 | ld.add_action(declare_namespace_cmd) 169 | ld.add_action(declare_use_namespace_cmd) 170 | ld.add_action(declare_slam_cmd) 171 | ld.add_action(declare_map_yaml_cmd) 172 | ld.add_action(declare_use_sim_time_cmd) 173 | ld.add_action(declare_params_file_cmd) 174 | ld.add_action(default_nav_through_poses_bt_xml_cmd) 175 | ld.add_action(default_nav_to_pose_bt_xml_cmd) 176 | ld.add_action(declare_autostart_cmd) 177 | 178 | ld.add_action(declare_rviz_config_file_cmd) 179 | ld.add_action(declare_use_rviz_cmd) 180 | 181 | # Add the actions to launch all of the navigation nodes 182 | ld.add_action(rviz_cmd) 183 | ld.add_action(bringup_cmd) 184 | 185 | return ld 186 | -------------------------------------------------------------------------------- /mecanum_bot_bringup/launch/occupancy_grid.launch.py: -------------------------------------------------------------------------------- 1 | # Copyright 2019 Open Source Robotics Foundation, Inc. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | # 15 | 16 | from launch import LaunchDescription 17 | from launch.actions import DeclareLaunchArgument 18 | from launch_ros.actions import Node 19 | from launch.substitutions import LaunchConfiguration 20 | 21 | 22 | def generate_launch_description(): 23 | use_sim_time = LaunchConfiguration('use_sim_time', default='false') 24 | resolution = LaunchConfiguration('resolution', default='0.05') 25 | publish_period_sec = LaunchConfiguration('publish_period_sec', default='1.0') 26 | 27 | return LaunchDescription([ 28 | DeclareLaunchArgument( 29 | 'resolution', 30 | default_value=resolution, 31 | description='Resolution of a grid cell in the published occupancy grid'), 32 | 33 | DeclareLaunchArgument( 34 | 'publish_period_sec', 35 | default_value=publish_period_sec, 36 | description='OccupancyGrid publishing period'), 37 | 38 | DeclareLaunchArgument( 39 | 'use_sim_time', 40 | default_value='false', 41 | description='Use simulation (Gazebo) clock if true'), 42 | 43 | Node( 44 | package='cartographer_ros', 45 | node_executable='occupancy_grid_node', 46 | node_name='occupancy_grid_node', 47 | output='screen', 48 | parameters=[{'use_sim_time': use_sim_time}], 49 | arguments=['-resolution', resolution, '-publish_period_sec', publish_period_sec]), 50 | ]) 51 | -------------------------------------------------------------------------------- /mecanum_bot_bringup/map/map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yadunund/mecanum_bot/a52e4d82334a6b7e68430234b9a52073ac2e383f/mecanum_bot_bringup/map/map.png -------------------------------------------------------------------------------- /mecanum_bot_bringup/map/map.yaml: -------------------------------------------------------------------------------- 1 | image: map.png 2 | resolution: 0.05 3 | origin: [0.0, 0.0, 0.0] 4 | negate: 0 5 | occupied_thresh: 0.65 6 | free_thresh: 0.196 7 | -------------------------------------------------------------------------------- /mecanum_bot_bringup/map/map_house.pgm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yadunund/mecanum_bot/a52e4d82334a6b7e68430234b9a52073ac2e383f/mecanum_bot_bringup/map/map_house.pgm -------------------------------------------------------------------------------- /mecanum_bot_bringup/map/map_house.yaml: -------------------------------------------------------------------------------- 1 | image: map.pgm 2 | mode: trinary 3 | resolution: 0.05 4 | origin: [-1.67, -1.1, 0] 5 | negate: 0 6 | occupied_thresh: 0.65 7 | free_thresh: 0.25 8 | -------------------------------------------------------------------------------- /mecanum_bot_bringup/map/map_old.pgm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yadunund/mecanum_bot/a52e4d82334a6b7e68430234b9a52073ac2e383f/mecanum_bot_bringup/map/map_old.pgm -------------------------------------------------------------------------------- /mecanum_bot_bringup/map/map_old.yaml: -------------------------------------------------------------------------------- 1 | image: /home/yadu/map.pgm 2 | mode: trinary 3 | resolution: 0.05 4 | origin: [-3.79, -5.9, 0] 5 | negate: 0 6 | occupied_thresh: 0.65 7 | free_thresh: 0.25 -------------------------------------------------------------------------------- /mecanum_bot_bringup/map/office_old.pgm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yadunund/mecanum_bot/a52e4d82334a6b7e68430234b9a52073ac2e383f/mecanum_bot_bringup/map/office_old.pgm -------------------------------------------------------------------------------- /mecanum_bot_bringup/map/office_old.yaml: -------------------------------------------------------------------------------- 1 | image: /home/yadu/office_map.pgm 2 | mode: trinary 3 | resolution: 0.05 4 | origin: [-13.4, -9.85, 0] 5 | negate: 0 6 | occupied_thresh: 0.65 7 | free_thresh: 0.25 -------------------------------------------------------------------------------- /mecanum_bot_bringup/package.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | mecanum_bot_bringup 5 | 1.0.0 6 | 7 | ROS 2 launch scripts for mecanum_bot 8 | 9 | Yadunund 10 | Apache 2.0 11 | 12 | ament_cmake 13 | 14 | cartographer_ros 15 | joy 16 | launch_xml 17 | nav2_bringup 18 | teleop_twist_joy 19 | ydlidar 20 | 21 | mecanum_bot_controller 22 | mecanum_bot_description 23 | 24 | 25 | ament_cmake 26 | 27 | 28 | -------------------------------------------------------------------------------- /mecanum_bot_bringup/rviz/mecanum_bot_cartographer.rviz: -------------------------------------------------------------------------------- 1 | Panels: 2 | - Class: rviz_common/Displays 3 | Help Height: 78 4 | Name: Displays 5 | Property Tree Widget: 6 | Expanded: 7 | - /Global Options1 8 | - /TF1/Frames1 9 | - /Map1/Status1 10 | - /Cartographer1 11 | Splitter Ratio: 0.5794117450714111 12 | Tree Height: 707 13 | - Class: rviz_common/Selection 14 | Name: Selection 15 | - Class: rviz_common/Tool Properties 16 | Expanded: 17 | - /2D Nav Goal1 18 | - /Publish Point1 19 | - /2D Pose Estimate1 20 | Name: Tool Properties 21 | Splitter Ratio: 0.5886790156364441 22 | - Class: rviz_common/Views 23 | Expanded: 24 | - /Current View1 25 | Name: Views 26 | Splitter Ratio: 0.5 27 | Visualization Manager: 28 | Class: "" 29 | Displays: 30 | - Alpha: 0.5 31 | Cell Size: 1 32 | Class: rviz_default_plugins/Grid 33 | Color: 160; 160; 164 34 | Enabled: true 35 | Line Style: 36 | Line Width: 0.029999999329447746 37 | Value: Lines 38 | Name: Grid 39 | Normal Cell Count: 0 40 | Offset: 41 | X: 0 42 | Y: 0 43 | Z: 0 44 | Plane: XY 45 | Plane Cell Count: 10 46 | Reference Frame: 47 | Value: true 48 | - Class: rviz_default_plugins/TF 49 | Enabled: true 50 | Frame Timeout: 15 51 | Frames: 52 | All Enabled: true 53 | base_footprint: 54 | Value: true 55 | base_link: 56 | Value: true 57 | base_scan: 58 | Value: true 59 | caster_back_link: 60 | Value: true 61 | imu_link: 62 | Value: true 63 | map: 64 | Value: true 65 | odom: 66 | Value: true 67 | wheel_left_link: 68 | Value: true 69 | wheel_right_link: 70 | Value: true 71 | Marker Scale: 1 72 | Name: TF 73 | Show Arrows: true 74 | Show Axes: true 75 | Show Names: true 76 | Tree: 77 | map: 78 | odom: 79 | base_footprint: 80 | base_link: 81 | base_scan: 82 | {} 83 | caster_back_link: 84 | {} 85 | imu_link: 86 | {} 87 | wheel_left_link: 88 | {} 89 | wheel_right_link: 90 | {} 91 | Update Interval: 0 92 | Value: true 93 | - Alpha: 1 94 | Autocompute Intensity Bounds: true 95 | Autocompute Value Bounds: 96 | Max Value: 10 97 | Min Value: -10 98 | Value: true 99 | Axis: Z 100 | Channel Name: intensity 101 | Class: rviz_default_plugins/LaserScan 102 | Color: 255; 255; 255 103 | Color Transformer: "" 104 | Decay Time: 0 105 | Enabled: false 106 | Invert Rainbow: false 107 | Max Color: 255; 255; 255 108 | Max Intensity: 0 109 | Min Color: 0; 0; 0 110 | Min Intensity: 0 111 | Name: LaserScan 112 | Position Transformer: "" 113 | Queue Size: 10 114 | Selectable: true 115 | Size (Pixels): 3 116 | Size (m): 0.019999999552965164 117 | Style: Points 118 | Topic: /scan 119 | Unreliable: true 120 | Use Fixed Frame: true 121 | Use rainbow: true 122 | Value: false 123 | - Angle Tolerance: 0.10000000149011612 124 | Class: rviz_default_plugins/Odometry 125 | Covariance: 126 | Orientation: 127 | Alpha: 0.5 128 | Color: 255; 255; 127 129 | Color Style: Unique 130 | Frame: Local 131 | Offset: 1 132 | Scale: 1 133 | Value: true 134 | Position: 135 | Alpha: 0.30000001192092896 136 | Color: 204; 51; 204 137 | Scale: 1 138 | Value: true 139 | Value: false 140 | Enabled: false 141 | Keep: 100 142 | Name: Odometry 143 | Position Tolerance: 0.10000000149011612 144 | Shape: 145 | Alpha: 1 146 | Axes Length: 1 147 | Axes Radius: 0.10000000149011612 148 | Color: 255; 25; 0 149 | Head Length: 0.30000001192092896 150 | Head Radius: 0.10000000149011612 151 | Shaft Length: 1 152 | Shaft Radius: 0.05000000074505806 153 | Value: Arrow 154 | Topic: /odom 155 | Unreliable: false 156 | Value: false 157 | - Alpha: 0.699999988079071 158 | Class: rviz_default_plugins/Map 159 | Color Scheme: map 160 | Draw Behind: false 161 | Enabled: true 162 | Name: Map 163 | Topic: /map 164 | Unreliable: true 165 | Use Timestamp: false 166 | Value: true 167 | - Class: rviz_common/Group 168 | Displays: 169 | - Class: rviz_common/Group 170 | Displays: 171 | - Alpha: 0.699999988079071 172 | Class: rviz_default_plugins/Map 173 | Color Scheme: costmap 174 | Draw Behind: true 175 | Enabled: true 176 | Name: Map 177 | Topic: /global_costmap/costmap 178 | Unreliable: false 179 | Use Timestamp: false 180 | Value: true 181 | - Alpha: 1 182 | Buffer Length: 1 183 | Class: rviz_default_plugins/Path 184 | Color: 255; 0; 0 185 | Enabled: true 186 | Head Diameter: 0.30000001192092896 187 | Head Length: 0.20000000298023224 188 | Length: 0.30000001192092896 189 | Line Style: Lines 190 | Line Width: 0.029999999329447746 191 | Name: Path 192 | Offset: 193 | X: 0 194 | Y: 0 195 | Z: 0 196 | Pose Color: 255; 85; 255 197 | Pose Style: None 198 | Radius: 0.029999999329447746 199 | Shaft Diameter: 0.10000000149011612 200 | Shaft Length: 0.10000000149011612 201 | Topic: /global_plan 202 | Unreliable: false 203 | Value: true 204 | Enabled: true 205 | Name: Global Map 206 | - Class: rviz_common/Group 207 | Displays: 208 | - Alpha: 1 209 | Class: rviz_default_plugins/Polygon 210 | Color: 25; 255; 0 211 | Enabled: true 212 | Name: Polygon 213 | Topic: /local_costmap/footprint 214 | Unreliable: false 215 | Value: true 216 | - Alpha: 0.699999988079071 217 | Class: rviz_default_plugins/Map 218 | Color Scheme: costmap 219 | Draw Behind: false 220 | Enabled: true 221 | Name: Map 222 | Topic: /local_costmap/costmap 223 | Unreliable: false 224 | Use Timestamp: false 225 | Value: true 226 | - Alpha: 1 227 | Buffer Length: 1 228 | Class: rviz_default_plugins/Path 229 | Color: 255; 255; 0 230 | Enabled: true 231 | Head Diameter: 0.30000001192092896 232 | Head Length: 0.20000000298023224 233 | Length: 0.30000001192092896 234 | Line Style: Lines 235 | Line Width: 0.029999999329447746 236 | Name: Path 237 | Offset: 238 | X: 0 239 | Y: 0 240 | Z: 0 241 | Pose Color: 255; 85; 255 242 | Pose Style: None 243 | Radius: 0.029999999329447746 244 | Shaft Diameter: 0.10000000149011612 245 | Shaft Length: 0.10000000149011612 246 | Topic: /local_plan 247 | Unreliable: false 248 | Value: true 249 | Enabled: true 250 | Name: Local Map 251 | - Alpha: 1 252 | Arrow Length: 0.05000000074505806 253 | Axes Length: 0.30000001192092896 254 | Axes Radius: 0.009999999776482582 255 | Class: rviz_default_plugins/PoseArray 256 | Color: 0; 192; 0 257 | Enabled: true 258 | Head Length: 0.07000000029802322 259 | Head Radius: 0.029999999329447746 260 | Name: PoseArray 261 | Shaft Length: 0.23000000417232513 262 | Shaft Radius: 0.009999999776482582 263 | Shape: Arrow (Flat) 264 | Topic: /particlecloud 265 | Unreliable: false 266 | Value: true 267 | Enabled: false 268 | Name: Navigation 269 | - Class: rviz_common/Group 270 | Displays: 271 | - Alpha: 1 272 | Autocompute Intensity Bounds: true 273 | Autocompute Value Bounds: 274 | Max Value: 0.18203988671302795 275 | Min Value: 0.18195410072803497 276 | Value: true 277 | Axis: Z 278 | Channel Name: intensity 279 | Class: rviz_default_plugins/PointCloud2 280 | Color: 0; 255; 0 281 | Color Transformer: FlatColor 282 | Decay Time: 0 283 | Enabled: true 284 | Invert Rainbow: false 285 | Max Color: 255; 255; 255 286 | Max Intensity: 4096 287 | Min Color: 0; 0; 0 288 | Min Intensity: 0 289 | Name: scan_matched_points2 290 | Position Transformer: XYZ 291 | Queue Size: 10 292 | Selectable: true 293 | Size (Pixels): 3 294 | Size (m): 0.009999999776482582 295 | Style: Points 296 | Topic: /scan_matched_points2 297 | Unreliable: true 298 | Use Fixed Frame: true 299 | Use rainbow: true 300 | Value: true 301 | - Class: rviz_default_plugins/MarkerArray 302 | Enabled: false 303 | Name: Trajectories 304 | Namespaces: 305 | {} 306 | Queue Size: 10 307 | Topic: /trajectory_node_list 308 | Unreliable: true 309 | Value: false 310 | - Class: rviz_default_plugins/MarkerArray 311 | Enabled: false 312 | Name: Constraints 313 | Namespaces: 314 | {} 315 | Queue Size: 10 316 | Topic: /constraint_list 317 | Unreliable: true 318 | Value: false 319 | - Class: rviz_default_plugins/MarkerArray 320 | Enabled: false 321 | Name: Landmark Poses 322 | Namespaces: 323 | {} 324 | Queue Size: 10 325 | Topic: /landmark_poses_list 326 | Unreliable: true 327 | Value: false 328 | Enabled: true 329 | Name: Cartographer 330 | Enabled: true 331 | Global Options: 332 | Background Color: 48; 48; 48 333 | Fixed Frame: map 334 | Frame Rate: 30 335 | Name: root 336 | Tools: 337 | - Class: rviz_default_plugins/MoveCamera 338 | - Class: rviz_default_plugins/Select 339 | - Class: rviz_default_plugins/FocusCamera 340 | - Class: rviz_default_plugins/Measure 341 | Line color: 128; 128; 0 342 | - Class: rviz_default_plugins/SetGoal 343 | Topic: /move_base_simple/goal 344 | - Class: rviz_default_plugins/PublishPoint 345 | Single click: true 346 | Topic: /clicked_point 347 | - Class: rviz_default_plugins/SetInitialPose 348 | Topic: initialpose 349 | Transformation: 350 | Current: 351 | Class: rviz_default_plugins/TF 352 | Value: true 353 | Views: 354 | Current: 355 | Class: rviz_default_plugins/Orbit 356 | Distance: 8.099926948547363 357 | Enable Stereo Rendering: 358 | Stereo Eye Separation: 0.05999999865889549 359 | Stereo Focal Distance: 1 360 | Swap Stereo Eyes: false 361 | Value: false 362 | Focal Point: 363 | X: 1.6417149305343628 364 | Y: 0.5477426648139954 365 | Z: 0.802143394947052 366 | Focal Shape Fixed Size: true 367 | Focal Shape Size: 0.05000000074505806 368 | Invert Z Axis: false 369 | Name: Current View 370 | Near Clip Distance: 0.009999999776482582 371 | Pitch: 1.5697963237762451 372 | Target Frame: 373 | Value: Orbit (rviz) 374 | Yaw: 3.145416498184204 375 | Saved: ~ 376 | Window Geometry: 377 | Displays: 378 | collapsed: false 379 | Height: 936 380 | Hide Left Dock: false 381 | Hide Right Dock: true 382 | QMainWindow State: 000000ff00000000fd0000000400000000000001560000034efc0200000008fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005c00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000003d0000034e000000c900fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261000000010000010f000002f4fc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073000000003d000002f4000000a400fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000004420000003efc0100000002fb0000000800540069006d00650100000000000004420000000000000000fb0000000800540069006d00650100000000000004500000000000000000000004510000034e00000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 383 | Selection: 384 | collapsed: false 385 | Tool Properties: 386 | collapsed: false 387 | Views: 388 | collapsed: true 389 | Width: 1453 390 | X: 193 391 | Y: 27 392 | -------------------------------------------------------------------------------- /mecanum_bot_bringup/rviz/mecanum_bot_navigation2.rviz: -------------------------------------------------------------------------------- 1 | Panels: 2 | - Class: rviz_common/Displays 3 | Help Height: 0 4 | Name: Displays 5 | Property Tree Widget: 6 | Expanded: 7 | - /Global Options1 8 | - /TF1/Frames1 9 | - /TF1/Tree1 10 | Splitter Ratio: 0.5833333134651184 11 | Tree Height: 606 12 | - Class: rviz_common/Selection 13 | Name: Selection 14 | - Class: rviz_common/Tool Properties 15 | Expanded: 16 | - /Publish Point1 17 | Name: Tool Properties 18 | Splitter Ratio: 0.5886790156364441 19 | - Class: rviz_common/Views 20 | Expanded: 21 | - /Current View1 22 | Name: Views 23 | Splitter Ratio: 0.5 24 | - Class: nav2_rviz_plugins/Navigation 2 25 | Name: Navigation 2 26 | Visualization Manager: 27 | Class: "" 28 | Displays: 29 | - Alpha: 0.5 30 | Cell Size: 1 31 | Class: rviz_default_plugins/Grid 32 | Color: 160; 160; 164 33 | Enabled: true 34 | Line Style: 35 | Line Width: 0.029999999329447746 36 | Value: Lines 37 | Name: Grid 38 | Normal Cell Count: 0 39 | Offset: 40 | X: 0 41 | Y: 0 42 | Z: 0 43 | Plane: XY 44 | Plane Cell Count: 10 45 | Reference Frame: 46 | Value: true 47 | - Alpha: 1 48 | Class: rviz_default_plugins/RobotModel 49 | Collision Enabled: false 50 | Description File: "" 51 | Description Source: Topic 52 | Description Topic: 53 | Depth: 5 54 | Durability Policy: Volatile 55 | History Policy: Keep Last 56 | Reliability Policy: Reliable 57 | Value: /robot_description 58 | Enabled: false 59 | Links: 60 | All Links Enabled: true 61 | Expand Joint Details: false 62 | Expand Link Details: false 63 | Expand Tree: false 64 | Link Tree Style: "" 65 | Name: RobotModel 66 | TF Prefix: "" 67 | Update Interval: 0 68 | Value: false 69 | Visual Enabled: true 70 | - Class: rviz_default_plugins/TF 71 | Enabled: true 72 | Frame Timeout: 15 73 | Frames: 74 | All Enabled: false 75 | base_footprint: 76 | Value: true 77 | base_link: 78 | Value: true 79 | base_scan: 80 | Value: true 81 | camera_depth_frame: 82 | Value: true 83 | camera_depth_optical_frame: 84 | Value: true 85 | camera_link: 86 | Value: true 87 | camera_rgb_frame: 88 | Value: true 89 | camera_rgb_optical_frame: 90 | Value: true 91 | caster_back_left_link: 92 | Value: true 93 | caster_back_right_link: 94 | Value: true 95 | imu_link: 96 | Value: true 97 | map: 98 | Value: true 99 | odom: 100 | Value: true 101 | wheel_left_link: 102 | Value: true 103 | wheel_right_link: 104 | Value: true 105 | Marker Scale: 1 106 | Name: TF 107 | Show Arrows: true 108 | Show Axes: true 109 | Show Names: false 110 | Tree: 111 | map: 112 | odom: 113 | base_footprint: 114 | base_link: 115 | base_scan: 116 | {} 117 | camera_link: 118 | camera_depth_frame: 119 | camera_depth_optical_frame: 120 | {} 121 | camera_rgb_frame: 122 | camera_rgb_optical_frame: 123 | {} 124 | caster_back_left_link: 125 | {} 126 | caster_back_right_link: 127 | {} 128 | imu_link: 129 | {} 130 | wheel_left_link: 131 | {} 132 | wheel_right_link: 133 | {} 134 | Update Interval: 0 135 | Value: true 136 | - Alpha: 1 137 | Autocompute Intensity Bounds: true 138 | Autocompute Value Bounds: 139 | Max Value: 10 140 | Min Value: -10 141 | Value: true 142 | Axis: Z 143 | Channel Name: intensity 144 | Class: rviz_default_plugins/LaserScan 145 | Color: 255; 255; 255 146 | Color Transformer: Intensity 147 | Decay Time: 0 148 | Enabled: true 149 | Invert Rainbow: false 150 | Max Color: 255; 255; 255 151 | Max Intensity: 0 152 | Min Color: 0; 0; 0 153 | Min Intensity: 0 154 | Name: LaserScan 155 | Position Transformer: XYZ 156 | Selectable: true 157 | Size (Pixels): 3 158 | Size (m): 0.009999999776482582 159 | Style: Flat Squares 160 | Topic: 161 | Depth: 5 162 | Durability Policy: Volatile 163 | History Policy: Keep Last 164 | Reliability Policy: Best Effort 165 | Value: /scan 166 | Use Fixed Frame: true 167 | Use rainbow: true 168 | Value: true 169 | - Alpha: 1 170 | Autocompute Intensity Bounds: true 171 | Autocompute Value Bounds: 172 | Max Value: 10 173 | Min Value: -10 174 | Value: true 175 | Axis: Z 176 | Channel Name: intensity 177 | Class: rviz_default_plugins/PointCloud2 178 | Color: 255; 255; 255 179 | Color Transformer: "" 180 | Decay Time: 0 181 | Enabled: true 182 | Invert Rainbow: false 183 | Max Color: 255; 255; 255 184 | Max Intensity: 4096 185 | Min Color: 0; 0; 0 186 | Min Intensity: 0 187 | Name: Bumper Hit 188 | Position Transformer: "" 189 | Selectable: true 190 | Size (Pixels): 3 191 | Size (m): 0.07999999821186066 192 | Style: Spheres 193 | Topic: 194 | Depth: 5 195 | Durability Policy: Volatile 196 | History Policy: Keep Last 197 | Reliability Policy: Best Effort 198 | Value: /mobile_base/sensors/bumper_pointcloud 199 | Use Fixed Frame: true 200 | Use rainbow: true 201 | Value: true 202 | - Alpha: 1 203 | Class: rviz_default_plugins/Map 204 | Color Scheme: map 205 | Draw Behind: true 206 | Enabled: true 207 | Name: Map 208 | Topic: 209 | Depth: 1 210 | Durability Policy: Transient Local 211 | History Policy: Keep Last 212 | Reliability Policy: Reliable 213 | Value: /map 214 | Use Timestamp: false 215 | Value: true 216 | - Alpha: 1 217 | Class: nav2_rviz_plugins/ParticleCloud 218 | Color: 0; 180; 0 219 | Enabled: true 220 | Max Arrow Length: 0.3 221 | Min Arrow Length: 0.02 222 | Name: Amcl Particle Swarm 223 | Shape: Arrow (Flat) 224 | Topic: 225 | Depth: 5 226 | Durability Policy: Volatile 227 | History Policy: Keep Last 228 | Reliability Policy: Best Effort 229 | Value: /particle_cloud 230 | Value: true 231 | - Class: rviz_common/Group 232 | Displays: 233 | - Alpha: 0.3 234 | Class: rviz_default_plugins/Map 235 | Color Scheme: costmap 236 | Draw Behind: false 237 | Enabled: true 238 | Name: Global Costmap 239 | Topic: 240 | Depth: 1 241 | Durability Policy: Transient Local 242 | History Policy: Keep Last 243 | Reliability Policy: Reliable 244 | Value: /global_costmap/costmap 245 | Use Timestamp: false 246 | Value: true 247 | - Alpha: 0.3 248 | Class: rviz_default_plugins/Map 249 | Color Scheme: costmap 250 | Draw Behind: false 251 | Enabled: true 252 | Name: Downsampled Costmap 253 | Topic: 254 | Depth: 1 255 | Durability Policy: Transient Local 256 | History Policy: Keep Last 257 | Reliability Policy: Reliable 258 | Value: /downsampled_costmap 259 | Use Timestamp: false 260 | Value: true 261 | - Alpha: 1 262 | Buffer Length: 1 263 | Class: rviz_default_plugins/Path 264 | Color: 255; 0; 0 265 | Enabled: true 266 | Head Diameter: 0.019999999552965164 267 | Head Length: 0.019999999552965164 268 | Length: 0.30000001192092896 269 | Line Style: Lines 270 | Line Width: 0.029999999329447746 271 | Name: Path 272 | Offset: 273 | X: 0 274 | Y: 0 275 | Z: 0 276 | Pose Color: 255; 85; 255 277 | Pose Style: Arrows 278 | Radius: 0.029999999329447746 279 | Shaft Diameter: 0.004999999888241291 280 | Shaft Length: 0.019999999552965164 281 | Topic: 282 | Depth: 5 283 | Durability Policy: Volatile 284 | History Policy: Keep Last 285 | Reliability Policy: Reliable 286 | Value: /plan 287 | Value: true 288 | - Alpha: 1 289 | Autocompute Intensity Bounds: true 290 | Autocompute Value Bounds: 291 | Max Value: 10 292 | Min Value: -10 293 | Value: true 294 | Axis: Z 295 | Channel Name: intensity 296 | Class: rviz_default_plugins/PointCloud2 297 | Color: 125; 125; 125 298 | Color Transformer: FlatColor 299 | Decay Time: 0 300 | Enabled: true 301 | Invert Rainbow: false 302 | Max Color: 255; 255; 255 303 | Max Intensity: 4096 304 | Min Color: 0; 0; 0 305 | Min Intensity: 0 306 | Name: VoxelGrid 307 | Position Transformer: XYZ 308 | Selectable: true 309 | Size (Pixels): 3 310 | Size (m): 0.05000000074505806 311 | Style: Boxes 312 | Topic: 313 | Depth: 5 314 | Durability Policy: Volatile 315 | History Policy: Keep Last 316 | Reliability Policy: Reliable 317 | Value: /global_costmap/voxel_marked_cloud 318 | Use Fixed Frame: true 319 | Use rainbow: true 320 | Value: true 321 | - Alpha: 1 322 | Class: rviz_default_plugins/Polygon 323 | Color: 25; 255; 0 324 | Enabled: false 325 | Name: Polygon 326 | Topic: 327 | Depth: 5 328 | Durability Policy: Volatile 329 | History Policy: Keep Last 330 | Reliability Policy: Reliable 331 | Value: /global_costmap/published_footprint 332 | Value: false 333 | Enabled: true 334 | Name: Global Planner 335 | - Class: rviz_common/Group 336 | Displays: 337 | - Alpha: 0.699999988079071 338 | Class: rviz_default_plugins/Map 339 | Color Scheme: costmap 340 | Draw Behind: false 341 | Enabled: true 342 | Name: Local Costmap 343 | Topic: 344 | Depth: 1 345 | Durability Policy: Transient Local 346 | History Policy: Keep Last 347 | Reliability Policy: Reliable 348 | Value: /local_costmap/costmap 349 | Use Timestamp: false 350 | Value: true 351 | - Alpha: 1 352 | Buffer Length: 1 353 | Class: rviz_default_plugins/Path 354 | Color: 0; 12; 255 355 | Enabled: true 356 | Head Diameter: 0.30000001192092896 357 | Head Length: 0.20000000298023224 358 | Length: 0.30000001192092896 359 | Line Style: Lines 360 | Line Width: 0.029999999329447746 361 | Name: Local Plan 362 | Offset: 363 | X: 0 364 | Y: 0 365 | Z: 0 366 | Pose Color: 255; 85; 255 367 | Pose Style: None 368 | Radius: 0.029999999329447746 369 | Shaft Diameter: 0.10000000149011612 370 | Shaft Length: 0.10000000149011612 371 | Topic: 372 | Depth: 5 373 | Durability Policy: Volatile 374 | History Policy: Keep Last 375 | Reliability Policy: Reliable 376 | Value: /local_plan 377 | Value: true 378 | - Class: rviz_default_plugins/MarkerArray 379 | Enabled: false 380 | Name: Trajectories 381 | Namespaces: 382 | {} 383 | Topic: 384 | Depth: 5 385 | Durability Policy: Volatile 386 | History Policy: Keep Last 387 | Reliability Policy: Reliable 388 | Value: /marker 389 | Value: false 390 | - Alpha: 1 391 | Class: rviz_default_plugins/Polygon 392 | Color: 25; 255; 0 393 | Enabled: true 394 | Name: Polygon 395 | Topic: 396 | Depth: 5 397 | Durability Policy: Volatile 398 | History Policy: Keep Last 399 | Reliability Policy: Reliable 400 | Value: /local_costmap/published_footprint 401 | Value: true 402 | - Alpha: 1 403 | Autocompute Intensity Bounds: true 404 | Autocompute Value Bounds: 405 | Max Value: 10 406 | Min Value: -10 407 | Value: true 408 | Axis: Z 409 | Channel Name: intensity 410 | Class: rviz_default_plugins/PointCloud2 411 | Color: 255; 255; 255 412 | Color Transformer: RGB8 413 | Decay Time: 0 414 | Enabled: true 415 | Invert Rainbow: false 416 | Max Color: 255; 255; 255 417 | Max Intensity: 4096 418 | Min Color: 0; 0; 0 419 | Min Intensity: 0 420 | Name: VoxelGrid 421 | Position Transformer: XYZ 422 | Selectable: true 423 | Size (Pixels): 3 424 | Size (m): 0.009999999776482582 425 | Style: Flat Squares 426 | Topic: 427 | Depth: 5 428 | Durability Policy: Volatile 429 | History Policy: Keep Last 430 | Reliability Policy: Reliable 431 | Value: /local_costmap/voxel_marked_cloud 432 | Use Fixed Frame: true 433 | Use rainbow: true 434 | Value: true 435 | Enabled: true 436 | Name: Controller 437 | - Class: rviz_common/Group 438 | Displays: 439 | - Class: rviz_default_plugins/Image 440 | Enabled: true 441 | Max Value: 1 442 | Median window: 5 443 | Min Value: 0 444 | Name: RealsenseCamera 445 | Normalize Range: true 446 | Topic: 447 | Depth: 5 448 | Durability Policy: Volatile 449 | History Policy: Keep Last 450 | Reliability Policy: Reliable 451 | Value: /intel_realsense_r200_depth/image_raw 452 | Value: true 453 | - Alpha: 1 454 | Autocompute Intensity Bounds: true 455 | Autocompute Value Bounds: 456 | Max Value: 10 457 | Min Value: -10 458 | Value: true 459 | Axis: Z 460 | Channel Name: intensity 461 | Class: rviz_default_plugins/PointCloud2 462 | Color: 255; 255; 255 463 | Color Transformer: RGB8 464 | Decay Time: 0 465 | Enabled: true 466 | Invert Rainbow: false 467 | Max Color: 255; 255; 255 468 | Max Intensity: 4096 469 | Min Color: 0; 0; 0 470 | Min Intensity: 0 471 | Name: RealsenseDepthImage 472 | Position Transformer: XYZ 473 | Selectable: true 474 | Size (Pixels): 3 475 | Size (m): 0.009999999776482582 476 | Style: Flat Squares 477 | Topic: 478 | Depth: 5 479 | Durability Policy: Volatile 480 | History Policy: Keep Last 481 | Reliability Policy: Reliable 482 | Value: /intel_realsense_r200_depth/points 483 | Use Fixed Frame: true 484 | Use rainbow: true 485 | Value: true 486 | Enabled: false 487 | Name: Realsense 488 | - Class: rviz_default_plugins/MarkerArray 489 | Enabled: true 490 | Name: MarkerArray 491 | Namespaces: 492 | {} 493 | Topic: 494 | Depth: 5 495 | Durability Policy: Volatile 496 | History Policy: Keep Last 497 | Reliability Policy: Reliable 498 | Value: /waypoints 499 | Value: true 500 | Enabled: true 501 | Global Options: 502 | Background Color: 48; 48; 48 503 | Fixed Frame: map 504 | Frame Rate: 30 505 | Name: root 506 | Tools: 507 | - Class: rviz_default_plugins/MoveCamera 508 | - Class: rviz_default_plugins/Select 509 | - Class: rviz_default_plugins/FocusCamera 510 | - Class: rviz_default_plugins/Measure 511 | Line color: 128; 128; 0 512 | - Class: rviz_default_plugins/SetInitialPose 513 | Topic: 514 | Depth: 5 515 | Durability Policy: Volatile 516 | History Policy: Keep Last 517 | Reliability Policy: Reliable 518 | Value: /initialpose 519 | - Class: rviz_default_plugins/PublishPoint 520 | Single click: true 521 | Topic: 522 | Depth: 5 523 | Durability Policy: Volatile 524 | History Policy: Keep Last 525 | Reliability Policy: Reliable 526 | Value: /clicked_point 527 | - Class: nav2_rviz_plugins/GoalTool 528 | Transformation: 529 | Current: 530 | Class: rviz_default_plugins/TF 531 | Value: true 532 | Views: 533 | Current: 534 | Angle: -1.6150002479553223 535 | Class: rviz_default_plugins/TopDownOrtho 536 | Enable Stereo Rendering: 537 | Stereo Eye Separation: 0.05999999865889549 538 | Stereo Focal Distance: 1 539 | Swap Stereo Eyes: false 540 | Value: false 541 | Invert Z Axis: false 542 | Name: Current View 543 | Near Clip Distance: 0.009999999776482582 544 | Scale: 127.88431549072266 545 | Target Frame: 546 | Value: TopDownOrtho (rviz_default_plugins) 547 | X: -0.044467076659202576 548 | Y: -0.38726311922073364 549 | Saved: ~ 550 | Window Geometry: 551 | Displays: 552 | collapsed: false 553 | Height: 932 554 | Hide Left Dock: false 555 | Hide Right Dock: true 556 | Navigation 2: 557 | collapsed: false 558 | QMainWindow State: 000000ff00000000fd00000004000000000000016a0000034afc020000000afb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005c00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000003d0000029b000000c900fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261fb00000018004e0061007600690067006100740069006f006e0020003201000002de000000a90000008100fffffffb0000001e005200650061006c00730065006e0073006500430061006d00650072006100000002c6000000c10000002800ffffff000000010000010f0000034afc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073000000003d0000034a000000a400fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000004420000003efc0100000002fb0000000800540069006d00650100000000000004420000000000000000fb0000000800540069006d00650100000000000004500000000000000000000004990000034a00000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 559 | RealsenseCamera: 560 | collapsed: false 561 | Selection: 562 | collapsed: false 563 | Tool Properties: 564 | collapsed: false 565 | Views: 566 | collapsed: true 567 | Width: 1545 568 | X: 696 569 | Y: 229 570 | 571 | -------------------------------------------------------------------------------- /mecanum_bot_controller/mecanum_bot_controller/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yadunund/mecanum_bot/a52e4d82334a6b7e68430234b9a52073ac2e383f/mecanum_bot_controller/mecanum_bot_controller/__init__.py -------------------------------------------------------------------------------- /mecanum_bot_controller/mecanum_bot_controller/mecanum_bot_controller.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python3 2 | 3 | import sys 4 | import serial 5 | import threading 6 | from time import sleep 7 | import numpy as np 8 | 9 | import tf2_ros 10 | 11 | import rclpy 12 | from rclpy.node import Node 13 | from rclpy.qos import qos_profile_system_default 14 | from rclpy.qos import qos_profile_services_default 15 | 16 | from geometry_msgs.msg import TransformStamped 17 | from geometry_msgs.msg import Twist 18 | from nav_msgs.msg import Odometry 19 | 20 | from mecanum_bot_controller.robot import compute_motor_velocities 21 | from mecanum_bot_controller.robot import Robot 22 | 23 | class BaseController(Node): 24 | def __init__(self): 25 | super().__init__('base_controller_node') 26 | self.get_logger().info('Hello I am base controller node') 27 | 28 | self.axes = [] 29 | self.buttons = [] 30 | 31 | self.arduino_port = '/dev/ttyUSB0' 32 | if (self.declare_parameter('arduino_port').value): 33 | self.arduino_port = self.get_parameter('arduino_port').value 34 | self.get_logger().info(f"Setting arduino_port: {self.arduino_port}") 35 | 36 | self.create_subscription( 37 | Twist, 38 | '/cmd_vel', 39 | self.cmd_vel_cb, 40 | qos_profile=qos_profile_system_default) 41 | 42 | self.odom_pub = self.create_publisher( 43 | Odometry, 44 | "/odom", 45 | qos_profile=qos_profile_services_default) 46 | 47 | self.odom_broadcaster = tf2_ros.TransformBroadcaster(self, qos_profile_services_default) 48 | 49 | self.serial_connected = False 50 | try: 51 | self.ser = serial.Serial(self.arduino_port, 115200) 52 | self.serial_connected = True 53 | except: 54 | print(f"Unable to open connection on serial port:{self.arduino_port}") 55 | 56 | wheel_base = 0.3 57 | if (self.declare_parameter('wheel_base').value): 58 | self.wheel_base = self.get_parameter('wheel_base').value 59 | self.get_logger().info(f"Setting wheel base: {wheel_base}") 60 | 61 | track_width = 0.3 62 | if (self.declare_parameter('track_width').value): 63 | self.wheel_base = self.get_parameter('track_width').value 64 | self.get_logger().info(f"Setting track width: {track_width}") 65 | 66 | wheel_radius = 0.05 67 | if (self.declare_parameter('wheel_radius').value): 68 | self.wheel_base = self.get_parameter('wheel_radius').value 69 | self.get_logger().info(f"Setting wheel radius: {wheel_radius}") 70 | 71 | max_v = 0.8 72 | max_w = 1.0 73 | 74 | self.robot = Robot(wheel_base, track_width, wheel_radius, max_v, max_w) 75 | 76 | self.desired_x = 0.0 77 | self.desired_y = 0.0 78 | self.desired_yaw = 0.0 79 | 80 | # book keeping velocities and positions 81 | self.vx = 0.0 82 | self.vy = 0.0 83 | self.vyaw = 0.0 84 | 85 | self.x = 0.0 86 | self.y = 0.0 87 | self.yaw = 0.0 88 | 89 | self.last_odom_publish_time = 0.0 90 | 91 | self._lock = threading.Lock() 92 | self.thread = threading.Thread(target=self.send_velocities) 93 | self.thread.start() 94 | 95 | def euler_to_quaternion(self, roll, pitch, yaw): 96 | qx = np.sin(roll/2) * np.cos(pitch/2) * np.cos(yaw/2) - np.cos(roll/2) * np.sin(pitch/2) * np.sin(yaw/2) 97 | qy = np.cos(roll/2) * np.sin(pitch/2) * np.cos(yaw/2) + np.sin(roll/2) * np.cos(pitch/2) * np.sin(yaw/2) 98 | qz = np.cos(roll/2) * np.cos(pitch/2) * np.sin(yaw/2) - np.sin(roll/2) * np.sin(pitch/2) * np.cos(yaw/2) 99 | qw = np.cos(roll/2) * np.cos(pitch/2) * np.cos(yaw/2) + np.sin(roll/2) * np.sin(pitch/2) * np.sin(yaw/2) 100 | 101 | return [qx, qy, qz, qw] 102 | 103 | def cmd_vel_cb(self, msg): 104 | with self._lock: 105 | self.desired_x = msg.linear.x 106 | self.desired_y = msg.linear.y 107 | self.desired_yaw = msg.angular.z 108 | 109 | self.vx = msg.linear.x * self.robot.max_v 110 | self.vy = msg.linear.y * self.robot.max_v 111 | self.vyaw = msg.angular.z * self.robot.max_w 112 | 113 | def send_velocities(self): 114 | while True: 115 | # print out current location 116 | self.get_logger().info(f"Current pose: [{self.x},{self.y},{self.yaw}]") 117 | input = [self.desired_x, self.desired_y, self.desired_yaw] 118 | result = compute_motor_velocities(input, self.robot) 119 | self.get_logger().info(f"Computed wheel velocities: {result}") 120 | if (self.serial_connected): 121 | try: 122 | msg = "[" 123 | for i in range(len(result)): 124 | msg = msg + str(int(result[i])) 125 | if (i != (len(result) - 1)): 126 | msg = msg + "," 127 | msg = msg + "]" 128 | encoded_data = msg.encode() 129 | self.get_logger().info(f"Sending encoded data: {encoded_data}") 130 | self.ser.write(encoded_data) 131 | 132 | # publish odometry 133 | dt = 0.025 134 | dx = (self.vx * np.cos(self.yaw) - self.vy * np.sin(self.yaw)) * dt 135 | dy = (self.vx * np.sin(self.yaw) + self.vy * np.cos(self.yaw)) * dt 136 | # Here we add some tolerance to the rotation 137 | dth = self.vyaw * dt 138 | self.x = self.x + dx 139 | self.y = self.y + dy 140 | self.yaw = self.yaw + dth 141 | quat = self.euler_to_quaternion(0, 0, self.yaw) 142 | current_time = self.get_clock().now().to_msg() 143 | 144 | t = TransformStamped() 145 | t.header.stamp = current_time 146 | t.header.frame_id = "odom" 147 | t.child_frame_id = "base_link" 148 | t.transform.translation.x = self.x 149 | t.transform.translation.y = self.y 150 | t.transform.translation.z = 0.0 151 | t.transform.rotation.x = quat[0] 152 | t.transform.rotation.y = quat[1] 153 | t.transform.rotation.z = quat[2] 154 | t.transform.rotation.w = quat[3] 155 | self.odom_broadcaster.sendTransform(t) 156 | 157 | odom = Odometry() 158 | odom.header.frame_id = "odom" 159 | odom.header.stamp = current_time 160 | # set the position 161 | odom.pose.pose.position.x = self.x 162 | odom.pose.pose.position.y = self.y 163 | odom.pose.pose.position.z = 0.0 164 | odom.pose.pose.orientation.x = quat[0] 165 | odom.pose.pose.orientation.y = quat[1] 166 | odom.pose.pose.orientation.z = quat[2] 167 | odom.pose.pose.orientation.w = quat[3] 168 | # set the velocity 169 | odom.child_frame_id = "base_link" 170 | odom.twist.twist.linear.x = self.vx * self.robot.max_v 171 | odom.twist.twist.linear.y = self.vy * self.robot.max_v 172 | odom.twist.twist.angular.z = self.vyaw * self.robot.max_w 173 | self.odom_pub.publish(odom) 174 | 175 | except: 176 | self.get_logger().error(f"Unable to write wheel velocities to serial port") 177 | self.serial_connected = False 178 | sleep(0.025) 179 | 180 | 181 | def main(argv=sys.argv): 182 | rclpy.init(args=argv) 183 | 184 | n = BaseController() 185 | try: 186 | rclpy.spin(n) 187 | except KeyboardInterrupt: 188 | pass 189 | -------------------------------------------------------------------------------- /mecanum_bot_controller/mecanum_bot_controller/robot.py: -------------------------------------------------------------------------------- 1 | import math 2 | import numpy as np 3 | 4 | class Robot: 5 | def __init__(self, wheel_base, track_width, wheel_radius, max_v, max_w): 6 | # w1<--track width--> w2 7 | # ^ | 8 | # | | 9 | # wb | 10 | # | | 11 | # v | 12 | # w3 ---------------- w4 13 | self.wheel_base = wheel_base 14 | self.track_width = track_width 15 | self.wheel_radius = wheel_radius 16 | self.max_v = max_v 17 | self.max_w = max_w 18 | wb = self.wheel_base/2.0 19 | tw = self.track_width/2.0 20 | r = self.wheel_radius 21 | T = np.array([[1,-1,-(tw+wb)], 22 | [1,1,(tw+wb)], 23 | [1,1,-(tw+wb)], 24 | [1,-1,(tw+wb)]]) 25 | self.inverse_transform_matrix=(1/r)*T 26 | self.max_wheel_speed = max(abs(np.matmul(self.inverse_transform_matrix, np.array([[1.0],[1.0],[0.0]])))) 27 | 28 | def compute_motor_velocities(input,robot,max_value=255): 29 | motor_velocities = np.zeros(4) 30 | if (len(input)<3): 31 | return motor_velocities 32 | robot_velocity = np.array([[input[0]],[input[1]],[input[2]]]) 33 | raw_velocities = np.matmul(robot.inverse_transform_matrix,robot_velocity) 34 | 35 | if (max(raw_velocities) == 0.0): 36 | return motor_velocities 37 | sum =0 38 | for i in raw_velocities: 39 | sum = sum + abs(i) 40 | for i in range(len(raw_velocities)): 41 | motor_velocities[i] = raw_velocities[i]*max_value/robot.max_wheel_speed 42 | 43 | return motor_velocities 44 | -------------------------------------------------------------------------------- /mecanum_bot_controller/package.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | mecanum_bot_controller 5 | 0.0.0 6 | A base controller for the mecanum bot 7 | yadu 8 | Apache License 2.0 9 | 10 | rclpy 11 | sensor_msgs 12 | 13 | 14 | ament_python 15 | 16 | 17 | -------------------------------------------------------------------------------- /mecanum_bot_controller/resource/mecanum_bot_controller: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yadunund/mecanum_bot/a52e4d82334a6b7e68430234b9a52073ac2e383f/mecanum_bot_controller/resource/mecanum_bot_controller -------------------------------------------------------------------------------- /mecanum_bot_controller/setup.cfg: -------------------------------------------------------------------------------- 1 | [develop] 2 | script-dir=$base/lib/mecanum_bot_controller 3 | [install] 4 | install-scripts=$base/lib/mecanum_bot_controller 5 | -------------------------------------------------------------------------------- /mecanum_bot_controller/setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup 2 | 3 | package_name = 'mecanum_bot_controller' 4 | 5 | setup( 6 | name=package_name, 7 | version='0.0.0', 8 | packages=[package_name], 9 | data_files=[ 10 | ('share/ament_index/resource_index/packages', 11 | ['resource/' + package_name]), 12 | ('share/' + package_name, ['package.xml']), 13 | ], 14 | install_requires=['setuptools'], 15 | zip_safe=True, 16 | maintainer='yadu', 17 | maintainer_email='yadunund@gmail.com', 18 | description='A base controller for the mecanum bot', 19 | license='Apache License 2.0', 20 | tests_require=['pytest'], 21 | entry_points={ 22 | 'console_scripts': [ 23 | 'base_controller = mecanum_bot_controller.mecanum_bot_controller:main' 24 | ], 25 | }, 26 | ) 27 | -------------------------------------------------------------------------------- /mecanum_bot_controller/test/test_copyright.py: -------------------------------------------------------------------------------- 1 | # Copyright 2015 Open Source Robotics Foundation, Inc. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | from ament_copyright.main import main 16 | import pytest 17 | 18 | 19 | @pytest.mark.copyright 20 | @pytest.mark.linter 21 | def test_copyright(): 22 | rc = main(argv=['.', 'test']) 23 | assert rc == 0, 'Found errors' 24 | -------------------------------------------------------------------------------- /mecanum_bot_controller/test/test_flake8.py: -------------------------------------------------------------------------------- 1 | # Copyright 2017 Open Source Robotics Foundation, Inc. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | from ament_flake8.main import main_with_errors 16 | import pytest 17 | 18 | 19 | @pytest.mark.flake8 20 | @pytest.mark.linter 21 | def test_flake8(): 22 | rc, errors = main_with_errors(argv=[]) 23 | assert rc == 0, \ 24 | 'Found %d code style errors / warnings:\n' % len(errors) + \ 25 | '\n'.join(errors) 26 | -------------------------------------------------------------------------------- /mecanum_bot_controller/test/test_pep257.py: -------------------------------------------------------------------------------- 1 | # Copyright 2015 Open Source Robotics Foundation, Inc. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | from ament_pep257.main import main 16 | import pytest 17 | 18 | 19 | @pytest.mark.linter 20 | @pytest.mark.pep257 21 | def test_pep257(): 22 | rc = main(argv=['.', 'test']) 23 | assert rc == 0, 'Found code style errors / warnings' 24 | -------------------------------------------------------------------------------- /mecanum_bot_description/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.8) 2 | project(mecanum_bot_description) 3 | 4 | find_package(ament_cmake REQUIRED) 5 | 6 | install( 7 | DIRECTORY launch mecanum_bot rviz worlds 8 | DESTINATION share/${PROJECT_NAME} 9 | ) 10 | 11 | ament_environment_hooks("mecanum_bot_description_gazebo_paths.dsv.in") 12 | 13 | ament_package() 14 | -------------------------------------------------------------------------------- /mecanum_bot_description/launch/view_robot.launch.py: -------------------------------------------------------------------------------- 1 | # Copyright 2022 Open Source Robotics Foundation, Inc. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | import os 16 | 17 | from ament_index_python.packages import get_package_share_directory 18 | from launch import LaunchDescription 19 | from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription 20 | from launch.conditions import IfCondition 21 | from launch.launch_description_sources import PythonLaunchDescriptionSource 22 | from launch.substitutions import LaunchConfiguration, PathJoinSubstitution 23 | from launch_ros.actions import Node 24 | 25 | 26 | def generate_launch_description(): 27 | 28 | pkg_ros_gz_sim_demos = get_package_share_directory('mecanum_bot_description') 29 | pkg_ros_gz_sim = get_package_share_directory('ros_gz_sim') 30 | 31 | sdf_file = os.path.join(pkg_ros_gz_sim_demos, 'mecanum_bot', 'model.sdf') 32 | rviz_file = os.path.join(pkg_ros_gz_sim_demos, 'rviz', 'view_robot.rviz') 33 | 34 | with open(sdf_file, 'r') as infp: 35 | robot_desc = infp.read() 36 | 37 | rviz_launch_arg = DeclareLaunchArgument( 38 | 'rviz', default_value='true', 39 | description='Open RViz.' 40 | ) 41 | 42 | gazebo = IncludeLaunchDescription( 43 | PythonLaunchDescriptionSource( 44 | os.path.join(pkg_ros_gz_sim, 'launch', 'gz_sim.launch.py'), 45 | ), 46 | launch_arguments={'gz_args': PathJoinSubstitution([ 47 | pkg_ros_gz_sim_demos, 48 | 'worlds', 49 | 'example_world.sdf' 50 | ])}.items(), 51 | ) 52 | 53 | # Bridge to forward tf and joint states to ros2 54 | gz_topic = '/model/mecanum_bot' 55 | joint_state_gz_topic = '/world/example_world' + gz_topic + '/joint_state' 56 | link_pose_gz_topic = gz_topic + '/pose' 57 | bridge = Node( 58 | package='ros_gz_bridge', 59 | executable='parameter_bridge', 60 | arguments=[ 61 | # Clock (Gazebo -> ROS2) 62 | '/clock@rosgraph_msgs/msg/Clock[gz.msgs.Clock', 63 | # Joint states (Gazebo -> ROS2) 64 | joint_state_gz_topic + '@sensor_msgs/msg/JointState[gz.msgs.Model', 65 | # Link poses (Gazebo -> ROS2) 66 | link_pose_gz_topic + '@tf2_msgs/msg/TFMessage[gz.msgs.Pose_V', 67 | link_pose_gz_topic + '_static@tf2_msgs/msg/TFMessage[gz.msgs.Pose_V', 68 | # Velocity and odometry (Gazebo -> ROS2) 69 | gz_topic + '/cmd_vel@geometry_msgs/msg/Twist@gz.msgs.Twist', 70 | gz_topic + '/odometry@nav_msgs/msg/Odometry@gz.msgs.Odometry', 71 | '/scan@sensor_msgs/msg/LaserScan@gz.msgs.LaserScan', 72 | '/rgbd_camera/image@sensor_msgs/msg/Image@gz.msgs.Image', 73 | '/rgbd_camera/camera_info@sensor_msgs/msg/CameraInfo@gz.msgs.CameraInfo', 74 | '/rgbd_camera/depth_image@sensor_msgs/msg/Image@gz.msgs.Image', 75 | ], 76 | remappings=[ 77 | (joint_state_gz_topic, 'joint_states'), 78 | (link_pose_gz_topic, '/tf'), 79 | (link_pose_gz_topic + '_static', '/tf_static'), 80 | (gz_topic + '/odometry', '/wheel_odom'),\ 81 | (gz_topic + '/cmd_vel', '/cmd_vel'), 82 | ('/rgbd_camera/image', '/oak/rgb/image_raw'), 83 | ('/rgbd_camera/camera_info', '/oak/rgb/camera_info'), 84 | ('/rgbd_camera/depth_image', '/oak/stereo/image_raw'), 85 | ], 86 | parameters=[{'qos_overrides./tf_static.publisher.durability': 'transient_local'}], 87 | output='screen' 88 | ) 89 | 90 | # Get the parser plugin convert sdf to urdf using robot_description topic 91 | robot_state_publisher = Node( 92 | package='robot_state_publisher', 93 | executable='robot_state_publisher', 94 | name='robot_state_publisher', 95 | output='both', 96 | parameters=[ 97 | {'use_sim_time': True}, 98 | {'robot_description': robot_desc}, 99 | ] 100 | ) 101 | 102 | # Launch rviz 103 | rviz = Node( 104 | package='rviz2', 105 | executable='rviz2', 106 | arguments=['-d', rviz_file], 107 | condition=IfCondition(LaunchConfiguration('rviz')), 108 | parameters=[ 109 | {'use_sim_time': True}, 110 | ] 111 | ) 112 | 113 | return LaunchDescription([ 114 | rviz_launch_arg, 115 | gazebo, 116 | bridge, 117 | robot_state_publisher, 118 | rviz 119 | ]) 120 | -------------------------------------------------------------------------------- /mecanum_bot_description/mecanum_bot/meshes/mecanum_bot_chassis.mtl: -------------------------------------------------------------------------------- 1 | newmtl 0.196078_0.439216_0.078431_0.000000_0.000000 2 | Ka 0.0000 0.0000 0.0000 3 | Kd 0.1961 0.4392 0.07843 4 | Ks 0.0000 0.0000 0.0000 5 | Tf 0.0000 0.0000 0.0000 6 | d 1 7 | Ns 0 8 | newmtl 0.231373_0.380392_0.705882_0.000000_0.000000 9 | Ka 0.0000 0.0000 0.0000 10 | Kd 0.2314 0.3804 0.7059 11 | Ks 0.0000 0.0000 0.0000 12 | Tf 0.0000 0.0000 0.0000 13 | d 1 14 | Ns 0 15 | newmtl 0.498039_0.498039_0.498039_0.000000_0.000000 16 | Ka 0.0000 0.0000 0.0000 17 | Kd 0.498 0.498 0.498 18 | Ks 0.0000 0.0000 0.0000 19 | Tf 0.0000 0.0000 0.0000 20 | d 1 21 | Ns 0 22 | newmtl 0.615686_0.811765_0.929412_0.000000_0.000000 23 | Ka 0.0000 0.0000 0.0000 24 | Kd 0.6157 0.8118 0.9294 25 | Ks 0.0000 0.0000 0.0000 26 | Tf 0.0000 0.0000 0.0000 27 | d 1 28 | Ns 0 29 | newmtl 0.647059_0.647059_0.647059_0.000000_0.000000 30 | Ka 0.0000 0.0000 0.0000 31 | Kd 0.6471 0.6471 0.6471 32 | Ks 0.0000 0.0000 0.0000 33 | Tf 0.0000 0.0000 0.0000 34 | d 1 35 | Ns 0 36 | newmtl 0.768627_0.886275_0.952941_0.000000_0.000000 37 | Ka 0.0000 0.0000 0.0000 38 | Kd 0.7686 0.8863 0.9529 39 | Ks 0.0000 0.0000 0.0000 40 | Tf 0.0000 0.0000 0.0000 41 | d 1 42 | Ns 0 43 | newmtl 0.901961_0.901961_0.901961_0.000000_0.000000 44 | Ka 0.0000 0.0000 0.0000 45 | Kd 0.902 0.902 0.902 46 | Ks 0.0000 0.0000 0.0000 47 | Tf 0.0000 0.0000 0.0000 48 | d 1 49 | Ns 0 50 | newmtl 0.917647_0.917647_0.917647_0.000000_0.000000 51 | Ka 0.0000 0.0000 0.0000 52 | Kd 0.9176 0.9176 0.9176 53 | Ks 0.0000 0.0000 0.0000 54 | Tf 0.0000 0.0000 0.0000 55 | d 1 56 | Ns 0 57 | newmtl 0.972549_0.529412_0.003922_0.000000_0.000000 58 | Ka 0.0000 0.0000 0.0000 59 | Kd 0.9725 0.5294 0.003922 60 | Ks 0.0000 0.0000 0.0000 61 | Tf 0.0000 0.0000 0.0000 62 | d 1 63 | Ns 0 64 | newmtl 0.980392_0.713725_0.003922_0.000000_0.000000 65 | Ka 0.0000 0.0000 0.0000 66 | Kd 0.9804 0.7137 0.003922 67 | Ks 0.0000 0.0000 0.0000 68 | Tf 0.0000 0.0000 0.0000 69 | d 1 70 | Ns 0 71 | -------------------------------------------------------------------------------- /mecanum_bot_description/mecanum_bot/meshes/mecanum_bot_wheel.mtl: -------------------------------------------------------------------------------- 1 | newmtl 0.231373_0.380392_0.705882_0.000000_0.000000 2 | Ka 0.0000 0.0000 0.0000 3 | Kd 0.2314 0.3804 0.7059 4 | Ks 0.0000 0.0000 0.0000 5 | Tf 0.0000 0.0000 0.0000 6 | d 1 7 | Ns 0 8 | newmtl 0.301961_0.301961_0.301961_0.000000_0.000000 9 | Ka 0.0000 0.0000 0.0000 10 | Kd 0.302 0.302 0.302 11 | Ks 0.0000 0.0000 0.0000 12 | Tf 0.0000 0.0000 0.0000 13 | d 1 14 | Ns 0 15 | newmtl 0.917647_0.917647_0.917647_0.000000_0.000000 16 | Ka 0.0000 0.0000 0.0000 17 | Kd 0.9176 0.9176 0.9176 18 | Ks 0.0000 0.0000 0.0000 19 | Tf 0.0000 0.0000 0.0000 20 | d 1 21 | Ns 0 22 | newmtl 0.980392_0.713725_0.003922_0.000000_0.000000 23 | Ka 0.0000 0.0000 0.0000 24 | Kd 0.9804 0.7137 0.003922 25 | Ks 0.0000 0.0000 0.0000 26 | Tf 0.0000 0.0000 0.0000 27 | d 1 28 | Ns 0 29 | -------------------------------------------------------------------------------- /mecanum_bot_description/mecanum_bot/meshes/ydlidar_x2l.mtl: -------------------------------------------------------------------------------- 1 | newmtl 0.000000_0.000000_0.000000_0.000000_0.000000 2 | Ka 0.0000 0.0000 0.0000 3 | Kd 0.0000 0.0000 0.0000 4 | Ks 0.0000 0.0000 0.0000 5 | Tf 0.0000 0.0000 0.0000 6 | d 1 7 | Ns 0 8 | newmtl 0.231373_0.380392_0.705882_0.000000_0.000000 9 | Ka 0.0000 0.0000 0.0000 10 | Kd 0.2314 0.3804 0.7059 11 | Ks 0.0000 0.0000 0.0000 12 | Tf 0.0000 0.0000 0.0000 13 | d 1 14 | Ns 0 15 | -------------------------------------------------------------------------------- /mecanum_bot_description/mecanum_bot/meshes/ydlidar_x2l.obj: -------------------------------------------------------------------------------- 1 | # File units = meters 2 | mtllib ydlidar_x2l.mtl 3 | g Part 1 4 | v 0.00650286 -0.0295428 0.0079 5 | v 0.0127016 -0.0274542 0.0079 6 | v 0.0183065 -0.0240818 0.0079 7 | v 0.0230554 -0.0195834 0.0079 8 | v 0.0267262 -0.0141694 0.0079 9 | v 0.0291474 -0.00809273 0.0079 10 | v 0.0302056 -0.0016377 0.0079 11 | v 0.0298515 0.00489391 0.0079 12 | v 0.0281015 0.0111967 0.0079 13 | v 0.0250376 0.0169759 0.0079 14 | v 0.0208029 0.0219614 0.0079 15 | v 0.0155955 0.0259199 0.0079 16 | v 0.00965887 0.0286665 0.0079 17 | v 0.0032706 0.0300727 0.0079 18 | v -0.0032706 0.0300727 0.0079 19 | v -0.00965887 0.0286665 0.0079 20 | v -0.0155955 0.0259199 0.0079 21 | v -0.0208029 0.0219614 0.0079 22 | v -0.0250376 0.0169759 0.0079 23 | v -0.0281015 0.0111967 0.0079 24 | v -0.0298515 0.00489391 0.0079 25 | v -0.0302056 -0.0016377 0.0079 26 | v -0.0291474 -0.00809273 0.0079 27 | v -0.0267262 -0.0141694 0.0079 28 | v -0.0230554 -0.0195834 0.0079 29 | v -0.0183065 -0.0240818 0.0079 30 | v -0.0127016 -0.0274542 0.0079 31 | v -0.00650286 -0.0295428 0.0079 32 | v 3.70456e-18 -0.03025 0.0079 33 | v 1.85228e-18 1.13419e-34 0.0079 34 | v 0.0183065 -0.0240818 -0.0091 35 | v 0.0230554 -0.0195834 -0.0091 36 | v 0.0267262 -0.0141694 -0.0091 37 | v 0.0291474 -0.00809273 -0.0091 38 | v 0.0302056 -0.0016377 -0.0091 39 | v 0.0298515 0.00489391 -0.0091 40 | v 0.0281015 0.0111967 -0.0091 41 | v 0.0250376 0.0169759 -0.0091 42 | v 0.0208029 0.0219614 -0.0091 43 | v 0.0155955 0.0259199 -0.0091 44 | v 0.0115225 0.0279695 -0.0091 45 | v 0.00965887 0.0286665 -0.0091 46 | v 0.0032706 0.0300727 -0.0091 47 | v -0.0032706 0.0300727 -0.0091 48 | v -0.00965887 0.0286665 -0.0091 49 | v -0.0115225 0.0279695 -0.0091 50 | v -0.0155955 0.0259199 -0.0091 51 | v -0.0208029 0.0219614 -0.0091 52 | v -0.0250376 0.0169759 -0.0091 53 | v -0.0281015 0.0111967 -0.0091 54 | v -0.0298515 0.00489391 -0.0091 55 | v -0.0302056 -0.0016377 -0.0091 56 | v -0.0291474 -0.00809273 -0.0091 57 | v -0.0267262 -0.0141694 -0.0091 58 | v -0.0230554 -0.0195834 -0.0091 59 | v -0.0183065 -0.0240818 -0.0151 60 | v -0.0185312 -0.0239094 -0.0091 61 | v -0.018 -0.0243118 -0.0091 62 | v -0.018 -0.0243118 -0.0151 63 | v -0.0127016 -0.0274542 -0.0091 64 | v -0.00650286 -0.0295428 -0.0091 65 | v -3.70456e-18 -0.03025 -0.0091 66 | v 0.00650286 -0.0295428 -0.0091 67 | v 0.0127016 -0.0274542 -0.0091 68 | v 0.018 -0.0243118 -0.0091 69 | v -0.0185312 -0.0239094 -0.0151 70 | v -0.018 -0.032 -0.0151 71 | v -0.018 -0.032 -0.0091 72 | v -0.0208533 -0.0175414 -0.0091 73 | v -0.0208533 -0.0175414 -0.0151 74 | v -0.0262744 -0.00722618 -0.0091 75 | v -0.0241217 -0.012677 -0.0091 76 | v -0.0272119 -0.00144118 -0.0091 77 | v -0.0268907 0.00441048 -0.0091 78 | v -0.0253258 0.0100581 -0.0091 79 | v -0.0225895 0.0152406 -0.0091 80 | v -0.0188084 0.0197182 -0.0091 81 | v -0.0141574 0.0232837 -0.0091 82 | v -0.0141574 0.0232837 -0.0151 83 | v -0.0188084 0.0197182 -0.0151 84 | v -0.0225895 0.0152406 -0.0151 85 | v -0.0253258 0.0100581 -0.0151 86 | v -0.0268907 0.00441048 -0.0151 87 | v -0.0272119 -0.00144118 -0.0151 88 | v -0.0262744 -0.00722618 -0.0151 89 | v -0.0241217 -0.012677 -0.0151 90 | v -0.00348659 0.0422605 -0.0151 91 | v -0.00348659 0.0422605 -0.0091 92 | v -0.00331076 0.0425447 -0.0091 93 | v 0.00127721 0.0440906 -0.0091 94 | v 0.000432476 0.0442766 -0.0091 95 | v -0.00127721 0.0440906 -0.0091 96 | v -0.00206222 0.0437274 -0.0091 97 | v -0.0027508 0.043204 -0.0091 98 | v -0.000432476 0.0442766 -0.0091 99 | v 0.0027508 0.043204 -0.0091 100 | v 0.00206222 0.0437274 -0.0091 101 | v 0.00331076 0.0425447 -0.0091 102 | v 0.00348659 0.0422605 -0.0091 103 | v 0.00348659 0.0422605 -0.0151 104 | v 0.0141574 0.0232837 -0.0151 105 | v 0.0141574 0.0232837 -0.0091 106 | v 0.00331076 0.0425447 -0.0424 107 | v 0.0027508 0.043204 -0.0424 108 | v 0.00206222 0.0437274 -0.0424 109 | v 0.00127721 0.0440906 -0.0424 110 | v 0.000432476 0.0442766 -0.0424 111 | v 1.14223e-18 0.0443 -0.0424 112 | v -0.000432476 0.0442766 -0.0424 113 | v -0.00127721 0.0440906 -0.0424 114 | v -0.00206222 0.0437274 -0.0424 115 | v -0.0027508 0.043204 -0.0424 116 | v -0.00331076 0.0425447 -0.0424 117 | v 0.00371591 0.0417806 -0.0424 118 | v 0.00394731 0.0409471 -0.0151 119 | v 0.00394731 0.0409471 -0.0424 120 | v 0.00399413 0.0400834 -0.0151 121 | v 0.00399413 0.0400834 -0.0424 122 | v 0.0038542 0.0392299 -0.0151 123 | v 0.0038542 0.0392299 -0.0424 124 | v 0.00353405 0.0384264 -0.0151 125 | v 0.00353405 0.0384264 -0.0424 126 | v 0.00304865 0.0377105 -0.0151 127 | v 0.00304865 0.0377105 -0.0424 128 | v 0.0024207 0.0371156 -0.0151 129 | v 0.0024207 0.0371156 -0.0424 130 | v 0.00167956 0.0366697 -0.0151 131 | v 0.00167956 0.0366697 -0.0424 132 | v 0.000859882 0.0363935 -0.0151 133 | v 0.000859882 0.0363935 -0.0424 134 | v -8.17207e-19 0.0363 -0.0151 135 | v 1.62511e-19 0.0363 -0.0424 136 | v -0.000859882 0.0363935 -0.0151 137 | v -0.000859882 0.0363935 -0.0424 138 | v -0.00167956 0.0366697 -0.0151 139 | v -0.00167956 0.0366697 -0.0424 140 | v -0.0024207 0.0371156 -0.0151 141 | v -0.0024207 0.0371156 -0.0424 142 | v -0.00304865 0.0377105 -0.0151 143 | v -0.00304865 0.0377105 -0.0424 144 | v -0.00353405 0.0384264 -0.0151 145 | v -0.00353405 0.0384264 -0.0424 146 | v -0.0038542 0.0392299 -0.0151 147 | v -0.0038542 0.0392299 -0.0424 148 | v -0.00399413 0.0400834 -0.0151 149 | v -0.00399413 0.0400834 -0.0424 150 | v -0.00394731 0.0409471 -0.0151 151 | v -0.00394731 0.0409471 -0.0424 152 | v -0.00371591 0.0417806 -0.0151 153 | v -0.00371591 0.0417806 -0.0424 154 | v 0.00371591 0.0417806 -0.0151 155 | v 2.14523e-19 0.0403 -0.0424 156 | v 0.022365 0.0155682 -0.0091 157 | v 0.0250999 0.0106094 -0.0091 158 | v 0.0272463 -0.000448933 -0.0091 159 | v 0.0265652 -0.00607082 -0.0091 160 | v 0.0267507 0.00519234 -0.0091 161 | v 0.0247367 -0.0114305 -0.0091 162 | v 0.018 -0.0204588 -0.0091 163 | v 0.02184 -0.0162966 -0.0091 164 | v 0.0186642 0.0198547 -0.0091 165 | v 0.018 -0.0204588 -0.0151 166 | v 0.02184 -0.0162966 -0.0151 167 | v 0.0247367 -0.0114305 -0.0151 168 | v 0.0265652 -0.00607082 -0.0151 169 | v 0.0272463 -0.000448933 -0.0151 170 | v 0.0267507 0.00519234 -0.0151 171 | v 0.0250999 0.0106094 -0.0151 172 | v 0.022365 0.0155682 -0.0151 173 | v 0.0186642 0.0198547 -0.0151 174 | v 0.018 -0.032 -0.0151 175 | v 0.018 -0.032 -0.0091 176 | v 0.0153899 -0.0390311 -0.0091 177 | v 0.0153899 -0.0390311 -0.0151 178 | v 0.0160933 -0.0395163 -0.0151 179 | v 0.0160933 -0.0395163 -0.0091 180 | v 0.0168836 -0.0398411 -0.0151 181 | v 0.0168836 -0.0398411 -0.0091 182 | v 0.0177249 -0.0399905 -0.0151 183 | v 0.0177249 -0.0399905 -0.0091 184 | v 0.0185788 -0.0399579 -0.0151 185 | v 0.0185788 -0.0399579 -0.0091 186 | v 0.0194062 -0.0397447 -0.0151 187 | v 0.0194062 -0.0397447 -0.0091 188 | v 0.0201695 -0.0393605 -0.0151 189 | v 0.0201695 -0.0393605 -0.0091 190 | v 0.0208338 -0.0388231 -0.0151 191 | v 0.0208338 -0.0388231 -0.0091 192 | v 0.0213687 -0.0381568 -0.0151 193 | v 0.0213687 -0.0381568 -0.0091 194 | v 0.02175 -0.0373921 -0.0151 195 | v 0.02175 -0.0373921 -0.0091 196 | v 0.0219601 -0.0365638 -0.0151 197 | v 0.0219601 -0.0365638 -0.0091 198 | v 0.0219895 -0.0357098 -0.0151 199 | v 0.0219895 -0.0357098 -0.0091 200 | v 0.0218368 -0.0348691 -0.0151 201 | v 0.0218368 -0.0348691 -0.0091 202 | v 0.0215091 -0.03408 -0.0151 203 | v 0.0215091 -0.03408 -0.0091 204 | v 0.0210212 -0.0333785 -0.0151 205 | v 0.0210212 -0.0333785 -0.0091 206 | v 0.0203955 -0.0327966 -0.0151 207 | v 0.0203955 -0.0327966 -0.0091 208 | v 0.0196604 -0.0323609 -0.0151 209 | v 0.0196604 -0.0323609 -0.0091 210 | v 0.0188496 -0.0320913 -0.0151 211 | v 0.0188496 -0.0320913 -0.0091 212 | v 0.0112738 -0.0438111 -0.0091 213 | v 0.0112738 -0.0438111 -0.0151 214 | v -0.0219895 -0.0357098 -0.0091 215 | v -0.0219601 -0.0365638 -0.0091 216 | v -0.02175 -0.0373921 -0.0091 217 | v -0.0194062 -0.0397447 -0.0091 218 | v -0.0185788 -0.0399579 -0.0091 219 | v -0.0213687 -0.0381568 -0.0091 220 | v -0.0201695 -0.0393605 -0.0091 221 | v -0.0208338 -0.0388231 -0.0091 222 | v -0.0177249 -0.0399905 -0.0091 223 | v -0.0210212 -0.0333785 -0.0091 224 | v -0.0215091 -0.03408 -0.0091 225 | v -5.22741e-18 -0.0517 -0.0091 226 | v -0.0102102 -0.0460049 -0.0091 227 | v -0.00872514 -0.0479384 -0.0091 228 | v -0.0218368 -0.0348691 -0.0091 229 | v 0.00475072 -0.0507196 -0.0091 230 | v 0.00687992 -0.0495319 -0.0091 231 | v 0.00872514 -0.0479384 -0.0091 232 | v -0.00687992 -0.0495319 -0.0091 233 | v -0.00475072 -0.0507196 -0.0091 234 | v -0.0112738 -0.0438111 -0.0091 235 | v -0.0196604 -0.0323609 -0.0091 236 | v -0.0203955 -0.0327966 -0.0091 237 | v 0.00242542 -0.0514523 -0.0091 238 | v 0.0102102 -0.0460049 -0.0091 239 | v -0.0160933 -0.0395163 -0.0091 240 | v -0.0153899 -0.0390311 -0.0091 241 | v -0.0168836 -0.0398411 -0.0091 242 | v -0.00242542 -0.0514523 -0.0091 243 | v -0.0188496 -0.0320913 -0.0091 244 | v -0.0112738 -0.0438111 -0.0151 245 | v -0.0102102 -0.0460049 -0.0151 246 | v -0.00872514 -0.0479384 -0.0151 247 | v -0.00687992 -0.0495319 -0.0151 248 | v -0.00475072 -0.0507196 -0.0151 249 | v -0.00242542 -0.0514523 -0.0151 250 | v -5.22741e-18 -0.0517 -0.0151 251 | v 0.00242542 -0.0514523 -0.0151 252 | v 0.00475072 -0.0507196 -0.0151 253 | v 0.00687992 -0.0495319 -0.0151 254 | v 0.00872514 -0.0479384 -0.0151 255 | v 0.0102102 -0.0460049 -0.0151 256 | v -0.0153899 -0.0390311 -0.0151 257 | v -0.0188496 -0.0320913 -0.0151 258 | v -0.0196604 -0.0323609 -0.0151 259 | v -0.0203955 -0.0327966 -0.0151 260 | v -0.0210212 -0.0333785 -0.0151 261 | v -0.0215091 -0.03408 -0.0151 262 | v -0.0218368 -0.0348691 -0.0151 263 | v -0.0219895 -0.0357098 -0.0151 264 | v -0.0219601 -0.0365638 -0.0151 265 | v -0.02175 -0.0373921 -0.0151 266 | v -0.0213687 -0.0381568 -0.0151 267 | v -0.0208338 -0.0388231 -0.0151 268 | v -0.0201695 -0.0393605 -0.0151 269 | v -0.0194062 -0.0397447 -0.0151 270 | v -0.0185788 -0.0399579 -0.0151 271 | v -0.0177249 -0.0399905 -0.0151 272 | v -0.0168836 -0.0398411 -0.0151 273 | v -0.0160933 -0.0395163 -0.0151 274 | v -0.01425 -0.0346079 -0.0151 275 | v -0.0146068 -0.033882 -0.0151 276 | v -0.0140467 -0.0353908 -0.0151 277 | v -0.0144066 -0.037757 -0.0151 278 | v -0.0141266 -0.0369982 -0.0151 279 | v 0.0144066 -0.037757 -0.0151 280 | v 0.0148335 -0.038444 -0.0151 281 | v 0.0151022 -0.0332427 -0.0151 282 | v 0.0164235 -0.0323238 -0.0151 283 | v 0.0157162 -0.0327161 -0.0151 284 | v -0.0157162 -0.0327161 -0.0151 285 | v -0.0140049 -0.0361986 -0.0151 286 | v 0.0140049 -0.0361986 -0.0151 287 | v 0.0141266 -0.0369982 -0.0151 288 | v 0.0146068 -0.033882 -0.0151 289 | v 0.0171953 -0.0320818 -0.0151 290 | v -0.0151022 -0.0332427 -0.0151 291 | v 0.01425 -0.0346079 -0.0151 292 | v 0.0140467 -0.0353908 -0.0151 293 | v -0.0148335 -0.038444 -0.0151 294 | v -0.0164235 -0.0323238 -0.0151 295 | v -0.0171953 -0.0320818 -0.0151 296 | v -0.018 -0.036 -0.0151 297 | v -0.018 -0.036 -0.0424 298 | v -0.018 -0.032 -0.0424 299 | v -0.0153899 -0.0390311 -0.0424 300 | v -0.0148335 -0.038444 -0.0424 301 | v -0.0144066 -0.037757 -0.0424 302 | v -0.0141266 -0.0369982 -0.0424 303 | v -0.0140049 -0.0361986 -0.0424 304 | v -0.0140467 -0.0353908 -0.0424 305 | v -0.01425 -0.0346079 -0.0424 306 | v -0.0146068 -0.033882 -0.0424 307 | v -0.0151022 -0.0332427 -0.0424 308 | v -0.0157162 -0.0327161 -0.0424 309 | v -0.0164235 -0.0323238 -0.0424 310 | v -0.0171953 -0.0320818 -0.0424 311 | v 0.018 -0.036 -0.0151 312 | v 0.018 -0.032 -0.0424 313 | v 0.0171953 -0.0320818 -0.0424 314 | v 0.0164235 -0.0323238 -0.0424 315 | v 0.0157162 -0.0327161 -0.0424 316 | v 0.0151022 -0.0332427 -0.0424 317 | v 0.0146068 -0.033882 -0.0424 318 | v 0.01425 -0.0346079 -0.0424 319 | v 0.0140467 -0.0353908 -0.0424 320 | v 0.0140049 -0.0361986 -0.0424 321 | v 0.0141266 -0.0369982 -0.0424 322 | v 0.0144066 -0.037757 -0.0424 323 | v 0.0148335 -0.038444 -0.0424 324 | v 0.0153899 -0.0390311 -0.0424 325 | v 0.018 -0.036 -0.0424 326 | vn 0 0 1 327 | vn 0.605174 -0.796093 0 328 | vn 0.762162 -0.647386 0 329 | vn 0.883512 -0.468408 0 330 | vn 0.96355 -0.267528 0 331 | vn 0.998533 -0.0541389 0 332 | vn 0.986827 0.161782 0 333 | vn 0.928977 0.370138 0 334 | vn 0.827689 0.561187 0 335 | vn 0.687699 0.725995 0 336 | vn 0.515554 0.856857 0 337 | vn 0.38091 0.924612 0 338 | vn 0.319302 0.947653 0 339 | vn 0.108119 0.994138 0 340 | vn -0.108119 0.994138 0 341 | vn -0.319302 0.947653 0 342 | vn -0.515554 0.856857 0 343 | vn -0.38091 0.924612 0 344 | vn -0.687699 0.725995 0 345 | vn -0.827689 0.561187 0 346 | vn -0.928977 0.370138 0 347 | vn -0.986827 0.161782 0 348 | vn -0.998533 -0.0541389 0 349 | vn -0.96355 -0.267528 0 350 | vn -0.883512 -0.468408 0 351 | vn -0.762162 -0.647386 0 352 | vn -0.605174 -0.796093 0 353 | vn -0.612602 -0.790392 0 354 | vn -0.762162 -0.647386 0 355 | vn -0.419889 -0.907575 0 356 | vn -0.595041 -0.803695 0 357 | vn -0.21497 -0.976621 0 358 | vn -1.83697e-16 -1 0 359 | vn 0.21497 -0.976621 0 360 | vn 0.419889 -0.907575 0 361 | vn 0.595041 -0.803695 0 362 | vn -0.612602 -0.790392 0 363 | vn -1 -6.12323e-17 0 364 | vn -0.939484 -0.342593 0 365 | vn 0 0 -1 366 | vn -0.519538 0.854447 0 367 | vn -0.690218 0.723602 0 368 | vn -0.828973 0.559288 0 369 | vn -0.929387 0.369106 0 370 | vn -0.986815 0.161853 0 371 | vn -0.9986 -0.0528872 0 372 | vn -0.964199 -0.265181 0 373 | vn -0.885201 -0.465209 0 374 | vn -0.76526 -0.643721 0 375 | vn -0.871647 0.490134 0 376 | vn 0 0 1 377 | vn 0.871647 0.490134 0 378 | vn 0.827689 0.561187 0 379 | vn 0.687699 0.725995 0 380 | vn 0.515554 0.856857 0 381 | vn 0.319302 0.947653 0 382 | vn 0.108119 0.994138 0 383 | vn -0.108119 0.994138 0 384 | vn 3.06162e-16 1 0 385 | vn -0.319302 0.947653 0 386 | vn -0.515554 0.856857 0 387 | vn -0.687699 0.725995 0 388 | vn -0.827689 0.561187 0 389 | vn 0.928977 0.370138 0 390 | vn 0.871647 0.490134 0 391 | vn 0.986827 0.161782 0 392 | vn 0.998533 -0.0541389 0 393 | vn 0.96355 -0.267528 0 394 | vn 0.883512 -0.468408 0 395 | vn 0.762162 -0.647386 0 396 | vn 0.605174 -0.796093 0 397 | vn 0.419889 -0.907575 0 398 | vn 0.21497 -0.976621 0 399 | vn -1.83697e-16 -1 0 400 | vn -0.21497 -0.976621 0 401 | vn -0.419889 -0.907575 0 402 | vn -0.605174 -0.796093 0 403 | vn -0.762162 -0.647386 0 404 | vn -0.883512 -0.468408 0 405 | vn -0.96355 -0.267528 0 406 | vn -0.998533 -0.0541389 0 407 | vn -0.986827 0.161782 0 408 | vn -0.928977 0.370138 0 409 | vn -0.827689 0.561187 0 410 | vn -0.871647 0.490134 0 411 | vn 0.928977 0.370138 0 412 | vn 0 0 -1 413 | vn 0.66055 -0.750782 0 414 | vn 0.801467 -0.598039 0 415 | vn 0.90777 -0.419469 0 416 | vn 0.974868 -0.222782 0 417 | vn 0.999864 -0.0164746 0 418 | vn 0.981679 0.190545 0 419 | vn 0.921096 0.389335 0 420 | vn 0.820734 0.57131 0 421 | vn 0.684926 0.728612 0 422 | vn 0.519538 0.854447 0 423 | vn 1 6.12323e-17 0 424 | vn -0.652521 -0.757771 0 425 | vn -0.476684 -0.879075 0 426 | vn -0.279094 -0.960264 0 427 | vn -0.0687686 -0.997633 0 428 | vn 0.144695 -0.989476 0 429 | vn 0.351556 -0.936167 0 430 | vn 0.542374 -0.840137 0 431 | vn 0.708442 -0.705769 0 432 | vn 0.842181 -0.539195 0 433 | vn 0.937489 -0.348015 0 434 | vn 0.990016 -0.140954 0 435 | vn 0.997366 0.0725386 0 436 | vn 0.959202 0.282721 0 437 | vn 0.877267 0.480003 0 438 | vn 0.755299 0.65538 0 439 | vn 0.598865 0.80085 0 440 | vn 0.415102 0.909775 0 441 | vn 0.212397 0.977183 0 442 | vn 3.06162e-16 1 0 443 | vn 0.757771 -0.652521 0 444 | vn 0 0 1 445 | vn -0.939484 -0.342593 0 446 | vn -0.85085 -0.525409 0 447 | vn -0.727095 -0.686537 0 448 | vn -0.573327 -0.819327 0 449 | vn -0.395893 -0.918297 0 450 | vn -0.202118 -0.979361 0 451 | vn -1.07188e-15 -1 0 452 | vn 0.202118 -0.979361 0 453 | vn 0.395893 -0.918297 0 454 | vn 0.573327 -0.819327 0 455 | vn 0.727095 -0.686537 0 456 | vn 0.85085 -0.525409 0 457 | vn 0.939484 -0.342593 0 458 | vn -0.757771 -0.652521 0 459 | vn 6.12323e-17 1 0 460 | vn -0.212397 0.977183 0 461 | vn -0.415102 0.909775 0 462 | vn -0.598865 0.80085 0 463 | vn -0.755299 0.65538 0 464 | vn -0.877267 0.480003 0 465 | vn -0.959202 0.282721 0 466 | vn -0.997366 0.0725386 0 467 | vn -0.990016 -0.140954 0 468 | vn -0.937489 -0.348015 0 469 | vn -0.842181 -0.539195 0 470 | vn -0.708442 -0.705769 0 471 | vn -0.542374 -0.840137 0 472 | vn -0.351556 -0.936167 0 473 | vn -0.144695 -0.989476 0 474 | vn 0.0687686 -0.997633 0 475 | vn 0.279094 -0.960264 0 476 | vn 0.476684 -0.879075 0 477 | vn 0.652521 -0.757771 0 478 | vn 0 0 -1 479 | vn -1 -6.12323e-17 0 480 | vn 0.652521 -0.757771 0 481 | vn 0.791625 -0.611008 0 482 | vn 0.89836 -0.439261 0 483 | vn 0.968361 -0.249553 0 484 | vn 0.998767 -0.049641 0 485 | vn 0.988334 0.152301 0 486 | vn 0.937489 0.348015 0 487 | vn 0.84831 0.529499 0 488 | vn 0.724445 0.689333 0 489 | vn 0.570957 0.82098 0 490 | vn 0.394124 0.919057 0 491 | vn 0.201175 0.979555 0 492 | vn 6.12323e-17 1 0 493 | vn -0.757771 -0.652521 0 494 | vn 0 0 -1 495 | vn 6.12323e-17 1 0 496 | vn -0.201175 0.979555 0 497 | vn -0.394124 0.919057 0 498 | vn -0.570957 0.82098 0 499 | vn -0.724445 0.689333 0 500 | vn -0.84831 0.529499 0 501 | vn -0.937489 0.348015 0 502 | vn -0.988334 0.152301 0 503 | vn -0.998767 -0.049641 0 504 | vn -0.968361 -0.249553 0 505 | vn -0.89836 -0.439261 0 506 | vn -0.791625 -0.611008 0 507 | vn -0.652521 -0.757771 0 508 | vn 1 6.12323e-17 0 509 | vn 0.757771 -0.652521 0 510 | vn 0 0 -1 511 | usemtl 0.231373_0.380392_0.705882_0.000000_0.000000 512 | o mesh0 513 | f 30//1 1//1 2//1 514 | f 2//1 3//1 30//1 515 | f 3//1 4//1 30//1 516 | f 4//1 5//1 30//1 517 | f 5//1 6//1 30//1 518 | f 6//1 7//1 30//1 519 | f 7//1 8//1 30//1 520 | f 8//1 9//1 30//1 521 | f 9//1 10//1 30//1 522 | f 10//1 11//1 30//1 523 | f 11//1 12//1 30//1 524 | f 12//1 13//1 30//1 525 | f 13//1 14//1 30//1 526 | f 14//1 15//1 30//1 527 | f 15//1 16//1 30//1 528 | f 16//1 17//1 30//1 529 | f 17//1 18//1 30//1 530 | f 18//1 19//1 30//1 531 | f 19//1 20//1 30//1 532 | f 20//1 21//1 30//1 533 | f 21//1 22//1 30//1 534 | f 22//1 23//1 30//1 535 | f 23//1 24//1 30//1 536 | f 24//1 25//1 30//1 537 | f 25//1 26//1 30//1 538 | f 26//1 27//1 30//1 539 | f 27//1 28//1 30//1 540 | f 28//1 29//1 30//1 541 | f 29//1 1//1 30//1 542 | o mesh1 543 | f 3//2 31//2 32//3 544 | f 4//3 32//3 33//4 545 | f 5//4 33//4 34//5 546 | f 6//5 34//5 35//6 547 | f 7//6 35//6 36//7 548 | f 8//7 36//7 37//8 549 | f 9//8 37//8 38//9 550 | f 10//9 38//9 39//10 551 | f 11//10 39//10 40//11 552 | f 12//11 40//11 41//12 553 | f 41//12 13//13 12//11 554 | f 13//13 42//13 43//14 555 | f 14//14 43//14 44//15 556 | f 15//15 44//15 45//16 557 | f 17//17 16//16 46//18 558 | f 16//16 45//16 46//18 559 | f 17//17 47//17 48//19 560 | f 18//19 48//19 49//20 561 | f 19//20 49//20 50//21 562 | f 20//21 50//21 51//22 563 | f 21//22 51//22 52//23 564 | f 22//23 52//23 53//24 565 | f 23//24 53//24 54//25 566 | f 24//25 54//25 55//26 567 | f 56//27 26//27 57//28 568 | f 25//29 55//26 57//28 569 | f 57//28 26//27 25//29 570 | f 27//30 26//27 58//31 571 | f 56//27 59//31 58//31 572 | f 58//31 26//27 56//27 573 | f 27//30 60//30 61//32 574 | f 28//32 61//32 62//33 575 | f 29//33 62//33 63//34 576 | f 1//34 63//34 64//35 577 | f 2//35 64//35 65//36 578 | f 65//36 3//2 2//35 579 | f 65//36 31//2 3//2 580 | f 64//35 2//35 1//34 581 | f 63//34 1//34 29//33 582 | f 62//33 29//33 28//32 583 | f 61//32 28//32 27//30 584 | f 58//31 60//30 27//30 585 | f 57//28 66//37 56//27 586 | f 55//26 25//29 24//25 587 | f 54//25 24//25 23//24 588 | f 53//24 23//24 22//23 589 | f 52//23 22//23 21//22 590 | f 51//22 21//22 20//21 591 | f 50//21 20//21 19//20 592 | f 49//20 19//20 18//19 593 | f 48//19 18//19 17//17 594 | f 46//18 47//17 17//17 595 | f 45//16 16//16 15//15 596 | f 44//15 15//15 14//14 597 | f 43//14 14//14 13//13 598 | f 41//12 42//13 13//13 599 | f 40//11 12//11 11//10 600 | f 39//10 11//10 10//9 601 | f 38//9 10//9 9//8 602 | f 37//8 9//8 8//7 603 | f 36//7 8//7 7//6 604 | f 35//6 7//6 6//5 605 | f 34//5 6//5 5//4 606 | f 33//4 5//4 4//3 607 | f 32//3 4//3 3//2 608 | usemtl 0.000000_0.000000_0.000000_0.000000_0.000000 609 | o mesh2 610 | f 67//38 68//38 58//38 611 | f 58//38 59//38 67//38 612 | o mesh3 613 | f 57//39 69//39 70//39 614 | f 70//39 66//39 57//39 615 | usemtl 0.231373_0.380392_0.705882_0.000000_0.000000 616 | o mesh4 617 | f 53//40 71//40 72//40 618 | f 52//40 73//40 71//40 619 | f 51//40 74//40 73//40 620 | f 51//40 50//40 75//40 621 | f 71//40 53//40 52//40 622 | f 75//40 74//40 51//40 623 | f 50//40 49//40 76//40 624 | f 49//40 48//40 77//40 625 | f 54//40 72//40 69//40 626 | f 73//40 52//40 51//40 627 | f 77//40 76//40 49//40 628 | f 69//40 57//40 55//40 629 | f 76//40 75//40 50//40 630 | f 48//40 47//40 78//40 631 | f 72//40 54//40 53//40 632 | f 78//40 77//40 48//40 633 | f 47//40 46//40 78//40 634 | f 69//40 55//40 54//40 635 | usemtl 0.000000_0.000000_0.000000_0.000000_0.000000 636 | o mesh5 637 | f 78//41 79//41 80//42 638 | f 77//42 80//42 81//43 639 | f 76//43 81//43 82//44 640 | f 75//44 82//44 83//45 641 | f 74//45 83//45 84//46 642 | f 73//46 84//46 85//47 643 | f 71//47 85//47 86//48 644 | f 72//48 86//48 70//49 645 | f 70//49 69//49 72//48 646 | f 86//48 72//48 71//47 647 | f 85//47 71//47 73//46 648 | f 84//46 73//46 74//45 649 | f 83//45 74//45 75//44 650 | f 82//44 75//44 76//43 651 | f 81//43 76//43 77//42 652 | f 80//42 77//42 78//41 653 | o mesh6 654 | f 87//50 79//50 46//50 655 | f 79//50 78//50 46//50 656 | f 46//50 88//50 87//50 657 | o mesh7 658 | f 89//51 90//51 91//51 659 | f 92//51 93//51 94//51 660 | f 91//51 95//51 89//51 661 | f 89//51 96//51 97//51 662 | f 95//51 92//51 89//51 663 | f 89//51 98//51 96//51 664 | f 98//51 89//51 88//51 665 | f 97//51 90//51 89//51 666 | f 94//51 89//51 92//51 667 | f 44//51 43//51 99//51 668 | f 99//51 43//51 42//51 669 | f 99//51 98//51 44//51 670 | f 88//51 44//51 98//51 671 | f 88//51 46//51 45//51 672 | f 45//51 44//51 88//51 673 | f 42//51 41//51 99//51 674 | o mesh8 675 | f 100//52 99//52 41//52 676 | f 41//52 101//52 100//52 677 | f 41//52 102//52 101//52 678 | o mesh9 679 | f 98//53 103//53 104//54 680 | f 96//54 104//54 105//55 681 | f 97//55 105//55 106//56 682 | f 90//56 106//56 107//57 683 | f 95//58 91//57 108//59 684 | f 91//57 107//57 108//59 685 | f 95//58 109//58 110//60 686 | f 92//60 110//60 111//61 687 | f 93//61 111//61 112//62 688 | f 94//62 112//62 113//63 689 | f 114//64 103//53 100//65 690 | f 98//53 99//65 100//65 691 | f 100//65 103//53 98//53 692 | f 115//66 116//66 114//64 693 | f 117//67 118//67 116//66 694 | f 119//68 120//68 118//67 695 | f 121//69 122//69 120//68 696 | f 123//70 124//70 122//69 697 | f 125//71 126//71 124//70 698 | f 127//72 128//72 126//71 699 | f 129//73 130//73 128//72 700 | f 131//74 132//74 130//73 701 | f 133//75 134//75 132//74 702 | f 135//76 136//76 134//75 703 | f 137//77 138//77 136//76 704 | f 139//78 140//78 138//77 705 | f 141//79 142//79 140//78 706 | f 143//80 144//80 142//79 707 | f 145//81 146//81 144//80 708 | f 147//82 148//82 146//81 709 | f 149//83 150//83 148//82 710 | f 89//84 113//63 87//85 711 | f 150//83 149//83 87//85 712 | f 87//85 113//63 150//83 713 | f 87//85 88//85 89//84 714 | f 148//82 147//82 149//83 715 | f 146//81 145//81 147//82 716 | f 144//80 143//80 145//81 717 | f 142//79 141//79 143//80 718 | f 140//78 139//78 141//79 719 | f 138//77 137//77 139//78 720 | f 136//76 135//76 137//77 721 | f 134//75 133//75 135//76 722 | f 132//74 131//74 133//75 723 | f 130//73 129//73 131//74 724 | f 128//72 127//72 129//73 725 | f 126//71 125//71 127//72 726 | f 124//70 123//70 125//71 727 | f 122//69 121//69 123//70 728 | f 120//68 119//68 121//69 729 | f 118//67 117//67 119//68 730 | f 116//66 115//66 117//67 731 | f 114//64 151//86 115//66 732 | f 100//65 151//86 114//64 733 | f 113//63 89//84 94//62 734 | f 112//62 94//62 93//61 735 | f 111//61 93//61 92//60 736 | f 110//60 92//60 95//58 737 | f 108//59 109//58 95//58 738 | f 107//57 91//57 90//56 739 | f 106//56 90//56 97//55 740 | f 105//55 97//55 96//54 741 | f 104//54 96//54 98//53 742 | o mesh10 743 | f 152//87 107//87 106//87 744 | f 106//87 105//87 152//87 745 | f 105//87 104//87 152//87 746 | f 104//87 103//87 152//87 747 | f 103//87 114//87 152//87 748 | f 114//87 116//87 152//87 749 | f 116//87 118//87 152//87 750 | f 118//87 120//87 152//87 751 | f 120//87 122//87 152//87 752 | f 122//87 124//87 152//87 753 | f 124//87 126//87 152//87 754 | f 126//87 128//87 152//87 755 | f 128//87 130//87 152//87 756 | f 130//87 132//87 152//87 757 | f 132//87 134//87 152//87 758 | f 134//87 136//87 152//87 759 | f 136//87 138//87 152//87 760 | f 138//87 140//87 152//87 761 | f 140//87 142//87 152//87 762 | f 142//87 144//87 152//87 763 | f 144//87 146//87 152//87 764 | f 146//87 148//87 152//87 765 | f 148//87 150//87 152//87 766 | f 150//87 113//87 152//87 767 | f 113//87 112//87 152//87 768 | f 112//87 111//87 152//87 769 | f 111//87 110//87 152//87 770 | f 110//87 109//87 152//87 771 | f 109//87 108//87 152//87 772 | f 108//87 107//87 152//87 773 | usemtl 0.231373_0.380392_0.705882_0.000000_0.000000 774 | o mesh11 775 | f 39//87 38//87 153//87 776 | f 38//87 37//87 154//87 777 | f 36//87 35//87 155//87 778 | f 35//87 34//87 156//87 779 | f 154//87 153//87 38//87 780 | f 37//87 36//87 157//87 781 | f 156//87 155//87 35//87 782 | f 34//87 33//87 158//87 783 | f 32//87 31//87 159//87 784 | f 157//87 154//87 37//87 785 | f 158//87 156//87 34//87 786 | f 33//87 32//87 160//87 787 | f 159//87 160//87 32//87 788 | f 39//87 161//87 102//87 789 | f 155//87 157//87 36//87 790 | f 31//87 65//87 159//87 791 | f 102//87 41//87 40//87 792 | f 160//87 158//87 33//87 793 | f 153//87 161//87 39//87 794 | f 102//87 40//87 39//87 795 | usemtl 0.000000_0.000000_0.000000_0.000000_0.000000 796 | o mesh12 797 | f 159//88 162//88 163//89 798 | f 160//89 163//89 164//90 799 | f 158//90 164//90 165//91 800 | f 156//91 165//91 166//92 801 | f 155//92 166//92 167//93 802 | f 157//93 167//93 168//94 803 | f 154//94 168//94 169//95 804 | f 153//95 169//95 170//96 805 | f 161//96 170//96 101//97 806 | f 101//97 102//97 161//96 807 | f 170//96 161//96 153//95 808 | f 169//95 153//95 154//94 809 | f 168//94 154//94 157//93 810 | f 167//93 157//93 155//92 811 | f 166//92 155//92 156//91 812 | f 165//91 156//91 158//90 813 | f 164//90 158//90 160//89 814 | f 163//89 160//89 159//88 815 | o mesh13 816 | f 171//98 162//98 65//98 817 | f 162//98 159//98 65//98 818 | f 65//98 172//98 171//98 819 | o mesh14 820 | f 173//99 174//99 175//100 821 | f 176//100 175//100 177//101 822 | f 178//101 177//101 179//102 823 | f 180//102 179//102 181//103 824 | f 182//103 181//103 183//104 825 | f 184//104 183//104 185//105 826 | f 186//105 185//105 187//106 827 | f 188//106 187//106 189//107 828 | f 190//107 189//107 191//108 829 | f 192//108 191//108 193//109 830 | f 194//109 193//109 195//110 831 | f 196//110 195//110 197//111 832 | f 198//111 197//111 199//112 833 | f 200//112 199//112 201//113 834 | f 202//113 201//113 203//114 835 | f 204//114 203//114 205//115 836 | f 206//115 205//115 207//116 837 | f 208//116 207//116 171//117 838 | f 171//117 172//117 208//116 839 | f 207//116 208//116 206//115 840 | f 205//115 206//115 204//114 841 | f 203//114 204//114 202//113 842 | f 201//113 202//113 200//112 843 | f 199//112 200//112 198//111 844 | f 197//111 198//111 196//110 845 | f 195//110 196//110 194//109 846 | f 193//109 194//109 192//108 847 | f 191//108 192//108 190//107 848 | f 189//107 190//107 188//106 849 | f 187//106 188//106 186//105 850 | f 185//105 186//105 184//104 851 | f 183//104 184//104 182//103 852 | f 181//103 182//103 180//102 853 | f 179//102 180//102 178//101 854 | f 177//101 178//101 176//100 855 | f 175//100 176//100 173//99 856 | o mesh15 857 | f 173//118 209//118 210//118 858 | f 210//118 174//118 173//118 859 | o mesh16 860 | f 211//119 212//119 213//119 861 | f 192//119 202//119 204//119 862 | f 192//119 196//119 198//119 863 | f 211//119 214//119 215//119 864 | f 213//119 216//119 211//119 865 | f 192//119 200//119 202//119 866 | f 192//119 194//119 196//119 867 | f 206//119 188//119 190//119 868 | f 211//119 217//119 214//119 869 | f 216//119 218//119 211//119 870 | f 219//119 220//119 221//119 871 | f 198//119 200//119 192//119 872 | f 206//119 186//119 188//119 873 | f 206//119 182//119 184//119 874 | f 222//119 223//119 224//119 875 | f 218//119 217//119 211//119 876 | f 221//119 225//119 219//119 877 | f 190//119 192//119 206//119 878 | f 206//119 180//119 182//119 879 | f 226//119 227//119 228//119 880 | f 222//119 229//119 230//119 881 | f 222//119 231//119 223//119 882 | f 225//119 211//119 219//119 883 | f 219//119 232//119 233//119 884 | f 68//119 234//119 61//119 885 | f 176//119 208//119 172//119 886 | f 184//119 186//119 206//119 887 | f 206//119 176//119 178//119 888 | f 235//119 234//119 226//119 889 | f 224//119 229//119 222//119 890 | f 236//119 237//119 68//119 891 | f 232//119 219//119 238//119 892 | f 233//119 220//119 219//119 893 | f 61//119 60//119 68//119 894 | f 234//119 63//119 62//119 895 | f 234//119 172//119 64//119 896 | f 176//119 206//119 208//119 897 | f 178//119 180//119 206//119 898 | f 172//119 234//119 209//119 899 | f 228//119 235//119 226//119 900 | f 230//119 239//119 222//119 901 | f 68//119 237//119 231//119 902 | f 68//119 240//119 236//119 903 | f 215//119 219//119 211//119 904 | f 62//119 61//119 234//119 905 | f 172//119 65//119 64//119 906 | f 204//119 206//119 192//119 907 | f 235//119 209//119 234//119 908 | f 231//119 234//119 68//119 909 | f 238//119 236//119 232//119 910 | f 64//119 63//119 234//119 911 | f 209//119 173//119 172//119 912 | f 240//119 232//119 236//119 913 | f 172//119 173//119 176//119 914 | f 60//119 58//119 68//119 915 | f 222//119 234//119 231//119 916 | o mesh17 917 | f 231//120 241//120 242//121 918 | f 223//121 242//121 243//122 919 | f 224//122 243//122 244//123 920 | f 229//123 244//123 245//124 921 | f 230//124 245//124 246//125 922 | f 239//125 246//125 247//126 923 | f 222//126 247//126 248//127 924 | f 234//127 248//127 249//128 925 | f 226//128 249//128 250//129 926 | f 227//129 250//129 251//130 927 | f 228//130 251//130 252//131 928 | f 235//131 252//131 210//132 929 | f 210//132 209//132 235//131 930 | f 252//131 235//131 228//130 931 | f 251//130 228//130 227//129 932 | f 250//129 227//129 226//128 933 | f 249//128 226//128 234//127 934 | f 248//127 234//127 222//126 935 | f 247//126 222//126 239//125 936 | f 246//125 239//125 230//124 937 | f 245//124 230//124 229//123 938 | f 244//123 229//123 224//122 939 | f 243//122 224//122 223//121 940 | f 242//121 223//121 231//120 941 | o mesh18 942 | f 241//133 231//133 237//133 943 | f 237//133 253//133 241//133 944 | o mesh19 945 | f 68//134 67//134 254//135 946 | f 240//135 254//135 255//136 947 | f 232//136 255//136 256//137 948 | f 233//137 256//137 257//138 949 | f 220//138 257//138 258//139 950 | f 221//139 258//139 259//140 951 | f 225//140 259//140 260//141 952 | f 211//141 260//141 261//142 953 | f 212//142 261//142 262//143 954 | f 213//143 262//143 263//144 955 | f 216//144 263//144 264//145 956 | f 218//145 264//145 265//146 957 | f 217//146 265//146 266//147 958 | f 214//147 266//147 267//148 959 | f 215//148 267//148 268//149 960 | f 219//149 268//149 269//150 961 | f 238//150 269//150 270//151 962 | f 236//151 270//151 253//152 963 | f 253//152 237//152 236//151 964 | f 270//151 236//151 238//150 965 | f 269//150 238//150 219//149 966 | f 268//149 219//149 215//148 967 | f 267//148 215//148 214//147 968 | f 266//147 214//147 217//146 969 | f 265//146 217//146 218//145 970 | f 264//145 218//145 216//144 971 | f 263//144 216//144 213//143 972 | f 262//143 213//143 212//142 973 | f 261//142 212//142 211//141 974 | f 260//141 211//141 225//140 975 | f 259//140 225//140 221//139 976 | f 258//139 221//139 220//138 977 | f 257//138 220//138 233//137 978 | f 256//137 233//137 232//136 979 | f 255//136 232//136 240//135 980 | f 254//135 240//135 68//134 981 | o mesh20 982 | f 162//153 271//153 272//153 983 | f 101//153 79//153 131//153 984 | f 162//153 273//153 271//153 985 | f 241//153 274//153 275//153 986 | f 276//153 277//153 210//153 987 | f 241//153 162//153 278//153 988 | f 162//153 279//153 280//153 989 | f 101//153 115//153 151//153 990 | f 101//153 121//153 119//153 991 | f 131//153 129//153 101//153 992 | f 79//153 135//153 133//153 993 | f 79//153 141//153 139//153 994 | f 59//153 162//153 281//153 995 | f 162//153 282//153 273//153 996 | f 275//153 162//153 241//153 997 | f 247//153 244//153 243//153 998 | f 241//153 249//153 248//153 999 | f 241//153 251//153 250//153 1000 | f 210//153 241//153 276//153 1001 | f 241//153 283//153 284//153 1002 | f 278//153 285//153 241//153 1003 | f 162//153 286//153 279//153 1004 | f 101//153 117//153 115//153 1005 | f 101//153 123//153 121//153 1006 | f 129//153 127//153 101//153 1007 | f 79//153 137//153 135//153 1008 | f 79//153 143//153 141//153 1009 | f 79//153 147//153 145//153 1010 | f 79//153 87//153 149//153 1011 | f 101//153 83//153 82//153 1012 | f 101//153 85//153 84//153 1013 | f 162//153 287//153 281//153 1014 | f 275//153 282//153 162//153 1015 | f 243//153 242//153 247//153 1016 | f 247//153 246//153 245//153 1017 | f 250//153 249//153 241//153 1018 | f 241//153 210//153 252//153 1019 | f 284//153 276//153 241//153 1020 | f 241//153 288//153 289//153 1021 | f 280//153 278//153 162//153 1022 | f 70//153 169//153 168//153 1023 | f 119//153 117//153 101//153 1024 | f 127//153 125//153 101//153 1025 | f 139//153 137//153 79//153 1026 | f 149//153 147//153 79//153 1027 | f 84//153 83//153 101//153 1028 | f 272//153 287//153 162//153 1029 | f 241//153 253//153 290//153 1030 | f 245//153 244//153 247//153 1031 | f 252//153 251//153 241//153 1032 | f 289//153 283//153 241//153 1033 | f 162//153 171//153 286//153 1034 | f 70//153 170//153 169//153 1035 | f 70//153 86//153 101//153 1036 | f 167//153 56//153 66//153 1037 | f 167//153 166//153 59//153 1038 | f 125//153 123//153 101//153 1039 | f 145//153 143//153 79//153 1040 | f 101//153 81//153 80//153 1041 | f 101//153 86//153 85//153 1042 | f 59//153 291//153 292//153 1043 | f 290//153 274//153 241//153 1044 | f 248//153 247//153 241//153 1045 | f 285//153 288//153 241//153 1046 | f 59//153 165//153 164//153 1047 | f 101//153 170//153 70//153 1048 | f 59//153 56//153 167//153 1049 | f 133//153 131//153 79//153 1050 | f 82//153 81//153 101//153 1051 | f 281//153 291//153 59//153 1052 | f 277//153 174//153 210//153 1053 | f 164//153 163//153 59//153 1054 | f 66//153 70//153 167//153 1055 | f 80//153 79//153 101//153 1056 | f 242//153 241//153 247//153 1057 | f 59//153 166//153 165//153 1058 | f 151//153 100//153 101//153 1059 | f 163//153 162//153 59//153 1060 | f 292//153 67//153 59//153 1061 | f 168//153 167//153 70//153 1062 | o mesh21 1063 | f 293//153 264//153 263//153 1064 | f 293//153 268//153 267//153 1065 | f 293//153 265//153 264//153 1066 | f 267//153 266//153 293//153 1067 | f 293//153 255//153 254//153 1068 | f 293//153 259//153 258//153 1069 | f 266//153 265//153 293//153 1070 | f 293//153 270//153 269//153 1071 | f 293//153 256//153 255//153 1072 | f 293//153 260//153 259//153 1073 | f 293//153 262//153 261//153 1074 | f 269//153 268//153 293//153 1075 | f 293//153 257//153 256//153 1076 | f 261//153 260//153 293//153 1077 | f 293//153 253//153 270//153 1078 | f 258//153 257//153 293//153 1079 | f 254//153 67//153 293//153 1080 | f 263//153 262//153 293//153 1081 | o mesh22 1082 | f 294//154 293//154 67//154 1083 | f 67//154 295//154 294//154 1084 | o mesh23 1085 | f 253//155 296//155 297//156 1086 | f 290//156 297//156 298//157 1087 | f 274//157 298//157 299//158 1088 | f 275//158 299//158 300//159 1089 | f 282//159 300//159 301//160 1090 | f 273//160 301//160 302//161 1091 | f 271//161 302//161 303//162 1092 | f 272//162 303//162 304//163 1093 | f 287//163 304//163 305//164 1094 | f 281//164 305//164 306//165 1095 | f 291//165 306//165 307//166 1096 | f 292//166 307//166 295//167 1097 | f 295//167 67//167 292//166 1098 | f 307//166 292//166 291//165 1099 | f 306//165 291//165 281//164 1100 | f 305//164 281//164 287//163 1101 | f 304//163 287//163 272//162 1102 | f 303//162 272//162 271//161 1103 | f 302//161 271//161 273//160 1104 | f 301//160 273//160 282//159 1105 | f 300//159 282//159 275//158 1106 | f 299//158 275//158 274//157 1107 | f 298//157 274//157 290//156 1108 | f 297//156 290//156 253//155 1109 | o mesh24 1110 | f 296//168 253//168 293//168 1111 | f 293//168 294//168 296//168 1112 | o mesh25 1113 | f 294//169 301//169 300//169 1114 | f 294//169 302//169 301//169 1115 | f 294//169 303//169 302//169 1116 | f 294//169 305//169 304//169 1117 | f 294//169 299//169 298//169 1118 | f 304//169 303//169 294//169 1119 | f 300//169 299//169 294//169 1120 | f 294//169 307//169 306//169 1121 | f 298//169 297//169 294//169 1122 | f 294//169 295//169 307//169 1123 | f 306//169 305//169 294//169 1124 | f 297//169 296//169 294//169 1125 | o mesh26 1126 | f 308//169 195//169 193//169 1127 | f 308//169 199//169 197//169 1128 | f 308//169 205//169 203//169 1129 | f 308//169 185//169 183//169 1130 | f 308//169 189//169 187//169 1131 | f 197//169 195//169 308//169 1132 | f 203//169 201//169 308//169 1133 | f 308//169 179//169 177//169 1134 | f 183//169 181//169 308//169 1135 | f 308//169 191//169 189//169 1136 | f 201//169 199//169 308//169 1137 | f 308//169 171//169 207//169 1138 | f 177//169 175//169 308//169 1139 | f 187//169 185//169 308//169 1140 | f 207//169 205//169 308//169 1141 | f 181//169 179//169 308//169 1142 | f 175//169 174//169 308//169 1143 | f 193//169 191//169 308//169 1144 | o mesh27 1145 | f 171//170 309//170 310//171 1146 | f 286//171 310//171 311//172 1147 | f 279//172 311//172 312//173 1148 | f 280//173 312//173 313//174 1149 | f 278//174 313//174 314//175 1150 | f 285//175 314//175 315//176 1151 | f 288//176 315//176 316//177 1152 | f 289//177 316//177 317//178 1153 | f 283//178 317//178 318//179 1154 | f 284//179 318//179 319//180 1155 | f 276//180 319//180 320//181 1156 | f 277//181 320//181 321//182 1157 | f 321//182 174//182 277//181 1158 | f 320//181 277//181 276//180 1159 | f 319//180 276//180 284//179 1160 | f 318//179 284//179 283//178 1161 | f 317//178 283//178 289//177 1162 | f 316//177 289//177 288//176 1163 | f 315//176 288//176 285//175 1164 | f 314//175 285//175 278//174 1165 | f 313//174 278//174 280//173 1166 | f 312//173 280//173 279//172 1167 | f 311//172 279//172 286//171 1168 | f 310//171 286//171 171//170 1169 | o mesh28 1170 | f 322//183 309//183 171//183 1171 | f 171//183 308//183 322//183 1172 | o mesh29 1173 | f 322//184 308//184 174//184 1174 | f 174//184 321//184 322//184 1175 | o mesh30 1176 | f 322//185 318//185 317//185 1177 | f 322//185 320//185 319//185 1178 | f 322//185 311//185 310//185 1179 | f 319//185 318//185 322//185 1180 | f 322//185 312//185 311//185 1181 | f 322//185 314//185 313//185 1182 | f 322//185 316//185 315//185 1183 | f 322//185 321//185 320//185 1184 | f 313//185 312//185 322//185 1185 | f 317//185 316//185 322//185 1186 | f 315//185 314//185 322//185 1187 | f 310//185 309//185 322//185 1188 | -------------------------------------------------------------------------------- /mecanum_bot_description/mecanum_bot/model.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | mecanum_bot 4 | 1.0 5 | model.sdf 6 | 7 | 8 | Yadunund 9 | yadunund@gmail.com 10 | 11 | 12 | 13 | A robot with four mecanum wheels 14 | 15 | 16 | -------------------------------------------------------------------------------- /mecanum_bot_description/mecanum_bot/model.sdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | false 11 | 12 | -0.0010000044107437 0.0 0.04050000384449959 0.0 0.0 0.0 13 | 5 14 | 15 | 0.05 16 | 0 17 | 0 18 | 0.05 19 | 0 20 | 0.05 21 | 22 | 23 | 24 | -0.0010000044107437 0.0 0.04050000384449959 0.0 0.0 0.0 25 | 26 | 27 | 0.39200000195503235 0.1939999908208847 0.219000001168251038 28 | 29 | 30 | 31 | 32 | 0 0 0 0 -0 0 33 | 34 | 35 | package://mecanum_bot_description/mecanum_bot/meshes/mecanum_bot_chassis.obj 36 | 1 1 1 37 | 38 | 39 | 40 | 41 | 42 | 43 | false 44 | 0.125 0.117 -0.041 0 0 0 45 | 46 | 0.2 47 | 48 | 0.0001 49 | 0 50 | 0 51 | 0.0001 52 | 0 53 | 0.0001 54 | 55 | 56 | 57 | 0 0 0 0 -0 0 58 | 59 | 60 | package://mecanum_bot_description/mecanum_bot/meshes/mecanum_bot_wheel.obj 61 | 1 1 1 62 | 63 | 64 | 65 | 66 | 67 | 68 | 0.05 69 | 70 | 71 | 72 | 73 | 74 | 10.0 75 | 0.0 76 | 0.0 77 | 0.0 78 | 1 -1 0 79 | 80 | 81 | 82 | 83 | 0 84 | 0.2 85 | 1e+5 86 | 1 87 | 0.01 88 | 0.0001 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | false 97 | -0.125 0.117 -0.041 0 0 0 98 | 99 | 0.2 100 | 101 | 0.0001 102 | 0 103 | 0 104 | 0.0001 105 | 0 106 | 0.0001 107 | 108 | 109 | 110 | 0 0 0 0 -0 0 111 | 112 | 113 | package://mecanum_bot_description/mecanum_bot/meshes/mecanum_bot_wheel.obj 114 | 1 1 1 115 | 116 | 117 | 118 | 119 | 120 | 121 | 0.05 122 | 123 | 124 | 125 | 126 | 127 | 10.0 128 | 0.0 129 | 0.0 130 | 0.0 131 | 1 1 0 132 | 133 | 134 | 135 | 136 | 0 137 | 0.2 138 | 1e+5 139 | 1 140 | 0.01 141 | 0.0001 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | false 150 | 0.125 -0.117 -0.041 0 0 0 151 | 152 | 0.2 153 | 154 | 0.0001 155 | 0 156 | 0 157 | 0.0001 158 | 0 159 | 0.0001 160 | 161 | 162 | 163 | 0 0 0 0 0 -3.14 164 | 165 | 166 | package://mecanum_bot_description/mecanum_bot/meshes/mecanum_bot_wheel.obj 167 | 1 1 1 168 | 169 | 170 | 171 | 172 | 173 | 174 | 0.05 175 | 176 | 177 | 178 | 179 | 180 | 10.0 181 | 0.0 182 | 0.0 183 | 0.0 184 | 1 1 0 185 | 186 | 187 | 188 | 189 | 0 190 | 0.2 191 | 1e+5 192 | 1 193 | 0.01 194 | 0.0001 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | false 203 | -0.125 -0.117 -0.041 0 0 0 204 | 205 | 0.2 206 | 207 | 0.0001 208 | 0 209 | 0 210 | 0.0001 211 | 0 212 | 0.0001 213 | 214 | 215 | 216 | 0 0 0 0 0 -3.14 217 | 218 | 219 | package://mecanum_bot_description/mecanum_bot/meshes/mecanum_bot_wheel.obj 220 | 1 1 1 221 | 222 | 223 | 224 | 225 | 226 | 227 | 0.05 228 | 229 | 230 | 231 | 232 | 233 | 10.0 234 | 0.0 235 | 0.0 236 | 0.0 237 | 1 -1 0 238 | 239 | 240 | 241 | 242 | 0 243 | 0.2 244 | 1e+5 245 | 1 246 | 0.01 247 | 0.0001 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 0.1 0. 0.1924 0 0 0 256 | 257 | 258 | 0.0001 259 | 0.000 260 | 0.000 261 | 0.0001 262 | 0.000 263 | 0.0001 264 | 265 | 0.125 266 | 267 | 268 | 269 | 270 | 0.06041127070784569 0.09593304991722107 0.0502999983727932 271 | 272 | 273 | 274 | 275 | 276 | 277 | package://mecanum_bot_description/mecanum_bot/meshes/ydlidar_x2l.obj 278 | 1.0 1.0 1.0 279 | 280 | 281 | 282 | 283 | true 284 | base_scan 285 | scan 286 | 8 287 | true 288 | 289 | 290 | 291 | 360 292 | 1.000000 293 | -3.14 294 | 3.14 295 | 296 | 297 | 298 | 0.08 299 | 12.0 300 | 0.015000 301 | 302 | 303 | gaussian 304 | 0.0 305 | 0.01 306 | 307 | 308 | 309 | 310 | 311 | 312 | 0.143 0.0 0.136 0 0 0 313 | 314 | 0.1 315 | 320 | 321 | 322 | -0.0165 0.0 -0.01525 0 0 0 323 | 324 | 325 | 0.033 0.11 0.054 326 | 327 | 328 | 329 | 330 | -0.0165 0.0 -0.01525 0 0 0 331 | 332 | 333 | 0.033 0.11 0.054 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 1.204 343 | 344 | 1280 345 | 720 346 | B8G8R8 347 | 348 | 349 | 0.1 350 | 100 351 | 352 | 353 | 354 | 0.012 355 | 10 356 | 357 | 358 | 359 | gaussian 360 | 0.0 361 | 0.01 362 | 363 | 364 | 0.080921 365 | -0.244505 366 | 0.006909 367 | 0.015070 368 | 0.000000 369 |
0.5 0.5
370 |
371 | 372 | stereographic 373 | 374 | 1049.904541 375 | 1048.576171 376 | 635.746276 377 | 364.500946 378 | 0.000000 379 | 380 | 381 |
382 | 1 383 | 15 384 | true 385 | rgbd_camera 386 | true 387 | oak_rgb_camera_optical_frame 388 |
389 | 390 | 391 | 392 | base_link 393 | front_left_wheel 394 | 395 | 0 1 0 396 | 397 | -1.79769e+308 398 | 1.79769e+308 399 | 400 | 401 | 402 | 403 | 404 | base_link 405 | rear_left_wheel 406 | 407 | 0 1 0 408 | 409 | -1.79769e+308 410 | 1.79769e+308 411 | 412 | 413 | 414 | 415 | 416 | base_link 417 | front_right_wheel 418 | 419 | 0 1 0 420 | 421 | -1.79769e+308 422 | 1.79769e+308 423 | 424 | 425 | 426 | 427 | 428 | base_link 429 | rear_right_wheel 430 | 431 | 0 1 0 432 | 433 | -1.79769e+308 434 | 1.79769e+308 435 | 436 | 437 | 438 | 439 | 440 | base_link 441 | base_scan 442 | 443 | 444 | 445 | base_footprint 446 | base_link 447 | 448 | 449 | 450 | base_link 451 | oak-d_frame 452 | 453 | 454 | 455 | 458 | front_left_wheel_joint 459 | front_right_wheel_joint 460 | rear_left_wheel_joint 461 | rear_right_wheel_joint 462 | 0.234 463 | 0.25 464 | 0.048 465 | -0.5 466 | 0.5 467 | 468 | 469 | 474 | 477 | base_footprint 478 | wheel_odom 479 | 50 480 | 0.1 481 | 482 | 483 | 486 | 487 | 488 |
489 |
490 | -------------------------------------------------------------------------------- /mecanum_bot_description/mecanum_bot_description_gazebo_paths.dsv.in: -------------------------------------------------------------------------------- 1 | # Adding @CMAKE_INSTALL_PREFIX@/share/ without the @PROJECT_NAME@ allows both gazebo and resource_retriever to 2 | # resoolve URIs of type packace:// 3 | prepend-non-duplicate;GZ_SIM_RESOURCE_PATH;@CMAKE_INSTALL_PREFIX@/share/@PROJECT_NAME@/ 4 | prepend-non-duplicate;GZ_SIM_RESOURCE_PATH;@CMAKE_INSTALL_PREFIX@/share/ 5 | prepend-non-duplicate;GZ_SIM_SYSTEM_PLUGIN_PATH;@CMAKE_INSTALL_PREFIX@/lib 6 | prepend-non-duplicate;IGN_GAZEBO_RESOURCE_PATH;@CMAKE_INSTALL_PREFIX@/share/@PROJECT_NAME@/ 7 | prepend-non-duplicate;IGN_GAZEBO_SYSTEM_PLUGIN_PATH;@CMAKE_INSTALL_PREFIX@/lib 8 | prepend-non-duplicate;IGN_GAZEBO_RESOURCE_PATH;@CMAKE_INSTALL_PREFIX@/share/ 9 | -------------------------------------------------------------------------------- /mecanum_bot_description/package.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | mecanum_bot_description 5 | 0.0.0 6 | SDF model of mecanum_bot 7 | Yadunund 8 | Apache License 2.0 9 | 10 | ament_cmake 11 | 12 | ignition-fortress 13 | launch_ros 14 | robot_state_publisher 15 | ros_gz_bridge 16 | rviz2 17 | 18 | ament_lint_auto 19 | ament_lint_common 20 | 21 | 22 | ament_cmake 23 | 24 | 25 | -------------------------------------------------------------------------------- /mecanum_bot_description/rviz/view_robot.rviz: -------------------------------------------------------------------------------- 1 | Panels: 2 | - Class: rviz_common/Displays 3 | Help Height: 138 4 | Name: Displays 5 | Property Tree Widget: 6 | Expanded: 7 | - /Global Options1 8 | - /Status1 9 | - /TF1/Frames1 10 | - /LaserScan1/Topic1 11 | - /Image1/Topic1 12 | - /Image2 13 | - /Image2/Topic1 14 | Splitter Ratio: 0.5 15 | Tree Height: 736 16 | - Class: rviz_common/Selection 17 | Name: Selection 18 | - Class: rviz_common/Tool Properties 19 | Expanded: 20 | - /2D Goal Pose1 21 | - /Publish Point1 22 | Name: Tool Properties 23 | Splitter Ratio: 0.5886790156364441 24 | - Class: rviz_common/Views 25 | Expanded: 26 | - /Current View1 27 | Name: Views 28 | Splitter Ratio: 0.5 29 | - Class: rviz_common/Time 30 | Experimental: false 31 | Name: Time 32 | SyncMode: 0 33 | SyncSource: LaserScan 34 | Visualization Manager: 35 | Class: "" 36 | Displays: 37 | - Alpha: 0.5 38 | Cell Size: 1 39 | Class: rviz_default_plugins/Grid 40 | Color: 160; 160; 164 41 | Enabled: true 42 | Line Style: 43 | Line Width: 0.029999999329447746 44 | Value: Lines 45 | Name: Grid 46 | Normal Cell Count: 0 47 | Offset: 48 | X: 0 49 | Y: 0 50 | Z: 0 51 | Plane: XY 52 | Plane Cell Count: 10 53 | Reference Frame: 54 | Value: true 55 | - Class: rviz_default_plugins/TF 56 | Enabled: true 57 | Frame Timeout: 15 58 | Frames: 59 | All Enabled: true 60 | base_footprint: 61 | Value: true 62 | base_link: 63 | Value: true 64 | base_scan: 65 | Value: true 66 | front_left_wheel: 67 | Value: true 68 | front_right_wheel: 69 | Value: true 70 | oak-d_frame: 71 | Value: true 72 | wheel_odom: 73 | Value: true 74 | rear_left_wheel: 75 | Value: true 76 | rear_right_wheel: 77 | Value: true 78 | Marker Scale: 0.30000001192092896 79 | Name: TF 80 | Show Arrows: true 81 | Show Axes: true 82 | Show Names: true 83 | Tree: 84 | wheel_odom: 85 | base_footprint: 86 | base_link: 87 | base_scan: 88 | {} 89 | front_left_wheel: 90 | {} 91 | front_right_wheel: 92 | {} 93 | oak-d_frame: 94 | {} 95 | rear_left_wheel: 96 | {} 97 | rear_right_wheel: 98 | {} 99 | Update Interval: 0 100 | Value: true 101 | - Alpha: 1 102 | Autocompute Intensity Bounds: true 103 | Autocompute Value Bounds: 104 | Max Value: 10 105 | Min Value: -10 106 | Value: true 107 | Axis: Z 108 | Channel Name: intensity 109 | Class: rviz_default_plugins/LaserScan 110 | Color: 255; 255; 255 111 | Color Transformer: Intensity 112 | Decay Time: 0 113 | Enabled: true 114 | Invert Rainbow: false 115 | Max Color: 255; 255; 255 116 | Max Intensity: 0 117 | Min Color: 0; 0; 0 118 | Min Intensity: 0 119 | Name: LaserScan 120 | Position Transformer: XYZ 121 | Selectable: true 122 | Size (Pixels): 3 123 | Size (m): 0.009999999776482582 124 | Style: Flat Squares 125 | Topic: 126 | Depth: 5 127 | Durability Policy: Volatile 128 | Filter size: 10 129 | History Policy: Keep Last 130 | Reliability Policy: Best Effort 131 | Value: /scan 132 | Use Fixed Frame: true 133 | Use rainbow: true 134 | Value: true 135 | - Alpha: 1 136 | Class: rviz_default_plugins/RobotModel 137 | Collision Enabled: false 138 | Description File: "" 139 | Description Source: Topic 140 | Description Topic: 141 | Depth: 5 142 | Durability Policy: Volatile 143 | History Policy: Keep Last 144 | Reliability Policy: Reliable 145 | Value: /robot_description 146 | Enabled: true 147 | Links: 148 | All Links Enabled: true 149 | Expand Joint Details: false 150 | Expand Link Details: false 151 | Expand Tree: false 152 | Link Tree Style: Links in Alphabetic Order 153 | base_footprint: 154 | Alpha: 1 155 | Show Axes: false 156 | Show Trail: false 157 | base_link: 158 | Alpha: 1 159 | Show Axes: false 160 | Show Trail: false 161 | Value: true 162 | base_scan: 163 | Alpha: 1 164 | Show Axes: false 165 | Show Trail: false 166 | Value: true 167 | front_left_wheel: 168 | Alpha: 1 169 | Show Axes: false 170 | Show Trail: false 171 | Value: true 172 | front_right_wheel: 173 | Alpha: 1 174 | Show Axes: false 175 | Show Trail: false 176 | Value: true 177 | oak-d_frame: 178 | Alpha: 1 179 | Show Axes: false 180 | Show Trail: false 181 | Value: true 182 | rear_left_wheel: 183 | Alpha: 1 184 | Show Axes: false 185 | Show Trail: false 186 | Value: true 187 | rear_right_wheel: 188 | Alpha: 1 189 | Show Axes: false 190 | Show Trail: false 191 | Value: true 192 | Mass Properties: 193 | Inertia: false 194 | Mass: false 195 | Name: RobotModel 196 | TF Prefix: "" 197 | Update Interval: 0 198 | Value: true 199 | Visual Enabled: true 200 | - Class: rviz_default_plugins/Image 201 | Enabled: true 202 | Max Value: 1 203 | Median window: 5 204 | Min Value: 0 205 | Name: Image 206 | Normalize Range: true 207 | Topic: 208 | Depth: 5 209 | Durability Policy: Volatile 210 | History Policy: Keep Last 211 | Reliability Policy: Reliable 212 | Value: /oak/rgb/image_raw 213 | Value: true 214 | - Class: rviz_default_plugins/Image 215 | Enabled: true 216 | Max Value: 10 217 | Median window: 5 218 | Min Value: 0 219 | Name: Image 220 | Normalize Range: false 221 | Topic: 222 | Depth: 5 223 | Durability Policy: Volatile 224 | History Policy: Keep Last 225 | Reliability Policy: Reliable 226 | Value: /oak/stereo/image_raw 227 | Value: true 228 | Enabled: true 229 | Global Options: 230 | Background Color: 48; 48; 48 231 | Fixed Frame: wheel_odom 232 | Frame Rate: 30 233 | Name: root 234 | Tools: 235 | - Class: rviz_default_plugins/Interact 236 | Hide Inactive Objects: true 237 | - Class: rviz_default_plugins/MoveCamera 238 | - Class: rviz_default_plugins/Select 239 | - Class: rviz_default_plugins/FocusCamera 240 | - Class: rviz_default_plugins/Measure 241 | Line color: 128; 128; 0 242 | - Class: rviz_default_plugins/SetInitialPose 243 | Covariance x: 0.25 244 | Covariance y: 0.25 245 | Covariance yaw: 0.06853891909122467 246 | Topic: 247 | Depth: 5 248 | Durability Policy: Volatile 249 | History Policy: Keep Last 250 | Reliability Policy: Reliable 251 | Value: /initialpose 252 | - Class: rviz_default_plugins/SetGoal 253 | Topic: 254 | Depth: 5 255 | Durability Policy: Volatile 256 | History Policy: Keep Last 257 | Reliability Policy: Reliable 258 | Value: /goal_pose 259 | - Class: rviz_default_plugins/PublishPoint 260 | Single click: true 261 | Topic: 262 | Depth: 5 263 | Durability Policy: Volatile 264 | History Policy: Keep Last 265 | Reliability Policy: Reliable 266 | Value: /clicked_point 267 | Transformation: 268 | Current: 269 | Class: rviz_default_plugins/TF 270 | Value: true 271 | Views: 272 | Current: 273 | Class: rviz_default_plugins/Orbit 274 | Distance: 1.537858009338379 275 | Enable Stereo Rendering: 276 | Stereo Eye Separation: 0.05999999865889549 277 | Stereo Focal Distance: 1 278 | Swap Stereo Eyes: false 279 | Value: false 280 | Focal Point: 281 | X: 0.3060169219970703 282 | Y: 0.15957649052143097 283 | Z: 0.17273873090744019 284 | Focal Shape Fixed Size: true 285 | Focal Shape Size: 0.05000000074505806 286 | Invert Z Axis: false 287 | Name: Current View 288 | Near Clip Distance: 0.009999999776482582 289 | Pitch: 0.2753981649875641 290 | Target Frame: 291 | Value: Orbit (rviz) 292 | Yaw: 0.4554128348827362 293 | Saved: ~ 294 | Window Geometry: 295 | Displays: 296 | collapsed: false 297 | Height: 2032 298 | Hide Left Dock: false 299 | Hide Right Dock: true 300 | Image: 301 | collapsed: false 302 | QMainWindow State: 000000ff00000000fd0000000400000000000002d6000006eefc020000000afb0000001200530065006c0065006300740069006f006e00000001e10000009b000000b000fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000006e000003d80000018200fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261fb0000000a0049006d0061006700650100000452000001780000004a00fffffffb0000000a0049006d00610067006501000005d6000001860000004a00ffffff000000010000015f00000401fc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073000000006e000004010000013200fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e100000197000000030000073a0000005afc0100000002fb0000000800540069006d006501000000000000073a0000058100fffffffb0000000800540069006d0065010000000000000450000000000000000000000458000006ee00000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 303 | Selection: 304 | collapsed: false 305 | Time: 306 | collapsed: false 307 | Tool Properties: 308 | collapsed: false 309 | Views: 310 | collapsed: true 311 | Width: 1850 312 | X: 1990 313 | Y: 54 314 | -------------------------------------------------------------------------------- /mecanum_bot_description/worlds/example_world.sdf: -------------------------------------------------------------------------------- 1 | 2 | 15 | 16 | 17 | 18 | 19 | 0.001 20 | 1.0 21 | 22 | 25 | 26 | 29 | ogre2 30 | 31 | 34 | 35 | 38 | 39 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 3D View 49 | false 50 | docked 51 | 52 | 53 | ogre2 54 | scene 55 | 0.4 0.4 0.4 56 | 0.8 0.8 0.8 57 | -6 0 6 0 0.5 0 58 | 59 | 60 | 61 | 62 | 63 | floating 64 | 5 65 | 5 66 | false 67 | 68 | 69 | 70 | 71 | false 72 | 5 73 | 5 74 | floating 75 | false 76 | 77 | 78 | 79 | 80 | false 81 | 5 82 | 5 83 | floating 84 | false 85 | 86 | 87 | 88 | 89 | false 90 | 5 91 | 5 92 | floating 93 | false 94 | 95 | 96 | 97 | 98 | 99 | World control 100 | false 101 | false 102 | 72 103 | 121 104 | 1 105 | 106 | floating 107 | 108 | 109 | 110 | 111 | 112 | 113 | true 114 | true 115 | true 116 | true 117 | 118 | 119 | 120 | 121 | 122 | World stats 123 | false 124 | false 125 | 110 126 | 290 127 | 1 128 | 129 | floating 130 | 131 | 132 | 133 | 134 | 135 | 136 | true 137 | true 138 | true 139 | true 140 | 141 | 142 | 145 | 146 | 147 | 148 | 149 | 150 | docked 151 | 152 | 153 | 154 | 155 | 156 | 157 | docked 158 | 159 | 160 | 161 | 162 | 163 | false 164 | 0 0 10 0 0 0 165 | 1 1 1 1 166 | 0.5 0.5 0.5 1 167 | 168 | 1000 169 | 0.9 170 | 0.01 171 | 0.001 172 | 173 | -0.5 0.1 -0.9 174 | 175 | 176 | 177 | true 178 | 179 | 180 | 181 | 182 | 0 0 1 183 | 100 100 184 | 185 | 186 | 187 | 188 | 189 | 50 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 0 0 1 198 | 100 100 199 | 200 | 201 | 202 | 0.8 0.8 0.8 1 203 | 0.8 0.8 0.8 1 204 | 0.8 0.8 0.8 1 205 | 206 | 207 | 208 | 209 | 210 | 211 | mecanum_bot 212 | model://mecanum_bot 213 | 0.1 0.1 0.1 0 0 0 214 | false 215 | 216 | 217 | 218 | 2.0 0 0.5 0 0 0 219 | 220 | 221 | 222 | 1 223 | 0 224 | 0 225 | 1 226 | 0 227 | 1 228 | 229 | 1.0 230 | 231 | 232 | 233 | 234 | 1 1 1 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 1 1 1 243 | 244 | 245 | 246 | 1 0 0 1 247 | 1 0 0 1 248 | 1 0 0 1 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | --------------------------------------------------------------------------------