How to self-calibrate a UR5e with a physical marker

Bonjour,

J’aimerais réalisé un programme de calibration du cobot avec l’aide d’un repère physique.

J’ai réalisé un programme d’essai en utilisant les fonctions “direction” jusqu’à “contact outils”, ensuite je récupère les coordonnées des points pour ensuite effectuer un offset avec la fonction “pose_trans”.

Mais une fois que j’effectue l’offset, le plan est hors porté du cobot et je ne comprends pas où se trouve mon erreur.

You can translate if you want with google extensions

1 Like

def test_force():
  global _hidden_verificationVariable=0
  set_target_payload(0.950000, [0.005000, -0.039000, 0.040000], [0.001413, 0.001413, 0.001413, 0.000000, 0.000000, 0.000000])
  set_tcp(p[0.0,-0.055,0.14,0.0,0.0,0.0])
  set_gravity([0.0, 0.0, 9.82])
  set_safety_mode_transition_hardness(1)
  set_standard_analog_input_domain(0, 1)
  set_standard_analog_input_domain(1, 1)
  set_tool_analog_input_domain(0, 1)
  set_tool_analog_input_domain(1, 1)
  set_analog_outputdomain(0, 0)
  set_analog_outputdomain(1, 0)
  set_input_actions_to_default()
  set_tool_communication(False, 115200, 0, 1, 1.5, 3.5)
  set_tool_output_mode(0)
  set_tool_digital_output_mode(0, 1)
  set_tool_digital_output_mode(1, 1)
  set_tool_voltage(0)
  global Pallet_1_cnt=6
  global Plan_1=p[0.1331296435580705,-0.868169226499013,0.5414466022040523,-0.026350403751349852,-2.2100886491352374,2.2097378874972122]
  global Plan_2=p[-0.5811237050703881,-0.11303890891523599,0.7503348138735667,-1.1538081375598757,1.2916246071485196,-1.2916445484211498]
  global Plan_3=p[-0.1074386792596403,0.872619415032094,0.470772857903887,-8.391431435361943E-4,2.220723223384258,-2.220742709807844]
  global Pose_plato_cart=p[0.4499628973496344,0.33541456507623196,0.047476952042385,0.011788520595514045,-0.14123614456418684,-1.5867235264270372]
  global recup_carte=p[0.7198780491177688,0.061841770833425624,0.1260950803757087,4.0819941219672964E-5,2.3367727536255763E-5,-1.6087545549689768]
  global recup_plato=p[0.21124180094928877,0.4522677928147516,-0.09171934518012236,-1.2110157265630829E-5,3.141565806848833,-5.8237517913496376E-5]
  step_count_beb89c4e_fe97_4a74_8a82_fca6fab741e2 = 0.0
  thread Step_Counter_Thread_28341fa3_f2d7_4e3d_afb8_39291027116d():
    while (True):
      step_count_beb89c4e_fe97_4a74_8a82_fca6fab741e2 = step_count_beb89c4e_fe97_4a74_8a82_fca6fab741e2 + 1.0
      sync()
    end
  end
  run Step_Counter_Thread_28341fa3_f2d7_4e3d_afb8_39291027116d()
  global PointPassage_1_p=p[.485490348113, .106408567100, .345591807965, 2.239394263184, -2.187618073974, -.035902492588]
  global PointPassage_1_q=[3.0712695121765137, -1.7217604122557582, 1.7059066931353968, -1.5291317229023953, -1.5612366835223597, -0.09381324449648076]
  def calculate_point_to_move_towards(feature, direction, position_distance):
    local posDir=[direction[0], direction[1], direction[2]]
    if (norm(posDir) < 1e-6):
      return get_target_waypoint()
    end
    local direction_vector_normalized=normalize(posDir)
    local displacement_pose=p[direction_vector_normalized[0] * position_distance,direction_vector_normalized[1] * position_distance,direction_vector_normalized[2] * position_distance,0,0,0]
    local wanted_displacement_in_base_frame=pose_sub(pose_trans(feature, displacement_pose), feature)
    return pose_add(get_target_waypoint(), wanted_displacement_in_base_frame)
  end
  global PointPassage_2_p=p[.787139381863, .106395379473, .276564414617, 2.239293112206, -2.187606334181, -.036011811018]
  global PointPassage_2_q=[3.1005823612213135, -0.9678192895701905, 0.9489725271808069, -1.5262337413481255, -1.5601580778705042, -0.06493932405580694]
  global PointPassage_4_p=p[.787158245562, .106393106350, .038050253400, 2.239326347726, -2.187628157979, -.035947396437]
  global PointPassage_4_q=[3.100332260131836, -0.8173595827868958, 1.3257868925677698, -2.053578039208883, -1.5602543989764612, -0.06343347231020147]
  global PointPassage_5_p=p[.787136672904, .106397065853, .276559470999, 2.239281266224, -2.187601923975, -.036014634583]
  global PointPassage_5_q=[3.1005871295928955, -0.9678192895701905, 0.9489815870868128, -1.5262337413481255, -1.5601652304278772, -0.06493121782411748]
  $ 1 "AvantDémarrage"
  $ 2 "Départ"
  movej([3.1611130237579346, -1.943632265130514, 1.6774948279010218, -1.3376277548125763, -1.5664294401751917, 0.016863178461790085], a=1.3962634015954636, v=1.0471975511965976)
  $ 3 "DéplacementA"
  $ 4 "PointPassage_1" "breakAfter"
  movej(get_inverse_kin(PointPassage_1_p, qnear=PointPassage_1_q), a=1.3962634015954636, v=1.0471975511965976)
  $ 5 "DéplacementL"
  $ 6 "Direction: Base Z-"
  global move_thread_flag_6=0
  thread move_thread_6():
    enter_critical
    move_thread_flag_6 = 1
    local towardsPos=calculate_point_to_move_towards(p[0.0,0.0,0.0,0.0,0.0,0.0], [0.0,0.0,-1.0], 1000.0)
    movel(towardsPos, a=1.2, v=0.08)
    move_thread_flag_6 = 2
    exit_critical
  end
  move_thread_flag_6 = 0
  move_thread_han_6 = run move_thread_6()
  while (True):
    local targetTcpDirection=get_target_tcp_speed()
    local stepsToRetract=tool_contact(direction=targetTcpDirection)
    if (stepsToRetract > 0):
      kill move_thread_han_6
      stopl(3.0)
      local backTrackMovement=get_actual_joint_positions_history(stepsToRetract)
      local contactPose=get_forward_kin(backTrackMovement)
      local posDir=[targetTcpDirection[0],targetTcpDirection[1],targetTcpDirection[2]]
      local retractTo=contactPose
      if (norm(posDir) > 1e-6):
        local normalizedPosDir=normalize(posDir)
        local additionalRetraction=p[normalizedPosDir[0] * 0.0, normalizedPosDir[1] * 0.0, normalizedPosDir[2] * 0.0, 0, 0, 0]
        retractTo = pose_sub(contactPose, additionalRetraction)
      end
      movel(retractTo, a=3.0, v=0.1)
      $ 7 "Until (tool_contact_detection)"
      break
    end
    sync()
  end
  $ 8 "Direction: Base Y+"
  global move_thread_flag_8=0
  thread move_thread_8():
    enter_critical
    move_thread_flag_8 = 1
    local towardsPos=calculate_point_to_move_towards(p[0.0,0.0,0.0,0.0,0.0,0.0], [0.0,1.0,0.0], 1000.0)
    movel(towardsPos, a=1.2, v=0.08)
    move_thread_flag_8 = 2
    exit_critical
  end
  move_thread_flag_8 = 0
  move_thread_han_8 = run move_thread_8()
  while (True):
    local targetTcpDirection=get_target_tcp_speed()
    local stepsToRetract=tool_contact(direction=targetTcpDirection)
    if (stepsToRetract > 0):
      kill move_thread_han_8
      stopl(3.0)
      local backTrackMovement=get_actual_joint_positions_history(stepsToRetract)
      local contactPose=get_forward_kin(backTrackMovement)
      local posDir=[targetTcpDirection[0],targetTcpDirection[1],targetTcpDirection[2]]
      local retractTo=contactPose
      if (norm(posDir) > 1e-6):
        local normalizedPosDir=normalize(posDir)
        local additionalRetraction=p[normalizedPosDir[0] * 0.0, normalizedPosDir[1] * 0.0, normalizedPosDir[2] * 0.0, 0, 0, 0]
        retractTo = pose_sub(contactPose, additionalRetraction)
      end
      movel(retractTo, a=3.0, v=0.1)
      $ 9 "Until (tool_contact_detection)"
      break
    end
    sync()
  end
  $ 10 "Direction: Base X+"
  global move_thread_flag_10=0
  thread move_thread_10():
    enter_critical
    move_thread_flag_10 = 1
    local towardsPos=calculate_point_to_move_towards(p[0.0,0.0,0.0,0.0,0.0,0.0], [1.0,0.0,0.0], 1000.0)
    movel(towardsPos, a=1.2, v=0.08)
    move_thread_flag_10 = 2
    exit_critical
  end
  move_thread_flag_10 = 0
  move_thread_han_10 = run move_thread_10()
  while (True):
    local targetTcpDirection=get_target_tcp_speed()
    local stepsToRetract=tool_contact(direction=targetTcpDirection)
    if (stepsToRetract > 0):
      kill move_thread_han_10
      stopl(3.0)
      local backTrackMovement=get_actual_joint_positions_history(stepsToRetract)
      local contactPose=get_forward_kin(backTrackMovement)
      local posDir=[targetTcpDirection[0],targetTcpDirection[1],targetTcpDirection[2]]
      local retractTo=contactPose
      if (norm(posDir) > 1e-6):
        local normalizedPosDir=normalize(posDir)
        local additionalRetraction=p[normalizedPosDir[0] * 0.0, normalizedPosDir[1] * 0.0, normalizedPosDir[2] * 0.0, 0, 0, 0]
        retractTo = pose_sub(contactPose, additionalRetraction)
      end
      movel(retractTo, a=3.0, v=0.1)
      $ 11 "Until (tool_contact_detection)"
      break
    end
    sync()
  end
  $ 12 "posi≔get_actual_tcp_pose()"
  global posi= get_actual_tcp_pose ()
  $ 17 "pos_calibre≔p[posi[0],posi[1],posi[2],0,0,0]"
  global pos_calibre=p[posi[0],posi[1],posi[2],0,0,0]
  $ 18 "Pop-up"
  popup(str_cat("",pos_calibre), "Message", False, False, blocking=True)
  $ 19 "recup_carte≔pose_trans(recup_carte, pos_calibre)"
  global recup_carte= pose_trans (recup_carte, pos_calibre)
  $ 20 "DéplacementA"
  $ 21 "recup_carte" "breakAfter"
  movej(recup_carte, a=1.3962634015954636, v=1.0471975511965976)
  $ 36 "Thread_1"
  thread Thread_1():
    while (True):
      $ 37 "capt_force≔force()"
      global capt_force= force ()
      $ 38 "position_actuel≔get_actual_tcp_pose()"
      global position_actuel= get_actual_tcp_pose ()
      $ 39 "sync()"
      sync()
    end
  end
  threadId_Thread_1 = run Thread_1()
  while (True):
    $ 22 "Programme de robot"
    $ 23 "DéplacementL"
    $ 24 "PointPassage_2" "breakAfter"
    movel(pose_trans(recup_carte, pose_trans(p[.089121558906, -.717014070189, -.137084069729, -.000040819941, -.000023367728, 1.608754554969], PointPassage_2_p)), a=1.2, v=0.25)
    $ 25 "PointPassage_4" "breakAfter"
    movel(pose_trans(recup_carte, pose_trans(p[.089121558906, -.717014070189, -.137084069729, -.000040819941, -.000023367728, 1.608754554969], PointPassage_4_p)), a=1.2, v=0.25)
    $ 27 "Attendre: 0.5"
    sleep(0.5)
    $ 28 "Pop-up: recup carte"
    popup("recup carte", "Message", False, False, blocking=True)
    $ 29 "DéplacementL"
    $ 30 "PointPassage_5" "breakAfter"
    movel(PointPassage_5_p, a=1.2, v=0.25)
    $ 31 "Régler Aspiration=Off"
    set_standard_digital_out(1, False)
    $ 32 "Régler Souflette=HI:Pulse 0.1"
    thread SinglePulse50():
      set_standard_digital_out(0, True)
      sleep(0.1)
      set_standard_digital_out(0, False)
    end
    singlePulse50 = run SinglePulse50()
    $ 34 "Départ"
    movej([3.1611130237579346, -1.943632265130514, 1.6774948279010218, -1.3376277548125763, -1.5664294401751917, 0.016863178461790085], a=1.3962634015954636, v=1.0471975511965976)
    $ 35 "Stop"
    halt
  end
end

Bonjour,

Actuellement, je recherche un moyen de calibrer mon robot après un changement d’articulation.

Je voulais savoir si vous avez obtenu des résultats concluants concernant votre programme lié à un repère physique ?

Merci