第一次接触UR机械臂和ROS2的朋友可能会觉得这个组合有点复杂,但实际搭建起来比想象中简单。我去年在实验室部署了3台UR5e机械臂,从仿真到实物控制踩过不少坑,现在把这些经验整理成最直白的操作指南。
核心工具链其实就三部分:ROS2 Humble(推荐版本)、Universal Robots官方驱动包、URSim仿真环境。这三者配合使用,能实现从仿真测试到实物控制的平滑过渡。我强烈建议先用仿真环境练手,毕竟真实的机械臂动作起来可不是闹着玩的。
硬件方面,UR机械臂全系都支持ROS2控制,从UR3到UR20都没问题。如果你的实验室还没有机械臂,完全可以用URSim先模拟。我测试过,URSim的物理引擎精度很高,仿真环境下调试好的代码,几乎不用修改就能直接用在真机上。
最省事的方法就是直接用apt安装:
bash复制sudo apt-get install ros-humble-ur-robot-driver
这个命令会把驱动、控制接口、预置的launch文件都装好。安装完成后,你可以在/opt/ros/humble/share/ur_robot_driver找到所有资源文件。我建议先看看里面的launch文件结构,这对后续开发很有帮助。
如果你需要修改驱动代码,或者想用最新开发版,就需要源码编译:
bash复制mkdir -p ~/ur_ws/src
cd ~/ur_ws/src
git clone -b humble https://github.com/UniversalRobots/Universal_Robots_ROS2_Driver.git
vcs import < src/Universal_Robots_ROS2_Driver/Universal_Robots_ROS2_Driver-not-released.humble.repos
rosdep install --ignore-src --from-paths src -y
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release
编译过程大概需要10-15分钟,取决于你的电脑性能。有个小技巧:如果编译卡在MoveIt相关包,可以先单独编译这些依赖项。
要让ROS2控制真实UR机械臂,必须在机械臂示教器上安装URCap插件。这个过程需要U盘和5分钟时间:
安装完成后,记得在示教器的"程序"页面添加"External Control"节点。这个步骤很关键,我见过好几个案例都是漏了这步导致通信失败。
没有真机时,用Docker跑URSim是最方便的方案:
bash复制docker run -d --name ursim -e ROBOT_MODEL=UR5e -p 6080:6080 -p 50002:50002 universalrobots/ursim_e-series
这个命令会启动一个带Web界面的仿真环境,访问http://localhost:6080就能操作虚拟机械臂。注意50002端口是给ROS2驱动连接用的,防火墙要放行这个端口。
启动命令示例:
bash复制ros2 launch ur_robot_driver ur_control.launch.py ur_type:=ur5e robot_ip:=192.168.1.101 launch_rviz:=true
这里的robot_ip要换成你机械臂的实际IP。第一次连接时建议先用ping测试网络连通性。如果连接失败,检查机械臂端的网络设置,确保和你的开发机在同一个子网。
在URSim运行时,可以用这个命令启动虚拟控制:
bash复制ros2 launch ur_robot_driver ur_control.launch.py ur_type:=ur5e robot_ip:=localhost use_fake_hardware:=true
仿真模式下,机械臂会立即进入就绪状态,不需要像真机那样等待上电和校准。这对快速验证算法特别有用。
UR驱动包已经预置了MoveIt配置,但需要手动调整控制器设置。编辑/opt/ros/humble/share/ur_moveit_config/config/controllers.yaml,确保joint_trajectory_controller是默认控制器。
启动MoveIt界面:
bash复制ros2 launch ur_moveit_config ur_moveit.launch.py ur_type:=ur5e launch_rviz:=true
在RViz里,你会看到熟悉的MoveIt交互界面。点击"Planning"标签页,拖动末端执行器设置目标位置,然后点"Plan & Execute"就能看到机械臂开始运动。第一次运行时建议选择低速模式,观察运动轨迹是否符合预期。
这个简单的代码示例演示如何通过编程控制机械臂移动到指定位置:
cpp复制auto move_group = std::make_shared<moveit::planning_interface::MoveGroupInterface>(
node, "ur_manipulator");
move_group->setMaxVelocityScalingFactor(0.5); // 限速50%
geometry_msgs::msg::Pose target;
target.position.x = 0.4;
target.position.y = 0.2;
target.position.z = 0.3;
target.orientation.w = 1.0;
move_group->setPoseTarget(target);
move_group->move(); // 阻塞式移动
如果更喜欢Python,可以这样写:
python复制from moveit.core.robot_state import RobotState
move_group = MoveGroupInterface(node, "ur_manipulator")
move_group.set_max_velocity_scaling_factor(0.3)
joint_goal = [0.0, -1.57, 1.57, -1.57, -1.57, 0.0]
move_group.go(joint_goal, wait=True)
Python接口的响应速度稍慢,但开发效率更高,适合快速原型开发。
如果遇到机械臂无响应,按这个顺序检查:
/joint_states当机械臂运动不流畅时,可以尝试:
max_velocity_scaling_factor参数我在实际项目中发现,UR机械臂的加速度参数对运动平稳性影响很大,建议在示教器里适当降低默认加速度值。