2026/4/9 0:46:49
网站建设
项目流程
为什么网站打开是空白,ui交互设计案例,长沙最好网站建设,如何建立公司网页ROS是机器人操作系统#xff0c;当然要给机器人使用啦#xff0c;不过在使用之前#xff0c;还得让ROS认识下我们使用的机器人#xff0c;如何把一个机器人介绍给ROS呢#xff1f; 为此#xff0c;ROS专门提供了一种机器人建模方法——URDF#xff0c;用来描述机器人外观…ROS是机器人操作系统当然要给机器人使用啦不过在使用之前还得让ROS认识下我们使用的机器人如何把一个机器人介绍给ROS呢为此ROS专门提供了一种机器人建模方法——URDF用来描述机器人外观、性能等各方面属性。一、URDF语法1.1 机器人的组成建模描述机器人的过程中我们自己需要先熟悉机器人的组成和参数比如机器人一般是由硬件结构、驱动系统、传感器系统、控制系统四大部分组成市面上一些常见的机器人无论是移动机器人还是机械臂我们都可以按照这四大组成部分进行分解。其中硬件结构就是底盘、外壳、电机等实打实可以看到的设备驱动系统就是可以驱使这些设备正常使用的装置比如电机的驱动器电源管理系统等传感系统包括电机上的编码器、板载的IMU、安装的摄像头、雷达等等便于机器人感知自己的状态和外部的环境控制系统就是我们开发过程的主要载体了一般是树莓派、电脑等计算平台以及里边的操作系统和应用软件。机器人建模的过程其实就是按照类似的思路通过建模语言把机器人每一个部分都描述清楚再组合起来的过程。1.2 什么是URDFURDF(Unified Robot Description Format统一机器人描述格式)是一种XML格式的文件用于从物理和逻辑上描述一个机器人模型。你可以把它理解为机器人的数字说明书或三维装配图它告诉计算机机器人由哪些零件(连杆、关节)组成这些零件长什么样(形状、尺寸、颜色)零件之间如何连接(位置、旋转、运动类型)零件的物理属性(质量、惯性)1.3URDF组成URDF主要描述两大核心元素连杆(Link)代表机器人的刚性部件如机械臂的每一节臂杆、底盘、轮子、传感器支架等包括视觉属性形状(立方体、圆柱体、网格模型)、尺寸、颜色、纹理碰撞属性用于物理仿真的简化几何形状惯性属性质量、转动惯量(对仿真至关重要)。关节(Joint)定义连杆之间的连接方式和运动关系主要类型固定关节(fixed)完全固定连接旋转关节(revolute)绕单轴旋转有角度限制(如机械臂关节)连续关节(continuous)无限旋转(如轮子)平移关节(prismatic)线性滑动平面关节(planar)在平面内运动浮动关节(floating)完全自由(6自由度)。机器人描述由一组连杆元素和一组将连杆连接起来的关节元素组成因此典型的机器人描述大致如下所示?xml version1.0? ?xml-model hrefhttps://raw.githubusercontent.com/ros/urdfdom/master/xsd/urdf.xsd ? robot namepr2 xmlnshttp://www.ros.org link ... /link link ... /link link ... /link joint .... /joint joint .... /joint joint .... /joint /robot可以看到URDF格式的根元素是一个robot元素。1.3.1link元素link元素描述了一个具有惯性、视觉特征和碰撞属性的刚体。以下是一个link元素的示例link namemy_link inertial origin xyz0 0 0.5 rpy0 0 0/ mass value1/ inertia ixx100 ixy0 ixz0 iyy100 iyz0 izz100 / /inertial visual origin xyz0 0 0 rpy0 0 0 / geometry box size1 1 1 / /geometry material nameCyan color rgba0 1.0 1.0 1.0/ /material /visual collision origin xyz0 0 0 rpy0 0 0/ geometry cylinder radius1 length0.5/ /geometry /collision /linklink元素有一个属性即name(必选)用来描述连杆本身的名称.。此外link包含若干部元素接下来我们一一介绍。1.3.1.1 惯性属性inertialinertial(可选)用于描述连杆的质量、其质心的位置以及其中心惯性属性。其下可以包含如下元素origin(可选)此位姿(平移、旋转)描述了连杆质心坐标系C相对于连杆坐标系L的位置和方向。xyz(可选)表示从Lo(连杆坐标系原点)到Co(连杆质心)的位置向量形式为x L̂x y L̂y z L̂z其中L̂x、L̂y、L̂z是连杆坐标系L的正交单位向量rpy(可选)表示C的单位向量Ĉx、Ĉy、Ĉz相对于连杆坐标系L的方向以欧拉旋转(横滚roll、俯仰pitch、偏航yaw)序列表示单位为弧度。注意Ĉx、Ĉy、Ĉz不需要与连杆的惯性主轴对齐mass连杆的质量由该元素的value属性表示inertia此连杆关于Co(连杆质心)的惯性矩ixx、iyy、izz和惯性积ixy、ixz、iyz这些值对应于固定在质心坐标系C中的单位向量Ĉx、Ĉy、Ĉz。注意Ĉx、Ĉy、Ĉz相对于L̂x、L̂y、L̂z的方向由origin标签中的rpy值指定。1.3.1.2 视觉属性visualvisual(可选)连杆的视觉属性此元素指定了用于可视化目的的对象形状(长方体、圆柱体等)。注意同一个连杆可以存在多个visual标签实例。它们定义的几何体的并集形成了该连杆的视觉表示。其下可以包含如下元素origin(可选)视觉元素相对于连杆坐标系的参考坐标系xyz(可选)分别是x、y、z方向上的平移py(可选)表示固定轴的横滚、俯仰和偏航角度单位为弧度geometry(必选)表示几何形状可以是以下之一boxsize属性包含长方体的三个边长长方体的原点位于其中心cylinder指定半径和长度。圆柱体的原点位于其中心sphere指定半径。球体的原点位于其中心mesh由文件名指定的三角网格元素以及一个可选的缩放比例用于缩放网格的轴对齐边界框。任何几何格式都可以接受但具体应用程序的兼容性取决于实现。对于最佳纹理和颜色支持推荐的格式是Collada .dae文件。引用同一模型的机器之间不会传输网格文件。它必须是本地文件。在文件名前加上package://packagename/path可以使网格文件的路径相对于包packagename。material(可选)视觉元素的材质其name属性可以用于指定材质的名称color(可选)rgba由一组四个数字(代表红/绿/蓝/透明度alpha)指定的材质颜色每个数字的范围为 [0,1]texture(可选)材质的纹理由文件名指定。1.3.1.3 碰撞属性collisioncollision用于描述碰撞参数里边的内容似乎和visual一样也有geometry和origin看似相同其实区别还是比较大的origin(可选)碰撞元素相对于连杆坐标系的参考坐标系xyz(可选)分别是x、y、z方向上的平移py(可选)表示固定轴的横滚、俯仰和偏航角度单位为弧度geometry请参见上述视觉元素中的几何描述。1.3.2joint元素joint元素描述了关节的运动学和动力学特性并指定了关节的安全限制。以下是一个joint元素的示例joint namemy_joint typefloating origin xyz0 0 1 rpy0 0 3.1416/ parent linklink1/ child linklink2/ calibration rising0.0/ dynamics damping0.0 friction0.0/ limit effort30 velocity1.0 lower-2.2 upper0.7 / safety_controller k_velocity10 k_position15 soft_lower_limit-2.0 soft_upper_limit0.5 / /joint下面图中蓝色关节表示出一个运动的轴蓝色关节是可以围绕蓝色的轴旋转的也就是child这个link是可以围绕joint上下旋转。joint连接两个link需要分一个主次关系主关节是parent link子关节是child link 在xml形式的描述中这个两个link是必须存在的。joint元素有两个属性name(必须)指定关节的唯一名称type(必须)指定关节的类型类型可以是以下之一revolute旋转关节和continuous类型的区别在于不能无限旋转而是带有角度限制比如机械臂的两个连杆就属于这种运动continuous旋转关节可以围绕单轴无限旋转比如小车的轮子就属于这种类型prismatic滑动关节可以沿某一个轴平移也带有位置的极限一般直线电机就是这种运动方式fixed固定关节是唯一一种不允许运动的关节不过使用还是比较频繁的比如相机这个连杆安装在机器人上相对位置是不会变化的此时使用的连接方式就是fixedfloating浮动关节允许进行平移、旋转运动planar平面关节允许在平面正交方向上平移或者旋转此外joint包含若干部元素接下来我们挑选部分介绍介绍。1.3.2.1originorigin(可选)表示从父连杆到子连杆的变换元素属性有xyz(可选)表示x、y、z偏移量所有位置均以米为单位指定rpy(可选)表示绕固定轴的旋转先绕x轴横滚(roll)然后绕y轴俯仰(pitch)最后绕z轴偏航(yaw)所有角度均以弧度为单位指定。1.3.2.2parentparent描述父连杆名称元素属性有link在机器人树结构中作为此连杆父连杆的连杆名称。1.3.2.3childchild描述子连杆名称元素属性有link作为子连杆的连杆名称。1.3.2.4calibration关节的参考位置用来校准关节的绝对位置。1.3.2.5dynamics描述关节的物理属性例如阻尼值、物理静摩擦力等经常在动力学仿真中用到。1.3.2.6limit描述运动的一些极限值包括关节运动的上下限位置、速度限制、力矩限制等。1.3.2.7mimic描述该关节与已有关节的关系。1.3.2.8safety_controller描述安全控制器参数。保护机器人关节的运动。二、URDF案例创建my_learning_urdf的Python版本的功能包piNanoPC-T6:~/dev_ws$ cd src piNanoPC-T6:~/dev_ws/src$ ros2 pkg create --build-type ament_python my_learning_urdf在包中创建如下文件夹urdf存放机器人模型的URDF或xacro文件meshes放置URDF中引用的模型渲染文件launch保存相关启动文件rviz保存rviz的配置文件。我们需要修改setup.py文件添加配置文件import os from glob import glob ... data_files[ (share/ament_index/resource_index/packages, [resource/ package_name]), (share/ package_name, [package.xml]), (os.path.join(share, package_name, launch), glob(os.path.join(launch, *.launch.py))), (os.path.join(share, package_name, urdf), glob(os.path.join(urdf, *.*))), (os.path.join(share, package_name, urdf/sensors), glob(os.path.join(urdf/sensors, *.*))), (os.path.join(share, package_name, meshes), glob(os.path.join(meshes, *.*))), (os.path.join(share, package_name, rviz), glob(os.path.join(rviz, *.rviz))), ], ...2.1 模型文件在urdf下新建文件mbot_base.urdf?xml version1.0 ? robot namembot link namebase_link visual origin xyz 0 0 0 rpy0 0 0 / !-- 机器人中心坐标系原点 -- geometry cylinder length0.16 radius0.20/ !-- 直径0.4m高0.16m的圆柱 -- /geometry material nameyellow color rgba1 0.4 0 1/ !-- 橙黄色 -- /material /visual /link joint nameleft_wheel_joint typecontinuous origin xyz0 0.19 -0.05 rpy0 0 0/ !-- 位置Y轴0.19Z轴-0.05 -- parent linkbase_link/ child linkleft_wheel_link/ axis xyz0 1 0/ !-- 绕Y轴旋转 -- /joint link nameleft_wheel_link visual origin xyz0 0 0 rpy1.5707 0 0 / !-- 旋转90度(π/21.5707) -- geometry cylinder radius0.06 length 0.025/ !-- 半径0.06m厚0.025m -- /geometry material namewhite color rgba1 1 1 0.9/ /material /visual /link joint nameright_wheel_joint typecontinuous origin xyz0 -0.19 -0.05 rpy0 0 0/ parent linkbase_link/ child linkright_wheel_link/ axis xyz0 1 0/ /joint link nameright_wheel_link visual origin xyz0 0 0 rpy1.5707 0 0 / geometry cylinder radius0.06 length 0.025/ /geometry material namewhite color rgba1 1 1 0.9/ /material /visual /link joint namefront_caster_joint typecontinuous origin xyz0.18 0 -0.095 rpy0 0 0/ parent linkbase_link/ child linkfront_caster_link/ axis xyz0 1 0/ /joint link namefront_caster_link visual origin xyz0 0 0 rpy0 0 0/ geometry sphere radius0.015 / /geometry material nameblack color rgba0 0 0 0.95/ /material /visual /link joint nameback_caster_joint typecontinuous origin xyz-0.18 0 -0.095 rpy0 0 0/ parent linkbase_link/ child linkback_caster_link/ axis xyz0 1 0/ /joint link nameback_caster_link visual origin xyz0 0 0 rpy0 0 0/ geometry sphere radius0.015 / /geometry material nameblack color rgba0 0 0 0.95/ /material /visual /link /robot这将会创建一个两轮差分驱动机器人的URDF模型包含若干个部分。2.1.11个主体base_link圆柱体(直径0.4米高0.16米)橙黄色机器人中心坐标系原点。2.1.22个驱动轮(左右轮)分别为left_wheel_link、right_wheel_linkleft_wheel_link圆柱体(半径0.06米厚度0.025米)在基座坐标系中(0, 0.19, -0.05)关节类型continuous(连续旋转关节无限旋转)旋转轴绕Y轴(0, 1, 0)视觉旋转rpy1.5707 0 0将圆柱旋转90度使其直立(假设原始圆柱是平放的)right_wheel_link与左轮对称布置Y坐标为负2.1.32个万向轮(前后脚轮用于支撑)分别为front_caster_link、back_caster_linkfront_caster_link形状小球体(半径0.015米)模拟万向轮在基座坐标系中前方(0.18, 0, -0.095)颜色黑色back_caster_link与前万向轮对称布置X坐标为负(-0.18)。2.2launch文件在launch文件夹下创建display.launch.py文件from ament_index_python.packages import get_package_share_path from launch import LaunchDescription from launch.actions import DeclareLaunchArgument from launch.conditions import IfCondition, UnlessCondition from launch.substitutions import Command, LaunchConfiguration from launch_ros.actions import Node from launch_ros.parameter_descriptions import ParameterValue def generate_launch_description(): urdf_tutorial_path get_package_share_path(my_learning_urdf) # 设置默认的URDF文件和RViz配置文件路径 default_model_path urdf_tutorial_path / urdf/mbot_base.urdf default_rviz_config_path urdf_tutorial_path / rviz/urdf.rviz # 命令行参数--gui true/false控制是否使用GUI界面发布关节状态 gui_arg DeclareLaunchArgument(namegui, default_valuefalse, choices[true, false], descriptionFlag to enable joint_state_publisher_gui) # 命令行参数--model 路径指定URDF文件路径 model_arg DeclareLaunchArgument(namemodel, default_valuestr(default_model_path), descriptionAbsolute path to robot urdf file) # 命令行参数--rvizconfig 路径指定RViz配置文件 rviz_arg DeclareLaunchArgument(namervizconfig, default_valuestr(default_rviz_config_path), descriptionAbsolute path to rviz config file) # 关键使用xacro命令解析URDF文件(支持参数化、宏等高级特性) robot_description ParameterValue(Command([xacro , LaunchConfiguration(model)]), value_typestr) # robot_state_publisher 节点 robot_state_publisher_node Node( packagerobot_state_publisher, executablerobot_state_publisher, parameters[{robot_description: robot_description}] ) # 关节状态发布器(二选一) # 文本版本(无GUI) joint_state_publisher_node Node( packagejoint_state_publisher, executablejoint_state_publisher, conditionUnlessCondition(LaunchConfiguration(gui)) ) # GUI版本(带滑动条控制) joint_state_publisher_gui_node Node( packagejoint_state_publisher_gui, executablejoint_state_publisher_gui, conditionIfCondition(LaunchConfiguration(gui)) ) # rviz2 可视化节点 rviz_node Node( packagerviz2, executablerviz2, namerviz2, outputscreen, arguments[-d, LaunchConfiguration(rvizconfig)], ) return LaunchDescription([ gui_arg, model_arg, rviz_arg, joint_state_publisher_node, joint_state_publisher_gui_node, robot_state_publisher_node, rviz_node ])这个Launch文件主要做三件事加载机器人URDF模型(支持xacro格式)发布机器人的状态变换(TF)在rviz2中可视化机器人。2.2.1 节点脚本运行会创建以下几个节点joint_state_publisher发布每个joint(除fixed类型)的状态一个无界面的、基础版的关节状态发布器joint_state_publisher_gui发布每个joint(除fixed类型)的状态可以通过UI界面对joint进行控制robot_state_publisher将机器人各个links、joints之间的关系通过TF的形式整理成三维姿态信息发布。rviz2在rviz2中可视化机器人joint_state_publisher这是一个官方ROS2包主要功能输入读取URDF中的关节定义接收用户或程序指定的关节角度输出发布/joint_states话题消息类型为sensor_msgs/msg/JointState包含所有关节的名称、位置、速度、力等信息。2.2.2 数据流与节点关系数据流与节点关系:用户通过滑动条/GUI或程序 → joint_state_publisher(_gui) ↓ 发布/joint_states话题 robot_state_publisher ↓ 计算并发布TF变换 rviz2 和其他节点 ↓ 接收TF并可视化2.3urdf.rviz在rviz目录下新建urdf.rviz文件Panels: - Class: rviz_common/Displays Name: Displays - Class: rviz_common/Views Name: Views Visualization Manager: Class: Displays: - Class: rviz_default_plugins/Grid Name: Grid Value: true - Alpha: 0.8 Class: rviz_default_plugins/RobotModel Description Source: Topic Description Topic: Value: /robot_description Enabled: true Name: RobotModel Value: true - Class: rviz_default_plugins/TF Name: TF Value: true Global Options: Fixed Frame: base_link Frame Rate: 30 Name: root Tools: - Class: rviz_default_plugins/MoveCamera Value: true Views: Current: Class: rviz_default_plugins/Orbit Distance: 1.7 Name: Current View Pitch: 0.33 Value: Orbit (rviz) Yaw: 5.5 Window Geometry: Height: 800 Width: 12002.4 编译运行编译程序piNanoPC-T6:~/dev_ws$ colcon build --paths src/my_learning_urdf piNanoPC-T6:~/dev_ws$ source install/setup.sh2.4.1 可视化启动终端运行如下命令piNanoPC-T6:~/dev_ws$ ros2 launch my_learning_urdf display.launch.py很快就可以看到rviz中显示的机器人模型啦大家可以使用鼠标拖拽观察从可视化的效果来看这个机器人由5个link和4个joint组成。2.4.2 查看URDF模型结构我们分析的对不对呢可以在模型文件的路径下使用urdf_to_graphviz这个小工具来分析下;piNanoPC-T6:~/dev_ws/src/my_learning_urdf/urdf$ urdf_to_graphviz mbot_base.urdf WARNING: OUTPUT not given. This type of usage is deprecated!Usage: urdf_to_graphviz input.xml [OUTPUT] Will create either $ROBOT_NAME.gv $ROBOT_NAME.pdf in CWD or OUTPUT.gv OUTPUT.pdf. Created file mbot.gv Created file mbot.pdf piNanoPC-T6:~/dev_ws/src/my_learning_urdf/urdf$ ls mbot_base.urdf mbot.gv mbot.pdf运行成功后会产生一个pdf文件打开之后就可以看到URDF模型分析的结果啦是不是和我们的猜测完全相同呢参考文章[1] 古月居ROS2入门教程学习笔记[2]ROS中阶笔记(二)机器人系统设计—URDF机器人建模[3]XML Robot Description Format(URDF)