ROS-URDF仿真
前言: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-
ROS-URDF仿真的更多相关文章
- ROS学习笔记十二:使用gazebo在ROS中仿真
想要在ROS系统中对我们的机器人进行仿真,需要使用gazebo. gazebo是一种适用于复杂室内多机器人和室外环境的仿真环境.它能够在三维环境中对多个机器人.传感器及物体进行仿真,产生实际传感器反馈 ...
- ROS(URDF机器人建模)
新建功能包mbot_description 在功能包下新建文件config,launch,meshes,urdf. 在launch文件夹下新建文件display_mbot_base_urdf.laun ...
- ROS urdf和xacro文件详解
视觉标签:visual <visual> <origin xyz="0.0 0.0 0.0" /> <geometry> <box siz ...
- Gazebo機器人仿真學習探索筆記(七)连接ROS
中文稍后补充,先上官方原版教程.ROS Kinetic 搭配 Gazebo 7 附件----官方教程 Tutorial: ROS integration overview As of Gazebo 1 ...
- ROS机器人操作系统相关书籍、资料和学习路径
作者:Top Liu链接:https://zhuanlan.zhihu.com/p/30391098来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 本文是易科机器人实验 ...
- ROS机器人导航一 : 从英雄联盟到ROS导航
写在前面: 这是这个系列的第一篇 本系列主要从零开始深入探索ROS(机器人操作系统)的导航和规划. 这个系列的目标,是让大家了解: 1.ROS的导航是怎么实现的 2.认识ROS里各种已有的导航算法,清 ...
- stage_ros的world文件配置方法
官方文档参阅:http://rtv.github.io/Stage/modules.html stage_ros是一个基于stage的2D模拟器,用于ROS的仿真测试.虽然现在越来越多的人在使用gaz ...
- 软件篇-02-基于ZED 2和ORB_SLAM2的SLAM实践
时隔两周,我又回来了. 本期内容如题,ZED 2的SDK功能还是挺多的,包括轨迹跟踪,实时建图等等.虽然由于是商业产品,我看不到他们的源代码,但是根据使用情况来看,ZED 2内部是采用了IMU和光 ...
- ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse
ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse 书中,大部分出现hydro的地方,直接替换为indigo或ja ...
- ROS学习记录(二)————使用smartcar进行仿真(用.xacro文件来运行rviz)
我发现一个学习ROS系统的好网站: 创客智造http://www.ncnynl.com/ 这里面关于ROS的各个方面都有很详细的介绍. 这周,不,上周我对整个ROS是绝望的,我用一个一个下午的时间在敲 ...
随机推荐
- hdu 3697 贪心
#include<stdio.h> #include<stdlib.h> #include<string.h> #define inf 0x3fffffff #de ...
- bzoj4553 [Tjoi2016&Heoi2016]序列 树状数组(区间最大值)+cqd
[Tjoi2016&Heoi2016]序列 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1006 Solved: 464[Submit][ ...
- Linux下汇编语言学习笔记27 ---
这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...
- Codeforces 628D Magic Numbers
题意: 求在[a,b](a,b不含前导0)中的d−magic数中有多少个是m的倍数. 分析: 计数dp Let's call a number d-magic if digit d appears i ...
- SpringBoot学习day01
SpringBoot目的在于创建和启动新的基于Spring框架的项目.SpringBoot会选择最合适的Spring子项目和第三方开源库进行整合.大部分SpringBoot应用只需要非常少量的配置就可 ...
- IE插件
在OA上要直接查看word等公告文件,就必须安装office控件.要安装office控件,需要在IE浏览器中做相应的设置.如何设置呢,下面由小编具体介绍下. 工具/原料 OA IE浏览器 方法/步 ...
- cisco PIX
来自为知笔记(Wiz)
- yarn-cli 显示文件目录
显示yarn bin文件夹的位置. yarn bin yarn bin将打印yarn将为您的软件包安装可执行文件的文件夹.一个可执行文件的例子可能是你已经为你的包定义的脚本,可以通过执行yarn ru ...
- LintCode 近期公共祖先
中等 近期公共祖先 查看执行结果 34% 通过 给定一棵二叉树,找到两个节点的近期公共父节点(LCA). 近期公共祖先是两个节点的公共的祖先节点且具有最大深度. 您在真实的面试中是否遇到过这个题? Y ...
- hdu 1711 KMP算法模板题
题意:给你两个串,问你第二个串是从第一个串的什么位置開始全然匹配的? kmp裸题,复杂度O(n+m). 当一个字符串以0为起始下标时.next[i]能够描写叙述为"不为自身的最大首尾反复子串 ...