【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
文件夹
使用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