From e5acbe3888f7bc844a782bc490e5e0a21da99524 Mon Sep 17 00:00:00 2001
From: Johannes Mey <johannes.mey@tu-dresden.de>
Date: Thu, 10 Mar 2022 19:30:57 +0100
Subject: [PATCH] ROS distribution compatibility update

---
 cmake/franka_descriptionConfig-version.cmake |  14 +
 cmake/franka_descriptionConfig.cmake         | 223 +++++++++++
 meshes/collision/hand.stl                    | Bin 0 -> 10084 bytes
 meshes/collision/link0.stl                   | Bin 0 -> 10084 bytes
 meshes/collision/link1.stl                   | Bin 0 -> 15084 bytes
 meshes/collision/link2.stl                   | Bin 0 -> 15084 bytes
 meshes/collision/link3.stl                   | Bin 0 -> 15084 bytes
 meshes/collision/link4.stl                   | Bin 0 -> 15084 bytes
 meshes/collision/link5.stl                   | Bin 0 -> 15084 bytes
 meshes/collision/link6.stl                   | Bin 0 -> 10084 bytes
 meshes/collision/link7.stl                   | Bin 0 -> 10084 bytes
 package.xml                                  |   2 +-
 robots/dual_panda_example.urdf.xacro         |   4 +-
 robots/hand.urdf.xacro                       |   2 +-
 robots/hand.xacro                            |  37 +-
 robots/panda_arm.urdf.xacro                  |  70 +++-
 robots/panda_arm_hand.urdf.xacro             |   7 -
 robots/panda_gazebo.xacro                    | 388 +++++++++++++++++++
 robots/utils.xacro                           | 115 ++++++
 19 files changed, 834 insertions(+), 28 deletions(-)
 create mode 100644 cmake/franka_descriptionConfig-version.cmake
 create mode 100644 cmake/franka_descriptionConfig.cmake
 create mode 100644 meshes/collision/hand.stl
 create mode 100644 meshes/collision/link0.stl
 create mode 100644 meshes/collision/link1.stl
 create mode 100644 meshes/collision/link2.stl
 create mode 100644 meshes/collision/link3.stl
 create mode 100644 meshes/collision/link4.stl
 create mode 100644 meshes/collision/link5.stl
 create mode 100644 meshes/collision/link6.stl
 create mode 100644 meshes/collision/link7.stl
 delete mode 100644 robots/panda_arm_hand.urdf.xacro
 create mode 100644 robots/panda_gazebo.xacro
 create mode 100644 robots/utils.xacro

diff --git a/cmake/franka_descriptionConfig-version.cmake b/cmake/franka_descriptionConfig-version.cmake
new file mode 100644
index 0000000..da8c5d1
--- /dev/null
+++ b/cmake/franka_descriptionConfig-version.cmake
@@ -0,0 +1,14 @@
+# generated from catkin/cmake/template/pkgConfig-version.cmake.in
+set(PACKAGE_VERSION "0.8.2")
+
+set(PACKAGE_VERSION_EXACT False)
+set(PACKAGE_VERSION_COMPATIBLE False)
+
+if("${PACKAGE_FIND_VERSION}" VERSION_EQUAL "${PACKAGE_VERSION}")
+  set(PACKAGE_VERSION_EXACT True)
+  set(PACKAGE_VERSION_COMPATIBLE True)
+endif()
+
+if("${PACKAGE_FIND_VERSION}" VERSION_LESS "${PACKAGE_VERSION}")
+  set(PACKAGE_VERSION_COMPATIBLE True)
+endif()
diff --git a/cmake/franka_descriptionConfig.cmake b/cmake/franka_descriptionConfig.cmake
new file mode 100644
index 0000000..e667279
--- /dev/null
+++ b/cmake/franka_descriptionConfig.cmake
@@ -0,0 +1,223 @@
+# generated from catkin/cmake/template/pkgConfig.cmake.in
+
+# append elements to a list and remove existing duplicates from the list
+# copied from catkin/cmake/list_append_deduplicate.cmake to keep pkgConfig
+# self contained
+macro(_list_append_deduplicate listname)
+  if(NOT "${ARGN}" STREQUAL "")
+    if(${listname})
+      list(REMOVE_ITEM ${listname} ${ARGN})
+    endif()
+    list(APPEND ${listname} ${ARGN})
+  endif()
+endmacro()
+
+# append elements to a list if they are not already in the list
+# copied from catkin/cmake/list_append_unique.cmake to keep pkgConfig
+# self contained
+macro(_list_append_unique listname)
+  foreach(_item ${ARGN})
+    list(FIND ${listname} ${_item} _index)
+    if(_index EQUAL -1)
+      list(APPEND ${listname} ${_item})
+    endif()
+  endforeach()
+endmacro()
+
+# pack a list of libraries with optional build configuration keywords
+# copied from catkin/cmake/catkin_libraries.cmake to keep pkgConfig
+# self contained
+macro(_pack_libraries_with_build_configuration VAR)
+  set(${VAR} "")
+  set(_argn ${ARGN})
+  list(LENGTH _argn _count)
+  set(_index 0)
+  while(${_index} LESS ${_count})
+    list(GET _argn ${_index} lib)
+    if("${lib}" MATCHES "^(debug|optimized|general)$")
+      math(EXPR _index "${_index} + 1")
+      if(${_index} EQUAL ${_count})
+        message(FATAL_ERROR "_pack_libraries_with_build_configuration() the list of libraries '${ARGN}' ends with '${lib}' which is a build configuration keyword and must be followed by a library")
+      endif()
+      list(GET _argn ${_index} library)
+      list(APPEND ${VAR} "${lib}${CATKIN_BUILD_CONFIGURATION_KEYWORD_SEPARATOR}${library}")
+    else()
+      list(APPEND ${VAR} "${lib}")
+    endif()
+    math(EXPR _index "${_index} + 1")
+  endwhile()
+endmacro()
+
+# unpack a list of libraries with optional build configuration keyword prefixes
+# copied from catkin/cmake/catkin_libraries.cmake to keep pkgConfig
+# self contained
+macro(_unpack_libraries_with_build_configuration VAR)
+  set(${VAR} "")
+  foreach(lib ${ARGN})
+    string(REGEX REPLACE "^(debug|optimized|general)${CATKIN_BUILD_CONFIGURATION_KEYWORD_SEPARATOR}(.+)$" "\\1;\\2" lib "${lib}")
+    list(APPEND ${VAR} "${lib}")
+  endforeach()
+endmacro()
+
+
+if(franka_description_CONFIG_INCLUDED)
+  return()
+endif()
+set(franka_description_CONFIG_INCLUDED TRUE)
+
+# set variables for source/devel/install prefixes
+if("FALSE" STREQUAL "TRUE")
+  set(franka_description_SOURCE_PREFIX /tmp/binarydeb/ros-noetic-franka-description-0.8.2)
+  set(franka_description_DEVEL_PREFIX /tmp/binarydeb/ros-noetic-franka-description-0.8.2/obj-x86_64-linux-gnu/devel)
+  set(franka_description_INSTALL_PREFIX "")
+  set(franka_description_PREFIX ${franka_description_DEVEL_PREFIX})
+else()
+  set(franka_description_SOURCE_PREFIX "")
+  set(franka_description_DEVEL_PREFIX "")
+  set(franka_description_INSTALL_PREFIX /opt/ros/noetic)
+  set(franka_description_PREFIX ${franka_description_INSTALL_PREFIX})
+endif()
+
+# warn when using a deprecated package
+if(NOT "" STREQUAL "")
+  set(_msg "WARNING: package 'franka_description' is deprecated")
+  # append custom deprecation text if available
+  if(NOT "" STREQUAL "TRUE")
+    set(_msg "${_msg} ()")
+  endif()
+  message("${_msg}")
+endif()
+
+# flag project as catkin-based to distinguish if a find_package()-ed project is a catkin project
+set(franka_description_FOUND_CATKIN_PROJECT TRUE)
+
+if(NOT " " STREQUAL " ")
+  set(franka_description_INCLUDE_DIRS "")
+  set(_include_dirs "")
+  if(NOT "https://github.com/frankaemika/franka_ros/issues " STREQUAL " ")
+    set(_report "Check the issue tracker 'https://github.com/frankaemika/franka_ros/issues' and consider creating a ticket if the problem has not been reported yet.")
+  elseif(NOT "http://wiki.ros.org/franka_description " STREQUAL " ")
+    set(_report "Check the website 'http://wiki.ros.org/franka_description' for information and consider reporting the problem.")
+  else()
+    set(_report "Report the problem to the maintainer 'Franka Emika GmbH <support@franka.de>' and request to fix the problem.")
+  endif()
+  foreach(idir ${_include_dirs})
+    if(IS_ABSOLUTE ${idir} AND IS_DIRECTORY ${idir})
+      set(include ${idir})
+    elseif("${idir} " STREQUAL "include ")
+      get_filename_component(include "${franka_description_DIR}/../../../include" ABSOLUTE)
+      if(NOT IS_DIRECTORY ${include})
+        message(FATAL_ERROR "Project 'franka_description' specifies '${idir}' as an include dir, which is not found.  It does not exist in '${include}'.  ${_report}")
+      endif()
+    else()
+      message(FATAL_ERROR "Project 'franka_description' specifies '${idir}' as an include dir, which is not found.  It does neither exist as an absolute directory nor in '\${prefix}/${idir}'.  ${_report}")
+    endif()
+    _list_append_unique(franka_description_INCLUDE_DIRS ${include})
+  endforeach()
+endif()
+
+set(libraries "")
+foreach(library ${libraries})
+  # keep build configuration keywords, target names and absolute libraries as-is
+  if("${library}" MATCHES "^(debug|optimized|general)$")
+    list(APPEND franka_description_LIBRARIES ${library})
+  elseif(${library} MATCHES "^-l")
+    list(APPEND franka_description_LIBRARIES ${library})
+  elseif(${library} MATCHES "^-")
+    # This is a linker flag/option (like -pthread)
+    # There's no standard variable for these, so create an interface library to hold it
+    if(NOT franka_description_NUM_DUMMY_TARGETS)
+      set(franka_description_NUM_DUMMY_TARGETS 0)
+    endif()
+    # Make sure the target name is unique
+    set(interface_target_name "catkin::franka_description::wrapped-linker-option${franka_description_NUM_DUMMY_TARGETS}")
+    while(TARGET "${interface_target_name}")
+      math(EXPR franka_description_NUM_DUMMY_TARGETS "${franka_description_NUM_DUMMY_TARGETS}+1")
+      set(interface_target_name "catkin::franka_description::wrapped-linker-option${franka_description_NUM_DUMMY_TARGETS}")
+    endwhile()
+    add_library("${interface_target_name}" INTERFACE IMPORTED)
+    if("${CMAKE_VERSION}" VERSION_LESS "3.13.0")
+      set_property(
+        TARGET
+        "${interface_target_name}"
+        APPEND PROPERTY
+        INTERFACE_LINK_LIBRARIES "${library}")
+    else()
+      target_link_options("${interface_target_name}" INTERFACE "${library}")
+    endif()
+    list(APPEND franka_description_LIBRARIES "${interface_target_name}")
+  elseif(TARGET ${library})
+    list(APPEND franka_description_LIBRARIES ${library})
+  elseif(IS_ABSOLUTE ${library})
+    list(APPEND franka_description_LIBRARIES ${library})
+  else()
+    set(lib_path "")
+    set(lib "${library}-NOTFOUND")
+    # since the path where the library is found is returned we have to iterate over the paths manually
+    foreach(path /opt/ros/noetic/lib;/opt/ros/noetic/lib)
+      find_library(lib ${library}
+        PATHS ${path}
+        NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)
+      if(lib)
+        set(lib_path ${path})
+        break()
+      endif()
+    endforeach()
+    if(lib)
+      _list_append_unique(franka_description_LIBRARY_DIRS ${lib_path})
+      list(APPEND franka_description_LIBRARIES ${lib})
+    else()
+      # as a fall back for non-catkin libraries try to search globally
+      find_library(lib ${library})
+      if(NOT lib)
+        message(FATAL_ERROR "Project '${PROJECT_NAME}' tried to find library '${library}'.  The library is neither a target nor built/installed properly.  Did you compile project 'franka_description'?  Did you find_package() it before the subdirectory containing its code is included?")
+      endif()
+      list(APPEND franka_description_LIBRARIES ${lib})
+    endif()
+  endif()
+endforeach()
+
+set(franka_description_EXPORTED_TARGETS "")
+# create dummy targets for exported code generation targets to make life of users easier
+foreach(t ${franka_description_EXPORTED_TARGETS})
+  if(NOT TARGET ${t})
+    add_custom_target(${t})
+  endif()
+endforeach()
+
+set(depends "xacro")
+foreach(depend ${depends})
+  string(REPLACE " " ";" depend_list ${depend})
+  # the package name of the dependency must be kept in a unique variable so that it is not overwritten in recursive calls
+  list(GET depend_list 0 franka_description_dep)
+  list(LENGTH depend_list count)
+  if(${count} EQUAL 1)
+    # simple dependencies must only be find_package()-ed once
+    if(NOT ${franka_description_dep}_FOUND)
+      find_package(${franka_description_dep} REQUIRED NO_MODULE)
+    endif()
+  else()
+    # dependencies with components must be find_package()-ed again
+    list(REMOVE_AT depend_list 0)
+    find_package(${franka_description_dep} REQUIRED NO_MODULE ${depend_list})
+  endif()
+  _list_append_unique(franka_description_INCLUDE_DIRS ${${franka_description_dep}_INCLUDE_DIRS})
+
+  # merge build configuration keywords with library names to correctly deduplicate
+  _pack_libraries_with_build_configuration(franka_description_LIBRARIES ${franka_description_LIBRARIES})
+  _pack_libraries_with_build_configuration(_libraries ${${franka_description_dep}_LIBRARIES})
+  _list_append_deduplicate(franka_description_LIBRARIES ${_libraries})
+  # undo build configuration keyword merging after deduplication
+  _unpack_libraries_with_build_configuration(franka_description_LIBRARIES ${franka_description_LIBRARIES})
+
+  _list_append_unique(franka_description_LIBRARY_DIRS ${${franka_description_dep}_LIBRARY_DIRS})
+  _list_append_deduplicate(franka_description_EXPORTED_TARGETS ${${franka_description_dep}_EXPORTED_TARGETS})
+endforeach()
+
+set(pkg_cfg_extras "")
+foreach(extra ${pkg_cfg_extras})
+  if(NOT IS_ABSOLUTE ${extra})
+    set(extra ${franka_description_DIR}/${extra})
+  endif()
+  include(${extra})
+endforeach()
diff --git a/meshes/collision/hand.stl b/meshes/collision/hand.stl
new file mode 100644
index 0000000000000000000000000000000000000000..4e820902eba7b9d959a2e0cc8091f4b0f09ed77a
GIT binary patch
literal 10084
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
U+F!%sW1pYtic$|E+lLy101nd0&;S4c

