ROS仿真机器人---URDF的XML格式描述学习笔记(wiki教程)

一.link

<link>标签用于描述机器人某个刚体部分的外观物理属性,包括尺寸(size)、颜色(color)、形状(shape)惯性矩阵(inertial matrix)、碰撞参数(collision properties)等。

link结构一般如下所示:

<link name="link_name">
    <inertial> ...... </inertial>
    <visual> ...... </visual>
    <collision> ...... </collision>
</link>

(1)属性:

name:link自身的名称(必须要用引号括起)

(2)子元素:

<visual>标签用于描述机器人link部分的外观参数

<inertial>标签用于描述link的惯性参数

<collision>标签用于描述link的碰撞属性

下面具体介绍三个元素:三个元素都是可选项,在link标签下可有可无

1.<inertial>

<inertial> (惯性参数)
    <origin xyz="..." rpy="..." /> (初始坐标,可选,如果没有指定则使用默认值, 这是惯性参考系相对于link参考系的姿态。惯性参考系的原点必须位于重心。惯性参考系的轴不需要与惯性主轴对齐。)
        xyz (optional: defaults to zero vector,xyz坐标,表示偏移量,单位为米)
        rpy (optional: defaults to identity if not specified,绕x、y、z轴旋转,单位为弧度)
      
    <mass />
       link的质量由mass的值属性表示 

    <inertia />
        3x3转动惯量矩阵,在惯量框架中表示。由于转动惯量矩阵是对称的,因此此处仅指定该矩阵对角线元素上方的6个元素,使用属性ixx、ixy、ixz、iyy、iyz、izz。 

</inertial>

2.<visual>

<geometry>属性是必须要有的

