initial forking commit
This commit is contained in:
32
.docker/Dockerfile
Normal file
32
.docker/Dockerfile
Normal file
@@ -0,0 +1,32 @@
|
||||
FROM osrf/ros:humble-desktop
|
||||
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
ARG USER_UID=1001
|
||||
ARG USER_GID=1001
|
||||
ARG USERNAME=user
|
||||
|
||||
WORKDIR /workspaces
|
||||
|
||||
RUN groupadd --gid $USER_GID $USERNAME \
|
||||
&& useradd --uid $USER_UID --gid $USER_GID -m $USERNAME \
|
||||
&& mkdir -p -m 0700 /run/user/"${USER_UID}" \
|
||||
&& mkdir -p -m 0700 /run/user/"${USER_UID}"/gdm \
|
||||
&& chown user:user /run/user/"${USER_UID}" \
|
||||
&& chown user:user /workspaces \
|
||||
&& chown user:user /run/user/"${USER_UID}"/gdm
|
||||
|
||||
RUN apt-get update && \
|
||||
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
|
||||
ros-humble-xacro \
|
||||
ros-humble-joint-state-publisher-gui \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
ENV XDG_RUNTIME_DIR=/run/user/"${USER_UID}"
|
||||
|
||||
USER $USERNAME
|
||||
|
||||
RUN echo "source /ros_entrypoint.sh" >>~/.bashrc
|
||||
ARG MAX_ROS_DOMAIN_ID=232
|
||||
RUN echo "export ROS_DOMAIN_ID=100" >>~/.bashrc
|
||||
RUN echo "set +e" >>~/.bashrc
|
||||
14
.docker/create_urdf.entrypoint.sh
Executable file
14
.docker/create_urdf.entrypoint.sh
Executable file
@@ -0,0 +1,14 @@
|
||||
#!/bin/bash
|
||||
|
||||
args=$*
|
||||
shift $#
|
||||
|
||||
source /ros_entrypoint.sh
|
||||
|
||||
cd /workspaces
|
||||
colcon build --packages-select franka_description > /dev/null
|
||||
source install/setup.bash
|
||||
|
||||
cd src/franka_description
|
||||
|
||||
python3 scripts/create_urdf.py $args
|
||||
10
.docker/visualize_franka.entrypoint.sh
Executable file
10
.docker/visualize_franka.entrypoint.sh
Executable file
@@ -0,0 +1,10 @@
|
||||
#!/bin/bash
|
||||
|
||||
args=$*
|
||||
shift $#
|
||||
|
||||
cd /workspaces
|
||||
colcon build --packages-select franka_description > /dev/null
|
||||
source install/setup.bash
|
||||
|
||||
ros2 launch franka_description visualize_franka.launch.py ${args}
|
||||
15
.flake8
Normal file
15
.flake8
Normal file
@@ -0,0 +1,15 @@
|
||||
[flake8]
|
||||
max-line-length = 100
|
||||
|
||||
; extend-exclude =
|
||||
; franka_api,
|
||||
|
||||
extend-ignore =
|
||||
# See https://github.com/PyCQA/pycodestyle/issues/373
|
||||
E203,
|
||||
|
||||
# TODO(qu_zh): Add "E501 line too long" check later
|
||||
E501,
|
||||
|
||||
# See https://github.com/behave/behave/issues/574
|
||||
F811,
|
||||
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
*.pyc
|
||||
*.urdf
|
||||
*.env
|
||||
38
CHANGELOG.rst
Normal file
38
CHANGELOG.rst
Normal file
@@ -0,0 +1,38 @@
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Changelog for package franka_description
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
0.4.0 (2024-12-11)
|
||||
------------------
|
||||
* feature: no prefix option added
|
||||
* fix: use phong instead of lambert shading
|
||||
* fix: script create_urdf.sh needs the correct user id
|
||||
* feature: adding the .xacro definition for multi arm setups
|
||||
|
||||
0.3.0 (2024-11-27)
|
||||
------------------
|
||||
* feature: franka_ign_ros2_control plugin for gazebo
|
||||
* feature: gazebo simulation joint friction and gazebo effort interface param
|
||||
* feature: support gazebo simulation in ros2
|
||||
* fix: rpy values added
|
||||
* fix: link0 inertials added
|
||||
* fix: formatting python
|
||||
* fix: gazebo ros2 plugin name
|
||||
* change: changed minor principal moment of inertia to satisfy triangle inequality
|
||||
* other: Update copyright date
|
||||
* Contributors: Andreas Kuhner, Baris Yazici, Guillermo Gomez Pena, Marius Winkelmeier
|
||||
|
||||
0.2.0 (2024-05-21)
|
||||
------------------
|
||||
|
||||
* feat: end-effector can be deactivated with an argument
|
||||
* feat: add dedicated folder for end-effectors
|
||||
* fix: license name in readme
|
||||
* Contributors: Guillermo Gomez Pena
|
||||
|
||||
0.1.10 (2024-04-22)
|
||||
-------------------
|
||||
|
||||
0.1.0 (2024-01-26)
|
||||
------------------
|
||||
* Publish franka_description
|
||||
* Contributors: Baris Yazici, Enrico Sartori
|
||||
35
CMakeLists.txt
Normal file
35
CMakeLists.txt
Normal file
@@ -0,0 +1,35 @@
|
||||
# Copyright (c) 2023 Franka Robotics GmbH
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
project(franka_description)
|
||||
find_package(ament_cmake REQUIRED)
|
||||
|
||||
|
||||
if(BUILD_TESTING)
|
||||
find_package(ament_lint_auto REQUIRED)
|
||||
ament_lint_auto_find_test_dependencies()
|
||||
|
||||
find_package(ament_cmake_pytest REQUIRED)
|
||||
ament_add_pytest_test(${PROJECT_NAME}_urdf_tests test/urdf_tests.py)
|
||||
|
||||
endif()
|
||||
|
||||
# Install launch files.
|
||||
install(DIRECTORY
|
||||
launch robots end_effectors meshes rviz
|
||||
DESTINATION share/${PROJECT_NAME}/
|
||||
)
|
||||
|
||||
ament_package()
|
||||
18
CONTRIBUTING.md
Normal file
18
CONTRIBUTING.md
Normal file
@@ -0,0 +1,18 @@
|
||||
Any contribution that you make to this repository will
|
||||
be under the Apache 2 License, as dictated by that
|
||||
[license](http://www.apache.org/licenses/LICENSE-2.0.html):
|
||||
|
||||
~~~
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
~~~
|
||||
|
||||
Contributors must sign-off each commit by adding a `Signed-off-by: ...`
|
||||
line to commit messages to certify that they have the right to submit
|
||||
the code they are contributing to the project according to the
|
||||
[Developer Certificate of Origin (DCO)](https://developercertificate.org/).
|
||||
237
LICENSE
Normal file
237
LICENSE
Normal file
@@ -0,0 +1,237 @@
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
|
||||
|
||||
----------------------------
|
||||
|
||||
|
||||
|
||||
Software License Agreement (BSD License)
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following
|
||||
disclaimer in the documentation and/or other materials provided
|
||||
with the distribution.
|
||||
* Neither the name of Willow Garage, Inc. nor the names of its
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
15
NOTICE
Normal file
15
NOTICE
Normal file
@@ -0,0 +1,15 @@
|
||||
franka_description
|
||||
|
||||
Copyright 2023 Franka Robotics GmbH
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
67
README.md
Normal file
67
README.md
Normal file
@@ -0,0 +1,67 @@
|
||||
# Franka Description
|
||||
|
||||
## Overview
|
||||
|
||||
The Franka Description repository offers all Franka Robotics models. It includes detailed 3D models and essential robot parameters, crucial for simulating these robots in various environments. Additionally, the repository provides a feature to create URDFs (Unified Robot Description Format) for the selected Franka robot model.
|
||||
|
||||
## Features
|
||||
|
||||
- **Comprehensive 3D Models**: Detailed 3D models of all Franka Robotics models for accurate simulation and visualization.
|
||||
- **Robot Parameters**: All necessary robot parameters for realistic and reliable simulations.
|
||||
- **URDF Creation**: Ability to create URDF files for any selected Franka robot model, essential for robot simulations in ROS and other robotic middleware.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Docker
|
||||
|
||||
### URDF Creation
|
||||
|
||||
To start the generation, execute the start.sh script. The arguments passed to the sh script will be used from the create_urdf.py.
|
||||
|
||||
```
|
||||
# Start the generation of the urdf model
|
||||
./scripts/create_urdf.sh <robot_id> <ee_id>
|
||||
```
|
||||
|
||||
The urdf generation is performed by the create_urdf.py script which offers several parameters to customize the output urdf model:
|
||||
|
||||
```
|
||||
usage: create_urdf.py [-h] [--robot-ee] [--no-ee] [--with-sc] [--abs-path] [--host-dir HOST_DIR] [--only-ee] [--no-prefix] robot_model
|
||||
|
||||
Generate franka robots urdf models. Script to be executed from franka_description root folder!
|
||||
|
||||
positional arguments:
|
||||
robot_model id of the robot model (accepted values are: fr3, fp3, fer, multi_arm, none)
|
||||
|
||||
optional arguments:
|
||||
-h, --help show this help message and exit
|
||||
--robot-ee id of the robot end effector (accepted values are: franka_hand, cobot_pump)
|
||||
--no-ee Disable loading of end-effector (robot-ee would be ingnored if set) [WARNING: this argument will be removed in future releases, introducing "none" as ee id].
|
||||
--with-sc Include self-collision volumes in the urdf model.
|
||||
--abs-path Use absolute paths.
|
||||
--host-dir HOST_DIR Provide a host directory for the absolute path.
|
||||
--only-ee Get URDF with solely end-effector data
|
||||
--no-prefix Override the robot prefix of links, joints and visuals in the urdf file.
|
||||
```
|
||||
|
||||
### Visualize via ROS2
|
||||
|
||||
`franka_description` is offered as a ROS2 package.
|
||||
The urdf file can be visualized via RViz with the following command:
|
||||
|
||||
```
|
||||
# visualize_franka.sh launches the visualize_franka.launch.py in a ros2 instance running in the docker container
|
||||
# The arguments given to the .sh script are forwarded as launch arguments
|
||||
# Accepted launch arguments are:
|
||||
# arm_id - accepted values are: fr3, fp3, fer
|
||||
# load_gripper - accepted values are: true (default ee_id is franka_hand), false (ee_id will be ignored) [WARNING: this argument will be removed in future releases, introducing "none" as ee id]
|
||||
# ee_id - accepted values are: franka_hand, cobot_pump
|
||||
|
||||
./scripts/visualize_franka.sh arm_id:=<robot_id>
|
||||
|
||||
```
|
||||
|
||||
|
||||
## License
|
||||
|
||||
This project is licensed under the Apache License 2.0 - see the [LICENSE](LICENSE) file for details.
|
||||
21
end_effectors/cobot_pump/cobot_pump.urdf.xacro
Normal file
21
end_effectors/cobot_pump/cobot_pump.urdf.xacro
Normal file
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="cobot_pump">
|
||||
<xacro:include filename="$(find franka_description)/end_effectors/common/utils.xacro" />
|
||||
<xacro:include filename="$(find franka_description)/end_effectors/common/ee_with_one_link.xacro"/>
|
||||
<xacro:include filename="$(find franka_description)/end_effectors/cobot_pump/cobot_pump_arguments.xacro"/>
|
||||
|
||||
<xacro:ee_with_one_link connected_to="$(arg special_connection)"
|
||||
arm_id="$(arg arm_id)"
|
||||
ee_id="$(arg ee_id)"
|
||||
ee_inertials="${xacro.load_yaml('$(find franka_description)/end_effectors/$(arg ee_id)/inertials.yaml')}"
|
||||
rpy_ee="$(arg rpy_ee)"
|
||||
xyz_ee="$(arg xyz_ee)"
|
||||
tcp_xyz="$(arg tcp_xyz)"
|
||||
tcp_rpy="$(arg tcp_rpy)"
|
||||
safety_distance="$(arg safety_distance)"
|
||||
gazebo="$(arg gazebo)"
|
||||
description_pkg="$(arg description_pkg)"
|
||||
with_sc="$(arg with_sc)">
|
||||
</xacro:ee_with_one_link>
|
||||
|
||||
</robot>
|
||||
37
end_effectors/cobot_pump/cobot_pump_arguments.xacro
Normal file
37
end_effectors/cobot_pump/cobot_pump_arguments.xacro
Normal file
@@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
|
||||
|
||||
<!-- Name for the robot -->
|
||||
<xacro:arg name="arm_id" default="fp3" />
|
||||
|
||||
<!-- End-effector id" -->
|
||||
<xacro:arg name="ee_id" default="cobot_pump" />
|
||||
|
||||
<!-- Where is the end-effector connected to, if different from the robot flange? -->
|
||||
<xacro:arg name="special_connection" default="" />
|
||||
|
||||
<!-- Should self-collision be enabled? -->
|
||||
<xacro:arg name="with_sc" default="false" />
|
||||
|
||||
<!-- Position offset between ee and parent frame -->
|
||||
<xacro:arg name="xyz_ee" default="0 0 0" />
|
||||
|
||||
<!-- Rotation offset between ee and parent frame -->
|
||||
<xacro:arg name="rpy_ee" default= "0 0 0" />
|
||||
|
||||
<!-- Position offset between ee frame and tcp frame -->
|
||||
<xacro:arg name="tcp_xyz" default="0 0 0.105" />
|
||||
|
||||
<!-- Rotation offset between ee frame and tcp frame -->
|
||||
<xacro:arg name="tcp_rpy" default="0 0 0" />
|
||||
|
||||
<!-- Safety distance for the collision capsules -->
|
||||
<xacro:arg name="safety_distance" default="0.03" />
|
||||
|
||||
<!-- Is the robot being simulated in gazebo? -->
|
||||
<xacro:arg name="gazebo" default="false" />
|
||||
|
||||
<!-- Name of the description package -->
|
||||
<xacro:arg name="description_pkg" default="franka_description" />
|
||||
|
||||
</robot>
|
||||
13
end_effectors/cobot_pump/inertials.yaml
Normal file
13
end_effectors/cobot_pump/inertials.yaml
Normal file
@@ -0,0 +1,13 @@
|
||||
cobot_pump:
|
||||
origin:
|
||||
xyz: 0 0 0.063
|
||||
rpy: 0 0 0
|
||||
mass: 1.01
|
||||
inertia:
|
||||
xx: 0.001
|
||||
yy: 0.001
|
||||
zz: 0.001
|
||||
xy: 0
|
||||
xz: 0
|
||||
yz: 0
|
||||
|
||||
32
end_effectors/common/ee_with_one_link.xacro
Normal file
32
end_effectors/common/ee_with_one_link.xacro
Normal file
@@ -0,0 +1,32 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="ee_with_one_link">
|
||||
<!-- safety_distance: Minimum safety distance in [m] by which the collision volumes are expanded and which is enforced during robot motions -->
|
||||
<xacro:macro name="ee_with_one_link" params="connected_to:='' arm_id arm_prefix:='' ee_id ee_inertials rpy_ee:='0 0 0' xyz_ee:='0 0 0' tcp_xyz:='0 0 0' tcp_rpy:='0 0 0' safety_distance:=0 gazebo:=false description_pkg:=franka_description with_sc:=false">
|
||||
<xacro:property name="ee_prefix" default="robot_"/>
|
||||
<xacro:unless value="${arm_id == ''}">
|
||||
<xacro:property name="ee_prefix" value="${arm_prefix}${arm_id}_" />
|
||||
</xacro:unless>
|
||||
<xacro:unless value="${connected_to == ''}">
|
||||
<joint name="${ee_prefix}${ee_id}_joint" type="fixed">
|
||||
<parent link="${connected_to}" />
|
||||
<child link="${ee_prefix}${ee_id}" />
|
||||
<origin xyz="${xyz_ee}" rpy="${rpy_ee}" />
|
||||
</joint>
|
||||
</xacro:unless>
|
||||
|
||||
<xacro:ee_link_with_sc name="${ee_id}" gazebo="${gazebo}" with_sc="${with_sc}">
|
||||
<self_collision_geometries>
|
||||
<xacro:collision_capsule xyz="0 0 0.04" direction="y" radius="${0.04+safety_distance}" length="0.1" />
|
||||
<xacro:collision_capsule xyz="0 0 0.10" direction="y" radius="${0.02+safety_distance}" length="0.1" />
|
||||
</self_collision_geometries>
|
||||
</xacro:ee_link_with_sc>
|
||||
|
||||
<!-- Define the ${ee_id}_tcp frame -->
|
||||
<link name="${ee_prefix}${ee_id}_tcp" />
|
||||
<joint name="${ee_prefix}${ee_id}_tcp_joint" type="fixed">
|
||||
<origin xyz="${tcp_xyz}" rpy="${tcp_rpy}" />
|
||||
<parent link="${ee_prefix}${ee_id}" />
|
||||
<child link="${ee_prefix}${ee_id}_tcp" />
|
||||
</joint>
|
||||
</xacro:macro>
|
||||
</robot>
|
||||
126
end_effectors/common/franka_hand.xacro
Normal file
126
end_effectors/common/franka_hand.xacro
Normal file
@@ -0,0 +1,126 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="hand">
|
||||
<!-- safety_distance: Minimum safety distance in [m] by which the collision volumes are expanded and which is enforced during robot motions -->
|
||||
<xacro:macro name="franka_hand" params="connected_to:='' arm_id arm_prefix:='' ee_id ee_inertials rpy_ee:='0 0 0' xyz_ee:='0 0 0' tcp_xyz:='0 0 0.1034' tcp_rpy:='0 0 0' safety_distance:=0 gazebo:=false description_pkg:=franka_description with_sc:=false">
|
||||
<xacro:property name="ee_prefix" default="robot_"/>
|
||||
<xacro:unless value="${arm_id == ''}">
|
||||
<xacro:property name="ee_prefix" value="${arm_prefix}${arm_id}_" />
|
||||
</xacro:unless>
|
||||
<xacro:unless value="${connected_to == ''}">
|
||||
<joint name="${ee_prefix}hand_joint" type="fixed">
|
||||
<parent link="${connected_to}" />
|
||||
<child link="${ee_prefix}hand" />
|
||||
<origin xyz="${xyz_ee}" rpy="${rpy_ee}" />
|
||||
</joint>
|
||||
</xacro:unless>
|
||||
|
||||
<xacro:ee_link_with_sc name="hand" gazebo="${gazebo}" with_sc="${with_sc}">
|
||||
<self_collision_geometries>
|
||||
<xacro:collision_capsule xyz="0 0 0.04" direction="y" radius="${0.04+safety_distance}" length="0.1" />
|
||||
<xacro:collision_capsule xyz="0 0 0.10" direction="y" radius="${0.02+safety_distance}" length="0.1" />
|
||||
</self_collision_geometries>
|
||||
</xacro:ee_link_with_sc>
|
||||
|
||||
<!-- Define the hand_tcp frame -->
|
||||
<link name="${ee_prefix}hand_tcp" />
|
||||
<joint name="${ee_prefix}hand_tcp_joint" type="fixed">
|
||||
<origin xyz="${tcp_xyz}" rpy="${tcp_rpy}" />
|
||||
<parent link="${ee_prefix}hand" />
|
||||
<child link="${ee_prefix}hand_tcp" />
|
||||
</joint>
|
||||
<link name="${ee_prefix}leftfinger">
|
||||
<visual name="${ee_prefix}leftfinger_visual">
|
||||
<geometry>
|
||||
<mesh filename="package://${description_pkg}/meshes/robot_ee/${ee_id}/visual/finger.dae" />
|
||||
</geometry>
|
||||
</visual>
|
||||
<!-- screw mount -->
|
||||
<collision>
|
||||
<origin xyz="0 18.5e-3 11e-3" rpy="0 0 0" />
|
||||
<geometry>
|
||||
<box size="22e-3 15e-3 20e-3" />
|
||||
</geometry>
|
||||
</collision>
|
||||
<!-- cartriage sledge -->
|
||||
<collision>
|
||||
<origin xyz="0 6.8e-3 2.2e-3" rpy="0 0 0" />
|
||||
<geometry>
|
||||
<box size="22e-3 8.8e-3 3.8e-3" />
|
||||
</geometry>
|
||||
</collision>
|
||||
<!-- diagonal finger -->
|
||||
<collision>
|
||||
<origin xyz="0 15.9e-3 28.35e-3" rpy="${pi/6} 0 0" />
|
||||
<geometry>
|
||||
<box size="17.5e-3 7e-3 23.5e-3" />
|
||||
</geometry>
|
||||
</collision>
|
||||
<!-- rubber tip with which to grasp -->
|
||||
<collision>
|
||||
<origin xyz="0 7.58e-3 45.25e-3" rpy="0 0 0" />
|
||||
<geometry>
|
||||
<box size="17.5e-3 15.2e-3 18.5e-3" />
|
||||
</geometry>
|
||||
</collision>
|
||||
<xacro:if value="${gazebo}">
|
||||
<xacro:ee-inertials name="leftfinger" />
|
||||
</xacro:if>
|
||||
</link>
|
||||
<link name="${ee_prefix}rightfinger">
|
||||
<visual name="${ee_prefix}rightfinger_visual">
|
||||
<origin xyz="0 0 0" rpy="0 0 ${pi}" />
|
||||
<geometry>
|
||||
<mesh filename="package://${description_pkg}/meshes/robot_ee/${ee_id}/visual/finger.dae" />
|
||||
</geometry>
|
||||
</visual>
|
||||
<!-- screw mount -->
|
||||
<collision>
|
||||
<origin xyz="0 -18.5e-3 11e-3" rpy="0 0 0" />
|
||||
<geometry>
|
||||
<box size="22e-3 15e-3 20e-3" />
|
||||
</geometry>
|
||||
</collision>
|
||||
<!-- cartriage sledge -->
|
||||
<collision>
|
||||
<origin xyz="0 -6.8e-3 2.2e-3" rpy="0 0 0" />
|
||||
<geometry>
|
||||
<box size="22e-3 8.8e-3 3.8e-3" />
|
||||
</geometry>
|
||||
</collision>
|
||||
<!-- diagonal finger -->
|
||||
<collision>
|
||||
<origin xyz="0 -15.9e-3 28.35e-3" rpy="${-pi/6} 0 0" />
|
||||
<geometry>
|
||||
<box size="17.5e-3 7e-3 23.5e-3" />
|
||||
</geometry>
|
||||
</collision>
|
||||
<!-- rubber tip with which to grasp -->
|
||||
<collision>
|
||||
<origin xyz="0 -7.58e-3 45.25e-3" rpy="0 0 0" />
|
||||
<geometry>
|
||||
<box size="17.5e-3 15.2e-3 18.5e-3" />
|
||||
</geometry>
|
||||
</collision>
|
||||
<xacro:if value="${gazebo}">
|
||||
<xacro:ee-inertials name="rightfinger" />
|
||||
</xacro:if>
|
||||
</link>
|
||||
<joint name="${ee_prefix}finger_joint1" type="prismatic">
|
||||
<parent link="${ee_prefix}hand" />
|
||||
<child link="${ee_prefix}leftfinger" />
|
||||
<origin xyz="0 0 0.0584" rpy="0 0 0" />
|
||||
<axis xyz="0 1 0" />
|
||||
<limit effort="100" lower="0.0" upper="0.04" velocity="0.2" />
|
||||
<dynamics damping="0.3" />
|
||||
</joint>
|
||||
<joint name="${ee_prefix}finger_joint2" type="prismatic">
|
||||
<parent link="${ee_prefix}hand" />
|
||||
<child link="${ee_prefix}rightfinger" />
|
||||
<origin xyz="0 0 0.0584" rpy="0 0 0" />
|
||||
<axis xyz="0 -1 0" />
|
||||
<limit effort="100" lower="0.0" upper="0.04" velocity="0.2" />
|
||||
<mimic joint="${ee_prefix}finger_joint1" />
|
||||
<dynamics damping="0.3" />
|
||||
</joint>
|
||||
</xacro:macro>
|
||||
</robot>
|
||||
111
end_effectors/common/utils.xacro
Normal file
111
end_effectors/common/utils.xacro
Normal file
@@ -0,0 +1,111 @@
|
||||
<?xml version="1.0"?>
|
||||
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
|
||||
|
||||
<!-- ============================================================== -->
|
||||
<!-- Macro to add an <inertial> tag based on yaml-load properties -->
|
||||
<!-- -->
|
||||
<!-- name: Name of the end_effector (without prefix) -->
|
||||
<!-- ee_inertials: Dictionary of inertia properties (see inertial.yaml) -->
|
||||
<!-- ============================================================== -->
|
||||
<xacro:macro name="ee-inertials" params="name ee_inertials:=^">
|
||||
<xacro:unless value="${name in ee_inertials}">${xacro.warning('No inertia properties defined for: ' + name)}</xacro:unless>
|
||||
<xacro:if value="${name in ee_inertials}">
|
||||
<!-- Access inertia properties of link 'name' -->
|
||||
<xacro:property name="link_inertials" value="${ee_inertials[name]}" lazy_eval="false" />
|
||||
<inertial>
|
||||
<origin rpy="${link_inertials.origin.rpy}" xyz="${link_inertials.origin.xyz}" />
|
||||
<mass value="${link_inertials.mass}" />
|
||||
<xacro:if value="${'inertia' in link_inertials}">
|
||||
<xacro:property name="I" value="${link_inertials.inertia}" />
|
||||
<inertia ixx="${I.xx}" ixy="${I.xy}" ixz="${I.xz}" iyy="${I.yy}" iyz="${I.yz}" izz="${I.zz}" />
|
||||
</xacro:if>
|
||||
</inertial>
|
||||
</xacro:if>
|
||||
</xacro:macro>
|
||||
|
||||
<!-- ========================================================== -->
|
||||
<!-- Macro to add a single link, both with -->
|
||||
<!-- * detailed meshes for environmental collision checking -->
|
||||
<!-- * and coarse geometry models for self-collision checking -->
|
||||
<!-- (only if 'gazebo' param is set) -->
|
||||
<!-- -->
|
||||
<!-- name: Name of the end-effector (without prefix) -->
|
||||
<!-- rpy: Rotation of the *_sc link relative to parent [rad] -->
|
||||
<!-- self_collision_geometries: self <collision> models -->
|
||||
<!-- ========================================================== -->
|
||||
<xacro:macro name="ee_link_with_sc" params="name prefix=${ee_prefix} rpy:='0 0 0' **self_collision_geometries gazebo:=false with_sc:=false">
|
||||
<!-- sub-link defining detailed meshes for collision with environment -->
|
||||
<link name="${prefix}${name}">
|
||||
<visual name="${prefix}${name}_visual">
|
||||
<geometry>
|
||||
<mesh filename="package://${description_pkg}/meshes/robot_ee/${ee_id}/visual/${name}.dae" />
|
||||
</geometry>
|
||||
</visual>
|
||||
<collision name="${prefix}${name}_collision">
|
||||
<geometry>
|
||||
<mesh filename="package://franka_description/meshes/robot_ee/${ee_id}/collision/${name}.stl" />
|
||||
</geometry>
|
||||
</collision>
|
||||
<xacro:ee-inertials name="${name}" />
|
||||
</link>
|
||||
|
||||
<!-- sub-link defining coarse geometries of real end-effector's internal self-collision -->
|
||||
<xacro:if value="${with_sc}">
|
||||
<link name="${prefix}${name}_sc">
|
||||
<xacro:unless value="${gazebo}">
|
||||
<xacro:insert_block name="self_collision_geometries" />
|
||||
</xacro:unless>
|
||||
</link>
|
||||
<!-- fixed joint between both sub-links -->
|
||||
<joint name="${prefix}${name}_sc_joint" type="fixed">
|
||||
<origin rpy="${rpy}" />
|
||||
<parent link="${prefix}${name}" />
|
||||
<child link="${prefix}${name}_sc" />
|
||||
</joint>
|
||||
</xacro:if>
|
||||
</xacro:macro>
|
||||
|
||||
<!-- =========================================================== -->
|
||||
<!-- Add a <collision> tag with a capsule, made from a cylinder -->
|
||||
<!-- with two spheres at its caps. The capsule will always be -->
|
||||
<!-- aligned with the axis of 'direction' you pass along. -->
|
||||
<!-- -->
|
||||
<!-- radius: Radii of both the cylinder and both spheres [m] -->
|
||||
<!-- length: Length of the cylinder/distance between the centers -->
|
||||
<!-- of the spheres. NOT overall length of capsule! -->
|
||||
<!-- xyz: Position of the center of the capsule/cylinder -->
|
||||
<!-- direction: One of { x, y, z, -x, -y, -z } -->
|
||||
<!-- =========================================================== -->
|
||||
<xacro:macro name="collision_capsule" params="radius length xyz:='0 0 0' direction:='z'">
|
||||
<xacro:property name="r" value="${pi/2.0 if 'y' in direction else 0}" />
|
||||
<xacro:property name="p" value="${pi/2.0 if 'x' in direction else 0}" />
|
||||
<xacro:property name="y" value="0" />
|
||||
<xacro:property name="x" value="${xyz.split(' ')[0]}" />
|
||||
<xacro:property name="y" value="${xyz.split(' ')[1]}" />
|
||||
<xacro:property name="z" value="${xyz.split(' ')[2]}" />
|
||||
<!-- Sphere center offsets from center of cylinder -->
|
||||
<xacro:property name="sx" value="${length / 2.0 if 'x' in direction else 0}" />
|
||||
<xacro:property name="sy" value="${length / 2.0 if 'y' in direction else 0}" />
|
||||
<xacro:property name="sz" value="${length / 2.0 if 'z' in direction else 0}" />
|
||||
|
||||
<collision>
|
||||
<origin xyz="${x} ${y} ${z}" rpy="${r} ${p} ${y}"/>
|
||||
<geometry>
|
||||
<cylinder radius="${radius}" length="${length}" />
|
||||
</geometry>
|
||||
</collision>
|
||||
<collision>
|
||||
<origin xyz="${x+sx} ${y+sy} ${z+sz}" />
|
||||
<geometry>
|
||||
<sphere radius="${radius}" />
|
||||
</geometry>
|
||||
</collision>
|
||||
<collision>
|
||||
<origin xyz="${x-sx} ${y-sy} ${z-sz}" />
|
||||
<geometry>
|
||||
<sphere radius="${radius}" />
|
||||
</geometry>
|
||||
</collision>
|
||||
</xacro:macro>
|
||||
|
||||
</robot>
|
||||
21
end_effectors/franka_hand/franka_hand.urdf.xacro
Normal file
21
end_effectors/franka_hand/franka_hand.urdf.xacro
Normal file
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="franka_hand">
|
||||
<xacro:include filename="$(find franka_description)/end_effectors/common/utils.xacro" />
|
||||
<xacro:include filename="$(find franka_description)/end_effectors/common/franka_hand.xacro"/>
|
||||
<xacro:include filename="$(find franka_description)/end_effectors/franka_hand/franka_hand_arguments.xacro"/>
|
||||
|
||||
<xacro:franka_hand connected_to="$(arg special_connection)"
|
||||
arm_id="$(arg arm_id)"
|
||||
ee_id="$(arg ee_id)_$(arg ee_color)"
|
||||
ee_inertials="${xacro.load_yaml('$(find franka_description)/end_effectors/$(arg ee_id)/inertials.yaml')}"
|
||||
rpy_ee="$(arg rpy_ee)"
|
||||
xyz_ee="$(arg xyz_ee)"
|
||||
tcp_xyz="$(arg tcp_xyz)"
|
||||
tcp_rpy="$(arg tcp_rpy)"
|
||||
safety_distance="$(arg safety_distance)"
|
||||
gazebo="$(arg gazebo)"
|
||||
description_pkg="$(arg description_pkg)"
|
||||
with_sc="$(arg with_sc)">
|
||||
</xacro:franka_hand>
|
||||
|
||||
</robot>
|
||||
40
end_effectors/franka_hand/franka_hand_arguments.xacro
Normal file
40
end_effectors/franka_hand/franka_hand_arguments.xacro
Normal file
@@ -0,0 +1,40 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
|
||||
|
||||
<!-- Name for the robot -->
|
||||
<xacro:arg name="arm_id" default="fr3" />
|
||||
|
||||
<!-- End-effector id" -->
|
||||
<xacro:arg name="ee_id" default="franka_hand" />
|
||||
|
||||
<!-- End-effector color" -->
|
||||
<xacro:arg name="ee_color" default="white" />
|
||||
|
||||
<!-- Where is the end-effector connected to, if different from the robot flange? -->
|
||||
<xacro:arg name="special_connection" default="" />
|
||||
|
||||
<!-- Should self-collision be enabled? -->
|
||||
<xacro:arg name="with_sc" default="false" />
|
||||
|
||||
<!-- Position offset between ee and parent frame -->
|
||||
<xacro:arg name="xyz_ee" default="0 0 0" />
|
||||
|
||||
<!-- Rotation offset between ee and parent frame -->
|
||||
<xacro:arg name="rpy_ee" default= "0 0 ${-pi/4}" />
|
||||
|
||||
<!-- Position offset between ee frame and tcp frame -->
|
||||
<xacro:arg name="tcp_xyz" default="0 0 0.1034" />
|
||||
|
||||
<!-- Rotation offset between ee frame and tcp frame -->
|
||||
<xacro:arg name="tcp_rpy" default="0 0 0" />
|
||||
|
||||
<!-- Safety distance for the collision capsules -->
|
||||
<xacro:arg name="safety_distance" default="0.03" />
|
||||
|
||||
<!-- Is the robot being simulated in gazebo? -->
|
||||
<xacro:arg name="gazebo" default="false" />
|
||||
|
||||
<!-- Name of the description package -->
|
||||
<xacro:arg name="description_pkg" default="franka_description" />
|
||||
|
||||
</robot>
|
||||
26
end_effectors/franka_hand/inertials.yaml
Normal file
26
end_effectors/franka_hand/inertials.yaml
Normal file
@@ -0,0 +1,26 @@
|
||||
hand:
|
||||
origin:
|
||||
xyz: -0.01 0 0.03
|
||||
rpy: 0 0 0
|
||||
mass: 0.73
|
||||
inertia:
|
||||
xx: 0.001
|
||||
yy: 0.0025
|
||||
zz: 0.0017
|
||||
xy: 0
|
||||
xz: 0
|
||||
yz: 0
|
||||
|
||||
leftfinger: &finger
|
||||
origin:
|
||||
xyz: 0 0 0
|
||||
rpy: 0 0 0
|
||||
mass: 0.015
|
||||
inertia:
|
||||
xx: 2.3749999999999997e-06
|
||||
yy: 2.3749999999999997e-06
|
||||
zz: 7.5e-07
|
||||
xy: 0
|
||||
xz: 0
|
||||
yz: 0
|
||||
rightfinger: *finger
|
||||
104
launch/visualize_franka.launch.py
Normal file
104
launch/visualize_franka.launch.py
Normal file
@@ -0,0 +1,104 @@
|
||||
# Copyright (c) 2023 Franka Robotics GmbH
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
import os
|
||||
|
||||
import xacro
|
||||
from ament_index_python.packages import get_package_share_directory
|
||||
from launch_ros.actions import Node
|
||||
|
||||
from launch import LaunchContext, LaunchDescription
|
||||
from launch.actions import DeclareLaunchArgument, OpaqueFunction
|
||||
from launch.substitutions import LaunchConfiguration
|
||||
|
||||
|
||||
def robot_state_publisher_spawner(context: LaunchContext, arm_id, load_gripper, ee_id):
|
||||
arm_id_str = context.perform_substitution(arm_id)
|
||||
load_gripper_str = context.perform_substitution(load_gripper)
|
||||
ee_id_str = context.perform_substitution(ee_id)
|
||||
franka_xacro_filepath = os.path.join(
|
||||
get_package_share_directory("franka_description"),
|
||||
"robots",
|
||||
arm_id_str,
|
||||
arm_id_str + ".urdf.xacro",
|
||||
)
|
||||
robot_description = xacro.process_file(
|
||||
franka_xacro_filepath, mappings={"hand": load_gripper_str, "ee_id": ee_id_str}
|
||||
).toprettyxml(indent=" ")
|
||||
|
||||
return [
|
||||
Node(
|
||||
package="robot_state_publisher",
|
||||
executable="robot_state_publisher",
|
||||
name="robot_state_publisher",
|
||||
output="screen",
|
||||
parameters=[{"robot_description": robot_description}],
|
||||
)
|
||||
]
|
||||
|
||||
|
||||
def generate_launch_description():
|
||||
load_gripper_parameter_name = "load_gripper"
|
||||
load_gripper = LaunchConfiguration(load_gripper_parameter_name)
|
||||
|
||||
ee_id_parameter_name = "ee_id"
|
||||
ee_id = LaunchConfiguration(ee_id_parameter_name)
|
||||
|
||||
arm_id_parameter_name = "arm_id"
|
||||
arm_id = LaunchConfiguration(arm_id_parameter_name)
|
||||
|
||||
rviz_file = os.path.join(
|
||||
get_package_share_directory("franka_description"),
|
||||
"rviz",
|
||||
"visualize_franka.rviz",
|
||||
)
|
||||
|
||||
robot_state_publisher_spawner_opaque_function = OpaqueFunction(
|
||||
function=robot_state_publisher_spawner, args=[arm_id, load_gripper, ee_id]
|
||||
)
|
||||
|
||||
return LaunchDescription(
|
||||
[
|
||||
DeclareLaunchArgument(
|
||||
load_gripper_parameter_name,
|
||||
default_value="true",
|
||||
description="Use end-effector if true. Default value is franka hand. "
|
||||
"Robot is loaded without end-effector otherwise",
|
||||
),
|
||||
|
||||
DeclareLaunchArgument(
|
||||
ee_id_parameter_name,
|
||||
default_value="franka_hand",
|
||||
description="ID of the type of end-effector used. Supporter values: "
|
||||
"none, franka_hand, cobot_pump",
|
||||
),
|
||||
DeclareLaunchArgument(
|
||||
arm_id_parameter_name,
|
||||
description="ID of the type of arm used. Supporter values: "
|
||||
"fer, fr3, fp3",
|
||||
),
|
||||
robot_state_publisher_spawner_opaque_function,
|
||||
Node(
|
||||
package="joint_state_publisher_gui",
|
||||
executable="joint_state_publisher_gui",
|
||||
name="joint_state_publisher_gui",
|
||||
),
|
||||
Node(
|
||||
package="rviz2",
|
||||
executable="rviz2",
|
||||
name="rviz2",
|
||||
arguments=["--display-config", rviz_file],
|
||||
),
|
||||
]
|
||||
)
|
||||
BIN
meshes/robot_arms/fer/collision/hand.stl
Normal file
BIN
meshes/robot_arms/fer/collision/hand.stl
Normal file
Binary file not shown.
BIN
meshes/robot_arms/fer/collision/link0.stl
Normal file
BIN
meshes/robot_arms/fer/collision/link0.stl
Normal file
Binary file not shown.
BIN
meshes/robot_arms/fer/collision/link1.stl
Normal file
BIN
meshes/robot_arms/fer/collision/link1.stl
Normal file
Binary file not shown.
BIN
meshes/robot_arms/fer/collision/link2.stl
Normal file
BIN
meshes/robot_arms/fer/collision/link2.stl
Normal file
Binary file not shown.
BIN
meshes/robot_arms/fer/collision/link3.stl
Normal file
BIN
meshes/robot_arms/fer/collision/link3.stl
Normal file
Binary file not shown.
BIN
meshes/robot_arms/fer/collision/link4.stl
Normal file
BIN
meshes/robot_arms/fer/collision/link4.stl
Normal file
Binary file not shown.
BIN
meshes/robot_arms/fer/collision/link5.stl
Normal file
BIN
meshes/robot_arms/fer/collision/link5.stl
Normal file
Binary file not shown.
BIN
meshes/robot_arms/fer/collision/link6.stl
Normal file
BIN
meshes/robot_arms/fer/collision/link6.stl
Normal file
Binary file not shown.
BIN
meshes/robot_arms/fer/collision/link7.stl
Normal file
BIN
meshes/robot_arms/fer/collision/link7.stl
Normal file
Binary file not shown.
201
meshes/robot_arms/fer/visual/finger.dae
Normal file
201
meshes/robot_arms/fer/visual/finger.dae
Normal file
File diff suppressed because one or more lines are too long
426
meshes/robot_arms/fer/visual/hand.dae
Normal file
426
meshes/robot_arms/fer/visual/hand.dae
Normal file
File diff suppressed because one or more lines are too long
951
meshes/robot_arms/fer/visual/link0.dae
Normal file
951
meshes/robot_arms/fer/visual/link0.dae
Normal file
File diff suppressed because one or more lines are too long
126
meshes/robot_arms/fer/visual/link1.dae
Normal file
126
meshes/robot_arms/fer/visual/link1.dae
Normal file
File diff suppressed because one or more lines are too long
126
meshes/robot_arms/fer/visual/link2.dae
Normal file
126
meshes/robot_arms/fer/visual/link2.dae
Normal file
File diff suppressed because one or more lines are too long
351
meshes/robot_arms/fer/visual/link3.dae
Normal file
351
meshes/robot_arms/fer/visual/link3.dae
Normal file
File diff suppressed because one or more lines are too long
351
meshes/robot_arms/fer/visual/link4.dae
Normal file
351
meshes/robot_arms/fer/visual/link4.dae
Normal file
File diff suppressed because one or more lines are too long
280
meshes/robot_arms/fer/visual/link5.dae
Normal file
280
meshes/robot_arms/fer/visual/link5.dae
Normal file
File diff suppressed because one or more lines are too long
1330
meshes/robot_arms/fer/visual/link6.dae
Normal file
1330
meshes/robot_arms/fer/visual/link6.dae
Normal file
File diff suppressed because one or more lines are too long
655
meshes/robot_arms/fer/visual/link7.dae
Normal file
655
meshes/robot_arms/fer/visual/link7.dae
Normal file
File diff suppressed because one or more lines are too long
BIN
meshes/robot_arms/fp3/collision/link0.stl
Normal file
BIN
meshes/robot_arms/fp3/collision/link0.stl
Normal file
Binary file not shown.
BIN
meshes/robot_arms/fp3/collision/link1.stl
Normal file
BIN
meshes/robot_arms/fp3/collision/link1.stl
Normal file
Binary file not shown.
BIN
meshes/robot_arms/fp3/collision/link2.stl
Normal file
BIN
meshes/robot_arms/fp3/collision/link2.stl
Normal file
Binary file not shown.
BIN
meshes/robot_arms/fp3/collision/link3.stl
Normal file
BIN
meshes/robot_arms/fp3/collision/link3.stl
Normal file
Binary file not shown.
BIN
meshes/robot_arms/fp3/collision/link4.stl
Normal file
BIN
meshes/robot_arms/fp3/collision/link4.stl
Normal file
Binary file not shown.
BIN
meshes/robot_arms/fp3/collision/link5.stl
Normal file
BIN
meshes/robot_arms/fp3/collision/link5.stl
Normal file
Binary file not shown.
BIN
meshes/robot_arms/fp3/collision/link6.stl
Normal file
BIN
meshes/robot_arms/fp3/collision/link6.stl
Normal file
Binary file not shown.
BIN
meshes/robot_arms/fp3/collision/link7.stl
Normal file
BIN
meshes/robot_arms/fp3/collision/link7.stl
Normal file
Binary file not shown.
496
meshes/robot_arms/fp3/visual/link0.dae
Normal file
496
meshes/robot_arms/fp3/visual/link0.dae
Normal file
File diff suppressed because one or more lines are too long
115
meshes/robot_arms/fp3/visual/link1.dae
Normal file
115
meshes/robot_arms/fp3/visual/link1.dae
Normal file
File diff suppressed because one or more lines are too long
115
meshes/robot_arms/fp3/visual/link2.dae
Normal file
115
meshes/robot_arms/fp3/visual/link2.dae
Normal file
File diff suppressed because one or more lines are too long
180
meshes/robot_arms/fp3/visual/link3.dae
Normal file
180
meshes/robot_arms/fp3/visual/link3.dae
Normal file
File diff suppressed because one or more lines are too long
180
meshes/robot_arms/fp3/visual/link4.dae
Normal file
180
meshes/robot_arms/fp3/visual/link4.dae
Normal file
File diff suppressed because one or more lines are too long
245
meshes/robot_arms/fp3/visual/link5.dae
Normal file
245
meshes/robot_arms/fp3/visual/link5.dae
Normal file
File diff suppressed because one or more lines are too long
558
meshes/robot_arms/fp3/visual/link6.dae
Normal file
558
meshes/robot_arms/fp3/visual/link6.dae
Normal file
File diff suppressed because one or more lines are too long
307
meshes/robot_arms/fp3/visual/link7.dae
Normal file
307
meshes/robot_arms/fp3/visual/link7.dae
Normal file
File diff suppressed because one or more lines are too long
BIN
meshes/robot_arms/fr3/collision/link0.stl
Normal file
BIN
meshes/robot_arms/fr3/collision/link0.stl
Normal file
Binary file not shown.
BIN
meshes/robot_arms/fr3/collision/link1.stl
Normal file
BIN
meshes/robot_arms/fr3/collision/link1.stl
Normal file
Binary file not shown.
BIN
meshes/robot_arms/fr3/collision/link2.stl
Normal file
BIN
meshes/robot_arms/fr3/collision/link2.stl
Normal file
Binary file not shown.
BIN
meshes/robot_arms/fr3/collision/link3.stl
Normal file
BIN
meshes/robot_arms/fr3/collision/link3.stl
Normal file
Binary file not shown.
BIN
meshes/robot_arms/fr3/collision/link4.stl
Normal file
BIN
meshes/robot_arms/fr3/collision/link4.stl
Normal file
Binary file not shown.
BIN
meshes/robot_arms/fr3/collision/link5.stl
Normal file
BIN
meshes/robot_arms/fr3/collision/link5.stl
Normal file
Binary file not shown.
BIN
meshes/robot_arms/fr3/collision/link6.stl
Normal file
BIN
meshes/robot_arms/fr3/collision/link6.stl
Normal file
Binary file not shown.
BIN
meshes/robot_arms/fr3/collision/link7.stl
Normal file
BIN
meshes/robot_arms/fr3/collision/link7.stl
Normal file
Binary file not shown.
496
meshes/robot_arms/fr3/visual/link0.dae
Normal file
496
meshes/robot_arms/fr3/visual/link0.dae
Normal file
File diff suppressed because one or more lines are too long
115
meshes/robot_arms/fr3/visual/link1.dae
Normal file
115
meshes/robot_arms/fr3/visual/link1.dae
Normal file
File diff suppressed because one or more lines are too long
115
meshes/robot_arms/fr3/visual/link2.dae
Normal file
115
meshes/robot_arms/fr3/visual/link2.dae
Normal file
File diff suppressed because one or more lines are too long
180
meshes/robot_arms/fr3/visual/link3.dae
Normal file
180
meshes/robot_arms/fr3/visual/link3.dae
Normal file
File diff suppressed because one or more lines are too long
180
meshes/robot_arms/fr3/visual/link4.dae
Normal file
180
meshes/robot_arms/fr3/visual/link4.dae
Normal file
File diff suppressed because one or more lines are too long
245
meshes/robot_arms/fr3/visual/link5.dae
Normal file
245
meshes/robot_arms/fr3/visual/link5.dae
Normal file
File diff suppressed because one or more lines are too long
558
meshes/robot_arms/fr3/visual/link6.dae
Normal file
558
meshes/robot_arms/fr3/visual/link6.dae
Normal file
File diff suppressed because one or more lines are too long
307
meshes/robot_arms/fr3/visual/link7.dae
Normal file
307
meshes/robot_arms/fr3/visual/link7.dae
Normal file
File diff suppressed because one or more lines are too long
BIN
meshes/robot_ee/cobot_pump/collision/cobot_pump.stl
Normal file
BIN
meshes/robot_ee/cobot_pump/collision/cobot_pump.stl
Normal file
Binary file not shown.
320
meshes/robot_ee/cobot_pump/visual/cobot_pump.dae
Normal file
320
meshes/robot_ee/cobot_pump/visual/cobot_pump.dae
Normal file
File diff suppressed because one or more lines are too long
BIN
meshes/robot_ee/franka_hand_black/collision/hand.stl
Normal file
BIN
meshes/robot_ee/franka_hand_black/collision/hand.stl
Normal file
Binary file not shown.
201
meshes/robot_ee/franka_hand_black/visual/finger.dae
Normal file
201
meshes/robot_ee/franka_hand_black/visual/finger.dae
Normal file
File diff suppressed because one or more lines are too long
225
meshes/robot_ee/franka_hand_black/visual/hand.dae
Normal file
225
meshes/robot_ee/franka_hand_black/visual/hand.dae
Normal file
File diff suppressed because one or more lines are too long
BIN
meshes/robot_ee/franka_hand_white/collision/hand.stl
Normal file
BIN
meshes/robot_ee/franka_hand_white/collision/hand.stl
Normal file
Binary file not shown.
201
meshes/robot_ee/franka_hand_white/visual/finger.dae
Normal file
201
meshes/robot_ee/franka_hand_white/visual/finger.dae
Normal file
File diff suppressed because one or more lines are too long
426
meshes/robot_ee/franka_hand_white/visual/hand.dae
Normal file
426
meshes/robot_ee/franka_hand_white/visual/hand.dae
Normal file
File diff suppressed because one or more lines are too long
25
package.xml
Normal file
25
package.xml
Normal file
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0"?>
|
||||
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
|
||||
<package format="3">
|
||||
<name>franka_description</name>
|
||||
<version>0.4.0</version>
|
||||
<description>franka_description contains URDF files and meshes of Franka robots</description>
|
||||
<maintainer email="support@franka.de">Franka Robotics GmbH</maintainer>
|
||||
<license>Apache 2.0</license>
|
||||
<author>Franka Robotics GmbH</author>
|
||||
|
||||
<buildtool_depend>ament_cmake</buildtool_depend>
|
||||
|
||||
<test_depend>ament_lint_auto</test_depend>
|
||||
<test_depend>ament_lint_common</test_depend>
|
||||
<test_depend>ament_cmake_pytest</test_depend>
|
||||
|
||||
<exec_depend>xacro</exec_depend>
|
||||
<exec_depend>rviz2</exec_depend>
|
||||
<exec_depend>joint_state_publisher_gui</exec_depend>
|
||||
|
||||
<export>
|
||||
<build_type>ament_cmake</build_type>
|
||||
<gazebo_ros gazebo_model_path="${prefix}"/>
|
||||
</export>
|
||||
</package>
|
||||
88
robots/common/franka_arm.ros2_control.xacro
Normal file
88
robots/common/franka_arm.ros2_control.xacro
Normal file
@@ -0,0 +1,88 @@
|
||||
<?xml version="1.0"?>
|
||||
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
|
||||
|
||||
<xacro:macro name="franka_arm_ros2_control"
|
||||
params="arm_id
|
||||
robot_ip
|
||||
use_fake_hardware:=^|false
|
||||
fake_sensor_commands:=^|false
|
||||
gazebo:=^|false
|
||||
hand:=^|false
|
||||
gazebo_effort:=^|false
|
||||
arm_prefix:=''
|
||||
multi_arm:=false">
|
||||
|
||||
<xacro:property name="arm_prefix_modified" value="${'' if arm_prefix == '' else arm_prefix + '_'}" />
|
||||
<ros2_control name="${arm_prefix_modified}FrankaHardwareInterface" type="system">
|
||||
<hardware>
|
||||
<param name="arm_id">${arm_id}</param>
|
||||
<param name="prefix">${arm_prefix}</param>
|
||||
<xacro:if value="${use_fake_hardware}">
|
||||
<plugin>fake_components/GenericSystem</plugin>
|
||||
<param name="fake_sensor_commands">${fake_sensor_commands}</param>
|
||||
<param name="state_following_offset">0.0</param>
|
||||
</xacro:if>
|
||||
|
||||
<xacro:if value="${gazebo}">
|
||||
<plugin>franka_ign_ros2_control/IgnitionSystem</plugin>
|
||||
</xacro:if>
|
||||
|
||||
<xacro:if value="${use_fake_hardware == 0 and gazebo == 0 and multi_arm == 0}">
|
||||
<plugin>franka_hardware/FrankaHardwareInterface</plugin>
|
||||
<param name="robot_ip">${robot_ip}</param>
|
||||
<param name="arm_prefix">${arm_prefix}</param>
|
||||
</xacro:if>
|
||||
<xacro:if value="${use_fake_hardware == 0 and gazebo == 0 and multi_arm == 1}">
|
||||
<plugin>franka_hardware/MultiFrankaHardwareInterface</plugin>
|
||||
<param name="robot_ip">${robot_ip}</param>
|
||||
<param name="arm_prefix">${arm_prefix}</param>
|
||||
</xacro:if>
|
||||
</hardware>
|
||||
|
||||
<xacro:macro name="configure_joint" params="joint_name initial_position">
|
||||
<joint name="${joint_name}">
|
||||
<!--
|
||||
deactivated for gazebo velocity and position interface due to a bug
|
||||
https://github.com/ros-controls/gz_ros2_control/issues/343
|
||||
|
||||
Command Interfaces -->
|
||||
<xacro:if value="${multi_arm == 0}">
|
||||
<command_interface name="position"/>
|
||||
<command_interface name="velocity"/>
|
||||
</xacro:if>
|
||||
<xacro:if value="${gazebo == 0 or gazebo_effort == 1}">
|
||||
<command_interface name="effort"/>
|
||||
</xacro:if>
|
||||
|
||||
<!-- State Interfaces -->
|
||||
<state_interface name="position">
|
||||
<param name="initial_value">${initial_position}</param>
|
||||
</state_interface>
|
||||
<state_interface name="velocity"/>
|
||||
<param name="initial_value">0.0</param>
|
||||
<state_interface name="effort"/>
|
||||
</joint>
|
||||
</xacro:macro>
|
||||
|
||||
<xacro:configure_joint joint_name="${arm_prefix_modified}${arm_id}_joint1" initial_position="0.0"/>
|
||||
<xacro:configure_joint joint_name="${arm_prefix_modified}${arm_id}_joint2" initial_position="${-pi/4}"/>
|
||||
<xacro:configure_joint joint_name="${arm_prefix_modified}${arm_id}_joint3" initial_position="0.0"/>
|
||||
<xacro:configure_joint joint_name="${arm_prefix_modified}${arm_id}_joint4" initial_position="${-3*pi/4}"/>
|
||||
<xacro:configure_joint joint_name="${arm_prefix_modified}${arm_id}_joint5" initial_position="0.0"/>
|
||||
<xacro:configure_joint joint_name="${arm_prefix_modified}${arm_id}_joint6" initial_position="${pi/2}"/>
|
||||
<xacro:configure_joint joint_name="${arm_prefix_modified}${arm_id}_joint7" initial_position="${pi/4}"/>
|
||||
<xacro:if value="${gazebo and hand}">
|
||||
<xacro:configure_joint joint_name="${arm_id}_finger_joint1" initial_position="0.0" />
|
||||
</xacro:if>
|
||||
|
||||
</ros2_control>
|
||||
<xacro:if value="${gazebo}">
|
||||
<gazebo>
|
||||
<plugin filename="franka_ign_ros2_control-system" name="ign_ros2_control::IgnitionROS2ControlPlugin">
|
||||
<parameters>$(find franka_gazebo_bringup)/config/franka_gazebo_controllers.yaml</parameters>
|
||||
</plugin>
|
||||
</gazebo>
|
||||
</xacro:if>
|
||||
|
||||
</xacro:macro>
|
||||
</robot>
|
||||
153
robots/common/franka_arm.xacro
Normal file
153
robots/common/franka_arm.xacro
Normal file
@@ -0,0 +1,153 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="fer">
|
||||
|
||||
<xacro:include filename="$(find franka_description)/robots/common/utils.xacro" />
|
||||
|
||||
<!-- safety_distance: Minimum safety distance in [m] by which the collision volumes are expanded and which is enforced during robot motions -->
|
||||
<!-- arm_id: Namespace of the robot arm. Serves to differentiate between arms in case of multiple instances. -->
|
||||
<!-- joint_limits: description of the joint limits that comes from a YAML file. Example definition: ${xacro.load_yaml('$(find franka_description)/robots/fr3/joint_limits.yaml')} -->
|
||||
<!-- kinematics: description of the kinematics that comes from a YAML file. Example definition: ${xacro.load_yaml('$(find franka_description)/robots/fr3/kinematics.yaml')} -->
|
||||
<!-- inertials: description of the inertials that comes from a YAML file. Example definition: ${xacro.load_yaml('$(find franka_description)/robots/fr3/inertials.yaml')} -->
|
||||
<!-- dynamics: description of the dynamics that comes from a YAML file. Example definition: ${xacro.load_yaml('$(find franka_description)/robots/fr3/dynamics.yaml')} -->
|
||||
|
||||
<xacro:macro name="franka_arm" params="arm_id arm_prefix:='' no_prefix:=false description_pkg:='franka_description' connected_to:='base' xyz:='0 0 0' rpy:='0 0 0' gazebo:='false' safety_distance:=0 joint_limits inertials kinematics dynamics with_sc:=false" >
|
||||
|
||||
<!-- Define a property that defaults to 'arm_prefix_arm_id' concatenated with an underscore if 'no_prefix' is not set -->
|
||||
<xacro:property name="prefix" value="${'' if no_prefix else arm_prefix + arm_id + '_'}" />
|
||||
|
||||
<xacro:if value="${gazebo}">
|
||||
<xacro:property name="connected_to" value="" />
|
||||
</xacro:if>
|
||||
|
||||
<xacro:unless value="${not connected_to}">
|
||||
<link name="${connected_to}">
|
||||
</link>
|
||||
<joint name="${prefix}${connected_to}_joint" type="fixed">
|
||||
<parent link="${connected_to}"/>
|
||||
<child link="${prefix}link0"/>
|
||||
<origin rpy="${rpy}" xyz="${xyz}"/>
|
||||
</joint>
|
||||
</xacro:unless>
|
||||
|
||||
<xacro:link_with_sc no_prefix="${no_prefix}" name="link0" gazebo="${gazebo}" with_sc="${with_sc}">
|
||||
<self_collision_geometries>
|
||||
<xacro:collision_capsule xyz="-0.075 0 0.06" direction="x" radius="${0.06+safety_distance}" length="0.03" />
|
||||
</self_collision_geometries>
|
||||
</xacro:link_with_sc>
|
||||
|
||||
<xacro:link_with_sc no_prefix="${no_prefix}" name="link1" gazebo="${gazebo}" with_sc="${with_sc}">
|
||||
<self_collision_geometries>
|
||||
<xacro:collision_capsule xyz="0 0 -191.5e-3" radius="${0.06+safety_distance}" length="0.283" />
|
||||
</self_collision_geometries>
|
||||
</xacro:link_with_sc>
|
||||
|
||||
<joint name="${prefix}joint1" type="revolute">
|
||||
<xacro:franka-kinematics name="joint1" config="${kinematics}" />
|
||||
<parent link="${prefix}link0" />
|
||||
<child link="${prefix}link1" />
|
||||
<axis xyz="0 0 1" />
|
||||
<xacro:franka-limits name="joint1" config="${joint_limits}" />
|
||||
<xacro:franka-dynamics name="joint1" config="${dynamics}" />
|
||||
</joint>
|
||||
|
||||
<xacro:link_with_sc no_prefix="${no_prefix}" name="link2" gazebo="${gazebo}" with_sc="${with_sc}">
|
||||
<self_collision_geometries>
|
||||
<xacro:collision_capsule xyz="0 0 0" radius="${0.06+safety_distance}" length="0.12" />
|
||||
</self_collision_geometries>
|
||||
</xacro:link_with_sc>
|
||||
|
||||
<joint name="${prefix}joint2" type="revolute">
|
||||
<xacro:franka-kinematics name="joint2" config="${kinematics}" />
|
||||
<parent link="${prefix}link1" />
|
||||
<child link="${prefix}link2" />
|
||||
<axis xyz="0 0 1" />
|
||||
<xacro:franka-limits name="joint2" config="${joint_limits}" />
|
||||
<xacro:franka-dynamics name="joint2" config="${dynamics}" />
|
||||
</joint>
|
||||
|
||||
<xacro:link_with_sc no_prefix="${no_prefix}" name="link3" gazebo="${gazebo}" with_sc="${with_sc}">
|
||||
<self_collision_geometries>
|
||||
<xacro:collision_capsule xyz="0 0 -0.145" radius="${0.06+safety_distance}" length="0.15" />
|
||||
</self_collision_geometries>
|
||||
</xacro:link_with_sc>
|
||||
|
||||
<joint name="${prefix}joint3" type="revolute">
|
||||
<xacro:franka-kinematics name="joint3" config="${kinematics}" />
|
||||
<parent link="${prefix}link2" />
|
||||
<child link="${prefix}link3" />
|
||||
<axis xyz="0 0 1" />
|
||||
<xacro:franka-limits name="joint3" config="${joint_limits}" />
|
||||
<xacro:franka-dynamics name="joint3" config="${dynamics}" />
|
||||
</joint>
|
||||
|
||||
<xacro:link_with_sc no_prefix="${no_prefix}" name="link4" gazebo="${gazebo}" with_sc="${with_sc}">
|
||||
<self_collision_geometries>
|
||||
<xacro:collision_capsule xyz="0 0 0" radius="${0.06+safety_distance}" length="0.12" />
|
||||
</self_collision_geometries>
|
||||
</xacro:link_with_sc>
|
||||
|
||||
<joint name="${prefix}joint4" type="revolute">
|
||||
<xacro:franka-kinematics name="joint4" config="${kinematics}" />
|
||||
<parent link="${prefix}link3" />
|
||||
<child link="${prefix}link4" />
|
||||
<axis xyz="0 0 1" />
|
||||
<xacro:franka-limits name="joint4" config="${joint_limits}" />
|
||||
<xacro:franka-dynamics name="joint4" config="${dynamics}" />
|
||||
</joint>
|
||||
|
||||
<xacro:link_with_sc no_prefix="${no_prefix}" name="link5" gazebo="${gazebo}" with_sc="${with_sc}">
|
||||
<self_collision_geometries>
|
||||
<xacro:collision_capsule xyz="0 0 -0.26" radius="${0.060+safety_distance}" length="0.10" />
|
||||
<xacro:collision_capsule xyz="0 0.08 -0.13" radius="${0.025+safety_distance}" length="0.14" />
|
||||
</self_collision_geometries>
|
||||
</xacro:link_with_sc>
|
||||
|
||||
<joint name="${prefix}joint5" type="revolute">
|
||||
<xacro:franka-kinematics name="joint5" config="${kinematics}" />
|
||||
<parent link="${prefix}link4" />
|
||||
<child link="${prefix}link5" />
|
||||
<axis xyz="0 0 1" />
|
||||
<xacro:franka-limits name="joint5" config="${joint_limits}" />
|
||||
<xacro:franka-dynamics name="joint5" config="${dynamics}" />
|
||||
</joint>
|
||||
|
||||
<xacro:link_with_sc no_prefix="${no_prefix}" name="link6" gazebo="${gazebo}" with_sc="${with_sc}">
|
||||
<self_collision_geometries>
|
||||
<xacro:collision_capsule xyz="0 0 -0.03" radius="${0.05+safety_distance}" length="0.08" />
|
||||
</self_collision_geometries>
|
||||
</xacro:link_with_sc>
|
||||
|
||||
<joint name="${prefix}joint6" type="revolute">
|
||||
<xacro:franka-kinematics name="joint6" config="${kinematics}" />
|
||||
<parent link="${prefix}link5" />
|
||||
<child link="${prefix}link6" />
|
||||
<axis xyz="0 0 1" />
|
||||
<xacro:franka-limits name="joint6" config="${joint_limits}" />
|
||||
<xacro:franka-dynamics name="joint6" config="${dynamics}" />
|
||||
</joint>
|
||||
|
||||
<xacro:link_with_sc no_prefix="${no_prefix}" name="link7" gazebo="${gazebo}" rpy="0 0 ${pi/4}" with_sc="${with_sc}">
|
||||
<self_collision_geometries>
|
||||
<xacro:collision_capsule xyz="0 0 0.01" direction="z" radius="${0.04+safety_distance}" length="0.14" />
|
||||
<xacro:collision_capsule xyz="0.06 0 0.082" direction="x" radius="${0.03+safety_distance}" length="0.01" />
|
||||
</self_collision_geometries>
|
||||
</xacro:link_with_sc>
|
||||
|
||||
<joint name="${prefix}joint7" type="revolute">
|
||||
<xacro:franka-kinematics name="joint7" config="${kinematics}" />
|
||||
<parent link="${prefix}link6"/>
|
||||
<child link="${prefix}link7"/>
|
||||
<axis xyz="0 0 1"/>
|
||||
<xacro:franka-limits name="joint7" config="${joint_limits}" />
|
||||
<xacro:franka-dynamics name="joint7" config="${dynamics}" />
|
||||
</joint>
|
||||
|
||||
<link name="${prefix}link8"/>
|
||||
|
||||
<joint name="${prefix}joint8" type="fixed">
|
||||
<xacro:franka-kinematics name="joint8" config="${kinematics}" />
|
||||
<parent link="${prefix}link7" />
|
||||
<child link="${prefix}link8" />
|
||||
</joint>
|
||||
</xacro:macro>
|
||||
</robot>
|
||||
167
robots/common/franka_robot.xacro
Normal file
167
robots/common/franka_robot.xacro
Normal file
@@ -0,0 +1,167 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
|
||||
<xacro:macro name="franka_robot"
|
||||
params="arm_id
|
||||
joint_limits
|
||||
kinematics
|
||||
inertials
|
||||
dynamics
|
||||
parent:='world'
|
||||
xyz:='0 0 0'
|
||||
rpy:='0 0 0'
|
||||
hand:='true'
|
||||
ee_id:=none
|
||||
gazebo:='false'
|
||||
with_sc:='false'
|
||||
ros2_control:=false
|
||||
robot_ip:=''
|
||||
use_fake_hardware:=false
|
||||
fake_sensor_commands:=false
|
||||
gazebo_effort:=false
|
||||
no_prefix:='false'
|
||||
arm_prefix:=''
|
||||
connected_to:='base'
|
||||
multi_arm:=false">
|
||||
<xacro:include filename="$(find franka_description)/robots/common/utils.xacro" />
|
||||
|
||||
<xacro:include filename="$(find franka_description)/robots/common/franka_arm.xacro" />
|
||||
<xacro:property name="arm_prefix_modified" value="${'' if arm_prefix == '' else arm_prefix + '_'}" />
|
||||
<xacro:franka_arm
|
||||
arm_id="${arm_id}"
|
||||
arm_prefix="${arm_prefix_modified}"
|
||||
no_prefix="${no_prefix}"
|
||||
xyz="${xyz}"
|
||||
rpy="${rpy}"
|
||||
safety_distance="0.03"
|
||||
gazebo="${gazebo}"
|
||||
joint_limits="${joint_limits}"
|
||||
kinematics="${kinematics}"
|
||||
inertials="${inertials}"
|
||||
dynamics="${dynamics}"
|
||||
with_sc="${with_sc}"
|
||||
connected_to="${connected_to}"
|
||||
/>
|
||||
|
||||
<xacro:if value="${hand and ee_id == 'franka_hand'}">
|
||||
<xacro:include filename="$(find franka_description)/end_effectors/common/franka_hand.xacro"/>
|
||||
<xacro:include filename="$(find franka_description)/end_effectors/common/utils.xacro" />
|
||||
<xacro:include filename="$(find franka_description)/end_effectors/$(arg ee_id)/$(arg ee_id)_arguments.xacro" />
|
||||
<xacro:if value="${arm_id == 'fp3'}">
|
||||
<xacro:property name="ee_color" value="black" />
|
||||
</xacro:if>
|
||||
<xacro:if value="${arm_id == 'fr3' or arm_id == 'fer'}">
|
||||
<xacro:property name="ee_color" value="white" />
|
||||
</xacro:if>
|
||||
<xacro:property name="special_connection" value="$(arg special_connection)" />
|
||||
<xacro:property name="connection" value="${special_connection if special_connection != '' else arm_id + '_link8'}" />
|
||||
<xacro:franka_hand
|
||||
connected_to="${arm_prefix_modified}${connection}"
|
||||
arm_id="${arm_id}"
|
||||
arm_prefix="${arm_prefix_modified}"
|
||||
ee_id="${ee_id}_${ee_color}"
|
||||
ee_inertials="${xacro.load_yaml('$(find franka_description)/end_effectors/$(arg ee_id)/inertials.yaml')}"
|
||||
rpy_ee="$(arg rpy_ee)"
|
||||
xyz_ee="$(arg xyz_ee)"
|
||||
tcp_xyz="$(arg tcp_xyz)"
|
||||
tcp_rpy="$(arg tcp_rpy)"
|
||||
safety_distance="$(arg safety_distance)"
|
||||
gazebo="${gazebo}"
|
||||
description_pkg="$(arg description_pkg)"
|
||||
with_sc="${with_sc}"
|
||||
/>
|
||||
</xacro:if>
|
||||
|
||||
<xacro:if value="${hand and ee_id != 'none' and ee_id != 'franka_hand'}">
|
||||
<xacro:include filename="$(find franka_description)/end_effectors/common/ee_with_one_link.xacro"/>
|
||||
<xacro:include filename="$(find franka_description)/end_effectors/common/utils.xacro" />
|
||||
<xacro:include filename="$(find franka_description)/end_effectors/$(arg ee_id)/$(arg ee_id)_arguments.xacro" />
|
||||
<xacro:property name="special_connection" value="$(arg special_connection)" />
|
||||
<xacro:property name="connection" value="${special_connection if special_connection == '' else arm_id + '_link8'}" />
|
||||
<xacro:ee_with_one_link
|
||||
connected_to="${arm_prefix_modified}${connection}"
|
||||
arm_id="${arm_id}"
|
||||
arm_prefix="${arm_prefix_modified}"
|
||||
ee_id="${ee_id}"
|
||||
ee_inertials="${xacro.load_yaml('$(find franka_description)/end_effectors/$(arg ee_id)/inertials.yaml')}"
|
||||
rpy_ee="$(arg rpy_ee)"
|
||||
xyz_ee="$(arg xyz_ee)"
|
||||
tcp_xyz="$(arg tcp_xyz)"
|
||||
tcp_rpy="$(arg tcp_rpy)"
|
||||
safety_distance="$(arg safety_distance)"
|
||||
gazebo="${gazebo}"
|
||||
description_pkg="$(arg description_pkg)"
|
||||
with_sc="${with_sc}"
|
||||
/>
|
||||
</xacro:if>
|
||||
|
||||
<!-- Definition of additional Gazebo tags -->
|
||||
<xacro:if value="${gazebo}">
|
||||
|
||||
<xacro:if value="${parent != ''}">
|
||||
<!-- Gazebo requires a joint to a link called "world" for statically mounted robots -->
|
||||
<xacro:if value="${parent == 'world'}">
|
||||
<link name="${parent}" />
|
||||
</xacro:if>
|
||||
<joint name="${parent}_joint" type="fixed">
|
||||
<origin xyz="${xyz}" rpy="${rpy}" />
|
||||
<parent link="${parent}" />
|
||||
<child link="${arm_id}_link0" />
|
||||
</joint>
|
||||
</xacro:if>
|
||||
|
||||
<xacro:gazebo-joint joint="${arm_id}_joint1" transmission="hardware_interface/PositionJointInterface" />
|
||||
<xacro:gazebo-joint joint="${arm_id}_joint2" transmission="hardware_interface/PositionJointInterface" />
|
||||
<xacro:gazebo-joint joint="${arm_id}_joint3" transmission="hardware_interface/PositionJointInterface" />
|
||||
<xacro:gazebo-joint joint="${arm_id}_joint4" transmission="hardware_interface/PositionJointInterface" />
|
||||
<xacro:gazebo-joint joint="${arm_id}_joint5" transmission="hardware_interface/PositionJointInterface" />
|
||||
<xacro:gazebo-joint joint="${arm_id}_joint6" transmission="hardware_interface/PositionJointInterface" />
|
||||
<xacro:gazebo-joint joint="${arm_id}_joint7" transmission="hardware_interface/PositionJointInterface" />
|
||||
|
||||
<xacro:gazebo-joint joint="${arm_id}_joint1" transmission="hardware_interface/VelocityJointInterface" />
|
||||
<xacro:gazebo-joint joint="${arm_id}_joint2" transmission="hardware_interface/VelocityJointInterface" />
|
||||
<xacro:gazebo-joint joint="${arm_id}_joint3" transmission="hardware_interface/VelocityJointInterface" />
|
||||
<xacro:gazebo-joint joint="${arm_id}_joint4" transmission="hardware_interface/VelocityJointInterface" />
|
||||
<xacro:gazebo-joint joint="${arm_id}_joint5" transmission="hardware_interface/VelocityJointInterface" />
|
||||
<xacro:gazebo-joint joint="${arm_id}_joint6" transmission="hardware_interface/VelocityJointInterface" />
|
||||
<xacro:gazebo-joint joint="${arm_id}_joint7" transmission="hardware_interface/VelocityJointInterface" />
|
||||
|
||||
<xacro:gazebo-joint joint="${arm_id}_joint1" transmission="hardware_interface/EffortJointInterface" />
|
||||
<xacro:gazebo-joint joint="${arm_id}_joint2" transmission="hardware_interface/EffortJointInterface" />
|
||||
<xacro:gazebo-joint joint="${arm_id}_joint3" transmission="hardware_interface/EffortJointInterface" />
|
||||
<xacro:gazebo-joint joint="${arm_id}_joint4" transmission="hardware_interface/EffortJointInterface" />
|
||||
<xacro:gazebo-joint joint="${arm_id}_joint5" transmission="hardware_interface/EffortJointInterface" />
|
||||
<xacro:gazebo-joint joint="${arm_id}_joint6" transmission="hardware_interface/EffortJointInterface" />
|
||||
<xacro:gazebo-joint joint="${arm_id}_joint7" transmission="hardware_interface/EffortJointInterface" />
|
||||
|
||||
<xacro:transmission-franka-state arm_id="${arm_id}" />
|
||||
<xacro:transmission-franka-model arm_id="${arm_id}"
|
||||
root="${arm_id}_joint1"
|
||||
tip="${arm_id}_joint8"
|
||||
/>
|
||||
|
||||
<xacro:if value="${ee_id == 'franka_hand'}">
|
||||
<xacro:gazebo-joint joint="${arm_id}_finger_joint1" transmission="hardware_interface/EffortJointInterface" />
|
||||
<xacro:gazebo-joint joint="${arm_id}_finger_joint2" transmission="hardware_interface/EffortJointInterface" />
|
||||
<!-- Friction specific material for Rubber/Rubber contact -->
|
||||
<xacro:gazebo-friction link="${arm_id}_leftfinger" mu="1.13" />
|
||||
<xacro:gazebo-friction link="${arm_id}_rightfinger" mu="1.13" />
|
||||
</xacro:if>
|
||||
</xacro:if>
|
||||
|
||||
<xacro:if value="${ros2_control}">
|
||||
<xacro:include filename="$(find franka_description)/robots/common/franka_arm.ros2_control.xacro"/>
|
||||
<xacro:franka_arm_ros2_control
|
||||
arm_id="${arm_id}"
|
||||
robot_ip="${robot_ip}"
|
||||
use_fake_hardware="$(arg use_fake_hardware)"
|
||||
fake_sensor_commands="$(arg fake_sensor_commands)"
|
||||
gazebo="$(arg gazebo)"
|
||||
hand="$(arg hand)"
|
||||
gazebo_effort="$(arg gazebo_effort)"
|
||||
arm_prefix="${arm_prefix}"
|
||||
multi_arm="$(arg multi_arm)"
|
||||
/>
|
||||
</xacro:if>
|
||||
|
||||
</xacro:macro>
|
||||
</robot>
|
||||
269
robots/common/utils.xacro
Normal file
269
robots/common/utils.xacro
Normal file
@@ -0,0 +1,269 @@
|
||||
<?xml version="1.0"?>
|
||||
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
|
||||
|
||||
<!-- ============================================================== -->
|
||||
<!-- Macro to add an <inertial> tag based on yaml-load properties -->
|
||||
<!-- -->
|
||||
<!-- name: Name of the robot link (without prefix) -->
|
||||
<!-- inertial: Dictionary of inertia properties (see inertial.yaml) -->
|
||||
<!-- ============================================================== -->
|
||||
<xacro:macro name="franka-inertials" params="name inertials:=^">
|
||||
<xacro:unless value="${name in inertials}">${xacro.warning('No inertia properties defined for: ' + name)}</xacro:unless>
|
||||
<xacro:if value="${name in inertials}">
|
||||
<!-- Access inertia properties of link 'name' -->
|
||||
<xacro:property name="link_inertials" value="${inertials[name]}" lazy_eval="false" />
|
||||
<inertial>
|
||||
<origin rpy="${link_inertials.origin.rpy}" xyz="${link_inertials.origin.xyz}" />
|
||||
<mass value="${link_inertials.mass}" />
|
||||
<xacro:if value="${'inertia' in link_inertials}">
|
||||
<xacro:property name="I" value="${link_inertials.inertia}" />
|
||||
<inertia ixx="${I.xx}" ixy="${I.xy}" ixz="${I.xz}" iyy="${I.yy}" iyz="${I.yz}" izz="${I.zz}" />
|
||||
</xacro:if>
|
||||
</inertial>
|
||||
</xacro:if>
|
||||
</xacro:macro>
|
||||
|
||||
<!-- ========================================================== -->
|
||||
<!-- Macro to add a single link, both with -->
|
||||
<!-- * detailed meshes for environmental collision checking -->
|
||||
<!-- * and coarse geometry models for self-collision checking -->
|
||||
<!-- (only if 'gazebo' param is set) -->
|
||||
<!-- -->
|
||||
<!-- name: Name of the robot link (without prefix) -->
|
||||
<!-- rpy: Rotation of the *_sc link relative to parent [rad] -->
|
||||
<!-- self_collision_geometries: self <collision> models -->
|
||||
<!-- ========================================================== -->
|
||||
<xacro:macro name="link_with_sc" params="name no_prefix:='false' rpy:='0 0 0' **self_collision_geometries gazebo:=false with_sc:=false">
|
||||
<xacro:property name="prefix" value="${'' if no_prefix else arm_prefix + arm_id + '_'}" />
|
||||
<!-- sub-link defining detailed meshes for collision with environment -->
|
||||
<link name="${prefix}${name}">
|
||||
<visual name="${prefix}${name}_visual">
|
||||
<geometry>
|
||||
<mesh filename="package://${description_pkg}/meshes/robot_arms/${arm_id}/visual/${name}.dae" />
|
||||
</geometry>
|
||||
</visual>
|
||||
<collision name="${prefix}${name}_collision">
|
||||
<geometry>
|
||||
<mesh filename="package://franka_description/meshes/robot_arms/${arm_id}/collision/${name}.stl" />
|
||||
</geometry>
|
||||
</collision>
|
||||
<xacro:franka-inertials name="${name}" />
|
||||
</link>
|
||||
|
||||
<!-- sub-link defining coarse geometries of real robot's internal self-collision -->
|
||||
<xacro:if value="${with_sc}">
|
||||
<link name="${prefix}${name}_sc">
|
||||
<xacro:unless value="${gazebo}">
|
||||
<xacro:insert_block name="self_collision_geometries" />
|
||||
</xacro:unless>
|
||||
</link>
|
||||
<!-- fixed joint between both sub-links -->
|
||||
<joint name="${prefix}${name}_sc_joint" type="fixed">
|
||||
<origin rpy="${rpy}" />
|
||||
<parent link="${prefix}${name}" />
|
||||
<child link="${prefix}${name}_sc" />
|
||||
</joint>
|
||||
</xacro:if>
|
||||
</xacro:macro>
|
||||
|
||||
<!-- =========================================================== -->
|
||||
<!-- Add a <collision> tag with a capsule, made from a cylinder -->
|
||||
<!-- with two spheres at its caps. The capsule will always be -->
|
||||
<!-- aligned with the axis of 'direction' you pass along. -->
|
||||
<!-- -->
|
||||
<!-- radius: Radii of both the cylinder and both spheres [m] -->
|
||||
<!-- length: Length of the cylinder/distance between the centers -->
|
||||
<!-- of the spheres. NOT overall length of capsule! -->
|
||||
<!-- xyz: Position of the center of the capsule/cylinder -->
|
||||
<!-- direction: One of { x, y, z, -x, -y, -z } -->
|
||||
<!-- =========================================================== -->
|
||||
<xacro:macro name="collision_capsule" params="radius length xyz:='0 0 0' direction:='z'">
|
||||
<xacro:property name="r" value="${pi/2.0 if 'y' in direction else 0}" />
|
||||
<xacro:property name="p" value="${pi/2.0 if 'x' in direction else 0}" />
|
||||
<xacro:property name="y" value="0" />
|
||||
<xacro:property name="x" value="${xyz.split(' ')[0]}" />
|
||||
<xacro:property name="y" value="${xyz.split(' ')[1]}" />
|
||||
<xacro:property name="z" value="${xyz.split(' ')[2]}" />
|
||||
<!-- Sphere center offsets from center of cylinder -->
|
||||
<xacro:property name="sx" value="${length / 2.0 if 'x' in direction else 0}" />
|
||||
<xacro:property name="sy" value="${length / 2.0 if 'y' in direction else 0}" />
|
||||
<xacro:property name="sz" value="${length / 2.0 if 'z' in direction else 0}" />
|
||||
|
||||
<collision>
|
||||
<origin xyz="${x} ${y} ${z}" rpy="${r} ${p} ${y}"/>
|
||||
<geometry>
|
||||
<cylinder radius="${radius}" length="${length}" />
|
||||
</geometry>
|
||||
</collision>
|
||||
<collision>
|
||||
<origin xyz="${x+sx} ${y+sy} ${z+sz}" />
|
||||
<geometry>
|
||||
<sphere radius="${radius}" />
|
||||
</geometry>
|
||||
</collision>
|
||||
<collision>
|
||||
<origin xyz="${x-sx} ${y-sy} ${z-sz}" />
|
||||
<geometry>
|
||||
<sphere radius="${radius}" />
|
||||
</geometry>
|
||||
</collision>
|
||||
</xacro:macro>
|
||||
|
||||
<!-- ========================================================== -->
|
||||
<!-- Adds the required tags to simulate one joint in gazebo -->
|
||||
<!-- -->
|
||||
<!-- joint - Name of the fer joint to simulate -->
|
||||
<!-- transmission - type of the transmission of the joint -->
|
||||
<!-- ========================================================== -->
|
||||
<xacro:macro name="gazebo-joint" params="joint transmission:=hardware_interface/EffortJointInterface">
|
||||
<gazebo reference="${joint}">
|
||||
<!-- Needed for ODE to output external wrenches on joints -->
|
||||
<provideFeedback>true</provideFeedback>
|
||||
</gazebo>
|
||||
|
||||
<transmission name="${joint}_transmission">
|
||||
<type>transmission_interface/SimpleTransmission</type>
|
||||
<joint name="${joint}">
|
||||
<hardwareInterface>${transmission}</hardwareInterface>
|
||||
</joint>
|
||||
<actuator name="${joint}_motor">
|
||||
<hardwareInterface>${transmission}</hardwareInterface>
|
||||
</actuator>
|
||||
</transmission>
|
||||
</xacro:macro>
|
||||
|
||||
<xacro:macro name="gazebo-friction" params="link mu">
|
||||
<gazebo reference="${link}">
|
||||
<collision>
|
||||
<max_contacts>10</max_contacts>
|
||||
<surface>
|
||||
<contact>
|
||||
<ode>
|
||||
<!-- These two parameter need application specific tuning. -->
|
||||
<!-- Usually you want no "snap out" velocity and a generous -->
|
||||
<!-- penetration depth to keep the grasping stable -->
|
||||
<max_vel>0</max_vel>
|
||||
<min_depth>0.001</min_depth>
|
||||
</ode>
|
||||
</contact>
|
||||
<friction>
|
||||
<ode>
|
||||
<mu>${mu}</mu>
|
||||
<mu2>${mu}</mu2>
|
||||
</ode>
|
||||
</friction>
|
||||
<bounce/>
|
||||
</surface>
|
||||
</collision>
|
||||
</gazebo>
|
||||
</xacro:macro>
|
||||
|
||||
<!-- ========================================================== -->
|
||||
<!-- Adds the required tags to provide a `FrankaStateInterface` -->
|
||||
<!-- when simulating with franka_hw_sim plugin -->
|
||||
<!-- -->
|
||||
<!-- arm_id - Arm ID of the fer to simulate (default 'fer') -->
|
||||
<!-- ========================================================== -->
|
||||
<xacro:macro name="transmission-franka-state" params="arm_id:=fer">
|
||||
<transmission name="${arm_prefix}${arm_id}_franka_state">
|
||||
<type>franka_hw/FrankaStateInterface</type>
|
||||
<joint name="${arm_prefix}${arm_id}_joint1"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></joint>
|
||||
<joint name="${arm_prefix}${arm_id}_joint2"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></joint>
|
||||
<joint name="${arm_prefix}${arm_id}_joint3"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></joint>
|
||||
<joint name="${arm_prefix}${arm_id}_joint4"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></joint>
|
||||
<joint name="${arm_prefix}${arm_id}_joint5"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></joint>
|
||||
<joint name="${arm_prefix}${arm_id}_joint6"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></joint>
|
||||
<joint name="${arm_prefix}${arm_id}_joint7"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></joint>
|
||||
|
||||
<actuator name="${arm_prefix}${arm_id}_motor1"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></actuator>
|
||||
<actuator name="${arm_prefix}${arm_id}_motor2"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></actuator>
|
||||
<actuator name="${arm_prefix}${arm_id}_motor3"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></actuator>
|
||||
<actuator name="${arm_prefix}${arm_id}_motor4"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></actuator>
|
||||
<actuator name="${arm_prefix}${arm_id}_motor5"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></actuator>
|
||||
<actuator name="${arm_prefix}${arm_id}_motor6"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></actuator>
|
||||
<actuator name="${arm_prefix}${arm_id}_motor7"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></actuator>
|
||||
</transmission>
|
||||
</xacro:macro>
|
||||
|
||||
<!-- ============================================================ -->
|
||||
<!-- Adds the required tags to provide a `FrankaModelInterface` -->
|
||||
<!-- when simulating with franka_hw_sim plugin -->
|
||||
<!-- -->
|
||||
<!-- arm_id - Arm ID of the fer to simulate (default 'fer') -->
|
||||
<!-- root - Joint name of the base of the robot -->
|
||||
<!-- tip - Joint name of the tip of the robot (flange or hand) -->
|
||||
<!-- ============================================================ -->
|
||||
<xacro:macro name="transmission-franka-model" params="arm_id:=fer root:=fer_joint1 tip:=fer_joint7">
|
||||
<transmission name="${arm_prefix}${arm_id}_franka_model">
|
||||
<type>franka_hw/FrankaModelInterface</type>
|
||||
<joint name="${root}">
|
||||
<role>root</role>
|
||||
<hardwareInterface>franka_hw/FrankaModelInterface</hardwareInterface>
|
||||
</joint>
|
||||
<joint name="${tip}">
|
||||
<role>tip</role>
|
||||
<hardwareInterface>franka_hw/FrankaModelInterface</hardwareInterface>
|
||||
</joint>
|
||||
|
||||
<actuator name="${root}_motor_root"><hardwareInterface>franka_hw/FrankaModelInterface</hardwareInterface></actuator>
|
||||
<actuator name="${tip}_motor_tip" ><hardwareInterface>franka_hw/FrankaModelInterface</hardwareInterface></actuator>
|
||||
</transmission>
|
||||
</xacro:macro>
|
||||
|
||||
<xacro:macro name="inertia-cylinder" params="mass radius h">
|
||||
<inertial>
|
||||
<mass value="${mass}" />
|
||||
<inertia ixx="${1./12 * mass * (3 * radius**2 + h**2)}" ixy = "0" ixz = "0"
|
||||
iyy="${1./12 * mass * (3 * radius**2 + h**2)}" iyz = "0"
|
||||
izz="${1./2 * mass * radius**2}" />
|
||||
</inertial>
|
||||
</xacro:macro>
|
||||
|
||||
<!-- ========================================================================= -->
|
||||
<!-- Adds the <limit ... /> & <safety_controller/> tags given a config file -->
|
||||
<!-- of joint limits -->
|
||||
<!-- -->
|
||||
<!-- config - YAML struct defining joint limits (e.g. fer/joint_limits.yaml) -->
|
||||
<!-- name - Name of the joint for which to add limits to -->
|
||||
<!-- ========================================================================= -->
|
||||
<xacro:macro name="franka-limits" params="config name">
|
||||
<xacro:property name="limits" value="${config[name]['limit']}" lazy_eval="false" />
|
||||
<limit lower="${limits.lower}"
|
||||
upper="${limits.upper}"
|
||||
effort="${limits.effort}"
|
||||
velocity="${limits.velocity}" />
|
||||
<safety_controller k_position="100.0"
|
||||
k_velocity="40.0"
|
||||
soft_lower_limit="${limits.lower}"
|
||||
soft_upper_limit="${limits.upper}" />
|
||||
</xacro:macro>
|
||||
|
||||
<!-- ========================================================================= -->
|
||||
<!-- Adds the <dynamics ... /> tag given a config file of joint dynamics -->
|
||||
<!-- -->
|
||||
<!-- config - YAML struct defining joint dynamics (e.g. fer/dynamics.yaml) -->
|
||||
<!-- name - Name of the joint for which to add dynamics to -->
|
||||
<!-- ========================================================================= -->
|
||||
<xacro:macro name="franka-dynamics" params="config name">
|
||||
<xacro:property name="dynamics" value="${config[name]['dynamic']}" lazy_eval="false" />
|
||||
<dynamics D="${dynamics.D}"
|
||||
K="${dynamics.K}"
|
||||
damping="${dynamics.damping}"
|
||||
friction="${dynamics.friction}"
|
||||
mu_coulomb="${dynamics.mu_coulomb}"
|
||||
mu_viscous="${dynamics.mu_viscous}" />
|
||||
</xacro:macro>
|
||||
|
||||
<!-- ========================================================================= -->
|
||||
<!-- Adds the <kinematics ... /> tag given a config file of joint kinematics -->
|
||||
<!-- -->
|
||||
<!-- config - YAML struct defining joint kinematics (e.g. fer/kinematics.yaml) -->
|
||||
<!-- name - Name of the joint for which to add kinematics to -->
|
||||
<!-- ========================================================================= -->
|
||||
<xacro:macro name="franka-kinematics" params="config name">
|
||||
<xacro:property name="kinematics" value="${config[name]['kinematic']}" lazy_eval="false" />
|
||||
<origin rpy="${kinematics.roll} ${kinematics.pitch} ${kinematics.yaw}"
|
||||
xyz="${kinematics.x} ${kinematics.y} ${kinematics.z}" />
|
||||
</xacro:macro>
|
||||
|
||||
</robot>
|
||||
62
robots/fer/dynamics.yaml
Normal file
62
robots/fer/dynamics.yaml
Normal file
@@ -0,0 +1,62 @@
|
||||
joint1:
|
||||
dynamic:
|
||||
D: 1
|
||||
K: 7000
|
||||
damping: 0.003
|
||||
friction: 0.2
|
||||
mu_coulomb: 0
|
||||
mu_viscous: 16
|
||||
|
||||
joint2:
|
||||
dynamic:
|
||||
D: 1
|
||||
K: 7000
|
||||
damping: 0.003
|
||||
friction: 0.2
|
||||
mu_coulomb: 0
|
||||
mu_viscous: 16
|
||||
|
||||
joint3:
|
||||
dynamic:
|
||||
D: 1
|
||||
K: 7000
|
||||
damping: 0.003
|
||||
friction: 0.2
|
||||
mu_coulomb: 0
|
||||
mu_viscous: 16
|
||||
|
||||
joint4:
|
||||
dynamic:
|
||||
D: 1
|
||||
K: 7000
|
||||
damping: 0.003
|
||||
friction: 0.2
|
||||
mu_coulomb: 0
|
||||
mu_viscous: 16
|
||||
|
||||
joint5:
|
||||
dynamic:
|
||||
D: 1
|
||||
K: 7000
|
||||
damping: 0.003
|
||||
friction: 0.2
|
||||
mu_coulomb: 0
|
||||
mu_viscous: 16
|
||||
|
||||
joint6:
|
||||
dynamic:
|
||||
D: 1
|
||||
K: 7000
|
||||
damping: 0.003
|
||||
friction: 0.2
|
||||
mu_coulomb: 0
|
||||
mu_viscous: 16
|
||||
|
||||
joint7:
|
||||
dynamic:
|
||||
D: 1
|
||||
K: 7000
|
||||
damping: 0.003
|
||||
friction: 0.2
|
||||
mu_coulomb: 0
|
||||
mu_viscous: 16
|
||||
66
robots/fer/fer.urdf.xacro
Normal file
66
robots/fer/fer.urdf.xacro
Normal file
@@ -0,0 +1,66 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="fer">
|
||||
|
||||
<xacro:include filename="$(find franka_description)/robots/common/franka_robot.xacro"/>
|
||||
|
||||
<!--
|
||||
DEPRECATION NOTICE
|
||||
argument arm_id is no longer supported and will be removed in the future.
|
||||
This argument is ignored.
|
||||
-->
|
||||
<xacro:arg name="arm_id" default="fer" />
|
||||
|
||||
<!-- Don't print a prefix for joints, visuals, and links? -->
|
||||
<xacro:arg name="no_prefix" default="false"/>
|
||||
|
||||
<!-- Should an end-effector be mounted at the flange?" -->
|
||||
<xacro:arg name="hand" default="true" />
|
||||
|
||||
<!-- Which end-effector would be mounted at the flange?" -->
|
||||
<xacro:arg name="ee_id" default="franka_hand" />
|
||||
|
||||
<!-- Is the robot being simulated in gazebo?" -->
|
||||
<xacro:arg name="gazebo" default="false" />
|
||||
<!-- If `gazebo` arg is set, to which frame shall $(arm_id)_link0 be parented. Empty string for not fixing at all -->
|
||||
<xacro:arg name="parent" default="world" />
|
||||
<!-- If `gazebo` arg is set and `parent` not empty, what position offset between `parent` & $(arm_id)_link0 -->
|
||||
<xacro:arg name="xyz" default="0 0 0" />
|
||||
<!-- If `gazebo` arg is set and `parent` not empty, what rotation offset between `parent` & $(arm_id)_link0 -->
|
||||
<xacro:arg name="rpy" default="0 0 0" />
|
||||
|
||||
<!-- Should self-collision be enabled? -->
|
||||
<xacro:arg name="with_sc" default="false" />
|
||||
|
||||
<!-- Is the robot being controlled with ros2_control?" -->
|
||||
<xacro:arg name="ros2_control" default="false" />
|
||||
<!-- IP address or hostname of the robot" -->
|
||||
<xacro:arg name="robot_ip" default="" />
|
||||
<!-- Should a fake hardware be used? -->
|
||||
<xacro:arg name="use_fake_hardware" default="false" />
|
||||
<!-- Should fake sensors be used? -->
|
||||
<xacro:arg name="fake_sensor_commands" default="false" />
|
||||
<!-- Should the robot be spawned in Gazebo with effort interfaces?" -->
|
||||
<xacro:arg name="gazebo_effort" default="false" />
|
||||
|
||||
<!-- For a multi arm setup, we need a threaded robot running async-->
|
||||
<xacro:arg name="multi_arm" default="false" />
|
||||
|
||||
<xacro:franka_robot arm_id="fer"
|
||||
joint_limits="${xacro.load_yaml('$(find franka_description)/robots/fer/joint_limits.yaml')}"
|
||||
inertials="${xacro.load_yaml('$(find franka_description)/robots/fer/inertials.yaml')}"
|
||||
kinematics="${xacro.load_yaml('$(find franka_description)/robots/fer/kinematics.yaml')}"
|
||||
dynamics="${xacro.load_yaml('$(find franka_description)/robots/fer/dynamics.yaml')}"
|
||||
gazebo="$(arg gazebo)"
|
||||
hand="$(arg hand)"
|
||||
ee_id="$(arg ee_id)"
|
||||
with_sc="$(arg with_sc)"
|
||||
ros2_control="$(arg ros2_control)"
|
||||
robot_ip="$(arg robot_ip)"
|
||||
use_fake_hardware="$(arg use_fake_hardware)"
|
||||
fake_sensor_commands="$(arg fake_sensor_commands)"
|
||||
gazebo_effort="$(arg gazebo_effort)"
|
||||
no_prefix="$(arg no_prefix)"
|
||||
arm_prefix= ""
|
||||
connected_to= "base">
|
||||
</xacro:franka_robot>
|
||||
</robot>
|
||||
96
robots/fer/inertials.yaml
Normal file
96
robots/fer/inertials.yaml
Normal file
@@ -0,0 +1,96 @@
|
||||
link0:
|
||||
origin:
|
||||
xyz: -0.0172 0.0004 0.0745
|
||||
rpy: 0 0 0
|
||||
mass: 2.3966
|
||||
inertia:
|
||||
xx: 0.0090
|
||||
xy: 0.0000
|
||||
xz: 0.0020
|
||||
yy: 0.0115
|
||||
yz: 0.0000
|
||||
zz: 0.0085
|
||||
link1:
|
||||
origin:
|
||||
xyz: 0.00033 -0.02204 -0.04762
|
||||
rpy: 0 0 0
|
||||
mass: 2.7907
|
||||
inertia:
|
||||
xx: 0.01564782655
|
||||
xy: 0.00000531236
|
||||
xz: -0.00003676721
|
||||
yy: 0.01439883526
|
||||
yz: -0.00248480843
|
||||
zz: 0.00500443991
|
||||
link2:
|
||||
origin:
|
||||
xyz: 0.00038 -0.09211 0.01908
|
||||
rpy: 0 0 0
|
||||
mass: 2.5420
|
||||
inertia:
|
||||
xx: 0.01662427728
|
||||
xy: 0.00003086077
|
||||
xz: 0.00000835940
|
||||
yy: 0.00462501261
|
||||
yz: 0.00355899830
|
||||
zz: 0.01545124526
|
||||
link3:
|
||||
origin:
|
||||
xyz: 0.05152 0.01696 -0.02971
|
||||
rpy: 0 0 0
|
||||
mass: 2.2513
|
||||
inertia:
|
||||
xx: 0.00631741992
|
||||
xy: 0.00097309955
|
||||
xz: 0.00292525834
|
||||
yy: 0.00866285493
|
||||
yz: 0.00093469224
|
||||
zz: 0.00657804051
|
||||
link4:
|
||||
origin:
|
||||
xyz: -0.05113 0.05825 0.01698
|
||||
rpy: 0 0 0
|
||||
mass: 2.2037
|
||||
inertia:
|
||||
xx: 0.00784585566
|
||||
xy: -0.00339591957
|
||||
xz: 0.00158704074
|
||||
yy: 0.00649543136
|
||||
yz: -0.00181477884
|
||||
zz: 0.01003079917
|
||||
link5:
|
||||
origin:
|
||||
xyz: -0.00005 0.03730 -0.09280
|
||||
rpy: 0 0 0
|
||||
mass: 2.2855
|
||||
inertia:
|
||||
xx: 0.02297014781
|
||||
xy: -0.00000949345
|
||||
xz: -0.00002063156
|
||||
yy: 0.02095060919
|
||||
yz: 0.00382345782
|
||||
zz: 0.00430606551
|
||||
link6:
|
||||
origin:
|
||||
xyz: 0.06572 -0.00371 0.00153
|
||||
rpy: 0 0 0
|
||||
mass: 1.353
|
||||
inertia:
|
||||
xx: 0.00087964522
|
||||
xy: -0.00021487814
|
||||
xz: -0.00011911662
|
||||
yy: 0.00277796968
|
||||
yz: 0.00001274322
|
||||
zz: 0.00286701969
|
||||
link7:
|
||||
origin:
|
||||
xyz: 0.00089 -0.00044 0.05491
|
||||
rpy: 0 0 0
|
||||
mass: 0.35973
|
||||
inertia:
|
||||
xx: 0.00019541063
|
||||
xy: 0.00000165231
|
||||
xz: 0.00000148826
|
||||
yy: 0.00019210361
|
||||
yz: -0.00000131132
|
||||
zz: 0.00017936256
|
||||
48
robots/fer/joint_limits.yaml
Normal file
48
robots/fer/joint_limits.yaml
Normal file
@@ -0,0 +1,48 @@
|
||||
joint1:
|
||||
limit:
|
||||
lower: -2.8973
|
||||
upper: 2.8973
|
||||
velocity: 2.1750
|
||||
effort: 87.0
|
||||
|
||||
joint2:
|
||||
limit:
|
||||
lower: -1.7628
|
||||
upper: 1.7628
|
||||
velocity: 2.1750
|
||||
effort: 87.0
|
||||
|
||||
joint3:
|
||||
limit:
|
||||
lower: -2.8973
|
||||
upper: 2.8973
|
||||
velocity: 2.1750
|
||||
effort: 87.0
|
||||
|
||||
joint4:
|
||||
limit:
|
||||
lower: -3.0718
|
||||
upper: -0.0698
|
||||
velocity: 2.1750
|
||||
effort: 87.0
|
||||
|
||||
joint5:
|
||||
limit:
|
||||
lower: -2.8973
|
||||
upper: 2.8973
|
||||
velocity: 2.6100
|
||||
effort: 12.0
|
||||
|
||||
joint6:
|
||||
limit:
|
||||
lower: -0.0175
|
||||
upper: 3.7525
|
||||
velocity: 2.6100
|
||||
effort: 12.0
|
||||
|
||||
joint7:
|
||||
limit:
|
||||
lower: -2.8973
|
||||
upper: 2.8973
|
||||
velocity: 2.6100
|
||||
effort: 12.0
|
||||
72
robots/fer/kinematics.yaml
Normal file
72
robots/fer/kinematics.yaml
Normal file
@@ -0,0 +1,72 @@
|
||||
joint1:
|
||||
kinematic:
|
||||
x: 0
|
||||
y: 0
|
||||
z: 0.333
|
||||
roll: 0
|
||||
pitch: 0
|
||||
yaw: 0
|
||||
|
||||
joint2:
|
||||
kinematic:
|
||||
x: 0
|
||||
y: 0
|
||||
z: 0
|
||||
roll: -1.570796326794897
|
||||
pitch: 0
|
||||
yaw: 0
|
||||
|
||||
joint3:
|
||||
kinematic:
|
||||
x: 0
|
||||
y: -0.316
|
||||
z: 0
|
||||
roll: 1.570796326794897
|
||||
pitch: 0
|
||||
yaw: 0
|
||||
|
||||
joint4:
|
||||
kinematic:
|
||||
x: 0.0825
|
||||
y: 0
|
||||
z: 0
|
||||
roll: 1.570796326794897
|
||||
pitch: 0
|
||||
yaw: 0
|
||||
|
||||
joint5:
|
||||
kinematic:
|
||||
x: -0.0825
|
||||
y: 0.384
|
||||
z: 0
|
||||
roll: -1.570796326794897
|
||||
pitch: 0
|
||||
yaw: 0
|
||||
|
||||
joint6:
|
||||
kinematic:
|
||||
x: 0
|
||||
y: 0
|
||||
z: 0
|
||||
roll: 1.570796326794897
|
||||
pitch: 0
|
||||
yaw: 0
|
||||
|
||||
joint7:
|
||||
kinematic:
|
||||
x: 0.088
|
||||
y: 0
|
||||
z: 0
|
||||
roll: 1.570796326794897
|
||||
pitch: 0
|
||||
yaw: 0
|
||||
|
||||
# Joint to tool origin
|
||||
joint8:
|
||||
kinematic:
|
||||
x: 0
|
||||
y: 0
|
||||
z: 0.107
|
||||
roll: 0
|
||||
pitch: 0
|
||||
yaw: 0
|
||||
62
robots/fp3/dynamics.yaml
Normal file
62
robots/fp3/dynamics.yaml
Normal file
@@ -0,0 +1,62 @@
|
||||
joint1:
|
||||
dynamic:
|
||||
D: 1
|
||||
K: 7000
|
||||
damping: 0.003
|
||||
friction: 0.2
|
||||
mu_coulomb: 0
|
||||
mu_viscous: 16
|
||||
|
||||
joint2:
|
||||
dynamic:
|
||||
D: 1
|
||||
K: 7000
|
||||
damping: 0.003
|
||||
friction: 0.2
|
||||
mu_coulomb: 0
|
||||
mu_viscous: 16
|
||||
|
||||
joint3:
|
||||
dynamic:
|
||||
D: 1
|
||||
K: 7000
|
||||
damping: 0.003
|
||||
friction: 0.2
|
||||
mu_coulomb: 0
|
||||
mu_viscous: 16
|
||||
|
||||
joint4:
|
||||
dynamic:
|
||||
D: 1
|
||||
K: 7000
|
||||
damping: 0.003
|
||||
friction: 0.2
|
||||
mu_coulomb: 0
|
||||
mu_viscous: 16
|
||||
|
||||
joint5:
|
||||
dynamic:
|
||||
D: 1
|
||||
K: 7000
|
||||
damping: 0.003
|
||||
friction: 0.2
|
||||
mu_coulomb: 0
|
||||
mu_viscous: 16
|
||||
|
||||
joint6:
|
||||
dynamic:
|
||||
D: 1
|
||||
K: 7000
|
||||
damping: 0.003
|
||||
friction: 0.2
|
||||
mu_coulomb: 0
|
||||
mu_viscous: 16
|
||||
|
||||
joint7:
|
||||
dynamic:
|
||||
D: 1
|
||||
K: 7000
|
||||
damping: 0.003
|
||||
friction: 0.2
|
||||
mu_coulomb: 0
|
||||
mu_viscous: 16
|
||||
65
robots/fp3/fp3.urdf.xacro
Normal file
65
robots/fp3/fp3.urdf.xacro
Normal file
@@ -0,0 +1,65 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="fp3">
|
||||
|
||||
<xacro:include filename="$(find franka_description)/robots/common/franka_robot.xacro"/>
|
||||
|
||||
<!--
|
||||
DEPRECATION NOTICE
|
||||
argument arm_id is no longer supported and will be removed in the future.
|
||||
This argument is ignored.
|
||||
-->
|
||||
<xacro:arg name="arm_id" default="fp3" />
|
||||
|
||||
<!-- Don't print a prefix for joints, visuals, and links? -->
|
||||
<xacro:arg name="no_prefix" default="false"/>
|
||||
|
||||
<!-- Should an end-effector be mounted at the flange?" -->
|
||||
<xacro:arg name="hand" default="true" />
|
||||
|
||||
<!-- Which end-effector would be mounted at the flange?" -->
|
||||
<xacro:arg name="ee_id" default="franka_hand" />
|
||||
|
||||
<!-- Should self-collision be enabled? -->
|
||||
<xacro:arg name="with_sc" default="false" />
|
||||
|
||||
<!-- Is the robot being controlled with ros2_control?" -->
|
||||
<xacro:arg name="ros2_control" default="false" />
|
||||
|
||||
<!-- IP address or hostname of the robot" -->
|
||||
<xacro:arg name="robot_ip" default="" />
|
||||
|
||||
<!-- Should a fake hardware be used? -->
|
||||
<xacro:arg name="use_fake_hardware" default="false" />
|
||||
|
||||
<!-- Should fake sensors be used? -->
|
||||
<xacro:arg name="fake_sensor_commands" default="false" />
|
||||
|
||||
<!-- Should the robot be spawned in Gazebo?" -->
|
||||
<xacro:arg name="gazebo" default="false" />
|
||||
|
||||
<!-- Should the robot be spawned in Gazebo with effort interfaces?" -->
|
||||
<xacro:arg name="gazebo_effort" default="false" />
|
||||
|
||||
<!-- For a multi arm setup, we need a threaded robot running async-->
|
||||
<xacro:arg name="multi_arm" default="false" />
|
||||
|
||||
<xacro:franka_robot arm_id="fp3"
|
||||
joint_limits="${xacro.load_yaml('$(find franka_description)/robots/fp3/joint_limits.yaml')}"
|
||||
inertials="${xacro.load_yaml('$(find franka_description)/robots/fp3/inertials.yaml')}"
|
||||
kinematics="${xacro.load_yaml('$(find franka_description)/robots/fp3/kinematics.yaml')}"
|
||||
dynamics="${xacro.load_yaml('$(find franka_description)/robots/fp3/dynamics.yaml')}"
|
||||
gazebo="$(arg gazebo)"
|
||||
hand="$(arg hand)"
|
||||
ee_id="$(arg ee_id)"
|
||||
with_sc="$(arg with_sc)"
|
||||
ros2_control="$(arg ros2_control)"
|
||||
robot_ip="$(arg robot_ip)"
|
||||
use_fake_hardware="$(arg use_fake_hardware)"
|
||||
fake_sensor_commands="$(arg fake_sensor_commands)"
|
||||
gazebo_effort="$(arg gazebo_effort)"
|
||||
no_prefix="$(arg no_prefix)"
|
||||
arm_prefix= ""
|
||||
connected_to= "base">
|
||||
</xacro:franka_robot>
|
||||
|
||||
</robot>
|
||||
97
robots/fp3/inertials.yaml
Normal file
97
robots/fp3/inertials.yaml
Normal file
@@ -0,0 +1,97 @@
|
||||
link0:
|
||||
origin:
|
||||
xyz: -0.0172 0.0004 0.0745
|
||||
rpy: 0 0 0
|
||||
mass: 2.3966
|
||||
inertia:
|
||||
xx: 0.0090
|
||||
xy: 0.0000
|
||||
xz: 0.0020
|
||||
yy: 0.0115
|
||||
yz: 0.0000
|
||||
zz: 0.0085
|
||||
link1:
|
||||
origin:
|
||||
xyz: 0.0000004128 -0.0181251324 -0.0386035970
|
||||
rpy: 0 0 0
|
||||
mass: 2.9274653454
|
||||
inertia:
|
||||
inertia:
|
||||
xx: 0.023927316485107913
|
||||
xy: 1.3317903455714081e-05
|
||||
xz: -0.00011404774918616684
|
||||
yy: 0.0224821613275756
|
||||
yz: -0.0019950320628240115
|
||||
zz: 0.006350098258530016
|
||||
link2:
|
||||
origin:
|
||||
xyz: 0.0031828864 -0.0743221644 0.0088146084
|
||||
rpy: 0 0 0
|
||||
mass: 2.9355370338
|
||||
inertia:
|
||||
xx: 0.041938946257609425
|
||||
xy: 0.00020257331521090626
|
||||
xz: 0.004077784227179924
|
||||
yy: 0.02514514885014724
|
||||
yz: -0.0042252158006570156
|
||||
zz: 0.06170214472888839
|
||||
link3:
|
||||
origin:
|
||||
xyz: 0.0407015686 -0.0048200565 -0.0289730823
|
||||
rpy: 0 0 0
|
||||
mass: 2.2449013699
|
||||
inertia:
|
||||
xx: 0.02410142547240885
|
||||
xy: 0.002404694559042109
|
||||
xz: -0.002856269270114313
|
||||
yy: 0.01974053266708178
|
||||
yz: -0.002104212683891874
|
||||
zz: 0.019044494482244823
|
||||
link4:
|
||||
origin:
|
||||
xyz: -0.0459100965 0.0630492960 -0.0085187868
|
||||
rpy: 0 0 0
|
||||
mass: 2.6155955791
|
||||
inertia:
|
||||
xx: 0.03452998321913202
|
||||
xy: 0.01322552265982813
|
||||
xz: 0.01015142998484113
|
||||
yy: 0.028881621933049058
|
||||
yz: -0.0009762833870704552
|
||||
zz: 0.04125471171146641
|
||||
link5:
|
||||
origin:
|
||||
xyz: -0.0016039605 0.0292536262 -0.0972965990
|
||||
rpy: 0 0 0
|
||||
mass: 2.3271207594
|
||||
inertia:
|
||||
xx: 0.051610278463662895
|
||||
xy: -0.005715173387783472
|
||||
xz: -0.0035673167625872135
|
||||
yy: 0.04787729713371481
|
||||
yz: 0.010673985108535986
|
||||
zz: 0.016423625579357254
|
||||
link6:
|
||||
origin:
|
||||
xyz: 0.0597131221 -0.0410294666 -0.0101692726
|
||||
rpy: 0 0 0
|
||||
mass: 1.8170376524
|
||||
inertia:
|
||||
xx: 0.005412333594383447
|
||||
xy: 0.006193456360285834
|
||||
xz: 0.0014219289306117652
|
||||
yy: 0.014058329545509979
|
||||
yz: -0.0013140753741120031
|
||||
zz: 0.016080817924212554
|
||||
link7:
|
||||
origin:
|
||||
xyz: 0.0045225817 0.0086261921 -0.0161633251
|
||||
rpy: 0 0 0
|
||||
mass: 0.6271432862
|
||||
inertia:
|
||||
xx: 0.00021092389150104718
|
||||
xy: -2.433299114461931e-05
|
||||
xz: 4.564480393778983e-05
|
||||
yy: 0.00017718568002411474
|
||||
yz: 8.744070223226438e-05
|
||||
zz: 5.993190599659971e-05
|
||||
48
robots/fp3/joint_limits.yaml
Normal file
48
robots/fp3/joint_limits.yaml
Normal file
@@ -0,0 +1,48 @@
|
||||
joint1:
|
||||
limit:
|
||||
lower: -2.7437
|
||||
upper: 2.7437
|
||||
velocity: 2.62
|
||||
effort: 87.0
|
||||
|
||||
joint2:
|
||||
limit:
|
||||
lower: -1.7837
|
||||
upper: 1.7837
|
||||
velocity: 2.62
|
||||
effort: 87.0
|
||||
|
||||
joint3:
|
||||
limit:
|
||||
lower: -2.9007
|
||||
upper: 2.9007
|
||||
velocity: 2.62
|
||||
effort: 87.0
|
||||
|
||||
joint4:
|
||||
limit:
|
||||
lower: -3.0421
|
||||
upper: -0.1518
|
||||
velocity: 2.62
|
||||
effort: 87.0
|
||||
|
||||
joint5:
|
||||
limit:
|
||||
lower: -2.8065
|
||||
upper: 2.8065
|
||||
velocity: 5.26
|
||||
effort: 12.0
|
||||
|
||||
joint6:
|
||||
limit:
|
||||
lower: 0.5445
|
||||
upper: 4.5169
|
||||
velocity: 4.18
|
||||
effort: 12.0
|
||||
|
||||
joint7:
|
||||
limit:
|
||||
lower: -3.0159
|
||||
upper: 3.0159
|
||||
velocity: 5.26
|
||||
effort: 12.0
|
||||
72
robots/fp3/kinematics.yaml
Normal file
72
robots/fp3/kinematics.yaml
Normal file
@@ -0,0 +1,72 @@
|
||||
joint1:
|
||||
kinematic:
|
||||
x: 0
|
||||
y: 0
|
||||
z: 0.333
|
||||
roll: 0
|
||||
pitch: 0
|
||||
yaw: 0
|
||||
|
||||
joint2:
|
||||
kinematic:
|
||||
x: 0
|
||||
y: 0
|
||||
z: 0
|
||||
roll: -1.570796326794897
|
||||
pitch: 0
|
||||
yaw: 0
|
||||
|
||||
joint3:
|
||||
kinematic:
|
||||
x: 0
|
||||
y: -0.316
|
||||
z: 0
|
||||
roll: 1.570796326794897
|
||||
pitch: 0
|
||||
yaw: 0
|
||||
|
||||
joint4:
|
||||
kinematic:
|
||||
x: 0.0825
|
||||
y: 0
|
||||
z: 0
|
||||
roll: 1.570796326794897
|
||||
pitch: 0
|
||||
yaw: 0
|
||||
|
||||
joint5:
|
||||
kinematic:
|
||||
x: -0.0825
|
||||
y: 0.384
|
||||
z: 0
|
||||
roll: -1.570796326794897
|
||||
pitch: 0
|
||||
yaw: 0
|
||||
|
||||
joint6:
|
||||
kinematic:
|
||||
x: 0
|
||||
y: 0
|
||||
z: 0
|
||||
roll: 1.570796326794897
|
||||
pitch: 0
|
||||
yaw: 0
|
||||
|
||||
joint7:
|
||||
kinematic:
|
||||
x: 0.088
|
||||
y: 0
|
||||
z: 0
|
||||
roll: 1.570796326794897
|
||||
pitch: 0
|
||||
yaw: 0
|
||||
|
||||
# Joint to tool origin
|
||||
joint8:
|
||||
kinematic:
|
||||
x: 0
|
||||
y: 0
|
||||
z: 0.107
|
||||
roll: 0
|
||||
pitch: 0
|
||||
yaw: 0
|
||||
62
robots/fr3/dynamics.yaml
Normal file
62
robots/fr3/dynamics.yaml
Normal file
@@ -0,0 +1,62 @@
|
||||
joint1:
|
||||
dynamic:
|
||||
D: 1
|
||||
K: 7000
|
||||
damping: 0.003
|
||||
friction: 0.2
|
||||
mu_coulomb: 0
|
||||
mu_viscous: 16
|
||||
|
||||
joint2:
|
||||
dynamic:
|
||||
D: 1
|
||||
K: 7000
|
||||
damping: 0.003
|
||||
friction: 0.2
|
||||
mu_coulomb: 0
|
||||
mu_viscous: 16
|
||||
|
||||
joint3:
|
||||
dynamic:
|
||||
D: 1
|
||||
K: 7000
|
||||
damping: 0.003
|
||||
friction: 0.2
|
||||
mu_coulomb: 0
|
||||
mu_viscous: 16
|
||||
|
||||
joint4:
|
||||
dynamic:
|
||||
D: 1
|
||||
K: 7000
|
||||
damping: 0.003
|
||||
friction: 0.2
|
||||
mu_coulomb: 0
|
||||
mu_viscous: 16
|
||||
|
||||
joint5:
|
||||
dynamic:
|
||||
D: 1
|
||||
K: 7000
|
||||
damping: 0.003
|
||||
friction: 0.2
|
||||
mu_coulomb: 0
|
||||
mu_viscous: 16
|
||||
|
||||
joint6:
|
||||
dynamic:
|
||||
D: 1
|
||||
K: 7000
|
||||
damping: 0.003
|
||||
friction: 0.2
|
||||
mu_coulomb: 0
|
||||
mu_viscous: 16
|
||||
|
||||
joint7:
|
||||
dynamic:
|
||||
D: 1
|
||||
K: 7000
|
||||
damping: 0.003
|
||||
friction: 0.2
|
||||
mu_coulomb: 0
|
||||
mu_viscous: 16
|
||||
65
robots/fr3/fr3.urdf.xacro
Normal file
65
robots/fr3/fr3.urdf.xacro
Normal file
@@ -0,0 +1,65 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="fr3">
|
||||
|
||||
<xacro:include filename="$(find franka_description)/robots/common/franka_robot.xacro"/>
|
||||
|
||||
<!--
|
||||
DEPRECATION NOTICE
|
||||
argument arm_id is no longer supported and will be removed in the future.
|
||||
This argument is ignored.
|
||||
-->
|
||||
<xacro:arg name="arm_id" default="fr3" />
|
||||
|
||||
<!-- Don't print a prefix for joints, visuals, and links? -->
|
||||
<xacro:arg name="no_prefix" default="false"/>
|
||||
|
||||
<!-- Should an end-effector be mounted at the flange?" -->
|
||||
<xacro:arg name="hand" default="true" />
|
||||
|
||||
<!-- Which end-effector would be mounted at the flange?" -->
|
||||
<xacro:arg name="ee_id" default="franka_hand" />
|
||||
|
||||
<!-- Should self-collision be enabled? -->
|
||||
<xacro:arg name="with_sc" default="false" />
|
||||
|
||||
<!-- Is the robot being controlled with ros2_control?" -->
|
||||
<xacro:arg name="ros2_control" default="false" />
|
||||
|
||||
<!-- IP address or hostname of the robot" -->
|
||||
<xacro:arg name="robot_ip" default="" />
|
||||
|
||||
<!-- Should a fake hardware be used? -->
|
||||
<xacro:arg name="use_fake_hardware" default="false" />
|
||||
|
||||
<!-- Should fake sensors be used? -->
|
||||
<xacro:arg name="fake_sensor_commands" default="false" />
|
||||
|
||||
<!-- Should the robot be spawned in Gazebo?" -->
|
||||
<xacro:arg name="gazebo" default="false" />
|
||||
|
||||
<!-- Should the robot be spawned in Gazebo with effort interfaces?" -->
|
||||
<xacro:arg name="gazebo_effort" default="false" />
|
||||
|
||||
<!-- For a multi arm setup, we need a threaded robot running async-->
|
||||
<xacro:arg name="multi_arm" default="false" />
|
||||
|
||||
<xacro:franka_robot arm_id="fr3"
|
||||
joint_limits="${xacro.load_yaml('$(find franka_description)/robots/fr3/joint_limits.yaml')}"
|
||||
inertials="${xacro.load_yaml('$(find franka_description)/robots/fr3/inertials.yaml')}"
|
||||
kinematics="${xacro.load_yaml('$(find franka_description)/robots/fr3/kinematics.yaml')}"
|
||||
dynamics="${xacro.load_yaml('$(find franka_description)/robots/fr3/dynamics.yaml')}"
|
||||
gazebo="$(arg gazebo)"
|
||||
hand="$(arg hand)"
|
||||
ee_id="$(arg ee_id)"
|
||||
with_sc="$(arg with_sc)"
|
||||
ros2_control="$(arg ros2_control)"
|
||||
robot_ip="$(arg robot_ip)"
|
||||
use_fake_hardware="$(arg use_fake_hardware)"
|
||||
fake_sensor_commands="$(arg fake_sensor_commands)"
|
||||
gazebo_effort="$(arg gazebo_effort)"
|
||||
no_prefix="$(arg no_prefix)"
|
||||
arm_prefix= ""
|
||||
connected_to= "base">
|
||||
</xacro:franka_robot>
|
||||
|
||||
</robot>
|
||||
97
robots/fr3/inertials.yaml
Normal file
97
robots/fr3/inertials.yaml
Normal file
@@ -0,0 +1,97 @@
|
||||
link0:
|
||||
origin:
|
||||
xyz: -0.0172 0.0004 0.0745
|
||||
rpy: 0 0 0
|
||||
mass: 2.3966
|
||||
inertia:
|
||||
xx: 0.0090
|
||||
xy: 0.0000
|
||||
xz: 0.0020
|
||||
yy: 0.0115
|
||||
yz: 0.0000
|
||||
zz: 0.0085
|
||||
link1:
|
||||
origin:
|
||||
xyz: 0.0000004128 -0.0181251324 -0.0386035970
|
||||
rpy: 0 0 0
|
||||
mass: 2.9274653454
|
||||
inertia:
|
||||
inertia:
|
||||
xx: 0.023927316485107913
|
||||
xy: 1.3317903455714081e-05
|
||||
xz: -0.00011404774918616684
|
||||
yy: 0.0224821613275756
|
||||
yz: -0.0019950320628240115
|
||||
zz: 0.006350098258530016
|
||||
link2:
|
||||
origin:
|
||||
xyz: 0.0031828864 -0.0743221644 0.0088146084
|
||||
rpy: 0 0 0
|
||||
mass: 2.9355370338
|
||||
inertia:
|
||||
xx: 0.041938946257609425
|
||||
xy: 0.00020257331521090626
|
||||
xz: 0.004077784227179924
|
||||
yy: 0.02514514885014724
|
||||
yz: -0.0042252158006570156
|
||||
zz: 0.06170214472888839
|
||||
link3:
|
||||
origin:
|
||||
xyz: 0.0407015686 -0.0048200565 -0.0289730823
|
||||
rpy: 0 0 0
|
||||
mass: 2.2449013699
|
||||
inertia:
|
||||
xx: 0.02410142547240885
|
||||
xy: 0.002404694559042109
|
||||
xz: -0.002856269270114313
|
||||
yy: 0.01974053266708178
|
||||
yz: -0.002104212683891874
|
||||
zz: 0.019044494482244823
|
||||
link4:
|
||||
origin:
|
||||
xyz: -0.0459100965 0.0630492960 -0.0085187868
|
||||
rpy: 0 0 0
|
||||
mass: 2.6155955791
|
||||
inertia:
|
||||
xx: 0.03452998321913202
|
||||
xy: 0.01322552265982813
|
||||
xz: 0.01015142998484113
|
||||
yy: 0.028881621933049058
|
||||
yz: -0.0009762833870704552
|
||||
zz: 0.04125471171146641
|
||||
link5:
|
||||
origin:
|
||||
xyz: -0.0016039605 0.0292536262 -0.0972965990
|
||||
rpy: 0 0 0
|
||||
mass: 2.3271207594
|
||||
inertia:
|
||||
xx: 0.051610278463662895
|
||||
xy: -0.005715173387783472
|
||||
xz: -0.0035673167625872135
|
||||
yy: 0.04787729713371481
|
||||
yz: 0.010673985108535986
|
||||
zz: 0.016423625579357254
|
||||
link6:
|
||||
origin:
|
||||
xyz: 0.0597131221 -0.0410294666 -0.0101692726
|
||||
rpy: 0 0 0
|
||||
mass: 1.8170376524
|
||||
inertia:
|
||||
xx: 0.005412333594383447
|
||||
xy: 0.006193456360285834
|
||||
xz: 0.0014219289306117652
|
||||
yy: 0.014058329545509979
|
||||
yz: -0.0013140753741120031
|
||||
zz: 0.016080817924212554
|
||||
link7:
|
||||
origin:
|
||||
xyz: 0.0045225817 0.0086261921 -0.0161633251
|
||||
rpy: 0 0 0
|
||||
mass: 0.6271432862
|
||||
inertia:
|
||||
xx: 0.00021092389150104718
|
||||
xy: -2.433299114461931e-05
|
||||
xz: 4.564480393778983e-05
|
||||
yy: 0.00017718568002411474
|
||||
yz: 8.744070223226438e-05
|
||||
zz: 5.993190599659971e-05
|
||||
48
robots/fr3/joint_limits.yaml
Normal file
48
robots/fr3/joint_limits.yaml
Normal file
@@ -0,0 +1,48 @@
|
||||
joint1:
|
||||
limit:
|
||||
lower: -2.7437
|
||||
upper: 2.7437
|
||||
velocity: 2.62
|
||||
effort: 87.0
|
||||
|
||||
joint2:
|
||||
limit:
|
||||
lower: -1.7837
|
||||
upper: 1.7837
|
||||
velocity: 2.62
|
||||
effort: 87.0
|
||||
|
||||
joint3:
|
||||
limit:
|
||||
lower: -2.9007
|
||||
upper: 2.9007
|
||||
velocity: 2.62
|
||||
effort: 87.0
|
||||
|
||||
joint4:
|
||||
limit:
|
||||
lower: -3.0421
|
||||
upper: -0.1518
|
||||
velocity: 2.62
|
||||
effort: 87.0
|
||||
|
||||
joint5:
|
||||
limit:
|
||||
lower: -2.8065
|
||||
upper: 2.8065
|
||||
velocity: 5.26
|
||||
effort: 12.0
|
||||
|
||||
joint6:
|
||||
limit:
|
||||
lower: 0.5445
|
||||
upper: 4.5169
|
||||
velocity: 4.18
|
||||
effort: 12.0
|
||||
|
||||
joint7:
|
||||
limit:
|
||||
lower: -3.0159
|
||||
upper: 3.0159
|
||||
velocity: 5.26
|
||||
effort: 12.0
|
||||
72
robots/fr3/kinematics.yaml
Normal file
72
robots/fr3/kinematics.yaml
Normal file
@@ -0,0 +1,72 @@
|
||||
joint1:
|
||||
kinematic:
|
||||
x: 0
|
||||
y: 0
|
||||
z: 0.333
|
||||
roll: 0
|
||||
pitch: 0
|
||||
yaw: 0
|
||||
|
||||
joint2:
|
||||
kinematic:
|
||||
x: 0
|
||||
y: 0
|
||||
z: 0
|
||||
roll: -1.570796326794897
|
||||
pitch: 0
|
||||
yaw: 0
|
||||
|
||||
joint3:
|
||||
kinematic:
|
||||
x: 0
|
||||
y: -0.316
|
||||
z: 0
|
||||
roll: 1.570796326794897
|
||||
pitch: 0
|
||||
yaw: 0
|
||||
|
||||
joint4:
|
||||
kinematic:
|
||||
x: 0.0825
|
||||
y: 0
|
||||
z: 0
|
||||
roll: 1.570796326794897
|
||||
pitch: 0
|
||||
yaw: 0
|
||||
|
||||
joint5:
|
||||
kinematic:
|
||||
x: -0.0825
|
||||
y: 0.384
|
||||
z: 0
|
||||
roll: -1.570796326794897
|
||||
pitch: 0
|
||||
yaw: 0
|
||||
|
||||
joint6:
|
||||
kinematic:
|
||||
x: 0
|
||||
y: 0
|
||||
z: 0
|
||||
roll: 1.570796326794897
|
||||
pitch: 0
|
||||
yaw: 0
|
||||
|
||||
joint7:
|
||||
kinematic:
|
||||
x: 0.088
|
||||
y: 0
|
||||
z: 0
|
||||
roll: 1.570796326794897
|
||||
pitch: 0
|
||||
yaw: 0
|
||||
|
||||
# Joint to tool origin
|
||||
joint8:
|
||||
kinematic:
|
||||
x: 0
|
||||
y: 0
|
||||
z: 0.107
|
||||
roll: 0
|
||||
pitch: 0
|
||||
yaw: 0
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user