ROS实践一构建Gazebo机器人模型文件urdf

news2025/3/11 6:54:16

        URDF(Unified Robot Description Format)是一种基于XML的格式,用于描述机器人模型的结构、关节、连杆和传感器信息,并可以与Gazebo、RViz等仿真环境结合使用。

一、基础语法

1. urdf文件组成

URDF 主要由以下几个核心元素(标签)组成:

(1)一级标签(根标签)

<robot> <!--根标签-->

(2)二级标签

        根标签是 robot,而二级标签通常是在 robot 标签内定义的具体组件和元素。以下是一些常见的二级标签:

<link>        <!-- 定义一个刚体部分 -->
<joint>       <!-- 定义两个链接之间的连接及其运动方式 -->
<sensor>      <!-- 定义传感器 -->
<transmission> <!-- 定义传动方式,主要用于控制器与电机连接 -->
<material>    <!-- 定义材质属性 -->
<geometry>    <!-- 定义几何形状,用于可视化 -->
<visual>      <!-- 定义视觉表示,用于渲染和模拟 -->
<collision>   <!-- 定义碰撞体积,用于物理引擎 -->
<inertial>    <!-- 定义惯性矩阵,用于物理仿真 -->
<frame>       <!-- 定义坐标系 -->

(3)三级标签

        在 URDF 中,三级标签通常是用于具体配置和描述某个二级标签的更多详细信息。以下是一些常见的三级标签,它们一般位于二级标签内部。

<geometry>       <!-- 用于定义物体的几何形状 -->
    <box>         <!-- 定义立方体的几何形状 -->
    <cylinder>    <!-- 定义圆柱体的几何形状 -->
    <sphere>      <!-- 定义球形几何形状 -->
    <mesh>        <!-- 定义网格形状 -->
</geometry>

<visual>         <!-- 定义可视化表示 -->
    <material>    <!-- 定义可视化的材质 -->
        <ambient> <!-- 环境光 -->
        <diffuse> <!-- 漫反射光 -->
        <specular> <!-- 高光反射 -->
    </material>
</visual>

<collision>      <!-- 定义碰撞体积 -->
    <geometry>    <!-- 定义碰撞体积的几何形状 -->
        <box>     <!-- 立方体 -->
        <cylinder><!-- 圆柱体 -->
        <sphere>  <!-- 球体 -->
    </geometry>
</collision>

<inertial>       <!-- 定义惯性属性 -->
    <mass>        <!-- 质量 -->
    <inertia>     <!-- 惯性矩阵 -->
</inertial>

<origin>         <!-- 定义元素在坐标系中的位置和姿态 -->
    <xyz>         <!-- 定义位置 -->
    <rpy>         <!-- 定义旋转角度 -->
</origin>

<transmission>   <!-- 定义传动系统 -->
    <actuator>    <!-- 定义执行器 -->
        <hardwareInterface> <!-- 定义硬件接口 -->
    </actuator>
</transmission>

2. <robot>根标签

        URDF 中为了保证 XML 语法的完整性,使用 <robot> 标签作为根标签,所有的 <link><joint> 以及其他标签都必须包含在 <robot> 标签内。在该标签内,可以通过 name 属性设置机器人模型的名称。所有其他标签(如 <link><joint><material><transmission> 等)都是 <robot> 的子级标签。

<?xml version="1.0"?>
<robot name="simple_robot">  <!-- 名称自定 -->
    <!-- 这里是机器人模型的内容 -->
</robot>

3. <link> 和 <joint>

简述:在机器人模型中,link1link2 分别代表类似于人的大臂和小臂的刚体部分,而 joint 则类似于肘关节,负责连接这两个部件并允许它们相对运动(例如,肘部的弯曲)。

(1)<link>

  link 代表机器人中的一个刚性部件,例如机械臂的一个关节、轮式机器人的车轮等。link 主要包含以下元素:

  • <inertial>:描述 link 的惯性,包括质量、质心和惯性矩阵。
  • <visual>:定义 link 的外观(几何形状、颜色、材质)。
  • <collision>:定义物理仿真中 link 的碰撞形状(通常比 visual 简化)。
