ROS - UR3機械臂添加robotiq FT sensor和robotiq 140 2指夾爪


ur3機械臂機器學習平臺代碼

筆者環境:ros kinetic
IDE:roboware 1.2.0,roboware的官方最新版下載地址可查看Ubuntu - 安裝官方最新RoboWare

一、下載ur、robotiq的官方ros package

安裝ur的ros驅動和ros package,可點擊查看詳細信息,下面只把安裝過程列出:

# source global ros
$ source /opt/ros/<your_ros_version>/setup.bash

# create a catkin workspace
$ mkdir -p catkin_ws/src && cd catkin_ws

# clone the driver
$ git clone https://github.com/UniversalRobots/Universal_Robots_ROS_Driver.git src/Universal_Robots_ROS_Driver

# clone fork of the description. This is currently necessary, until the changes are merged upstream.
$ git clone -b calibration_devel https://github.com/fmauch/universal_robot.git src/fmauch_universal_robot

# install dependencies
$ sudo apt update -qq
$ rosdep update
$ rosdep install --from-paths src --ignore-src -y

# build the workspace
$ catkin_make

# activate the workspace (ie: source it)
$ source devel/setup.bash

下載robotiq的ros package

cd ~/catkin_ws/src
git clone https://github.com/ros-industrial/robotiq.git
rosdep install robotiq_modbus_tcp
sudo apt-get install ros-melodic-soem  # 官方是ros-kinetic-soem,要換成對應的ros版本

二、新建一個工作空間,對用到的文件進行裁剪,並裝配ur、ft sensor、gripper

mkdir -p ~/ml_ws/src
cd ~/ml_ws/src
catkin_init_workspace

然後使用roboware打開該工作空間。
現階段,我們只使用到了三個設備的描述文件(description),所以在ml_ws/src下建立ur3robotiq兩個文件夾。將下載robotiq的ros package robotiq中的robotiq_ft_sensorrobotiq_2f_140_gripper_visualization文件夾和ur機械臂的ros package famuch_universal_robot中的ur_description複製一份到~/ml_ws/src文件夾下。最後目錄結構如圖:(ur_moveit_config是後面使用moveit_setup_assistant生成的)
在這裏插入圖片描述
打開roboware,執行ROS->Build。

① 添加ft sensor到ur末端

查看ft sensor的urdf,
在這裏插入圖片描述可以看到整個ft sensor的描述文件在robotiq_ft300.urdf.xacro文件中被描述成了一個宏,並且第一個joint提供了parent *origin等參數,所以只需要給這個宏的參數賦值,就可以將ft sensor集成到新的描述文件中。

查看ur的描述文件ur3.urdf.xacro(這裏使用ur3),
在這裏插入圖片描述
同樣ur3也被聲明爲一個宏。在文件的最後,
在這裏插入圖片描述
可以看到ur3暴露給最外面的link是${prefix}tool0

我們只需要將ft sensor的宏定義的parent賦值爲tool0即可。
同時觀察文件中還有ur3_robot.urdf.xacro文件,這是對調用ur3.urdf.xacro中的宏定義的一個使用示例代碼,同樣的也可以應用於所有的宏定義的調用方式。

新建文件ur3_ft_robot.urdf.xacro,將ur3_robot.urdf.xacro中的代碼(這是對ur3機械臂宏定義的調用)複製過來,並添加robotiq_ft300.urdf.xacro的宏定義的調用。添加如下代碼:

<xacro:include filename="$(find robotiq_ft_sensor)/urdf/robotiq_ft300.urdf.xacro" />
 <!--robotiq FT_300 sernsor-->
 <xacro:robotiq_ft300 prefix="" parent="tool0" >
	<origin xyz="0 0 0" rpy="0 0 0"/> 
</xacro:robotiq_ft300>

最後整個文件的 代碼爲:

<?xml version="1.0"?>
<robot xmlns:xacro="http://wiki.ros.org/xacro"
       name="ur3" >

  <xacro:arg name="transmission_hw_interface" default="hardware_interface/PositionJointInterface"/>

  <!-- common stuff -->
  <xacro:include filename="$(find ur_description)/urdf/common.gazebo.xacro" />

  <!-- ur3 -->
  <xacro:include filename="$(find ur_description)/urdf/ur3.urdf.xacro" />
  <xacro:include filename="$(find robotiq_ft_sensor)/urdf/robotiq_ft300.urdf.xacro" />

  <!-- arm -->
  <xacro:arg name="kinematics_config" default="$(find ur_description)/config/ur3_default.yaml"/>

  <xacro:ur3_robot prefix="" joint_limited="false"
    transmission_hw_interface="$(arg transmission_hw_interface)"
    kinematics_file="${load_yaml('$(arg kinematics_config)')}"
  />

  <link name="world" />

  <joint name="world_joint" type="fixed">
    <parent link="world" />
    <child link = "base_link" />
    <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
  </joint>

  
  <!--robotiq FT_300 sernsor-->
  <xacro:robotiq_ft300 prefix="" parent="tool0" >
		<origin xyz="0 0 0" rpy="0 0 0"/> 
	</xacro:robotiq_ft300>

</robot>

然後,在ur3的ur_description文件夾的launch文件夾下新建view_ur3_ft.launch
此文件是在view_ur3.launch基礎上做了修改。

<?xml version="1.0"?>
<launch>
  <include file="$(find ur_description)/launch/ur3_ft_upload.launch"/>

  <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" >
    <param name="use_gui" value="true"/>
  </node>
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
  <node name="rviz" pkg="rviz" type="rviz" args="-d $(find ur_description)/cfg/view_robot_ft.rviz" required="true" />
