分别创建两个功能包,分别为dual_ur_description和dual_ur_gazebo,前者存放ur5的双臂模型文件,后者存放Gazebo的相关文件。

1 dual_ur_description

在dual_ur_description中将官方提供的ur_description功能包中的所有文件放入,在urdf文件中新建dual_ur5_robot.urdf.xacrodual_ur5_joint_limited_robot.urdf.xacro两个文件,前者表示关节运动不限制的ur5双臂模型,后者在前者的基础上增加了关节限制。此外还需要在launch文件夹中创建dual_ur5_upload.launch文件,用于将双臂ur5模型的xacro文件上传至参数服务器。

1.1 dual_ur5_robot.urdf.xacro

dual_ur5_robot.urdf.xacro代码如下:

<?xml version="1.0"?>
<robot xmlns:xacro="http://wiki.ros.org/xacro"   name="dual_ur" ><!--grey--><material name="grey"><color rgba="0.5 0.5 0.5 1.0"/></material><material name="black"><color rgba="0.0 0.0 0.0  1.0"/></material><!-- prefix of two arms --><xacro:property name="prefix1" value="left_" /><xacro:property name="prefix2" value="right_" /><!-- transmission --><xacro:arg name="transmission_hw_interface" default="hardware_interface/PositionJointInterface"/><!-- common stuff --><xacro:include filename="$(find dual_ur_description)/urdf/common.gazebo.xacro" /><!-- ur5 --><xacro:include filename="$(find dual_ur_description)/urdf/ur5.urdf.xacro" /><!-- arm --><!-- left_arm --><xacro:ur5_robot prefix="left_" joint_limited="false"transmission_hw_interface="$(arg transmission_hw_interface)"/><!-- right_arm --><xacro:ur5_robot prefix="right_" joint_limited="false"transmission_hw_interface="$(arg transmission_hw_interface)"/><link name="world" /><joint name="${prefix1}world_joint" type="fixed"><parent link="world" /><child link = "${prefix1}base_link" /><origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" /></joint><joint name="${prefix2}world_joint" type="fixed"><parent link="world" /><child link = "${prefix2}base_link" /><origin xyz="1 1 0" rpy="0 0 3.1415926" /></joint></robot>

关键部分:

<!-- ur5 --><xacro:include filename="$(find dual_ur_description)/urdf/ur5.urdf.xacro" /><!-- arm --><!-- left_arm --><xacro:ur5_robot prefix="left_" joint_limited="false"transmission_hw_interface="$(arg transmission_hw_interface)"/><!-- right_arm --><xacro:ur5_robot prefix="right_" joint_limited="false"transmission_hw_interface="$(arg transmission_hw_interface)"/>

首先载入ur5.urdf.xacro模型文件,这个是官方提供的单个ur5的模型文件,而后分别调用该文件创建了左右两个ur5机械臂。

  <link name="world" /><joint name="${prefix1}world_joint" type="fixed"><parent link="world" /><child link = "${prefix1}base_link" /><origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" /></joint><joint name="${prefix2}world_joint" type="fixed"><parent link="world" /><child link = "${prefix2}base_link" /><origin xyz="1 1 0" rpy="0 0 3.1415926" /></joint>

而后分别给两个机械臂创建了两个与世界坐标系固连的关节,注意这两个关节的<orgin/>标签下的设置,可以理解为双臂各自基坐标系的相对位置。

1.2 dual_ur5_joint_limited_robot.urdf.xacro

dual_ur5_joint_limited_robot.urdf.xacro代码如下:

