Any Robot + RoboDK + Python: Verify Hand-Eye Calibration Result Via Touch Test
참고
이 튜토리얼은 UR5e 및 Yaskawa H10에서만 테스트되었으며 RoboDK에서 지원하는 로봇에서만 작동합니다.
Introduction
Sometimes it is hard to measure how accurate the Hand-Eye Calibration is. Therefore, we created a Touch Test to verify accuracy easily. In this test, we use RoboDK to move the robot. This sample works for the results of both types of Hand-Eye Calibration, Eye-in-Hand and Eye-to-Hand. The Touch Test consists of placing the Zivid Calibration Object in the FOV of the camera, capturing it, and controlling the robot to touch it at a specific point. After touching, you can displace the Zivid Calibration Object and instruct the robot to touch it again. You can repeat this process as many times as you want. The only two limitations are the robot’s reach and the camera’s FOV.
아래 이미지에서 터치 테스트의 예상 결과를 볼 수 있습니다.
참고
The accuracy of the touch depends on the Robot Calibration error, the Hand-Eye Calibration error, the TCP Calibration error, and Calibration Object Pose Estimation error.
Requirements
Linux의 경우 Zivid Tools를 포함하여 Zivid software 를 설치합니다.
Zivid-Python 을 설치합니다.
RoboDK software 를 설치합니다.
Robodk robot library 에서 지원하는 로봇이어야 합니다.
A .yaml file containing the Hand-Eye transformation matrix resulting from a Hand-Eye Calibration.
Pointed Hand-Eye Verification Tool을 정의하는 transformation 매트릭스가 포함된 A.yaml 파일을 준비합니다.
Pointed Hand-Eye Verification Tool
Pointed Hand-Eye Verification Tool은 이 튜토리얼에서 터치 도구로 사용됩니다. 이 도구는 UR5e(ISO 9409-1-50-4-M6) 및 Yaskawa HC10(ISO 9409-1-63-4-M6)과 호환됩니다.
pointed-hand-eye-verification-tool.STL
- 3D 프린팅에 사용할 수 있는 STL의 CAD 모델입니다.pointed-hand-eye-verification-tool.STEP
- RoboDK에 로드할 수 있는 STEP의 CAD 모델입니다.pointed-hand-eye-verification-tool.yaml
- 이 튜토리얼과 관련된 코드 샘플에서 필요한 YAML의 변환 매트릭스입니다.
Pointed Hand-Eye 검증 도구는 다음 이미지에 설명되어 있습니다.
On-arm Mounts
이 튜토리얼에서는 로봇 end-effector와 Pointed Hand-Eye Verification Tool 사이에 부착된 Zivid On-Arm Mount Extender 및 Zivid On-Arm Mount 를 사용한다고 가정합니다. 이러한 마운트는 로봇 end-effector와 Pointed Hand-Eye Verification Tool 사이의 거리를 증가시킵니다. 아래 이미지에서 각 마운트에 대해 추가된 측정값을 찾을 수 있습니다.
on-arm-mounts.yaml
파일에는 로봇 end effector와 Pointed Hand-Eye Verification Tool 사이에 설치된 두 마운트의 변환 매트릭스가 포함되어 있습니다. 마운트에 대한 자세한 내용은 on-arm camera mount datasheet 및 on-arm mount extender datasheet 를 참조하십시오.
RoboDK 환경이 이미 설정되어 있고 로봇에 연결되어 있는 경우 Create the Capture Pose for the Touch Test 를 확인하십시오.
Set Up RoboDK Environment
RoboDK .rdk files store information about the robot, target pose, and environment. The components in the .rdk file needed to perform the Touch Test are:
로봇 모델 파일 (.robot)
하나의 대상 포즈(이 튜토리얼에서 사용되는 이름은 “touch_test_pose” 입니다.)
로봇 환경의 가상 모델 (선택 사항)
CAD model of the camera in use, e.g., Zivid 2 CAD file (optional)
Pointed Hand-Eye 검증 도구의 CAD 모델 (선택 사항)
Add Robot to RoboDK Environment
RoboDK 프로그램을 열고 사용할 로봇을 추가하여 시작합니다. 로봇을 추가하려면 File -> Open online library 로 이동하여 GUI를 사용하여 라이브러리를 엽니다. 이 인터페이스를 통해 모델과 일치하는 로봇을 찾아 마우스로 Open 을 선택합니다. 로봇이 스테이션에 나타나지 않으면 Download 를 선택하고 .rdk 환경으로 끌어다 놓습니다. 이는 Select a robot RoboDK tutorial 에서 설명합니다.
Connect to Robot through RoboDK
경고
Depending on the brand of the robot being used, a driver setup might be required to connect to RoboDK. For help on this setup, check out the robot tips section in the RoboDK documentation. For example, here is the advice for ABB robots.
터치 테스트 스크립트를 실행하기 전에 먼저 RoboDK 인터페이스를 사용하여 로봇을 연결해야 합니다. RoboDK GUI에서 Connect -> Connect Robot 을 선택합니다. 이렇게 하면 로봇 IP와 포트 번호를 입력할 수 있는 측면 패널이 열립니다.
참고
대부분의 로봇은 제어 펜던트 또는 태블릿에 원격 모드가 있습니다. 로봇이 연결을 설정할 수 있도록 원격 모드에 있는지 확인하십시오.
로봇에 연결하려면 IP 주소를 알아야 하며 로봇 제어 펜던트에서 찾거나 나열해야 합니다. connecting to the robot for RoboDK 단계를 따르십시오. 확인해야 하는 또 다른 연결은 포트 번호입니다. 이전에 변경하지 않은 경우 드라이버와 함께 제공되는 기본 번호가 작동해야 합니다.
Connect 을 클릭하고 Connection status 창이 녹색이면 RoboDK 인터페이스를 사용하여 로봇을 제어할 수 있습니다. 대신 빨간색이면 포트 번호와 IP 주소가 올바른지 확인하십시오. 여전히 빨간색이면 이 튜토리얼 끝에 있는 Troubleshoot RoboDK chapter를 확인하십시오.
Create the Capture Pose for the Touch Test
터치 테스트를 위한 캡처 포즈를 저장하기 위해 how to create a target in RoboDK 에 대해 알아보십시오.
RoboDK를 사용하여 포즈를 생성하는 방법은 두 가지가 있습니다.
펜던트를 사용하여 물리적으로 로봇을 원하는 포즈로 이동한 다음 RoboDK를 통해 연결하고 포즈를 저장합니다.
RoboDK를 통해 원격으로 로봇을 이동하여 포즈를 생성하고 저장합니다.
팁
RoboDK를 통해 로봇을 움직이고 있는데 로봇이 충분히 빠르거나 느리게 움직이지 않는 경우 set the robot speed in RoboDK 를 확인하십시오. 속도를 설정한 후 생성한 프로그램을 마우스 오른쪽 버튼으로 클릭하고 Run on the robot 을 표시한 다음 다시 마우스 오른쪽 버튼을 클릭하고 Run 을 선택합니다.
Before creating the Touch Test Capture Pose, you must consider where you plan to put the Zivid Calibration Object. If Eye-in-Hand, ensure it will be in the FOV of the camera. If Eye-to-Hand, ensure that the robot will not block the view of the Zivid Calibration Object. Only one pose is needed for the Touch Test. You can see illustrated below how it looks in RoboDK.
Run the Touch Test
스크립트를 실행하기 전에 .rdk 파일을 열고 로봇에 연결해야 합니다. The script can be found in the Zivid Python Samples . 아래와 같이 다음 명령줄 인수를 사용합니다.
type_group.add_argument("--eih", "--eye-in-hand", action="store_true", help="eye-in-hand configuration")
type_group.add_argument("--eth", "--eye-to-hand", action="store_true", help="eye-to-hand configuration")
parser.add_argument("--ip", required=True, help="IP address of the robot controller")
parser.add_argument(
"--target-keyword",
required=True,
help="RoboDK target name representing a robot pose at which the calibration object is in the field of view of the camera",
)
parser.add_argument(
"--tool-yaml",
required=True,
help="Path to YAML file that represents the Pointed Hand-Eye Verification Tool transformation matrix",
)
parser.add_argument(
"--mounts-yaml",
required=False,
help="Path to YAML file that represents the on-arm mounts transformation matrix",
)
parser.add_argument(
"--hand-eye-yaml",
required=True,
help="Path to the YAML file that contains the Hand-Eye transformation matrix",
)
subparsers = parser.add_subparsers(dest="calibration_object", required=True, help="Calibration object type")
subparsers.add_parser("checkerboard", help="Verify using Zivid calibration board")
marker_parser = subparsers.add_parser("marker", help="Verify using ArUco marker")
marker_parser.add_argument(
"--dictionary",
required=True,
choices=list(zivid.calibration.MarkerDictionary.valid_values()),
help="Dictionary of the targeted ArUco marker",
)
marker_parser.add_argument(
"--id", nargs=1, required=True, type=int, help="ID of ArUco marker to be used for verification"
)
The script runs in the following steps:
The robot moves to the Capture Pose previously defined.
The user is asked to put the Zivid Calibration Object in the FOV and press Enter.
The camera captures the Zivid Calibration Object and the pose of the touching point is computed and displayed to the user.
When the user presses the Enter key, the robot touches the Zivid Calibration Object at a distinct point.
Upon pressing the Enter key, the robot pulls back and returns to the Capture Pose.
At this point, the Zivid Calibration Object can be moved to perform the Touch Test at a different location.
The user is asked to input “y” on “n” to repeat or abort the touch test.
Script walk-through
RoboDK Hand-Eye Calibration 검증 스크립트가 작동하려면 3개의 추가 Python 파일이 필요합니다.
robodk_tools.py 는 로봇을 구성하는 데 사용됩니다.
save_load_matrix.py 는 YAML 파일에서 행렬을 저장하고 로드하는 데 사용됩니다.
스크립트는 각각 다음 단계를 통해 실행됩니다.
Connect to robot
먼저 IP 주소를 사용하여 로봇에 연결합니다. 그런 다음 시뮬레이터와 링크를 설정하는데 사용되는 rdk
객체와 다양한 로봇 구성 매개변수를 포함하는 로봇 객체 robot
을 돌려 받습니다.
rdk, robot = connect_to_robot(user_options.ip)
Set robot speed and acceleration
로봇 구성의 마지막 단계는 로봇의 속도와 가속도를 정의하는 것입니다.
set_robot_speed_and_acceleration(robot, speed=100, joint_speed=100, acceleration=50, joint_acceleration=50)
Load Pointed Hand-Eye Verification Tool transformation matrix
그런 다음 Pointed Hand-Eye Verification Tool을 정의하는 변환 매트릭스가 로드됩니다.
print("Loading the Pointed Hand-Eye Verification Tool transformation matrix from a YAML file")
tool_base_to_tool_tip_transform = load_and_assert_affine_matrix(user_options.tool_yaml)
Define TCP transformation matrix
그런 다음 도구 중심점(TCP
)을 정의해야 합니다. 먼저 프로그램은 사용자가 On-Arm 마운트 매트릭스가 포함된 a.yaml 파일을 제공했는지 확인합니다. 사용자가 온암 마운트 매트릭스를 제공하지 않는 경우 Pointed Hand-Eye Verification Tool이 로봇의 엔드 이펙터에 직접 부착되어 있다고 가정합니다. 따라서 TCP
행렬은 Pointed Hand-Eye Verification Tool 행렬과 동일합니다.
if user_options.mounts_yaml:
print("Loading the on-arm mounts transformation matrix from a YAML file")
flange_to_tool_base_transform = load_and_assert_affine_matrix(user_options.mounts_yaml)
flange_to_tcp_transform = flange_to_tool_base_transform @ tool_base_to_tool_tip_transform
else:
flange_to_tcp_transform = tool_base_to_tool_tip_transform
Move to Capture Pose
이 샘플을 실행하는 동안 열려 있는 .rdk 파일에서 가져온 capture_pose
로 로봇이 이동합니다.
capture_pose = get_robot_targets(rdk, target_keyword=user_options.target_keyword)
if not capture_pose:
raise IndexError(
"The list of poses retrieved from RoboDK is empty...\nMake sure that you have created a Capture Pose and that you introduced the right keyword for it."
)
robot.MoveJ(capture_pose[0])
Place the Zivid Calibration Object
The next step is to ensure the user has placed the Zivid Calibration Object in the FOV of the camera.
print("\nPlace the calibration object in the FOV of the camera.")
input("Press enter to start.")
Zivid Calibration Object Detection and Pose Estimation
After pressing Enter
, the Zivid Calibration Object is captured and its pose in the camera frame is estimated.
frame, bgra_image = _assisted_capture(camera)
camera_to_calibration_object_transform = _estimate_calibration_object_pose(frame, user_options)
Transform the Zivid Calibration Object Pose from Camera to Robot Base Frame
print("Calculating the calibration object pose in robot base frame")
base_to_calibration_object_transform = _get_base_to_calibration_object_transform(
user_options,
camera_to_calibration_object_transform,
robot,
)
이 변환 대한 자세한 내용을 이해하려면 Hand-Eye Calibration Solution 확인하십시오.
Get the Touch Pose
로봇이 움직이도록 제어하는 터치 포즈가 엔드 이펙터(플랜지) 포즈이기 때문에 TCP
를 고려해야 합니다.
print("Calculating pose for robot to touch the calibration object")
touch_pose = base_to_calibration_object_transform @ np.linalg.inv(flange_to_tcp_transform)
Get the Approach Pose
우리는 접근 포즈를 Z축의 터치 포즈로부터의 오프셋으로 정의하고 -140mm로 임의로 선택합니다.
print("Calculating pose for the robot to approach the calibration object")
touch_pose_offset = np.identity(4)
touch_pose_offset[2, 3] = -140
approach_pose = touch_pose @ touch_pose_offset
Touch the Zivid Calibration Object
Before approaching and touching the Zivid Calibration Object, the calculated touch pose is displayed to the user.
The user can then press Enter
to allow the robot to perform the touch.
_draw_coordinate_system(frame, camera_to_calibration_object_transform, bgra_image)
input("\nClose the window and press enter to the touch the calibration object...")
To touch the Zivid Calibration Object, the robot first moves to the approach pose with joint movement. Then it moves in a straight line to the touch pose. At this point, the user can get close to the Zivid Calibration Object and visually inspect the accuracy of the performed touch.
print("Touching calibration object")
robot.MoveJ(Mat(approach_pose.tolist()))
robot.MoveL(Mat(touch_pose.tolist()))
Move Away from the Zivid Calibration Object
The program expects the user to press Enter
for the robot to move away from the Zivid Calibration Object back to the Capture Pose.
input("\nPress enter to pull back and return to the capture pose...")
robot.MoveL(Mat(approach_pose.tolist()))
robot.MoveJ(capture_pose[0])
Touch the Zivid Calibration Object Again
At this point, the Zivid Calibration Object can be moved to perform the Touch Test at a different location within the FOV of the camera. The user is asked to input “y” or “n” to repeat or abort the touch test.
print("\nThe calibration object can be moved at this time.")
answer = _yes_no_prompt("Perform another touch?")
if answer == "n":
break
Troubleshoot RoboDK
Robot Moving to Different Configuration than Intended
Connect Through Firewall on windows
참고
이 방법은 Windows 10에서 테스트되었습니다.
Check driver blockage
Windows를 실행하는 컴퓨터에 연결할 때 방화벽이 로봇에 대한 연결을 차단할 수 있다는 점에 유의하십시오. 한 가지 옵션은 방화벽을 완전히 비활성화하는 것이지만 시스템을 취약하게 만들 수 있으므로 권장하지 않습니다.
대신 사용하는 로봇의 드라이버 및 IP 주소에 대해서만 통신을 허용하도록 Windows 방화벽에 새 규칙을 추가할 수 있습니다. 이 두 속성을 찾으려면 connect to robot 를 선택하여 more options 에서 확인하십시오. 이 경우 드라이버는 apiur 를 선택합니다.
Go to the Windows Defender Firewall on your system and go into the Advanced settings. This will lead you to definitions of the firewall rules. Here the inbound rules can be changed to allow communications with the driver needed to control the robot.
로봇 드라이버에 막힌 표지판이 있으면 인바운드 규칙을 확인하십시오. 드라이버가 차단된 경우 이 규칙을 비활성화합니다. 그렇지 않으면 방화벽이 통신을 차단합니다.
이 규칙이 비활성화되면 RoboDK 소프트웨어가 로봇에 연결할 수 있는지 확인하십시오. 여전히 로봇에 연결할 수 없는 경우 드라이버가 로봇과 통신할 수 있도록 특별히 허용하는 규칙을 만들어야 합니다.
Create a new inbound rule
New Rule… 을 클릭하여 컴퓨터와 로봇 간의 통신을 허용하는 규칙을 만들고 정의합니다.
우선 첫 번째 페이지에서 Custom 옵션을 선택하고 두 번째 페이지에서 All programs 옵션을 선택합니다. 아래 그림에서 확인할 수 있습니다.
다음 페이지에서 TCP를 프로토콜로 선택한 다음 특정 로컬 포트를 선택하고 RoboDK의 포트 번호와 일치하는 포트 번호를 삽입해야 합니다.
다음 단계는 IP 주소를 설정하는 것입니다. Which remote IP address does this rule apply to? 에서 These IP addresses 를 선택하십시오. 그런 다음 Add 의 IP와 일치하는 IP를 설정합니다.
OK 및 Next 를 누른 후 Allow all connections 을 선택하고 다음 페이지에서 모든 상자를 선택합니다.
마지막으로 규칙에 적합한 이름을 선택하고 Finish 을 클릭하면 됩니다!