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
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
下建立ur3
和robotiq
兩個文件夾。將下載robotiq的ros package robotiq
中的robotiq_ft_sensor
,robotiq_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規劃。