<visual name="..."> (定义外观属性,此元素指定用于可视化目的的对象(框、圆柱体等)的形状)
(注意:同一个link可以有多个visual标签,它们定义的几何图形的联合形成了link的视觉表示)
    name (visual名称,可选,指定link几何图形的一部分的名称。这对于能够参考link几何结构的特定位很有用。
    <origin xyz="..." rpy="..." /> 
 
    <geometry> (必须要有的属性,描述link的几何形状,可从一下四种中选择)
        <box> 矩形,大小属性包含三个边长,原点在其中心.
        <cylinder> 圆柱,指定半径和长度,原点在其中心.
        <sphere> 球体,指定半径,原点在其中心.
        <mesh filename="package://pkg_description/meshs/name.dae" /> 通过该标签可以导入该模型的mesh文件
    </geometry>

    <material name="..."> (可选,可视化元素的材质)
        name 材料名称
        <color rgba="...." /> (可选,rgb是颜色值,a是透明度,数值范围在0-1)        
        <texture /> (可选,材质的纹理可通过文件名指定)
    </material>

</visual>

3.<collision>

检测碰撞的link区域大于外观可视区域,这就意味着只要其他物体与collision区域相交,就认为link发生碰撞。

<collision name="..."> (link的碰撞属性,同一个link可存在多个collision)
    <origin xyz="..." rpy="..." /> (可选)
    <geometry>
        与前述相同
    </geometry>
</collision>

<collision>标签中的内容与<visual>标签中的内容几乎一致,这是因为我们使用的模型都是较为简单的规则模型,如果使用真实机器人的设计模型,<visual>标签内可显示复杂的机器人外观,但为了减少碰撞检测时的计算量,<collision>中往往使用简化后的机器人模型,例如将机械臂的一根连杆简化成为圆柱体或者长方体。

二.joint

joint元素描述了机器人关节的运动学和动力学属性,包括关节运动的位置和速度限制,并且指定了关节的安全限制。

joint的结构一般如下所示:

<joint name="..." type="...">
    <parent link="parent_link" />
    <child link="child_link" />
    <calibration ...... />
    <dynamics damping ...... />
    <limit effort ...... />
    ......
</joint>

(1)属性:

joint元素中拥有两个属性

  1. name (必需的):指定joint的名字(唯一的)
  2. type (必需的):指定joint的类型,有下列选项:
  • revolute - 旋转关节,可绕单轴旋转,但有旋转的角度极限。
  • continuous - 旋转关节,可以绕单轴无限旋转
  • prismatic - 滑动关节,可以沿着一个轴滑动,有最大值和最小值限制。
  • fixed - 这不是一个实际的关节,因为它无法运动,所有的自由度都被锁定。这种类型的关节不需要指定轴、动力学特征、标度和最大值最小值限制。
  • floating - 浮动关节,允许进行平移、旋转运动(是一个具有6个自由度的关节)。
  • planar - 此关节在一个平面内运动,垂线是运动轴。

(2)子元素:

<origin xyz="..." rpy="...">从parent link到child link的变换,joint位于child link的原点,具体如图所示。
    xyz (optional: defaults to zero vector)
        代表x,y,z轴方向上的偏移,单位米。 
    rpy (optional: defaults 'to zero vector 'if not specified)
        代表绕着固定轴旋转的角度:roll绕着x轴,pitch绕着y轴,yaw绕着z轴,用弧度表示。 

<parent link="..." /> (必要的,parent link的名字是一个强制的属性)
    link
        parent link的名字,是这个link在机器人结构树中的名字。 

<child link="..." /> (必要的,child link的名字是一个强制的属性)
    link
        child link的名字,是这个link在机器人结构树中的名字。 
<axis xyz="..." /> (optional: defaults to (1,0,0))
joint的axis轴在joint的坐标系中。这是revolute joint旋转的轴,prismatic joint移动的轴,是planar joint的标准平面。
这个轴在joint坐标系中被指定。fixed和floating类型的joint不需要用到这个字段。
    xyz (必要的,代表轴向量的x,y,z分量,这应该是一个标准化的向量。)

<calibration  /> (可选择的,joint的参考点,用来矫正joint的绝对位置。)
    rising (可选择的,当joint正向运动时,参考点会触发一个上升沿。)
    falling (可选择的,当joint正向运动时,参考点会触发一个下降沿。) 

<dynamics  /> (可选择的,该元素用来指定joint的物理性能。它的值被用来描述joint的建模性能,尤其是在仿真的时候。)
    damping (optional, defaults to 0)
        joint的阻尼值。(移动关节为(N*s)/m ,旋转关节为(N*m*s)/rad)
    friction (optional, defaults to 0)
        joint的摩擦力值。(移动关节为N, 旋转关节为N*m)

<limit> (required only for revolute and prismatic joint)
    该元素包含以下属性:
    lower (optional, defaults to 0)
    指定joint运动范围下界的属性(revolute joint的单位为弧度,prismatic joint的单位为米),连续型的joint忽略该属性。 
    upper (optional, defaults to 0)
    指定joint运动范围上界的属性(revolute joint的单位为弧度,prismatic joint的单位为米),连续型的joint忽略该属性。 
    effort (必要的,该属性指定了joint运行时的最大的力。)
    velocity (必要的,该属性指定了joint运行时的最大的速度。)

<mimic> (optional)
    这个标签用于指定已定义的joint来模仿已存在的joint。
    这个joint的值可以用以下公式计算 value = multiplier * other_joint_value + offset. 
    有如下可选的属性: 
    joint (必要的,需要模仿的joint的名字。)
    multiplier (optional)
    指定上述公式中的乘数因子。 
    offset (optional)
    指定上述公式中的偏移项。默认值为0(revolute joint的单位为弧度,prismatic joint的单位为米)。

<safety_controller> (optional)
    该元素包含下列属性:
    soft_lower_limit (optional, defaults to 0)
    该属性指定了joint安全控制边界的下界,是joint安全控制的起始限制点。这个值需要大于上述的limit中的lower值。 
    soft_upper_limit (optional, defaults to 0)
    该属性指定了joint安全控制边界的上界,是joint安全控制的起始限制点。这个值需要小于上述的limit中的upper值。
    k_position (optional, defaults to 0,本属性用于说明位置和速度之间的关系。) 
    k_velocity (必要的,本属性用于说明力和速度之间的关系。 

 

 

参考:

胡春旭:《ROS机器人开发实践》

http://wiki.ros.org/urdf/XML

http://www.guyuehome.com/372

搭建自己的机器人模型需要进行以下步骤: 1. 安装ROS仿真工具包 2. 创建ROS包和机器人模型 3. 编写机器人控制程序 4. 启动仿真环境并加载机器人模型 5. 运行机器人控制程序,观察仿真结果 下面是一个简单的机器人模型搭建示例,使用ROS Kinetic和Gazebo仿真工具包: 1. 安装ROS仿真工具包 在Ubuntu系统中使用以下命令安装ROS Kinetic和Gazebo仿真工具包: ``` sudo apt-get update sudo apt-get install ros-kinetic-desktop-full sudo apt-get install ros-kinetic-gazebo-ros-pkgs ros-kinetic-gazebo-ros-control ``` 2. 创建ROS包和机器人模型 使用以下命令创建一个名为my_robot的ROS包,并在其中创建一个名为urdf的目录用于存放机器人模型文件: ``` mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src catkin_create_pkg my_robot cd my_robot mkdir urdf ``` 在urdf目录中创建一个名为my_robot.urdf机器人模型文件,内容如下: ```xml <?xml version="1.0"?> <robot name="my_robot" xmlns:xacro="http://www.ros.org/wiki/xacro"> <link name="base_link"> <visual> <geometry> <box size="0.3 0.3 0.1"/> </geometry> </visual> </link> <joint name="base_joint" type="fixed"> <parent link="world"/> <child link="base_link"/> <origin xyz="0 0 0.05"/> </joint> <link name="left_wheel_link"> <visual> <geometry> <cylinder length="0.05" radius="0.1"/> </geometry> </visual> </link> <joint name="left_wheel_joint" type="continuous"> <parent link="base_link"/> <child link="left_wheel_link"/> <origin xyz="0.15 0 -0.05"/> <axis xyz="0 1 0"/> </joint> <link name="right_wheel_link"> <visual> <geometry> <cylinder length="0.05" radius="0.1"/> </geometry> </visual> </link> <joint name="right_wheel_joint" type="continuous"> <parent link="base_link"/> <child link="right_wheel_link"/> <origin xyz="0.15 0 0.05"/> <axis xyz="0 1 0"/> </joint> </robot> ``` 这个机器人模型由一个长方体的底座和两个圆柱形的轮子组成,使用URDF格式描述。其中base_link表示机器人的底座,left_wheel_link和right_wheel_link分别表示左右两个轮子。 3. 编写机器人控制程序 在ROS包的src目录中创建一个名为my_robot_control.cpp的控制程序文件,内容如下: ```cpp #include <ros/ros.h> #include <geometry_msgs/Twist.h> int main(int argc, char** argv) { ros::init(argc, argv, "my_robot_control"); ros::NodeHandle nh; ros::Publisher cmd_vel_pub = nh.advertise<geometry_msgs::Twist>("cmd_vel", 10); ros::Rate loop_rate(10); while (ros::ok()) { geometry_msgs::Twist cmd_vel; cmd_vel.linear.x = 0.1; cmd_vel.angular.z = 0.5; cmd_vel_pub.publish(cmd_vel); ros::spinOnce(); loop_rate.sleep(); } return 0; } ``` 这个控制程序使用ROS的Twist消息类型发布机器人的线速度和角速度,以控制机器人的运动。在这个示例中,机器人线速度为0.1,角速度为0.5。 4. 启动仿真环境并加载机器人模型 使用以下命令启动Gazebo仿真环境,并加载机器人模型: ``` roslaunch my_robot my_robot.launch ``` 在my_robot包中创建一个名为my_robot.launch的启动文件,内容如下: ```xml <?xml version="1.0"?> <launch> <arg name="model" default="$(find my_robot)/urdf/my_robot.urdf"/> <param name="robot_description" textfile="$(arg model)" /> <node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-urdf -model my_robot -param robot_description -x 0 -y 0 -z 0"/> <node name="my_robot_control" type="my_robot_control" pkg="my_robot"/> <node name="gazebo_gui" pkg="gazebo" type="gazebo"/> </launch> ``` 这个启动文件首先将机器人模型文件加载到ROS参数服务器中,然后使用gazebo_ros包的spawn_model节点将机器人模型加载到Gazebo仿真环境中。同时运行my_robot_control程序节点控制机器人运动。最后启动Gazebo仿真环境的GUI界面。 5. 运行机器人控制程序,观察仿真结果 使用以下命令运行my_robot_control程序节点,控制机器人运动: ``` rosrun my_robot my_robot_control ``` 可以观察到仿真环境中的机器人开始运动,同时在控制程序的终端输出中可以看到机器人的线速度和角速度。 下图为搭建自己的机器人模型的结果截图: ![ROS机器人仿真结果截图](https://i.imgur.com/lv9v5a1.png)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值