如何通过MoveIt接口控制UR5机器人?代码报错求助
问题修复方案
1. 解决AttributeError: 'MoveRobotNode' object has no attribute 'move_group'
代码中__init__方法里创建的move_group是局部变量,没有绑定为类实例属性,导致go_to_joint_state方法无法通过self.move_group访问。修改方式:将__init__中的局部变量改为实例属性:
def __init__(self): moveit_commander.roscpp_initialize(sys.argv) rospy.init_node("move_robot_node", anonymous=True) self.robot = moveit_commander.RobotCommander() self.scene = moveit_commander.PlanningSceneInterface() group_name = "manipulator" self.move_group = moveit_commander.MoveGroupCommander(group_name)
2. 解决tau未定义错误
代码使用了tau但未定义,tau代表2π,需要导入math模块并定义该变量:
在代码开头添加:
import math tau = 2 * math.pi
3. 处理运动学求解器警告
警告提示运动学求解器不再支持尝试次数参数,仅支持超时设置,可通过两种方式处理:
- 临时删除参数:运行代码前在终端执行
rosparam delete /robot_description_kinematics/manipulator/kinematics_solver_attempts
- 永久删除参数:找到UR5的运动学配置文件(通常在
ur5_moveit_config/config/kinematics.yaml),删除kinematics_solver_attempts对应的行。
修复后的完整代码
#!/usr/bin/env python3 import sys import copy import rospy import math import moveit_commander import moveit_msgs.msg import geometry_msgs.msg tau = 2 * math.pi class MoveRobotNode(): """MoveRobotNode""" def __init__(self): moveit_commander.roscpp_initialize(sys.argv) rospy.init_node("move_robot_node", anonymous=True) self.robot = moveit_commander.RobotCommander() self.scene = moveit_commander.PlanningSceneInterface() group_name = "manipulator" self.move_group = moveit_commander.MoveGroupCommander(group_name) def go_to_joint_state(self): move_group = self.move_group joint_goal = move_group.get_current_joint_values() joint_goal[0] = 0 joint_goal[1] = -tau / 8 joint_goal[2] = 0 joint_goal[3] = -tau / 4 joint_goal[4] = 0 joint_goal[5] = tau / 6 # 1/6 of a turn joint_goal[6] = 0 move_group.go(joint_goal, wait=True) move_group.stop() if __name__ == "__main__": try: robot_control = MoveRobotNode() robot_control.go_to_joint_state() except rospy.ROSInterruptException: pass
内容的提问来源于stack exchange,提问作者Mali
相关产品推荐
相关产品推荐

