基于 ROS2 官方 UR 例程的 UR5 机械臂模型提取与 Simulink 导入
代码资源地址1. 前言本文记录 UR5 六轴机械臂模型从 ROS2 官方 UR 例程到 MATLAB/Simulink 的导入过程。整体目标是先在 ROS2 中验证官方机械臂描述模型再提取 URDF 文件并将其导入 MATLAB 和 Simscape Multibody作为后续运动学、轨迹规划和控制仿真的基础。整体流程如下ROS2 官方 UR 描述包 ↓ RViz 中验证 UR5 模型 ↓ 提取 URDF 文件 ↓ MATLAB 中 importrobot 验证 ↓ smimport 导入 Simscape Multibody ↓ 检查关节、连杆、质量、惯量和单位本文使用的环境为ROS2 HumbleUbuntu/Linux 环境MATLAB/SimulinkRobotics System ToolboxSimscape Multibody2. 在 ROS2 中验证 UR5 官方模型首先在 Linux 终端中加载 ROS2 Humble 环境source /opt/ros/humble/setup.bash如果不确定本地是否已经安装ur_description可以先检查ros2 pkg list | grep ur_description如果没有任何输出说明当前 ROS2 环境中没有找到该包。对于已经正确安装 ROS2 Humble 的 Ubuntu 22.04 系统优先使用 apt 安装sudo apt update sudo apt install ros-humble-ur-description为了运行可视化例程建议同时安装 RViz、关节状态发布 GUI 和 xacrosudo apt install ros-humble-rviz2 ros-humble-joint-state-publisher-gui ros-humble-xacro安装完成后重新加载 ROS2 环境source /opt/ros/humble/setup.bash再次检查ros2 pkg prefix ur_description如果能输出类似路径/opt/ros/humble说明ur_description已经可以被 ROS2 找到。如果 apt 提示找不到ros-humble-ur-description通常是 ROS2 软件源没有配置好或者系统版本与 ROS2 Humble 不匹配。此时应先确认 ROS2 Humble 本身能正常使用ros2 --version echo $ROS_DISTROecho $ROS_DISTRO应输出humble如果需要从源码安装可以建立一个工作空间mkdir -p ~/ur_ws/src cd ~/ur_ws/src git clone -b humble https://github.com/UniversalRobots/Universal_Robots_ROS2_Description.git cd ~/ur_ws rosdep install --from-paths src --ignore-src -r -y colcon build --symlink-install source install/setup.bash然后运行 UR 官方描述包中的 UR5 可视化例程ros2 launch ur_description view_ur.launch.py ur_type:ur5该命令会启动几个主要节点robot_state_publisher发布机械臂各连杆之间的 TF 关系joint_state_publisher_gui提供关节角度调节界面rviz2显示 UR5 机械臂模型。如果 RViz 中能够正常显示 UR5 机械臂并且拖动joint_state_publisher_gui中的滑块后机械臂可以正常运动说明 ROS2 端的模型描述是可用的。终端中可以看到类似输出[robot_state_publisher]: got segment base_link [robot_state_publisher]: got segment shoulder_link [robot_state_publisher]: got segment upper_arm_link [robot_state_publisher]: got segment forearm_link [robot_state_publisher]: got segment wrist_1_link [robot_state_publisher]: got segment wrist_2_link [robot_state_publisher]: got segment wrist_3_link [robot_state_publisher]: got segment tool0这些信息说明 UR5 的主要连杆已经被正确加载。3. 提取 URDF 文件UR 官方模型通常不是一个单独手写的 URDF 文件而是由xacro文件和参数文件展开生成。因此如果要在 MATLAB 中导入需要先得到最终展开后的.urdf文件。如果是本地安装的机械臂例程ur5本地的urdf文件再linux环境下的路径是/opt/ros/humble/share/ur_description/meshes/ur5将桑哥文件复制到matlab的工作空间下我的路径是D:\WORK\school\cls\movepartom\ur本文最终得到的 URDF 文件为ur5.urdf文件保存路径为D:\WORK\school\cls\movepartom\ur\ur5.urdf注其中需要改进urdf中的路径要保持和windows实际情况下一致。需要注意ROS2 中的ur_description模型包含大量参数和宏定义直接复制 xacro 文件通常不能被 MATLAB 正确识别。MATLAB 更适合导入已经展开完成的普通 URDF 文件。4. 在 MATLAB 中检查 URDF 文件在 MATLAB 中首先检查 URDF 文件路径是否正确urdf D:\WORK\school\cls\movepartom\ur\ur5.urdf; exist(urdf,file)如果返回ans 2说明文件存在路径没有问题。如果返回0说明 MATLAB 没有找到该文件需要检查文件名是否正确路径中是否存在中文或特殊字符文件扩展名是否确实为.urdfWindows 路径是否写完整。5. 使用 importrobot 导入 URDF确认 URDF 文件存在后可以使用importrobot导入模型urdf D:\WORK\school\cls\movepartom\ur\ur5.urdf; robot importrobot(urdf); robot.DataFormat row; robot.Gravity [0 0 -9.81]; show(robot);其中importrobot用于从 URDF 创建rigidBodyTree模型DataFormat row表示关节角使用1x6行向量Gravity [0 0 -9.81]设置重力方向show(robot)用于快速查看导入后的机械臂结构。导入时可能会出现类似警告Mesh file base.dae has an unsupported file extension and cannot be visualized. Valid file extensions include STL, STP, and STEP.该警告主要表示 MATLAB 当前无法直接显示.dae网格文件。它通常只影响模型外观显示不代表 URDF 的连杆、关节、质量和惯量信息不可用。对于后续运动学和动力学验证该警告一般可以先忽略。6. 检查关节顺序UR5 是一个六自由度串联机械臂后续所有关节角向量都必须严格按照 URDF 中的关节顺序排列。可以使用以下代码查看关节顺序robot.DataFormat struct; cfg homeConfiguration(robot); joint_order {cfg.JointName}; disp(Joint order:); disp(joint_order);本文导入后得到的关节顺序为shoulder_pan_joint shoulder_lift_joint elbow_joint wrist_1_joint wrist_2_joint wrist_3_joint因此后续关节角向量应写成q [q1 q2 q3 q4 q5 q6];并且对应关系为q1 → shoulder_pan_joint q2 → shoulder_lift_joint q3 → elbow_joint q4 → wrist_1_joint q5 → wrist_2_joint q6 → wrist_3_joint如果关节顺序接错模型虽然可能可以运动但末端位置和姿态会明显不正确。7. 使用 smimport 导入 Simscape Multibody在 MATLAB 中确认rigidBodyTree模型可以正常导入后可以进一步使用smimport转换为 Simscape Multibody 模型robot.DataFormat row; smimport(robot,ModelName,ur5_mb);执行后Simulink 会生成一个新的模型例如ur5_mb.slx该模型中通常包含各个连杆对应的 Solid 模块六个 Revolute Joint坐标变换模块质量、质心和惯量信息Mechanism ConfigurationSolver Configuration。这一步的意义是将 URDF 中的机械结构转为 Simscape Multibody 可仿真的物理模型。注为了后续实验建议将将六个关节的限位进行取消。8. 检查 Simscape Multibody 模型导入后需要重点检查几个部分。8.1 Revolute Joint 数量UR5 应该有六个主要转动关节shoulder_pan_joint shoulder_lift_joint elbow_joint wrist_1_joint wrist_2_joint wrist_3_joint每个关节都应对应一个 Simscape Multibody 中的 Revolute Joint。8.2 关节输入单位如果采用关节位置输入方式Revolute Joint 的 Motion 应设置为输入并且输入单位应为rad如果前面控制模块使用的是角度制需要在进入 Simscape 关节之前转换为弧度theta_rad theta_deg * pi/180;建议在控制和运动学计算中统一使用弧度只有显示时再转换为角度theta_deg theta_rad * 180/pi;8.3 Mechanism Configuration同一个 Simscape Multibody 物理网络中只能保留一个Mechanism Configuration。如果模型中出现多个Mechanism Configuration可能会报错Mechanism Configuration conflicts with another Mechanism Configuration.解决方式是只保留一个删除重复的配置模块。8.4 Solver ConfigurationSimscape 模型需要Solver Configuration模块。一般导入时会自动生成如果后续手动改动模型结构需要确保物理网络仍然连接到 Solver Configuration。9. 常见问题9.1 URDF 文件找不到如果 MATLAB 报错File xxx.urdf not found.说明路径不正确。可以先用exist(urdf,file)确认文件是否存在。9.2 DAE 网格警告如果导入时出现Mesh file *.dae has an unsupported file extension通常只是显示问题不代表运动学模型错误。后续可以选择将.dae转换为.stl也可以先忽略该警告。9.3 关节单位混乱Simscape Revolute Joint 的位置输入常用单位是rad。如果某些模块输出是角度某些模块输出是弧度很容易出现机械臂运动幅度异常的问题。建议建立统一规则运动学计算rad 控制计算rad Simscape 关节输入rad 显示模块deg9.4 UR5 和 UR5e 参数不能混用UR5 和 UR5e 外形相似但 DH 参数并不完全相同。如果导入的是 UR5 模型后续自己写正运动学和逆运动学时也必须使用 UR5 参数不能直接套用 UR5e 参数。本文使用的 UR5 参数为d1 0.089159; a2 -0.425; a3 -0.39225; d4 0.10915; d5 0.09465; d6 0.0823;10.位置控制为了进行我们的实验我们采用位置控制的方式还有一种力矩控制方式。在模型中记得加上 Real-Time Synchronization 实时仿真模块使得我们更好的观察正运动学代码function p ur5e_fk(q) %#codegen % q: 6x1 or 1x6, unit rad % p: tool0 position in Simscape/URDF model base frame, unit m q1 q(1); q2 q(2); q3 q(3); q4 q(4); q5 q(5); q6 q(6); d1 0.089159; a2 -0.425; a3 -0.39225; d4 0.10915; d5 0.09465; d6 0.0823; T eye(4); T T * dh(0, pi/2, d1, q1); T T * dh(a2, 0, 0, q2); T T * dh(a3, 0, 0, q3); T T * dh(0, pi/2, d4, q4); T T * dh(0, -pi/2, d5, q5); T T * dh(0, 0, d6, q6); p_dh T(1:3,4); p [-p_dh(1); -p_dh(2); p_dh(3)]; end function A dh(a, alpha, d, theta) %#codegen ct cos(theta); st sin(theta); ca cos(alpha); sa sin(alpha); A [ct, -st*ca, st*sa, a*ct; st, ct*ca, -ct*sa, a*st; 0, sa, ca, d; 0, 0, 0, 1]; end正运动学的方程如下。本文小结本文完成了 UR5 机械臂模型从 ROS2 官方例程到 MATLAB/Simulink 的导入流程。主要步骤包括在 ROS2 中运行 UR 官方 UR5 可视化例程验证 RViz 中机械臂模型是否正常提取可供 MATLAB 使用的 URDF 文件使用importrobot在 MATLAB 中导入 URDF检查关节顺序和模型结构使用smimport生成 Simscape Multibody 模型检查关节单位、Mechanism Configuration 和 Solver Configuration。完成该流程后就可以在 Simulink 中继续搭建关节控制、末端正运动学、逆运动学、轨迹规划和动力学控制模块。下一篇将继续记录如何基于该 Simscape Multibody 模型实现 UR5 机械臂的末端点位控制。