前言:URDF (标准化机器人描述格式),是一种用于描述机器人及其部分结构、关节、自由度等的XML格式文件。

一、首先做一个带有四个轮子的机器人底座。

1.1 新建urdf文件

在chapter4_tutorials/robot1_description/urdf文件夹下新建robot1.urdf文件,内容如下:

<?xml version="1.0"?>
<robot name="robot1">     <link name="base_link"><visual><geometry><box size="0.2 .3 .1"/></geometry><origin rpy="0 0 0" xyz="0 0 0.05"/><material name="white"><color rgba="1 1 1 1"/></material></visual><collision><geometry><box size="0.2 .3 0.1"/></geometry></collision><inertial><mass value="100"/><inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/></inertial>        </link><link name="wheel_1"><visual><geometry><cylinder length="0.05" radius="0.05"/></geometry><origin rpy="0 1.5 0" xyz="0.1 0.1 0"/><material name="black"><color rgba="0 0 0 1"/></material></visual><collision><geometry><cylinder length="0.05" radius="0.05"/></geometry></collision><inertial><mass value="10"/><inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/></inertial></link><link name="wheel_2"><visual><geometry><cylinder length="0.05" radius="0.05"/></geometry><origin rpy="0 1.5 0" xyz="-0.1 0.1 0"/><material name="black"/></visual><collision><geometry><cylinder length="0.05" radius="0.05"/></geometry></collision><inertial><mass value="10"/><inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/></inertial></link><link name="wheel_3"><visual><geometry><cylinder length="0.05" radius="0.05"/></geometry><origin rpy="0 1.5 0" xyz="0.1 -0.1 0"/><material name="black"/></visual><collision><geometry><cylinder length="0.05" radius="0.05"/></geometry></collision><inertial><mass value="10"/><inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/></inertial></link><link name="wheel_4"><visual><geometry><cylinder length="0.05" radius="0.05"/></geometry><origin rpy="0 1.5 0" xyz="-0.1 -0.1 0"/><material name="black"/></visual><collision><geometry><cylinder length="0.05" radius="0.05"/></geometry></collision><inertial><mass value="10"/><inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/></inertial></link><joint name="base_to_wheel1" type="fixed"><parent link="base_link"/><child link="wheel_1"/><origin xyz="0 0 0"/></joint><joint name="base_to_wheel2" type="fixed"><parent link="base_link"/><child link="wheel_2"/><origin xyz="0 0 0"/></joint><joint name="base_to_wheel3" type="fixed"><parent link="base_link"/><child link="wheel_3"/><origin xyz="0 0 0"/></joint><joint name="base_to_wheel4" type="fixed"><parent link="base_link"/><child link="wheel_4"/><origin xyz="0 0 0"/></joint>
</robot>

解析:urdf文件主要有link和joint组成。

<robot name="robot1">   机器人标签,机器人名字为robot1

<link name="base_link">  连杆标签,连杆名字为base_link

<visual>  可视化属性

<geometry>  形状

<box size="0.2 .3 .1"/>   方形,尺寸为0.2m*0.3m*1m

<origin rpy="0 0 0" xyz="0 0 0.05"/>  起点位置无位移,绕z轴旋转。

<material name="white">  材料名称为白色

<color rgba="1 1 1 1"/>  颜色属性为1 1 1 1

<collision>

<inertial>

<mass value="100"/>

<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>

<joint name="base_to_wheel1" type="fixed">  joint标签,关节名称为base_to_wheel1,类型为固定。continuous为绕某一轴旋转

<parent link="base_link"/>  父连杆是base_link

<child link="wheel_1"/>子连杆是wheel_1

<origin xyz="0 0 0"/>   起点位置无偏移。注:这里的起点是相对与父连杆的位置,并不是绝对坐标。

为了检查书写的语法是否正确和配置是否有误,可以使用语法检查工具

check_urdf robot1.urdf

-------------------------------------------

显示如下:

robot name is: Robot1
---------- Successfully Parsed XML ---------------
root Link: base_link has 4 child(ren)
child(1): wheel1
child(2): wheel2
child(3): wheel3
child(4): wheel4

查询工具(可选)

使用urdf_to_graphiz命令工具:

urdf_to_graphiz robot1.urdf

生成两个文件:robot1.pdf和robot1.gv

