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 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 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 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 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 zcmZ>*D9A4=Nlj5mE6UGRaLP%|OGz!#HPSP;RM03cO;Rw>WFQIXFfuUwwT;|=^$ml) z*)!FB7giYTW!lbb`*>E%zR2xfd*wW@*}huDv`10$(VkEITWvip4EHfGxLW4#n}4Hl z|LnQhb_z}J_avq_+W35twq3hdey?z6qm7lrbDP`88TNdd8nm}NDs~?O!=DLFHcM6} z+p99X+NW$}W3xpq&Q@V|%RcUDOnX*Nh__{%)3UE1#Bvws&2_fsv%L2)F!=0DvCq6_ zxHtI86FV0(OWS!JjWz;ZEjA6ombM{}&e>YuKW;O*P{mfDtkEW``??JS!<S37_J8*? z*fp?l?$wS9xAoo8XR~B>%f5^+ezsc|UAB##?{2L%Khai0N@921oR)nI4EhJ_?f<`J z+^a18-3D0(S%;dvv+d>gjW+Wa?6ziL*uckZ-`yF!_d!#%{bO|oTaD^Qo8FtEwlaTy z+LSCmWozW1W1FkH)TYtwr0vZVS6c>#>lf<wPmDgdXZM4>wz7LY_MTgI!S?mT0vm}k zzrDWquGoHR@3d^Sbl&UvzR@PMb+0u8gSxQp{<Ee+_NSuX*)=d*?UlNJ&bDmXVViDG z)x9$`&)TZUvDo@V$?cu};I6G()F~SVhO05r`)^;7+52M_vpsSgAnQOjiGd;DZRGyb zTmReH9aBMx^F^$Fd$j|$+dP|%8vhIomJ?3zb7M>0FLyk^PFUf<p6X7Qy<ava?L)S& zKgx2iUuC1sM6qTY28NyAwe1r(>h2W}v9))!lC<T^KV!>#UI-<uki(FH;n+;ReXGxx z?%)2d+^(*0!k+C_jW#ib=C;Ub3^iRb8aC|fvUJ*8)l+VNJ#5DARG$;JW$Qw1=VdI~ zbL{j<+g-a|ZIMl4U~sAl-PiRrVegG!l_)xpRk8lm-K|#HXp`RMV#~nrBQ4wRe~G2N zX`GsU*S-pyInUnN@>L1iUXjzZ*}jm$ZnDOG8}*-`t+{r5uoYb-VavcUZ*Q!9OTuTn zjQ6tp<j#B9UV41h)@2#<9^_P6BxqzC62fg;G#iu>-!Mn*O|(w2XYzlxZ|8EWJr9?y zvAt96gOVqZ^9lol-nRCA0`XDyyL6xJW0l#q$6t1hZA`p7N{;H2zq%)9j)$!_*p3~4 zD)xU{CBOIbsw_L?m_kmKs3~!`rRu)-H_Gj2v$)u$Yd7vO_GGp*OxL&Bxv*`|1Q!Oo zt7d0yV*YjR77<~wYtL`DVPJ^meYiKeq13+kXsaEv46+Vp6X)GK4l~$Y{rkp-f#Kvt z)BPu|`0mwUGO<UF=g#Zgdp~BKwq2^CfKsk7FhoE2xNrUe7W;rAGy8tt3wzjaowVJn zX=R&Zes53Amg}}w{))E9x)~U>eu(XV>}0n0RGyzbvJA3)$R;r`ghzVY-#j5~-@3`s z4!Jal-e_jK{>FXVfBy0|N`KvKk2hYhb>nHWVPGgys<of{?D3vJDKR@_8RYT<*(3&r zjyLf(zKnJD>lXdB{cv-ab<q<RJHJZ|Hg~!2?~Yu+VmG1F(x&`7n@#9%X1jUc3Tzk{ zK5pA$7i?>9|Iu8)9y#?ju`jck@$$XxGa(k+VAhQ`->m-IhA?liVPM!g$=&Y6trGjF zk~lkLvygS8>PUQ{Zd<gk+`hE6&JH=IkaZx(ECYk`y9oQWxs3KVHPrT<O221wYxNe} z)XByuDIYbpPp;Z-x935S{nk$pP-+8L)^3}WEh}wnR{QR2*!S1wbEdWJS#a82Kkbuk z?8_wkYidvTA*({JOSF#}+Nfo(vz1=ywU2>e{(eonmiLwR)~S5^T2HFkL^QD2c`DfM zQaLl##xIY_?v3`E-BXtH+I*^Gw%f5wY7Ya$p$Ap=$8WgpJM_rNws(4{ZN5(bo<G+s z_Wh`ivsK!vy648smVL;v$-v+;zs_El>%`tUGkI;1RUy|Us5+vS3E2Hjm$Scp+0~wZ zl9u(?71wPqC%f1_JQi-l&T!NAd5D!QYFWZDNp*j^hJ(FK0hirmw�pcK)?ho*ZxU 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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 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 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