<?xml version="1.0"?>
<robot name="simple_robot">
    <!-- 定义一个 link -->
    <link name="simple_link">
        <!-- 定义惯性属性 -->
        <inertial>
            <mass value="1.0"/> <!-- 质量 -->
            <origin xyz="0 0 0"/> <!-- 相对坐标 -->
            <inertia ixx="0.1" iyy="0.1" izz="0.1" ixy="0" ixz="0" iyz="0"/> <!-- 惯性矩阵 -->
        </inertial>

        <!-- 定义可视化属性 -->
        <visual>
            <geometry>
                <box size="1 1 1"/> <!-- 立方体形状,尺寸为 1x1x1 -->
            </geometry>
            <material name="green"/> <!-- 绿色 -->
        </visual>

        <!-- 定义碰撞属性 -->
        <collision>
            <geometry>
                <box size="1 1 1"/> <!-- 碰撞盒子,尺寸为 1x1x1 -->
            </geometry>
        </collision>
    </link>
</robot>

(2)<joint>

  joint 用于连接两个 link,并定义它们的相对运动方式,例如固定连接、旋转或滑动等。joint 主要包含以下元素:

  • <parent>:定义 joint 连接的父 link
  • <child>:定义 joint 连接的子 link
  • <type>:定义 joint 的类型(fixedrevoluteprismaticcontinuous 等)。

  • <origin>:定义 joint 相对于 parent 的初始位置。
  • <axis>(可选):如果是 revoluteprismatic 关节,则定义运动轴。
  • <limit>(可选):定义 joint 的运动范围、速度和力矩限制。
<?xml version="1.0"?>
<robot name="simple_robot">
    <!-- 第一个 link -->
    <link name="link1">
        <visual>
            <geometry>
                <box size="1 1 1"/>
            </geometry>
        </visual>
    </link>

    <!-- 第二个 link -->
    <link name="link2">
        <visual>
            <geometry>
                <box size="1 1 1"/>
            </geometry>
        </visual>
    </link>

    <!-- 定义关节,连接 link1 和 link2 -->
    <joint name="simple_joint" type="revolute">
        <parent link="link1"/>
        <child link="link2"/>
        <axis xyz="0 1 0"/>  <!-- 旋转轴:绕 y 轴旋转 -->
        <limit lower="-1.57" upper="1.57" effort="10" velocity="1"/> <!-- 旋转范围限制 -->
    </joint>
</robot>

 4. <sensor>

   <sensor> 标签在 URDF 中用于定义机器人上的传感器,例如激光雷达、相机、IMU(惯性测量单元)等。传感器用于模拟机器人感知环境的能力,在 Gazebo 等仿真环境中非常常见。传感器类型如下所示:

<sensor type="camera"/>  <!-- 相机传感器 -->
<sensor type="ray"/>     <!-- 激光雷达传感器 -->
<sensor type="proximity"/>  <!-- 接近传感器 -->
<sensor type="imu"/>     <!-- 惯性测量单元传感器 -->
<sensor type="force_torque"/>  <!-- 力与扭矩传感器 -->
<sensor type="gps"/>     <!-- 全球定位系统传感器 -->
<sensor type="contact"/> <!-- 接触传感器 -->
<sensor type="barometer"/>  <!-- 气压计传感器 -->
<sensor type="ultrasonic"/>  <!-- 超声波传感器 -->
<sensor type="range"/>   <!-- 距离传感器 -->

        不同类型的传感器(如相机、IMU、激光雷达等)会有不同的子标签和配置项,具体内容会根据传感器的类型而变化。这里将不太过多介绍标签,详细查看其他博客,这里主要是为了让读者了解其结构框架。激光雷达传感器如下所示:

<robot name="example_robot">
    <!-- 定义一个 Link -->
    <link name="base_link">
        <visual>
            <geometry>
                <box size="1 1 1"/>
            </geometry>
        </visual>
    </link>

    <!-- 定义一个传感器 (激光雷达) -->
    <sensor name="laser_sensor" type="ray">
        <origin xyz="0 0 1" rpy="0 0 0"/> <!-- 定义传感器相对于 link 的位置和姿态 -->
        <ray>
            <scan>
                <horizontal>
                    <samples value="720"/>  <!-- 扫描样本数量 -->
                    <resolution value="1"/> <!-- 扫描分辨率 -->
                    <min_angle value="-1.5708"/> <!-- 最小扫描角度 (单位: 弧度) -->
                    <max_angle value="1.5708"/> <!-- 最大扫描角度 (单位: 弧度) -->
                </horizontal>
            </scan>
            <range>
                <min value="0.1"/>  <!-- 最小测距距离 -->
                <max value="10.0"/> <!-- 最大测距距离 -->
                <resolution value="0.01"/> <!-- 测距分辨率 -->
            </range>
        </ray>
    </sensor>
