【URDF】机器人描述

【URDF】机器人描述

使用xml来描述机器人的几何结构、传感器、执行器等->tf关系,rviz可视化等

创建urdf

一般在一个项目的..._description功能包下
创建urdf文件夹

urdf文件基本结构

<?xml version="1.0"?>
<robot name="first_robot">
	<!-- XML注释 -->
	<link_name="base_link">
		...
	</link>
</robot>

first_robot.urdf

<?xml version="1.0"?>
<robot name="first_robot">
    <!-- 机器人身体部分 -->
    <link name="base_link">
        <!-- 部件外观描述 -->
        <visual>
            <!-- 沿着自己几何中心的偏移和旋转量 -->
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
            <!-- 几何形状 -->
            <geometry>
                <cylinder radius="0.10" length="0.12"/>
            </geometry>
            <!-- 材质颜色 -->
            <material name="write">
                <color rgba="1.0 1.0 1.0 0.5"/><!--最后一个是透明度-->
            </material>
        </visual>
    </link>

    <!-- 机器人IMU部件,惯性测量传感器 -->
    <link name="imu_link">
        <!-- 部件外观描述 -->
        <visual>
            <!-- 沿着自己几何中心的偏移和旋转量 -->
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
            <!-- 几何形状 -->
            <geometry>
                <box size="0.02 0.02 0.02"/>
            </geometry>
            <!-- 材质颜色 -->
            <material name="black">
                <color rgba="0.0 0.0 0.0 0.5"/>
            </material>
        </visual>
    </link>

    <!-- 机器人关节,用于组合机器人部件 -->
    <joint name="imu_joint" type="fixed">
        <parent link="base_link"/>
        <child link="imu_link"/>
        <origin xyz="0.0 0.0 0.03" rpy="0.0 0.0 0.0"/>
    </joint>
    
</robot>

->$ urdf_to_graphviz first_robot.urdf
->生成.pdf.gv文件 可看关系

使用Rviz显示urdf关系

两个依赖

sudo apt install ros-$ROS_DISTRO-joint-state-publisher
sudo apt install ros-$ROS_DISTRO-robot-state-publisher

launch文件

import launch
import launch_ros
from ament_index_python.packages import get_package_share_directory
import os

import launch_ros.parameter_descriptions

def generate_launch_description():
    # 获取默认urdf路径
    urdf_package_path=get_package_share_directory('urdf_learn')
    urdf_path=os.path.join(urdf_package_path,'urdf','first_robot.urdf')
    default_rviz_config_path=os.path.join(urdf_package_path,'config','display_robot_model.rviz')
    # 声明一个urdf目录的参数,方便修改
    action_declare_arg_mode_path=launch.actions.DeclareLaunchArgument(
        name='model',
        default_value=str(urdf_path),
        description='加载的模型文件路径'
    )
    # 通过文件路径,获取内容,并转换为参数值对象,以供传入
    substitutions_command_result=launch.substitutions.Command(['cat ',
        launch.substitutions.LaunchConfiguration('model')])
    robot_description_value=launch_ros.parameter_descriptions.ParameterValue(substitutions_command_result,
        value_type=str)

    action_robot_state_publisher=launch_ros.actions.Node(
        package='robot_state_publisher',
        executable='robot_state_publisher',
        parameters=[{'robot_description':robot_description_value}]
    )

    action_joint_state_publisher=launch_ros.actions.Node(
        package='joint_state_publisher',
        executable='joint_state_publisher'
    )

    action_rviz_node=launch_ros.actions.Node(
        package='rviz2',
        executable='rviz2',
        arguments=['-d',default_rviz_config_path]
    )

    """
    parameters:将参数数据传递给节点的键值对
    arguments:传递命令行参数
    """

    return launch.LaunchDescription([
        action_declare_arg_mode_path,
        action_robot_state_publisher,
        action_joint_state_publisher,
        action_rviz_node
    ])

->下次运行时可不用手动添加组件->当前Rviz配置保存为文件
一般在config文件夹
image

使用Xacro简化URDF

代码模版

//开头
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="first_robot">
//类比函数 传递参数
<xacro:macro name="base_link" params="length radius">
	//把link封里面
</xacro:macro>
//在最后写参数
<xacro:base_link length="0.12" radius="0.1" />

first_robot.xacro.urdf

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="first_robot">
    <!-- 声明base模块 -->
    <xacro:macro name="base_link" params="length radius">
        <link name="base_link">
            <visual>
                <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
                <geometry>
                    <cylinder radius="${radius}" length="${length}"/>
                </geometry>
                <material name="write">
                    <color rgba="1.0 1.0 1.0 0.5"/>
                </material>
            </visual>
        </link>
    </xacro:macro>
    
    <!-- 声明IMU模块 -->
    <xacro:macro name="imu_link" params="imu_name xyz">
         <link name="${imu_name}_link">
            <visual>
                <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
                <geometry>
                    <box size="0.02 0.02 0.02"/>
                </geometry>
                <material name="black">
                    <color rgba="0.0 0.0 0.0 0.5"/>
                </material>
            </visual>
        </link>

        <joint name="${imu_name}_joint" type="fixed">
            <parent link="base_link"/>
            <child link="${imu_name}_link"/>
            <origin xyz="${xyz}" rpy="0.0 0.0 0.0"/>
        </joint>
    </xacro:macro>
    
    <!-- 在最后写参数 -->
    <!-- 传递参数调用base_link模块 -->
    <xacro:base_link length="0.12" radius="0.1" />
    <!-- 传递参数调用imu模块 -->
    <xacro:imu_link imu_name="imu_up" xyz="0 0 0.02" />
    <xacro:imu_link imu_name="imu_down" xyz="0 0 -0.02" />
</robot>

$ xacro first_robot.urdf.xacro:转换文件格式
xacro->urdf

substitutions_command_result=launch.substitutions.Command(['xacro ', //改命令
        launch.substitutions.LaunchConfiguration('model')])
$ ros2 launch urdf_learn display_robot.launch.py model:=/home/asd/WHITEINK/urdf_learn/src/urdf_learn/urdf/first_robot.urdf.xacro
posted @ 2025-03-03 16:16  White_ink  阅读(55)  评论(0)    收藏  举报