├── 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 | 
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 | [](https://www.youtube.com/watch?v=9J7-lWX2Y_A&feature=youtu.be)
10 |
11 |
12 | ## Hardware Design
13 |
14 | 
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 | 
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 |
--------------------------------------------------------------------------------