</robot>
  • <sensor> 标签
    这是根标签,定义了一个传感器的相关信息。

    • name:传感器的名称(在本例中为 laser_sensor)。
    • type:传感器的类型(在本例中为 ray,表示激光雷达)。
  • <origin> 标签
    这个标签定义了传感器相对于父 link 的位置和姿态。

    • xyz="0 0 1":表示传感器在父 link 坐标系中的位置。xyz 表示位置的偏移量。
    • rpy="0 0 0":表示传感器的旋转姿态,rpy 表示滚转(roll)、俯仰(pitch)、偏航(yaw)的角度,这里都是 0,表示没有旋转。
  • <ray> 标签
    这个标签用于定义激光传感器的具体扫描行为。

    • <scan> 标签:定义扫描的相关参数。

      • <horizontal> 标签:定义水平扫描的参数。
    • <range> 标签:定义传感器的测距范围。

二、 使用launch文件启动rviz查看机器人模型

注意:什么类型的文件就要放在功能包的什么目录下,没有则手动创建该目录。

 1. 编写机器人模型的urdf文件。

my_car.urdf

<?xml version="1.0" ?>
<robot name="my_robot">
    
    <!-- 材质 -->
    <material name="blue">
        <color rgba="0.0 0.0 1.0 1.0"/>
    </material>
    <material name="black">
        <color rgba="0.0 0.0 0.0 1.0"/>
    </material>

    <!-- 机器人主体 -->
    <link name="base_link">
        <visual>
            <geometry>
                <box size="0.4 0.3 0.2"/>
            </geometry>
            <material name="blue"/>
        </visual>
    </link>

    <!-- 左右轮子 -->
    <link name="wheel_left">
        <visual>
            <geometry>
                <cylinder radius="0.05" length="0.02"/>
            </geometry>
            <material name="black"/>
        </visual>
    </link>

    <link name="wheel_right">
        <visual>
            <geometry>
                <cylinder radius="0.05" length="0.02"/>
            </geometry>
            <material name="black"/>
        </visual>
    </link>

    <!-- 摄像头 -->
    <link name="camera_link">
        <visual>
            <geometry>
                <box size="0.1 0.1 0.1"/>
            </geometry>
            <material name="black"/>
        </visual>
    </link>

    <!-- 前轮(万向轮) -->
    <link name="front_wheel">
        <visual>
            <geometry>
                <cylinder radius="0.05" length="0.02"/>  <!-- 更改为圆形 -->
            </geometry>
            <material name="black"/>
        </visual>
    </link>

    <!-- 轮子关节(旋转类型) -->
    <joint name="wheel_left_joint" type="revolute">
        <parent link="base_link"/>
        <child link="wheel_left"/>
        <origin xyz="-0.1 -0.15 -0.1" rpy="1.5708 0 0"/>  <!-- 旋转90° -->
        <axis xyz="0 0 1"/>  <!-- 旋转轴设置为X轴,确保向前滚动 -->
        <limit effort="100" velocity="1.0" lower="-1.0" upper="1.0"/>
    </joint>

    <joint name="wheel_right_joint" type="revolute">
        <parent link="base_link"/>
        <child link="wheel_right"/>
        <origin xyz="-0.1 0.15 -0.1" rpy="1.5708 0 0"/>
        <axis xyz="0 0 1"/>  <!-- 旋转轴设置为X轴,确保向前滚动 -->
        <limit effort="100" velocity="1.0" lower="-1.0" upper="1.0"/>
    </joint>

    <!-- 摄像头关节(固定) -->
    <joint name="camera_joint" type="fixed">
        <parent link="base_link"/>
        <child link="camera_link"/>
        <origin xyz="0.1 0 0.15"/>
    </joint>

    <!-- 前轮关节(固定) -->
    <joint name="front_wheel_joint" type="fixed">
        <parent link="base_link"/>
        <child link="front_wheel"/>
        <!-- 将z坐标调整为-0.12,确保万向轮能挨到地面 -->
        <origin xyz="0.15 0 -0.12" rpy="1.5708 0 0"/>
    </joint>

</robot>

2. 编写launch文件。

mycar_rviz.launch

