三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

保姆级教程:在Ubuntu 20.04 ROS Noetic下,从零搭建UR5机械臂的Gazebo仿真环境

保姆级教程:在Ubuntu 20.04 ROS Noetic下,从零搭建UR5机械臂的Gazebo仿真环境

保姆级教程:在Ubuntu 20.04 ROS Noetic下从零搭建UR5机械臂Gazebo仿真环境

刚接触ROS和机器人仿真的开发者常常面临一个困境:想学习机械臂控制算法却没有实体设备。这时,Gazebo仿真环境就成了最佳选择。本文将手把手教你如何在Ubuntu 20.04系统下,基于ROS Noetic搭建UR5机械臂的完整仿真环境,涵盖从系统配置到运动控制的全流程。

1. 环境准备与基础配置

在开始之前,确保你的系统满足以下基本要求:

  • Ubuntu 20.04 LTS操作系统
  • 至少4GB内存(推荐8GB以上)
  • 20GB可用磁盘空间
  • 稳定的网络连接

1.1 ROS Noetic安装

首先需要安装ROS Noetic完整版。打开终端,依次执行以下命令:

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 sudo apt update sudo apt install ros-noetic-desktop-full

安装完成后,初始化rosdep并设置环境变量:

sudo rosdep init rosdep update echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc source ~/.bashrc

1.2 创建工作空间

创建一个catkin工作空间用于存放UR5相关包:

mkdir -p ~/ur5_ws/src cd ~/ur5_ws/ catkin_make source devel/setup.bash

2. UR5仿真包安装与配置

2.1 通过apt安装核心包

最简便的方式是通过apt安装官方维护的UR包:

sudo apt install ros-noetic-ur-gazebo ros-noetic-ur-description ros-noetic-ur5-moveit-config

这种方法适合大多数用户,特别是初学者,因为它能自动解决依赖关系。

2.2 源码安装(可选)

如果需要最新功能或自定义修改,可以从GitHub克隆源码:

cd ~/ur5_ws/src git clone -b noetic https://github.com/ros-industrial/universal_robot.git cd .. rosdep install --from-paths src --ignore-src -r -y catkin_make

注意:源码安装可能需要手动解决一些依赖问题,适合有经验的用户。

2.3 验证安装

安装完成后,可以列出所有UR相关包进行验证:

rospack list | grep ur_

应该能看到ur_descriptionur_gazebo等关键包。

3. 启动Gazebo仿真环境

3.1 基础仿真启动

启动UR5在Gazebo中的基础仿真:

roslaunch ur_gazebo ur5.launch

这个命令会启动以下组件:

  • Gazebo仿真环境
  • UR5机械臂模型
  • 必要的控制器和关节状态发布器

首次启动可能需要下载模型,耐心等待完成。

3.2 常见问题解决

如果遇到模型加载问题,可以尝试手动下载Gazebo模型:

mkdir -p ~/.gazebo/models cd ~/.gazebo/models wget http://models.gazebosim.org/ground_plane/model.tar.gz tar -xvf model.tar.gz

对于TF报错,检查ur_description包是否正确安装:

roscd ur_description ls urdf

应该能看到ur5.urdf.xacro等文件。

4. MoveIt集成与运动控制

4.1 启动MoveIt配置

在另一个终端中启动MoveIt规划执行:

roslaunch ur5_moveit_config ur5_moveit_planning_execution.launch sim:=true

然后启动RViz可视化界面:

roslaunch ur5_moveit_config moveit_rviz.launch config:=true

4.2 基础运动控制

在RViz中,你可以:

  1. 通过"Planning"标签页设置目标姿态
  2. 使用"Plan"按钮预览路径
  3. 点击"Execute"让机械臂实际运动

4.3 Python控制示例

创建一个简单的Python脚本控制机械臂运动:

#!/usr/bin/env python import rospy import moveit_commander class UR5Control: def __init__(self): moveit_commander.roscpp_initialize([]) self.robot = moveit_commander.RobotCommander() self.group = moveit_commander.MoveGroupCommander("manipulator") def move_to_joint_angles(self, joint_angles): self.group.go(joint_angles, wait=True) self.group.stop() def move_to_pose(self, pose): self.group.set_pose_target(pose) plan = self.group.go(wait=True) self.group.stop() self.group.clear_pose_targets() if __name__ == '__main__': rospy.init_node('ur5_control') ur5 = UR5Control() # 移动到初始位置 ur5.move_to_joint_angles([0, -1.57, 1.57, -1.57, -1.57, 0])

5. 高级功能与调试技巧

5.1 末端执行器控制

如果需要添加夹爪,修改URDF文件:

<!-- 在ur5.urdf.xacro中添加 --> <gazebo> <plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so"> <robotNamespace>/ur5</robotNamespace> </plugin> </gazebo>

5.2 碰撞检测优化

MoveIt默认会考虑机械臂自碰撞,如果需要添加环境障碍物:

from moveit_msgs.msg import CollisionObject from shape_msgs.msg import SolidPrimitive def add_collision_object(): co = CollisionObject() co.header.frame_id = "world" co.id = "obstacle" primitive = SolidPrimitive() primitive.type = primitive.BOX primitive.dimensions = [0.5, 0.5, 0.5] pose = Pose() pose.position.x = 0.5 pose.position.y = 0 pose.position.z = 0.25 co.primitives.append(primitive) co.primitive_poses.append(pose) co.operation = co.ADD scene.add_object(co)

5.3 性能优化建议

对于较弱的硬件,可以尝试以下优化:

  • 降低Gazebo的物理引擎迭代次数
  • 使用libgazebo_ros_p3d插件替代默认的物理引擎
  • 在RViz中关闭不必要的显示项
# 启动Gazebo时添加参数 roslaunch ur_gazebo ur5.launch gui:=false verbose:=false

6. 实际应用案例

6.1 简单拾取任务

结合MoveIt和Gazebo实现一个简单的拾取流程:

def pick_and_place(): # 接近目标 approach = Pose() approach.position.x = 0.4 approach.position.y = 0.2 approach.position.z = 0.3 ur5.move_to_pose(approach) # 执行抓取 gripper.close() # 移动到放置位置 place = Pose() place.position.x = 0.4 place.position.y = -0.2 place.position.z = 0.3 ur5.move_to_pose(place) # 释放物体 gripper.open()

6.2 轨迹规划

实现一个圆形轨迹运动:

def circular_trajectory(center, radius, steps=20): waypoints = [] for i in range(steps): angle = 2 * 3.14 * i / steps pose = Pose() pose.position.x = center[0] + radius * math.cos(angle) pose.position.y = center[1] + radius * math.sin(angle) pose.position.z = center[2] pose.orientation.w = 1.0 waypoints.append(pose) (plan, fraction) = self.group.compute_cartesian_path( waypoints, 0.01, 0.0) self.group.execute(plan)

6.3 传感器数据获取

获取末端执行器的实时位姿:

def get_end_effector_pose(): current_pose = self.group.get_current_pose().pose print(f"Position: {current_pose.position}") print(f"Orientation: {current_pose.orientation}") return current_pose

在搭建过程中,最常见的坑是依赖缺失和TF配置错误。建议每次修改后都先检查URDF是否正确加载,再逐步添加复杂功能。

← 返回列表