直接查看robot1.pdf或者使用命令:

evince Robot1.pdf

-------------------------------------------

显示如下:

1.2 在rviz里查看3D模型

新建launch文件

在robot_description/launch文件夹下新建display.launch文件,代码如下:

<?xml version="1.0"?>
<launch><arg name="model" /><arg name="gui" default="False" /><param name="robot_description" textfile="$(arg model)" /><param name="use_gui" value="$(arg gui)"/><node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" /><node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" /><node name="rviz" pkg="rviz" type="rviz" args="-d $(find urdf_tutorial)/urdf.rviz" />
</launch>

运行launch文件

roslaunch chapter4_tutorials display.launch model:=/home/cdq/dev/catkin_ws/src/chapter4_tutorials/robot1_description/robot1.urdf

注意:不要把冒号和等号写反了,文件位置信息可以把文件直接拖进终端就会显示出来。

--------------------------------------------

显示如下:

默认状态下画面中什么都没有,此时需要做出调整。

在左下角的add按钮中添加RobotModel,然后将Fixed Frame选为base_link

二、添加基座臂、连接臂和夹持臂

2.1 补充urdf文件

在</robot>前增添以下代码:

<link name="arm_base">
<visual>
<geometry>
<box size="0.1 .1 .1"/>
</geometry>
<origin rpy="0 0 0" xyz="0 0 0.1"/>
<material name="white">
<color rgba="1 1 1 1"/>
</material>
</visual>
<collision>
<geometry>
<box size="0.1 .1 .1"/>
</geometry>
</collision>
<inertial>
<mass value="1"/>
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
</inertial>
</link>
<joint name="base_to_arm_base" type="continuous">
<parent link="base_link"/>
<child link="arm_base"/>
<axis xyz="0 0 1"/>
<origin xyz="0 0 0"/>
</joint>
<link name="arm_1">
<visual>
<geometry>
<box size="0.05 .05 0.5"/>
</geometry>
<origin rpy="0 0 0" xyz="0 0 0.25"/>
<material name="white">
<color rgba="1 1 1 1"/>
</material>
</visual>
<collision>
<geometry>
<box size="0.05 .05 0.5"/>
</geometry>
</collision>
<inertial>
<mass value="1"/>
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
</inertial>
</link>
<joint name="arm_1_to_arm_base" type="revolute">
<parent link="arm_base"/>
<child link="arm_1"/>
<axis xyz="1 0 0"/>
<origin xyz="0 0 0.15"/>
<limit effort ="1000.0" lower="-1.0" upper="1.0" velocity="0.5"/>
</joint>
<link name="arm_2">
<visual>
<geometry>
<box size="0.05 0.05 0.5"/>
</geometry>
<origin rpy="0 0 0" xyz="0.06 0 0.15"/>
<material name="white">
<color rgba="1 1 1 1"/>
</material>
</visual>
<collision>
<geometry>
<box size="0.05 .05 0.5"/>
</geometry>
</collision>
<inertial>
<mass value="1"/>
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
</inertial>
</link>
<joint name="arm_2_to_arm_1" type="revolute">
<parent link="arm_1"/>
<child link="arm_2"/>
<axis xyz="1 0 0"/>
<origin xyz="0.0 0 0.45"/>
<limit effort ="1000.0" lower="-2.5" upper="2.5" velocity="0.5"/>
</joint>
<joint name="left_gripper_joint" type="revolute">
<axis xyz="0 0 1"/>
<limit effort="1000.0" lower="0.0" upper="0.548" velocity="0.5"/>
<origin rpy="0 -1.57 0" xyz="0.06 0 0.4"/>
<parent link="arm_2"/>
<child link="left_gripper"/>
</joint>
<link name="left_gripper">
<visual>
<origin rpy="0 0 0" xyz="0 0 0"/>
<geometry>
<mesh filename="package://pr2_description/meshes/gripper_v0/l_finger.dae"/>
</geometry>
</visual>
<collision>
<geometry>
<box size="0.1 .1 .1"/>
</geometry>
</collision>
<inertial>
<mass value="1"/>
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
</inertial>
</link>
<joint name="left_tip_joint" type="fixed">
<parent link="left_gripper"/>
<child link="left_tip"/>
</joint>
<link name="left_tip">
<visual>
<origin rpy="0.0 0 0" xyz="0.09137 0.00495 0"/>
<geometry>
<mesh filename="package://pr2_description/meshes/gripper_v0/l_finger_tip.dae"/>
</geometry>
</visual>
<collision>
<geometry>
<box size="0.1 .1 .1"/>
</geometry>
</collision>
<inertial>
<mass value="1"/>
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
</inertial>
</link>
<joint name="right_gripper_joint" type="revolute">
<axis xyz="0 0 -1"/>
<limit effort="1000.0" lower="0.0" upper="0.548" velocity="0.5"/>
<origin rpy="0 -1.57 0" xyz="0.06 0 0.4"/>
<parent link="arm_2"/>
<child link="right_gripper"/>
</joint>
<link name="right_gripper">
<visual>
<origin rpy="-3.1415 0 0" xyz="0 0 0"/>
<geometry>
<mesh filename="package://pr2_description/meshes/gripper_v0/l_finger.dae"/>
</geometry>
</visual>
<collision>
<geometry>
<box size="0.1 .1 .1"/>
</geometry>
</collision>
<inertial>
<mass value="1"/>
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
</inertial>
</link>
<joint name="right_tip_joint" type="fixed">
<parent link="right_gripper"/>
<child link="right_tip"/>
</joint>
<link name="right_tip">
<visual>
<origin rpy="-3.1415 0 0" xyz="0.09137 0.00495 0"/>
<geometry>
<mesh filename="package://pr2_description/meshes/gripper_v0/l_finger_tip.dae"/>
</geometry>
</visual>
<collision>
<geometry>
<box size="0.1 .1 .1"/>
</geometry>
</collision>
<inertial>
<mass value="1"/>
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
</inertial>
</link>

