- SignalDesk2小时前
Original Summary
1. 写在前面 学习 ROS2 的随手笔记,参考B站鱼香ROS。 2. XML(Extensible Markup Language,可拓展标记语言) XML 有两种语段 <?xml version="1.0"?> <robot name="first_robot"> <!-- xml注释 --> <link name="base_link"></link> </robot> 从 <robot name="first_robot"> 到 </robot> 是一个标签,其中 name="first_robot" 是标签的一个属性。 <link name="base_link"> 到 </link> 则是 robot 的一个子标签 <!-- xml注释 --> 是注释 <xacro:imu_link imu_name="imu_down" xyz="0.0 0.0 -0.03"/> 如果是单次调用一个宏注意结尾 / 的位置,xml 语言极为重视语法闭合 2.1 xml 示例代码 <?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> <!-- 圆柱体 r=0.10m h=0.12m --> <cylinder radius="0.10" length="0.12"/> </geometry> <!-- 材质颜色 --> <material name="white"> <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> <!-- 正方体 a=0.02m --> <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"> <origin xyz="0.0 0.0 0.03" rpy="0.0 0.0 0.0"/> <parent link="base_link"/> <child link="imu_link"/> </joint> </robot> 输入 urdf_to_graphviz src/fishbot_description/urdf/first_robot.urdf 生成 .gv 和 .pdf 文件,点开可查看机器人关节关系 2.2 导入 RViz2 输入 rviz2 启动 RViz2,点击 Add , RobotModel , OK ,导入模块 把 Topic 改为 File 点击 … 导入文件,选择 urdf 文件 把 Fixed Frame 改为 base_link 此时 imu_link 仍然报错,显示:No transform from [imu_link] to [base_link] 正常工作的流程如下 /joint_state_publisher :URDF 只描述了关节的性质,不能描述关节的实时状态,例如关节转了什么角度。所以需要 /joint_state_publisher 提供关节的实时状态信息,通过 /robot_description Topic 通讯。 /robot_description :读取 URDF 获得机器人描述后,通过 /robot_description 话题通讯,让别的节点也能获得这份机器人结构信息。 /robot_state_publisher :根据 URDF 和 /joint_state_publisher 计算 TF,以供其他程序订阅 实现该流程需安装两个库 sudo apt install ros-$ROS_DISTRO-joint-state-publisher sudo apt install ros-$ROS_DISTRO-robot-state-publisher 由于涉及到多个节点的启动,这里采用 launch 文件 2.3 使用 launch 启动 RViz 模型 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('fishbot_description') default_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(default_urdf_path), description='加载的文件模型路径' ) # 通过文件路径获取内容,并转换成参数值对象,以供传入 robot_state_publisher substitution_command_result = launch.substitutions.Command([ 'cat ', launch.substitutions.LaunchConfiguration('model') ]) robot_description_value = launch_ros.parameter_descriptions.ParameterValue( substitution_command_result, value_type=str ) action_declare_state_publisher = launch_ros.actions.Node( package='robot_state_publisher', executable='robot_state_publisher', parameters=[{'robot_description':robot_description_value}] ) 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] ) return launch.LaunchDescription([ action_declare_arg_mode_path, action_declare_state_publisher, joint_state_publisher, action_rviz_node, ]) 输入 ros2 launch fishbot_description display_robot.launch.py 若果需要切换模型 ros2 launch fishbot_description display_robot.launch.py model:=<urdf文件路径> 进行如下配置,即可看到模型 输入 rqt ,选择 Pluings → Introspection → Node Graph ,可以看到如下关系 /joint_state_publisher :URDF 只描述了关节的性质,不能描述关节的实时状态,例如关节转了什么角度。所以需要 /joint_state_publisher 提供关节的实时状态信息,通过 /robot_description Topic 通讯。 /robot_description :读取 URDF 获得机器人描述后,通过 /robot_description 话题通讯,让别的节点也能获得这份机器人结构信息。 /robot_state_publisher :根据 URDF 和 /joint_state_publisher 计算 TF,以供其他程序订阅 2.4 使用 Xacro 简化 URDF 2.4.1 Xacro 文件 类似于 C++ 函数的作用。把对应的模块提前封装,调用时只需声明一些参数即可 <?xml version="1.0"?> <robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="first_robot"> <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> <!-- 圆柱体 r=0.10m h=0.12m --> <cylinder radius="${radius}" length="${length}"/> </geometry> <!-- 材质颜色 --> <material name="white"> <color rgba="1.0 1.0 1.0 0.5"/> </material> </visual> </link> </xacro:macro> <!-- 机器人的身体 --> <xacro:macro name="imu_link" params="imu_name xyz"> <!-- 机器人的IMU部件,惯性测量传感器 --> <link name="${imu_name}_link"> <!-- 部件的外观 --> <visual> <!-- 沿着自己几何中心的偏移和旋转量 --> <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/> <!-- 几何形状 --> <geometry> <!-- 正方体 a=0.02m --> <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"> <origin xyz="${xyz}" rpy="0.0 0.0 0.0"/> <parent link="base_link"/> <child link="${imu_name}_link"/> </joint> </xacro:macro> <xacro:base_link length="0.12" radius="0.1"/> <xacro:imu_link imu_name="imu_up" xyz="0.0 0.0 0.03"/> &
- 情报分类:技术学习与提效
- 分类依据:内容涉及技术、AI、软件工具或工程实践
- 信息来源:服务器 / LINUX DO - 最新话题
- 发布时间:2026/10/13 21:38:34
- 暂无回复