2016-06-21 19 views
0

Ich bin ein Anfänger in Python. Ich versuche gerade, mit der IK umzugehen, um den Roboterarm zu bewegen. Wenn ich versuche, mein Programm des Arm laufen konnte die meine gefasste Ausgangsposition bewegen, aber wenn es zum nächsten Schritt geht es zeigt mir diesen Fehler: AttributeError: 'bool' object has no attribute 'items'AttributeError: 'Bool' Objekt hat kein Attribut 'Elemente'

Das ist mein Programm:

class Pick_Place (object): 

    #def __init__(self,limb,hover_distance = 0.15): 
    def __init__(self,limb): 
     self._limb = baxter_interface.Limb(limb) 
     self._gripper = baxter_interface.Gripper(limb) 
     self._gripper.calibrate(limb) 
     #self.gripper_open() 
     #self._verbose = verbose 
     ns = "ExternalTools/" + limb + "/PositionKinematicsNode/IKService" 
     self._iksvc = rospy.ServiceProxy(ns,SolvePositionIK) 
     rospy.wait_for_service(ns, 5.0) 

    def move_to_start (self,start_angles = None): 

      print ("moving.....") 
      if not start_angles: 
       print ("it is 0") 
       start_angles = dict(zip(self._joint_names, [0]*7)) 

      self._guarded_move_to_joint_position(start_angles) 
      self.gripper_open() 
      rospy.sleep(1.0) 
      print ("moved!!!") 

#########################IK_Server################################################ 
    def ik_request (self,pose): 
     hdr = Header(stamp=rospy.Time.now(),frame_id='base') 
     ikreq = SolvePositionIKRequest() 
     ikreq.pose_stamp.append(PoseStamped(header=hdr, pose=pose)) 
     try: 
      resp = self._iksvc (ikreq) 

     except (rospy.ServiceException, rospy.ROSException), e: 
      rospy.logerr("Service call failed: %s" % (e,)) 
     return False 

     limb_joints = {} 
     limb_joints = dict(zip(resp.joints[0].name, resp.joints[0].position)) 

     return limb_joints 
################################################################################### 

    def _guarded_move_to_joint_position(self,joint_angles): 
      print ("joint position.....") 
      self._limb.move_to_joint_positions(joint_angles) 

    def gripper_open (self): 
     self._gripper.open() 
     rospy.sleep(1.0) 

    def gripper_close (self): 
     self._gripper.close() 
     rospy.sleep(1.0) 
#################################Individual_Motion#################################### 
    def _approach (self, pose): 
     print ("\nApproaching.....") 

     approach = copy.deepcopy(pose) 
     approach.position.z = approach.position.z #+ self._hover_distance 
     joint_angles = self.ik_request(approach) 
     self._guarded_move_to_joint_position(joint_angles) 

     print ("\nApproached.....") 

    def _retract (self): 
     print ("\nRetracting.....") 
     current_pose = self._limb.endpoint_pose() 
     ik_pose = Pose() 
     ik_pose.position.x = current_pose['position'].x 
     ik_pose.position.y = current_pose['position'].y 
     ik_pose.position.z = current_pose['position'].z #+ self._hover_distance 
     ik_pose.orientation.x = current_pose['orientation'].x 
     ik_pose.orientation.y = current_pose['orientation'].y 
     ik_pose.orientation.z = current_pose['orientation'].z 
     ik_pose.orientation.w = current_pose['orientation'].w 
     joint_angles = self.ik_request(ik_pose) 

     self._guarded_move_to_joint_position(joint_angles) 
     print ("\nRetracted......") 

    def _servo_to_pose (self, pose): 
     print ("\nPosing.....") 
     joint_angles = self.ik_request(pose) 
     self._guarded_move_to_joint_position(joint_angles) 
     print ("\nPosed.....") 


##########################Motion_of_pick_and_place##################################### 

    def pick (self,pose): 
     print ("\nPicking_1.....") 
     # open the gripper 
     self.gripper_open() 
     # servo above pose 
     self._approach(pose) 
     # servo to pose 
     self._servo_to_pose(pose) 
     # close gripper 
     self.gripper_close() 
     # retract to clear object 
     self._retract() 
     print ("\nPicked") 

    def place (self,pose): 
     print ("\nPlacing_1.....") 
     # servo above pose 
     self._approach(pose) 
     # servo to pose 
     self._servo_to_pose(pose) 
     # open the gripper 
     self.gripper_open() 
     # retract to clear object 
     self._retract() 
     print ("\nPlaced") 

