ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于ROS与MoveIt的UR5机械臂抓取工作站搭建实战

基于ROS与MoveIt的UR5机械臂抓取工作站搭建实战 简介本资源是一套基于Python、ROS与MoveIt实现UR5机械臂协同AG95电动夹爪完成视觉引导定位抓取的完整工程方案面向自动化、人工智能、机器人及相关专业本科生与研究生适用于毕业设计、课程设计及科研入门实践。项目已通过答辩并获98分高分代码经实机调试可直接运行涵盖运动规划、夹爪控制、坐标系标定与状态检测等核心功能模块。压缩包共42个文件9.33MB含4个launch启动脚本如go_grasp.launch、check_and_grasp.launch、2个核心Python控制脚本go_grasp.py、dh_hand_client.py、7个备份文件.zbak、19张关键流程与坐标系示意图PNG以及config配置、README.md说明文档和环境依赖文件.env、package.xml等。目前已有110人学习下载提供从环境搭建、参数配置到抓取任务执行的全流程支撑结构清晰、注释规范便于理解MoveIt运动规划逻辑与ROS节点通信机制并支持在此基础上扩展传感器融合或抓取策略优化。1. 项目概述从零搭建一个智能抓取工作站最近在实验室里折腾一个自动化分拣的小项目核心任务就是让一台UR5机械臂配合AG95电动夹爪能够准确地从一堆随机摆放的零件中识别并抓取目标。听起来像是工厂里常见的场景对吧但真上手把Python、ROS、MoveIt这几大件串起来让它们协同工作里面的门道可不少。这个项目本质上是一个典型的“感知-规划-执行”机器人应用它不单单是写几行控制代码更涉及到机器人操作系统ROS的框架理解、运动规划引擎MoveIt的配置与调用以及如何让机械臂和末端执行器夹爪进行无缝配合。如果你正在学习机器人学或者工作中需要快速搭建一个机械臂抓取的Demo或原型系统那么我走过的这条路或许能给你省下不少时间。UR5作为一款在研究和教育领域极其流行的协作机械臂其ROS驱动和MoveIt配置相对成熟AG95则是一款性价比较高的二指电动夹爪常作为UR的末端工具。将两者结合是实现抓取、装配等任务的经典组合。接下来我会详细拆解从环境搭建、模型配置、运动规划到抓取集成的每一个步骤并分享我在调试过程中踩过的坑和总结的经验。2. 核心工具链解析为什么是PythonROSMoveIt在开始动手之前我们得先搞清楚手里这些“工具”是干什么的以及为什么选择这个组合。这就像木匠选刨子和锯子用对了工具活才能干得漂亮。2.1 ROS机器人系统的“神经系统”ROSRobot Operating System虽然名字里带个“操作系统”但它更像是一个运行在Linux之上的分布式通信中间件和工具集。你可以把它理解为一个专为机器人设计的“神经系统”和“标准协议”。在这个项目中ROS的核心价值在于标准化通信UR5机械臂的控制节点、AG95夹爪的驱动节点、我们写的Python规划脚本甚至仿真环境Gazebo它们都是独立的程序ROS中称为节点。ROS提供的话题Topic、服务Service、动作Action等通信机制让这些节点能以标准化的方式交换数据如关节状态、目标位姿、控制命令而无需关心彼此的内部实现。比如MoveIt规划出的轨迹就是通过一个Action消息发送给UR5的驱动节点的。丰富的工具和生态RViz用于三维可视化Gazebo用于物理仿真TF用于坐标系变换管理。这些工具极大地简化了开发调试流程。没有ROS你需要自己写串口/网络通信、自己开发可视化界面、自己处理坐标转换那将是一个巨大的灾难。注意ROS1Noetic和ROS2Humble, Foxy是目前两个主要版本。对于UR5和MoveItROS1 Noetic的支持目前依然最成熟、资料最多。因此本项目基于Ubuntu 20.04 ROS Noetic进行。如果你用Ubuntu 22.04官方推荐ROS2 Humble但相关生态特别是某些第三方驱动可能还在过渡中新手容易踩坑。2.2 MoveIt机械臂的“运动规划大脑”MoveIt是ROS生态中用于移动操作移动操作的核心功能包。它不是一个简单的逆运动学求解器而是一个集成了运动规划、碰撞检测、运动学、3D感知等功能的强大框架。在本项目中MoveIt承担了最核心的“决策”工作运动规划给定一个目标位置比如夹爪要去抓取的那个点MoveIt会调用其内部的规划器默认是OMPL库在考虑机械臂自身关节限制、碰撞约束避免撞到自身或环境的前提下计算出一条从当前位置到目标位置的安全、平滑的关节轨迹。碰撞检测MoveIt内置了基于FCLFlexible Collision Library的碰撞检测功能。你只需要提供机器人自身的URDF模型和周围环境的点云或模型它就能在规划时自动避障。这对于在有一定杂乱度的环境中抓取至关重要。与感知集成MoveIt可以通过ROS话题直接订阅3D相机如Intel Realsense D435i发布的点云数据并自动将其作为碰撞物体加入规划场景实现动态避障。2.3 Python粘合一切的“胶水”和“控制器”为什么用Python而不是C对于这类算法验证、系统集成和快速原型开发项目Python的优势非常明显开发效率高语法简洁有丰富的科学计算库如NumPy处理坐标变换、矩阵运算非常方便。强大的ROS客户端库rospy库使得用Python编写ROS节点变得极其简单几行代码就能发布订阅消息、调用服务。易于与上层逻辑集成如果你的抓取系统未来需要连接视觉识别OpenCV、机器学习PyTorch/TensorFlow或者更高级的任务调度Python是天然的选择。我们的核心脚本就是用Python来调用MoveIt的API发送目标位姿触发规划与执行。2.4 UR5与AG95可靠的硬件执行单元UR5优傲机器人公司的6轴协作臂以其编程灵活性和安全性著称。在ROS中我们通常使用universal_robot官方或社区维护的功能包它提供了UR5的URDF模型、Gazebo仿真模型以及真实的ur_robot_driver用于通过TCP/IP连接实体机器人或ur_gazebo用于仿真驱动节点。AG95一款常见的电动二指夹爪通常通过Modbus RTURS485或TCP与主控器通信。在ROS中我们需要为其编写或找到一个驱动节点该节点订阅一个控制话题如/ag95/gripper_cmd将开合指令转换为具体的通信协议发送给夹爪并发布夹爪的当前状态如开合宽度、是否夹到物体。这个工具链的组合逻辑就很清晰了Python脚本作为上层控制器通过ROS与MoveIt通信请求运动规划MoveIt计算出轨迹后再通过ROS发送给UR5的驱动节点执行同时Python脚本通过ROS向AG95的驱动节点发送开合指令控制抓取动作。3. 环境搭建与模型配置详解万事开头难一个正确的起步环境能避免后续80%的诡异问题。这里我会详细列出步骤和关键配置点。3.1 基础系统与ROS安装首先准备一台安装有Ubuntu 20.04 LTS的电脑或虚拟机。然后按照ROS官方Wiki安装ROS Noetic桌面完整版。安装后务必初始化rosdep并配置好环境变量source /opt/ros/noetic/setup.bash建议将其加入~/.bashrc。3.2 创建工作空间与安装必要功能包我们将在一个Catkin工作空间内进行所有开发。mkdir -p ~/ur5_ag95_ws/src cd ~/ur5_ag95_ws/src接下来需要克隆几个核心的功能包仓库到src目录下UR机械臂官方包git clone -b melodic-devel https://github.com/ros-industrial/universal_robot.git(注意Noetic可以使用melodic-devel分支通常兼容)MoveIt核心包通常已经随桌面完整版安装了。为了确保可以sudo apt install ros-noetic-moveit。AG95夹爪驱动包这是一个关键且容易出问题的地方。AG95没有像UR那样高度标准化的官方ROS驱动。你可能需要在GitHub上搜索ag95_gripper或robotiq_2f_gripper如果AG95兼容Robotiq协议的第三方驱动包。或者根据夹爪的通信协议通常是Modbus TCP/RTU自己用Python (pymodbus库) 或C编写一个简单的ROS驱动节点。这里假设我们找到了一个可用的包将其克隆到src下例如git clone https://github.com/xxx/ag95_ros_driver.git。3.3 构建UR5AG95的完整URDF模型这是让MoveIt认识你的机器人的关键一步。URDF统一机器人描述格式文件定义了机器人的连杆、关节、外观、碰撞体积等所有物理属性。定位UR5的URDF在universal_robot包中通常路径是ur_description/urdf/ur5.urdf.xacro。.xacro是一种宏语言可以方便地参数化和组合模型。集成AG95模型我们需要将AG95的模型文件通常也是一个.xacro或.urdf文件作为末端执行器End-Effector, EE连接到UR5的最后一个连杆wrist_3_link上。这需要修改或创建一个新的.xacro文件。创建组合模型文件在你自己项目的功能包例如my_ur5_ag95中创建一个urdf/目录然后新建一个ur5_ag95.urdf.xacro文件。内容结构如下?xml version1.0? robot xmlns:xacrohttp://www.ros.org/wiki/xacro nameur5_ag95 !-- 1. 包含UR5的宏定义 -- xacro:include filename$(find ur_description)/urdf/ur5.urdf.xacro / !-- 2. 包含AG95夹爪的宏定义 -- xacro:include filename$(find ag95_description)/urdf/ag95.urdf.xacro / !-- 3. 实例化UR5机器人 -- xacro:ur5_robot prefix joint_limitedtrue/ !-- 4. 实例化AG95夹爪并将其link连接到UR5的末端link -- xacro:ag95_gripper prefixgripper_ parentwrist_3_link origin xyz0 0 0 rpy0 0 0/ !-- 调整此处的xyz和rpy使夹爪安装位置正确 -- /xacro:ag95_gripper !-- 5. 定义用于MoveIt的规划组和末端执行器 -- xacro:property nameee_prefix valuegripper_ / !-- 定义一个名为“manipulator”的规划组包含UR5的所有关节 -- xacro:ur5_ag5_transmission prefix / !-- 定义一个末端执行器链接到夹爪的tip_link -- /robot关键点origin标签中的xyz和rpy参数至关重要它定义了夹爪相对于UR5末端法兰盘的偏移和旋转。你需要根据夹爪的实际安装方式可能是通过一个转接板来调整这些值。错误的设置会导致MoveIt规划的目标位姿严重偏离。生成并检查URDF在终端中使用check_urdf命令来验证模型是否正确cd ~/ur5_ag95_ws source devel/setup.bash rosrun xacro xacro src/my_ur5_ag95/urdf/ur5_ag95.urdf.xacro robot.urdf check_urdf robot.urdf如果输出显示机器人解析成功并且关节和连杆关系正确就说明模型没问题。还可以用urdf_to_graphiz生成PDF结构图查看。3.4 使用MoveIt Setup Assistant配置功能包MoveIt提供了一个图形化工具moveit_setup_assistant来帮我们生成最重要的配置文件。启动助手roslaunch moveit_setup_assistant setup_assistant.launch创建新配置选择你的robot.urdf文件。自碰撞矩阵让MoveIt自动计算机器人各部分之间在默认姿态下的碰撞情况用于优化规划速度。规划组这是核心配置。添加一个名为manipulator的组类型选择Kinematic Chain。基座连杆Base Link选择base_link末端连杆Tip Link选择你定义的夹爪末端连杆例如gripper_tip_link。这告诉MoveIt哪部分是需要规划的机械臂本体。再添加一个名为gripper的组类型选择Joint Model。将AG95夹爪的控制关节如finger_joint添加进去。这用于控制夹爪开合。预定义位姿可以定义一些常用位姿如home初始位置、ready准备抓取位置等方便调用。末端执行器将gripper组关联为末端执行器。被动关节通常无需配置。作者信息随意填写。生成配置指定输出路径为你的功能包目录如~/ur5_ag95_ws/src/my_ur5_ag95然后点击“生成功能包”。完成后你的功能包里会多出config/和launch/两个关键目录里面包含了MoveIt运行所需的所有配置文件如kinematics.yaml,joint_limits.yaml,ompl_planning.yaml和启动文件。4. 运动规划与抓取控制代码实现环境配好了模型也齐了现在我们来写让机器人动起来的“大脑”——Python控制脚本。4.1 Python脚本框架与MoveIt API创建一个Python脚本例如pick_and_place.py。首先导入必要的ROS和MoveIt模块#!/usr/bin/env python3 import sys import rospy import moveit_commander import moveit_msgs.msg import geometry_msgs.msg from math import pi, tau, dist, fabs, cos from std_msgs.msg import String from moveit_commander.conversions import pose_to_list初始化ROS节点和MoveItmoveit_commander.roscpp_initialize(sys.argv) rospy.init_node(ur5_ag95_pick_place, anonymousTrue) robot moveit_commander.RobotCommander() scene moveit_commander.PlanningSceneInterface() group_name manipulator move_group moveit_commander.MoveGroupCommander(group_name) gripper_group moveit_commander.MoveGroupCommander(gripper)这里我们创建了两个MoveGroupCommander对象一个控制机械臂(manipulator)一个控制夹爪(gripper)。4.2 规划并执行移动至目标点假设我们通过视觉系统这部分代码略得到了目标物体在“base_link”坐标系下的位姿target_pose。# 假设 target_pose 是一个 geometry_msgs.msg.Pose 对象 # target_pose.position.x, .y, .z 是位置 # target_pose.orientation.x, .y, .z, .w 是四元数朝向 # 1. 设置目标位姿 move_group.set_pose_target(target_pose) # 2. 进行运动规划 plan move_group.plan() # 3. 执行规划好的轨迹 if plan[0]: # plan[0] 表示规划是否成功 rospy.loginfo(Planning succeeded, executing...) move_group.execute(plan[1], waitTrue) # plan[1] 是具体的轨迹消息 else: rospy.loginfo(Planning failed!)set_pose_target设置的是末端执行器即我们定义的夹爪末端gripper_tip_link的目标位姿。MoveIt会自动进行逆运动学求解找到一组关节角度来实现这个位姿。4.3 控制AG95夹爪抓取与释放控制夹爪的逻辑相对独立。通常AG95驱动节点会提供一个ROS服务Service或话题Topic来控制。如果通过服务控制import rospy from ag95_gripper_msgs.srv import ControlGripper, ControlGripperRequest rospy.wait_for_service(/ag95/control) gripper_control rospy.ServiceProxy(/ag95/control, ControlGripper) # 抓取 req ControlGripperRequest() req.command close req.speed 50 # 速度百分比 req.force 30 # 力百分比 resp gripper_control(req) # 释放 req.command open req.position 100 # 打开到100%宽度 resp gripper_control(req)如果通过话题控制from std_msgs.msg import Float64 gripper_pub rospy.Publisher(/ag95/gripper_cmd, Float64, queue_size10) # 发布一个0.0到1.0之间的值0代表完全闭合1代表完全打开 gripper_pub.publish(0.0) # 闭合 rospy.sleep(2) gripper_pub.publish(1.0) # 打开一个完整的抓取序列通常是1. 移动至物体上方预抓取点Approach- 2. 直线下降至抓取点 - 3. 闭合夹爪 - 4. 提升物体 - 5. 移动至放置点 - 6. 打开夹爪。步骤2和4可以使用MoveIt的笛卡尔路径规划compute_cartesian_path来实现直线运动。4.4 在RViz和Gazebo中可视化与仿真在部署到真机前强烈建议在仿真环境中充分测试。启动RViz和MoveItroslaunch my_ur5_ag95 demo.launch这会启动RViz并加载你的机器人模型和MoveIt配置。你可以在RViz中使用“Interact”工具拖拽末端执行器来设置目标然后点击“Plan”和“Execute”来测试规划。这是检查运动学模型和规划是否正确的第一步。启动Gazebo仿真roslaunch my_ur5_ag95 gazebo.launch这个启动文件会加载UR5和AG95的Gazebo模型并启动必要的控制器joint_state_controller,arm_controller,gripper_controller。然后再启动MoveItroslaunch my_ur5_ag95 moveit_planning_execution.launch现在你运行之前的Python脚本就能在Gazebo中看到带物理效果的仿真运动了。你可以添加一些简单的方块模型作为被抓取物体来测试完整的抓取流程。5. 关键问题排查与调试心得在实际集成中你几乎一定会遇到各种问题。下面是我总结的一些常见坑点和解决方法。5.1 坐标系混乱导致规划失败这是最常见的问题。机器人世界里到处都是坐标系TF Frame。症状MoveIt规划失败报错“Unable to transform from frame [xxx] to frame [yyy]”或规划出的路径完全不对。排查在终端运行rosrun tf view_frames会生成一个frames.pdf文件用浏览器打开查看整个TF树的结构。确保base_link,wrist_3_link,gripper_tip_link等关键坐标系之间的连接关系正确。在RViz中添加TF显示插件勾选所有坐标系观察它们的位置和朝向是否合理。特别检查夹爪末端坐标系是否在指尖中心。检查你的目标位姿target_pose是在哪个坐标系下给出的。你的Python脚本中move_group.set_pose_target(pose)默认使用move_group.get_planning_frame()返回的坐标系通常是base_link或world。必须确保你的目标位姿与这个坐标系一致。5.2 碰撞检测导致无解症状规划始终失败即使目标点看起来可达。排查在RViz的MoveIt插件中开启“Planning Scene”显示查看MoveIt认为的碰撞物体有哪些。有时机器人的自我碰撞模型过于保守或者环境点云被误认为障碍物。调整规划场景。可以暂时移除所有环境障碍物进行测试scene.remove_world_object()。调整joint_limits.yaml和ompl_planning.yaml中的参数。例如增加planning_time尝试不同的规划算法如RRTConnect,PRMstar或者适当放宽关节速度、加速度限制。5.3 夹爪控制无响应或不同步症状机械臂运动正常但夹爪不动作或者动作后状态反馈不对。排查话题/服务名不对用rostopic list或rosservice list查看AG95驱动节点实际发布/订阅的话题和提供的服务名确保你的Python脚本中使用的名称完全一致。消息类型不匹配用rostopic type /ag95/gripper_cmd和rosmsg show查看话题消息的具体结构确保你发布的消息格式正确。驱动节点未运行或崩溃检查驱动节点的启动文件确保其正确启动并用rosnode info /ag95_driver查看节点状态。硬件连接问题如果是真机检查USB转RS485转换器如果使用Modbus RTU的端口权限/dev/ttyUSB*和驱动或者检查网络连接如果使用Modbus TCP。5.4 从仿真到真机的过渡问题在Gazebo里运行完美连上真机就不行。IP地址与端口真机UR5需要通过网线连接并设置正确的静态IP。修改ur_robot_driver启动文件中的机器人IP参数。控制器切换仿真中使用的是ros_control提供的虚拟控制器而真机需要使用ur_robot_driver提供的scaled_pos_joint_traj_controller等控制器来通信。确保你的MoveIt启动文件moveit_planning_execution.launch中controller_manager和trajectory_execution相关的配置针对真机进行了正确设置。安全设置真机UR5有安全边界、关节力矩限制等。首次运行时建议在“手动模式”下低速测试并在示教器旁随时准备按下急停按钮。5.5 性能优化与提升稳定性的技巧规划超时默认规划时间可能不够。在代码中增加move_group.set_planning_time(10.0)给予更长的规划时间。使用预定义位姿对于home,ready等固定点使用move_group.set_named_target(home)比设置一个具体的位姿更可靠。允许重规划在连续操作中可以设置move_group.allow_replanning(True)让MoveIt在环境变化或规划失败时尝试重新规划。轨迹执行监控execute命令的waitTrue参数会阻塞直到执行完成。对于长时间任务可以考虑异步执行并添加完成回调函数以便进行状态监控和错误处理。调试机器人系统耐心和细致的观察是最重要的。充分利用RViz的可视化、ROS的rostopic echo、rqt_graph等工具像侦探一样层层排查最终总能定位到问题所在。这个过程虽然繁琐但也是理解整个机器人系统如何运作的最佳途径。当你第一次看到UR5带着AG95流畅地完成抓取动作时那种成就感会让你觉得所有的折腾都是值得的。本文还有配套的精品资源点击获取
返回列表