<launch>
    <!-- 传入参数,决定是否启用图形界面 -->
    <arg name="gui" default="true" />
    
    <!-- 加载 URDF 机器人模型 -->
    <param name="robot_description" command="$(find xacro)/xacro $(find robot_vslam)/urdf/my_car.urdf"/>
    
    <!-- 机器人状态发布器 -->
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher">
        <param name="use_sim_time" value="false"/>
    </node>

    <!-- 关节状态发布器(如果机器人有 Revolute/Prismatic 关节) -->
    <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher">
        <param name="use_gui" value="false"/> <!-- 这里设置为 false,避免重复图形化界面 -->
    </node>

    <!-- 关节状态发布器图形界面(可选,基于 "gui" 参数) -->
    <node name="joint_state_publisher_gui" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" if="$(arg gui)" />

    <!-- 启动 RViz -->
    <node name="rviz" pkg="rviz" type="rviz" required="true">
        <param name="config" value="$(find robot_vslam)/rviz/robot.rviz"/>
    </node>
</launch>


3. 运行launch,查看效果。

运行完后,界面中没有机器人模型,我们需要先添加模型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2313095.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++学习——哈希表(一)

文章目录 前言一、哈希表的模板代码二、哈希计数器三、哈希表中的无序映射四、哈希表的总结 前言 本文为《C学习》的第11篇文章&#xff0c;今天学习最后一个数据结构哈希表&#xff08;散列表&#xff09;。 一、哈希表的模板代码 #include<iostream> using namespace…

DeepSeek R1在医学领域的应用与技术分析(Discuss V1版)

DeepSeek R1作为一款高性能、低成本的国产开源大模型,正在深刻重塑医学软件工程的开发逻辑与应用场景。其技术特性,如混合专家架构(MoE)和参数高效微调(PEFT),与医疗行业的实际需求紧密结合,推动医疗AI从“技术驱动”向“场景驱动”转型。以下从具体业务领域需求出发,…

Git 如何配置多个远程仓库和免密登录?

自我简介&#xff1a;4年导游&#xff0c;10年程序员&#xff0c;最近6年一直深耕低代码领域&#xff0c;分享低代码和AI领域见解。 通用后台管理系统 代号&#xff1a;虎鲸 缘由 每次开发后台界面都会有很多相同模块&#xff0c;尝试抽离出公共模块作为快速开发的基座。 目标…

【Linux篇】从冯诺依曼到进程管理:计算机体系与操作系统的核心逻辑

&#x1f4cc; 个人主页&#xff1a; 孙同学_ &#x1f527; 文章专栏&#xff1a;Liunx &#x1f4a1; 关注我&#xff0c;分享经验&#xff0c;助你少走弯路&#xff01; 文章目录 1.冯诺依曼体系结构存储分级理解数据流动 2. 操作系统(Operator System)2.1 概念2.2 设计OS的…

【Linux docker】关于docker启动出错的解决方法。

无论遇到什么docker启动不了的问题 就是 查看docker状态sytemctl status docker查看docker日志sudo journalctl -u docker.service查看docker三个配置文件&#xff1a;/etc/docker/daemon.json&#xff08;如果存在&#xff09; /etc/systemd/system/docker.service&#xff…

【医院内部控制专题】7.医院内部控制环境要素剖析(三):人力资源政策

医院成本核算、绩效管理、运营统计、内部控制、管理会计专题索引 一、引言 在当今医疗行业竞争日益激烈的背景下,医院内部控制的重要性愈发凸显。内部控制作为医院管理的关键组成部分,对于保障医院资产安全、提高会计信息质量、提升运营效率以及实现战略目标起着至关重要的…

计算机网络——交换机

一、什么是交换机&#xff1f; 交换机&#xff08;Switch&#xff09;是局域网&#xff08;LAN&#xff09;中的核心设备&#xff0c;负责在 数据链路层&#xff08;OSI第二层&#xff09;高效转发数据帧。它像一位“智能交通警察”&#xff0c;根据设备的 MAC地址 精准引导数…

CentOS7离线部署安装Dify

离线部署安装Dify 在安装 Dify 之前&#xff0c;请确保您的机器满足以下最低系统要求&#xff1a; CPU > 2 核 内存 > 4 GiB 1.安装docker和docker compose 启动 Dify 服务器最简单的方式是通过docker compose。因此现在服务器上安装好docker和docker compose&#xf…

力扣hot100_二叉树(4)_python版本

一、199. 二叉树的右视图 思路&#xff1a; 直接复用层序遍历的代码&#xff0c;然后取每层的最后一个节点代码&#xff1a; class Solution:def rightSideView(self, root: Optional[TreeNode]) -> List[int]:层序遍历取每层的第一个if not root: return []res []queue …