literal 0
HcmV?d00001

diff --git a/meshes/collision/link0.stl b/meshes/collision/link0.stl
new file mode 100644
index 0000000000000000000000000000000000000000..def070c7077c0ddb33bbe16cd6c75f19dd318734
GIT binary patch
literal 10084
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

literal 0
HcmV?d00001

diff --git a/meshes/collision/link1.stl b/meshes/collision/link1.stl
new file mode 100644
index 0000000000000000000000000000000000000000..426bcf2d7a04e067e01ab198d0ccfef63c6846e8
GIT binary patch
literal 15084
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
bbd0Ja;d|?j1+II*K1Y^8PFKhw!oUCkCXsBE

literal 0
HcmV?d00001

diff --git a/meshes/collision/link2.stl b/meshes/collision/link2.stl
new file mode 100644
index 0000000000000000000000000000000000000000..b369f1599a3c1356611716621f998bd8b5a8863b
GIT binary patch
literal 15084
zcmZ>*D9A4=Nlj5mE6UGRaLP%|OGz!#HPSP;RM03cO;Rw>WFQIXFfuUA{$FoD(J{#?
zVNvw%7YPZr9L4-LGR9_BkIWNoS9HC$$`dZLO=n58UBAL@-}W1ecQY`|Y_79^-+kMb
zak8ilvW|;;Vr_Tqk+PY(qQMqfHv_{9MGpIA#~kh2f`a!Si2G;LE6uoXYP{9nz@JXG
z!pol8=p->%A)Ca&p#D7H-g^EfJLNpNJ;<s&&iLB$?%!!6+uUf2sv|1srJbN#nBDQ3
zSQI;UY+GyNy?}AwCD{NJ`xqFcr+M37|GCcg*K*1IRr8c>FMa#BcUpw>USxCSeBEqQ
z3;yg~5qWbD0|P@z`u^qh8+P{}ytS{gIb`pH<!<{dHcZ>I@V3uhdz+to)%y1BiPp5=
z`*6A2zFoW@_b@PAJ88UslC_!r7nRq$Glfj{o=xDeeH6!FB_J%ack?tY+XTKA+jUjU
zd+!BW*jn4LS}`zWSkKtEqGIR1d8$eFHcKn_^jz=R^G}q)Zo`s8dp<08+xL5(w{4HV
zE|~3iI@Xqf;iUV9eb+s=?%O;w&i?+q3wyS1Xxa04%MV**9mpmzFu2WNw4YSDVqdtB
zk9||qZ<{L@n)h_A{bc*&(I%Tu%iZ?9nd5I;6C-Z>ak<;Rt6mzm3=Dz^hwRo|$+4ee
zxoY>k>&-SAauK#yVw-Ird%UvAT;yoW_?yY9$U4qO<VBS2zi1{a1_rU4m+j{AW!kg*
znpq>OLe^dD_S)w9EC<_H%Uf(27>=Bmw5#%(U>7x`Xn&+enl;Z1hJ9~OC+tPmExO3s
z=8ih!K6n3^y$lTgH$K|lR-J5T5mJnz1KB0Wx)~UD?`_$q?bB}e^nC7q<Zy3wPTtd0
z#JKNvRn%VOcw%4(m0f6eiL=4(XGYe3<g}E)r(m1#K+bk&0+SVT3T0rZQJ-eFR;$S_
z`(5^aWcMQLKsJeip_n((E{DI{?%v&e6dlNJN7l{2aCTOy{gZ?VcE)G!TO;QQ<UEL+
zju{xTf5_XnvdP$)vbvz;4`fxyxqyKo>sjo6mjwHL^;_Q9`Fu0pd)Uo!Ph8bK+lWZp
zy`Ay-ySHcGvAwX=eeaRwZu_Qgy<)?_u&%#w|H9W-Y+n6avCno&!d{N5OV;0XrLB<j
z$IVw!d#645xOe`x@I4F+2e;Pm?@QvhI{3nA@8lPWdy7`N?X%QeZjG$_bU^&xm&@Ju
zeN<rE!@%%rr~Lkz$K~zLu)FM^dr)ZauG0+r%!9S}BI|gwFmUhZ^c6M>4uVo5$3}&H
zulM)c^`sV|#Cgc+gx&X#G3+~dG+{4t{4+3END1xJG@WQS<zUhNE4wG{Sy>-ytE<6c
zg{%WP^)N70?|r)O#nBY|4+p>RMv*CAzbC&bz}CX5#TMBl28NA2P5Tr(%k4#7Ct7ct
z_HTEtL%glE6q+g|-3$yo#-9877_03=S=aAI)*)xDxI05H$@ZxZqZO(hk@w5@|M*#N
z7yU`VeAVT^y;6^s*?2ZL*dm7ya=0-tNKLM_ck`TX{jrN@A9AU0v@gnbx%}t7%X?$@
zAg34xhF8Jjw#Fw@_7y}{+CO7;wYtakdAEiRi`}n?l-<|)JNKBVG1)C~J8NB-J9STE
z7NZ>lgVqB%n}jC^_T7@twMSO<q;R`6sKmMbFu@j8$IBXny$4?$+~>0<2So>RIf$&A
zfk8b{$iC^xynVr0PWG05(zcnog?oOje_@MU+M$+k>(jIByAMh1`zN>GPH~d0ZP`+n
z-H+t&*j8?Jwtc$XZJ(>iLz`>2qHH-=xb3s#jkjT7m>`~EKWCT1zLVW2P;@A4GqYV{
z>#!&GDXMM;h8@og?WJ~g?|bX7h2kn?mmuqAVEFqsVBZUa^|pVOSK8-JQQ2dlJ#p9d
zbIf)zOCIhv-|^Ra`UYk@t(3AoPmfsHq|60{?hQxg{YU05+qWy(+a9?FK&}~{tBUP)
zG_Ks!yYH1P1A|f?n{9dQG&_}vB`BpRa=Jn;Q5hIQ`(o^Wd}g%w-t!!#^g%8M&#gAI
zJtD$l%fs7j%fP^Rvc_KdaE9%Rk79PnZ3E=;%0@QCcIC>eR+;?EZ5bGB%Zlx9eeJP3
z_MYDkSru|=C*9>`EAHH9^ZD{ZTLuQsm!Ir5e~hyZj!Hx+sgYY8PmVvgxxd_PpL(a`
zUIqq67H4~@DJ{DXUROnF0i><Aw*9i)ZQq?qzxJGcC}I0;x!b;JhH85m7}PU;?b*`i
zSTi4&*pJ*cK-Pg;ifZ3hwcnjS&H5RG^L}KrkX?nUL$SYVfBTt|y-5!}?2yaaT8WUo
zvTp>eABHZsMJ_8D7;XvG?tk)CX>ZLd5j$j6)88lTtv@y0I#{v_O-I3<^8L)`4R=ox
zY}kifA|tnIP|IC;NB#YZF}?d<Zq~6!t_}PHB=>@Ht=mL3Thw&5!MkYxwW-F|WiCrm
z>_Dy!knLk&xRhSI-}l5!>x3}DeaN;Wmr=;BWnj4dzkdH2<qK8}>$dGe_ARmw)Uev%
zCAi-<-_VYq&u_opfk%5T*)r~9vUlE#T$do1j|>dcB<%M;c&lnJuP<eX+-?&zwA}mX
z0)y>>uZ^}>bd~lNPvfwi<+jR}f#Kk#qP^{FrrIrwDA|u(XCRl($hnJwA$0-Ao|k8*
z+HF3GssmXSa+`>O;bC<DzAtHo_N9IncCivXdo1b$Y?nB!wPir6GtNsc+S8uvWZUMq
z&X$3}BCc=W&yE87vTPp|9muLo;zIZEwVB&8xZJj7V0eCtZNG|kn0?o6DZ5Wo&+U10
z#N2jHAF3V5A;Q40nuBM5t4xr+-hK^~uwwLJ*!ym;x-H}X)wU=mF_f5a>_4<O!oKpN
zo(;0wk!w*@JO0dmXuB}K&OUtB-Q7D%W3B)BC)#rSY_>%%qmaXmfnkZPkzJQWjeVL`
zt~Ig_<hCfXZUzSN-IexQ&P#Vs*G}BGhB3tU_j0#={b_UdAlHM)^&<nr!f(0u(k*{&
zIA!<jL#`o_bs(1*3=BCY`F6P{_v~{BPP4zsKgT9sxp$AqiodqVH5qb?oPlAURjA!t
zhQ0d^+)GE%fm~Z6>t<lE@42}5R=?^#eb;LHr8(()y1vWoF|lAmshyE)Z3c#ui_h5o
z$?)8lZ<K0((C3Sd+b7;V9V@@vMp+)U@p#_4``FKaw#cq!VDMMGZnyW;x_vUX;V8Wc
zWL2pC*mm2|UeUR6Ux=}kJ#u}ATn{4Gy9^8p!u9q~gYNDT{jkIqxfVu_1LS&zfkE<L
zjlIudy}du(P-`6IS_au91_s|-fqPks8TPK|thYaC++;2OlHKa=3>G`&dKWdU0$T6v
zUAcpKpKp8(O6`ms(x^Iqsub_Pdh*%cm8DZr%68;33bjrB%&2LfcT1D)J??UQX^GW)
zxKlsvync-V#Z{;+0KMg``%B&~-N*CY(;m5WMs5wDmel`E-tIL^Q`^16t!}^8jF3Hd
zm%Hs-Ss%R@x$JUtGu{Cz=ULY#?qy(5Ypk;Wy1i_#^d(P}whwZMB8M~sgV8(>dl6Q7
z`(;<!cO&;@klP8!?FR;iy%x6iGC4Z-T*sDMBdbEz{jXTm_HB)Zt+RfcEd#@Ec}4rZ
z@7(O=_Bf;1f!vQm)$y^<Wq<2|+I>&##ZhWC<TyYMLk0$}#YX#o{bjHVY&O}CT+1NW
zA7A4Q_NL7EyH|A@&t3+G|2g*id4Fo!+qF%%M($f8*B_`Q+>C0Ay&HDd+wThhjM6ti
zF1t`mxHp&b?5mj0TK7inKq;?~OC02qh=E~d2cO-i11D`I9BS+pcMIFdUGTSYozG+!
zuc>X#oz7$9`GeUGITtW6yb~AN*BrTT-+{|nD6Mehu?6H7IRis0=W*K)pIrCNe_v_8
z!^g?SN0VdE+uKZb$aw;}>|$WJGEZ)wV_E4wgQ!vzJCJh}vV9B;=Pu8)6F3}cXJV3T
zFV>rA)6lcrX4}qxwwnSc*cf<pTW`O~Xt&?)s*TQPIh$2+zik;9LYLjNGh1A^uW(B|
zN-2umH$X1=7#M`~&Fm$gncHw&Hnu;bW@DRt?v8a>+Z|i!?+UhIo`-h--ulW`5vk9>
zz_7B>#QxLsDK@hzOi^^0vy0l6Uk$Tn)%t*<n}LBf_tCyr6%}^U+_Cn$F&Fn7bYQX(
zEBa&0D12zog|H1aAEte??FwMod#<t3rtZcETLy-RzSe!B`2l<7PM4vS?a1X7a*4sf
zu;;1HzEk(w?XEBu+yAQW+g+p7W3%Kfqum0poITmDi*4>r{AY_=mON~pWH-$&)GjVB
zA0?F_hc0rcGcZJSuh`esf6?}tUja&ag={Xe{}>p2wifRSJ`rHO^nX1{YYDl%gIfC3
zF;&?cFa2rb#1LhNT*@HF4QhN?9ILc{AGXeR`!zol9rDudwmczfHdgZcZIN{|FlcB=
z*#BLXu>1L4UzG6@<TgBNZ^9%i+5S@d+1*^CulFJM2axk1a$ACdq1x4RzlorSZRBQI
z`_o0Xd-upawf?r?7Rm^Vf~Nl7D+e}MH!wc2Wnh>gU9~@nugd23{YaFSK5{<+*(3%A
zi-o)Q&EYSwt8Yx(k37nO-1bE-l^7UIW}n>`8IoZ)UnLo(g^b)PM%6J*?5O$w|MmMH
z?8)1K?8A%lxA(BGaNGCewCi5vdWC_(eZIH_14F}pRi>HSkwX+Y+>lLTV7Q_qyA`D4
zi2F%XWEtcV2f2o0VE9z-Z3c4H*PBXa$Sn)xwg|FG3=B4BHNmbDkaa-uhp|<&&Aa7p
z`|4&!>_v_9t9<8nfL!&~ZrWC4vykgS)Rs)=%RgH{I?PP1%#d{;y9%`pw=<~)?DISe
z2^1a3s*pp0fk8CoojJ&kYFim|WIK>uf*c|Y45$CE*bdU6XZHm~2Xd^T=D{Dilfgb`
z|8H!8YzK1qAjd2N!?ElhGmssI*W0!un}r;@$R;r`SVeU0`u@Lue|n!QiXF(UKID*Q
zV7OVFyT6Eih1~%Tb35t9L3_Q+BW+})X4-a5x7%xeevgen^a@+#kuU}Z{yz!(1>L{c
zO@HHRg<K;er*>2wVteBDzfJmM7rn+}H?k^Z-KhEF_{O09Da$zR@0D8HA-e>**NCi}
zf#Hfp)c&nDpX@XrB-?2>Nbap$_Ryy6!fh0Pc$n$!&DuQGW<&EGTLy;Ho$>oQKD@Q#
zixoq$1KC_uf7G=d+IQ}4n055ooc+i-6}e<UE-@Gw99G=h_xy08y?VA4N`DZ!2Z`K=
zV_?{RmTUjt<NxeF2I<-(`@^B>)*eAVR@=)G&ulNc{onKBF^{d$ZBU<6tg&I=&ae{u
z+m@<!$Yvq;agj$q85ovGH0<3yquT!CJ43sxB8=8Ib_CkWcW<;sR)wsafq^}yc>kl*
zMRw{uzIHCPCVO*PYHg0D-L^$eF{q{JpXiGHev@PDxJ91WB9Aj5>p%_ND!0o0osyY$
z-e1>QBkMp`h1`B*U~u@DVEg1rr`>ktGL+gGxkdJ=W|3vr>H{`E7XG(oU|5`f%eHCe
zp}pJ*wJ2k+$ZajuHeB^VT|4D%>ugQJtL>5NaO4&sst(J@b9Ou1i)~d-XQJpp?hm52
zul_f(*)v^XwG*}uw?~#iZu{iVWw*U}Cc)-4`$t;_hNb@V?9>G`_C=k|M`@8E+kxyS
z28QV@2KK(<_WSCV7~3Pa!jQ*$k$aX53=2*b>}9aww%w6|+Pgy@NkwisF))1X;M<$&
z)o(k?990K$d?4#)U|65UzW=~Fal4hTLhWmKf9&zRBy7Di`G+lXdk3`*XLgrq|7k;6
zyWE-x`w3nmd*>~CZ+%_oy)CkCR2}P@h4$S@kG1<|S8k7NJ92vtxvj;(kURgX?e>F9
z>>6Jb*dwPO<Tyud!wJbguvy5~VHdr*%pTdd$U2ZsVqoxAW860><EWkU-%J!ckXx3>
zE@WWXapA~5)$fw~*63uSv=h%~GwgkRS!fT-p|7^ct$qfE4<EVh@-8;*o;0HtWt<wh
z{y?r*7#Oau<hHxm*s_~zcI|#-Rmd$%<QX~!23{S}eRrH5Se<mKMQMv7*Mq2KV%@5+
z{Uz<awy{xM`;q&7$fKO7`TUr*#r|uYvDVx68KTT!*{I0u1&uSMeo@+sY!U-Qf=#MD
z1J?z+(?(Wy$m8E9<`~-^b30<gCcVcNbu3&?$<BUxteX8XA5}Z#9&gA>W!tC>R@<dA
zYiyDG)C>$ACra%zQ&Q|~&gr0xw<DX2+*)Q}&=;+;FK7Q}d(zd&4p|1dMUFgj&%mHs
zebw%eT*vN<>oWEuw-b=#26bk%V(wHsGoeS;cP^Ho#2|94q3T!|;ke(!Sldq4R>>Z@
zY)3B7QQOoXmsadgIwEeTJJZe%Sru~Gjy$T)z%Zk`0o+>Jp~+{4JWh=qgUB^11A}Jb
zac~<>?VBh{`wCe%st%XeN5So@Yd-orkX0eCFF>}Bfua9eFIdOi_lhVwkjL1Obu%#V
z+)S{Z{l9+y%K5^(knKPo{Xia>VqiGE|2o(Xxk-E$$U2b6NRV|iFx)lC0k`@#Sk2gm
z+&)Lvfou{3Lu0(oHc&eew3G!|2DxpBY!U;*{4mM=Dc!ZZqyPErM-CI@F&Wg*-8Cn7
z|J(12?M!5yP+CjKagLmN7#O6!?%ro*l5U^*H`xw(lpMM3v$JT@o{m;M+jok0Z5bG@
z%yr+#^~==$1cR=9!m)k3{o)L4b37i~BI`!gp?b`FpXV(D`>v0M_HN=bdoD^z*-p`U
zV~eaCRmV2{P5Z=*Wb7l&%<PfdRQJ1j_FV5_v1PpR-WF9yiRk)$l||C_ku%LvbResW
z3_G!B;z>o@W=T-XQuUU~{v~M#?3`w4p|s(U+n;@h<@VYbbl7k|dI}ncQ&!l2aLXaP
zFDZKVcB#yJudKLaW6Sr#7P$q8s$&NC@qI78eX@J5?PZTV;(_cBWdAWR2n*faci{00
zJG)eO6n`Mwhino9!?tkl{hp86?3<+3QFI`?3RyP;!!)g+{SHq#>?eKqL1~2}x7(51
z^9&3J9gX(-n$_6v+^=be-2Oyvmm-hiF)%b~RqbDSk<(6HOv4VjorqlGAg4+OhK%6$
zeZLng+MiosWse+d$YF(?dKegz&&b+kAADgKIVHh<wsE)3)8f}QGmd<*U2xmS`a>G4
z?fs2kZBbhQ%*(m=31)lRr%Fkoq+MAh)7`8)ZEY)m-bP8s3=IFaa@(oTth85IWNc?L
z+1lnOpReuQ^!2vLzC{iN1_rkRW4j+4E9@t%QAW{$JS&5&n}K1)&Hlar3M=g=Z;P@+
zb_ue%s4abAQ5E~&j;HNp^)&2veA2c3ylAG)nd&>X2G>MwTdH2#u<GBjo%o2`R$F?9
zjcxr4TLy-<lAm__wRLT+eBx1BugGmt<d!T0!{Qymb|Nti`_!b1P)0eCM>dh?LKqnC
zy%Vxu$zZXsrp*Us#ss<birlJYV0bJfYQK7t)4u#DFO>E!@;D{(_$32_PK5COE4*v$
zif-B2Bex)tQ#fiKJmj=`U)=3>JMX%5d*pT-axOw`SssZn*&kT9a?h?gruN8nD)MO5
zt2D{I>Jh%XFZ#T*Wnj4VSbD$k-ypkIaTk>KF0u<zUFD`}u~+-Ki(UEGDwOsva=R3@
zW%+1+=3d(-Rr`d4PAF*?IZs@A>|lN3zN&4L*h^amhDYbE_7<&?u@{o}vPYId)`6T?
z7#M24^z40q^QYa*19A3=Mvi+9iodog*!kTSxmAp+<C7obzUc>!+IhT0Z6PD;Mh<lb
zhPXQ{`yZIK?mJfyV2|7?MxMJtUe&?CV3_B+|KY0HyJvh=LTQU4*NLbtfRJes`&|{z
zTdykTK+%D$3b`fAz~DYt%KkowkNxR0jMm8O_mEqe$nz}>3<9Du`;SkT-nU=P9mOBW
zDFfM03=9hLqWgPyaPNu}4M1rjBacj=*5`|EaqmAh)!+WY?Jzs!xn|^=40Ya__vhVx
z70cu83pA7Lkn3<{Rmi#-7}_)M><j!6Z@<(z8AS)Os+}k;fZ9{y`_;_d?C;km*&&Z|
zAnQPOEd#^1bvpagip=a+X}Y5L19^T3x%OdTSoq&#-%eqE`%VWxlr{r$ZGfD{7#QT*
zd+lBx3EHc=rWB<|kKDsXF6|f?+IT(fgg%AsS^TdGMF;Xo0kUoehClz??Q~{|*xT~D
z+Iva5+H}oSv`yLl+!nd^NzPhsvngM~_Lm)~%}^?9W%pc9!2W!cABqm-T!gHffg#e1
z-7fW$nZ3YGeft_Kej7(IYuo2XZrdW~U}U=)7!Lg7vrFzOw~x$@LaA|(>knj;7#L=+
z`e)b8x7=>(abNqy=*Kpfw9nfl8^5zvTzJgJYxW$QrN_S8qK;)4eEDOyID460W4@m~
zvJ7%9gKQE5!@0@t?6{}a*k!gyqSQFZx{>W;VED(s+)hI~&u&6b7RsC#@@NaHj_C!;
z_E*-gvh$o_h*A$CyUH<E(Y8sw!RA&dC_WBmTHEueJ=v?vtz(Zomx5d`p^mUb-w?2W
zwyt3Bk?tUrItsbAM6RzG7{0Tx*za^+wP%e>G|E~7WF4p}v5O;NzmND`yH7LX?U37_
z$gMEccKh-c)&23iZESzPcS5P7kV_xrkrxIA_41wjZaA0Py`PzeG82bf_aWDb3=Asb
zbM`SzcxWf28G+JzMb3A~`H_Kv_1(t3Yi)V#A2Wrb)E~&H9l7>lV7Se5be~HJ+rHxu
zGEr7}Bae|F*Afg2$Bj4cQ&sfccV}@HiVo!YQ)Jx?3_njZ*sDZ^+qYftvb%kKu?<tX
zy=_~;7TZ_BS8X=c%h~Q=y={wJ<})xbo(r;1n!;&+)yK*Xd29iBWCC@ZLGf&q{qd0B
zb}qklP{uNlRUzwUVDNL&-apS(V&9oOD|_U60yzeeSEMm8R4+2xujO}tZ;p+rJ+dm~
zb_uGEuq)g5Ewx>{OY&VF%2+t^SP$|T5Cg;8s`vZ0woBSiFjKQfF3*w6dDI@u??RpZ
z1@}ztW3~j?A(!FEI#6qaM{CUY?-bLte>pJ;MF(<^1z9%(L$=iWU3^Bi_WdO~C@mS}
z)^Y+;UzCC2ys6~AV(BvbpG$L4+SJJHXyhI%14Exlsh!LOEBjg2D)ym53vHek=-8I;
zy={wJa-x>Iv0VLjJx2QWLRmT}I*?VN)&_TlKiJ8;Mcd!oA7h7X2Xab8PN578OOr$F
z3yc`;Uze2FA-D9A(-Ly4pMl}J{sKF3V}AR6jV|^|9A|9$Y8Y%!+P<<yb_r^YbLph7
zeVjX={XO<bl+=!FF0y?L47<|V?a#Y>w`*EvgklGBxr?lufk9bCWB+8iIJ=IA7AWNv
za%qQJ!j;~dvhTvZD|Xjs$DouY$Ym62%QA76=>8%RG25AK{wS?*<h)XYG=9y%VEu<{
zzrtygy_p-rP}*?Fs*rUvFdPnix=&BOc<=ti6qK=W<T46%bwc6AoBOidWNob~(oxD?
zWIIrGD6z8G^<KVj=WsU}Wz<;=X&nf1iORrW=$&hS{nb1>rMKaB$RnG`DF%5glYyar
zWxBoDs{M9{oc!&O;}%&5vPldK0(P#pZGBGmE^k%sk@FpLy97C}FfhdSrP<oBRoHj^
zEJK;WLe`C{L;rrB{b8XlJI$rVD5)KJ4Fjq_c&4-1pP%}{Zq{Ejl$H!~N<_{D3=AD=
zE9^7_57~Xqjzt+YKn`8hR>s=fmi9ZD)a~zYkF!hq%4oYRiQ9Hg>TQ(XHgYY&z_8lg
z!d~chsGVZDCdxV)<j_TJmwdL6u)ln9lAVT^gFUhgvOkbpP7Dm2{+jPUzRS-pCqxS+
zM<Mq!k#iRV!^T4z`*WL&?H(Cg+as$&?&G4i8IJt?vrq8&Ry$WMZ<O9PavntPc{4D)
zm1MGGF_y8HF!n%c?;@uX)U>N8DQACuqm%viU|*CmedIC`In)^#l(&f33lw<SSFUkI
z(ScltBkN{haM*L!F6vmCz2qqsJLGW~<gyl7Hv@zB3^w~SE==|;4SM#-wj-w{)Do`l
z`f<C{^;-5#yOmIC1LSfS)m2La=GocZ&a>YZXM@r%L3SbXm=gm-qs44HlT$hNT-&qk
zkaG@lU4rZ<1_npYBX*bVAK1OH2tY~g$Zd6GKQS;!Ngc8~$bQ-Gqj(644&*$6teb&h
zNv58Cf3k_a9IH1<{y@$X|4>#m{+q31Z+cI}PA}Th9=TPFoX?SS0Rux+sFM9AUmd&Y
zCXOgNkX51PkJr(6?f!0(wpY#3vPX^sWZ$C3hf>QsyA|)m?U%D?pww!}@sFybHD<cq
V`n9?C{K;u3F^C*%$nnI$000yr1~mWx

literal 0
HcmV?d00001

diff --git a/meshes/collision/link3.stl b/meshes/collision/link3.stl
new file mode 100644
index 0000000000000000000000000000000000000000..25162eeedf286d1e27fdd4ba38950ae90678bb0f
GIT binary patch
literal 15084
zcmZ>*D9A4=Nlj5mE6UGRaLP%|OGz!#HPSP;RM03cO;Rw>WFQIXFfuTN<vZFRmz%op
zgOS*N@nyEQi@m<@sXX_6uhqu{+as|Idmf$rzW0kai(O2&x7CtqpY|{?q^fGzi-}m+
z&#%tdcX`5pTeZKtY`qy5?@5b)Wt(yPoUK~#oIU>>nC-6B@3WnEa>i~3hOHU1_g=G4
zv;UELXW!yk9eX+@B5W<rf8VQla=xwo%X7AUcg6M|KOk-MMm5ov<J|YX3=9hIkJ+*n
zgxUX?$+;g{23dy;$0^(Qf6v*PN3ic@V6fU%VSg&t)=tn`e4lw3huwmlcH6W0nR{9t
zS?#!HZnRzP#J)!~o6GM1$u?W(*-LjZFigBBZ<mr*u)poh96N@>r?!7PWv!0++S``h
zx@c?mP1uU-Vvy~Z=4IBVKg{=vbIR^zV0cvOWAn!>egEe5x9!qq9ouctYq<Bc5#L^9
zRp*0N*q%5iVzupcqAdf%={bzH7nW!2zw_^k9kMD_r#-ea%@nK{-Q#UhbtwFkuorjI
zu@5r8zpvZlrLA1eZrj=XynB&D7dg}!7(TNJ?Js$`e4pKM2m3ec0&RO9rdw^cu(IXa
z!MFDiN6MZ#_Sg0_dVSyHHh1ry8E&`sFffFef7$mtg=N3pTT^>vnNo|Fdt}`|?NQYD
zz6aSP28IQ@p6}zH$-93EpRs+8+0H%QrCfV&R)0oOg{+%_L5nSS|N6Q6?bbJk*ydY$
z@AVKmW%K{k_r0qN0{1=>=&+e>xnu8^oi2NAjjq_Z2wd39z>sa`y?@a%X?y1tS$mLm
zG;UDZE8{P1`(5nzUWXUrds#U&Y`JcLQi+yvmHjd$3EPf@P?R{oeTT>H7qhgLb=0ce
zq840s?tKzg8fSX<Ffhn%*=6^BzK5L+XQq9}+hewm&$QdF-0Wv-#B$5_Qe2y@5}SkV
zjO44f>^vK7V`2<#85peWc<i%$%x$ahgxbs2zO{|>=&(KSu7;umIrT6woZ?BeZ}h!n
zS2C-7A9CtLjy2T$(b%)lE|O8#{&Kt4e%TxRwx-$!wv6Y#qvQ$Xw7|fSVRdEixpR5;
z6{|PwYZaPl>%I8Ct<&VhJweGUY!`dqu}u$Iz6Uw4Ffi;9;kFl9e%0<_ofV25$mY5P
z_}FURIb?GioCg=3nYTyub^ZQj+gfboX8g5U9v8n?WyyuT`io!gwtOAGm-Wo|y|3Qw
zw!Z%%Veiwkp!j&OD8oLYJK2uq$rhCOuux{Tn|Q6&_I2m3J;<TJz;N>U8C#X;-2EqS
z?65=56Ucc5IX^Nm{1)`ITQ63$pL25yO0GrL@%i32+cW0;Ru6?$Y#A8V2u0i53W(Xt
z$+6gfk72TV@{7glsVIxBP#?RUaHG7{2HV3nRreX}R{v|WUH<H=4FdzmrCNJ+eka@c
zsXuIy%Z%Cr4!hdP?Y6sCW!vn~;jx>yoX_f^pSleL!-A7c_GhJB?ez~GwmUZcmF;i2
z1Gb$@nQbG@e%ns|x8IhlX1&etd$(*OZlANAx!{Qn1A|kNoBcBt5!=j8#r?7p|7~MW
zw%KM!GoqBW5trj^IX?*5%mK$oW1yS;s=bG7+KwphN0vb@osmmz28Oar(e_`nQtjFp
z-|Rz<11q*4wtv{x*$Sk6L5mNyy;k<|$FAGCzvJAGtO_}mpvGW%VXs~Fg`)l6kIC5~
zhbVGLo9{HU;n)?hH}}!3y$lSoLbm%I=AX2?FUDhEB&=y$=(63Gv3s{o%5|l^UqV*f
zNQp}9Ws#BFoBGbzX15`z#`zm&vA;84)xIya(GFRM<Ua>n`Kjk@Q+H_D#GDh`JLl6q
zo7IJ?dl?vB^S9X@PAjvMcFDI#&d(;Nci66E+iUyN%-R+?|1&VG{(07pEy&J(^)U{6
z<QPPbHO{<iw%q0WZRM{i+cGdLI>=|Qkha+FyOxVRvJA3)oonCPt}5SP%UZ{0%fOJn
zS;+qJx!rdAW?Q4^KvsopHv@yEX{G(Fm`pp*gDdu=x3Jo+yT8$PPU>1~<Wz}V#xO8=
zpQyCoA82Ryvf!;PvJT|5i>#Z0;mqb%JI+bj_WS&&?nACq`{(Sny)^Hxt$9}yO5M)D
zkes1yzeQhhf6kth`;glV$SIMBf!#L$km=rbaN1>0dTST=Cvktm#@Tz3OXua0vurLY
zgzRm&_<b*`4u`0pc4BOC`}f&jM$v(+3bkynyOeK#oJY@A>dZ!z(g#@;axP$Cn4F$v
zukD^~XZ&~tN=c2}en3s_9|WG*>8ud4)nG}rM=te|>kriOidEIxUR>VNc9*xFJ#x8(
zT;d?tD+~-9W%KPk%!~Jn{|-iJGa%<EWRn;ec<XiSpY=4@ML##(k6eZ$=UU|4%)oF{
z#mIi4f27^E#ri1u9JyRUHi?0O>5{4af^a9heO<aJ<rT6HR6BM|xntLT-^t!c>jz4@
zLT<?*yO4pQN4sOMy<Po&<3qBx$TiMF0ggRt5;1#c7M((=eHa)di>K}@-CDBWe+}#2
zIF?y^nAC&!+Wo$>_d)rkJu5eR>}5aq9ZkoB>ut85cGc_;>Jzc^Y^&RCTj9M|hP!Mp
zav627`<->kX6L<1??U%7Fl<v^VE24-;eKwnySB)sK5}V?teb(MY1V%04_&qU*JkqC
z&EDO<J4+~HZ@R&Xy~iI;v+n*Ex;LhN;a+6B85s61wc7u&YKPtLZzA@79AUQm8+O=!
znJ8k5T-u?QiAAky`*r^6+wTouYKL47BI^)e9BJ#m@|<njkL@-L3{u_4_dR6HurKaV
z-{(51$yVq0EnB}CzI%{c<ff`twn0<R*$PZh+|9s{D)VpOUd~wi!+bmUBCA4fg`w(L
zJh5tjOZNlYH@1d$B93l*lV@AoX!4it{UsE<H}Y1c)jW-fdz-jz_wor_Sm*U??PXw4
zV%cf8B-P0FY(XAMiwrpzA?GdzhK)02?C)-Kv;So*voEXdi>=+xbGAH5Pc4z#RLE(J
zfkExZRy%XgeES(cX77CQ^pve`&plg~kGpsG^IotmpK-^Qf%}#<vPldKWsQvXBA-0%
z&#d2Mhg<_7*XNg_-q~7gJ7=5zA=8F|Vfs4@`-O*G?QZ?lv`5a{$YncfJ{MnPW$z}p
z$?nc`F?(cH872R0WwSQgJ~?pQ2DLWe?k~0v^P6iYc5yXIzXsXo$YnkQ1J|4sdk>Mv
zcFT(9*tXnev|IaqukC``KpSLL$hsLA{G$!**I%}<H*;yRMV3JhA7qml7<lI9+uQCa
zw_E$Z$qrctxyC`ZkAY!byTsl*@wN6Ymb@sfSFeXFZL{`0wk<Qdxa(KNMq4GJhqn66
zE_)alUjFH^-Mcp1e%py7`;gnU$n9O^x{HCqV#8tEQu#dlt94uVA*({J)lhZ34P9qf
z<f&@^=$GDp<Z=nQ|B0%@pef9LvW%DALuV$GG7-5PM6Gc?tcbL~6K-zX;mWojxwb@Z
z0ix<Sur$GrV_VUFojuuh$mJ4pZGhbNWnie-Tx0*@nWZhSlI%X@njX2{MXuo(7`|Dz
z*|rtc*>AYM#TGdZ)*snr`<45F?WZa~o3d|vZFhfvXe-;8Va31@GAG_{ZBT{%x#_oT
zk!6r|Am=UyhN}WSc2x#t_6mom*&xdx=SO6d7#PZ;uiE$q*V!{{d5q$!oLjSP|4n{q
z+w@7w2H8FahKt{<c7KR<wP)c{wr>raZL6xg*Vb;Dl`V3s?^$QRZQbj0wi{acZ5bFA
zIOy5!@=US|y<TdMtjgf$I$I}&cH69maI|)!&YXX{gUV0Yi6~^F=s>nF$8)~z(p~Fq
z*I2vRGB8LK>g~19O5AU<<)ht=v`MzTFGQ@KeUG(89zj4I1K1JivTxlY-~GE|1njpy
zZroF0BD+^-``<mtI<n3c+3q|hXT|E^Ys<j!w$^!{z#-rLE1U%Ek!6r|AluEru=YUO
zey1&W_I>8nv|Yd!x|cVpbI;P*7xyYB1@C?FaNeG?=f3Y<+F-vo?BB;d8+L$tcN->l
z?2CF+y1(`BJllmxHFEs2@I5p7{P+Imn~zclGcep<SFnF|O4q)O)DXM(FHQGuTgA6W
zbc^g>(`M(rd!@eY&RP(%x9yMRUdwA!_w)xO?`2^4TamLrX6xL2OARyakY&DUs_m^_
zIeSmZO|iYmCNVH9c#^TtS+8>c^W?WS$gV<e4IuYe85mxCY})h6Eq}lK)vb0}maV(_
zdaU<qDQlpN;vk0`1H%&GOExJxs`jt5@I}dk$huMM^P~ODwy#60_V=$vZNnk!K+eq!
z40$e>ZKE@*_P^d?VTasKKyF!}+TkMjW8aUOxcztd&)715f3qhi$YyWv-4lCvd9K~_
zYmNKfFF)4o?e2NF$1cQVuaM%5y$lSOSNiO0EG^%^fmg*Y9x2w4&7II#w`bBshrKpu
z^Y=0^+&m_=|GtT;eFEQmJLGl=a?1j_#lgT}A9sA;kJ-ld&yPyjBj+__-OJLNY_n>1
z+IAf?uw`J_YIbR#(Jw1|#eLi;I*{!^*3H16y|ZYa+;lyAC3!=Xe2#1%svVMZ5A8c%
zlw;o{<z@SJW0S4Xj=Q!7g%(!Gtrz506a&Mg^t63TrsvxKeKH+o%o4ffggo-Xz_59p
z^1e60Irch?n^Ed0<dzevj%8N^_Ak39Z0{!X)dqPi40*&0c_fU1;ebxqe!hR4_If*x
z+al{ow6NIg&3V?wp?$($+i=yr{0I1Lx7Kgm%fN8y|HZvqp6b|5{!(R+T&f|LQJW3>
zY=79a*_wV1uw`I4@&4@Iekm*4bNO{BI*?VNmL<KLx9?5gZD8BI3sncQD%29Ld6~lg
zbPFY0Q+{{*9|3{3-!^vI28!y~-WHYKE3(wc`nbeRl(9tyhI_kf_OCXUuw#CoX=|Vz
zvG*w>yG<+W=Do>V;`b`@3)x)S|9$WFmvMVHA7r+kEPZA#1B2f4%Kbl7!t8wVa%_=R
zA?rpSjbvcRvYT)BK>etlUO^m6*^b<!NABq}FwFewWhb-8%KrZ>b$eu)*D*V6pY1(o
z%f=vrQu{D4NMC2OSGwbEcf2ncWjqnt4kM(|NCt*O`a<?wd2;N0HhZGzKyEW4>t<kJ
zla{x?%;jkRy(-cUxy6dyIzw%}ign7{r)av`pR(abX~QA6`cQSSyC1U4c$RJd;KNE=
zWL3y@JE{&vvl#o+(>L11rtY^xZsQ`m3fZ*`3|C)T+b^j<Y4>~`FUpt<vTjrz`_v}w
zIT%}R|Gd3<A94#4xdn)t2if|C?ey4c_vbXb*&>f--kg$T!><^zx7POjUgW+g1H<<s
z1^ZK_=KDjI&e@0DhC?1_Kpv%FVBnpVZf|17X?wQ(CdxP*vJPaE7#RG+ciJ&T<?a6|
zXpPe6M0OSO*a-tebA!2E@g7^-`ID<r`ccSvUKMH9fq`M_i(b2PrV_T{Crj;-WsrMb
zsAFWWnq=)8mx<UunC^)(mVwf*L7GWnU<gQbv{yG&u&pgtN6~@YdPVLnF)-W~O1FPI
z-P`uc(_41PJqTn~$UScchU>HI?UkQ#*`C>Jgc4TB?Oo({FatwIYQJ6g%RKw8$TU0T
z^orb?MDF!5Fc|bKu)BLD$G*iV8l^vooWhY!VqjS4t-oLVN|@cW)kgNnJ$K~N4z*TW
zRhqVcz5ShiT6a5b4?eQkyE*mK9!2xLd*vUx?A>=@!ycusC3}%uY77kP9YyvZoe{8~
zeeWfkL|N&*e{EIwx~=<;GWvnsGGJh+erUW;aedYPT*vda$SnZmmJ{-b1p~vUqYw63
z^r!BxpPq)&%0M1rL2hd?FsN}!>^F?|*`Moq)>dM%*xqTA<o4RH+PD|lC8+I^y}hpc
z)r*z(TRQ65BKre56j0luSN_!R|8M@@s?1By#_>x0-p7_dcekEFtpSkBd<KTR`{nzK
zd+Yb5IcA~gKyL4%hVJ?0b^GtzUEgCk<CJY>YV6+P)vI>j$T)#AmVsL1@Px$e|C0J_
zpXc8YJEaoMy}Q+K?^)`Sxfi+hirlJYU}$?9z2Di|-tN1^7dx?V!@a840&JGC%j|t<
zZ@Bkr_%5r6O`Lm?Qx5~f=^G*YPZiFw+cEPkiVkE|DM%yf3=Cf*@9lejI%)sUi)wbr
z;f~zW%l<Nd50}60-n+|;_A)Sd^j_b${A<eo$LFL_bRf4Zk##dLcz>R?ujpy+e*2pd
zcF1NStIBN(-=l1Au(!@mYA*xBuWN4mJeA7!p9*xhLso^{7Da9?Gcc_96}iu?rer@)
zdaxa`S;)Fkb?BW{*w-Ffwg2U0UX=DOatcSbkAZ>3W&6J1`?>bstM=?gZW|)E8IfCn
z3=G8ws`g*!5VPx@#EUZGh1|+O9{plqU{NdIKRY4QE_fOviVozq2(oSlhC5OD`_1&H
z+BwMkqr|zbsLkFZi>KO5bIRL`Jle*<kfs{5|1sAmyVL(&?2uCfN;?rrHv_}{uJrwd
zWxMUz#1l|-AlreQLKztJFWT*|-N9||{r51+tPJu@46@w}3_KOt`&FIy+SwmxvqN?X
zvd@w2V_^7yzhM79w|REieY|$as*rt)s^j1N;{CEWX4x$|#e_2Nj9eNZo5aA-Q?0*$
zhO4<f%XM~?kyPY%^ywo~dtW<o*mC@8+{?h=VB){OV6~`ymqfBHa$6m_MUJeSfk9j&
zZT}6!TXyWH&e|f|jvNZex)~TI$@}hSH5ava_vS(gD`c0T+F{BOu>bJ~UVFZ?=61-c
zknKQ@8wLi(K%e~{8}He?7L~GB=2qN$UAt?yL&&o|$gObXl8AwU`?t@2$1}fdFUg6a
z)N078kaaUK#Hs1--|K5&=MZLYk1T^+4<eUc3=AdHboYJQlE2?SbuLQ(9Jx=9oc|dZ
zoU_jFb2pFL-{8CwrSw5oWqj(~p6yG;_g=3P-^;-8CULE;rDlm;{pxa*mOgT?2)X6N
zz;JDQroB^dnVtHY6?VuiR^+xQa(jh=;mkHkyJKsr?I$%~+lxH1g*@Vg+(u<!_;KjI
z?TXe~`yBuEC_0c;c_EFFGB6}aMen<*U15Jm`P*LPa_R1pDYm<{AKA(p7FwXTcjXTm
z+F7z!+Fy2;MQI@;y9#-Xl!0OH^<KNlQ}XT2e#PxW9#=<Jg{+%_A#~G0JH_MK_V*0;
z?M0SB?k6Cd#K3T3Tdv)qzZLtNIt*-(+qlRra@6*&_?i=T0kzrtzue8VL6$*o^&!vJ
zFfdp?E3%K#VzVu|xB#VPiQJk*)v;=cs+~c6uKme3YfxH!JSW!K)=s@=dpD`a2Dzul
zz|ine-mYn9jy>PujVL;hTb9VW85l%^+U(w2_}D-B%Vm$;=0r9Zxo641@asqCp1ch?
z_S#Pl*&(Y!HWzs$gn{8|4Cmeh`)%#7FVsdEVL=}8L^g?mVOPuXJ)bOc?KcS?utPQr
z*$zpUIks8*@7l^;?+2}Ch+VyJVsM0AyhOG=^4Lp*Sh20b#CF>-Pe)ti5d;Q?&3iic
zG0W%L^@QZ3=s;G5oF5q&_8V;3S1F`p+mM)Vk8CdTh$pgc28Kn2S^HM5T45(wpM^3~
zgzQ38J2ox2yl*|f)PCNNdMG2QZ;)12<shwqVqi##PTjBY@8Q1pDL%HytyJXJD{9Mf
z=lr|--WsIs?@(*DMQ&3ew~$fW)brk~-4|k?xBr?gw;i$$<TgBVJBWc{|8vFtUk|zN
zcj?MRX@w)VuaWIzV7RDIyWjM|k-bY5UZJ#iUmOkCYk$CQkL<HKC~aQ`hKC&0`xBy_
z_wn;tpo}3Sx0aDx=L`&gwCncU&#1Mvx_$v=6bHE-joMoBnIE`+BOCwzoDXbv$RWBi
zM}F^;V;p;%75n!hx3w7<a-K%+mzQPQKPL!P2eK-8q&^h`Lq$gM{!pgYeP562po}^r
zk5eOu0s}+$qQw1d2cPV_E+dQ5(noIHquR0WdfHxt*LC}w3#Zs3w?C14UZ~>?3l?p(
z5!+w4e`(!Ol-Y3P(P3nh7#QYk_`GlC(U|>@=Nh22+mT!3s;nRPr1&W9tt-yn%fK+%
zM`^!VhpT<Ee~2yetS)k^2Du%~z|a`1u|I6Fy?xPvb+*Xu59HBPR2^sUM(k%Q`)haS
zkSj_{2DxpB+Aeu1)NbpaD`@-Fy&h!*5_t>}dBlQ&AvU*kpTPgH{cjR~qVx@r+YHDv
zDGUsLnK$=M-0HMHx8%1Sa@zn|6>2``>^-`#ZC}v-9hO&7>_FCmY!U;*QX#qh>r5T@
zKlzws*DTGocbU%LJwEr8_9Djts*W_BWcw038#|rS8z^IB$fF;qt&C6Sw(q?+yVm}W
z?WMiQwLWq?0ks9-x4GZ8Z9%cUr}#{i765X6jyzt*z;H!={l3_~Jo{%izuSscbl7hC
zf5+Cl(#i(8SA-n@3=AuOt=m_!J;z?{nYJCW4rEox<NFK@OLSWIo)E0JH%v>kMV{e9
z_6M^67#M6>IQOo1sI+%vOSeO=mymU%)=`rV<n23fs@&c)b3e)~0I~~F?Pxs|vTyg}
z3j4m5cWjYmkaZy2$H34L@^4?5yMpcAFR>_f6mtE6TwgIT?D@mC-{QHUEt^dw%KBa8
z8V<R&%)ro>#I!%oJKydkdk9L+i9DW!sv~a7zkL;&8Fq(K!cfNBk?laP6B!sLn=aa?
zc}K)HXHk(o@;E+n{fg=j`KFos#5{}lw=%D`MXtS&>nP;9i-BQ3zxMt^r>yqh+aqF!
zoF|aWcH|Kx1_lO8`Te^lyYBy3$Bv={Srzga2LnS#U-f?3uZ(-yG_38ASDql(GRWmT
z1B0q+{(hUt<@+8l7ec8GkZS<cvVBjo+x{n4*!TCHUyqW{&vgp#{q$n@p1HeNQO1B6
z82J9k?KhBR-M8YNt3C2MZRAvf+#_RPSe6pA-?rh`-lNz5*dh0}WP+6T`hPax^Mdi`
z9#kET|Kj$4?qc1iQ}hW%2lD(WvTg<jk;uaR#l{hP_fKAdq60bHkaaUKWX{Ujzh9Qm
zZkNI~l+Z<XA?m2Xk~*{f+>5mB|E>zMLoW4^O9tfLD+7ZKx5ob0AMNd{+gI5l*DT0&
z6mm_(z`$}(VgH^<9(&{VyP@<sk;4Z$q!}3MwYB$ed?CI+px~(;a;zbj+NkT>qn9Y|
z-*oQpzN+OC_Q*PrRUxmfXJF8MZm?fG)p-AnI#WC36pozok?mt(Fq_zFC#hY$e_y77
z9rB1d^2{;v{4fK<X`PyVGEd6vC;mQy(jP=FsgcVu28LggLu}4z)z}|qH?TwQr68AT
z$fYX-!_NH<`#B$~?>Fg5LTOndx6Y7TnG6g{Yn}Ihd#$uTO5+NO4&+ck*3G~WaISLy
z|FnR8M^`OIX^SGaqmlC?1H+=l_4_YBGTQ6M_1y-!HHqB*L~fTdFo<s{+@HQ|!9EwR
zbGFE4A=`nP&tHjG?4Mq~YVWeGxhU%ykn;y>S#oN6^?vS*$9pwQ#qE&oKvsoZ5-~7v
zJrCILCc(a+y`d1LEI}SaMsCS6Fifm8-Ov8Zao>Trx+tSK$ax#NjA3Bdo#np&%(iv=
z1lO|JBdbET1367IFf9D1z5gHk{(bMxD5I2D$f{6N`>RJK`#0b7wqyMgi85x1JaUH|
zZVU|Orx)2>i7DK#v*C;_a;ioi4?yjo%LfVC?dq=CpRB*!7FiW?3mLUdt?S6T|H+x)
z{cb7|D6Kx^Jc!&{W?<lXk+bj8wjBGJH)o;rgppeSs4bbed71lmzR$7O+&c@U?StHp
zMs1h0_;c(J%h%t(CFviEtB~8D$mI$H!~As)`!9V{+~2Uo3Z?&noTE_75}W5zb}rI2
z`yaEcM+qzBkVXzS28L;GW%uuUsj**l)oqlNh}>dDb=A75vHQ<YYTOs<bk`0!T_M*Q
z$Z3p$A<W)#|MJwe`<T8;qLiY@=@r=|1_rAY7W*0{O6?urrr9BfB64|!95)OM!TX);
z&#|Z3#XgZnS!apdrbZscV_<NdxPD*$621KefvPCGose7lsBIth&qWqplb)M1Ff{B(
zUhjdt9|L)%JOjh61NGZ#u5<4A|GyqZ2lA?G<h9id3``q^cIaBJ-+^uivMOZz7#JQH
zO|y8pR?re%2l5^xWcwHxn$EVEZw$Dw4P6Ja+fnDX#V;}LN^WD>`4`O}$YXNIqj(Gq
z?wzwN;#VtJqWc_qoh7mh85n+dFSgq0@O0M=G&_*T^ikKze94+<by%c$*W3T~`;qG+
z<nbBgcw%5!k?d>fd0TbIzyJ07k=KhM&vT;cD3<QE4oT(Q?eM>TKeD;VGm5A>J{)ti
zX6CBdZHDF#WVa*t!WkH9{!iMu$b2<MDnSlWWY;n<lwMh3xvfABBXp5t4LNQY7%c4B
zb|rUISb}_x>~`du6V)FjVoJLoA30#P>wo=zWL3!VfvV%{m6^NM!_Qf|{jcAT9HPi^
HgQ^1n=JzzS

literal 0
HcmV?d00001

diff --git a/meshes/collision/link4.stl b/meshes/collision/link4.stl
new file mode 100644
index 0000000000000000000000000000000000000000..76c8c33c3e1e6c184f8c3693b390892c25b179e3
GIT binary patch
literal 15084
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
ZE`<wwrPgWflN7E-NxR7D71@Oh3;++0rP}}i

literal 0
HcmV?d00001

diff --git a/meshes/collision/link5.stl b/meshes/collision/link5.stl
new file mode 100644
index 0000000000000000000000000000000000000000..3006a0b9a695f020e1887128d805d15aaa7fd342
GIT binary patch
literal 15084
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
H&A<Qvd-$Q9

literal 0
HcmV?d00001

diff --git a/meshes/collision/link6.stl b/meshes/collision/link6.stl
new file mode 100644
index 0000000000000000000000000000000000000000..2e9594a873f97e572ec68a4e0ab6d65f41f5007e
GIT binary patch
literal 10084
zcmZ>*D9A4=Nlj5mE6UGRaLP%|OGz!#HPSP;RM03cO;Rw>WFQHgU|?V<n_RI!`fSO*
zDRXqJKOHmMtJd4LC%EE;4fjHqy;afvyYI~_-1Fdx@m|rp3-_o@E!@Mv(81HRPfuTK
z|F;{)`*Uutu-#D;w0Eth$=+SJjrJV<<gmB@Pv)L?o6hXH^G0K@!vv5HcdPpS_j>2r
zPE*#j*$`;IS22&##wY!$%}QH`y|b?9+f;EE??JYYfuZPV$v&Gog?pFFRqRKWLADRo
zRqR?Z`!?5U+bsQGxgXhFWF5#RF)%R6#_YT6q-*2FP_^HG^(tE?-sLtsjvMYp)`4si
z0|S5L+r9spi}#;jKGp8=iQGMl_UZ3k`hdyyL1Kh$?CQY1eF99jT%v1i<4y$bt%@<R
zWnkEJq-Ou`F!_CbA)jpi`#bDan7(5dKhtNF&_xb)28MI<diRM~Y~6QodkRYEB8TYh
z8~l5_PO|T9USG6_f#E85+dg4;?S0=uicxeRt3nN{#HZ?ZuD5*c%52K*53f?SRdSzY
zBV3eh`{w6q+pVnbw!9w|Y}eQBu=TE*WE;*XV#~m=%zCq}uWax>vHD8;I?kiEJI@8~
zwaYfN4ftYcd;G`5J+F@>+AjN9XY=LZkv$I=r`a+vRPOv?rx~kb<GMfIe!l-pTh<lx
zY_`4;uwAnEimhg*zm18!hOOh#r?&gI2JU?sCSl9K5X^OS-wXGg{mp6Z*2rmT;oT*B
zSSA_l%{sK!200WM7|eFb??3&+egBd}yKRtti>zwWmaltQJcakVe0yudz%b=w_I{p~
z$Lw+rui1qhw>mlodxHy>+DI8bu{j>Dx_9E{>o(R~Kxy~z#rpkKrr&HdT6dtNUF5Wc
z9J34z`%1EG{Q{=!YMfG!5+6VQ9ksPK$g)vVFx>m?^)Xxh?SXscw;SwbVCbDWckflB
z`u!HWr`T*U727lOqTOEG$s28uLjgIBF)%EA6}sPS8qfaOe?w4w{zO!2Z#3(RJqF<~
zZBXO<Se=Rer8f_EcXycDpZxIGws1?}UYFhrHko^V*iM$8Zj*H8l?`fqRBdyyGc~EU
z-=$k%^M2|*+sd8OZ7Y6T?fK=nz;@!*MYdPI9<!N!`HZc;>@3^1c}Hy+815H&*n5h~
z+dtZR-^O;^N820XJ+?323fS!QX0&_dk#DQy->~zF(>L3l$J%Yzr9a%wz_2If!Cr;A
zwf4;im+oEcS!!G3zQopYRo$MTsX4YrrORwnR_wG4>FTr%@K|oU`r_x^3=Es4jO@52
zYwZ8++O!MVRhz@+*)HZ>Y@0sy0E!D47;I(IY@Ldy?Atu0#2z_!BBx{2v^zmFao65|
z_4{?CPwqxmg{&JjtY#kwwEFhHe*f8h=2pm|i>wM+Hv_}`E(xo@|LgbPy^?E*tOHrq
z?gAFO?#+RFe{nU~FfcG`f7~~lpV5A~pQZhQYYcmHZ@#seI$Owg_vP|EuFXqqm{y0|
zx^hg}b6AJZ_PUswEd#?>k9T`}o)+(y-PVs%ULmJ3)O3}uvE5Gcjr^XA-1#W^9N8bp
zIhcXr((45K<GYtwd}#V&w>XK(ZkE<$8%LvgHpqTL^~dHH`}ek+&e}Eeex1D}+lt+D
z<&WBQJdLycQ2A;1!N@~<L{7z`l_kZwv-kO*FW!G)&r6j2fm|{m=M@HqqF=N3y_}K1
zfAx10J7iVJK1VLW85sU;YTTPwQ@?-K{@`8jJECn}RtE09miKQDa`>Ryk*vhI&xWUX
ze`4XpeaJeHRUy|U3=9jtCG2Z&zhbKwQnBC7af5B?UN760KJ~rGwGV3Pvo|SmpRCad
zTdwj7lv)j06|!yy2Hkay`(_&z*}YRL*zdDxh3(5LQ*2lIi|j?#@#EW@J$Wtiw%bh#
z_AoF+o>8`Eee`1Yw_Ps#qx$aK&e|HdS5;1a?~Cj2ZKLH^+HBm;wwHC{FWb-C0{2dH
zf3k;x;Z|<FP0n;io8MniOE_egAeVLw3}3@~?G`^QwZFPw$QHTG$W?h_YbP+p)_7e#
zN*Tkza47Z99+q46_Qx%9ZIDZY&!ug)rjwT0{-}(yK`j|p<bAfgXB}W~KV|j4I^CDH
zQ|%|%%G)*X`C{|XmZzlKR{!?BJray(Z50G(*@~P!yoZ57qjtWnG*`HtKz$`jd?1Hg
zdBkDc*E|z!AIb>rWnf@<>uD$Ov&uex$@^W%B@VJnkjqB~hOMeUZ9g&B+5cp_V1q1!
ztOMCk3=HD+_iQGtma|^?yxtzUTtcp?ug)m53GzE?V`l-XYtJQ{+L|8yw)^JZdVAy=
z8CeIiNem3nMJnuGT+Oz#bt|+-uJxCnx@h~Ru-i5vp9`%8pcE*wxBb_ByDcnf_J56M
z*xr$!X>0k8%NE%ssBMNBul+3l|F7R4^d)E~a=M!Gm&LAbTj1W(Wm$Vr>p|suv0eZE
z*YAJpzup45%s|#rnaFO}wk>e)!_OP67#NDrF<XIjG$`J%KrT6vbs(F>z~Fl%!RFb=
z`u(wg>-He4Le8nEu1Z*PeeWUH68nyne!Bx<^|t!4^KDPr9Yu*v)ENBq(suu>NfY;M
znWb%Cx?gGUA7TAH=H`;NFJ1}l{eEDl^}!|`Thung=3d$TIjv=OI~5)5t0PqRs?RI2
z5wsRW(XrF&(Vo(@^)@fNjcpkiL^4wBrk-K2x!hH0k6a=n$3Jr2#lX;Ct!3Z(+rm2S
zr=2}=t&iL~LoVkT7%J-n_AQ#Gvit3#DtqM88M(%}Q@MRl&K9RVmCAv(3=DDyw(RAd
zHrvXap&q4dM^1gnDTaYz-S7E(^FMsH+oYd>lCF?z22>r4A#3(7;uG0lvdbT(K1a3#
z*|iJ||I+36zYZ4NpWDJ}U#`cr*YD2xJ^nl7Y>`__sO`je&4T-L3xf8)66Uc*u0N1f
zA-6Ia7*;rC?mO(SWOw~zDN0#_T<#*5D+~;M>y-9SEIex0Yp0D;pCiXVYMeLrKHQgd
zCe?mfxQ~s5`MEvzKUHkAXKq0$A5qJ8&9b7M3=9qXlOL*EBA4OFDIYm+GBDhJ>}vnT
z-^C^&L1{m74Y2SbgWXcMr8W`j+x8%v#K3UIe2v{av2?3&(Zc=6r9QH`s5#19TGcM$
z!V6pGA5|zikn6<T=Pug@RO{G2jFaEXz#uarW`FEy#{K56&e|Zy8gkzWwY|ISmBs$%
z2dnpmAD2SOgUC9N(*grS@5u=J7Z)#CtEq9Iw2+ZoHOTpff#GU*y#1?$3cE#VH|*G3
z{@XGhH?&>-biR$vv>&#QEgNkG6)J5Kvp?I~)rQ&L*?H53fnj^LfPIT!uzkUnm3xru
zDCCwbY76--x1hcB*&zF?lYZ<$R)yTYM%BT*m&smIBF27Z*>-E>`W0CRvPldK!L<%{
z{5IA0whD@Sk!6r;OXS*)f#JeEE4vr=<@U|ZHv62eY_w%HoNLSd=j|S3Rmi#-7*tNJ
zu+2T*W5;Jziqhvqt}{^c`MKM&yOaLZ?_b@lZiAd&k=t6xr8WaYaM-SWT><g-yR??0
zl+^t%l5JggEV7+m>S6QDY2O~kIz`(fd<?b>4E(E}?b~yS-G23Xb9>}c4Y_@dng>r+
zIoW+#SY|(Ct)m@seSXwut8Iz#Tw897r)a&R@Wm;1jar|q*R)rn)XvDIHgZkP!0<mV
z%Z~BF4BIso6)0spa!rk@WAo1{`-!vkcHh41X@^`xx=&`a+sCrmM(^kuYt(u$V#mjQ
zC0kGIlTq?QDch0DbJYBiCTzU#)JtRQYrHimVTD}QBA40>47Y69_x;&wv_DMU1f`@#
z){z$8vxmo8aBtLNP>;nl&UAlUrpf-kcqx?98M$|lTm~~REZ{HQ|EG7d-2=CyDC0@U
z<4nlCdj^KN^KAD&{i1C@tvnp1uRp_$f3L`P23w=vmo})SsP9cz``ytow(ssK?ic&>
z)mCM?o-MQZgFVP)B63;D!0^-ji=8I3pnVmm&VJ<fr-RBBTQ8S3+w{X+dr@1Kt>PZG
zJ{3!C?Qhqi)E~$tDsuapfniId%l^wUYiz%+P_jpESs>RRsI82!B%%GUi`MM<^C{4N
zugal4n)*Mi)yn-*S{cak&%m&5lhuC3gq!=kqdD!7OHSl67&Vo&8r9nWPUhQFbwg~Q
zSOc3~>1RnB3l8Qz$f*)JH#0Ci{8DFsd~d65{?)p@$mtbXcakoP-RpKs+bX}CyBQd!
z73bNjx}LN(O4z(_+m?T}=cl^c*6~i=gRBZUZWtJjF1cxESm0*A+2_3-avOJB!6RF}
zqg}Sa$M2x!+MTmA?fvX>?8;uPu|qD;k<0nBUd(n9>wIjt|J-HGz_9w9z5R+`$L(_7
zaM&a3K(+(5Hh6l)(Ej5;Bl`uSy8DpJ@JI1KY^A0*+OB$Aj#5i7FqHFX+gq$wwV(5K
z_daA*$Z4z&sqe$U&|%+eXYo4RUYq^RKI9S^IrSlz;0z3bpW1D#iqq^{&)wUHT%IGV
z%5LemHTX2!R-*0i9tMU_Q?J<=*2LJaf60i_=R{V8teb)1li$I8XUcu;7Z$zQhn&}t
z$AFM^Gcfp=d+aL-t+emqd2Nf_+D7ghBA4?F3>PL%-*>3c&7S8zpFMJ^k32?#+>>Eo
z=sYO5Uo~XG-h-Fj?UC~Va_&NI&oeNr)9kmst(s)7@AMX>Hb6EPxn^KsFh6zH_HS#1
zy_XW3J+ch44&*wKfx(`w#9s4^t<C*qv+R(|aOAv#+(uzwSgc%Ze>do*ZM6MVly(WS
z4%D>Ep;2hR-(;_CzV=c(WL3zi9o3GWz0&*D>s$9FKC?$@Um=$U$YIF9U>_&2?*OOU
z{_Pra_Q<6^@;D4~AC7_H!n-Z|CeGxwU!&xRQsW@kGRU#Xz_4IN|2~C@+w5j3rl6!m
z<TQqwuGX$s-(RNfXn)I4$rf1^a&3Uz)@ERkK7D)N=T&L;EuFQt$TG;O4>?sbFk~Hx
zw=c||wfpX-AN!EYCFF7twM`wayxVTSV47{>t=#>{E#cKR4{UAT>)G%m$nHh185kHc
zZ;9I9)R(u;>+?q$#X;7AT1R<j`|tlS^N+3hdLfiPCvwe+T7P654%pBC*l?d~7_U9D
z406qYnm=?F+}p?ZId=a-k4ltrIOI4-t<R;r@9f*cZ@=IBKO;&iK~{yVn}K0!1k--K
zB8C0y8O2e0cgQ-B(;EZB?9cV~yJ8(}tZi%eAlEX;DIdAMVqn<kuWc_k=cuj8d>eb@
zG90<@jM_JtvnSua?R%mPN8x6aI7hY*IsO?KLOinVzlpWjS+>tWsnw9ndE^?7f#J%B
zN_$?OSi9}5(R+}`*pc%#s*VdERPC?S8`vi_EJdl+koyV9^%VnyezKhXmW>PT4yjw%
zBiEeBp@6ERIq`~}%QGjtl_!$z-#&U^J9&nU?awv*w#d4XTe1ucj5;Cqf*ic|?^mDL
zi(C&P`w2M|7#Jj`WZO51Z?NNYx3@!9g<S6<hXMn`zEzs`|BFrSw?>xRA@_ukeU7Y~
zf#K%NMRuKSo_0!Qx%-jZZOHi%xfW$$2sn9dpKL{%{b#dxdy&f$<kA4ShGSp|;JCQg
zpeMtA=dAN6^#}4e6LQVKz~FDIW7o9X&z^0Ez<%U971<@I;|zgU-t0XUQeZzpc^OK5
zj$96+x@zJ?&b<#9Ywg`UB=#Z8Adguhw+t8<LeJ*zYnrKU|4GdPW!wkZ?WiTSsocYT
zy}f_;6<)MQ$>+#@1LV4df#Jr|{Czf4W?MTvu0W{`kXy2-HO{B-fc@nyBKD6$*lm&f
z0LW!K^7sq`L(b~({Y;Bn?D+0}v_sZ`Tqaf{jn6SKblI8j59a@Fmtw()GKzz22eL^F
z3{FeF@AFDkv0r5;fzmEP?sKAs)j4ak{T#FJ+x<PqgJK7=xu~wHe!j)7y=RKGc1=FY
z2n%v;fIL3Kz`)$}*X~{0RNJhDu_!gpMW5%kU6ZVA|2<+ynGs-MXniJQFXFt$uA1F^
z|AMC<Y%AXt+Qxo6y$3n3Ah$~y7?ir1>}$){*&b1hMzI6AUP5*u1A~!dkp1PF<F@-0
z1W?8-k=rH6B@qL|_SOjd^Us&s3jAlYM^=SgI-|B^{wYV>AB*m>Q%HTV57{5cB@S{g
zgMp!SZjpWHqe-@}Oy=)HE?<$$cI0}VfnjRiXS>)ZzV@d&w%H+<ILLD$sHJGtja+-V
zAG7Q>uZu*n1KCx`B_9Jr4vVk7oTh}m*VC!Cwn($D$fX*p4)&7Ub}X9`?D><T_aTq_
zAon1U`wR>WOMaiRQ?PcopS<b&KIFJXE`3mSEM8`5zc=K!ou27;lpYImNF$rXz+mEJ
zY1g<^&5qTtVn4FE$mK5bNFf75LhLKMHFvG;n6}2Dl+?&+7g;w0gG$zveV^JL?Z4WK
zp^Q2sm%GS)1_p-ISAqMsl@!^3e_UgS+|onVf!r@)U=WdBY?l$`W544LlRa{a9=RSw
zj(-LQg}yU(?bG+zw$){#%*r5-6d~8B3=F&%p4xFuTV#9mHfmjqtOL1?!oVPMLfO9d
z_HEl2mz+>qGRWql>X5e<-S5<uXxDG<filj3T<)Tdky*4{-uIL{)&A5CU6imwZY`sR
zZtZ=6{R>+(?bp}*wnLUdE=7^cM+SyxMxy)ko_g9RcYD|&n~SUi*(3&r_+x7JS1+Bl
zUDV`&GO~@FN{~l)7#MUm$Jzh4e_<Q3|0`-64rvSswPa9o39;|^=Wq8oh!v$wL{^1r
zN4b5SJ@d~Owl8nrut9FIAh$)4%NPa*(_$fehK?dTE_P3p7(`B2$g#=5u<m1*U6X34
z{bAGZcF28B<Wz~85|5tZ+V8TU!Y=Q<FUm*}@)#*<oNp47vUjU&vTNVxh>{19^Eq-z
zGcf$@*0PV;7-DA?YrY>@23ZGcSp8Mox&t)Zx8>-boycux<X$84=r99A1y{<hU;pd(
QFG(=kfvgI7Rv%Rd0DhwPN&o-=

literal 0
HcmV?d00001

diff --git a/meshes/collision/link7.stl b/meshes/collision/link7.stl
new file mode 100644
index 0000000000000000000000000000000000000000..0532d057507637533d25f4b3ed451f213685a61d
GIT binary patch
literal 10084
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

literal 0
HcmV?d00001

diff --git a/package.xml b/package.xml
index 6db9003..7271cea 100644
--- a/package.xml
+++ b/package.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0"?>
 <package format="2">
   <name>franka_description</name>
-  <version>0.7.0</version>
+  <version>0.8.2</version>
   <description>franka_description contains URDF files and meshes of Franka Emika robots</description>
   <maintainer email="support@franka.de">Franka Emika GmbH</maintainer>
   <license>Apache 2.0</license>
diff --git a/robots/dual_panda_example.urdf.xacro b/robots/dual_panda_example.urdf.xacro
index f98c133..3722915 100644
--- a/robots/dual_panda_example.urdf.xacro
+++ b/robots/dual_panda_example.urdf.xacro
@@ -27,10 +27,10 @@
 
   <!-- right arm with gripper -->
   <xacro:panda_arm arm_id="$(arg arm_id_1)" connected_to="base"  xyz="0 -0.5 1" safety_distance="0.03"/>
-  <xacro:hand ns="$(arg arm_id_1)" rpy="0 0 ${-pi/4}" connected_to="$(arg arm_id_1)_link8" safety_distance="0.03"/>
+  <xacro:hand arm_id="$(arg arm_id_1)" rpy="0 0 ${-pi/4}" connected_to="$(arg arm_id_1)_link8" safety_distance="0.03"/>
 
   <!-- left arm with gripper -->
   <xacro:panda_arm arm_id="$(arg arm_id_2)" connected_to="base"  xyz="0 0.5 1" safety_distance="0.03"/>
-  <xacro:hand ns="$(arg arm_id_2)" rpy="0 0 ${-pi/4}" connected_to="$(arg arm_id_2)_link8" safety_distance="0.03"/>
+  <xacro:hand arm_id="$(arg arm_id_2)" rpy="0 0 ${-pi/4}" connected_to="$(arg arm_id_2)_link8" safety_distance="0.03"/>
 
 </robot>
diff --git a/robots/hand.urdf.xacro b/robots/hand.urdf.xacro
index a50b18c..08d3899 100644
--- a/robots/hand.urdf.xacro
+++ b/robots/hand.urdf.xacro
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="hand">
   <xacro:include filename="hand.xacro"/>
-  <xacro:hand ns="panda" safety_distance="0.03"/>
+  <xacro:hand arm_id="panda" safety_distance="0.03"/>
 </robot>
diff --git a/robots/hand.xacro b/robots/hand.xacro
index 22e6a08..2ed482d 100644
--- a/robots/hand.xacro
+++ b/robots/hand.xacro
@@ -1,15 +1,15 @@
 <?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="hand" params="connected_to:='' ns:='' rpy:='0 0 0' xyz:='0 0 0' safety_distance:=0">
+  <xacro:macro name="hand" params="connected_to:='' arm_id:='panda' rpy:='0 0 0' xyz:='0 0 0' safety_distance:=0">
     <xacro:unless value="${connected_to == ''}">
-      <joint name="${ns}_hand_joint" type="fixed">
+      <joint name="${arm_id}_hand_joint" type="fixed">
         <parent link="${connected_to}"/>
-        <child link="${ns}_hand"/>
+        <child link="${arm_id}_hand"/>
         <origin xyz="${xyz}" rpy="${rpy}"/>
       </joint>
     </xacro:unless>
-    <link name="${ns}_hand">
+    <link name="${arm_id}_hand">
       <visual>
         <geometry>
           <mesh filename="package://franka_description/meshes/visual/hand.dae"/>
@@ -52,14 +52,21 @@
         </geometry>
       </collision>
     </link>
-    <link name="${ns}_leftfinger">
+    <!-- Define the hand_tcp frame -->
+    <link name="${arm_id}_hand_tcp" />
+    <joint name="${arm_id}_hand_tcp_joint" type="fixed">
+      <origin xyz="0 0 0.1034" rpy="0 0 0" />
+      <parent link="${arm_id}_hand" />
+      <child link="${arm_id}_hand_tcp" />
+    </joint>
+    <link name="${arm_id}_leftfinger">
       <visual>
         <geometry>
           <mesh filename="package://franka_description/meshes/visual/finger.dae"/>
         </geometry>
       </visual>
     </link>
-    <link name="${ns}_rightfinger">
+    <link name="${arm_id}_rightfinger">
       <visual>
         <origin xyz="0 0 0" rpy="0 0 ${pi}"/>
         <geometry>
@@ -67,20 +74,20 @@
         </geometry>
       </visual>
    </link>
-    <joint name="${ns}_finger_joint1" type="prismatic">
-      <parent link="${ns}_hand"/>
-      <child link="${ns}_leftfinger"/>
+    <joint name="${arm_id}_finger_joint1" type="prismatic">
+      <parent link="${arm_id}_hand"/>
+      <child link="${arm_id}_leftfinger"/>
       <origin xyz="0 0 0.0584" rpy="0 0 0"/>
       <axis xyz="0 1 0"/>
-      <limit effort="20" lower="0.0" upper="0.04" velocity="0.2"/>
+      <limit effort="100" lower="0.0" upper="0.04" velocity="0.2"/>
     </joint>
-    <joint name="${ns}_finger_joint2" type="prismatic">
-      <parent link="${ns}_hand"/>
-      <child link="${ns}_rightfinger"/>
+    <joint name="${arm_id}_finger_joint2" type="prismatic">
+      <parent link="${arm_id}_hand"/>
+      <child link="${arm_id}_rightfinger"/>
       <origin xyz="0 0 0.0584" rpy="0 0 0"/>
       <axis xyz="0 -1 0"/>
-      <limit effort="20" lower="0.0" upper="0.04" velocity="0.2"/>
-      <mimic joint="${ns}_finger_joint1" />
+      <limit effort="100" lower="0.0" upper="0.04" velocity="0.2"/>
+      <mimic joint="${arm_id}_finger_joint1" />
     </joint>
   </xacro:macro>
 </robot>
diff --git a/robots/panda_arm.urdf.xacro b/robots/panda_arm.urdf.xacro
index 31e7a2c..2e663d7 100644
--- a/robots/panda_arm.urdf.xacro
+++ b/robots/panda_arm.urdf.xacro
@@ -1,5 +1,71 @@
 <?xml version='1.0' encoding='utf-8'?>
 <robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="panda">
-  <xacro:include filename="$(find franka_description)/robots/panda_arm.xacro" />
-  <xacro:panda_arm safety_distance="0.03"/>
+
+  <!-- Name of this panda -->
+  <xacro:arg name="arm_id" default="panda" />
+  <!-- Should a franka_gripper be mounted at the flange?" -->
+  <xacro:arg name="hand" default="false" />
+  <!-- Is the robot being simulated in gazebo?" -->
+  <xacro:arg name="gazebo" default="false" />
+
+  <xacro:unless value="$(arg gazebo)">
+    <!-- Create a URDF for a real hardware -->
+    <xacro:include filename="$(find franka_description)/robots/panda_arm.xacro" />
+    <xacro:panda_arm arm_id="$(arg arm_id)" safety_distance="0.03"/>
+
+    <xacro:if value="$(arg hand)">
+      <xacro:include filename="$(find franka_description)/robots/hand.xacro"/>
+      <xacro:hand arm_id="$(arg arm_id)" rpy="0 0 ${-pi/4}" connected_to="$(arg arm_id)_link8" safety_distance="0.03"/>
+    </xacro:if>
+  </xacro:unless>
+
+  <xacro:if value="$(arg gazebo)">
+
+    <xacro:arg name="xyz" default="0 0 0" />
+    <xacro:arg name="rpy" default="0 0 0" />
+
+    <!-- Create a simulatable URDF -->
+    <xacro:include filename="$(find franka_description)/robots/utils.xacro" />
+    <xacro:include filename="$(find franka_description)/robots/panda_gazebo.xacro" />
+
+    <xacro:panda_arm arm_id="$(arg arm_id)" />
+
+    <xacro:if value="$(arg hand)">
+      <xacro:hand arm_id="$(arg arm_id)" rpy="0 0 ${-pi/4}" connected_to="$(arg arm_id)_link8" />
+      <xacro:gazebo-joint joint="$(arg arm_id)_finger_joint1" transmission="hardware_interface/EffortJointInterface" />
+      <xacro:gazebo-joint joint="$(arg arm_id)_finger_joint2" transmission="hardware_interface/EffortJointInterface" />
+    </xacro:if>
+
+    <!-- Gazebo requires a joint to a link called "world" for statically mounted robots -->
+    <link name="world" />
+    <joint name="world_joint" type="fixed">
+      <origin xyz="$(arg xyz)" rpy="$(arg rpy)" />
+      <parent link="world" />
+      <child  link="$(arg arm_id)_link0" />
+    </joint>
+
+
+    <xacro:gazebo-joint joint="$(arg arm_id)_joint1" transmission="hardware_interface/EffortJointInterface" />
+    <xacro:gazebo-joint joint="$(arg arm_id)_joint2" transmission="hardware_interface/EffortJointInterface" />
+    <xacro:gazebo-joint joint="$(arg arm_id)_joint3" transmission="hardware_interface/EffortJointInterface" />
+    <xacro:gazebo-joint joint="$(arg arm_id)_joint4" transmission="hardware_interface/EffortJointInterface" />
+    <xacro:gazebo-joint joint="$(arg arm_id)_joint5" transmission="hardware_interface/EffortJointInterface" />
+    <xacro:gazebo-joint joint="$(arg arm_id)_joint6" transmission="hardware_interface/EffortJointInterface" />
+    <xacro:gazebo-joint joint="$(arg arm_id)_joint7" transmission="hardware_interface/EffortJointInterface" />
+
+    <xacro:transmission-franka-state arm_id="$(arg arm_id)" />
+    <xacro:transmission-franka-model arm_id="$(arg arm_id)"
+       root="$(arg arm_id)_joint1"
+       tip="$(arg arm_id)_joint8"
+     />
+
+    <gazebo>
+      <plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
+        <controlPeriod>0.001</controlPeriod>
+        <robotSimType>franka_gazebo/FrankaHWSim</robotSimType>
+      </plugin>
+      <self_collide>true</self_collide>
+    </gazebo>
+  </xacro:if>
+
 </robot>
diff --git a/robots/panda_arm_hand.urdf.xacro b/robots/panda_arm_hand.urdf.xacro
deleted file mode 100644
index b98feb6..0000000
--- a/robots/panda_arm_hand.urdf.xacro
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="panda">
-  <xacro:include filename="$(find franka_description)/robots/panda_arm.xacro"/>
-  <xacro:include filename="$(find franka_description)/robots/hand.xacro"/>
-  <xacro:panda_arm safety_distance="0.03"/>
-  <xacro:hand ns="panda" rpy="0 0 ${-pi/4}" connected_to="panda_link8" safety_distance="0.03"/>
-</robot>
diff --git a/robots/panda_gazebo.xacro b/robots/panda_gazebo.xacro
new file mode 100644
index 0000000..085c19b
--- /dev/null
+++ b/robots/panda_gazebo.xacro
@@ -0,0 +1,388 @@
+<?xml version='1.0' encoding='utf-8'?>
+<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="panda">
+
+  <!-- =============================================================== -->
+  <!-- || This file does not contain official inertial properties   || -->
+  <!-- || of panda robot. The values are from the identification    || -->
+  <!-- || results published in: Identification of the Franka Emika  || -->
+  <!-- || PandaRobot With Retrieval of Feasible Parameters Using    || -->
+  <!-- || Penalty-Based Optimization                                || -->
+  <!-- || by: Claudio Gaz, Marco Cognetti, Alexander Oliva,         || -->
+  <!-- || Paolo Robuffo Giordano, Alessandro de Luca                || -->
+  <!-- =============================================================== -->
+
+  <xacro:macro name="panda_arm" params="arm_id:='panda' connected_to:='' xyz:='0 0 0' rpy:='0 0 0'">
+    <xacro:unless value="${not connected_to}">
+      <joint name="${arm_id}_joint_${connected_to}" type="fixed">
+        <parent link="${connected_to}"/>
+        <child link="${arm_id}_link0"/>
+        <origin rpy="${rpy}" xyz="${xyz}"/>
+      </joint>
+    </xacro:unless>
+
+    <link name="${arm_id}_link0">
+      <visual>
+        <origin rpy="0 0 0" xyz="0 0 0"/>
+        <geometry>
+          <mesh filename="package://franka_description/meshes/visual/link0.dae"/>
+        </geometry>
+      </visual>
+      <collision>
+        <origin rpy="0 0 0" xyz="0 0 0"/>
+        <geometry>
+          <mesh filename="package://franka_description/meshes/collision/link0.stl"/>
+        </geometry>
+      </collision>
+      <inertial>
+        <!-- Estimated guesses from CAD -->
+        <origin rpy="0 0 0" xyz="-0.041018 -0.00014 0.049974"/>
+        <mass value="0.629769"/>
+        <inertia ixx="0.00315" ixy="8.2904E-07" ixz="0.00015"
+                               iyy="0.00388"    iyz="8.2299E-06"
+                                                izz="0.004285" />
+      </inertial>
+    </link>
+
+    <link name="${arm_id}_link1">
+      <visual>
+        <origin rpy="0 0 0" xyz="0 0 0"/>
+        <geometry>
+          <mesh filename="package://franka_description/meshes/visual/link1.dae"/>
+        </geometry>
+      </visual>
+      <collision>
+        <origin rpy="0 0 0" xyz="0 0 0"/>
+        <geometry>
+          <mesh filename="package://franka_description/meshes/collision/link1.stl"/>
+        </geometry>
+      </collision>
+      <inertial>
+        <origin rpy="0 0 0" xyz="0.003875 0.002081 -0.04762"/>
+        <mass value="4.970684"/>
+        <inertia ixx="0.70337" ixy="-0.00013900" ixz="0.0067720"
+                               iyy="0.70661"     iyz="0.019169"
+                                                 izz="0.0091170" />
+      </inertial>
+    </link>
+
+    <joint name="${arm_id}_joint1" type="revolute">
+      <safety_controller k_position="100.0" k_velocity="40.0" soft_lower_limit="-2.8973" soft_upper_limit="2.8973"/>
+      <origin rpy="0 0 0" xyz="0 0 0.333"/>
+      <parent link="${arm_id}_link0"/>
+      <child link="${arm_id}_link1"/>
+      <axis xyz="0 0 1"/>
+      <limit acceleration="15" lower="-2.9671" effort="87" upper="2.9671" velocity="2.5"/>
+      <dynamics D="1" K="7000" mu_coulomb="0" mu_viscous="16" damping="0.003" friction="0.0"/>
+    </joint>
+
+    <link name="${arm_id}_link2">
+      <visual>
+        <origin rpy="0 0 0" xyz="0 0 0"/>
+        <geometry>
+          <mesh filename="package://franka_description/meshes/visual/link2.dae"/>
+        </geometry>
+      </visual>
+      <collision>
+        <origin rpy="0 0 0" xyz="0 0 0"/>
+        <geometry>
+          <mesh filename="package://franka_description/meshes/collision/link2.stl"/>
+        </geometry>
+      </collision>
+      <inertial>
+        <origin rpy="0 0 0" xyz=" -0.003141 -0.02872  0.003495"/>
+        <mass value="0.646926"/>
+        <inertia ixx="0.0079620" ixy="-3.9250e-3" ixz="1.0254e-02"
+                                 iyy="2.8110e-02" iyz="7.0400e-04"
+                                                  izz="2.5995e-02" />
+      </inertial>
+    </link>
+
+    <joint name="${arm_id}_joint2" type="revolute">
+      <safety_controller k_position="100.0" k_velocity="40.0" soft_lower_limit="-1.7628" soft_upper_limit="1.7628"/>
+      <origin rpy="${-pi/2} 0 0" xyz="0 0 0"/>
+      <parent link="${arm_id}_link1"/>
+      <child link="${arm_id}_link2"/>
+      <axis xyz="0 0 1"/>
+      <limit acceleration="7.5" lower="-1.8326" effort="87" upper="1.8326" velocity="2.5"/>
+      <dynamics D="1" K="7000" mu_coulomb="0" mu_viscous="16" damping="0.003" friction="0.0"/>
+    </joint>
+
+    <link name="${arm_id}_link3">
+      <visual>
+        <origin rpy="0 0 0" xyz="0 0 0"/>
+        <geometry>
+          <mesh filename="package://franka_description/meshes/visual/link3.dae"/>
+        </geometry>
+      </visual>
+      <collision>
+        <origin rpy="0 0 0" xyz="0 0 0"/>
+        <geometry>
+          <mesh filename="package://franka_description/meshes/collision/link3.stl"/>
+        </geometry>
+      </collision>
+      <inertial>
+        <origin rpy="0 0 0" xyz="2.7518e-02 3.9252e-02 -6.6502e-02"/>
+        <mass value="3.228604"/>
+        <inertia ixx="3.7242e-02" ixy="-4.7610e-03" ixz="-1.1396e-02"
+                                  iyy="3.6155e-02"  iyz="-1.2805e-02"
+                                                    izz="1.0830e-02" />
+      </inertial>
+    </link>
+
+    <joint name="${arm_id}_joint3" type="revolute">
+      <safety_controller k_position="100.0" k_velocity="40.0" soft_lower_limit="-2.8973" soft_upper_limit="2.8973"/>
+      <origin rpy="${pi/2} 0 0" xyz="0 -0.316 0"/>
+      <parent link="${arm_id}_link2"/>
+      <child link="${arm_id}_link3"/>
+      <axis xyz="0 0 1"/>
+      <limit acceleration="12.5" lower="-2.9671" effort="87" upper="2.9671" velocity="2.5"/>
+      <dynamics D="1" K="7000" mu_coulomb="0" mu_viscous="16" damping="0.003" friction="0.0"/>
+    </joint>
+
+    <link name="${arm_id}_link4">
+      <visual>
+        <origin rpy="0 0 0" xyz="0 0 0"/>
+        <geometry>
+          <mesh filename="package://franka_description/meshes/visual/link4.dae"/>
+        </geometry>
+      </visual>
+      <collision>
+        <origin rpy="0 0 0" xyz="0 0 0"/>
+        <geometry>
+          <mesh filename="package://franka_description/meshes/collision/link4.stl"/>
+        </geometry>
+      </collision>
+      <inertial>
+        <origin rpy="0 0 0" xyz="-5.317e-02 1.04419e-01 2.7454e-02"/>
+        <mass value="3.587895"/>
+        <inertia ixx="2.5853e-02" ixy="7.7960e-03" ixz="-1.3320e-03"
+                                  iyy="1.9552e-02" iyz="8.6410e-03"
+                                                   izz="2.8323e-02" />
+      </inertial>
+    </link>
+
+    <joint name="${arm_id}_joint4" type="revolute">
+      <safety_controller k_position="100.0" k_velocity="40.0" soft_lower_limit="-3.0718" soft_upper_limit="-0.0698"/>
+      <origin rpy="${pi/2} 0 0" xyz="0.0825 0 0"/>
+      <parent link="${arm_id}_link3"/>
+      <child link="${arm_id}_link4"/>
+      <axis xyz="0 0 1"/>
+      <limit acceleration="12.5" lower="-3.1416" effort="87" upper="-0.4" velocity="2.5"/>
+      <dynamics D="1" K="7000" mu_coulomb="0" mu_viscous="16" damping="0.003" friction="0.0"/>
+    </joint>
+
+    <link name="${arm_id}_link5">
+      <visual>
+        <origin rpy="0 0 0" xyz="0 0 0"/>
+        <geometry>
+          <mesh filename="package://franka_description/meshes/visual/link5.dae"/>
+        </geometry>
+      </visual>
+      <collision>
+        <origin rpy="0 0 0" xyz="0 0 0"/>
+        <geometry>
+          <mesh filename="package://franka_description/meshes/collision/link5.stl"/>
+        </geometry>
+      </collision>
+      <inertial>
+        <origin rpy="0 0 0" xyz="-1.1953e-02 4.1065e-02 -3.8437e-02"/>
+        <mass value="1.225946"/>
+        <inertia ixx="3.5549e-02" ixy="-2.1170e-03" ixz="-4.0370e-03"
+                                  iyy="2.9474e-02"  iyz="2.2900e-04"
+                                                    izz="8.6270e-03" />
+      </inertial>
+    </link>
+
+    <joint name="${arm_id}_joint5" type="revolute">
+      <safety_controller k_position="100.0" k_velocity="40.0" soft_lower_limit="-2.8973" soft_upper_limit="2.8973"/>
+      <origin rpy="${-pi/2} 0 0" xyz="-0.0825 0.384 0"/>
+      <parent link="${arm_id}_link4"/>
+      <child link="${arm_id}_link5"/>
+      <axis xyz="0 0 1"/>
+      <limit acceleration="15" lower="-2.9671" effort="12" upper="2.9671" velocity="3"/>
+      <dynamics D="1" K="7000" mu_coulomb="0" mu_viscous="16" damping="0.003" friction="0.0"/>
+    </joint>
+
+    <link name="${arm_id}_link6">
+      <visual>
+        <origin rpy="0 0 0" xyz="0 0 0"/>
+        <geometry>
+          <mesh filename="package://franka_description/meshes/visual/link6.dae"/>
+        </geometry>
+      </visual>
+      <collision>
+        <origin rpy="0 0 0" xyz="0 0 0"/>
+        <geometry>
+          <mesh filename="package://franka_description/meshes/collision/link6.stl"/>
+        </geometry>
+      </collision>
+      <inertial>
+        <origin rpy="0 0 0" xyz="6.0149e-02 -1.4117e-02 -1.0517e-02"/>
+        <mass value="1.666555"/>
+        <inertia ixx="1.9640e-03" ixy="1.0900e-04" ixz="-1.1580e-03"
+                                  iyy="4.3540e-03" iyz="3.4100e-04"
+                                                   izz="5.4330e-03" />
+      </inertial>
+    </link>
+
+    <joint name="${arm_id}_joint6" type="revolute">
+      <safety_controller k_position="100.0" k_velocity="40.0" soft_lower_limit="-0.0175" soft_upper_limit="3.7525"/>
+      <origin rpy="${pi/2} 0 0" xyz="0 0 0"/>
+      <parent link="${arm_id}_link5"/>
+      <child link="${arm_id}_link6"/>
+      <axis xyz="0 0 1"/>
+      <limit acceleration="20" lower="-0.0873" effort="12" upper="3.8223" velocity="3"/>
+      <dynamics D="1" K="7000" mu_coulomb="0" mu_viscous="16" damping="0.003" friction="0.0"/>
+    </joint>
+
+    <link name="${arm_id}_link7">
+      <visual>
+        <origin rpy="0 0 0" xyz="0 0 0"/>
+        <geometry>
+          <mesh filename="package://franka_description/meshes/visual/link7.dae"/>
+        </geometry>
+      </visual>
+      <collision>
+        <origin rpy="0 0 0" xyz="0 0 0"/>
+        <geometry>
+          <mesh filename="package://franka_description/meshes/collision/link7.stl"/>
+        </geometry>
+      </collision>
+      <inertial>
+        <origin rpy="0 0 0" xyz="1.0517e-02 -4.252e-03 6.1597e-02"/>
+        <mass value="7.35522e-01"/>
+        <inertia ixx="1.2516e-02" ixy="-4.2800e-04" ixz="-1.1960e-03"
+                                  iyy="1.0027e-02"  iyz="-7.4100e-04"
+                                                    izz="4.8150e-03"/>
+      </inertial>
+    </link>
+
+    <joint name="${arm_id}_joint7" type="revolute">
+      <safety_controller k_position="100.0" k_velocity="40.0" soft_lower_limit="-2.8973" soft_upper_limit="2.8973"/>
+      <origin rpy="${pi/2} 0 0" xyz="0.088 0 0"/>
+      <parent link="${arm_id}_link6"/>
+      <child link="${arm_id}_link7"/>
+      <axis xyz="0 0 1"/>
+      <limit acceleration="20" lower="-2.9671" effort="12" upper="2.9671" velocity="3"/>
+      <dynamics D="1" K="7000" mu_coulomb="0" mu_viscous="16" damping="0.003" friction="0.0"/>
+    </joint>
+
+    <link name="${arm_id}_link8" />
+
+    <joint name="${arm_id}_joint8" type="fixed">
+      <origin rpy="0 0 0" xyz="0 0 0.107"/>
+      <parent link="${arm_id}_link7"/>
+      <child link="${arm_id}_link8"/>
+      <axis xyz="0 0 0"/>
+    </joint>
+
+  </xacro:macro>
+
+  <xacro:macro name="hand" params="connected_to:='' arm_id:='' xyz:='0 0 0' rpy:='0 0 0'">
+    <xacro:include filename="$(find franka_description)/robots/utils.xacro"/>
+
+    <xacro:unless value="${connected_to == ''}">
+      <joint name="${arm_id}_hand_joint" type="fixed">
+        <parent link="${connected_to}"/>
+        <child link="${arm_id}_hand"/>
+        <origin xyz="${xyz}" rpy="${rpy}"/>
+      </joint>
+    </xacro:unless>
+
+    <link name="${arm_id}_hand">
+      <visual>
+        <geometry>
+          <mesh filename="package://franka_description/meshes/visual/hand.dae"/>
+        </geometry>
+      </visual>
+      <collision>
+        <geometry>
+          <mesh filename="package://franka_description/meshes/collision/hand.stl" />
+        </geometry>
+      </collision>
+      <inertial>
+        <mass value="0.73" />
+        <origin xyz="-0.01 0 0.03" />
+        <inertia ixx="0.001" ixy="0"      ixz="0"
+                             iyy="0.0025" iyz="0"
+                                          izz="0.0017" />
+      </inertial>
+    </link>
+
+    <xacro:macro name="finger-collision" params="sign">
+      <!-- screw mount -->
+      <collision>
+        <origin xyz="0 ${sign}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 ${sign}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 ${sign}15.9e-3 28.35e-3" rpy="${sign}${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 ${sign}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:macro>
+
+    <link name="${arm_id}_leftfinger">
+      <xacro:inertia-cylinder mass="15e-3" radius="0.01" h="0.04"/>
+      <visual>
+        <geometry>
+          <mesh filename="package://franka_description/meshes/visual/finger.dae"/>
+        </geometry>
+      </visual>
+      <xacro:finger-collision sign="+" />
+    </link>
+
+    <link name="${arm_id}_rightfinger">
+      <xacro:inertia-cylinder mass="15e-3" radius="0.01" h="0.04"/>
+      <visual>
+        <origin xyz="0 0 0" rpy="0 0 ${pi}"/>
+        <geometry>
+          <mesh filename="package://franka_description/meshes/visual/finger.dae"/>
+        </geometry>
+      </visual>
+      <xacro:finger-collision sign="-" />
+    </link>
+
+    <!-- Friction specific material for Rubber/Rubber contact -->
+    <!-- See: -->
+    <xacro:gazebo-friction link="${arm_id}_leftfinger" mu="1.13" />
+    <xacro:gazebo-friction link="${arm_id}_rightfinger" mu="1.13" />
+
+    <joint name="${arm_id}_finger_joint1" type="prismatic">
+      <parent link="${arm_id}_hand"/>
+      <child link="${arm_id}_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 friction="0.0" damping="0.03"/>
+    </joint>
+
+    <joint name="${arm_id}_finger_joint2" type="prismatic">
+      <parent link="${arm_id}_hand"/>
+      <child link="${arm_id}_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"/>
+      <dynamics friction="0.0" damping="0.03"/>
+      <mimic joint="${arm_id}_finger_joint1" />
+    </joint>
+  </xacro:macro>
+</robot>
diff --git a/robots/utils.xacro b/robots/utils.xacro
new file mode 100644
index 0000000..d6b53a1
--- /dev/null
+++ b/robots/utils.xacro
@@ -0,0 +1,115 @@
+<?xml version="1.0"?>
+<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
+
+
+  <!-- ========================================================== -->
+  <!-- Adds the required tags to simulate one joint in gazebo     -->
+  <!--                                                            -->
+  <!-- joint - Name of the panda 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 panda to simulate (default 'panda') -->
+  <!-- ========================================================== -->
+  <xacro:macro name="transmission-franka-state" params="arm_id:=panda">
+    <transmission name="${arm_id}_franka_state">
+      <type>franka_hw/FrankaStateInterface</type>
+      <joint name="${arm_id}_joint1"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></joint>
+      <joint name="${arm_id}_joint2"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></joint>
+      <joint name="${arm_id}_joint3"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></joint>
+      <joint name="${arm_id}_joint4"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></joint>
+      <joint name="${arm_id}_joint5"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></joint>
+      <joint name="${arm_id}_joint6"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></joint>
+      <joint name="${arm_id}_joint7"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></joint>
+
+      <actuator name="${arm_id}_motor1"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></actuator>
+      <actuator name="${arm_id}_motor2"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></actuator>
+      <actuator name="${arm_id}_motor3"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></actuator>
+      <actuator name="${arm_id}_motor4"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></actuator>
+      <actuator name="${arm_id}_motor5"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></actuator>
+      <actuator name="${arm_id}_motor6"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></actuator>
+      <actuator name="${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 panda to simulate (default 'panda')   -->
+  <!-- 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:=panda root:=panda_joint1 tip:=panda_joint7">
+    <transmission name="${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>
+
+</robot>
-- 
GitLab