<?xml version="1.0"?>
<robot xmlns:xacro="http://wiki.ros.org/xacro"   name="dual_ur" ><!--grey--><material name="grey"><color rgba="0.5 0.5 0.5 1.0"/></material><material name="black"><color rgba="0.0  0.0  0.0  1.0"/></material><!-- prefix of two arms --><xacro:property name="prefix1" value="left_" /><xacro:property name="prefix2" value="right_" /><!-- transmission --><xacro:arg name="transmission_hw_interface" default="hardware_interface/PositionJointInterface"/><!-- common stuff --><xacro:include filename="$(find dual_ur_description)/urdf/common.gazebo.xacro" /><!-- ur10 --><xacro:include filename="$(find dual_ur_description)/urdf/ur5.urdf.xacro" /><!-- arm --><xacro:ur5_robot prefix="${prefix1}" joint_limited="true"shoulder_pan_lower_limit="${-pi}" shoulder_pan_upper_limit="${pi}"shoulder_lift_lower_limit="${-pi}" shoulder_lift_upper_limit="${pi}"elbow_joint_lower_limit="${-pi}" elbow_joint_upper_limit="${pi}"wrist_1_lower_limit="${-pi}" wrist_1_upper_limit="${pi}"wrist_2_lower_limit="${-pi}" wrist_2_upper_limit="${pi}"wrist_3_lower_limit="${-pi}" wrist_3_upper_limit="${pi}"transmission_hw_interface="$(arg transmission_hw_interface)"/><xacro:ur5_robot prefix="${prefix2}" joint_limited="true"shoulder_pan_lower_limit="${-pi}" shoulder_pan_upper_limit="${pi}"shoulder_lift_lower_limit="${-pi}" shoulder_lift_upper_limit="${pi}"elbow_joint_lower_limit="${-pi}" elbow_joint_upper_limit="${pi}"wrist_1_lower_limit="${-pi}" wrist_1_upper_limit="${pi}"wrist_2_lower_limit="${-pi}" wrist_2_upper_limit="${pi}"wrist_3_lower_limit="${-pi}" wrist_3_upper_limit="${pi}"transmission_hw_interface="$(arg transmission_hw_interface)"/><link name="world" /><joint name="${prefix1}world_joint" type="fixed"><parent link="world" /><child link = "${prefix1}base_link" /><origin xyz="0.0 0.0 0.70" rpy="0.0 0.0 0.0" /></joint><joint name="${prefix2}world_joint" type="fixed"><parent link="world" /><child link = "${prefix2}base_link" /><origin xyz="-0.00640616 1.95586 0.70" rpy="-3.13636 3.11726 0.00817339" /></joint></robot>

和前者类似,对比着看。

1.3 dual_ur5_upload.launch

dual_ur5_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" /><param unless="$(arg limited)" name="robot_description" command="$(find xacro)/xacro --inorder '$(find dual_ur_description)/urdf/dual_ur5_robot.urdf.xacro' transmission_hw_interface:=$(arg transmission_hw_interface)" /><param if="$(arg limited)" name="robot_description" command="$(find xacro)/xacro --inorder '$(find dual_ur_description)/urdf/dual_ur5_joint_limited_robot.urdf.xacro' transmission_hw_interface:=$(arg transmission_hw_interface)" />
</launch>

前者设置limited参数,默认为false,也可以在启动该launch文件时设置该参数,当limited为false时,解析dual_ur5_robot.urdf.xacro文件,反之解析dual_ur5_joint_limited_robot.urdf.xacro文件。

2 dual_ur_gazebo

同样将官方提供的ur_gazebo文件拷贝进来,在controller文件夹中新建arm_controller_dual_ur.yaml文件,用于加载Gazebo中的控制器参数,在launch文件中新建和dual_ur5.launch用于启动双臂ur5的仿真平台。

2.1 arm_controller_dual_ur.yaml

arm_controller_dual_ur.yaml代码如下:

left_arm_controller:type: position_controllers/JointTrajectoryControllerjoints:- left_shoulder_pan_joint- left_shoulder_lift_joint- left_elbow_joint- left_wrist_1_joint- left_wrist_2_joint- left_wrist_3_jointconstraints:goal_time: 0.6stopped_velocity_tolerance: 0.05left_shoulder_pan_joint: {trajectory: 0.1, goal: 0.1}left_shoulder_lift_joint: {trajectory: 0.1, goal: 0.1}left_elbow_joint: {trajectory: 0.1, goal: 0.1}left_wrist_1_joint: {trajectory: 0.1, goal: 0.1}left_wrist_2_joint: {trajectory: 0.1, goal: 0.1}left_wrist_3_joint: {trajectory: 0.1, goal: 0.1}stop_trajectory_duration: 0.5state_publish_rate:  25action_monitor_rate: 10
joint_group_position_controller:type: position_controllers/JointGroupPositionControllerjoints:- left_shoulder_pan_joint- left_shoulder_lift_joint- left_elbow_joint- left_wrist_1_joint- left_wrist_2_joint- left_wrist_3_joint- right_shoulder_pan_joint- right_shoulder_lift_joint- right_elbow_joint- right_wrist_1_joint- right_wrist_2_joint- right_wrist_3_joint
right_arm_controller:type: position_controllers/JointTrajectoryControllerjoints:- right_shoulder_pan_joint- right_shoulder_lift_joint- right_elbow_joint- right_wrist_1_joint- right_wrist_2_joint- right_wrist_3_jointconstraints:goal_time: 0.6stopped_velocity_tolerance: 0.05right_shoulder_pan_joint: {trajectory: 0.1, goal: 0.1}right_shoulder_lift_joint: {trajectory: 0.1, goal: 0.1}right_elbow_joint: {trajectory: 0.1, goal: 0.1}right_wrist_1_joint: {trajectory: 0.1, goal: 0.1}right_wrist_2_joint: {trajectory: 0.1, goal: 0.1}right_wrist_3_joint: {trajectory: 0.1, goal: 0.1}stop_trajectory_duration: 0.5state_publish_rate:  25action_monitor_rate: 10