###########################Main_Program############################################ 
def main(): 

    print ("Initializing....") 
    rospy.init_node("ylj_ik_traTest") 
    print("Getting the robot state.....") 
    rs= baxter_interface.RobotEnable() 
    print ("Enabling....") 
    rs.enable() 


    limb = 'left' 
    #hover_distance = 0.15 

    starting_joint_angles = {'left_s0': -0.50, 
          'left_s1': -1.30, 
          'left_e0': -0.60, 
          'left_e1': 1.30, 
          'left_w0': 0.20, 
          'left_w1': 1.60, 
          'left_w2': -0.30} 

    #pnp = Pick_Place(limb,hover_distance) 
    pnp = Pick_Place(limb) 

    overhead_orientation = Quaternion(
          x=-0.0249590815779, 
          y=0.999649402929, 
          z=0.00737916180073, 
          w=0.00486450832011) 
    ball_poses = list() 
    #1st ball point 
    ball_poses.append(Pose(
     position = Point(x=0.7, y=0.15, z=-0.1), 
     orientation = overhead_orientation)) 

    #2nd ball point 
    ball_poses.append(Pose(
     position = Point(x=0.75, y=0.0, z=-0.1), 
     orientation = overhead_orientation)) 

    pnp.move_to_start(starting_joint_angles) 
    idx = 0 
    while not rospy.is_shutdown(): 
     print ("\nPicking.....") 
     pnp.pick(ball_poses[idx]) 

     print ("\nPlacing.....") 
     idx = (idx+1) % len(ball_poses)#????? 
     pnp.place(ball_poses[idx]) 
    return 0 

if __name__ == '__main__': 
    sys.exit(main()) 

Und Dies ist der Fehler zeigt mir:

Initializing.... 
Getting the robot state..... 
Enabling.... 
[INFO] [WallTime: 1466477391.621678] Robot Enabled 
moving..... 
joint position..... 
moved!!! 

Picking..... 

Picking_1..... 

Approaching..... 
joint position..... 
Traceback (most recent call last): 
    File "/home/baxter/ros_ws/src/baxter_examples/scripts/ylj_research/ylj_ik_traTest.py", line 197, in <module> 
    sys.exit(main()) 
    File "/home/baxter/ros_ws/src/baxter_examples/scripts/ylj_research/ylj_ik_traTest.py", line 188, in main 
    pnp.pick(ball_poses[idx]) 
    File "/home/baxter/ros_ws/src/baxter_examples/scripts/ylj_research/ylj_ik_traTest.py", line 122, in pick 
    self._approach(pose) 
    File "/home/baxter/ros_ws/src/baxter_examples/scripts/ylj_research/ylj_ik_traTest.py", line 88, in _approach 
    self._guarded_move_to_joint_position(joint_angles) 
    File "/home/baxter/ros_ws/src/baxter_examples/scripts/ylj_research/ylj_ik_traTest.py", line 72, in _guarded_move_to_joint_position 
    self._limb.move_to_joint_positions(joint_angles) 
    File "/home/baxter/ros_ws/src/baxter_interface/src/baxter_interface/limb.py", line 368, in move_to_joint_positions 
    diffs = [genf(j, a) for j, a in positions.items() if 
AttributeError: 'bool' object has no attribute 'items' 

Hat jemand diese Art von Fehler zuvor getroffen? Bitte hilf mir, danke.

+0

Wenn Sie den Fehler gelesen haben, wird Ihnen mitgeteilt, dass Sie versuchen, auf einen booleschen Wert ('positions')' .items() 'zuzugreifen. Nun, wo in deinem Code gibst du "positions" an, und ist es ein Boolescher Wert? –

Antwort

2

Der Fehler besagt, dass boolesche Werte (entweder True oder False) kein Attribut "items" haben.

Wenn Sie anrufen

self._limb.move_to_joint_positions(joint_angles) Sie übergeben das Argument "joint_angles", die "Positionen" in der Funktion move_to_joint_positions() wird.

Blick in die source code of the library you're using, es sagt Ihnen, was es Positionen sein will: @type positions: dict({str:float})

Kurz gesagt, es will joint_angles ein Wörterbuch-Mapping-Strings sein, um die Schwimmer und Sie übergeben eine boolean. Schauen wir uns darüber, wie Sie joint_angles bekam:

joint_angles = self.ik_request(ik_pose)

Im Körper Ihrer Methode, kehren Sie jedes Mal falsch:

def ik_request (self,pose): ... except (rospy.ServiceException, rospy.ROSException), e: rospy.logerr("Service call failed: %s" % (e,)) return False

einen boolean zurückkehrend ist eindeutig nicht das, was Sie tun möchten, und es ist die Ursache für diesen Fehler.

+0

Oh! Ja! Sie haben Recht! Die Rückgabe False sollte innerhalb der Ausnahme statt der gesamten Funktion sein! Vielen Dank für Ihren Eintrag! Es funktioniert jetzt für mich! –

0

Sie versuchen, auf die Elemente eines booleschen Werts zuzugreifen, der nicht zulässig ist. In Ihrem Beispiel ist positions ein Wahr/Falsch-Wert und nicht das, was Sie erwarten. Es gibt einen Abschnitt des Codes, in dem positions einem booleschen Wert zugewiesen wird. Sie sollten Ihren Code durchgehen und nach einer Zeile suchen, die positions = something enthält.

+0

Außerdem haben Sie den Abschnitt, der den Fehler enthielt, nicht veröffentlicht. Es wäre nützlicher, wenn Sie die 'move_to_joint_positions (joint_angles)' Funktion gepostet haben, da hier der Fehler passiert –

Verwandte Themen