ARTICLE DETAIL

资讯详情

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

基于ROS与MoveIt的UR5机械臂抓取任务:从原理到工程实现

基于ROS与MoveIt的UR5机械臂抓取任务:从原理到工程实现 简介本资源是一套基于Python、ROS与MoveIt框架实现UR5机械臂协同AG95夹爪完成给定位姿抓取任务的完整工程方案面向计算机、自动化、人工智能等专业学生及初学者解决机器人运动规划与末端执行器协同控制的学习与实践难点适用于课程设计、毕业设计及ROS机器人入门进阶。压缩包共34个文件含4个核心launch启动脚本如go_grasp.launch、check_and_grasp.launch、2个Python主控程序go_grasp.py与dh_hand_client.py、3个TF坐标系配置文件、19张关键流程截图涵盖RVIZ仿真界面、坐标系示意图、抓取状态验证图等以及README.md、环境配置.env、配置yaml等支撑文件整体大小为9.33MB。已有348人学习下载项目源自高分毕设答辩98分代码经实机/仿真双重调试验证可稳定运行并附详细开发文档与项目解析涵盖MoveIt配置要点、UR5AG95硬件接口逻辑、位姿设定原理及常见报错处理路径结构清晰、注释充分便于理解底层调用机制并二次扩展功能。1. 项目概述一个完整的机器人抓取任务实现如果你正在学习或从事机器人应用开发尤其是机械臂控制那么“让机械臂移动到指定位置并抓取物体”这个任务几乎是绕不开的经典课题。它听起来简单但背后串联了机器人学中多个核心模块运动规划、逆运动学求解、末端执行器控制、以及整个软件框架的集成。这个项目就是基于Python、ROS和MoveIt这套在工业与科研界极为流行的技术栈驱动一台UR5协作机械臂和AG95电动夹爪完成一个完整的“给定位姿抓取”任务。简单来说这个项目提供了一个从零到一的“样板间”。它不仅仅是一堆代码更是一个清晰的工程实现范例展示了如何将理论算法与实际硬件或仿真环境连接起来。UR5以其高精度和开放的接口成为学习与原型开发的理想平台而AG95夹爪则代表了现代灵巧末端执行器。通过MoveIt这个强大的运动规划框架我们无需从零编写复杂的路径规划算法就能让机械臂安全、平滑地运动到目标位姿。整个项目的价值在于其“实用性”——它处理了真实开发中你会遇到的那些琐碎但关键的问题比如坐标变换、关节状态监听、动作服务调用以及如何优雅地组织你的ROS节点和启动文件。无论你是机器人专业的学生想完成课程设计还是工程师需要快速搭建一个抓取演示系统甚至是爱好者想深入理解ROS机械臂开发这份源码和文档都能为你节省大量摸索时间让你直接切入核心逻辑并基于此进行二次开发。2. 核心架构与工具链深度解析2.1 为什么是PythonROSMoveIt这个组合在机器人开发领域技术选型直接决定了开发效率和系统可靠性。PythonROSMoveIt这个“黄金三角”组合几乎是目前解决此类问题的标准答案其背后的逻辑非常清晰。ROS扮演了“神经系统”的角色。它不是一个操作系统而是一个机器人元操作系统提供了一套通信中间件。在抓取任务中机械臂驱动、夹爪控制器、传感器、规划算法等模块都是独立的进程ROS节点。ROS的核心价值在于它标准化的通信机制话题、服务、动作让这些异构的模块能够以松耦合的方式高效交换数据。例如MoveIt规划出的轨迹通过/follow_joint_trajectory话题发布UR5的驱动节点订阅这个话题并执行同时驱动节点会持续发布机械臂各个关节的实时角度/joint_states话题MoveIt和你的控制节点都需要监听它来知晓机械臂的当前状态。没有ROS你需要自己设计一套复杂的进程间通信协议而ROS帮你标准化了这一切。MoveIt则是这个神经系统上的“运动控制大脑”。它是ROS生态中功能最全面的运动规划框架。你告诉MoveIt机械臂的模型通过URDF文件、当前关节状态、目标位姿以及环境中的障碍物信息它就能利用内置的规划器如OMPL、CHOMP为你计算出一条从起点到终点、无碰撞、符合动力学约束的关节空间或笛卡尔空间轨迹。对于UR5这样的六轴机械臂逆运动学IK求解是核心难题MoveIt集成了多种IK求解器如KDL、TRAC-IK能高效可靠地为你计算出目标位姿对应的关节角度。在本项目中我们主要利用MoveIt的MoveGroup接口通过Python API发送目标并等待规划与执行完成这极大地简化了开发。Python是粘合剂和上层逻辑的“指挥官”。MoveIt提供了完善的Python接口moveit_commander使得我们能够用非常简洁的代码完成复杂的规划任务。Python脚本的灵活性让我们可以轻松地编写任务序列逻辑比如先规划到物体上方的一个预抓取点再直线下降到抓取点控制夹爪闭合最后提升物体并移动到放置点。整个流程可以用清晰的顺序或状态机来组织。相比于CPython在快速原型开发和算法验证上具有显著优势。注意虽然Python开发快捷但在对实时性要求极高的底层控制循环中C仍是首选。不过对于本项目的运动规划层和任务逻辑层Python的性能完全足够且更易于理解和修改。2.2 UR5与AG95硬件选型的考量UR5机械臂来自Universal Robots是协作机器人领域的标杆产品。选择它作为开发平台有几个不可替代的优势开放的通信接口UR机器人原生支持ROS通过ur_robot_driver等官方/社区驱动包可以无缝接入ROS系统实时接收轨迹指令并反馈状态。安全性高作为协作机器人它内置力传感和碰撞检测适合在与人共享的空间进行学习和测试降低了安全风险。模型完善ROS和MoveIt社区对UR系列机器人的支持极好有现成、精确的URDF统一机器人描述格式模型文件包含了质量、惯性、碰撞体积等关键信息直接可用于MoveIt的规划和Gazebo仿真。普及度高丰富的教程和案例意味着你遇到的大部分问题很可能已经有人解决并分享出来了。AG95电动夹爪是一款性价比很高的二指平行夹爪。在ROS中集成夹爪通常有两种模式Topic控制模式夹爪的驱动板作为一个独立的ROS节点发布一个话题如/ag95/grip来控制开合。你的Python脚本只需要向该话题发布一个目标宽度或力度的消息即可。Action控制模式更规范的方式。夹爪控制器提供一个动作Action服务器你的脚本作为客户端发送目标如goal并可以监听执行反馈和结果。这种方式更适合需要等待夹爪动作完成再执行下一步的序列任务。在项目中源码需要根据你实际使用的AG95的ROS驱动包来确定控制方式。通常你需要先启动夹爪的驱动节点使其准备好接收指令。2.3 项目文件结构剖析一个组织良好的项目结构是成功的一半。一个典型的基于本项目的工程目录可能如下所示ur5_ag95_grasp_demo/ ├── config/ │ ├── ur5_ag95.srdf # MoveIt语义机器人描述文件定义了规划组、末端效应器等 │ └── kinematics.yaml # 逆运动学求解器配置 ├── launch/ │ ├── demo.launch # 启动MoveIt演示和RViz可视化 │ ├── gazebo.launch # 启动Gazebo仿真环境如果使用仿真 │ ├── real_robot.launch # 启动真实UR5和AG95的驱动节点 │ └── grasp_demo.launch # 启动本项目的核心抓取演示节点 ├── scripts/ │ └── grasp_pose_demo.py # 核心的Python抓取演示脚本 ├── urdf/ │ ├── ur5_ag95.urdf.xacro # 描述UR5AG95整体模型的xacro文件 │ └── meshes/ # 机器人部件的3D网格文件 ├── CMakeLists.txt ├── package.xml # ROS包定义文件 └── README.md # 项目文档说明urdf/这是项目的基石。ur5_ag95.urdf.xacro文件利用Xacro宏语言将UR5的模型和AG95的模型组装在一起并定义了它们之间的固定连接fixedjoint。这个文件会被MoveIt读取用于运动规划和碰撞检测。config/MoveIt的配置文件夹。.srdf文件非常重要它定义了哪些关节属于arm规划组用于移动机械臂哪些关节属于gripper规划组用于控制夹爪以及夹爪的末端执行器eef链接是哪个。这直接决定了你能否分别控制手臂和手爪。launch/ROS的启动文件目录。通过.launch文件可以一键启动多个相关的ROS节点这是ROS项目管理复杂性的关键。scripts/grasp_pose_demo.py这是你需要重点关注和编写的核心逻辑文件。它包含了从给定目标位姿到完成抓取的全部代码。3. 核心代码实现与关键步骤拆解3.1 环境搭建与依赖安装在运行代码前一个稳定的ROS环境是前提。假设你使用的是Ubuntu 20.04 ROS Noetic这是与UR5驱动兼容性较好的经典组合。如果你的系统是Ubuntu 22.04则需要使用ROS 2 Humble或ROS 2 Rolling但相关包的名称和API会有变化需特别注意。安装ROS Noetic按照官方教程完成基础安装。安装MoveItsudo apt install ros-noetic-moveit安装UR驱动sudo apt install ros-noetic-ur-robot-driver ros-noetic-ur-client-library安装AG95驱动这通常需要从夹爪供应商或GitHub仓库获取源码进行编译。例如可能是一个名为ag95_gripper的ROS包。创建工作空间并编译项目mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src # 将你的项目文件夹如ur5_ag95_grasp_demo放入src目录 cd ~/catkin_ws catkin_make source devel/setup.bash3.2 Python核心脚本逐行解析让我们深入grasp_pose_demo.py脚本看看一个完整的抓取任务是如何一步步实现的。#!/usr/bin/env python3 import rospy import sys import moveit_commander import moveit_msgs.msg import geometry_msgs.msg import actionlib from math import pi class UR5GraspDemo: def __init__(self): # 初始化MoveIt commander和ROS节点 moveit_commander.roscpp_initialize(sys.argv) rospy.init_node(ur5_grasp_demo, anonymousTrue) # 实例化RobotCommander对象提供整个机器体的信息 self.robot moveit_commander.RobotCommander() # 实例化PlanningSceneInterface对象用于与周围环境交互添加/移除障碍物 self.scene moveit_commander.PlanningSceneInterface() # 实例化MoveGroupCommander对象用于控制“arm”规划组即UR5机械臂 self.arm_group moveit_commander.MoveGroupCommander(arm) # 实例化MoveGroupCommander对象用于控制“gripper”规划组即AG95夹爪 self.gripper_group moveit_commander.MoveGroupCommander(gripper) # 设置一些规划参数这些值需要根据实际调试 self.arm_group.set_planning_time(5.0) # 规划时间限制为5秒 self.arm_group.set_num_planning_attempts(10) # 规划尝试次数 self.arm_group.set_max_velocity_scaling_factor(0.5) # 最大速度缩放因子0.5表示一半速度更安全 self.arm_group.set_max_acceleration_scaling_factor(0.3) # 最大加速度缩放因子 # 等待RViz等可视化工具就绪非必须但是个好习惯 rospy.sleep(2) print(机器人模型加载完毕规划组初始化完成。) def go_to_pose_goal(self, pose_goal): 将机械臂末端移动到指定的目标位姿 # pose_goal 是一个 geometry_msgs.msg.Pose 对象 self.arm_group.set_pose_target(pose_goal) # 调用plan()方法进行运动规划返回一个元组 (plan, success, planning_time, error_code) plan self.arm_group.plan() success plan[1] if success: print(规划成功正在执行轨迹...) # 执行规划好的轨迹 self.arm_group.execute(plan[0], waitTrue) # 等待动作完成 self.arm_group.stop() # 停止当前运动 self.arm_group.clear_pose_targets() # 清除所有目标位姿 rospy.sleep(0.5) # 短暂停顿让系统稳定 return True else: print(规划失败无法到达目标位姿。) self.arm_group.clear_pose_targets() return False def operate_gripper(self, width): 控制夹爪开合到指定宽度单位米 # 对于平行夹爪通常通过设置关节目标来控制AG95可能只有一个关节 gripper_joint_names self.gripper_group.get_active_joints() # 假设AG95只有一个控制开合的关节名为finger_joint if len(gripper_joint_names) 1: # 将宽度转换为关节角度或位置这里需要根据夹爪模型确定转换关系 # 例如有些模型是线性映射关节位置 宽度 / 2 joint_target_value width / 2.0 joint_target {gripper_joint_names[0]: joint_target_value} self.gripper_group.set_joint_value_target(joint_target) success self.gripper_group.go(waitTrue) self.gripper_group.stop() return success else: print(夹爪关节配置异常。) return False def perform_grasp_sequence(self, grasp_pose, pre_grasp_height0.1): 执行完整的抓取序列预抓取位姿 - 抓取位姿 - 闭合夹爪 - 提起 print( 开始执行抓取序列 ) # 1. 移动到预抓取点抓取点正上方 pre_grasp_pose grasp_pose pre_grasp_pose.position.z pre_grasp_height # 在Z轴方向抬高 print(f规划到预抓取点: {pre_grasp_pose.position}) if not self.go_to_pose_goal(pre_grasp_pose): print(无法到达预抓取点序列终止。) return False # 2. 直线下降到抓取点笛卡尔空间直线运动 print(f直线下降到抓取点: {grasp_pose.position}) # MoveIt支持笛卡尔路径规划 waypoints [] waypoints.append(grasp_pose) # 将目标抓取位姿作为路径点 # compute_cartesian_path 会计算从当前位置到waypoints中所有点的直线路径 (plan, fraction) self.arm_group.compute_cartesian_path( waypoints, # 路径点列表 0.01, # 路径分辨率米值越小路径越精确 0.0) # 跳跃阈值通常为0禁用 if fraction 0.9: # 如果规划完成了90%以上的路径认为成功 self.arm_group.execute(plan, waitTrue) rospy.sleep(0.5) else: print(笛卡尔直线路径规划失败尝试使用普通规划。) if not self.go_to_pose_goal(grasp_pose): return False # 3. 闭合夹爪抓取物体 print(闭合夹爪抓取物体。) grasp_width 0.02 # 假设抓取物体时夹爪宽度为2cm这个值需要根据物体调整 if not self.operate_gripper(grasp_width): print(夹爪闭合失败。) # 即使失败也尝试提起避免卡住 rospy.sleep(0.5) # 等待夹爪稳定抓取 # 4. 提起物体回到预抓取点或更高 print(提起物体。) lift_pose grasp_pose lift_pose.position.z pre_grasp_pose.position.z # 提起到预抓取高度 if not self.go_to_pose_goal(lift_pose): print(提起物体失败。) return False print( 抓取序列完成 ) return True def run_demo(self): 主演示函数定义几个目标位姿并执行抓取 # 首先移动机械臂到一个已知的“观察”或“回家”位姿 print(移动机械臂到初始位姿...) self.arm_group.set_named_target(home) # 假设在SRDF中定义了一个叫“home”的预设位姿 self.arm_group.go(waitTrue) # 示例定义一个目标抓取位姿在实际应用中这个位姿可能来自视觉识别 target_pose geometry_msgs.msg.Pose() target_pose.position.x 0.3 # 距离机器人基座前方30cm target_pose.position.y 0.2 # 偏左20cm取决于基座坐标系定义 target_pose.position.z 0.1 # 离地10cm # 设置末端姿态四元数。这里让夹爪竖直向下RPY: 0, pi, 0 转换为四元数 target_pose.orientation.x 0.0 target_pose.orientation.y 0.7071068 # sin(pi/4) target_pose.orientation.z 0.0 target_pose.orientation.w 0.7071068 # cos(pi/4) print(f目标抓取位姿设定为: {target_pose.position}) # 执行抓取序列 self.perform_grasp_sequence(target_pose) # 抓取完成后可以移动到放置点并松开夹爪 print(移动到放置点...) place_pose geometry_msgs.msg.Pose() place_pose.position.x 0.3 place_pose.position.y -0.2 # 放到另一边 place_pose.position.z 0.15 place_pose.orientation target_pose.orientation # 保持相同姿态 if self.go_to_pose_goal(place_pose): print(到达放置点松开夹爪。) open_width 0.08 # 张开到8cm self.operate_gripper(open_width) rospy.sleep(0.5) print(演示结束返回初始位姿。) self.arm_group.set_named_target(home) self.arm_group.go(waitTrue) # 关闭MoveIt commander moveit_commander.roscpp_shutdown() if __name__ __main__: try: demo UR5GraspDemo() demo.run_demo() except rospy.ROSInterruptException: pass3.3 关键环节与参数详解位姿Pose的定义这是整个项目的核心输入。一个geometry_msgs/Pose消息包含position(x, y, z) 和orientation(x, y, z, w 四元数)。坐标系至关重要默认情况下MoveIt的规划是在planning_frame通常是base_link或world中进行的。你给出的目标位姿必须是相对于这个坐标系的。务必在RViz中确认坐标系是否正确。规划与执行分离plan()和execute()分开调用是一个好习惯。plan()只做计算不移动机器人这允许你在真正执行前检查规划的轨迹是否合理例如在RViz中预览。execute()才真正驱动机器人运动。笛卡尔路径规划compute_cartesian_path是实现直线运动的关键。它计算末端执行器在笛卡尔空间直线移动的路径这对于“垂直下降抓取”这类动作非常有用可以避免末端不必要的旋转。参数eef_step示例中的0.01决定了路径点的密度值越小路径越平滑但计算量越大。夹爪控制示例中通过MoveGroup控制夹爪关节。这是一种通用方法但前提是夹爪的URDF模型正确并且在MoveIt的SRDF配置中定义了gripper规划组。另一种更直接的方式是如果AG95的驱动提供了ROS Action或Service你可以直接创建Action客户端或Service客户端来调用这样可能更稳定。速度与加速度缩放set_max_velocity_scaling_factor和set_max_acceleration_scaling_factor是安全调试的黄金法则。在初次运行或调试新位姿时务必将其设置为较低的值如0.3-0.5让机器人慢速运动。确认轨迹无误后再逐步提高。这能有效防止因规划错误导致的剧烈或碰撞运动。4. 实战调试与避坑指南4.1 启动流程与可视化监控一个可靠的启动流程是调试的基础。建议创建一个总启动文件grasp_demo.launchlaunch !-- 1. 启动机器人模型仿真或真实 -- !-- 选项A: 启动Gazebo仿真 -- include file$(find ur5_ag95_grasp_demo)/launch/gazebo.launch/ !-- 选项B: 启动真实机器人驱动 -- !-- include file$(find ur_robot_driver)/launch/ur5_bringup.launch/ -- !-- include file$(find ag95_gripper)/launch/ag95_driver.launch/ -- !-- 2. 启动MoveIt加载规划配置 -- include file$(find ur5_ag95_moveit_config)/launch/move_group.launch arg nameallow_trajectory_execution valuetrue/ /include !-- 3. 启动RViz并加载预配置的视图 -- include file$(find ur5_ag95_moveit_config)/launch/moveit_rviz.launch arg nameconfig valuetrue/ /include !-- 4. 启动我们的抓取演示节点 -- node namegrasp_demo_node pkgur5_ag95_grasp_demo typegrasp_pose_demo.py outputscreen/ /launch在终端中运行roslaunch ur5_ag95_grasp_demo grasp_demo.launch后RViz界面会打开。在RViz中你需要添加几个关键显示项RobotModel查看机器人模型是否正确加载。MotionPlanning这是MoveIt的插件可以交互式地设置目标位姿并规划。TF查看坐标系变换树确保base_link、tool0UR5末端、gripper_link夹爪末端等坐标系关系正确。可视化调试技巧在运行你的Python脚本前先使用RViz的“Interact”模式用鼠标拖动末端效应器夹爪到你想抓取的位置然后点击“Plan”按钮。观察规划出的轨迹一条彩色的线是否平滑、有无碰撞碰撞部分会显示为红色。这是一个快速验证目标位姿是否“可达”的方法。4.2 常见问题与解决方案速查表问题现象可能原因排查步骤与解决方案规划始终失败1. 目标位姿超出机器人工作空间。2. 逆运动学IK无解。3. 目标位姿与当前位姿相差太远规划器找不到路径。1.检查工作空间在RViz中手动拖动末端观察可达范围。确保目标点在范围内。2.调整末端姿态过于极端的末端旋转角度可能导致IK失败。尝试微调目标姿态的四元数或使用set_pose_targets尝试多个相近姿态。3.设置中间点如果起点和终点位姿相差巨大如关节角跨度超过180度将其分解为多个中间步骤。规划成功但执行时卡住或抖动1. 轨迹点之间的时间间隔或速度规划不合理。2. 真实机器人驱动与规划轨迹的频率不匹配。3. 关节速度/加速度/力矩超限。1.降低速度因子如前所述将set_max_velocity_scaling_factor设为0.3或更低再试。2.检查控制器确认真实机器人的joint_trajectory_controller已正确加载并运行。在仿真中检查Gazebo的控制器插件。3.查看关节状态通过rostopic echo /joint_states观察规划轨迹发布时关节角度命令是否平滑变化。夹爪不动作1. MoveIt中gripper规划组配置错误。2. 夹爪关节名称不匹配。3. 夹爪的ROS驱动节点未运行或话题/服务不对。1.检查SRDF确认gripper规划组包含了正确的夹爪关节名如finger_joint。2.打印关节名在脚本中添加print(self.gripper_group.get_active_joints())确认获取到的关节名与URDF一致。3.检查驱动运行rosnode list和rostopic list确认夹爪驱动节点在运行并查看它订阅/发布的话题。可能需要改用直接的话题发布或Action调用。抓取时物体被推倒1. 抓取点Z轴坐标不准确未考虑物体高度。2. 下降速度过快。3. 未进行接触检测。1.精确标定使用手眼标定或测量确保视觉给出的物体顶部坐标准确。抓取点应是物体抓取部位的中心。2.使用笛卡尔慢速下降在compute_cartesian_path中降低eef_step并配合低速因子使下降更平稳。3.引入力控或视觉伺服高级在接近物体时切换为力控模式或使用视觉反馈实时调整末端位置。RViz中模型与真实/仿真机器人不同步TF坐标系树错误或发布时间不同步。1.检查TF树运行rosrun tf view_frames生成PDF查看坐标系连接关系是否正确。2.检查时间戳确保所有发布tf和joint_states的节点时间同步使用use_sim_time参数或在真实机器人上使用NTP。4.3 从仿真到真机关键迁移步骤在Gazebo中调试无误后迁移到真实机器人需要格外小心驱动切换将启动文件中的Gazebo启动部分替换为真实UR5和AG95的驱动启动文件。UR官方提供的ur_robot_driver需要配置正确的机器人IP地址。安全第一急停开关确保物理急停按钮在手边。降低速度首次真机运行时务必在脚本中将速度缩放因子设置为0.1或更低。手动模式验证先用示教器或ROS命令控制机器人单轴缓慢运动确认运动方向正确。标定仿真中的坐标系是理想的。真实世界中你需要确定base_link坐标系与机器人安装底座的实际关系。如果使用视觉手眼标定是必须的。网络与延迟确保工控机与机器人控制器之间的网络稳定、低延迟。不稳定的网络会导致轨迹指令丢失引发抖动或停止。一个实用的真机调试技巧编写一个简单的“点动”测试脚本。让机器人依次移动到几个已知的安全关节角度通过set_joint_value_target实现确认基础通信和运动正常后再测试笛卡尔空间位姿控制。5. 项目扩展与进阶思路这个基础抓取项目是一个强大的起点你可以在此基础上进行多方面的扩展使其更智能、更鲁棒集成视觉感知这是最自然的扩展。使用RGB-D相机如Intel Realsense、Azure Kinect通过ROS中的vision_msgs或pcl点云库识别桌面上物体的位置和姿态。将识别到的物体位姿通常是camera_link坐标系下通过tf变换到base_link坐标系然后作为target_pose输入给MoveIt。你可以引入aruco码等标记物来简化物体识别和定位。动态环境与避障MoveIt的PlanningSceneInterface允许你动态添加/移除环境中的障碍物。你可以订阅激光雷达或深度相机的点云话题将点云作为障碍物添加到规划场景中。这样机械臂在运动时会自动避开这些区域。这对于有移动障碍物或环境变化的场景至关重要。抓取姿态采样对于一个物体单一的抓取位姿可能不是最优的。你可以编写一个函数围绕物体生成多个可能的抓取位姿例如在物体包围盒的不同面生成不同的夹爪朝向然后让MoveIt尝试为每个位姿进行规划选择其中规划时间最短、路径最优的一个执行。这提高了抓取的成功率。引入状态机使用smach或behavior_tree等ROS任务管理框架将“移动到观察点”、“识别物体”、“规划抓取”、“执行抓取”、“放置”等步骤组织成一个清晰的状态机。这使代码更模块化更容易处理失败和重试逻辑。力控抓取更高级的应用是引入力/力矩传感器。在夹爪闭合过程中不是简单地移动到指定宽度而是监测电流或力传感器读数当达到预设的抓取力时停止。这可以实现自适应抓取防止夹碎易碎物品或抓取不稳。这个基于Python、ROS和MoveIt的UR5抓取项目就像为你搭建好了舞台。舞台上的机器人、灯光、幕布硬件、驱动、规划框架都已就位。你的脚本是导演而如何编排一出更复杂、更智能的机器人戏剧就取决于你的想象力和进一步的探索了。从让机械臂准确地移动到第一个点开始每一步成功的运动都是向更复杂自动化世界迈进的一块坚实基石。本文还有配套的精品资源点击获取
返回列表