initial forking commit

This commit is contained in:
2025-02-22 22:37:34 +09:00
commit ee5f8b145e
106 changed files with 13922 additions and 0 deletions

32
.docker/Dockerfile Normal file
View 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

View 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

View 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
View 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
View File

@@ -0,0 +1,3 @@
*.pyc
*.urdf
*.env

38
CHANGELOG.rst Normal file
View 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
View 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
View 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
View 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
View 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
View 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.

View 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>

View 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>

View 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

View 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>

View 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>

View 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>

View 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>

View 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>

View 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

View 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],
),
]
)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

25
package.xml Normal file
View 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>

View 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>

View 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>

View 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
View 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
View 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
View 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
View 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

View 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

View 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
View 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
View 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
View 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

View 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

View 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
View 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
View 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
View 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

View 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

View 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