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是绝望的,我用一个一个下午的时间在敲 ...
随机推荐
- [luoguP1011] 车站(递推)
传送门 蒟蒻我关系式没有找出来. 直接模拟递推过程好了. 代码 #include <cstdio> #define N 21 int a, n, m, x, y; int up[N][2] ...
- [luoguP1077] 摆花(DP)
传送门 f[i][j] 表示前 i 种花,摆 j 盆的方案数 j f[i][j] = Σ f[i - 1][j] k=max(0, j - a[i]) 博客园这个公式该怎么打啊.. ——代码( ...
- hdu 3697 贪心
#include<stdio.h> #include<stdlib.h> #include<string.h> #define inf 0x3fffffff #de ...
- Memory Ordering in Modern Microprocessors
Linux has supported a large number of SMP systems based on a variety of CPUs since the 2.0 kernel. L ...
- lines-HDU5124(区间处理 +离散化)
Problem Description John has several lines. The lines are covered on the X axis. Let A is a point wh ...
- cogs 66. [HAOI2004模拟] 数列问题
66. [HAOI2004模拟] 数列问题 ★☆ 输入文件:dfs3.in 输出文件:dfs3.out 简单对比时间限制:1 s 内存限制:128 MB 问题描述试编程将 1 至 N ...
- Servlet处理日期
以下内容引用自http://wiki.jikexueyuan.com/project/servlet/handling-date.html: 使用Servlet的最重要的优势之一是可以使用核心Java ...
- Lua迭代器
在Lua中我们常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素.迭代器需要保留上一次成功调用的状态和下一次成功调用的状态,可以通过闭包提供的机制来实现这个任务(闭包中的外部局部变量可以用 ...
- CCNA一些要点
考试范围: TK640-801(Cisco Certified Network Associate 640-801 ICND Course Notes). 信息单位: 1Byt ...
- DMA32映射问题
近期在调试PCIe的行情加速卡的驱动.当中使用DMA在CPU和FPGA间数据传输. 最開始使用的是低16M的DMA ZONE的内存,用slab分配器的kmalloc分配获取.但因为最新的需求,须要使用 ...