2.2 dual_ur5.launch

dual_ur5.launch代码如下:

<?xml version="1.0"?>
<launch><arg name="limited" default="false"  doc="If true, limits joint range [-PI, PI] on all joints." /><arg name="paused" default="false" doc="Starts gazebo in paused mode" /><arg name="gui" default="true" doc="Starts gazebo gui" /><arg name="transmission_hw_interface" default="hardware_interface/PositionJointInterface" /><!-- startup simulated world --><include file="$(find gazebo_ros)/launch/empty_world.launch"><arg name="world_name" default="$(find dual_ur_gazebo)/world/light.world"/><arg name="paused" value="$(arg paused)"/><arg name="gui" value="$(arg gui)"/></include><!-- send robot urdf to param server --><include file="$(find dual_ur_description)/launch/dual_ur5_upload.launch"><arg name="transmission_hw_interface" value="$(arg transmission_hw_interface)"/><arg name="limited" value="$(arg limited)"/></include><!-- push robot_description to factory and spawn robot in gazebo --><node name="spawn_gazebo_model" pkg="gazebo_ros" type="spawn_model" args="-urdf -param robot_description -model robot -z 1" respawn="false" output="screen" /><include file="$(find dual_ur_gazebo)/launch/controller_utils.launch"/><!-- start this controller --><rosparam file="$(find dual_ur_gazebo)/controller/arm_controller_dual_ur.yaml" command="load"/><node name="arm_controller_spawner" pkg="controller_manager" type="controller_manager" args="spawn left_arm_controller" respawn="false" output="screen"/><node name="arm_controller_spawner2" pkg="controller_manager" type="controller_manager" args="spawn right_arm_controller" respawn="false" output="screen"/><!-- load other controllers --><node name="ros_control_controller_manager" pkg="controller_manager" type="controller_manager" respawn="false" output="screen" args="load joint_group_position_controller" /></launch>

关键代码如下:

  <arg name="limited" default="false"  doc="If true, limits joint range [-PI, PI] on all joints." /><arg name="paused" default="false" doc="Starts gazebo in paused mode" /><arg name="gui" default="true" doc="Starts gazebo gui" /><arg name="transmission_hw_interface" default="hardware_interface/PositionJointInterface" />

设置一些参数,limited默认为false。

  <!-- startup simulated world --><include file="$(find gazebo_ros)/launch/empty_world.launch"><arg name="world_name" default="$(find dual_ur_gazebo)/world/light.world"/><arg name="paused" value="$(arg paused)"/><arg name="gui" value="$(arg gui)"/></include>

加载Gazebo的仿真世界,这里的light.world是我自定义的在空世界的基础上加了一个光源的世界,也可以换成Gazebo自带的empty.world。

  <!-- send robot urdf to param server --><include file="$(find dual_ur_description)/launch/dual_ur5_upload.launch"><arg name="transmission_hw_interface" value="$(arg transmission_hw_interface)"/><arg name="limited" value="$(arg limited)"/></include>

包含上述所写的dual_ur5_upload.launch文件,将ur5双臂模型上传至参数服务器。

  <!-- push robot_description to factory and spawn robot in gazebo --><node name="spawn_gazebo_model" pkg="gazebo_ros" type="spawn_model" args="-urdf -param robot_description -model robot -z 1" respawn="false" output="screen" />

Gazebo从参数服务器中载入该模型文件。

  <!-- start this controller --><rosparam file="$(find dual_ur_gazebo)/controller/arm_controller_dual_ur.yaml" command="load"/><node name="arm_controller_spawner" pkg="controller_manager" type="controller_manager" args="spawn left_arm_controller" respawn="false" output="screen"/><node name="arm_controller_spawner2" pkg="controller_manager" type="controller_manager" args="spawn right_arm_controller" respawn="false" output="screen"/><!-- load other controllers --><node name="ros_control_controller_manager" pkg="controller_manager" type="controller_manager" respawn="false" output="screen" args="load joint_group_position_controller" />

加载一些控制器,包括刚刚所写的arm_controller_dual_ur.yaml配置文件。

3 最后

启动dual_ur5.launch文件即可,具体操作双臂见ur5双臂Gazebo仿真。

4 参考

本文参考https://github.com/Liuyvjin/shixi_dual_ur开源项目进行改写。

5 源码

本文代码连接:https://github.com/Wujinshan/dual_ur5