</launch>

新建ur3_ft_upload.launch

<?xml version="1.0"?>
<launch>
  <arg name="limited" default="false" doc="If true, limits joint range [-PI, PI] on all joints." />
  <arg name="transmission_hw_interface" default="hardware_interface/PositionJointInterface" />
  <arg name="kinematics_config" default="$(find ur_description)/config/ur3_default.yaml"/>

  <param unless="$(arg limited)" name="robot_description" command="$(find xacro)/xacro --inorder '$(find ur_description)/urdf/ur3_ft_robot.urdf.xacro'
    transmission_hw_interface:=$(arg transmission_hw_interface)
    kinematics_config:=$(arg kinematics_config)" />
  <param if="$(arg limited)" name="robot_description" command="$(find xacro)/xacro --inorder '$(find ur_description)/urdf/ur3_joint_limited_robot.urdf.xacro'
    transmission_hw_interface:=$(arg transmission_hw_interface)
    kinematics_config:=$(arg kinematics_config)" />
</launch>

運行view_ur3_ft.launch,可以看到ft sensor被成功添加。
完整的代碼可參考github上源碼

② 添加robotiq 2 finger 140 gripper

查看gripper的描述文件,就發現複雜的多了,因爲gripper 的組件實在太多。我們慢慢來分析。
robotiq_arg2f_140_model.xacro
在這裏插入圖片描述
是一個對gripper宏定義的調用,類似ur中的ur3_robot.urdf.xacro文件。
根據include,查看robotiq_arg2f_140_model_macro.xacro文件,這裏的宏定義就非常非常多了。
如果不清楚這裏的宏定義分別是對應哪個部位,可以先運行launch文件中的test_2f_140_model.launch文件,在rviz中取消每個link的選擇來查看對應的組件。

在這裏插入圖片描述
robotiq_arg2f_140_model_macro.xacro文件的最後,我們終於看到了整個夾爪的宏定義。
在這裏插入圖片描述
但是奇怪的是它引用了幾個當前文件中沒有的宏定義,還剩一個文件沒看,robotiq_arg2f.xacro,查看這個文件的源碼,發現是對robotiq_arg2f_140_model_macro.xacro文件中的所有宏定義的一個調用,相當於在函數的外面又封裝了一層函數,用來簡化代碼。現在整個描述文件的源碼架構已經被我們搞清楚了。現在來魔改。robotiq gripper的代碼和ft sensor的還不太一樣,需要修改的地方稍多一些。

新建ur3_ft_gripper140_robot.urdf.xacro

<?xml version="1.0"?>
<robot xmlns:xacro="http://wiki.ros.org/xacro"
       name="ur3" >

  <xacro:arg name="transmission_hw_interface" default="hardware_interface/PositionJointInterface"/>

  <!-- common stuff -->
  <xacro:include filename="$(find ur_description)/urdf/common.gazebo.xacro" />

  <!-- ur3 -->
  <xacro:include filename="$(find ur_description)/urdf/ur3.urdf.xacro" />
  <xacro:include filename="$(find robotiq_ft_sensor)/urdf/robotiq_ft300.urdf.xacro" />
  <xacro:include filename="$(find robotiq_2f_140_gripper_visualization)/urdf/robotiq_arg2f_140_model_macro.xacro" />
  <!-- arm -->
  <xacro:arg name="kinematics_config" default="$(find ur_description)/config/ur3_default.yaml"/>

  <xacro:ur3_robot prefix="" joint_limited="false"
    transmission_hw_interface="$(arg transmission_hw_interface)"
    kinematics_file="${load_yaml('$(arg kinematics_config)')}"
  />

  <link name="world" />

  <joint name="world_joint" type="fixed">
    <parent link="world" />
    <child link = "base_link" />
    <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
  </joint>

  
  <!--robotiq FT_300 sernsor-->
  <xacro:robotiq_ft300 prefix="" parent="tool0" >
		<origin xyz="0 0 0" rpy="0 0 0"/> 
	</xacro:robotiq_ft300>

  <xacro:robotiq_arg2f_140 prefix=""/>

  <joint name="ft_gripper_joint" type="fixed">
    <parent link="robotiq_ft_frame_id"/>
    <child link="robotiq_arg2f_base_link"/>
    <origin xyz="0 0 0" rpy="0 0 0"/>
  </joint>
  
</robot>

可以看出這個文件是在ur3_ft_robot.urdf.xacro的基礎上,添加了

<xacro:include filename="$(find robotiq_2f_140_gripper_visualization)/urdf/robotiq_arg2f_140_model_macro.xacro" />

 <xacro:robotiq_arg2f_140 prefix=""/>

  <joint name="ft_gripper_joint" type="fixed">
    <parent link="robotiq_ft_frame_id"/>
    <child link="robotiq_arg2f_base_link"/>
    <origin xyz="0 0 0" rpy="0 0 0"/>
  </joint>

爲什麼要無中生有一個joint出來的,查看ft sensor的宏定義(robotiq_ft300.urdf.xacro文件),可以看到最後暴露的link是在這裏插入圖片描述而gripper的宏定義(robotiq_arg2f_140_model_macro文件),暴露的第一個卻是一個link。
在這裏插入圖片描述
link與link之間需要有一個joint來連接並確定位置。
同樣,在ur_description/launch文件夾新建新的launch文件,view_ur3_ft_gripper140.launch
ur3_ft_gripper140_upload.launch

完整的代碼可參考github上源碼

最後,用moveit_setup_assistant生成新的配置文件,就可以進行moveit規劃。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章