2.2 显示3D图形

roslaunch chapter4_tutorials display.launch model:=/home/cdq/dev/catkin_ws/src/chapter4_tutorials/robot1_description/urdf/robot1.urdf  

-----------------------------------------

如果终端显示错误:

[rospack] Error: package 'pr2_description' not found........

则需要安装pr2模型文件

sudo apt-get install ros-kinetic-pr2-common

-----------------------------------------

如果显示如下警告,请忽视,程序正常运行:

libGL error: failed to create drawable
TIFFFieldWithTag: Internal error, unknown tag 0x829a.
TIFFFieldWithTag: Internal error, unknown tag 0x829d.
TIFFFieldWithTag: Internal error, unknown tag 0x8822.

......

2.3 使机器人运动

配合joint_state_publisher,调用gui功能:

 roslaunch chapter4_tutorials display.launch model:=/home/cdq/dev/catkin_ws/src/chapter4_tutorials/robot1_description/urdf/robot1.urdf gui:=ture

--------------------------------------------------

显示如下:

urdf文件中每一个axis对应一个调节器,joint_state_publisher应该是ros中自带的调节joint的功能,所以直接调用就可以。

如在arm_1_to_arm_base上所使用的限制通过<limit effort="1000.0"lower="-1.0"upper="1.0"velocity="0.5"/>这一行设置,可以用axis xyz="100"选择转动轴来运动。

<limit>标签用于选择以下属性:

effort(关节所承受的最大力),lower(赋值给关节的下限,旋转关节的单位是弧度,移动关节的单位是米),upper(赋值给关节的上限),velocity(强制关节的最大速度)。

-END-

转载于:https://www.cnblogs.com/chendeqiang/p/10205874.html