bug-Ant中a-select的placeholder不生效(绑定默认值为undefined)

1.问题 Ant中使用a-select下拉框时&#xff0c;placeholder设置输入框显示默认值提示&#xff0c;vue2ant null与undefined在js中明确的区别&#xff1a; null&#xff1a;一个值被定义&#xff0c;定义为“空值” undefined&#xff1a;根本不存在定义 2.解决 2.1 a-select使…

颠覆语言认知的革命!神经概率语言模型如何突破人类思维边界?

颠覆语言认知的革命&#xff01;神经概率语言模型如何突破人类思维边界&#xff1f; 一、传统模型的世纪困境&#xff1a;当n-gram遇上"月光族难题" 令人震惊的案例&#xff1a;2012年Google语音识别系统将 用户说&#xff1a;“我要还信用卡” 系统识别&#xff…

练习:关于静态路由,手工汇总,路由黑洞,缺省路由相关

这是题目,我已经画分好了网段,题目要求是这样的: 划分网段 我为什么一个网段划了6个可用IP(一个网段8个地址)呢,因为我刚开始吧环回接口理解成一个主机了,导致我认为两个环回主机在一个网段,其实每个网段只需要2个地址就可以完成这个练习,我懒得划了,就按第一张图的网段来吧…

J6打卡——pytorch实现ResNeXt-50实现猴痘检测

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 1.检查GPU import torch import torch.nn as nn import torchvision.transforms as transforms import torchvision from torchvision import transforms, d…

vue+dhtmlx-gantt 实现甘特图-快速入门【甘特图】

文章目录 一、前言二、使用说明2.1 引入依赖2.2 引入组件2.3 引入dhtmlx-gantt2.4 甘特图数据配置2.5 初始化配置 三、代码示例3.1 Vue2完整示例3.2 Vue3 完整示例 四、效果图 一、前言 dhtmlxGantt 是一款功能强大的甘特图组件&#xff0c;支持 Vue 3 集成。它提供了丰富的功…

音视频入门基础:RTP专题(16)——RTP封装音频时,音频的有效载荷结构

一、引言 《RFC 3640》和《RFC 6416》分别定义了两种对MPEG-4流的RTP封包方式&#xff0c;这两个文档都可以从RFC官网下载&#xff1a; RFC Editor 本文主要对《RFC 3640》中的音频打包方式进行简介。《RFC 3640》总共有43页&#xff0c;本文下面所说的“页数”是指在pdf阅读…

超分之DeSRA

Desra: detect and delete the artifacts of gan-based real-world super-resolution models.DeSRA&#xff1a;检测并消除基于GAN的真实世界超分辨率模型中的伪影Xie L, Wang X, Chen X, et al.arXiv preprint arXiv:2307.02457, 2023. 摘要 背景&#xff1a; GAN-SR模型虽然…

Ubuntu用户安装cpolar内网穿透

前言 Cpolar作为一款体积小巧却功能强大的内网穿透软件&#xff0c;不仅能够在多种环境和应用场景中发挥巨大作用&#xff0c;还能适应多种操作系统&#xff0c;应用最为广泛的Windows、Mac OS系统自不必多说&#xff0c;稍显小众的Linux、树莓派、群辉等也在起支持之列&#…

小程序事件系统 —— 33 事件传参 - data-*自定义数据

事件传参&#xff1a;在触发事件时&#xff0c;将一些数据作为参数传递给事件处理函数的过程&#xff0c;就是事件传参&#xff1b; 在微信小程序中&#xff0c;我们经常会在组件上添加一些自定义数据&#xff0c;然后在事件处理函数中获取这些自定义数据&#xff0c;从而完成…

【Java学习】包装类

面向对象系列九 包装类变量 一、装箱 1.实例化包装对象 2.静态缓存池 3.写法 二、拆箱 包装类变量 每个基本数据类型都有对应的基本类型的包装类变量&#xff0c;将基本数据类型通过对应的包装类对象载入着进入到类与对象面向对象体系 一、装箱 Integer.valueOf(int) —…

中国自动化领域零部件研究报告

一、引言 1.1 研究背景与目的 随着科技的飞速发展&#xff0c;自动化技术已成为推动各行业转型升级的关键力量。中国自动化领域零部件行业在近年来取得了显著进展&#xff0c;市场规模持续扩大&#xff0c;技术水平不断提升。在政策支持与市场需求的双重驱动下&#xff0c;中…