双臂UR5的Gazebo配置相关推荐

  1. UR5+robotiq_85_gripper GAZEBO模拟视觉抓取平台仿真-1

    由于疫情原因不能进入实验室,遂学习在仿真环境gazebo下利用UR5机械臂搭建模拟平台,此模拟平台可以用于UR5机械臂通用视觉抓取平台.以下是个人总结一些观点,仅供参考. 运行环境:ubuntu16. ...

  2. ROS仿真笔记之——gazebo配置velodyne

    之前博客<ROS仿真笔记之--基于gazebo的event camera仿真(dvs gazebo)>介绍了在gazebo里面配置dvs sensor,本博文将velodyne也加上,并且 ...

  3. UR5 Gazebo仿真配置(不使用MoveIt)

    文章目录 1. Introduction 1.1 动机 1.2 概述 1.3 前置技能 2. 机器人模型描述 2.1 URDF 2.2 xacro 2.3 UR 模型 2.4 创建精简的ur5_des ...

  4. gazebo+rviz中配置UR+robotiq_gripper夹爪,最详细操作过程

    gazebo中配置robotiq 1.下载功能包 1.UR机器人功能包下载 2.Robotiq功能包下载 插件修改 2.gazebo仿真所需代码 1.修改urdf文件 2.创建yaml文件 3.创建l ...

  5. 【ros学习】14.urdf、xacro机器人建模与rviz、gazebo仿真详解

    一.起因 学校的这学期课程是ros机器人开发实战,我们学习小组也要搞一个自己的机器人模型,我们组又叫葫芦组,所以我就做了个葫芦形状的机器人,虽说有点丑,本来想用maya建模再导入的,奈何不太懂maya ...

  6. ur5+moveit 3D perception功能应用

    moveit中自带3D perception(3D感知)功能,简单来说,就是支持外部传感器(如kinect, realsense等),能够将其采集的点云或深度数据,转换为octomap(八叉树),并添 ...

  7. moveit和gazebo的联合抓取仿真

    moveit和gazebo的联合抓取仿真 部分代码来源: UR5+robotiq_85_gripper GAZEBO模拟视觉抓取平台仿真 我的代码仓库 GAZEBO new ur5_gazebo.la ...

  8. 教程 | 阿克曼结构移动机器人的gazebo仿真(五)

    第四章.用xacro优化URDF并配置gazebo仿真插件 1►前言 上节用简易模型写了一个小车的URDF代码,这一节将用xacro对其进行优化,这里我并不打算用宏对参数进行封装,因为我个人觉得这样看 ...

  9. gazebo添加末端六维力传感器

    gazebo添加末端六维力传感器 建立六维力矩传感器模型 将传感器拼接到机器人模型 配置传感器gazebo参数 常用的机器人只支持位置控制,但实际运用中,却对末端力控制有迫切的需求,其中一种常用的方法 ...

最新文章

  1. cmd应用基础 扫盲教程
  2. 话筒增益_话筒啸叫怎么办?教你四个解决话筒啸叫的方法!
  3. antdesign的表单中的下拉框设置默认值BUG处理
  4. 操作系统之进程管理:15、哲学家进餐问题
  5. DockOne微信分享( 一零二):基于容器的日志管理实践
  6. STP协议:生成树协议(二层防环机制:防止网桥网络中冗余链路形成环路工作)
  7. 用VB评估数学表达式
  8. 添加网站验证,让搜索引擎收录你的网站
  9. 算法心得:高效算法的奥秘 作者:[美] Henry S. Warren, Jr.
  10. 2004度精华软件总结
  11. ipad里excel文件计算机,ipad怎么看excel和Word?ipad查看Word和Excel文件
  12. C语言源代码系列-管理系统之电子英汉词典
  13. c语言递归函数的运行步骤,c语言中递归函数的运行过程?
  14. 基于stm32单片机的模拟IIC时序(附源码)
  15. 社区分享|TensorFlow Recommenders-Addons 开源啦!
  16. MySQL索引详解之索引的利弊以及高效使用
  17. 51Nod-1298 圆与三角形
  18. 基金训练营学习笔记7-止盈
  19. 在Manjaro、Arch下安装fcitx5、RIME、五笔
  20. 70+分级调色lut预设 Psychedelia LUTs Pack无水印

热门文章

  1. LeetCode 1310 子数组异或查询
  2. 编写有效用例笔记- 第六章 前置条件、触发事件和保证
  3. 一本书读懂财报 | 资产负债表剖析
  4. threejs基础下:贴图资源加载与光照
  5. 使用vite插件编写tsx文件
  6. THREADED_EXECUTION
  7. 如何处理授权和监督?
  8. 蜗牛君漫聊设计模式---建造者模式
  9. 计算机公共基础知识(N-S图,DFD图,PAD图,程序流程图,E-R图)
  10. RediSearch一个媲美es的全文搜索引擎