ROS-URDF仿真相关推荐

  1. 为期两个月的MATLAB与ROS联合仿真探索总结——因为热爱,所以无所畏惧

       2021年的9月底收到老师的委托之后,开始着手使用MATLAB探索开发一些实验,控制对象为ROS中的仿真小车    为什么要用MATLAB呢?因为这个实验是面向机器人专业的全体学生的,而不是个别 ...

  2. 从零开始学ros小车仿真

    从零开始学ros小车仿真 从零开始学ros小车仿真 目录 1.从零开始学ros小车仿真(一)在solidworks中建模小车并转出为urdf文件 2.从零开始学ros小车仿真(二)在rviz中检验导入 ...

  3. ROS | Gazebo仿真—阿克曼(Ackermann)四轮小车模型

    ROS | Gazebo仿真-阿克曼(Ackermann)四轮小车模型 1. 仿真描述 2. Gazebo简介 2.1 Gazebo的典型用途 2.2 Gazebo的主要特点 3. ros_contr ...

  4. ROS | URDF模型—阿克曼(Ackermann)四轮小车模型

    ROS | URDF模型-阿克曼(Ackermann)四轮小车模型 1. 模型描述 2. URDF文件 3. link元素 4. link属性详解 5. joint元素 6. joint属性详解 7. ...

  5. MATLAB与ROS联合仿真(慕羽)虚拟机镜像文件使用方法

       前段时间进行了为期两个月的MATLAB与ROS联合仿真探索开发,现将仿真时,我搭建的虚拟机镜像的具体情况,及使用方法进行介绍说明    一.该虚拟机镜像的具体情况    大家,拿到手后是一个名为 ...

  6. Turtlebot+ROS Stage仿真环境实现MPC轨迹跟踪

    在无人车系统(十一):轨迹跟踪模型预测控制(MPC)原理与python实现[40行代码]中介绍了MPC方法在无人车轨迹跟踪中的应用.以Udacity中的例子作为引子,详细介绍了MPC的原理,无人车的运 ...

  7. ROS导航仿真和多点导航3——实现机器人巡检功能

    ROS导航仿真和多点导航3--实现机器人巡检功能 0.代码分享 1.主要结构梳理 2.任务初始化类class TaskInit 3.创建TaskTransfer对象,实现机器人从一个路径点到另一个路径 ...

  8. PX4无人机ROS下仿真开发

    PX4无人机ROS下仿真开发 Overview Simulation Px4_control Slam Map Image_process Planning Volans 项目地址volans 注:有 ...

  9. ROS robotiq仿真开闭控制的几种方法

    robotiq二指手抓在实验室和工厂广泛使用,比较普遍的就是UR机器人结合robotiq手抓. 由于手头没有实体手抓,所以都是在ROS中仿真使用的.在网上找资料的时候,也尝试了多种控制手抓开闭的方式, ...

  10. 基于paddledetection在ROS中搭建红绿灯检测控制车模运动(3)—— 使用训练结果在ros中仿真红绿灯控制小车运动

    前言 第一节: 基于paddledetection在ROS中搭建红绿灯检测控制车模运动(1)-- 环境搭建准备以及软件安装 第二节: 基于paddledetection在ROS中搭建红绿灯检测控制车模 ...

最新文章

  1. boost::mpl::greater_equal相关的测试程序
  2. [转]php-fpm配置具体解释
  3. 软件oem要注意什么_化妆品OEM客户要着重注意这3个基本点,不然就吃大亏了
  4. EF with (LocalDb)V11.0
  5. 突破变态限制快捷方式提权法
  6. 复旦nlp实验室 nlp-beginner 任务三:基于注意力机制的文本匹配
  7. [牛年第一贴 09.2.1] 51CTO 编辑部的那些事儿
  8. 18650锂电池保护板接线图_锂电池保护板的过流保护测试方案
  9. 豆瓣电影top250信息爬取
  10. System.Net.Sockets空间
  11. 铜陵市商标注册申请流程以及阶段时间介绍
  12. DllNotFoundException
  13. Python网络爬虫:PPT素材
  14. 数显之家快讯:【SHIO世硕心语】2021年,给实体经济企业家的二十条建议!
  15. 综述:当医学影像遇上深度学习
  16. Android中的run-as命令引出升降权限的安全问题
  17. 《深入浅出SQL》问答录
  18. Android----------Diglog对话框
  19. 俄罗斯方块源码分享 html+css+js
  20. LeetCode题解(0594):计算最长和谐子序列(Python)

热门文章

  1. 使用微软Outlook的收件Rule规则自动删除垃圾邮件
  2. SAP Cloud for Customer Business Configuration的权限控制
  3. http报文格式_理解数据通信协议的报文格式有何用?
  4. servlet的注解开发
  5. 如何开启linux的dhcp服务器,怎么开启DHCP服务器啊
  6. python类中init_Python类中的__init__() 和 self 的解析
  7. micropython esp8266教程_ESP8266 快速开发指南
  8. php写接口多页面,PHP开发很火的随机毒鸡汤网页和API接口
  9. mysql改国标码_MySQL 优化实施方案
  10. 怎样把项目上传服务器,怎样将项目上传云服务器