diff --git a/latest b/latest index e576a67..550bfd4 120000 --- a/latest +++ b/latest @@ -1 +1 @@ -v24.01 \ No newline at end of file +v24.04 \ No newline at end of file diff --git a/v24.04/de/.buildinfo b/v24.04/de/.buildinfo new file mode 100644 index 0000000..a3b9877 --- /dev/null +++ b/v24.04/de/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: a80c1d219ab6abc6b49e1c7d98c42fbc +tags: 20105804c9d2c81676a1cec6f0615c7f diff --git a/v24.04/de/.nojekyll b/v24.04/de/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/v24.04/de/_downloads/02795ba1755c845648330ae24d1e5fd1/rc_load_carrier_db-get_load_carriers.xml b/v24.04/de/_downloads/02795ba1755c845648330ae24d1e5fd1/rc_load_carrier_db-get_load_carriers.xml new file mode 100644 index 0000000..ac8ba0e --- /dev/null +++ b/v24.04/de/_downloads/02795ba1755c845648330ae24d1e5fd1/rc_load_carrier_db-get_load_carriers.xml @@ -0,0 +1,49 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/03e2ac36811a7cdda39045932e8a7220/rc_stereomatching-parameters.xml b/v24.04/de/_downloads/03e2ac36811a7cdda39045932e8a7220/rc_stereomatching-parameters.xml new file mode 100644 index 0000000..be889b7 --- /dev/null +++ b/v24.04/de/_downloads/03e2ac36811a7cdda39045932e8a7220/rc_stereomatching-parameters.xml @@ -0,0 +1,86 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/04ac820e8f72927578640d58a5dc5593/rc_hand_eye_calibration-reset_calibration.xml b/v24.04/de/_downloads/04ac820e8f72927578640d58a5dc5593/rc_hand_eye_calibration-reset_calibration.xml new file mode 100644 index 0000000..42a25ca --- /dev/null +++ b/v24.04/de/_downloads/04ac820e8f72927578640d58a5dc5593/rc_hand_eye_calibration-reset_calibration.xml @@ -0,0 +1,30 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/04f45afeb2d5fce153de77fdd56007a9/rc_itempick-get_sorting_strategies.xml b/v24.04/de/_downloads/04f45afeb2d5fce153de77fdd56007a9/rc_itempick-get_sorting_strategies.xml new file mode 100644 index 0000000..530ba23 --- /dev/null +++ b/v24.04/de/_downloads/04f45afeb2d5fce153de77fdd56007a9/rc_itempick-get_sorting_strategies.xml @@ -0,0 +1,34 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/053880118288a1a08754484fe6dfb7c0/rc_collision_check-set_stroke_schunk.xml b/v24.04/de/_downloads/053880118288a1a08754484fe6dfb7c0/rc_collision_check-set_stroke_schunk.xml new file mode 100644 index 0000000..6cf02b3 --- /dev/null +++ b/v24.04/de/_downloads/053880118288a1a08754484fe6dfb7c0/rc_collision_check-set_stroke_schunk.xml @@ -0,0 +1,56 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/08d923a4518a6d58c2375571c1eafe49/rc_silhouettematch-detect_object.xml b/v24.04/de/_downloads/08d923a4518a6d58c2375571c1eafe49/rc_silhouettematch-detect_object.xml new file mode 100644 index 0000000..483bd38 --- /dev/null +++ b/v24.04/de/_downloads/08d923a4518a6d58c2375571c1eafe49/rc_silhouettematch-detect_object.xml @@ -0,0 +1,96 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/09b2d9d3bd205f65a8e5063576f1ba15/rc_qr_code_detect-detect.xml b/v24.04/de/_downloads/09b2d9d3bd205f65a8e5063576f1ba15/rc_qr_code_detect-detect.xml new file mode 100644 index 0000000..eb6f576 --- /dev/null +++ b/v24.04/de/_downloads/09b2d9d3bd205f65a8e5063576f1ba15/rc_qr_code_detect-detect.xml @@ -0,0 +1,50 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/0e33ee3494516eb27f098fdbd3c915aa/rc_itempick-compute_grasps.xml b/v24.04/de/_downloads/0e33ee3494516eb27f098fdbd3c915aa/rc_itempick-compute_grasps.xml new file mode 100644 index 0000000..eba3c5f --- /dev/null +++ b/v24.04/de/_downloads/0e33ee3494516eb27f098fdbd3c915aa/rc_itempick-compute_grasps.xml @@ -0,0 +1,97 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/0e6315c2465024a25ced5571cd8c909d/rc_collision_check-parameters.xml b/v24.04/de/_downloads/0e6315c2465024a25ced5571cd8c909d/rc_collision_check-parameters.xml new file mode 100644 index 0000000..24e2177 --- /dev/null +++ b/v24.04/de/_downloads/0e6315c2465024a25ced5571cd8c909d/rc_collision_check-parameters.xml @@ -0,0 +1,41 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/0f9b9096a87f42cd10ddaeb1b804f07b/rc_april_tag_detect-start.xml b/v24.04/de/_downloads/0f9b9096a87f42cd10ddaeb1b804f07b/rc_april_tag_detect-start.xml new file mode 100644 index 0000000..d023769 --- /dev/null +++ b/v24.04/de/_downloads/0f9b9096a87f42cd10ddaeb1b804f07b/rc_april_tag_detect-start.xml @@ -0,0 +1,29 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/15c7eb768168e8570b2dcb5b3f38b108/rc_stereomatching-acquisition_trigger.xml b/v24.04/de/_downloads/15c7eb768168e8570b2dcb5b3f38b108/rc_stereomatching-acquisition_trigger.xml new file mode 100644 index 0000000..9fa0992 --- /dev/null +++ b/v24.04/de/_downloads/15c7eb768168e8570b2dcb5b3f38b108/rc_stereomatching-acquisition_trigger.xml @@ -0,0 +1,27 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/1b66776b61ecf031f3f36ef2ed07c167/rc_boxpick-start.xml b/v24.04/de/_downloads/1b66776b61ecf031f3f36ef2ed07c167/rc_boxpick-start.xml new file mode 100644 index 0000000..11066a5 --- /dev/null +++ b/v24.04/de/_downloads/1b66776b61ecf031f3f36ef2ed07c167/rc_boxpick-start.xml @@ -0,0 +1,29 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/1bd56a23569b7258dc913535e931fc76/rc_silhouettematch-set_grasp.xml b/v24.04/de/_downloads/1bd56a23569b7258dc913535e931fc76/rc_silhouettematch-set_grasp.xml new file mode 100644 index 0000000..1e1c723 --- /dev/null +++ b/v24.04/de/_downloads/1bd56a23569b7258dc913535e931fc76/rc_silhouettematch-set_grasp.xml @@ -0,0 +1,46 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/1d9a50f158c280a551d7523a9df119dd/rc_april_tag_detect-parameters.xml b/v24.04/de/_downloads/1d9a50f158c280a551d7523a9df119dd/rc_april_tag_detect-parameters.xml new file mode 100644 index 0000000..aa49713 --- /dev/null +++ b/v24.04/de/_downloads/1d9a50f158c280a551d7523a9df119dd/rc_april_tag_detect-parameters.xml @@ -0,0 +1,51 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/1f57c25dc0b089297e848967f7c41ce7/rc_gripper_db-get_grippers_schmalz_vac.xml b/v24.04/de/_downloads/1f57c25dc0b089297e848967f7c41ce7/rc_gripper_db-get_grippers_schmalz_vac.xml new file mode 100644 index 0000000..f4f6b4b --- /dev/null +++ b/v24.04/de/_downloads/1f57c25dc0b089297e848967f7c41ce7/rc_gripper_db-get_grippers_schmalz_vac.xml @@ -0,0 +1,64 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/215164fd1f0de042dd42a5ce3fafabde/rc_load_carrier-detect_load_carriers.xml b/v24.04/de/_downloads/215164fd1f0de042dd42a5ce3fafabde/rc_load_carrier-detect_load_carriers.xml new file mode 100644 index 0000000..d0a5903 --- /dev/null +++ b/v24.04/de/_downloads/215164fd1f0de042dd42a5ce3fafabde/rc_load_carrier-detect_load_carriers.xml @@ -0,0 +1,61 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/219819e13ff4d1e4918342f63e847d00/rc_iocontrol-get_io_values.xml b/v24.04/de/_downloads/219819e13ff4d1e4918342f63e847d00/rc_iocontrol-get_io_values.xml new file mode 100644 index 0000000..105d499 --- /dev/null +++ b/v24.04/de/_downloads/219819e13ff4d1e4918342f63e847d00/rc_iocontrol-get_io_values.xml @@ -0,0 +1,32 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/24108a5431b0201f8fd7ac8ab35ca1d3/rc_hand_eye_calibration-get_calibration.xml b/v24.04/de/_downloads/24108a5431b0201f8fd7ac8ab35ca1d3/rc_hand_eye_calibration-get_calibration.xml new file mode 100644 index 0000000..cce2a4f --- /dev/null +++ b/v24.04/de/_downloads/24108a5431b0201f8fd7ac8ab35ca1d3/rc_hand_eye_calibration-get_calibration.xml @@ -0,0 +1,40 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/24b62e25ec757744cc843c5f35302563/rc_qr_code_detect-parameters.xml b/v24.04/de/_downloads/24b62e25ec757744cc843c5f35302563/rc_qr_code_detect-parameters.xml new file mode 100644 index 0000000..4ee6839 --- /dev/null +++ b/v24.04/de/_downloads/24b62e25ec757744cc843c5f35302563/rc_qr_code_detect-parameters.xml @@ -0,0 +1,51 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/2af046057904b6e498cac21dfb8626f1/rc_silhouettematch-set_all_grasps.xml b/v24.04/de/_downloads/2af046057904b6e498cac21dfb8626f1/rc_silhouettematch-set_all_grasps.xml new file mode 100644 index 0000000..ff69c65 --- /dev/null +++ b/v24.04/de/_downloads/2af046057904b6e498cac21dfb8626f1/rc_silhouettematch-set_all_grasps.xml @@ -0,0 +1,47 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/2c25f2e603e356588a91e3bf79f9f6b7/rc_gripper_db-get_grippers.xml b/v24.04/de/_downloads/2c25f2e603e356588a91e3bf79f9f6b7/rc_gripper_db-get_grippers.xml new file mode 100644 index 0000000..aaa458d --- /dev/null +++ b/v24.04/de/_downloads/2c25f2e603e356588a91e3bf79f9f6b7/rc_gripper_db-get_grippers.xml @@ -0,0 +1,58 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/37406c493402b87236268d1ac115c550/rc_camera-reset_defaults.xml b/v24.04/de/_downloads/37406c493402b87236268d1ac115c550/rc_camera-reset_defaults.xml new file mode 100644 index 0000000..59d7d4e --- /dev/null +++ b/v24.04/de/_downloads/37406c493402b87236268d1ac115c550/rc_camera-reset_defaults.xml @@ -0,0 +1,27 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/3d49b3ccc4deef4c43c3cb974465af60/rc_gripper_db-set_gripper_schmalz_vac.xml b/v24.04/de/_downloads/3d49b3ccc4deef4c43c3cb974465af60/rc_gripper_db-set_gripper_schmalz_vac.xml new file mode 100644 index 0000000..5e68df4 --- /dev/null +++ b/v24.04/de/_downloads/3d49b3ccc4deef4c43c3cb974465af60/rc_gripper_db-set_gripper_schmalz_vac.xml @@ -0,0 +1,89 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/3f5956390347b4268bdba51eb0376160/rc_iocontrol-reset_defaults.xml b/v24.04/de/_downloads/3f5956390347b4268bdba51eb0376160/rc_iocontrol-reset_defaults.xml new file mode 100644 index 0000000..3a12e40 --- /dev/null +++ b/v24.04/de/_downloads/3f5956390347b4268bdba51eb0376160/rc_iocontrol-reset_defaults.xml @@ -0,0 +1,27 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/4106b2c0536a731e7d96b5e0113542dc/rc_load_carrier_db-delete_load_carriers.xml b/v24.04/de/_downloads/4106b2c0536a731e7d96b5e0113542dc/rc_load_carrier_db-delete_load_carriers.xml new file mode 100644 index 0000000..ea0a3a3 --- /dev/null +++ b/v24.04/de/_downloads/4106b2c0536a731e7d96b5e0113542dc/rc_load_carrier_db-delete_load_carriers.xml @@ -0,0 +1,28 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/4200514524c36e4c845009c7f873d0c2/rc_boxpick-get_sorting_strategies.xml b/v24.04/de/_downloads/4200514524c36e4c845009c7f873d0c2/rc_boxpick-get_sorting_strategies.xml new file mode 100644 index 0000000..b926ed5 --- /dev/null +++ b/v24.04/de/_downloads/4200514524c36e4c845009c7f873d0c2/rc_boxpick-get_sorting_strategies.xml @@ -0,0 +1,34 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/44555819d13a1330bcd24961126f8041/rc_silhouettematch-parameters.xml b/v24.04/de/_downloads/44555819d13a1330bcd24961126f8041/rc_silhouettematch-parameters.xml new file mode 100644 index 0000000..15a0f73 --- /dev/null +++ b/v24.04/de/_downloads/44555819d13a1330bcd24961126f8041/rc_silhouettematch-parameters.xml @@ -0,0 +1,76 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/44d30828f3f2bbe9d336c1c539b753af/rc_qr_code_detect-restart.xml b/v24.04/de/_downloads/44d30828f3f2bbe9d336c1c539b753af/rc_qr_code_detect-restart.xml new file mode 100644 index 0000000..243d742 --- /dev/null +++ b/v24.04/de/_downloads/44d30828f3f2bbe9d336c1c539b753af/rc_qr_code_detect-restart.xml @@ -0,0 +1,29 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/4730bff4b3a860f9d449e2a1686dfe6c/rc_silhouettematch-get_sorting_strategies.xml b/v24.04/de/_downloads/4730bff4b3a860f9d449e2a1686dfe6c/rc_silhouettematch-get_sorting_strategies.xml new file mode 100644 index 0000000..a396211 --- /dev/null +++ b/v24.04/de/_downloads/4730bff4b3a860f9d449e2a1686dfe6c/rc_silhouettematch-get_sorting_strategies.xml @@ -0,0 +1,33 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/50d6ba622c3c661ff89d33ea1b1de64e/rc_roi_db-get_regions_of_interest_2d.xml b/v24.04/de/_downloads/50d6ba622c3c661ff89d33ea1b1de64e/rc_roi_db-get_regions_of_interest_2d.xml new file mode 100644 index 0000000..5f5eded --- /dev/null +++ b/v24.04/de/_downloads/50d6ba622c3c661ff89d33ea1b1de64e/rc_roi_db-get_regions_of_interest_2d.xml @@ -0,0 +1,33 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/50eabaa82a30832202e29aceb058bb93/rc_hand_eye_calibration-save_calibration.xml b/v24.04/de/_downloads/50eabaa82a30832202e29aceb058bb93/rc_hand_eye_calibration-save_calibration.xml new file mode 100644 index 0000000..201ec48 --- /dev/null +++ b/v24.04/de/_downloads/50eabaa82a30832202e29aceb058bb93/rc_hand_eye_calibration-save_calibration.xml @@ -0,0 +1,30 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/5657329bd14ca80bc5169d60aa2d9466/rc_roi_db-get_regions_of_interest.xml b/v24.04/de/_downloads/5657329bd14ca80bc5169d60aa2d9466/rc_roi_db-get_regions_of_interest.xml new file mode 100644 index 0000000..46e10c6 --- /dev/null +++ b/v24.04/de/_downloads/5657329bd14ca80bc5169d60aa2d9466/rc_roi_db-get_regions_of_interest.xml @@ -0,0 +1,41 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/586948af1c41db59e2ae80a5c2ea0e05/rc_roi_db-set_region_of_interest.xml b/v24.04/de/_downloads/586948af1c41db59e2ae80a5c2ea0e05/rc_roi_db-set_region_of_interest.xml new file mode 100644 index 0000000..330e623 --- /dev/null +++ b/v24.04/de/_downloads/586948af1c41db59e2ae80a5c2ea0e05/rc_roi_db-set_region_of_interest.xml @@ -0,0 +1,40 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/5c2019e0cd1e993a88b1ce41e4caeb09/rc_silhouettematch-calibrate_base_plane.xml b/v24.04/de/_downloads/5c2019e0cd1e993a88b1ce41e4caeb09/rc_silhouettematch-calibrate_base_plane.xml new file mode 100644 index 0000000..c1c7687 --- /dev/null +++ b/v24.04/de/_downloads/5c2019e0cd1e993a88b1ce41e4caeb09/rc_silhouettematch-calibrate_base_plane.xml @@ -0,0 +1,49 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/5d3889119f769917e3f72dd2f354cc1b/rc_iocontrol-parameters.xml b/v24.04/de/_downloads/5d3889119f769917e3f72dd2f354cc1b/rc_iocontrol-parameters.xml new file mode 100644 index 0000000..3d2d585 --- /dev/null +++ b/v24.04/de/_downloads/5d3889119f769917e3f72dd2f354cc1b/rc_iocontrol-parameters.xml @@ -0,0 +1,36 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/66a6ac04f9ffab79c6b9ea024ac9a7fa/rc_silhouettematch-delete_base_plane_calibration.xml b/v24.04/de/_downloads/66a6ac04f9ffab79c6b9ea024ac9a7fa/rc_silhouettematch-delete_base_plane_calibration.xml new file mode 100644 index 0000000..daba5f7 --- /dev/null +++ b/v24.04/de/_downloads/66a6ac04f9ffab79c6b9ea024ac9a7fa/rc_silhouettematch-delete_base_plane_calibration.xml @@ -0,0 +1,27 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/681efb1b312b105fe4a304500439b942/rc_hand_eye_calibration-get_poses.xml b/v24.04/de/_downloads/681efb1b312b105fe4a304500439b942/rc_hand_eye_calibration-get_poses.xml new file mode 100644 index 0000000..f0e9a5b --- /dev/null +++ b/v24.04/de/_downloads/681efb1b312b105fe4a304500439b942/rc_hand_eye_calibration-get_poses.xml @@ -0,0 +1,38 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/6bbb9deecbc631165e34da617e985c8f/rc_visard_ng_eki_xml_config_files.zip b/v24.04/de/_downloads/6bbb9deecbc631165e34da617e985c8f/rc_visard_ng_eki_xml_config_files.zip new file mode 100644 index 0000000..d52d60f Binary files /dev/null and b/v24.04/de/_downloads/6bbb9deecbc631165e34da617e985c8f/rc_visard_ng_eki_xml_config_files.zip differ diff --git a/v24.04/de/_downloads/7027b81ba1b99329dd761a0f633411d6/rc_silhouettematch-delete_grasps.xml b/v24.04/de/_downloads/7027b81ba1b99329dd761a0f633411d6/rc_silhouettematch-delete_grasps.xml new file mode 100644 index 0000000..40346cc --- /dev/null +++ b/v24.04/de/_downloads/7027b81ba1b99329dd761a0f633411d6/rc_silhouettematch-delete_grasps.xml @@ -0,0 +1,29 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/703b4b82e725f76dbbf37836692932b9/rc_hand_eye_calibration-get_calibration_poses.xml b/v24.04/de/_downloads/703b4b82e725f76dbbf37836692932b9/rc_hand_eye_calibration-get_calibration_poses.xml new file mode 100644 index 0000000..3c52c8c --- /dev/null +++ b/v24.04/de/_downloads/703b4b82e725f76dbbf37836692932b9/rc_hand_eye_calibration-get_calibration_poses.xml @@ -0,0 +1,37 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/73cb832705410930dea5ef4d8ff957cd/rc_silhouettematch-get_preferred_orientation.xml b/v24.04/de/_downloads/73cb832705410930dea5ef4d8ff957cd/rc_silhouettematch-get_preferred_orientation.xml new file mode 100644 index 0000000..a1bf60c --- /dev/null +++ b/v24.04/de/_downloads/73cb832705410930dea5ef4d8ff957cd/rc_silhouettematch-get_preferred_orientation.xml @@ -0,0 +1,32 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/73dcd5595a93199158398b6c557704e7/rc_stereomatching-reset_defaults.xml b/v24.04/de/_downloads/73dcd5595a93199158398b6c557704e7/rc_stereomatching-reset_defaults.xml new file mode 100644 index 0000000..41513e8 --- /dev/null +++ b/v24.04/de/_downloads/73dcd5595a93199158398b6c557704e7/rc_stereomatching-reset_defaults.xml @@ -0,0 +1,27 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/76ad2f4208d8af0774bc2034d2cd0a38/rc_silhouettematch-get_grasps.xml b/v24.04/de/_downloads/76ad2f4208d8af0774bc2034d2cd0a38/rc_silhouettematch-get_grasps.xml new file mode 100644 index 0000000..8b0d74e --- /dev/null +++ b/v24.04/de/_downloads/76ad2f4208d8af0774bc2034d2cd0a38/rc_silhouettematch-get_grasps.xml @@ -0,0 +1,48 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/784dbdfdd14a4469e7d0fa5c190215d9/rc_april_tag_detect-reset_defaults.xml b/v24.04/de/_downloads/784dbdfdd14a4469e7d0fa5c190215d9/rc_april_tag_detect-reset_defaults.xml new file mode 100644 index 0000000..687b3a9 --- /dev/null +++ b/v24.04/de/_downloads/784dbdfdd14a4469e7d0fa5c190215d9/rc_april_tag_detect-reset_defaults.xml @@ -0,0 +1,27 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/7853012e4ec0eaefd9aa4a20cfd30d56/rc_hand_eye_calibration-delete_poses.xml b/v24.04/de/_downloads/7853012e4ec0eaefd9aa4a20cfd30d56/rc_hand_eye_calibration-delete_poses.xml new file mode 100644 index 0000000..01757c9 --- /dev/null +++ b/v24.04/de/_downloads/7853012e4ec0eaefd9aa4a20cfd30d56/rc_hand_eye_calibration-delete_poses.xml @@ -0,0 +1,31 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/78949d3bfa7c8adea1560805d8dfafb2/rc_hand_eye_calibration-set_pose.xml b/v24.04/de/_downloads/78949d3bfa7c8adea1560805d8dfafb2/rc_hand_eye_calibration-set_pose.xml new file mode 100644 index 0000000..f36417d --- /dev/null +++ b/v24.04/de/_downloads/78949d3bfa7c8adea1560805d8dfafb2/rc_hand_eye_calibration-set_pose.xml @@ -0,0 +1,38 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/79d3f83a88f7315e7033994a85a4ca62/rc_qr_code_detect-start.xml b/v24.04/de/_downloads/79d3f83a88f7315e7033994a85a4ca62/rc_qr_code_detect-start.xml new file mode 100644 index 0000000..11b0d26 --- /dev/null +++ b/v24.04/de/_downloads/79d3f83a88f7315e7033994a85a4ca62/rc_qr_code_detect-start.xml @@ -0,0 +1,29 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/7ad77651713b4f0ad5e1d130ad172547/rc_roi_db-set_region_of_interest_2d.xml b/v24.04/de/_downloads/7ad77651713b4f0ad5e1d130ad172547/rc_roi_db-set_region_of_interest_2d.xml new file mode 100644 index 0000000..2775a4e --- /dev/null +++ b/v24.04/de/_downloads/7ad77651713b4f0ad5e1d130ad172547/rc_roi_db-set_region_of_interest_2d.xml @@ -0,0 +1,32 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/7bcd2892d5265659a62c5d9760ed713c/rc_stereocalib-reset_defaults.xml b/v24.04/de/_downloads/7bcd2892d5265659a62c5d9760ed713c/rc_stereocalib-reset_defaults.xml new file mode 100644 index 0000000..0c5141e --- /dev/null +++ b/v24.04/de/_downloads/7bcd2892d5265659a62c5d9760ed713c/rc_stereocalib-reset_defaults.xml @@ -0,0 +1,27 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/85a8a115074439986e41e6a27417a99e/rc_boxpick-parameters.xml b/v24.04/de/_downloads/85a8a115074439986e41e6a27417a99e/rc_boxpick-parameters.xml new file mode 100644 index 0000000..76f3095 --- /dev/null +++ b/v24.04/de/_downloads/85a8a115074439986e41e6a27417a99e/rc_boxpick-parameters.xml @@ -0,0 +1,71 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/85d101b202fd6183b98d8d874b15a1cc/rc_gripper_db-set_stroke_schunk.xml b/v24.04/de/_downloads/85d101b202fd6183b98d8d874b15a1cc/rc_gripper_db-set_stroke_schunk.xml new file mode 100644 index 0000000..372074a --- /dev/null +++ b/v24.04/de/_downloads/85d101b202fd6183b98d8d874b15a1cc/rc_gripper_db-set_stroke_schunk.xml @@ -0,0 +1,56 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/8af6225545dfef4564e5e1fa5502d3e3/rc_stereomatching-measure_depth.xml b/v24.04/de/_downloads/8af6225545dfef4564e5e1fa5502d3e3/rc_stereomatching-measure_depth.xml new file mode 100644 index 0000000..2812808 --- /dev/null +++ b/v24.04/de/_downloads/8af6225545dfef4564e5e1fa5502d3e3/rc_stereomatching-measure_depth.xml @@ -0,0 +1,71 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/90382df9fb5b2eafbc3c74d8e002a1e5/rc_silhouettematch-get_symmetric_grasps.xml b/v24.04/de/_downloads/90382df9fb5b2eafbc3c74d8e002a1e5/rc_silhouettematch-get_symmetric_grasps.xml new file mode 100644 index 0000000..256a047 --- /dev/null +++ b/v24.04/de/_downloads/90382df9fb5b2eafbc3c74d8e002a1e5/rc_silhouettematch-get_symmetric_grasps.xml @@ -0,0 +1,59 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/917b00d2abce9b8cb641e90ec1ff63f3/rc_itempick-start.xml b/v24.04/de/_downloads/917b00d2abce9b8cb641e90ec1ff63f3/rc_itempick-start.xml new file mode 100644 index 0000000..c268d64 --- /dev/null +++ b/v24.04/de/_downloads/917b00d2abce9b8cb641e90ec1ff63f3/rc_itempick-start.xml @@ -0,0 +1,29 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/9460647c0cd91c3f6a8cf6666b391187/rc_hand_eye_calibration-calibrate.xml b/v24.04/de/_downloads/9460647c0cd91c3f6a8cf6666b391187/rc_hand_eye_calibration-calibrate.xml new file mode 100644 index 0000000..c361eee --- /dev/null +++ b/v24.04/de/_downloads/9460647c0cd91c3f6a8cf6666b391187/rc_hand_eye_calibration-calibrate.xml @@ -0,0 +1,40 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/96675f04ecc37061ae8d901ebae48744/rc_hand_eye_calibration-reset_defaults.xml b/v24.04/de/_downloads/96675f04ecc37061ae8d901ebae48744/rc_hand_eye_calibration-reset_defaults.xml new file mode 100644 index 0000000..ab35b83 --- /dev/null +++ b/v24.04/de/_downloads/96675f04ecc37061ae8d901ebae48744/rc_hand_eye_calibration-reset_defaults.xml @@ -0,0 +1,27 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/9756efafbf692cefbb8fb850bcecdde0/rc_boxpick-set_sorting_strategies.xml b/v24.04/de/_downloads/9756efafbf692cefbb8fb850bcecdde0/rc_boxpick-set_sorting_strategies.xml new file mode 100644 index 0000000..2dbc126 --- /dev/null +++ b/v24.04/de/_downloads/9756efafbf692cefbb8fb850bcecdde0/rc_boxpick-set_sorting_strategies.xml @@ -0,0 +1,34 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/97d8bad0d4cf8e356658bad87a22f9d9/rc_load_carrier-detect_filling_level.xml b/v24.04/de/_downloads/97d8bad0d4cf8e356658bad87a22f9d9/rc_load_carrier-detect_filling_level.xml new file mode 100644 index 0000000..42de4a2 --- /dev/null +++ b/v24.04/de/_downloads/97d8bad0d4cf8e356658bad87a22f9d9/rc_load_carrier-detect_filling_level.xml @@ -0,0 +1,89 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/9810d3c4f1d5e67abde685959153c8cb/rc_boxpick-reset_defaults.xml b/v24.04/de/_downloads/9810d3c4f1d5e67abde685959153c8cb/rc_boxpick-reset_defaults.xml new file mode 100644 index 0000000..e9cbe7e --- /dev/null +++ b/v24.04/de/_downloads/9810d3c4f1d5e67abde685959153c8cb/rc_boxpick-reset_defaults.xml @@ -0,0 +1,27 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/98d3a23ed39fee1d47bfb1ebf46c2ea5/rc_collision_check-check_collisions.xml b/v24.04/de/_downloads/98d3a23ed39fee1d47bfb1ebf46c2ea5/rc_collision_check-check_collisions.xml new file mode 100644 index 0000000..4071687 --- /dev/null +++ b/v24.04/de/_downloads/98d3a23ed39fee1d47bfb1ebf46c2ea5/rc_collision_check-check_collisions.xml @@ -0,0 +1,71 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/9a0f3004eb0450cdc9828b538065f4e4/rc_gripper_db-set_gripper_schunk.xml b/v24.04/de/_downloads/9a0f3004eb0450cdc9828b538065f4e4/rc_gripper_db-set_gripper_schunk.xml new file mode 100644 index 0000000..2bb4fc2 --- /dev/null +++ b/v24.04/de/_downloads/9a0f3004eb0450cdc9828b538065f4e4/rc_gripper_db-set_gripper_schunk.xml @@ -0,0 +1,71 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/9d0b736cd19394c098dc7de340a72383/rc_roi_db-delete_regions_of_interest_2d.xml b/v24.04/de/_downloads/9d0b736cd19394c098dc7de340a72383/rc_roi_db-delete_regions_of_interest_2d.xml new file mode 100644 index 0000000..6661345 --- /dev/null +++ b/v24.04/de/_downloads/9d0b736cd19394c098dc7de340a72383/rc_roi_db-delete_regions_of_interest_2d.xml @@ -0,0 +1,28 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/9d216f6e7f34427ea9765e73616d9159/rc_itempick-reset_defaults.xml b/v24.04/de/_downloads/9d216f6e7f34427ea9765e73616d9159/rc_itempick-reset_defaults.xml new file mode 100644 index 0000000..6802435 --- /dev/null +++ b/v24.04/de/_downloads/9d216f6e7f34427ea9765e73616d9159/rc_itempick-reset_defaults.xml @@ -0,0 +1,27 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/9dadf6dbdbcc2caa4ee4c9a8ad2dcd36/rc_stereocalib-parameters.xml b/v24.04/de/_downloads/9dadf6dbdbcc2caa4ee4c9a8ad2dcd36/rc_stereocalib-parameters.xml new file mode 100644 index 0000000..81ebf89 --- /dev/null +++ b/v24.04/de/_downloads/9dadf6dbdbcc2caa4ee4c9a8ad2dcd36/rc_stereocalib-parameters.xml @@ -0,0 +1,66 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/a2473efcf107027373f4b1ff02a8767e/rc_load_carrier-parameters.xml b/v24.04/de/_downloads/a2473efcf107027373f4b1ff02a8767e/rc_load_carrier-parameters.xml new file mode 100644 index 0000000..1c58d4f --- /dev/null +++ b/v24.04/de/_downloads/a2473efcf107027373f4b1ff02a8767e/rc_load_carrier-parameters.xml @@ -0,0 +1,46 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/a3fc0616dd509ca6ad5bfa3e234415f9/rc_silhouettematch-set_preferred_orientation.xml b/v24.04/de/_downloads/a3fc0616dd509ca6ad5bfa3e234415f9/rc_silhouettematch-set_preferred_orientation.xml new file mode 100644 index 0000000..cfa3cc4 --- /dev/null +++ b/v24.04/de/_downloads/a3fc0616dd509ca6ad5bfa3e234415f9/rc_silhouettematch-set_preferred_orientation.xml @@ -0,0 +1,32 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/a81593c07a26d3551422b4bad3d92f1e/rc_april_tag_detect-detect.xml b/v24.04/de/_downloads/a81593c07a26d3551422b4bad3d92f1e/rc_april_tag_detect-detect.xml new file mode 100644 index 0000000..a46eead --- /dev/null +++ b/v24.04/de/_downloads/a81593c07a26d3551422b4bad3d92f1e/rc_april_tag_detect-detect.xml @@ -0,0 +1,50 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/a9a8b14add94b8cbb28035be50d17807/rc_qr_code_detect-reset_defaults.xml b/v24.04/de/_downloads/a9a8b14add94b8cbb28035be50d17807/rc_qr_code_detect-reset_defaults.xml new file mode 100644 index 0000000..6a36bb4 --- /dev/null +++ b/v24.04/de/_downloads/a9a8b14add94b8cbb28035be50d17807/rc_qr_code_detect-reset_defaults.xml @@ -0,0 +1,27 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/a9daddbe8754d9e6b66ea5967b590a0c/rc_stereocalib-change_state.xml b/v24.04/de/_downloads/a9daddbe8754d9e6b66ea5967b590a0c/rc_stereocalib-change_state.xml new file mode 100644 index 0000000..754018b --- /dev/null +++ b/v24.04/de/_downloads/a9daddbe8754d9e6b66ea5967b590a0c/rc_stereocalib-change_state.xml @@ -0,0 +1,29 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/ac0c9bfa32ece1e124ed31ef017961f7/rc_gripper_db-delete_grippers.xml b/v24.04/de/_downloads/ac0c9bfa32ece1e124ed31ef017961f7/rc_gripper_db-delete_grippers.xml new file mode 100644 index 0000000..610b814 --- /dev/null +++ b/v24.04/de/_downloads/ac0c9bfa32ece1e124ed31ef017961f7/rc_gripper_db-delete_grippers.xml @@ -0,0 +1,28 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/ad0bdeecea5279c909be5f87992db186/rc_silhouettematch-set_sorting_strategies.xml b/v24.04/de/_downloads/ad0bdeecea5279c909be5f87992db186/rc_silhouettematch-set_sorting_strategies.xml new file mode 100644 index 0000000..70b29a1 --- /dev/null +++ b/v24.04/de/_downloads/ad0bdeecea5279c909be5f87992db186/rc_silhouettematch-set_sorting_strategies.xml @@ -0,0 +1,33 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/af2891186ad82ce5bcf14ae0ec0f8214/rc_collision_check-reset_defaults.xml b/v24.04/de/_downloads/af2891186ad82ce5bcf14ae0ec0f8214/rc_collision_check-reset_defaults.xml new file mode 100644 index 0000000..996254f --- /dev/null +++ b/v24.04/de/_downloads/af2891186ad82ce5bcf14ae0ec0f8214/rc_collision_check-reset_defaults.xml @@ -0,0 +1,27 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/c104bd28e9a02ed561ba5cfe6d006439/rc_itempick-set_sorting_strategies.xml b/v24.04/de/_downloads/c104bd28e9a02ed561ba5cfe6d006439/rc_itempick-set_sorting_strategies.xml new file mode 100644 index 0000000..5570590 --- /dev/null +++ b/v24.04/de/_downloads/c104bd28e9a02ed561ba5cfe6d006439/rc_itempick-set_sorting_strategies.xml @@ -0,0 +1,34 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/c9cd37edd5d0c0b4b31636d5ebac84ff/rc_qr_code_detect-stop.xml b/v24.04/de/_downloads/c9cd37edd5d0c0b4b31636d5ebac84ff/rc_qr_code_detect-stop.xml new file mode 100644 index 0000000..8e3cdd0 --- /dev/null +++ b/v24.04/de/_downloads/c9cd37edd5d0c0b4b31636d5ebac84ff/rc_qr_code_detect-stop.xml @@ -0,0 +1,29 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/cce9cbd427ee15045234a8414bff69e4/rc_hand_eye_calibration-remove_calibration.xml b/v24.04/de/_downloads/cce9cbd427ee15045234a8414bff69e4/rc_hand_eye_calibration-remove_calibration.xml new file mode 100644 index 0000000..4aec1ed --- /dev/null +++ b/v24.04/de/_downloads/cce9cbd427ee15045234a8414bff69e4/rc_hand_eye_calibration-remove_calibration.xml @@ -0,0 +1,30 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/cf8cc9109fb970d7b2609f58d5e22a45/rc_itempick-stop.xml b/v24.04/de/_downloads/cf8cc9109fb970d7b2609f58d5e22a45/rc_itempick-stop.xml new file mode 100644 index 0000000..ed0b658 --- /dev/null +++ b/v24.04/de/_downloads/cf8cc9109fb970d7b2609f58d5e22a45/rc_itempick-stop.xml @@ -0,0 +1,29 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/d189940df08d28e4d88a958aa94c2490/rc_boxpick-detect_items.xml b/v24.04/de/_downloads/d189940df08d28e4d88a958aa94c2490/rc_boxpick-detect_items.xml new file mode 100644 index 0000000..9b0c909 --- /dev/null +++ b/v24.04/de/_downloads/d189940df08d28e4d88a958aa94c2490/rc_boxpick-detect_items.xml @@ -0,0 +1,96 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/d231605f55531fd7c6f84efe4865b85c/rc_gripper_db-set_gripper.xml b/v24.04/de/_downloads/d231605f55531fd7c6f84efe4865b85c/rc_gripper_db-set_gripper.xml new file mode 100644 index 0000000..1e603eb --- /dev/null +++ b/v24.04/de/_downloads/d231605f55531fd7c6f84efe4865b85c/rc_gripper_db-set_gripper.xml @@ -0,0 +1,80 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/d2b67179b130cab139516bdf9ce97f8f/rc_april_tag_detect-stop.xml b/v24.04/de/_downloads/d2b67179b130cab139516bdf9ce97f8f/rc_april_tag_detect-stop.xml new file mode 100644 index 0000000..c233f27 --- /dev/null +++ b/v24.04/de/_downloads/d2b67179b130cab139516bdf9ce97f8f/rc_april_tag_detect-stop.xml @@ -0,0 +1,29 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/d4fabf4b6346063d793730c7c1245fe5/rc_hand_eye_calibration-parameters.xml b/v24.04/de/_downloads/d4fabf4b6346063d793730c7c1245fe5/rc_hand_eye_calibration-parameters.xml new file mode 100644 index 0000000..7e26242 --- /dev/null +++ b/v24.04/de/_downloads/d4fabf4b6346063d793730c7c1245fe5/rc_hand_eye_calibration-parameters.xml @@ -0,0 +1,51 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/d96b54547ed3e4302bf41612b497003f/rc_april_tag_detect-restart.xml b/v24.04/de/_downloads/d96b54547ed3e4302bf41612b497003f/rc_april_tag_detect-restart.xml new file mode 100644 index 0000000..ee482c5 --- /dev/null +++ b/v24.04/de/_downloads/d96b54547ed3e4302bf41612b497003f/rc_april_tag_detect-restart.xml @@ -0,0 +1,29 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/da8f1169f13b09826c95f4f13b93773c/rc_gripper_db-get_grippers_schunk.xml b/v24.04/de/_downloads/da8f1169f13b09826c95f4f13b93773c/rc_gripper_db-get_grippers_schunk.xml new file mode 100644 index 0000000..ca38fae --- /dev/null +++ b/v24.04/de/_downloads/da8f1169f13b09826c95f4f13b93773c/rc_gripper_db-get_grippers_schunk.xml @@ -0,0 +1,55 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/db0e7a3e91a48d7e55de7a85dd97c58c/rc_boxpick-stop.xml b/v24.04/de/_downloads/db0e7a3e91a48d7e55de7a85dd97c58c/rc_boxpick-stop.xml new file mode 100644 index 0000000..292d5d2 --- /dev/null +++ b/v24.04/de/_downloads/db0e7a3e91a48d7e55de7a85dd97c58c/rc_boxpick-stop.xml @@ -0,0 +1,29 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/dfb2acadd7cf0de405b1d2c3a403eecc/rc_itempick-parameters.xml b/v24.04/de/_downloads/dfb2acadd7cf0de405b1d2c3a403eecc/rc_itempick-parameters.xml new file mode 100644 index 0000000..9208cec --- /dev/null +++ b/v24.04/de/_downloads/dfb2acadd7cf0de405b1d2c3a403eecc/rc_itempick-parameters.xml @@ -0,0 +1,56 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/e2525f35aca37889459742359875675d/rc_load_carrier_db-set_load_carrier.xml b/v24.04/de/_downloads/e2525f35aca37889459742359875675d/rc_load_carrier_db-set_load_carrier.xml new file mode 100644 index 0000000..aba6572 --- /dev/null +++ b/v24.04/de/_downloads/e2525f35aca37889459742359875675d/rc_load_carrier_db-set_load_carrier.xml @@ -0,0 +1,48 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/e4292fd9e65ab142b0d6b8a4fe88e420/rc_hand_eye_calibration-set_calibration.xml b/v24.04/de/_downloads/e4292fd9e65ab142b0d6b8a4fe88e420/rc_hand_eye_calibration-set_calibration.xml new file mode 100644 index 0000000..a65795f --- /dev/null +++ b/v24.04/de/_downloads/e4292fd9e65ab142b0d6b8a4fe88e420/rc_hand_eye_calibration-set_calibration.xml @@ -0,0 +1,37 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/e46fd39d5582764442c36fd125a3a8f6/rc_silhouettematch-get_base_plane_calibration.xml b/v24.04/de/_downloads/e46fd39d5582764442c36fd125a3a8f6/rc_silhouettematch-get_base_plane_calibration.xml new file mode 100644 index 0000000..3f705cf --- /dev/null +++ b/v24.04/de/_downloads/e46fd39d5582764442c36fd125a3a8f6/rc_silhouettematch-get_base_plane_calibration.xml @@ -0,0 +1,39 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/e82de54e1a50807bb652b228f7a53316/rc_load_carrier-reset_defaults.xml b/v24.04/de/_downloads/e82de54e1a50807bb652b228f7a53316/rc_load_carrier-reset_defaults.xml new file mode 100644 index 0000000..49d7f9e --- /dev/null +++ b/v24.04/de/_downloads/e82de54e1a50807bb652b228f7a53316/rc_load_carrier-reset_defaults.xml @@ -0,0 +1,27 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/ea9aba6241a31a8ae72400294987f9f2/rc_boxpick-compute_grasps.xml b/v24.04/de/_downloads/ea9aba6241a31a8ae72400294987f9f2/rc_boxpick-compute_grasps.xml new file mode 100644 index 0000000..05ae7f6 --- /dev/null +++ b/v24.04/de/_downloads/ea9aba6241a31a8ae72400294987f9f2/rc_boxpick-compute_grasps.xml @@ -0,0 +1,118 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/ec774f2f93f3121bd37a3110b4aa3da6/rc_camera-parameters.xml b/v24.04/de/_downloads/ec774f2f93f3121bd37a3110b4aa3da6/rc_camera-parameters.xml new file mode 100644 index 0000000..424aa0b --- /dev/null +++ b/v24.04/de/_downloads/ec774f2f93f3121bd37a3110b4aa3da6/rc_camera-parameters.xml @@ -0,0 +1,111 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/eec428121195ebe074fbe0afe06fc347/rc_silhouettematch-reset_defaults.xml b/v24.04/de/_downloads/eec428121195ebe074fbe0afe06fc347/rc_silhouettematch-reset_defaults.xml new file mode 100644 index 0000000..f980e3a --- /dev/null +++ b/v24.04/de/_downloads/eec428121195ebe074fbe0afe06fc347/rc_silhouettematch-reset_defaults.xml @@ -0,0 +1,27 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_downloads/ff5c4929bf25fe8ec47d030bec059419/rc_roi_db-delete_regions_of_interest.xml b/v24.04/de/_downloads/ff5c4929bf25fe8ec47d030bec059419/rc_roi_db-delete_regions_of_interest.xml new file mode 100644 index 0000000..da89293 --- /dev/null +++ b/v24.04/de/_downloads/ff5c4929bf25fe8ec47d030bec059419/rc_roi_db-delete_regions_of_interest.xml @@ -0,0 +1,28 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_images/apriltag_dim_vis.png b/v24.04/de/_images/apriltag_dim_vis.png new file mode 100644 index 0000000..052af65 Binary files /dev/null and b/v24.04/de/_images/apriltag_dim_vis.png differ diff --git a/v24.04/de/_images/boxpick_modes_new.svg b/v24.04/de/_images/boxpick_modes_new.svg new file mode 100644 index 0000000..623cd17 --- /dev/null +++ b/v24.04/de/_images/boxpick_modes_new.svg @@ -0,0 +1,1380 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PackedLayers + PackedGridLayout + Unconstrained + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PackedLayers + PackedGridLayout + Unconstrained + + + + PackedLayers + PackedGridLayout + Unconstrained + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PackedLayers + PackedGridLayout + Unconstrained + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PackedLayers + PackedGridLayout + Unconstrained + + + + + + + + + diff --git a/v24.04/de/_images/calib-views.png b/v24.04/de/_images/calib-views.png new file mode 100644 index 0000000..a737279 Binary files /dev/null and b/v24.04/de/_images/calib-views.png differ diff --git a/v24.04/de/_images/ce-mark_small.png b/v24.04/de/_images/ce-mark_small.png new file mode 100644 index 0000000..2e7b8cc Binary files /dev/null and b/v24.04/de/_images/ce-mark_small.png differ diff --git a/v24.04/de/_images/check_flange.svg b/v24.04/de/_images/check_flange.svg new file mode 100644 index 0000000..d16c75a --- /dev/null +++ b/v24.04/de/_images/check_flange.svg @@ -0,0 +1,757 @@ + + + +image/svg+xmlico_robot_inactive + + + + + + + + +ico_robot_inactive + + + + + + + + + + + + + + +A + +B + + \ No newline at end of file diff --git a/v24.04/de/_images/ethernet_cable.png b/v24.04/de/_images/ethernet_cable.png new file mode 100644 index 0000000..d6443f6 Binary files /dev/null and b/v24.04/de/_images/ethernet_cable.png differ diff --git a/v24.04/de/_images/example_qr_code.png b/v24.04/de/_images/example_qr_code.png new file mode 100644 index 0000000..2fafa56 Binary files /dev/null and b/v24.04/de/_images/example_qr_code.png differ diff --git a/v24.04/de/_images/fps_alternate_ng_de.png b/v24.04/de/_images/fps_alternate_ng_de.png new file mode 100644 index 0000000..852c758 Binary files /dev/null and b/v24.04/de/_images/fps_alternate_ng_de.png differ diff --git a/v24.04/de/_images/fps_exposure_ng_de.png b/v24.04/de/_images/fps_exposure_ng_de.png new file mode 100644 index 0000000..f5979ad Binary files /dev/null and b/v24.04/de/_images/fps_exposure_ng_de.png differ diff --git a/v24.04/de/_images/fps_ng_de.png b/v24.04/de/_images/fps_ng_de.png new file mode 100644 index 0000000..0c7faee Binary files /dev/null and b/v24.04/de/_images/fps_ng_de.png differ diff --git a/v24.04/de/_images/genicam_logo_small.png b/v24.04/de/_images/genicam_logo_small.png new file mode 100644 index 0000000..dbdb6dd Binary files /dev/null and b/v24.04/de/_images/genicam_logo_small.png differ diff --git a/v24.04/de/_images/gige_logo_small.png b/v24.04/de/_images/gige_logo_small.png new file mode 100644 index 0000000..092db29 Binary files /dev/null and b/v24.04/de/_images/gige_logo_small.png differ diff --git a/v24.04/de/_images/grasp_points_silm.svg b/v24.04/de/_images/grasp_points_silm.svg new file mode 100644 index 0000000..54a4fdb --- /dev/null +++ b/v24.04/de/_images/grasp_points_silm.svg @@ -0,0 +1,940 @@ + + + +image/svg+xmlico_robot_inactive + + + + + + + + + + + + + + + + + + + + + + + +ico_robot_inactive + + + + + + + + + + + + + + +y + + + +z + + + +x + + + + + +Pgrasp + + + + + +TCP + +y +z +x + \ No newline at end of file diff --git a/v24.04/de/_images/gripper_frames_restapi.svg b/v24.04/de/_images/gripper_frames_restapi.svg new file mode 100644 index 0000000..97f7e17 --- /dev/null +++ b/v24.04/de/_images/gripper_frames_restapi.svg @@ -0,0 +1,829 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Pcyl + Pbox + + + + hbox + + + + hcyl + + Pdiff = (0, 0, (hcyl+hbox)/2) + Pdiff + + diff --git a/v24.04/de/_images/handeyecalib-alldraw.png b/v24.04/de/_images/handeyecalib-alldraw.png new file mode 100644 index 0000000..e72801e Binary files /dev/null and b/v24.04/de/_images/handeyecalib-alldraw.png differ diff --git a/v24.04/de/_images/image_coordinates.png b/v24.04/de/_images/image_coordinates.png new file mode 100644 index 0000000..85cf974 Binary files /dev/null and b/v24.04/de/_images/image_coordinates.png differ diff --git a/v24.04/de/_images/ip_configuration_flowchart_ng_de.svg b/v24.04/de/_images/ip_configuration_flowchart_ng_de.svg new file mode 100644 index 0000000..d3fd200 --- /dev/null +++ b/v24.04/de/_images/ip_configuration_flowchart_ng_de.svg @@ -0,0 +1,497 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Ja + Ja + Ja + Nutze Persistente IP + Nutze DHCP + Erfolgreich? + Erfolgreich? + Nein + Nein + Nein + Start + Ende + Ja + Nein + Persistente IPaktiviert? + + DHCP aktiviert? + Nutze Link-LocalAdresse + diff --git a/v24.04/de/_images/itempick_grasp_surface.png b/v24.04/de/_images/itempick_grasp_surface.png new file mode 100644 index 0000000..6723b68 Binary files /dev/null and b/v24.04/de/_images/itempick_grasp_surface.png differ diff --git a/v24.04/de/_images/itempick_lc_filling_level.png b/v24.04/de/_images/itempick_lc_filling_level.png new file mode 100644 index 0000000..8c9a98f Binary files /dev/null and b/v24.04/de/_images/itempick_lc_filling_level.png differ diff --git a/v24.04/de/_images/itempick_load_carrier_compartment.svg b/v24.04/de/_images/itempick_load_carrier_compartment.svg new file mode 100644 index 0000000..e2be2e2 --- /dev/null +++ b/v24.04/de/_images/itempick_load_carrier_compartment.svg @@ -0,0 +1,278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + x + + + y + + + z + + + + compartment.box.y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + compartment.box.x + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + compartment.box.z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_images/itempick_load_carrier_reference.svg b/v24.04/de/_images/itempick_load_carrier_reference.svg new file mode 100644 index 0000000..2e291f6 --- /dev/null +++ b/v24.04/de/_images/itempick_load_carrier_reference.svg @@ -0,0 +1,323 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + x + + + y + + + z + + + + outer_dimensions.x + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + inner_dimensions.x + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + inner_dimensions.y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + outer_dimensions.y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + inner_dimensions.z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + outer_dimensions.z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_images/itempick_load_carrier_reference_rim_sidebyside.svg b/v24.04/de/_images/itempick_load_carrier_reference_rim_sidebyside.svg new file mode 100644 index 0000000..8d2adc1 --- /dev/null +++ b/v24.04/de/_images/itempick_load_carrier_reference_rim_sidebyside.svg @@ -0,0 +1,1775 @@ + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + x + + + + z + + + + + outer_dimensions.x + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + inner_dimensions.x + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + inner_dimensions.y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + outer_dimensions.y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + inner_dimensions.z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + outer_dimensions.z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + z + + + + + rim_thickness.y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + rim_thickness.x + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + x + + + + y + + + + \ No newline at end of file diff --git a/v24.04/de/_images/lc_types.svg b/v24.04/de/_images/lc_types.svg new file mode 100644 index 0000000..5361d4b --- /dev/null +++ b/v24.04/de/_images/lc_types.svg @@ -0,0 +1,1633 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + x + + + y + + + z + + + + outer_dimension y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + outer_dimension x + + + + + + + + dimension z + + + outer_ + + + + + + + + + inner_dimension x + + + + + + inner_ + + + dimension z + + + + + + + inner_ + + + iimension y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + x + + + y + + + z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + outer_dimension y + + + + + outer_dimension x + + + + + dimension z + + + outer_ + + + + + inner_dimension x + + + + inner_ + + + dimension z + + + + inner_ + + + dimension y + + + + height_open_side + + A + B + + diff --git a/v24.04/de/_images/load_carrier_inside_volume.svg b/v24.04/de/_images/load_carrier_inside_volume.svg new file mode 100644 index 0000000..e518c57 --- /dev/null +++ b/v24.04/de/_images/load_carrier_inside_volume.svg @@ -0,0 +1,233 @@ + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + 0.1 m + + + + + + crop_distance + + diff --git a/v24.04/de/_images/pre_grasp_offset.svg b/v24.04/de/_images/pre_grasp_offset.svg new file mode 100644 index 0000000..717ce34 --- /dev/null +++ b/v24.04/de/_images/pre_grasp_offset.svg @@ -0,0 +1,964 @@ + + + +image/svg+xmlico_robot_inactive + + + + + + + + +ico_robot_inactive + + + + + + + + + + + + + + +y +z +x +Ppre +Pgrasp +y +z +x +Poff=Pgrasp-Ppre + \ No newline at end of file diff --git a/v24.04/de/_images/rc_visard160_frames.png b/v24.04/de/_images/rc_visard160_frames.png new file mode 100644 index 0000000..5cabfd5 Binary files /dev/null and b/v24.04/de/_images/rc_visard160_frames.png differ diff --git a/v24.04/de/_images/rc_visard_160_general.png b/v24.04/de/_images/rc_visard_160_general.png new file mode 100644 index 0000000..f7bd933 Binary files /dev/null and b/v24.04/de/_images/rc_visard_160_general.png differ diff --git a/v24.04/de/_images/rc_visard_connect_ng_de.png b/v24.04/de/_images/rc_visard_connect_ng_de.png new file mode 100644 index 0000000..2602fa7 Binary files /dev/null and b/v24.04/de/_images/rc_visard_connect_ng_de.png differ diff --git a/v24.04/de/_images/rc_visard_connectivity_kit_ng_de.png b/v24.04/de/_images/rc_visard_connectivity_kit_ng_de.png new file mode 100644 index 0000000..2b159df Binary files /dev/null and b/v24.04/de/_images/rc_visard_connectivity_kit_ng_de.png differ diff --git a/v24.04/de/_images/rc_visard_gpio.png b/v24.04/de/_images/rc_visard_gpio.png new file mode 100644 index 0000000..11cbe7b Binary files /dev/null and b/v24.04/de/_images/rc_visard_gpio.png differ diff --git a/v24.04/de/_images/rc_visard_mounting_ng_de.png b/v24.04/de/_images/rc_visard_mounting_ng_de.png new file mode 100644 index 0000000..ce7e1f5 Binary files /dev/null and b/v24.04/de/_images/rc_visard_mounting_ng_de.png differ diff --git a/v24.04/de/_images/rc_visard_parts_ng_de.png b/v24.04/de/_images/rc_visard_parts_ng_de.png new file mode 100644 index 0000000..c4b269e Binary files /dev/null and b/v24.04/de/_images/rc_visard_parts_ng_de.png differ diff --git a/v24.04/de/_images/rc_visard_pinout_ng_de.png b/v24.04/de/_images/rc_visard_pinout_ng_de.png new file mode 100644 index 0000000..c76d168 Binary files /dev/null and b/v24.04/de/_images/rc_visard_pinout_ng_de.png differ diff --git a/v24.04/de/_images/rcdiscover_guiwin.png b/v24.04/de/_images/rcdiscover_guiwin.png new file mode 100644 index 0000000..40a00ae Binary files /dev/null and b/v24.04/de/_images/rcdiscover_guiwin.png differ diff --git a/v24.04/de/_images/rcdiscover_reset.png b/v24.04/de/_images/rcdiscover_reset.png new file mode 100644 index 0000000..f48098b Binary files /dev/null and b/v24.04/de/_images/rcdiscover_reset.png differ diff --git a/v24.04/de/_images/reconstruction_error.png b/v24.04/de/_images/reconstruction_error.png new file mode 100644 index 0000000..9cb7314 Binary files /dev/null and b/v24.04/de/_images/reconstruction_error.png differ diff --git a/v24.04/de/_images/rim_types.svg b/v24.04/de/_images/rim_types.svg new file mode 100644 index 0000000..982172f --- /dev/null +++ b/v24.04/de/_images/rim_types.svg @@ -0,0 +1,1169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + outer_dimension z + + + + + rim_thickness (x, y) + + + + inner_dimension (x, y) + + + outer_dimension (x, y) + + + + inner_dimension z + + + + + rim_step_height + + + + + + + + + + + + + + + + + + + + + + + + + + + + outer_dimension z + + + rim_thickness (x, y) + + + inner_dimension (x, y) + + + outer_dimension (x, y) + + + inner_dimension z + + + rim_step_height + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + rim_thickness (x, y) + + + + + rim_ledge (x, y) + + + + + outer_dimension z + + + + + inner_dimension z + + + + + rim_step_height + + + + inner_dimension (x, y) + + + outer_dimension (x, y) + + A + B + C + + diff --git a/v24.04/de/_images/sensor_ng.png b/v24.04/de/_images/sensor_ng.png new file mode 100644 index 0000000..5d25b8a Binary files /dev/null and b/v24.04/de/_images/sensor_ng.png differ diff --git a/v24.04/de/_images/silhouetteMatchStreams.png b/v24.04/de/_images/silhouetteMatchStreams.png new file mode 100644 index 0000000..ff1f752 Binary files /dev/null and b/v24.04/de/_images/silhouetteMatchStreams.png differ diff --git a/v24.04/de/_images/sketch_handeye_calib_gridmount_ng_de.svg b/v24.04/de/_images/sketch_handeye_calib_gridmount_ng_de.svg new file mode 100644 index 0000000..ca5a532 --- /dev/null +++ b/v24.04/de/_images/sketch_handeye_calib_gridmount_ng_de.svg @@ -0,0 +1,953 @@ + + + +image/svg+xmlico_robot_inactive + + + + + + +ico_robot_inactive + Roboter +Kamera + + + Roboter +Kamera + + + \ No newline at end of file diff --git a/v24.04/de/_images/sketch_handeye_calib_robotmounted_4dof_ng_de.svg b/v24.04/de/_images/sketch_handeye_calib_robotmounted_4dof_ng_de.svg new file mode 100644 index 0000000..e691896 --- /dev/null +++ b/v24.04/de/_images/sketch_handeye_calib_robotmounted_4dof_ng_de.svg @@ -0,0 +1,938 @@ + + + +image/svg+xmlico_robot_inactive + + + + + + + + +ico_robot_inactiveRoboter + + +ext + + +Kamera + + + + + +T + + + + + +robot + + + + + +ext + + + + + +T + + + + + +camera + + + + + +robot + + + + + +Kalibriermuster + + +TCP-Rotationsachse + + +TCP-Offset + + + \ No newline at end of file diff --git a/v24.04/de/_images/sketch_handeye_calib_robotmounted_ng_de.svg b/v24.04/de/_images/sketch_handeye_calib_robotmounted_ng_de.svg new file mode 100644 index 0000000..177d82f --- /dev/null +++ b/v24.04/de/_images/sketch_handeye_calib_robotmounted_ng_de.svg @@ -0,0 +1,798 @@ + + + +image/svg+xmlico_robot_inactive + + + + + + + + +ico_robot_inactiveRoboter +ext +Kamera + + + +T + + + +robot + + + +ext + + + +T + + + +camera + + + +robot + + + +Kalibriermuster + + + \ No newline at end of file diff --git a/v24.04/de/_images/sketch_handeye_calib_static_4dof_ng_de.svg b/v24.04/de/_images/sketch_handeye_calib_static_4dof_ng_de.svg new file mode 100644 index 0000000..1ac4d8d --- /dev/null +++ b/v24.04/de/_images/sketch_handeye_calib_static_4dof_ng_de.svg @@ -0,0 +1,1001 @@ + + + +image/svg+xmlico_robot_inactive + + + + + + + + +ico_robot_inactiveext + + +Kamera + + + + + +T + + + + + +robot + + + + + +ext + + + + + +T + + + + + +camera + + + + + +ext + + + + + + Kalibrier-muster + + +Roboter + + +TCP-Rotationsachse + + +TCP-Offset + + + \ No newline at end of file diff --git a/v24.04/de/_images/sketch_handeye_calib_static_ng_de.svg b/v24.04/de/_images/sketch_handeye_calib_static_ng_de.svg new file mode 100644 index 0000000..c493639 --- /dev/null +++ b/v24.04/de/_images/sketch_handeye_calib_static_ng_de.svg @@ -0,0 +1,818 @@ + + + +image/svg+xmlico_robot_inactive + + + + + + + + + + + +ico_robot_inactiveRoboter +ext +Kamera + + + +T + + + +robot + + + +ext + + + +T + + + +camera + + + +ext + + + + Kalibriermuster  + + + \ No newline at end of file diff --git a/v24.04/de/_images/stereo_sketch_v2_ng_de.svg b/v24.04/de/_images/stereo_sketch_v2_ng_de.svg new file mode 100644 index 0000000..eeff228 --- /dev/null +++ b/v24.04/de/_images/stereo_sketch_v2_ng_de.svg @@ -0,0 +1,399 @@ + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + Bildebene + linke Kamera + rechte Kamera + + + + linkes Bild + + + + + + + + + + + + + + rechtes Bild + + + + + + + + d + 1 + + + d + 2 + + + + + + diff --git a/v24.04/de/_images/swagger_ui_example_fill_service_args.png b/v24.04/de/_images/swagger_ui_example_fill_service_args.png new file mode 100644 index 0000000..5655b93 Binary files /dev/null and b/v24.04/de/_images/swagger_ui_example_fill_service_args.png differ diff --git a/v24.04/de/_images/swagger_ui_example_get_service_args.png b/v24.04/de/_images/swagger_ui_example_get_service_args.png new file mode 100644 index 0000000..efad52e Binary files /dev/null and b/v24.04/de/_images/swagger_ui_example_get_service_args.png differ diff --git a/v24.04/de/_images/swagger_ui_example_simple_get.png b/v24.04/de/_images/swagger_ui_example_simple_get.png new file mode 100644 index 0000000..07abff9 Binary files /dev/null and b/v24.04/de/_images/swagger_ui_example_simple_get.png differ diff --git a/v24.04/de/_images/swagger_ui_overview_ng.png b/v24.04/de/_images/swagger_ui_overview_ng.png new file mode 100644 index 0000000..82e2ece Binary files /dev/null and b/v24.04/de/_images/swagger_ui_overview_ng.png differ diff --git a/v24.04/de/_images/tag-re-identification.png b/v24.04/de/_images/tag-re-identification.png new file mode 100644 index 0000000..eb06171 Binary files /dev/null and b/v24.04/de/_images/tag-re-identification.png differ diff --git a/v24.04/de/_images/tag_coord_frames.png b/v24.04/de/_images/tag_coord_frames.png new file mode 100644 index 0000000..d97cd0b Binary files /dev/null and b/v24.04/de/_images/tag_coord_frames.png differ diff --git a/v24.04/de/_images/tag_sizes_vis.png b/v24.04/de/_images/tag_sizes_vis.png new file mode 100644 index 0000000..1e77363 Binary files /dev/null and b/v24.04/de/_images/tag_sizes_vis.png differ diff --git a/v24.04/de/_images/typelabel_ng_de.png b/v24.04/de/_images/typelabel_ng_de.png new file mode 100644 index 0000000..4473951 Binary files /dev/null and b/v24.04/de/_images/typelabel_ng_de.png differ diff --git a/v24.04/de/_images/webgui_camera_calibration_1_ng_de.png b/v24.04/de/_images/webgui_camera_calibration_1_ng_de.png new file mode 100644 index 0000000..2ae5a92 Binary files /dev/null and b/v24.04/de/_images/webgui_camera_calibration_1_ng_de.png differ diff --git a/v24.04/de/_images/webgui_camera_calibration_3_ng_de.png b/v24.04/de/_images/webgui_camera_calibration_3_ng_de.png new file mode 100644 index 0000000..9fa1cb9 Binary files /dev/null and b/v24.04/de/_images/webgui_camera_calibration_3_ng_de.png differ diff --git a/v24.04/de/_images/webgui_camera_calibration_4_ng_de.png b/v24.04/de/_images/webgui_camera_calibration_4_ng_de.png new file mode 100644 index 0000000..7c25933 Binary files /dev/null and b/v24.04/de/_images/webgui_camera_calibration_4_ng_de.png differ diff --git a/v24.04/de/_images/webgui_camera_calibration_stereo_far.png b/v24.04/de/_images/webgui_camera_calibration_stereo_far.png new file mode 100644 index 0000000..e80d23e Binary files /dev/null and b/v24.04/de/_images/webgui_camera_calibration_stereo_far.png differ diff --git a/v24.04/de/_images/webgui_camera_calibration_stereo_tilt.png b/v24.04/de/_images/webgui_camera_calibration_stereo_tilt.png new file mode 100644 index 0000000..ea84d09 Binary files /dev/null and b/v24.04/de/_images/webgui_camera_calibration_stereo_tilt.png differ diff --git a/v24.04/de/_images/webgui_camera_calibration_wrong.png b/v24.04/de/_images/webgui_camera_calibration_wrong.png new file mode 100644 index 0000000..b197854 Binary files /dev/null and b/v24.04/de/_images/webgui_camera_calibration_wrong.png differ diff --git a/v24.04/de/_images/webgui_camera_ng_de.png b/v24.04/de/_images/webgui_camera_ng_de.png new file mode 100644 index 0000000..2a846fe Binary files /dev/null and b/v24.04/de/_images/webgui_camera_ng_de.png differ diff --git a/v24.04/de/_images/webgui_dashboard_ng_de.png b/v24.04/de/_images/webgui_dashboard_ng_de.png new file mode 100644 index 0000000..7894d8a Binary files /dev/null and b/v24.04/de/_images/webgui_dashboard_ng_de.png differ diff --git a/v24.04/de/_images/webgui_depth_image_ng_de.png b/v24.04/de/_images/webgui_depth_image_ng_de.png new file mode 100644 index 0000000..606006a Binary files /dev/null and b/v24.04/de/_images/webgui_depth_image_ng_de.png differ diff --git a/v24.04/de/_images/webgui_hand_eye_calib1_calib_ng_de.png b/v24.04/de/_images/webgui_hand_eye_calib1_calib_ng_de.png new file mode 100644 index 0000000..6c5430b Binary files /dev/null and b/v24.04/de/_images/webgui_hand_eye_calib1_calib_ng_de.png differ diff --git a/v24.04/de/_images/webgui_hand_eye_calib2_ng_de.png b/v24.04/de/_images/webgui_hand_eye_calib2_ng_de.png new file mode 100644 index 0000000..bb4969f Binary files /dev/null and b/v24.04/de/_images/webgui_hand_eye_calib2_ng_de.png differ diff --git a/v24.04/de/_images/webgui_hand_eye_calib3_ng_de.png b/v24.04/de/_images/webgui_hand_eye_calib3_ng_de.png new file mode 100644 index 0000000..cfc7bd5 Binary files /dev/null and b/v24.04/de/_images/webgui_hand_eye_calib3_ng_de.png differ diff --git a/v24.04/de/_images/webgui_hand_eye_calib4_ng_de.png b/v24.04/de/_images/webgui_hand_eye_calib4_ng_de.png new file mode 100644 index 0000000..28f804a Binary files /dev/null and b/v24.04/de/_images/webgui_hand_eye_calib4_ng_de.png differ diff --git a/v24.04/de/_images/weee-mark_small.png b/v24.04/de/_images/weee-mark_small.png new file mode 100644 index 0000000..fa2ef91 Binary files /dev/null and b/v24.04/de/_images/weee-mark_small.png differ diff --git a/v24.04/de/_raw_sources/accessories.rst.txt b/v24.04/de/_raw_sources/accessories.rst.txt new file mode 100644 index 0000000..4a0202c --- /dev/null +++ b/v24.04/de/_raw_sources/accessories.rst.txt @@ -0,0 +1,110 @@ +.. include:: global_rst.glb + +.. _sect-accessories: + +Accessories +=========== + +Connectivity kit +---------------- + +.. index:: + single: connectivity kit + single: cables + single: power cable + single: network cable + +|company| offers an optional connectivity kit to aid customers with setting up the |rc_xxx|. +For permanent installation, the customer is responsible for providing a suitable power supply. +The connectivity kit consists of a: + +- network cable with straight M12 plug to straight RJ45 connector in either 2 m, 5 m, or 10 m length, +- power adapter cable with straight M12 socket to DC barrel connector in 30 cm length, +- 24 V, 30 W wall power supply, or a 24 V, 60 W desktop power supply. + +Connecting the |rc_xxx| to residential or office grid power requires a power supply that +meets EN 55011 Class B emission standards. The E2CFS 30W 24V by EGSTON System Electronics +Eggenburg GmbH (http://www.egston.com) contained in the connectivity kit is certified +accordingly. However, it does not meet immunity standards for industrial environments +under EN 61000-6-2. + +.. figure:: images/rc_visard_connectivity_kit.* + :width: 160mm + :align: center + + The optional connectivity kit's components + + +Wiring +------ + +Cables are by default not provided with the |rc_xxx|. It is the customer's responsibility +to obtain appropriate parts. The following sections provide an overview of suggested components. + +Ethernet connections +"""""""""""""""""""" +.. index:: + single: network cable + +The |rc_xxx| provides an industrial 8-pin A-coded M12 socket connector for Ethernet connectivity. +Various cabling solutions can be obtained directly from third party vendors. + +**CAT5 (1 Gbps) M12 plug to RJ45** + +- Straight M12 plug to straight RJ45 connector, 10 m length: Phoenix Contact NBC-MS/ 10,0-94B/R4AC SCO, Art.-Nr.: 1407417 +- Straight M12 plug to straight RJ45 connector, 10 m length: MURR Electronics Art.-Nr.: 7700-48521-S4W1000 +- Angled M12 plug to straight RJ45 connector, 10 m length: MURR Electronics Art.-Nr.: 7700-48551-S4W1000 + +Power connections +""""""""""""""""" + +.. index:: + single: power cable + +An 8-pin A-coded M12 plug connector is provided for power and GPIO connectivity. +Various cabling solutions can be obtained from third party vendors. A selection of M12 +to open ended cables is provided below. Customers are required to provide power and GPIO +connections to the cables according to the pinouts described in +:ref:`sect-wiring`:latex:`\:(Section \ref{hardware_spec:sect-wiring})`. +The |rc_xxx|'s housing must be connected to ground. + +**Sensor/Actor cable M12 socket to open end** + +- Straight M12 socket connector to open end, shielded, 10m length: Phoenix Contact SAC-8P-10,0-PUR/M12FS SH, Art.Nr.: 1522891 +- Angled M12 socket connector to open end, shielded 10m length: Phoenix Contact SAC-8P-10,0-PUR/M12FR SH, Art.Nr.: 1522943 + +**Sensor/Actor M12 socket for field termination** + +- Phoenix Contact SACC-M12FS-8CON-PG9-M, Art.Nr.:1513347 +- TE Connectivity T4110011081-000 (metal housing) +- TE Connectivity T4110001081-000 (plastic housing) + +Power supplies +"""""""""""""" + +.. index:: + single: power supply + +The |rc_xxx| is classified as an EN-55011 Class B device and immune to light +industrial and industrial environments. For connecting the sensor to residential +grid power, a power supply under EN 55011/55022 Class B has to be used. + +It is the customer's responsibility to obtain and install a suitable power supply +satisfying EN 61000-6-2 for permanent installation in industrial environments. One +example that satisfies both EN 61000-6-2 and EN 55011/55022 Class B is the DIN-Rail +mounted PULS MiniLine ML60.241 24V/DC 2.5 A by PULS GmbH (http://www.pulspower.com). +A certified electrician must perform installation. + +Only one |rc_xxx| shall be connected to a power supply at any time, and the total +length of cables must be less than 30 m. + + + +Spare parts +----------- + +.. index:: + single: spare parts + +No user-serviceable spare parts are currently available for |rc_xxx| +devices. diff --git a/v24.04/de/_raw_sources/appendix.rst.txt b/v24.04/de/_raw_sources/appendix.rst.txt new file mode 100644 index 0000000..4316923 --- /dev/null +++ b/v24.04/de/_raw_sources/appendix.rst.txt @@ -0,0 +1,103 @@ +.. include:: global_rst.glb + +.. _sect-appendix: + +Appendix +======== + +.. _sect-pose-formats: + +Pose formats +------------ + +A pose consists of a translation and rotation. The translation defines the +shift along the :math:`x`, :math:`y` and :math:`z` axes. +The rotation can be defined in many different ways. The +|rc_xxx| uses quaternions to define rotations and translations are given in meters. +This is called the +XYZ+quaternion format. This chapter explains the conversion between different +common conventions and the XYZ+quaternion format. + +It is quite common to define rotations in 3D by three angles that define +rotations around the three coordinate axes. Unfortunately, there are many +different ways to do that. The most common conventions are Euler and Cardan +angles (also called Tait-Bryan angles). In both conventions, the rotations can +be applied to the previously rotated axis (intrinsic rotation) or to the axis +of a fixed coordinate system (extrinsic rotation). + +We use :math:`x`, :math:`y` and :math:`z` to denote the three coordinate axes. +:math:`x'`, :math:`y'` and :math:`z'` refer to the axes that have been rotated +one time. Similarly, :math:`x''`, :math:`y''` and :math:`z''` are the axes +after two rotations. + +In the (original) Euler angle convention, the first and the third axis are +always the same. The rotation order :math:`z`-:math:`x'`-:math:`z''` means +rotating around the :math:`z`-axis, then around the already rotated +:math:`x`-axis and finally around the (two times) rotated :math:`z`-axis. In +the Cardan angle convention, three different rotation axes are used, e.g. +:math:`z`-:math:`y'`-:math:`x''`. Cardan angles are often also just called +Euler angles. + +For each intrinsic rotation order, there is an equivalent extrinsic rotation +order, which is inverted, e.g. the intrinsic rotation order +:math:`z`-:math:`y'`-:math:`x''` is equivalent to the extrinsic rotation order +:math:`x`-:math:`y`-:math:`z`. + +Rotations around the :math:`x`, :math:`y` and :math:`z` axes can be defined +by quaternions as + +.. math:: + \begin{align*} + r_x(\alpha) &= \left(\begin{array}{c}\sin\frac{\alpha}{2} \\ 0 \\ 0 \\ \cos\frac{\alpha}{2}\end{array}\right)\text{,} & + r_y(\beta) &= \left(\begin{array}{c}0 \\ \sin\frac{\beta}{2} \\ 0 \\ \cos\frac{\beta}{2}\end{array}\right)\text{,} & + r_z(\gamma) &= \left(\begin{array}{c}0 \\ 0 \\ \sin\frac{\gamma}{2} \\ \cos\frac{\gamma}{2}\end{array}\right)\text{,} + \end{align*} + +or by rotation matrices as + +.. math:: + r_x(\alpha) &= + \left(\begin{array}{ccc} + 1 & 0 & 0 \\ + 0 & \cos\alpha & -\sin\alpha \\ + 0 & \sin\alpha & \cos\alpha + \end{array}\right)\text{,} \\ + r_y(\beta) &= + \left(\begin{array}{ccc} + \cos\beta & 0 & \sin\beta \\ + 0 & 1 & 0 \\ + -\sin\beta & 0 & \cos\beta + \end{array}\right)\text{,} \\ + r_z(\gamma) &= + \left(\begin{array}{ccc} + \cos\gamma & -\sin\gamma & 0 \\ + \sin\gamma & \cos\gamma & 0 \\ + 0 & 0 & 1 + \end{array}\right)\text{.} + +The extrinsic rotation order :math:`x`-:math:`y`-:math:`z` can be computed by +multiplying the individual rotations in inverse order, i.e. :math:`r_z(\gamma) +r_y(\beta) r_x(\alpha)`. + +Based on these definitions, the following sections explain the conversion +between common conventions and the XYZ+quaternion format. + +.. Note:: Please be aware of units for positions and orientations. |rc_xxx| + devices always specify positions in meters, while most robot manufacturers use + millimeters or inches. Angles are typically specified in degrees, but may + sometimes also be given in radians. + +.. toctree:: + :maxdepth: 1 + + pose_format_rt + pose_format_abb + pose_format_fanuc + pose_format_franka_emika + pose_format_fruitcore_horst + pose_format_kawasaki + pose_format_kuka + pose_format_mitsubishi + pose_format_ur + pose_format_yaskawa + diff --git a/v24.04/de/_raw_sources/blaze.rst.txt b/v24.04/de/_raw_sources/blaze.rst.txt new file mode 100644 index 0000000..296b5f9 --- /dev/null +++ b/v24.04/de/_raw_sources/blaze.rst.txt @@ -0,0 +1,631 @@ + +.. include:: global_rst.glb + +.. _sect-blaze: + +Blaze +===== + +.. index:: + single: blaze + single: depth image + +The blaze module is a base module which is available on every |rc_xxx| +and provides disparity, confidence and error images of a connected Basler |blaze| camera +in an RGB-D setup, i.e. the blaze +Time-of-Flight (ToF) camera in combination with the Basler aceA1300 color camera. + +After connecting the Basler blaze sensor to the |rc_cube|, it can take up to about one minute until it is found. Upon first +connection of the sensor to the |rc_cube|, the sensor must be calibrated before it can be used. +Calibration can be done through the |webgui| on the page :ref:`sect-camera-calibration`:latex:`\:(Section +\ref{camera_calibration:sect-camera-calibration})` under *Configuration* in the respective pipeline. +After storing the calibration, it will persistently reside on the |rc_cube| and automatically be +used whenever the sensor is connected to the |rc_cube| again, regardless of the port or pipeline. + +The blaze module only runs in camera pipelines of type ``blaze``. + +.. _sect-disp-accessing-images: + +Viewing and downloading images and point clouds +----------------------------------------------- + +.. index:: + pair: timestamp; image + pair: point cloud; download + +The |rc_xxx| provides time-stamped disparity, error, and confidence images over the +GenICam interface (see :ref:`sect-provided-image-streams`:latex:`, \:Section \ref{gigevision:sect-provided-image-streams}`). +Live streams of the images are provided with reduced quality on the *Depth Image* page in the desired pipeline of the +:ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})`. + +The |webgui| also provides the possibility to download a snapshot of the current scene containing the depth, error and confidence +images, as well as a point cloud in ply format as described in +:ref:`sect-webgui-depth-snapshot`:latex:`\:(Section \ref{webgui:sect-webgui-depth-snapshot})`. + +.. _sect-disp-image-parameters: + +Parameters +---------- + +.. index:: + pair: parameters; disparity image + pair: disparity image; Web GUI + pair: depth image; Web GUI + +The blaze module is called ``rc_blaze`` in the |rest-api| and it is represented by the +*Depth Image* page in the desired pipeline in the :ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})`, +when a Basler |blaze| camera is connected and running in the corresponding pipeline. +The user can change the |blaze| parameters there, or use the |rest-api| +(:ref:`sect-rest-api`:latex:`, Section \ref{rest_api:sect-rest-api}`). + +Parameter overview +^^^^^^^^^^^^^^^^^^ + +.. include:: _gen/nodes/params/rc_blaze.txt + +Description of run-time parameters +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Each run-time parameter is represented by a row on the |webgui|'s *Depth Image* page. The name in the +|webgui| is given in brackets behind the parameter name and the parameters are listed in the order +they appear in the |webgui|: + +.. .. figure:: images/webgui_depth_image_blaze.png +.. :width: 100 % +.. :align: center +.. +.. The |webgui|'s *Depth Image* page for the |blaze| camera pipeline + +.. _expl-depth-exp-value: + +.. index:: + pair: blaze; exposure time + +``exp_value`` (*Exposure Time*) +''''''''''''''''''''''''''''''' + This parameter is the exposure time of the |blaze| camera in seconds. It controls for how long the + photosensitive cells are exposed to light. If the operating mode is changed, the exposure + time is set to the recommended default value. Reducing the exposure time may reduce measurement + accuracy and is only recommended when the image is overexposed. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?exp_value= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?exp_value= + +.. _expl-depth-acquisition-mode: + +.. index:: + pair: blaze; acquisition mode + +``acquisition_mode`` (*Acquisition Mode*) +''''''''''''''''''''''''''''''''''''''''' + The acquisition mode can be set to ``Continuous`` (*Continuous*) or ``SingleFrame`` (*Single*). + The first one is the default and continuously provides depth images. + In single frame mode, images are only captured when the :guilabel:`Acquire` button is clicked. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?acquisition_mode= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?acquisition_mode= + +.. _expl-depth-min-depth: + +.. index:: + pair: blaze; minimum distance + +``mindepth`` (*Minimum Distance*) +''''''''''''''''''''''''''''''''' + The minimum distance is the smallest distance from the camera + at which measurements should be possible. The minimum distance + is given in meters. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?mindepth= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?mindepth= + +.. _expl-depth-max-depth: + +.. index:: + pair: blaze; maximum distance + +``maxdepth`` (*Maximum Distance*) +''''''''''''''''''''''''''''''''' + The maximum distance is the largest distance from the camera + at which measurements should be possible. Pixels with larger distance values are + set to invalid in the disparity image. The maximum distance is given in meters. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?maxdepth= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?maxdepth= + +.. _expl-depth-fill: + +.. index:: + pair: blaze; fill-in + +``fill`` (*Fill-in*) +'''''''''''''''''''' + This option is used to fill holes in the disparity image by interpolation. + The fill-in value is the maximum allowed disparity step on the border of the + hole. Larger fill-in values can decrease the number of holes, but the interpolated + values can have larger errors. At most 5% of pixels are interpolated. Interpolation + of small holes is preferred over interpolation of larger holes. The confidence for + the interpolated pixels is set to a low value of 0.5. A fill-in value of 0 + switches hole filling off. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?fill= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?fill= + +.. _expl-depth-seg: + +.. index:: + pair: blaze; segmentation + +``seg`` (*Segmentation*) +'''''''''''''''''''''''' + The segmentation parameter is used to set the minimum number of + pixels that a connected disparity region in the disparity image must fill. + Isolated regions that are smaller are set to invalid in the disparity image. + Segmentation is useful for removing erroneous disparities. However, + larger values may also remove real objects. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?seg= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?seg= + +.. _expl-depth-min-conf: + +.. index:: + pair: blaze; minimum confidence + +``minconf`` (*Minimum Confidence*) +'''''''''''''''''''''''''''''''''' + The minimum confidence can be set to filter potentially false disparity measurements. + All pixels with less confidence than the chosen value are set to invalid + in the disparity image. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?minconf= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?minconf= + +.. _expl-depth-spatial-filter: + +.. index:: + pair: blaze; spatial filter + +``spatial_filter`` (*Spatial Filter*) +''''''''''''''''''''''''''''''''''''' + This parameter enables the spatial noise filter. The spatial noise filter uses the + values of neighboring pixels to filter out noise in an image. + It is based on the raw data of the image. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?spatial_filter= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?spatial_filter= + +.. _expl-depth-temporal-filter: + +.. index:: + pair: blaze; temporal filter + +``temporal_filter`` (*Temporal Filter*) +''''''''''''''''''''''''''''''''''''''' + This parameter enables the temporal noise filter. The temporal noise filter + uses the values of the same pixel at different points in time to filter out + noise in an image. It is based on the depth data of the image. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?temporal_filter= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?temporal_filter= + + +.. _expl-depth-temporal-filter-strength: + +.. index:: + pair: blaze; temporal filter strength + +``temporal_filter_strength`` (*Strength*) +''''''''''''''''''''''''''''''''''''''''' + + This parameter represents the strength of the temporal filter. + The higher the value, the stronger the filter. High values may + cause motion artifacts, while low values reduce the efficacy of the filter. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?temporal_filter_strength= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?temporal_filter_strength= + +.. _expl-depth-outlier-removal: + +.. index:: + pair: blaze; outlier removal + +``outlier_removal`` (*Outlier Removal*) +''''''''''''''''''''''''''''''''''''''' + + This parameter enables the outlier removal filter. + It removes pixels that differ significantly from their local environment. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?outlier_removal= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?outlier_removal= + +.. _expl-depth-outlier-removal-threshold: + +.. index:: + pair: blaze; outlier removal threshold + +``outlier_removal_threshold`` (*Threshold*) +''''''''''''''''''''''''''''''''''''''''''' + + This parameter determines the strength of the outlier removal filter. + The higher the value, the more outliers will be removed. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?outlier_removal_threshold= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?outlier_removal_threshold= + +.. _expl-depth-ambiguity-filter: + +.. index:: + pair: blaze; ambiguity filter + +``ambiguity_filter`` (*Ambiguity Filter*) +''''''''''''''''''''''''''''''''''''''''' + + This parameter enables the ambiguity filter. The ambiguity filter removes + pixels whose depth data is ambiguous. In certain demanding scenes, e.g., + because of stray light or multi-path effects, detection may fail. In this case, + the filter should be disabled. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?ambiguity_filter= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?ambiguity_filter= + + +.. _expl-depth-ambiguity-filter-threshold: + +.. index:: + pair: blaze; ambiguity filter threshold + +``ambiguity_filter_threshold`` (*Threshold*) +'''''''''''''''''''''''''''''''''''''''''''' + + This parameter determines the strength of the ambiguity filter. + The higher the value, the stronger the filter. + Higher values increase the reliability of the filter. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?ambiguity_filter_threshold= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?ambiguity_filter_threshold= + + +.. _expl-depth-gamma-correction: + +.. index:: + pair: blaze; gamma correction + +``gamma_correction`` (*Gamma Correction*) +''''''''''''''''''''''''''''''''''''''''' + + This parameter enables gamma correction on the intensity image, which is + a nonlinear operation to lighten the dark regions of the image. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?gamma_correction= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?gamma_correction= + + +.. _expl-depth-thermal-drift-correction: + +.. index:: + pair: blaze; thermal drift correction + +``thermal_drift_correction`` (*Thermal Drift Correction*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + + This parameter activates the correction of the thermal drift. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?thermal_drift_correction= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?thermal_drift_correction= + + +Status values +------------- + +This module reports the following status values: + +.. tabularcolumns:: |l|L| +.. csv-table:: The ``rc_blaze`` module's status values + :header: Name, Description + + "``fps``","Actual frame rate of the disparity, error, and confidence images. This value is shown in the |webgui| below the image preview as *FPS (Hz)*." + "``latency``","Time in seconds between image acquisition and publishing of disparity image" + "``width``","Current width of the disparity, error, and confidence images in pixels" + "``height``","Current height of the disparity, error, and confidence images in pixels" + "``mindepth``","Actual minimum working distance in meters" + "``maxdepth``","Actual maximum working distance in meters" + +.. _sect-stereo-matching-services: + +Services +-------- + +The Blaze module offers the following services. + +``acquisition_trigger`` +^^^^^^^^^^^^^^^^^^^^^^^ + + Signals the module to acquire a depth image, if the parameter ``acquisition_mode`` is set to ``SingleFrame``. + + .. toggle-header:: + :header: **Details** + + An error is returned if the ``acquisition_mode`` is set to ``Continuous``. + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/services/acquisition_trigger + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/services/acquisition_trigger + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_blaze_acquisition_trigger_request.txt + + .. tab:: **Response** + + Possible return codes are shown below. + + .. tabularcolumns:: |c|L| + .. _tab-stereo-acquisition-trigger-return-codes: + .. csv-table:: Possible return codes of the ``acquisition_trigger`` service call. + :header: Code, Description + + "0", "Success" + "-8", "Triggering is only possible in SingleFrame acquisition mode" + "101", "Trigger is ignored, because there is a trigger call pending" + "102", "Trigger is ignored, because there are no subscribers" + + .. include:: _gen/nodes/services/rc_blaze_acquisition_trigger_response.txt + +``reset_defaults`` +^^^^^^^^^^^^^^^^^^ + + Restores and applies the default values for this module's parameters + ("factory reset"). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/services/reset_defaults + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/services/reset_defaults + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_blaze_reset_defaults_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_blaze_reset_defaults_response.txt + diff --git a/v24.04/de/_raw_sources/cadmatch.rst.txt b/v24.04/de/_raw_sources/cadmatch.rst.txt new file mode 100644 index 0000000..982d286 --- /dev/null +++ b/v24.04/de/_raw_sources/cadmatch.rst.txt @@ -0,0 +1,1837 @@ +.. include:: global_rst.glb + +.. _sect-cadmatch: + +CADMatch +======== + +.. index:: ! CADMatch + single: bin picking + single: grasp computation + single: 3D object detection + single: object detection + +.. |cadm| replace:: CADMatch + +Introduction +------------ + +.. Short description and functionalities + +The |cadm| module is an optional module of the |rc_xxx| and requires a separate |cadm| :ref:`license` +:latex:`(Section \ref{maintenance:sect-updating-license})` to be purchased. + +.. only:: rc_cube and (roboception or schunk or basler) + + .. note:: This module is not available in camera pipelines of type ``blaze``. + +This module provides an out-of-the-box perception solution for 3D object detection and grasping. +|cadm| targets the detection of 3D objects based on a CAD template for picking +with a general gripper. The objects can be located in a bin or placed arbitrarily in the +field of view of the camera. + +For the |cadm| module to work, special object templates are required for each type of object to +be detected. Please get in touch with the |manufacturer| support (:ref:`sect-contact`:latex:`, +Section \ref{contact:sect-contact}`) to order a template for your CAD file. + +.. only:: rc_cube + + .. note:: + + This module is pipeline specific. Changes to its settings or parameters only affect + the respective camera pipeline and have no influence on other pipelines running on the |rc_cube|. + + However, the object templates, grasp points and pose priors are stored globally. Setting, changing + or deleting an object template, its grasps or pose priors affects all camera pipelines. + + +The |cadm| module offers: + +- A dedicated page on the |rc_xxx| :ref:`sect-web-gui`:latex:`\:(Section \ref{webgui:sect-web-gui})` + for easy setup, configuration, testing, and application tuning. +- A :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` and a + :doc:`eki`:latex:`\:(Section \ref{eki:sect-eki})`. +- The definition of regions of interest to select relevant volumes in the scene + (see :ref:`sect-roi`:latex:`, Section \ref{roi:sect-roi}`). +- A load carrier detection functionality for bin-picking applications + (see :ref:`sect-loadcarrier`:latex:`, Section \ref{loadcarrier:sect-loadcarrier}`), + to provide grasps for objects inside a bin only. +- The definition of compartments inside a load carrier to provide grasps + for specific volumes of the bin only. +- The option to use user-defined object pose priors. +- Storing of up to 50 templates. +- The definition of up to 100 grasp points for each template via an interactive visualization in the |webgui|. +- Collision checking between the gripper and the load carrier, other detected objects and/or the point cloud. +- Collision checking between the object in the gripper and the load carrier walls during retraction. +- Support for static and robot-mounted cameras and + optional integration with the :doc:`handeye_calibration` + :latex:`(Section \ref{handeye_calibration:sect-handeye-calibration})` module, + to provide grasps in the user-configured external reference frame. +- Selection of a sorting strategy to sort the detected objects and returned grasps. +- 3D visualization of the detection results with grasp points and gripper animations in the |webgui|. + +.. _sect-cadmatch-grasps: + +Setting of grasp points +----------------------- + +.. index:: + single: CADMatch; grasp points + single: CADMatch; object template + +The |cadm| module detects 3D objects in a scene based on a CAD template and returns the +poses of the object origins. To use |cadm| directly in a robot application, up to 100 grasp points +can be defined for each template. A grasp point represents the desired position and orientation +of the robot's TCP (Tool Center Point) to grasp an object. + +Please consult :ref:`sect-silhouettematch-grasps`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-grasps})` for further details. + +Setting grasp points in the |webgui| +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The |rc_xxx| |webgui| provides an intuitive and interactive way of defining grasp points for object templates. +In a first step, the object template has to be uploaded to the |rc_xxx|. This can be done +in the |webgui| in any pipeline under :menuselection:`Modules --> CADMatch` +by clicking on :guilabel:`+ Add a new Template` in the +*Templates, Grasps and Pose Priors* section, or in :menuselection:`Database --> Templates` in the +*CADMatch Templates, Grasps and Pose Priors* section. Once the +template upload is complete, a dialog with a 3D visualization of the object template is shown +for adding or editing grasp +points. The same dialog appears when editing an existing template. + +More details are given in +:ref:`sect-silhouettematch-grasps-webgui`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-grasps-webgui})`. + +Setting grasp points via the |rest-api| +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grasp points can be set via the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` +using the ``set_grasp`` or ``set_all_grasps`` services +(see :ref:`sect-cadmatch-internal-services`:latex:`, Section \ref{cadmatch:sect-cadmatch-internal-services}`). + +More details are given in :ref:`sect-silhouettematch-grasps-rest-api`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-grasps-rest-api})`. + +.. _sect-cadmatch-pose-priors: + +Setting of pose priors +---------------------- + +.. index:: + single: CADMatch; pose priors + single: CADMatch; object template + +The |cadm| module offers the possibility to define prior poses of the objects to be detected. +If a pose prior is given, the object detection will use this pose prior and only refine the +given pose. This speeds up the detection significantly. A pose prior represents the approximate +position and orientation of the object to be detected. The pose can be defined in the camera or +the external coordinate frame, if a hand-eye calibration is available. + +Each pose prior consists of an ``id`` which must be +unique within all pose priors for an object template, the ``template_id`` representing the template the pose +prior applies to, the ``pose`` and the ``pose_frame`` of the prior. +Pose priors can be set via the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`, +or by using the interactive visualization in the |webgui|. The |webgui| allows to interactively position the object +in the current point cloud. This can be done in the "Pose Priors" tab during editing a template. + +Pose priors should be used in applications where the approximate object poses are known beforehand. +The |rcxxx| can store up to 50 pose priors per template. + +.. _sect-cadmatch-set-preferred-orientation: + +Setting the preferred orientation of the TCP +-------------------------------------------- + +.. index:: + single: CADMatch; preferred orientation + +The |cadm| module determines the reachability of grasp points based on the *preferred orientation* of the +gripper or TCP. The preferred orientation can be set via the ``set_preferred_orientation`` service call or on +the *CADMatch* page in the |webgui|. +The resulting direction of the TCP's z axis is used to reject grasps which cannot be reached by the gripper. +Furthermore, the preferred orientation can be used to sort the reachable grasps by setting the corresponding +sorting strategy. + +The preferred orientation can be set in the camera coordinate frame or in the external coordinate frame, in case +a hand-eye calibration is available. If the preferred orientation is specified in the external coordinate frame +and the sensor is robot mounted, the current robot pose has to be given to each object detection call, so that the +preferred orientation can be used for filtering and, optionally, sorting the grasps on the detected objects. +If no preferred orientation is set, the orientation of the left camera is used as the preferred orientation of the TCP. + +.. _sect-cadmatch-set-sorting-strategies: + +Setting the sorting strategies +------------------------------ + +The objects and grasps returned by the ``detect_object`` service call are sorted according to a sorting strategy which can be +chosen by the user. The following sorting strategies are available and +can be set in the :ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})` +or using the ``set_sorting_strategies`` service call: + +- ``gravity``: highest matches and grasp points along the gravity direction are returned first, +- ``match_score``: matches with the highest match score and grasp points on objects with the highest match score are returned first, +- ``preferred_orientation``: matches and grasp points with minimal rotation difference between their orientation and the preferred orientation of the TCP are returned first, +- ``direction``: matches and grasp points with the shortest distance along a defined direction ``vector`` in a given ``pose_frame`` are returned first. + +If no sorting strategy is set or default sorting is chosen in the Web GUI, sorting is done based on a combination of +``match_score`` and the minimal distance from the camera along the z axis of the preferred orientation of the TCP. + + +.. _sect-cadmatch-detect-objects: + +Detection of objects +-------------------- + +.. index:: + single: CADMatch; object detection + single: CADMatch; object template + single: CADMatch; sorting + +The |cadm| module requires an object template for object detection. This template contains +information about the 3D shape of the object and prominent edges that can be visible in the +camera images. |cadm| also supports partial object templates, which contain only a specific +part of the object that can be detected well, e.g., in case of occlusions. Furthermore, templates +can require a pose prior for the detection which is then only refined using the image data. + +The object detection is a two-stage process consisting of a prior estimation step and a pose refinement step. +First, a pose prior is computed based on the appearance +of the object in the camera images. Second, the pose is refined by using the 3D point cloud and +edges in the camera image. For this to work, the objects to detect must be visible in both left and right camera images. +If pose priors are given, only the pose refinement step is performed based, which decreases runtime significantly. + +For triggering the object detection, in general, the following information +must be provided to the |cadm| module: + +- The template ID of the object to be detected in the scene. +- The coordinate frame in which the poses of the detected objects and the grasp points shall be returned + (ref. :ref:`sect-cadmatch-hand-eye-dep`:latex:`, Section \ref{cadmatch:sect-cadmatch-hand-eye-dep}`). + +Optionally, further information can be given to the |cadm| module: + +- The IDs of the pose priors which approximately match the poses of the objects to be detected. + In case a template is used that requires a pose prior, one or more pose prior IDs have to be provided. +- The ID of the load carrier which contains the items to be detected. +- A compartment inside the load carrier where to detect objects (see :ref:`sect-loadcarrier-compartment`:latex:`, Section \ref{loadcarrier_db:sect-loadcarrier-compartment}`). +- The ID of the 3D region of interest where to search for the load carriers if a + load carrier is set. + Otherwise, the ID of the 3D region of interest where to search for the objects. +- The current robot pose in case the camera is mounted on the robot and + the chosen coordinate frame for the poses is ``external``, or the preferred orientation + is given in the external frame, or the chosen region of interest is defined in the external frame. +- Collision detection information: The ID of the gripper to enable collision checking and optionally + a pre-grasp offset to define a pre-grasp position. + Details on collision + checking are given below in :ref:`sect-cadmatch-collision-check-dep`:latex:`\:(Section \ref{cadmatch:sect-cadmatch-collision-check-dep})`. +- Data acquisition mode: The user can choose if a new image dataset is acquired for the detection (default), or if the detection should be + performed on the previously used image dataset. This saves data acquisition time, e.g. in case several detections with different + templates have to be run on the same image. + +On the |webgui| the detection can be tested in the *Try Out* section of the |cadm| module's page. + +The detected objects are returned in a list of ``matches``, sorted according to the selected sorting strategy +(see :ref:`sect-cadmatch-set-sorting-strategies`:latex:`, Section \ref{cadmatch:sect-cadmatch-set-sorting-strategies}`). +Each detected object +includes a ``uuid`` (Universally Unique Identifier) and the +``timestamp`` of the oldest image that was used to detect it. +The ``pose`` of a detected object corresponds to the pose of the origin of the object template used for detection. +Furthermore, the matching ``score`` is given to indicate the quality of the detection. + +If the chosen template also has grasp points attached +(see :ref:`sect-cadmatch-grasps`:latex:`, Section \ref{cadmatch:sect-cadmatch-grasps}`), +a list of ``grasps`` for all objects is returned in addition to the list of detected objects. +The grasps are sorted according to the selected sorting strategy +(see :ref:`sect-cadmatch-set-sorting-strategies`:latex:`, Section \ref{cadmatch:sect-cadmatch-set-sorting-strategies}`). +The grasp poses are given in the desired coordinate frame. There are references between the detected objects +and the grasps via their ``uuids``. + +For objects with a discrete symmetry (e.g. prismatic objects), all collision-free symmetries of +each grasp point which are reachable according to the given preferred +TCP orientation are returned, ordered by the given sorting strategy. + +For objects with a continuous symmetry (e.g. cylindrical objects), all grasps symmetric +to each grasp point on an object are checked for reachability and collisions, and only the +best one according to the given sorting strategy is returned. + +.. Note:: + The first detection call with a new object template takes longer than the following detection calls, + because the object template has to be loaded into the |cadm| module first. To avoid this, the + ``warmup_template`` service can be used to load a template so that it is ready when the first detection + is triggered. + +.. _sect-cadmatch-dependencies: + +Interaction with other modules +------------------------------ + +Internally, the |cadm| module depends on, and interacts with other on-board +modules as listed below. + +.. Note:: + All changes and configuration updates to these modules will affect + the performance of the |cadm| modules. + + +.. _sect-cadmatch-stereo-camera-matching: + +Stereo camera and Stereo matching +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The |cadm| module makes internally use of the following data: + +- Rectified images from the :doc:`stereo_camera` module + (``rc_camera``:latex:`, Section \ref{stereo_camera:sect-stereo-camera}`); + +- Disparity, error, and confidence images from the :doc:`stereo_matching` module + (``rc_stereomatching``:latex:`, Section \ref{stereo_matching:sect-stereo-matching}`). + +The ``quality`` parameter of the stereo matching module must be set to ``Medium`` +or higher (see :ref:`sect-disp-image-parameters`:latex:`, Section \ref{stereo_matching:sect-disp-image-parameters}`). We recommend ``Full`` or ``High`` quality for using |cadm|. + +All processed images are guaranteed to be captured after the module trigger time. + +.. _sect-cadmatch-iocontrol-dep: + +IO and Projector Control +^^^^^^^^^^^^^^^^^^^^^^^^ + +In case the |rc_xxx| is used in conjunction with an external random dot projector and +the :doc:`iocontrol` module (``rc_iocontrol``:latex:`, Section \ref{iocontrol:sect-iocontrol}`), +it is recommended to connect the projector to GPIO Out 1 and set +the stereo-camera module's acquisition mode to ``SingleFrameOut1`` +(see :ref:`Stereo matching parameters`:latex:`, Section \ref{stereo_matching:sect-disp-image-parameters}`), so that +on each image acquisition trigger an image with and without projector pattern is acquired. + +Alternatively, the output mode for the GPIO output in use should be set to ``ExposureAlternateActive`` +(see :ref:`sect-iocontrol-params`:latex:`, Section \ref{iocontrol:sect-iocontrol-params}`). + +In either case, +the *Auto Exposure Mode* ``exp_auto_mode`` should be set to ``AdaptiveOut1`` to optimize the exposure +of both images (see :ref:`Stereo camera parameters`:latex:`, Section \ref{stereo_camera:sect-cam-params}`). + +.. _sect-cadmatch-hand-eye-dep: + +Hand-eye calibration +^^^^^^^^^^^^^^^^^^^^ + +In case the camera has been calibrated to a robot, the |cadm| module +can automatically provide poses in the robot coordinate frame. +For the |cadm| node's :ref:`sect-cadmatch-services`:latex:`\:(Section \ref{cadmatch:sect-cadmatch-services})`, the frame of the +output poses can be controlled with the ``pose_frame`` argument. + +Two different ``pose_frame`` values can be chosen: + +1. **Camera frame** (``camera``). + All poses provided by the modules are in the camera frame, + and no prior knowledge about the pose of the camera in the environment is required. + This means that the configured regions of interest and load carriers move with the camera. + It is the user's responsibility to update the configured poses + if the camera frame moves (e.g. with a robot-mounted camera). + +2. **External frame** (``external``). + All poses provided by the modules are in the external frame, + configured by the user during the hand-eye calibration process. + The module relies on the on-board + :doc:`Hand-eye calibration module`:latex:`\:(Section \ref{handeye_calibration:sect-handeye-calibration})` + to retrieve the sensor mounting (static or robot mounted) and + the hand-eye transformation. + If the mounting is static, no further information is needed. + If the sensor is robot-mounted, the ``robot_pose`` is required + to transform poses to and from the ``external`` frame. + +.. Note:: + If no hand-eye calibration is available, all ``pose_frame`` values should be set to ``camera``. + +All ``pose_frame`` values that are not ``camera`` or ``external`` are rejected. + +If the sensor is robot-mounted, the current ``robot_pose`` has to be provided depending on the value of ``pose_frame``, +the definition of the preferred TCP orientation and the sorting direction: + +- If ``pose_frame`` is set to ``external``, providing the robot pose is obligatory. +- If the preferred TCP orientation is defined in ``external``, providing the robot pose is obligatory. +- If the sorting direction is defined in ``external``, providing the robot pose is obligatory. +- In all other cases, providing the robot pose is optional. + +.. _sect-cadmatch-load-carrier-dep: + +LoadCarrier +^^^^^^^^^^^ + +The |cadm| module uses the load carrier detection functionality provided by the +:doc:`loadcarrier` module (``rc_load_carrier``:latex:`, Section \ref{loadcarrier:sect-loadcarrier}`), +with the run-time parameters specified for this module. However, only one load carrier will be +returned and used in case multiple matching load carriers could be found in the scene. In case multiple +load carriers of the same type are visible, a region of interest should be set to ensure that always the +same load carrier is used for the |cadm| module. + +.. _sect-cadmatch-collision-check-dep: + +CollisionCheck +^^^^^^^^^^^^^^ + +.. index:: + single: CADMatch; collision check + +Collision checking can be easily enabled for +grasp computation of the |cadm| module by passing a ``collision_detection`` argument to the +``detect_object`` service call. It contains the ID of the used gripper and +optionally a pre-grasp offset. The gripper has to be +defined in the GripperDB module +(see :ref:`sect-gripper-db-gripper`:latex:`, Section \ref{gripper_db:sect-gripper-db-gripper}`) +and details about collision checking are given in +:ref:`sect-collision-check-other-modules`:latex:`\:(Section \ref{collisioncheck:sect-collision-check-other-modules})`. + +Alternatively, grasp points can be assigned individual gripper IDs, and collision checking can be enabled for all +grasp points with gripper IDs by enabling the run-time parameter ``check_collisions``. + +If the selected |cadm| template contains a collision geometry and the run-time parameter ``check_collisions_with_matches`` is true, +also collisions between the gripper and all other detected objects (not limited to ``max_matches``) will be checked. The object +on which the grasp point to be checked is located, is excluded from the collision check. + +If the run-time parameter ``check_collisions_with_point_cloud`` is true, +also collisions between the gripper and a watertight version of the point cloud are checked. +If this feature is used with suctions grippers, it should be ensured that the TCP is defined +to be outside the gripper geometry, or that the grasp points are defined above the object surface. +Otherwise every grasp will result in a collision between the gripper and the point cloud. + +If the run-time parameter ``check_collisions_during_retraction`` is true and a load carrier and a pre-grasp offset are given, +each grasp point will be checked for collisions between the object in the gripper and the load carrier walls during retraction. +This collision check is performed along the full linear trajectory from the grasp point back to the pre-grasp position. + +If collision checking is enabled, only grasps which are collision free or could not be checked for collisions +(e.g. because no gripper was given) will be returned. +The result image on top of the *CADMatch* +page of the |webgui| also shows collision-free grasps in green, unchecked grasps in yellow and colliding grasp points in red. +The detected objects which are considered in the collision check are also visualized with their edges in red. + +The CollisionCheck module's run-time parameters affect the collision detection as described in +:ref:`CollisionCheck Parameters`:latex:`\:(Section \ref{collisioncheck:sect-collisioncheck-parameters})`. + +.. _sect-cadmatch-parameters: + +Parameters +---------- + +.. index:: + single: CADMatch; parameters + +The |cadm| module is called ``rc_cadmatch`` +in the |rest-api| and is represented in the +:ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})` +:cubeonly:`in the desired pipeline` under +:menuselection:`Modules --> CADMatch`. +The user can explore and configure the ``rc_cadmatch`` +module's run-time parameters, e.g. for development and testing, using the |webgui| or the +:doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`. + +Parameter overview +^^^^^^^^^^^^^^^^^^ + +.. include:: _gen/nodes/params/rc_cadmatch.txt + +Description of run-time parameters +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Each run-time parameter is represented by a row on the |webgui|'s *CADMatch* page. +The name in the |webgui| is given in brackets behind the parameter name and the parameters are +listed in the order they appear in the |webgui|: + +.. _expl-cadmatch-max-matches: + +``max_matches`` (*Maximum Matches*) +''''''''''''''''''''''''''''''''''' + is the maximum number of objects to detect. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?max_matches= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?max_matches= + +.. _expl-cadmatch-min-score: + +``min_score`` (*Minimum Score*) +''''''''''''''''''''''''''''''' + is the minimum detection score after refinement. The higher this value, the better 2D edges and 3D point cloud must match the given template. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?min_score= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?min_score= + +.. _expl-cadmatch-edge-sensitivity: + +``edge_sensitivity`` (*Edge Sensitivity*) +''''''''''''''''''''''''''''''''''''''''' + is the sensitivity of the edge detector. The higher the value of this parameter, the more edges will be used for pose refinement. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?edge_sensitivity= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?edge_sensitivity= + +.. _expl-cadmatch-edge-max-distance: + +``edge_max_distance`` (*Maximum Edge Distance*) +''''''''''''''''''''''''''''''''''''''''''''''' + is the maximum allowed distance in pixels between the template edges and the detected edges in the image during the refinement step. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?edge_max_distance= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?edge_max_distance= + + +.. _expl-cadmatch-grasp-filter-orientation-threshold: + +``grasp_filter_orientation_threshold`` (*Grasp Orientation Threshold*) +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + is the maximum deviation of the TCP's z axis at the grasp point from the z axis of the TCP's preferred orientation in degrees. + Only grasp points which are within this threshold are returned. When set + to zero, any deviations are valid. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?grasp_filter_orientation_threshold= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?grasp_filter_orientation_threshold= + +.. _expl-cadmatch-only-highest-priority-grasps: + +``only_highest_priority_grasps`` (*Only Highest Priority Grasps*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + If set to true, only grasps with the highest priority will be returned. If collision checking is enabled, only the collision-free + grasps among the group of grasps with the highest priority are returned. + This can save computation time and reduce the number of grasps to be parsed on the application side. + + Without collision checking, only grasps of highest priority are returned. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?only_highest_priority_grasps= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?only_highest_priority_grasps= + +.. _expl-cadmatch-check-collisions: + +``check_collisions`` (*Check Collisions*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + If this parameter is enabled, collision checking will be performed for all grasps which have a gripper ID assigned, + even when no default gripper is given in the ``detect_object`` service call. If a load carrier is used, the collision + check will always be performed between the gripper and the load carrier. + Collision checking with the point cloud and other matches is only performed when the corresponding runtime parameters are enabled. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?check_collisions= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?check_collisions= + +.. _expl-cadmatch-check-collisions-with-matches: + +``check_collisions_with_matches`` (*Check Collisions with Matches*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + This parameter is only used when collision checking is enabled by passing a gripper to the ``detect_object`` service call + or by enabling the ``check_collisions`` runtime parameter. + If ``check_collisions_with_matches`` is set to true, + all grasp points will be checked for collisions between the gripper and all other detected objects (not limited to + ``max_matches``), and only grasp points at which the gripper would not collide with any other detected object + will be returned. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?check_collisions_with_matches= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?check_collisions_with_matches= + +.. _expl-cadmatch-check-collisions-with-point-cloud: + +``check_collisions_with_point_cloud`` (*Check Collisions with Point Cloud*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + This parameter is only used when collision checking is enabled by passing a gripper to the ``detect_object`` service call + or by enabling the ``check_collisions`` runtime parameter. + If ``check_collisions_with_point_cloud`` is set to true, + all grasp points will be checked for collisions between the gripper a watertight version of the point cloud, and only grasp points + at which the gripper would not collide with this point cloud will be returned. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?check_collisions_with_point_cloud= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?check_collisions_with_point_cloud= + + +.. _expl-cadmatch-check-collisions-during-retraction: + +``check_collisions_during_retraction`` (*Check Collisions during Retraction*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + This parameter is only used when collision checking is enabled by passing a gripper to the ``detect_object`` service call + or by enabling the ``check_collisions`` runtime parameter. + When ``check_collisions_during_retraction`` is enabled and a load carrier and a pre-grasp offset are given, + each grasp point will be checked for collisions + between the object in the gripper and the load carrier walls during retraction. + This collision checking is performed along the full linear trajectory from the grasp point back to the pre-grasp position. + Only collision-free grasp points will be returned. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?check_collisions_during_retraction= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?check_collisions_during_retraction= + + +.. _sect-cadmatch-status-values: + +Status values +------------- + +.. index:: + single: CADMatch; status + +The ``rc_cadmatch`` module reports the following status values: + +.. tabularcolumns:: |l|L| +.. csv-table:: The ``rc_cadmatch`` module's status values + :header: Name, Description + + "``data_acquisition_time``","Time in seconds required by the last active service to acquire images" + "``last_timestamp_processed``","The timestamp of the last processed dataset" + "``last_request_timestamp``","The timestamp of the last detection request" + "``load_carrier_detection_time``","Processing time of the last load carrier detection in seconds" + "``object_detection_time``","Processing time of the last last object detection in seconds" + "``processing_time``","Processing time of the last detection (including load carrier detection) in seconds" + "``state``","The current state of the rc_cadmatch node" + +The reported ``state`` can take one of the following values. + +.. tabularcolumns:: |l|l| +.. _tab-cadmatch-states: +.. csv-table:: Possible states of the CADMatch module + :header: State name, Description + + "IDLE", "The module is idle." + "RUNNING", "The module is running and ready for load carrier detection and object detection." + "FATAL", "A fatal error has occurred." + +.. _sect-cadmatch-services: + +Services +-------- + +.. index:: + single: CADMatch; services + +The user can explore and call the ``rc_cadmatch`` module's services, +e.g. for development and testing, using the +:doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` or +the |rc_xxx| +:ref:`sect-web-gui`:latex:`\:(Section \ref{webgui:sect-web-gui})`. + +The |cadm| modules offer the following services. + + +.. _expl-cadmatch-srv-detect-object: + +``detect_object`` +^^^^^^^^^^^^^^^^^ + + Triggers the detection of objects as described in + :ref:`sect-cadmatch-detect-objects`:latex:`\:(Section \ref{cadmatch:sect-cadmatch-detect-objects})` + based on an object template. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/detect_object + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/detect_object + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/detect_object + + .. tabs:: + + .. tab:: **Request** + + Required arguments: + + ``pose_frame``: see :ref:`sect-cadmatch-hand-eye-dep`:latex:`\:(Section \ref{cadmatch:sect-cadmatch-hand-eye-dep})`. + + ``template_id``: the ID of the template to be detected. + + Potentially required arguments: + + ``robot_pose``: see :ref:`sect-cadmatch-hand-eye-dep`:latex:`\:(Section \ref{cadmatch:sect-cadmatch-hand-eye-dep})`. + + ``pose_prior_ids``: IDs of the pose priors for the items to be detected. In case the chosen template requires a pose prior for the detection, + this argument must be provided. + + Optional arguments: + + ``load_carrier_id``: ID of the load carrier which contains the items to be detected. + + ``load_carrier_compartment``: compartment inside the load carrier where to detect items + (see :ref:`sect-loadcarrier-compartment`:latex:`, Section \ref{loadcarrier_db:sect-loadcarrier-compartment}`). + + ``region_of_interest_id``: if ``load_carrier_id`` is set, + ID of the 3D region of interest where to search for the load carriers. + Otherwise, ID of the 3D region of interest where to search for the objects. + + ``collision_detection``: see :ref:`sect-collision-check-other-modules`:latex:`\:(Section \ref{collisioncheck:sect-collision-check-other-modules})`. + + ``data_acquisition_mode``: if set to ``CAPTURE_NEW`` (default), a new image dataset will be used for the detection. If set to ``USE_LAST`` the previous + dataset will be used for the detection. + + + .. include:: _gen/nodes/services/rc_cadmatch_detect_object_request.txt + + .. tab:: **Response** + + ``grasps``: list of grasps on the detected objects, ordered according to the chosen sorting strategy. + The ``match_uuid`` gives the reference to the detected object in ``matches`` + this grasp belongs to. The list of returned grasps will be trimmed to the 100 best grasps if more reachable grasps are found. + Each grasp contains a flag ``collision_checked`` and a ``gripper_id`` + (see :ref:`sect-collision-check-other-modules`:latex:`, Section \ref{collisioncheck:sect-collision-check-other-modules}`). + + ``load_carriers``: list of detected load carriers. + + ``matches``: list of detected objects matching the template. The matches are ordered according to the chosen sorting strategy. The ``score`` indicates how well the object matches the template. The + ``grasp_uuids`` refer to the grasps in ``grasps`` which are reachable on this object. + + ``timestamp``: timestamp of the image set the detection ran on. + + ``return_code``: holds possible warnings or error codes and messages. + + .. include:: _gen/nodes/services/rc_cadmatch_detect_object_response.txt + +.. _expl-cadmatch-srv-set-preferred-orientation: + +``set_preferred_orientation`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Persistently stores the preferred orientation of the gripper to compute the reachability of the grasps, + which is used for filtering and, optionally, sorting the grasps returned by the ``detect_object`` service + (see :ref:`sect-cadmatch-set-preferred-orientation`:latex:`, Section \ref{cadmatch:sect-cadmatch-set-preferred-orientation}`). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/set_preferred_orientation + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/set_preferred_orientation + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/set_preferred_orientation + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_cadmatch_set_preferred_orientation_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_set_preferred_orientation_response.txt + +.. _expl-cadmatch-srv-get-preferred-orientation: + +``get_preferred_orientation`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns the preferred orientation of the gripper to compute the reachability of the grasps, + which is used for filtering and, optionally, sorting the grasps returned by the ``detect_object`` service + (see :ref:`sect-cadmatch-set-preferred-orientation`:latex:`, Section \ref{cadmatch:sect-cadmatch-set-preferred-orientation}`). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/get_preferred_orientation + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/get_preferred_orientation + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/get_preferred_orientation + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_cadmatch_get_preferred_orientation_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_get_preferred_orientation_response.txt + + +.. _expl-cadmatch-srv-set-sorting-strategies: + +``set_sorting_strategies`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Persistently stores the sorting strategy for sorting the grasps and matches returned by the ``detect_object`` service + (see :ref:`sect-cadmatch-detect-objects`:latex:`, Section \ref{cadmatch:sect-cadmatch-detect-objects}`). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/set_sorting_strategies + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/set_sorting_strategies + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/set_sorting_strategies + + .. tabs:: + + .. tab:: **Request** + + Only one strategy may have a ``weight`` greater than 0. If all ``weight`` values are set to 0, the module will use the + default sorting strategy. + + If the weight for ``direction`` is set, the + ``vector`` must contain the direction vector and ``pose_frame`` must be either ``camera`` or ``external``. + + .. include:: _gen/nodes/services/rc_cadmatch_set_sorting_strategies_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_set_sorting_strategies_response.txt + +.. _expl-cadmatch-srv-get-sorting-strategies: + +``get_sorting_strategies`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns the sorting strategy for sorting the grasps and matches returned by the ``detect_object`` service + (see :ref:`sect-cadmatch-detect-objects`:latex:`, Section \ref{cadmatch:sect-cadmatch-detect-objects}`). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/get_sorting_strategies + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/get_sorting_strategies + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/get_sorting_strategies + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_cadmatch_get_sorting_strategies_request.txt + + .. tab:: **Response** + + All ``weight`` values are 0 when the module uses the default sorting strategy. + + .. include:: _gen/nodes/services/rc_cadmatch_get_sorting_strategies_response.txt + +.. _expl-cadmatch-srv-warmup-template: + +``warmup_template`` +^^^^^^^^^^^^^^^^^^^ + + Loads a template so that it is ready when the first detection with this template is triggered. + Without using this service, the first detection with a new template takes longer than the following ones, + because the template is then loaded at the first detection. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/warmup_template + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/warmup_template + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/warmup_template + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_cadmatch_warmup_template_request.txt + + The ``template_id`` is the ID of the template to be loaded into the |cadm| module. + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_warmup_template_response.txt + + +.. _expl-cadmatch-srv-start: + +``start`` +^^^^^^^^^ + + Starts the module. If the command is accepted, the module moves to state ``RUNNING``. + + .. toggle-header:: + :header: **Details** + + The ``current_state`` value in the service response may differ from ``RUNNING`` if + the state transition is still in process when the service returns. + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/start + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/start + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/start + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_cadmatch_start_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_start_response.txt + + +.. _expl-cadmatch-srv-stop: + +``stop`` +^^^^^^^^ + + Stops the module. If the command is accepted, the module moves to state ``IDLE``. + + .. toggle-header:: + :header: **Details** + + The ``current_state`` value in the service response may differ from ``IDLE`` if + the state transition is still in process when the service returns. + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/stop + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/stop + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/stop + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_cadmatch_stop_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_stop_response.txt + +.. only:: rc_cube + + .. _expl-cadmatch-srv-trigger-dump: + + ``trigger_dump`` + ^^^^^^^^^^^^^^^^ + Triggers dumping of the detection that corresponds to the given timestamp, + or the latest detection, if no timestamp is given. The dumps are saved to the + connected USB drive. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/trigger_dump + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/trigger_dump + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_cadmatch_trigger_dump_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_trigger_dump_response.txt + +.. _expl-cadmatch-srv-reset-params: + +``reset_defaults`` +^^^^^^^^^^^^^^^^^^ + + Resets all parameters of the module to its default values, + as listed in above table. + Also resets preferred orientation and sorting strategies. + The reset does not apply to templates. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/reset_defaults + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/reset_defaults + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/reset_defaults + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_cadmatch_reset_defaults_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_reset_defaults_response.txt + + +.. _expl-cadmatch-srv-set-roi: + +``set_region_of_interest`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Persistently stores a 3D region of interest on the |rc_xxx|. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-roi-srv-set-roi`:latex:`\:(Section \ref{roi:expl-roi-srv-set-roi})` in ``rc_roi_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/set_region_of_interest + +.. _expl-cadmatch-srv-get-roi: + +``get_regions_of_interest`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns the configured 3D regions of interest with the requested ``region_of_interest_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-roi-srv-get-roi`:latex:`\:(Section \ref{roi:expl-roi-srv-get-roi})` in ``rc_roi_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/get_regions_of_interest + +.. _expl-cadmatch-srv-delete-roi: + +``delete_regions_of_interest`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Deletes the configured 3D regions of interest with the requested ``region_of_interest_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-roi-srv-delete-roi`:latex:`\:(Section \ref{roi:expl-roi-srv-delete-roi})` in ``rc_roi_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/delete_regions_of_interest + +.. _sect-cadmatch-internal-services: + +Internal services +----------------- + +The following services for configuring grasps and pose priors can change in future without notice. +Setting, retrieving and deleting grasps and pose priors is recommended to be done via the |webgui|. + +.. only:: rc_cube + + .. note:: + + Configuring grasps and pose priors is global for all templates on the |rc_cube| and affects all + camera pipelines. + +.. _expl-cadmatch-srv-set-grasp: + +``set_grasp`` +^^^^^^^^^^^^^ + + Persistently stores a grasp for the given object template on the |rc_xxx|. + All configured grasps are persistent over firmware updates and rollbacks. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/set_grasp + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/set_grasp + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/set_grasp + + .. tabs:: + + .. tab:: **Request** + + Details for the definition of the ``grasp`` type are given in + :ref:`sect-cadmatch-grasps`:latex:`\:(Section \ref{cadmatch:sect-cadmatch-grasps})`. + + .. include:: _gen/nodes/services/rc_cadmatch_set_grasp_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_set_grasp_response.txt + +.. _expl-cadmatch-srv-set-all-grasps: + +``set_all_grasps`` +^^^^^^^^^^^^^^^^^^ + + Replaces the list of grasps for the given object template on the |rc_xxx|. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/set_all_grasps + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/set_all_grasps + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/set_all_grasps + + .. tabs:: + + .. tab:: **Request** + + Details for the definition of the ``grasp`` type are given in + :ref:`sect-cadmatch-grasps`:latex:`\:(Section \ref{cadmatch:sect-cadmatch-grasps})`. + + .. include:: _gen/nodes/services/rc_cadmatch_set_all_grasps_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_set_all_grasps_response.txt + + +.. _expl-cadmatch-srv-get-grasps: + +``get_grasps`` +^^^^^^^^^^^^^^ + + Returns all configured grasps which have the requested ``grasp_ids`` and belong to the requested ``template_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/get_grasps + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/get_grasps + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/get_grasps + + .. tabs:: + + .. tab:: **Request** + + If no ``grasp_ids`` are provided, all grasps belonging to the requested ``template_ids`` are returned. + If no ``template_ids`` are provided, all grasps with the requested ``grasp_ids`` are returned. + If neither IDs are provided, all configured grasps are returned. + + .. include:: _gen/nodes/services/rc_cadmatch_get_grasps_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_get_grasps_response.txt + +.. _expl-cadmatch-srv-delete-grasps: + +``delete_grasps`` +^^^^^^^^^^^^^^^^^ + + Deletes all grasps with the requested ``grasp_ids`` that belong to the requested ``template_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/delete_grasps + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/delete_grasps + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/delete_grasps + + .. tabs:: + + .. tab:: **Request** + + If no ``grasp_ids`` are provided, all grasps belonging to the requested ``template_ids`` are deleted. + The ``template_ids`` list must not be empty. + + .. include:: _gen/nodes/services/rc_cadmatch_delete_grasps_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_delete_grasps_response.txt + +.. _expl-cadmatch-srv-get-symmetric-grasps: + +``get_symmetric_grasps`` +^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns all grasps that are symmetric to the given grasp. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/get_symmetric_grasps + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/get_symmetric_grasps + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/get_symmetric_grasps + + .. tabs:: + + .. tab:: **Request** + + Details for the definition of the ``grasp`` type are given in + :ref:`sect-cadmatch-grasps`:latex:`\:(Section \ref{cadmatch:sect-cadmatch-grasps})`. + + .. include:: _gen/nodes/services/rc_cadmatch_get_symmetric_grasps_request.txt + + .. tab:: **Response** + + The first grasp in the returned list is the one that was passed with the service call. + If the object template does not have an exact symmetry, only the grasp passed with the + service call will be returned. If the object template has a continuous symmetry (e.g. a + cylindrical object), only 12 equally spaced sample grasps will be returned. + + Details for the definition of the ``grasp`` type are given in + :ref:`sect-cadmatch-grasps`:latex:`\:(Section \ref{cadmatch:sect-cadmatch-grasps})`. + + .. include:: _gen/nodes/services/rc_cadmatch_get_symmetric_grasps_response.txt + +.. _expl-cadmatch-srv-set-pose-prior: + +``set_pose_prior`` +^^^^^^^^^^^^^^^^^^ + + Persistently stores a pose prior for the given object template on the |rc_xxx|. + All configured pose priors are persistent over firmware updates and rollbacks. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/set_pose_prior + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/set_pose_prior + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/set_pose_prior + + .. tabs:: + + .. tab:: **Request** + + Details for the definition of the ``pose_prior`` type are given in + :ref:`sect-cadmatch-pose-priors`:latex:`\:(Section \ref{cadmatch:sect-cadmatch-pose-priors})`. + + .. include:: _gen/nodes/services/rc_cadmatch_set_pose_prior_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_set_pose_prior_response.txt + +.. _expl-cadmatch-srv-set-all-pose-priors: + +``set_all_pose_priors`` +^^^^^^^^^^^^^^^^^^^^^^^ + + Replaces the list of pose priors for the given object template on the |rc_xxx|. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/set_all_pose_priors + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/set_all_pose_priors + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/set_all_pose_priors + + .. tabs:: + + .. tab:: **Request** + + Details for the definition of the ``pose_prior`` type are given in + :ref:`sect-cadmatch-pose-priors`:latex:`\:(Section \ref{cadmatch:sect-cadmatch-pose-priors})`. + + .. include:: _gen/nodes/services/rc_cadmatch_set_all_pose_priors_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_set_all_pose_priors_response.txt + + +.. _expl-cadmatch-srv-get-pose-priors: + +``get_pose_priors`` +^^^^^^^^^^^^^^^^^^^^^ + + Returns all configured pose priors which have the requested ``pose_prior_ids`` and belong to the requested ``template_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/get_pose_priors + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/get_pose_priors + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/get_pose_priors + + .. tabs:: + + .. tab:: **Request** + + If no ``pose_prior_ids`` are provided, all pose priors belonging to the requested ``template_ids`` are returned. + If no ``template_ids`` are provided, all pose priors with the requested ``pose_prior_ids`` are returned. + If neither IDs are provided, all configured pose priors are returned. + + .. include:: _gen/nodes/services/rc_cadmatch_get_pose_priors_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_get_pose_priors_response.txt + +.. _expl-cadmatch-srv-delete-pose-priors: + +``delete_pose_priors`` +^^^^^^^^^^^^^^^^^^^^^^ + + Deletes all pose priors with the requested ``pose_prior_ids`` that belong to the requested ``template_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/delete_pose_priors + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/delete_pose_priors + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/delete_pose_priors + + .. tabs:: + + .. tab:: **Request** + + If no ``pose_prior_ids`` are provided, all pose priors belonging to the requested ``template_ids`` are deleted. + The ``template_ids`` list must not be empty. + + .. include:: _gen/nodes/services/rc_cadmatch_delete_pose_priors_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_delete_pose_priors_response.txt + +Return codes +------------ + +.. index:: + pair: CADMatch; return codes + +Each service response contains a ``return_code``, +which consists of a ``value`` plus an optional ``message``. +A successful service returns with a ``return_code`` value of ``0``. +Negative ``return_code`` values indicate that the service failed. +Positive ``return_code`` values indicate that the service succeeded with additional information. +The smaller value is selected in case a service has multiple ``return_code`` values, +but all messages are appended in the ``return_code`` message. + +The following table contains a list of common codes: + +.. tabularcolumns:: |c|L| +.. _tab-cadmatch-return-codes: +.. csv-table:: Return codes of the CADMatch services + :header: Code, Description + + "0", "Success" + "-1", "An invalid argument was provided." + "-2", "An internal error occurred." + "-3", "An internal timeout occurred." + "-4", "Data acquisition took longer than allowed." + "-8", "Not applicable, stereo quality must be at least Medium." + "-9", "No valid license for the module." + "-10", "New element could not be added as the maximum storage capacity of load carriers or regions of interest has been exceeded." + "-11", "Sensor not connected, not supported or not ready." + "10", "The maximum storage capacity of load carriers or regions of interest has been reached." + "11", "Existing data was overwritten." + "100", "The requested load carrier was not detected in the scene." + "101", "None of the detected grasps is reachable." + "102", "The detected load carrier is empty." + "103", "All detected grasps are in collision." + "106", "The list of returned grasps has been trimmed to the 100 best grasps." + "110", "Hints for setting up the application, e.g. reducing the distance from the camera, setting a region of interest." + "114", "No gripper was found for collision checking." + "115", "Collision checking during retraction was skipped, e.g. because no load carrier or no pre-grasp offset were given." + "151", "The object template has a continuous symmetry." + "152", "The objects are outside the given region of interest, outside the load carrier or outside the image." + "153", "No edges could be detected in the camera image. Check the Edge Sensitivity." + "999", "Additional hints for application development" + +.. _sect-cadmatch-template-upload: + +Template API +------------ + +.. index:: + single: CADMatch; template api + single: CADMatch; template download + single: CADMatch; template upload + single: CADMatch; template deletion + +For template upload, download, listing and removal, special |rest-api| endpoints are provided. +Templates can also be uploaded, downloaded and removed via the |webgui|. +The templates include the grasp points and pose priors, if grasp points or pose priors have been configured. +Up to 50 templates can be stored persistently on the |rc_xxx|. + +.. only:: rc_cube + + .. include:: _gen/swagger/rc_cube/templates_rc_cadmatch.txt + + diff --git a/v24.04/de/_raw_sources/camera_calibration.rst.txt b/v24.04/de/_raw_sources/camera_calibration.rst.txt new file mode 100644 index 0000000..2d7530c --- /dev/null +++ b/v24.04/de/_raw_sources/camera_calibration.rst.txt @@ -0,0 +1,349 @@ + +.. include:: global_rst.glb + +.. _sect-camera-calibration: + +Camera calibration +================== + +.. index:: + pair: camera; calibration + +.. only:: rc_visard or rc_visard_ng + + The camera calibration module is a base module which is available on every |rc_xxx|. + +.. only:: rc_cube + + The camera calibration module is a base module which is available on every |rc_cube|, but + cannot be used in camera pipelines of type ``rc_visard``. + +.. only:: rc_cube + + .. note:: + + This module is pipeline specific. Changes to its settings or parameters only affect + the respective camera pipeline and have no influence on other pipelines running on the |rc_cube|. + +To use the camera as measuring instrument, camera parameters such as focal length, +lens distortion, and the relationship of the cameras to each other must be exactly known. The +parameters are determined by calibration and used for image rectification +(see :ref:`sect-stereo-camera-rectification`:latex:`, Section \ref{stereo_camera:sect-stereo-camera-rectification}`), +which is the basis for all other image processing modules. + +.. only:: rc_visard or rc_visard_ng + + The |rc_xxx| is calibrated at + production time. Nevertheless, checking calibration and recalibration might be necessary + if the |rc_xxx| was exposed to strong mechanical impact. + +The camera calibration module is responsible for checking calibration and calibrating. + +.. only:: rc_visard or rc_visard_ng + + Self-calibration + ---------------- + + .. index:: + single: self-calibration + + The camera calibration module automatically runs in self-calibration mode at a low + frequency in the background. In this mode, the |rc_xxx| observes the alignment of image + rows of both rectified images. A mechanical impact, such as one caused by dropping the |rc_xxx|, + might result in a misalignment. If a significant misalignment is detected, then it is + automatically corrected. After each reboot and after each correction, the current self-calibration + offset is reported in the camera module's log file + (see :ref:`sect-downloading-log-files`:latex:`, Section \ref{maintenance:sect-downloading-log-files}`) + as: + + *"rc_stereocalib: Current self-calibration offset is 0.00, update counter is 0"* + + The update counter is incremented after each automatic correction. It is reset to 0 after manual + recalibration of the |rc_xxx|. + + Under normal conditions, such as the absence of mechanical impact on the |rc_xxx|, self-calibration should never + occur. Self-calibration allows the |rc_xxx| to work normally even after misalignment is detected, since it + is automatically corrected. Nevertheless, checking camera calibration manually is recommended + if the update counter is not 0. + +Calibration process +------------------- + +Manual calibration can be done through the :ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})` +:cubeonly:`in the desired pipeline` under :menuselection:`Configuration --> Camera Calibration`. +This page provides a wizard to guide the user through the calibration process. + +.. only:: rc_visard or rc_visard_ng + + .. Note:: Camera calibration is normally unnecessary for the |rc_xxx| since it is calibrated at + production time. Therefore, calibration is only required after strong mechanical impacts, + such as occur when dropping the |rc_xxx|. + +During calibration, the calibration grid must be detected in different poses. +When holding the calibration grid, make sure that all black squares +of the grid are completely visible and not occluded in both camera images. A green check mark overlays each correctly +detected square. The correct detection of the grid is only possible if all of the black +squares are detected. Some of the squares not being detected, or being detected only briefly might indicate bad +lighting conditions, or a damaged grid. Squares in overexposed parts of the calibration grid are highlighted in red. +In this case, the lighting conditions or exposure setting must be adjusted. +A thick green border around the calibration grid indicates that +it was detected correctly in both camera images. + +Calibration settings +^^^^^^^^^^^^^^^^^^^^ + +.. index:: + single: calibration grid + +The quality of camera calibration heavily depends on the quality of the calibration grid. +Calibration grids can be obtained from |company|. + +.. figure:: images/webgui_camera_calibration_1.png + :width: 100 % + :align: center + + Calibration settings + +In the first step, the calibration grid must be specified. The *Next* button proceeds to the next step. + +.. only:: rc_cube + + Adjust focus + ^^^^^^^^^^^^ + + In this step, the focus of the cameras can be adjusted. For this, the grid must be held + such that it is simultaneously visible in both cameras. After the grid is detected, the green bars at the right image borders + indicate the blur of the image. Adjust the focus of each camera so that the bar in each image + is minimal. + + .. Note:: While calibrating an |rc_viscore|, the camera exposure settings are temporarily changed + to values that allow for easier calibration. The exposure settings can still be changed and + will be reset when the calibration is done or cancelled. + + .. only:: roboception or basler or schunk + + For calibrating the Basler *blaze* sensor, the color camera should be focussed to close distance so that the calibration + grid can be detected when it almost fills the image. The camera can be refocussed to working + distance after calibration if necessary. + + Furthermore, the exposure time of the blaze Time-of-Flight camera should be reduced to a minimum. + Otherwise, the calibration grid cannot be detected due to over exposure. + + .. figure:: images/webgui_camera_calibration_2.png + :width: 100 % + :align: center + + Adjust the focus of each camera + +Verify calibration +^^^^^^^^^^^^^^^^^^ + +In the next step, the current calibration can be verified. To perform +the verification, the grid must be held such that it is simultaneously visible in both cameras. +When the grid is detected, the calibration error is automatically computed and the result is +displayed on the screen. + +.. figure:: images/webgui_camera_calibration_3.png + :width: 100 % + :align: center + + Verification of calibration + +.. Note:: To compute a meaningful calibration error, the grid should be held as close as possible + to the cameras. If the grid only covers a small section of the camera images, the calibration + error will always be less than when the grid covers the full image. For this reason, the minimal + and maximal calibration error during verification are shown in addition to the calibration error + at the current grid position. + +The typical calibration error is below 0.2 pixels. If the error is in this range, +then the calibration procedure can be skipped. If the calibration error is greater, the +calibration procedure should be performed to guarantee full sensor performance. The button +*Next* starts the procedure. + +.. Warning:: A large error during verification can be due to miscalibrated cameras, an inaccurate + calibration grid, or wrong grid width or height. In case you use a custom calibration grid, + please make sure that the grid is accurate and + the entered grid width and height are correct. Otherwise, manual calibration will actually + decalibrate the cameras! + +Calibrate +^^^^^^^^^ + +The camera's exposure time should be set appropriately before starting the calibration. +To achieve good calibration results, the images should be well-exposed and motion blur should +be avoided. Thus, the maximum auto-exposure time should be as short as possible, but still allow a good exposure. +The current exposure time is displayed below the camera images as shown +in :numref:`fig-webgui-calibration-stereo`. + +Full calibration consists of calibrating each camera individually (monocalibration) and then performing a stereo +calibration to determine the relationship between them. In most cases, +the intrinsic calibration of each camera does not get corrupted. For this reason, monocalibration is +skipped by default during a recalibration, but can be performed by clicking :guilabel:`Perform Monocalibration` +in the *Calibrate* tab. This should only be done if the result of the stereo calibration is +not satisfactory. + +.. only:: rc_cube and (roboception or basler or schunk) + + When a Basler |blaze| sensor is connected to the |rc_cube| for the first time, it is uncalibrated and needs to + be fully calibrated. In this case, monocalibration is offered automatically and cannot be skipped to ensure + a complete calibration of the sensor. After saving the calibration, it will persistently reside on the |rc_cube| + and automatically be used whenever the |blaze| sensor is connected to the |rc_cube| again, regardless of the port or pipeline. + +.. _sect-stereo-calibration: + +Stereo calibration +^^^^^^^^^^^^^^^^^^ + +.. index:: + pair: camera calibration; stereo calibration + +During stereo calibration, both cameras are calibrated to each other to find their +relative rotation and translation. + +The camera images can also be displayed mirrored to simplify the correct positioning of the calibration grid. + +First, the grid should be held as close as possible to the camera and very still. It must be fully visible +in both images and the cameras should look perpendicularly onto the grid. If the grid is +not perpendicular to the line of sight of the cameras, this will be indicated by small +green arrows pointing to the expected positions of the grid corners (see +:numref:`fig-webgui-calibration-tilted`). + +.. _fig-webgui-calibration-tilted: +.. figure:: images/webgui_camera_calibration_stereo_tilt.png + :width: 80 % + :align: center + + Arrows indicating that the grid is not perpendicular to the camera's line of sight during stereo calibration + +The grid must be kept very still for detection. If motion blur occurs, the grid will not be detected. +All grid cells that are drawn onto the image have to be covered +by the calibration grid. This is visualized by filling the covered cells in green (see +:numref:`fig-webgui-calibration-stereo`). + +.. only:: rc_visard or rc_visard_ng + + For the |rc_xxx| all cells can be covered at once by holding the grid close enough. + +.. only:: rc_cube + + Depending on the camera, the grid has to be held at different positions until all grid cells + have been covered and filled in green. + +.. _fig-webgui-calibration-stereo: +.. figure:: images/webgui_camera_calibration_4.png + :width: 100 % + :align: center + + Stereo calibration: Hold the grid as close as possible to fill all visualized cells + +.. Note:: If the check marks on the calibration grid all vanish, then either the camera does not + look perpendicularly onto the grid, or the grid is too far away from the camera. + +Once all grid cells are covered, they disappear and a single far cell is visualized. +Now, the grid should be held as far as possible from the cameras, so that the small cell +is covered. Arrows will indicate if the grid is still too close to the camera. +When the grid is successfully detected at the far pose, the cell is filled +in green and the result can be computed (see :numref:`fig-webgui-calibration-far`). + +.. _fig-webgui-calibration-far: +.. figure:: images/webgui_camera_calibration_stereo_far.png + :width: 80 % + :align: center + + Holding the grid far away during stereo calibration + +If stereo calibration yields an unsatisfactory calibration error, then calibration should be +repeated with monocalibration (see next Section :ref:`sect-monocalibration`). + + +.. _sect-monocalibration: + +Monocalibration +^^^^^^^^^^^^^^^ + +.. index:: + pair: camera calibration; monocalibration + +Monocalibration is the intrinsic calibration of each camera individually. Since the intrinsic calibration +normally does not get corrupted, the monocalibration should only be performed if the result of stereo +calibration is not satisfactory. + +Click :guilabel:`Perform Monocalibration` in the *Calibrate* tab to start monocalibration. + +For monocalibration, the grid has to be held in certain poses. The arrows from the grid +corners to the green areas indicate that all grid corners should be placed inside the +green areas. The green areas are called sensitive areas. The *Size of Sensitive Area* +slider can control their size to ease calibration. +However, please be aware that increasing their size too much may result in slightly +lower calibration accuracy. + +Holding the grid upside down is a common mistake made during calibration. Spotting this in +this case is easy because the green lines from the grid corners into the green areas will +cross each other as shown in :numref:`fig-webgui-calibration-wrong`. + +.. _fig-webgui-calibration-wrong: +.. figure:: images/webgui_camera_calibration_wrong.png + :width: 60 % + :align: center + + Wrongly holding the grid upside down leads to crossed green lines. + +.. Note:: Calibration might appear cumbersome as it involves holding the grid in certain + predefined poses. However, these poses are required to ensure an unbiased, high-quality calibration + result. + +The monocalibration process involves five poses for each camera as shown in :numref:`fig-poses-monocalibration`. + +.. _fig-poses-monocalibration: +.. figure:: images/calib-views.png + :width: 100 % + :align: center + + Poses required for monocamera calibration + +After the corners or sides of the grid are placed on top of the sensitive areas, the process +automatically shows the next pose required. When the process is finished for the left camera, +the same procedure is repeated for the right one. + +Continue with the guidelines given in the previous Section :ref:`sect-stereo-calibration`. + +Storing the calibration result +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Clicking the :guilabel:`Compute Calibration` button finishes the process and displays the final result. +The indicated result is the mean reprojection error of all calibration points. It is given in +pixels and typically has a value below 0.2. + +Pressing :guilabel:`Save Calibration` applies the calibration and saves it to the device. + +.. Note:: The given result is the minimum error left after calibration. The real error + is definitely not less than this, but could in theory be larger. This is true for every + camera-calibration algorithm and the reason why we enforce holding the grid in very specific + poses. Doing so ensures that the real calibration error cannot significantly + exceed the reported error. + +.. Warning:: If a hand-eye calibration was stored on the |rc_xxx| before camera calibration, + the hand-eye calibration values could have become invalid. Please repeat the hand-eye + calibration procedure. + +Parameters +---------- + +.. index:: + pair: camera calibration; parameters + +The module is called ``rc_stereocalib`` in the |rest-api|. + +.. Note:: The camera calibration module's available parameters and status values are + for internal use only and may change in the future without further notice. Calibration should + only be performed through the |webgui| as described above. + +Services +-------- + +.. index:: + pair: camera calibration; services + +.. Note:: The camera calibration module's available service calls are for internal + use only and may change in the future without further notice. Calibration should only be + performed through the |webgui| as described above. diff --git a/v24.04/de/_raw_sources/camera_modules.rst.txt b/v24.04/de/_raw_sources/camera_modules.rst.txt new file mode 100644 index 0000000..acfaee0 --- /dev/null +++ b/v24.04/de/_raw_sources/camera_modules.rst.txt @@ -0,0 +1,62 @@ +.. include:: global_rst.glb + +.. _sect-3d-camera-modules: + +3D camera modules +================= + +The |rc_xxx|'s 3D camera software consists of the following modules: + +- :doc:`stereo_camera` (``rc_camera``:latex:`, Section \ref{stereo_camera:sect-stereo-camera}`) + acquires image pairs and performs planar rectification for using the + camera as a measurement device. + Images are provided both for further internal processing by other modules + and for external use as :ref:`GenICam image streams `. + +.. only:: rc_cube + + - :doc:`stereo_matching` (``rc_stereomatching``:latex:`, Section \ref{stereo_matching:sect-stereo-matching}`) + uses the rectified stereo image pairs of the connected stereo camera, e.g. the |rc_visard|, to compute 3D depth + information such as disparity, error, and confidence images. + These are provided as GenICam streams, too. + +.. only:: rc_visard or rc_visard_ng + + - :doc:`stereo_matching` (``rc_stereomatching``:latex:`, Section \ref{stereo_matching:sect-stereo-matching}`) + uses the rectified stereo image pairs to compute 3D depth + information such as disparity, error, and confidence images. + These are provided as GenICam streams, too. + +.. only:: rc_cube and (roboception or schunk or basler) + + - :doc:`blaze` (``rc_blaze``:latex:`, Section \ref{blaze:sect-blaze}`) + provides 3D depth information such as disparity, error, and confidence images of the connected + Basler blaze RGB-D camera. + These are provided as GenICam streams, too. + +.. only:: rc_cube + + These modules are pipeline specific, which means that they run inside each + camera pipeline. Changes to their settings or parameters + only affect the corresponding pipeline and have no influence on the other + camera pipelines running on the |rc_cube|. + +.. only:: rc_cube and (roboception or schunk or basler) + + .. note:: + The Stereo Matching module is only available in camera pipelines of type ``rc_visard`` or ``rc_viscore``. + The Blaze module is only available in camera pipelines of type ``blaze``. + +The :doc:`stereo_camera` and the :doc:`stereo_matching` modules, which +acquire image pairs and compute 3D depth information such as disparity, +error, and confidence images, are also accessible via the |rc_xxx|'s +:doc:`GigE Vision/GenICam interface`. + + +.. toctree-filt:: + :maxdepth: 2 + :hidden: + + stereo_camera + stereo_matching + :matrixvision_visard_exclude:blaze diff --git a/v24.04/de/_raw_sources/collisioncheck.rst.txt b/v24.04/de/_raw_sources/collisioncheck.rst.txt new file mode 100644 index 0000000..881660b --- /dev/null +++ b/v24.04/de/_raw_sources/collisioncheck.rst.txt @@ -0,0 +1,561 @@ +.. include:: global_rst.glb + +.. _sect-collision: + +CollisionCheck +================ + +.. index:: ! CollisionCheck + single: collision check + +Introduction +------------ + +The CollisionCheck module is an optional on-board module of the |rcxxx| and is licensed with +any of the modules |pick_modules| or |match_modules|. +Otherwise it requires a separate CollisionCheck :ref:`license` +:latex:`(Section \ref{maintenance:sect-updating-license})` to be purchased. + +The module provides an easy way to check if a gripper is in collision with a load carrier, +:cubeonly:`the point cloud (ony in combination with CADMatch),` +or other detected objects (only in combination with |match_modules|). It is integrated +with the |pick_modules| and |match_modules| modules, but can be used as standalone product. +The models of the grippers for collision checking have to be +defined in the :doc:`gripper_db`:latex:`\:(Section \ref{gripper_db:sect-gripper-db})` module. + +.. Warning:: + + Collisions are checked only between the load carrier and the gripper, not the robot itself, the flange, other objects or + the item located in the robot gripper. Only in combination with |match_modules|, + and only in case the selected template contains a collision + geometry and ``check_collisions_with_matches`` is enabled in the respective detection module, + also collisions between the gripper and other *detected* objects will be checked. + Collisions with objects that cannot be detected will not be checked. + Only in combination with |match_modules| and + only if ``check_collisions_with_point_cloud`` is enabled in the respective detection module, + collisions between the gripper and a watertight version of the point cloud will be checked. + +.. only:: rc_cube + + .. note:: + + This module is pipeline specific. Changes to its settings or parameters only affect + the respective camera pipeline and have no influence on other pipelines running on the |rc_cube|. + +.. only:: rc_cube + + .. tabularcolumns:: |l|L| + .. _tab-collisioncheck-spec: + .. csv-table:: Specifications of the CollisionCheck module + + "Collision checking with", "detected load carrier, detected objects (only |match_modules|), baseplane (only :doc:`silhouettematch`:latex:`, Section \ref{silhouettematch:sect-silhouettematch}`), point cloud (only :doc:`cadmatch`:latex:`, Section \ref{cadmatch:sect-cadmatch}`)" + "Collision checking available in", "|pick_modules|, |match_modules|" + +.. only:: rc_visard or rc_visard_ng + + .. tabularcolumns:: |l|L| + .. _tab-collisioncheck-spec: + .. csv-table:: Specifications of the CollisionCheck module + + "Collision checking with", "detected load carrier, detected objects (only |match_modules|), baseplane (only :doc:`silhouettematch`:latex:`, Section \ref{silhouettematch:sect-silhouettematch}`)" + "Collision checking available in", "|pick_modules|, |match_modules|" + +Collision checking +------------------ + +.. _sect-collision-check-pre-grasp-offset: + +Stand-alone collision checking +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The ``check_collisions`` service call triggers collision checking between the chosen gripper and the provided load carriers +for each of the provided grasps. Checking collisions with other objects :cubeonly:`or the point cloud` +is not possible with the stand-alone ``check_collisions`` service. +The CollisionCheck module checks if the chosen gripper is +in collision with at least one of the load carriers, when the TCP of the gripper is positioned in the +grasp position. It is possible to check the collision with multiple load carriers simultaneously. The grasps +which are in collision with any of the defined load carriers will be returned as colliding. + +The ``pre_grasp_offset`` can be used for additional collision checking. +The pre-grasp offset :math:`P_{off}` is the offset between the grasp point :math:`P_{grasp}` and the pre-grasp position :math:`P_{pre}` +in the grasp's coordinate frame (see :numref:`fig-collision-check-pre-grasp-offset`). +If the pre-grasp offset is defined, the grasp will be detected as colliding +if the gripper is in collision at any point +during motion from the pre-grasp position to the grasp position (assuming +a linear movement). + +.. _fig-collision-check-pre-grasp-offset: +.. figure:: images/pre_grasp_offset.* + :width: 300 px + :align: center + + Illustration of the pre-grasp offset parameter for collision checking. In this case, the pre-grasp position as + well as the grasp position are collision free. However, the trajectory between these poses would have collisions. + Thus, this grasp pose would be marked as colliding. + +.. _sect-collision-check-other-modules: + +Collision checking within other modules +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Collision checking is integrated in the following modules' services: + +.. only:: rc_visard or rc_visard_ng + + - :ref:`sect-itempick`:latex:`\:(Section \ref{itempick:sect-itempick})`: ``compute_grasps`` + (see :ref:`compute_grasps for ItemPick`:latex:`, Section \ref{itempick:expl-itempick-srv-compute-grasps}` and + :ref:`compute_grasps for BoxPick`:latex:`, Section \ref{itempick:expl-itempick-srv-compute-grasps-boxpick}`) + + - :ref:`sect-silhouettematch`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch})`: ``detect_object`` + (see :ref:`expl-silhouettematch-srv-detect-objects`:latex:`, Section \ref{silhouettematch:expl-silhouettematch-srv-detect-objects}`) + +.. only:: rc_cube + + - :ref:`sect-itempick`:latex:`\:(Section \ref{itempick:sect-itempick})`: ``compute_grasps`` + (see :ref:`compute_grasps for ItemPick`:latex:`, Section \ref{itempick:expl-itempick-srv-compute-grasps}` and + :ref:`compute_grasps for BoxPick`:latex:`, Section \ref{itempick:expl-itempick-srv-compute-grasps-boxpick}`) + + - :ref:`sect-silhouettematch`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch})`: ``detect_object`` + (see :ref:`expl-silhouettematch-srv-detect-objects`:latex:`, Section \ref{silhouettematch:expl-silhouettematch-srv-detect-objects}`) + + - :ref:`sect-cadmatch`:latex:`\:(Section \ref{cadmatch:sect-cadmatch})`: ``detect_object`` + (see :ref:`expl-cadmatch-srv-detect-object`:latex:`, Section \ref{cadmatch:expl-cadmatch-srv-detect-object}`) + +Each of these services can take a ``collision_detection`` argument consisting of the ``gripper_id`` of the default gripper +and the ``pre_grasp_offset`` as described in the previous section +:ref:`sect-collision-check-pre-grasp-offset`:latex:`\:(Section \ref{collisioncheck:sect-collision-check-pre-grasp-offset})`. +The default gripper given by the ``gripper_id`` argument is only used for grasp points which do not have an individual gripper ID assigned. +When the ``collision_detection`` argument is given, these services only return the +grasps at which the gripper is not in collision or which could not be checked for collisions. +When a load carrier ID is provided to these services, +collision checking will always be performed between the gripper and the load carrier. +Additional collision check features can be enabled depending on the module. + +Only for |match_modules|, and only in case the selected template contains a collision +geometry and ``check_collisions_with_matches`` is enabled in the respective detection module, +grasp points at which the gripper would be in collision with other *detected* objects are also rejected. The object +on which the grasp point to be checked is located, is excluded from the collision check. + +When a gripper is defined for a grasp point in the object template for |match_modules|, then this gripper will be used +for collision checking at that specific grasp point instead of the default gripper defined in the ``collision_detection`` argument +of the ``detect_object`` service (see :ref:`sect-silhouettematch-grasps`:latex:`, Section \ref{silhouettematch:sect-silhouettematch-grasps}`). +The grasps returned by the ``detect_object`` service contain a flag ``collision_checked``, indicating whether the grasp was checked for collisions, +and the field ``gripper_id``. If ``collision_checked`` is true, the returned ``gripper_id`` contains the ID of the gripper that was used for the collision check. +That is the ID of the gripper defined for that specific grasp, or, if empty, the gripper that was given in the +``collision_detection`` argument of the request. If ``collision_checked`` is false, the returned ``gripper_id`` +is the gripper ID that was defined for that grasp. + +In :doc:`silhouettematch`:latex:`, Section \ref{silhouettematch:sect-silhouettematch}`, collisions between +the gripper and the base plane can be checked, if ``check_collisions_with_base_plane`` is enabled in SilhouetteMatch. + +Collisions between the gripper and a watertight version of the point cloud can be checked in |match_modules| +if ``check_collisions_with_point_cloud`` is enabled in the respective module. + +.. Warning:: + + Collisions are checked only between the load carrier and the gripper, not the robot itself, the flange or other objects. + Only in combination with |match_modules|, + and only in case the selected template contains a collision + geometry and ``check_collisions_with_matches`` is enabled in the respective detection module, + also collisions between the gripper and other *detected* objects are checked. + Collisions with objects that cannot be detected will not be checked. + Only in combination with |match_modules|, and + only if ``check_collisions_with_point_cloud`` is enabled, collisions between the gripper and a watertight version of the point cloud are checked. + + .. only:: rc_cube + + Only in combination with :doc:`cadmatch`:latex:`, Section \ref{cadmatch:sect-cadmatch}` and + only if ``check_collisions_during_retraction`` is enabled + in CADMatch and a load carrier and a pre-grasp offset are given, collisions between the object in the + gripper and the walls of the given load carrier are checked along the linear + trajectory from the grasp point to the pre-grasp pose. + +The collision-check results are affected by run-time parameters, which are listed +and explained further below. + +Parameters +---------- + +The CollisionCheck module is called ``rc_collision_check`` +in the |rest-api| and is represented in the +:ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})` +:cubeonly:`in the desired pipeline` under :menuselection:`Configuration --> CollisionCheck`. +The user can explore and configure the ``rc_collision_check`` +module's run-time parameters, e.g. for development and testing, using the |webgui| or the +:doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`. + +.. _sect-collisioncheck-parameters: + +Parameter overview +^^^^^^^^^^^^^^^^^^ + +.. include:: _gen/nodes/params/rc_collision_check.txt + + +Description of run-time parameters +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Each run-time parameter is represented by a row in the |webgui|'s +*Settings* section :cubeonly:`in the desired pipeline` under +:menuselection:`Configuration --> CollisionCheck`. +The name in the |webgui| is given in brackets behind the parameter name: + +.. _expl-collisioncheck-collision-dist: + +``collision_dist`` (*Collision Distance*) +''''''''''''''''''''''''''''''''''''''''' + Minimal distance in meters between any part of the gripper and the load carrier and/or the base plane (only SilhouetteMatch) + for a grasp to be considered collision free. + + .. note:: + The collision distance is not applied when checking collisions between :cubeonly:`the + gripper and the point cloud, or` the gripper and other detected objects. It is not applied + when checking if the flange is inside the load carrier (``check_flange``), either. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_collision_check/parameters?collision_dist= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_collision_check/parameters?collision_dist= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_collision_check/parameters?collision_dist= + +.. _expl-collisioncheck-check-flange: + +``check_flange`` (*Check Flange*) +''''''''''''''''''''''''''''''''' + Performs an additional safety check as described in + :ref:`sect-collisioncheck-flange`:latex:`\:(Section \ref{gripper_db:sect-collisioncheck-flange})`. + If this parameter is set, all grasps in which any part of the robot's flange is inside the load carrier are marked as colliding. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_collision_check/parameters?check_flange= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_collision_check/parameters?check_flange= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_collision_check/parameters?check_flange= + +.. _expl-collisioncheck-check-bottom: + +``check_bottom`` (*Check Bottom*) +''''''''''''''''''''''''''''''''' + When this check is enabled the collisions will be checked not only with the side walls of the load carrier but also with its bottom. + It might be necessary to disable this check if the TCP is inside the collision geometry (e.g. is defined inside a suction cup). + + .. only:: rc_cube + + The load carrier bottom will always be excluded for the collision check between the object in the gripper and the load carrier + during retraction in combination with :doc:`cadmatch`:latex:`, Section \ref{cadmatch:sect-cadmatch}` when + ``check_collisions_during_retraction`` is enabled. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_collision_check/parameters?check_bottom= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_collision_check/parameters?check_bottom= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_collision_check/parameters?check_bottom= + +.. _sect-collisioncheck-status-values: + +Status values +------------- + +The ``rc_collision_check`` module reports the following status values: + +.. tabularcolumns:: |l|L| +.. csv-table:: The ``rc_collision_check`` module status values + :header: Name, Description + + "``last_evaluated_grasps``","Number of evaluated grasps" + "``last_collision_free_grasps``","Number of collision-free grasps" + "``collision_check_time``","Collision checking runtime" + +.. _sect-collisioncheck-services: + +Services +-------- + +The user can explore and call the ``rc_collision_check`` module's services, +e.g. for development and testing, using +:doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` or +the |rc_xxx| +:ref:`sect-web-gui`:latex:`\:(Section \ref{webgui:sect-web-gui})`. + +The CollisionCheck module offers the following services. + +.. _expl-collisioncheck-srv-reset-params: + +``reset_defaults`` +^^^^^^^^^^^^^^^^^^ + + Resets all parameters of the module to its default values, + as listed in above table. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_collision_check/services/reset_defaults + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_collision_check/services/reset_defaults + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_collision_check/services/reset_defaults + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_collision_check_reset_defaults_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_collision_check_reset_defaults_response.txt + + +.. _expl-collisioncheck-srv-check-collision: + +``check_collisions`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Triggers a collision check between a gripper and a load carrier. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_collision_check/services/check_collisions + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_collision_check/services/check_collisions + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_collision_check/services/check_collisions + + .. tabs:: + + .. tab:: **Request** + + Required arguments: + + ``grasps``: list of grasps that should be checked. + + ``load_carriers``: list of load carriers against which the collision should be checked. + The fields of the load carrier definition are described in + :ref:`sect-loadcarrier-detect-lc`:latex:`\:(Section \ref{loadcarrier:sect-loadcarrier-detect-lc})`. + The position frame of the grasps and load carriers has to be the same. + + ``gripper_id``: the id of the gripper that is used to check the collisions. The gripper has to be configured beforehand. + + Optional arguments: + + ``pre_grasp_offset``: the offset in meters from the grasp position to the pre-grasp position in the grasp frame. + If this argument is set, the collisions will not only be checked in the grasp point, but also on the path from the + pre-grasp position to the grasp position (assuming a linear movement). + + .. include:: _gen/nodes/services/rc_collision_check_check_collisions_request.txt + + .. tab:: **Response** + + ``colliding_grasps``: list of grasps in collision with one or more load carriers. + + ``collision_free_grasps``: list of collision-free grasps. + + ``return_code``: holds possible warnings or error codes and messages. + + .. include:: _gen/nodes/services/rc_collision_check_check_collisions_response.txt + + +.. _expl-collisioncheck-srv-set-grippers: + +``set_gripper`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Persistently stores a gripper on the |rc_xxx|. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-gripper-db-srv-set-gripper`:latex:`\:(Section \ref{gripper_db:expl-gripper-db-srv-set-gripper})` + in ``rc_gripper_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_collision_check/services/set_gripper + + The definitions of the request and response are the same as described in + :ref:`expl-gripper-db-srv-set-gripper`:latex:`\:(Section \ref{gripper_db:expl-gripper-db-srv-set-gripper})` + in ``rc_gripper_db``. + +.. _expl-collisioncheck-srv-get-grippers: + +``get_grippers`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns the configured grippers with the requested ``gripper_ids``. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-gripper-db-srv-get-grippers`:latex:`\:(Section \ref{gripper_db:expl-gripper-db-srv-get-grippers})` + in ``rc_gripper_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_collision_check/services/get_grippers + + The definitions of the request and response are the same as described in + :ref:`expl-gripper-db-srv-get-grippers`:latex:`\:(Section \ref{gripper_db:expl-gripper-db-srv-get-grippers})` + in ``rc_gripper_db``. + +.. _expl-collisioncheck-srv-delete-grippers: + +``delete_grippers`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Deletes the configured grippers with the requested ``gripper_ids``. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-gripper-db-srv-delete-grippers`:latex:`\:(Section \ref{gripper_db:expl-gripper-db-srv-delete-grippers})` + in ``rc_gripper_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_collision_check/services/delete_grippers + + The definitions of the request and response are the same as described in + :ref:`expl-gripper-db-srv-delete-grippers`:latex:`\:(Section \ref{gripper_db:expl-gripper-db-srv-delete-grippers})` + in ``rc_gripper_db``. + + +.. _sect-collisioncheck-return-codes: + +Return codes +------------ + +.. index:: + pair: CollisionCheck; return codes + +Each service response contains a ``return_code``, +which consists of a ``value`` plus an optional ``message``. +A successful service returns with a ``return_code`` value of ``0``. +Negative ``return_code`` values indicate that the service failed. +Positive ``return_code`` values indicate that the service succeeded with additional information. +The smaller value is selected in case a service has multiple ``return_code`` values, +but all messages are appended in the ``return_code`` message. + +The following table contains a list of common codes: + +.. tabularcolumns:: |c|L| +.. _tab-collisioncheck-return-codes: +.. csv-table:: Return codes of the CollisionCheck services + :header: Code, Description + + "0", "Success" + "-1", "An invalid argument was provided" + "-7", "Data could not be read or written to persistent storage" + "-9", "No valid license for the module" + "-10", "New gripper could not be added as the maximum storage capacity of grippers has been exceeded" + "10", "The maximum storage capacity of grippers has been reached" + "11", "Existing gripper was overwritten" diff --git a/v24.04/de/_raw_sources/concept_stereo.rst.txt b/v24.04/de/_raw_sources/concept_stereo.rst.txt new file mode 100644 index 0000000..9722af1 --- /dev/null +++ b/v24.04/de/_raw_sources/concept_stereo.rst.txt @@ -0,0 +1,55 @@ +.. include:: global_rst.glb + +.. _sect-concepts-stereo: + +Stereo vision +------------- + +.. index:: + single: stereo matching + single: SGM + single: disparity + single: disparity image + +In *stereo vision*, 3D information about a scene can be extracted by comparing two images taken from different +viewpoints. The main idea behind using a camera pair for measuring depth is the fact that object points appear at different +positions in the two camera images depending on their distance from the camera pair. Very distant object points +appear at approximately the same position in both images, whereas very close object points occupy different positions +in the left and right camera image. The object points' displacement in the two images is called *disparity*. The +larger the disparity, the closer the object is to the camera. The principle is illustrated in :numref:`fig-stereo_vision`. + +.. _fig-stereo_vision: +.. figure:: images/stereo_sketch_v2.* + :width: 70 % + :align: center + + Sketch of the stereo-vision principle: The more distant object (black) exhibits a smaller disparity :math:`d_2` + than that of the close object (gray), :math:`d_1`. + +Stereo vision is a form of passive sensing, meaning that it emits neither light nor other signals to measure distances, but +uses only light that the environment emits or reflects. Thus, the |company| products utilizing this sensing principle +can work indoors and outdoors and multiple devices can work together without interferences. + +To compute the 3D information, the +stereo matching algorithm must be able to find corresponding object points in the left and right camera images. +For this, the algorithm requires texture, meaning changes in image intensity values due to +patterns or the objects' surface structure, in the images. Stereo matching is not possible for completely untextured regions, +such as a flat white wall without any visible surface structure. The stereo matching method used +by the |rc_xxx| is |sgm|, which provides the best trade-off between runtime and accuracy, even for fine structures. + +The following software modules are required to compute 3D information: + +- :ref:`sect-stereo-camera`: This module is responsible for capturing synchronized image pairs and transforming them + into images approaching those taken by an ideal camera (rectification). +- :ref:`sect-stereo-matching`: This module computes disparities for the rectified stereo image pair + using |sgm-short|\ :latex:`\:(Section \ref{stereo_matching:sect-stereo-matching})`. + +.. only:: rc_visard or rc_visard_ng + + For stereo matching, the position and orientation of the left and right cameras relative to each other has to be known with + very high accuracy. This is achieved by calibration. The |rc_xxx|'s cameras are pre-calibrated during production. + However, if the |rc_xxx| has been decalibrated, during transport for example, then the user has + to recalibrate the stereo camera: + + - :ref:`sect-camera-calibration`: This module enables the user to recalibrate the |rc_xxx|'s stereo camera\ :latex:`\:(Section \ref{camera_calibration:sect-camera-calibration})`. + diff --git a/v24.04/de/_raw_sources/concepts.rst.txt b/v24.04/de/_raw_sources/concepts.rst.txt new file mode 100644 index 0000000..ed7c75c --- /dev/null +++ b/v24.04/de/_raw_sources/concepts.rst.txt @@ -0,0 +1,30 @@ +.. include:: global_rst.glb + +.. _sect-concepts: + +Measurement principles +====================== + +.. only:: rc_visard or rc_visard_ng + + The |rc_xxx| is a self-registering 3D camera. It provides rectified camera, + disparity, confidence, and error images, which enable the viewed scene's depth values along + with their uncertainties to be computed. Furthermore, the motion of visual features in the + images is combined with acceleration and turn-rate measurements at a high rate, which + enables the sensor to provide real-time estimates of its current pose, velocity, and acceleration. + +.. only:: rc_cube + + The |rc_xxx| is a high-performance 3D-image-processing device that is used + in combination one or more 3D cameras such as |company|'s 3D camera |rc_visard|. + Together, they provide rectified camera, + disparity, confidence, and error images, which allow the viewed scene's depth values along + with their uncertainties to be computed. + +In the following, the underlying measurement principles are explained in more detail. + +.. toctree-filt:: + :maxdepth: 2 + + concept_stereo + :rc_cube_exclude:concept_dynamics diff --git a/v24.04/de/_raw_sources/configuration_modules.rst.txt b/v24.04/de/_raw_sources/configuration_modules.rst.txt new file mode 100644 index 0000000..6c1cce0 --- /dev/null +++ b/v24.04/de/_raw_sources/configuration_modules.rst.txt @@ -0,0 +1,44 @@ +.. include:: global_rst.glb + +.. _sect-configuration-modules: + +Configuration modules +===================== + +The |rc_xxx| provides several configuration modules which enable the user to configure +the |rc_xxx| for specific applications. + +The configuration modules are: + +- :doc:`handeye_calibration` (``rc_hand_eye_calibration``:latex:`, Section \ref{handeye_calibration:sect-handeye-calibration}`) + enables the user to calibrate the camera with respect to a robot, + either via the |webgui| or the |restapi|. + +- :doc:`collisioncheck` (``rc_collision_check``:latex:`, Section \ref{collisioncheck:sect-collision}`) + provides an easy way to check if a gripper is in collision. + +- :doc:`camera_calibration` (``rc_stereocalib``:latex:`, Section \ref{camera_calibration:sect-camera-calibration}`) + enables the user to check and perform camera calibration via the + :ref:`WEB GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})`. + +- :doc:`iocontrol` (``rc_iocontrol``:latex:`, Section \ref{iocontrol:sect-iocontrol}`) + provides control over the sensor's general purpose inputs and outputs with special modes + for controlling an external random dot projector. + + +.. only:: rc_cube + + These modules are pipeline specific, which means that they run inside each + camera pipeline. Changes to their settings or parameters + only affect the corresponding pipeline and have no influence on the other + camera pipelines running on the |rc_cube|. + +.. toctree-filt:: + :maxdepth: 2 + :hidden: + + handeye_calibration + collisioncheck + camera_calibration + iocontrol + diff --git a/v24.04/de/_raw_sources/contact.rst.txt b/v24.04/de/_raw_sources/contact.rst.txt new file mode 100644 index 0000000..ced614e --- /dev/null +++ b/v24.04/de/_raw_sources/contact.rst.txt @@ -0,0 +1,116 @@ +.. include:: global_rst.glb + +.. _sect-contact: + +Contact +======= + +Support +^^^^^^^ + +.. only:: roboception + + For support issues, please see http://www.roboception.com/support or contact support@roboception.de. + +.. only:: matrixvision + + For support issues, please see https://www.balluff.com. + +.. only:: schunk + + For support issues, please contact service.greifsysteme@de.schunk.com, or call +49 7133-103-2333. + +.. only:: basler + + For support issues, please see https://www.baslerweb.com/en/sales-support/support-contact/ or contact + + | **Technical Support Team** + | + | Europe, Middle East, Africa + | +49 4102 463 515 + | support.europe@baslerweb.com + | + | The Americas + | +1 610 280 0171 + | support.usa@baslerweb.com + | + | Asia-Pacific + | +65 6367 1355 + | support.asia@baslerweb.com + | + +Downloads +^^^^^^^^^ + +.. only:: roboception or schunk or matrixvision + + Software SDKs, etc. can be downloaded from http://www.roboception.com/download. + +.. only:: basler + + Software SDKs, etc. can be downloaded from https://www.baslerweb.com/3d-software. + +Address +^^^^^^^ + +.. only:: roboception + + | Roboception GmbH + | Kaflerstrasse 2 + | 81241 Munich + | Germany + | + | Web: http://www.roboception.com + | Email: info@roboception.de + | Phone: +49 89 889 50 79-0 + | + +.. only:: matrixvision + + | Balluff GmbH + | Schurwaldstrasse 9 + | D-73765 Neuhausen a.d.F. + | Germany + | + | Web: https://www.balluff.com + | Email: balluff@balluff.de + | Phone: +49 7158 173-0 + | + +.. only:: schunk + + | **Manufacturer:** + | Roboception GmbH + | Kaflerstrasse 2 + | 81241 Munich + | Germany + | + | Web: http://www.roboception.com + | Email: info@roboception.de + | Phone: +49 89 889 50 79-0 + | + | + | **Distributor:** + | SCHUNK GmbH & Co. KG + | Spann- und Greiftechnik + | Bahnhofstr. 106 - 134 + | D-74348 Lauffen/Neckar + | Germany + | + | Web: http://www.schunk.com + | Email: info@de.schunk.com + | Phone: +49-7133-103-0 + | + +.. only:: basler + + | Basler AG + | An der Strusbek 60-62 + | 22926 Ahrensburg + | Germany + | + | Web: http://www.baslerweb.com + | Email: info@baslerweb.com + | Phone: +49 4102 463 0 + | + diff --git a/v24.04/de/_raw_sources/database_modules.rst.txt b/v24.04/de/_raw_sources/database_modules.rst.txt new file mode 100644 index 0000000..264ac6a --- /dev/null +++ b/v24.04/de/_raw_sources/database_modules.rst.txt @@ -0,0 +1,36 @@ +.. include:: global_rst.glb + +.. _sect-database-modules: + +Database modules +================ + +The |rc_xxx| provides several database modules which enable the user to configure +global data which is used in many detection modules, such as load carriers and regions of interest. +Via the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` the database modules are +only available in API version 2. + +The database modules are: + +- :doc:`loadcarrier_db` (``rc_load_carrier_db``:latex:`, Section \ref{loadcarrier_db:sect-loadcarrier-db}`) + allows setting, retrieving and deleting load carriers. + +- :doc:`roi` (``rc_roi_db``:latex:`\:, Section \ref{roi:sect-roi})` + allows setting, retrieving and deleting 2D and 3D regions of interest. + +- :doc:`gripper_db` (``rc_gripper_db``:latex:`, Section \ref{gripper_db:sect-gripper-db}`) + allows setting, retrieving and deleting grippers for collision checking. + +.. only:: rc_cube + + These modules are global on the |rc_cube|, which means that they run outside the camera pipelines. + Changes to their settings or parameters affect all pipelines running on the |rc_cube|. + +.. toctree-filt:: + :maxdepth: 2 + :hidden: + + loadcarrier_db + roi + gripper_db + diff --git a/v24.04/de/_raw_sources/detection_modules.rst.txt b/v24.04/de/_raw_sources/detection_modules.rst.txt new file mode 100644 index 0000000..6337d12 --- /dev/null +++ b/v24.04/de/_raw_sources/detection_modules.rst.txt @@ -0,0 +1,47 @@ +.. include:: global_rst.glb + +.. _sect-detection-modules: + +Detection modules +================= + +The |rc_xxx| offers software modules for different detection applications: + +- :doc:`loadcarrier` (``rc_load_carrier``:latex:`, Section \ref{loadcarrier:sect-loadcarrier}`) + allows detecting load carriers and their filling levels. + +- :doc:`tagdetect` (``rc_april_tag_detect`` and ``rc_qr_code_detect``:latex:`, Section \ref{tagdetect:sect-tag-detection}`) + allows the detection of AprilTags and QR codes, as well as the estimation of their poses. + +- :doc:`itempick` (``rc_itempick`` and ``rc_boxpick``:latex:`, Section \ref{itempick:sect-itempick}`) + provides an out-of-the-box perception solution for robotic pick-and-place + applications of unknown objects or boxes. + +- :doc:`silhouettematch` (``rc_silhouettematch``:latex:`, Section \ref{silhouettematch:sect-silhouettematch}`) + provides an object detection solution for objects placed on a plane or stacked planar objects. + +.. only:: rc_cube + + - :doc:`cadmatch` (``rc_cadmatch``:latex:`, Section \ref{cadmatch:sect-cadmatch}`) + provides an object detection solution for 3D objects. + +.. only:: rc_cube + + These modules are pipeline specific, which means that they run inside each + camera pipeline. Changes to their settings or parameters + only affect the corresponding pipeline and have no influence on the other + camera pipelines running on the |rc_cube|. + +These modules are optional and can be activated by +purchasing a separate +:ref:`license`:latex:`\:(Section \ref{maintenance:sect-updating-license})`. + +.. toctree-filt:: + :maxdepth: 2 + :hidden: + + loadcarrier + tagdetect + itempick + silhouettematch + :rc_cube_only:cadmatch diff --git a/v24.04/de/_raw_sources/disposal.rst.txt b/v24.04/de/_raw_sources/disposal.rst.txt new file mode 100644 index 0000000..37dbb76 --- /dev/null +++ b/v24.04/de/_raw_sources/disposal.rst.txt @@ -0,0 +1,65 @@ +.. include:: global_rst.glb + +.. _sect-disposal: + +Information on disposal +======================= + +.. image:: images/weee-mark_small.* + :width: 200 + +#. **Disposal of Waste Electrical & Electronic Equipment** + + This symbol on the product(s) and / or accompanying documents means that used electrical and electronic products + should not be mixed with general household waste. For proper treatment, recovery and recycling, please contact + your supplier or the manufacturer. Disposing of this product correctly will help save valuable resources and + prevent any potential negative effects on human health and the environment, which could otherwise arise from + inappropriate waste handling. + + +#. **Removal of batteries** + + If the products contain batteries and accumulators that can be removed from the product without destruction, + these must be removed before disposal and disposed of separately as batteries. + + The following batteries or accumulators are contained in the rc_visard: None + + +#. **Options for returning old equipment** + + Owners of old devices can return them to the manufacturer to ensure proper disposal. + + Please :ref:`contact support`:latex:`\:(Section \ref{contact:sect-contact})` about returning the device for disposal. + + +#. **Data protection** + + End users of Electrical & Electronic Equipment are responsible for deleting personal data on the waste equipment to be disposed of. + + +#. **WEEE registration number** + + .. only:: roboception or schunk or matrixvision + + |manufacturer| is registered under the registration number DE 33323989 at the stiftung elektro-altgeräte register, + Nordostpark 72, 90411 Nuremberg, Germany, as a producer of electrical and/or electronic equipment. + + .. only:: basler + + |manufacturer| is registered under the registration number DE 83888045 at the stiftung elektro-altgeräte register, + Nordostpark 72, 90411 Nuremberg, Germany, as a producer of electrical and/or electronic equipment. + + +#. **Collection and recovery quotas** + + According to the WEEE Directive, EU member states are obliged to collect data on waste electrical and electronic + equipment and to transmit this data to the European Commission. Further information can be found on the German + Ministry for the Environment website. + + +**Information on Disposal outside the European Union** + +This symbol is valid only in the European Union. If you wish to discard this product please contact +your local authorities or dealer and ask for the correct method of disposal. + + \ No newline at end of file diff --git a/v24.04/de/_raw_sources/eki.rst.txt b/v24.04/de/_raw_sources/eki.rst.txt new file mode 100644 index 0000000..0d9d7e0 --- /dev/null +++ b/v24.04/de/_raw_sources/eki.rst.txt @@ -0,0 +1,606 @@ +.. include:: global_rst.glb + +.. _sect-eki: + +KUKA Ethernet KRL Interface +=========================== + +.. index:: + single: eki + +The |rc_xxx| provides an Ethernet KRL Interface (|eki-bridge|), +which allows communicating with the |rc_xxx| from KUKA KRL via +KUKA.EthernetKRL XML. + +.. Note:: + + The component is optional and requires a separate |company|'s EKIBridge + :ref:`license ` :latex:`(Section \ref{maintenance:sect-updating-license})` + to be purchased. + +.. Note:: + + The KUKA.EthernetKRL add-on software package version 2.2 or newer must be + activated on the robot controller to use this component. + +The |eki-bridge| can be used to programmatically + +* do service calls, e.g. to start and stop individual computational nodes, + or to use offered services such as the hand-eye calibration or the + computation of grasp poses; +* set and get run-time parameters of computation nodes, + e.g. of the camera, or disparity calculation. + +.. Note:: + + A known limitation of the |eki-bridge| is that strings representing valid numbers will be converted to int/float. + Hence user-defined names (like ROI IDs, etc.) should always contain at least one letter so they can be used in service call arguments. + +Ethernet connection configuration +--------------------------------- + +The |eki-bridge| listens on port 7000 for EKI XML messages and transparently +bridges the |rc_xxx|'s :doc:`REST-API v2`:latex:`\:(Section \ref{rest_api:sect-rest-api})`. +The received EKI messages are transformed to JSON and forwarded to the +|rc_xxx|'s |rest-api|. +The response from the |rest-api| is transformed back to EKI XML. + +The |eki-bridge| gives access to run-time parameters and offered services +of all computational nodes described in +:doc:`modules`:latex:`\:(Section \ref{modules:sect-modules})`. + +.. only:: latex + + The Ethernet connection to the |rc_xxx| on the robot controller is configured + using XML configuration files. + + .. only:: roboception or schunk or matrixvision + + The EKI XML configuration files of all nodes running on the |rc_xxx| are + available for download at: + + :latex:`\begin{center}\url{https://doc.rc-visard.com/latest/en/eki.html#eki-xml-configuration-files}\end{center}` + +.. only:: html + + The Ethernet connection to the |rc_xxx| on the robot controller is configured + using XML configuration files. + The EKI XML configuration files of all nodes running on the |rc_xxx| are + listed at :ref:`sect-eki-configs`. + +Each node offering run-time parameters has an XML configuration file +for setting and getting its parameters. +These are named following the scheme ``-parameters.xml``. +Each node's service has its own XML configuration file. +These are named following the scheme ``-.xml``. + +The IP of the |rc_xxx| in the network needs to be filled in the XML file. + +.. only:: rc_cube + + The port is already set to 7000, which corresponds to pipeline 0. + This needs to be adjusted if a different pipeline should be used. + The port number is 7000 + pipeline number, so 7001 for pipeline 1, etc. + +These files must be stored in the directory +``C:\KRC\ROBOTER\Config\User\Common\EthernetKRL`` +of the robot controller and they are read in when a connection is initialized. + +As an example, an Ethernet connection to configure the ``rc_stereomatching`` +parameters is established with the following KRL code. + + .. code-block:: c + + DECL EKI_Status RET + RET = EKI_INIT("rc_stereomatching-parameters") + RET = EKI_Open("rc_stereomatching-parameters") + + ; ----------- Desired operation ----------- + + RET = EKI_Close("rc_stereomatching-parameters") + +.. note:: The |eki-bridge| automatically terminates the connection to the client + if the received XML telegram is invalid. + +Generic XML structure +--------------------- + +For data transmission, the |eki-bridge| uses ```` as root XML element +(short for request). + +The root tag always includes the following elements. + +* ````. This includes a child XML element used by the |eki-bridge| + to identify the target node. + The node name is already included in the XML configuration file. +* ````. End of request flag that triggers the request. + +The following listing shows the generic XML structure for data transmission. + + .. code-block:: xml + + + + + + + + +For data reception, the |eki-bridge| uses ```` as root XML element +(short for response). +The root tag always includes a ```` child element. + + .. code-block:: xml + + + + + + + + + +.. note:: By default the XML configuration files uses 998 as flag to notify KRL + that the response data record has been received. If this value is already + in use, it should be changed in the corresponding XML configuration file. + +Return code +^^^^^^^^^^^ + +The ```` element consists of a ``value`` and a ``message`` attribute. + +As for all other components, a successful request returns with a +``res/return_code/@value`` of 0. +Negative values indicate that the request failed. +The error message is contained in ``res/return_code/@message``. +Positive values indicate that the request succeeded with additional information, +contained in ``res/return_code/@message`` as well. + +The following codes can be issued by the |eki-bridge| component. + +.. tabularcolumns:: |c|L| +.. _tab-eki-return-codes: +.. csv-table:: Return codes of the |eki-bridge| component + :header: Code, Description + + "0", "Success" + "-1", "Parsing error in the conversion from XML to JSON" + "-2", "Internal error " + "-5", "Connection error from the |rest-api|" + "-9", "Missing or invalid license for |eki-bridge| component" + +.. note:: The |eki-bridge| can also return return code values specific + to individual nodes. They are documented in the respective + :ref:`software module `:latex:`\:(Section \ref{modules:sect-modules})`. + +.. note:: Due to limitations in KRL, the maximum length of a string returned + by the |eki-bridge| is 512 characters. All messages larger than this value + are truncated. + +Services +-------- + +For the nodes' services, the XML schema is generated from the service's +arguments and response in JavaScript Object Notation (JSON) described in +:doc:`modules`:latex:`\:(Section \ref{modules:sect-modules})`. +The conversion is done transparently, except for the conversion rules +described below. + +Conversions of poses: + + A pose is a JSON object that includes ``position`` and ``orientation`` keys. + + .. code-block:: json + + { + "pose": { + "position": { + "x": "float64", + "y": "float64", + "z": "float64", + }, + "orientation": { + "x": "float64", + "y": "float64", + "z": "float64", + "w": "float64", + } + } + } + + This JSON object is converted to a KRL ``FRAME`` in the XML message. + + .. code-block:: xml + + + + Positions are converted from meters to millimeters and orientations are + converted from quaternions to KUKA ABC (in degrees). + + .. note:: No other unit conversions are included in the |eki-bridge|. + All dimensions and 3D coordinates that don't belong to a pose are + expected and returned in meters. + +Arrays: + + Arrays are identified by adding the child element ```` + (short for list element) to the list name. As an example, the JSON object + + .. code-block:: json + + { + "rectangles": [ + { + "x": "float64", + "y": "float64" + } + ] + } + + is converted to the XML fragment + + .. code-block:: xml + + + + ... + ... + + + +Use of XML attributes: + + All JSON keys whose values are a primitive data type and don't belong to an + array are stored in attributes. As an example, the JSON object + + .. code-block:: json + + { + "item": { + "uuid": "string", + "confidence": "float64", + "rectangle": { + "x": "float64", + "y": "float64" + } + } + } + + is converted to the XML fragment + + .. code-block:: xml + + + + + + +Request XML structure +^^^^^^^^^^^^^^^^^^^^^ + +The ```` element in the XML configuration file for a generic +service follows the specification below. + + .. code-block:: xml + + + + + + + + + + +The ```` element includes a child XML element that is used by the +|eki-bridge| to identify the target service from the XML telegram. +The service name is already included in the configuration file. + +The ```` element includes the service arguments and should be configured +with ``EKI_Set`` KRL instructions. + +As an example, the ```` element of the ``rc_load_carrier_db``'s +``get_load_carriers`` service +(see :ref:`sect-loadcarrier-db`:latex:`, Section \ref{loadcarrier_db:sect-loadcarrier-db}`) is: + + .. code-block:: xml + + + + + + + + + + +The ```` element allows to have arrays in the request. +For configuring an array, the request is split into as many +packages as the size of the array. +The last telegram contains all tags, including the ```` +flag, while all other telegrams contain one array element each. + +As an example, for requesting two load carrier models to the ``rc_load_carrier_db``'s +``get_load_carriers`` service, the user needs to send two XML messages. +The first XML telegram is: + + .. code-block:: xml + + + + + load_carrier1 + + + + +This telegram can be sent from KRL with the ``EKI_Send`` command, +by specifying the list element as path: + + .. code-block:: c + + DECL EKI_STATUS RET + RET = EKI_SetString("rc_load_carrier_db-get_load_carriers", "req/args/load_carrier_ids/le", "load_carrier1") + RET = EKI_Send("rc_load_carrier_db-get_load_carriers", "req/args/load_carrier_ids/le") + +The second telegram includes all tags and triggers the request to the +``rc_load_carrier_db`` node: + + .. code-block:: xml + + + + + + + + + + + load_carrier2 + + + + + +This telegram can be sent from KRL by specifying ``req`` as path for ``EKI_Send``: + + .. code-block:: c + + DECL EKI_STATUS RET + RET = EKI_SetString("rc_load_carrier_db-get_load_carriers", "req/args/load_carrier_ids/le", "load_carrier2") + RET = EKI_Send("rc_load_carrier_db-get_load_carriers", "req") + +Response XML structure +^^^^^^^^^^^^^^^^^^^^^^ + +The ```` element in the XML configuration file for a generic +service follows the specification below: + + .. code-block:: xml + + + + + + + + + + +As an example, the ```` element of the ``rc_april_tag_detect``'s +``detect`` service +(see :ref:`sect-tag-detection`:latex:`, Section \ref{tagdetect:sect-tag-detection}`) is: + + .. code-block:: xml + + + + + + + + + + + + + + + + + + + + + + + +For arrays, the response includes multiple instances of the same XML element. +Each element is written into a separate buffer within EKI and can be read +from the buffer with KRL instructions. +The number of instances can be requested with ``EKI_CheckBuffer`` and each +instance can then be read by calling ``EKI_Get``. + +As an example, the tag poses received after a call to the +``rc_april_tag_detect``'s ``detect`` service can be read in KRL using the +following code: + + .. code-block:: c + + DECL EKI_STATUS RET + DECL INT i + DECL INT num_instances + DECL FRAME poses[32] + + DECL FRAME pose = {X 0.0, Y 0.0, Z 0.0, A 0.0, B 0.0, C 0.0} + + RET = EKI_CheckBuffer("rc_april_tag_detect-detect", "res/tags/le/pose") + num_instances = RET.Buff + for i=1 to num_instances + RET = EKI_GetFrame("rc_april_tag_detect-detect", "res/tags/le/pose", pose) + poses[i] = pose + endfor + RET = EKI_ClearBuffer("rc_april_tag_detect-detect", "res") + +.. note:: Before each request from EKI to the |rc_xxx|, all buffers should + be cleared in order to store only the current response in the EKI buffers. + +Parameters +---------- + +All nodes' parameters can be set and queried from the |eki-bridge|. +The XML configuration file for a generic node follows the specification below: + + .. code-block:: xml + + + + + + + + + + + + + + + + + + + + + + + + + +The request is interpreted as a *get* request if all parameter's +``value`` attributes are empty. +If any ``value`` attribute is non-empty, it is interpreted as *set* request +of the non-empty parameters. + +As an example, the current value of all parameters of ``rc_stereomatching`` +can be queried using the XML telegram: + + .. code-block:: xml + + + + + + + + + +This XML telegram can be sent out with Ethernet KRL using: + + .. code-block:: c + + DECL EKI_STATUS RET + RET = EKI_Send("rc_stereomatching-parameters", "req") + +The response from the |eki-bridge| contains all parameters: + + .. code-block:: xml + + + + + + + + + + + + + + + + + +The ``quality`` parameter of ``rc_stereomatching`` can be set to ``Low`` +by the XML telegram: + + .. code-block:: xml + + + + + + + + + + + +This XML telegram can be sent out with Ethernet KRL using: + + .. code-block:: c + + DECL EKI_STATUS RET + RET = EKI_SetString("rc_stereomatching-parameters", "req/parameters/quality/@value", "Low") + RET = EKI_Send("rc_stereomatching-parameters", "req") + + +In this case, only the applied value of ``quality`` is returned by the +|eki-bridge|: + + .. code-block:: xml + + + + + + + + +.. only:: html + + .. include:: eki_configs.rst_incl + + +.. only:: rc_visard or rc_cube + + Migration to firmware version 22.01 + ----------------------------------- + + From firmware version 22.01 on the |eki-bridge| reflects |rc_xxx|'s :doc:`REST-API v2`:latex:`\:(Section \ref{rest_api:sect-rest-api})`. + + This requires the following changes: + + * Configuring load carriers, grippers and regions of interest is now only accessible in the global database modules: + + + Use the ``rc_load_carrier_db`` XML files for getting, setting and deleting of load carriers. + + Use the ``rc_gripper_db`` XML files for getting, setting and deleting of grippers. + + Use the ``rc_roi_db`` XML files for getting, setting and deleting of regions of interest. + + * Load carrier detection and filling level detection is now only accessible via the ``rc_load_carrier`` node. + + + Use the ``rc_load_carrier`` XML files for ``detect_load_carriers`` and ``detect_filling_level`` services. + +.. only:: roboception or matrixvision or schunk + + Example applications + -------------------- + + More detailed robot application examples can be found at https://github.com/roboception/eki_examples. + + +Troubleshooting +--------------- + +**SmartPad error message: Limit of element memory reached** + +This error may occur if the number of matches exceeds the memory limit. + +- Increase BUFFERING and set BUFFSIZE in EKI config files. Adapt these settings to your particular KRC. +- Decrease the 'Maximum Matches' parameter in the detection module +- Even if the total memory limit (BUFFSIZE) of a message is not reached, the KRC might not + be able to parse the number of child elements in the XML tree if the + BUFFERING limit is too small. For example, if your application proposes 50 + different grasps, the BUFFERING limit needs to be 50 too. diff --git a/v24.04/de/_raw_sources/general.rst.txt b/v24.04/de/_raw_sources/general.rst.txt new file mode 100644 index 0000000..1d75127 --- /dev/null +++ b/v24.04/de/_raw_sources/general.rst.txt @@ -0,0 +1,170 @@ +.. include:: global_rst.glb + +.. _sect-general: + +Overview +======== + +.. only:: rc_cube + + + The |rc_xxx| is a high-performance 3D-image-processing device. + It enhances the computing capabilities of the |company| stereo camera |rc_visard| and + supports :mvexclude:`the Basler blaze camera in an RGB-D setup and` the |rc_viscore|. + + .. only:: roboception or basler + + Information about the supported devices are provided in + + .. only:: roboception + + * |rc_visard|: https://doc.rc-visard.com + * |rc_viscore|: https://doc.rc-viscore.com + * |blaze|: https://www.baslerweb.com/en/products/cameras/3d-cameras/blaze-rgb-d. + + .. only:: basler + + * https://www.baslerweb.com/en/products/cameras/3d-cameras/. + + .. NOTE:: Unless specified, the information provided in this manual applies to both the |rc_visard| 65 and |rc_visard| 160 + versions of the |company| |rc_visard| sensor, as well as the |rc_visard_ng|. + + .. only:: roboception or schunk or basler + + .. NOTE:: The term "blaze" used throughout the manual always refers to the Basler blaze camera in an RGB-D setup, i.e. the blaze + Time-of-Flight camera in combination with the Basler aceA1300 color camera. + +.. only:: rc_visard or rc_visard_ng + + The 3D sensor |rc_xxx| is an IP54-protected :visardonly:`, self-registering` stereo-camera + with on-board computing capabilities. + +The |rc_xxx| provides real-time camera images and depth images, which can +be used to compute 3D point clouds. Additionally, it provides +confidence and error images as quality measures for each image acquisition. +It offers an intuitive web UI (user interface) and a standardized +GenICam interface, making it compatible with all major image processing +libraries. + +With optionally available software modules the |rc_xxx| provides out-of-the-box solutions +for object detection and robotic pick-and-place applications. + +.. only:: rc_cube + + The |rc_cube| is offered in two versions: *rc_cube S* and *rc_cube I*. + + The *rc_cube S* is suitable for research, development and testing environments. It supports one |rc_visard| without additional hardware. + A separate 2.5Gbit switch (not part of the product scope) enables the support of two |rc_visard| devices at a time or allows to connect + an |rc_viscore| :mvexclude:`or a Basler blaze` device. + + The *rc_cube I* is intended for operational use in an industrial environment. It supports four |rc_visard| cameras, or two |rc_viscore| + :mvexclude:`or Basler blaze` devices without additional hardware. + + .. only:: basler + + .. figure:: images/cube_overview_basler.* + :width: 80 % + :align: center + + Schematic representation of the |rc_cube| and the connected 3D cameras. + Unless only a single |rc_visard| is connected to the *rc_cube S*, a separate 2.5Gbit switch is required. + + .. only:: matrixvision + + .. figure:: images/cube_overview_mv.* + :width: 80 % + :align: center + + Schematic representation of the |rc_cube| and the connected 3D cameras. + Unless only a single |rc_visard| is connected to the *rc_cube S*, a separate 2.5Gbit switch is required. + + .. only:: schunk + + .. figure:: images/cube_overview_schunk.* + :width: 80 % + :align: center + + Schematic representation of the |rc_cube| and the connected 3D cameras. + Unless only a single |rc_visard| is connected to the *rc_cube S*, a separate 2.5Gbit switch is required. + + .. only:: roboception + + .. figure:: images/cube_overview.* + :width: 80 % + :align: center + + Schematic representation of the |rc_cube| and the connected 3D cameras. + Unless only a single |rc_visard| is connected to the *rc_cube S*, a separate 2.5Gbit switch is required. + +.. only:: rc_visard + + The |rc_visard| also provides self-localization based on image and inertial data. + A mobile navigation solution can be established with the optional on-board SLAM module. + + The |rc_visard| is offered with two different stereo baselines: The |rc_visard| 65 + is optimally suited for mounting on robotic manipulators, whereas the |rc_visard| 160 can be + employed as a navigation or as externally-fixed sensor. + +.. only:: rc_visard or rc_visard_ng + + The |rc_xxx|'s intuitive calibration, configuration, and use enable 3D vision for everyone. + + .. only:: roboception and rc_visard + + .. figure:: images/sensor.png + :width: 40 % + :align: center + + |rc_visard| 65 and |rc_visard| 160 + + .. only:: roboception and rc_visard_ng + + .. figure:: images/sensor_ng.png + :width: 40 % + :align: center + + |rc_visard_ng| 160 + + .. only:: matrixvision + + .. figure:: images/sensor_mv.png + :width: 40 % + :align: center + + |rc_visard| 65 and |rc_visard| 160 + + .. only:: basler + + .. figure:: images/sensor_basler.png + :width: 40 % + :align: center + + |manufacturer| |rc_visard| 65 and |rc_visard| 160 + + .. only:: schunk + + .. figure:: images/sensor_schunk.png + :width: 40 % + :align: center + + |manufacturer| |rc_visard| 65 and |rc_visard| 160 + + +.. only:: rc_visard + + The terms "sensor," "|rc_visard| 65," and "|rc_visard| 160" used throughout the manual all refer to the |company| |rc_visard| family of self-registering cameras. + Installation and control for all sensors are exactly the same, and all use the same mounting base. + + .. NOTE:: Unless specified, the information provided in this manual applies to both the |rc_visard| 65 and |rc_visard| 160 versions of the |company| |rc_visard| sensor. + +.. only:: rc_visard_ng + + The terms "sensor" and "|rc_xxx|" used throughout the manual all refer to the |company| |rc_visard_ng|. + +.. only:: rc_cube + + .. NOTE:: Unless specified, the information provided in this manual applies to both the *rc_cube S* and *rc_cube I* versions of the |rc_cube|. + +.. NOTE:: This manual uses the metric system and mostly uses the units meter and + millimeter. Unless otherwise specified, all dimensions in technical drawings are + in millimeters. diff --git a/v24.04/de/_raw_sources/gigevision.rst.txt b/v24.04/de/_raw_sources/gigevision.rst.txt new file mode 100644 index 0000000..f20c037 --- /dev/null +++ b/v24.04/de/_raw_sources/gigevision.rst.txt @@ -0,0 +1,771 @@ +.. include:: global_rst.glb + +.. _sect-genicam: + +GigE Vision 2.0/GenICam image interface +----------------------------------------- + +.. index:: + see: GigE Vision; GenICam + +Gigabit Ethernet for Machine Vision ("GigE Vision\ |reg|" for short) is an industrial camera interface standard based on UDP/IP +(see http://www.gigevision.com). +The |rc_xxx| is a GigE Vision\ |reg| version 2.0 device and is hence compatible with all GigE Vision\ |reg| 2.0 compliant frameworks and libraries. + +GigE Vision\ |reg| uses GenICam to describe the camera/device features. For more information about this *Generic Interface for Cameras* see http://www.genicam.org/. + +Via this interface the |rc_xxx| provides features such as + +* discovery, +* IP configuration, +* configuration of camera related parameters, +* image grabbing, and +* time synchronization via IEEE 1588-2008 PrecisionTimeProtocol (PTPv2). + +.. note:: The |rc_xxx| supports jumbo frames of up to 9000 bytes. Setting an MTU of 9000 + on your GigE Vision client side is recommended for best performance. + +.. only:: roboception or schunk or matrixvision + + .. note:: |manufacturer| provides tools and a C++ API with examples for discovery, configuration, and image + streaming via the GigE Vision/GenICam interface. See http://www.roboception.com/download. + +.. _sect-gev-ports: + +GigE Vision ports +^^^^^^^^^^^^^^^^^ + +GigE Vision is a UDP based protocol. On the |rc_xxx| the UDP ports are fixed and known: + +* UDP port 3956: GigE Vision Control Protocol (GVCP). Used for discovery, control and configuration. +* UDP port 50010: Stream channel source port for GigE Vision Stream Protocol (GVSP) used for image streaming. + +.. _sect-genicam-params: + +Important GenICam parameters +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The following list gives an overview of the relevant GenICam features of +the |rc_xxx| that can be read and/or changed +via the GenICam interface. In addition to the standard parameters, which are defined in +the Standard Feature Naming Convention (SFNC, see +http://www.emva.org/standards-technology/genicam/genicam-downloads/), +|rc_xxx| devices also offer custom parameters that account for special +features of the +:ref:`sect-stereo-camera`:latex:`\:(Section \ref{stereo_camera:sect-stereo-camera})` +and the +:ref:`sect-stereo-matching`:latex:`\:(Section \ref{stereo_matching:sect-stereo-matching})` +module. + +Important standard GenICam features +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Category: ImageFormatControl +++++++++++++++++++++++++++++ + +.. index:: + pair: ComponentSelector; GenICam + +``ComponentSelector`` + - type: Enumeration, one of ``Intensity``, ``IntensityCombined``, ``Disparity``, ``Confidence``, or ``Error`` + - default: - + - description: Allows the user to select one of the five image streams for configuration (see :ref:`sect-provided-image-streams`:latex:`, \:Section \ref{gigevision:sect-provided-image-streams}`). + +.. index:: + pair: ComponentIDValue; GenICam + +``ComponentIDValue`` (read-only) + - type: Integer + - description: The ID of the image stream selected by the ``ComponentSelector``. + +.. index:: + pair: ComponentEnable; GenICam + +``ComponentEnable`` + - type: Boolean + - default: - + - description: If set to ``true``, it enables the image stream selected by ``ComponentSelector``; otherwise, it disables the stream. + Using ``ComponentSelector`` and ``ComponentEnable``, individual image streams can be switched on and off. + +.. index:: + pair: Width; GenICam + +``Width`` (read-only) + - type: Integer + - description: Image width in pixel of image stream that is currently selected by ``ComponentSelector``. + +.. index:: + pair: Height; GenICam + +``Height`` (read-only) + - type: Integer + - description: Image height in pixel of image stream that is currently selected by ``ComponentSelector``. + +.. index:: + pair: WidthMax; GenICam + +``WidthMax`` (read-only) + - type: Integer + - description: Maximum width of an image. + +.. index:: + pair: HeightMax; GenICam + +``HeightMax`` (read-only) + - type: Integer + - description: Maximum height of an image in the streams. This is always 1920 pixels due to the + stacked left and right images in the ``IntensityCombined`` stream (see :ref:`sect-provided-image-streams`:latex:`, Section \ref{gigevision:sect-provided-image-streams}`). + +.. index:: + pair: PixelFormat; GenICam + +``PixelFormat`` + - type: Enumeration, one of ``Mono8``, ``YCbCr411_8`` (color cameras only), ``Coord3D_C16``, ``Confidence8`` and ``Error8`` + - description: Pixel format of the selected component. The enumeration only permits to choose the format + among the possibly formats for the selected component. For a color camera, ``Mono8`` or ``YCbCr411_8`` + can be chosen for the ``Intensity`` and ``IntensityCombined`` component. + +Category: AcquisitionControl +++++++++++++++++++++++++++++ + +.. index:: + pair: AcquisitionFrameRate; GenICam + pair: frame rate; GenICam + +``AcquisitionFrameRate`` + - type: Float, ranges from 1 Hz to 25 Hz + - default: 25 Hz + - description: Frame rate of the camera + (:ref:`FPS `:latex:`, Section \ref{stereo_camera:sect-cam-params}`). + +.. index:: + pair: ExposureAuto; GenICam + +``ExposureAuto`` + - type: Enumeration, one of ``Continuous``, ``Out1High``, ``AdaptiveOut1``, ``HDR`` or ``Off`` + - default: ``Continuous`` + - description: Combines ``exp_control`` (:ref:`exposure control `:latex:`, Section \ref{stereo_camera:expl-exp-control}`) + and ``exp_auto_mode`` (:ref:`auto exposure mode `:latex:`, Section \ref{stereo_camera:expl-exp-auto-mode}`). + ``Off`` maps to `Manual` :ref:`exposure control `. + ``Continuous``, ``Out1High`` or ``AdaptiveOut1`` enable `Auto` :ref:`exposure control ` + with the respective :ref:`auto exposure mode ` where ``Continuous`` maps to the `Normal` ``exp_auto_mode``. + ``HDR`` enables high-dynamic-range exposure control. + +.. index:: + pair: ExposureTime; GenICam + +``ExposureTime`` + - type: Float, ranges from 66 µs to 18000 µs + - default: 5000 µs + - description: The cameras' exposure time in microseconds for the manual exposure mode + (:ref:`Exposure `:latex:`, Section \ref{stereo_camera:expl-exp-value}`). + +Category: AnalogControl ++++++++++++++++++++++++ + +``GainSelector`` (read-only) + - type: Enumeration, is always ``All`` + - default: ``All`` + - description: The |rc_xxx| currently supports only one overall gain setting. + +.. index:: + pair: Gain; GenICam + +``Gain`` + - type: Float, ranges from 0 dB to 18 dB + - default: 0 dB + - description: The cameras' gain value in decibel that is used in manual exposure mode + (:ref:`Gain `:latex:`, Section \ref{stereo_camera:expl-gain-value}`). + +.. index:: + pair: BalanceWhiteAuto; GenICam + +``BalanceWhiteAuto`` (color cameras only) + - type: Enumeration, one of ``Continuous`` or ``Off`` + - default: ``Continuous`` + - description: Can be set to ``Off`` for manual white balancing mode or to ``Continuous`` + for auto white balancing. This feature is only available on color cameras + (:ref:`wb_auto `:latex:`, Section \ref{stereo_camera:expl-wb-auto}`). + +.. index:: + pair: BalanceRatioSelector; GenICam + +``BalanceRatioSelector`` (color cameras only) + - type: Enumeration, one of ``Red`` or ``Blue`` + - default: ``Red`` + - description: Selects ratio to be modified by ``BalanceRatio``. ``Red`` means red to green + ratio and ``Blue`` means blue to green ratio. This feature is only available on color cameras. + +.. index:: + pair: BalanceRatio; GenICam + +``BalanceRatio`` (color cameras only) + - type: Float, ranges from 0.125 to 8 + - default: 1.2 if ``Red`` and 2.4 if ``Blue`` is selected in ``BalanceRatioSelector`` + - description: Weighting of red or blue to green color channel. This feature is only available + on color cameras + (:ref:`wb_ratio `:latex:`, Section \ref{stereo_camera:expl-wb-ratio}`). + +.. _sect-genicam-iocontrol: + +Category: DigitalIOControl +++++++++++++++++++++++++++ + +.. index:: + pair: LineSelector; GenICam + +``LineSelector`` + - type: Enumeration, one of ``Out1``, ``Out2``, ``In1`` or ``In2`` + - default: ``Out1`` + - description: Selects the input or output line for getting the current status or setting + the source. + +.. index:: + pair: LineStatus; GenICam + +``LineStatus`` (read-only) + - type: Boolean + - description: Current status of the line selected by ``LineSelector``. + +.. index:: + pair: LineStatusAll; GenICam + +``LineStatusAll`` (read-only) + - type: Integer + - description: Current status of GPIO inputs and outputs represented in the lowest four bits. + + .. table:: Meaning of bits of ``LineStatusAll`` field. + + +------+------+------+-------+-------+ + | Bit | 4 | 3 | 2 | 1 | + +======+======+======+=======+=======+ + | GPIO | In 2 | In 1 | Out 2 | Out 1 | + +------+------+------+-------+-------+ + +.. index:: + pair: LineSource; GenICam + +``LineSource`` + - type: Enumeration, one of ``ExposureActive``, ``ExposureAlternateActive``, ``Low`` or ``High`` + - default: ``Low`` + - description: Mode for output line selected by ``LineSelector`` as described in the IOControl + module (:ref:`out1_mode and out2_mode`:latex:`, + Section \ref{iocontrol:sect-iocontrol-params}`). See also parameter + ``AcquisitionAlternateFilter`` for filtering images in ``ExposureAlternateActive`` mode. + +Category: TransportLayerControl / PtpControl +++++++++++++++++++++++++++++++++++++++++++++ + +.. index:: + pair: PtpEnable; GenICam + pair: PTP; synchronization + pair: time; synchronization + +``PtpEnable`` + - type: Boolean + - default: ``false`` + - description: Switches PTP synchronization on and off. + +Category: Scan3dControl ++++++++++++++++++++++++ + +.. index:: + pair: Scan3dDistanceUnit; GenICam + +``Scan3dDistanceUnit`` (read-only) + - type: Enumeration, is always ``Pixel`` + - description: Unit for the disparity measurements, which is always ``Pixel``. + +.. index:: + pair: Scan3dOutputMode; GenICam + +``Scan3dOutputMode`` (read-only) + - type: Enumeration, is always ``DisparityC`` + - description: Mode for the depth measurements, which is always ``DisparityC``. + +.. index:: + pair: Scan3dFocalLength; GenICam + +``Scan3dFocalLength`` (read-only) + - type: Float + - description: Focal length in pixel of image stream selected by ``ComponentSelector``. In case of + the component ``Disparity``, ``Confidence`` and ``Error``, the value also depends on the + resolution that is implicitly selected by ``DepthQuality``. + +.. index:: + pair: Scan3dBaseline; GenICam + +``Scan3dBaseline`` (read-only) + - type: Float + - description: Baseline of the stereo camera in meters. + +.. index:: + pair: Scan3dPrinciplePointU; GenICam + +``Scan3dPrinciplePointU`` (read-only) + - type: Float + - description: Horizontal location of the principle point in pixel of image stream selected by + ``ComponentSelector``. In case of the component ``Disparity``, ``Confidence`` and ``Error``, + the value also depends on the resolution that is implicitly selected by ``DepthQuality``. + +.. index:: + pair: Scan3dPrinciplePointV; GenICam + +``Scan3dPrinciplePointV`` (read-only) + - type: Float + - description: Vertical location of the principle point in pixel of image stream selected by + ``ComponentSelector``. In case of the component ``Disparity``, ``Confidence`` and ``Error``, + the value also depends on the resolution that is implicitly selected by ``DepthQuality``. + +.. index:: + pair: Scan3dCoordinateScale; GenICam + +``Scan3dCoordinateScale`` (read-only) + - type: Float + - description: The scale factor that has to be multiplied with the disparity values in the disparity + image stream to get the actual disparity measurements. This value is always 0.0625. + +.. index:: + pair: Scan3dCoordinateOffset; GenICam + +``Scan3dCoordinateOffset`` (read-only) + - type: Float + - description: The offset that has to be added to the disparity values in the disparity + image stream to get the actual disparity measurements. For the |rc_xxx|, this value + is always 0 and can therefore be disregarded. + +.. index:: + pair: Scan3dInvalidDataFlag; GenICam + +``Scan3dInvalidDataFlag`` (read-only) + - type: Boolean + - description: Is always ``true``, which means that invalid data in the + disparity image is marked by a specific value defined by the + ``Scan3dInvalidDataValue`` parameter. + +.. index:: + pair: Scan3dInvalidDataValue; GenICam + +``Scan3dInvalidDataValue`` (read-only) + - type: Float + - description: Is the value which stands for invalid disparity. This value is always 0, which means that + disparity values of 0 correspond to invalid measurements. To distinguish between invalid disparity measurements and + disparity measurements of 0 for objects which are infinitely far away, the |rc_xxx| sets the disparity value for the latter + to the smallest possible disparity value of 0.0625. This still corresponds to an object distance of several hundred meters. + +Category: ChunkDataControl +++++++++++++++++++++++++++ + +.. index:: + pair: Chunk data; GenICam + +``ChunkModeActive`` + - type: Boolean + - default: False + - description: Enables chunk data that is delivered with every image. + +.. _sect-custom-genicam-params: + +Custom GenICam features of the |rc_xxx| +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Category: DeviceControl ++++++++++++++++++++++++ + +.. index:: + pair: system ready; GenICam + +``RcSystemReady`` (read-only) + - type: Boolean + - description: Returns whether the device's boot process has completed and all modules are running. + +.. index:: + pair: disable parameter lock; GenICam + +``RcParamLockDisable`` + - type: Boolean + - default: False + - description: If set to true, the camera and depth image parameters are not locked when a GigE Vision + client is connected to the device. Please note that depending on the connected GigE Vision client, + parameter changes by other applications (e.g. the |webgui|) might not be noticed by the GigE Vision client, + which could lead to unwanted results. + +Category: AcquisitionControl +++++++++++++++++++++++++++++ + +.. index:: + pair: AcquisitionAlternateFilter; GenICam + +``AcquisitionAlternateFilter`` + - type: Enumeration, one of ``Off``, ``OnlyHigh`` or ``OnlyLow`` + - default: ``Off`` + - description: If this parameter is set to ``OnlyHigh`` (or ``OnlyLow``) and the ``LineSource`` + is set to ``ExposureAlternateActive`` for any output, then only camera images are delivered + that are captured while the output is high, i.e. a potentially connected projector is on (or + low, i.e. a potentially connected projector is off). This parameter is a simple means for only + getting images without projected pattern. The minimal time difference between camera and + disparity images will be about 40 ms in this case + (see :ref:`IOControl`:latex:`, Section \ref{iocontrol:sect-iocontrol-params}`). + +.. index:: + pair: AcquisitionMultiPartMode; GenICam + +``AcquisitionMultiPartMode`` + - type: Enumeration, one of ``SingleComponent`` or ``SynchronizedComponents`` + - default: ``SingleComponent`` + - description: Only effective in MultiPart mode. If this parameter is set to ``SingleComponent`` + the images are sent immediately as a single component per frame/buffer when they become available. + This is the same behavior as when MultiPart is not supported by the client. + If set to ``SynchronizedComponents`` all enabled components are time synchronized on the |rc_xxx| + and only sent (in one frame/buffer) when they are all available for that timestamp. + +.. index:: + pair: ExposureTimeAutoMax; GenICam + +``ExposureTimeAutoMax`` + - type: Float, ranges from 66 µs to 18000 µs + - default: 18000 µs + - description: Maximal exposure time in auto exposure mode + (:ref:`Max Exposure `:latex:`, Section \ref{stereo_camera:expl-exp-max}`). + +.. index:: + pair: ExposureRegionOffsetX; GenICam + +``ExposureRegionOffsetX`` + - type: Integer in the range of 0 to the maximum image width + - default: 0 + - description: Horizontal offset of :ref:`exposure region`:latex:`\:(Section \ref{stereo_camera:expl-exp-region})` in pixel. + +.. index:: + pair: ExposureRegionOffsetY; GenICam + +``ExposureRegionOffsetY`` + - type: Integer in the range of 0 to the maximum image height + - default: 0 + - description: Vertical offset of :ref:`exposure region`:latex:`\:(Section \ref{stereo_camera:expl-exp-region})` in pixel. + +.. index:: + pair: ExposureRegionWidth; GenICam + +``ExposureRegionWidth`` + - type: Integer in the range of 0 to the maximum image width + - default: 0 + - description: Width of :ref:`exposure region`:latex:`\:(Section \ref{stereo_camera:expl-exp-region})` in pixel. + +.. index:: + pair: ExposureRegionHeight; GenICam + +``ExposureRegionHeight`` + - type: Integer in the range of 0 to the maximum image height + - default: 0 + - description: Height of :ref:`exposure region`:latex:`\:(Section \ref{stereo_camera:expl-exp-region})` in pixel. + +.. index:: + pair: RcExposureAutoAverageMax; GenICam + +``RcExposureAutoAverageMax`` + - type: Float in the range of 0 to 1 + - default: 0.75 + - description: Maximum brightness for the :ref:`auto exposure function`:latex:`\:(Section \ref{stereo_camera:exp-auto-max-min-average})` + as value between 0 (dark) and 1 (bright). + +.. index:: + pair: RcExposureAutoAverageMin; GenICam + +``RcExposureAutoAverageMin`` + - type: Float in the range of 0 to 1 + - default: 0.25 + - description: Minimum brightness for the :ref:`auto exposure function`:latex:`\:(Section \ref{stereo_camera:exp-auto-max-min-average})` + as value between 0 (dark) and 1 (bright). + +Category: Scan3dControl ++++++++++++++++++++++++ + +.. index:: + pair: focal length factor; GenICam + pair: FocalLengthFactor; GenICam + +``FocalLengthFactor`` (read-only) + - type: Float + - description: The focal length scaled to an image width of 1 pixel. To get the focal length in pixels for a + certain image, this value must be multiplied by the width of the received image. See also parameter + ``Scan3dFocalLength``. + +.. index:: + pair: Baseline; GenICam + +``Baseline`` (read-only) + - type: Float + - description: This parameter is deprecated. The parameter ``Scan3dBaseline`` should be used instead. + +Category: DepthControl +++++++++++++++++++++++ + +.. index:: + pair: DepthAcquisitionMode; GenICam + +``DepthAcquisitionMode`` + - type: Enumeration, one of ``SingleFrame``, ``SingleFrameOut1`` or ``Continuous`` + - default: ``Continuous`` + - description: In single frame mode, stereo matching is performed upon each + call of ``DepthAcquisitionTrigger``. The ``SingleFrameOut1`` mode can be + used to control an external projector. It sets the line source of ``Out1`` to + ``ExposureAlternateActive`` upon each trigger and resets it to ``Low`` as soon + as the images for stereo matching are grabbed. In continuous mode, + stereo matching is performed continuously. + +.. index:: + pair: DepthAcquisitionTrigger; GenICam + +``DepthAcquisitionTrigger`` + - type: Command + - description: This command triggers stereo matching of the next available + stereo image pair, if ``DepthAcquisitionMode`` is set to ``SingleFrame`` or ``SingleFrameOut1``. + +.. index:: + pair: quality; GenICam + pair: DepthQuality; GenICam + +``DepthQuality`` + - type: Enumeration, one of ``Low``, ``Medium``, ``High``, or ``Full`` **(only with StereoPlus license)** + - default: ``High`` + - description: Quality of disparity images. Lower quality results in disparity + images with lower resolution + (:ref:`Quality `:latex:`, Section \ref{stereo_matching:expl-depth-quality}`). + +.. index:: + pair: double_shot; GenICam + pair: DepthDoubleShot; GenICam + +``DepthDoubleShot`` + - type: Boolean + - default: ``False`` + - description: ``True`` for improving the stereo matching result of a scene recorded with a projector by filling holes with depth information computed from images without projector pattern. + (:ref:`Double-Shot `:latex:`, Section \ref{stereo_matching:expl-depth-double-shot}`). + +.. index:: + pair: static_scene; GenICam + pair: DepthStaticScene; GenICam + +``DepthStaticScene`` + - type: Boolean + - default: ``False`` + - description: ``True`` for averaging 8 consecutive camera images for improving the stereo matching result. + (:ref:`Static `:latex:`, Section \ref{stereo_matching:expl-depth-static}`). + +.. index:: + pair: smooth; GenICam + pair: DepthSmooth; GenICam + +``DepthSmooth`` (read-only if StereoPlus license is not available) + - type: Boolean + - default: ``False`` + - description: ``True`` for advanced smoothing of disparity values. + (:ref:`Smoothing `:latex:`, Section \ref{stereo_matching:expl-depth-smooth}`). + +.. index:: + pair: fill-in; GenICam + pair: DepthFill; GenICam + +``DepthFill`` + - type: Integer, ranges from 0 pixel to 4 pixels + - default: 3 pixels + - description: Value in pixels for + :ref:`Fill-In `:latex:`\:(Section \ref{stereo_matching:expl-depth-fill})`. + +.. index:: + pair: segmentation; GenICam + pair: DepthSeg; GenICam + +``DepthSeg`` + - type: Integer, ranges from 0 pixel to 4000 pixels + - default: 200 pixels + - description: Value in pixels for + :ref:`Segmentation `:latex:`\:(Section \ref{stereo_matching:expl-depth-seg})`. + +.. index:: + pair: minimum confidence; GenICam + pair: DepthMinConf; GenICam + +``DepthMinConf`` + - type: Float, ranges from 0.0 to 1.0 + - default: 0.0 + - description: Value for :ref:`Minimum Confidence ` + filtering\ :latex:`\:(Section \ref{stereo_matching:expl-depth-min-conf})`. + +.. index:: + pair: minimum distance; GenICam + pair: DepthMinDepth; GenICam + +``DepthMinDepth`` + - type: Float, ranges from 0.1 m to 100.0 m + - default: 0.1 m + - description: Value in meters for :ref:`Minimum Distance ` + filtering\ :latex:`\:(Section \ref{stereo_matching:expl-depth-min-depth})`. + +.. index:: + pair: maximum distance; GenICam + pair: DepthMaxDepth; GenICam + +``DepthMaxDepth`` + - type: Float, ranges from 0.1m to 100.0 m + - default: 100.0 m + - description: Value in meters for :ref:`Maximum Distance ` + filtering\ :latex:`\:(Section \ref{stereo_matching:expl-depth-max-depth})`. + +.. index:: + pair: maximum depth error; GenICam + pair: DepthMaxDepthErr; GenICam + +``DepthMaxDepthErr`` + - type: Float, ranges from 0.01 m to 100.0 m + - default: 100.0 m + - description: Value in meters for :ref:`Maximum Depth Error ` + filtering\ :latex:`\:(Section \ref{stereo_matching:expl-depth-max-depth-err})`. + +.. _sect-chunk-data: + +Chunk data +^^^^^^^^^^ + +The |rc_xxx| supports chunk parameters that are transmitted with every +image. Chunk parameters all have the prefix ``Chunk``. Their meaning equals +their non-chunk counterparts, except that they belong to the corresponding +image, e.g. ``Scan3dFocalLength`` depends on ``ComponentSelector`` and +``DepthQuality`` as both can change the image resolution. The parameter +``ChunkScan3dFocalLength`` that is delivered with an image fits to the +resolution of the corresponding image. + +Particularly useful chunk parameters are: + +- ``ChunkComponentSelector`` selects for which component to extract the chunk + data in MultiPart mode. + +- ``ChunkComponentID`` and ``ChunkComponentIDValue`` provide the relation of + the image to its component (e.g. camera image or disparity image) without + guessing from the image format or size. + +- ``ChunkLineStatusAll`` provides the status of all GPIOs at the time of image + acquisition. See ``LineStatusAll`` above for a description of bits. + +- ``ChunkScan3d...`` parameters are useful for 3D reconstruction as described + in Section :ref:`sect-image-stream-conversions`:latex:`\:(Section \ref{gigevision:sect-image-stream-conversions})`. + +- ``ChunkPartIndex`` provides the index of the image part in this MultiPart + block for the selected component (``ChunkComponentSelector``). + +- ``ChunkRcOut1Reduction`` gives a ratio of how much the brightness of the images with GPIO Out1 LOW is + lower than the brightness of the images with GPIO Out1 HIGH. For example, a value of 0.2 means that the images with + GPIO Out1 LOW have 20% less brightness than the images with GPIO Out1 HIGH. This value is only available if + ``exp_auto_mode`` of the stereo camera is set to ``AdaptiveOut1`` or ``Out1High`` (:ref:`auto exposure mode `:latex:`, Section \ref{stereo_camera:expl-exp-auto-mode}`). + +Chunk data is enabled by setting the GenICam parameter ``ChunkModeActive`` to +``True``. + +.. _sect-provided-image-streams: + +Provided image streams +^^^^^^^^^^^^^^^^^^^^^^ + +The |rc_xxx| provides the following five different image streams via the GenICam interface: + +.. index:: + pair: Intensity; GenICam image stream + pair: IntensityCombined; GenICam image stream + pair: Disparity; GenICam image stream + pair: Error; GenICam image stream + pair: Confidence; GenICam image stream + pair: PixelFormat; GenICam + +.. tabularcolumns:: |p{30mm}|p{40mm}|p{30mm}|p{40mm}| + ++-----------------------+----------------------------------------+---------------------------------------------------------------------+ +| Component name | PixelFormat | Description | ++=======================+========================================+=====================================================================+ +| ``Intensity`` | | ``Mono8`` (monochrome cameras) | Left rectified camera image | +| | | ``YCbCr411_8`` (color cameras) | | ++-----------------------+----------------------------------------+---------------------------------------------------------------------+ +| ``IntensityCombined`` | | ``Mono8`` (monochrome cameras) | Left rectified camera image stacked on right rectified camera image | +| | | ``YCbCr411_8`` (color cameras) | | ++-----------------------+----------------------------------------+---------------------------------------------------------------------+ +| ``Disparity`` | ``Coord3D_C16`` | Disparity image in desired resolution, i.e., ``DepthQuality`` of | +| | | ``Full``, ``High``, ``Medium`` or ``Low`` | +| | | | +| | | | ++-----------------------+----------------------------------------+---------------------------------------------------------------------+ +| ``Confidence`` | ``Confidence8`` | Confidence image | ++-----------------------+----------------------------------------+---------------------------------------------------------------------+ +| ``Error`` | ``Error8`` (custom: 0x81080001) | Disparity error image | ++-----------------------+----------------------------------------+---------------------------------------------------------------------+ + +.. index:: + pair: timestamp; image + pair: timestamp; GenICam + +Each image comes with a buffer timestamp and the *PixelFormat* given in the above table. This PixelFormat +should be used to distinguish between the different image types. Images belonging to the same acquisition +timestamp can be found by comparing the GenICam buffer timestamps. + +.. _sect-image-stream-conversions: + +Image stream conversions +^^^^^^^^^^^^^^^^^^^^^^^^ + +.. index:: + pair: conversions; GenICam image stream + +The disparity image contains 16 bit unsigned integer values. These values must be multiplied by the scale value +given in the GenICam feature *Scan3dCoordinateScale* to get the disparity values :math:`d` in pixels. To +compute the 3D object coordinates from the disparity values, the focal length and the baseline as well as the +principle point are required. +These parameters are transmitted as GenICam features *Scan3dFocalLength*, *Scan3dBaseline*, +*Scan3dPrincipalPointU* and *Scan3dPrincipalPointV*. The focal length and principal point depend on the image +resolution of the selected component. +Knowing these values, the pixel coordinates and the disparities can be transformed into 3D +object coordinates in the camera coordinate frame +using the equations described in :ref:`sect-point-clouds`:latex:`\:(Section \ref{stereo_matching:sect-point-clouds})`. + +.. only:: rc_visard or rc_visard_ng + + .. note:: The |rc_xxx|'s camera coordinate frame is defined as shown in + :ref:`sensor coordinate frame`:latex:`\:(Section \ref{hardware_spec:sect-coordinate-frames})`. + +Assuming that :math:`d16_{ik}` is the 16 bit disparity value at column :math:`i` and row :math:`k` +of a disparity image, the float disparity in pixels :math:`d_{ik}` is given by + +.. math:: + + d_{ik}=d16_{ik} \cdot \mathrm{Scan3dCoordinateScale} + +The 3D reconstruction in meters can be written with the GenICam parameters as: + +.. math:: + + P_x&=\left(i+0.5-\mathrm{Scan3dPrincipalPointU}\right) \frac{\mathrm{Scan3dBaseline}}{d_{ik}},\\ + P_y&=\left(k+0.5-\mathrm{Scan3dPrincipalPointV}\right) \frac{\mathrm{Scan3dBaseline}}{d_{ik}},\\ + P_z&=\mathrm{Scan3dFocalLength} \frac{\mathrm{Scan3dBaseline}}{d_{ik}}. + +The confidence image contains 8 bit unsigned integer values. These values have to be divided by 255 to +get the confidence as value between 0 an 1. + +The error image contains 8 bit unsigned integer values. The error :math:`e_{ik}` must be multiplied +by the scale value given in the GenICam feature *Scan3dCoordinateScale* to get the disparity-error +values :math:`d_{eps}` in pixels. According to the description in +:ref:`sect-confidence-error`:latex:`\:(Section \ref{stereo_matching:sect-confidence-error})`, the +depth error :math:`z_{eps}` in meters can be computed with GenICam parameters as + +.. math:: + + d_{ik}&=d16_{ik} \cdot \mathrm{Scan3dCoordinateScale},\\ + z_{eps}&=\frac{e_{ik} \cdot \mathrm{Scan3dCoordinateScale} \cdot \mathrm{Scan3dFocalLength} + \cdot \mathrm{Scan3dBaseline}} + {(d_{ik})^2}. + +.. note:: It is preferable to enable chunk data with the parameter *ChunkModeActive* and to use + the chunk parameters *ChunkScan3dCoordinateScale*, *ChunkScan3dFocalLength*, + *ChunkScan3dBaseline*, *ChunkScan3dPrincipalPointU* and *ChunkScan3dPrincipalPointV* + that are delivered with every image, because their values already fit to the image + resolution of the corresponding image. + +For more information about disparity, error, and confidence images, please refer to +:ref:`sect-stereo-matching`:latex:`\:(Section \ref{stereo_matching:sect-stereo-matching})`. diff --git a/v24.04/de/_raw_sources/glossary.rst.txt b/v24.04/de/_raw_sources/glossary.rst.txt new file mode 100644 index 0000000..e5d29f4 --- /dev/null +++ b/v24.04/de/_raw_sources/glossary.rst.txt @@ -0,0 +1,302 @@ +.. include:: global_rst.glb + +.. raw:: latex + + \newpage + +.. _glossary: + +Glossary +======== + +.. only:: rc_visard + + .. glossary:: + :sorted: + + DHCP + The Dynamic Host Configuration Protocol (DHCP) is used to automatically assign an + :term:`IP` address to a network device. Some DHCP servers only accept known devices. + In this case, an administrator needs to configure the DHCP server with the + fixed :term:`MAC address` of a device. + + .. disparity + .. disparity image + .. Disparity is the displacement of the projections of an object point in two camera + .. images. If the images are :term:`rectified`, then the disparity is the difference + .. between the column index of the projection in the left image and the column index + .. of the projection in the right image. The disparity is inversely proportional to + .. the distance (i.e., depth) + .. of the object point from the camera and becomes 0 if the object point is at infinity. + .. A disparity image contains disparities for each pixel. + + DNS + mDNS + The Domain Name Server (DNS) manages the host names and :term:`IP` addresses of all + network devices. It is responsible for resolving the host name into the IP address for + communication with a device. A DNS can be configured to get this information + automatically when a device appears on a network or manually by an administrator. In + contrast, *multicast DNS* (mDNS) works without a central server by querying all devices + on a local network each time a host name needs to be resolved. mDNS is available by + default on Linux and Mac operating systems and is used when '.local' is appended to a host + name. + + DOF + The Degrees Of Freedom (DOF) are the number of independent parameters for translation + and rotation. In 3D space, 6DOF (i.e. three for translation and three rotation) are + sufficient to describe an arbitrary position and orientation. + + GenICam + GenICam is a generic standard interface for cameras. It serves as a unified interface + around other standards such as :term:`GigE Vision`, Camera Link, USB, etc. See + http://genicam.org for more information. + + GigE + Gigabit Ethernet (GigE) is a networking technology for transmitting data at + one gigabit per second. + + GigE Vision + GigE Vision\ |reg| is a standard for configuring cameras and transmitting images over a + :term:`GigE` network link. See http://gigevision.com for more information. + + IMU + An Inertial Measurement Unit (IMU) consists of three accelerometers and three gyroscopes + that measure the linear accelerations and the turn rates in all three dimensions. + + INS + An Inertial Navigation System (INS) is a 3D measurement system which uses inertial + measurements (accelerations and turn rates) to compute position and orientation information. + We refer to our combination of stereo vision and inertial navigation as stereo INS. + + IP + IP address + The Internet Protocol (IP) is a standard for sending data between devices in a computer + network. Every device requires an IP address, which must be unique in the network. + The IP address can be configured by :term:`DHCP`, :term:`Link-Local`, or manually. + + Link-Local + Link-Local is a technology where network devices associate themselves with an :term:`IP address` + from the 169.254.0.0/16 IP range and check if it is unique in the local network. + Link-Local can be used if + :term:`DHCP` is unavailable and manual IP configuration is not or cannot be done. + Link-Local is especially useful for connecting a network device directly to a + host computer. By default, Windows 10 reverts automatically to Link-Local if + DHCP is unavailable. Under Linux, Link-Local must be enabled manually in the network + manager. + + MAC address + The Media Access Control (MAC) address is a unique, persistent address for + networking devices. It is also known as the hardware address of a device. In contrast + to the :term:`IP address`, the MAC address is (normally) permanently given to + a device and does not change. + + NTP + The Network Time Protocol (NTP) is a TCP/IP protocol for synchronizing time over a network. + Basically a client requests the current time from a server, and uses it to set its own clock. + + PTP + The Precision Time Protocol (PTP, also known as IEEE1588) is a protocol which enables more precise + and robust clock synchronization than with NTP. + + .. pose + .. A pose represents an object's *position* and *orientation* + .. relative to some *reference coordinate system* or *reference frame*. + .. It can be described by means of a rotation and translation transformation + .. that brings the object from a reference pose to the observed pose. + .. This rotation transformation can be represented in different ways, e.g., + .. as a rotation matrix or a quaternion. + + .. rectification + .. rectified + .. Rectification is a transformation process for images. In a stereo camera setting, + .. both images are often projected onto a common plane with parallel optical axes. + .. The resulting rectified images are free of lens distortion. Moreover, + .. an object point in the scene is always projected into the same row in both images. + .. The column index will be the same if the object point is at infinity. For closer + .. objects, the column index in the right image will be smaller than in the left image. + + SDK + A Software Development Kit (SDK) is a collection of software development tools or + a collection of software components. + + SLAM + SLAM stands for Simultaneous Localization and Mapping and describes the process of + creating a map of an unknown environment and simultaneously updating the sensor pose + within the map. + + SGM + SGM stands for Semi-Global Matching and is a state-of-the-art stereo matching algorithm + which offers brief run times and a great accuracy, especially at object borders, fine + structures, and in weakly textured areas. + + TCP + The Tool Center Point (TCP) is the position of the tool at the end effector of + a robot. The position and orientation of the TCP determines the position and + orientation of the tool in 3D space. + + UDP + The User Datagram Protocol (UDP) is the minimal message-oriented transport + layer of the Internet Protocol (:term:`IP`) family. It uses a simple + connectionless transmission model with a minimum of protocol mechanism + such as integrity verification (via checksum). The |rc_xxx| uses UDP + for publishing its + :ref:`estimated dynamical states `:latex:`\:(Section + \ref{dynamics:sect-dynamics-streams})` + via the + :ref:`rc_dynamics interface `:latex:`\:(Section + \ref{rc_dynamics:sect-rc-dynamics-interface})`. + To receive this data, applications may use datagram sockets to + bind to the endpoint of the data transmission consisting of a combination + of an :term:`IP address` and a service port number such as + ``192.168.0.100:49500``, which is typically referred to as a + *destination* of an rc_dynamics data stream in this documentation. + + URI + URL + A Uniform Resource Identifier (URI) is a string of characters + identifying resources of the |rc_xxx|'s |restapi|. An example of such a + URI is ``/nodes/rc_camera/parameters/fps``, which points + to the ``fps`` run-time parameter of the stereo camera module. + + A Uniform Resource Locator (URL) additionally specifies the full + network location and protocol, i.e., an exemplary URL to locate the + above resource would be + ``https:///api/v1/nodes/rc_camera/parameters/fps`` + where ```` refers to the |rc_xxx|'s :term:`IP address`. + + XYZABC + Format to represent a pose. See :ref:`sect-xyzabc-format`:latex:`\:(Section \ref{pose_format_kuka:sect-xyzabc-format})` + for its definition. + + XYZ+quaternion + Format to represent a pose. See :ref:`sect-xyz-quaternion-format`:latex:`\:(Section \ref{pose_format_rt:sect-xyz-quaternion-format})` + for its definition. + + +.. only:: rc_cube or rc_visard_ng + + .. glossary:: + :sorted: + + DHCP + The Dynamic Host Configuration Protocol (DHCP) is used to automatically assign an + :term:`IP` address to a network device. Some DHCP servers only accept known devices. + In this case, an administrator needs to configure the DHCP server with the + fixed :term:`MAC address` of a device. + + .. disparity + .. disparity image + .. Disparity is the displacement of the projections of an object point in two camera + .. images. If the images are :term:`rectified`, then the disparity is the difference + .. between the column index of the projection in the left image and the column index + .. of the projection in the right image. The disparity is inversely proportional to + .. the distance (i.e., depth) + .. of the object point from the camera and becomes 0 if the object point is at infinity. + .. A disparity image contains disparities for each pixel. + + DNS + mDNS + The Domain Name Server (DNS) manages the host names and :term:`IP` addresses of all + network devices. It is responsible for resolving the host name into the IP address for + communication with a device. A DNS can be configured to get this information + automatically when a device appears on a network or manually by an administrator. In + contrast, *multicast DNS* (mDNS) works without a central server by querying all devices + on a local network each time a host name needs to be resolved. mDNS is available by + default on Linux and Mac operating systems and is used when '.local' is appended to a host + name. + + DOF + The Degrees Of Freedom (DOF) are the number of independent parameters for translation + and rotation. In 3D space, 6 DOF (i.e. three for translation and three rotation) are + sufficient to describe an arbitrary position and orientation. + + GenICam + GenICam is a generic standard interface for cameras. It serves as a unified interface + around other standards such as :term:`GigE Vision`, Camera Link, USB, etc. See + http://genicam.org for more information. + + GigE + Gigabit Ethernet (GigE) is a networking technology for transmitting data at + one gigabit per second. + + GigE Vision + GigE Vision\ |reg| is a standard for configuring cameras and transmitting images over a + :term:`GigE` network link. See http://gigevision.com for more information. + + IP + IP address + The Internet Protocol (IP) is a standard for sending data between devices in a computer + network. Every device requires an IP address, which must be unique in the network. + The IP address can be configured by :term:`DHCP`, :term:`Link-Local`, or manually. + + Link-Local + Link-Local is a technology where network devices associate themselves with an :term:`IP address` + from the 169.254.0.0/16 IP range and check if it is unique in the local network. + Link-Local can be used if + :term:`DHCP` is unavailable and manual IP configuration is not or cannot be done. + Link-Local is especially useful for connecting a network device directly to a + host computer. By default, Windows 10 reverts automatically to Link-Local if + DHCP is unavailable. Under Linux, Link-Local must be enabled manually in the network + manager. + + MAC address + The Media Access Control (MAC) address is a unique, persistent address for + networking devices. It is also known as the hardware address of a device. In contrast + to the :term:`IP address`, the MAC address is (normally) permanently given to + a device and does not change. + + NTP + The Network Time Protocol (NTP) is a TCP/IP protocol for synchronizing time over a network. + Basically a client requests the current time from a server, and uses it to set its own clock. + + .. pose + .. A pose represents an object's *position* and *orientation* + .. relative to some *reference coordinate system* or *reference frame*. + .. It can be described by means of a rotation and translation transformation + .. that brings the object from a reference pose to the observed pose. + .. This rotation transformation can be represented in different ways, e.g., + .. as a rotation matrix or a quaternion. + + .. rectification + .. rectified + .. Rectification is a transformation process for images. In a stereo camera setting, + .. both images are often projected onto a common plane with parallel optical axes. + .. The resulting rectified images are free of lens distortion. Moreover, + .. an object point in the scene is always projected into the same row in both images. + .. The column index will be the same if the object point is at infinity. For closer + .. objects, the column index in the right image will be smaller than in the left image. + + SDK + A Software Development Kit (SDK) is a collection of software development tools or + a collection of software components. + + SGM + SGM stands for Semi-Global Matching and is a state-of-the-art stereo matching algorithm + which offers short run times and a great accuracy, especially at object borders, fine + structures, and in weakly textured areas. + + TCP + The Tool Center Point (TCP) is the position of the tool at the end effector of + a robot. The position and orientation of the TCP determines the position and + orientation of the tool in 3D space. + + URI + URL + A Uniform Resource Identifier (URI) is a string of characters + identifying resources of the |rc_xxx|'s |restapi|. An example of such a + URI is ``/nodes/rc_camera/parameters/fps``, which points + to the ``fps`` run-time parameter of the stereo camera module. + + A Uniform Resource Locator (URL) additionally specifies the full + network location and protocol, i.e., an exemplary URL to locate the + above resource would be + ``https:///api/v1/nodes/rc_camera/parameters/fps`` + where ```` refers to the |rc_xxx|'s :term:`IP address`. + + XYZABC + Format to represent a pose. See :ref:`sect-xyzabc-format`:latex:`\:(Section \ref{pose_format_kuka:sect-xyzabc-format})` + for its definition. + + XYZ+quaternion + Format to represent a pose. See :ref:`sect-xyz-quaternion-format`:latex:`\:(Section \ref{pose_format_rt:sect-xyz-quaternion-format})` + for its definition. diff --git a/v24.04/de/_raw_sources/gripper_db.rst.txt b/v24.04/de/_raw_sources/gripper_db.rst.txt new file mode 100644 index 0000000..1dbcf2f --- /dev/null +++ b/v24.04/de/_raw_sources/gripper_db.rst.txt @@ -0,0 +1,331 @@ +.. include:: global_rst.glb + +.. _sect-gripper-db: + +GripperDB +========= + +.. index:: ! GripperDB + single: collision check + +Introduction +------------ + +The GripperDB module (gripper database module) is an optional on-board module of the |rcxxx| and is licensed with +any of the modules |pick_modules| or |match_modules|. +Otherwise it requires a separate CollisionCheck :ref:`license` +:latex:`(Section \ref{maintenance:sect-updating-license})` to be purchased. + +The module provides services to set, retrieve and delete grippers which can then be used +for checking collisions with a load carrier or other detected objects +(only in combination with |match_modules|). The specified grippers are available for all +modules supporting collision checking on the |rc_xxx|. + +.. only:: rc_cube + + .. note:: + + This module is global on the |rc_cube|. Changes to its settings or parameters affect + every camera pipeline running on the |rc_cube|. + +.. tabularcolumns:: |l|L| +.. _tab-collisioncheck-spec: +.. csv-table:: Specifications of the GripperDB module + + "Max. number of grippers", "50" + "Supported gripper element geometries", "Box, Cylinder, CAD Element" + "Max. number of elements per gripper", "15" + "Collision checking available in", "|pick_modules|, |match_modules|" + +.. _sect-gripper-db-gripper: + +Setting a gripper +------------------ + +The gripper is a collision geometry used to determine whether the grasp is in collision with the load carrier. +The gripper consists of up to 15 elements connected to each other. + +At this point, the gripper can be built of elements of the following types: + + - ``BOX``, with dimensions ``box.x``, ``box.y``, ``box.z``. + - ``CYLINDER``, with radius ``cylinder.radius`` and height ``cylinder.height``. + - ``CAD``, with the id ``cad.id`` of the chosen CAD element. + +Additionally, for each gripper the flange radius, and information about the Tool Center Point (TCP) have to +be defined. + +The configuration of the gripper is normally performed offline during the setup of the desired application. +This can be done via the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` or the |rcxxx| +:ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})`. + +.. _sect-collisioncheck-flange: + +Robot flange radius +^^^^^^^^^^^^^^^^^^^ + +Collisions are checked only with the gripper, the robot body is not considered. +As a safety feature, to prevent collisions between the load carrier and the robot, all grasps having any part of the +robot's flange inside the load carrier can be designated as colliding (see :numref:`fig-collision-check-gripper-flange-radius`). +This check is based on the defined gripper geometry and the flange radius value. It is optional to use +this functionality, and it can be turned on and off with the CollisionCheck module's run-time parameter ``check_flange`` as described +in :ref:`sect-collisioncheck-parameters`:latex:`\:(Section \ref{collisioncheck:sect-collisioncheck-parameters})`. + +.. _fig-collision-check-gripper-flange-radius: +.. figure:: images/check_flange.* + :width: 50% + :align: center + + Case A would be marked as collision only if ``check_flange`` is true, because the robot's flange (red) is inside the + load carrier. Case B is collision free independent of ``check_flange``. + + +.. _sect-collisioncheck-cad-elements: + +Uploading gripper CAD elements +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A gripper can consist of boxes, cylinders and CAD elements. While boxes and cylinders can be parameterized when +the gripper is created, the CAD elements must be uploaded beforehand to be available during gripper creation. +A CAD element can be uploaded via the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` as described +in Section :ref:`sect-collisioncheck-cad-element-upload`:latex:`\:(Section \ref{gripper_db:sect-collisioncheck-cad-element-upload})` +or via the |rcxxx| :ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})`. +Supported file formats are STEP (\*.stp, \*.step), STL (\*.stl), OBJ (\*.obj) and PLY (\*.ply). +The maximum file size to be uploaded is limited to :visardonly:`10` :ngonly:`30` :cubeonly:`30` MB. +The files are internally converted to PLY and, if necessary, simplified. +The CAD elements can be referenced during gripper creation by their ID. + +.. _sect-collisioncheck-gripper-creation: + +Creating a gripper via the |rest-api| or the |webgui| +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When creating a gripper via the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` or the +:ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})`, +each element of the gripper has a `parent` element, which defines how they are connected. +The gripper is always built in the direction from the robot flange to the TCP, and at least one element must +have 'flange' as parent. The elements' IDs must be unique and must not be 'tcp' or 'flange'. +The pose of the child element has to be given in the coordinate frame of the parent element. +The coordinate frame of an element is always in its +geometric center. Accordingly, for a child element to be exactly below the parent element, the position of +the child element must be computed from the heights of both parent and child element +(see :numref:`fig-collision-check-gripper-frames-restapi`). + +.. _fig-collision-check-gripper-frames-restapi: +.. figure:: images/gripper_frames_restapi.* + :width: 50% + :align: center + + Reference frames for gripper creation via the |rest-api| and the |webgui| + +In case a CAD element is used, the element's origin is defined in the CAD data and is not necessarily located +in the center of the element's bounding box. + +It is recommended to create a gripper via the |webgui|, because it provides a 3D visualization of the +gripper geometry and also allows to automatically attach the child element to the bottom of its parent element, when the +corresponding option for this element is activated. In this case, the elements also stay attached when +any of their sizes change. Automatic attachment of CAD elements uses the element's bounding box as reference. +Automatic attachment is only possible when the child element is not rotated around the x or y axis with respect to its parent. + +The reference frame for the first element for the gripper creation is always the center of the robot's flange +with the z axis pointing outwards. It is possible to create a gripper with a tree structure, +corresponding to multiple elements having the same parent element, as long as they are all connected. + +Calculated TCP position +^^^^^^^^^^^^^^^^^^^^^^^ + +After gripper creation via the ``set_gripper`` service call, the TCP position in the flange coordinate +system is calculated and returned as ``tcp_pose_flange``. +It is important to check if this value is the same as the robot's true TCP position. When creating a +gripper in the |webgui| the current TCP position is always displayed in the 3D gripper visualization. + +Creating rotationally asymmetric grippers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +For grippers which are not rotationally symmetric around the z axis, it is crucial to ensure that the gripper is properly mounted, +so that the representation stored in the GripperDB module corresponds to reality. + +.. _sect-collisioncheck-services: + +Services +-------- + +The GripperDB module is called ``rc_gripper_db`` in the |rest-api| and is represented in the +:ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})` under +:menuselection:`Database --> Grippers`. +The user can explore and call the GripperDB module's services, +e.g. for development and testing, using the +:doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` or +the |webgui|. + +The GripperDB module offers the following services. + +.. _expl-gripper-db-srv-set-gripper: + +``set_gripper`` +^^^^^^^^^^^^^^^ + + Persistently stores a gripper on the |rc_xxx|. + All configured grippers are persistent over firmware updates and rollbacks. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v2/nodes/rc_gripper_db/services/set_gripper + + .. tabs:: + + .. tab:: **Request** + + Required arguments: + + ``elements``: list of geometric elements for the gripper. + Each element must be of ``type`` 'CYLINDER' or 'BOX' with the corresponding dimensions in + the ``cylinder`` or ``box`` field, or of type 'CAD' with the corresponding ``id`` in the ``cad`` field. + The pose of each element must be given in the coordinate frame + of the parent element (see :ref:`sect-gripper-db-gripper`:latex:`\:(Section \ref{gripper_db:sect-gripper-db-gripper})` + for an explanation of the coordinate frames). The element's ``id`` must be unique and must not be + 'tcp' or 'flange'. The ``parent_id`` is the ID of the parent element. It can either be 'flange' + or it must correspond to another element in list. + + ``flange_radius``: radius of the flange used in case the ``check_flange`` run-time parameter is active. + + ``id``: unique name of the gripper + + ``tcp_parent_id``: ID of the element on which the TCP is defined + + ``tcp_pose_parent``: The pose of the TCP with respect to the coordinate frame of the element specified in ``tcp_parent_id``. + + .. include:: _gen/nodes/services/rc_collision_check_set_gripper_request.txt + + .. tab:: **Response** + + ``gripper``: returns the gripper as defined in the request with an additional field ``tcp_pose_flange``. + This gives the coordinates of the TCP in the flange coordinate frame for comparison with the true + settings of the robot's TCP. + + ``return_code``: holds possible warnings or error codes and messages. + + .. include:: _gen/nodes/services/rc_collision_check_set_gripper_response.txt + +.. _expl-gripper-db-srv-get-grippers: + +``get_grippers`` +^^^^^^^^^^^^^^^^ + + Returns the configured grippers with the requested ``gripper_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v2/nodes/rc_gripper_db/services/get_grippers + + .. tabs:: + + .. tab:: **Request** + + If no ``gripper_ids`` are provided, all configured grippers are returned. + + .. include:: _gen/nodes/services/rc_collision_check_get_grippers_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_collision_check_get_grippers_response.txt + +.. _expl-gripper-db-srv-delete-grippers: + +``delete_grippers`` +^^^^^^^^^^^^^^^^^^^ + + Deletes the configured grippers with the requested ``gripper_ids``. + + .. toggle-header:: + :header: **Details** + + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v2/nodes/rc_gripper_db/services/delete_grippers + + .. tabs:: + + .. tab:: **Request** + + All grippers to be deleted must be explicitly stated in ``gripper_ids``. + + .. include:: _gen/nodes/services/rc_collision_check_delete_grippers_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_collision_check_delete_grippers_response.txt + + +.. _sect-gripper-db-return-codes: + +Return codes +------------ + +.. index:: + pair: GripperDB; return codes + + +Each service response contains a ``return_code``, +which consists of a ``value`` plus an optional ``message``. +A successful service returns with a ``return_code`` value of ``0``. +Negative ``return_code`` values indicate that the service failed. +Positive ``return_code`` values indicate that the service succeeded with additional information. +The smaller value is selected in case a service has multiple ``return_code`` values, +but all messages are appended in the ``return_code`` message. + +The following table contains a list of common codes: + +.. tabularcolumns:: |c|L| +.. _tab-collisioncheck-return-codes: +.. csv-table:: Return codes of the GripperDB services + :header: Code, Description + + "0", "Success" + "-1", "An invalid argument was provided" + "-7", "Data could not be read or written to persistent storage" + "-9", "No valid license for the module" + "-10", "New gripper could not be added as the maximum storage capacity of grippers has been exceeded" + "10", "The maximum storage capacity of grippers has been reached" + "11", "Existing gripper was overwritten" + +.. _sect-collisioncheck-cad-element-upload: + +CAD element API +--------------- + +.. index:: + single: gripper CAD element api + single: gripper CAD element download + single: gripper CAD element upload + single: gripper CAD element deletion + +For gripper CAD element upload, download, listing and removal, special |rest-api| endpoints are provided. +CAD elements can also be uploaded, downloaded and removed via the |webgui|. +Up to 50 CAD elements can be stored persistently on the |rc_xxx|. + +The maximum file size to be uploaded is limited to :visardonly:`10` :cubeonly:`30` MB. + +.. only:: rc_visard + + .. include:: _gen/swagger/rc_visard/cad.txt + +.. only:: rc_visard_ng + + .. include:: _gen/swagger/rc_visard_ng/cad.txt + +.. only:: rc_cube + + .. include:: _gen/swagger/rc_cube/cad.txt diff --git a/v24.04/de/_raw_sources/grpc.rst.txt b/v24.04/de/_raw_sources/grpc.rst.txt new file mode 100644 index 0000000..edc325b --- /dev/null +++ b/v24.04/de/_raw_sources/grpc.rst.txt @@ -0,0 +1,83 @@ +.. include:: global_rst.glb + +.. _sect-grpc: + +gRPC image stream interface +=========================== + +.. index:: + single: gRPC + +The gRPC image streaming interface can be used as an alternative to the +:ref:`GigE Vision / GenICam interface `:latex:`\ (Section \ref{gigevision:sect-genicam})` +for getting camera images and synchronized sets of images (e.g. left camera +image and corresponding disparity image). `gRPC `_ is a +remote procedure call system that also +supports streaming. It uses `Protocol Buffers `_ +(see https://developers.google.com/protocol-buffers/) +as interface description language and data serialization. For a gRPC +introduction and more details please see the official website (https://grpc.io/). + +The advantages of the gRPC interface in comparison to GigE Vision are: + + * It is simpler to use in own programs than GigE Vision. + * There is gRPC support for a lot of programming languages (see https://grpc.io/). + * The communication is based on TCP instead of UDP and therefore it also works over less stable networks, e.g. WLAN. + +The disadvantages of the gRPC interface in comparison to GigE Vision are: + + * It does not support changing parameters, but the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` can be used for changing parameters. + * It is not a standard vision interface like GigE Vision. + +.. only:: rc_cube + + The |rc_xxx| provides synchronized image sets via gRPC server side streams on + a separate port for each pipeline. The port is 50051 + pipeline number, + so 50051 for pipeline 0, 50052 for pipeline 1, etc. + +.. only:: rc_visard or rc_visard_ng + + The |rc_xxx| provides synchronized image sets via gRPC server side streams on + port 50051. + +The communication is started by sending an ``ImageSetRequest`` +message to the server. The message contains the information about requested +images, i.e. left, right, disparity, confidence and disparity_error images can +be enabled separately. + +After getting the request, the server starts continuously sending ``ImageSet`` +messages that contain all requested images with all parameters necessary for +interpreting the images. The images that are contained in an ``ImageSet`` +message are synchronized, i.e. they are all captured at the same time. The only +exception to this rule is if the +:ref:`out1_mode `:latex:`\ (Section \ref{iocontrol:expl-iocontrol-out1-mode})` +is set to ``AlternateExposureActive``. In this case, the camera and disparity +images are taken 40 ms apart, so that the GPIO Out1 is LOW when the +left and right images are taken, and HIGH for the disparity, confidence and +error images. This mode is useful when a random dot projector is used, +because the projector would be off for capturing the left and +right image, and on for the disparity image, which results in undisturbed camera +images and a much denser and more accurate disparity image. + +Streaming of images is done until the client closes the connection. + +gRPC service definition +----------------------- + +.. _protobuf-image-interface: + +.. literalinclude:: _protobuf/image_interface.proto + :language: protobuf + +Image stream conversions +------------------------ + +The conversion of disparity images into a point cloud can be done as described in the +:ref:`GigE Vision / GenICam interface `:latex:`\ (Section \ref{gigevision:sect-image-stream-conversions})`. + +.. only:: roboception or schunk or matrixvision + + Example client + -------------- + + A simple example C++ client can be found at https://github.com/roboception/grpc_image_client_example. diff --git a/v24.04/de/_raw_sources/handeye_calibration.rst.txt b/v24.04/de/_raw_sources/handeye_calibration.rst.txt new file mode 100644 index 0000000..b0cb9f9 --- /dev/null +++ b/v24.04/de/_raw_sources/handeye_calibration.rst.txt @@ -0,0 +1,1235 @@ + +.. include:: global_rst.glb + +.. _sect-handeye-calibration: + +Hand-eye calibration +==================== + +.. index:: + pair: hand-eye calibration; robot frame + pair: hand-eye calibration; external reference frame + +For applications, in which the camera is integrated into one or more +robot systems, it needs to be calibrated w.r.t. some robot +reference frames. For this purpose, the |rcxxx| is shipped with an on-board +calibration routine called the *hand-eye calibration* module. It is a base +module which is available on every |rcxxx|. + +.. only:: rc_cube + + .. note:: + + This module is pipeline specific. Changes to its settings or parameters only affect + the respective camera pipeline and have no influence on other pipelines running on the |rc_cube|. + +.. note:: The implemented calibration routine is + completely agnostic about the user-defined robot frame to which the camera is + calibrated. It might be a robot's end-effector (e.g., flange or tool + center point) or any point on the robot structure. + The method's only requirement is that the pose (i.e., translation and + rotation) of this robot + frame w.r.t. a user-defined external reference frame (e.g., world or robot + mounting point) is exactly observable by the robot controller and can be + reported to the calibration module. + +The +:ref:`sect-handeye-calibration-procedure` +:latex:`\:(Section \ref{handeye_calibration:sect-handeye-calibration-procedure})` +itself is an easy-to-use multi-step procedure using +a calibration grid which can be obtained from |company|. + +Calibration interfaces +---------------------- + +The following two interfaces are offered to conduct hand-eye +calibration: + +#. All services and parameters of this module required to conduct the + hand-eye calibration **programmatically** are exposed by the |rcxxx|'s + :ref:`sect-rest-api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`. + The respective node name of this module is ``rc_hand_eye_calibration`` + and the respective service calls are documented + :ref:`sect-handeye-calibration-services`:latex:`\:(Section \ref{handeye_calibration:sect-handeye-calibration-services})`. + + .. note:: The described approach requires a network connection + between the |rcxxx| and the robot controller to + pass robot poses from the controller to the |rcxxx|'s + calibration module. + +#. For use cases where robot poses cannot be passed programmatically to the + |rcxxx|'s hand-eye calibration module, the + :ref:`Web GUI`'s *Hand-Eye Calibration* page under *Configuration* + :cubeonly:`in the desired pipeline` + offers a guided + process to conduct the calibration routine **manually**. + + .. note:: During the process, the described approach requires the user to + manually enter into the |webgui| robot poses, which need to be accessed + from the respective robot-teaching or handheld device. + + +.. _sect-handeyecalib-mounting: + +Camera mounting +--------------- + +.. index:: + pair: hand-eye calibration; mounting + +As illustrated in :numref:`fig-sketch-handeyecalib-robot-mounted` and +:numref:`fig-sketch-handeyecalib-static`, two different use +cases w.r.t. to the mounting of the camera generally have to be considered: + +a. The camera is **mounted on the robot**, i.e., it is mechanically fixed + to a robot link (e.g., at its flange or a flange-mounted tool), and + hence moves with the robot. + +#. The camera is not mounted on the robot but is fixed + to a table or other place in the robot's vicinity and remains at a **static** position + w.r.t. the robot. + +While the general +:ref:`sect-handeye-calibration-procedure`:latex:`\:(Section +\ref{handeye_calibration:sect-handeye-calibration-procedure})` is very similar +in both use cases, +the calibration process's output, i.e., the resulting calibration transform, +will be semantically different, and the fixture of the calibration grid +will also differ. + + +Calibration with a robot-mounted camera + When calibrating a robot-mounted camera with the robot, the calibration + grid has to be secured in a static position w.r.t. the robot, e.g., on a table + or some other fixed-base coordinate system as sketched in + :numref:`fig-sketch-handeyecalib-robot-mounted`. + + .. warning:: It is extremely important that the calibration grid does not move + during step 2 of the + :ref:`sect-handeye-calibration-procedure`:latex:`\:(Section + \ref{handeye_calibration:sect-handeye-calibration-procedure})`. + Securely fixing its position + to prevent unintended movements such as those caused by + vibrations, moving cables, or the like is therefore strongly + recommended. + + The result of the calibration (step 3 of the + :ref:`sect-handeye-calibration-procedure`:latex:`, Section + \ref{handeye_calibration:sect-handeye-calibration-procedure}`) is a pose + :math:`\mathbf{T}^{\text{robot}}_{\text{camera}}` describing the + (previously unknown) relative positional and rotational transformation + from the *camera* frame into the user-selected *robot* frame such that + + .. math:: + :label: handeye-calib-robotmounted-result + + \mathbf{p}_{\text{robot}} = + \mathbf{R}^{\text{robot}}_{\text{camera}} + \cdot \mathbf{p}_{\text{camera}} + + \mathbf{t}^{\text{robot}}_{\text{camera}} + \:, + + where :math:`\mathbf{p}_{\text{robot}} = (x,y,z)^T` is a 3D point + with its coordinates expressed in the *robot* frame, + :math:`\mathbf{p}_{\text{camera}}` is the same point represented in the + *camera* coordinate frame, and :math:`\mathbf{R}^{\text{robot}}_{\text{camera}}` + as well as :math:`\mathbf{t}^{\text{robot}}_{\text{camera}}` are the + corresponding :math:`3\times 3` rotation matrix and :math:`3\times 1` + translation vector of the pose :math:`\mathbf{T}^{\text{robot}}_{\text{camera}}`, + respectively. In practice, in the calibration result and in the provided robot + poses, the rotation is defined by Euler angles or as quaternion instead of + a rotation matrix (see :ref:`sect-pose-formats`:latex:`,\:Section \ref{appendix:sect-pose-formats}`). + + .. _fig-sketch-handeyecalib-robot-mounted: + .. figure:: images/sketch_handeye_calib_robotmounted.* + :width: 60 % + :align: center + + Important frames and transformations for calibrating a camera that + is mounted on a general robot. The camera is mounted with a fixed relative + position to a user-defined *robot* frame (e.g., flange or TCP). It is + important that the pose :math:`\mathbf{T}^{\text{ext}}_{\text{robot}}` of + this *robot* frame w.r.t. a user-defined external reference frame *ext* + is observable during the calibration routine. The result of the calibration + process is the desired calibration transformation + :math:`\mathbf{T}^{\text{robot}}_{\text{camera}}`, i.e., the pose of the + *camera* frame within the user-defined *robot* frame. + + Additional user input is required if the movement of the robot is constrained and + the robot can rotate the Tool Center Point (TCP) only + around one axis. This is typically the case for robots with four Degrees Of + Freedom (4DOF) that are often used for palletizing tasks. In this case, + the user must specify which axis of the *robot* frame is the rotation axis of the TCP. + Further, the signed offset from the TCP to the + *camera* coordinate system along the TCP rotation axis has to be provided. + :numref:`fig-sketch-handeyecalib-robot-mounted-4dof` illustrates the situation. + + .. only:: rc_visard or rc_visard_ng + + For the |rc_xxx|, the camera coordinate system is located in the optical + center of the left camera. The approximate location is given in section + :ref:`sect-coordinate-frames`:latex:`\:(Section \ref{hardware_spec:sect-coordinate-frames})`. + + .. only:: rc_cube + + For the |rc_visard| or |rc_visard_ng|, the camera coordinate system is located in the optical + center of the left camera. The approximate location is given in section + `Coordinate Frames `_. + + .. _fig-sketch-handeyecalib-robot-mounted-4dof: + .. figure:: images/sketch_handeye_calib_robotmounted_4dof.* + :width: 60 % + :align: center + + In case of a 4DOF robot, the TCP rotation axis and the offset from the + TCP to the camera + coordinate system along the TCP rotation axis must be provided. + In the illustrated case, this offset is negative. + +Calibration with a statically-mounted camera + In use cases where the camera is positioned statically w.r.t. the + robot, the calibration grid needs to be mounted to the robot as + shown for example in :numref:`fig-sketch-handeyecalib-static` and + :numref:`fig-sketch-handeyecalib-gridmount`. + + .. note:: The hand-eye calibration module is + completely agnostic about the exact mounting and positioning of the + calibration grid w.r.t. the user-defined *robot* frame. That means, + the relative positioning of the calibration grid to + that frame neither needs to + be known, nor it is relevant for the calibration routine, as shown in + :numref:`fig-sketch-handeyecalib-gridmount`. + + .. warning:: + It is extremely important that the calibration grid is attached + securely to the robot such that it does + not change its relative position w.r.t. the user-defined *robot* frame + during step 2 of the :ref:`sect-handeye-calibration-procedure`:latex:`\:(Section + \ref{handeye_calibration:sect-handeye-calibration-procedure})`. + + In this use case, the result of the calibration (step 3 of the + :ref:`sect-handeye-calibration-procedure`:latex:`, Section + \ref{handeye_calibration:sect-handeye-calibration-procedure}`) is the pose + :math:`\mathbf{T}^{\text{ext}}_{\text{camera}}` + describing the + (previously unknown) relative positional and rotational transformation + between the *camera* frame and the user-selected external reference frame *ext* + such that + + .. math:: + :label: handeye-calib-static-result + + \mathbf{p}_{\text{ext}} = + \mathbf{R}^{\text{ext}}_{\text{camera}} + \cdot \mathbf{p}_{\text{camera}} + + \mathbf{t}^{\text{ext}}_{\text{camera}} + \:, + + where :math:`\mathbf{p}_{\text{ext}} = (x,y,z)^T` is a 3D point + with its coordinates expressed in the external reference frame *ext*, + :math:`\mathbf{p}_{\text{camera}}` is the same point represented in the + *camera* coordinate frame, and :math:`\mathbf{R}^{\text{ext}}_{\text{camera}}` + as well as :math:`\mathbf{t}^{\text{ext}}_{\text{camera}}` are the + corresponding :math:`3\times 3` rotation matrix and :math:`3\times 1` + translation vector of the pose :math:`\mathbf{T}^{\text{ext}}_{\text{camera}}`, + respectively. In practice, in the calibration result and in the provided robot + poses, the rotation is defined by Euler angles or as quaternion instead of + a rotation matrix (see :ref:`sect-pose-formats`:latex:`,\:Section \ref{appendix:sect-pose-formats}`). + + .. _fig-sketch-handeyecalib-static: + .. figure:: images/sketch_handeye_calib_static.* + :width: 60 % + :align: center + + Important frames and transformations for calibrating a + statically mounted camera: The latter is mounted with a fixed + position relative to a user-defined external reference frame *ext* (e.g., + the world coordinate frame or the robot's mounting point). It is + important that the pose :math:`\mathbf{T}^{\text{ext}}_{\text{robot}}` of the + user-defined *robot* frame w.r.t. this frame + is observable during the calibration routine. The result of the calibration + process is the desired calibration transformation + :math:`\mathbf{T}^{\text{ext}}_{\text{camera}}`, i.e., the pose of the + *camera* frame in the user-defined external reference frame *ext*. + + .. _fig-sketch-handeyecalib-gridmount: + .. figure:: images/sketch_handeye_calib_gridmount.* + :width: 60 % + :align: center + + Alternate mounting options for attaching the + calibration grid to the robot + + Additional user input is required if the movement of the robot is constrained and + the robot can rotate the Tool Center Point (TCP) only + around one axis. This is typically the case for robots with four Degrees Of + Freedom (4DOF) that are often used for palletizing tasks. In this case, + the user must specify which axis of the *robot* frame is the rotation axis of the TCP. + Further, the signed offset from the TCP to the + visible surface of the calibration grid along the TCP rotation axis has to be provided. + The grid must be mounted such that the TCP rotation axis is orthogonal to the grid. + :numref:`fig-sketch-handeyecalib-robot-static-4dof` illustrates the situation. + + .. _fig-sketch-handeyecalib-robot-static-4dof: + .. figure:: images/sketch_handeye_calib_static_4dof.* + :width: 60 % + :align: center + + In case of a 4DOF robot, the TCP rotation axis and the offset from the + TCP to the visible surface of the grid along the TCP rotation axis must + be provided. In the illustrated case, this offset is negative. + + +.. _sect-handeye-calibration-procedure: + +Calibration routine +------------------- + +.. index:: + pair: hand-eye calibration; calibration + +The hand-eye calibration can be performed manually using the +:doc:`webgui`:latex:`\:(Section \ref{webgui:sect-web-gui})` or programmatically +via the :ref:`sect-rest-api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`. +The general calibration routine will be described by following the steps of the +hand-eye calibration wizard provided on the |webgui|. +This wizard can be found in the |rc_xxx|'s |webgui| :cubeonly:`in the desired pipeline` +under :menuselection:`Configuration --> Hand-Eye Calibration`. References +to the corresponding |rest-api| calls are provided at the appropriate places. + +Step 1: Hand-Eye Calibration Status +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +The starting page of the hand-eye calibration wizard shows the current status +of the hand-eye calibration. +If a hand-eye calibration is saved on the |rc_xxx|, the calibration transformation is displayed here +(see :numref:`fig-handeyecalib-webgui1`). + + .. _fig-handeyecalib-webgui1: + .. figure:: images/webgui_hand_eye_calib1_calib.png + :width: 100 % + :align: center + + Current status of the hand-eye calibration in case a hand-eye calibration is saved + +To query the hand-eye calibration status programmatically, the module's |restapi| +offers the ``get_calibration`` service call (see +:ref:`sect-handeye-calibration-services`:latex:`, Section \ref{handeye_calibration:sect-handeye-calibration-services}`). +An existing hand-eye calibration can be removed by pressing +:guilabel:`Remove Calibration` or using ``remove_calibration`` in the |rest-api| (see +:ref:`sect-handeye-calibration-services`:latex:`, Section \ref{handeye_calibration:sect-handeye-calibration-services}`). + +To start a new hand-eye calibration, click on :guilabel:`Perform Hand-Eye Calibration` or :guilabel:`Next`. + +Step 2: Checking Grid Detection +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To achieve good calibration results, the images should be +well exposed so that the calibration +grid can be detected accurately and reliably. In this step, the +grid detection can be checked and the camera settings +can be adjusted if necessary. In case parts of the calibration grid +are overexposed, the respective squares of the calibration grid will be +highlighted in red. A successful grid detection is visualized +by green check marks on every square of the calibration grid and a thick green +border around the grid as shown in :numref:`fig-handeyecalib-webgui2`. + + .. _fig-handeyecalib-webgui2: + .. figure:: images/webgui_hand_eye_calib2.png + :width: 100 % + :align: center + + Checking the calibration grid detection + +Step 3: Record Poses +^^^^^^^^^^^^^^^^^^^^ +In this step, the user records images of the calibration grid at several +different robot poses. These poses must each ensure that the +calibration grid is completely visible in the left camera image. +Furthermore, the robot poses +need to be selected properly to achieve a variety of different +perspectives for the camera to perceive the calibration grid. +:numref:`fig-handeyecalib-poses` shows a schematic recommendation of four +different grid positions which should be recorded from a close and a far +point of view, resulting in eight images for the calibration. + +.. _fig-handeyecalib-poses: +.. figure:: images/handeyecalib-alldraw.png + :width: 70 % + :align: center + + Recommended views on the calibration grid during the calibration procedure. + In case of a 4DOF robot, other views have to be chosen, which should be as + different as possible. + +.. warning:: Calibration quality, i.e., the accuracy of the + calculated calibration result, depends on the calibration-grid views provided. + The more diverse the perspectives are, the better + is the calibration. Choosing very similar views, i.e., varying + the robot pose only slightly before recording a new calibration pose, may lead to + inaccurate estimation of the desired calibration transformation. + +.. index:: + pair: hand-eye calibration; slot + +After the robot reaches each calibration pose, the +corresponding pose :math:`\mathbf{T}^{\text{ext}}_{\text{robot}}` +of the user-defined *robot* frame in the user-defined +external reference frame *ext* needs to be reported +to the hand-eye calibration module. For this purpose, the module +offers different *slots* to store the reported poses and the +corresponding left camera images. +All filled slots will then be used to +calculate the desired calibration transformation between the +*camera* frame and either the user-defined *robot* frame +(robot-mounted camera) or the user-defined external reference frame *ext* +(static camera). + +In the |webgui|, the user can choose between many different pose formats for providing the +calibration poses (see :ref:`sect-pose-formats`:latex:`,\:Section \ref{appendix:sect-pose-formats}`). +When calibrating using the |rest-api|, the poses are always +given in *XYZ+quaternion*. +The |webgui| offers eight slots (*Close View 1*, +*Close View 2*, etc.) for the user to fill manually with robot poses. +Next to each slot, a figure suggests a respective dedicated viewpoint on the grid. +For each slot, the robot should be operated to achieve the suggested view. + +.. _fig-handeyecalib-webgui3: +.. figure:: images/webgui_hand_eye_calib3.png + :width: 100 % + :align: center + + Filling the first slot in the hand-eye calibration process for a + statically mounted camera + +To record a calibration pose, click on :guilabel:`Set Pose` for the respective slot +and enter the *robot* frame's pose into the respective text fields. The pose is +then stored with the corresponding camera image +by clicking the :guilabel:`Take Picture to Proceed` button. This will save +the calibration pose in the respective slot. + +To transmit the poses programmatically, the module's |restapi| +offers the ``set_pose`` service call (see +:ref:`sect-handeye-calibration-services`:latex:`, Section \ref{handeye_calibration:sect-handeye-calibration-services}`). + +.. note:: The user's acquisition of robot pose data + depends on the robot model and manufacturer -- it might be read from a + teaching or handheld device, which is shipped with the robot. + +.. warning:: Please be careful to correctly and accurately enter the + values; even small variations or typos may lead to + calibration-process failure. + +The |webgui| displays the currently saved poses (only with slot numbers from 0 to 7) +with their camera images and also allows to delete them by clicking +*Delete Pose* to remove a single pose, or clicking :guilabel:`Clear all Poses` to remove all poses. +In the |rest-api| the currently stored poses can be retrieved via ``get_poses`` and removed +via ``delete_poses`` for single poses or ``reset_calibration`` for removing all poses +(see :ref:`sect-handeye-calibration-services`:latex:`, Section \ref{handeye_calibration:sect-handeye-calibration-services}`). + +When at least four poses are set, the user can continue to the computation of the calibration result +by pressing :guilabel:`Next`. + +.. Complying to the +.. suggestions to observe the grid from close and far distance from +.. different viewing angles as sketched in :numref:`fig-handeyecalib-poses`, in this +.. example the following corresponding camera images have been sent to the +.. hand-eye calibration module with their associated robot pose: + +.. .. _fig-handeyecalib-images: +.. .. figure:: images/handeyecalib-allpics.png +.. :width: 100 % +.. :align: center + +.. Recorded camera images as input for the calibration procedure + +.. NOTE:: To successfully calculate the hand-eye calibration + transformation, at least four different robot calibration + poses need to be reported and stored in slots. + However, to prevent errors induced by possible + inaccurate measurements, at least **eight calibration poses are + recommended**. + +Step 4: Compute Calibration +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Before computing the calibration result, the user has to provide the correct calibration +parameters. These include the exact calibration grid dimensions and the sensor mounting type. +The |webgui| also offers settings for calibrating +4DOF robots. In this case, the rotation axis, as well as the offset from +the TCP to the camera coordinate system (robot-mounted camera) +or grid surface (statically mounted camera) must be given. +For the |restapi|, the respective parameters are listed in +:ref:`sect-handeye-calibration-params`:latex:`\:(Section +\ref{handeye_calibration:sect-handeye-calibration-params})`. + +.. _fig-handeyecalib-webgui4: +.. figure:: images/webgui_hand_eye_calib4.png + :width: 100 % + :align: center + + Defining hand-eye calibration parameters and computing the calibration result via the |rcxxx|'s |webgui| + +When the parameters are correct, the desired calibration transformation +can be computed from the collected poses and camera images by clicking +:guilabel:`Compute Calibration`. The |restapi| offers this functionality via the +``calibrate`` service call +(see :ref:`sect-handeye-calibration-services`:latex:`, Section \ref{handeye_calibration:sect-handeye-calibration-services}`). + +Depending on the way the camera is mounted, the calibration result contains the +transformation (i.e., the pose) between the *camera* frame and +either the user-defined *robot* frame (robot-mounted camera) +or the user-defined external reference frame *ext* +(statically mounted camera); see +:ref:`sect-handeyecalib-mounting`:latex:`\:(Section +\ref{handeye_calibration:sect-handeyecalib-mounting})`. + +.. index:: + pair: error; hand-eye calibration + +To enable users to judge the quality of the resulting calibration +transformation, the translational and rotational +calibration errors are reported, which are computed from the variance of the +calibration result. + +If the calibration error is not acceptable, the user can change the calibration +parameters and recompute the result, or return to step 3 of the +calibration procedure and add more poses or update poses. + +To save the calibration result, press :guilabel:`Save Calibration` or use the +|restapi| ``save_calibration`` service call +(see :ref:`sect-handeye-calibration-services`:latex:`, Section \ref{handeye_calibration:sect-handeye-calibration-services}`). + +.. _sect-handeye-calibration-params: + +Parameters +---------- + +.. index:: + pair: parameters; hand-eye calibration + +The hand-eye calibration module is called ``rc_hand_eye_calibration`` in the |rest-api| and is +represented in the +:ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})` +:cubeonly:`in the desired pipeline` under :menuselection:`Configuration --> Hand-Eye Calibration`. +The user can change the calibration parameters there or use the +:ref:`sect-rest-api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`. + +Parameter overview +^^^^^^^^^^^^^^^^^^ + +.. include:: _gen/nodes/params/rc_hand_eye_calibration.txt + +Description of run-time parameters +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The parameter descriptions are given with the corresponding |webgui| names in +brackets. + +.. _expl-hand-eye-calibration-grid-width: + +``grid_width`` (*Width*) +''''''''''''''''''''''''''''''''' + Width of the calibration grid in meters. The width should be given with + a very high accuracy, preferably with sub-millimeter accuracy. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/parameters?grid_width= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_hand_eye_calibration/parameters?grid_width= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/parameters?grid_width= + +.. _expl-hand-eye-calibration-grid-height: + +``grid_height`` (*Height*) +''''''''''''''''''''''''''''''''''' + Height of the calibration grid in meters. The height should be given + with a very high accuracy, preferably with sub-millimeter accuracy. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/parameters?grid_height= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_hand_eye_calibration/parameters?grid_height= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/parameters?grid_height= + +.. _expl-hand-eye-calibration-robot-mounted: + +``robot_mounted`` (*Sensor Mounting*) +''''''''''''''''''''''''''''''''''''' + If set to `true`, the camera is mounted on the robot. + If set to `false`, the camera is mounted statically and the calibration grid is mounted on the robot. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/parameters?robot_mounted= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_hand_eye_calibration/parameters?robot_mounted= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/parameters?robot_mounted= + +.. _expl-hand-eye-calibration-tcp-offset: + +``tcp_offset`` (*TCP Offset*) +''''''''''''''''''''''''''''' + The signed offset from the TCP to the camera coordinate system (robot-mounted sensor) + or the visible surface of the calibration grid (statically mounted sensor) along the + TCP rotation axis in meters. + This is required if the robot's movement is constrained and it + can rotate its TCP only around one axis (e.g., 4DOF robot). + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/parameters?tcp_offset= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_hand_eye_calibration/parameters?tcp_offset= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/parameters?tcp_offset= + +.. _expl-hand-eye-calibration-tcp-rotation-axis: + +``tcp_rotation_axis`` (*TCP Rotation Axis*) +''''''''''''''''''''''''''''''''''''''''''' + The axis of the *robot* frame around which the robot can rotate its TCP. + 0 is used for X, 1 for Y and 2 + for the Z axis. This is required if the robot's movement is constrained and it + can rotate its TCP only around one + axis (e.g., 4DOF robot). -1 means that the robot can rotate its TCP around two + independent rotation axes. ``tcp_offset`` is ignored in this case. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/parameters?tcp_rotation_axis= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_hand_eye_calibration/parameters?tcp_rotation_axis= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/parameters?tcp_rotation_axis= + +.. _sect-handeye-calibration-services: + +Services +-------- + +The |rest-api| service calls offered to programmatically conduct the +hand-eye calibration and to restore this module's parameters are +explained below. + +``get_calibration`` +^^^^^^^^^^^^^^^^^^^ + + returns the hand-eye calibration currently stored on the |rc_xxx|. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/get_calibration + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_hand_eye_calibration/services/get_calibration + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/get_calibration + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_get_calibration_request.txt + + .. tab:: **Response** + + The field ``error`` gives the calibration error in pixels which is computed from + the translational error ``translation_error_meter`` and the rotational error + ``rotation_error_degree``. This value is only given for compatibility with older + versions. The translational and rotational errors should be preferred. + + .. tabularcolumns:: |c|c|L| + .. csv-table:: Return codes of the ``get_calibration`` service call + :header: "``status``", "``success``", "Description" + + "0", "``true``", "returned valid calibration pose" + "2", "``false``", "calibration result is not available" + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_get_calibration_response.txt + +``remove_calibration`` +^^^^^^^^^^^^^^^^^^^^^^ + + removes the persistent hand-eye calibration on the |rcxxx|. + After this call the ``get_calibration`` service reports again that no hand-eye calibration is available. + This service call will also delete all the stored calibration poses and + corresponding camera images in the ``slots``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/remove_calibration + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_hand_eye_calibration/services/remove_calibration + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/remove_calibration + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_remove_calibration_request.txt + + .. tab:: **Response** + + .. tabularcolumns:: |c|c|L| + .. csv-table:: Return codes of the ``get_calibration`` service call + :header: "``status``", "``success``", "Description" + + "0", "``true``", "removed persistent calibration, device reports as uncalibrated" + "1", "``true``", "no persistent calibration found, device reports as uncalibrated" + "2", "``false``", "could not remove persistent calibration" + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_remove_calibration_response.txt + + +``set_pose`` +^^^^^^^^^^^^ + + allows to provide a robot pose as calibration pose to the hand-eye calibration + routine and records the current image of the calibration grid. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/set_pose + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_hand_eye_calibration/services/set_pose + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/set_pose + + .. tabs:: + + .. tab:: **Request** + + The ``slot`` argument is used to assign unique numbers to the different calibration + poses. The range for ``slot`` is from 0 to 15. At each instant when ``set_pose`` is called, an image is + recorded. This service call fails if the grid was undetectable in + the current image. + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_set_pose_request.txt + + .. tab:: **Response** + + .. tabularcolumns:: |c|c|L| + .. csv-table:: Return codes of the ``set_pose`` service call + :header: "``status``", "``success``", "Description" + + "1", "``true``", "pose stored successfully" + "3", "``true``", "pose stored successfully; collected enough poses for calibration, i.e., ready to calibrate" + "4", "``false``", "calibration grid was not detected, e.g., not fully visible in camera image" + "8", "``false``", "no image data available" + "12", "``false``", "given orientation values are invalid" + "13", "``false``", "invalid slot number" + + The field ``overexposed`` indicates if parts of the calibration grid were overexposed in this image. + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_set_pose_response.txt + +``get_poses`` +^^^^^^^^^^^^^ + + returns the robot poses that are currently stored for the hand-eye calibration routine. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/get_poses + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_hand_eye_calibration/services/get_poses + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/get_poses + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_get_poses_request.txt + + .. tab:: **Response** + + .. tabularcolumns:: |c|c|L| + .. csv-table:: Return codes of the ``get_poses`` service call + :header: "``status``", "``success``", "Description" + + "0", "``true``", "stored poses are returned" + "1", "``true``", "no calibration pose available" + + The field ``overexposed`` indicates if parts of the calibration grid were overexposed in this image. + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_get_poses_response.txt + + +``delete_poses`` +^^^^^^^^^^^^^^^^ + + deletes the calibration poses and corresponding images with the specified ``slots``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/delete_poses + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_hand_eye_calibration/services/delete_poses + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/delete_poses + + .. tabs:: + + .. tab:: **Request** + + The ``slots`` argument specifies which calibration poses should be deleted. + If no slots are provided, nothing will be deleted. + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_delete_poses_request.txt + + .. tab:: **Response** + + .. tabularcolumns:: |c|c|L| + .. csv-table:: Return codes of the ``delete_poses`` service call + :header: "``status``", "``success``", "Description" + + "0", "``true``", "poses successfully deleted" + "1", "``true``", "no slots given" + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_delete_poses_response.txt + + +``reset_calibration`` +^^^^^^^^^^^^^^^^^^^^^ + + deletes all previously provided poses and corresponding images. + The last saved calibration result is reloaded. + This service might be used to (re-)start the hand-eye calibration from scratch. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/reset_calibration + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_hand_eye_calibration/services/reset_calibration + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/reset_calibration + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_reset_calibration_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_reset_calibration_response.txt + +``calibrate`` +^^^^^^^^^^^^^ + + calculates and returns the hand-eye calibration transformation with the + robot poses configured by the ``set_pose`` service. + + .. toggle-header:: + :header: **Details** + + ``save_calibration`` + must be called to make the calibration available for other modules via + the ``get_calibration`` service call and to store it persistently. + + .. NOTE:: For calculating the hand-eye calibration + transformation at least four robot calibration poses are + required (see ``set_pose`` service). However, eight + calibration poses are recommended. + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/calibrate + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_hand_eye_calibration/services/calibrate + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/calibrate + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_calibrate_request.txt + + .. tab:: **Response** + + The field ``error`` gives the calibration error in pixels which is computed from + the translational error ``translation_error_meter`` and the rotational error + ``rotation_error_degree``. This value is only given for compatibility with older + versions. The translational and rotational errors should be preferred. + + .. tabularcolumns:: |c|c|L| + .. csv-table:: Return codes of the ``calibrate`` service call + :header: "``status``", "``success``", "Description" + + "0", "``true``", "calibration successful, returned calibration result" + "1", "``false``", "not enough poses to perform calibration" + "2", "``false``", "calibration result is invalid, please verify the input data" + "3", "``false``", "given calibration grid dimensions are not valid" + "4", "``false``", "insufficient rotation, ``tcp_offset`` and ``tcp_rotation_axis`` must be specified" + "5", "``false``", "sufficient rotation available, ``tcp_rotation_axis`` must be set to -1" + "6", "``false``", "poses are not distinct enough from each other" + + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_calibrate_response.txt + +``save_calibration`` +^^^^^^^^^^^^^^^^^^^^ + + persistently saves the result of hand-eye calibration to the |rcxxx| and overwrites + the existing one. The stored result can be retrieved any time by the + ``get_calibration`` service. This service call will also delete all the stored calibration poses and + corresponding camera images in the ``slots``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/save_calibration + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_hand_eye_calibration/services/save_calibration + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/save_calibration + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_save_calibration_request.txt + + .. tab:: **Response** + + .. tabularcolumns:: |c|c|L| + .. csv-table:: Return codes of the ``save_calibration`` service call + :header: "``status``", "``success``", "Description" + + "0", "``true``", "calibration saved successfully" + "1", "``false``", "could not save calibration file" + "2", "``false``", "calibration result is not available" + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_save_calibration_response.txt + +``set_calibration`` +^^^^^^^^^^^^^^^^^^^ + + sets the hand-eye calibration transformation with arguments of this call. + + .. toggle-header:: + :header: **Details** + + The calibration transformation is expected in the same format as returned by + the ``calibrate`` and ``get_calibration`` calls. The given calibration + information is also stored persistently on the sensor by internally calling + ``save_calibration``. + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/set_calibration + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_hand_eye_calibration/services/set_calibration + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/set_calibration + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_set_calibration_request.txt + + .. tab:: **Response** + + .. tabularcolumns:: |c|c|L| + .. csv-table:: Return codes of the ``set_calibration`` service call + :header: "``status``", "``success``", "Description" + + "0", "``true``", "setting the calibration transformation was successful" + "12", "``false``", "given orientation values are invalid" + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_set_calibration_response.txt + +``reset_defaults`` +^^^^^^^^^^^^^^^^^^ + + restores and applies the default values for this module's parameters + ("factory reset"). Does not affect the calibration result itself or any + of the ``slots`` saved during calibration. Only parameters such as the + grid dimensions and the mount type will be reset. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/reset_defaults + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_hand_eye_calibration/services/reset_defaults + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/reset_defaults + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_reset_defaults_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_reset_defaults_response.txt diff --git a/v24.04/de/_raw_sources/hardware_spec.rst.txt b/v24.04/de/_raw_sources/hardware_spec.rst.txt new file mode 100644 index 0000000..d64d654 --- /dev/null +++ b/v24.04/de/_raw_sources/hardware_spec.rst.txt @@ -0,0 +1,549 @@ +.. include:: global_rst.glb + +.. _sect-hardware-specification: + +Hardware specification +====================== + +.. NOTE:: The following hardware specifications are provided here as a general reference; differences with the product may exist. + +Scope of delivery +----------------- + +.. only:: roboception + + Standard delivery for an |rc_xxx| includes the |rc_xxx| sensor and a quickstart guide only. The full + manual is available in digital form and is always installed on the sensor, accessible through the + :ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})`, and available at + http://www.roboception.com/documentation. + +.. only:: matrixvision or schunk or basler + + Standard delivery for an |rc_xxx| includes the |rc_xxx| sensor and a quickstart guide only. The full + manual is available in digital form and is always installed on the sensor, accessible through the + :ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})`. + +.. Note:: The following items are not included in the delivery unless otherwise specified: + + - Couplings, adapters, mounts + - Power supply unit, cabling, and fuses + - Network cabling + + Please refer to :ref:`sect-accessories`:latex:`\:(Section \ref{accessories:sect-accessories})` for suggested third-party cable vendors. + +A connectivity kit can be purchased for the |rc_xxx|. It contains an M12 to RJ45 network cable, +24 V power supply, and a DC plug to M12 power adapter. Please refer to :ref:`sect-accessories`:latex:`\:(Section \ref{accessories:sect-accessories})` for details. + +.. Note:: The connectivity kit is intended only for initial setup, not for permanent installation + in industrial environment. + +The following picture shows the important parts of the |rc_xxx| which are referenced later in the documentation. + +.. index:: + pair: components; rc_visard + +.. figure:: images/rc_visard_parts.* + :width: 100% + :align: center + + Parts description + +Technical specification +----------------------- + +.. index:: + single: specifications; rc_visard + single: resolution + single: frame rate + +.. only:: rc_visard + + The common technical specifications for the |rc_xxx| variants are given in :numref:`tab-common-hardware-specifications`. + The |rc_xxx| 160 is available with two different types of lenses: 4 mm and 6 mm focal length. + The |rc_xxx| 65 is only available with 4 mm lenses. + + .. tabularcolumns:: |\X{5}{11}|\X{6}{11}| + + .. _tab-common-hardware-specifications: + + .. table:: Common technical specifications for both |rc_xxx| baselines + + +----------------------+---------------------------------------------------------------+ + | | |rc_xxx| 65 / |rc_xxx| 160 | + +======================+===============================================================+ + | Image resolution | 1280 x 960 pixel, color or monochrome | + +----------------------+---------------------------------------------------------------+ + | Field of view | | 4 mm lens: Horizontal: 61°, Vertical: 48° | + | | | 6 mm lens: Horizontal: 43°, Vertical: 33° | + +----------------------+---------------------------------------------------------------+ + | IR Cutoff | 650 nm | + +----------------------+---------------------------------------------------------------+ + | Depth image | | 1280 x 960 pixel (Full) @ 1 Hz (with StereoPlus license) | + | | | 640 x 480 pixel (High) @ 3 Hz | + | | | 320 x 240 pixel (Medium) @ 15 Hz | + | | | 214 x 160 pixel (Low) @ 25 Hz | + +----------------------+---------------------------------------------------------------+ + | Egomotion | |imu-rate|, low latency | + +----------------------+---------------------------------------------------------------+ + | Computing unit | Nvidia Tegra K1 | + +----------------------+---------------------------------------------------------------+ + | Power supply | 18 V to 30 V | + +----------------------+---------------------------------------------------------------+ + | Cooling | Passive | + +----------------------+---------------------------------------------------------------+ + + The |rc_xxx| 65 and |rc_xxx| 160 differ in their baselines, which affects depth range and resolution as well as the sensors' size and weight. + + .. tabularcolumns:: |\X{5}{11}|\X{3}{11}|\X{3}{11}| + + .. _tab-hardware-differences: + + .. table:: Differing technical specifications for the |rc_xxx| variants + + +-------------------+------------------------+------------------------+ + | | |rc_xxx| 65 | |rc_xxx| 160 | + +===================+========================+========================+ + | Baseline | 65 mm | 160 mm | + +-------------------+------------------------+------------------------+ + | Depth range | 0.2 m to infinity | 0.5 m to infinity | + +-------------------+------------------------+------------------------+ + | Size (W x H x L) | 135 mm x 75 mm x 96 mm | 230 mm x 75 mm x 84 mm | + +-------------------+------------------------+------------------------+ + | Mass | 0.68 kg | 0.84 kg | + +-------------------+------------------------+------------------------+ + + The combination of baselines and lens types leads to different + resolutions and accuracies. + + .. table:: Resolution and accuracy of the |rc_xxx| variants in millimeters with full + resolution stereo matching and random dot projection on non-reflective and + non-transparent objects. + + +------------------+----------------+------------------+-------------------+--------------------+ + | | distance (mm) | |rc_xxx| 65-4 | |rc_xxx| 160-4 | |rc_xxx| 160-6 | + +==================+================+==================+===================+====================+ + | lateral | | 200 | | 0.2 | | - | | - | + | resolution | | 500 | | 0.5 | | 0.5 | | 0.3 | + | (mm) | | 1000 | | 0.9 | | 0.9 | | 0.6 | + | | | 2000 | | 1.9 | | 1.9 | | 1.3 | + | | | 3000 | | 2.8 | | 2.8 | | 1.9 | + +------------------+----------------+------------------+-------------------+--------------------+ + | depth resolution | | 200 | | 0.04 | | - | | - | + | (mm) | | 500 | | 0.2 | | 0.1 | | 0.06 | + | | | 1000 | | 0.9 | | 0.4 | | 0.3 | + | | | 2000 | | 3.6 | | 1.5 | | 1.0 | + | | | 3000 | | 8.0 | | 3.3 | | 2.2 | + +------------------+----------------+------------------+-------------------+--------------------+ + | Average depth | | 200 | | 0.2 | | - | | - | + | accuracy (mm) | | 500 | | 0.9 | | 0.4 | | 0.3 | + | | | 1000 | | 3.6 | | 1.5 | | 1.0 | + | | | 2000 | | 14.2 | | 5.8 | | 3.9 | + | | | 3000 | | 32.1 | | 13.0 | | 8.8 | + +------------------+----------------+------------------+-------------------+--------------------+ + +.. only:: rc_visard_ng + + The technical specifications for the |rc_xxx| are given in :numref:`tab-common-hardware-specifications-ng`. + The frame rate for computing the depth image in High resolution (720 x 540 pixel) is significantly + higher when increasing the minimum distance to 1.2 meters. + + .. tabularcolumns:: |\X{5}{11}|\X{6}{11}| + + .. _tab-common-hardware-specifications-ng: + + .. table:: Technical specifications for the |rc_xxx| + + +----------------------+---------------------------------------------------------------+ + | | |rc_xxx| 160-6 | + +======================+===============================================================+ + | Image resolution | 1440 x 1080 pixel, monochrome | + +----------------------+---------------------------------------------------------------+ + | Field of view | | 6 mm lens: Horizontal: 43°, Vertical: 33° | + +----------------------+---------------------------------------------------------------+ + | IR Cutoff | 650 nm | + +----------------------+---------------------------------------------------------------+ + | Depth image | | 1440 x 1080 pixel (Full) @ 3 Hz | + | (with Minimum | | 720 x 540 pixel (High) @ 7 Hz | + | Distance of 0.5 m) | | 360 x 270 pixel (Medium) @ 25 Hz | + | | | 240 x 180 pixel (Low) @ 25 Hz | + +----------------------+---------------------------------------------------------------+ + | Depth image | | 1440 x 1080 pixel (Full) @ 3 Hz | + | (with Minimum | | 720 x 540 pixel (High) @ 16 Hz | + | Distance of 1.2 m) | | 360 x 270 pixel (Medium) @ 25 Hz | + | | | 240 x 180 pixel (Low) @ 25 Hz | + +----------------------+---------------------------------------------------------------+ + | Computing unit | Orin Nano 8GB | + +----------------------+---------------------------------------------------------------+ + | Power supply | 18 V to 30 V | + +----------------------+---------------------------------------------------------------+ + | Cooling | Passive | + +----------------------+---------------------------------------------------------------+ + | Baseline | 160 mm | + +----------------------+---------------------------------------------------------------+ + | Depth range | 0.5 m to infinity | + +----------------------+---------------------------------------------------------------+ + | Size (W x H x L) | 230 mm x 75 mm x 84 mm | + +----------------------+---------------------------------------------------------------+ + | Mass | 0.965 kg | + +----------------------+---------------------------------------------------------------+ + + The resolutions and accuracies at different distances are given in the following table. + + .. table:: Resolution and accuracy of the |rc_xxx| in millimeters with full + resolution stereo matching and random dot projection on non-reflective and + non-transparent objects. + + +------------------+----------------+------------------+ + | | distance (mm) | |rc_xxx| 160-6 | + +==================+================+==================+ + | lateral | | 500 | | 0.3 | + | resolution | | 1000 | | 0.6 | + | (mm) | | 2000 | | 1.1 | + | | | 3000 | | 1.7 | + +------------------+----------------+------------------+ + | depth resolution | | 500 | | 0.05 | + | (mm) | | 1000 | | 0.2 | + | | | 2000 | | 0.9 | + | | | 3000 | | 2.0 | + +------------------+----------------+------------------+ + | Average depth | | 500 | | 0.2 | + | accuracy (mm) | | 1000 | | 0.9 | + | | | 2000 | | 3.5 | + | | | 3000 | | 7.8 | + +------------------+----------------+------------------+ + +The |rc_xxx| can be equipped with on-board software modules for additional +features. These software modules can be ordered from the |company| and require a license update. + +.. index:: + single: dimensions; rc_visard + +.. only:: rc_visard + + .. figure:: images/rc_visard_65_general.* + :width: 160mm + :align: center + + Overall dimensions of the |rc_xxx| 65 + + +.. figure:: images/rc_visard_160_general.* + :width: 160mm + :align: center + + Overall dimensions of the |rc_xxx| 160 + +.. index:: + single: CAD model + +.. only:: roboception or matrixvision + + CAD models of the |rc_xxx| can be downloaded from http://www.roboception.com/download. The CAD models are provided as-is, + with no guarantee of correctness. When a material property of aluminum is assigned (density of :math:`2.76\mathrm{g\over{cm}^3}`), + the mass properties of the CAD model are within 5% of the actual product with respect to weight and center of mass, + and within 10% with respect to moment of inertia. + +.. only:: schunk + + CAD models of the |rc_xxx| can be downloaded from http://www.schunk.com/de_de/services/downloads/cad-ecad-daten. The CAD models are provided as-is, + with no guarantee of correctness. When a material property of aluminum is assigned (density of :math:`2.76\mathrm{g\over{cm}^3}`), + the mass properties of the CAD model are within 5% of the actual product with respect to weight and center of mass, + and within 10% with respect to moment of inertia. + + +Environmental and operating conditions +-------------------------------------- + +.. index:: + single: operating conditions + single: temperature range + single: humidity + single: protection class + single: IP54 + +The |rc_xxx| is designed for industrial applications. Always respect the storage, transport, and operating environmental +conditions outlined in :numref:`tab-hardware-environment`. + +.. tabularcolumns:: |\X{5}{11}|\X{6}{11}| + +.. _tab-hardware-environment: + +.. table:: Environmental conditions + + +---------------------------------------+-------------------------------------------------------+ + | | |rc_xxx| | + +=======================================+=======================================================+ + | Storage/Transport temperature | -25 °C to 70 °C | + +---------------------------------------+-------------------------------------------------------+ + | Operating temperature | 0 °C to 50 °C | + +---------------------------------------+-------------------------------------------------------+ + | Relative humidity (non condensing) | 20 % to 80 % | + +---------------------------------------+-------------------------------------------------------+ + | Vibration | 5 g | + +---------------------------------------+-------------------------------------------------------+ + | Shock | 50 g | + +---------------------------------------+-------------------------------------------------------+ + | Protection class | IP54 | + +---------------------------------------+-------------------------------------------------------+ + | Others | * Free from corrosive liquids or gases | + | | * Free from explosive liquids or gases | + | | * Free from powerful electromagnetic interference | + +---------------------------------------+-------------------------------------------------------+ + +.. index:: + single: cooling + +The |rc_xxx| is designed for an operating temperature (surrounding environment) of 0 °C to 50 °C and +relies on convective (passive) cooling. Unobstructed airflow, especially around the cooling fins, +needs to be ensured during use. The |rc_xxx| should only be mounted using the provided +mechanical mounting interface, and all parts of the housing must remain uncovered. A free space of at least 10 cm extending in +all directions from the housing, and sufficient air exchange with the environment is +required to ensure adequate cooling. Cooling fins must be free of dirt and other contamination. + +.. index:: + pair: LED; housing temperature + +The housing temperature depends on the processing load, sensor orientation, and surrounding +environmental temperatures. When the sensor's exposed housing surfaces exceed 60°C, the LED at the front will turn from green to red. + +.. Warning:: For hand-guided applications, a heat-insulated handle should be attached to the + sensor to reduce the risk of burn injuries due to skin exposure to surface temperatures exceeding 60°C. + + +Power-supply specifications +--------------------------- + +.. index:: ! power supply + +The |rc_xxx| needs to be supplied by a DC voltage source. The |rc_xxx|'s standard package doesn't include a DC power supply. +The power supply contained in the connectivity kit may be used for initial setup. +For permanent installation, it is the customer's responsibility to provide suitable +DC power. Each |rc_xxx| must be connected to a separate power supply. Connection to domestic +grid power is only allowed through a power supply certified as EN55011 Class B. + +.. only:: rc_visard + + .. tabularcolumns:: |\X{5}{11}|\X{2}{11}|\X{2}{11}|\X{2}{11}| + + .. _tab-hardware-power: + + .. table:: Absolute maximum ratings for power supply + + +-----------------------------------+---------------+---------------+----------------------------------------------+ + | | *Min* | *Nominal* | *Max* | + +===================================+===============+===============+==============================================+ + | Supply voltage | 18.0 V | 24 V | 30.0 V | + +-----------------------------------+---------------+---------------+----------------------------------------------+ + | Max power consumption | | | 25 W | + +-----------------------------------+---------------+---------------+----------------------------------------------+ + | Overcurrent protection | Supply must be fuse-protected to a maximum of 2 A | + +-----------------------------------+---------------+---------------+----------------------------------------------+ + | EMC compliance | see :ref:`sect-standards`:latex:`\:(Section \ref{standards:sect-standards})` | + +-----------------------------------+---------------+---------------+----------------------------------------------+ + +.. only:: rc_visard_ng + + .. tabularcolumns:: |\X{5}{11}|\X{2}{11}|\X{2}{11}|\X{2}{11}| + + .. _tab-hardware-power: + + .. table:: Absolute maximum ratings for power supply + + +-----------------------------------+---------------+---------------+----------------------------------------------+ + | | *Min* | *Nominal* | *Max* | + +===================================+===============+===============+==============================================+ + | Supply voltage | 18.0 V | 24 V | 30.0 V | + +-----------------------------------+---------------+---------------+----------------------------------------------+ + | Max power consumption | | | 25 W | + +-----------------------------------+---------------+---------------+----------------------------------------------+ + | Overcurrent protection | Supply must be fuse-protected to a maximum of 2 A | + +-----------------------------------+---------------+---------------+----------------------------------------------+ + +.. Warning:: Exceeding maximum power rating values may lead to damage of the |rc_xxx|, power + supply, and connected equipment. + +.. Warning:: A separate power supply must power each |rc_xxx|. + +.. Warning:: Connection to domestic grid power is allowed through a power supply certified + as EN55011 Class B only. + +.. _sect-wiring: + +Wiring +------ + +.. index:: cables + +Cables are not provided with the |rc_xxx| standard package. It is the customer's responsibility +to obtain the proper cabling. :ref:`sect-accessories`:latex:`\:(Section \ref{accessories:sect-accessories})` provides an overview of suggested components. + +.. Warning:: Proper cable management is mandatory. Cabling must always be secured to the |rc_xxx| + mount with a strain-relief clamp so that no forces due to cable movements are exerted on the |rc_xxx|'s + M12 connectors. Enough slack needs to be provided to allow for full range of movement of the |rc_xxx| + without straining the cable. The cable's minimum bend radius needs to be observed. + +The |rc_xxx| provides an industrial 8-pin A-coded M12 socket connector for Ethernet +connectivity and an 8-pin A-coded M12 plug connector for power and GPIO connectivity. +Both connectors are located at the back. :visardonly:`Their locations (distance from center lines) are +identical for both baseline variants.` The location of both connectors on the +|rc_xxx| is shown in :numref:`fig-electrical-connections`. + +.. _fig-electrical-connections: +.. figure:: images/rc_visard_connect.* + :width: 100% + :align: center + + Locations of the electrical connections for the |rc_xxx|, with Ethernet on top and power on the bottom + +Connectors are rotated so that standard 90° angled connectors will exit horizontally, away from the camera (away from the cooling fins). + +.. index:: + pair: pin assignments; Ethernet + +.. _fig-pin-assignments: +.. figure:: images/rc_visard_pinout.* + :width: 100% + :align: center + + Pin positions for power and Ethernet connector + +Pin assignments for the Ethernet connector are given in :numref:`fig-ethernet-pin-assignments`. + +.. _fig-ethernet-pin-assignments: +.. figure:: images/ethernet_cable.* + :width: 100% + :align: center + + Pin assignments for M12 to Ethernet cabling + +.. index:: + pair: pin assignments; power + pair: pin assignments; GPIO + +Pin assignments for the power connector are given in :numref:`tab-power-pin-assignments`. + + +.. tabularcolumns:: |p{20mm}|p{40mm}| + +.. _tab-power-pin-assignments: + +.. table:: Pin assignments for the power connector + + +---------+-----------------------------+ + | **Pin** | *Assignment* | + +=========+=============================+ + | 1 | GPIO In 2 | + +---------+-----------------------------+ + | 2 | Power | + +---------+-----------------------------+ + | 3 | GPIO In 1 | + +---------+-----------------------------+ + | 4 | GPIO Gnd | + +---------+-----------------------------+ + | 5 | GPIO Vcc | + +---------+-----------------------------+ + | 6 | GPIO Out 1 (image exposure) | + +---------+-----------------------------+ + | 7 | Gnd | + +---------+-----------------------------+ + | 8 | GPIO Out 2 | + +---------+-----------------------------+ + + +GPIOs are decoupled by photocoupler. *GPIO Out 1* by default provides an exposure sync signal with +a logic high level for the duration of the image exposure. All GPIOs can be controlled via the +IOControl module (:ref:`sect-iocontrol`:latex:`, Section \ref{iocontrol:sect-iocontrol}`). +Pins of unsused GPIOs should be left floating. + +.. Warning:: It is especially important that during the boot phase *GPIO In 1* + is left floating or remains low. The |rc_xxx| will not boot if the pin is high during boot time. + +GPIO circuitry and specifications are shown in :numref:`fig-gpio`. The maximum rated voltage for +*GPIO In* and *GPIO Vcc* is 30 V. + +.. _fig-gpio: +.. figure:: images/rc_visard_gpio.* + :width: 160mm + :align: center + + GPIO circuitry and specifications -- do not connect signals higher than 30 V + +.. Warning:: Do not connect signals with voltages higher than 30 V to the |rc_xxx|. + +.. _sect-mechanical: + +Mechanical interface +-------------------- + +.. index:: + single: mounting + single: tripod + +.. only:: rc_visard + + The |rc_xxx| 65 and |rc_xxx| 160 offer identical mounting-point setups at the bottom. + +.. only:: rc_visard_ng + + The |rc_xxx| offers a mounting-point at the bottom. + + +.. figure:: images/rc_visard_mounting.* + :width: 160mm + :align: center + + Mounting-point for connecting the |rc_xxx| to robots or other mountings + + +For troubleshooting and static applications, the sensor may be mounted using the standardized tripod +thread (UNC 1/4"-20) indicated at the coordinate-frame origin. For dynamic applications such +as mounting on a robotic arm, the sensor must be mounted with three M4 (metric standard) 8.8 machine +screws tightened to 2.5 Nm and secured with a medium-strength threadlocking adhesive such +as Loctite 243. Maximum thread depth is 6 mm. The two 4 mm diameter holes may be used for positioning +pins (ISO 2338 4 m6) to ensure precise repositioning of the sensor. + +.. Warning:: For dynamic applications, the |rc_xxx| must be mounted with three M4 8.8 machine screws + tightened to 2.5 Nm torque and secured with threadlocking adhesive. Do not use high-strength bolts. + The engaged thread depth must be at least 5 mm. + +.. _sect-coordinate-frames: + +Coordinate frames +----------------- + +.. index:: + single: coordinate frames; mounting + +The |rc_xxx|'s coordinate-frame origin is defined as the exit pupil of the left camera lens. This frame is +called sensor coordinate frame or camera coordinate frame. An approximate location for the |rc_xxx| is shown in the next image. + +The mounting-point frame for the |rc_xxx| is defined to be at the bottom, centered in the tripod thread, +with orientation identical to that of the sensor's coordinate frame. + +.. only:: rc_visard + + :numref:`fig-rc-visard-65` and :numref:`fig-rc-visard-160` show approximate offsets. + + .. _fig-rc-visard-65: + .. figure:: images/rc_visard_frames.* + :width: 160mm + :align: center + + Approximate location of sensor/camera coordinate frame (inside left lens) and mounting-point frame (at tripod thread) for the |rc_xxx| 65 + +.. only:: rc_visard_ng + + :numref:`fig-rc-visard-160` shows approximate offsets. + +.. _fig-rc-visard-160: +.. figure:: images/rc_visard160_frames.* + :width: 160mm + :align: center + + Approximate locations of sensor/camera coordinate frame (inside left lens) and mounting-point frame (at tripod thread) for the |rc_xxx| 160 + +.. Note:: The correct offset between the sensor/camera frame and a robot + coordinate frame can be calibrated through the :doc:`hand-eye-calibration + procedure`:latex:`\:(Section \ref{handeye_calibration:sect-handeye-calibration})`. + + diff --git a/v24.04/de/_raw_sources/index.rst.txt b/v24.04/de/_raw_sources/index.rst.txt new file mode 100644 index 0000000..6e014b6 --- /dev/null +++ b/v24.04/de/_raw_sources/index.rst.txt @@ -0,0 +1,33 @@ +.. Roboception Sensor Manual documentation master file, created by + sphinx-quickstart on Wed Jan 11 22:27:28 2017. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +.. include:: global_rst.glb + +|company| |rcxxx| User Manual +================================= + +.. toctree-filt:: + :maxdepth: 2 + :includehidden: + + revisions + safety + :rc_cube_exclude:hardware_spec + installation + concepts + :rc_cube_only:pipelines + modules + interfaces + :rc_visard_exclude:userspace + maintenance + :rc_cube_exclude:accessories + troubleshooting + contact + appendix + +.. not working, since it would appear as text after the appendix in the pdf +.. * :ref:`genindex` + + diff --git a/v24.04/de/_raw_sources/installation.rst.txt b/v24.04/de/_raw_sources/installation.rst.txt new file mode 100644 index 0000000..e30c9e0 --- /dev/null +++ b/v24.04/de/_raw_sources/installation.rst.txt @@ -0,0 +1,426 @@ +.. include:: global_rst.glb + +.. _sect-installation: + +Installation +============ + +.. index:: + single: installation + +.. Warning:: The instructions on :ref:`sect-safety`:latex:`\:(Section \ref{safety:sect-safety})` related to the |rc_xxx| must be read and understood prior to installation. + +.. only:: rc_visard or rc_visard_ng + + The |rc_xxx| offers a Gigabit Ethernet interface for connecting the device to a computer + network. All communications to and from the device are performed via this interface. The + |rc_xxx| has an on-board computing resource that requires booting time after powering + up the device. + +.. only:: rc_cube + + The |rc_cube| offers multiple Gigabit Ethernet interfaces: + + * One interface labeled "external" for connecting the device to a local computer network, and + * up to four interfaces labeled "sensor" for connecting one or more 3D cameras such as the + |rc_visard| or |rc_viscore| :mvexclude:`or Basler blaze` sensor + (see :ref:`sect-camera-connection`:latex:`, Section \ref{installation:sect-camera-connection}`). + + All other Ethernet ports are disabled. + + For commissioning, operation, or troubleshooting the user can connect input devices + such as a mouse and a keyboard as well as a computer screen directly to the |rc_xxx|. + However, this is optional as the functionality of the |rc_cube| is fully accessible + via the local network it is connected to. + + .. note:: If a screen is used on the |rc_cube|, it must be connected before booting, + or the |rc_cube| must be restarted to activate the screen. + +Software license +---------------- + +.. only:: rc_visard or rc_visard_ng + + Every |rc_xxx| device ships with a pre-installed license file for licensing + and protection of the installed software packages. The license + is bound to that specific |rc_xxx| device and cannot be used or + transferred to other devices. + +.. only:: rc_cube + + Every |rc_xxx| device ships with a USB dongle for licensing + and protection of the installed software packages. The purchased + software licenses are installed on and are bound to this dongle and + its ID. + +The functionality of the |rc_xxx| can +be enhanced anytime by +:ref:`upgrading the license`:latex:`\:(Section \ref{maintenance:sect-updating-license})`, +e.g., for optionally available software modules. + +.. note:: The |rc_xxx| requires to be rebooted whenever the installed + licenses have changed. + +.. only:: rc_visard or rc_visard_ng + + .. note:: The license status can be retrieved + via the |rc_xxx|'s various interfaces + such as the :menuselection:`System --> Firmware & License` page of the + :ref:`Web GUI`:latex:`\ (Section \ref{webgui:sect-web-gui})`. + +.. only:: rc_cube + + .. note:: The dongle ID and the license status can be retrieved + via the |rc_xxx|'s various interfaces + such as the :menuselection:`System --> Firmware & License` page of the + :ref:`Web GUI`:latex:`\ (Section \ref{webgui:sect-web-gui})`. + + .. note:: For the software components to be properly licensed, the USB dongle + must be plugged to the |rc_xxx| **before power up**. + + .. note:: The |rc_xxx| requires to be rebooted, whenever the license + dongle is plugged to or unplugged from the device. + +Power up +-------- + +.. only:: rc_visard or rc_visard_ng + + .. index:: + single: LED + + .. Note:: Always fully connect and tighten the M12 power connector on the |rc_xxx| + *before* turning on the power supply. + + After connecting the |rc_xxx| to the power, the LED on the front of the device should + immediately illuminate. During the device's boot process, the LED will change + color and will eventually turn green. This signals that all processes are up and + running. + + If the network is not plugged in or the network is not properly configured, then the LED + will flash red every 5 seconds. In this case, the device's network configuration + should be verified. See :ref:`sect-led-colors`:latex:`\:(Section \ref{troubleshooting:sect-led-colors})` + for more information on the LED color codes. + +.. only:: rc_cube + + .. note:: The *rc_cube I* does not come with a power supply. A separate 24V/20Amp (e.g. top hat rail) power supply is required. + + The |rc_xxx| is booted by using the power switch on the device. + If a computer screen is connected it will display the |rc_xxx|'s + |webgui| when the boot process is finished. + + .. Note:: For successful operation please make sure that the |rcvisard| being + connected to the |rc_xxx| is powered and booted. + +.. _sect-discovery-of-rcvisard-devices: + +Discovery of |rc_xxx| devices +------------------------------- + +.. index:: + single: discovery GUI + single: reset + +|company| |rc_xxx| devices that are powered up and connected to the local network or directly to a +computer can be found using the standard GigE Vision\ |reg| discovery mechanism. + +.. only:: basler + + |manufacturer| offers the open-source tool ``rcdiscover-gui``, which is available for Windows and Linux. + The tool's Windows version consists of a single executable for Windows 7, 10 and 11, which can be executed without installation. + For Linux an installation package is available for Ubuntu. + +.. only:: roboception or matrixvision + + |manufacturer| offers the open-source tool ``rcdiscover-gui``, which can be downloaded free of charge from + https://github.com/roboception/rcdiscover/releases for Windows and Linux. + The tool's Windows version consists of a single executable for Windows 7, 10 and 11, which can be executed without installation. + For Linux an installation package is available for Ubuntu. + +.. only:: schunk + + |manufacturer| offers the open-source tool ``rcdiscover-gui``, which can be downloaded free of charge from + http://www.schunk.com/de_de/services/downloads/software for Windows and Linux. + The tool's Windows version consists of a single executable for Windows 7, 10 and 11, which can be executed without installation. + For Linux an installation package is available for Ubuntu. + + +At startup, all available GigE Vision\ |reg| devices -- including |rc_xxx| devices -- are +listed with their names, serial numbers, current IP addresses, and unique MAC addresses. The +discovery tool finds all devices reachable by global broadcasts. Misconfigured devices +that are located in different subnets than the application host may also be listed. A tickmark in the +discovery tool indicates whether devices are actually reachable via a +web browser. + +.. index:: + single: serial number + +.. only:: rc_visard or rc_visard_ng + + .. figure:: images/typelabel.png + :width: 50% + :align: center + + Label on the |rc_xxx| indicating model, serial number and MAC address + +.. only:: roboception or schunk or matrixvision + + .. figure:: images/rcdiscover_guiwin.png + :width: 90 % + :align: center + + ``rcdiscover-gui`` tool for finding connected GigE Vision\ |reg| devices + +.. only:: basler + + .. figure:: images/rcdiscover_guiwin_basler.png + :width: 90 % + :align: center + + ``rcdiscover-gui`` tool for finding connected GigE Vision\ |reg| devices + +After successful discovery, a double click on the device row opens the :ref:`Web GUI`:latex:`\ (Section +\ref{webgui:sect-web-gui})` of the device in the operating system's default web browser. +Google Chrome or Mozilla Firefox are recommended as web browser. + +Resetting configuration +^^^^^^^^^^^^^^^^^^^^^^^ + +.. only:: rc_cube + + .. Note:: The ``rcdiscover-gui`` resetting mechanism is currently not implemented for |rc_cube| devices. + +.. only:: rc_visard or rc_visard_ng + + A misconfigured device can be reset by using the *Reset rc_visard* button in the + discovery tool. The reset mechanism is only available for two minutes + after device startup. Thus, the |rc_xxx| may require rebooting before + being able to reset the device. + + .. figure:: images/rcdiscover_reset.png + :width: 50 % + :align: center + + Reset dialog of the ``rcdiscover-gui`` tool + + If the discovery tool still successfully detects the the misconfigured |rc_xxx|, + then the latter can be selected from the *rc-visard* drop-down menu. Otherwise, + the |rc_xxx|'s MAC address, which is printed on the device label, can be entered + manually into the designated fields. + + One of four options can be chosen after entering the MAC address: + + - *Reset Parameters*: Reset all |rc_xxx| parameters, such as frame rate, that are configurable via + :ref:`Web GUI`:latex:`\ (Section \ref{webgui:sect-web-gui})`. + - *Reset Network*: Reset network settings and user-defined name. + - *Reset All*: Reset the |rc_xxx| parameters as well as network settings and user-defined name. + - *Switch Partitions*: Allows a rollback to be performed as described in + :ref:`sect-restoring-the-previous-firmware-version`:latex:`\:(Section \ref{maintenance:sect-restoring-the-previous-firmware-version})`. + + A white status LED followed by a device reboot indicates a successful reset. + If no reaction is noticeable, the two minutes time slot may have elapsed, requiring + another reboot. + + .. Note:: The reset mechanism is only available for the first two minutes after startup. + +.. _sect-network-configuration: + +Network configuration +--------------------- + +.. index:: + single: network configuration + single: IP address + +The |rc_xxx| requires an Internet Protocol (:term:`IP`) address for communication with other network +devices. The IP address must be unique in the local network, and can be set either manually via a +user-configurable persistent IP address, or automatically via :term:`DHCP`. +If none of these IP configuration methods apply, the |rc_xxx| falls back to a :term:`Link-Local` IP address. + +.. only:: rc_cube + + The network settings of the |rc_visard| that is used in combination with the |rc_xxx| + are automatically configured when the |rc_visard| is connected to the |rc_xxx|. + + .. note:: To not conflict with the internal network between the |rc_xxx| and + the connected |rc_visard|, the IP address assigned to the |rc_xxx| in the + local network must not be in the range of ``172.23.42.0/24`` and ``172.17.0.0/16``. + +Following the :term:`GigE Vision`\ |reg| standard, the priority of IP configuration methods on the |rc_xxx| is + + 1. Persistent IP (if enabled) + 2. DHCP (if enabled) + 3. Link-Local + +.. figure:: images/ip_configuration_flowchart.* + :width: 60% + :align: center + + |rc_xxx|'s IP configuration method selection flowchart + +Options for changing the |rc_xxx|'s network settings and IP configuration are: + + * the :menuselection:`System --> Network` page of the |rc_xxx|'s |webgui| -- if it is reachable in the local network already, + see :ref:`sect-web-gui`:latex:`\:(Section \ref{webgui:sect-web-gui})` + * any configuration tool compatible with :term:`GigE Vision`\ |reg| 2.0, + or |manufacturer|'s command-line tool ``gc_config``. Typically, these tools scan for all available GigE Vision\ |reg| + devices on the network. All |rc_xxx| devices can be uniquely identified by their serial number and MAC address, + which are both printed on the device. + * temporarily changing or completely resetting the |rc_xxx|'s network configuration via |manufacturer|'s + ``rcdiscover-gui`` tool, see :ref:`sect-discovery-of-rcvisard-devices`:latex:`\:(Section \ref{installation:sect-discovery-of-rcvisard-devices})` + +.. only:: roboception or schunk or matrixvision + + .. note:: The command-line tool ``gc_config`` is part of |manufacturer|'s open-source convenience layer ``rc_genicam_api``, + which can be downloaded free of charge for Windows and Linux from http://www.roboception.com/download. + +.. _sect-network-hostname: + +Host name +^^^^^^^^^ + +.. index:: + single: host name + single: serial number + +.. only:: rc_visard + + The |rc_xxx|'s host name is based on its serial number, which is printed on the device, and + is defined as ``rc-visard-``. + +.. only:: rc_visard_ng + + The |rc_xxx|'s host name is based on its serial number, which is printed on the device, and + is defined as ``rc-visard-ng-``. + +.. only:: rc_cube + + The |rc_xxx|'s host name is based on its serial number, which is printed on the device, and + is defined as ``rc-cube-``. + +.. _sect-auto-network-configuration: + +Automatic configuration (factory default) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. index:: + single: DHCP + single: host name + single: MAC address + +The Dynamic Host Configuration Protocol (:term:`DHCP`) is preferred for setting an IP +address. If DHCP is active on the |rc_xxx|, which is the factory default, the +device tries to contact a DHCP server at startup and every time the network cable is being +plugged in. If a DHCP server is available on the network, the IP address +is automatically configured. + +In some networks, the DHCP server is configured so that it only accepts known +devices. In this case, the Media Access Control address (:term:`MAC address`), which is printed on +the device label, needs to be configured in the DHCP server. At the same time, the |rc_xxx|'s host +name can also be set in the Domain Name Server (:term:`DNS`). Both MAC address and host name should +be sent to the network administrator for configuration. + +.. index:: + single: Link-Local + +If the |rc_xxx| cannot contact a DHCP server within about 15 seconds after startup, or +after plugging in the network cable, it assigns itself a unique +IP address. This process is called :term:`Link-Local`. This option is especially useful for +connecting the |rc_xxx| directly to a computer. The computer must be configured for Link-Local +as well. Link-Local might already be configured as a standard fallback option, +as it is under Windows 10. Other operating systems such as Linux require Link-Local +to be explicitly configured in their network managers. + +.. _sect-manual-network-configuration: + +Manual configuration +^^^^^^^^^^^^^^^^^^^^ + +.. index:: + pair: Baumer; IpConfigTool + pair: GigE Vision; IP address + +Specifying a persistent, i.e. static IP address manually might be useful in some cases. +This address is stored on the |rc_xxx| to be used on device startup or network reconnection. +Please make sure the selected IP address, subnet mask and gateway will not cause any +conflicts on the network. + +.. Warning:: The IP address must be unique within the local network and within the local network's range of valid addresses. + Furthermore, the subnet mask must match the local network; otherwise, the |rcxxx| + may become inaccessible. This can be avoided by using + automatic configuration as explained in :ref:`sect-auto-network-configuration`:latex:`\ (Section \ref{installation:sect-auto-network-configuration})`. + +If this IP address cannot be assigned, e.g. because it is already used by another device in the network, +IP configuration will fall back to automatic configuration via :term:`DHCP` (if enabled) or a :term:`Link-Local` address. + +.. only:: rc_cube + + .. _sect-camera-connection: + + Connection of cameras + --------------------- + + .. index:: + pair: camera connection; installation + + Depending on the |rc_cube| model, two or more 3D cameras can be connected + to the Ethernet ports labelled *sensor0*, *sensor1*, etc. + + The *rc_cube S* has one 2.5 Gigabit Ethernet port for connecting up to two sensors, e.g. + + .. only:: matrixvision + + * connecting one |rc_visard| without additional hardware + * connecting two |rc_visard| devices via a separate 2.5Gbit switch + * connecting one |rc_viscore| via a separate 2.5Gbit switch + + .. only:: roboception or schunk or basler + + * connecting one |rc_visard| without additional hardware + * connecting two |rc_visard| devices via a separate 2.5Gbit switch + * connecting one |rc_viscore| via a separate 2.5Gbit switch + * connecting one |blaze| via a separate 2.5Gbit switch + + The *rc_cube I* has four 1 Gigabit Ethernet ports for connecting up to four sensors, e.g. + + .. only:: matrixvision + + * connecting up to four |rc_visard| devices without additional hardware + * connecting up to two |rc_viscore| devices without additional hardware + + .. only:: roboception or schunk or basler + + * connecting up to four |rc_visard| devices without additional hardware + * connecting up to two |rc_viscore| devices without additional hardware + * connecting up to two |blaze| sensors devices without additional hardware + + It is also possible to connect 3D cameras of different types to an |rc_cube|, if the + number of Ethernet ports permits. However, the + *rc_cube S* cannot process more than two sensors at the same time, the *rc_cube I* not + more than four. + + .. Warning:: The |rc_viscore| :mvexclude:`or Basler blaze` sensor must not be connected via a 1Gbit switch or slower, as this + leads to severe loss of images. + + The |rc_cube| offers up to four software *camera pipelines* for processing data from the connected sensors. + The configuration of the camera pipelines is explained in :doc:`pipelines`:latex:`\:(see Section \ref{pipelines:sect-pipelines})`. + + .. only:: roboception or schunk or basler + + .. _sect-blaze-installation: + + Basler blaze sensors + ^^^^^^^^^^^^^^^^^^^^ + + .. index:: + pair: blaze; installation + pair: blaze; calibration + + After connecting the Basler blaze sensor, it can take up to about one minute until it is found. Upon first + connection of the sensor to the |rc_cube|, the sensor must be calibrated before it can be used. + Calibration can be done through the |webgui| on the page :ref:`sect-camera-calibration`:latex:`\:(Section + \ref{camera_calibration:sect-camera-calibration})` under *Configuration* in the respective pipeline. + After storing the calibration, it will persistently reside on the |rc_cube| and automatically be + used whenever the sensor is connected to the |rc_cube| again, regardless of the port or pipeline. + diff --git a/v24.04/de/_raw_sources/interfaces.rst.txt b/v24.04/de/_raw_sources/interfaces.rst.txt new file mode 100644 index 0000000..18d7d96 --- /dev/null +++ b/v24.04/de/_raw_sources/interfaces.rst.txt @@ -0,0 +1,54 @@ +.. include:: global_rst.glb + + +.. _sect-interfaces: + +Interfaces +========== + +The following interfaces are provided for configuring and obtaining data from the |rc_xxx|: + +- :doc:`webgui`:latex:`\:(Section \ref{webgui:sect-web-gui})` + + Easy-to-use graphical interface to configure the |rc_xxx|, do calibrations, view live images, + do service calls, visualize results, etc. + +- :doc:`GigE Vision 2.0/GenICam`:latex:`\:(Section \ref{gigevision:sect-genicam})` + + Images and camera related configuration. + +- :doc:`REST API`:latex:`\:(Section \ref{rest_api:sect-rest-api})` + + API to configure the |rc_xxx|, query status information, do service calls, etc. + +.. only:: rc_visard + + - :doc:`rc_dynamics streams`:latex:`\:(Section \ref{rc_dynamics:sect-rc-dynamics-interface})` + + Real-time streams containing state estimates with poses, velocities, etc. are provided over the *rc_dynamics* interface. + It sends *protobuf*-encoded messages via UDP. + +- :doc:`Ethernet KRL Interface (EKI)`:latex:`\:(Section \ref{eki:sect-eki})` + + API to configure the |rc_xxx| and do service calls from KUKA KSS robots. + +- :doc:`gRPC image stream`:latex:`\:(Section \ref{grpc:sect-grpc})` + + Stream synchronized image sets via gRPC. + +- :doc:`Time synchronization`:latex:`\:(Section \ref{time_sync:sect-time-sync})` + + Time synchronization between the |rc_xxx| and the application host. + +.. toctree-filt:: + :hidden: + :maxdepth: 2 + + webgui + gigevision + rest_api + :rc_cube_exclude:rc_dynamics + eki + grpc + opc_ua + time_sync diff --git a/v24.04/de/_raw_sources/iocontrol.rst.txt b/v24.04/de/_raw_sources/iocontrol.rst.txt new file mode 100644 index 0000000..a791d57 --- /dev/null +++ b/v24.04/de/_raw_sources/iocontrol.rst.txt @@ -0,0 +1,269 @@ + +.. include:: global_rst.glb + +.. _sect-iocontrol: + +IO and Projector Control +======================== + +The IOControl module is an on-board module of the |rc_visard|. + +The IOControl module allows reading the status of the general purpose +digital inputs and controlling the digital general purpose outputs (GPIOs) +of the |rc_visard|. +The outputs can be set to LOW or HIGH, +or configured to be HIGH for the exposure time of every image or every second image. + +.. only:: rc_cube + + .. note:: + + This module is pipeline specific. Changes to its settings or parameters only affect + the respective camera pipeline and have no influence on other pipelines running on the |rc_cube|. + +The purpose of the IOControl module is the control of an external light source +or a projector, which is connected to one of the |rc_visard|'s GPIOs to be +synchronized by the image acquisition trigger. +In case a pattern projector is used to improve stereo matching, the intensity images +also show the projected pattern, which might be a disadvantage for image processing +tasks that are based on the intensity image (e.g. edge detection). For this reason, +the IOControl module allows setting GPIO outputs to HIGH for the exposure time of +every second image, so that intensity images without the projected pattern are also available. + +.. only:: rc_visard or rc_visard_ng + + .. Note:: For more details on the |rc_xxx|'s GPIOs please refer to + :ref:`sect-wiring`:latex:`, Section \ref{hardware_spec:sect-wiring}`. + +.. _sect-iocontrol-parameters: + +Parameters +---------- + +The IOControl module is called ``rc_iocontrol`` in the |rest-api| and is represented in the +:ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})` +:cubeonly:`in the desired pipeline` under :menuselection:`Configuration --> IOControl`. +The user can change the parameters via the |webgui|, the +:doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`, or via GigE Vision +using the DigitalIOControl parameters ``LineSelector`` and ``LineSource`` +(:ref:`sect-genicam-iocontrol`:latex:`, Section \ref{gigevision:sect-genicam-iocontrol}`). + +Parameter overview +^^^^^^^^^^^^^^^^^^ + +.. include:: _gen/nodes/params/rc_iocontrol.txt + +.. _sect-iocontrol-params: + +Description of run-time parameters +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. _expl-iocontrol-out1-mode: + +``out1_mode`` and ``out2_mode`` (*Out1* and *Out2*) +''''''''''''''''''''''''''''''''''''''''''''''''''' + The output modes for GPIO Out 1 and Out 2 can be set individually: + + ``Low`` sets the output permanently to LOW. This is the factory default. + + ``High`` sets the output permanently to HIGH. + + ``ExposureActive`` sets the output to HIGH for the exposure time of every + image. + + ``ExposureAlternateActive`` sets the output to HIGH for the exposure time + of every second image. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_iocontrol/parameters/parameters?= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_iocontrol/parameters?= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_iocontrol/parameters?= + +:numref:`fig-fps-exposure` shows which images are used for stereo +matching and transmission via GigE Vision in ``ExposureActive`` mode with a +user-defined frame rate of 8 Hz. + +.. _fig-fps-exposure: +.. figure:: images/fps_exposure.* + :width: 100 % + :align: center + + Example of using the ``ExposureActive`` mode for GPIO Out 1 with a user-defined + frame rate of 8 Hz. The internal image acquisition is always |cam-rate|. + GPIO Out 1 is HIGH for the exposure time of every image. A disparity + image is computed for camera images that are sent out via GigE Vision according + to the user-defined frame rate. + +The mode ``ExposureAlternateActive`` is meant to be used when an external random +dot projector is connected to the |rc_visard|'s GPIO Out 1. +When setting Out 1 to ``ExposureAlternateActive``, the +:ref:`stereo matching`:latex:`\:(Section \ref{stereo_matching:sect-stereo-matching})` +module only uses images with GPIO Out 1 being HIGH, i.e. projector is on. The maximum +frame rate that is used for stereo matching is therefore half of the frame rate +configured by the user +(see :ref:`FPS`:latex:`, Section \ref{stereo_camera:sect-cam-params}`). All +modules which make use of the intensity image, like +:ref:`TagDetect`:latex:`\:(Section \ref{tagdetect:sect-tag-detection})` and +:ref:`ItemPick`:latex:`\:(Section \ref{itempick:sect-itempick})`, +use the intensity images with GPIO Out 1 being LOW, i.e. projector is off. +:numref:`fig-fps-alternate` shows an example. + +.. _fig-fps-alternate: +.. figure:: images/fps_alternate.* + :width: 100 % + :align: center + + Example of using the ``ExposureAlternateActive`` mode for GPIO Out 1 with a + user-defined frame rate of 8 Hz. The internal image acquisition is always |cam-rate|. + GPIO Out 1 is HIGH for the exposure time of every second image. A disparity + image is computed for images where Out 1 is HIGH and that are sent out via GigE + Vision according to the user-defined frame rate. In ``ExposureAlternateActive`` + mode, intensity images are always transmitted pairwise: one with GPIO Out 1 HIGH, for which a + disparity image might be available, and one with GPIO Out 1 LOW. + +.. Note:: In ``ExposureAlternateActive`` mode, an intensity image with GPIO Out 1 being HIGH (i.e. with + projection) is always 40 ms away from an intensity image with Out 1 being LOW (i.e. without + projection), regardless of the user-defined frame rate. This needs to be + considered when synchronizing disparity images and camera images without projection + in this special mode. + +The functionality can also be controlled by the DigitalIOControl parameters +of the GenICam interface (:ref:`sect-genicam-iocontrol`:latex:`, Section \ref{gigevision:sect-genicam-iocontrol}`). + + +.. _sect-iocontrol-services: + +Services +-------- + +Each service response contains a ``return_code``, +which consists of a ``value`` plus an optional ``message``. +A successful service returns with a ``return_code`` value of ``0``. +Negative ``return_code`` values indicate that the service failed. +Positive ``return_code`` values indicate that the service succeeded with additional information. + +The IOControl module offers the following services. + +``get_io_values`` +^^^^^^^^^^^^^^^^^ + + Retrieves the current state of the |rc_visard|'s general purpose inputs + and outputs (GPIOs). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_iocontrol/services/get_io_values + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_iocontrol/services/get_io_values + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_iocontrol/services/get_io_values + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_iocontrol_get_io_values_request.txt + + .. tab:: **Response** + + The returned ``timestamp`` is the time of measurement. + + ``input_mask`` and ``output_mask`` are bit masks defining which bits are used for input and + output values, respectively. + + ``values`` holds the values of the bits corresponding to input and output as given by the + ``input_mask`` and ``output_mask``. + + ``return_code`` holds possible warnings or error codes and messages. + Possible ``return_code`` values are shown below. + + .. tabularcolumns:: |c|L| + .. csv-table:: + :header: Code, Description + + "0", "Success" + "-2", "Internal error" + "-9", "License for `IOControl` is not available" + + .. include:: _gen/nodes/services/rc_iocontrol_get_io_values_response.txt + +``reset_defaults`` +^^^^^^^^^^^^^^^^^^ + + Restores and applies the default values for this module's parameters + ("factory reset"). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_iocontrol/services/reset_defaults + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_iocontrol/services/reset_defaults + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_iocontrol/services/reset_defaults + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_iocontrol_reset_defaults_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_iocontrol_reset_defaults_response.txt diff --git a/v24.04/de/_raw_sources/itempick.rst.txt b/v24.04/de/_raw_sources/itempick.rst.txt new file mode 100644 index 0000000..4f3d1c2 --- /dev/null +++ b/v24.04/de/_raw_sources/itempick.rst.txt @@ -0,0 +1,1510 @@ + +.. include:: global_rst.glb + +.. _sect-itempick: + +ItemPick and BoxPick +==================== + +.. index:: ! ItemPick + single: bin picking + single: grasp computation + +.. index:: ! BoxPick + +Introduction +------------ + +.. Short description and functionalities + +The ItemPick and BoxPick modules provide out-of-the-box perception solutions for robotic pick-and-place +applications. ItemPick targets the detection of flat surfaces of unknown objects for picking +with a suction gripper. BoxPick detects rectangular surfaces and determines their position, +orientation and size for grasping. With the +Match extension, BoxPick can be used to +detect textured rectangles with consistent orientations. The interface of both modules is very similar. Therefore +both modules are described together in this chapter. + +In addition, both modules offer: + +- A dedicated page on the |rc_xxx| :ref:`sect-web-gui`:latex:`\:(Section \ref{webgui:sect-web-gui})` + for easy setup, configuration, testing, and application tuning. +- The definition of regions of interest to select relevant volumes in the scene + (see :ref:`sect-roi`:latex:`, Section \ref{roi:sect-roi}`). +- A load carrier detection functionality for bin-picking applications + (see :ref:`sect-loadcarrier`:latex:`, Section \ref{loadcarrier:sect-loadcarrier}`), + to provide grasps for items inside a bin only. +- The definition of compartments inside a load carrier to provide grasps + for specific volumes of the bin only. +- Support for static and robot-mounted cameras and + optional integration with the :doc:`handeye_calibration` + :latex:`(Section \ref{handeye_calibration:sect-handeye-calibration})` module, + to provide grasps in the user-configured external reference frame. +- A quality value associated to each suggested grasp and related to the flatness of the grasping surface. +- Selection of a sorting strategy to sort the returned grasps. +- 3D visualization of the detection results with grasp points and gripper animations in the |webgui|. + +.. only:: rc_cube + + .. note:: + + These modules are pipeline specific. Changes to their settings or parameters only affect + the respective camera pipeline and have no influence on other pipelines running on the |rc_cube|. + +.. Note:: + + In this chapter, cluster and surface are used as synonyms and identify a set of + points (or pixels) with defined geometrical properties. + +The modules are optional on-board modules of the |rc_xxx| +and require separate ItemPick or BoxPick :ref:`licenses` +:latex:`(Section \ref{maintenance:sect-updating-license})` to be purchased. +The +Match extension of BoxPick requires an extra license. + +.. _sect-itempick-detect-items: + +Detection of items (BoxPick) +---------------------------- + +.. index:: + single: BoxPick; item models + +There are two different types of models for the rectangles to be detected by the BoxPick module. + +Per default, BoxPick only supports ``item_models`` of +``type`` ``RECTANGLE``. With the +Match extension, also item models +of ``type`` ``TEXTURED_BOX`` can be detected. The detection of the +different item model types is described below. + +Optionally, further information can be given to the BoxPick module: + +- The ID of the load carrier which contains the items to be detected. +- A compartment inside the load carrier where to detect items. +- The ID of the region of interest where to search for the load carriers if a + load carrier is set. + Otherwise, the ID of the region of interest where to search for the items. +- The current robot pose in case the camera is mounted on the robot and + the chosen coordinate frame for the poses is ``external`` or the chosen + region of interest is defined in the external frame. + +The returned ``pose`` of a detected ``item`` is the pose of the center of the detected rectangle in the +desired reference frame (``pose_frame``), with its z axis pointing towards the camera and the x axis +aligned with the long side of the item. This pose has a 180° rotation ambiguity around the z axis, which can be resolved +by using the +Match extension with a ``TEXTURED_BOX`` item model. +Each detected item includes a ``uuid`` (Universally Unique Identifier) and the +``timestamp`` of the oldest image that was used to detect it. + +.. _sect-itempick-detect-items-rectangle: + +Detection of items of type RECTANGLE (BoxPick) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. index:: + single: BoxPick; RECTANGLE + +BoxPick supports multiple ``item_models`` of ``type`` ``RECTANGLE``. +Each item model is defined by its minimum and maximum size, with the +minimum dimensions strictly smaller than the maximum dimensions. +The dimensions should be given fairly accurately to avoid misdetections, +while still considering a certain tolerance to account for possible production variations +and measurement inaccuracies. + +The detection of the rectangles runs in several steps. First, the point cloud is segmented into +preferably plane clusters. Then, straight line segments are detected in the 2D images +and projected onto the corresponding clusters. The clusters and the detected lines are +visualized in the "Intermediate Result" visualization +on the |webgui|'s *BoxPick* page. Finally, for each cluster, the set of +rectangles best fitting to the detected line segments is extracted. + +.. _sect-itempick-detect-items-textured-box: + +Detection of items of type TEXTURED_BOX (BoxPick+Match) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. index:: + single: BoxPick; views + single: BoxPick; texture + single: BoxPick; TEXTURED_BOX + +With the +Match extension, BoxPick additionally supports ``item_models`` of ``type`` ``TEXTURED_BOX``. +When this item model type is used, only one item model can be given for each request. + +The ``TEXTURED_BOX`` item model type should be used to detect multiple rectangles that have the same texture, i.e. the same look or print, +such as printed product packaging, labels, brochures or books. It is required that for all objects the texture is at the same position with respect +to the object geometry. Furthermore, the texture should not be repetitive. + +A ``TEXTURED_BOX`` item is defined by the item's exact ``dimensions`` ``x``, ``y`` and ``z`` (currently ``z`` +must always be 0) with a tolerance ``dimensions_tolerance_m`` that indicates, +how much the detected dimensions are allowed to deviate from the given dimensions. By default, a tolerance of 0.01 m is assumed. +Furthermore, a ``template_id`` must be given, which will be used to refer to the specified dimensions and the +textures of the detected rectangles. Additionally, the maximum possible deformation of the items ``max_deformation_m`` +can be given in meters (default 0.004 m), to account for rigid or more flexible objects. + +If a ``template_id`` is used for the first time, BoxPick will run the detection of rectangles as for the item +model type ``RECTANGLE``, and use the given dimensions tolerance to specify the dimensions range. From the detected +rectangles, so-called *views* are created, which contain the shape and the image intensity values of the rectangles, +and are stored in a newly created template with the given ``template_id``. The views are created iteratively: Starting +from the detected rectangle with the highest score, a view is created and then used to detect more rectangles with the same +texture. Then, all remaining clusters are used to detect further rectangles by the given dimensions range and again a view is +created from the best rectangle and used for further detections. +Each template can store up to 10 different views, for example corresponding to different types of the same product packaging. +Each view will be assigned a unique ID (``view_uuid``) +and all rectangle items with a matching texture will be assigned the same ``view_uuid``. That also means that all items +with the same ``view_uuid`` will have consistent orientations, because the orientation of each item is aligned with its texture. +The views can be displayed, deleted and the orientation of each view can be set via the +:ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})` by clicking on the template or its edit symbol in the template list. +Each detected item contains a field ``view_pose_set`` indicating whether the orientation of the item's view was explicitly set or +is still unset at its original random state, which has a 180° ambiguity. The ``type`` of a returned item with a ``view_uuid`` will be +``TEXTURED_RECTANGLE``. + +If the template with the given ``template_id`` already exists, the existing views will be used to detect rectangles based on their +texture. If additional rectangles are found with matching dimensions, but different texture, new views will be generated and added +to the template. When the maximum number of views is reached, views that are matched only rarely will be deleted so that newly generated +views can be added to the template and the template is kept up-to-date. To prevent a template from being updated, automatic updating can be disabled and enabled for +each template in the |webgui| by clicking on the template or the edit symbol in the template list. +The dimension tolerance and the maximum deformation can also be changed there for each template. The maximum deformation determines +the tolerance for the texture matching, representing possible shifts within the texture, e.g. caused by deformations of the object surface. +For rigid objects the ``max_deformation_m`` should be set to a low value in meters to ensure accurate matching. + +The template's ``dimensions`` can only be specified when creating a new template. Once the template is generated, the dimensions cannot be changed +and do not need to be given in the detect request. If the dimensions are still given in the request, they must match the existing dimensions +in the template. However, the ``dimensions_tolerance_m`` +and ``max_deformation_m`` can be set differently in every detect request and their values will also be updated in the stored template. + +.. _sect-itempick-compute-grasps: + +Computation of grasps +--------------------- + +.. index:: + single: BoxPick; grasp + single: ItemPick; grasp + single: BoxPick; grasp sorting + single: ItemPick; grasp sorting + +The ItemPick and BoxPick modules offer a service for computing grasps for +suction grippers. The gripper is defined by its suction surface length and width. + +The ItemPick module identifies flat surfaces in the scene and supports +flexible and/or deformable items. The ``type`` of these ``item_models`` is +called ``UNKNOWN`` since they don't need to have a standard geometrical shape. +Optionally, the user can also specify the minimum and maximum size of the item. + +For BoxPick, the grasps are computed on the detected rectangular ``items`` +(see :ref:`sect-itempick-detect-items`:latex:`, Section \ref{itempick:sect-itempick-detect-items}`). + +Optionally, further information can be given to the modules in a grasp +computation request: + +- The ID of the load carrier which contains the items to be grasped. +- A compartment inside the load carrier where to compute grasps + (see :ref:`sect-loadcarrier-compartment`:latex:`, Section \ref{loadcarrier_db:sect-loadcarrier-compartment}`). +- The ID of the 3D region of interest where to search for the load carriers if a + load carrier is set. + Otherwise, the ID of the 3D region of interest where to compute grasps. +- Collision detection information: The ID of the gripper to enable collision checking and optionally + a pre-grasp offset to define a pre-grasp position. + Details on collision + checking are given below in :ref:`sect-itempick-collision-check-dep`:latex:`\:(Section \ref{itempick:sect-itempick-collision-check-dep})`. + + +A grasp provided by the ItemPick and BoxPick modules represents the recommended +pose of the TCP (Tool Center Point) of the suction gripper. +The grasp ``type`` is always set to ``SUCTION``. +The computed grasp pose is the center of the biggest ellipse that can be inscribed in +each surface. +The grasp orientation is a right-handed coordinate system and is defined such +that its z axis is normal to the surface pointing inside the object at the grasp position and +its x axis is directed along the maximum elongation of the ellipse. + +.. _fig-itempick-grasp-surface: +.. figure:: images/itempick_grasp_surface.png + :width: 300 px + :align: center + + Illustration of suction grasp with coordinate system and ellipse representing + the maximum suction surface. + +Each grasp includes the dimensions of the maximum suction surface available, +modelled as an ellipse of axes ``max_suction_surface_length`` and +``max_suction_surface_width``. The user is enabled to filter grasps by specifying +the minimum suction surface required by the suction device in use. + +In the BoxPick module, the grasp position corresponds to the center of the detected +rectangle and the dimensions of the maximum suction surface available matches the estimated +rectangle dimensions. Detected rectangles with missing data or occlusions by other objects for more +than 15% of their surface do not get an associated grasp. + +Each grasp also includes a ``quality`` value, which gives an +indication of the flatness of the grasping surface. +The ``quality`` value varies between 0 and 1, where higher numbers correspond to a +flatter reconstructed surface. + +.. In case of multi-cup suction devices, the suction surface +.. is expected to cover all suction elements. + +The grasp definition is complemented by a ``uuid`` (Universally Unique Identifier) +and the ``timestamp`` of the oldest image that was used to compute the grasp. + +Grasp sorting is performed based on the selected sorting strategy. The following sorting strategies +are available and can be set in the :ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})` +or using the ``set_sorting_strategies`` service call: + +- ``gravity``: highest grasp points along the gravity direction are returned first, +- ``surface_area``: grasp points with the largest surface area are returned first, +- ``direction``: grasp points with the shortest distance along a defined direction ``vector`` in a given ``pose_frame`` are returned first. + +If no sorting strategy is set or default sorting is chosen in the |webgui|, sorting is done based on a combination of +``gravity`` and ``surface_area``. + +.. _sect-itempick-dependencies: + +Interaction with other modules +------------------------------ + +Internally, the ItemPick and BoxPick modules depend on, and interact with other on-board +modules as listed below. + +.. Note:: + All changes and configuration updates to these modules will affect + the performance of the ItemPick and BoxPick modules. + +.. For each load carrier detection and grasp computation, the ItemPick module +.. acquires datasets of synchronized images and estimates the gravity vector. +.. The data acquisition step normally takes between 500 ms and 600 ms +.. with "High" depth image quality. + +.. _sect-itempick-stereo-camera-matching: + +Stereo camera and Stereo matching +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The ItemPick and BoxPick modules make internally use of the following data: + +- Rectified images from the :doc:`stereo_camera` module + (``rc_camera``:latex:`, Section \ref{stereo_camera:sect-stereo-camera}`); + +- Disparity, error, and confidence images from the :doc:`stereo_matching` module + (``rc_stereomatching``:latex:`, Section \ref{stereo_matching:sect-stereo-matching}`). + +All processed images are guaranteed to be captured after the module trigger time. + +.. _sect-itempick-iocontrol-dep: + +IO and Projector Control +^^^^^^^^^^^^^^^^^^^^^^^^ + +In case the |rc_xxx| is used in conjunction with an external random dot projector and +the :doc:`iocontrol` module (``rc_iocontrol``:latex:`, Section \ref{iocontrol:sect-iocontrol}`), +it is recommended to connect the projector to GPIO Out 1 and set +the stereo-camera module's acquisition mode to ``SingleFrameOut1`` +(see :ref:`Stereo matching parameters`:latex:`, Section \ref{stereo_matching:sect-disp-image-parameters}`), so that +on each image acquisition trigger an image with and without projector pattern is acquired. + +Alternatively, the output mode for the GPIO output in use should be set to ``ExposureAlternateActive`` +(see :ref:`sect-iocontrol-params`:latex:`, Section \ref{iocontrol:sect-iocontrol-params}`). + +In either case, +the *Auto Exposure Mode* ``exp_auto_mode`` should be set to ``AdaptiveOut1`` to optimize the exposure +of both images (see :ref:`Stereo camera parameters`:latex:`, Section \ref{stereo_camera:sect-cam-params}`). + +.. _sect-itempick-hand-eye-dep: + +Hand-eye calibration +^^^^^^^^^^^^^^^^^^^^ + +In case the camera has been calibrated to a robot, the ItemPick and BoxPick modules +can automatically provide poses in the robot coordinate frame. +For the ItemPick and BoxPick nodes' :ref:`sect-itempick-services`:latex:`\:(Section \ref{itempick:sect-itempick-services})`, the frame of the +output poses can be controlled with the ``pose_frame`` argument. + +Two different ``pose_frame`` values can be chosen: + +1. **Camera frame** (``camera``). + All poses provided by the modules are in the camera frame, + and no prior knowledge about the pose of the camera in the environment is required. + This means that the configured regions of interest and load carriers move with the camera. + It is the user's responsibility to update the configured poses + if the camera frame moves (e.g. with a robot-mounted camera). + +2. **External frame** (``external``). + All poses provided by the modules are in the external frame, + configured by the user during the hand-eye calibration process. + The module relies on the on-board + :doc:`Hand-eye calibration module`:latex:`\:(Section \ref{handeye_calibration:sect-handeye-calibration})` + to retrieve the sensor mounting (static or robot mounted) and + the hand-eye transformation. + If the mounting is static, no further information is needed. + If the sensor is robot-mounted, the ``robot_pose`` is required + to transform poses to and from the ``external`` frame. + +.. Note:: + If no hand-eye calibration is available, all ``pose_frame`` values should be set to ``camera``. + +All ``pose_frame`` values that are not ``camera`` or ``external`` are rejected. + +If the sensor is robot-mounted, the current ``robot_pose`` has to be provided depending on the value of ``pose_frame`` +and the definition of the sorting direction: + +- If ``pose_frame`` is set to ``external``, providing the robot pose is obligatory. +- If the sorting direction is defined in ``external``, providing the robot pose is obligatory. +- In all other cases, providing the robot pose is optional. + +.. _sect-itempick-load-carrier-dep: + +LoadCarrier +^^^^^^^^^^^ + +The ItemPick and BoxPick modules use the load carrier detection functionality provided by the +:doc:`loadcarrier` module (``rc_load_carrier``:latex:`, Section \ref{loadcarrier:sect-loadcarrier}`), +with the run-time parameters specified for this module. However, only one load carrier will be +returned and used in case multiple matching load carriers could be found in the scene. In case multiple +load carriers of the same type are visible, a 3D region of interest should be set to ensure that always the +same load carrier is used for the ItemPick and BoxPick modules. + +.. _sect-itempick-collision-check-dep: + +CollisionCheck +^^^^^^^^^^^^^^ + +Collision checking can be easily enabled for +grasp computation of the ItemPick and BoxPick modules by passing the ID of the used gripper and +optionally a pre-grasp offset to the +``compute_grasps`` service call. The gripper has to be +defined in the GripperDB module +(see :ref:`sect-gripper-db-gripper`:latex:`, Section \ref{gripper_db:sect-gripper-db-gripper}`) +and details about collision checking are given in :ref:`sect-collision-check-other-modules`:latex:`\:(Section \ref{collisioncheck:sect-collision-check-other-modules})`. + +If collision checking is enabled, only grasps which are collision free will be returned. +However, the visualization images on the *ItemPick* or *BoxPick* +page of the |webgui| also show colliding grasp points as black ellipses. + +The CollisionCheck module's run-time parameters affect the collision detection as described in +:ref:`CollisionCheck Parameters`:latex:`\:(Section \ref{collisioncheck:sect-collisioncheck-parameters})`. + + +.. _sect-itempick-parameters: + +Parameters +---------- + +.. index:: + single: BoxPick; parameters + single: ItemPick; parameters + +The ItemPick and BoxPick modules are called ``rc_itempick`` and ``rc_boxpick`` +in the |rest-api| and are represented in the :ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})` +:cubeonly:`in the desired pipeline` under +:menuselection:`Modules --> ItemPick` and :menuselection:`Modules --> BoxPick`. +The user can explore and configure the ``rc_itempick`` and ``rc_boxpick`` +module's run-time parameters, e.g. for development and testing, using the |webgui| or the +:doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`. + +Parameter overview +^^^^^^^^^^^^^^^^^^ + +.. only:: rc_cube + + .. note:: The default values in the parameter table + below show the values of the |rc_visard|. The values can be + different for other sensors. + +.. include:: _gen/nodes/params/rc_itempick_split.txt + +Description of run-time parameters +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Each run-time parameter is represented by a row on the |webgui|'s *ItemPick* or *BoxPick* page. +The name in the |webgui| is given in brackets behind the parameter name and the parameters are +listed in the order they appear in the |webgui|: + +.. _expl-itempick-max-grasps: + +``max_grasps`` (*Maximum Grasps*) +''''''''''''''''''''''''''''''''' + sets the maximum number of provided grasps. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes//parameters/parameters?max_grasps= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//parameters?max_grasps= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//parameters?max_grasps= + +.. _expl-itempick-cluster-max-dimension: + +``cluster_max_dimension`` (**Only for ItemPick**, *Cluster Maximum Dimension*) +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + is the maximum allowed diameter for a cluster in meters. Clusters with a diameter larger than this value are not used for grasp computation. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_itempick/parameters/parameters?cluster_max_dimension= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_itempick/parameters?cluster_max_dimension= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_itempick/parameters?cluster_max_dimension= + +.. _expl-itempick-cluster-max-curvature: + +``cluster_max_curvature`` (*Cluster Maximum Curvature*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''' + is the maximum curvature allowed within one cluster. The smaller this value, the more clusters will be split apart. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes//parameters/parameters?cluster_max_curvature= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//parameters?cluster_max_curvature= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//parameters?cluster_max_curvature= + +.. _expl-itempick-clustering-patch-size: + +``clustering_patch_size`` (**Only for ItemPick**, *Patch Size*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + is the size of the square patches the depth map is subdivided into during the first clustering step in pixels. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_itempick/parameters/parameters?clustering_patch_size= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_itempick/parameters?clustering_patch_size= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_itempick/parameters?clustering_patch_size= + +.. _expl-itempick-clustering-discontinuity-factor: + +``clustering_discontinuity_factor`` (*Discontinuity Factor*) +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + is the factor used to discriminate depth discontinuities within a patch. The smaller this value, the more clusters will be split apart. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes//parameters/parameters?clustering_discontinuity_factor= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//parameters?clustering_discontinuity_factor= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//parameters?clustering_discontinuity_factor= + +.. _expl-itempick-clustering-max-surface-rmse: + +``clustering_max_surface_rmse`` (*Maximum Surface RMSE*) +'''''''''''''''''''''''''''''''''''''''''''''''''''''''' + is the maximum root-mean-square error (RMSE) in meters of points belonging to a surface. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes//parameters/parameters?clustering_max_surface_rmse= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//parameters?clustering_max_surface_rmse= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//parameters?clustering_max_surface_rmse= + +.. _expl-boxpick-mode: + +``mode`` (**Only for BoxPick**, *Mode*) +''''''''''''''''''''''''''''''''''''''' + determines the mode of the rectangle detection. Possible values are ``Unconstrained``, ``PackedGridLayout`` and ``PackedLayers``. + In ``PackedGridLayout`` mode, rectangles of a cluster are detected in a dense grid pattern. + In ``PackedLayers`` mode, boxes are assumed to form layers and box detection will start searching for items at the cluster corners. + Use this mode in de-palletizing applications. + In ``Unconstrained`` mode (default), rectangles are detected without posing any constraints on their relative locations or their + positions in the segmented cluster. :numref:`fig-boxpick-modes` illustrates the modes for different scenarios. + + .. _fig-boxpick-modes: + .. figure:: images/boxpick_modes_new.* + :width: 100% + :align: center + + Illustration of appropriate BoxPick modes for different scenes. Modes marked with yellow are applicable but not + recommended for the corresponding scene. The gray areas indicate the rectangles to be detected. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_boxpick/parameters/parameters?mode= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_boxpick/parameters?mode= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_boxpick/parameters?mode= + +.. _expl-boxpick-manual-line-sensitivity: + +``manual_line_sensitivity`` (**Only for BoxPick**, *Manual Line Sensitivity*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + determines whether the user-defined line sensitivity should be used + to extract the lines for rectangle detection. If this + parameter is set to true, the user-defined ``line_sensitivity`` value + will be used. If this parameter is set to false, automatic line sensitivity + will be used. This parameter should be set to true when automatic line sensitivity + does not give enough lines at the box boundaries so that boxes cannot be detected. + The detected line segments are visualized in the "Intermediate Result" visualization on the + |webgui|'s *BoxPick* page. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_boxpick/parameters/parameters?manual_line_sensitivity= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_boxpick/parameters?manual_line_sensitivity= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_boxpick/parameters?manual_line_sensitivity= + +.. _expl-boxpick-line-sensitivity: + +``line_sensitivity`` (**Only for BoxPick**, *Line Sensitivity*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + determines the line sensitivity for extracting the lines for rectangle detection, if the + parameter ``manual_line_sensitivity`` is set to true. Otherwise, the value of this parameter + has no effect on the rectangle detection. Higher values give more line segments, but also + increase the runtime of the box detection. This parameter should be increased when boxes + cannot be detected because their boundary edges are not detected. The detected line segments + are visualized in the "Intermediate Result" visualization on the |webgui|'s *BoxPick* page. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_boxpick/parameters/parameters?line_sensitivity= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_boxpick/parameters?line_sensitivity= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_boxpick/parameters?line_sensitivity= + +.. _expl-boxpick-prefer-splits: + +``prefer_splits`` (**Only for BoxPick**, *Prefer Splits*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + determines whether rectangles should be split into smaller ones if the smaller ones also match the given + item models. This parameter should be set to true for packed box layouts in which the given item models + would also match a rectangle of the size of two adjoining boxes. If this parameter is set to false, the larger + rectangles will be preferred in these cases. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_boxpick/parameters/parameters?prefer_splits= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_boxpick/parameters?prefer_splits= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_boxpick/parameters?prefer_splits= + +.. _expl-boxpick-min-cluster-coverage: + +``min_cluster_coverage`` (**Only for BoxPick**, *Minimum Cluster Coverage*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + determines which ratio of each segmented cluster must be covered with rectangle detections to + consider the detections to be valid. If the minimum cluster coverage is not reached for a cluster, + no rectangle detections will be returned for this cluster and a warning will be given. + This parameter should be used to verify that all items on a layer in a de-palletizing scenario are + detected. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_boxpick/parameters/parameters?min_cluster_coverage= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_boxpick/parameters?min_cluster_coverage= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_boxpick/parameters?min_cluster_coverage= + + +.. _sect-itempick-status-values: + +Status values +------------- + +.. index:: + single: BoxPick; status + single: ItemPick; status + +The ``rc_itempick`` and ``rc_boxpick`` modules report the following status values: + +.. tabularcolumns:: |l|L| +.. csv-table:: The ``rc_itempick`` and ``rc_boxpick`` modules status values + :header: Name, Description + + "``data_acquisition_time``","Time in seconds required by the last active service to acquire images" + "``grasp_computation_time``","Processing time of the last grasp computation in seconds" + "``last_timestamp_processed``","The timestamp of the last processed dataset" + "``load_carrier_detection_time``","Processing time of the last load carrier detection in seconds" + "``processing_time``","Processing time of the last detection (including load carrier detection) in seconds" + "``state``","The current state of the rc_itempick and rc_boxpick node" + +The reported ``state`` can take one of the following values. + +.. tabularcolumns:: |l|l| +.. _tab-itempick-states: +.. csv-table:: Possible states of the ItemPick and BoxPick modules + :header: State name, Description + + "IDLE", "The module is idle." + "RUNNING", "The module is running and ready for load carrier detection and grasp computation." + "FATAL", "A fatal error has occurred." + +.. _sect-itempick-services: + +Services +-------- + +.. index:: + single: BoxPick; services + single: ItemPick; services + +The user can explore and call the ``rc_itempick`` and ``rc_boxpick`` module's services, +e.g. for development and testing, using the +:doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` or +the |rc_xxx| +:ref:`sect-web-gui`:latex:`\:(Section \ref{webgui:sect-web-gui})`. + +The ItemPick and BoxPick modules offer the following services. + +.. _expl-itempick-srv-detect-items: + +``detect_items`` (BoxPick only) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + Triggers the detection of rectangles as described in + :ref:`sect-itempick-detect-items`:latex:`\:(Section \ref{itempick:sect-itempick-detect-items})`. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_boxpick/services/detect_items + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_boxpick/services/detect_items + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_boxpick/services/detect_items + + .. tabs:: + + .. tab:: **Request** + + Required arguments: + + ``pose_frame``: see :ref:`sect-itempick-hand-eye-dep`:latex:`\:(Section \ref{itempick:sect-itempick-hand-eye-dep})`. + + ``item_models``: list of item models to be detected. + The type of the item model must be ``RECTANGLE`` or ``TEXTURED_BOX``. For type ``RECTANGLE``, ``rectangle`` must be filled, + while for ``TEXTURED_BOX``, ``textured_box`` must be filled. + See :ref:`sect-itempick-detect-items`:latex:`\:(Section \ref{itempick:sect-itempick-detect-items})` for a detailed description + of the item model types. + + Potentially required arguments: + + ``robot_pose``: see :ref:`sect-itempick-hand-eye-dep`:latex:`\:(Section \ref{itempick:sect-itempick-hand-eye-dep})`. + + Optional arguments: + + ``load_carrier_id``: ID of the load carrier which contains the items to be detected. + + ``load_carrier_compartment``: compartment inside the load carrier where to detect items + (see :ref:`sect-loadcarrier-compartment`:latex:`, Section \ref{loadcarrier_db:sect-loadcarrier-compartment}`). + + ``region_of_interest_id``: if ``load_carrier_id`` is set, + ID of the 3D region of interest where to search for the load carriers. + Otherwise, ID of the 3D region of interest where to search for the items. + + .. include:: _gen/nodes/services/rc_boxpick_detect_items_request.txt + + + .. tab:: **Response** + + ``load_carriers``: list of detected load carriers. + + ``items``: list of detected rectangles. + + ``timestamp``: timestamp of the image set the detection ran on. + + ``return_code``: holds possible warnings or error codes and messages. + + .. include:: _gen/nodes/services/rc_boxpick_detect_items_response.txt + +.. _expl-itempick-srv-compute-grasps: + +``compute_grasps`` (for ItemPick) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Triggers the computation of grasping poses for a suction device as described in + :ref:`sect-itempick-compute-grasps`:latex:`\:(Section \ref{itempick:sect-itempick-compute-grasps})`. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_itempick/services/compute_grasps + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_itempick/services/compute_grasps + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_itempick/services/compute_grasps + + .. tabs:: + + .. tab:: **Request** + + Required arguments: + + ``pose_frame``: see :ref:`sect-itempick-hand-eye-dep`:latex:`\:(Section \ref{itempick:sect-itempick-hand-eye-dep})`. + + ``suction_surface_length``: length of the suction device grasping surface. + + ``suction_surface_width``: width of the suction device grasping surface. + + Potentially required arguments: + + ``robot_pose``: see :ref:`sect-itempick-hand-eye-dep`:latex:`\:(Section \ref{itempick:sect-itempick-hand-eye-dep})`. + + Optional arguments: + + ``load_carrier_id``: ID of the load carrier which contains the items to be grasped. + + ``load_carrier_compartment``: compartment inside the load carrier where to compute grasps + (see :ref:`sect-loadcarrier-compartment`:latex:`, Section \ref{loadcarrier_db:sect-loadcarrier-compartment}`). + + ``region_of_interest_id``: if ``load_carrier_id`` is set, + ID of the 3D region of interest where to search for the load carriers. + Otherwise, ID of the 3D region of interest where to compute grasps. + + ``item_models``: list of unknown items with minimum and maximum dimensions, with the + minimum dimensions strictly smaller than the maximum dimensions. + Only one ``item_model`` of type ``UNKNOWN`` is currently supported. + + ``collision_detection``: see :ref:`sect-collision-check-other-modules`:latex:`\:(Section \ref{collisioncheck:sect-collision-check-other-modules})`. + + .. include:: _gen/nodes/services/rc_itempick_compute_grasps_request.txt + + + .. tab:: **Response** + + ``load_carriers``: list of detected load carriers. + + ``grasps``: sorted list of suction grasps. + + ``timestamp``: timestamp of the image set the detection ran on. + + ``return_code``: holds possible warnings or error codes and messages. + + .. include:: _gen/nodes/services/rc_itempick_compute_grasps_response.txt + + + +.. _expl-itempick-srv-compute-grasps-boxpick: + +``compute_grasps`` (for BoxPick) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Triggers the detection of rectangles and the computation of grasping poses + for the detected rectangles as described in + :ref:`sect-itempick-compute-grasps`:latex:`\:(Section \ref{itempick:sect-itempick-compute-grasps})`. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_boxpick/services/compute_grasps + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_boxpick/services/compute_grasps + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_boxpick/services/compute_grasps + + .. tabs:: + + .. tab:: **Request** + + Required arguments: + + ``pose_frame``: see :ref:`sect-itempick-hand-eye-dep`:latex:`\:(Section \ref{itempick:sect-itempick-hand-eye-dep})`. + + ``item_models``: list of item models to be detected. + The type of the item model must be ``RECTANGLE`` or ``TEXTURED_BOX``. For type ``RECTANGLE``, ``rectangle`` must be filled, + while for ``TEXTURED_BOX``, ``textured_box`` must be filled. + See :ref:`sect-itempick-detect-items`:latex:`\:(Section \ref{itempick:sect-itempick-detect-items})` for a detailed description + of the item model types. + + ``suction_surface_length``: length of the suction device grasping surface. + + ``suction_surface_width``: width of the suction device grasping surface. + + Potentially required arguments: + + ``robot_pose``: see :ref:`sect-itempick-hand-eye-dep`:latex:`\:(Section \ref{itempick:sect-itempick-hand-eye-dep})`. + + Optional arguments: + + ``load_carrier_id``: ID of the load carrier which contains the items to be grasped. + + ``load_carrier_compartment``: compartment inside the load carrier where to compute grasps + (see :ref:`sect-loadcarrier-compartment`:latex:`, Section \ref{loadcarrier_db:sect-loadcarrier-compartment}`). + + ``region_of_interest_id``: if ``load_carrier_id`` is set, + ID of the 3D region of interest where to search for the load carriers. + Otherwise, ID of the 3D region of interest where to compute grasps. + + ``collision_detection``: see :ref:`sect-collision-check-other-modules`:latex:`\:(Section \ref{collisioncheck:sect-collision-check-other-modules})`. + + .. include:: _gen/nodes/services/rc_boxpick_compute_grasps_request.txt + + + .. tab:: **Response** + + ``load_carriers``: list of detected load carriers. + + ``items``: list of detected rectangles. + + ``grasps``: sorted list of suction grasps. + + ``timestamp``: timestamp of the image set the detection ran on. + + ``return_code``: holds possible warnings or error codes and messages. + + .. include:: _gen/nodes/services/rc_boxpick_compute_grasps_response.txt + + +.. _expl-itempick-srv-set-sorting-strategies: + +``set_sorting_strategies`` +^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Persistently stores the sorting strategy for sorting the grasps returned by the ``compute_grasps`` service + (see :ref:`sect-itempick-compute-grasps`:latex:`, Section \ref{itempick:sect-itempick-compute-grasps}`). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes//services/set_sorting_strategies + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//services/set_sorting_strategies + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//services/set_sorting_strategies + + .. tabs:: + + .. tab:: **Request** + + Only one strategy may have a ``weight`` greater than 0. If all ``weight`` values are set to 0, the module will use the + default sorting strategy. + + If the weight for ``direction`` is set, the + ``vector`` must contain the direction vector and ``pose_frame`` must be either ``camera`` or ``external``. + + .. include:: _gen/nodes/services/rc_itempick_set_sorting_strategies_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_itempick_set_sorting_strategies_response.txt + +.. _expl-itempick-srv-get-sorting-strategies: + +``get_sorting_strategies`` +^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns the sorting strategy for sorting the grasps returned by the ``compute-grasps`` service + (see :ref:`sect-itempick-compute-grasps`:latex:`, Section \ref{itempick:sect-itempick-compute-grasps}`). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes//services/get_sorting_strategies + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//services/get_sorting_strategies + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//services/get_sorting_strategies + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_itempick_get_sorting_strategies_request.txt + + .. tab:: **Response** + + All ``weight`` values are 0 when the module uses the default sorting strategy. + + .. include:: _gen/nodes/services/rc_itempick_get_sorting_strategies_response.txt + +.. _expl-itempick-srv-start: + +``start`` +^^^^^^^^^ + + Starts the module. If the command is accepted, the module moves to state ``RUNNING``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes//services/start + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//services/start + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//services/start + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_itempick_start_request.txt + + .. tab:: **Response** + + The ``current_state`` value in the service response may differ from ``RUNNING`` if + the state transition is still in process when the service returns. + + .. include:: _gen/nodes/services/rc_itempick_start_response.txt + +.. _expl-itempick-srv-stop: + +``stop`` +^^^^^^^^ + + Stops the module. If the command is accepted, the module moves to state ``IDLE``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes//services/stop + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//services/stop + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//services/stop + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_itempick_stop_request.txt + + .. tab:: **Response** + + The ``current_state`` value in the service response may differ from ``IDLE`` if + the state transition is still in process when the service returns. + + .. include:: _gen/nodes/services/rc_itempick_stop_response.txt + +.. only:: rc_cube + + .. _expl-itempick-srv-trigger-dump: + + ``trigger_dump`` + ^^^^^^^^^^^^^^^^ + Triggers dumping of the detection that corresponds to the given timestamp, + or the latest detection, if no timestamp is given. The dumps are saved to the + connected USB drive. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//services/trigger_dump + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//services/trigger_dump + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/_trigger_dump_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/_trigger_dump_response.txt + + +.. _expl-itempick-srv-reset-params: + +``reset_defaults`` +^^^^^^^^^^^^^^^^^^ + + Resets all parameters of the module to its default values, + as listed in above table. Also resets sorting strategies. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes//services/reset_defaults + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//services/reset_defaults + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//services/reset_defaults + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_itempick_reset_defaults_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_itempick_reset_defaults_response.txt + +.. _expl-itempick-srv-set-roi: + +``set_region_of_interest`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Persistently stores a 3D region of interest on the |rc_xxx|. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-roi-srv-set-roi`:latex:`\:(Section \ref{roi:expl-roi-srv-set-roi})` in ``rc_roi_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//services/set_region_of_interest + +.. _expl-itempick-srv-get-roi: + +``get_regions_of_interest`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns the configured 3D regions of interest with the requested ``region_of_interest_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-roi-srv-get-roi`:latex:`\:(Section \ref{roi:expl-roi-srv-get-roi})` in ``rc_roi_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//services/get_regions_of_interest + +.. _expl-itempick-srv-delete-roi: + +``delete_regions_of_interest`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Deletes the configured 3D regions of interest with the requested ``region_of_interest_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-roi-srv-delete-roi`:latex:`\:(Section \ref{roi:expl-roi-srv-delete-roi})` in ``rc_roi_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//services/delete_regions_of_interest + + +.. _sect-itempick-return-codes: + +Return codes +------------ + +.. index:: + pair: ItemPick; return codes + pair: BoxPick; return codes + + +Each service response contains a ``return_code``, +which consists of a ``value`` plus an optional ``message``. +A successful service returns with a ``return_code`` value of ``0``. +Negative ``return_code`` values indicate that the service failed. +Positive ``return_code`` values indicate that the service succeeded with additional information. +The smaller value is selected in case a service has multiple ``return_code`` values, +but all messages are appended in the ``return_code`` message. + +The following table contains a list of common codes: + +.. tabularcolumns:: |c|L| +.. _tab-itempick-return-codes: +.. csv-table:: Return codes of the ItemPick and BoxPick services + :header: Code, Description + + "0", "Success" + "-1", "An invalid argument was provided" + "-3", "An internal timeout occurred, e.g. during box detection if the given dimension range is too large" + "-4", "Data acquisition took longer than allowed" + "-8", "The template has been deleted during detection." + "-10", "New element could not be added as the maximum storage capacity of load carriers, regions of interest or template has been exceeded" + "-11", "Sensor not connected, not supported or not ready" + "-200", "Fatal internal error" + "-301", "More than one item model of type ``UNKNOWN`` provided to the ``compute_grasps`` service" + "10", "The maximum storage capacity of load carriers, regions of interest or templates has been reached" + "11", "An existent persistent model was overwritten by the call to ``set_load_carrier`` or ``set_region_of_interest``" + "100", "The requested load carriers were not detected in the scene" + "101", "No valid surfaces or grasps were found in the scene" + "102", "The detected load carrier is empty" + "103", "All computed grasps are in collision with the load carrier" + "112", "Rejected detections of one or more clusters, because min_cluster_coverage was not reached." + "300", "A valid ``robot_pose`` was provided as argument but it is not required" + "999", "Additional hints for application development" + + +.. _sect-boxpick-template-upload: + +BoxPick Template API +-------------------- + +.. index:: + single: BoxPick; template api + single: BoxPick; template download + single: BoxPick; template upload + single: BoxPick; template deletion + +BoxPick templates are only available with the +Match extension of BoxPick. +For template upload, download, listing and removal, special |rest-api| endpoints are provided. +Templates can also be uploaded, downloaded and removed via the |webgui|. +The templates include the dimensions, the views and their poses, if set. +Up to 50 templates can be stored persistently on the |rc_xxx|. + +.. only:: rc_visard + + .. include:: _gen/swagger/rc_visard/templates_rc_boxpick.txt + +.. only:: rc_visard_ng + + .. include:: _gen/swagger/rc_visard_ng/templates_rc_boxpick.txt + +.. only:: rc_cube + + .. include:: _gen/swagger/rc_cube/templates_rc_boxpick.txt diff --git a/v24.04/de/_raw_sources/loadcarrier.rst.txt b/v24.04/de/_raw_sources/loadcarrier.rst.txt new file mode 100644 index 0000000..b762d9a --- /dev/null +++ b/v24.04/de/_raw_sources/loadcarrier.rst.txt @@ -0,0 +1,945 @@ + +.. include:: global_rst.glb + +.. _sect-loadcarrier: + +LoadCarrier +=========== + +.. index:: ! LoadCarrier + single: load carrier detection + pair: BoxPick; load carrier + pair: ItemPick; load carrier + pair: SilhouetteMatch; load carrier + +.. only:: rc_cube + + .. index:: + single: CADMatch; load carrier + +Introduction +------------ + +The LoadCarrier module allows the detection of load carriers, which is usually the first step +when objects or grasp points inside a bin should be found. The models of the load carriers +to be detected have to be defined in the :doc:`loadcarrier_db`:latex:`\:(Section +\ref{loadcarrier_db:sect-loadcarrier-db})` module. + +The LoadCarrier module is an optional on-board module of the |rc_xxx| and is licensed with +any of the modules |pick_modules| or |match_modules|. Otherwise it requires a +separate LoadCarrier +:ref:`license`:latex:`\:(Section \ref{maintenance:sect-updating-license})` +to be purchased. + +.. only:: rc_cube + + .. note:: + + This module is pipeline specific. Changes to its settings or parameters only affect + the respective camera pipeline and have no influence on other pipelines running on the |rc_cube|. + +.. _sect-loadcarrier-detect-lc: + +Detection of load carriers +-------------------------- + +.. index:: + pair: load carrier; detection + +The load carrier detection algorithm detects load carriers that match a specific load carrier +model, which must be defined in the :doc:`loadcarrier_db`:latex:`\:(Section \ref{loadcarrier_db:sect-loadcarrier-db})` module. +The load carrier model is referenced by its ID, which is passed to the load carrier detection. +The detection of a load carrier is based on the detection of its +rectangular rim. For this, it uses lines detected in the left camera image and the +depth values of the load carrier rim. Thus, the rim should form a contrast to the +background and the disparity image must be dense on the rim. + +If multiple load carriers of the specified load carrier ID are visible in the scene, +all of them will be detected and returned by the load carrier detection. + +By default, when ``assume_gravity_aligned`` is true and gravity +measurements are available, the algorithm searches for load carriers whose rim planes +are perpendicular to the measured gravity vector. To detect tilted load carriers, +``assume_gravity_aligned`` must be set to false or the load carrier's approximate +orientation must be specified as ``pose`` and the ``pose_type`` should be set to +``ORIENTATION_PRIOR``. + +Load carriers can be detected at a distance of up to 3 meters from the camera. + +When a 3D region of interest (see :ref:`sect-roi`:latex:`, Section \ref{roi:sect-roi}`) +is used to limit the volume in which load carriers should be detected, +only the load carriers' rims must be fully included in the region of interest. + +The detection algorithm returns the poses of the load carriers' origins +(see :ref:`sect-loadcarrier-definition`:latex:`, Section \ref{loadcarrier_db:sect-loadcarrier-definition}`) +in the desired pose frame. + +The detection functionality also determines if the detected load carriers are ``overfilled``, +which means, that objects protrude from the plane defined by the load carrier's outer part of the rim. + +.. _fig-loadcarrier-load-carrier-models: +.. figure:: images/itempick_load_carrier_reference_rim_sidebyside.* + :width: 100% + :align: center + + Load carrier models and reference frames + + +.. Because of the symmetry of the load carrier model, there is an ambiguity +.. in the definition of the x axis sense. +.. :numref:`fig-loadcarrier-load-carrier-orientation` visualizes how the sense of +.. the load carrier x axis is defined for rectangular load carriers. +.. +.. .. _fig-loadcarrier-load-carrier-orientation: +.. .. figure:: images/itempick_load_carrier_orientation.png +.. :width: 600 px +.. :align: center +.. +.. Disambiguation of the coordinate system for a rectangular load carrier. +.. All load carrier are viewed from the left eye of the |rc_visard|. +.. The dashed line represents the orientation where the x axis flips +.. (-45 degrees on the image plane). + +.. _sect-loadcarrier-detect-filling-level: + +Detection of filling level +-------------------------- + +.. index:: + pair: BoxPick; filling level + pair: ItemPick; filling level + pair: SilhouetteMatch; filling level + pair: LoadCarrier; filling level + +.. only:: rc_cube + + .. index:: + single: CADMatch; filling level + +The LoadCarrier module offers the ``detect_filling_level`` +service to compute the filling level of all detected load carriers. + +The load carriers are subdivided into a configurable number of cells in a 2D grid. +The maximum number of cells is 10x10. +For each cell, the following values are reported: + +- ``level_in_percent``: minimum, maximum and mean cell filling level in percent + from the load carrier floor. + These values can be larger than 100% if the cell is overfilled. +- ``level_free_in_meters``: minimum, maximum and mean cell free level in meters + from the load carrier rim. These values can be negative if the cell is overfilled. +- ``cell_size``: dimensions of the 2D cell in meters. +- ``cell_position``: position of the cell center in meters + (either in ``camera`` or ``external`` frame, see :ref:`sect-loadcarrier-hand-eye-dep`:latex:`, Section \ref{loadcarrier:sect-loadcarrier-hand-eye-dep}`). + The z-coordinate is on the level of the load carrier rim. +- ``coverage``: represents the proportion of valid pixels in this cell. + It varies between 0 and 1 with steps of 0.1. + A low coverage indicates that the cell contains several missing data + (i.e. only a few points were actually measured in this cell). + +These values are also calculated for the whole load carrier itself. +If no cell subdivision is specified, only the overall filling level is computed. + +.. _fig-loadcarrier-lc-filling-level: +.. figure:: images/itempick_lc_filling_level.png + :width: 100% + :align: center + + Visualizations of the load carrier filling level: overall filling level without + grid (left), 4x3 grid (center), 8x8 grid (right). + The load carrier content is shown in a green gradient from white + (on the load carrier floor) to dark green. + The overfilled regions are visualized in red. Numbers indicate cell IDs. + +.. _sect-loadcarrier-dependencies: + +Interaction with other modules +------------------------------ + +Internally, the LoadCarrier module depends on, and interacts with other on-board +modules as listed below. + +.. Note:: + All changes and configuration updates to these modules will affect + the performance of the LoadCarrier module. + +.. For each load carrier detection, the LoadCarrier module +.. acquires datasets of synchronized images and estimates the gravity vector. +.. The data acquisition step normally takes between 500 ms and 600 ms +.. with "High" depth image quality. + +.. _sect-loadcarrier-stereo-camera-matching: + +Stereo camera and Stereo matching +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The LoadCarrier module makes internally use of the following data: + +- Rectified images from the :doc:`stereo_camera` module + (``rc_camera``:latex:`, Section \ref{stereo_camera:sect-stereo-camera}`); + +- Disparity, error, and confidence images from the :doc:`stereo_matching` module + (``rc_stereomatching``:latex:`, Section \ref{stereo_matching:sect-stereo-matching}`). + +All processed images are guaranteed to be captured after the module trigger time. + +.. _sect-loadcarrier-iocontrol-dep: + +IO and Projector Control +^^^^^^^^^^^^^^^^^^^^^^^^ + +In case the |rc_xxx| is used in conjunction with an external random dot +projector and the :doc:`iocontrol` module (``rc_iocontrol``:latex:`, +Section \ref{iocontrol:sect-iocontrol}`), it is recommended to connect +the projector to GPIO Out 1 and set the stereo-camera module's +acquisition mode to ``SingleFrameOut1`` (see :ref:`Stereo matching +parameters`:latex:`, Section +\ref{stereo_matching:sect-disp-image-parameters})`, so that on each +image acquisition trigger an image with and without projector pattern is +acquired. + +Alternatively, the output mode for the GPIO output in use should be set +to ``ExposureAlternateActive`` (see :ref:`sect-iocontrol-params`:latex:`, +Section \ref{iocontrol:sect-iocontrol-params}`). + +In either case, +the *Auto Exposure Mode* ``exp_auto_mode`` should be set to ``AdaptiveOut1`` to optimize the exposure +of both images (see :ref:`Stereo camera parameters`:latex:`, Section \ref{stereo_camera:sect-cam-params})`. + +No additional changes are required to use the LoadCarrier module +in combination with a random dot projector. + +.. _sect-loadcarrier-hand-eye-dep: + +Hand-eye calibration +^^^^^^^^^^^^^^^^^^^^ + +In case the camera has been calibrated to a robot, the loadcarrier module +can automatically provide poses in the robot coordinate frame. +For the loadcarrier nodes' :ref:`sect-loadcarrier-services`:latex:`\:(Section \ref{loadcarrier:sect-loadcarrier-services})`, the frame of the +output poses can be controlled with the ``pose_frame`` argument. + +Two different ``pose_frame`` values can be chosen: + +1. **Camera frame** (``camera``). + All poses provided by the modules are in the camera frame, + and no prior knowledge about the pose of the camera in the environment is required. + This means that the configured load carriers move with the camera. + It is the user's responsibility to update the configured poses + if the camera frame moves (e.g. with a robot-mounted camera). + +2. **External frame** (``external``). + All poses provided by the modules are in the external frame, + configured by the user during the hand-eye calibration process. + The module relies on the on-board + :doc:`Hand-eye calibration module`:latex:`\:(Section \ref{handeye_calibration:sect-handeye-calibration})` + to retrieve the sensor mounting (static or robot mounted) and + the hand-eye transformation. + If the mounting is static, no further information is needed. + If the sensor is robot-mounted, the ``robot_pose`` is required + to transform poses to and from the ``external`` frame. + +.. Note:: + If no hand-eye calibration is available, all ``pose_frame`` values should be set to ``camera``. + +All ``pose_frame`` values that are not ``camera`` or ``external`` are rejected. + +.. _sect-loadcarrier-parameters: + +Parameters +---------- + +.. index:: + single: LoadCarrier; parameters + +The LoadCarrier module is called ``rc_load_carrier`` +in the |rest-api| and is represented in the +:ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})`:cubeonly:`in the desired pipeline` under +:menuselection:`Modules --> LoadCarrier`. +The user can explore and configure the LoadCarrier +module's run-time parameters, e.g. for development and testing, using the +|webgui| or the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`. + +Parameter overview +^^^^^^^^^^^^^^^^^^ + +.. only:: rc_cube + + .. note:: The default values in the parameter table + below show the values of the |rc_visard|. The values can be + different for other sensors. + +.. include:: _gen/nodes/params/rc_load_carrier.txt + +Description of run-time parameters +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Each run-time parameter is represented by a row on the *LoadCarrier Settings* section +of the |webgui|'s *LoadCarrier* page under *Modules*. +The name in the |webgui| is given in brackets behind the parameter name and the parameters are +listed in the order they appear in the |webgui|. The parameters are prefixed with ``load_carrier_`` +when they are used outside the ``rc_load_carrier`` module from another detection module +using the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`. + +.. _expl-loadcarrier-assume-gravity-aligned: + +``assume_gravity_aligned`` (*Assume Gravity Aligned*) +''''''''''''''''''''''''''''''''''''''''''''''''''''' + If this parameter is set to true, then only load carriers without tilt will be detected. This can speed up the detection. + If this parameter is set to false, tilted load carriers will also be detected. + + This parameter is ignored for load carriers with an orientation prior. + +.. only:: rc_cube + + .. Note:: + Gravity alignment is only available for pipelines of type ``rc_visard``. + The gravity vector is estimated from linear acceleration readings from the on-board IMU. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_load_carrier/parameters?assume_gravity_aligned= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_load_carrier/parameters?assume_gravity_aligned= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/parameters?assume_gravity_aligned= + +.. _expl-loadcarrier-model-tolerance: + +``model_tolerance`` (*Model Tolerance*) +''''''''''''''''''''''''''''''''''''''' + indicates how much the estimated load carrier dimensions are allowed to differ from the load carrier model dimensions in meters. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_load_carrier/parameters?model_tolerance= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_load_carrier/parameters?model_tolerance= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/parameters?model_tolerance= + +.. _expl-loadcarrier-crop-distance: + +``crop_distance`` (*Crop Distance*) +''''''''''''''''''''''''''''''''''' + sets the safety margin in meters by which the load carrier's inner dimensions are + reduced to define the region of interest for detection (ref. :numref:`fig-loadcarrier-inside-volume`). + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_load_carrier/parameters?crop_distance= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_load_carrier/parameters?crop_distance= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/parameters?crop_distance= + +.. _expl-loadcarrier-min-plausibility: + +``min_plausibility`` (*Minimum Plausibility*): +'''''''''''''''''''''''''''''''''''''''''''''' + The minimum plausibility defines how much of the plane around the load carrier rim must at least be free to count as valid detection. + Increase the minimal plausibility to reject false positive detections and decrease the value in case a clearly visible load carrier cannot be detected. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_load_carrier/parameters?min_plausibility= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_load_carrier/parameters?min_plausibility= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/parameters?min_plausibility= + +.. _sect-loadcarrier-status-values: + +Status values +------------- + +The LoadCarrier module reports the following status values: + +.. tabularcolumns:: |l|L| +.. csv-table:: The ``rc_load_carrier`` module's status values + :header: Name, Description + + "``data_acquisition_time``","Time in seconds required to acquire image pair" + "``last_timestamp_processed``","The timestamp of the last processed image pair" + "``load_carrier_detection_time``","Processing time of the last detection in seconds" + +.. _sect-loadcarrier-services: + +Services +-------- + +.. index:: + single: LoadCarrier; services + +The user can explore and call the LoadCarrier module's services, +e.g. for development and testing, using the +:doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` or +the |rc_xxx| +:ref:`sect-web-gui`:latex:`\:(Section \ref{webgui:sect-web-gui})` on the +*LoadCarrier* page under *Modules*. + +The LoadCarrier module offers the following services. + +.. _expl-loadcarrier-srv-detect-lc: + +``detect_load_carriers`` +^^^^^^^^^^^^^^^^^^^^^^^^ + + Triggers a load carrier detection as described in + :ref:`sect-loadcarrier-detect-lc`:latex:`\:(Section \ref{loadcarrier:sect-loadcarrier-detect-lc})`. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_load_carrier/services/detect_load_carriers + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_load_carrier/services/detect_load_carriers + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/services/detect_load_carriers + + .. tabs:: + + .. tab:: **Request** + + Required arguments: + + ``pose_frame``: see :ref:`sect-loadcarrier-hand-eye-dep`:latex:`\:(Section \ref{loadcarrier:sect-loadcarrier-hand-eye-dep})`. + + ``load_carrier_ids``: IDs of the load carriers which should be detected. Currently only one ID can be specified. + + Potentially required arguments: + + ``robot_pose``: see :ref:`sect-loadcarrier-hand-eye-dep`:latex:`\:(Section \ref{loadcarrier:sect-loadcarrier-hand-eye-dep})`. + + Optional arguments: + + ``region_of_interest_id``: ID of the 3D region of interest where to search for the load carriers. + + ``region_of_interest_2d_id``: ID of the 2D region of interest where to search for the load carriers. + + .. note:: Only one type of region of interest can be set. + + .. include:: _gen/nodes/services/rc_load_carrier_detect_load_carriers_request.txt + + .. tab:: **Response** + + ``load_carriers``: list of detected load carriers. + + ``timestamp``: timestamp of the image set the detection ran on. + + ``return_code``: holds possible warnings or error codes and messages. + + .. include:: _gen/nodes/services/rc_load_carrier_detect_load_carriers_response.txt + + +.. _expl-loadcarrier-srv-detect-filling-level: + +``detect_filling_level`` +^^^^^^^^^^^^^^^^^^^^^^^^ + + Triggers a load carrier filling level detection as described in + :ref:`sect-loadcarrier-detect-filling-level`:latex:`\:(Section \ref{loadcarrier:sect-loadcarrier-detect-filling-level})`. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_load_carrier/services/detect_filling_level + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_load_carrier/services/detect_filling_level + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/services/detect_filling_level + + .. tabs:: + + .. tab:: **Request** + + Required arguments: + + ``pose_frame``: see :ref:`sect-loadcarrier-hand-eye-dep`:latex:`\:(Section \ref{loadcarrier:sect-loadcarrier-hand-eye-dep})`. + + ``load_carrier_ids``: IDs of the load carriers which should be detected. Currently only one ID can be specified. + + Potentially required arguments: + + ``robot_pose``: see :ref:`sect-loadcarrier-hand-eye-dep`:latex:`\:(Section \ref{loadcarrier:sect-loadcarrier-hand-eye-dep})`. + + Optional arguments: + + ``filling_level_cell_count``: Number of cells in the filling level grid. + + ``region_of_interest_id``: ID of the 3D region of interest where to search for the load carriers. + + ``region_of_interest_2d_id``: ID of the 2D region of interest where to search for the load carriers. + + .. note:: Only one type of region of interest can be set. + + .. include:: _gen/nodes/services/rc_load_carrier_detect_filling_level_request.txt + + .. tab:: **Response** + + ``load_carriers``: list of detected load carriers and their filling levels. + + ``timestamp``: timestamp of the image set the detection ran on. + + ``return_code``: holds possible warnings or error codes and messages. + + .. include:: _gen/nodes/services/rc_load_carrier_detect_filling_level_response.txt + + +.. _expl-loadcarrier-srv-reset-defaults: + +``reset_defaults`` +^^^^^^^^^^^^^^^^^^ + Restores and applies the default values for this module's parameters + ("factory reset"). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_load_carrier/services/reset_defaults + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_load_carrier/services/reset_defaults + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/services/reset_defaults + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_load_carrier_reset_defaults_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_load_carrier_reset_defaults_response.txt + +.. only:: rc_cube + + .. _expl-loadcarrier-srv-trigger-dump: + + ``trigger_dump`` + ^^^^^^^^^^^^^^^^ + Triggers dumping of the detection that corresponds to the given timestamp, + or the latest detection, if no timestamp is given. The dumps are saved to the + connected USB drive. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_load_carrier/services/trigger_dump + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/services/trigger_dump + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_load_carrier_trigger_dump_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_load_carrier_trigger_dump_response.txt + +.. _expl-loadcarrier-srv-set-lc: + +``set_load_carrier`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Persistently stores a load carrier on the |rc_xxx|. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-loadcarrier-db-srv-set-lc`:latex:`\:(Section \ref{loadcarrier_db:expl-loadcarrier-db-srv-set-lc})` + in ``rc_load_carrier_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/services/set_load_carrier + + The definitions of the request and response are the same as described in + :ref:`expl-loadcarrier-db-srv-set-lc`:latex:`\:(Section \ref{loadcarrier_db:expl-loadcarrier-db-srv-set-lc})` + in ``rc_load_carrier_db``. + + +.. _expl-loadcarrier-srv-get-lc: + +``get_load_carriers`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns the configured load carriers with the requested ``load_carrier_ids``. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-loadcarrier-db-srv-get-lc`:latex:`\:(Section \ref{loadcarrier_db:expl-loadcarrier-db-srv-get-lc})` + in ``rc_load_carrier_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/services/get_load_carriers + + The definitions of the request and response are the same as described in + :ref:`expl-loadcarrier-db-srv-get-lc`:latex:`\:(Section \ref{loadcarrier_db:expl-loadcarrier-db-srv-get-lc})` + in ``rc_load_carrier_db``. + +.. _expl-loadcarrier-srv-delete-lc: + +``delete_load_carriers`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Deletes the configured load carriers with the requested ``load_carrier_ids``. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-loadcarrier-db-srv-delete-lc`:latex:`\:(Section \ref{loadcarrier_db:expl-loadcarrier-db-srv-delete-lc})` + in ``rc_load_carrier_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/services/delete_load_carriers + + The definitions of the request and response are the same as described in + :ref:`expl-loadcarrier-db-srv-delete-lc`:latex:`\:(Section \ref{loadcarrier_db:expl-loadcarrier-db-srv-delete-lc})` + in ``rc_load_carrier_db``. + +.. _expl-loadcarrier-srv-set-roi: + +``set_region_of_interest`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Persistently stores a 3D region of interest on the |rc_xxx|. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-roi-srv-set-roi`:latex:`\:(Section \ref{roi:expl-roi-srv-set-roi})` in ``rc_roi_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/services/set_region_of_interest + + The definitions of the request and response are the same as described in + :ref:`expl-roi-srv-set-roi`:latex:`\:(Section \ref{roi:expl-roi-srv-set-roi})` + in ``rc_roi_db``. + +.. _expl-loadcarrier-srv-get-rois: + +``get_regions_of_interest`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns the configured 3D regions of interest with the requested ``region_of_interest_ids``. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-roi-srv-get-roi`:latex:`\:(Section \ref{roi:expl-roi-srv-get-roi})` in ``rc_roi_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/services/get_regions_of_interest + + The definitions of the request and response are the same as described in + :ref:`expl-roi-srv-get-roi`:latex:`\:(Section \ref{roi:expl-roi-srv-get-roi})` + in ``rc_roi_db``. + +.. _expl-loadcarrier-srv-delete-rois: + +``delete_regions_of_interest`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Deletes the configured 3D regions of interest with the requested ``region_of_interest_ids``. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-roi-srv-delete-roi`:latex:`\:(Section \ref{roi:expl-roi-srv-delete-roi})` in ``rc_roi_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/services/delete_regions_of_interest + + The definitions of the request and response are the same as described in + :ref:`expl-roi-srv-delete-roi`:latex:`\:(Section \ref{roi:expl-roi-srv-delete-roi})` + in ``rc_roi_db``. + +.. _expl-loadcarrier-srv-set-roi-2d: + +``set_region_of_interest_2d`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Persistently stores a 2D region of interest on the |rc_xxx|. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-roi-srv-set-roi-2d`:latex:`\:(Section \ref{roi:expl-roi-srv-set-roi-2d})` in ``rc_roi_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/services/set_region_of_interest_2d + + The definitions of the request and response are the same as described in + :ref:`expl-roi-srv-set-roi-2d`:latex:`\:(Section \ref{roi:expl-roi-srv-set-roi-2d})` + in ``rc_roi_db``. + +.. _expl-loadcarrier-srv-get-rois-2d: + +``get_regions_of_interest_2d`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns the configured 2D regions of interest with the requested ``region_of_interest_2d_ids``. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-roi-srv-get-roi-2d`:latex:`\:(Section \ref{roi:expl-roi-srv-get-roi-2d})` in ``rc_roi_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/services/get_region_of_interest_2d + + The definitions of the request and response are the same as described in + :ref:`expl-roi-srv-get-roi-2d`:latex:`\:(Section \ref{roi:expl-roi-srv-get-roi-2d})` + in ``rc_roi_db``. + +.. _expl-loadcarrier-srv-delete-rois-2d: + +``delete_regions_of_interest_2d`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Deletes the configured 2D regions of interest with the requested ``region_of_interest_2d_ids``. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-roi-srv-delete-roi-2d`:latex:`\:(Section \ref{roi:expl-roi-srv-delete-roi-2d})` in ``rc_roi_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/services/delete_regions_of_interest_2d + + The definitions of the request and response are the same as described in + :ref:`expl-roi-srv-delete-roi-2d`:latex:`\:(Section \ref{roi:expl-roi-srv-delete-roi-2d})` + in ``rc_roi_db``. + +.. _sect-loadcarrier-return-codes: + +Return codes +------------ + +.. index:: + pair: LoadCarrier; return codes + +Each service response contains a ``return_code``, +which consists of a ``value`` plus an optional ``message``. +A successful service returns with a ``return_code`` value of ``0``. +Negative ``return_code`` values indicate that the service failed. +Positive ``return_code`` values indicate that the service succeeded with additional information. +The smaller value is selected in case a service has multiple ``return_code`` values, +but all messages are appended in the ``return_code`` message. + +The following table contains a list of common codes: + +.. tabularcolumns:: |c|L| +.. _tab-loadcarrier-return-codes: +.. csv-table:: Return codes of the LoadCarrier module's services + :header: Code, Description + + "0", "Success" + "-1", "An invalid argument was provided" + "-4", "Data acquisition took longer than allowed" + "-10", "New element could not be added as the maximum storage capacity of load carriers has been exceeded" + "-11", "Sensor not connected, not supported or not ready" + "-302", "More than one load carrier provided to the ``detect_load_carriers`` or ``detect_filling_level`` services, but only one is supported" + "3", "The detection timeout during load carrier detection has been reached. Consider reducing the model tolerance." + "10", "The maximum storage capacity of load carriers has been reached" + "11", "An existent persistent model was overwritten by the call to ``set_load_carrier``" + "100", "The requested load carriers were not detected in the scene" + "102", "The detected load carrier has no points inside" + "300", "A valid ``robot_pose`` was provided as argument but it is not required" + diff --git a/v24.04/de/_raw_sources/loadcarrier_db.rst.txt b/v24.04/de/_raw_sources/loadcarrier_db.rst.txt new file mode 100644 index 0000000..0f70b77 --- /dev/null +++ b/v24.04/de/_raw_sources/loadcarrier_db.rst.txt @@ -0,0 +1,366 @@ + +.. include:: global_rst.glb + +.. _sect-loadcarrier-db: + +LoadCarrierDB +============= + +.. index:: ! LoadCarrierDB + single: load carrier model + pair: BoxPick; load carrier + pair: ItemPick; load carrier + pair: SilhouetteMatch; load carrier + +.. only:: rc_cube + + .. index:: + single: CADMatch; load carrier + +Introduction +------------ + +The LoadCarrierDB module (Load carrier database module) allows the global definition of load carriers, +which can then be used in many detection modules. The specified load carriers are available for all +modules supporting load carriers on the |rc_xxx|. + +.. only:: rc_cube + + .. note:: + + This module is global on the |rc_cube|. Changes to its settings or parameters affect + every camera pipeline running on the |rc_cube|. + +The LoadCarrierDB module is a base module which is available on every |rc_xxx|. + +.. tabularcolumns:: |l|L| +.. _tab-lc-spec: +.. csv-table:: Specifications of the LoadCarrierDB module + + "Supported load carrier types", "4-sided or 3-sided" + "Supported rim types", "solid rim, stepped rim or ledged rim" + "Min. load carrier dimensions", "0.1 m x 0.1 m x 0.05 m" + "Max. load carrier dimensions", "2 m x 2 m x 2 m" + "Max. number of load carriers", "50" + "Load carriers available in", "|pick_modules| and |match_modules|" + "Supported pose types", "no pose, orientation prior, exact pose" + "Supported reference frames", "camera, external" + +.. _sect-loadcarrier-definition: + +Load carrier definition +----------------------- + +.. index:: + pair: load carrier; definition + pair: load carrier; rim + pair: load carrier; dimensions + pair: load carrier; inner volume + pair: load carrier; pose + pair: load carrier; orientation prior + +A load carrier (bin) is a container with four walls, a floor and a rectangular rim, +which can contain objects. It can be used to limit the volume in which to search +for objects or grasp points. + +A load carrier is defined by its ``outer_dimensions`` and ``inner_dimensions``. +The maximum ``outer_dimensions`` are 2.0 meters in every dimension. + +The origin of the load carrier reference frame is in the center of the load carrier's +*outer* box and its z axis is perpendicular to the load carrier's floor +pointing outwards (see :numref:`fig-loadcarrier-load-carrier`). + +.. _fig-loadcarrier-load-carrier: +.. figure:: images/itempick_load_carrier_reference.* + :width: 100% + :align: center + + Load carrier with reference frame and inner and outer dimensions + +.. Note:: + Typically, outer and inner dimensions of a load carrier are available in the + specifications of the load carrier manufacturer. + +The inner volume of the load carrier is defined by its inner dimensions, but includes a region +of 10 cm height above the load carrier, so that also items protruding from the load carrier +are considered for detection or grasp computation. Furthermore, an additional +``crop_distance`` is subtracted from the inner volume in every dimension, which acts as a safety margin and can +be configured as run-time parameter in the LoadCarrier module (see :ref:`sect-loadcarrier-parameters`:latex:`, Section +\ref{loadcarrier:sect-loadcarrier-parameters}`). +:numref:`fig-loadcarrier-inside-volume` visualizes the inner volume of a load carrier. Only +points which are inside this volume are considered for detections. + +.. _fig-loadcarrier-inside-volume: +.. figure:: images/load_carrier_inside_volume.* + :width: 50% + :align: center + + Visualization of the inner volume of a load carrier. Only + points which are inside this volume are considered for detections. + +Since the load carrier detection +is based on the detection of the load carrier's rim, the rim geometry must be specified if it +cannot be determined from the difference between outer and inner dimensions. A load carrier with a stepped rim can be defined by setting a ``rim_thickness``. The rim +thickness gives the thickness of the outer part of the rim in the x and y direction. +When a rim thickness is given, an optional ``rim_step_height`` can also be +specified, which gives the height of the step between the outer and the inner part of the rim. +When the step height is given, it will also be considered during collision checking +(see :doc:`collisioncheck`:latex:`, Section \ref{collisioncheck:sect-collision}`). Examples of load +carriers with stepped rims are shown in :numref:`fig-loadcarrier-load-carrier-rim-types` A, B. +In addition to the ``rim_thickness`` and ``rim_step_height`` the ``rim_ledge`` can be specified +for defining load carriers whose inner rim protrudes into the interior of the load carrier, such as pallet cages. +The ``rim_ledge`` gives the thickness of the inner part of the rim in the x and y direction. +An example of a load carrier with a ledged rim is shown in :numref:`fig-loadcarrier-load-carrier-rim-types` C. + +.. _fig-loadcarrier-load-carrier-rim-types: +.. figure:: images/rim_types.* + :width: 100% + :align: center + + Examples of load carriers with stepped rim (A, B) or ledged rim (C) + +The different rim types are applicable to both, standard 4-sided and 3-sided load carriers. For a +3-sided load carrier, the ``type`` must be ``THREE_SIDED``. If the type is set to ``STANDARD`` or +left empty, a 4-sided load carrier is specified. A 3-sided load carrier has one side that is lower +than the other three sides. This ``height_open_side`` is measured from the outer bottom of the load carrier. The open side is at the negative +y-axis of the load carrier's coordinate system. Examples of the two load carrier types are given +in :numref:`fig-loadcarrier-load-carrier-types`. The height of the lower side is only considered during +collision checking and not required for the detection of the load carrier. + +.. _fig-loadcarrier-load-carrier-types: +.. figure:: images/lc_types.* + :width: 100% + :align: center + + Examples of a standard 4-sided load carrier (A) and a 3-sided load carrier (B) + +A load carrier can be specified with a full 3D ``pose`` consisting of a ``position`` and +an ``orientation`` quaternion, given in a ``pose_frame``. Based on the given ``pose_type`` +this pose is either used as an orientation prior (``pose_type`` is ``ORIENTATION_PRIOR`` or empty), +or as the exact pose of the load carrier (``pose_type`` is ``EXACT_POSE``). + +In case the pose serves as orientation prior, the detected load carrier pose is guaranteed +to have the minimum rotation with respect to the load carrier's prior pose. This pose type +is useful for detecting tilted load carriers and for resolving the orientation ambiguity in +the x and y direction caused by the symmetry of the load carrier model. + +In case the pose type is set to ``EXACT_POSE``, no load carrier detection will be performed on the scene data, +but the given pose will be used in exactly the same way as if the load carrier is detected at +that pose. This pose type is especially useful in cases where load carriers do not change their positions +and/or are hard to detect (e.g. because their rim is too thin or the material is too shiny). + +The |rcxxx| can persistently store up to 50 different +load carrier models, each one identified by a different ``id``. +The configuration of a load carrier model is normally performed offline, +during the set up the desired application. +This can be done via the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` or in the |rcxxx| |webgui|. + +.. Note:: + The configured load carrier models + are persistent even over firmware updates and rollbacks. + + +.. _sect-loadcarrier-compartment: + +Load carrier compartments +------------------------- + +.. index:: + pair: load carrier; compartment + +Some detection modules can make use of a ``load_carrier_compartment`` to further limit the volume for the detection, +for example :ref:`ItemPick's compute_grasps service`:latex:`\:(see \ref{itempick:expl-itempick-srv-compute-grasps})`. +A load carrier compartment is a box whose ``pose`` is defined as the transformation from the load carrier reference frame to the compartment +reference frame, which is located in the center of the compartment box (see :numref:`fig-loadcarrier-compartment`). +The load carrier compartment is defined for each detection call separately and is not part of the load carrier definition in the +LoadCarrierDB module. + +.. _fig-loadcarrier-compartment: +.. figure:: images/itempick_load_carrier_compartment.* + :width: 100% + :align: center + + Sample compartment inside a load carrier. The coordinate frame shown in the image is the + reference frame of the compartment. + +The compartment volume is intersected with the load carrier inner volume to compute the volume for the detection. +If this intersection should also contain the 10 cm region above the load carrier, the height of the compartment box +must be increased accordingly. + +.. _sect-loadcarrier-db-dependencies: + +Interaction with other modules +------------------------------ + +Internally, the LoadCarrierDB module depends on, and interacts with other on-board +modules as listed below. + +.. _sect-loadcarrier-hand-eye-dep: + +Hand-eye calibration +^^^^^^^^^^^^^^^^^^^^ + +In case the camera has been calibrated to a robot, the load carrier's exact pose +or orientation prior can be provided in the robot coordinate frame by setting the corresponding +``pose_frame`` argument to ``external``. + +Two different ``pose_frame`` values can be chosen: + +1. **Camera frame** (``camera``). + The load carrier pose or orientation prior is provided in the camera frame, + and no prior knowledge about the pose of the camera in the environment is required. + This means that the configured load carriers move with the camera. + It is the user's responsibility to update the configured poses + if the camera frame moves (e.g. with a robot-mounted camera). + +2. **External frame** (``external``). + The load carrier pose or orientation prior is provided in the external frame, + configured by the user during the hand-eye calibration process. + The module relies on the on-board + :doc:`Hand-eye calibration module`:latex:`\:(Section \ref{handeye_calibration:sect-handeye-calibration})` + to retrieve the sensor mounting (static or robot mounted) and + the hand-eye transformation. + +.. Note:: + If no hand-eye calibration is available, all ``pose_frame`` values should be set to ``camera``. + +All ``pose_frame`` values that are not ``camera`` or ``external`` are rejected. + +.. _sect-loadcarrier-services: + +Services +-------- + +.. index:: + single: LoadCarrierDB; services + +The LoadCarrierDB module is called ``rc_load_carrier_db`` in the |rest-api| and is represented in the +:ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})` under +:menuselection:`Database --> Load Carriers`. +The user can explore and call the LoadCarrierDB module's services, +e.g. for development and testing, using the +:doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` or +the |webgui|. + +The LoadCarrierDB module offers the following services. + +.. _expl-loadcarrier-db-srv-set-lc: + +``set_load_carrier`` +^^^^^^^^^^^^^^^^^^^^ + + Persistently stores a load carrier on the |rc_xxx|. + All configured load carriers are persistent over firmware updates and rollbacks. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v2/nodes/rc_load_carrier_db/services/set_load_carrier + + .. tabs:: + + .. tab:: **Request** + + Details for the definition of the ``load_carrier`` type are given in + :ref:`sect-loadcarrier-definition`:latex:`\:(Section \ref{loadcarrier_db:sect-loadcarrier-definition})`. + + The field ``type`` is optional and accepts ``STANDARD`` and ``THREE_SIDED``. + + The field ``pose_type`` is optional and accepts ``NO_POSE``, ``EXACT_POSE`` and ``ORIENTATION_PRIOR``. + + .. include:: _gen/nodes/services/rc_load_carrier_set_load_carrier_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_load_carrier_set_load_carrier_response.txt + +.. _expl-loadcarrier-db-srv-get-lc: + +``get_load_carriers`` +^^^^^^^^^^^^^^^^^^^^^ + + Returns the configured load carriers with the requested ``load_carrier_ids``. + If no ``load_carrier_ids`` are provided, all configured load carriers are returned. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v2/nodes/rc_load_carrier_db/services/get_load_carriers + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_load_carrier_get_load_carriers_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_load_carrier_get_load_carriers_response.txt + + + +.. _expl-loadcarrier-db-srv-delete-lc: + +``delete_load_carriers`` +^^^^^^^^^^^^^^^^^^^^^^^^ + + Deletes the configured load carriers with the requested ``load_carrier_ids``. + All load carriers to be deleted must be explicitly stated in ``load_carrier_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v2/nodes/rc_load_carrier_db/services/delete_load_carriers + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_load_carrier_delete_load_carriers_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_load_carrier_delete_load_carriers_response.txt + + +.. _sect-loadcarrier-db-return-codes: + +Return codes +------------ + +.. index:: + pair: LoadCarrierDB; return codes + +Each service response contains a ``return_code``, +which consists of a ``value`` plus an optional ``message``. +A successful service returns with a ``return_code`` value of ``0``. +Negative ``return_code`` values indicate that the service failed. +Positive ``return_code`` values indicate that the service succeeded with additional information. +The smaller value is selected in case a service has multiple ``return_code`` values, +but all messages are appended in the ``return_code`` message. + +The following table contains a list of common codes: + +.. tabularcolumns:: |c|L| +.. _tab-loadcarrier-return-codes: +.. csv-table:: Return codes of the LoadCarrierDB module's services + :header: Code, Description + + "0", "Success" + "-1", "An invalid argument was provided" + "-10", "New element could not be added as the maximum storage capacity of load carriers has been exceeded" + "10", "The maximum storage capacity of load carriers has been reached" + "11", "An existent persistent model was overwritten by the call to ``set_load_carrier``" + diff --git a/v24.04/de/_raw_sources/maintenance.rst.txt b/v24.04/de/_raw_sources/maintenance.rst.txt new file mode 100644 index 0000000..74d649d --- /dev/null +++ b/v24.04/de/_raw_sources/maintenance.rst.txt @@ -0,0 +1,283 @@ +.. include:: global_rst.glb + +.. _sect-maintenance: + +Maintenance +=========== + +.. only:: rc_visard or rc_visard_ng + + .. Warning:: The customer does not need to open the |rc_xxx|'s housing to perform + maintenance. Unauthorized opening will void the warranty. + + .. _sect-lens-cleaning: + + Lens cleaning + ------------- + + Glass lenses with antireflective coating are used to reduce glare. Please take special + care when cleaning the lenses. To clean them, use a soft lens-cleaning brush to remove + dust or dirt particles. Then use a clean microfiber cloth that is designed to clean lenses, + and gently wipe the lens using a circular motion to avoid scratches that may compromise + the sensor's performance. For stubborn dirt, high purity isopropanol or a lens cleaning + solution formulated for coated lenses (such as the Uvex Clear family of products) may be used. + + .. _sect-maintenance-camera-calibration: + + Camera calibration + ------------------ + + The cameras are calibrated during production. Under normal operating conditions, the calibration + will be valid for the life time of the sensor. High impact, such as occurring when dropping + the |rc_xxx|, can change the camera's parameters slightly. In this case, calibration can + be verified and recalibration undertaken via the |webgui| + (see :doc:`camera_calibration`:latex:`, Section \ref{camera_calibration:sect-camera-calibration}`). + +.. _sect-backup-settings: + +Creating and restoring backups of settings +------------------------------------------ + +.. index:: + pair: settings; backup + pair: settings; download + pair: settings; upload + pair: settings; restore + single: Web GUI; backup + +The |rc_xxx| offers the possibility to download the current settings as backup or for +transferring them to a different |rc_visard| or |rc_cube|. + +The current settings of the |rc_xxx| can be downloaded on the +:ref:`Web GUI`'s :latex:`(Section \ref{webgui:sect-web-gui})` *System* page +in the |rc_xxx| *Settings* section. They can also be downloaded via the |rcxxx|'s +:ref:`sect-rest-api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` +using the :http:get:`/system/backup` request. + +For downloading a backup, the user can choose which settings to include: + +- ``nodes``: the settings of all modules (parameters, preferred orientations and sorting strategies) +- ``load_carriers``: the configured load carriers +- ``regions_of_interest``: the configured 2D and 3D regions of interest +- ``grippers``: the configured grippers (without the CAD elements) + +The returned backup should be stored as a .json file. + +.. only:: rc_visard or rc_visard_ng + + The templates of the SilhouetteMatch module are not included in the backup but can be + downloaded manually using the |restapi| or the |webgui| + (see :ref:`sect-silhouettematch-template-upload`:latex:`, Section \ref{silhouettematch:sect-silhouettematch-template-upload}`). + +.. only:: rc_cube + + The templates of the SilhouetteMatch and CADMatch modules are not included in the backup but can be + downloaded manually using the |restapi| or the |webgui| + (see :ref:`sect-silhouettematch-template-upload`:latex:`, Section \ref{silhouettematch:sect-silhouettematch-template-upload}` + and :ref:`sect-cadmatch-template-upload`:latex:`, Section \ref{cadmatch:sect-cadmatch-template-upload}`). + +A backup can be restored to the |rc_xxx| on the +:ref:`Web GUI`'s :latex:`(Section \ref{webgui:sect-web-gui})` *System* page +in the |rc_xxx| *Settings* section by uploading the backup .json file. +In the :ref:`Web GUI` the settings included in the backup are shown and can be chosen for restore. +The corresponding :ref:`sect-rest-api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` +call is :http:post:`/system/backup`. + +.. Warning:: When restoring load carriers, all existing load carriers on the |rc_xxx| + will get lost and will be replaced by the content of the backup. The same applies to + restoring grippers and regions of interest. + +When restoring a backup, only the settings which are applicable to the |rc_xxx| are restored. Parameters +for modules that do not exist on the device or do not have a valid license will be skipped. If a +backup can only be restored partially, the user will be notified by warnings. + +.. _sect-updating-the-firmware: + +Updating the firmware +--------------------- + +.. index:: + pair: firmware; version + pair: firmware; update + pair: firmware; mender + single: Web GUI; update + +Information about the current firmware image version can be found on the +:ref:`Web GUI`'s :latex:`(Section \ref{webgui:sect-web-gui})` :menuselection:`System --> Firmware & License` page. +It can also be accessed via the |rcxxx|'s +:ref:`sect-rest-api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` +using the :http:get:`/system` request. Users can use either the |webgui| or the |restapi| +to update the firmware. + +.. Warning:: When upgrading from a version prior to 21.07, all of the software modules' configured parameters + will be reset to their defaults after a firmware update. Only when upgrading from version 21.07 or higher, + the last saved parameters will be preserved. + Please make sure these settings are persisted on the application-side + or client PC (e.g., using the + :ref:`sect-rest-api`:latex:`, Section \ref{rest_api:sect-rest-api}`) + to request all parameters and store them prior to executing the update. + + The following settings are excluded from this and will be + persisted across a firmware update: + + - the |rcxxx|'s network configuration including an optional static IP address and the + user-specified device name, + - the latest result of the :doc:`handeye_calibration`:latex:`\:(Section \ref{handeye_calibration:sect-handeye-calibration})`, + i.e., recalibrating the |rcxxx| w.r.t. a robot is not required, unless camera mounting + has changed, and + + .. only:: rc_visard or rc_visard_ng + + - the latest result of the :doc:`camera_calibration`:latex:`\:(Section \ref{camera_calibration:sect-camera-calibration})`, + i.e., recalibration of the |rcvisard|'s stereo cameras is not required. + + +Step 1: Download the newest firmware version. + Firmware updates will be supplied from of a Mender artifact file + identified by its ``.mender`` suffix. + + .. only:: roboception or schunk or matrixvision + + If a new firmware update is available for your |rcxxx| device, the + respective file can be downloaded to a local computer from + https://www.roboception.com/download. + + +Step 2: Upload the update file. + To update with the |rcxxx|'s |restapi|, users + may refer to the :http:post:`/system/update` request. + + To update the firmware via the |webgui|, locate the :menuselection:`System --> Firmware & License` page + and press the "Upload |rc_xxx| Update" button. + Select the desired update image file (file extension ``.mender``) + from the local file system and open it to start the update. + + Depending on the network architecture and configuration, the + upload may take several minutes. During the update via the |webgui|, + a progress bar indicates the progress of the upload. + + .. Note:: Depending on the web browser, the update progress status shown in the progress bar + may indicate the completion of the update too early. Please wait until a notification + window opens, which indicates the end of the update process. + Expect an overall update time of at least five minutes. + + .. Warning:: Do not close the web browser tab which contains the |webgui| or press the renew + button on this tab, because it will abort the update procedure. In that case, + repeat the update procedure from the beginning. + +Step 3: Reboot the |rcxxx|. + To apply a firmware update to the |rcxxx| + device, a reboot is required after having uploaded the new image version. + + .. index:: + single: active partition + single: inactive partition + + .. Note:: The new image version is uploaded to the inactive partition of the |rcxxx|. Only after rebooting + will the inactive partition be activated, and the active partition will become inactive. + If the updated firmware image cannot be loaded, this partition of the |rcxxx| remains inactive and + the previously installed firmware version from the active partition will be used automatically. + + As for the |restapi|, the reboot can be performed by the + :http:put:`/system/reboot` request. + + After having uploaded the new firmware via the |webgui|, a notification window + is opened, which offers to reboot + the device immediately or to postpone the reboot. To reboot the |rcxxx| + at a later time, use the *Reboot* button on the |webgui|'s *System* page. + +Step 4: Confirm the firmware update. + After rebooting the |rcxxx|, please check the firmware image version + number of the currently active image to make sure that the updated image + was successfully loaded. You can do so either via the + |webgui|'s :menuselection:`System --> Firmware & License` page or via the |restapi|'s :http:get:`/system/update` request. + + Please contact |company| in case the firmware update could not be applied successfully. + +.. _sect-restoring-the-previous-firmware-version: + +Restoring the previous firmware version +--------------------------------------- + +.. index:: + pair: rollback; firmware + single: inactive partition + +After a successful firmware update, the previous firmware image is stored on +the inactive partition of the |rcxxx| and can be restored in case needed. +This procedure is called a *rollback*. + +.. note:: Using the latest firmware as provided + by |company| is strongly recommended. Hence, rollback functionality should only be + used in case of serious issues with the updated firmware version. + +Rollback functionality is only accessible via the |rcxxx|'s +:ref:`sect-rest-api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` +using the :http:put:`/system/rollback` request. It can be issued +using any HTTP-compatible client or using a web browser as described in +:ref:`sect-swagger-ui`:latex:`\:(Section \ref{rest_api_swagger_ui:sect-swagger-ui})`. +Like the update process, the rollback requires a subsequent device reboot +to activate the restored firmware version. + +.. _sect-rebooting: + +Rebooting the |rcxxx| +--------------------- + +.. index:: + single: reboot + +An |rcxxx| reboot is necessary after updating the firmware or +performing a software rollback. It can be issued either +programmatically, via the |rcxxx|'s +:ref:`sect-rest-api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` +using the :http:put:`/system/reboot` request, or manually on the +:ref:`Web GUI`'s :latex:`(Section \ref{webgui:sect-web-gui})` *System* page. + +.. only:: rc_visard or rc_visard_ng + + The reboot is finished when the LED turns green again. + + +.. _sect-updating-license: + +Updating the software license +----------------------------- + +Licenses that are purchased from |company| for enabling additional features can be installed +via the :ref:`Web GUI`'s :latex:`(Section \ref{webgui:sect-web-gui})` :menuselection:`System --> Firmware & License` page. +The |rcxxx| has to be rebooted to apply the licenses. + +.. only:: rc_cube + + .. note:: If a computer screen as well as mouse and keyboard are connected to the |rc_xxx|, + the software license can also be updated directly at the |rc_xxx| using the + |webgui| and a separate USB flash drive from which the new license file can be installed. + + +.. _sect-downloading-log-files: + +Downloading log files +--------------------- + +.. index:: + pair: log files; download + single: Web GUI; logs + +During operation, the |rcxxx| logs important information, warnings, and errors into files. If the |rcxxx| exhibits unexpected +or erroneous behavior, the log files can be used to trace its origin. +Log messages can be viewed and filtered using +the :ref:`Web GUI`'s :latex:`(Section \ref{webgui:sect-web-gui})` :menuselection:`System --> Logs` page. If contacting the +support (:ref:`sect-contact`:latex:`, Section \ref{contact:sect-contact}`), the log files +are very useful for tracking possible problems. To download them as a .tar.gz file, +click on :guilabel:`Download all logs` on the |webgui|'s :menuselection:`System --> Logs` page. + +Aside from the |webgui|, the logs are also accessible via the |rcxxx|'s +:ref:`sect-rest-api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` +using the :http:get:`/logs` and :http:get:`/logs/{log}` requests. + +.. only:: rc_cube + + .. note:: If a computer screen as well as mouse and keyboard are connected to the |rc_xxx|, + the log files can also be download directly from the |rc_xxx| using the + |webgui| and a separate USB flash drive on which the log files can be stored. diff --git a/v24.04/de/_raw_sources/modules.rst.txt b/v24.04/de/_raw_sources/modules.rst.txt new file mode 100644 index 0000000..b3f9bb9 --- /dev/null +++ b/v24.04/de/_raw_sources/modules.rst.txt @@ -0,0 +1,70 @@ +.. include:: global_rst.glb + +.. _sect-modules: + +Software modules +================ + +The |rc_xxx| comes with several on-board software modules, each of which +corresponds to a certain functionality and can be interfaced via its respective +*node* in the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`. + +.. only:: rc_cube + + .. index:: ! Camera pipelines + + The |rc_cube| offers the possibility to connect multiple 3D cameras such as the + |rc_visard|. The image data from each device is processed in a separate *camera pipeline*, + which consists of several different software modules. The modules inside each pipeline are pipeline specific, + which means that they can have different parameters for each pipeline. The modules running outside the + pipelines are global and provide data for all modules in all pipelines. An overview is given in + :numref:`fig-pipeline-modules`. + + .. _fig-pipeline-modules: + .. figure:: images/pipelines_diagram.* + :width: 100 % + :align: center + + Overview of the pipeline-specific and global software modules on the |rc_cube| + + The |rc_xxx|'s pipeline-specific software modules can be divided into + +.. only:: rc_visard or rc_visard_ng + + The |rc_xxx|'s software modules can be divided into + +- :doc:`camera_modules`:latex:`\:(Section \ref{camera_modules:sect-3d-camera-modules})` + which acquire image pairs and compute 3D depth information such as disparity, + error, and confidence images, and are also accessible via the |rc_xxx|'s + :doc:`GigE Vision/GenICam interface`, + +.. only:: rc_visard + + - :doc:`navigation_modules`:latex:`\:(Section \ref{navigation_modules:sect-navigation-modules})` + which provide estimates of |rc_visard|'s current pose, + velocity, and acceleration, + +- :doc:`detection_modules`:latex:`\:(Section \ref{detection_modules:sect-detection-modules})` + which provide a variety of detection functionalities, such as grasp point computation and object detection, + +- :doc:`configuration_modules`:latex:`\:(Section \ref{configuration_modules:sect-configuration-modules})` + which enable the user to perform calibrations and configure the |rc_xxx| for specific applications. + +.. only:: rc_cube + + The modules that are global for all camera pipelines running on the |rc_cube| are the + +- :doc:`database_modules`:latex:`\:(Section \ref{database_modules:sect-database-modules})` + which enable the user to configure global data available to all other modules, such as load carriers, regions + of interest and grippers. + +.. toctree-filt:: + :maxdepth: 2 + :hidden: + + camera_modules + :rc_visard_only:navigation_modules + detection_modules + configuration_modules + database_modules + diff --git a/v24.04/de/_raw_sources/navigation_modules.rst.txt b/v24.04/de/_raw_sources/navigation_modules.rst.txt new file mode 100644 index 0000000..3ef871b --- /dev/null +++ b/v24.04/de/_raw_sources/navigation_modules.rst.txt @@ -0,0 +1,41 @@ +.. include:: global_rst.glb + +.. _sect-navigation-modules: + +Navigation modules +================== + +The |rc_xxx|'s navigation modules contain: + +- :doc:`dynamics` (``rc_dynamics``:latex:`, Section \ref{dynamics:sect-dynamics}`) + provides estimates of |rc_visard|'s dynamic state such as its pose, + velocity, and acceleration. These states are transmitted + as continuous data streams via the :doc:`rc_dynamics interface`. + For this purpose, the dynamics module manages and fuses data from the following individual + subcomponents: + + + - :doc:`stereo_visodo` (``rc_stereovisodo``:latex:`, Section \ref{stereo_visodo:sect-visual-odometry}`) + estimates the motion of the |rc_visard| device based on the motion of characteristic + visual features in the left camera images. + + - :doc:`stereo_ins` (``rc_stereo_ins``:latex:`, Section \ref{stereo_ins:sect-stereo-ins}`) + combines visual odometry measurements with readings from the on-board + Inertial Measurement Unit (IMU) to provide + accurate and high-frequency state estimates in real time. + + - :doc:`slam` (``rc_slam``:latex:`, Section \ref{slam:sect-slam}`) + performs simultaneous localization and mapping for correcting + accumulated poses. The |rcvisard|'s covered trajectory is offered via the + :ref:`sect-rest-api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`. + + +.. toctree-filt:: + :maxdepth: 2 + :hidden: + + :rc_cube_exclude:dynamics + :rc_cube_exclude:stereo_visodo + :rc_cube_exclude:stereo_ins + :rc_cube_exclude:slam + diff --git a/v24.04/de/_raw_sources/opc_ua.rst.txt b/v24.04/de/_raw_sources/opc_ua.rst.txt new file mode 100644 index 0000000..9721546 --- /dev/null +++ b/v24.04/de/_raw_sources/opc_ua.rst.txt @@ -0,0 +1,19 @@ +.. include:: global_rst.glb + +.. _sect-opc-ua: + +OPC UA interface +================ + +.. index:: + single: OPC UA + +The |rc_xxx| also offers an optional OPC UA interface. +The OPC UA server can be activated via license update. + +The OPC UA server uses the ``DataTypeDefinition`` attribute (available in OPC UA version 1.04) for custom datatypes and also uses methods and variable length arrays. +Please check if your OPC UA client supports this. + +.. only:: roboception + + Please contact support@roboception.de if you are interested in using the OPC UA server. diff --git a/v24.04/de/_raw_sources/pipelines.rst.txt b/v24.04/de/_raw_sources/pipelines.rst.txt new file mode 100644 index 0000000..6deb498 --- /dev/null +++ b/v24.04/de/_raw_sources/pipelines.rst.txt @@ -0,0 +1,116 @@ +.. include:: global_rst.glb + +.. _sect-pipelines: + +.. index:: ! Camera pipelines + +Camera pipelines +================ + +The |rc_xxx| supports multiple cameras at the same time. For this, it offers up to four +*camera pipelines* that can be configured by the user. + +A camera pipeline contains several software modules which are responsible for +acquiring data of the camera connected to that pipeline, performing detections or +configuring modules used in this pipeline, e.g. by hand-eye calibration. + +.. only:: roboception or schunk or basler + + The |rc_xxx| supports cameras of type |rc_visard|, |rc_viscore| and |blaze|. + The type of the corresponding camera pipeline has to be configured to match + the connected device. + +.. only:: matrixvision + + The |rc_xxx| supports cameras of type |rc_visard| and |rc_viscore|. + The type of the corresponding camera pipeline has to be configured to match + the connected device. + +Configuration of camera pipelines +--------------------------------- + +The camera pipelines can be configured via the :doc:`webgui`:latex:`\:(Section \ref{webgui:sect-web-gui})` +under :menuselection:`System --> Camera Pipelines`. This page shows the running pipelines with their +types and the connected devices. + +.. _fig-pipelines-running: +.. figure:: images/webgui_pipelines.png + :width: 100 % + :align: center + + Example of the *Camera Pipelines* page on an |rc_cube| with two running pipelines of type ``rc_visard`` + +Clicking on :guilabel:`Configure Camera Pipelines` allows to configure the number and type of running pipelines +as shown in the next figure. + +.. note:: The *rc_cube I* provides four camera pipelines, the *rc_cube S* two. + +.. _fig-pipelines-configuration: +.. figure:: images/webgui_pipelines_configure.png + :width: 60 % + :align: center + + Configuring the camera pipelines + +The type of a running pipeline can be changed by selecting a different type in the drop down field. +A running pipeline can be removed by clicking :guilabel:`Remove Pipeline`. Only pipeline 0 can never be removed, because +this is the primary pipeline. +Clicking on :guilabel:`+ Add Pipeline` allows to choose the type for the new pipeline and creates a +new pipeline of the chosen type. +Once the pipelines are configured as desired, clicking :guilabel:`Apply Changes & Reboot` will apply the new configuration +and immediately reboot the |rc_cube|. + + +Configuration of connected cameras +---------------------------------- + +A pipeline of a certain type can only discover devices of the same type. That means, a pipeline of type ``rc_visard`` can only +connect to an |rcvisard|. In case multiple cameras of the same type are connected to the |rc_cube|, the user can set a *device +filter* to choose a specific camera for each pipeline. The current device filter value is displayed for each running pipeline +as shown in :numref:`fig-pipelines-running`. By default, the device filter is set to ``*``, which means that any device +matching the pipeline type will automatically be connected, but only if there is a unique match. Otherwise, no camera will be +connected to that pipeline and an error will be shown. + +To adjust the device filter and select the camera to be connected to a pipeline, +click on :guilabel:`Configure Camera Connection` on the *Camera Pipelines* page, +or select the corresponding pipeline in the menu, e.g. under :menuselection:`System --> Camera Pipelines --> Pipeline 1`. +This will show the current device filter value and more information about the connected +camera. + +.. _fig-pipeline-page: +.. figure:: images/webgui_pipeline.png + :width: 100 % + :align: center + + Configuring the camera connection of pipeline 1 + +Clicking :guilabel:`Choose Camera` opens a dialog to edit the device filter. + +.. _fig-pipeline-page: +.. figure:: images/webgui_choose_camera.png + :width: 60 % + :align: center + + Choosing the camera by setting a device filter + +This dialog also shows a list of all discovered devices matching the pipeline +type and highlights the ones that match the current value entered for the device filter. +It also indicates if the devices are already in use in a different pipeline. +Device filters can be selected by clicking on an *Interface*, *Name* or *Serial* +of the desired device in the list. The following table shows possible device filter values. + +.. tabularcolumns:: |l|L| +.. _tab-roi-spec: +.. csv-table:: Possible device filter values + :header: Device filter, Description + + "\*", "selects any device matching the pipeline type" + "sensor:*", "selects any device connected via the sensor interface that matches the pipeline type" + "", "selects the device by the user-defined name" + "", "selects the device by the full serial number" + "sensor:", "selects the device connected via the sensor interface with the given serial" + "sensor:", "selects the device connected via the sensor interface with the given user-defined name" + "", "if empty, no camera will be connected" + +By pressing :guilabel:`Save`, the entered device filter is applied and a camera matching the device filter is connected to +this pipeline, if possible. Changing the device filter does not require a reboot of the |rc_cube|. diff --git a/v24.04/de/_raw_sources/pose_format_abb.rst.txt b/v24.04/de/_raw_sources/pose_format_abb.rst.txt new file mode 100644 index 0000000..bf8385f --- /dev/null +++ b/v24.04/de/_raw_sources/pose_format_abb.rst.txt @@ -0,0 +1,9 @@ +.. include:: global_rst.glb + +.. _sect-abb-format: + +ABB pose format +--------------- + +ABB robots use a position and a quaternion for describing a pose, like |rc_xxx| +devices. There is no conversion of the orientation needed. diff --git a/v24.04/de/_raw_sources/pose_format_fanuc.rst.txt b/v24.04/de/_raw_sources/pose_format_fanuc.rst.txt new file mode 100644 index 0000000..a25d01f --- /dev/null +++ b/v24.04/de/_raw_sources/pose_format_fanuc.rst.txt @@ -0,0 +1,46 @@ +.. include:: global_rst.glb + +.. _sect-fanuc-format: + +FANUC XYZ-WPR format +-------------------- + +The pose format that is used by FANUC robots consists of a position :math:`XYZ` +in millimeters and an orientation :math:`WPR` that is given by three angles in +degrees, with :math:`W` rotating around :math:`x`-axis, :math:`P` rotating +around :math:`y`-axis and :math:`R` rotating around :math:`z`-axis. The +rotation order is :math:`x`-:math:`y`-:math:`z` and computed by :math:`r_z(R) +r_y(P) r_x(W)`. + +Conversion from FANUC-WPR to quaternion +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from the :math:`WPR` angles in degrees to a quaternion +:math:`q=(\begin{array}{cccc}x & y & z & w\end{array})` can be done by +first converting all angles to radians + +.. math:: + W_r = W \frac{\pi}{180} \text{,} \\ + P_r = P \frac{\pi}{180} \text{,} \\ + R_r = R \frac{\pi}{180} \text{,} \\ + +and then calculating the quaternion with + +.. math:: + x = \cos{(R_r/2)}\cos{(P_r/2)}\sin{(W_r/2)} - \sin{(R_r/2)}\sin{(P_r/2)}\cos{(W_r/2)} \text{,} \\ + y = \cos{(R_r/2)}\sin{(P_r/2)}\cos{(W_r/2)} + \sin{(R_r/2)}\cos{(P_r/2)}\sin{(W_r/2)} \text{,} \\ + z = \sin{(R_r/2)}\cos{(P_r/2)}\cos{(W_r/2)} - \cos{(R_r/2)}\sin{(P_r/2)}\sin{(W_r/2)} \text{,} \\ + w = \cos{(R_r/2)}\cos{(P_r/2)}\cos{(W_r/2)} + \sin{(R_r/2)}\sin{(P_r/2)}\sin{(W_r/2)} \text{.} + +Conversion from quaternion to FANUC-WPR +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from a quaternion :math:`q=(\begin{array}{cccc}x & y & z & +w\end{array})` with :math:`||q||=1` to the :math:`WPR` angles in degrees can +be done as follows. + +.. math:: + R &= \text{atan}_2{(2(wz + xy), 1 - 2(y^2 + z^2))} \frac{180}{\pi} \\ + P &= \text{asin}{(2(wy - zx))} \frac{180}{\pi} \\ + W &= \text{atan}_2{(2(wx + yz), 1 - 2(x^2 + y^2))} \frac{180}{\pi} + diff --git a/v24.04/de/_raw_sources/pose_format_franka_emika.rst.txt b/v24.04/de/_raw_sources/pose_format_franka_emika.rst.txt new file mode 100644 index 0000000..f4cf48e --- /dev/null +++ b/v24.04/de/_raw_sources/pose_format_franka_emika.rst.txt @@ -0,0 +1,105 @@ +.. include:: global_rst.glb + +.. _sect-franka-emika-format: + +Franka Emika Pose Format +------------------------ + +Franka Emika robots use a transformation matrix :math:`T` to define a pose. +A transformation matrix combines a rotation matrix :math:`R` and a translation vector +:math:`t=(\begin{array}{cccc}x & y & z\end{array})^T`. + +.. math:: + T = \left(\begin{array}{cccc} + r_{00} & r_{01} & r_{02} & x\\ + r_{10} & r_{11} & r_{12} & y\\ + r_{20} & r_{21} & r_{22} & z\\ + 0 & 0 & 0 & 1 + \end{array}\right) + +The pose given by Franka Emika's "Measure Pose" App consists of a translation :math:`x, y, z` +in millimeters and a rotation :math:`x, y, z` in degrees. The rotation convention is +:math:`z`-:math:`y'`-:math:`x''` (i.e. :math:`x`-:math:`y`-:math:`z`) and is +computed by :math:`r_z(z) r_y(y) r_x(x).` + +Conversion from transformation matrix to quaternion +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from a rotation matrix (with :math:`det(R)=1`) to a quaternion +:math:`q=(\begin{array}{cccc}q_x & q_y & q_z & q_w \end{array})` can be done as follows: + +.. math:: + q_x &= \text{sign}(r_{21}-r_{12}) \frac{1}{2}\sqrt{\text{max}(0, 1 + r_{00} - r_{11} - r_{22})} \\ + q_y &= \text{sign}(r_{02}-r_{20}) \frac{1}{2}\sqrt{\text{max}(0, 1 - r_{00} + r_{11} - r_{22})} \\ + q_z &= \text{sign}(r_{10}-r_{01}) \frac{1}{2}\sqrt{\text{max}(0, 1 - r_{00} - r_{11} + r_{22})} \\ + q_w &= \frac{1}{2}\sqrt{\text{max}(0, 1 + r_{00} + r_{11} + r_{22})} + +The :math:`\text{sign}` operator returns -1 if the argument is negative. +Otherwise, 1 is returned. It is used to recover the sign for the square root. +The :math:`\text{max}` function ensures that the argument of the square root +function is not negative, which can happen in practice due to round-off errors. + +Conversion from Rotation-XYZ to quaternion +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from the :math:`x, y, z` angles in degrees to a quaternion +:math:`q=(\begin{array}{cccc}q_x & q_y & q_z & q_w\end{array})` can be done by +first converting all angles to radians + +.. math:: + X_r = x \frac{\pi}{180} \text{,} \\ + Y_r = y \frac{\pi}{180} \text{,} \\ + Z_r = z \frac{\pi}{180} \text{,} \\ + +and then calculating the quaternion with + +.. math:: + q_x = \cos{(Z_r/2)}\cos{(Y_r/2)}\sin{(X_r/2)} - \sin{(Z_r/2)}\sin{(Y_r/2)}\cos{(X_r/2)} \text{,} \\ + q_y = \cos{(Z_r/2)}\sin{(Y_r/2)}\cos{(X_r/2)} + \sin{(Z_r/2)}\cos{(Y_r/2)}\sin{(X_r/2)} \text{,} \\ + q_z = \sin{(Z_r/2)}\cos{(Y_r/2)}\cos{(X_r/2)} - \cos{(Z_r/2)}\sin{(Y_r/2)}\sin{(X_r/2)} \text{,} \\ + q_w = \cos{(Z_r/2)}\cos{(Y_r/2)}\cos{(X_r/2)} + \sin{(Z_r/2)}\sin{(Y_r/2)}\sin{(X_r/2)} \text{.} + +Conversion from quaternion and translation to transformation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from a quaternion :math:`q=(\begin{array}{cccc}q_x & q_y & q_z & +q_w\end{array})` and a translation vector :math:`t=(\begin{array}{cccc}x & y & z\end{array})^T` +to a transformation matrix :math:`T` can be done as follows: + +.. math:: + T = \left(\begin{array}{cccc} + 1 - 2s(q_y^2+q_z^2) & 2s(q_x q_y-q_z q_w) & 2s(q_x q_z+q_y q_w) & x\\ + 2s(q_x q_y+q_z q_w) & 1 - 2s(q_x^2+q_z^2) & 2s(q_y q_z-q_x q_w) & y\\ + 2s(q_x q_z-q_y q_w) & 2s(q_y q_z+q_x q_w) & 1 - 2s(q_x^2+q_y^2) & z\\ + 0 & 0 & 0 & 1 + \end{array}\right) + +where :math:`s=||q||^{-2}=\frac{1}{q_x^2+q_y^2+q_z^2+q_w^2}` and :math:`s=1`` if +:math:`q` is a unit quaternion. + +Conversion from quaternion to Rotation-XYZ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from a quaternion :math:`q=(\begin{array}{cccc}q_x & q_y & q_z & +q_w\end{array})` with :math:`||q||=1` to the :math:`x, y, z` angles in degrees can +be done as follows. + +.. math:: + x &= \text{atan}_2{(2(q_w q_z + q_x q_y), 1 - 2(q_y^2 + q_z^2))} \frac{180}{\pi} \\ + y &= \text{asin}{(2(q_w q_y - q_z q_x))} \frac{180}{\pi} \\ + z &= \text{atan}_2{(2(q_w q_x + q_y q_z), 1 - 2(q_x^2 + q_y^2))} \frac{180}{\pi} + +Pose representation in RaceCom messages and state machines +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +In RaceCom messages and in state machines a pose is usually defined as +one-dimensional array of 16 float values, representing the transformation matrix +in column-major order. The indices of the matrix entries below correspond to the +array indices + +.. math:: + T = \left(\begin{array}{cccc} + a_0 & a_4 & a_8 & a_{12}\\ + a_1 & a_5 & a_9 & a_{13}\\ + a_2 & a_6 & a_{10} & a_{14}\\ + a_3 & a_7 & a_{11} & a_{15} + \end{array}\right) \ No newline at end of file diff --git a/v24.04/de/_raw_sources/pose_format_fruitcore_horst.rst.txt b/v24.04/de/_raw_sources/pose_format_fruitcore_horst.rst.txt new file mode 100644 index 0000000..16f0101 --- /dev/null +++ b/v24.04/de/_raw_sources/pose_format_fruitcore_horst.rst.txt @@ -0,0 +1,9 @@ +.. include:: global_rst.glb + +.. _sect-fruitcore-horst-format: + +Fruitcore HORST pose format +--------------------------- + +Fruitcore HORST robots use a position in meters and a quaternion with :math:`q_0 = w`, :math:`q_1 = x`, :math:`q_2 = y` and :math:`q_3 = z` for describing a pose, like |rc_xxx| +devices. There is no conversion needed. diff --git a/v24.04/de/_raw_sources/pose_format_kawasaki.rst.txt b/v24.04/de/_raw_sources/pose_format_kawasaki.rst.txt new file mode 100644 index 0000000..c8efe32 --- /dev/null +++ b/v24.04/de/_raw_sources/pose_format_kawasaki.rst.txt @@ -0,0 +1,62 @@ +.. include:: global_rst.glb + +.. _sect-kawasaki-format: + +Kawasaki XYZ-OAT format +----------------------- + +The pose format that is used by Kawasaki robots consists of a position +:math:`XYZ` in millimeters and an orientation :math:`OAT` that is given by three angles in +degrees, with :math:`O` rotating around :math:`z` axis, :math:`A` rotating +around the rotated :math:`y` axis and :math:`T` rotating around the rotated +:math:`z` axis. The rotation convention is :math:`z`-:math:`y'`-:math:`z''` +(i.e. :math:`z`-:math:`y`-:math:`z`) and computed by :math:`r_z(O) r_y(A) +r_z(T)`. + +Conversion from Kawasaki-OAT to quaternion +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from the :math:`OAT` angles in degrees to a quaternion +:math:`q=(\begin{array}{cccc}x & y & z & w\end{array})` can be done by first +converting all angles to radians + +.. math:: + O_r = O \frac{\pi}{180} \text{,} \\ + A_r = A \frac{\pi}{180} \text{,} \\ + T_r = T \frac{\pi}{180} \text{,} \\ + +and then calculating the quaternion with + +.. math:: + x = \cos{(O_r/2)}\sin{(A_r/2)}\sin{(T_r/2)} - \sin{(O_r/2)}\sin{(A_r/2)}\cos{(T_r/2)} \text{,} \\ + y = \cos{(O_r/2)}\sin{(A_r/2)}\cos{(T_r/2)} + \sin{(O_r/2)}\sin{(A_r/2)}\sin{(T_r/2)} \text{,} \\ + z = \sin{(O_r/2)}\cos{(A_r/2)}\cos{(T_r/2)} + \cos{(O_r/2)}\cos{(A_r/2)}\sin{(T_r/2)} \text{,} \\ + w = \cos{(O_r/2)}\cos{(A_r/2)}\cos{(T_r/2)} - \sin{(O_r/2)}\cos{(A_r/2)}\sin{(T_r/2)} \text{.} + +Conversion from quaternion to Kawasaki-OAT +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from a quaternion :math:`q=(\begin{array}{cccc}x & y & z & +w\end{array})` with :math:`||q||=1` to the :math:`OAT` angles in degrees can +be done as follows. + +If :math:`x = 0` **and** :math:`y = 0` the conversion is + +.. math:: + O &= \text{atan}_2{(2(z - w), 2(z + w))} \frac{180}{\pi} \\ + A &= \text{acos}{(w^2 + z^2)} \frac{180}{\pi} \\ + T &= \text{atan}_2{(2(z + w), 2(w - z))} \frac{180}{\pi} + +If :math:`z = 0` **and** :math:`w = 0` the conversion is + +.. math:: + O &= \text{atan}_2{(2(y - x), 2(x + y))} \frac{180}{\pi} \\ + A &= \text{acos}{(-1.0)} \frac{180}{\pi} \\ + T &= \text{atan}_2{(2(y + x), 2(y - x))} \frac{180}{\pi} + +In all other cases the conversion is + +.. math:: + O &= \text{atan}_2{(2(yz - wx), 2(xz + wy))} \frac{180}{\pi} \\ + A &= \text{acos}{(w^2 - x^2 - y^2 + z^2)} \frac{180}{\pi} \\ + T &= \text{atan}_2{(2(yz + wx), 2(wy - xz))} \frac{180}{\pi} diff --git a/v24.04/de/_raw_sources/pose_format_kuka.rst.txt b/v24.04/de/_raw_sources/pose_format_kuka.rst.txt new file mode 100644 index 0000000..d973db3 --- /dev/null +++ b/v24.04/de/_raw_sources/pose_format_kuka.rst.txt @@ -0,0 +1,46 @@ +.. include:: global_rst.glb + +.. _sect-xyzabc-format: + +KUKA XYZ-ABC format +------------------- + +KUKA robots use the so called XYZ-ABC format. :math:`XYZ` is the position in +millimeters. :math:`ABC` are angles in degrees, with :math:`A` rotating around +:math:`z` axis, :math:`B` rotating around :math:`y` axis and :math:`C` rotating +around :math:`x` axis. The rotation convention is +:math:`z`-:math:`y'`-:math:`x''` (i.e. :math:`x`-:math:`y`-:math:`z`) and +computed by :math:`r_z(A) r_y(B) r_x(C)`. + +Conversion from KUKA-ABC to quaternion +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from the :math:`ABC` angles in degrees to a quaternion +:math:`q=(\begin{array}{cccc}x & y & z & w\end{array})` can be done by first +converting all angles to radians + +.. math:: + A_r = A \frac{\pi}{180} \text{,} \\ + B_r = B \frac{\pi}{180} \text{,} \\ + C_r = C \frac{\pi}{180} \text{,} \\ + +and then calculating the quaternion with + +.. math:: + x = \cos{(A_r/2)}\cos{(B_r/2)}\sin{(C_r/2)} - \sin{(A_r/2)}\sin{(B_r/2)}\cos{(C_r/2)} \text{,} \\ + y = \cos{(A_r/2)}\sin{(B_r/2)}\cos{(C_r/2)} + \sin{(A_r/2)}\cos{(B_r/2)}\sin{(C_r/2)} \text{,} \\ + z = \sin{(A_r/2)}\cos{(B_r/2)}\cos{(C_r/2)} - \cos{(A_r/2)}\sin{(B_r/2)}\sin{(C_r/2)} \text{,} \\ + w = \cos{(A_r/2)}\cos{(B_r/2)}\cos{(C_r/2)} + \sin{(A_r/2)}\sin{(B_r/2)}\sin{(C_r/2)} \text{.} + +Conversion from quaternion to KUKA-ABC +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from a quaternion :math:`q=(\begin{array}{cccc}x & y & z & +w\end{array})` with :math:`||q||=1` to the :math:`ABC` angles in degrees can +be done as follows. + +.. math:: + A &= \text{atan}_2{(2(wz + xy), 1 - 2(y^2 + z^2))} \frac{180}{\pi} \\ + B &= \text{asin}{(2(wy - zx))} \frac{180}{\pi} \\ + C &= \text{atan}_2{(2(wx + yz), 1 - 2(x^2 + y^2))} \frac{180}{\pi} + diff --git a/v24.04/de/_raw_sources/pose_format_mitsubishi.rst.txt b/v24.04/de/_raw_sources/pose_format_mitsubishi.rst.txt new file mode 100644 index 0000000..dc8c664 --- /dev/null +++ b/v24.04/de/_raw_sources/pose_format_mitsubishi.rst.txt @@ -0,0 +1,44 @@ +.. include:: global_rst.glb + +.. _sect-mitsubishi-format: + +Mitsubishi XYZ-ABC format +------------------------- + +The pose format that is used by Mitsubishi robots is the same as that for KUKA robots +(see :ref:`sect-xyzabc-format`:latex:`, Section \ref{pose_format_kuka:sect-xyzabc-format}`), +except that :math:`A` is a rotation around :math:`x` axis and :math:`C` is a rotation +around :math:`z` axis. Thus, the rotation is computed by :math:`r_z(C) r_y(B) r_x(A)`. + +Conversion from Mitsubishi-ABC to quaternion +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from the :math:`ABC` angles in degrees to a quaternion +:math:`q=(\begin{array}{cccc}x & y & z & w\end{array})` can be done by first +converting all angles to radians + +.. math:: + A_r = A \frac{\pi}{180} \text{,} \\ + B_r = B \frac{\pi}{180} \text{,} \\ + C_r = C \frac{\pi}{180} \text{,} \\ + +and then calculating the quaternion with + +.. math:: + x = \cos{(C_r/2)}\cos{(B_r/2)}\sin{(A_r/2)} - \sin{(C_r/2)}\sin{(B_r/2)}\cos{(A_r/2)} \text{,} \\ + y = \cos{(C_r/2)}\sin{(B_r/2)}\cos{(A_r/2)} + \sin{(C_r/2)}\cos{(B_r/2)}\sin{(A_r/2)} \text{,} \\ + z = \sin{(C_r/2)}\cos{(B_r/2)}\cos{(A_r/2)} - \cos{(C_r/2)}\sin{(B_r/2)}\sin{(A_r/2)} \text{,} \\ + w = \cos{(C_r/2)}\cos{(B_r/2)}\cos{(A_r/2)} + \sin{(C_r/2)}\sin{(B_r/2)}\sin{(A_r/2)} \text{.} + +Conversion from quaternion to Mitsubishi-ABC +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from a quaternion :math:`q=(\begin{array}{cccc}x & y & z & +w\end{array})` with :math:`||q||=1` to the :math:`ABC` angles in degrees can +be done as follows. + +.. math:: + A &= \text{atan}_2{(2(wx + yz), 1 - 2(x^2 + y^2))} \frac{180}{\pi} \\ + B &= \text{asin}{(2(wy - zx))} \frac{180}{\pi} \\ + C &= \text{atan}_2{(2(wz + xy), 1 - 2(y^2 + z^2))} \frac{180}{\pi} + diff --git a/v24.04/de/_raw_sources/pose_format_rt.rst.txt b/v24.04/de/_raw_sources/pose_format_rt.rst.txt new file mode 100644 index 0000000..bc6f552 --- /dev/null +++ b/v24.04/de/_raw_sources/pose_format_rt.rst.txt @@ -0,0 +1,57 @@ +.. include:: global_rst.glb + +.. _sect-xyz-quaternion-format: + +Rotation matrix and translation vector +-------------------------------------- + +A pose can also be defined by a rotation matrix :math:`R` and a translation +vector :math:`T`. + +.. math:: + R = \left(\begin{array}{ccc} + r_{00} & r_{01} & r_{02} \\ + r_{10} & r_{11} & r_{12} \\ + r_{20} & r_{21} & r_{22} + \end{array}\right), \qquad + T = \left(\begin{array}{c} + X \\ + Y \\ + Z + \end{array}\right). + +The pose transformation can be applied to a point :math:`P` by + +.. math:: + P' = R P + T. + +Conversion from rotation matrix to quaternion +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from a rotation matrix (with :math:`det(R)=1`) to a quaternion +:math:`q=(\begin{array}{cccc}x & y & z & w\end{array})` can be done as follows. + +.. math:: + x &= \text{sign}(r_{21}-r_{12}) \frac{1}{2}\sqrt{\text{max}(0, 1 + r_{00} - r_{11} - r_{22})} \\ + y &= \text{sign}(r_{02}-r_{20}) \frac{1}{2}\sqrt{\text{max}(0, 1 - r_{00} + r_{11} - r_{22})} \\ + z &= \text{sign}(r_{10}-r_{01}) \frac{1}{2}\sqrt{\text{max}(0, 1 - r_{00} - r_{11} + r_{22})} \\ + w &= \frac{1}{2}\sqrt{\text{max}(0, 1 + r_{00} + r_{11} + r_{22})} + +The :math:`\text{sign}` operator returns -1 if the argument is negative. +Otherwise, 1 is returned. It is used to recover the sign for the square root. +The :math:`\text{max}` function ensures that the argument of the square root +function is not negative, which can happen in practice due to round-off errors. + +Conversion from quaternion to rotation matrix +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from a quaternion :math:`q=(\begin{array}{cccc}x & y & z & +w\end{array})` with :math:`||q||=1` to a rotation matrix can be done as +follows. + +.. math:: + R = 2 \left(\begin{array}{ccc} + \frac{1}{2} - y^2 - z^2 & x y - z w & x z + y w \\ + x y + z w & \frac{1}{2} - x^2 - z^2 & y z - x w \\ + x z - y w & y z + x w & \frac{1}{2} - x^2 - y^2 + \end{array}\right) diff --git a/v24.04/de/_raw_sources/pose_format_ur.rst.txt b/v24.04/de/_raw_sources/pose_format_ur.rst.txt new file mode 100644 index 0000000..502ff4c --- /dev/null +++ b/v24.04/de/_raw_sources/pose_format_ur.rst.txt @@ -0,0 +1,59 @@ +.. include:: global_rst.glb + +.. _sect-ur-format: + +Universal Robots pose format +---------------------------- + +The pose format that is used by Universal Robots consists of a position +:math:`XYZ` in millimeters and an orientation in angle-axis format +:math:`V=(\begin{array}{ccc}RX & RY & RZ\end{array})^T`. The rotation angle +:math:`\theta` in radians is the length of the rotation axis :math:`U`. + +.. math:: + V = \left(\begin{array}{c}RX \\ RY \\ RZ\end{array}\right) = \left(\begin{array}{c}\theta u_x \\ \theta u_y \\ \theta u_z\end{array}\right) + +:math:`V` is called a rotation vector. + +Conversion from angle-axis format to quaternion +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from a rotation vector :math:`V` to a quaternion +:math:`q=(\begin{array}{cccc}x & y & z & w\end{array})` can be done as +follows. + +We first recover the angle :math:`\theta` in radians from the rotation vector +:math:`V` by + +.. math:: + \theta = \sqrt{RX^2 + RY^2 + RZ^2}\text{.} + +If :math:`\theta = 0`, then the quaternion is :math:`q=(\begin{array}{cccc}0 & 0 & 0 & 1\end{array})`, +otherwise it is + +.. math:: + x = RX \frac{\sin(\theta/2)}{\theta}\text{,} \\ + y = RY \frac{\sin(\theta/2)}{\theta}\text{,} \\ + z = RZ \frac{\sin(\theta/2)}{\theta}\text{,} \\ + w = \cos(\theta/2)\text{.} + +Conversion from quaternion to angle-axis format +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from a quaternion :math:`q=(\begin{array}{cccc}x & y & z & +w\end{array})` with :math:`||q||=1` to a rotation vector in angle-axis form +can be done as follows. + +We first recover the angle :math:`\theta` in radians from the quaternion by + +.. math:: + \theta = 2\cdot\text{acos}(w)\text{.} + +If :math:`\theta = 0`, then the rotation vector is :math:`V=(\begin{array}{ccc}0 & 0 & 0\end{array})^T`, +otherwise it is + +.. math:: + RX = \theta \frac{x}{\sqrt{1-w^2}}\text{,} \\ + RY = \theta \frac{y}{\sqrt{1-w^2}}\text{,} \\ + RZ = \theta \frac{z}{\sqrt{1-w^2}}\text{.} + diff --git a/v24.04/de/_raw_sources/pose_format_yaskawa.rst.txt b/v24.04/de/_raw_sources/pose_format_yaskawa.rst.txt new file mode 100644 index 0000000..602965e --- /dev/null +++ b/v24.04/de/_raw_sources/pose_format_yaskawa.rst.txt @@ -0,0 +1,46 @@ +.. include:: global_rst.glb + +.. _sect-yaskawa-format: + +Yaskawa Pose Format +------------------- + +The pose format that is used by Yaskawa robots consists of a position :math:`XYZ` +in millimeters and an orientation that is given by three angles in +degrees, with :math:`Rx` rotating around :math:`x`-axis, :math:`Ry` rotating +around :math:`y`-axis and :math:`Rz` rotating around :math:`z`-axis. The +rotation order is :math:`x`-:math:`y`-:math:`z` and computed by :math:`r_z(Rz) +r_y(Ry) r_x(Rx)`. + +Conversion from Yaskawa Rx, Ry, Rz to quaternion +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from the :math:`Rx, Ry, Rz` angles in degrees to a quaternion +:math:`q=(\begin{array}{cccc}x & y & z & w\end{array})` can be done by +first converting all angles to radians + +.. math:: + X_r = Rx \frac{\pi}{180} \text{,} \\ + Y_r = Ry \frac{\pi}{180} \text{,} \\ + Z_r = Rz \frac{\pi}{180} \text{,} \\ + +and then calculating the quaternion with + +.. math:: + x = \cos{(Z_r/2)}\cos{(Y_r/2)}\sin{(X_r/2)} - \sin{(Z_r/2)}\sin{(Y_r/2)}\cos{(X_r/2)} \text{,} \\ + y = \cos{(Z_r/2)}\sin{(Y_r/2)}\cos{(X_r/2)} + \sin{(Z_r/2)}\cos{(Y_r/2)}\sin{(X_r/2)} \text{,} \\ + z = \sin{(Z_r/2)}\cos{(Y_r/2)}\cos{(X_r/2)} - \cos{(Z_r/2)}\sin{(Y_r/2)}\sin{(X_r/2)} \text{,} \\ + w = \cos{(Z_r/2)}\cos{(Y_r/2)}\cos{(X_r/2)} + \sin{(Z_r/2)}\sin{(Y_r/2)}\sin{(X_r/2)} \text{.} + +Conversion from quaternion to Yaskawa Rx, Ry, Rz +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from a quaternion :math:`q=(\begin{array}{cccc}x & y & z & +w\end{array})` with :math:`||q||=1` to the :math:`Rx, Ry, Rz` angles in degrees can +be done as follows. + +.. math:: + Rx &= \text{atan}_2{(2(wx + yz), 1 - 2(x^2 + y^2))} \frac{180}{\pi} \\ + Ry &= \text{asin}{(2(wy - zx))} \frac{180}{\pi} \\ + Rz &= \text{atan}_2{(2(wz + xy), 1 - 2(y^2 + z^2))} \frac{180}{\pi} + diff --git a/v24.04/de/_raw_sources/rest_api.rst.txt b/v24.04/de/_raw_sources/rest_api.rst.txt new file mode 100644 index 0000000..4e3f053 --- /dev/null +++ b/v24.04/de/_raw_sources/rest_api.rst.txt @@ -0,0 +1,39 @@ +.. include:: global_rst.glb + +.. _sect-rest-api: + +|rest-api| interface +-------------------- + +.. index:: + single: REST-API + +Aside from the :ref:`GenICam interface `:latex:`\ (Section +\ref{gigevision:sect-genicam})`, the |rc_xxx| offers a comprehensive RESTful web +interface (|rest-api|) which any HTTP client or library can access. +Whereas most of the provided parameters, services, and functionalities can also +be accessed via the user-friendly :ref:`Web GUI`:latex:`\ (Section +\ref{webgui:sect-web-gui})`, the |rest-api| serves rather as a +machine-to-machine interface to the |rc_xxx|, e.g., to programmatically + +* set and get run-time parameters of computation nodes, e.g., of cameras + or image processing modules; +* do service calls, e.g., to start and stop individual computational nodes, + or to use offered services such as the hand-eye calibration; +* read the current state of the system and individual computational nodes; or +* update the |rc_xxx|'s firmware or license. + + +.. NOTE:: In the |rc_xxx|'s |rest-api|, a *node* is a computational component + that bundles certain algorithmic functionality and offers a + holistic interface (parameters, services, current status). Examples + for such nodes are the stereo matching node or the hand-eye calibration node. + + +.. toctree-filt:: + :hidden: + :maxdepth: 2 + + rest_api_general + rest_api_datamodel + rest_api_swagger_ui diff --git a/v24.04/de/_raw_sources/rest_api_datamodel.rst.txt b/v24.04/de/_raw_sources/rest_api_datamodel.rst.txt new file mode 100644 index 0000000..2208e31 --- /dev/null +++ b/v24.04/de/_raw_sources/rest_api_datamodel.rst.txt @@ -0,0 +1,27 @@ +.. include:: global_rst.glb + +.. _sect-rest-datamodel: + +Data type definitions +^^^^^^^^^^^^^^^^^^^^^ + +.. index:: + pair: REST-API; data-type + pair: REST-API; data model + +The |restapi| defines the following data models, which are used to access +or modify :ref:`the available resources ` +:latex:`\:(Section \ref{rest_api_general:sect-rest-resources-and-methods})` either as +required attributes/parameters of the requests or as return types. + +.. only:: rc_visard + + .. include:: _gen/swagger/rc_visard/definitions.txt + +.. only:: rc_visard_ng + + .. include:: _gen/swagger/rc_visard_ng/definitions.txt + +.. only:: rc_cube + + .. include:: _gen/swagger/rc_cube/definitions.txt diff --git a/v24.04/de/_raw_sources/rest_api_general.rst.txt b/v24.04/de/_raw_sources/rest_api_general.rst.txt new file mode 100644 index 0000000..b35f90e --- /dev/null +++ b/v24.04/de/_raw_sources/rest_api_general.rst.txt @@ -0,0 +1,218 @@ +.. include:: global_rst.glb + + +General API structure +^^^^^^^^^^^^^^^^^^^^^ + +.. index:: + single: REST-API; entry point + pair: REST-API; version + +The general **entry point** to the |rc-xxx|'s API is ``http:///api/``, +where ```` is either the device's IP address or its :ref:`host name` as known +by the respective DHCP server, as explained in +:ref:`network configuration`:latex:`\ (Section +\ref{installation:sect-network-configuration})`. +Accessing this entry point with a web browser lets the user explore and test +the full API during run-time using the :ref:`sect-swagger-ui` +:latex:`\ (Section \ref{rest_api_swagger_ui:sect-swagger-ui})`. + +For actual HTTP requests, the **current API version is appended** to the entry point +of the API, i.e., ``http:///api/v2``. All data sent to and +received by the |rest-api| follows the JavaScript Object Notation (JSON). +The API is designed to let the user **create, retrieve, modify, and delete** +so-called **resources** as listed in :ref:`Available resources and requests`:latex:`\ (Section +\ref{rest_api_general:sect-rest-resources-and-methods})` using the HTTP requests below. + +.. tabularcolumns:: |p{40mm}|p{50mm}| + ++-------------------+---------------------------------------------------------------------+ +| Request type | Description | ++===================+=====================================================================+ +| GET | Access one or more resources and return the result as JSON. | ++-------------------+---------------------------------------------------------------------+ +| PUT | Modify a resource and return the modified resource as JSON. | ++-------------------+---------------------------------------------------------------------+ +| DELETE | Delete a resource. | ++-------------------+---------------------------------------------------------------------+ +| POST | Upload file (e.g., license or firmware image). | ++-------------------+---------------------------------------------------------------------+ + +Depending on the type and the specific request itself, **arguments** to HTTP +requests can be transmitted as part of the **path** (:term:`URI`) to the +resource, as +**query** string, as **form data**, or in the **body** of the request. The following +examples use the command line tool *curl*, which is available for various operating +systems. See https://curl.haxx.se. + +- Get a node's current status; its name is encoded in the path (URI) + + .. code-block:: bash + + curl -X GET 'http:///api/v2/pipelines/0/nodes/rc_stereomatching' + +- Get values of some of a node's parameters using a query string + + .. code-block:: bash + + curl -X GET 'http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters?name=minconf&name=maxdepth' + +.. only:: rc_visard + + - Configure a new datastream; the destination parameter is transmitted as form data + + .. code-block:: bash + + curl -X PUT --header 'Content-Type: application/x-www-form-urlencoded' -d 'destination=10.0.1.14%3A30000' 'http:///api/v2/datastreams/pose' + +- Set a node's parameter as JSON-encoded text in the body of the request + + .. code-block:: bash + + curl -X PUT --header 'Content-Type: application/json' -d '[{"name": "mindepth", "value": 0.1}]' 'http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters' + + +As for the responses to such requests, some common return codes for the +|rcxxx|'s API are: + +.. tabularcolumns:: |p{40mm}|p{50mm}| + ++--------------------------+--------------------------------------------------------------+ +| Status Code | Description | ++==========================+==============================================================+ +| ``200 OK`` | The request was successful; the resource is returned as JSON.| ++--------------------------+--------------------------------------------------------------+ +|``400 Bad Request`` | A required attribute or argument of the API request is | +| | missing or invalid. | ++--------------------------+--------------------------------------------------------------+ +| ``404 Not Found`` | A resource could not be accessed; e.g., an ID for a resource | +| | could not be found. | ++--------------------------+--------------------------------------------------------------+ +| ``403 Forbidden`` | Access is (temporarily) forbidden; e.g., some parameters are | +| | locked while a GigE Vision application is connected. | ++--------------------------+--------------------------------------------------------------+ +| ``429 Too many requests``| Rate limited due to excessive request frequency. | ++--------------------------+--------------------------------------------------------------+ + +The following listing shows a sample response to a successful request that accesses +information about the ``rc_stereomatching`` node's ``minconf`` parameter: + +.. code-block:: http + + HTTP/1.1 200 OK + Content-Type: application/json + Content-Length: 157 + + { + "name": "minconf", + "min": 0, + "default": 0, + "max": 1, + "value": 0, + "type": "float64", + "description": "Minimum confidence" + } + +.. NOTE:: The actual behavior, allowed requests, and specific return codes + depend heavily on the specific resource, context, and action. + Please refer to the |rcxxx|'s + :ref:`available resources `:latex:`\ + (Section \ref{rest_api_general:sect-rest-resources-and-methods})` and to + each :ref:`software module's `:latex:`\ + (Section \ref{modules:sect-modules})` + parameters and services. + +.. only:: rc_visard or rc_cube + + Migration from API version 1 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + API version 1 has become deprecated with the 22.01 firmware release of the |rc_xxx|. The following + changes were introduced in API version 2. + + .. only:: rc_cube + + * All 3D-camera, detection and configuration modules which were located under ``/nodes`` in API version 1 + are now under ``/pipelines//nodes`` to support multiple pipelines running on the |rc_cube|, e.g. + ``/pipelines/1/nodes/rc_camera``. + + .. only:: rc_visard or rc_visard_ng + + * All 3D-camera, :visardonly:`navigation,` detection and configuration modules which were located under ``/nodes`` in API version 1 + are now under ``/pipelines/0/nodes/``, e.g. ``/pipelines/0/nodes/rc_camera``. + + * Configuring load carriers, grippers and regions of interest is now only possible in the global database modules, which + are located under ``/nodes``, e.g. ``/nodes/rc_load_carrier_db``. The corresponding services in the detection modules + have been removed or deprecated. + + * Templates can now be accessed under ``/templates``, e.g. ``/templates/rc_silhouettematch``. + +Available resources and requests +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. _sect-rest-resources-and-methods: + +The available |restapi| resources are structured into the following parts: + +* ``/nodes`` + Access the |rcxxx|'s global + :doc:`database_modules` + :latex:`\:(Section \ref{database_modules:sect-database-modules})` + with their run-time status, parameters, and offered services, + for storing data used in :cubeonly:`all camera pipelines and` + multiple modules, such as load carriers, grippers and regions of interest. + +* ``/pipelines`` + Access to the status and configuration of the camera pipelines. + :visardsonly:`There is always only one camera pipeline with number 0.` + +.. only:: rc_visard or rc_visard_ng + + * ``/pipelines/0/nodes`` + Access the |rcxxx|'s 3D-camera, navigation, + detection and configuration + :ref:`software modules` + :latex:`\:(Section \ref{modules:sect-modules})` + with their run-time status, parameters, and offered services. + +.. only:: rc_cube + + * ``/pipelines//nodes`` + Access the |rcxxx|'s 3D-camera, detection and configuration + :ref:`software modules` + :latex:`\:(Section \ref{modules:sect-modules})` + of the camera pipeline with the specified number, + with their run-time status, parameters, and offered services. + +* ``/templates`` + Access the object templates on the |rcxxx|. + +.. only:: rc_visard + + * ``/datastreams`` + Access and manage data streams of the |rcxxx|'s + :ref:`rc_dynamics interface`:latex:`\ (Section \ref{rc_dynamics:sect-rc-dynamics-interface})`. + +* ``/system`` + Access the system state, set network configuration, + :cubeonly:`configure the camera pipeline types,` + and manage licenses as well as firmware updates. + +.. only:: rc_cube or rc_visard_ng + + * ``/userspace`` + Access the UserSpace on the |rcxxx|. + +* ``/logs`` + Access the log files on the |rcxxx|. + + +.. toctree-filt:: + :maxdepth: 2 + :hidden: + + rest_api_nodes + :rc_cube_only:rest_api_pipelines + :rc_cube_exclude:rest_api_datastreams + :rc_visard_exclude:rest_api_userspace + rest_api_syslogs diff --git a/v24.04/de/_raw_sources/rest_api_nodes.rst.txt b/v24.04/de/_raw_sources/rest_api_nodes.rst.txt new file mode 100644 index 0000000..400d872 --- /dev/null +++ b/v24.04/de/_raw_sources/rest_api_nodes.rst.txt @@ -0,0 +1,240 @@ +.. include:: global_rst.glb + +.. _sect-rest-api-nodes: + +Nodes, parameters, and services +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. index:: + pair: REST-API; node + +Nodes represent the |rcxxx|'s +:ref:`software modules ` +:latex:`\:(Section \ref{modules:sect-modules})`, each +bundling a certain algorithmic functionality. All available global |restapi| database nodes +can be listed with their service calls and parameters using + +.. code-block:: bash + + curl -X GET http:///api/v2/nodes + +Information about a specific node (e.g., ``rc_load_carrier_db``) can be retrieved using + +.. code-block:: bash + + curl -X GET http:///api/v2/nodes/rc_load_carrier_db + +.. only:: rc_cube + + All available 3D camera, detection and configuration |restapi| nodes + can be listed with their service calls and parameters using + + .. code-block:: bash + + curl -X GET http:///api/v2/pipelines//nodes + + Information about a specific node (e.g., ``rc_camera`` on camera pipeline 1) can be retrieved using + + .. code-block:: bash + + curl -X GET http:///api/v2/pipelines/1/nodes/rc_camera + +.. only:: rc_visard or rc_visard_ng + + All available 3D camera, :visardonly:`navigation,` detection and configuration |restapi| nodes + can be listed with their service calls and parameters using + + .. code-block:: bash + + curl -X GET http:///api/v2/pipelines/0/nodes + + Information about a specific node (e.g., ``rc_camera``) can be retrieved using + + .. code-block:: bash + + curl -X GET http:///api/v2/pipelines/0/nodes/rc_camera + +.. index:: + pair: REST-API; status value + +Status: + During run-time, each node offers information about its current status. + This includes not only the current **processing status** of the module + (e.g., ``running`` or ``stale``), but + most nodes also offer run-time statistics or read-only parameters, + so-called **status values**. As an example, the ``rc_camera`` values + can be retrieved using + + .. only:: rc_cube + + .. code-block:: bash + + curl -X GET http:///api/v2/pipelines//nodes/rc_camera/status + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + curl -X GET http:///api/v2/pipelines/0/nodes/rc_camera/status + + .. note:: The returned **status values** are specific to individual nodes and + are documented in the respective + :ref:`software module ` + :latex:`\:(Section \ref{modules:sect-modules})`. + + .. note:: The **status values** are only reported when the respective + node is in the ``running`` state. + +.. index:: + pair: REST-API; parameter + +Parameters: + Most nodes expose parameters via the |rcxxx|'s |restapi| to allow + their run-time behaviors to be changed according to application context or requirements. + The |restapi| permits to read and write a parameter's value, but also + provides further information such as minimum, maximum, and default + values. + + As an example, the ``rc_stereomatching`` parameters can be + retrieved using + + .. only:: rc_cube + + .. code-block:: bash + + curl -X GET http:///api/v2/pipelines//nodes/rc_stereomatching/parameters + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + curl -X GET http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters + + Its ``quality`` parameter could be set to ``Full`` using + + .. only:: rc_cube + + .. code-block:: bash + + curl -X PUT http:///api/v2/pipelines//nodes/rc_stereomatching/parameters?quality=Full + + or equivalently + + .. code-block:: bash + + curl -X PUT --header 'Content-Type: application/json' -d '{ "value": "Full" }' http:///api/v2/pipelines//nodes/rc_stereomatching/parameters/quality + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + curl -X PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters?quality=Full + + or equivalently + + .. code-block:: bash + + curl -X PUT --header 'Content-Type: application/json' -d '{ "value": "Full" }' http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/quality + + + .. note:: Run-time parameters are specific to individual nodes and + are documented in the respective + :ref:`software module ` + :latex:`\:(Section \ref{modules:sect-modules})`. + + .. note:: Most of the parameters that nodes offer via the |restapi| can be + explored and tested via the |rcxxx|'s user-friendly :ref:`Web GUI` + :latex:`\ (Section \ref{webgui:sect-web-gui})`. + + .. note:: Some parameters exposed via the |rcxxx|'s |restapi| are also + available from the + :ref:`sect-genicam` :latex:`\:(Section \ref{gigevision:sect-genicam})`. + Please note that setting those parameters via the |rest-api| or |webgui| is + prohibited if a GenICam client is connected. + + In addition, each node that offers run-time parameters also features + a service to restore the default values for all of its parameters. + +.. index:: + pair: REST-API; services + +Services: + Some nodes also offer services that can be called via |restapi|, e.g., to + restore parameters as discussed above, or to start and stop nodes. + As an example, the + :ref:`services of the hand-eye calibration module ` + :latex:`(Section \ref{handeye_calibration:sect-handeye-calibration-services})` + could be listed using + + .. only:: rc_cube + + .. code-block:: bash + + curl -X GET http:///api/v2/pipelines//nodes/rc_hand_eye_calibration/services + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + curl -X GET http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services + + A node's service is called by issuing a ``PUT`` request for the + respective resource and providing the service-specific arguments + (see the ``"args"`` field of the + :ref:`Service data model `:latex:`, Section \ref{rest_api_datamodel:sect-rest-datamodel-service}`). + As an example, the stereo matching module can be triggered to do an acquisition by: + + .. only:: rc_cube + + .. code-block:: bash + + curl -X PUT --header 'Content-Type: application/json' -d '{ "args": {} }' http:///api/v2/pipelines//nodes/rc_stereomatching/services/acquisition_trigger + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + curl -X PUT --header 'Content-Type: application/json' -d '{ "args": {} }' http:///api/v2/pipelines/0/nodes/rc_stereomatching/services/acquisition_trigger + + + .. note:: The services and corresponding argument data models are + specific to individual nodes and are documented in the respective + :ref:`software module ` + :latex:`\:(Section \ref{modules:sect-modules})`. + + +The following list includes all |restapi| requests regarding the global database nodes' status, +parameters, and services calls: + +.. only:: rc_visard + + .. include:: _gen/swagger/rc_visard/global_nodes.txt + +.. only:: rc_visard_ng + + .. include:: _gen/swagger/rc_visard_ng/global_nodes.txt + +.. only:: rc_cube + + .. include:: _gen/swagger/rc_cube/global_nodes.txt + +.. only:: rc_visard + + The following list includes all |restapi| requests regarding the 3D camera, navigation, detection and configuration nodes' status, + parameters, and services calls: + + .. include:: _gen/swagger/rc_visard/pipeline_nodes.txt + +.. only:: rc_visard_ng + + The following list includes all |restapi| requests regarding the 3D camera, detection and configuration nodes' status, + parameters, and services calls: + + .. include:: _gen/swagger/rc_visard_ng/pipeline_nodes.txt + +.. only:: rc_cube + + The following list includes all |restapi| requests regarding the pipeline-specific 3D camera, detection and configuration nodes' status, + parameters, and services calls: + + .. include:: _gen/swagger/rc_cube/pipeline_nodes.txt diff --git a/v24.04/de/_raw_sources/rest_api_pipelines.rst.txt b/v24.04/de/_raw_sources/rest_api_pipelines.rst.txt new file mode 100644 index 0000000..f2eccbe --- /dev/null +++ b/v24.04/de/_raw_sources/rest_api_pipelines.rst.txt @@ -0,0 +1,17 @@ +.. include:: global_rst.glb + +.. _sect-rest-api-pipelines: + +Pipelines +~~~~~~~~~ + +.. index:: + pair: REST-API; node + +Pipelines represent the |rcxxx|'s camera pipelines. + +The following list includes all |restapi| requests regarding the camera pipelines' configuration: + +.. only:: rc_cube + + .. include:: _gen/swagger/rc_cube/pipelines.txt diff --git a/v24.04/de/_raw_sources/rest_api_swagger_ui.rst.txt b/v24.04/de/_raw_sources/rest_api_swagger_ui.rst.txt new file mode 100644 index 0000000..45374b1 --- /dev/null +++ b/v24.04/de/_raw_sources/rest_api_swagger_ui.rst.txt @@ -0,0 +1,90 @@ +.. include:: global_rst.glb + +.. _sect-swagger-ui: + +Swagger UI +^^^^^^^^^^ + +.. index:: + single: Swagger UI + +The |rc-xxx|'s `Swagger UI `_ allows developers to easily +visualize and interact with the |rest-api|, e.g., for development and testing. Accessing +``http:///api/`` or ``http:///api/swagger`` +(the former will automatically be redirected to the latter) opens a visualization +of the |rc-xxx|'s general API structure including all +:ref:`available resources and requests ` +:latex:`\ (Section \ref{rest_api_general:sect-rest-resources-and-methods})` +and offers a simple user interface for exploring all of its features. + +.. note:: Users must be aware that, although the |rc_xxx|'s Swagger UI is + designed to explore and test the |rest-api|, it is a fully + functional interface. + That is, any issued requests are actually + processed and particularly ``PUT``, ``POST``, and ``DELETE`` + requests might change the overall status and/or behavior of the + device. + +.. only:: rc_cube + + .. figure:: images/swagger_ui_overview_cube.png + :width: 160mm + :align: center + + Initial view of the |rc_xxx|'s Swagger UI with its resources and requests + +.. only:: rc_visard + + .. figure:: images/swagger_ui_overview.png + :width: 160mm + :align: center + + Initial view of the |rc_xxx|'s Swagger UI with its resources and requests + +.. only:: rc_visard_ng + + .. figure:: images/swagger_ui_overview_ng.png + :width: 160mm + :align: center + + Initial view of the |rc_xxx|'s Swagger UI with its resources and requests + +Using this interface, available resources and requests can be explored by +clicking on them to uncollapse or recollapse them. +The following figure shows an example of how to get a node's current status +by filling in the necessary parameters +(``pipeline`` number and ``node`` name) and clicking *Execute*. This action results in the Swagger UI showing, +amongst others, the actual ``curl`` command that was executed when +issuing the request as well as the response body showing the current status +of the requested node in a JSON-formatted string. + +.. figure:: images/swagger_ui_example_simple_get.png + :width: 160mm + :align: center + + Result of requesting the ``rc_stereomatching`` node's status + +Some actions, such as setting parameters or calling services, require more +complex parameters to an HTTP request. The Swagger UI allows developers to +explore the attributes required for these actions during run-time, as shown in +the next example. In the figure below, the attributes required for the +the ``rc_hand_eye_calibration`` node's ``set_pose`` service are explored by +performing a ``GET`` request on this resource. The response features a full +description of the service offered, including all required arguments with +their names and types as a JSON-formatted string. + +.. figure:: images/swagger_ui_example_get_service_args.png + :width: 160mm + :align: center + + The result of the ``GET`` request on the ``set_pose`` service shows the + required arguments for this service call. + +Users can easily use this preformatted JSON string as a template for the service +arguments to actually call the service: + +.. figure:: images/swagger_ui_example_fill_service_args.png + :width: 160mm + :align: center + + Filling in the arguments of the ``set_pose`` service request diff --git a/v24.04/de/_raw_sources/rest_api_syslogs.rst.txt b/v24.04/de/_raw_sources/rest_api_syslogs.rst.txt new file mode 100644 index 0000000..5581bb8 --- /dev/null +++ b/v24.04/de/_raw_sources/rest_api_syslogs.rst.txt @@ -0,0 +1,35 @@ +.. include:: global_rst.glb + +.. _sect-rest-api-syslogs: + +System and logs +~~~~~~~~~~~~~~~ + +.. index:: + pair: REST-API; logs + pair: REST-API; system + +The following resources and requests expose the |rcxxx|'s system-level API. They +enable + + - access to log files (system-wide or module-specific) + - access to information about the device and run-time statistics such as + date, MAC address, clock-time synchronization status, and available + resources; + - management of installed software licenses; and + - the |rcxxx| to be updated with a new firmware image. + +.. only:: rc_visard + + .. include:: _gen/swagger/rc_visard/logs.txt + .. include:: _gen/swagger/rc_visard/system.txt + +.. only:: rc_visard_ng + + .. include:: _gen/swagger/rc_visard_ng/logs.txt + .. include:: _gen/swagger/rc_visard_ng/system.txt + +.. only:: rc_cube + + .. include:: _gen/swagger/rc_cube/logs.txt + .. include:: _gen/swagger/rc_cube/system.txt diff --git a/v24.04/de/_raw_sources/rest_api_userspace.rst.txt b/v24.04/de/_raw_sources/rest_api_userspace.rst.txt new file mode 100644 index 0000000..9b79251 --- /dev/null +++ b/v24.04/de/_raw_sources/rest_api_userspace.rst.txt @@ -0,0 +1,20 @@ +.. include:: global_rst.glb + +.. _sect-rest-api-userspace: + +UserSpace +~~~~~~~~~ + +.. index:: + pair: REST-API; UserSpace + +|userspace| information including running apps and their published ports can be queried via the userspace endpoint. +An app can be of ``type`` ``container`` or ``compose`` (compose stack with potentially multiple containers). + +.. only:: rc_cube + + .. include:: _gen/swagger/rc_cube/userspace.txt + +.. only:: rc_visard_ng + + .. include:: _gen/swagger/rc_visard_ng/userspace.txt diff --git a/v24.04/de/_raw_sources/revisions.rst.txt b/v24.04/de/_raw_sources/revisions.rst.txt new file mode 100644 index 0000000..284045f --- /dev/null +++ b/v24.04/de/_raw_sources/revisions.rst.txt @@ -0,0 +1,186 @@ +.. include:: global_rst.glb + +.. _sect-revision: + +.. raw:: latex + + \Large + +.. rubric:: Revisions + +.. raw:: latex + + \small + +.. only:: roboception + + .. raw:: latex + + \setstretch{1.25} + +This product may be modified without notice, when necessary, due to product +improvements, modifications, or changes in specifications. If such modification +is made, the manual will also be revised; see revision information. + +.. only:: schunk + + **Document number:** 1461933 + +.. only:: roboception + + .. raw:: latex + + \vspace{1cm} + + :latex:`\color{petrol}` **DOCUMENTATION REVISION** :latex:`\color{black}` |release| |today| + +.. only:: basler or matrixvision or schunk + + **Documentation Revision** |release| |today| + +Applicable to |rc_xxx| firmware |version|.x + +.. only:: schunk + + Dear Customer, + + thank you for trusting our products and our family-owned company, the leading + technology supplier of robots and production machines. + Our team is always available to answer any questions on this product and other solutions. + Ask us questions and challenge us. We will find a solution! + + Best regards, + + Your SCHUNK team + +.. only:: matrixvision or schunk + + | **Manufacturer:** + | + | Roboception GmbH + | Kaflerstrasse 2 + | D-81241 Munich + | + +.. only:: roboception + + | :latex:`\color{petrol}` **MANUFACTURER** :latex:`\color{black}` + | **Roboception GmbH** + | Kaflerstrasse 2 + | 81241 Munich + | Germany + | :latex:`\color{petrol}` **CUSTOMER SUPPORT**: :latex:`\color{black}` support@roboception.de | +49 89 889 50 79-0 (09:00-17:00 CET) + | + +.. only:: schunk + + | **Distributor:** + | SCHUNK GmbH & Co. KG + | Spann- und Greiftechnik + | Bahnhofstr. 106 - 134 + | D-74348 Lauffen/Neckar + | Tel. +49-7133-103-0 + | Fax +49-7133-103-2399 + | Customer Management + | Tel. +49-7133-103-2503 + | Fax +49-7133-103-2189 + | cmg@de.schunk.com + | + +.. only:: basler + + | **Distributor:** + | Basler AG + | An der Strusbek 60-62 + | D-22926 Ahrensburg + | Germany + | + | Web: http://www.baslerweb.com + | Email: info@baslerweb.com + | Phone: +49 4102 463 0 + | + +.. only:: matrixvision + + | **Distributor:** + | Balluff GmbH + | Schurwaldstrasse 9 + | D-73765 Neuhausen a.d.F. + | Germany + | + | Web: https://www.balluff.com + | Email: balluff@balluff.de + | Phone: +49 7158 173-0 + | + + +.. only:: schunk + + **Please read the operating manual in full and keep it close to the product.** + +.. raw:: latex + + \vfill + +.. only:: roboception + + .. raw:: latex + + \vspace{1cm} + + **Please read the operating manual in full and keep it with the product.** + +.. only:: roboception + + :latex:`\color{petrol}` **COPYRIGHT** :latex:`\color{black}` + +.. only:: matrixvision or schunk + + **Copyright** + +.. only:: matrixvision or schunk or roboception + + This manual and the product it describes are protected by copyright. Unless + permitted by German intellectual property and related rights legislation, any + use and circulation of this content requires the prior consent of |manufacturer| or + the individual owner of the rights. This manual and the product it describes + therefore, may not be reproduced in whole or in part, whether for sale or not, + without prior written consent from |manufacturer|. + + Information provided in this document is believed to be accurate and reliable. + However, |manufacturer| assumes no responsibility for its use. + + Differences may exist between the manual and the product if the product has + been modified after the manual's edition date. The information contained in + this document is subject to change without notice. + +.. raw:: latex + + \normalsize + \vspace{2cm} + \setstretch{1.0} + \setcounter{secnumdepth}{3} + \setcounter{tocdepth}{2} + \tableofcontents + +Introduction +============ + +.. rubric:: Indications in the manual + +To prevent damage to the equipment and ensure the user's safety, this manual indicates each precaution related to safety with *Warning*. Supplementary information is provided as a *Note*. + +.. Warning:: Warnings in this manual indicate procedures and actions that must be observed to avoid danger of injury to the operator/user, or damage to the equipment. Software-related warnings indicate procedures that must be observed to avoid malfunctions or unexpected behavior of the software. + +.. Note:: Notes are used in this manual to indicate supplementary relevant information. + +.. toctree-filt:: + :maxdepth: 2 + :hidden: + + general + warranty + standards + :rc_cube_exclude:disposal + glossary + diff --git a/v24.04/de/_raw_sources/roi.rst.txt b/v24.04/de/_raw_sources/roi.rst.txt new file mode 100644 index 0000000..262a1cd --- /dev/null +++ b/v24.04/de/_raw_sources/roi.rst.txt @@ -0,0 +1,363 @@ + +.. include:: global_rst.glb + +.. _sect-roi: + +RoiDB +===== + +.. index:: ! RoiDB + single: ROI + single: BoxPick; region of interest + single: ItemPick; region of interest + single: SilhouetteMatch; region of interest + +.. only:: rc_cube + + .. index:: + single: CADMatch; region of interest + + .. |3droimodules| replace:: |cadm_module|, |pick_modules| + +.. only:: rc_visard or rc_visard_ng + + .. |3droimodules| replace:: |pick_modules| + +Introduction +------------ + +The RoiDB module (region of interest database module) allows the global definition of 2D and 3D regions of interest, +which can then be used in many detection modules. The ROIs are available for all +modules supporting 2D or 3D ROIs on the |rc_xxx|. + +.. only:: rc_cube + + .. note:: + + This module is global on the |rc_cube|. Changes to its settings or parameters affect + every camera pipeline running on the |rc_cube|. + +The RoiDB module is a base module which is available on every |rc_xxx|. + +3D ROIs can be used in |3droimodules|. 2D ROIs can be used in :ref:`sect-silhouettematch`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch})`, +and :ref:`sect-loadcarrier`:latex:`\:(Section \ref{loadcarrier:sect-loadcarrier})`. + +.. tabularcolumns:: |l|L| +.. _tab-roi-spec: +.. csv-table:: Specifications of the RoiDB module + + "Supported ROI types", "2D, 3D" + "Supported ROI geometries", "2D ROI: rectangle, 3D ROI: box, sphere" + "Max. number of ROIs", "2D: 100, 3D: 100" + "ROIs available in", "2D: :ref:`sect-silhouettematch`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch})`, :ref:`sect-loadcarrier`:latex:`\:(Section \ref{loadcarrier:sect-loadcarrier})`, 3D: |3droimodules|" + "Supported reference frames", "camera, external" + +.. _sect-roi-definition: + +Region of interest +------------------ + +A region of interest (ROI) defines a volume in space (3D region of interest, ``region_of_interest``), +or a rectangular region in the left camera image (2D region of interest, ``region_of_interest_2d``) which is of interest for +a specific user-application. + +A ROI can narrow the volume where a load carrier is searched for, or select a volume +which only contains items to be detected and/or grasped. +Processing times can significantly decrease when using a ROI. + +3D regions of interest of the following types (``type``) are supported: + + - ``BOX``, with dimensions ``box.x``, ``box.y``, ``box.z``. + - ``SPHERE``, with radius ``sphere.radius``. + +The user can specify the 3D region of interest ``pose`` in the ``camera`` or the ``external`` coordinate system. +``External`` can only be chosen if a +:doc:`handeye_calibration`:latex:`\:(Section \ref{handeye_calibration:sect-handeye-calibration})` is available. +When the sensor is robot mounted, and the region of interest is defined in the external frame, the current +robot pose must be given to every detect service call that uses this region of interest. + +A 2D ROI is defined as a rectangular part of the left camera image, and can be set via the +:doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` +or the |rcxxx| :ref:`sect-web-gui`:latex:`\:(Section \ref{webgui:sect-web-gui})` on the page +*Regions of Interest* under *Database*. +The |webgui| offers an easy-to-use selection tool. +Each ROI must have a unique name to address a specific 2D ROI. + +In the |restapi|, a 2D ROI is defined by the following values: + +- ``id``: Unique name of the region of interest +- ``offset_x``, ``offset_y``: offset in pixels along the x-axis and y-axis from the top-left corner of the image, respectively +- ``width``, ``height``: width and height in pixels + +The |rcxxx| can persistently store up to 100 different 3D regions of interest and the same number of 2D regions of interest. +The configuration of regions of interest is normally performed offline, during +the set up of the desired application. +This can be done via the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` +of RoiDB module, or in +the |rcxxx| :ref:`sect-web-gui`:latex:`\:(Section \ref{webgui:sect-web-gui})` on the page +*Regions of Interest* under *Database*. + +.. Note:: + The configured regions of interest + are persistent even over firmware updates and rollbacks. + +.. _sect-loadcarrier-db-dependencies: + +Interaction with other modules +------------------------------ + +Internally, the RoiDB module depends on, and interacts with other on-board +modules as listed below. + +.. _sect-loadcarrier-hand-eye-dep: + +Hand-eye calibration +^^^^^^^^^^^^^^^^^^^^ + +In case the camera has been calibrated to a robot, the pose of a 3D ROI +can be provided in the robot coordinate frame by setting the corresponding +``pose_frame`` argument. + +Two different ``pose_frame`` values can be chosen: + +1. **Camera frame** (``camera``). + The ROI pose is provided in the camera frame, + and no prior knowledge about the pose of the camera in the environment is required. + This means that the configured load carriers move with the camera. + It is the user's responsibility to update the configured poses + if the camera frame moves (e.g. with a robot-mounted camera). + +2. **External frame** (``external``). + The ROI pose is provided in the external frame, + configured by the user during the hand-eye calibration process. + The module relies on the on-board + :doc:`Hand-eye calibration module`:latex:`\:(Section \ref{handeye_calibration:sect-handeye-calibration})` + to retrieve the sensor mounting (static or robot mounted) and + the hand-eye transformation. + +.. Note:: + If no hand-eye calibration is available, all ``pose_frame`` values should be set to ``camera``. + +All ``pose_frame`` values that are not ``camera`` or ``external`` are rejected. + +.. _sect-roi-services: + +Services +-------- + +.. index:: + single: RoiDB; services + +The RoiDB module is called ``rc_roi_db`` in the |rest-api| and is represented in the +:ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})` under +:menuselection:`Database --> Regions of Interest`. +The user can explore and call the RoiDB module's services, +e.g. for development and testing, using the +:doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` or +the |webgui|. + +The RoiDB module offers the following services. + +.. _expl-roi-srv-set-roi: + +``set_region_of_interest`` +^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Persistently stores a 3D region of interest on the |rc_xxx|. + All configured 3D regions of interest are persistent over firmware updates and rollbacks. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v2/nodes/rc_roi_db/services/set_region_of_interest + + .. tabs:: + + .. tab:: **Request** + + Details for the definition of the ``region_of_interest`` type are given in + :ref:`sect-roi-definition`:latex:`\:(Section \ref{roi:sect-roi-definition})`. + + .. include:: _gen/nodes/services/rc_load_carrier_set_region_of_interest_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_load_carrier_set_region_of_interest_response.txt + +.. _expl-roi-srv-set-roi-2d: + +``set_region_of_interest_2d`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Persistently stores a 2D region of interest on the |rc_xxx|. + All configured 2D regions of interest are persistent over firmware updates and rollbacks. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v2/nodes/rc_roi_db/services/set_region_of_interest_2d + + .. tabs:: + + .. tab:: **Request** + + Details for the definition of the ``region_of_interest_2d`` type are given in + :ref:`sect-roi-definition`:latex:`\:(Section \ref{roi:sect-roi-definition})`. + + .. include:: _gen/nodes/services/rc_load_carrier_set_region_of_interest_2d_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_load_carrier_set_region_of_interest_2d_response.txt + + +.. _expl-roi-srv-get-roi: + +``get_regions_of_interest`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns the configured 3D regions of interest with the requested ``region_of_interest_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v2/nodes/rc_roi_db/services/get_regions_of_interest + + .. tabs:: + + .. tab:: **Request** + + If no ``region_of_interest_ids`` are provided, all configured 3D regions of interest are returned. + + .. include:: _gen/nodes/services/rc_load_carrier_get_regions_of_interest_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_load_carrier_get_regions_of_interest_response.txt + +.. _expl-roi-srv-get-roi-2d: + +``get_regions_of_interest_2d`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns the configured 2D regions of interest with the requested ``region_of_interest_2d_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v2/nodes/rc_roi_db/services/get_regions_of_interest_2d + + .. tabs:: + + .. tab:: **Request** + + If no ``region_of_interest_2d_ids`` are provided, all configured 2D regions of interest are returned. + + .. include:: _gen/nodes/services/rc_load_carrier_get_regions_of_interest_2d_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_load_carrier_get_regions_of_interest_2d_response.txt + +.. _expl-roi-srv-delete-roi: + +``delete_regions_of_interest`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Deletes the configured 3D regions of interest with the requested ``region_of_interest_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v2/nodes/rc_roi_db/services/delete_regions_of_interest + + .. tabs:: + + .. tab:: **Request** + + All regions of interest to be deleted must be explicitly stated in ``region_of_interest_ids``. + + .. include:: _gen/nodes/services/rc_load_carrier_delete_regions_of_interest_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_load_carrier_delete_regions_of_interest_response.txt + +.. _expl-roi-srv-delete-roi-2d: + +``delete_regions_of_interest_2d`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Deletes the configured 2D regions of interest with the requested ``region_of_interest_2d_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v2/nodes/rc_roi_db/services/delete_regions_of_interest_2d + + .. tabs:: + + .. tab:: **Request** + + All 2D regions of interest to be deleted must be explicitly stated in ``region_of_interest_2d_ids``. + + .. include:: _gen/nodes/services/rc_load_carrier_delete_regions_of_interest_2d_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_load_carrier_delete_regions_of_interest_2d_response.txt + + +.. _sect-roi-return-codes: + +Return codes +------------ + +.. index:: + pair: RoiDB; return codes + + +Each service response contains a ``return_code``, +which consists of a ``value`` plus an optional ``message``. +A successful service returns with a ``return_code`` value of ``0``. +Negative ``return_code`` values indicate that the service failed. +Positive ``return_code`` values indicate that the service succeeded with additional information. +The smaller value is selected in case a service has multiple ``return_code`` values, +but all messages are appended in the ``return_code`` message. + +The following table contains a list of common codes: + +.. tabularcolumns:: |c|L| +.. _tab-roi-return-codes: +.. csv-table:: Return codes of the RoiDB module's services + :header: Code, Description + + "0", "Success" + "-1", "An invalid argument was provided" + "-10", "New element could not be added as the maximum storage capacity of regions of interest has been exceeded" + "10", "The maximum storage capacity of regions of interest has been reached" + "11", "An existent persistent model was overwritten by the call to ``set_region_of_interest`` or ``set_region_of_interest_2d``" diff --git a/v24.04/de/_raw_sources/safety.rst.txt b/v24.04/de/_raw_sources/safety.rst.txt new file mode 100644 index 0000000..a9a584d --- /dev/null +++ b/v24.04/de/_raw_sources/safety.rst.txt @@ -0,0 +1,98 @@ +.. include:: global_rst.glb + +.. _sect-safety: + +Safety +====== + +.. Warning:: The operator must have read and understood all of the instructions in this + manual before handling the |rc_xxx| product. + +.. only:: rc_cube + + .. Warning:: If operating the |rc_cube| with |rc_visard| product(s), + the operator must have read and understood all of the safety, installation, + and maintenance instructions given in the |rc_visard| manual. + +.. Note:: The term "operator" refers to anyone responsible for any of the following tasks + performed in conjunction with |rc_xxx|: + + * Installation + * Maintenance + * Inspection + * Calibration + * Programming + * Decommissioning + +This manual explains the |rc_xxx|'s various components and general operations regarding the +product's whole life-cycle, from installation through operation to decommissioning. + +The drawings and photos in this documentation are representative examples; differences may exist +between them and the delivered product. + +General warnings +---------------- + +.. Note:: Any use of the |rc_xxx| in noncompliance with these warnings is inappropriate and + may cause injury or damage as well as void the warranty. + +.. only:: rc_visard or rc_visard_ng + + .. Warning:: + * The |rc_xxx| needs to be properly mounted before use. + * All cable sets need to be secured to the |rc_xxx| and the mount. + * Cords must be at most 30 m long. + * An appropriate DC power source must supply power to the |rc_xxx|. + * Each |rc_xxx| must be connected to a separate power supply. + * The |rc_xxx|'s housing must be grounded. + * The |rc_xxx|'s and any related equipment's safety guidelines must always be satisfied. + * The |rc_xxx| does not fall under the purview of the machinery, low voltage, or medical directives. + +.. only:: rc_cube + + .. Warning:: + * The |rc_xxx|'s and any related equipment's safety guidelines must always be satisfied. + * The |rc_xxx| does not fall under the purview of the machinery or medical directives. + +.. only:: rc_visard or rc_visard_ng + + .. rubric:: Risk assessment and final application: + + The |rc_xxx| may be used on a robot. Robot, |rc_xxx|, and any other equipment used in the final + application must be evaluated with a risk assessment. The system integrator's duty is to + ensure respect for all local safety measures and regulations. Depending on the application, + there may be risks that need additional protection/safety measures. + +Intended use +------------ + +.. only:: rc_visard or rc_visard_ng + + The |rc_xxx| is intended for data acquisition (e.g., images, :visardonly:`egomotion and` disparity images) + in stationary and mobile robotic applications. The |rc_xxx| is intended for installation on a + robot, automated machinery, mobile platform, or stationary equipment. It can also be used for data + acquisition in other applications. + +.. only:: rc_cube + + The |rc_cube| is intended to be used in combination with a 3D camera for data + acquisition (e.g., stereo images). It is furthermore intended to process that data using + 3D-image processing algorithms to serve in applications such as object detection or robotic pick-and-place. + + .. Warning:: The |rc_cube| is only intended for stationary installation. + +.. Warning:: The |rc_xxx| is **NOT** intended for safety critical applications. + +The GigE Vision\ |reg| industry standard used by the |rc_xxx| does not support authentication and encryption. +All data from and to the device is transmitted without authentication and encryption and could be +monitored or manipulated by a third party. It is the operator's responsibility to connect the +|rc_xxx| only to a secured internal network. + +.. Warning:: The |rc_xxx| must be connected to secured internal networks. + +The |rc_xxx| may be used only within the scope of its technical specification. Any other use of the +product is deemed unintended use. |company| will not be liable for any damages resulting from any +improper or unintended use. + +.. Warning:: Always comply with local and/or national laws, regulations and directives on automation + safety and general machine safety. diff --git a/v24.04/de/_raw_sources/silhouettematch.rst.txt b/v24.04/de/_raw_sources/silhouettematch.rst.txt new file mode 100644 index 0000000..350fc7c --- /dev/null +++ b/v24.04/de/_raw_sources/silhouettematch.rst.txt @@ -0,0 +1,1973 @@ +.. include:: global_rst.glb + +.. _sect-silhouettematch: + +SilhouetteMatch +=============== + +.. index:: ! SilhouetteMatch + single: object detection + single: silhouette + +.. |silm| replace:: SilhouetteMatch + +Introduction +------------ + +The |silm| module is an optional on-board module of the |rc_xxx| and requires a separate |silm| :ref:`license` +:latex:`(Section \ref{maintenance:sect-updating-license})` to be purchased. + +.. only:: rc_cube and (roboception or schunk or basler) + + .. note:: This module is not available in camera pipelines of type ``blaze``. + +The module detects objects by matching a predefined silhouette (“template”) to edges in the image. + +The |silm| module can detect objects in two different scenarios: + + **With calibrated base plane**: The objects are placed on a common base plane, which must be calibrated before the detection, and the objects have + significant edges on a common plane that is parallel to the base plane. + + **With object plane detection**: The objects can be placed at different, previously unknown heights, if the objects have a planar surface and their outer + contours are well visible in the images (e.g. stacked flat objects). + +Templates for object detection can be created by uploading a DXF file and specifying the object height. +The correct scale and unit of the contours are extracted from the DXF file. If no units are +present in the DXF file, the user has to specify which units should be used. When the outer +contour of the object in the DXF file is closed, a 3D collision model is created automatically +by extruding the contour by the given object height. This model will then be used for collision checking +and in 3D visualizations. +Uploading a DXF file can be done in the |webgui| via the :guilabel:`+ Create a new Template` button in the +*SilhouetteMatch Templates and Grasps* section on the :menuselection:`Modules --> SilhouetteMatch` or +:menuselection:`Database --> Templates` pages. + +.. only:: roboception or matrixvision + + |manufacturer| also offers a template generation service on their + `website `_:latex:`\:(\url{https://roboception.com/en/template-request/})`, + where the user can upload CAD files or recorded data of the objects and request object templates for the |silm| module. + +.. only:: schunk + + |company| also also offers a template generation service via mechatronics@de.schunk.com, + where the user can send CAD files or recorded data of the objects and request object templates for the |silm| module. + +.. only:: basler + + |manufacturer| also offers a template generation service, + where the user can upload CAD files or recorded data of the objects and request object templates for the |silm| module. + + +The object templates consist of significant edges of each object. These template edges are matched to the +edges detected in the left and right camera images, considering the +actual size of the objects and their distance from the camera. The poses of the detected objects are +returned and can be used for grasping, for example. + +The |silm| module offers: + +- A dedicated page on the |rc_xxx| :ref:`sect-web-gui`:latex:`\:(Section \ref{webgui:sect-web-gui})` + for easy setup, configuration, testing, and application tuning. +- A :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` and a + :doc:`eki`:latex:`\:(Section \ref{eki:sect-eki})`. +- The definition of 2D regions of interest to select relevant parts of the camera image + (see :ref:`sect-silhouettematch-roi`:latex:`, Section \ref{silhouettematch:sect-silhouettematch-roi}`). +- A load carrier detection functionality for bin-picking applications + (see :ref:`sect-loadcarrier`:latex:`, Section \ref{loadcarrier:sect-loadcarrier}`), + to provide grasps for objects inside a bin only. +- Storing of up to 50 templates. +- The definition of up to 50 grasp points for each template via an interactive visualization in the |webgui|. +- Collision checking between the gripper and the load carrier, the calibrated base plane, other detected objects and/or the point cloud. +- Support for static and robot-mounted cameras and + optional integration with the :doc:`handeye_calibration` + :latex:`(Section \ref{handeye_calibration:sect-handeye-calibration})` module, + to provide grasps in the user-configured external reference frame. +- Selection of a sorting strategy to sort the detected objects and returned grasps. +- 3D visualization of the detection results with grasp points and gripper animations in the |webgui|. + +.. only:: rc_cube + + .. note:: + + This module is pipeline specific. Changes to its settings or parameters only affect + the respective camera pipeline and have no influence on other pipelines running on the |rc_cube|. + + However, the object templates and grasp points are stored globally. Setting, changing + or deleting an object template or its grasps affects all camera pipelines. + +Suitable objects +^^^^^^^^^^^^^^^^ + +The |silm| module is intended for objects which have significant edges on a common plane that is +parallel to the plane on which the objects are placed. This applies to flat, nontransparent +objects, such as routed, laser-cut or water-cut 2D parts and flat-machined parts. More complex +parts can also be detected if there are significant edges on a common plane, e.g. a special +pattern printed on a flat surface. +The detection works best for objects on a texture-free plane. The color of the base plane should +be chosen such that a clear contrast between the objects and the base plane appears in the intensity image. + +In case the objects are not placed on a common base plane or the base plane cannot be calibrated beforehand, +the objects need to have a planar surface and their outer contour must be well visible in the left and right images. +Furthermore, the template for these objects must have a closed outer contour. + +Suitable scene +^^^^^^^^^^^^^^ + +The scene must meet the following conditions to be suitable for the |silm| module: + +- The objects to be detected must be suitable for the |silm| module as described above. +- Only objects belonging to one specific template are visible at a time (unmixed scenario). In case other objects are visible as well, a proper region of interest (ROI) must be set. +- In case a calibrated base plane is used: The offset between the base plane normal and the camera's line of sight does not exceed 10 degrees. +- In case the object planes are detected automatically: The offset between the object's planar surface normal and the camera's line of sight does not exceed 25 degrees. +- The objects are not partially or fully occluded. +- All visible objects are right side up (no flipped objects). +- The object edges to be matched are visible in both, left and right camera images. + + +.. _sect-silhouettematch-base-plane-calib: + +Base-plane calibration +---------------------- + +.. index:: + pair: SilhouetteMatch; base-plane calibration + pair: SilhouetteMatch; base-plane + +In case all objects are placed on a common plane that is known beforehand, +a base-plane calibration should be performed before triggering a detection. +Thereby, the distance and angle of the plane on which the objects are +placed is measured and stored persistently on the |rc_xxx|. + +Separating the detection of the base plane from the actual object detection +renders scenarios possible in which the base plane is temporarily occluded. +Moreover, it increases performance of the object detection for scenarios where +the base plane is fixed for a certain time; thus, it is not necessary +to continuously re-detect the base plane. + +The base-plane calibration can be performed in three different ways, +which will be explained in more detail further down: + +- AprilTag based +- Stereo based +- Manual + +The base-plane calibration is successful if the normal vector of the estimated base plane is at most +10 degrees offset to the camera's line of sight. If the base-plane calibration +is successful, it will be stored persistently on the |rc_xxx| until it is removed or a new base-plane +calibration is performed. + +.. Note:: + + To avoid privacy issues, the image of the persistently stored base-plane calibration will + appear blurred after rebooting the |rc_xxx|. + +In scenarios where the base plane is not accessible for calibration, a plane parallel to the base plane can be calibrated. +Then an ``offset`` parameter can be used to shift the estimated plane onto the actual base plane where +the objects are placed. The ``offset`` parameter gives the distance in meters by which the estimated plane +is shifted towards the camera. + +In the |restapi|, a plane is defined by a ``normal`` and a ``distance``. +``normal`` is a normalized 3-vector, specifying the normal of the plane. +The normal points away from the camera. +``distance`` represents the distance of the plane from the camera along the normal. +Normal and distance can also be interpreted as :math:`a`, :math:`b`, :math:`c`, and :math:`d` components +of the plane equation, respectively: + +.. math:: + ax + by + cz + d = 0 + + +AprilTag based base-plane calibration +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +AprilTag detection (ref. :doc:`tagdetect`:latex:`, Section \ref{tagdetect:sect-tag-detection}`) +is used to find AprilTags +in the scene and fit a plane through them. At least three AprilTags must be placed on the base +plane so that they are visible in the left and right camera images. The tags should be placed +such that they are spanning a triangle that is as large as possible. The larger the triangle, +the more accurate is the resulting base-plane estimate. +Use this method if the base plane is untextured and no external random dot projector is available. +This calibration mode is available via the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` +and the |rcxxx| |webgui|. + +Stereo based base-plane calibration +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The 3D point cloud computed by the stereo matching module is used to fit a plane +through its 3D points. +Therefore, the region of interest (ROI) for this method must +be set such that only the relevant base plane is included. +The ``plane_preference`` parameter allows to select whether the plane closest to +or farthest from the camera should be used as base plane. +Selecting the closest plane can be used in scenarios where the base plane is +completely occluded by objects or not accessible for calibration. +Use this method if the base plane is well textured or you can +make use of a random dot projector to project texture on the base plane. +This calibration mode is available via the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` +and the |rcxxx| |webgui|. + +Manual base-plane calibration +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The base plane can be set manually if its parameters are known, e.g. from previous +calibrations. This calibration mode is only available via the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` +and not the |rcxxx| |webgui|. + +.. _sect-silhouettematch-roi: + +Setting a region of interest +---------------------------- + +.. index:: + single: SilhouetteMatch; region of interest + +If objects are to be detected only in part of the camera’s field of view, +a 2D region of interest (ROI) can be set accordingly as described in +:ref:`sect-roi-definition`:latex:`\:(Section \ref{roi:sect-roi-definition})`. + +.. _sect-silhouettematch-grasps: + +Setting of grasp points +----------------------- + +.. index:: + single: SilhouetteMatch; grasp points + single: SilhouetteMatch; object template + +To use |silm| directly in a robot application, up to 50 grasp points +can be defined for each template. A grasp point represents the desired position and orientation +of the robot's TCP (Tool Center Point) to grasp an object as shown in +:numref:`fig-silhouettematch-grasp-points`. + +.. _fig-silhouettematch-grasp-points: +.. figure:: images/grasp_points_silm.* + :width: 50% + :align: center + + Definition of grasp points with respect to the robot's TCP + +Each grasp consists of an ``id`` which must be +unique within all grasps for an object template, the ``template_id`` representing the template +to which the grasp should be attached, and the ``pose`` in the coordinate frame of the object template. +Grasp points can be set via the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`, +or by using the interactive visualization in the |webgui|. +Furthermore, a ``priority`` (spanning -2 for very low to 2 for very high) can be assigned to a grasp. +Priorities can facilitate robot applications and shorten response times when the run-time parameter +``only_highest_priority_grasps`` is set to true. In this case collision checking concludes when +grasps with the highest possible priority have been found. Finally, different grasps can be associated with +different grippers by specifying a ``gripper_id``. These individual grippers are then used for collision checking +of the corresponding grasps instead of the gripper defined in the ``detect_object`` request. If no ``gripper_id`` is given, the gripper +defined in the ``detect_object`` request will be used for collision checking. + +When a grasp is defined on a symmetric object, all grasps symmetric to the defined one +will automatically be considered in the |silm| module's ``detect_object`` service call. Symmetric grasps +for a given grasp point can be retrieved using the ``get_symmetric_grasps`` service call and visualized in the |webgui|. + +Users can also define replications of grasps around a custom axis. These replications spawn multiple grasps and free users +from setting too many grasps manually. The replication origin is defined as a coordinate frame in the object's coordinate +frame and the x axis of the replication origin frame corresponds to the replication axis. +The grasp is replicated by rotating it around this x axis +starting from its original pose. The replication is done in steps of size ``step_x_deg`` degrees. +The range is defined by the minimal and maximal boundaries ``min_x_deg`` and ``max_x_deg``. +The minimal (maximal) boundary must be a non-positive (non-negative) number up to (minus) 180 degrees. + +.. _sect-silhouettematch-grasps-webgui: + +Setting grasp points in the |webgui| +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The |rc_xxx| |webgui| provides an intuitive and interactive way of defining grasp points for object templates. +In a first step, the object template has to be uploaded to the |rc_xxx|. This can be done +in the |webgui| in any pipeline under :menuselection:`Modules --> SilhouetteMatch` +by clicking on :guilabel:`+ Add a new Template` in the +*Templates and Grasps* section, or in :menuselection:`Database --> Templates` in the +*SilhouetteMatch Templates and Grasps* section. Once the +template upload is complete, a dialog with a 3D visualization of the object template is shown +for adding or editing grasp +points. The same dialog appears when editing an existing template. If the template contains a collision model or a visualization model, +this 3D model is visualized as well. + +This dialog provides two ways for setting grasp points: + +1. **Adding grasps manually**: + By clicking on the :guilabel:`+` symbol, a new grasp is placed in the object origin. The + grasp can be given a unique name which corresponds to its ID. + The desired pose of the grasp can be entered in the fields for *Position* and *Roll/Pitch/Yaw* which are given + in the coordinate frame of the object template represented by the long x, y and z axes in the visualization. + The grasp point can be placed freely with respect to the object template - inside, outside or on the surface. + The grasp point and its orientation are visualized in 3D for verification. + +2. **Adding grasps interactively**: + Grasp points can be added interactively by first clicking on the :guilabel:`Add Grasp` button + in the upper right corner of the visualization and then clicking on the desired point on the object template visualization. + If the 3D model is displayed, the grasps will be attached to the surface of the 3D model. Otherwise, the + grasp is attached to the template surface. The grasp orientation is a right-handed coordinate system and + is chosen such that its z axis is perpendicular to the surface pointing inside the template at + the grasp position. The position and orientation in the object coordinate frame is displayed on the right. + The position and orientation of the grasp can also be changed interactively. + In case :guilabel:`Snap to surface` is disabled (default), the grasp can be translated and rotated freely in all three dimensions + by clicking on :guilabel:`Move Grasp` in the visualization menu and then dragging the grasp along the + appropriate axis to the desired position. The orientation of the grasp can also be changed by rotating the axis with the mouse. + In case :guilabel:`Snap to surface` is enabled in the visualization, the grasp can only be moved along the + model surface. + +Users can also specify a grasp priority by changing the :guilabel:`Priority` slider. A dedicated gripper can be selected +in the :guilabel:`Gripper` drop down field. + +By activating the :guilabel:`Replication` check box, users can replicate the +grasp around a custom axis. The replication axis and the resulting replicated grasps are visualized. +The position and orientation of the replication axis relative to the object coordinate frame can be adjusted +interactively by clicking on :guilabel:`Move Replication Axis` in the visualization menu and then dragging the axis +to the desired position and orientation. +The grasps are replicated within the specified rotation range at the selected rotation step size. Users can cycle through +a visualization of the replicated grasps by dragging the bar below :guilabel:`Cycle through n replicated grasps` in +the :guilabel:`View Options` section of the visualization menu. If a gripper is selected for the grasp or a gripper has +been chosen in the visualization menu, the gripper is also shown at the currently selected grasp. + +If the object template has symmetries, the grasps which are symmetric to the defined grasps can be displayed along with +their replications (if defined) by enabling :guilabel:`... symmetries` in the :guilabel:`View Options` section of the visualization menu. +The user can also cycle through a visualization of the symmetric grasps by dragging the +bar below :guilabel:`Cycle through n symmetric grasps`. + + +.. _sect-silhouettematch-grasps-rest-api: + +Setting grasp points via the |rest-api| +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grasp points can be set via the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` +using the ``set_grasp`` or ``set_all_grasps`` services +(see :ref:`sect-silhouettematch-internal-services`:latex:`, Section \ref{silhouettematch:sect-silhouettematch-internal-services}`). +A grasp consists of the ``template_id`` of the template +to which the grasp should be attached, an ``id`` uniquely identifying the grasp point and +the ``pose``. The pose is given in the coordinate frame of the object template and +consists of a ``position`` in meters and an ``orientation`` as quaternion. +A dedicated gripper can be specified through setting the ``gripper_id`` field. The +``priority`` is specified by an integer value, ranging from -2 for very low, to 2 for very high with a step size +of 1. The replication origin is defined as a transformation in the object's coordinate frame and the x axis +of the transformation corresponds to the replication axis. The +replication range is controlled by the ``min_x_deg`` and ``max_x_deg`` fields and the step size ``step_x_deg``. + +.. _sect-silhouettematch-set-preferred-orientation: + +Setting the preferred orientation of the TCP +-------------------------------------------- + +.. index:: + single: SilhouetteMatch; preferred orientation + +The |silm| module determines the reachability of grasp points based on the *preferred orientation* of the +gripper or TCP. The preferred orientation can be set via the ``set_preferred_orientation`` service or on +the *SilhouetteMatch* page in the |webgui|. +The resulting direction of the TCP's z axis is used to reject grasps which cannot be reached by the gripper. +Furthermore, the preferred orientation can be used to sort the reachable grasps by setting the corresponding +sorting strategy. + +The preferred orientation can be set in the camera coordinate frame or in the external coordinate frame, in case +a hand-eye calibration is available. If the preferred orientation is specified in the external coordinate frame +and the sensor is robot mounted, the current robot pose has to be given to each object detection call, so that the +preferred orientation can be used for filtering and, optionally, sorting the grasps on the detected objects. +If no preferred orientation is set, the orientation of the left camera is used as the preferred orientation of the TCP. + + +.. _sect-silhouettematch-set-sorting-strategies: + +Setting the sorting strategies +------------------------------ + +The objects and grasps returned by the ``detect_object`` service call are sorted according to a sorting strategy which can be +chosen by the user. The following sorting strategies are available and +can be set in the :ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})` +or using the ``set_sorting_strategies`` service call: + +- ``preferred_orientation``: objects and grasp points with minimal rotation difference between their orientation and the preferred orientation of the TCP are returned first, +- ``direction``: objects and grasp points with the shortest distance along a defined direction ``vector`` in a given ``pose_frame`` are returned first. + +If no sorting strategy is set or default sorting is chosen in the Web GUI, sorting is done based on a combination of +``preferred_orientation`` and the minimal distance from the camera along the z axis of the preferred orientation of the TCP. + +.. _sect-silhouettematch-detect: + +Detection of objects +-------------------- + +.. index:: + single: SilhouetteMatch; detection of objects + single: SilhouetteMatch; sorting + +For triggering the object detection, in general, the following information +must be provided to the |silm| module: + +- The template of the object to be detected in the scene. +- The coordinate frame in which the poses of the detected objects shall be returned + (ref. :ref:`sect-silhouettematch-hand-eye-calib`:latex:`, Section \ref{silhouettematch:sect-silhouettematch-hand-eye-calib}`). + +Optionally, further information can be given to the |silm| module: + +- A flag ``object_plane_detection`` determining whether the surface plane of the objects should be used for the detection instead of the calibrated base plane. +- An offset, in case the calibrated base plane should be used but the objects are not lying on this plane but on a plane parallel + to it. The offset is the distance between both planes + given in the direction towards the camera. If omitted, an offset of 0 is assumed. It must not be set if ``object_plane_detection`` is true. +- The ID of the load carrier which contains the objects to be detected. +- The ID of the region of interest where to search for the load carrier if a + load carrier is set. Otherwise, the ID of the region of interest where the objects should + be detected. If omitted, objects are matched in the whole image. +- The current robot pose in case the camera is mounted on the robot and + the chosen coordinate frame for the poses is ``external`` or the preferred orientation + is given in the external frame. +- Collision detection information: The ID of the gripper to enable collision checking and optionally + a pre-grasp offset to define a pre-grasp position. + Details on collision + checking are given below in + :ref:`sect-silhouettematch-collision-check-dep`:latex:`\:(Section + \ref{silhouettematch:sect-silhouettematch-collision-check-dep})`. + +In case the ``object_plane_detection`` flag is not true, +objects can only be detected after a successful base-plane calibration. +It must be ensured that the position and orientation of the base plane +does not change before the detection of objects. +Otherwise, the base-plane calibration must be renewed. + +When ``object_plane_detection`` is set to true, a base-plane calibration is not required and +an existing base-plane calibration will be ignored. During detection, the scene is clustered into +planar surfaces and template matching is performed on each plane whose tilt with respect to the +camera's line of sight is less than 25° and whose size is large enough to contain the selected template. +When a match is found, its position and orientation are refined using the image edges and the +point cloud inside the template's outer contour. For this, it is required that the outer contour of +the template is closed and that the object's surface is planar. + +On the |webgui| the detection can be tested in the *Try Out* section of the |silm| page. +Different image streams can be selected to show intermediate results and the final matches as shown +in :numref:`fig-silm-stream-images`. + + The **"Template"** image stream shows the template + to be matched in red with the defined grasp points in green + (see :ref:`sect-silhouettematch-grasps`:latex:`, Section \ref{silhouettematch:sect-silhouettematch-grasps}`). + The template is warped to the size and tilt matching + objects on the calibrated base plane or, in case ``object_plane_detection`` was used, + the highest segmented plane, would have. The corresponding plane is shown in dark blue. + + The **"Intermediate Result"** image stream shows the edges of the left image that were used to search for matches in light blue. + The chosen region of interest is shown as bold petrol rectangle. + A shaded blue area on the left visualizes the region of the left camera image which does not overlap with + the right image, and in which no objects can be detected. If ``object_plane_detection`` was used, this + image stream also shows the detected planar clusters in the scene. Clusters that were + not used for matching, because they were too small or too tilted, are visualized with a stripe pattern. + + The **"Intermediate Result Right"** image stream shows the edges of the right image that were used to search for matches in light blue. + The chosen region of interest is shown as bold petrol rectangle. + A shaded blue area on the right visualizes the region of the right camera image which does not overlap with + the left image, and in which no objects can be detected. + + The **"Result"** image shows the detection result. The image edges + that were used to refine the match poses are shown in light blue and the matches (``instances``) + with the template edges are shown in red. The blue circles are the origins of the detected + objects as defined in the template and the green circles are the + collision-free grasp points. Colliding grasp points are visualized as + red dots and grasp points that were not checked for collisions are drawn in yellow. + +.. _fig-silm-stream-images: +.. figure:: images/silhouetteMatchStreams.png + :width: 100 % + :align: center + + "Template", "Intermediate Result" and "Result" image streams of the |silm| module as shown in the |webgui| + for a detection with ``object_plane_detection`` set to true + +The poses of the object origins in the chosen +coordinate frame are returned as results in a list of ``instances``. +In case the calibrated base plane was used for the detection (``object_plane_detection`` not set or false), +the orientations of the detected objects are aligned with the normal of the base plane. +Otherwise, the orientations of the detected objects are aligned with the normal of a plane fitted to the +object points in the 3D point cloud. + +If the chosen template also has grasp points attached, +a list of ``grasps`` for all objects is returned in addition to the list of detected objects. +The grasp poses are given in the desired coordinate frame and +the grasps are sorted according to the selected sorting strategy +(see :ref:`sect-silhouettematch-set-sorting-strategies`:latex:`, Section \ref{silhouettematch:sect-silhouettematch-set-sorting-strategies}`). +There are references between the detected object instances and the grasps via their ``uuids``. + +In case the templates have a continuous rotational symmetry (e.g. cylindrical objects), +all returned object poses will have the same orientation. Furthermore, all grasps symmetric +to each grasp point on an object are checked for reachability and collisions, and only the +best one according to the given sorting strategy is returned. + +For objects with a discrete symmetry (e.g. prismatic objects), all collision-free symmetries of +each grasp point which are reachable according to the given preferred +TCP orientation are returned, ordered by the given sorting strategy. + +The detection results and run times are affected by several run-time parameters which are listed +and explained further down. Improper parameters can lead to timeouts of the |silm| module's +detection process. + + +Interaction with other modules +------------------------------ + +Internally, the |silm| module depends on, and interacts with other on-board +modules as listed below. + +.. Note:: + All changes and configuration updates to these modules will affect + the performance of the |silm| module. + +.. _sect-silhouettematch-stereo-camera-matching: + +Stereo camera and stereo matching +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The |silm| module makes internally use of the rectified images from the +:doc:`stereo_camera` module (``rc_camera``:latex:`, Section \ref{stereo_camera:sect-stereo-camera}`). +Thus, the exposure time should be set properly to achieve the optimal performance of the module. + +For base-plane calibration in stereo mode, for load carrier detection, for automatic object plane detection and for collision checking +with the point cloud, the disparity images from the :doc:`stereo_matching` module +(``rc_stereomatching``:latex:`, Section \ref{stereo_matching:sect-stereo-matching}`) are used. + +For detecting objects with a calibrated base plane, without load carrier and without collision checking with the point cloud, +the stereo-matching module should not be run in parallel to the |silm| module, because the detection runtime increases. + +For best results it is recommended to enable +:ref:`smoothing` :latex:`(Section \ref{stereo_matching:expl-depth-smooth})` +for :doc:`stereo_matching`. + +.. _sect-silhouettematch-iocontrol: + +IO and Projector Control +^^^^^^^^^^^^^^^^^^^^^^^^ + +In case the |rc_xxx| is used in conjunction with an external random dot projector and +the :doc:`iocontrol` module (``rc_iocontrol``:latex:`, Section \ref{iocontrol:sect-iocontrol}`), +the projector should be used for the stereo-based base-plane calibration, for automatic object plane detection and for collision checking +with the point cloud. + +The projected pattern must not be visible in the left and right camera images during object detection +as it interferes with the matching process. +Therefore, it is recommended to connect the projector to GPIO Out 1 and set +the stereo-camera module's acquisition mode to ``SingleFrameOut1`` +(see :ref:`Stereo matching parameters`:latex:`, Section \ref{stereo_matching:sect-disp-image-parameters}`), so that +on each image acquisition trigger an image with and without projector pattern is acquired. + +Alternatively, the output mode for the GPIO output in use should be set to ``ExposureAlternateActive`` +(see :ref:`sect-iocontrol-params`:latex:`, Section \ref{iocontrol:sect-iocontrol-params}`). + +In either case, +the *Auto Exposure Mode* ``exp_auto_mode`` should be set to ``AdaptiveOut1`` to optimize the exposure +of both images (see :ref:`Stereo camera parameters`:latex:`, Section \ref{stereo_camera:sect-cam-params}`). + + +.. _sect-silhouettematch-hand-eye-calib: + +Hand-eye calibration +^^^^^^^^^^^^^^^^^^^^ + +In case the camera has been calibrated to a robot, the |silm| module can automatically provide +poses in the robot coordinate frame. +For the |silm| node's :ref:`sect-silhouettematch-services`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-services})`, the frame of the +input and output poses and plane coordinates can be controlled with the ``pose_frame`` +argument. + +Two different ``pose_frame`` values can be chosen: + +1. **Camera frame** (``camera``). + All poses and plane coordinates provided to and by the module are in the camera frame. + +2. **External frame** (``external``). + All poses and plane coordinates provided to and by the module are in the external frame, + configured by the user during the hand-eye calibration process. + The module relies on the on-board + :doc:`Hand-eye calibration module`:latex:`\:(Section \ref{handeye_calibration:sect-handeye-calibration})` + to retrieve the camera mounting (static or robot mounted) and + the hand-eye transformation. + If the sensor mounting is static, no further information is needed. + If the sensor is robot-mounted, the ``robot_pose`` is required + to transform poses to and from the ``external`` frame. + +All ``pose_frame`` values that are not ``camera`` or ``external`` are rejected. + +.. Note:: + If no hand-eye calibration is available, all ``pose_frame`` values should be set to ``camera``. + +.. Note:: + If the hand-eye calibration has changed after base-plane calibration, + the base-plane calibration will be marked as invalid and must be renewed. + +If the sensor is robot-mounted, the current ``robot_pose`` has to be provided depending on the value of ``pose_frame``, +the definition of the preferred TCP orientation and the sorting direction: + +- If ``pose_frame`` is set to ``external``, providing the robot pose is obligatory. +- If the preferred TCP orientation is defined in ``external``, providing the robot pose is obligatory. +- If the sorting direction is defined in ``external``, providing the robot pose is obligatory. +- In all other cases, providing the robot pose is optional. + +If the current robot pose is provided during calibration, it is stored persistently on the |rcxxx|. +If the updated robot pose is later provided during ``get_base_plane_calibration`` or ``detect_object`` +as well, the base-plane calibration will be transformed automatically to this new robot pose. +This enables the user to change the robot pose (and thus camera position) +between base-plane calibration and object detection. + +.. Note:: + Object detection can only be performed if the limit of 10 degrees angle offset between + the base plane normal and the camera's line of sight is not exceeded. + +.. _sect-silhouettematch-load-carrier-dep: + +LoadCarrier +^^^^^^^^^^^ + +The |silm| module uses the load carrier detection functionality provided by the +:doc:`loadcarrier` module (``rc_load_carrier``:latex:`, Section \ref{loadcarrier:sect-loadcarrier}`), +with the run-time parameters specified for this module. However, only one load carrier will be +returned and used in case multiple matching load carriers could be found in the scene. In case multiple +load carriers of the same type are visible, a region of interest should be set to ensure that always the +same load carrier is used for the |silm| module. + +.. _sect-silhouettematch-collision-check-dep: + +CollisionCheck +^^^^^^^^^^^^^^ + +.. index:: + single: SilhouetteMatch; collision check + +Collision checking can be easily enabled for +grasp computation of the |silm| module by passing a ``collision_detection`` argument to the +``detect_object`` service call. It contains the ID of the used gripper and +optionally a pre-grasp offset. The gripper has to be +defined in the GripperDB module +(see :ref:`sect-gripper-db-gripper`:latex:`, Section \ref{gripper_db:sect-gripper-db-gripper}`) +and details about collision checking are given in :ref:`sect-collision-check-other-modules`:latex:`\:(Section \ref{collisioncheck:sect-collision-check-other-modules})`. In addition to collision checking between the gripper and the detected load carrier, collisions +between the gripper and the calibrated base plane will be checked, if the run-time parameter ``check_collisions_with_base_plane`` is true. +If the selected |silm| template contains a collision model and the run-time parameter ``check_collisions_with_matches`` is true, +also collisions between the gripper and all other detected objects (not limited to ``max_number_of_detected_objects``) will be checked. The object +on which the grasp point to be checked is located, is excluded from the collision check. + +If the run-time parameter ``check_collisions_with_point_cloud`` is true, +also collisions between the gripper and a watertight version of the point cloud are checked. +If this feature is used with suctions grippers, it should be ensured that the TCP is defined +to be outside the gripper geometry, or that the grasp points are defined above the object surface. +Otherwise every grasp will result in a collision between the gripper and the point cloud. + +If collision checking is enabled, only grasps which are collision free will be returned. +However, the visualization images on the *SilhouetteMatch* +page of the |webgui| also show colliding grasp points in red. The objects which are considered in the collision check are +also visualized with their edges in red. + +The CollisionCheck module's run-time parameters affect the collision detection as described in +:ref:`CollisionCheck Parameters`:latex:`\:(Section \ref{collisioncheck:sect-collisioncheck-parameters})`. + +Parameters +---------- + +.. index:: + single: SilhouetteMatch; parameters + +The |silm| software module is called ``rc_silhouettematch`` in the |rest-api| and is represented in the +:ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})`:cubeonly:`in the desired pipeline` under +:menuselection:`Modules --> SilhouetteMatch`. +The user can explore and configure the ``rc_silhouettematch`` +module's run-time parameters, e.g. for development and testing, using the |webgui| or the +:doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`. + +Parameter overview +^^^^^^^^^^^^^^^^^^ + +.. include:: _gen/nodes/params/rc_silhouettematch.txt + +Description of run-time parameters +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Each run-time parameter is represented by a row on the |webgui|'s |silm| page. +The name in the |webgui| is given in brackets behind the parameter name and the parameters are +listed in the order they appear in the |webgui|: + +.. _expl-silhouettematch-max-objects: + +``max_number_of_detected_objects`` (*Maximum Object Number*) +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + This parameter gives the maximum number of objects to detect in the scene. If more than + the given number of objects can be detected in the scene, only the objects matching best to + the given sorting strategy are returned. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?max_number_of_detected_objects= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?max_number_of_detected_objects= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?max_number_of_detected_objects= + +.. _expl-silhouettematch-quality: + +``quality`` (*Quality*) +''''''''''''''''''''''' + Object detection can be performed on images with different resolutions: + ``High`` (full image resolution), ``Medium`` (half image resolution) and + ``Low`` (quarter image resolution). The lower + the resolution, the lower the detection time, but the fewer details of the objects + are visible. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?quality= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?quality= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?quality= + +.. _expl-silhouettematch-max-distance: + +``match_max_distance`` (*Maximum Matching Distance*) +'''''''''''''''''''''''''''''''''''''''''''''''''''' + This parameter gives the maximum allowed pixel distance of an image edge pixel from the object + edge pixel in the template to be still considered as matching. If the object is not perfectly + represented in the template, it might not be detected when this parameter is low. High values, + however, might lead to false detections in case of a cluttered scene or the presence of similar + objects, and also increase runtime. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?match_max_distance= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?match_max_distance= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?match_max_distance= + +.. _expl-silhouettematch-match-percentile: + +``match_percentile`` (*Matching Percentile*) +'''''''''''''''''''''''''''''''''''''''''''' + This parameter indicates how strict the matching process should be. The matching percentile is + the ratio of template pixels that must be within the Maximum Matching Distance to successfully match the template. + The higher this number, the more accurate the match must be to be considered as valid. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?match_percentile= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?match_percentile= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?match_percentile= + +.. _expl-silhouettematch-edge-sensitivity: + +``edge_sensitivity`` (*Edge Sensitivity*) +''''''''''''''''''''''''''''''''''''''''' + This parameter influences how many edges are detected in the left and right camera images. The higher this number, the + more edges are found in the intensity images. That means, for lower numbers, only the most significant edges + are considered for template matching. A large number of edges in the image might increase the detection time. + It must be ensured that the edges of the objects to be detected are detected in both, the left and the right camera images. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?edge_sensitivity= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?edge_sensitivity= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?edge_sensitivity= + +.. _expl-silhouettematch-only-highest-priority-grasps: + +``only_highest_priority_grasps`` (*Only Highest Priority Grasps*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + If set to true, only grasps with the highest priority will be returned. If collision checking is enabled, only the collision-free + grasps among the group of grasps with the highest priority are returned. + This can save computation time and reduce the number of grasps to be parsed on the application side. + + Without collision checking, only grasps of highest priority are returned. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?only_highest_priority_grasps= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?only_highest_priority_grasps= + + +.. _expl-silhouettematch-check-collisions-with-base-plane: + +``check_collisions_with_base_plane`` (*Check Collisions with Base Plane*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + If this parameter is set to true, and collision checking is enabled by passing a gripper to the ``detect_object`` service call, + all grasp points will be checked for collisions between the gripper and the + calibrated base plane, and only grasp points at which the gripper would not collide with the base plane will be + returned. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?check_collisions_with_base_plane= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?check_collisions_with_base_plane= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?check_collisions_with_base_plane= + +.. _expl-silhouettematch-check-collisions-with-matches: + +``check_collisions_with_matches`` (*Check Collisions with Matches*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + If this parameter is set to true, and collision checking is enabled by passing a gripper to the ``detect_object`` service call, + all grasp points will be checked for collisions between the gripper and all other detected objects (not limited to + ``max_number_of_detected_objects``), and only grasp points at which the gripper would not collide with any other detected object + will be returned. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?check_collisions_with_matches= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?check_collisions_with_matches= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?check_collisions_with_matches= + + +.. _expl-silhouettematch-check-collisions-with-point-cloud: + +``check_collisions_with_point_cloud`` (*Check Collisions with Point Cloud*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + If this parameter is set to true, and collision checking is enabled by passing a gripper to the ``detect_object`` service call, + all grasp points will be checked for collisions between the gripper a watertight version of the point cloud, and only grasp points + at which the gripper would not collide with this point cloud will be returned. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?check_collisions_with_point_cloud= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?check_collisions_with_point_cloud= + + +.. _expl-silhouettematch-point-cloud-enhancement: + +``point_cloud_enhancement`` (*Enhance with Base Plane*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''' + This parameter is only considered when ``check_collisions_with_point_cloud`` is true and the object detection was + triggered without ``object_plane_detection``. By default, ``point_cloud_enhancement`` is set to ``Off`` (*Off*). + If ``point_cloud_enhancement`` is set to ``ReplaceBright`` (*Replace Bright Image Pixels*), the calibrated base plane will + be used to enhance the point cloud that is used for collision checking. For this, the depth values of all bright image pixels inside the image or, + if set, the 2D region of interest will be set to the depth of the calibrated base plane. This parameter should be used when dark objects are placed on an + untextured bright background, e.g. on a light table. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?point_cloud_enhancement= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?point_cloud_enhancement= + +Status values +------------- + +.. index:: + single: SilhouetteMatch; status + +This module reports the following status values: + +.. tabularcolumns:: |l|L| +.. csv-table:: The ``rc_silhouettematch`` module's status values + :header: Name, Description + + "``data_acquisition_time``","Time in seconds required by the last active service to acquire images" + "``last_timestamp_processed``","The timestamp of the last processed dataset" + "``load_carrier_detection_time``","Processing time of the last load carrier detection in seconds" + "``processing_time``","Processing time of the last detection (including load carrier detection) in seconds" + +.. _sect-silhouettematch-services: + +Services +-------- + +.. index:: + single: SilhouetteMatch; services + +The user can explore and call the ``rc_silhouettematch`` module's services, +e.g. for development and testing, using the +:ref:`sect-rest-api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` or +the |rc_xxx| +:ref:`sect-web-gui`:latex:`\:(Section \ref{webgui:sect-web-gui})`. + +The |silm| module offers the following services. + + +.. _expl-silhouettematch-srv-detect-objects: + +``detect_object`` +^^^^^^^^^^^^^^^^^ + + Triggers an object detection as described in + :ref:`sect-silhouettematch-detect`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-detect})` + and returns the pose of all found object instances. + + .. toggle-header:: + :header: **Details** + + All images used by the service are guaranteed to be newer than the service trigger time. + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/detect_object + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/services/detect_object + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/detect_object + + .. tabs:: + + .. tab:: **Request** + + Required arguments: + + ``object_id`` in ``object_to_detect``: ID of the template which should be detected. + + ``pose_frame``: see :ref:`sect-silhouettematch-hand-eye-calib`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-hand-eye-calib})`. + + Potentially required arguments: + + ``robot_pose``: see :ref:`sect-silhouettematch-hand-eye-calib`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-hand-eye-calib})`. + + Optional arguments: + + ``object_plane_detection``: false if the objects are placed on a calibrated base plane, true if the objects' surfaces are planar and + the base plane is unknown or the objects are located on multiple different planes, e.g. stacks. + + ``offset``: offset in meters by which the base-plane calibration will be shifted towards the camera. + + ``load_carrier_id``: ID of the load carrier which contains the items to be detected. + + ``collision_detection``: see :ref:`sect-collision-check-other-modules`:latex:`\:(Section \ref{collisioncheck:sect-collision-check-other-modules})`. + + .. include:: _gen/nodes/services/rc_silhouettematch_detect_object_request.txt + + .. tab:: **Response** + + The maximum number of returned instances can be controlled with the ``max_number_of_detected_objects`` + parameter. + + ``object_id``: ID of the detected template. + + ``instances``: list of detected object instances, ordered according to the chosen sorting strategy. + + ``grasps``: list of grasps on the detected objects, ordered according to the chosen sorting strategy. + The ``instance_uuid`` gives the reference to the detected object in ``instances`` this grasp belongs to. + The list of returned grasps will be trimmed to the 100 best grasps if more reachable grasps are found. + Each grasp contains a flag ``collision_checked`` and a ``gripper_id`` + (see :ref:`sect-collision-check-other-modules`:latex:`, Section \ref{collisioncheck:sect-collision-check-other-modules}`). + + ``load_carriers``: list of detected load carriers. + + ``timestamp``: timestamp of the image set the detection ran on. + + ``return_code``: holds possible warnings or error codes and messages. + + .. include:: _gen/nodes/services/rc_silhouettematch_detect_object_response.txt + +.. _expl-silhouettematch-srv-calib: + +``calibrate_base_plane`` +^^^^^^^^^^^^^^^^^^^^^^^^ + + Triggers the calibration of the base plane, as described in + :ref:`sect-silhouettematch-base-plane-calib`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-base-plane-calib})`. + + .. toggle-header:: + :header: **Details** + + A successful base-plane calibration is stored persistently on the |rc_xxx| and returned by this service. + The base-plane calibration is persistent over firmware updates and rollbacks. + + All images used by the service are guaranteed to be newer than the service trigger time. + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/calibrate_base_plane + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/services/calibrate_base_plane + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/calibrate_base_plane + + .. tabs:: + + .. tab:: **Request** + + Required arguments: + + ``plane_estimation_method``: method to use for base-plane calibration. Valid values are ``STEREO``, ``APRILTAG``, ``MANUAL``. + + ``pose_frame``: see :ref:`sect-silhouettematch-hand-eye-calib`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-hand-eye-calib})`. + + Potentially required arguments: + + ``plane`` if ``plane_estimation_method`` is ``MANUAL``: plane that will be set as base-plane calibration. + + ``robot_pose``: see :ref:`sect-silhouettematch-hand-eye-calib`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-hand-eye-calib})`. + + ``region_of_interest_2d_id``: ID of the region of interest for base-plane calibration. + + Optional arguments: + + ``offset``: offset in meters by which the estimated plane will be shifted towards the camera. + + ``plane_preference`` in ``stereo``: whether the plane closest to or farthest from the camera should be used as base plane. + This option can be set only if ``plane_estimation_method`` is ``STEREO``. + Valid values are ``CLOSEST`` and ``FARTHEST``. If not set, the default is ``FARTHEST``. + + .. include:: _gen/nodes/services/rc_silhouettematch_calibrate_base_plane_request.txt + + .. tab:: **Response** + + ``plane``: calibrated base plane. + + ``timestamp``: timestamp of the image set the calibration ran on. + + ``return_code``: holds possible warnings or error codes and messages. + + .. include:: _gen/nodes/services/rc_silhouettematch_calibrate_base_plane_response.txt + + +.. _expl-silhouettematch-srv-get-calib: + +``get_base_plane_calibration`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns the configured base-plane calibration. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/get_base_plane_calibration + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/services/get_base_plane_calibration + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/get_base_plane_calibration + + .. tabs:: + + .. tab:: **Request** + + Required arguments: + + ``pose_frame``: see :ref:`sect-silhouettematch-hand-eye-calib`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-hand-eye-calib})`. + + Potentially required arguments: + + ``robot_pose``: see :ref:`sect-silhouettematch-hand-eye-calib`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-hand-eye-calib})`. + + .. include:: _gen/nodes/services/rc_silhouettematch_get_base_plane_calibration_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_silhouettematch_get_base_plane_calibration_response.txt + + +.. _expl-silhouettematch-srv-delete-calib: + +``delete_base_plane_calibration`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Deletes the configured base-plane calibration. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/delete_base_plane_calibration + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/services/delete_base_plane_calibration + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/delete_base_plane_calibration + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_silhouettematch_delete_base_plane_calibration_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_silhouettematch_delete_base_plane_calibration_response.txt + + +.. _expl-silhouettematch-srv-set-preferred-orientation: + +``set_preferred_orientation`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Persistently stores the preferred orientation of the gripper to compute the reachability of the grasps, + which is used for filtering and, optionally, sorting the grasps returned by the ``detect_object`` service + (see :ref:`sect-silhouettematch-set-preferred-orientation`:latex:`, Section \ref{silhouettematch:sect-silhouettematch-set-preferred-orientation}`). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/set_preferred_orientation + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/services/set_preferred_orientation + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/set_preferred_orientation + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_silhouettematch_set_preferred_orientation_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_silhouettematch_set_preferred_orientation_response.txt + +.. _expl-silhouettematch-srv-get-preferred-orientation: + +``get_preferred_orientation`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns the preferred orientation of the gripper to compute the reachability of the grasps, + which is used for filtering and, optionally, sorting the grasps returned by the ``detect_object`` service + (see :ref:`sect-silhouettematch-set-preferred-orientation`:latex:`, Section \ref{silhouettematch:sect-silhouettematch-set-preferred-orientation}`). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/get_preferred_orientation + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/services/get_preferred_orientation + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/get_preferred_orientation + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_silhouettematch_get_preferred_orientation_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_silhouettematch_get_preferred_orientation_response.txt + +.. _expl-silhouettematch-srv-set-sorting-strategies: + +``set_sorting_strategies`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Persistently stores the sorting strategy for sorting the grasps and detected objects returned by the ``detect_object`` service + (see :ref:`sect-silhouettematch-detect`:latex:`, Section \ref{silhouettematch:sect-silhouettematch-detect}`). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/set_sorting_strategies + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/services/set_sorting_strategies + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/set_sorting_strategies + + .. tabs:: + + .. tab:: **Request** + + Only one strategy may have a ``weight`` greater than 0. If all ``weight`` values are set to 0, the module will use the + default sorting strategy. + + If the weight for ``direction`` is set, the + ``vector`` must contain the direction vector and ``pose_frame`` must be either ``camera`` or ``external``. + + .. include:: _gen/nodes/services/rc_silhouettematch_set_sorting_strategies_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_silhouettematch_set_sorting_strategies_response.txt + +.. _expl-silhouettematch-srv-get-sorting-strategies: + +``get_sorting_strategies`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns the sorting strategy for sorting the grasps and detected objects returned by the ``detect_object`` service + (see :ref:`sect-silhouettematch-detect`:latex:`, Section \ref{silhouettematch:sect-silhouettematch-detect}`). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/get_sorting_strategies + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/services/get_sorting_strategies + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/get_sorting_strategies + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_silhouettematch_get_sorting_strategies_request.txt + + .. tab:: **Response** + + All ``weight`` values are 0 when the module uses the default sorting strategy. + + .. include:: _gen/nodes/services/rc_silhouettematch_get_sorting_strategies_response.txt + +.. only:: rc_cube + + .. _expl-silhouettematch-srv-trigger-dump: + + ``trigger_dump`` + ^^^^^^^^^^^^^^^^ + Triggers dumping of the detection that corresponds to the given timestamp, + or the latest detection, if no timestamp is given. The dumps are saved to the + connected USB drive. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/services/trigger_dump + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/trigger_dump + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_silhouettematch_trigger_dump_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_silhouettematch_trigger_dump_response.txt + +.. _expl-silhouettematch-srv-reset-params: + +``reset_defaults`` +^^^^^^^^^^^^^^^^^^ + + Resets all parameters of the module to its default values, + as listed in above table. + Also resets preferred orientation and sorting strategies. + The reset does not apply to templates and base-plane calibration. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/reset_defaults + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/services/reset_defaults + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/reset_defaults + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_silhouettematch_reset_defaults_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_silhouettematch_reset_defaults_response.txt + +.. _expl-silhouettematch-srv-set-roi: + +``set_region_of_interest_2d`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Persistently stores a 2D region of interest on the |rc_xxx|. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-roi-srv-set-roi-2d`:latex:`\:(Section \ref{roi:expl-roi-srv-set-roi-2d})` in ``rc_roi_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/set_region_of_interest_2d + +.. _expl-silhouettematch-srv-get-roi: + +``get_regions_of_interest_2d`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns the configured 2D regions of interest with the requested ``region_of_interest_2d_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-roi-srv-get-roi-2d`:latex:`\:(Section \ref{roi:expl-roi-srv-get-roi-2d})` in ``rc_roi_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/get_regions_of_interest_2d + +.. _expl-silhouettematch-srv-delete-roi: + +``delete_regions_of_interest_2d`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Deletes the configured 2D regions of interest with the requested ``region_of_interest_2d_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-roi-srv-delete-roi-2d`:latex:`\:(Section \ref{roi:expl-roi-srv-delete-roi-2d})` in ``rc_roi_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/delete_regions_of_interest_2d + +.. _sect-silhouettematch-internal-services: + +Internal services +----------------- + +The following services for configuring grasps can change in future without notice. +Setting, retrieving and deleting grasps is recommend to be done via the |webgui|. + +.. only:: rc_cube + + .. note:: + + Configuring grasps is global for all templates on the |rc_cube| and affects all + camera pipelines. + +.. _expl-silhouettematch-srv-set-grasp: + +``set_grasp`` +^^^^^^^^^^^^^ + + Persistently stores a grasp for the given object template on the |rc_xxx|. + All configured grasps are persistent over firmware updates and rollbacks. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/set_grasp + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/services/set_grasp + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/set_grasp + + .. tabs:: + + .. tab:: **Request** + + Details for the definition of the ``grasp`` type are given in + :ref:`sect-silhouettematch-grasps`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-grasps})`. + + .. include:: _gen/nodes/services/rc_silhouettematch_set_grasp_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_silhouettematch_set_grasp_response.txt + + +.. _expl-silhouettematch-srv-set-all-grasps: + +``set_all_grasps`` +^^^^^^^^^^^^^^^^^^ + + Replaces the list of grasps for the given object template on the |rc_xxx|. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/set_all_grasps + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/services/set_all_grasps + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/set_all_grasps + + .. tabs:: + + .. tab:: **Request** + + Details for the definition of the ``grasp`` type are given in + :ref:`sect-silhouettematch-grasps`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-grasps})`. + + .. include:: _gen/nodes/services/rc_silhouettematch_set_all_grasps_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_silhouettematch_set_all_grasps_response.txt + +.. _expl-silhouettematch-srv-get-grasps: + +``get_grasps`` +^^^^^^^^^^^^^^ + + Returns all configured grasps which have the requested ``grasp_ids`` and belong to the requested ``template_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/get_grasps + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/services/get_grasps + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/get_grasps + + .. tabs:: + + .. tab:: **Request** + + If no ``grasp_ids`` are provided, all grasps belonging to the requested ``template_ids`` are returned. + If no ``template_ids`` are provided, all grasps with the requested ``grasp_ids`` are returned. + If neither IDs are provided, all configured grasps are returned. + + .. include:: _gen/nodes/services/rc_silhouettematch_get_grasps_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_silhouettematch_get_grasps_response.txt + +.. _expl-silhouettematch-srv-delete-grasps: + +``delete_grasps`` +^^^^^^^^^^^^^^^^^ + + Deletes all grasps with the requested ``grasp_ids`` that belong to the requested ``template_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/delete_grasps + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/services/delete_grasps + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/delete_grasps + + .. tabs:: + + .. tab:: **Request** + + If no ``grasp_ids`` are provided, all grasps belonging to the requested ``template_ids`` are deleted. + The ``template_ids`` list must not be empty. + + .. include:: _gen/nodes/services/rc_silhouettematch_delete_grasps_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_silhouettematch_delete_grasps_response.txt + +.. _expl-silhouettematch-srv-get-symmetric-grasps: + +``get_symmetric_grasps`` +^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns all grasps that are symmetric to the given grasp. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/get_symmetric_grasps + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/services/get_symmetric_grasps + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/get_symmetric_grasps + + .. tabs:: + + .. tab:: **Request** + + Details for the definition of the ``grasp`` type are given in + :ref:`sect-silhouettematch-grasps`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-grasps})`. + + .. include:: _gen/nodes/services/rc_silhouettematch_get_symmetric_grasps_request.txt + + .. tab:: **Response** + + The first grasp in the returned list is the one that was passed with the service call. + If the object template does not have an exact symmetry, only the grasp passed with the + service call will be returned. If the object template has a continuous symmetry (e.g. a + cylindrical object), only 12 equally spaced sample grasps will be returned. + + Details for the definition of the ``grasp`` type are given in + :ref:`sect-silhouettematch-grasps`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-grasps})`. + + .. include:: _gen/nodes/services/rc_silhouettematch_get_symmetric_grasps_response.txt + +.. _sect-silhouettematch-return-codes: + +Return codes +------------ + +.. index:: + pair: SilhouetteMatch; return codes + +Each service response contains a ``return_code``, +which consists of a ``value`` plus an optional ``message``. +A successful service returns with a ``return_code`` value of ``0``. +Negative ``return_code`` values indicate that the service failed. +Positive ``return_code`` values indicate that the service succeeded with additional information. + +.. tabularcolumns:: |c|L| +.. _tab-silhouettematch-return-codes: +.. csv-table:: Return codes of the |silm| module services + :header: Code, Description + + "0", "Success" + "-1", "An invalid argument was provided" + "-3", "An internal timeout occurred, e.g. during object detection" + "-4", "Data acquisition took longer than allowed" + "-7", "Data could not be read or written to persistent storage" + "-8", "Module is not in a state in which this service can be called. E.g. ``detect_object`` cannot be called if there is no base-plane calibration." + "-10", "New element could not be added as the maximum storage capacity of regions of interest or templates has been exceeded" + "-100", "An internal error occurred" + "-101", "Detection of the base plane failed" + "-102", "The hand-eye calibration changed since the last base-plane calibration" + "-104", "Offset between the base plane normal and the camera's line of sight exceeds 10 degrees" + "10", "The maximum storage capacity of regions of interest or templates has been reached" + "11", "An existing element was overwritten" + "100", "The requested load carrier was not detected in the scene" + "101", "None of the detected grasps is reachable" + "102", "The detected load carrier is empty" + "103", "All detected grasps are in collision" + "107", "The base plane was not transformed to the current camera pose, e.g. because no robot pose was provided during base-plane calibration" + "108", "The template is deprecated." + "109", "The plane for object detection does not fit to the load carrier, e.g. objects are below the load carrier floor." + "111", "The detection result's pose could not be refined with the point cloud because the template's outer contour is not closed." + "151", "The object template has a continuous symmetry" + "999", "Additional hints for application development" + +.. _sect-silhouettematch-template-upload: + +Template API +------------ + +.. index:: + single: SilhouetteMatch; template api + single: SilhouetteMatch; template download + single: SilhouetteMatch; template upload + single: SilhouetteMatch; template deletion + +For template upload, download, listing and removal, special |rest-api| endpoints are provided. +Templates can also be uploaded, downloaded and removed via the |webgui|. +The templates include the grasp points, if grasp points have been configured. +Up to 50 templates can be stored persistently on the |rc_xxx|. + +.. only:: rc_visard + + .. include:: _gen/swagger/rc_visard/templates_rc_silhouettematch.txt + +.. only:: rc_visard_ng + + .. include:: _gen/swagger/rc_visard_ng/templates_rc_silhouettematch.txt + +.. only:: rc_cube + + .. include:: _gen/swagger/rc_cube/templates_rc_silhouettematch.txt diff --git a/v24.04/de/_raw_sources/standards.rst.txt b/v24.04/de/_raw_sources/standards.rst.txt new file mode 100644 index 0000000..ec03799 --- /dev/null +++ b/v24.04/de/_raw_sources/standards.rst.txt @@ -0,0 +1,85 @@ +.. include:: global_rst.glb + +.. raw:: latex + + \newpage + +.. |CE| image:: images/ce-mark_small.* + +.. |NRTL| image:: images/NRTL_small.* + +.. |FCC| image:: images/fcc_logo_small.* + + +Applicable standards +==================== + +.. only:: matrixvision + + The following approvals and certificates have been issued to Roboception GmbH. + +Interfaces +---------- + +The |rc_xxx| supports the following interface standards: + +|genicamlogo| + +The Generic Interface for Cameras standard is the basis for plug & play handling of cameras and devices. + +|gigelogo| + +GigE Vision\ |reg| is an interface standard for transmitting high-speed video and related control data over Ethernet networks. + +.. only:: rc_visard_ng + + Approvals + --------- + + The |rc_xxx| has received the following approvals: + + |CE| + EC Declaration of Conformity + +.. only:: rc_visard + + Approvals + --------- + + + The |rc_xxx| has received the following approvals: + + |CE| + EC Declaration of Conformity + + + |NRTL| + NRTL certification by TÜV Süd + + |FCC| + Changes or modifications not expressly approved by the manufacturer could void the user’s authority to operate the equipment. + This device complies with Part 15 of the FCC rules. Operation is subject to the following two conditions: + + 1. This device may not cause harmful interference, and + 2. this device must accept any interference received, including interference that may cause undesired operation. + + .. _sect-standards: + + Standards + --------- + + The |rc_visard| has been tested to be in compliance with the following standards: + + * AS/NZS CISPR32 : 2015 Information technology equipment, Radio disturbance characteristics, Limits and methods of measurement + * CISPR 32 : 2015 Electromagnetic compatibility of multimedia equipment - Emission requirements + * GB 9254 : 2008 This standard is out of the accreditation scope. Information technology equipment, Radio disturbance characteristics, Limits and methods of measurement + * EN 55032 : 2015 Electromagnetic compatibility of multimedia equipment - Emission requirements + * EN 55024 : 2010 +A1:2015 Information technology equipment, Immunity characteristics, Limits and methods of measurement + * CISPR 24 : 2015 +A1:2015 International special committee on radio interference, Information technology equipment-Immunity characteristics-Limits and methods of measurement + * EN 61000-6-2 : 2005 Electromagnetic compatibility (EMC) Part 6-2:Generic standards - Immunity for industrial environments + * EN 61000-6-3 : 2007+A1:2011 Electromagnetic compatibility (EMC) - Part 6-3: Generic standards - Emission standard for residential, commercial and light-industrial environments + * Registered FCC ID: 2AVMTRCV17 + * Certified for Canada according to CAN ICES-3(B)/NMB-3(B) + +.. + |TODO| Download link of certification of conformity diff --git a/v24.04/de/_raw_sources/stereo_camera.rst.txt b/v24.04/de/_raw_sources/stereo_camera.rst.txt new file mode 100644 index 0000000..166640f --- /dev/null +++ b/v24.04/de/_raw_sources/stereo_camera.rst.txt @@ -0,0 +1,893 @@ + +.. include:: global_rst.glb + +.. _sect-stereo-camera: + +Camera +====== + +The camera module is a base module which is available on every |rc_xxx| and +is responsible for image acquisition and rectification. It provides various +parameters, e.g. to control exposure and frame rate. + +.. _sect-stereo-camera-rectification: + +Rectification +------------- + +.. index:: + single: rectification + single: camera model + single: stereo camera + single: calibration; rectification + single: focal length + single: baseline + single: disparity + +To simplify image processing, the camera module rectifies all camera images +based on the camera calibration. This means that lens distortion is removed and +the principal point is located exactly in the middle of the image. + +The model of a rectified camera is described with just one value, which is the focal length. +The |rc_xxx| reports a focal length factor via its various interfaces. It +relates to the image width for supporting different image resolutions. The +focal length :math:`f` in pixels can be easily obtained by multiplying the +focal length factor by the image width in pixels. + +In case of a stereo camera, rectification also aligns images such that an +object point is always projected onto the same image row in both images. +The cameras' optical axes become exactly parallel. + +.. This means that points at infinite distance are projected onto the same image column in both images. +.. The closer an object point is, the larger is the difference between its image +.. columns in the right and left images. This difference is called disparity. + +.. only:: rc_cube and (roboception or schunk or basler) + + .. note:: If a |blaze| sensor is used instead of a stereo camera, only + one camera image is provided. However, the image is rectified, + i.e. lens distortion is removed and the principal point is in the + image center. + +.. _sect-cam-accessing-images: + +Viewing and downloading images +------------------------------ + +.. index:: + pair: images; download + +The |rc_xxx| provides the time-stamped, rectified images +over the GenICam interface (see :ref:`sect-provided-image-streams`:latex:`, +Section \ref{gigevision:sect-provided-image-streams}`). Live streams of the images are provided +with reduced quality in the :ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})`. + +The |webgui| also provides the possibility to download a snapshot of the current scene as a .tar.gz file +as described in :ref:`sect-webgui-camera-snapshot`:latex:`\:(Section \ref{webgui:sect-webgui-camera-snapshot})`. + + +.. _sect-cam-params: + +Parameters +---------- + +.. index:: + pair: parameters; camera + single: gain factor + single: exposure time + pair: camera; Web GUI + +The camera software module is called ``rc_camera`` and is represented by the +*Camera* page :cubeonly:`in the desired pipeline` in the :ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})`. +The user can change the camera parameters there, or directly via the |rest-api| +(:ref:`sect-rest-api`:latex:`, Section \ref{rest_api:sect-rest-api}`) or GigE Vision +(:ref:`sect-genicam`:latex:`, Section \ref{gigevision:sect-genicam}`). + +.. Note:: Camera parameters cannot be changed via the |webgui| or |rest-api| if |rc_xxx| + is used via GigE Vision. + +Parameter overview +^^^^^^^^^^^^^^^^^^ + +.. only:: rc_cube + + .. note:: The minimum, maximum and default values in the parameter table + below show the values of the |rc_visard|. The values will be + different for other sensors. + +.. only:: rc_cube or rc_visard + + .. include:: _gen/nodes/params/rc_camera.txt + +.. only:: rc_visard_ng + + .. include:: _gen/nodes/params/rc_camera_ng.txt + +Description of run-time parameters +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. figure:: images/webgui_camera.png + :width: 100 % + :align: center + + The |webgui|'s *Camera* page + + +.. only:: rc_visard_ng + + .. _expl-acquisition_mode: + + .. index:: + pair: parameters; camera + pair: camera; acquisition mode + + ``acquisition_mode`` (*Acquisition Mode*) + ''''''''''''''''''''''''''''''''''''''''' + This values determines the camera acquisition mode. In ``Continuous`` mode, the camera will + acquire images at the specified frame rate ``fps``. In ``Trigger`` mode, images are only + acquired when the camera receives a trigger signal. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?acquisition_mode= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/parameters?acquisition_mode= + + .. _expl-trigger_source: + + .. index:: + pair: camera; trigger source + + ``trigger_source`` (*Trigger Source*) + ''''''''''''''''''''''''''''''''''''' + This value is only used when ``acquisition_mode`` is set to ``Trigger`` and determines the + source for the trigger. In ``Software`` mode a trigger can be sent via the ``rc_camera/acquisition_trigger`` service. + When the ``acquisition_mode`` for the depth images is set to ``SingleFrame`` or ``SingleFrameOut1`` + (see :ref:`sect-disp-image-parameters`:latex:`, Section \ref{stereo_matching:sect-disp-image-parameters}`), + the camera software trigger is sent automatically whenever a depth image + acquisition is triggered. + The modes ``In1`` and ``In2`` are hardware trigger modes. + An image is acquired whenever a signal on the chosen input is received. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?trigger_source= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/parameters?trigger_source= + + .. _expl-trigger_activation: + + .. index:: + pair: camera; trigger activation + + ``trigger_activation`` (*Trigger Activation*) + ''''''''''''''''''''''''''''''''''''''''''''' + This value is only used when ``acquisition_mode`` is set to ``Trigger`` and ``trigger_source`` is set to + ``In1`` or ``In2``. It determines the signal edge that should be used to trigger an acquisition. Possible + values are ``RisingEdge``, ``FallingEdge`` or ``AnyEdge``. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?trigger_activation= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/parameters?trigger_activation= + +.. _expl-fps: + +.. index:: + pair: camera; frame rate + see: fps; frame rate + +``fps`` (*FPS*) +''''''''''''''' + This value is the cameras' frame rate (fps, frames per second), + which determines the upper frequency at which depth images + can be computed. This is also the frequency at which the |rc_xxx| + delivers images via GigE Vision. Reducing this frequency also + reduces the network bandwidth required to transmit the images. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?fps= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_camera/parameters?fps= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/parameters?fps= + + .. only:: rc_visard + + The camera always runs with |cam-rate| + to ensure proper working of internal modules such as visual + odometry that need a constant frame rate. + The user frame rate setting is implemented by excluding frames + for stereo matching and transmission via GigE Vision to reduce + bandwidth as shown in figure :numref:`fig-fps`. + + .. only:: rc_visard_ng + + The camera always runs with |cam-rate| when in ``Continuous`` acquisition + mode to ensure proper working of internal modules such as visual + odometry that need a constant frame rate. + The user frame rate setting is implemented by excluding frames + for stereo matching and transmission via GigE Vision to reduce + bandwidth as shown in figure :numref:`fig-fps`. + + .. _fig-fps: + .. figure:: images/fps.* + :width: 100 % + :align: center + + Images are internally always captured with |cam-rate|. The ``fps`` parameter + determines how many of them are sent as camera images via GigE Vision. + +.. _expl-gamma: + +.. index:: + pair: camera; gamma + +``gamma`` (*Gamma*) +''''''''''''''''''' + The gamma value determines the mapping of perceived light to the brightness of a pixel. + A gamma value of 1 corresponds to a linear relationship. Lower gamma values let dark image + parts appear brighter. A value around 0.5 corresponds to human vision. + + .. only:: rc_cube and (roboception or schunk or basler) + + Not available for blaze sensor. + + .. only:: rc_cube + + .. note:: For a pipeline of type ``rc_visard`` this value can only be changed + when the connected |rc_visard| has at least firmware version + 22.07. Otherwise the gamma value will always be 1.0. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?gamma= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_camera/parameters?gamma= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/parameters?gamma= + +.. _expl-exp-control: + +.. index:: + single: exposure; auto + single: exposure; manual + single: exposure; HDR + single: manual exposure + single: auto exposure + +``exp_control`` (Exposure *Auto*, *HDR* or *Manual*) +'''''''''''''''''''''''''''''''''''''''''''''''''''' + The exposure control mode can be set to `Auto`, `HDR` or `Manual`. + This replaces the deprecated `exp_auto` parameter. + + `Auto`: This is the default mode in which the exposure time and gain + factor is chosen automatically to correctly expose the image. + The last automatically determined exposure and gain values are set into + ``exp_value`` and ``gain_value`` when switching auto-exposure off. + + `HDR`: The HDR mode computes high-dynamic-range images by combining images + with different exposure times to avoid under-exposed and over-exposed areas. + This decreases the frame rate and is only suitable for static scenes. + + `Manual`: In the manual exposure mode the exposure time and gain are kept + fixed independent of the resulting image brightness. + + .. only:: rc_cube + + .. note:: For a pipeline of type ``rc_visard`` the `HDR` mode is only available + when the connected |rc_visard| has at least firmware version 23.01. + + .. only:: rc_cube and (roboception or schunk or basler) + + Not available for blaze sensor. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?exp_control= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_camera/parameters?exp_control= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/parameters?exp_control= + +.. _expl-exp-auto: + +.. index:: + single: exposure; auto + single: exposure; manual + single: manual exposure + single: auto exposure + +``exp_auto`` (deprecated) +''''''''''''''''''''''''' + **This parameter is deprecated and will be removed in a future release.** + Please use `exp_control`. + + This value can be set to `true` for auto-exposure mode, + or to `false` for manual exposure mode. In manual exposure mode, the + chosen exposure time is kept, even if the images are overexposed or + underexposed. In auto-exposure mode, the exposure time and gain factor + is chosen automatically to correctly expose the image. The last + automatically determined exposure and gain values are set into + ``exp_value`` and ``gain_value`` when switching auto-exposure off. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?exp_auto= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_camera/parameters?exp_auto= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/parameters?exp_auto= + +.. _expl-exp-auto-mode: + +.. index:: + pair: exposure; auto + single: auto exposure mode + pair: auto exposure mode; AdaptiveOut1 + pair: auto exposure mode; Out1High + pair: auto exposure mode; Normal + +``exp_auto_mode`` (*Auto Exposure Mode*) +'''''''''''''''''''''''''''''''''''''''' + The auto exposure mode can be set to `Normal`, `Out1High` or `AdaptiveOut1`. These modes are + relevant when the |rc_xxx| is used with an external light source or projector connected + to the |rc_visard|'s or |rc_viscore|'s GPIO Out1, + which can be controlled by the IOControl module + (:ref:`sect-iocontrol`:latex:`, Section \ref{iocontrol:sect-iocontrol}`). + + `Normal`: All images are considered for exposure control, except if the IOControl mode + for GPIO Out1 is `ExposureAlternateActive`: then only images where GPIO Out1 is HIGH will be + considered, since these images may be brighter in case GPIO Out1 is used to trigger an external light source. + + `Out1High`: This exposure mode adapts the exposure time using only images with GPIO Out1 HIGH. Images where GPIO Out1 is LOW are not + considered at all, which means, that the exposure time does not change when only images with Out1 LOW are acquired. + This mode is recommended for using the ``acquisition_mode`` ``SingleFrameOut1`` in the stereo matching module as described in + :ref:`Stereo Matching Parameters`:latex:`\:(Section \ref{stereo_matching:sect-disp-image-parameters})` + and having an external projector connected to GPIO Out1, when changes in the brightness of the scene should only be considered when Out1 is HIGH. + This is the case, for example, when a bright part of the robot moves through the field of view of the camera just before a detection is triggered, + which should not affect the exposure time. + + `AdaptiveOut1`: This exposure mode uses all camera images and tracks the exposure difference between images + with GPIO Out1 LOW and HIGH. While the IOControl mode for GPIO Out1 is LOW, the images are under-exposed by this exposure + difference to avoid over-exposure for when GPIO Out1 triggers an external projector. The resulting exposure difference + is given as *Out1 Reduction* below the live images. This mode is recommended for using the ``acquisition_mode`` + ``SingleFrameOut1`` in the stereo matching module as described in + :ref:`Stereo Matching Parameters`:latex:`\:(Section \ref{stereo_matching:sect-disp-image-parameters})` + and having an external projector connected to GPIO Out1, when changes in the brightness of the scene should be considered at all times. + This is the case, for example, in applications where the external lighting changes. + + .. only:: rc_cube and (roboception or schunk or basler) + + Not available for blaze sensor. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?exp_auto_mode= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_camera/parameters?exp_auto_mode= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/parameters?exp_auto_mode= + +.. _expl-exp-max: + +.. index:: + single: auto exposure + pair: maximum; exposure time + single: gain factor + single: motion blur + single: image noise + +``exp_max`` (*Max Exposure*) +'''''''''''''''''''''''''''' + This value is the maximal exposure time in auto-exposure + mode in seconds. The actual + exposure time is adjusted automatically so that the images are exposed + correctly. If the maximum exposure time is reached, but the images are still + underexposed, the |rc_xxx| stepwise increases the gain to increase the + images' brightness. Limiting the exposure time is useful for avoiding + or reducing motion blur during fast movements. However, higher gain + introduces noise into the image. The best trade-off depends on the application. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?exp_max= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_camera/parameters?exp_max= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/parameters?exp_max= + +.. _exp-auto-max-min-average: + +``exp_auto_average_max`` (*Max Brightness*) and ``exp_auto_average_min`` (*Min Brightness*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + The auto-exposure tries to set the exposure time and gain factor such that the + average intensity (i.e. brightness) in the image or exposure region is between a + maximum and a minimum. The maximum brightness will be used if there is no saturation, e.g. + no over-exposure due to bright surfaces or reflections. In case of saturation, + the exposure time and gain factor are reduced, but only down to the minimum + brightness. + + The maximum brightness has precedence over the minimum brightness parameter. + If the minimum brightness is larger than the maximum brightness, the auto-exposure + always tries to make the average intensity equal to the maximum brightness. + + The current brightness is always shown in the status bar below the images. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_camera/parameters?= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/parameters?= + +.. _expl-exp-region: + +.. index:: + single: exposure region + +``exp_offset_x``, ``exp_offset_y``, ``exp_width``, ``exp_height`` (*Exposure Region*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + These values define a rectangular region in the left rectified image for + limiting the area used for computing the auto exposure. The exposure time and + gain factor of both images are chosen to optimally expose the defined region. + This can lead to over- or underexposure of image parts outside the defined + region. If either the width or height is 0, then the whole left and right + images are considered by the auto exposure function. This is the default. + + The region is visualized in the |webgui| by a rectangle in the left + rectified image. It can be defined using the sliders or by selecting + it in the image after pressing the button ``Select Region in Image``. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_camera/parameters?= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/parameters?= + +.. _expl-exp-value: + +.. index:: + single: exposure time + single: manual exposure + +``exp_value`` (*Exposure*) +'''''''''''''''''''''''''' + This value is the exposure time in manual exposure mode in seconds. This exposure time is kept constant + even if the images are underexposed. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?exp_value= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_camera/parameters?exp_value= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/parameters?exp_value= + +.. _expl-gain-value: + +.. index:: + single: gain factor + +``gain_value`` (*Gain*) +''''''''''''''''''''''' + This value is the gain factor in decibel that can be set in manual exposure mode. Higher gain factors + reduce the required exposure time but introduce noise. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?gain_value= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_camera/parameters?gain_value= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/parameters?gain_value= + +.. _expl-wb-auto: + +.. index:: + single: white balance + +``wb_auto`` (*White Balance Auto* or *Manual*) +'''''''''''''''''''''''''''''''''''''''''''''' + This value can be set to `true` for automatic white balancing or `false` for manually + setting the ratio between the colors using ``wb_ratio_red`` and + ``wb_ratio_blue``. The last automatically determined ratios are set into + ``wb_ratio_red`` and ``wb_ratio_blue`` when switching automatic white balancing off. + White balancing is without function for monochrome + cameras and will not be displayed in the |webgui| in this case. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?wb_auto= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_camera/parameters?wb_auto= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/parameters?wb_auto= + +.. _expl-wb-ratio: + +.. index:: + single: white balance + +``wb_ratio_blue`` and ``wb_ratio_red`` (*Blue | Green* and *Red | Green*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + These values are used to set blue to green and red to green ratios + for manual white balance. White balancing is without function for monochrome + cameras and will not be displayed in the |webgui| in this case. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_camera/parameters?= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/parameters?= + +These parameters are also available over the GenICam interface with slightly different names and partly with different units +or data types (see :ref:`sect-genicam`:latex:`, Section \ref{gigevision:sect-genicam}`). + + +Status values +------------- + +This module reports the following status values: + +.. only:: rc_cube + + .. tabularcolumns:: |l|L| + .. csv-table:: The ``rc_camera`` module's status values + :header: Name, Description + + "``baseline``","Stereo baseline :math:`t` in meters" + "``brightness``",":mvexclude:`Not available for blaze sensor.` Current brightness of the image as value between 0 and 1" + "``color``","0 for monochrome cameras, 1 for color cameras" + "``exp``","Current exposure time in seconds. This value is shown below the image preview in the |webgui| as *Exposure (ms)*." + "``focal``","Focal length factor normalized to an image width of 1" + "``fps``","Current frame rate of the camera images in Hertz. This value is shown in the |webgui| below the image preview as *FPS (Hz)*." + "``gain``","Current gain factor in decibel. This value is shown in the |webgui| below the image preview as *Gain (dB)*." + "``gamma``","Current gamma value." + "``height``","Height of the camera image in pixels. This value is shown in the |webgui| below the image preview as the second part of *Resolution (px)*." + "``out1_reduction``",":mvexclude:`Not available for blaze sensor.` Fraction of reduction (0.0 - 1.0) of brightness for images with GPIO Out1=LOW in exp_auto_mode=AdaptiveOut1 or exp_auto_mode=Out1High. This value is shown in the |webgui| below the image preview as *Out1 Reduction (%)*." + "``params_override_active``","1 if parameters are temporarily overwritten by a running calibration process" + "``test``","0 for live images and 1 for test images" + "``width``","Width of the camera image in pixels. This value is shown in the |webgui| below the image preview as the first part of *Resolution (px)*." + +.. only:: rc_visard or rc_visard_ng + + .. tabularcolumns:: |l|L| + .. csv-table:: The ``rc_camera`` module's status values + :header: Name, Description + + "``baseline``","Stereo baseline :math:`t` in meters" + "``brightness``",":mvexclude:`Not available for blaze sensor.` Current brightness of the image as value between 0 and 1" + "``color``","0 for monochrome cameras, 1 for color cameras" + "``exp``","Current exposure time in seconds. This value is shown below the image preview in the |webgui| as *Exposure (ms)*." + "``focal``","Focal length factor normalized to an image width of 1" + "``fps``","Current frame rate of the camera images in Hertz. This value is shown in the |webgui| below the image preview as *FPS (Hz)*." + "``gain``","Current gain factor in decibel. This value is shown in the |webgui| below the image preview as *Gain (dB)*." + "``gamma``","Current gamma value." + "``height``","Height of the camera image in pixels. This value is shown in the |webgui| below the image preview as the second part of *Resolution (px)*." + "``out1_reduction``",":mvexclude:`Not available for blaze sensor.` Fraction of reduction (0.0 - 1.0) of brightness for images with GPIO Out1=LOW in exp_auto_mode=AdaptiveOut1 or exp_auto_mode=Out1High. This value is shown in the |webgui| below the image preview as *Out1 Reduction (%)*." + "``params_override_active``","1 if parameters are temporarily overwritten by a calibration process" + "``temp_left``","Temperature of the left camera sensor in degrees Celsius" + "``temp_right``","Temperature of the right camera sensor in degrees Celsius" + "``test``","0 for live images and 1 for test images" + "``time``","Processing time for image grabbing in seconds" + "``width``","Width of the camera image in pixels. This value is shown in the |webgui| below the image preview as the first part of *Resolution (px)*." + +.. _sect-cam-services: + +Services +-------- + +.. index:: + pair: parameters; services + +The camera module offers the following services. + +.. only:: rc_visard_ng + + ``acquisition_trigger`` + ^^^^^^^^^^^^^^^^^^^^^^^ + + Triggers an image acquisition when ``acquisition_mode`` is set to ``Trigger`` and ``trigger_source`` is set to ``Software``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/acquisition_trigger + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/services/acquisition_trigger + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_camera_acquisition_trigger_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_camera_acquisition_trigger_response.txt + + +``reset_defaults`` +^^^^^^^^^^^^^^^^^^ + + Restores and applies the default values for this module's parameters + ("factory reset"). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/reset_defaults + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_camera/services/reset_defaults + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/services/reset_defaults + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_camera_reset_defaults_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_camera_reset_defaults_response.txt diff --git a/v24.04/de/_raw_sources/stereo_matching.rst.txt b/v24.04/de/_raw_sources/stereo_matching.rst.txt new file mode 100644 index 0000000..29610a2 --- /dev/null +++ b/v24.04/de/_raw_sources/stereo_matching.rst.txt @@ -0,0 +1,995 @@ + +.. include:: global_rst.glb + +.. _sect-stereo-matching: + +Stereo matching +=============== + +.. index:: + single: disparity + single: disparity image + single: depth image + +The stereo matching module is a base module which is available on every |rc_xxx| +and uses the rectified stereo-image pair to compute +disparity, error, and confidence images. It also offers a service to measure depth in +a specified image region (see :ref:`sect-stereo-matching-services`:latex:`, Section \ref{stereo_matching:sect-stereo-matching-services}`). + +.. only:: rc_cube and (roboception or schunk or basler) + + .. note:: This module is not available in camera pipelines of type ``blaze``. + +To compute full resolution disparity, error and confidence images, an additional StereoPlus +:ref:`license` +:latex:`(Section \ref{maintenance:sect-updating-license})` is required. +This license is included in every |rc_xxx| purchased after +31.01.2019. + +.. _sect-disparity-images: + +Computing disparity images +-------------------------- + +After rectification, an object point is guaranteed to be projected onto the same +pixel row in both left and right image. That point's pixel +column in the right image is always lower than or equal +to the same point's pixel column in the left image. The term disparity +signifies the difference between the pixel columns in the right and left images +and expresses the depth or distance of the object point from the camera. The +disparity image stores the disparity values of all pixels in the left camera +image. + +The larger the disparity, the closer the object point. A disparity of 0 +means that the projections of the object point are in the same image column +and the object point is at infinite distance. Often, there are pixels for which disparity +cannot be determined. This is the case for occlusions that appear on the +left sides of objects, because these areas are not seen from the right camera. +Furthermore, disparity cannot be determined for textureless areas. Pixels +for which the disparity cannot be determined are marked as invalid with the +special disparity value of 0. To distinguish between invalid disparity +measurements and disparity measurements of 0 for objects that are infinitely +far away, the disparity value for the latter is set to the smallest possible +disparity value above 0. + +.. index:: ! SGM + see: Semi-Global Matching; SGM + +To compute disparity values, the stereo matching algorithm has to find +corresponding object points in the left and right camera images. These are points +that represent the same object point in the scene. For stereo matching, the |rc_xxx| uses +|sgm|, which offers quick run times and +great accuracy, especially at object borders, fine structures, and in weakly textured areas. + +.. index:: + single: texture + +A key requirement for any stereo matching method is the presence of texture in the +image, i.e., image-intensity changes due to patterns or surface +structure within the scene. In completely untextured regions such as a flat white +wall without any structure, disparity values can either not be computed or the +results are erroneous or have low confidence (see +:ref:`sect-confidence-error`:latex:`, Section \ref{stereo_matching:sect-confidence-error}`). The texture in the scene should not be an +artificial, repetitive pattern, since those structures may lead to ambiguities and hence to wrong disparity measurements. + +When working with poorly textured objects or in +untextured environments, a static artificial texture can be projected +onto the scene using an external pattern projector. This pattern should be random-like +and not contain repetitive structures. The |rc_xxx| provides the IOControl module +(see :ref:`sect-iocontrol`:latex:`, Section \ref{iocontrol:sect-iocontrol}`) as +optional software module which can control a pattern projector connected to the sensor. + +.. _sect-point-clouds: + +Computing depth images and point clouds +--------------------------------------- + +.. index:: ! depth image + single: depth image + pair: 3D coordinates; disparity image + +The following equations show how to compute an object point's actual 3D coordinates :math:`P_x, P_y, P_z` in the +camera coordinate frame +from the disparity image's pixel coordinates :math:`p_{x}, p_{y}` +and the disparity value :math:`d` in pixels: + +.. math:: + :label: reconstruction + + P_x&=\frac{p_x \cdot t}{d}\\ + P_y&=\frac{p_y \cdot t}{d}\\ + P_z&=\frac{f \cdot t}{d}, + +where :math:`f` is the focal length after rectification in pixels and :math:`t` +is the stereo baseline in meters, which was determined during calibration. These values +are also transferred over the GenICam interface (see +:ref:`sect-custom-genicam-params`:latex:`, \:Section \ref{gigevision:sect-custom-genicam-params}`). + +.. only:: rc_visard or rc_visard_ng + + .. note:: The |rc_xxx|'s camera coordinate frame is defined as shown in + :ref:`sect-coordinate-frames`:latex:`\:(Section \ref{hardware_spec:sect-coordinate-frames})`. + +.. note:: The |rc_xxx| reports a focal length factor via its various + interfaces. It relates to the image width + for supporting different image resolutions. The focal length :math:`f` + in pixels can be easily obtained by multiplying the focal length factor + by the image width in pixels. + +Please note that equations :eq:`reconstruction` assume that the coordinate +frame is centered in the principal point that is typically in the center of the image, +and :math:`p_{x}, p_{y}` refer to the middle of the pixel, i.e. by adding 0.5 to the +integer pixel coordinates. The following figure shows the definition of the image coordinate +frame. + +.. figure:: images/image_coordinates.png + :width: 30 % + :align: center + + The image coordinate frame's origin is defined to be at the image center + -- :math:`w` is the image width and :math:`h` is the image height. + +The same equations, but with the corresponding GenICam parameters are given in +:ref:`sect-image-stream-conversions`:latex:`\:(Section \ref{gigevision:sect-image-stream-conversions})`. + +.. index:: + single: 3D modeling + single: point cloud + single: 3D coordinates + +The set of all object points computed from the disparity image gives the point +cloud, which can be used for 3D modeling applications. The disparity image is +converted into a depth image by replacing +the disparity value in each pixel with the value of :math:`P_z`. + +.. only:: roboception or schunk or matrixvision + + .. Note:: |manufacturer| provides software and examples for receiving disparity images from + the |rc_xxx| via GigE Vision and computing depth images and point clouds. See + http://www.roboception.com/download. + +.. _sect-confidence-error: + +Confidence and error images +--------------------------- + +.. index:: ! confidence, !error + single: disparity error + +For each disparity image, additionally an error image and a confidence image are provided, +which give uncertainty measures for each disparity value. These images +have the same resolution and the same frame rate as the disparity image. The +error image contains the disparity error :math:`d_{eps}` in pixels corresponding +to the disparity value at the same image coordinates in the disparity image. +The confidence image contains the corresponding confidence value :math:`c` +between 0 and 1. The confidence is defined as the probability of the true +disparity value being within the interval of three times the error around the +measured disparity :math:`d`, i.e., :math:`[d-3d_{eps}, d+3d_{eps}]`. +Thus, the disparity image with error and confidence values can be used in +applications requiring probabilistic inference. The confidence and error values +corresponding to an invalid disparity measurement will be 0. + +The disparity error :math:`d_{eps}` (in pixels) can be converted to a depth error :math:`z_{eps}` +(in meters) using the focal length :math:`f` (in pixels), the baseline :math:`t` (in meters), and the disparity +value :math:`d` (in pixels) of the same pixel in the disparity image: + +.. math:: + z_{eps}=\frac{d_{eps}\cdot f\cdot t}{d^2}. + :label: eq-deptherror + +Combining equations :eq:`reconstruction` and :eq:`eq-deptherror` allows the +depth error to be related to the depth: + +.. math:: + z_{eps}=\frac{d_{eps}\cdot{P_z}^2}{f\cdot t}. + +With the focal lengths and baselines of the different camera models and the typical combined +calibration and stereo matching error :math:`d_{eps}` of 0.25 pixels, the depth accuracy +can be visualized as shown below. + +.. figure:: _plot/reconstruction_error.png + :width: 60 % + :align: center + + +.. _sect-disp-accessing-images: + +Viewing and downloading images and point clouds +----------------------------------------------- + +.. index:: + pair: timestamp; image + pair: point cloud; download + +The |rc_xxx| provides time-stamped disparity, error, and confidence images over the +GenICam interface (see :ref:`sect-provided-image-streams`:latex:`, \:Section \ref{gigevision:sect-provided-image-streams}`). +Live streams of the images are provided with reduced quality on the *Depth Image* page :cubeonly:`in the desired pipeline` of the +:ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})`. + +The |webgui| also provides the possibility to download a snapshot of the current scene containing the depth, error and confidence +images, as well as a point cloud in ply format as described in +:ref:`sect-webgui-depth-snapshot`:latex:`\:(Section \ref{webgui:sect-webgui-depth-snapshot})`. + +.. _sect-disp-image-parameters: + +Parameters +---------- + +.. index:: + pair: parameters; disparity image + pair: disparity image; Web GUI + pair: depth image; Web GUI + +The stereo matching module is called ``rc_stereomatching`` in the |rest-api| and it is represented by the +*Depth Image* page :cubeonly:`in the desired pipeline` in the :ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})`. +The user can change the stereo matching parameters there, or use the |rest-api| +(:ref:`sect-rest-api`:latex:`, Section \ref{rest_api:sect-rest-api}`) or GigE Vision +(:ref:`sect-genicam`:latex:`, Section \ref{gigevision:sect-genicam}`). + +Parameter overview +^^^^^^^^^^^^^^^^^^ + +.. include:: _gen/nodes/params/rc_stereomatching.txt + +Description of run-time parameters +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Each run-time parameter is represented by a row on the |webgui|'s *Depth Image* page. The name in the +|webgui| is given in brackets behind the parameter name and the parameters are listed in the order +they appear in the |webgui|: + +.. figure:: images/webgui_depth_image.png + :width: 100 % + :align: center + + The |webgui|'s *Depth Image* page + + +.. _expl-depth-acquisition-mode: + +.. index:: + pair: disparity image; acquisition mode + +``acquisition_mode`` (*Acquisition Mode*) +''''''''''''''''''''''''''''''''''''''''' + The acquisition mode can be set to ``Continuous``, ``SingleFrame`` (*Single*) or ``SingleFrameOut1`` (*Single + Out1*). + The first one is the default, which performs stereo matching continuously according to the + user defined frame rate and the available computation resources. The two other modes + perform stereo matching upon each click of the :guilabel:`Acquire` button. The `Single + Out1` + mode additionally controls an external projector that is connected to GPIO Out1 + (:ref:`sect-iocontrol`:latex:`, Section \ref{iocontrol:sect-iocontrol}`). In this mode, + ``out1_mode`` of the IOControl module is automatically set to ``ExposureAlternateActive`` upon each trigger call + and reset to ``Low`` after receiving images for stereo matching. + + .. NOTE:: The ``Single + Out1`` mode can only change the ``out1_mode`` if the IOControl + license is available on the |rc_xxx|. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?acquisition_mode= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_stereomatching/parameters?acquisition_mode= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?acquisition_mode= + +.. _expl-depth-exposure-adapt-timeout: + +.. index:: + pair: disparity image; exposure adaptation timeout + +``exposure_adapt_timeout`` (*Exposure Adaptation Timeout*) +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + The exposure adaptation timeout gives the maximum time in seconds that the system will wait after triggering + an image acquisition until auto exposure has found the optimal exposure time. This timeout is only used + in ``SingleFrame`` (*Single*) or ``SingleFrameOut1`` (*Single + Out1*) + acquisition mode with auto exposure active. This value should be increased in applications + with changing lighting conditions, when images are under- oder overexposed and the resulting + disparity images are too sparse. In these cases multiple images are acquired until the auto-exposure + mode has adjusted or the timeout is reached, and only then the actual image acquisition is triggered. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?exposure_adapt_timeout= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_stereomatching/parameters?exposure_adapt_timeout= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?exposure_adapt_timeout= + +.. index:: + pair: quality; disparity image + +.. _expl-depth-quality: + +``quality`` (*Quality*) +''''''''''''''''''''''' + Disparity images can be computed in different resolutions: + ``Full`` (full image resolution), ``High`` (half of the full image resolution), + ``Medium`` (quarter of the full image resolution) + and ``Low`` (sixth of the full image resolution). Full resolution matching (``Full``) + is only possible with a valid StereoPlus license. The lower + the resolution, the higher the frame rate of the disparity image. Please note that the frame + rate of the disparity, confidence, and error images will always be less than or + equal to the camera frame rate. In case the projector is in ``ExposureAlternateActive`` mode, + the frame rate of the images can be at most half of the camera frame rate. + + .. only:: rc_visard + + A 25 Hz frame rate can be achieved only at the lowest resolution. + + .. only:: rc_visard_ng + + A 25 Hz frame rate can be achieved only at medium and low resolution. + + If full resolution is selected, the depth range is internally limited due to + limited on-board memory resources. It is recommended to adjust ``mindepth`` + and ``maxdepth`` to the depth range that is required by the application. + + .. only:: rc_visard + + .. tabularcolumns:: |l|L|L|L|L| + .. _tab-stereo-quality-spec: + .. csv-table:: Depth image resolutions depending on the chosen quality + + "Quality", "**Full**", "**High**", "**Medium**", "**Low**" + "Resolution (pixel)", "1280 x 960", "640 x 480", "320 x 240", "214 x 160" + + .. only:: rc_visard_ng + + .. tabularcolumns:: |l|L|L|L|L| + .. _tab-stereo-quality-spec: + .. csv-table:: Depth image resolutions depending on the chosen quality + + "Quality", "**Full**", "**High**", "**Medium**", "**Low**" + "Resolution (pixel)", "1440 x 1080", "720 x 540", "360 x 270", "240 x 180" + + .. only:: rc_cube + + .. tabularcolumns:: |l|L|L|L|L| + .. _tab-stereo-quality-spec: + .. csv-table:: Depth image resolutions (pixel) depending on the chosen quality + :header: Connected Camera, Full Quality, High Quality, Medium Quality, Low Quality + + "rc_visard", "1280 x 960", "640 x 480", "320 x 240", "214 x 160" + "rc_visard_ng", "1440 x 1080", "720 x 540", "360 x 270", "240 x 180" + "rc_viscore", "4112 x 3008", "2056 x 1504", "1028 x 752", "686 x 502" + + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?quality= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_stereomatching/parameters?quality= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?quality= + +.. index:: + pair: double_shot; disparity image + +.. _expl-depth-double-shot: + +``double_shot`` (*Double-Shot*) +''''''''''''''''''''''''''''''' + Enabling this option will lead to denser disparity images, but will increase processing time. + + For scenes recorded with a projector in ``Single + Out1`` acquisition + mode, or in continuous acquisition mode with the projector in ``ExposureAlternateActive`` mode, + holes caused by reflections of the projector are filled with depth information computed from + the images without projector pattern. In this case, the ``double_shot`` parameter must only be + enabled if the scene does not change during the acquisition of the images. + + For all other scenes, holes are filled with depth information computed from a downscaled version of the same image. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?double_shot= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_stereomatching/parameters?double_shot= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?double_shot= + +.. index:: + pair: static_scene; disparity image + +.. _expl-depth-static: + +``static_scene`` (*Static*) +''''''''''''''''''''''''''' + This option averages 8 consecutive camera images before matching. This reduces + noise, which improves the stereo matching result. However, the latency increases significantly. + The timestamp of the first + image is taken as timestamp of the disparity image. This option only affects + matching in full or high quality. It must only be enabled if the scene does not + change during the acquisition of the 8 images. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?static_scene= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_stereomatching/parameters?static_scene= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?static_scene= + +.. _expl-depth-min-depth: + +.. index:: + single: minimum distance + +``mindepth`` (*Minimum Distance*) +''''''''''''''''''''''''''''''''' + The minimum distance is the smallest distance from the camera + at which measurements should be possible. Larger values implicitly reduce the + disparity range, which also reduces the computation time. The minimum distance + is given in meters. + + Depending on the capabilities of the sensor, the actual minimum distance + can be higher than the user setting. The actual minimum distance will be + reported in the status values. + + .. only:: rc_visard or rc_visard_ng + + In ``quality`` mode ``Full``, the actual minimum distance can also be higher + than the user-defined minimum distance due to memory limitations. In this + case, lowering the maximum distance helps to reduce the actual minimum distance. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?mindepth= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_stereomatching/parameters?mindepth= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?mindepth= + +.. _expl-depth-max-depth: + +.. index:: + single: maximum distance + +``maxdepth`` (*Maximum Distance*) +''''''''''''''''''''''''''''''''' + The maximum distance is the largest distance from the camera + at which measurements should be possible. Pixels with larger distance values are + set to invalid in the disparity image. Setting this value to its maximum permits + values up to infinity. The maximum distance is given in meters. + + + .. only:: rc_visard or rc_visard_ng + + In ``quality`` mode ``Full``, the actual minimum distance can be higher + than the user-defined minimum distance due to memory limitations. In this + case, lowering the maximum distance helps to reduce the actual minimum distance. + + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?maxdepth= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_stereomatching/parameters?maxdepth= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?maxdepth= + +.. _expl-depth-smooth: + +.. index:: + pair: smooth; disparity image + +``smooth`` (*Smoothing*) +'''''''''''''''''''''''' + This option activates advanced smoothing of disparity values. It is only + available with a valid StereoPlus license. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?smooth= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_stereomatching/parameters?smooth= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?smooth= + +.. _expl-depth-fill: + +.. index:: + single: fill-in + +``fill`` (*Fill-in*) +'''''''''''''''''''' + This option is used to fill holes in the disparity image by interpolation. + The fill-in value is the maximum allowed disparity step on the border of the + hole. Larger fill-in values can decrease the number of holes, but the interpolated + values can have larger errors. At most 5% of pixels are interpolated. Interpolation + of small holes is preferred over interpolation of larger holes. The confidence for + the interpolated pixels is set to a low value of 0.5. A fill-in value of 0 + switches hole filling off. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?fill= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_stereomatching/parameters?fill= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?fill= + +.. _expl-depth-seg: + +.. index:: + single: segmentation + +``seg`` (*Segmentation*) +'''''''''''''''''''''''' + The segmentation parameter is used to set the minimum number of + pixels that a connected disparity region in the disparity image must fill. + Isolated regions that are smaller are set to invalid in the disparity image. + The value is related to the high quality disparity image with half resolution + and does not have to be scaled when a different quality + is chosen. Segmentation is useful for removing erroneous disparities. However, + larger values may also remove real objects. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?seg= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_stereomatching/parameters?seg= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?seg= + +.. _expl-depth-min-conf: + +.. index:: + single: minimum confidence + pair: confidence; minimum + +``minconf`` (*Minimum Confidence*) +'''''''''''''''''''''''''''''''''' + The minimum confidence can be set to filter potentially false disparity measurements. + All pixels with less confidence than the chosen value are set to invalid + in the disparity image. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?minconf= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_stereomatching/parameters?minconf= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?minconf= + +.. _expl-depth-max-depth-err: + +.. index:: + single: maximum depth error + pair: depth error; maximum + +``maxdeptherr`` (*Maximum Depth Error*) +''''''''''''''''''''''''''''''''''''''' + The maximum depth error is used to filter measurements + that are too inaccurate. All pixels with a larger depth error than the chosen + value are set to invalid in the disparity image. The maximum + depth error is given in meters. The depth error generally grows quadratically + with an object's distance from the camera (see :ref:`sect-confidence-error`:latex:`, Section \ref{stereo_matching:sect-confidence-error}`). + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?maxdeptherr= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_stereomatching/parameters?maxdeptherr= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?maxdeptherr= + +The same parameters are also available over the GenICam interface with slightly different names and partly with different data types +(see :ref:`sect-genicam`:latex:`, Section \ref{gigevision:sect-genicam}`). + +Status values +------------- + +This module reports the following status values: + +.. tabularcolumns:: |l|L| +.. csv-table:: The ``rc_stereomatching`` module's status values + :header: Name, Description + + "``fps``","Actual frame rate of the disparity, error, and confidence images. This value is shown in the |webgui| below the image preview as *FPS (Hz)*." + "``latency``","Time in seconds between image acquisition and publishing of disparity image" + "``width``","Current width of the disparity, error, and confidence images in pixels" + "``height``","Current height of the disparity, error, and confidence images in pixels" + "``mindepth``","Actual minimum working distance in meters" + "``maxdepth``","Actual maximum working distance in meters" + "``time_matching``","Time in seconds for performing stereo matching using |sgm-short| on the GPU" + "``time_postprocessing``","Time in seconds for postprocessing the matching result on the CPU" + "``reduced_depth_range``","Indicates whether the depth range is reduced due to computation resources" + +.. _sect-stereo-matching-services: + +Services +-------- + +The stereo matching module offers the following services. + +``acquisition_trigger`` +^^^^^^^^^^^^^^^^^^^^^^^ + + Signals the module to perform stereo matching of the next available + images, if the parameter ``acquisition_mode`` is set to ``SingleFrame`` or + ``SingleFrameOut1``. + + .. toggle-header:: + :header: **Details** + + An error is returned if the ``acquisition_mode`` is set to ``Continuous``. + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/services/acquisition_trigger + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_stereomatching/services/acquisition_trigger + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_stereomatching/services/acquisition_trigger + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_stereomatching_acquisition_trigger_request.txt + + .. tab:: **Response** + + Possible return codes are shown below. + + .. tabularcolumns:: |c|L| + .. _tab-stereo-acquisition-trigger-return-codes: + .. csv-table:: Possible return codes of the ``acquisition_trigger`` service call. + :header: Code, Description + + "0", "Success" + "-8", "Triggering is only possible in SingleFrame acquisition mode" + "101", "Trigger is ignored, because there is a trigger call pending" + "102", "Trigger is ignored, because there are no subscribers" + + .. include:: _gen/nodes/services/rc_stereomatching_acquisition_trigger_response.txt + + +``measure_depth`` +^^^^^^^^^^^^^^^^^ + + Computes the average, minimum and maximum depth in a given region of interest, which can optionally be subdivided into cells. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/services/measure_depth + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_stereomatching/services/measure_depth + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_stereomatching/services/measure_depth + + .. tabs:: + + .. tab:: **Request** + + Optional arguments: + + ``region_of_interest_2d_id`` is the ID of the 2D region of interest (see :ref:`sect-roi`:latex:`, Section \ref{roi:sect-roi}`) + that will be used for the depth measurements. + + ``region_of_interest_2d`` is an alternative on-the-fly definition of the region of interest for the depth measurements. + This region of interest will be ignored if a ``region_of_interest_2d_id`` is given. The region of interest is always defined + on the camera image with full resolution, where ``offset_x`` and ``offset_y`` are the pixel coordinates of the upper left corner + of the rectangular region of interest, and ``width`` and ``height`` are the width and height of it in pixels. + Default is a region of interest covering the whole image. + + ``cell_count`` is the number of cells in x and y direction into which the region of interest is divided. + If not given, a cell count of 0, 0 is assumed and only the overall values will be computed. The total cell count + computed as product of the x and y values must not exceed 100. + + ``data_acquisition_mode``: if set to ``CAPTURE_NEW`` (default), a new image dataset will be used for the measurement. + If set to ``USE_LAST``, the previous dataset will be used for the measurement. + + ``pose_frame`` controls whether the coordinates of the depth measurement are + returned in the ``camera`` or ``external`` frame, if a hand-eye calibration is available (see + :ref:`sect-handeye-calibration`:latex:`, Section \ref{handeye_calibration:sect-handeye-calibration}`). + The default is ``camera``. + + + Potentially required arguments: + + ``robot_pose`` is the pose of the robot at the time of the depth measurement. It is required when the external + pose frame is used and the camera is robot mounted. + + + .. include:: _gen/nodes/services/rc_stereomatching_measure_depth_request.txt + + .. tab:: **Response** + + .. tabularcolumns:: |c|L| + .. csv-table:: ``return_code`` values of the ``measure_depth`` service call + :header: "``value``", "Description" + + "0", "measurement successful" + "-1", "an invalid argument was given" + + ``cells`` contains the depth measurements of all requested cells. The cells are always ordered from left to right and top + to bottom in image coordinates. + + ``overall`` contains the depth measurements of the full region of interest. + + ``coverage`` is a number between 0 and 1 which reflects the fraction of valid depth measurements inside the respective cell. + A coverage of 0 means that the cell is invalid. + + ``min_z`` and ``max_z`` return the 3D coordinate of the point in the cell with the minimum and maximum depth value, respectively. + The depth value is the z coordinate in the camera coordinate system. + + For ``mean_z``, the x and y coordinates define the point in the middle of the cell and the z coordinate is determined by the + average of all depth value measurements in the cell. + + ``region_of_interest_2d`` returns the definition of the requested region of interest for the depth measurement. + + If ``pose_frame`` is ``external``, then the x, y and z coordinates are returned in the robot coordinate system. + + .. include:: _gen/nodes/services/rc_stereomatching_measure_depth_response.txt + +``reset_defaults`` +^^^^^^^^^^^^^^^^^^ + + Restores and applies the default values for this module's parameters + ("factory reset"). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/services/reset_defaults + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_stereomatching/services/reset_defaults + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_stereomatching/services/reset_defaults + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_stereomatching_reset_defaults_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_stereomatching_reset_defaults_response.txt + diff --git a/v24.04/de/_raw_sources/tagdetect.rst.txt b/v24.04/de/_raw_sources/tagdetect.rst.txt new file mode 100644 index 0000000..6fac6d2 --- /dev/null +++ b/v24.04/de/_raw_sources/tagdetect.rst.txt @@ -0,0 +1,988 @@ +.. include:: global_rst.glb + +.. _sect-tag-detection: + +TagDetect +========= + +.. index:: ! tag detection + single: detection; tag + +Introduction +------------ + +The TagDetect modules are optional on-board modules of the |rc_xxx| and require +separate :ref:`licenses` +:latex:`(Section \ref{maintenance:sect-updating-license})` to be purchased. The licenses +are included in every |rc_xxx| purchased after 01.07.2020. + +The TagDetect modules run on board the |rc_xxx| and allow the detection of 2D matrix codes and tags. +Currently, there are TagDetect modules for `QR codes` and `AprilTags`. +The modules, furthermore, compute the position and orientation of each tag +in the 3D camera coordinate system, making it simple to manipulate a tag +with a robot or to localize the camera with respect to a tag. + +.. only:: rc_cube and (roboception or schunk or basler) + + .. note:: These modules are not available in ``blaze`` camera pipelines. + +.. only:: rc_cube + + .. note:: + + These modules are pipeline specific. Changes to their settings or parameters only affect + the respective camera pipeline and have no influence on other pipelines running on the |rc_cube|. + +Tag detection is made up of three steps: + +1. Tag reading on the 2D image pair (see :ref:`sect-tag-reading`:latex:`, Section \ref{tagdetect:sect-tag-reading}`). +2. Estimation of the pose of each tag (see :ref:`sect-tag-pose-estimation`:latex:`, Section \ref{tagdetect:sect-tag-pose-estimation}`). +3. Re-identification of previously seen tags (see :ref:`sect-tag-re-identification`:latex:`, Section \ref{tagdetect:sect-tag-re-identification}`). + +In the following, the two supported tag types are described, followed +by a comparison. + +QR code +^^^^^^^ + +.. index:: ! QR code + +.. figure:: images/example_qr_code.png + :width: 200 px + :align: center + + Sample QR code + +QR codes are two-dimensional matrix codes that contain arbitrary user-defined data. +There is wide support for decoding of QR codes on commodity hardware +such as smartphones. +Also, many online and offline tools are available for the generation of such codes. + +The "pixels" of a QR code are called `modules`. +Appearance and resolution of QR codes change with the amount +of data they contain. +While the special patterns in the three corners are always 7 modules +wide, the number of modules between them increases the +more data is stored. +The lowest-resolution QR code is of size 21x21 modules and can contain +up to 152 bits. + +Even though many QR code generation tools support generation of +specially designed QR codes (e.g., containing a logo, having round +corners, or having dots as modules), a reliable detection of these tags by +the |rc_xxx|'s TagDetect module is not guaranteed. +The same holds for QR codes which contain characters that are not part +of regular ASCII. + +.. _sect-apriltag: + +AprilTag +^^^^^^^^ + +.. index:: ! AprilTag + single: tag detection; families + +.. _fig-april-tag-example: +.. figure:: images/apriltag_dim_vis.png + :width: 100% + :align: center + + A 16h5 tag (left), a 36h11 tag (center) and a 41h12 tag (right). + AprilTags consist of a mandatory white (a) and black (b) border and + a variable amount of data bits (c). + +AprilTags are similar to QR codes. +However, they are specifically designed for robust identification at +large distances. +As for QR codes, we will call the tag pixels `modules`. +:numref:`fig-april-tag-example` shows how AprilTags are structured. +They have a mandatory white and black border, each one module +wide. The tag families 16h5, 25h9, 36h10 and 36h11 are surrounded by +this border and carry a variable amount of data modules in the center. +For tag family 41h12, the black and white border is shifted towards +the inside and the data modules are in the center and also at the border of the tags. +Other than QR codes, AprilTags do not contain any user-defined information but +are identified by a predefined *family* and *ID*. +The tags in +:numref:`fig-april-tag-example` +for example are of family 16h5, 36h11 and 41h12 have id 0, 11 and 0, respectively. +All supported families are shown in +:numref:`tab-tag-families`. + +.. tabularcolumns:: |l|l|l| + +.. _tab-tag-families: + +.. table:: AprilTag families + + ====== ================= =========== + Family Number of tag IDs Recommended + ====== ================= =========== + 16h5 30 \- + 25h9 35 o + 36h10 2320 o + 36h11 587 \+ + 41h12 2115 \+ + ====== ================= =========== + +For each family, the number before the "h" states the number of data +modules contained in the tag: +While a 16h5 tag contains 16 (4x4) data modules +((c) in :numref:`fig-april-tag-example`), +a 36h11 tag contains 36 (6x6) modules and a 41h12 tag contains 41 (3x3 inner + 4x8 outer) modules. +The number behind the "h" refers to the Hamming distance between two tags of +the same family. +The higher, the more robust is the detection, but the fewer individual tag +IDs are available for the same number of data modules (see +:numref:`tab-tag-families`). + +The advantage of fewer modules (as for 16h5 compared to 36h11) is +the lower resolution of the tag. +Hence, each tag module is larger and the tag therefore can be detected +from a larger distance. +This, however, comes at a price: +Firstly, fewer data modules lead to fewer individual tag IDs. +Secondly, and more importantly, detection robustness is significantly +reduced due to a higher false positive rate; i.e, tags are mixed up +or nonexistent tags are detected in random image texture or noise. +The 41h12 family has its border shifted towards the inside, which gives +it more data modules at a lower number of total modules compared to the +36h11 family. + +For these reasons we recommend using the 41h12 and 36h11 families and highly +discourage the use of the 16h5 family. +The latter family should only be used if a large detection distance +really is necessary for an application. +However, the maximum detection distance increases only by approximately 25% +when using a 16h5 tag instead of a 36h11 tag. + +Pre-generated AprilTags can be downloaded at the +AprilTag project website (https://april.eecs.umich.edu/software/apriltag.html). +There, each family consists of multiple PNGs containing single +tags. +Each pixel in the PNGs corresponds to one AprilTag module. +When printing the tags of the families 36h11, 36h10, 25h9 and 16h5 special care must be taken to also include the +white border around the tag that is contained in the PNG (see (a) in :numref:`fig-april-tag-example`). +Moreover, all tags should be scaled to the desired printing size +without any interpolation, so that the sharp edges are preserved. + +Comparison +^^^^^^^^^^ + +Both QR codes and AprilTags have their up and down sides. +While QR codes allow arbitrary user-defined data to be stored, +AprilTags have a pre-defined and limited set of tags. +On the other hand, AprilTags have a lower resolution and can therefore +be detected at larger distances. +Moreover, the continuous white to black border in AprilTags allow for +more precise pose estimation. + +.. Note:: + + If user-defined data is not required, AprilTags should be preferred over QR codes. + +.. _sect-tag-reading: + +Tag reading +----------- + +The first step in the tag detection pipeline is reading the tags on the +2D image pair. +This step takes most of the processing time and its precision is crucial +for the precision of the resulting tag pose. +To control the speed of this step, the ``quality`` parameter +can be set by the user. +It results in a downscaling of the image pair before reading the tags. +``High`` yields the largest maximum detection distance and highest +precision, but also the highest processing time. +``Low`` results in the smallest maximum detection distance and +lowest precision, but processing requires less than half of the time. +``Medium`` lies in between. +Please note that this quality parameter has no relation to the quality +parameter of +:ref:`sect-stereo-matching`:latex:`\:(Section \ref{stereo_matching:sect-stereo-matching})`. + +.. _fig-tag-sizes: +.. figure:: images/tag_sizes_vis.png + :width: 100% + :align: center + + Visualization of module size :math:`s`, size of a tag in + modules :math:`r`, and size of a tag in meters :math:`t` + for AprilTags (left and center) and QR codes (right) + +The maximum detection distance :math:`z` at quality ``High`` can be +approximated by using the following formulae, + +.. math:: + z = \frac{f s}{p}, + +.. math:: + s = \frac{t}{r}, + +where :math:`f` is the +:ref:`focal length`:latex:`\:(Section \ref{stereo_camera:sect-stereo-camera-rectification})` +in pixels and :math:`s` is the size +of a module in meters. +:math:`s` can easily be calculated by the latter formula, where :math:`t` +is the size of the tag in meters and :math:`r` is the width of the +code in modules (for AprilTags without the white border). +:numref:`fig-tag-sizes` visualizes these variables. +:math:`p` denotes the number of image pixels per module required +for detection. +It is different for QR codes and AprilTags. +Moreover, it varies with the tag's angle to the camera and illumination. +Approximate values for robust detection are: + +* AprilTag: :math:`p=5` pixels/module +* QR code: :math:`p=6` pixels/module + +The following tables give sample maximum distances for +different situations, assuming a focal length of +1075 pixels and the parameter ``quality`` to be set to ``High``. + +.. tabularcolumns:: |l|l|l|l| + +.. _tab-tag-max-dist-april: + +.. table:: Maximum detection distance examples for AprilTags with a width + of :math:`t=4` cm + + =================== ================= ================ + AprilTag family Tag width Maximum distance + =================== ================= ================ + 36h11 (recommended) 8 modules 1.1 m + 16h5 6 modules 1.4 m + 41h12 (recommended) 5 modules 1.7 m + =================== ================= ================ + +.. tabularcolumns:: |l|l|l|l| + +.. _tab-tag-max-dist-qr: + +.. table:: Maximum detection distance examples for QR codes with a width + of :math:`t=8` cm + + ================= ================ + Tag width Maximum distance + ================= ================ + 29 modules 0.49 m + 21 modules 0.70 m + ================= ================ + +.. _sect-tag-pose-estimation: + +Pose estimation +--------------- + +.. index:: + single: tag detection; pose estimation + pair: AprilTag; pose estimation + pair: QR code; pose estimation + +For each detected tag, the pose of this tag in the camera coordinate +frame is estimated. +A requirement for pose estimation is that a tag is fully visible in +the left and right camera image. +The coordinate frame of the tag is aligned as shown below. + +.. _fig-tag-coord-frames: +.. figure:: images/tag_coord_frames.png + :width: 100% + :align: center + + Coordinate frames of AprilTags (left and center) and QR codes (right) + +The z-axis is pointing "into" the tag. +Please note that for AprilTags, although having the white border included +in their definition, the coordinate system's origin is placed exactly at the +transition from the white to the black border. +Since AprilTags do not have an obvious orientation, the origin is +defined as the upper left corner in the orientation they are pre-generated in. + +During pose estimation, the tag's size is also estimated, while +assuming the tag to be square. +For QR codes, the size covers the full tag. +For AprilTags, the size covers only the part inside the border defined by the +transition from the black to the white border modules, +hence ignoring the outermost white border for the tag families 16h5, 25h9, 36h10 and 36h11. + +The user can also specify the approximate size (:math:`\pm 10\%`) of tags. +All tags not matching this size constraint are automatically filtered out. +This information is further used to resolve ambiguities in pose estimation +that may arise if multiple tags with the same ID are visible in the left +and right image and these tags are aligned in parallel to the image rows. + + +.. Note:: + + For best pose estimation results one should make sure to accurately print + the tag and to attach it to a rigid and as planar as possible surface. + Any distortion of the tag or bump in the surface will degrade the + estimated pose. + +.. Note:: + + It is highly recommended to set the approximate size of a tag. + Otherwise, if multiple tags with the same ID are visible in the left or right + image, pose estimation may compute a wrong pose if these tags have the + same orientation and are approximately aligned in parallel to the image + rows. + However, even if the approximate size is not given, the TagDetect modules + try to detect such situations and filter out affected tags. + +Below tables give approximate precisions of the estimated poses of AprilTags. +We distinguish between lateral precision (i.e., in x and y direction) and +precision in z direction. +It is assumed that ``quality`` is set to ``High``, that the camera's +viewing direction is parallel to the tag's normal and that the images are well exposed +and do not suffer from motion blur. +The size of a tag does not have a significant effect on the lateral or z +precision; however, in general, larger tags improve precision. +With respect to precision of the orientation especially around the x and y +axes, larger tags clearly outperform smaller ones. + +.. only:: rc_visard or rc_cube + + .. tabularcolumns:: |l|l|l|l|l| + + .. _tab-tag-precision-april: + + .. table:: Approximate position precision for AprilTag detections with ``High`` quality in an ideal scenario for different base lines + + ======== ======================== ================== ========================= =================== + Distance |rc_visard| 65 - lateral |rc_visard| 65 - z |rc_visard| 160 - lateral |rc_visard| 160 - z + ======== ======================== ================== ========================= =================== + 0.5 m 0.05 mm 0.5 mm 0.05 mm 0.3 mm + 1.0 m 0.15 mm 1.8 mm 0.15 mm 1.4 mm + 2.0 m 1.5 mm 14.5 mm 0.5 mm 3.7 mm + ======== ======================== ================== ========================= =================== + +.. only:: rc_visard_ng + + .. tabularcolumns:: |l|l|l|l|l| + + .. _tab-tag-precision-april: + + .. table:: Approximate position precision for AprilTag detections with ``High`` quality in an ideal scenario + + ======== ========================= =================== + Distance |rc_xxx| 160 - lateral |rc_xxx| 160 - z + ======== ========================= =================== + 0.5 m 0.05 mm 0.3 mm + 1.0 m 0.15 mm 1.4 mm + 2.0 m 0.5 mm 3.7 mm + ======== ========================= =================== + + +.. tabularcolumns:: |l|l|l|l|l| + +.. _tab-tag-precision-rotation-april: + +.. table:: Approximate orientation precision for AprilTag detections with ``High`` quality in an ideal scenario for different tag sizes + + ======== ======================== ================== + Distance 60 x 60 mm 120 x 120 mm + ======== ======================== ================== + 0.5 m 0.2° -- + 1.0 m 0.8° 0.3° + 2.0 m 2.0° 0.8° + 3.0 m -- 1.8° + ======== ======================== ================== + +.. .. tabularcolumns:: |l|l|l|l|l| + +.. .. _tab-tag-precision-qr: + +.. .. table:: Approximate pose precision for QR codes + +.. ======== ======================== ================== ========================= =================== +.. Distance |rc_visard| 65 - lateral |rc_visard| 65 - z |rc_visard| 160 - lateral |rc_visard| 160 - z +.. ======== ======================== ================== ========================= =================== +.. 0.3 m 0.6 mm 2.0 mm 0.6 mm 1.3 mm +.. 1.0 m 2.6 mm 15 mm 2.6 mm 7.9 mm +.. ======== ======================== ================== ========================= =================== + +.. _sect-tag-re-identification: + +Tag re-identification +--------------------- + +.. index:: + single: tag detection; re-identification + pair: AprilTag; re-identification + pair: QR code; re-identification + +Each tag has an ID; for AprilTags it is the *family* plus *tag ID*, for +QR codes it is the contained data. +However, these IDs are not unique, since the same tag may appear multiple times +in a scene. + +For distinction of these tags, the TagDetect modules also assign +each detected tag a unique identifier. +To help the user identifying an identical tag over multiple detections, +tag detection tries to re-identify tags; +if successful, a tag is assigned the same unique identifier again. + +.. only:: rc_visard + + Tag re-identification compares the positions of the + corners of the tags in a static coordinate frame to find identical tags. + Tags are assumed identical if they did not or only slightly move in + that static coordinate frame. + For that static coordinate frame to be available, :ref:`dynamic-state estimation`:latex:`\:(Section \ref{dynamics:sect-dynamics})` + must be switched on. + If it is not, the sensor is assumed to be static; tag re-identification + will then not work across sensor movements. + +.. only:: rc_cube or rc_visard_ng + + Tag re-identification compares the positions of the + corners of the tags in the camera coordinate frame to find identical tags. + Tags are assumed identical if they did not or only slightly move in + that frame. + +By setting the ``max_corner_distance`` +threshold, the user can specify how much a tag is allowed move in the static +coordinate frame between two detections to be considered identical. +This parameter defines the maximum distance between the corners of +two tags, which is shown in +:numref:`fig-tag-re-identification`. +The Euclidean distances of all four corresponding tag corners are computed in 3D. +If none of these distances exceeds the threshold, the tags are +considered identical. + +.. _fig-tag-re-identification: +.. figure:: images/tag-re-identification.png + :width: 70% + :align: center + + Simplified visualization of tag re-identification. + Euclidean distances between associated tag corners in 3D are compared + (red arrows). + +After a number of tag detection runs, previously detected tag instances +will be discarded if they are not detected in the meantime. +This can be configured by the parameter ``forget_after_n_detections``. + +.. _sect-tag-hand-eye-calib: + +Hand-eye calibration +-------------------- + +In case the camera has been calibrated to a robot, the TagDetect module +can automatically provide poses in the robot coordinate frame. +For the TagDetect node's :ref:`sect-tag-services`:latex:`\:(Section \ref{tagdetect:sect-tag-services})`, the frame of the +output poses can be controlled with the ``pose_frame`` argument. + +Two different ``pose_frame`` values can be chosen: + +1. **Camera frame** (``camera``). + All poses provided by the module are in the camera frame. + +2. **External frame** (``external``). + All poses provided by the module are in the external frame, + configured by the user during the hand-eye calibration process. + The module relies on the on-board + :doc:`Hand-eye calibration module`:latex:`\:(Section \ref{handeye_calibration:sect-handeye-calibration})` + to retrieve the sensor mounting (static or robot mounted) and + the hand-eye transformation. + If the sensor mounting is static, no further information is needed. + If the sensor is robot-mounted, the ``robot_pose`` is required + to transform poses to and from the ``external`` frame. + +All ``pose_frame`` values that are not ``camera`` or ``external`` are rejected. + +.. _sect-tag-parameters: + +Parameters +---------- + +There are two separate modules available for tag detection, +one for detecting AprilTags and one for QR codes, named +``rc_april_tag_detect`` and ``rc_qr_code_detect``, respectively. +Apart from the module names they share the same interface definition. + +In addition to the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`, the TagDetect modules provide pages +on the |webgui| :cubeonly:`in the desired pipeline` under +:menuselection:`Modules --> AprilTag` and :menuselection:`Modules --> QR Code`, +on which they can be tried out and configured manually. + +In the following, the parameters are listed based on the +example of ``rc_qr_code_detect``. They are the same for +``rc_april_tag_detect``. + +.. include:: _gen/nodes/params/rc_qr_code_detect.txt + +Via the |restapi|, these parameters can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes//parameters/parameters?= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//parameters?= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//parameters?= + +.. _sect-tag-status-values: + +Status values +------------- + +The TagDetect modules reports the following status values: + +.. tabularcolumns:: |l|L| +.. csv-table:: The ``rc_qr_code_detect`` and ``rc_april_tag_detect`` module's status values + :header: Name, Description + + "``data_acquisition_time``","Time in seconds required to acquire image pair" + "``last_timestamp_processed``","The timestamp of the last processed image pair" + "``processing_time``","Processing time of the last detection in seconds" + "``state``","The current state of the node" + +The reported ``state`` can take one of the following values. + +.. tabularcolumns:: |l|l| +.. _tab-rc-tag-detection-states: +.. csv-table:: Possible states of the TagDetect modules + :header: State name, Description + + "IDLE", "The module is idle." + "RUNNING", "The module is running and ready for tag detection." + "FATAL", "A fatal error has occurred." + +.. _sect-tag-services: + +Services +-------- + +.. index:: + pair: tag detection; services + pair: AprilTag; services + pair: QR code; services + +The TagDetect modules implement a state machine for starting and stopping. +The actual tag detection can be triggered via ``detect``. + +The user can explore and call the ``rc_qr_code_detect`` and ``rc_april_tag_detect`` modules' services, +e.g. for development and testing, using the +:doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` or +the |rc_xxx| +:ref:`sect-web-gui`:latex:`\:(Section \ref{webgui:sect-web-gui})`. + +.. _expl-tag-srv-detect: + +``detect`` +^^^^^^^^^^ + + Triggers a tag detection. + + .. toggle-header:: + :header: **Details** + + Depending on the ``use_cached_images`` parameter, the module will use + the latest received image pair (if set to true) or wait for a new pair + that is captured after the service call was triggered (if set to false, + this is the default). + Even if set to true, tag detection will never use one image pair twice. + + It is recommended to call ``detect`` in state ``RUNNING`` only. + It is also possible to be called in state ``IDLE``, resulting in an + auto-start and stop of the module. + This, however, has some drawbacks: + First, the call will take considerably longer; + second, tag re-identification will not work. + It is therefore highly recommended to manually start the module + before calling ``detect``. + + Tags might be omitted from the ``detect`` response due to several + reasons, e.g., if a tag is visible in only one of the cameras or if + pose estimation did not succeed. + These filtered-out tags are noted in the log, which can be accessed as + described in + :ref:`sect-downloading-log-files`:latex:`\:(Section \ref{maintenance:sect-downloading-log-files})`. + + A visualization of the latest detection is shown on the |webgui| tabs + of the TagDetect modules. Please note that this visualization + will only be shown after calling the detection service at least once. + On the |webgui|, one can also manually try the detection by clicking the + :guilabel:`Detect` button. + + Due to changes in system time on the |rc_xxx| there might occur jumps + of timestamps, forward as well as backward (see :ref:`sect-time-sync`:latex:`, Section \ref{time_sync:sect-time-sync}`). + Forward jumps do not have an effect on the TagDetect module. + Backward jumps, however, invalidate already received images. + Therefore, in case a backwards time jump is detected, an error of + value -102 will be issued on the next ``detect`` call, also to inform + the user that the timestamps included in the response will jump back. + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes//services/detect + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//services/detect + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//services/detect + + .. tabs:: + + .. tab:: **Request** + + Optional arguments: + + ``tags`` is the list of tag IDs that the TagDetect module should detect. + For QR codes, the ID is the contained data. + For AprilTags, it is `"_"`, so, e.g., for a tag of + family 36h11 and ID 5, it is `"36h11_5"`. + Naturally, the AprilTag module can only be triggered for AprilTags, and + the QR code module only for QR codes. + + The ``tags`` list can also be left empty. + In that case, all detected tags will be returned. + This feature should be used only during development and debugging + of an application. + Whenever possible, the concrete tag IDs should be listed, on the one + hand avoiding some false positives, on the other hand speeding up tag + detection by filtering tags not of interest. + + For AprilTags, the user can not only specify concrete tags but also + a complete family by setting the ID to "", so, e.g., "36h11". + All tags of this family will then be detected. It is further possible + to specify multiple complete tag families or a combination of + concrete tags and complete tag families; for instance, triggering for + "36h11", "25h9_3", and "36h10" at the same time. + + In addition to the ID, the approximate size (:math:`\pm 10\%`) of a tag + can be set with the ``size`` parameter. + As described in + :ref:`sect-tag-pose-estimation`:latex:`\:(Section \ref{tagdetect:sect-tag-pose-estimation})`, + this information helps to resolve ambiguities in pose estimation that may + arise in certain situations and can be used to filter out tags not fulfilling + the given size constraint. + + The ``tags`` list is OR-connected. All tags will be returned that + match any of ``id``-``size`` pair elements in the ``tags`` list. + + ``pose_frame`` controls whether the poses of the detected tags are + returned in the camera or external frame, + as detailed in + :ref:`sect-tag-hand-eye-calib`:latex:`\:(Section \ref{tagdetect:sect-tag-hand-eye-calib})`. + The default is ``camera``. + + .. include:: _gen/nodes/services/rc_qr_code_detect_detect_request.txt + + .. tab:: **Response** + + ``timestamp`` is set to the timestamp of the image pair the tag + detection ran on. + + ``tags`` contains all detected tags. + + ``id`` is the ID of the tag, similar to ``id`` in the request. + + ``instance_id`` is the random unique identifier of the tag + assigned by tag re-identification. + + ``pose`` contains ``position`` and ``orientation``. + The orientation is in quaternion format. + + ``pose_frame`` is set to the coordinate frame above pose refers to. + It will either be "camera" or "external". + + ``size`` will be set to the estimated tag size in meters. + + ``return_code`` holds possible warnings or error codes. + + .. include:: _gen/nodes/services/rc_qr_code_detect_detect_response.txt + +.. _expl-tag-srv-start: + +``start`` +^^^^^^^^^ + + Starts the module by transitioning from ``IDLE`` to ``RUNNING``. + + .. toggle-header:: + :header: **Details** + + When running, the module receives images from the stereo camera and is + ready to perform tag detections. + To save computing resources, the + module should only be running when necessary. + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes//services/start + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//services/start + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//services/start + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_qr_code_detect_start_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_qr_code_detect_start_response.txt + +.. _expl-tag-srv-stop: + +``stop`` +^^^^^^^^ + + Stops the module by transitioning to ``IDLE``. + + .. toggle-header:: + :header: **Details** + + This transition can be performed from state ``RUNNING`` and ``FATAL``. + All tag re-identification information is cleared during stopping. + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes//services/stop + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//services/stop + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//services/stop + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_qr_code_detect_stop_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_qr_code_detect_stop_response.txt + +.. _expl-tag-srv-restart: + +``restart`` +^^^^^^^^^^^ + + Restarts the module. + + .. toggle-header:: + :header: **Details** + + If in ``RUNNING`` or ``FATAL``, the module will be stopped and then started. + If in ``IDLE``, the module will be started. + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes//services/restart + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//services/restart + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//services/restart + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_qr_code_detect_restart_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_qr_code_detect_restart_response.txt + +.. only:: rc_cube + + + ``trigger_dump`` + ^^^^^^^^^^^^^^^^ + Triggers dumping of the detection that corresponds to the given timestamp, + or the latest detection, if no timestamp is given. The dumps are saved to the + connected USB drive. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//services/trigger_dump + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//services/trigger_dump + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_april_tag_detect_trigger_dump_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_april_tag_detect_trigger_dump_response.txt + +.. _expl-tag-srv-reset-params: + +``reset_defaults`` +^^^^^^^^^^^^^^^^^^ + + Resets all parameters of the module to its default values, + as listed in above table. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes//services/reset_defaults + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//services/reset_defaults + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//services/reset_defaults + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_qr_code_detect_reset_defaults_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_qr_code_detect_reset_defaults_response.txt + + +.. _sect-tag-return-codes: + +Return codes +------------ + +.. index:: + pair: AprilTag; return codes + pair: QR Code; return codes + + +Each service response contains a ``return_code``, +which consists of a ``value`` plus an optional ``message``. +A successful service returns with a ``return_code`` value of ``0``. +Negative ``return_code`` values indicate that the service failed. +Positive ``return_code`` values indicate that the service succeeded with additional information. +The smaller value is selected in case a service has multiple ``return_code`` values, +but all messages are appended in the ``return_code`` message. + +The following table contains a list of common return codes: + + ==== =========== + Code Description + ==== =========== + 0 Success + -1 An invalid argument was provided + -4 A timeout occurred while waiting for the image pair + -9 The license is not valid + -11 Sensor not connected, not supported or not ready + -101 Internal error during tag detection + -102 There was a backwards jump of system time + -103 Internal error during tag pose estimation + -200 A fatal internal error occurred + 200 Multiple warnings occurred; see list in ``message`` + 201 The module was not in state ``RUNNING`` + ==== =========== diff --git a/v24.04/de/_raw_sources/time_sync.rst.txt b/v24.04/de/_raw_sources/time_sync.rst.txt new file mode 100644 index 0000000..93f9bd5 --- /dev/null +++ b/v24.04/de/_raw_sources/time_sync.rst.txt @@ -0,0 +1,93 @@ +.. include:: global_rst.glb + +.. _sect-time-sync: + +Time synchronization +==================== + +.. index:: + pair: time; synchronization + +The |rc_xxx| provides timestamps with all images and messages. +To compare these with the time on the application host, the time needs to be properly synchronized. + +.. only:: rc_visard or rc_visard_ng + + This can be done either via the Network Time Protocol (NTP), which is the default, or the Precision Time + Protocol (PTP). + + .. only:: rc_visard + + .. Note:: The |rc_visard| does not have a backup battery for its real time clock and hence does not retain time across power cycles. + The system time starts at the last saved time (saved on reboot and every 15 minutes) at power up and is then automatically set via + NTP if a server can be found. + +.. only:: rc_cube + + The time synchronization between the |rc_xxx| and the application host can be done via the + Network Time Protocol (NTP), which is activated by default. + + Internal time synchronization between the |rc_xxx| and the connected camera is automatically done via + the Precision Time Protocol (PTP). + +The current system time as well as time synchronization status can be queried via +:doc:`REST-API`:latex:`\:(Section \ref{rest_api:sect-rest-api})` and seen on the +:ref:`Web GUI`'s :latex:`(Section \ref{webgui:sect-web-gui})` *System* page. + +.. Note:: Depending on the reachability of NTP servers or PTP masters it might take up to several minutes until the time is synchronized. + +.. _sect-ntp: + +NTP +--- + +.. index:: + pair: NTP; synchronization + +The Network Time Protocol (NTP) is a TCP/IP protocol for synchronizing time over a network. +A client periodically requests the current time from a server, and uses it to set and correct +its own clock. + +By default the |rc_xxx| tries to reach NTP servers from the NTP Pool Project, +which will work if the |rc_xxx| has access to the internet. + +If the |rc_xxx| is configured for :ref:`DHCP`:latex:`\ (Section \ref{installation:sect-auto-network-configuration})` +(which is the default setting), it will also request NTP servers from the DHCP server and try to +use those. + +.. _sect-ptp: + +PTP +--- + +.. index:: + pair: PTP; synchronization + +The Precision Time Protocol (PTP, also known as IEEE1588) is a protocol which offers more precise and robust clock synchronization than with NTP. + +.. only:: rc_visard or rc_visard_ng + + The |rc_visard| can be configured to act as a PTP slave via the standard :doc:`GigE Vision 2.0/GenICam interface`:latex:`\:(Section \ref{gigevision:sect-genicam})` using the ``GevIEEE1588`` parameter. + + At least one PTP master providing time has to be running in the network. + On Linux the respective command for starting a PTP master on ethernet port ``eth0`` is, e.g., ``sudo ptpd --masteronly --foreground -i eth0``. + + While the |rc_visard| is synchronized with a PTP master (|rc_visard| in PTP status SLAVE), the NTP synchronization is paused. + +.. only:: rc_cube + + .. Note:: Currently, time synchronization between the application host and the |rc_xxx| is not implemented. + Please use NTP instead. + +.. _sect-ptp: + +Setting time manually +--------------------- + +.. index:: + pair: time; set + +The |rc_xxx| allows to set the current date and time manually using the |restapi|'s **/system/time** endpoint, +if no time synchronization is active (see :doc:`rest_api_syslogs`:latex:`, Section \ref{rest_api_syslogs:sect-rest-api-syslogs}`). +A more convenient way is setting the system time on the :ref:`Web GUI`'s :latex:`(Section \ref{webgui:sect-web-gui})` *System* page. + diff --git a/v24.04/de/_raw_sources/troubleshooting.rst.txt b/v24.04/de/_raw_sources/troubleshooting.rst.txt new file mode 100644 index 0000000..4f40246 --- /dev/null +++ b/v24.04/de/_raw_sources/troubleshooting.rst.txt @@ -0,0 +1,343 @@ +.. include:: global_rst.glb + + +.. _sect-troubleshooting: + +Troubleshooting +=============== + + +.. only:: rc_visard or rc_visard_ng + + .. _sect-led-colors: + + LED colors + ---------- + + .. index:: + single: LED; colors + + During the boot process, the LED will change color several times to indicate stages in the boot process: + + .. only:: rc_visard + + .. _tab-led-color: + + .. table:: LED color codes + + +----------+----------------------------------+ + |LED color | Boot stage | + +==========+==================================+ + | white | power supply OK | + +----------+----------------------------------+ + | yellow | | + +----------+ + + | purple | normal boot process in progress | + +----------+ + + | blue | | + +----------+----------------------------------+ + | green | boot complete, |rc_xxx| ready | + +----------+----------------------------------+ + + The LED will signal some warning or error states to support the user during troubleshooting. + + .. _tab-led-error: + + .. table:: LED color trouble codes + + ============================================== =================================================== + LED color Warning or error state + ============================================== =================================================== + off no power to the sensor + brief red flash every 5 seconds no network connectivity + red while sensor appears to function normally high-temperature warning (case has exceeded 60 °C) + red while case is below 60 °C Some process has terminated and failed to restart. + ============================================== =================================================== + + .. only:: rc_visard_ng + + .. _tab-led-color: + + .. table:: LED color codes + + +----------+----------------------------------+ + |LED color | Boot stage | + +==========+==================================+ + | white | power supply OK | + +----------+----------------------------------+ + | blue | normal boot process in progress | + +----------+----------------------------------+ + | green | boot complete, |rc_xxx| ready | + +----------+----------------------------------+ + + + The LED will signal some warning or error states to support the user during troubleshooting. + + .. _tab-led-error: + + .. table:: LED color trouble codes + + ============================================== =================================================== + LED color Warning or error state + ============================================== =================================================== + off no power to the sensor + brief red flash every 5 seconds no network connectivity + red Some process has terminated and failed to restart. + yellow high-temperature warning (case has exceeded 60 °C) + ============================================== =================================================== + + Hardware issues + --------------- + + **LED does not illuminate** + + The |rc_xxx| does not start up. + + - Ensure that cables are connected and secured properly. + - Ensure that adequate DC voltage (18 V to 30 V) with correct polarity is applied to the + power connector at the pins labeled as **Power** and **Ground** as described in + the device's :ref:`pin assignment specification`:latex:`\:(Section \ref{hardware_spec:tab-power-pin-assignments})`. + Connecting the sensor to voltage outside of the specified range, to alternating current, + with reversed polarity, or to a supply with voltage spikes will lead to permanent hardware damage. + + .. only:: rc_visard + + **LED turns red while the sensor appears to function normally** + + .. only:: rc_visard_ng + + **LED turns yellow while the sensor appears to function normally** + + This may indicate a high housing temperature. The sensor might be mounted in a position that + obstructs free airflow around the cooling fins. + + - Clean cooling fins and housing. + - Ensure a minimum of 10 cm free space in all directions around cooling fins to provide adequate convective cooling. + - Ensure that ambient temperature is within specified range. + + The sensor may slow down processing when cooling is insufficient or the ambient temperature exceeds the specified range. + + **Reliability issues and/or mechanical damage** + + This may be an indication of ambient conditions (vibration, shock, resonance, and temperature) being outside + of specified range. Please refer to the :ref:`specification of environmental conditions`:latex:`\ (Section \ref{hardware_spec:tab-hardware-environment})`. + + - Operating the |rc_xxx| outside of specified ambient conditions might lead to damage and will void the warranty. + + **Electrical shock when touching the sensor** + + This indicates an electrical fault in sensor, cabling, or power supply or adjacent system. + + - Immediately turn off power to the system, disconnect cables, and have a qualified electrician check the setup. + - Ensure that the sensor housing is properly grounded; check for large ground loops. + + + Connectivity issues + ------------------- + + **LED briefly flashes red every 5 seconds** + + If the LED briefly flashes red every 5 seconds, then the |rc_xxx| is not able to detect a network + link. + + - Check that the network cable is properly connected to the |rc_xxx| and the network. + - If no problem is visible, then replace the Ethernet cable. + + **A GigE Vision client or rcdiscover-gui cannot detect the camera** + + - Check whether the |rc_xxx|'s LED flashes briefly every 5 seconds (check the cable if it does). + - Ensure that the |rc_xxx| is connected to the same subnet (the discovery mechanism uses broadcasts that + will not work across different subnets). + + **The Web GUI is inaccessible** + + - Ensure that the |rc_xxx| is turned on and connected to the same subnet as the host computer. + - Check whether the |rc_xxx|'s LED flashes briefly every 5 seconds (check the cable if it does). + - Check whether ``rcdiscover-gui`` detects the sensor. If it reports the |rc_xxx| as unreachable, + then the |rc_xxx|'s + :ref:`network configuration`:latex:`\:(Section \ref{installation:sect-network-configuration})` is wrong. + - If the |rc_xxx| is reported as reachable, try double clicking the entry to open the |webgui| in a browser. + - If this does not work, try entering the |rc_xxx|'s reported IP address directly in the browser + as target address. + + **Too many Web GUIs are open at the same time** + + The |webgui| consumes the |rc_xxx|'s processing resources to compress images to be transmitted + and for statistical output that is regularly polled by the browser. Leaving several instances of + the |webgui| open on the same or different computers can significantly diminish the |rc_xxx|'s + performance. The |webgui| is meant for configuration and validation, not to permanently monitor + the |rc_xxx|. + +.. _sect-camera-issues: + +Camera-image issues +------------------- + +**The camera image is too bright** + +- If the camera is in manual exposure mode, decrease the exposure time (see :ref:`sect-cam-params`:latex:`, Section \ref{stereo_camera:sect-cam-params}`), or +- switch to auto-exposure mode (see :ref:`sect-cam-params`:latex:`, Section \ref{stereo_camera:sect-cam-params}`). + +**The camera image is too dark** + +- If the camera is in manual exposure mode, increase the exposure time (see :ref:`sect-cam-params`:latex:`, Section \ref{stereo_camera:sect-cam-params}`), or +- switch to auto-exposure mode (see :ref:`sect-cam-params`:latex:`, Section \ref{stereo_camera:sect-cam-params}`). + +**The camera image is too noisy** + +Large gain factors cause high-amplitude image noise. To decrease the image noise, + +- use an additional light source to increase the scene's light intensity, or +- choose a greater maximal auto-exposure time (see :ref:`sect-cam-params`:latex:`, Section \ref{stereo_camera:sect-cam-params}`). + +**The camera image is out of focus** + +- Check whether the object is too close to the lens and increase the distance between the object and the lens if it is. +- Check whether the camera lenses are dirty and clean them if they are. +- If none of the above applies, a severe hardware problem might exist. + Please :ref:`contact support`:latex:`\:(Section \ref{contact:sect-contact})`. + +**The camera image is blurred** + +Fast motions in combination with long exposure times can cause blur. To reduce motion blur, + +- decrease the motion speed of the camera, +- decrease the motion speed of objects in the field of view of the camera, or +- decrease the exposure time of the camera (see :ref:`sect-cam-params`:latex:`, Section \ref{stereo_camera:sect-cam-params}`). + +.. only:: rc_visard or rc_visard_ng + + **The camera image is fuzzy** + + - Check whether the lenses are dirty and clean them if so (see :ref:`sect-lens-cleaning`:latex:`, Section \ref{maintenance:sect-lens-cleaning}`). + - If none of the above applies, a severe hardware problem might exist. + Please :ref:`contact support`:latex:`\:(Section \ref{contact:sect-contact})`. + +**The camera image frame rate is too low** + +- Increase the image frame rate as described in :ref:`sect-cam-params`:latex:`\:(Section \ref{stereo_camera:sect-cam-params})`. +- The maximal frame rate of the cameras is 25 Hz. + +.. _sect-disparity-issues: + +Depth/Disparity, error, and confidence image issues +--------------------------------------------------- +All these guidelines also apply to error and confidence images, because they correspond directly to the disparity image. + +**The disparity image is too sparse or empty** + +- Check whether the camera images are well exposed and sharp. Follow the instructions in + :ref:`sect-camera-issues`:latex:`\:(Section \ref{troubleshooting:sect-camera-issues})` if applicable. +- Check whether the scene has enough texture (see :ref:`sect-stereo-matching`:latex:`, Section + \ref{stereo_matching:sect-stereo-matching}`) and install an external pattern projector if required. +- Decrease the :ref:`Minimum Distance + `:latex:`\:(Section \ref{stereo_matching:sect-disp-image-parameters})`. +- Increase the :ref:`Maximum Distance `:latex:`\:(Section + \ref{stereo_matching:sect-disp-image-parameters})`. +- Check whether the object is too close to the cameras. Consider the different depth ranges of the camera variants. +- Decrease the :ref:`Minimum Confidence `:latex:`\:(Section + \ref{stereo_matching:sect-disp-image-parameters})`. +- Increase the :ref:`Maximum Depth Error `:latex:`\:(Section + \ref{stereo_matching:sect-disp-image-parameters})`. +- Choose a lesser :ref:`Disparity Image Quality `:latex:`\:(Section + \ref{stereo_matching:sect-disp-image-parameters})`. Lower resolution disparity images are generally less sparse. + +.. only:: rc_visard or rc_visard_ng + + - Check the cameras' calibration and recalibrate if required (see :ref:`sect-camera-calibration`:latex:`, Section + \ref{camera_calibration:sect-camera-calibration}`). + +**The disparity images' frame rate is too low** + +- Check and increase the frame rate of the camera images (see :ref:`sect-cam-params`:latex:`, Section \ref{stereo_camera:sect-cam-params}`). + The frame rate of the disparity image cannot be greater than the frame rate of the camera images. +- Choose a lesser :ref:`Disparity Image Quality `:latex:`\:(Section + \ref{stereo_matching:sect-disp-image-parameters})`. +- Increase the :ref:`Minimum Distance + `:latex:`\:(Section \ref{stereo_matching:sect-disp-image-parameters})` + as much as possible for the application. + +**The disparity image does not show close objects** + +- Check whether the object is too close to the cameras. Consider the depth ranges of the camera variants. +- Decrease the :ref:`Minimum Distance `:latex:`\:(Section + \ref{stereo_matching:sect-disp-image-parameters})`. + +**The disparity image does not show distant objects** + +- Increase the :ref:`Maximum Distance `:latex:`\:(Section + \ref{stereo_matching:sect-disp-image-parameters})`. +- Increase the :ref:`Maximum Depth Error `:latex:`\:(Section + \ref{stereo_matching:sect-disp-image-parameters})`. +- Decrease the :ref:`Minimum Confidence `:latex:`\:(Section + \ref{stereo_matching:sect-disp-image-parameters})`. + +**The disparity image is too noisy** + +- Increase the :ref:`Segmentation value `:latex:`\:(Section + \ref{stereo_matching:sect-disp-image-parameters})`. +- Increase the :ref:`Fill-In value `:latex:`\:(Section + \ref{stereo_matching:sect-disp-image-parameters})`. + +**The disparity values or the resulting depth values are too inaccurate** + +- Decrease the distance between the camera and the scene. Depth-measurement error grows quadratically with the distance from the cameras. +- Check whether the scene contains repetitive patterns and remove them if it does. They could cause wrong disparity measurements. + +**The disparity image is too smooth** + +- Decrease the :ref:`Fill-In value `:latex:`\:(Section + \ref{stereo_matching:sect-disp-image-parameters})`. + +**The disparity image does not show small structures** + +- Decrease the :ref:`Segmentation value `:latex:`\:(Section + \ref{stereo_matching:sect-disp-image-parameters})`. +- Decrease the :ref:`Fill-In value `:latex:`\:(Section + \ref{stereo_matching:sect-disp-image-parameters})`. + + +.. only:: rc_visard + + .. _sect-pose-issues: + + Dynamics issues + --------------- + + **State estimates are unavailable** + + - Check in the |webgui| that pose estimation has been switched on + (see :ref:`sect-vo-parameters`:latex:`, Section \ref{stereo_visodo:sect-vo-parameters}`). + - Check in the |webgui| that the update rate is about |imu-rate|. + - Check the *Logs* in the |webgui| for errors. + + **The state estimates are too noisy** + + - Adapt the parameters for visual odometry as described in :ref:`sect-vo-parameters`:latex:`\:(Section + \ref{stereo_visodo:sect-vo-parameters})`. + - Check whether the *camera pose stream* has enough accuracy. + + **Pose estimation has jumps** + + - Has the SLAM module been turned on? SLAM can cause jumps when reducing errors due to a + loop closure. + - Adapt the parameters for visual odometry as described in :ref:`sect-vo-parameters`:latex:`\:(Section + \ref{stereo_visodo:sect-vo-parameters})`. + + **Pose frequency is too low** + + - Use the real-time pose stream with a |imu-rate| update rate. See + :ref:`sect-stereo-ins`:latex:`\:(Section \ref{stereo_ins:sect-stereo-ins})`. + + **Delay/Latency of pose is too great** + + - Use the real-time pose stream. See + :ref:`sect-stereo-ins`:latex:`\:(Section \ref{stereo_ins:sect-stereo-ins})`. + +GigE Vision/GenICam issues +-------------------------- + +**No images** + +- Check that the modules are enabled. See ``ComponentSelector`` and ``ComponentEnable`` in + :ref:`sect-genicam-params`:latex:`\:(Section \ref{gigevision:sect-genicam-params})`. \ No newline at end of file diff --git a/v24.04/de/_raw_sources/userspace.rst.txt b/v24.04/de/_raw_sources/userspace.rst.txt new file mode 100644 index 0000000..cc6ae99 --- /dev/null +++ b/v24.04/de/_raw_sources/userspace.rst.txt @@ -0,0 +1,145 @@ +.. include:: global_rst.glb +.. _sect-userspace: + +|userspace| +=========== + +.. index:: !UserSpace + single: container + single: Docker + single: portainer + +The |userspace| enables users to deploy and manage containers running on the +|rc_xxx|. Standalone containers and docker-compose stacks are supported. + +.. Note:: Familiarity with Docker containers is required. + +If available and enabled, the |userspace| can be accessed in the +:ref:`Web GUI`:latex:`\ (Section \ref{webgui:sect-web-gui})` +in the menu under *UserSpace*. This page shows the running apps and containers +with their current state and health, in case a health-check is available. Each +container lists the published ports. If their protocol is http or https, these +containers can be accessed directly in the |webgui|. + +Configuration +------------- + +.. index:: + single: UserSpace; security + single: UserSpace; installation + +.. only:: rc_visard_ng + + If the |userspace| is enabled for the first time, a user for the portainer UI + needs to be created: In the :ref:`Web GUI`:latex:`\ (Section \ref{webgui:sect-web-gui})` + navigate to *UserSpace* and click on *Manage UserSpace Apps*. + Then, register a user account for the administrator. + It is required to complete this step within + five minutes after booting the |rc_xxx|. + +.. only:: rc_cube + + .. Note:: The |userspace| is not enabled by default and can only be + enabled/disabled or reset via a locally connected screen for security reasons. + + Please connect a monitor, keyboard, and mouse to the |rc-cube| and then boot + the |rc-cube|. + + Enable |userspace| + ^^^^^^^^^^^^^^^^^^ + The |userspace| can be enabled in two steps: + + 1. Navigate to the pane *UserSpace configuration* and click :guilabel:`enable UserSpace`. + + 2. If the |userspace| is enabled for the first time, a user for the portainer UI + needs to be created: Click on the *portainer* pane, and register a user + account for the administrator. It is required to complete this step within + five minutes after clicking :guilabel:`enable UserSpace`. + + Disable |userspace| + ^^^^^^^^^^^^^^^^^^^ + + The |userspace| can also be disabled. To disable the |userspace|, navigate to + the pane *UserSpace configuration* and click :guilabel:`disable UserSpace`. Disabling + will stop all running containers and the portainer UI, but not delete existing + container images and their configurations. The |userspace| can be enabled again + at any time. + + Reset |userspace| + ^^^^^^^^^^^^^^^^^ + + The |userspace| can also be reset. To reset the |userspace|, navigate to the + pane *UserSpace configuration* click :guilabel:`Reset UserSpace` and answer the + security question. Resetting will delete all containers, volumes, and the + portainer configuration, including secrets and users. + +Network access to UserSpace applications +---------------------------------------- + +To access containers via network, the container ports need to be published to host ports. + +|userspace| information including running apps and their published ports can be queried via +:ref:`REST-API userspace endpoint`:latex:`, (Section \ref{rest_api_userspace:sect-rest-api-userspace})` +or viewed in the :ref:`Web GUI`:latex:`\ (Section \ref{webgui:sect-web-gui})` +in the menu under *UserSpace*. + +All ports that are published to the host are listed with their protocol (UDP or TCP). +To explicitly specify a protocol (e.g. http or https) for app ports use container labels: + +- ``com.roboception.app.http``: all exposed TCP ports use http +- ``com.roboception.app.https.port=1234,5678``: comma separated list with https ports + + +.. only:: rc_cube + + Examples + -------- + + .. index:: + single: |userspace|; examples + + Two examples can be found under *App Templates* inside the |userspace| pane: + + - **hello_rc_cube**: Single container exposing a web page with some information about itself. + See also https://github.com/roboception/hello_rc_cube. + + - **rc_cube_monitoring**: Compose stack with Prometheus and Grafana to monitor the |rc_cube|. + See also https://github.com/roboception/rc_cube_monitoring. + + Clicking :guilabel:`Deploy the container/stack` under *Actions* will pull the Docker images and start the app. + The running app containers can then be seen under *Containers*. + The web page address is a combination of the |rc_cube|'s IP address and the port listed under *Published Ports*. + +Interfaces +---------- + +.. index:: + single: UserSpace; gRPC + single: UserSpace; REST-API + +Docker containers managed in the |userspace| can use the public interfaces of +the |rc_xxx|. In particular, Docker containers can access synchronized image +sets via :doc:`gRPC`:latex:`\:(Section \ref{grpc:sect-grpc})` and can +call the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`. The +|rc_xxx| (the host) can be accessed under the Docker bridge IP (in default +Docker bridge network `172.17.0.1`). + +Restrictions +------------ + +.. index:: + single: UserSpace; restrictions + single: UserSpace; Docker network + single: UserSpace; security + +Some restrictions for containers apply: + +- Containers cannot be privileged. +- No access to the host network (a Docker bridge network is used instead). +- Only paths inside cloned git repositories with a docker-compose stack can be mounted, all other host paths cannot be mounted. +- Host devices cannot be accessed. This includes e.g. USB and GPU devices. +- Well known and internally used ports on the host cannot be bound. + This includes ports below 1024, ports from 4200 to 4299 and the ports + 2342, 2343, 2344, 2345, 3956, 4840, 5353, 6379, + 7000, 7001, 7002, 7003, 9100, 9118, 9256, 9445, 9446, 11311, 22350, 22352, + 50010, 50051, 50052, 50053 and 50054. diff --git a/v24.04/de/_raw_sources/warranty.rst.txt b/v24.04/de/_raw_sources/warranty.rst.txt new file mode 100644 index 0000000..89ed808 --- /dev/null +++ b/v24.04/de/_raw_sources/warranty.rst.txt @@ -0,0 +1,20 @@ +.. include:: global_rst.glb + +.. raw:: latex + + \newpage + +.. _sect-warranty: + +Warranty +======== + +Any changes or modifications to the hard- and software not expressly approved by |company| could void the user's warranty and guarantee rights. + +.. Warning:: The |rc_xxx| utilizes complex hardware and software technology that may behave in a way not intended by the user. The purchaser must design its application to ensure that any failure or the |rc_xxx| does not cause personal injury, property damage, or other losses. + +.. Warning:: Do not attempt to take apart, open, service, or modify the |rc_xxx|. Doing so could present the risk of electric shock or other hazard. Any evidence of any attempt to open and/or modify the device, including any peeling, puncturing, or removal of any of the labels, will void the Limited Warranty. + +.. Warning:: CAUTION: to comply with the European CE requirement, all cables used to connect this device must be shielded and grounded. Operation with incorrect cables may result in interference with other devices or undesired effects of the product. + +.. Note:: This product may not be treated as household waste. By ensuring this product is disposed of correctly, you will help to protect the environment. For more detailed information about the recycling of this product, please contact your local authority, your household waste disposal service provider, or the product's supplier. diff --git a/v24.04/de/_raw_sources/webgui.rst.txt b/v24.04/de/_raw_sources/webgui.rst.txt new file mode 100644 index 0000000..5ab87d8 --- /dev/null +++ b/v24.04/de/_raw_sources/webgui.rst.txt @@ -0,0 +1,204 @@ +.. include:: global_rst.glb + +.. _sect-web-gui: + +Web GUI +======= + +.. index:: ! Web GUI + +The |rc_xxx|'s |webgui| can be used to test, calibrate, and configure the device. + +Accessing the Web GUI +--------------------- + +The |webgui| can be accessed from any web browser, such as Firefox, Google Chrome, or Microsoft Edge, via +the |rc_xxx|'s IP address. The easiest way to access the |webgui| is to simply double click on the +desired device using the ``rcdiscover-gui`` tool as explained in :ref:`sect-discovery-of-rcvisard-devices`:latex:`\:(Section \ref{installation:sect-discovery-of-rcvisard-devices})`. + +Alternatively, some network environments automatically configure the unique host name of +the |rc_xxx| in their Domain Name Server (:term:`DNS`). In this case, the |webgui| can also be +accessed directly using the :term:`URL` ``http://`` by +replacing ```` with the device's host name. + +For Linux and Mac operating systems, this even works without DNS via the multicast +Domain Name System (:term:`mDNS`), which is automatically used if ``.local`` is appended to the +host name. Thus, the URL simply becomes ``http://.local``. + +.. only:: rc_cube + + Access to the |rc_visard| |webgui| + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + For troubleshooting, users can + also directly access the |webgui| of the |rc_visard| device that + is connected to the |rc_xxx|. + It is available for the |rc_visard| on camera pipeline 0 + at port ``2342`` of the |rc_xxx|, and hence at + the :term:`URL` ``http://:2342`` + where ```` is the IP address or host + name of the |rc_xxx| that the |rc_visard| is connected to. + For camera pipelines 1, 2 or 3 it can be accessed at ``http://:2343``, + ``http://:2344``, and ``http://:2345``, respectively. + + By this means, users have access to the |rc_visard|'s device information + or log files. + + .. note:: If a computer screen is directly connected to the |rc_xxx|, + it shows the |webgui| with a small additional menu from which + the |rc_visard|'s |webgui| can be accessed as well. + + +Exploring the Web GUI +--------------------- + +.. only:: rc_visard or rc_visard_ng + + The |webgui|'s dashboard page gives the most important information about the device + and the software modules. + +.. only:: rc_cube + + The |webgui|'s dashboard page gives the most important information about the device + and the running camera pipelines. + +.. figure:: images/webgui_dashboard.png + :align: center + + Dashboard page of the |rc_xxx|'s |webgui| + +The page's side menu permits access to the individual pages of the |rc_xxx|'s |webgui|: + +.. only:: rc_cube + + *Pipeline* + gives access to the respective camera pipeline and its camera, detection and configuration modules. + Each camera pipeline provides an overview page with the most important information about the + camera connection and the software modules running in the pipeline. + + .. figure:: images/webgui_pipeline_overview.png + :align: center + + Pipeline overview page of the |rc_xxx|'s |webgui| + + Each pipeline provides a sub-menu with the individual pages for the modules running in the pipeline: + +*Camera* + shows a live stream of the rectified camera images. + The frame rate can be reduced to save bandwidth when streaming to a + GigE Vision\ |reg| client. Furthermore, exposure can be set manually or automatically. + See :ref:`sect-cam-params`:latex:`\:(Section \ref{stereo_camera:sect-cam-params})` for more information. + +*Depth Image* + shows a live stream of the left rectified, disparity, and + confidence images. The page contains various settings for depth-image + computation and filtering. See :ref:`sect-disp-image-parameters`:latex:`\:(Section \ref{stereo_matching:sect-disp-image-parameters})` for more information. + +.. only:: rc_visard + + *Dynamics* + shows the location and movement of image features that are + used to compute the |rcvisard|'s egomotion. Settings include the number of corners + and features that should be used. See :ref:`sect-vo-parameters`:latex:`\:(Section \ref{stereo_visodo:sect-vo-parameters})` for more information. + +*Modules* + gives access to the detection modules of the |rcxxx| + (see :doc:`detection_modules`:latex:`, Section \ref{detection_modules:sect-detection-modules}`). + +*Configuration* + gives access to the configuration modules of the |rcxxx| + (see :doc:`configuration_modules`:latex:`, Section \ref{configuration_modules:sect-configuration-modules}`). + +.. only:: rc_cube + + The following modules running outside the pipelines can be accessed in the side menu: + +*Database* + gives access to the database modules of the |rcxxx| + (see :doc:`database_modules`:latex:`, Section \ref{database_modules:sect-database-modules}`). + +*System* + gives access to general settings, device information and to the log files, + and permits the firmware or the license file to be updated. + +.. only:: rc_cube + + *UserSpace* + gives access to the |rc_cube|'s UserSpace + (see :doc:`userspace`:latex:`, Section \ref{userspace:sect-userspace}`). + +.. Note:: Further information on all parameters in the |webgui| can be obtained by pressing the *Info* + button next to each parameter. + +.. _sect-webgui-ui-lock: + +Web GUI access control +---------------------- + +The |webgui| has a simple mechanism to lock the UI against casual and accidental changes. + +When enabling |webgui| access control via the *System* page, you will be asked to set a password. +Now the |webgui| is in a locked mode indicated by the lock symbol in the top bar. +All pages, camera streams, parameters and detections can be inspected as usual, but changes are not possible. + +To temporarily unlock the |webgui| and make changes, click the lock symbol and enter the password. +While enabling or disabling |webgui| access control affects anyone accessing this |rc_xxx|, +the unlocked state is only valid for the browser where it was unlocked and indicated by the open lock symbol. +It is automatically locked again after 10 minutes of inactivity. + +|webgui| access control can also be disabled again on the *System* page after providing the current password. + +.. Warning:: This is not a security feature! It only locks the |webgui| and not the |rest-api|. + It is meant to prevent accidental and casual changes e.g. via a connected screen. + +.. Note:: In case the password is lost, this can be disabled via the |rest-api| + :ref:`delete ui_lock`:latex:`\:(Section \ref{rest_api_syslogs:sect-rest-delete-system-ui-lock})`. + +.. _sect-webgui-camera-snapshot: + +Downloading camera images +------------------------- + +The |webgui| +provides an easy way to download a snapshot of the current scene as a .tar.gz file +by clicking on the camera icon below the image live streams on the *Camera* page. This snapshot contains: + +- the rectified camera images in full resolution as .png files, +- a camera parameter file containing the camera matrix, image dimensions, exposure time, + gain value and the stereo baseline, +- the current IMU readings as imu.csv file, :cubeonly:`if available,` +- a pipeline_status.json file containing information about all :cubeonly:`modules running inside the pipelines`:visardsonly:`3D-camera, detection and configuration nodes running` on the |rc_xxx|, +- a backup.json file containing the settings of the |rc_xxx| including grippers, load carriers and regions of interest, +- a system_info.json file containing system information about the |rc_xxx|. + + +The filenames contain the timestamps. + +.. _sect-webgui-depth-snapshot: + +Downloading depth images and point clouds +----------------------------------------- + +The |webgui| provides an easy way to download the depth data of the current scene as a .tar.gz file +by clicking on the camera icon below the image live streams on the *Depth Image* page. This snapshot contains: + +- the rectified left and right camera images in full resolution as .png files, +- an image parameter file corresponding to the left image containing the camera matrix, image dimensions, exposure time, + gain value and the stereo baseline, +- the disparity, error and confidence images in the resolution corresponding to the currently chosen quality as .png files, +- a disparity parameter file corresponding to the disparity image containing the camera matrix, image dimensions, exposure time, + gain value and the stereo baseline, and information about the disparity values (i.e. invalid values, scale, offset), +- the current IMU readings as imu.csv file, :cubeonly:`if available,` +- a pipeline_status.json file containing information about all :cubeonly:`modules running inside the pipelines`:visardsonly:`3D-camera, detection and configuration nodes running` on the |rc_xxx|, +- a backup.json file containing the settings of the |rc_xxx| including grippers, load carriers and regions of interest, +- a system_info.json file containing system information about the |rc_xxx|. + +The filenames contain the timestamps. + +When clicking on the mesh icon below the image live streams on the *Depth Image* page, a snapshot is downloaded +which additionally includes a mesh of the point cloud in the current depth quality (resolution) as .ply file. + +.. note:: + Downloading a depth snapshot will trigger an acquisition in the same way as clicking on the "Acquire" button on the + *Depth Image* page of the Web GUI, and, thus, might affect running applications. + diff --git a/v24.04/de/_sources/.doctrees/accessories.doctree b/v24.04/de/_sources/.doctrees/accessories.doctree new file mode 100644 index 0000000..6011ba3 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/accessories.doctree differ diff --git a/v24.04/de/_sources/.doctrees/appendix.doctree b/v24.04/de/_sources/.doctrees/appendix.doctree new file mode 100644 index 0000000..14c469c Binary files /dev/null and b/v24.04/de/_sources/.doctrees/appendix.doctree differ diff --git a/v24.04/de/_sources/.doctrees/blaze.doctree b/v24.04/de/_sources/.doctrees/blaze.doctree new file mode 100644 index 0000000..6b02338 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/blaze.doctree differ diff --git a/v24.04/de/_sources/.doctrees/cadmatch.doctree b/v24.04/de/_sources/.doctrees/cadmatch.doctree new file mode 100644 index 0000000..a6102f6 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/cadmatch.doctree differ diff --git a/v24.04/de/_sources/.doctrees/camera_calibration.doctree b/v24.04/de/_sources/.doctrees/camera_calibration.doctree new file mode 100644 index 0000000..32aaa15 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/camera_calibration.doctree differ diff --git a/v24.04/de/_sources/.doctrees/camera_modules.doctree b/v24.04/de/_sources/.doctrees/camera_modules.doctree new file mode 100644 index 0000000..d468d4c Binary files /dev/null and b/v24.04/de/_sources/.doctrees/camera_modules.doctree differ diff --git a/v24.04/de/_sources/.doctrees/collisioncheck.doctree b/v24.04/de/_sources/.doctrees/collisioncheck.doctree new file mode 100644 index 0000000..e27400b Binary files /dev/null and b/v24.04/de/_sources/.doctrees/collisioncheck.doctree differ diff --git a/v24.04/de/_sources/.doctrees/concept_stereo.doctree b/v24.04/de/_sources/.doctrees/concept_stereo.doctree new file mode 100644 index 0000000..a11ea5f Binary files /dev/null and b/v24.04/de/_sources/.doctrees/concept_stereo.doctree differ diff --git a/v24.04/de/_sources/.doctrees/concepts.doctree b/v24.04/de/_sources/.doctrees/concepts.doctree new file mode 100644 index 0000000..5f46499 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/concepts.doctree differ diff --git a/v24.04/de/_sources/.doctrees/configuration_modules.doctree b/v24.04/de/_sources/.doctrees/configuration_modules.doctree new file mode 100644 index 0000000..6b47e1e Binary files /dev/null and b/v24.04/de/_sources/.doctrees/configuration_modules.doctree differ diff --git a/v24.04/de/_sources/.doctrees/contact.doctree b/v24.04/de/_sources/.doctrees/contact.doctree new file mode 100644 index 0000000..af13de4 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/contact.doctree differ diff --git a/v24.04/de/_sources/.doctrees/database_modules.doctree b/v24.04/de/_sources/.doctrees/database_modules.doctree new file mode 100644 index 0000000..2f5e264 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/database_modules.doctree differ diff --git a/v24.04/de/_sources/.doctrees/detection_modules.doctree b/v24.04/de/_sources/.doctrees/detection_modules.doctree new file mode 100644 index 0000000..a02aaea Binary files /dev/null and b/v24.04/de/_sources/.doctrees/detection_modules.doctree differ diff --git a/v24.04/de/_sources/.doctrees/disposal.doctree b/v24.04/de/_sources/.doctrees/disposal.doctree new file mode 100644 index 0000000..efd66be Binary files /dev/null and b/v24.04/de/_sources/.doctrees/disposal.doctree differ diff --git a/v24.04/de/_sources/.doctrees/eki.doctree b/v24.04/de/_sources/.doctrees/eki.doctree new file mode 100644 index 0000000..1326680 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/eki.doctree differ diff --git a/v24.04/de/_sources/.doctrees/environment.pickle b/v24.04/de/_sources/.doctrees/environment.pickle new file mode 100644 index 0000000..05b5d84 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/environment.pickle differ diff --git a/v24.04/de/_sources/.doctrees/general.doctree b/v24.04/de/_sources/.doctrees/general.doctree new file mode 100644 index 0000000..25f9782 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/general.doctree differ diff --git a/v24.04/de/_sources/.doctrees/gigevision.doctree b/v24.04/de/_sources/.doctrees/gigevision.doctree new file mode 100644 index 0000000..3f73715 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/gigevision.doctree differ diff --git a/v24.04/de/_sources/.doctrees/glossary.doctree b/v24.04/de/_sources/.doctrees/glossary.doctree new file mode 100644 index 0000000..4a4aa6b Binary files /dev/null and b/v24.04/de/_sources/.doctrees/glossary.doctree differ diff --git a/v24.04/de/_sources/.doctrees/gripper_db.doctree b/v24.04/de/_sources/.doctrees/gripper_db.doctree new file mode 100644 index 0000000..320c4f0 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/gripper_db.doctree differ diff --git a/v24.04/de/_sources/.doctrees/grpc.doctree b/v24.04/de/_sources/.doctrees/grpc.doctree new file mode 100644 index 0000000..6714c02 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/grpc.doctree differ diff --git a/v24.04/de/_sources/.doctrees/handeye_calibration.doctree b/v24.04/de/_sources/.doctrees/handeye_calibration.doctree new file mode 100644 index 0000000..e23e469 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/handeye_calibration.doctree differ diff --git a/v24.04/de/_sources/.doctrees/hardware_spec.doctree b/v24.04/de/_sources/.doctrees/hardware_spec.doctree new file mode 100644 index 0000000..bf8e569 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/hardware_spec.doctree differ diff --git a/v24.04/de/_sources/.doctrees/index.doctree b/v24.04/de/_sources/.doctrees/index.doctree new file mode 100644 index 0000000..e908e03 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/index.doctree differ diff --git a/v24.04/de/_sources/.doctrees/installation.doctree b/v24.04/de/_sources/.doctrees/installation.doctree new file mode 100644 index 0000000..d60bd2b Binary files /dev/null and b/v24.04/de/_sources/.doctrees/installation.doctree differ diff --git a/v24.04/de/_sources/.doctrees/interfaces.doctree b/v24.04/de/_sources/.doctrees/interfaces.doctree new file mode 100644 index 0000000..37ec03d Binary files /dev/null and b/v24.04/de/_sources/.doctrees/interfaces.doctree differ diff --git a/v24.04/de/_sources/.doctrees/iocontrol.doctree b/v24.04/de/_sources/.doctrees/iocontrol.doctree new file mode 100644 index 0000000..79b9cfd Binary files /dev/null and b/v24.04/de/_sources/.doctrees/iocontrol.doctree differ diff --git a/v24.04/de/_sources/.doctrees/itempick.doctree b/v24.04/de/_sources/.doctrees/itempick.doctree new file mode 100644 index 0000000..9db6d4c Binary files /dev/null and b/v24.04/de/_sources/.doctrees/itempick.doctree differ diff --git a/v24.04/de/_sources/.doctrees/loadcarrier.doctree b/v24.04/de/_sources/.doctrees/loadcarrier.doctree new file mode 100644 index 0000000..933534b Binary files /dev/null and b/v24.04/de/_sources/.doctrees/loadcarrier.doctree differ diff --git a/v24.04/de/_sources/.doctrees/loadcarrier_db.doctree b/v24.04/de/_sources/.doctrees/loadcarrier_db.doctree new file mode 100644 index 0000000..f5575d2 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/loadcarrier_db.doctree differ diff --git a/v24.04/de/_sources/.doctrees/maintenance.doctree b/v24.04/de/_sources/.doctrees/maintenance.doctree new file mode 100644 index 0000000..2a8100d Binary files /dev/null and b/v24.04/de/_sources/.doctrees/maintenance.doctree differ diff --git a/v24.04/de/_sources/.doctrees/modules.doctree b/v24.04/de/_sources/.doctrees/modules.doctree new file mode 100644 index 0000000..75eb27b Binary files /dev/null and b/v24.04/de/_sources/.doctrees/modules.doctree differ diff --git a/v24.04/de/_sources/.doctrees/navigation_modules.doctree b/v24.04/de/_sources/.doctrees/navigation_modules.doctree new file mode 100644 index 0000000..566dfe7 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/navigation_modules.doctree differ diff --git a/v24.04/de/_sources/.doctrees/opc_ua.doctree b/v24.04/de/_sources/.doctrees/opc_ua.doctree new file mode 100644 index 0000000..1fcd7d4 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/opc_ua.doctree differ diff --git a/v24.04/de/_sources/.doctrees/pipelines.doctree b/v24.04/de/_sources/.doctrees/pipelines.doctree new file mode 100644 index 0000000..23985cb Binary files /dev/null and b/v24.04/de/_sources/.doctrees/pipelines.doctree differ diff --git a/v24.04/de/_sources/.doctrees/pose_format_abb.doctree b/v24.04/de/_sources/.doctrees/pose_format_abb.doctree new file mode 100644 index 0000000..2ce2329 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/pose_format_abb.doctree differ diff --git a/v24.04/de/_sources/.doctrees/pose_format_fanuc.doctree b/v24.04/de/_sources/.doctrees/pose_format_fanuc.doctree new file mode 100644 index 0000000..d0e45fb Binary files /dev/null and b/v24.04/de/_sources/.doctrees/pose_format_fanuc.doctree differ diff --git a/v24.04/de/_sources/.doctrees/pose_format_franka_emika.doctree b/v24.04/de/_sources/.doctrees/pose_format_franka_emika.doctree new file mode 100644 index 0000000..81ab5fd Binary files /dev/null and b/v24.04/de/_sources/.doctrees/pose_format_franka_emika.doctree differ diff --git a/v24.04/de/_sources/.doctrees/pose_format_fruitcore_horst.doctree b/v24.04/de/_sources/.doctrees/pose_format_fruitcore_horst.doctree new file mode 100644 index 0000000..e6ce441 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/pose_format_fruitcore_horst.doctree differ diff --git a/v24.04/de/_sources/.doctrees/pose_format_kawasaki.doctree b/v24.04/de/_sources/.doctrees/pose_format_kawasaki.doctree new file mode 100644 index 0000000..9e5067a Binary files /dev/null and b/v24.04/de/_sources/.doctrees/pose_format_kawasaki.doctree differ diff --git a/v24.04/de/_sources/.doctrees/pose_format_kuka.doctree b/v24.04/de/_sources/.doctrees/pose_format_kuka.doctree new file mode 100644 index 0000000..e6964f6 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/pose_format_kuka.doctree differ diff --git a/v24.04/de/_sources/.doctrees/pose_format_mitsubishi.doctree b/v24.04/de/_sources/.doctrees/pose_format_mitsubishi.doctree new file mode 100644 index 0000000..c102a7b Binary files /dev/null and b/v24.04/de/_sources/.doctrees/pose_format_mitsubishi.doctree differ diff --git a/v24.04/de/_sources/.doctrees/pose_format_rt.doctree b/v24.04/de/_sources/.doctrees/pose_format_rt.doctree new file mode 100644 index 0000000..abba008 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/pose_format_rt.doctree differ diff --git a/v24.04/de/_sources/.doctrees/pose_format_ur.doctree b/v24.04/de/_sources/.doctrees/pose_format_ur.doctree new file mode 100644 index 0000000..aca8bb5 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/pose_format_ur.doctree differ diff --git a/v24.04/de/_sources/.doctrees/pose_format_yaskawa.doctree b/v24.04/de/_sources/.doctrees/pose_format_yaskawa.doctree new file mode 100644 index 0000000..f124732 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/pose_format_yaskawa.doctree differ diff --git a/v24.04/de/_sources/.doctrees/rest_api.doctree b/v24.04/de/_sources/.doctrees/rest_api.doctree new file mode 100644 index 0000000..e8cf9e8 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/rest_api.doctree differ diff --git a/v24.04/de/_sources/.doctrees/rest_api_datamodel.doctree b/v24.04/de/_sources/.doctrees/rest_api_datamodel.doctree new file mode 100644 index 0000000..928f347 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/rest_api_datamodel.doctree differ diff --git a/v24.04/de/_sources/.doctrees/rest_api_general.doctree b/v24.04/de/_sources/.doctrees/rest_api_general.doctree new file mode 100644 index 0000000..c4d5e54 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/rest_api_general.doctree differ diff --git a/v24.04/de/_sources/.doctrees/rest_api_nodes.doctree b/v24.04/de/_sources/.doctrees/rest_api_nodes.doctree new file mode 100644 index 0000000..684979b Binary files /dev/null and b/v24.04/de/_sources/.doctrees/rest_api_nodes.doctree differ diff --git a/v24.04/de/_sources/.doctrees/rest_api_pipelines.doctree b/v24.04/de/_sources/.doctrees/rest_api_pipelines.doctree new file mode 100644 index 0000000..4e94286 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/rest_api_pipelines.doctree differ diff --git a/v24.04/de/_sources/.doctrees/rest_api_swagger_ui.doctree b/v24.04/de/_sources/.doctrees/rest_api_swagger_ui.doctree new file mode 100644 index 0000000..990afa4 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/rest_api_swagger_ui.doctree differ diff --git a/v24.04/de/_sources/.doctrees/rest_api_syslogs.doctree b/v24.04/de/_sources/.doctrees/rest_api_syslogs.doctree new file mode 100644 index 0000000..9e6e8c2 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/rest_api_syslogs.doctree differ diff --git a/v24.04/de/_sources/.doctrees/rest_api_userspace.doctree b/v24.04/de/_sources/.doctrees/rest_api_userspace.doctree new file mode 100644 index 0000000..30a611b Binary files /dev/null and b/v24.04/de/_sources/.doctrees/rest_api_userspace.doctree differ diff --git a/v24.04/de/_sources/.doctrees/revisions.doctree b/v24.04/de/_sources/.doctrees/revisions.doctree new file mode 100644 index 0000000..601ee4b Binary files /dev/null and b/v24.04/de/_sources/.doctrees/revisions.doctree differ diff --git a/v24.04/de/_sources/.doctrees/roi.doctree b/v24.04/de/_sources/.doctrees/roi.doctree new file mode 100644 index 0000000..4f734b2 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/roi.doctree differ diff --git a/v24.04/de/_sources/.doctrees/safety.doctree b/v24.04/de/_sources/.doctrees/safety.doctree new file mode 100644 index 0000000..ffa1328 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/safety.doctree differ diff --git a/v24.04/de/_sources/.doctrees/silhouettematch.doctree b/v24.04/de/_sources/.doctrees/silhouettematch.doctree new file mode 100644 index 0000000..ff37947 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/silhouettematch.doctree differ diff --git a/v24.04/de/_sources/.doctrees/standards.doctree b/v24.04/de/_sources/.doctrees/standards.doctree new file mode 100644 index 0000000..3f86160 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/standards.doctree differ diff --git a/v24.04/de/_sources/.doctrees/stereo_camera.doctree b/v24.04/de/_sources/.doctrees/stereo_camera.doctree new file mode 100644 index 0000000..66016ff Binary files /dev/null and b/v24.04/de/_sources/.doctrees/stereo_camera.doctree differ diff --git a/v24.04/de/_sources/.doctrees/stereo_matching.doctree b/v24.04/de/_sources/.doctrees/stereo_matching.doctree new file mode 100644 index 0000000..dfc60f5 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/stereo_matching.doctree differ diff --git a/v24.04/de/_sources/.doctrees/tagdetect.doctree b/v24.04/de/_sources/.doctrees/tagdetect.doctree new file mode 100644 index 0000000..092d00c Binary files /dev/null and b/v24.04/de/_sources/.doctrees/tagdetect.doctree differ diff --git a/v24.04/de/_sources/.doctrees/time_sync.doctree b/v24.04/de/_sources/.doctrees/time_sync.doctree new file mode 100644 index 0000000..c757710 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/time_sync.doctree differ diff --git a/v24.04/de/_sources/.doctrees/troubleshooting.doctree b/v24.04/de/_sources/.doctrees/troubleshooting.doctree new file mode 100644 index 0000000..10609d5 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/troubleshooting.doctree differ diff --git a/v24.04/de/_sources/.doctrees/userspace.doctree b/v24.04/de/_sources/.doctrees/userspace.doctree new file mode 100644 index 0000000..4b375eb Binary files /dev/null and b/v24.04/de/_sources/.doctrees/userspace.doctree differ diff --git a/v24.04/de/_sources/.doctrees/warranty.doctree b/v24.04/de/_sources/.doctrees/warranty.doctree new file mode 100644 index 0000000..0d7c347 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/warranty.doctree differ diff --git a/v24.04/de/_sources/.doctrees/webgui.doctree b/v24.04/de/_sources/.doctrees/webgui.doctree new file mode 100644 index 0000000..a718fb2 Binary files /dev/null and b/v24.04/de/_sources/.doctrees/webgui.doctree differ diff --git a/v24.04/de/_sources/accessories.rst.txt b/v24.04/de/_sources/accessories.rst.txt new file mode 100644 index 0000000..9bf91ea --- /dev/null +++ b/v24.04/de/_sources/accessories.rst.txt @@ -0,0 +1,136 @@ +Zubehör + +Anschlussset + +Roboception bietet ein optional erhältliches Anschlussset an, um +Kunden bei der Einrichtung des + +rc_visard NG + + zu unterstützen. Bei dauerhafter Installation muss der Kunde ein +geeignetes Netzteil bereitstellen. Das Anschlussset besteht aus +folgenden Elementen: + +Netzwerkkabel mit gerader M12-Buchse und geradem RJ45-Stecker, Länge: +2 m, 5 m oder 10 m + +Netzteilkabel mit gerader M12-Buchse und DC-Stecker, Länge: 30 cm + +24 V, 30 W Steckernetzteil, oder 24 V, 60 W Tischnetzteil + +Für den Anschluss des + +rc_visard NG + + an ein Wohn- oder Bürogebäudenetz sind Netzteile erforderlich, die +den Emissionsstandards nach EN 55011 Klasse B entsprechen. Das im +Anschlussset enthaltene Netzteil E2CFS (30 W, 24 V) der EGSTON System +Electronics Eggenburg GmbH ( + +http://www.egston.com + +) ist entsprechend zertifiziert. Es erfüllt jedoch nicht die +Anforderungen in Bezug auf Störaussendungen in Industriebereichen (EN +61000-6-2). + + +Verkabelung + +Kabel sind standardmäßig nicht im Lieferumfang des + +rc_visard NG + + enthalten. Es ist Aufgabe des Kunden, geeignete Kabel zu erwerben. In +den folgenden Abschnitten wird ein Überblick über die empfohlenen +Artikel gegeben. + +Ethernet-Anschluss + +Der + +rc_visard NG + + besitzt eine achtpolige M12-Buchse mit A-Kodierung für den Ethernet- +Anschluss. Verschiedene Kabellösungen können direkt von Drittanbietern +bezogen werden. + +CAT5-Kabel (1 Gbps) für die M12/RJ45-Verbindung + +Gerader M12-Stecker/Gerader RJ45-Stecker; Kabellänge: 10 m; Phoenix +Contact; NBC-MS/10,0-94B/R4AC SCO; Art.-Nr.: 1407417 + +Gerader M12-Stecker/Gerader RJ45-Stecker; Kabellänge: 10 m; MURR +Elektronik; Art.-Nr.: 7700-48521-S4W1000 + +Gewinkelter M12-Stecker/Gerader RJ45-Stecker; Kabellänge: 10 m; MURR +Elektronik; Art.-Nr.: 7700-48551-S4W1000 + +Stromanschluss + +Für den Stromanschluss und die GPIO-Konnektivität ist ein achtpoliger +M12-Stecker mit A-Kodierung vorgesehen. Verschiedene Kabellösungen +können direkt von Drittanbietern bezogen werden. Eine Auswahl an +M12-Kabeln mit offenem Ende ist unten angegeben. Der Kunde muss die +Strom- und GPIO-Anschlüsse gemäß der unter + +Verkabelung + + angegebenen Steckerbelegung vorsehen. Das Gehäuse des + +rc_visard NG + + muss geerdet werden. + +Sensor-/Aktor-Kabel mit M12-Buchse und einseitig offenem Ende + +Gerade M12-Buchse/Freies Leitungsende, geschirmt; Kabellänge: 10 m; +Phoenix Contact; SAC-8P-10,0-PUR/M12FS SH; Art.Nr.: 1522891 + +Gewinkelte M12-Buchse/Freies Leitungsende, geschirmt; Kabellänge: 10 +m; Phoenix Contact; SAC-8P-10,0-PUR/M12FR SH; Art.Nr.: 1522943 + +Sensor-/Aktor-Kabel mit M12-Buchse für die Feldmontage + +Phoenix Contact; SACC-M12FS-8CON-PG9-M; Art.Nr.:1513347 + +TE Connectivity T4110011081-000 (Metallgehäuse) + +TE Connectivity T4110001081-000 (Kunststoffgehäuse) + +Netzteile + +Der + +rc_visard NG + + ist als EN-55011 Klasse B Gerät klassifiziert, und für kommerzielle, +industrielle und geschäftliche Einsatzbereiche vorgesehen. Um den +Sensor an ein Gebäudenetz anschließen zu können, wird ein Netzteil +gemäß EN 55011/55022 Klasse B benötigt. + +Es ist Aufgabe des Kunden, ein Netzteil zu erwerben und zu +installieren, das den Anforderungen der EN 61000-6-2 für die +dauerhafte Installation in einem industriellen Umfeld entspricht. Ein +Beispiel, das sowohl der EN 61000-6-2 als auch der EN 55011/55022 +Klasse B entspricht, ist das Hutschienen-Netzteil PULS MiniLine +ML60.241 (24 VDC; 2,5 A) der PULS GmbH ( + +http://www.pulspower.com + +). Die Installation muss von einem qualifizierten Elektriker +vorgenommen werden. + +Es darf immer nur ein + +rc_visard NG + + an ein Netzteil angeschlossen werden. Die Länge der verwendeten Kabel +darf 30 Meter nicht überschreiten. + +Ersatzteile + +Für den + +rc_visard NG + + sind derzeit keine Ersatzteile erhältlich. diff --git a/v24.04/de/_sources/appendix.rst.txt b/v24.04/de/_sources/appendix.rst.txt new file mode 100644 index 0000000..adf4da3 --- /dev/null +++ b/v24.04/de/_sources/appendix.rst.txt @@ -0,0 +1,82 @@ +Anhang + +Formate für Posendaten + +Eine Pose besteht aus einer Translation und einer Rotation. Die +Translation definiert die Verschiebung entlang der x, y und z-Achsen. +Die Rotation kann auf viele verschiedene Arten definiert werden. Der + +rc_visard NG + + benutzt Quaternionen, um Rotationen zu definieren, und Translationen +werden in Metern angegeben. Dies wird als XYZ+Quaternion Format +bezeichnet. Dieses Kapitel erklärt Umrechnungen zwischen verschiedenen +üblichen Posenformaten und dem XYZ+Quaternion Format. + +Es ist weit verbreitet, Rotationen in 3D durch drei Winkel als +Drehungen um die Koordinatenachsen zu definieren. Leider existieren +hierfür viele verschiedene Möglichkeiten. Übliche Konventionen sind +Euler- oder Kardanwinkel (letztere werden auch als Tait-Bryan Winkel +bezeichnet). In beiden Konventionen können die drei Rotationen auf die +bereits gedrehten Achsen (intrinsische Rotation) oder auf die Achsen +des festen Koordinatensystems (extrinsische Rotation) angewendet +werden. + +Wir benutzen x, y und z zur Bezeichnung der drei Koordinatenachsen. +x', y' und z' bezeichnen die Achsen, die einmal rotiert wurden. x'', +y'' und z'' bezeichnen die Achsen nach zwei Rotationen. + +In der ursprünglichen Eulerwinkelkonvention ist die erste und dritte +Drehachse immer identisch. Die Rotationsreihenfolge z-x'-z'' bedeutet +z.B. eine Drehung um die z-Achse, dann eine Drehung um die gedrehte +x-Achse und schließlich eine Drehung um die (zweimal) gedrehte +z-Achse. In der Kardanwinkelkonvention sind alle drei Drehachsen +unterschiedlich, z.B. z-y'-x''. Kardanwinkel werden häufig ebenfalls +als Eulerwinkel bezeichnet. + +Für jede intrinsische Rotationsreihenfolge gibt es eine äquivalente +extrinsische Rotationsreihenfolge, die genau umgekehrt ist. Die +intrinsische Rotationsreihenfolge z-y'-x'' ist zum Beispiel äquivalent +zu der extrinsischen Rotationsreihenfolge x-y-z. + +Rotationen um die x, y und z-Achse können mit Quaternionen definiert +werden als + + \begin{align*} r_x(\alpha) &= + \left(\begin{array}{c}\sin\frac{\alpha}{2} \\ 0 \\ 0 \\ + \cos\frac{\alpha}{2}\end{array}\right)\text{,} & r_y(\beta) &= + \left(\begin{array}{c}0 \\ \sin\frac{\beta}{2} \\ 0 \\ + \cos\frac{\beta}{2}\end{array}\right)\text{,} & r_z(\gamma) &= + \left(\begin{array}{c}0 \\ 0 \\ \sin\frac{\gamma}{2} \\ + \cos\frac{\gamma}{2}\end{array}\right)\text{,} \end{align*} + +oder durch Rotationsmatrizen als + + r_x(\alpha) &= \left(\begin{array}{ccc} 1 & 0 & + 0 \\ 0 & \cos\alpha & -\sin\alpha \\ 0 & \sin\alpha & + \cos\alpha \end{array}\right)\text{,} \\ r_y(\beta) &= + \left(\begin{array}{ccc} \cos\beta & 0 & \sin\beta \\ + 0 & 1 & 0 \\ -\sin\beta & 0 & \cos\beta + \end{array}\right)\text{,} \\ r_z(\gamma) &= + \left(\begin{array}{ccc} \cos\gamma & -\sin\gamma & 0 \\ + \sin\gamma & \cos\gamma & 0 \\ 0 & 0 & 1 + \end{array}\right)\text{.} + +Die extrinsische Rotationsreihenfolge x-y-z kann durch die +Multiplikation einzelner Rotationen in umgekehrter Reihenfolge +berechnet werden, d.h. r_z(\gamma) r_y(\beta) r_x(\alpha). + +Basierend auf diesen Definitionen beschreiben die folgenden Abschnitte +die Umrechnung zwischen üblichen Konventionen und dem XYZ+Quaternion +Format. + +Bemerkung: Zu beachten sind stets die Einheiten für Positionen und + Orientierungen. + + rc_visard NG + + Geräte benutzen stets Meter als Längeneinheit, während die meisten + Roboterhersteller Längen in Millimeter oder Inch angeben. Winkel + werden üblicherweise in Grad angegeben, können aber auch im Bogenmaß + angegeben sein. + diff --git a/v24.04/de/_sources/blaze.rst.txt b/v24.04/de/_sources/blaze.rst.txt new file mode 100644 index 0000000..d680ef5 --- /dev/null +++ b/v24.04/de/_sources/blaze.rst.txt @@ -0,0 +1,517 @@ +Blaze + +Das Blaze Softwaremodul ist ein Basismodul, welches auf jedem + +rc_visard NG + + verfügbar ist, und stellt Disparitäts-, Konfidenz- und Fehlerbilder +einer angeschlossenen Basler + +blaze + + RGB-D Kamera zur Verfügung, d.h. einer blaze Time-of-Flight (ToF) +Kamera in Kombination mit einer Basler aceA1300 Farbkamera. + +Nach dem Anschluss eines Basler blaze Sensors an den + +rc_cube + + kann es bis zu einer Minute dauern, bis dieser gefunden wird. Beim +erstmaligen Anschluss an den + +rc_cube + + ist der Sensor noch unkalibriert und muss kalibriert werden, bevor er +verwendet werden kann. Die Kalibrierung erfolgt über die Web GUI auf +der Seite + +Kamerakalibrierung + + unter + +Konfiguration + + in der entsprechenden Pipeline. Sobald die Kalibrierung gespeichert +wurde, verbleibt sie permanent auf dem + +rc_cube + + und wird automatisch angewendet, wenn der + +blaze + + Sensor wieder mit dem + +rc_cube + + verbunden wird, unabhängig von Port und Kamerapipeline. + +Das Blaze Modul läuft nur in Kamerapipelines vom Typ "blaze". + +Anzeigen und Herunterladen von Tiefenbildern und Punktwolken + +Der + +rc_visard NG + + stellt über die GenICam-Schnittstelle zeitgestempelte Disparitäts-, +Fehler- und Konfidenzbilder zur Verfügung (siehe + +Verfügbare Bild-Streams + +). Live-Streams in geringerer Qualität werden auf der + +Tiefenbild + + Seite in der + +Web GUI + + bereitgestellt. + +Die + +Web GUI + + bietet weiterhin die Möglichkeit, einen Schnappschuss der aktuellen +Szene mit den Tiefen-, Fehler und Konfidenzbildern, sowie der +Punktwolke als .tar.gz-Datei zu speichern, wie in + +Herunterladen von Kamerabildern + + beschrieben wird. + +Parameter + +Das Blaze Modul wird in der REST-API als "rc_blaze" bezeichnet und in +der + +Web GUI + + auf der Seite + +Tiefenbild + + in der gewünschten Pipeline dargestellt. Der Benutzer kann die Blaze- +Parameter entweder dort oder über die REST-API ( + +REST-API-Schnittstelle + +) ändern. + +Übersicht über die Parameter + +Dieses Softwaremodul bietet folgende Laufzeitparameter: + +Laufzeitparameter des rc_blaze-Moduls Name Typ Min. +Max. Default Beschreibung acquisition_mode string - - +Continuous Aufnahmemodus: [Continuous, SingleFrame] ambiguity_filter +bool false true true Mehrdeutigkeitsfilter +ambiguity_filter_threshold int32 0 255 204 +Mehrdeutigkeitsfilterschwelle exp_value float64 0.0001 0.001 +0.001 Belichtungszeit der ToF-Kamera fill int32 0 4 3 Toleranz +für das Füllen von Löchern in Pixeln gamma_correction bool false +true true Gammakorrektur maxdepth float64 0.01 10.0 10.0 +Maximaler Abstand in Metern minconf float64 0.0 1.0 0.00488 +Minimale Konfidenz mindepth float64 0.1 10.0 0.1 Minimaler +Abstand in Metern outlier_removal bool false true true Ausreißer +entfernen outlier_removal_threshold int32 0 8 5 Schwellwert für +die Ausreißerentfernung seg int32 0 4000 200 Mindestgröße der +gültigen Disparitätssegmente in Pixeln spatial_filter bool false +true true Räumlicher Filter temporal_filter bool false true +"true Temporalfilter temporal_filter_strength int32 50 255 200 +Stärke des Temporalfilters thermal_drift_correction bool false +true true Korrektur der thermischen Verschiebung + +Beschreibung der Laufzeitparameter + +Jeder Laufzeitparameter ist durch eine eigene Zeile auf der Seite + +Tiefenbild + + der Web GUI repräsentiert. Der Web GUI-Name des Parameters ist in +Klammern hinter dem Namen des Parameters angegeben und die Parameter +werden in der Reihenfolge, in der sie in der Web GUI erscheinen, +aufgelistet: + +exp_value (Belichtungszeit) + + Dieser Wert ist die Belichtungszeit der + + blaze + + Kamera in Sekunden. Damit wird gesteuert, wie lange die + lichtempfindlichen Zellen dem Licht ausgesetzt werden. Wenn der + Betriebsmodus geändert wird, wird die Belichtungszeit auf den + empfohlenen Standardwert gesetzt. Eine Verkürzung der + Belichtungszeit kann die Messgenauigkeit verringern und wird nur + empfohlen, wenn das Bild überbelichtet ist. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?exp_value= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_blaze/parameters?exp_value= + +acquisition_mode (Aufnahmemodus) + + Der Aufnahmemodus kann auf 'Kontinuierlich' ("Continuous") oder + 'Einzelbild' ("SingleFrame") eingestellt werden. Der + Standardwert ist 'Kontinuierlich' und liefert dauerhaft + Tiefenbilder. Im Einzelbildmodus werden nur Bilder aufgenommen, + wenn Aufnehmen gedrückt wird. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?acquisition_mode= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_blaze/parameters?acquisition_mode= + +mindepth (Minimaler Abstand) + + Dieser Wert bezeichnet den geringsten Abstand zur Kamera, ab dem + Messungen möglich sind. Der minimale Abstand wird in Metern + angegeben. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?mindepth= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_blaze/parameters?mindepth= + +maxdepth (Maximaler Abstand) + + Dieser Wert ist der größte Abstand zur Kamera, bis zu dem Messungen + möglich sind. Pixel mit größeren Distanzwerten werden auf + „ungültig“ gesetzt. Der maximale Abstand wird in Metern angegeben. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?maxdepth= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_blaze/parameters?maxdepth= + +fill (Fill-in) + + Diese Option wird verwendet, um Löcher im Disparitätsbild durch + Interpolation zu füllen. Der Füllwert gibt die maximale + Disparitätsabweichung am Rand des Lochs an. Größere Füllwerte + können die Anzahl an Löchern verringern, aber die interpolierten + Werte können größere Fehler aufweisen. Maximal 5% der Pixel werden + interpoliert. Kleine Löcher werden dabei bevorzugt interpoliert. + Die Konfidenz für die interpolierten Pixel wird auf einen geringen + Wert von 0,5 eingestellt. Das Auffüllen lässt sich deaktivieren, + wenn der Wert auf 0 gesetzt wird. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?fill= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_blaze/parameters?fill= + +seg (Segmentation) + + Der Segmentierungsparameter wird verwendet, um die Mindestanzahl an + Pixeln anzugeben, die eine zusammenhängende Disparitätsregion im + Disparitätsbild ausfüllen muss. Isolierte Regionen, die kleiner + sind, werden im Disparitätsbild auf ungültig gesetzt. Der Wert + bezieht sich immer auf ein Disparitätsbild mit hoher Qualität + (halbe Auflösung) und muss nicht verändert werden, wenn andere + Qualitäten gewählt werden. Die Segmentierung eignet sich, um + Disparitätsfehler zu entfernen. Bei größeren Werten kann es jedoch + vorkommen, dass real vorhandene Objekte entfernt werden. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?seg= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_blaze/parameters?seg= + +minconf (Minimale Konfidenz) + + Die minimale Konfidenz lässt sich einstellen, um potenziell falsche + Disparitätsmessungen herauszufiltern. Dabei werden alle Pixel, + deren Konfidenz unter dem gewählten Wert liegt, im Disparitätsbild + auf „ungültig“ gesetzt. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?minconf= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_blaze/parameters?minconf= + +spatial_filter (Räumlicher Filter) + + Dieser Parameter aktiviert den räumlichen Rauschfilter. Dieser + Filter verwendet die Werte benachbarter Pixel, um das Rauschen in + einem Bild zu minimieren. Er basiert auf den Rohdaten des Bildes. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?spatial_filter= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_blaze/parameters?spatial_filter= + +temporal_filter (Temporalfilter) + + Dieser Parameter aktiviert den zeitlichen Rauschfilter. Dieser + Filter verwendet die Werte desselben Pixels zu verschiedenen + Zeitpunkten, um das Rauschen in einem Bild herauszufiltern. Er + basiert auf den Tiefendaten des Bildes. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?temporal_filter= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_blaze/parameters?temporal_filter= + +temporal_filter_strength (Temporalfilterstärke) + + Dieser Parameter ist Stärke des zeitlichen Filters. Je höher der + Wert, desto stärker ist der Filter. Hohe Werte können + Bewegungsartefakte verursachen, während niedrige Werte die + Wirksamkeit des Filters verringern. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?temporal_filter_strength= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_blaze/parameters?temporal_filter_strength= + +outlier_removal (Ausreißer minimieren) + + Dieser Parameter aktiviert den Filter zum Entfernen von Ausreißern. + Dieser Filter entfernt Pixel, die sich signifikant von ihrer + lokalen Umgebung unterscheiden. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?outlier_removal= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_blaze/parameters?outlier_removal= + +outlier_removal_threshold (Schwellenwert) + + Dieser Parameter ist die Stärke des Ausreißerentfernungsfilters. Je + höher der Wert, desto mehr Ausreißer werden entfernt. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?outlier_removal_threshold= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_blaze/parameters?outlier_removal_threshold= + +ambiguity_filter (Mehrdeutigkeitsfilter) + + Dieser Parameter aktiviert den Mehrdeutigkeitsfilter. Der + Mehrdeutigkeitsfilter entfernt Pixel, deren Tiefendaten mehrdeutig + sind. In bestimmten anspruchsvollen Szenen, z.B. aufgrund von + Streulicht oder Multipath-Effekten, kann die Erkennung + fehlschlagen. In diesem Fall sollte der Filter deaktiviert werden. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?ambiguity_filter= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_blaze/parameters?ambiguity_filter= + +ambiguity_filter_threshold (Mehrdeutigkeitsfilterschwelle) + + Dieser Parameter bestimmt die Stärke des Mehrdeutigkeitsfilters. Je + höher der Wert, desto stärker ist der Filter. Höhere Werte erhöhen + die Verlässlichkeit des Filters. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?ambiguity_filter_threshold= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_blaze/parameters?ambiguity_filter_threshold= + +gamma_correction (Gammakorrektur) + + Dieser Parameter aktiviert die Gammakorrektur für das + Intensitätsbild. Das ist eine nichtlineare Operation, um die + dunklen Bereiche des Bildes aufzuhellen. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?gamma_correction= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_blaze/parameters?gamma_correction= + +thermal_drift_correction (Thermische Verschiebung) + + Dieser Parameter aktiviert die Korrektur der thermischen + Verschiebung. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?thermal_drift_correction= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_blaze/parameters?thermal_drift_correction= + +Statuswerte + +Dieses Modul meldet folgende Statuswerte: + +Statuswerte des rc_blaze-Moduls Name Beschreibung fps +Tatsächliche Bildwiederholrate der Disparitäts-, Fehler- und +Konfidenzbilder. Dieser Wert wird unter der Bildvorschau in der Web +GUI als Bildwiederholrate (Hz) angezeigt. latency Zeit zwischen +Bildaufnahme und Weitergabe des Disparitätsbildes in Sekunden width +Aktuelle Breite des Disparitäts-, Fehler- und Konfidenzbilds in Pixeln +height Aktuelle Höhe des Disparitäts-, Fehler- und Konfidenzbilds in +Pixeln mindepth Tatsächlicher minimaler Arbeitsabstand in Metern +maxdepth Tatsächlicher maximaler Arbeitsabstand in Metern + +Services + +Das Blaze Modul bietet folgende Services. + +acquisition_trigger + + signalisiert dem Modul, ein Tiefenbild aufzunehmen, falls + "acquisition_mode" auf "SingleFrame" (*Einzelbild*) eingestellt + ist. + + Details + + Es wird ein Fehler zurückgegeben, falls "acquisition_mode" auf + "Continuous" (*Kontinuierlich*) eingestellt ist. + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/services/acquisition_trigger + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_blaze/services/acquisition_trigger + + Request + + Dieser Service hat keine Argumente. + + Response + + Mögliche Rückgabewerte sind in der Tabelle unten aufgeführt. + + Mögliche Rückgabewerte des acquisition_trigger Serviceaufrufs. + Code Beschreibung 0 Erfolgreich -8 Triggern ist nur im + Einzelbild-Modus möglich. 101 Triggern wird ignoriert, da bereits + ein anderer Triggeraufruf stattfindet. 102 Triggern wird + ignoriert, da keine Empfänger registriert sind. + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "acquisition_trigger", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +reset_defaults + + stellt die Werkseinstellungen der Parameter dieses Moduls wieder + her und wendet sie an („factory reset“). + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/services/reset_defaults + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_blaze/services/reset_defaults + + Request + + Dieser Service hat keine Argumente. + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "reset_defaults", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } diff --git a/v24.04/de/_sources/cadmatch.rst.txt b/v24.04/de/_sources/cadmatch.rst.txt new file mode 100644 index 0000000..56ba535 --- /dev/null +++ b/v24.04/de/_sources/cadmatch.rst.txt @@ -0,0 +1,2359 @@ +CADMatch + +Einleitung + +Das CADMatch Modul ist ein optionales Modul des + +rc_visard NG + + und benötigt eine eigene + +Lizenz + +, welche erworben werden muss. + +Dieses Modul bietet eine gebrauchsfertige Lösung für die 3D- +Objekterkennung anhand von CAD-Templates und liefert Greifpunkte für +allgemeine Greifer. Die Objekte können sich in einer Kiste (Bin, Load +Carrier) oder frei platziert im Erfassungsbereich der Kamera befinden. + +Für jedes Objekt, das mit dem CADMatch-Modul erkannt werden soll, wird +ein Template benötigt. Um Templates zu erhalten, setzen Sie sich bitte +mit dem Roboception Support ( + +Kontakt + +) in Verbindung. + +Das CADMatch-Modul bietet darüber hinaus: + +eine intuitiv gestaltete Bedienoberfläche für Inbetriebnahme, +Konfiguration und Test auf der rc_visard NG Web GUI\:(Abschnitt +\ref{webgui:sect-web-gui}) + +eine REST-API-Schnittstelle\:(Abschnitt \ref{rest_api:sect-rest-api}) +und eine KUKA Ethernet KRL Schnittstelle\:(Abschnitt \ref{eki:sect- +eki}) + +die Möglichkeit, sogenannte Regions of Interest (ROIs) zu definieren, +um relevante Teilbereiche der Szene auszuwählen (siehe RoiDB, +Abschnitt \ref{roi:sect-roi}) + +eine integrierte Load Carrier Erkennung (siehe LoadCarrier, Abschnitt +\ref{loadcarrier:sect-loadcarrier}), um in Bin-Picking-Anwendungen +("Griff in die Kiste") Greifpunkte nur für Objekte in dem erkannten +Load Carrier zu berechnen + +die Unterstützung von Load Carriern mit Abteilen, sodass Greifpunkte +für Objekte nur in einem definierten Teilvolumen des Load Carriers +berechnet werden + +die Option benutzerdefinierte Posenvorgaben zu nutzen + +die Speicherung von bis zu 50 Templates + +die Definition von bis zu 100 Greifpunkten für jedes Template über +eine interaktive Visualisierung in der Web GUI + +eine Kollisionsprüfung zwischen Greifer und Load Carrier, anderen +erkannten Objekten, und/oder der Punktwolke + +eine Kollisionsprüfung zwischen dem Objekt im Greifer und den Wänden +des Load Carriers während der Entnahme + +die Unterstützung von sowohl statisch montierten als auch +robotergeführten Kameras. Optional kann es mit der Hand-Auge- +Kalibrierung (Abschnitt \ref{handeye_calibration:sect-handeye- +calibration}) kombiniert werden, um Greifposen in einem +benutzerdefinierten externen Koordinatensystem zu liefern. + +Auswahl einer Strategie zum Sortieren der erkannten Objekte und +zurückgelieferten Greifpunkte + +eine 3D Visualisierung des Detektionsergebnisses mit Greifpunkten und +einer Greiferanimation in der Web GUI + +Setzen von Greifpunkten + +Das CADMatch-Modul erkennt 3D-Objekte in einer Szene basierend auf +einem CAD-Template und liefert die Posen der Objektursprünge zurück. +Um das CADMatch-Modul direkt in einer Roboteranwendung zu nutzen, +können für jedes Template bis zu 100 Greifpunkte definiert werden. Ein +Greifpunkt repräsentiert die gewünschte Position und Orientierung des +Roboter-TCPs (Tool Center Point), mit der das Objekt gegriffen werden +kann. + +Weitere Details sind unter + +Setzen von Greifpunkten + + beschrieben. + +Setzen von Greifpunkten in der Web GUI + +Die + +rc_visard NG + + Web GUI bietet eine interaktive und intuitive Möglichkeit, +Greifpunkte für Objekt-Templates zu setzen. Im ersten Schritt muss das +Objekt-Template auf den + +rc_visard NG + + hochgeladen werden. Das kann über die Web GUI in einer beliebigen +Kamerapipeline unter Module ‣ CADMatch erfolgen, indem im Abschnitt + +Templates, Greifpunkte und Posenvorgaben + + auf + Neues Template hinzufügen geklickt wird, oder unter Datenbank ‣ +Templates im Abschnitt + +CADMatch Templates, Greifpunkte und Posenvorgaben + +. Wenn der Upload abgeschlossen ist, erscheint ein Fenster mit einer +3D-Visualisierung des Objekts, in dem Greifpunkte hinzugefügt oder +existierende Greifpunkte bearbeitet werden können. Dasselbe Fenster +erscheint, wenn ein vorhandenes Template bearbeitet wird. + +Weitere Details werden in + +Setzen von Greifpunkten in der Web GUI + + beschrieben. + +Setzen von Greifpunkten über die REST-API + +Greifpunkte können über die + +REST-API-Schnittstelle + + mithilfe des "set_grasp" oder "set_all_grasps" Services gesetzt +werden (siehe + +Interne Services + +). + +Weitere Details werden in + +Setzen von Greifpunkten über die REST-API + + beschrieben. + +Setzen von Posenvorgaben + +Das CADMatch Modul bietet die Möglichkeit, Posenvorgaben für die zu +erkennenden Objekte zu definieren. Wenn eine Posenvorgabe gesetzt ist, +nutzt die Objekterkennung diese Pose und führt nur eine Verfeinerung +durch. Dadurch wird die Erkennung deutlich beschleunigt. Eine +Posenvorgabe stellt die ungefähre Position und Orientierung des zu +erkennenden Objekts dar. Die Pose kann im Kamera- oder im externen +Koordinatensystem definiert werden, wenn eine Hand-Auge-Kalibrierung +verfügbar ist. + +Jede Posenvorgabe enthält eine "id", die eindeutig über alle +Posenvorgaben eines Objekt-Templates sein muss, die ID des Templates +("template_id"), zu dem die Posenvorgabe hinzugefügt wird, die +Posenvorgabe ("pose") und das Koordinatensystem ("pose_frame") der +Pose. Posenvorgaben können über die + +REST-API-Schnittstelle + +, oder über die interaktive Visualisierung in der Web GUI definiert +werden. Die Web GUI ermöglicht die interaktive Positionierung des +Objekts in der aktuellen Punktwolke. Dies kann im Reiter +"Posenvorgaben" während des Editieren eines Templates geschehen. + +Posenvorgaben können in Anwendungen genutzt werden, in denen die +ungefähren Posen der Objekte im Voraus bekannt sind. Der + +rc_visard NG + + kann bis zu 50 Posenvorgaben pro Template speichern. + +Setzen der bevorzugten TCP-Orientierung + +Das CADMatch-Modul berechnet die Erreichbarkeit von Greifpunkten +basierend auf der bevorzugten Orientierung des Greifers oder TCPs. Die +bevorzugte Orientierung kann über den Service +"set_preferred_orientation" oder über die + +CADMatch + +-Seite in der Web GUI gesetzt werden. Die bevorzugten Orientierung des +TCPs wird genutzt, um Greifpunkte zu verwerfen, die der Greifer nicht +erreichen kann, und kann auch zur Sortierung der Greifpunkte genutzt +werden. + +Die bevorzugte TCP-Orientierung kann im Kamerakoordinatensystem oder +im externen Koordinatensystem gesetzt werden, wenn eine Hand-Auge- +Kalibrierung verfügbar ist. Wenn die bevorzugte TCP-Orientierung im +externen Koordinatensystem definiert ist, und der Sensor am Roboter +montiert ist, muss bei jedem Aufruf der Objekterkennung die aktuelle +Roboterpose angegeben werden, damit die bevorzugte Orientierung zur +Filterung und optional zur Sortierung der Greifpunkte auf den +erkannten Objekten genutzt werden kann. Wenn keine bevorzugte TCP- +Orientierung gesetzt wird, wird die Orientierung der linken Kamera als +die bevorzugte TCP-Orientierung genutzt. + +Setzen der Sortierstrategie + +Die vom "detect_object" Service zurückgelieferten Matches und +Greifpunkte werden gemäß einer Sortierstrategie sortiert, die vom +Nutzer gewählt werden kann. Folgende Sortierstrategien sind verfügbar +und können über die + +Web GUI + + oder über den "set_sorting_strategies" Service gesetzt werden: + +gravity: die entlang der Gravitationsrichtung am höchsten gelegenen +Matches und Greifpunkte werden zuerst zurückgeliefert. + +match_score: Matches mit dem höchsten Match Score und Greifpunkte auf +Objekten mit dem höchsten Match Score werden zuerst zurückgeliefert. + +preferred_orientation: Matches und Greifpunkte mit der geringsten +Rotationsänderung zwischen ihrer Orientierung und der bevorzugten TCP- +Orientierung werden zuerst zurückgeliefert. + +direction: Matches und Greifpunkte mit dem kleinsten Abstand entlang +der gesetzten Sortierrichtung vector im angegebenen +Referenzkoordinatensystem pose_frame werden zuerst zurückgeliefert. + +Wenn keine Sortierstrategie gesetzt ist, oder die Standard- +Sortierstrategie in der Web GUI ausgewählt ist, geschieht die +Sortierung der Greifpunkte basierend auf einer Kombination von +"match_score" und dem kleinsten Abstand entlang der z-Achse der +bevorzugten TCP-Orientierung von der Kamera. + +Objekterkennung + +Das CADMatch-Modul benötigt ein Objekt-Template für die +Objekterkennung. Dieses Template enthält Informationen über die +dreidimensionale Form des Objekts und markante Kanten, die im +Kamerabild sichtbar sein können. CADMatch unterstützt auch partielle +Objekt-Templates, die nur einen bestimmten Teil des Objekts +beinhalten, der gut erkannt werden kann, zum Beispiel im Fall von +Verdeckungen. Weiterhin gibt es Templates, die eine Posenvorgabe zur +Erkennung benötigen, die dann nur mit Hilfe die Bilddaten verfeinert +wird. + +Die Objekterkennung ist ein zweistufiger Prozess bestehend aus einem +initialen Schätzungsschritt und einem Posenverfeinerungsschritt. Als +erstes wird die initiale Pose des Objekts anhand der Erscheinung des +Objekts im Kamerabild berechnet. Als zweiter Schritt wird die +geschätzte Pose anhand der 3D-Punktwolke und der Kanten im Kamerabild +verfeinert. Damit das funktionieren kann, müssen die zu detektierenden +Objekte im linken und rechten Kamerabild sichtbar sein. Wenn +Posenvorgaben gesetzt wurden, findet nur der zweite +Verfeinerungsschritt statt, was die Laufzeit deutlich verringert. + +Um eine Objekterkennung durchzuführen, müssen im Allgemeinen die +folgenden Serviceargumente an das CADMatch-Modul übergeben werden: + +die ID des Objekt-Templates, welches in der Szene erkannt werden soll + +das Koordinatensystem, in dem die Posen der detektierten Objekte +zurückgegeben werden sollen (siehe Hand-Auge-Kalibrierung, Abschnitt +\ref{cadmatch:sect-cadmatch-hand-eye-dep}) + +Optional können auch folgende Serviceargumente an das CADMatch-Modul +übergeben werden: + +die IDs der Posenvorgaben, die ungefähr den Posen der zu erkennenden +Objekten entsprechen. Falls ein Template verwendet wird, das eine +Posenvorgabe benötigt, müssen eine oder mehrere Posenvorgaben +angegeben werden. + +die ID des Load Carriers, der die zu detektierenden Objekte enthält + +ein Unterabteil (load_carrier_compartment) innerhalb eines Load +Carriers, in dem Objekte erkannt werden sollen (siehe Load Carrier +Abteile, Abschnitt \ref{loadcarrier_db:sect-loadcarrier-compartment}). + +die ID der Region of Interest, innerhalb der nach dem Load Carrier +gesucht wird, oder -- falls kein Load Carrier angegeben ist -- die +Region of Interest, innerhalb der Objekte erkannt werden sollen + +die aktuelle Roboterpose, wenn die Kamera am Roboter montiert ist und +als Koordinatensystem external gewählt wurde, oder die bevorzugte TCP- +Orientierung im externen Koordinatensystem angegeben ist, oder die +gewählte Region of Interest im externen Koordinatensystem definiert +ist + +Informationen für die Kollisionsprüfung: Die ID des Greifers, um die +Kollisionsprüfung zu aktivieren, und optional ein Greif-Offset, der +die Vorgreifposition definiert. Details zur Kollisionsprüfung sind in +CollisionCheck\:(Abschnitt \ref{cadmatch:sect-cadmatch-collision- +check-dep}) gegeben. + +Datenaufnahme-Modus: Der Nutzer kann auswählen, ob ein neuer +Bilddatensatz für die Erkennung aufgenommen werden soll +(Standardwert), oder ob die Detektion mit den zuletzt verwendeten +Bilddaten durchgeführt soll.Dies spart die Bildaufnahmezeit, z.B. für +den Fall, dass verschiedene Templates im selben Bild erkannt werden +sollen. + +In der Web GUI kann die Objekterkennung in Bereich + +Ausprobieren + + auf der + +CADMatch + +-Seite getestet werden. + +Die erkannten Objekte werden in einer Liste von "matches" +zurückgeliefert, die entsprechend der gewählten Sortierstrategie +sortiert ist. Jedes erkannte Objekt enthält eine "uuid" (Universally +Unique Identifier) und den Zeitstempel ("timestamp") des ältesten +Bildes, das zur Erkennung benutzt wurde. Die Pose ("pose") eines +erkannten Objekts entspricht der Pose des Ursprungs des +Koordinatensystems des Objekt-Templates, das zur Detektion verwendet +wurde. Weiterhin wird ein Matching-Score zurückgegeben, der die +Qualität der Erkennung angibt. + +Wenn das ausgewählte Template auch Greifpunkte hat (siehe + +Setzen von Greifpunkten + +), dann wird zusätzlich zu den erkannten Objekten auch eine Liste von +Greifpunkten ("grasps") für alle erkannten Objekte zurückgegeben. +Diese Liste ist gemäß der gewählten Sortierstrategie sortiert (siehe + +Setzen der Sortierstrategie + +). Die Posen der Greifpunkte sind im gewünschten Koordinatensystem +angegeben. Die erkannten Objekte und die Greifpunkte können über ihre +UUIDs einander zugeordnet werden. + +Für Objekte mit einer diskreten Symmetrie (z.B. prismatische Objekte), +werden alle kollisionsfreien Symmetrien jedes Greifpunkts, die +entsprechend der gesetzten bevorzugten TCP-Orientierung erreichbar +sind, zurückgeliefert, und gemäß der gewählten Sortierstrategie +sortiert. + +Bei Objekten mit einer kontinuierlichen Symmetrie (z.B. zylindrische +Objekte), werden alle Symmetrien eines Greifpunkts auf Erreichbarkeit +und Kollisionsfreiheit geprüft, und anschließend nur der jeweilige +beste gemäß der gewählten Sortierstrategie zurückgeliefert. + +Bemerkung: Der erste Aufruf der Objekterkennung mit einem neuen + Objekt-Template dauert etwas länger als die nachfolgenden Aufrufe, + weil das Template erst in das CADMatch-Modul geladen werden muss. Um + das zu vermeiden, kann der "warmup_template" Service genutzt werden, + der das Template lädt damit es bereit ist, wenn die erste Detektion + getriggert wird. + +Wechselwirkung mit anderen Modulen + +Die folgenden, intern auf dem + +rc_visard NG + + laufenden Module liefern Daten für das CADMatch-Modul oder haben +Einfluss auf die Datenverarbeitung. + +Bemerkung: Jede Konfigurationsänderung dieser Module kann direkte + Auswirkungen auf die Qualität oder das Leistungsverhalten des + CADMatch-Moduls haben. + +Stereokamera und Stereo-Matching + +Folgende Daten werden vom CADMatch-Modul verarbeitet: + +die rektifizierten Bilder des Kamera-Moduls (rc_camera, Abschnitt +\ref{stereo_camera:sect-stereo-camera}) + +die Disparitäts-, Konfidenz- und Fehlerbilder des Stereo-Matching- +Moduls (rc_stereomatching, Abschnitt \ref{stereo_matching:sect-stereo- +matching}) + +Der Parameter + +Qualität + + ("quality") des Stereo-Matching-Moduls muss auf "Medium" oder höher +gesetzt werden (siehe + +Parameter + +). Die Einstellung "Full" oder "High" wird für CADMatch empfohlen. + +Für alle genutzten Bilder ist garantiert, dass diese nach dem Auslösen +des Services aufgenommen wurden. + +IOControl und Projektor-Kontrolle + +Für den Anwendungsfall, dass der + +rc_visard NG + + zusammen mit einem externen Musterprojektor und dem Modul für + +IOControl und Projektor-Kontrolle + + ("rc_iocontrol") betrieben wird, wird empfohlen, den Projektor an +GPIO Out 1 anzuschließen und den Aufnahmemodus des Stereokamera-Moduls +auf "SingleFrameOut1" zu setzen (siehe + +Stereomatching-Parameter + +), damit bei jedem Aufnahme-Trigger ein Bild mit und ohne +Projektormuster aufgenommen wird. + +Alternativ kann der verwendete digitale Ausgang in den Betriebsmodus +"ExposureAlternateActive" geschaltet werden (siehe + +Beschreibung der Laufzeitparameter + +). + +In beiden Fällen sollte die Belichtungszeitregelung ("exp_auto_mode") +auf "AdaptiveOut1" gesetzt werden, um die Belichtung beider Bilder zu +optimieren (siehe + +Stereokamera-Parameter + +). + +Hand-Auge-Kalibrierung + +Falls die Kamera zu einem Roboter kalibriert wurde, kann das CADMatch- +Modul automatisch Posen im Roboterkoordinatensystem ausgeben. Für die + +Services + + kann das Koordinatensystem der berechneten Posen mit dem Argument +"pose_frame" spezifiziert werden. + +Zwei verschiedene Werte für "pose_frame" können gewählt werden: + +Kamera-Koordinatensystem (camera): Alle Posen sind im Kamera- +Koordinatensystem angegeben und es ist kein zusätzliches Wissen über +die Lage der Kamera in seiner Umgebung notwendig. Das bedeutet +insbesondere, dass sich ROIs oder Load Carrier, welche in diesem +Koordinatensystem angegeben sind, mit der Kamera bewegen. Es liegt +daher in der Verantwortung des Anwenders, in solchen Fällen die +entsprechenden Posen der Situation entsprechend zu aktualisieren +(beispielsweise für den Anwendungsfall einer robotergeführten Kamera). + +Benutzerdefiniertes externes Koordinatensystem (external): Alle Posen +sind im sogenannten externen Koordinatensystem angegeben, welches vom +Nutzer während der Hand-Auge-Kalibrierung gewählt wurde. In diesem +Fall bezieht das CADMatch-Modul alle notwendigen Informationen über +die Kameramontage und die kalibrierte Hand-Auge-Transformation +automatisch vom Modul Hand-Auge-Kalibrierung\:(Abschnitt +\ref{handeye_calibration:sect-handeye-calibration}). Für den Fall +einer robotergeführten Kamera ist vom Nutzer zusätzlich die jeweils +aktuelle Roboterpose robot_pose anzugeben. + +Bemerkung: Wenn keine Hand-Auge-Kalibrierung durchgeführt wurde bzw. + zur Verfügung steht, muss als Referenzkoordinatensystem "pose_frame" + immer "camera" angegeben werden. + +Zulässige Werte zur Angabe des Referenzkoordinatensystems sind +"camera" und "external". Andere Werte werden als ungültig +zurückgewiesen. + +Für den Fall einer robotergeführten Kamera ist es abhängig von +"pose_frame", der bevorzugten TCP-Orientierung und der Sortierrichtung +nötig, zusätzlich die aktuelle Roboterpose ("robot_pose") zur +Verfügung zu stellen: + +Wenn external als pose_frame ausgewählt ist, ist die Angabe der +Roboterpose obligatorisch. + +Wenn die bevorzugte TCP-Orientierung in external definiert ist, ist +die Angabe der Roboterpose obligatorisch. + +Wenn die Sortierrichtung in external definiert ist, ist die Angabe der +Roboterpose obligatorisch. + +In allen anderen Fällen ist die Angabe der Roboterpose optional. + +LoadCarrier + +Das CADMatch Modul nutzt die Funktionalität zur Load Carrier Erkennung +aus dem + +LoadCarrier + + Modul ("rc_load_carrier") mit den Laufzeitparametern, die für dieses +Modul festgelegt wurden. Wenn sich jedoch mehrere Load Carrier in der +Szene befinden, die zu der angegebenen Load Carrier ID passen, wird +nur einer davon zurückgeliefert. In diesem Fall sollte eine 3D Region +of Interest gesetzt werden, um sicherzustellen, dass immer derselbe +Load Carrier für das CADMatch Modul verwendet wird. + +CollisionCheck + +Die Kollisionsprüfung kann für die Greifpunktberechnung des CADMatch- +Moduls aktiviert werden, indem das "collision_detection" Argument an +den "detect_object" Service übergeben wird. Es enthält die ID des +benutzten Greifers und optional einen Greif-Offset. Der Greifer muss +im GripperDB Modul definiert werden (siehe + +Erstellen eines Greifers + +) und Details über die Kollisionsprüfung werden in + +Integrierte Kollisionsprüfung in anderen Modulen + + gegeben. + +Alternativ können Greifpunkten individuell Greifer IDs zugewiesen +werden, und die Kollisionsprüfung kann für alle Greifpunkte mit einer +Greifer ID über den Laufzeitparameter "check_collisions" eingeschaltet +werden. + +Wenn das ausgewählte CADMatch Template eine Kollisionsgeometrie +enthält und der Laufzeitparameter "check_collisions_with_matches" auf +true gesetzt ist, werden auch Kollisionen zwischen dem Greifer und den +anderen detektierten Objekten (nicht limitiert auf die Anzahl +"max_matches") geprüft. Dabei ist das Objekt, auf dem sich der +jeweilige Greifpunkt befindet, von der Prüfung ausgenommen. + +Wenn der Laufzeitparameter "check_collisions_with_point_cloud" auf +true gesetzt ist, werden auch Kollisionen zwischen dem Greifer und +einer wasserdichten Version der Punktwolke geprüft. Wenn diese +Funktionalität in Kombination mit Sauggreifern genutzt wird, muss +sichergestellt werden, dass sich der TCP außerhalb der +Greifergeometrie befindet, oder dass die Greifpunkte oberhalb der +Objektoberfläche definiert sind. Andernfalls wird für jeden Greifpunkt +eine Kollision zwischen Greifer und Punktwolke erkannt. + +Wenn der Laufzeitparameter "check_collisions_during_retraction" auf +true gesetzt ist, und ein Load Carrier sowie ein Greif-Offset +angegeben wurden, wird jeder Greifpunkt auf Kollisionen zwischen dem +Objekt im Greifer und den Wänden des Load Carriers während der +Entnahme geprüft. Die Prüfung findet auf der gesamten linearen +Trajektorie von der Greifposition bis zurück zur Vorgreifposition +statt. + +Wenn die Kollisionsprüfung aktiviert ist, werden nur Greifpunkte +zurückgeliefert, die kollisionsfrei sind, oder die nicht auf +Kollisionen geprüft werden konnten (z.B. weil kein Greifer angegeben +wurde). In der Ergebnis-Visualisierung oben auf der + +CADMatch + +-Seite der Web GUI werden kollisionsfreie Greifpunkte grün +dargestellt, ungeprüfte Greifpunkte gelb und kollidierende Greifpunkte +rot. Die erkannten Objekte, die bei der Kollisionsprüfung betrachtet +werden, werden mit roten Kanten visualisiert. + +Die Laufzeitparameter des CollisionCheck-Moduls beeinflussen die +Kollisionserkennung wie in + +CollisionCheck-Parameter + + beschrieben. + +Parameter + +Das CADMatch-Modul wird in der REST-API als "rc_cadmatch" bezeichnet +und in der + +Web GUI + + unter Module ‣ CADMatch dargestellt. Der Benutzer kann die Parameter +entweder dort oder über die + +REST-API-Schnittstelle + + ändern. + +Übersicht über die Parameter + +Dieses Softwaremodul bietet folgende Laufzeitparameter: + +Laufzeitparameter des rc_cadmatch-Moduls Name Typ Min. +Max. Default Beschreibung check_collisions bool false true +false Gibt an, ob Kollisionen geprüft werden sollen, wenn ein Greifer +für einen Greifpunkt definiert wurde +check_collisions_-during_retraction bool false true false Gibt +an, ob Kollisionen zwischen dem Objekt im Greifer und dem Load Carrier +während der Entnahme geprüft werden check_collisions_with_matches +bool false true true Gibt an, ob Kollisionen zwischen Greifer und +anderen Matches geprüft werden check_collisions_-with_point_cloud +bool false true false Gibt an, ob Kollisionen zwischen Greifer und +der Punktwolke geprüft werden edge_max_distance float64 0.5 5.0 +2.0 Der maximale tolerierte Abstand zwischen den Templatekanten und +den detektierten Kanten im Bild in Pixeln edge_sensitivity float64 +0.05 1.0 0.5 Empfindlichkeit des Kantendetektors +grasp_filter_-orientation_threshold float64 0.0 180.0 45.0 +Maximal erlaubte Orientierungsabweichung zwischen Greifpunkt und +bevorzugter TCP-Orientierung in Grad max_matches int32 1 30 10 +Maximale Anzahl von Matches min_score float64 0.05 1.0 0.3 +Minimaler Score für Matches only_highest_priority_grasps bool false +true false Gibt an, ob ausschließlich Greifpunkte der höchsten +Priorität zurückgegeben werden sollen. + +Beschreibung der Laufzeitparameter + +Die Laufzeitparameter werden zeilenweise auf der + +CADMatch + +-Seite in der Web GUI dargestellt. Im folgenden wird der Name des +Parameters in der Web GUI in Klammern hinter dem eigentlichen +Parameternamen angegeben. Die Parameter sind in derselben Reihenfolge +wie in der Web GUI aufgelistet: + +max_matches (Maximale Matches) + + ist die maximale Anzahl der zu erkennenden Objekte. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?max_matches= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?max_matches= + +min_score (Minimaler Score) + + ist der minimale Score für die Erkennung nach der + Posenverfeinerung. Umso höher dieser Wert ist, umso besser + müssen die 2D-Kanten und die 3D-Punktwolke mit dem angegebenen + Template übereinstimmen. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?min_score= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?min_score= + +edge_sensitivity (Kantenempfindlichkeit) + + ist die Empfindlichkeit des Kantendetektors. Umso höher dieser + Wert ist, umso mehr Kanten werden für die Posenverfeinerung + genutzt. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?edge_sensitivity= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?edge_sensitivity= + +edge_max_distance (Maximale Kantendistanz) + + ist die maximal erlaubte Distanz in Pixeln zwischen den + Templatekanten und den detektierten Kanten im Bild während der + Posenverfeinerung. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?edge_max_distance= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?edge_max_distance= + +grasp_filter_orientation_threshold (Maximale Abweichung) + + ist die maximale Abweichung der TCP-z-Achse am Greifpunkt von + der z-Achse der bevorzugten TCP-Orientierung in Grad. Es werden + nur Greifpunkte zurückgeliefert, deren Orientierungsabweichung + kleiner als der angegebene Wert ist. Falls der Wert auf Null + gesetzt wird, sind alle Abweichungen valide. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?grasp_filter_orientation_threshold= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?grasp_filter_orientation_threshold= + +only_highest_priority_grasps (Nur Greifpunkte höchster Priorität) + + Wenn dieser Parameter auf *true* gesetzt ist, werden ausschließlich + Greifpunkte der höchsten Priorität zurückgegeben. Sofern die + Kollisionsprüfung aktiviert ist, werden ausschließlich + kollisionsfreie Greifpunkt der höchstmöglichen Priorität + zurückgegeben. Dadurch kann Rechenzeit gespart und die Anzahl der + applikationsseitig zu verarbeitenden Greifpunkte reduziert werden. + + Ohne Kollisionsprüfung werden ausschließlich Greifpunkte der + höchsten Priorität zurückgegeben. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?only_highest_priority_grasps= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?only_highest_priority_grasps= + +check_collisions (Kollisionsprüfung) + + Wenn diese Option aktiv ist, wird die Kollisionsprüfung für alle + Greifpunkte durchgeführt, denen eine Greifer ID zugewiesen + wurde, auch wenn kein Standardgreifer im "detect_object" Service + gesetzt wurde. Wenn ein Load Carrier verwendet wird, wird die + Kollisionsprüfung immer zwischen dem Greifer und dem Load + Carrier durchgeführt. Kollisionen mit der Punktwolke oder + anderen Matches werden nur geprüft, wenn die zugehörigen + Laufzeitparameter aktiv sind. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?check_collisions= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?check_collisions= + +check_collisions_with_matches (Kollisionsprüfung mit Matches) + + Dieser Parameter wird nur beachtet, wenn die Kollisionsprüfung + durch Übergabe eines Greifers an den "detect_object" Service + oder durch Setzen des Parameters "check_collisions" aktiviert + ist. Wenn "check_collisions_with_matches" auf true gesetzt ist, + werden alle Greifpunkte auf Kollisionen zwischen dem Greifer und + den anderen Matches (nicht begrenzt auf die Anzahl + "max_matches") geprüft. Nur Greifpunkte, bei denen der Greifer + nicht in Kollision mit anderen Matches wäre, werden + zurückgeliefert. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?check_collisions_with_matches= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?check_collisions_with_matches= + +check_collisions_with_point_cloud (Kollisionsprüfung mit Punktwolke) + + Dieser Parameter wird nur beachtet, wenn die Kollisionsprüfung + durch Übergabe eines Greifers an den "detect_object" Service + oder durch Setzen des Parameters "check_collisions" aktiviert + ist. Wenn "check_collisions_with_point_cloud" auf true gesetzt + ist, werden alle Greifpunkte auf Kollisionen zwischen dem + Greifer und einer wasserdichten Version der Punktwolke geprüft. + Nur Greifpunkte, bei denen der Greifer nicht in Kollision mit + dieser Punktwolke wäre, werden zurückgeliefert. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?check_collisions_with_point_cloud= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?check_collisions_with_point_cloud= + +check_collisions_during_retraction (Kollisionsprüfung während +Entnahme) + + Dieser Parameter wird nur beachtet, wenn die Kollisionsprüfung + durch Übergabe eines Greifers an den "detect_object" Service + oder durch Setzen des Parameters "check_collisions" aktiviert + ist. Wenn "check_collisions_during_retraction" auf true gesetzt + ist und ein Load Carrier sowie ein Greif-Offset angegeben + wurden, wird jeder Greifpunkt auf Kollisionen zwischen dem + Objekt im Greifer und den Wänden des Load Carriers während der + Entnahme geprüft. Die Prüfung findet auf der gesamten linearen + Trajektorie von der Greifposition bis zurück zur + Vorgreifposition statt. Es werden nur kollisionsfreie + Greifpunkte zurückgeliefert. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?check_collisions_during_retraction= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?check_collisions_during_retraction= + +Statuswerte + +Das CADMatch-Modul meldet folgende Statuswerte. + +Statuswerte des rc_cadmatch-Moduls Name Beschreibung +data_acquisition_time Zeit in Sekunden, für die beim letzten Aufruf +auf Bilddaten gewartet werden musste last_timestamp_processed +Zeitstempel des letzten verarbeiteten Bilddatensatzes +last_request_timestamp Zeitstempel der letzten Detektionsanfrage +load_carrier_detection_time Berechnungszeit für die letzte Load +Carrier Detektion in Sekunden object_detection_time Berechnungszeit +für die letzte Objekterkennung in Sekunden processing_time +Berechnungszeit für die letzte Detektion (einschließlich Load Carrier +Detektion) in Sekunden state Aktueller Zustand des CADMatch-Moduls + +Folgende "state"-Werte werden gemeldet. + +Mögliche Werte für den Zustand des CADMatch-Moduls Zustand +Beschreibung IDLE Das Modul ist inaktiv. RUNNING Das Modul wurde +gestartet und ist bereit, Load Carrier und Objekte zu erkennen. FATAL +Ein schwerwiegender Fehler ist aufgetreten. + +Services + +Die angebotenen Services von "rc_cadmatch" können mithilfe der + +REST-API-Schnittstelle + + oder der + +rc_visard NG + + +Web GUI + + ausprobiert und getestet werden. + +Das CADMatch-Modul stellt folgende Services zur Verfügung. + +detect_object + + führt eine Objekterkennung basierend auf einem Template durch, wie + in + + Objekterkennung + + beschrieben. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/detect_object + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/services/detect_object + + Request + + Obligatorische Serviceargumente: + + "pose_frame": siehe + + Hand-Auge-Kalibrierung + + . + + "template_id": ID des Templates, welches erkannt werden soll. + + Möglicherweise benötigte Serviceargumente: + + "robot_pose": siehe + + Hand-Auge-Kalibrierung + + . + + "pose_prior_ids": IDs der Posenvorgaben für die zu + erkennenden Objekte. Falls das ausgewählte Template eine + Posenvorgabe für die Erkennung benötigt, dann muss dieses + Argument angegeben werden. + + Optionale Serviceargumente: + + "load_carrier_id": ID des Load Carriers, welcher die zu + erkennenden Objekte enthält. + + "load_carrier_compartment": Teilvolumen (Fach oder Abteil) in + einem zu detektierenden Load Carrier (Behälter), in dem Objekte + erkannt werden sollen (siehe + + Load Carrier Abteile + + ). + + "region_of_interest_id": Falls "load_carrier_id" gesetzt ist, + die ID der 3D Region of Interest, innerhalb welcher nach dem + Load Carrier gesucht wird. Andernfalls die ID der 3D Region of + Interest, in der nach Objekten gesucht wird. + + "collision_detection": siehe + + Integrierte Kollisionsprüfung in anderen Modulen + + "data_acquisition_mode": Falls der Aufnahmemodus auf + "CAPTURE_NEW" (Standardwert) gesetzt ist, wird ein neuer Bild- + Datensatz für die Detektion aufgenommen. Falls der Modus auf + "USE_LAST" gesetzt wird, wird der Datensatz der vorherigen + Detektion erneut verwendet." + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "collision_detection": { + "gripper_id": "string", + "pre_grasp_offset": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "data_acquisition_mode": "string", + "load_carrier_compartment": { + "box": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + } + }, + "load_carrier_id": "string", + "pose_frame": "string", + "pose_prior_ids": [ + "string" + ], + "region_of_interest_id": "string", + "robot_pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "template_id": "string" + } + } + + Response + + "grasps": Liste von Greifpunkten auf den erkannten Objekten. Die + Greifpunkte sind gemäß der gewählten Sortierstrategie sortiert. Die + "match_uuid" gibt eine Referenz auf das detektierte Objekt in + "matches" an, zu dem dieser Greifpunkt gehört. Die Liste der + Greifpunkte wird auf die 100 besten Greifpunkte gekürzt, falls mehr + erreichbare Greifpunkte gefunden werden. Jeder Greifpunkt enthält + ein Flag "collision_checked" und das Feld "gripper_id" (siehe + + Integrierte Kollisionsprüfung in anderen Modulen + + ). + + "load_carriers": Liste der erkannten Load Carrier (Behälter). + + "matches": Liste der erkannten Objekte für das angegebene Template, + sortiert gemäß der gewählten Sortierstrategie. Der "score" gibt an, + wie gut das Objekt mit dem Template übereinstimmt. Die + "grasp_uuids" geben die Greifpunkte in der "grasps"-Liste an, die + auf diesem Objekt erreichbar sind. + + "timestamp": Zeitstempel des Bildes, auf dem die Erkennung + durchgeführt wurde. + + "return_code": enthält mögliche Warnungen oder Fehlercodes und + Nachrichten. + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "detect_object", + "response": { + "grasps": [ + { + "collision_checked": "bool", + "gripper_id": "string", + "id": "string", + "match_uuid": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "priority": "int8", + "timestamp": { + "nsec": "int32", + "sec": "int32" + }, + "uuid": "string" + } + ], + "load_carriers": [ + { + "height_open_side": "float64", + "id": "string", + "inner_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "outer_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "overfilled": "bool", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "rim_ledge": { + "x": "float64", + "y": "float64" + }, + "rim_step_height": "float64", + "rim_thickness": { + "x": "float64", + "y": "float64" + }, + "type": "string" + } + ], + "matches": [ + { + "grasp_uuids": [ + "string" + ], + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "score": "float32", + "template_id": "string", + "timestamp": { + "nsec": "int32", + "sec": "int32" + }, + "uuid": "string" + } + ], + "return_code": { + "message": "string", + "value": "int16" + }, + "timestamp": { + "nsec": "int32", + "sec": "int32" + } + } + } + +set_preferred_orientation + + speichert die bevorzugte TCP-Orientierung zum Berechnen der + Erreichbarkeit der Greifpunkte, die zur Filterung und optional zur + Sortierung der vom "detect_object" Service zurückgelieferten + Greifpunkte verwendet wird (siehe + + Setzen der bevorzugten TCP-Orientierung + + ). + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/set_preferred_orientation + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/services/set_preferred_orientation + + Request + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "pose_frame": "string" + } + } + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "set_preferred_orientation", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +get_preferred_orientation + + gibt die bevorzugte TCP-Orientierung zurück, die für die Filterung + und optional für die Sortierung der vom "detect_object" Service + zurückgelieferten Greifpunkte verwendet wird (siehe + + Setzen der bevorzugten TCP-Orientierung + + ). + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/get_preferred_orientation + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/services/get_preferred_orientation + + Request + + Dieser Service hat keine Argumente. + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "get_preferred_orientation", + "response": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "pose_frame": "string", + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +set_sorting_strategies + + speichert die gewählte Strategie zur Sortierung der Greifpunkte und + erkannten Objekte, die vom "detect_object" Service zurückgeliefert + werden (siehe + + Objekterkennung + + ). + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/set_sorting_strategies + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/services/set_sorting_strategies + + Request + + Nur eine Sortierstrategie darf einen Gewichtswert "weight" größer + als 0 haben. Wenn alle Werte für "weight" auf 0 gesetzt sind, wird + die Standardsortierstrategie verwendet. + + Wenn der Wert "weight" für "direction" gesetzt ist, muss "vector" + den Richtungsvektor enthalten und "pose_frame" auf "camera" oder + "external" gesetzt sein. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "direction": { + "pose_frame": "string", + "vector": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "weight": "float64" + }, + "gravity": { + "weight": "float64" + }, + "match_score": { + "weight": "float64" + }, + "preferred_orientation": { + "weight": "float64" + } + } + } + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "set_sorting_strategies", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +get_sorting_strategies + + gibt die gewählte Sortierstrategie zurück, die zur Sortierung der + vom "detect_object" Service zurückgelieferten Objekte und + Greifpunkte verwendet wird (siehe + + Objekterkennung + + ). + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/get_sorting_strategies + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/services/get_sorting_strategies + + Request + + Dieser Service hat keine Argumente. + + Response + + Wenn alle Werte für "weight" 0 sind, wird die + Standardsortierstrategie verwendet. + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "get_sorting_strategies", + "response": { + "direction": { + "pose_frame": "string", + "vector": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "weight": "float64" + }, + "gravity": { + "weight": "float64" + }, + "match_score": { + "weight": "float64" + }, + "preferred_orientation": { + "weight": "float64" + }, + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +warmup_template + + Lädt ein Template, damit es bei der Detektion schon bereit ist. + Ohne diesen Service dauert die erste Detektion mit einem neuen + Template länger als die folgenden, da dann das Template bei der + ersten Detektion erst geladen werden muss. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/warmup_template + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/services/warmup_template + + Request + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "template_id": "string" + } + } + + Die "template_id" ist die ID des Templates, welches in das + CADMatch-Modul geladen werden soll. + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "warmup_template", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +start + + versetzt das CADMatch-Modul in den Zustand "RUNNING"." + + Details + + Es kann vorkommen, dass der Zustandsübergang noch nicht vollständig + abgeschlossen ist, wenn die Serviceantwort generiert wird. In + diesem Fall liefert diese den entsprechenden, sich von "RUNNING" + unterscheidenden Zustand zurück. + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/start + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/services/start + + Request + + Dieser Service hat keine Argumente. + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "start", + "response": { + "accepted": "bool", + "current_state": "string" + } + } + +stop + + stoppt das Modul und versetzt es in den Zustand "IDLE". + + Details + + Es kann vorkommen, dass der Zustandsübergang noch nicht vollständig + abgeschlossen ist, wenn die Serviceantwort generiert wird. In + diesem Fall liefert diese den entsprechenden, sich von "IDLE" + unterscheidenden Zustand zurück. + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/stop + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/services/stop + + Request + + Dieser Service hat keine Argumente. + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "stop", + "response": { + "accepted": "bool", + "current_state": "string" + } + } + +reset_defaults + + stellt die Werkseinstellungen der Parameter und die bevorzugte TCP- + Orientierung sowie die Sortierstrategie dieses Moduls wieder her + und wendet sie an ("factory reset"). Dies betrifft nicht die + konfigurierten Templates. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/reset_defaults + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/services/reset_defaults + + Request + + Dieser Service hat keine Argumente. + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "reset_defaults", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +set_region_of_interest (veraltet) + + speichert eine 3D Region of Interest auf dem + + rc_visard NG + + . + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie + stattdessen + + set_region_of_interest + + in "rc_roi_db". + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/services/set_region_of_interest + +get_regions_of_interest (veraltet) + + gibt die mit "region_of_interest_ids" spezifizierten, gespeicherten + 3D Regions of Interest zurück. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie + stattdessen + + get_regions_of_interest + + in "rc_roi_db". + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/services/get_regions_of_interest + +delete_regions_of_interest (veraltet) + + löscht die mit "region_of_interest_ids" spezifizierten, + gespeicherten 3D Regions of Interest. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie + stattdessen + + delete_regions_of_interest + + in "rc_roi_db". + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/services/delete_regions_of_interest + +Interne Services + +Die folgenden Services für die Konfiguration von Greifpunkten und +Posenvorgaben können sich in Zukunft ohne weitere Ankündigung ändern. +Es wird empfohlen, das Setzen, Abrufen und Löschen von Greifpunkten +und Posenvorgaben über die Web GUI vorzunehmen. + +set_grasp + + speichert einen Greifpunkt für das angegebene Template auf dem + + rc_visard NG + + . Alle Greifpunkte sind dauerhaft gespeichert, auch über Firmware- + Updates und -Wiederherstellungen hinweg. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/set_grasp + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/services/set_grasp + + Request + + Die Definition des Typs "grasp" wird in + + Setzen von Greifpunkten + + beschrieben. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "grasp": { + "gripper_id": "string", + "id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "priority": "int8", + "replication": { + "max_x_deg": "float64", + "min_x_deg": "float64", + "origin": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "step_x_deg": "float64" + }, + "template_id": "string" + } + } + } + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "set_grasp", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +set_all_grasps + + Ersetzt die gesamte Liste von Greifpunkten auf dem + + rc_visard NG + + für das angegebene Template. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/set_all_grasps + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/services/set_all_grasps + + Request + + Die Definition des Typs "grasp" wird in + + Setzen von Greifpunkten + + beschrieben. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "grasps": [ + { + "gripper_id": "string", + "id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "priority": "int8", + "replication": { + "max_x_deg": "float64", + "min_x_deg": "float64", + "origin": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "step_x_deg": "float64" + }, + "template_id": "string" + } + ], + "template_id": "string" + } + } + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "set_all_grasps", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +get_grasps + + gibt alle definierten Greifpunkte mit den angegebenen IDs + ("grasp_ids") zurück, die zu den Templates mit den angegebenen + "template_ids" gehören. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/get_grasps + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/services/get_grasps + + Request + + Wenn keine "grasp_ids" angegeben werden, werden alle Greifpunkte zu + den angegebenen "template_ids" zurückgeliefert. Wenn keine + "template_ids" angegeben werden, werden alle Greifpunkte mit den + geforderten "grasp_ids" zurückgeliefert. Wenn gar keine IDs + angegeben werden, werden alle gespeicherten Greifpunkte + zurückgeliefert. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "grasp_ids": [ + "string" + ], + "template_ids": [ + "string" + ] + } + } + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "get_grasps", + "response": { + "grasps": [ + { + "gripper_id": "string", + "id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "priority": "int8", + "replication": { + "max_x_deg": "float64", + "min_x_deg": "float64", + "origin": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "step_x_deg": "float64" + }, + "template_id": "string" + } + ], + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +delete_grasps + + löscht alle Greifpunkte mit den angegebenen "grasp_ids", die zu den + Templates mit den angegebenen "template_ids" gehören. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/delete_grasps + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/services/delete_grasps + + Request + + Wenn keine "grasp_ids" angegeben werden, werden alle Greifpunkte + gelöscht, die zu den Templates mit den angegebenen "template_ids" + gehören. Die Liste "template_ids" darf nicht leer sein. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "grasp_ids": [ + "string" + ], + "template_ids": [ + "string" + ] + } + } + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "delete_grasps", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +get_symmetric_grasps + + gibt alle Greifpunkte zurück, die symmetrisch zum angegebenen + Greifpunkt sind." + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/get_symmetric_grasps + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/services/get_symmetric_grasps + + Request + + Die Definition des Typs "grasp" wird in + + Setzen von Greifpunkten + + beschrieben. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "grasp": { + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "replication": { + "max_x_deg": "float64", + "min_x_deg": "float64", + "origin": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "step_x_deg": "float64" + }, + "template_id": "string" + } + } + } + + Response + + Der erste Greifpunkt in der Rückgabeliste ist derselbe, der dem + Service übergeben wurde. Wenn das Template keine exakte Symmetrie + hat, wird nur der übergebene Greifpunkt zurückgeliefert. Wenn das + Template eine kontinuierliche Symmetrie hat (z.B. ein zylindrisches + Objekt), werden nur 12 gleichverteilte Greifpunkte zurückgeliefert. + + Die Definition des Typs "grasp" wird in + + Setzen von Greifpunkten + + beschrieben. + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "get_symmetric_grasps", + "response": { + "grasps": [ + { + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "replication": { + "max_x_deg": "float64", + "min_x_deg": "float64", + "origin": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "step_x_deg": "float64" + }, + "template_id": "string" + } + ], + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +set_pose_prior + + speichert eine Posenvorgabe für das angegebene Template auf dem + + rc_visard NG + + . Alle Posenvorgaben sind dauerhaft gespeichert, auch über + Firmware-Updates und -Wiederherstellungen hinweg. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/set_pose_prior + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/services/set_pose_prior + + Request + + Die Definition des Typs "pose_prior" wird in + + Setzen von Posenvorgaben + + beschrieben. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "pose_prior": { + "id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "template_id": "string" + } + } + } + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "set_pose_prior", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +set_all_pose_priors + + Ersetzt die gesamte Liste von Posenvorgaben auf dem + + rc_visard NG + + für das angegebene Template. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/set_all_pose_priors + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/services/set_all_pose_priors + + Request + + Die Definition des Typs "pose_prior" wird in + + Setzen von Posenvorgaben + + beschrieben. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "pose_priors": [ + { + "id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "template_id": "string" + } + ], + "template_id": "string" + } + } + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "set_all_pose_priors", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +get_pose_priors + + gibt alle definierten Posenvorgaben mit den angegebenen IDs + ("pose_prior_ids") zurück, die zu den Templates mit den angegebenen + "template_ids" gehören. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/get_pose_priors + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/services/get_pose_priors + + Request + + Wenn keine "pose_prior_ids" angegeben werden, werden alle + Posenvorgaben zu den angegebenen "template_ids" zurückgeliefert. + Wenn keine "template_ids" angegeben werden, werden alle + Posenvorgaben mit den geforderten "pose_prior_ids" zurückgeliefert. + Wenn gar keine IDs angegeben werden, werden alle gespeicherten + Posenvorgaben zurückgeliefert. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "pose_prior_ids": [ + "string" + ], + "template_ids": [ + "string" + ] + } + } + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "get_pose_priors", + "response": { + "pose_priors": [ + { + "id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "template_id": "string" + } + ], + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +delete_pose_priors + + löscht alle Posenvorgaben mit den angegebenen "pose_prior_ids", die + zu den Templates mit den angegebenen "template_ids" gehören. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/delete_pose_priors + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_cadmatch/services/delete_pose_priors + + Request + + Wenn keine "pose_prior_ids" angegeben werden, werden alle + Posenvorgaben gelöscht, die zu den Templates mit den angegebenen + "template_ids" gehören. Die Liste "template_ids" darf nicht leer + sein. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "pose_prior_ids": [ + "string" + ], + "template_ids": [ + "string" + ] + } + } + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "delete_pose_priors", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +Rückgabecodes + +Zusätzlich zur eigentlichen Serviceantwort gibt jeder Service einen +sogenannten "return_code" bestehend aus einem Integer-Wert und einer +optionalen Textnachricht zurück. Erfolgreiche Service-Anfragen werden +mit einem Wert von "0" quittiert. Positive Werte bedeuten, dass die +Service-Anfrage zwar erfolgreich bearbeitet wurde, aber zusätzliche +Informationen zur Verfügung stehen. Negative Werte bedeuten, dass +Fehler aufgetreten sind. Für den Fall, dass mehrere Rückgabewerte +zutreffend wären, wird der kleinste zurückgegeben, und die +entsprechenden Textnachrichten werden in "return_code.message" +akkumuliert. + +Die folgende Tabelle listet die möglichen Rückgabecodes auf: + +Rückgabecodes der Services des CADMatch-Moduls Code Beschreibung +0 Erfolgreich -1 Ungültige(s) Argument(e) -2 Ein interner Fehler +ist aufgetreten. -3 Ein interner Timeout ist aufgetreten, +beispielsweise während der Objekterkennung. -4 Die maximal erlaubte +Zeitspanne für die interne Akquise der Bilddaten wurde überschritten. +-8 Das Modul befindet sich in einem Zustand, in welchem dieser +Service nicht aufgerufen werden kann. Beispielsweise muss die Stereo- +Matching Qualität quality mindestens Medium sein. -9 Ungültige +Lizenz -10 Das neue Element konnte nicht hinzugefügt werden, da die +maximal speicherbare Anzahl an Load Carriern oder ROIs überschritten +wurde. -11 Sensor nicht verbunden, nicht unterstützt oder nicht +bereit. 10 Die maximal speicherbare Anzahl an Load Carriern oder +ROIs wurde erreicht. 11 Existierende Daten wurden überschrieben. +100 Die angefragten Load Carrier wurden in der Szene nicht gefunden. +101 Keiner der gefundenen Greifpunkte ist erreichbar. 102 Der +erkannte Load Carrier ist leer. 103 Alle berechneten Greifpunkte +sind in Kollision. 106 Die Liste der zurückgelieferten Greifpunkte +wurde auf die besten 100 Greifpunkte gekürzt. 110 Hinweise für die +Einrichtung der Anwendung, z.B. Reduzieren des Abstands von der +Kamera, Setzen einer Region of Interest. 114 Kein Greifer für die +Kollisionsprüfung gefunden. 115 Kollisionsprüfung während Entnahme +wurde nicht durchgeführt, z.B. weil kein Load Carrier oder kein Greif- +Offset angegeben wurden. 151 Das Objekt-Template hat eine +kontinuierliche Symmetrie. 152 Die Objekte liegen außerhalb der +angegebenen Region of Interest, außerhalb des Load Carriers oder +außerhalb des Bildes. 153 Es konnten keine Kanten im Kamerabild +erkannt werden. Überprüfen Sie die Kantenempfindlichkeit. 999 +Zusätzliche Hinweise für die Anwendungsentwicklung + +Template API + +Für den Upload, Download, das Auflisten und Löschen von Templates +werden spezielle REST-API-Endpunkte zur Verfügung gestellt. Templates +können auch über die Web GUI hoch- und runtergeladen werden. Die +Templates beinhalten die Greifpunkte und Posenvorgaben, falls +Greifpunkte oder Posenvorgaben konfiguriert wurden. Bis zu 50 +Templates können gleichzeitig auf dem + +rc_visard NG + + gespeichert werden. diff --git a/v24.04/de/_sources/camera_calibration.rst.txt b/v24.04/de/_sources/camera_calibration.rst.txt new file mode 100644 index 0000000..e005805 --- /dev/null +++ b/v24.04/de/_sources/camera_calibration.rst.txt @@ -0,0 +1,364 @@ +Kamerakalibrierung + +Das Kamerakalibrierungsmodul ist ein Basismodul, welches auf jedem + +rc_visard NG + + verfügbar ist. + +Um die Kamera als Messinstrument zu verwenden, müssen die +Kameraparameter, wie die Brennweite, die Objektivverzeichnung und die +Lage der Kameras zueinander, genau bekannt sein. Diese Parameter +werden durch Kalibrierung bestimmt und für die Rektifizierung der +Bilder, die Grundlage für alle anderen Bildverarbeitungsmodule ist, +verwendet (siehe + +Rektifizierung + +). + +Der + +rc_visard NG + + ist bereits ab Werk kalibriert. Nichtsdestotrotz kann es vorkommen, +dass die Kalibrierung überprüft und neu durchgeführt werden muss, wenn +der + +rc_visard NG + + einer starken mechanischen Beanspruchung ausgesetzt war. + +Mit dem Kamerakalibrierungsmodul lassen sich die +Kalibrierungsüberprüfung und Kalibrierung vornehmen. + +Selbstkalibrierung + +Im Kamerakalibrierungsmodul läuft im Hintergrund automatisch der +Selbstkalibriermodus mit niedriger Frequenz. In diesem Modus überwacht +der + +rc_visard NG + + die Ausrichtung der Bildzeilen beider rektifizierten Bilder. Wirken +mechanische Kräfte auf den + +rc_visard NG + + ein, wird er beispielsweise fallen gelassen, kann dies zu einer +Fehlausrichtung führen. Kommt es zu einem erheblichen +Ausrichtungsfehler, wird dieser automatisch korrigiert. Nach einem +Neustart und einer Korrektur wird der aktuelle Kalibrierungsversatz in +der Logdatei des Kameramoduls erfasst (siehe + +Download der Logdateien + +): + + "rc_stereocalib: Current self-calibration offset is 0.00, update + counter is 0" + +Der Aktualisierungszähler (update counter) wird nach jeder +automatischen Korrektur um eins erhöht. Nach einer manuellen +Neukalibrierung des + +rc_visard NG + + wird der Zähler auf 0 zurückgesetzt. + +Unter normalen Umständen, wenn der + +rc_visard NG + + keiner mechanischen Belastung ausgesetzt ist, dürfte die +Selbstkalibrierung des + +rc_visard NG + + nicht auftreten. Die Selbstkalibrierung erlaubt dem + +rc_visard NG + +, auch nach Erkennung einer falschen Ausrichtung normal zu arbeiten, +da diese automatisch korrigiert wird. Dessen ungeachtet wird +empfohlen, die Kamera manuell neu zu kalibrieren, wenn der +Aktualisierungszähler nicht auf 0 steht. + +Kalibriervorgang + +Die Kamerakalibrierung kann über die + +Web GUI + + unter Konfiguration ‣ Kamera Kalibrierung vorgenommen werden. Diese +Seite bietet einen Assistenten, der den Benutzer durch den +Kalibriervorgang führt. + +Bemerkung: Die Kamerakalibrierung ist für den + + rc_visard NG + + in aller Regel nicht nötig, da er bereits ab Werk kalibriert ist. + Eine Neukalibrierung ist nur erforderlich, wenn das Gerät einer + starken mechanischen Belastung ausgesetzt war, weil es + beispielsweise fallen gelassen wurde. + +Während der Kalibrierung muss das Kalibriermuster in verschiedenen +Posen erkannt werden. Dabei müssen alle schwarzen Quadrate des Musters +müssen komplett in beiden Kameras sichtbar sein und dürfen nicht +verdeckt werden. Jedes korrekt erkannte Quadrat wird mit einem grünen +Haken belegt. Das Muster kann nur dann korrekt erkannt werden, wenn +alle schwarzen Quadrate erkannt werden. Werden einige der Quadrate +nicht oder nur für kurze Zeit erkannt, so kann dies an schlechten +Lichtverhältnissen oder einem beschädigten Kalibriermuster liegen. +Quadrate, die in überbelichteten Bereichen des Kalibriermusters +liegen, werden rot hervorgehoben. In diesem Fall müssen die +Beleuchtung oder die Belichtungseinstellungen angepasst werden. Ein +dicker grüner Rahmen um das Kalibriermuster zeigt an, dass das Muster +korrekt in beiden Kamerabildern erkannt wurde. + +Kalibriereinstellungen + +Die Qualität der Kamerakalibrierung hängt stark von der Qualität des +Kalibriermusters ab. Kalibriermuster können von Roboception bezogen +werden. + + +Im ersten Schritt muss das verwendete Kalibriermuster angegeben +werden. Mit Klick auf + +Weiter + + gelangt der Benutzer zum nächsten Schritt. + +Kalibrierung prüfen + +In diesem Schritt kann die aktuelle Kalibrierung überprüft werden. Um +diese Prüfung vorzunehmen, muss das Muster so gehalten werden, dass es +sich gleichzeitig im Sichtfeld beider Kameras befindet. Nachdem das +Muster vollständig erkannt wurde, wird der Kalibrierfehler automatisch +berechnet und das Ergebnis auf dem Bildschirm angegeben. + + +Bemerkung: Um einen aussagekräftigen Kalibrierfehler berechnen zu + können, muss das Muster so nah wie möglich an die Kameras gehalten + werden. Bedeckt das Muster lediglich einen kleinen Bereich der + Kamerabilder, ist der Kalibrierfehler grundsätzlich geringer als + wenn das Muster das gesamte Bild ausfüllt. Aus diesem Grund werden + zusätzlich zum Kalibrierfehler an der aktuellen Position des + Kalibriermusters auch der minimale und maximale Fehler während der + Überprüfung der Kalibrierung angezeigt. + +Der typische Kalibrierfehler beläuft sich auf unter 0,2 Pixel. Liegt +der Fehler in diesem Bereich, kann der Kalibriervorgang übersprungen +werden. Ist der errechnete Kalibrierfehler jedoch größer, sollte eine +Neukalibrierung vorgenommen werden, um sicherzustellen, dass der +Sensor volle Leistung erbringt. Mit Klick auf + +Weiter + + gelangt der Benutzer zum nächsten Schritt. + +Warnung: Große Kalibrierfehler können durch falsch kalibrierte + Kameras, ein unpräzises Kalibriermuster oder eine falsch + eingetragene Musterbreite oder Musterhöhe verursacht werden. Bei der + Verwendung eines benutzerdefinierten Kalibriermusters muss + sichergestellt werden, dass das Muster präzise und die angegebenen + Breiten- und Höhendaten korrekt sind. Anderenfalls kann die manuelle + Kalibrierung sogar dazu führen, dass die Kameras dekalibriert + werden! + +Kalibrieren + +Bevor die Kalibrierung vorgenommen wird, sollte die Belichtungszeit +der Kamera richtig eingestellt werden. Um ein gutes Kalibrierergebnis +zu erzielen, sollten die Bilder gut belichtet und Bewegungsunschärfe +vermieden werden. Die maximale Belichtungszeit im automatischen Modus +sollte so klein wie möglich sein, aber dennoch eine gute Belichtung +ermöglichen. Die aktuelle Belichtungszeit wird, wie in + +Abb. 44 + + gezeigt, unter den Kamerabildern angegeben. + +Für eine vollständige Kalibrierung müssen zunächst beide Kameras +einzeln intrinsisch kalibriert werden (Monokalibrierung). Anschließend +wird durch die Stereokalibrierung die Ausrichtung der beiden Kameras +zueinander bestimmt. In den meisten Fällen wird die intrinsische +Kalibrierung der beiden Kameras nicht beeinträchtigt. Daher wird die +Monokalibrierung standardmäßig bei einer Neukalibrierung übersprungen, +kann aber durch Klick auf Monokalibrierung durchführen durchgeführt +werden. Dies sollte nur geschehen, wenn das Ergebnis der +Stereokalibrierung nicht zufriedenstellend ist. + +Stereokalibrierung + +Bei der Stereokalibrierung wird die relative Rotation und Translation +der Kameras zueinander ermittelt. + +Die Kamerabilder können auch gespiegelt angezeigt werden, um die +korrekte Ausrichtung des Kalibriermusters zu vereinfachen. + +Als erstes muss das Kalibriermuster möglichst ruhig und so nah wie +möglich an die Kamera gehalten werden. Es muss vollständig in beiden +Bildern sichtbar sein und die Kameras sollten senkrecht auf das +Kalibriermuster gerichtet sein. Wenn das Kalibriermuster nicht +senkrecht zur Sichtachse der Kameras ausgerichtet ist, erscheinen +kleine grüne Pfeile auf dem Kamerabild, die auf die erwarteten +Positionen der Ecken des Kalibriermusters zeigen (siehe + +Abb. 43 + +). + + +Das Muster muss für die Erkennung sehr ruhig gehalten werden. Wenn +Bewegungsunschärfe auftritt, wird das Muster nicht erkannt. Alle +Zellen, die im Kamerabild dargestellt sind, müssen vom Kalibriermuster +abgedeckt werden. Dies wird durch eine grüne Füllung der erfassten +Zellen dargestellt (siehe + +Abb. 44 + +). + +Beim + +rc_visard NG + + können alle Zellen mit einer einzigen Aufnahme erfasst werden, wenn +das Kalibriermuster nah genug gehalten wird. + + +Bemerkung: Falls alle Häkchen auf dem Kalibriermuster verschwinden, + liegt dies daran, dass die Kamerablickrichtung nicht senkrecht zum + Muster steht, oder das Muster zu weit von der Kamera entfernt ist. + +Sobald alle Zellen erfasst und gefüllt sind, verschwinden sie und eine +einzelne entfernte Zelle wird angezeigt. Nun muss das Kalibriermuster +so weit entfernt wie möglich gehalten werden, damit die kleine Zelle +erfasst wird. Pfeile zeigen an, falls das Muster noch zu nah an der +Kamera ist. Wenn das Kalibriermuster erfolgreich detektiert wurde, +wird die Zelle grün und das Kalibrierergebnis kann berechnet werden +(siehe + +Abb. 45 + +). + + +Führt die Stereokalibrierung nicht zu einem akzeptablen +Kalibrierfehler, sollte die Kalibrierung erneut vorgenommen werden, +jedoch mit Monokalibrierung (siehe nächster Abschnitt + +Monokalibrierung + +). + +Monokalibrierung + +Monokalibrierung ist die intrinsische Kalibrierung jeder einzelnen +Kamera. Da die intrinsische Kalibrierung in der Regel nicht +beeinträchtigt wird, sollte die Monokalibrierung nur durchgeführt +werden, wenn das Ergebnis der Stereokalibrierung nicht +zufriedenstellend ist. + +Durch Klicken auf Monokalibrierung durchführen im Reiter + +Kalibrieren + + kann die Monokalibrierung gestartet werden. + +Zur Kalibrierung muss das Kalibriermuster in verschiedenen +Ausrichtungen vor die Kamera gehalten werden. Die Pfeile, die von den +Ecken des Musters bis zu den grünen Bildschirmbereichen führen, geben +an, dass alle Musterecken innerhalb der grünen Rechtecke platziert +werden müssen. Diese grünen Rechtecke sind sensible Bereiche. Mit dem +Schieberegler + +Größe der sensiblen Bereiche + + lässt sich die Größe der Rechtecke einstellen, um die Kalibrierung zu +vereinfachen. Es ist jedoch zu bedenken, dass die Größe nicht zu stark +erhöht werden darf, da dies auf Kosten der Kalibriergenauigkeit gehen +kann. + +Häufig wird der Fehler begangen, das Muster bei der Kalibrierung +falsch herum zu halten. Dieser Fehler lässt sich leicht erkennen, da +sich die von den Musterecken zu den grünen Rechtecken verlaufenden +Linien in diesem Fall kreuzen (siehe + +Abb. 46 + +). + + +Bemerkung: Die Kalibrierung mag umständlich erscheinen, da das + Muster hierfür in bestimmten vordefinierten Stellungen gehalten + werden muss. Dieses Vorgehen ist jedoch notwendig um ein qualitativ + hochwertiges Kalibrierergebnis zu erreichen. + +Für den Prozess der Monokalibrierung ist das Kalibriermuster für beide +Kameras in den in + +Abb. 47 + + angegebenen Stellungen zu halten. + + +Nachdem die Ecken oder Seiten des Kalibriermusters auf die sensiblen +Bereiche ausgerichtet wurden, zeigt der Kalibriervorgang automatisch +die nächste Stellung an. Sobald der Prozess für die linke Kamera +abgeschlossen ist, ist er ebenso für die rechte Kamera zu wiederholen. + +Anschließend folgen sind die Schritte im vorherigen Abschnitt + +Stereokalibrierung + + zu befolgen. + +Kalibrierergebnis speichern + +Mit Klick auf die Schaltfläche Kalibrierung berechnen wird der +Kalibriervorgang beendet und das Endergebnis angezeigt. Der +eingeblendete Wert ist der mittlere Reprojektionsfehler aller +Kalibrierpunkte. Er ist in Pixeln angegeben und beläuft sich +typischerweise auf einen Wert von unter 0,2. + +Mit Klick auf Kalibrierung speichern wird das Kalibrierergebnis +übernommen und auf dem Gerät gespeichert. + +Bemerkung: Das eingeblendete Ergebnis ist der nach der Kalibrierung + bestehende Mindestfehler. Der reale Fehler liegt auf keinen Fall + darunter, könnte theoretisch jedoch höher sein. Dies gilt für jeden + Algorithmus zur Kamerakalibrierung und ist der Grund dafür, warum + das Kalibriermuster in verschiedenen Positionen vor den Sensor zu + halten ist. So ist sichergestellt, dass der reale Kalibrierfehler + den errechneten Fehler nicht signifikant überschreitet. + +Warnung: War vor der Durchführung der Kamerakalibrierung eine Hand- + Auge- Kalibrierung auf dem + + rc_visard NG + + gespeichert, so sind die Werte der Hand-Auge-Kalibrierung + möglicherweise ungültig geworden. Daher ist das Hand-Auge- + Kalibrierverfahren zu wiederholen. + +Parameter + +Dieses Modul wird in der REST-API als "rc_stereocalib" bezeichnet. + +Bemerkung: Die verfügbaren Parameter und die Statuswerte des Moduls + zur Kamerakalibrierung sind nur für den internen Gebrauch bestimmt + und können ohne vorherige Ankündigung Änderungen unterzogen werden. + Die Kalibrierung sollte gemäß den vorstehenden Anweisungen und + ausschließlich in der Web GUI vorgenommen werden. + +Services + +Bemerkung: Die verfügbaren Services des Moduls zur + Kamerakalibrierung sind lediglich für den internen Gebrauch bestimmt + und können ohne vorherige Ankündigung Änderungen unterzogen werden. + Die Kalibrierung sollte gemäß den vorstehenden Anweisungen und + ausschließlich in der Web GUI vorgenommen werden. diff --git a/v24.04/de/_sources/camera_modules.rst.txt b/v24.04/de/_sources/camera_modules.rst.txt new file mode 100644 index 0000000..7c5e1ca --- /dev/null +++ b/v24.04/de/_sources/camera_modules.rst.txt @@ -0,0 +1,40 @@ +3D-Kamera-Module + +Die 3D-Kamera-Software des + +rc_visard NG + + enthält die folgenden Module: + +Kamera (rc_camera, Abschnitt \ref{stereo_camera:sect-stereo-camera}) +erfasst Bildpaare und führt die planare Rektifizierung durch, wodurch +die Kamera als Messinstrument verwendet werden kann. Bilder werden +sowohl für die weitere interne Verarbeitung durch andere Module als +auch als GenICam-Bild-Streams für die externe Verwendung +bereitgestellt. + +Stereo-Matching (rc_stereomatching, Abschnitt \ref{stereo_matching +:sect-stereo-matching}) nutzt die rektifizierten Stereo-Bildpaare, um +3D-Tiefeninformationen, z.B. für Disparitäts-, Fehler- und +Konfidenzbilder, zu berechnen. Diese werden auch als GenICam-Bild- +Streams bereitgestellt. + +Die Module für die + +Kamera + + und das + +Stereo-Matching + +, welche die Bildpaare und die 3D-Tiefeninformationen bereitstellen, +sind auch über die + +GigE Vision/GenICam-Schnittstelle + + des + +rc_visard NG + + konfigurierbar. + diff --git a/v24.04/de/_sources/collisioncheck.rst.txt b/v24.04/de/_sources/collisioncheck.rst.txt new file mode 100644 index 0000000..4e964cf --- /dev/null +++ b/v24.04/de/_sources/collisioncheck.rst.txt @@ -0,0 +1,644 @@ +CollisionCheck + +Einleitung + +Das CollisionCheck Modul ist ein optionales Modul, welches intern auf +dem + +rc_visard NG + + läuft, und ist freigeschaltet, sobald eine gültige Lizenz für eines +der Module + +ItemPick und BoxPick + + oder + +SilhouetteMatch + + vorhanden ist. Andernfalls benötigt dieses Modul eine separate + +Lizenz + +. + +Das Modul ermöglicht die Kollisionsprüfung zwischen dem Greifer und +dem Load Carrier, oder anderen detektierten Objekten (nur in +Kombination mit + +SilhouetteMatch + +). Es ist in die Module + +ItemPick und BoxPick + + und + +SilhouetteMatch + + integriert, kann aber auch als eigenständiges Modul genutzt werden. +Die Greifermodelle für die Kollisionsprüfung müssen über das + +GripperDB + + Modul definiert werden. + +Warnung: Es werden nur Kollisionen zwischen dem Load Carrier und dem + Greifer geprüft, aber nicht Kollisionen mit dem Roboter, dem Flansch + oder anderen Objekten. Nur in Kombination mit + + SilhouetteMatch + + , und nur wenn das gewählte Template eine Kollisionsgeometrie + enthält und "check_collisions_with_matches" im entsprechenden Modul + aktiviert ist, werden auch Kollisionen zwischen dem Greifer und den + anderen + + detektierten + + Objekten geprüft. Kollisionen mit Objekten, die nicht detektiert + werden können, werden nicht geprüft. Nur in Kombination mit + + SilhouetteMatch + + , und nur wenn "check_collisions_with_point_cloud" im entsprechenden + Modul aktiviert ist, werden auch Kollisionen zwischen dem Greifer + und einer wasserdichten Version der Punktwolke geprüft. + +Spezifikationen des CollisionCheck-Moduls Kollisionsprüfung mit +detektierter Load Carrier, detektierte Objekte (nur +SilhouetteMatch\:(Section \ref{silhouettematch:sect- +silhouettematch})), Basisebene (nur SilhouetteMatch, Abschnitt +\ref{silhouettematch:sect-silhouettematch}) Kollisionsprüfung +verfügbar in ItemPick und BoxPick\:(Section \ref{itempick:sect- +itempick}), SilhouetteMatch\:(Section \ref{silhouettematch:sect- +silhouettematch}) + +Kollisionsprüfung + +Stand-Alone Kollisionsprüfung + +Der Service "check_collisions" triggert die Kollisionsprüfung zwischen +dem angegebenen Greifer und dem angegebenen Load Carrier für jeden der +übergebenen Greifpunkte. Eine Kollisionsprüfung mit anderen Objekten +ist nicht möglich. Das CollisionCheck-Modul überprüft, ob sich der +Greifer in Kollision mit mindestens einem Load Carrier befindet, wenn +sich der TCP an der Greifposition befindet. Es können mehrere Load +Carrier gleichzeitig getestet werden. Der Griff wird als Kollision +markiert, wenn es mit mindestens einem der definierten Load Carriern +zu einer Kollision kommen würde. + +Das Argument "pre_grasp_offset" (Greif-Offset) kann für eine +erweiterte Kollisionsprüfung genutzt werden. Der Greif-Offset P_{off} +ist der Offset vom Greifpunkt P_{grasp} zur Vorgreifposition P_{pre} +im Koordinatensystem des Greifpunkts (siehe + +Abb. 40 + +). Wenn der Greif-Offset angegeben wird, werden Greifpunkte auch dann +als Kollisionen erkannt, wenn der Greifer an einem beliebigen Punkt +während der linearen Bewegung zwischen Vorgreifposition und +Greifposition in Kollision geraten würde. + + +Integrierte Kollisionsprüfung in anderen Modulen + +Die Kollisionsprüfung ist in die Services der folgenden Softwaremodule +integriert: + +ItemPick und BoxPick\:(Abschnitt \ref{itempick:sect-itempick}): +compute_grasps (siehe compute_grasps für ItemPick, Abschnitt +\ref{itempick:expl-itempick-srv-compute-grasps} und compute_grasps für +BoxPick, Abschnitt \ref{itempick:expl-itempick-srv-compute-grasps- +boxpick}) + +SilhouetteMatch\:(Abschnitt \ref{silhouettematch:sect- +silhouettematch}): detect_object (siehe detect_object, Abschnitt +\ref{silhouettematch:expl-silhouettematch-srv-detect-objects}) + +Jedem dieser Services kann ein "collision_detection"-Argument +übergeben werden, das aus der ID des Standardgreifers ("gripper_id") +und aus dem Greif-Offset ("pre_grasp_offset", siehe + +Stand-Alone Kollisionsprüfung + +) besteht. Der Standardgreifer, der durch das "gripper_id" Argument +übergeben wird, wird nur für Greifpunkte verwendet, denen keine +individuelle Greifer-ID zugewiesen wurde. Wenn das +"collision_detection" Argument übergeben wird, liefern diese Services +nur die Greifpunkte zurück, an denen der Greifer nicht in Kollision +mit dem erkannten Load Carrier ist, oder für die keine +Kollisionsprüfung durchgeführt werden konnte. Wenn eine Load Carrier +ID angegeben wurde, wird die Kollisionsprüfung immer mit dem Load +Carrier durchgeführt. Zusätzliche Funktionen für die Kollisionsprüfung +können abhängig vom Modul aktiviert werden. + +Nur in + +SilhouetteMatch + +, und nur wenn das gewählte Template eine Kollisionsgeometrie enthält +und "check_collisions_with_matches" im entsprechenden Modul aktiviert +ist, werden auch Greifpunkte, bei denen der Greifer in Kollision mit +anderen + +detektierten + + Objekten wäre, herausgefiltert. Dabei ist das Objekt, auf dem sich +der jeweilige Greifpunkt befindet, von der Prüfung ausgenommen. + +Wenn ein Greifer für einen Greifpunkt in einem Template von + +SilhouetteMatch + + definiert ist, wird dieser Greifer und nicht der im +"collision_detection" Argument des "detect_object" Services angegebene +Greifer zur Kollisionsprüfung dieses Greifpunkts verwendet (siehe + +Setzen von Greifpunkten + +). Die vom "detect_object" Service zurückgelieferten Greifpunkte +enthalten ein Flag "collision_checked", das angibt ob der jeweilige +Greifpunkt auf Kollisionen geprüft wurde, und das Feld "gripper_id". +Wenn "collision_checked" true ist, enthält das Feld "gripper_id" die +ID des Greifers, der für die Kollisionsprüfung dieses Greifpunkts +verwendet wurde. Dies ist die ID des Greifers, der für den jeweiligen +Greifpunkt definiert wurde, oder, falls kein Greifer definiert wurde, +die ID des Greifers die im "collision_detection" Argument des +Serviceaufrufs angegeben wurde. Wenn "collision_checked" false ist, +enthält "gripper_id" die ID des Greifers, die für den Greifpunkt +definiert wurde. + +In + +SilhouetteMatch + + werden Kollisionen zwischen dem Greifer und der Basisebene geprüft, +wenn der Parameter "check_collisions_with_base_plane" in +SilhouetteMatch aktiviert ist. + +Kollisionen zwischen dem Greifer und einer wasserdichten Version der +Punktwolke können in + +SilhouetteMatch + + geprüft werden, wenn der Parameter +"check_collisions_with_point_cloud" im jeweiligen Modul aktiviert ist. + +Warnung: Es werden nur Kollisionen zwischen dem Load Carrier und dem + Greifer geprüft, aber nicht Kollisionen mit dem Roboter, dem Flansch + oder anderen Objekten. Nur in Kombination mit + + SilhouetteMatch + + , und nur wenn das gewählte Template eine Kollisionsgeometrie + enthält und "check_collisions_with_matches" im entsprechenden Modul + aktiviert ist, werden auch Kollisionen zwischen dem Greifer und den + anderen + + detektierten + + Objekten geprüft. Kollisionen mit Objekten, die nicht detektiert + werden können, werden nicht geprüft. Nur in Kombination mit + + SilhouetteMatch + + , und nur wenn "check_collisions_with_point_cloud" im entsprechenden + Modul aktiviert ist, werden auch Kollisionen zwischen dem Greifer + und einer wasserdichten Version der Punktwolke geprüft. + +Die Kollisionsprüfung wird von Laufzeitparametern beeinflusst, die +weiter unten aufgeführt und beschrieben werden. + +Parameter + +Das CollisionCheck-Modul wird in der REST-API als "rc_collision_check" +bezeichnet und in der + +Web GUI + + unter Konfiguration ‣ CollisionCheck dargestellt. Der Benutzer kann +die Parameter entweder dort oder über die + +REST-API-Schnittstelle + + ändern. + +Übersicht der Parameter + +Dieses Softwaremodul bietet folgende Laufzeitparameter: + +Applikationsspezifische Laufzeitparameter des rc_collision_check +Moduls Name Typ Min Max Default Beschreibung +check_bottom bool false true true Aktiviert die Kollisionsprüfung +mit dem Boden des Load Carriers. check_flange bool false false +true Bestimmt, ob ein Greifpunkt als Kollision erkannt wird, sobald +der Flansch innerhalb des Load Carriers ist. collision_dist float64 +0.0 0.1 0.01 Minimaler Abstand in Metern zwischen einem +Greiferelement und dem Load Carrier und/oder der Basisebene (nur +SilhouetteMatch) für einen kollisionsfreien Griff. + +Beschreibung der Laufzeitparameter + +Jeder Laufzeitparameter ist durch eine eigene Zeile in der Web GUI im +Abschnitt + +Einstellungen + + unter Konfiguration ‣ CollisionCheck repräsentiert. Der Web GUI-Name +des Parameters ist in Klammern hinter dem Namen des Parameters +angegeben: + +collision_dist (Sicherheitsabstand) + + Minimaler Abstand in Metern zwischen einem Greiferelement und dem + Load Carrier und/oder der Basisebene (nur SilhouetteMatch) für + einen kollisionsfreien Griff. + + Bemerkung: Der Sicherheitsabstand wird nicht für die + Kollisionsprüfung zwischen dem Greifer und anderen detektierten + Objekten angewendet. Er wird auch nicht verwendet um zu prüfen, + ob sich der Flansch innerhalb des Load Carriers befindet + ("check_flange"). + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_collision_check/parameters?collision_dist= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_collision_check/parameters?collision_dist= + +check_flange (Flansch-Check) + + Ermöglicht einen Sicherheitscheck mit dem Flansch, wie in + + Flanschradius + + beschrieben. Wenn dieser Parameter gesetzt ist, gelten alle + Griffe, bei denen der Flansch innerhalb des Load Carriers wäre, als + Kollisionen. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_collision_check/parameters?check_flange= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_collision_check/parameters?check_flange= + +check_bottom (Boden-Check) + + Wenn dieser Check aktiviert ist, werden Kollisionen nicht nur mit + den Load Carrier Wänden, sondern auch mit dem Boden geprüft. Falls + der TCP innerhalb der Kollisionsgeometrie (z.B. innerhalb des + Sauggreifers) liegt, ist es möglicherweise nötig, diesen Check zu + deaktivieren. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_collision_check/parameters?check_bottom= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_collision_check/parameters?check_bottom= + +Statuswerte + +Statuswerte des "rc_collision_check"-Moduls: + +Statuswerte des rc_collision_check-Moduls Name Beschreibung +last_evaluated_grasps Anzahl der ausgewerteten Griffe +last_collision_free_grasps Anzahl der kollisionsfreien Griffe +collision_check_time Laufzeit der Kollisionsprüfung + +Services + +Die angebotenen Services von "rc_collision_check" können mithilfe der + +REST-API-Schnittstelle + + oder der + +rc_visard NG + + +Web GUI + + ausprobiert und getestet werden. + +Das CollisionCheck-Modul stellt folgende Services zur Verfügung. + +reset_defaults + + stellt die Werkseinstellungen der Parameter dieses Moduls wieder + her und wendet sie an ("factory reset"). + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_collision_check/services/reset_defaults + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_collision_check/services/reset_defaults + + Request + + Dieser Service hat keine Argumente. + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "reset_defaults", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +check_collisions (veraltet) + + löst eine Kollisionsprüfung zwischen dem Greifer und einem Load + Carrier aus. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_collision_check/services/check_collisions + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_collision_check/services/check_collisions + + Request + + Obligatorische Serviceargumente: + + "grasps": Liste von Griffen, die überprüft werden sollen. + + "load_carriers": Liste von Load Carriern, die auf Kollisionen + überprüft werden sollen. Die Felder der Load Carrier Definition + sind in + + Erkennung von Load Carriern + + beschrieben. Die Griffe und die Load Carrier Positionen müssen + im selben Koordinatensystem angegeben werden. + + "gripper_id": Die ID des Greifers, der in der Kollisionsprüfung + verwendet werden soll. Der Greifer muss zuvor konfiguriert + worden sein. + + Optionale Serviceargumente: + + "pre_grasp_offset": Der Greif-Offset in Metern vom Greifpunkt + zur Vorgreifposition. Wird ein Greif-Offset angegeben, dann wird + die Kollisionsprüfung auf der gesamten linearen Trajektorie von + der Vorgreifposition bis zur Greifposition durchgeführt. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "grasps": [ + { + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "uuid": "string" + } + ], + "gripper_id": "string", + "load_carriers": [ + { + "id": "string", + "inner_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "outer_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "rim_thickness": { + "x": "float64", + "y": "float64" + } + } + ], + "pre_grasp_offset": { + "x": "float64", + "y": "float64", + "z": "float64" + } + } + } + + Response + + "colliding_grasps": Liste von Griffen, die in Kollision mit einem + oder mehreren Load Carriern sind. + + "collision_free_grasps": Liste von kollisionsfreien Griffen. + + "return_code": enthält mögliche Warnungen oder Fehlercodes und + Nachrichten. + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "check_collisions", + "response": { + "colliding_grasps": [ + { + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "uuid": "string" + } + ], + "collision_free_grasps": [ + { + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "uuid": "string" + } + ], + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +set_gripper (veraltet) + + konfiguriert und speichert einen Greifer auf dem + + rc_visard NG + + . + + API Version 2 + + Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie + stattdessen + + set_gripper + + in "rc_gripper_db". + + API Version 1 (veraltet) + + Dieser Service kann wie folgt aufgerufen werden. + + PUT http:///api/v1/nodes/rc_collision_check/services/set_gripper + + Die Definitionen von Request und Response sind dieselben wie in + + set_gripper + + in "rc_gripper_db" beschrieben. + +get_grippers (veraltet) + + gibt die mit "gripper_ids" spezifizierten und gespeicherten Greifer + zurück. + + API Version 2 + + Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie + stattdessen + + get_grippers + + in "rc_gripper_db". + + API Version 1 (veraltet) + + Dieser Service kann wie folgt aufgerufen werden. + + PUT http:///api/v1/nodes/rc_collision_check/services/get_grippers + + Die Definitionen von Request und Response sind dieselben wie in + + get_grippers + + in "rc_gripper_db" beschrieben. + +delete_grippers (veraltet) + + löscht die mit "gripper_ids" spezifizierten, gespeicherten Greifer. + + API Version 2 + + Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie + stattdessen + + delete_grippers + + in "rc_gripper_db". + + API Version 1 (veraltet) + + Dieser Service kann wie folgt aufgerufen werden. + + PUT http:///api/v1/nodes/rc_collision_check/services/delete_grippers + + Die Definitionen von Request und Response sind dieselben wie in + + delete_grippers + + in "rc_gripper_db" beschrieben. + +Rückgabecodes + +Zusätzlich zur eigentlichen Serviceantwort gibt jeder Service einen +sogenannten "return_code" bestehend aus einem Integer-Wert und einer +optionalen Textnachricht zurück. Erfolgreiche Service-Anfragen werden +mit einem Wert von "0" quittiert. Positive Werte bedeuten, dass die +Service-Anfrage zwar erfolgreich bearbeitet wurde, aber zusätzliche +Informationen zur Verfügung stehen. Negative Werte bedeuten, dass +Fehler aufgetreten sind. Für den Fall, dass mehrere Rückgabewerte +zutreffend wären, wird der kleinste zurückgegeben, und die +entsprechenden Textnachrichten werden in "return_code.message" +akkumuliert. + +Die folgende Tabelle listet die möglichen Rückgabecodes auf: + +Fehlercodes des CollisionCheck-Services Code Beschreibung 0 +Erfolgreich -1 Ein ungültiges Argument wurde übergeben. -7 Daten +konnten nicht in den persistenten Speicher geschrieben oder vom +persistenten Speicher gelesen werden. -9 Lizenz für CollisionCheck +ist nicht verfügbar. -10 Das neue Element konnte nicht hinzugefügt +werden, da die maximal speicherbare Anzahl an Greifern überschritten +wurde. 10 Die maximal speicherbare Anzahl an Greifern wurde +erreicht. 11 Bestehender Greifer wurde überschrieben. diff --git a/v24.04/de/_sources/concept_stereo.rst.txt b/v24.04/de/_sources/concept_stereo.rst.txt new file mode 100644 index 0000000..ebfe20b --- /dev/null +++ b/v24.04/de/_sources/concept_stereo.rst.txt @@ -0,0 +1,78 @@ +Stereovision + +Bei der + +Stereovision + + werden 3D-Informationen gewonnen, indem zwei aus verschiedenen +Blickwinkeln aufgenommene Bilder miteinander verglichen werden. Das +zugrunde liegende Prinzip ist darin begründet, dass Objektpunkte je +nach Abstand vom Kamerapaar an unterschiedlichen Stellen in beiden +Kameras erscheinen. Während sehr weit entfernte Objektpunkte in beiden +Kamerabildern etwa an der gleichen Position erscheinen, liegen sehr +nahe Objektpunkte an unterschiedlichen Stellen im linken und rechten +Kamerabild. Dieser Versatz der Objektpunkte in beiden Kamerabildern +wird auch „Disparität“ genannt. Je größer die Disparität, desto näher +ist das Objekt der Kamera. Das Prinzip der Stereovision wird in + +Abb. 14 + + genauer dargestellt. + + +Stereovision beruht auf passiver Wahrnehmung. Dies bedeutet, dass +keine Licht- oder sonstigen Signale zur Distanzmessung ausgesandt +werden, sondern nur das von der Umgebung ausgehende oder reflektierte +Licht genutzt wird. Dadurch können die Roboception-Sensoren sowohl im +Innen- als auch im Außenbereich eingesetzt werden. Zudem können +problemlos mehrere Sensoren störungsfrei zusammen auf engem Raum +betrieben werden. + +Um die 3D-Informationen berechnen zu können, muss der Stereo-Matching- +Algorithmus die zusammengehörenden Objektpunkte im linken und rechten +Kamerabild finden. Hierfür bedient er sich der Bildtextur, d.h. der +durch Muster oder Oberflächenstrukturen der Objekte verursachten +Schwankungen in der Bildintensität. Das Stereo-Matching-Verfahren kann +bei Oberflächen ohne jede Textur, wie z.B. bei glatten, weißen Wänden, +keine Werte liefern. Das Stereo-Matching-Verfahren, das der + +rc_visard NG + + verwendet, ist + +SGM + + ( + +Semi-Global Matching + +), welches selbst bei feineren Strukturen den bestmöglichen +Kompromiss aus Laufzeit und Genauigkeit bietet. + +Für die Berechnung der 3D-Informationen werden folgende Softwaremodule +benötigt: + +Kamera: Dieses Modul dient dazu, synchronisierte Bildpaare aufzunehmen +und diese in Bilder umzuwandeln, die weitestgehend den Aufnahmen einer +idealen Kamera entsprechen (Rektifizierung). + +Stereo-Matching: Dieses Modul errechnet mithilfe des Stereo-Matching- +Verfahrens SGM die Disparitäten der rektifizierten Stereo- +Bildpaare\:(Abschnitt \ref{stereo_matching:sect-stereo-matching}). + +Für das Stereo-Matching-Verfahren müssen die Positionen der linken und +rechten Kamera sowie ihre Ausrichtung zueinander genau bekannt sein. +Dies wird durch Kalibrierung erreicht. Die Kameras des + +rc_visard NG + + werden bereits im Werk vorkalibriert. Hat sich der + +rc_visard NG + + jedoch, beispielsweise während des Transports, dekalibriert, muss die +Stereokamera neu kalibriert werden. + +Kamerakalibrierung: Mit diesem Modul kann der Benutzer die +Stereokamera des rc_visard NG neu kalibrieren\:(Abschnitt +\ref{camera_calibration:sect-camera-calibration}). diff --git a/v24.04/de/_sources/concepts.rst.txt b/v24.04/de/_sources/concepts.rst.txt new file mode 100644 index 0000000..e831ca4 --- /dev/null +++ b/v24.04/de/_sources/concepts.rst.txt @@ -0,0 +1,17 @@ +Messprinzipien + +Der + +rc_visard NG + + ist eine selbstregistrierende 3D-Kamera. Er erstellt rektifizierte +Bilder sowie Disparitäts-, Konfidenz- und Fehlerbilder, mit denen sich +die Tiefenwerte der Aufnahme berechnen lassen. Zusätzlich werden +intern gemessene Beschleunigungs- und Drehraten mit +Bewegungsschätzungen aus den Kamerabildern kombiniert, um Echtzeit- +Schätzungen der aktuellen Pose (Position und Orientierung), +Geschwindigkeit und Beschleunigung des Sensors anbieten zu können. + +Im Folgenden sind die zugrunde liegenden Messprinzipien genauer +dargestellt. + diff --git a/v24.04/de/_sources/configuration_modules.rst.txt b/v24.04/de/_sources/configuration_modules.rst.txt new file mode 100644 index 0000000..48f33d4 --- /dev/null +++ b/v24.04/de/_sources/configuration_modules.rst.txt @@ -0,0 +1,34 @@ +Konfigurationsmodule + +Der + +rc_visard NG + + bietet mehrere verschiedene Konfigurationsmodule, welche es dem +Nutzer ermöglichen, den + +rc_visard NG + + für spezielle Anwendungen zu konfigurieren. + +Die Konfigurationsmodule sind: + +Hand-Auge-Kalibrierung (rc_hand_eye_calibration, Abschnitt +\ref{handeye_calibration:sect-handeye-calibration}) ermöglicht dem +Benutzer, die Kamera entweder über die Web GUI oder die REST-API zu +einem Roboter zu kalibrieren. + +CollisionCheck (rc_collision_check, Abschnitt \ref{collisioncheck +:sect-collision}) bietet eine einfache Möglichkeit zu prüfen, ob ein +Greifer in Kollision ist. + +Kamerakalibrierung (rc_stereocalib, Abschnitt \ref{camera_calibration +:sect-camera-calibration}) ermöglicht die Überprüfung und +Durchführung der Kamerakalibrierung über die Web GUI\:(Abschnitt +\ref{webgui:sect-web-gui}). + +IOControl und Projektor-Kontrolle (rc_iocontrol, Abschnitt +\ref{iocontrol:sect-iocontrol}) bietet die Kontrolle über die Ein- +und Ausgänge des Sensors mit speziellen Betriebsarten zur Kontrolle +eines externen Musterprojektors. + diff --git a/v24.04/de/_sources/contact.rst.txt b/v24.04/de/_sources/contact.rst.txt new file mode 100644 index 0000000..753ab2d --- /dev/null +++ b/v24.04/de/_sources/contact.rst.txt @@ -0,0 +1,40 @@ +Kontakt + +Support + +Support-Anfragen können Sie uns entweder über die Seite + +http://www.roboception.com/support + + oder per E-Mail an + +support@roboception.de + + zukommen lassen. + +Downloads + +Software-SDKs usw. können von der Roboception-Homepage heruntergeladen +werden: + +http://www.roboception.com/download + +. + +Adresse + + Roboception GmbH + Kaflerstraße 2 + 81241 München + Deutschland + + Web: + http://www.roboception.com + + + E-Mail: + info@roboception.de + + + Telefon: +49 89 889 50 79-0 + diff --git a/v24.04/de/_sources/database_modules.rst.txt b/v24.04/de/_sources/database_modules.rst.txt new file mode 100644 index 0000000..2ab4253 --- /dev/null +++ b/v24.04/de/_sources/database_modules.rst.txt @@ -0,0 +1,28 @@ +Datenbankmodule + +Der + +rc_visard NG + + stellt mehrere Datenbankmodule zur Verfügung, die das Konfigurieren +von globalen Daten ermöglichen, die in vielen Detektionsmodulen +benötigt werden, zum Beispiel Load Carrier und Regions of Interest. +Über die + +REST-API-Schnittstelle + + sind die Datenbankmodule nur in API Version 2 verfügbar. + +Die Datenbankmodule sind: + +LoadCarrierDB (rc_load_carrier_db, Abschnitt \ref{loadcarrier_db:sect- +loadcarrier-db}) ermöglicht das Erstellen, Abfragen und Löschen von +Load Carriern. + +RoiDB (rc_roi_db\:, Abschnitt \ref{roi:sect-roi}) ermöglicht das +Erstellen, Abfragen und Löschen von 2D und 3d Regions of Interest. + +GripperDB (rc_gripper_db, Abschnitt \ref{gripper_db:sect-gripper-db}) +ermöglicht das Erstellen, Abfragen und Löschen von Greifern für die +Kollisionsprüfung. + diff --git a/v24.04/de/_sources/detection_modules.rst.txt b/v24.04/de/_sources/detection_modules.rst.txt new file mode 100644 index 0000000..286f855 --- /dev/null +++ b/v24.04/de/_sources/detection_modules.rst.txt @@ -0,0 +1,31 @@ +Detektionsmodule + +Der + +rc_visard NG + + bietet Softwaremodule für unterschiedliche Detektionsanwendungen: + +LoadCarrier (rc_load_carrier, Abschnitt \ref{loadcarrier:sect- +loadcarrier}) ermöglicht die Erkennung von Load Carriern (Behältern) +und ihres Füllstands. + +TagDetect (rc_april_tag_detect und rc_qr_code_detect, Abschnitt +\ref{tagdetect:sect-tag-detection}) ermöglicht die Erkennung von +AprilTags und QR-Codes sowie die Schätzung von deren Pose. + +ItemPick und BoxPick (rc_itempick und rc_boxpick, Abschnitt +\ref{itempick:sect-itempick}) bietet eine Standardlösung für +robotische Pick-and-Place-Anwendungen für Vakuum-Greifsysteme. + +SilhouetteMatch (rc_silhouettematch, Abschnitt \ref{silhouettematch +:sect-silhouettematch}) bietet eine Objekterkennungslösung für +Objekte, die sich auf einer Ebene befinden, oder gestapelte planare +Objekt. + +Diese Module sind optional und können durch Kauf einer separaten + +Lizenz + + aktiviert werden. + diff --git a/v24.04/de/_sources/disposal.rst.txt b/v24.04/de/_sources/disposal.rst.txt new file mode 100644 index 0000000..0a6d63f --- /dev/null +++ b/v24.04/de/_sources/disposal.rst.txt @@ -0,0 +1,44 @@ +Informationen zur Entsorgung + + +Entsorgung von Elektro- und Elektronikgeräten Das Symbol der +„durchgestrichenen Mülltonne“ bedeutet, dass Sie gesetzlich +verpflichtet sind, diese Geräte einer vom unsortierten Siedlungsabfall +getrennten Erfassung zuzuführen. Die Entsorgung über den Hausmüll, wie +bspw. die Restmülltonne oder die Gelbe Tonne ist untersagt. Vermeiden +Sie Fehlwürfe durch die korrekte Entsorgung in speziellen Sammel- und +Rückgabestellen. + +Entnahme von Batterien Enthalten die Produkte Batterien und Akkus, +die aus dem Altgerät zerstörungsfrei entnommen werden können, müssen +diese vor der Entsorgung entnommen werden und getrennt als Batterie +entsorgt werden. Folgende Batterien bzw. Akkumulatoren sind im +rc_visard enthalten: Keine + +Möglichkeiten der Rückgabe von Altgeräten Besitzer von Altgeräten +können diese an den Hersteller zurückgeben, damit eine ordnungsgemäße +Entsorgung sichergestellt ist." Bitte kontaktieren Sie den +Support\:(Abschnitt \ref{contact:sect-contact}) wegen der Rücknahme +des Gerätes. + +Datenschutz Endnutzer von Elektro- und Elektronikaltgeräten werden +darauf hingewiesen, dass Sie für das Löschen personenbezogener Daten +auf den zu entsorgenden Altgeräten selbst verantwortlich sind. + +WEEE-Registrierungsnummer Roboception ist unter der +Registrierungsnummer DE 33323989 bei der stiftung elektro-altgeräte +register, Nordostpark 72, 90411 Nürnberg, als Hersteller von Elektro- +und/ oder Elektronikgeräten registriert. + +Sammel- und Verwertungsquoten Die EU-Mitgliedsstaaten sind nach der +WEEE-Richtlinie verpflichtet, Daten zu Elektro- und +Elektronikaltgeräten zu erheben und diese an die Europäische +Kommission zu übermitteln. Auf der Webseite des Bundesministeriums für +Umwelt- und Naturschutz finden Sie weitere Informationen hierzu. + +Information zur Entsorgung außerhalb der Europäischen Union + +Das Symbol der durchgestrichenen Mülltonne ist nur in der Europäischen +Union gültig. Für die Entsorgung in anderen Ländern außerhalb der +Europäischen Union können die örtlichen Behörden oder der Hersteller +Auskunft über die richtige Entsorgungsmethode geben. diff --git a/v24.04/de/_sources/eki.rst.txt b/v24.04/de/_sources/eki.rst.txt new file mode 100644 index 0000000..b36ffc7 --- /dev/null +++ b/v24.04/de/_sources/eki.rst.txt @@ -0,0 +1,558 @@ +KUKA Ethernet KRL Schnittstelle + +Der + +rc_visard NG + + stellt ein Ethernet KRL Interface (EKI-Bridge) zur Verfügung, welches +eine Kommunikation von KUKA KRL via KUKA.EthernetKRL XML mit dem + +rc_visard NG + + erlaubt. + +Bemerkung: Dieses Modul ist optional und benötigt eine gesonderte + EKIBridge- + + Lizenz + + . + +Bemerkung: Das KUKA.EthernetKRL add-on Software-Paket Version 2.2 + oder neuer muss auf der Robotersteuerung aktiviert sein, um dieses + Modul zu benutzen. + +Die EKI-Bridge kann benutzt werden, um programmatisch + +Serviceanfragen auszuführen, z.B. um individuelle Module zu starten +und stoppen, oder um angebotene Services wie z.B. die Hand-Auge- +Kalibrierung oder Berechnung von Greifposen zu nutzen, + +Laufzeitparameter abzufragen und zu ändern, z.B. der Kamera oder +Disparitätsberechnung. + +Bemerkung: Eine bekannte Einschränkung der EKI Bridge ist, dass + Strings, die valide Zahlen darstellen, nach int/float konvertiert + werden. Daher sollten benutzerdefinierte Namen (wie ROI IDs, etc.) + immer mindestens einen Buchstaben enthalten, sodass diese als + Serviceargumente benutzt werden können. + +Konfiguration der Ethernet-Verbindung + +Die EKI-Bridge hört auf Port 7000 auf EKI-XML-Nachrichten und +übersetzt diese transparent zur + +rc_visard NG + + +REST-API v2 + +. Die empfangenen EKI-Nachrichten werden in JSON umgewandelt und an +die + +rc_visard NG + + REST-API weitergeleitet. Die Antwort der REST-API wird anschließend +zurück in EKI-XML gewandelt. + +Die EKI-Bridge erlaubt den Zugriff auf Laufzeitparameter und Services +aller Module, die in + +Softwaremodule + + beschrieben sind. + +Für jedes Softwaremodul, das Laufzeitparameter anbietet, gibt es eine +XML-Konfigurationsdatei, um die Parameter abzufragen und zu setzen. +Diese sind nach dem Schema "-parameters.xml" benannt. Für +jeden Service eines Softwaremoduls gibt eine eigene XML- +Konfigurationsdatei. Diese ist nach dem Schema +"-.xml" benannt. + +Die IP des + +rc_visard NG + + im Netzwerk muss in der XML Datei eingetragen werden. + +Diese Konfigurationsdateien müssen im Verzeichnis +"C:\KRC\ROBOTER\Config\User\Common\EthernetKRL" auf der +Robotersteuerung abgelegt werden. Sie werden gelesen, sobald eine +Verbindung initialisiert wird. + +Um z.B. eine Ethernet-Verbindung mit dem Ziel aufzubauen, um die +"rc_stereomatching"-Parameter zu konfigurieren, ist der folgende KRL- +Code notwendig. + + DECL EKI_Status RET + RET = EKI_INIT("rc_stereomatching-parameters") + RET = EKI_Open("rc_stereomatching-parameters") + + ; ----------- Desired operation ----------- + + RET = EKI_Close("rc_stereomatching-parameters") + +Bemerkung: Die EKI-Bridge terminiert automatisch die Verbindung zum + Client, wenn eine empfangene XML-Nachricht ungültig ist. + +Allgemeine XML-Struktur + +Für die Datenanfrage nutzt die EKI-Bridge "" als Wurzelelement +(kurz für "Request"). + +Das Wurzelelement enthält immer die folgenden Elemente. + +: Dieses enthält ein Unterelement, über das die EKI-Bridge das +Ziel-Softwaremodul identifiziert. Der Modulname ist bereits in der +XML-Konfigurationsdatei vorausgefüllt. + +: "End-of-Request" Flag, das das Ende der Anfrage +markiert und diese auslöst. + +Die generische XML-Struktur sieht wie folgt aus. + + + + + + + + +Für den Datenempfang nutzt die EKI-Bridge "" als Wurzelelement +(kurz für "Response"). Das Wurzelelement enthält immer ein +"" Unterelement. + + + + + + + + + +Bemerkung: Standardmäßig ist in den Konfigurationsdateien 998 als + Flag angegeben, über welches KRL benachrichtigt wird, sobald eine + Antwortnachricht empfangen wurde. Falls dieser Wert bereits in + Benutzung ist, sollte dieser in der entsprechenden + Konfigurationsdatei geändert werden. + +Rückgabecode + +Das ""-Element enthält die Attribute "value" und +"message". + +Wie für alle anderen Softwaremodule gibt eine erfolgreiche Anfrage ein +"res/return_code/@value" mit dem Wert 0 zurück. Negative Werte geben +an, dass die Anfrage fehlgeschlagen ist. Die Fehlermeldung ist in +"res/return_code/@message" enthalten. Positive Werte geben an, dass +die Anfrage erfolgreich war, aber weitere Informationen in +"res/return_code/@message" enthalten sind. + +Die folgenden Rückgabecodes können von der EKI-Bridge zurückgegeben +werden: + +Rückgabecodes der EKI-Bridge Code Beschreibung 0 Erfolgreich +-1 Parsing-Fehler in der Konvertierung von XML zu JSON -2 Interner +Fehler -5 Verbindungsfehler von der REST-API -9 Fehlende oder +ungültige Lizenz für das EKI-Bridge-Modul + +Bemerkung: Die EKI-Bridge liefert auch Rückgabecodes spezifisch zu + den individuellen Softwaremodulen zurück. Diese sind im jeweiligen + + Softwaremodul + + dokumentiert. + +Bemerkung: Aufgrund von Limitierungen in KRL ist die maximale Länge + eines Strings, der von der EKI-Bridge zurückgegeben wird, auf 512 + Zeichen begrenzt. Alle längeren Strings werden gekürzt. + +Services + +Das XML-Schema für die Services der Softwaremodule wird aus den +Argumenten und der Antwort in + +JavaScript Object Notation (JSON) + + generiert, wie in + +Softwaremodule + + beschrieben. Diese Umwandlung ist bis auf die unten beschriebenen +Regeln transparent. + +Konvertierung von Posen: + + Eine Pose ist ein JSON-Objekt, das die Schlüssel "position" und + "orientation" enthält. + + { + "pose": { + "position": { + "x": "float64", + "y": "float64", + "z": "float64", + }, + "orientation": { + "x": "float64", + "y": "float64", + "z": "float64", + "w": "float64", + } + } + } + + Dieses JSON-Objekt wird zu einem KRL "FRAME" in der XML-Nachricht + konvertiert. + + + + Positionen werden von Metern in Millimetern umgerechnet und + Orientierungen von Quaternionen in das KUKA-ABC-Format (in Grad). + + Bemerkung: Es werden in der EKI-Bridge keine anderen + Größenumrechnungen vorgenommen. Alle Abmessungen und 3D- + Koordinaten, die nicht zu einer Pose gehören, werden in Metern + erwartet und zurückgegeben. + +Arrays: + + Arrays enthalten die Unterelemente "" (kurz für "List + Element"). Als Beispiel wird das JSON-Objekt + + { + "rectangles": [ + { + "x": "float64", + "y": "float64" + } + ] + } + + in das folgende XML-Fragment konvertiert + + + + ... + ... + + + +XML-Attribute: + + Alle JSON-Schlüssel, deren Wert ein primitiver Datentyp ist und die + nicht zu einem Array gehören, werden in XML-Attributen gespeichert. + Als Beispiel wird das JSON-Objekt + + { + "item": { + "uuid": "string", + "confidence": "float64", + "rectangle": { + "x": "float64", + "y": "float64" + } + } + } + + in das folgende XML-Fragment konvertiert + + + + + + +Anfrage-XML-Struktur + +Das ""-Element in der XML-Konfigurationsdatei für einen +generischen Service folgt der folgenden Spezifikation: + + + + + + + + + + +Das ""-Element hat ein XML-Unterelement, über das die EKI- +Bridge den angefragten Service identifiziert. Es ist bereits +vorausgefüllt in der Konfigurationsdatei enthalten. + +Das "" Element beinhaltet die Service-Argumente. Diese können +jeweils mit der KRL-Instruktion "EKI_Set" gesetzt werden. + +Beispielsweise sieht das ""-Element des "rc_load_carrier_db" +"get_load_carriers" Services (siehe + +LoadCarrierDB + +) wie folgt aus. + + + + + + + + + + +Das ""-Element erlaubt es, Anfragen mit Arrays zu +übermitteln. Um ein Array zu senden, wird die Anfrage in so viele +Nachrichten wie Array-Elemente aufgeteilt. Die letzte Nachricht +beinhaltet alle XML-Tags inklusive dem ""-Flag, +während alle anderen Nachrichten jeweils nur ein Array-Element +enthalten. + +Um z.B. zwei Load-Carrier-Modelle mit dem "get_load_carriers" Service +vom "rc_load_carrier_db" abzufragen, muss der Nutzer zwei XML- +Nachrichten senden. Die erste XML-Nachricht lautet: + + + + + load_carrier1 + + + + +Diese Nachricht kann über KRL mit dem "EKI_Send" Kommando gesendet +werden, indem das Listenelement als Pfad angegeben wird. + + DECL EKI_STATUS RET + RET = EKI_SetString("rc_load_carrier_db-get_load_carriers", "req/args/load_carrier_ids/le", "load_carrier1") + RET = EKI_Send("rc_load_carrier_db-get_load_carriers", "req/args/load_carrier_ids/le") + +Die zweite Nachricht beinhaltet alle XML-Tags und löst die Anfrage +beim "rc_load_carrier_db" Softwaremodul aus. + + + + + + + + + + + load_carrier2 + + + + + +Diese Nachricht kann über KRL gesendet werden, indem "req" als Pfad +für "EKI_Send" angegeben wird: + + DECL EKI_STATUS RET + RET = EKI_SetString("rc_load_carrier_db-get_load_carriers", "req/args/load_carrier_ids/le", "load_carrier2") + RET = EKI_Send("rc_load_carrier_db-get_load_carriers", "req") + +Antwort-XML-Struktur + +Das ""-Element in der XML-Konfigurationsdatei für einen +generischen Service folgt der folgenden Spezifikation: + + + + + + + + + + +Beispielsweise sieht das ""-Element des "rc_april_tag_detect" +"detect" Services (siehe + +TagDetect + +) wie folgt aus. + + + + + + + + + + + + + + + + + + + + + + + +Bei Arrays beinhaltet die Antwort mehrere Instanzen des gleichen XML- +Elements. Jedes Element wird in einen separaten Puffer in EKI +geschrieben und kann daraus mit KRL-Instruktionen ausgelesen werden. +Die Anzahl an Instanzen (Array-Elementen) kann über "EKI_CheckBuffer" +abgefragt werden und jede Instanz mit "EKI_Get" ausgelesen +werden. + +Beispielsweise können die Ergebnisposen aus einer Antwort des +"rc_april_tag_detect" "detect" Services in KRL wie folgt ausgelesen +werden: + + DECL EKI_STATUS RET + DECL INT i + DECL INT num_instances + DECL FRAME poses[32] + + DECL FRAME pose = {X 0.0, Y 0.0, Z 0.0, A 0.0, B 0.0, C 0.0} + + RET = EKI_CheckBuffer("rc_april_tag_detect-detect", "res/tags/le/pose") + num_instances = RET.Buff + for i=1 to num_instances + RET = EKI_GetFrame("rc_april_tag_detect-detect", "res/tags/le/pose", pose) + poses[i] = pose + endfor + RET = EKI_ClearBuffer("rc_april_tag_detect-detect", "res") + +Bemerkung: Vor jeder Anfrage über EKI zum + + rc_visard NG + + sollten alle Puffer geleert werden, um sicherzustellen, dass nur + die aktuelle Antwort in den EKI-Puffern enthalten ist. + +Parameter + +Die Parameter aller Softwaremodule können über die EKI-Bridge +ausgelesen und gesetzt werden. Die XML-Konfigurationsdatei für ein +generisches Softwaremodul folgt dieser Spezifikation: + + + + + + + + + + + + + + + + + + + + + + + + + +Die Anfrage wird als Anfrage zum + +Lesen + + von Parametern interpretiert, wenn die "value"-Attribute aller +Parameter leer sind. Falls mindestens ein "value"-Attribut befüllt +ist, wird die Anfrage als Anfrage zum + +Setzen + + von Parametern interpretiert und die befüllten Parameter gesetzt. + +Beispielsweise können die aktuellen Werte aller Parameter von +"rc_stereomatching" mit der folgenden XML-Nachricht abgefragt werden: + + + + + + + + + +Diese XML-Nachricht kann folgendermaßen über KRL gesendet werden: + + DECL EKI_STATUS RET + RET = EKI_Send("rc_stereomatching-parameters", "req") + +Die Antwort der EKI-Bridge enthält alle Parameter: + + + + + + + + + + + + + + + + + +Der "quality"-Parameter von "rc_stereomatching" kann mit folgender +XML-Nachricht auf "Low" gesetzt werden: + + + + + + + + + + + +Diese XML-Nachricht kann folgendermaßen über KRL gesendet werden: + + DECL EKI_STATUS RET + RET = EKI_SetString("rc_stereomatching-parameters", "req/parameters/quality/@value", "Low") + RET = EKI_Send("rc_stereomatching-parameters", "req") + +In diesem Fall wird nur der gesetzte Wert von "quality" zurückgegeben: + + + + + + + + +Beispielanwendungen + +Ausführlichere Beispielanwendungen können unter + +https://github.com/roboception/eki_examples + + abgerufen werden. + +Fehlerbehebung + +SmartPad Fehlermeldung: Limit of element memory reached + +Dieser Fehler kann auftreten, wenn die Anzahl der Matches das +Speicherlimit überschreitet. + +Erhöhen Sie den Wert BUFFERING und setzen Sie BUFFSIZE in den EKI +Konfigurationsdateien. Passen Sie diese Einstellungen an Ihre +spezielle KRC an. + +Verringern Sie den Parameter 'Maximale Matches' im Detektionsmodul. + +Selbst wenn das Gesamtspeicherlimit (BUFFSIZE) einer Nachricht nicht +erreicht wird, kann die KRC die Anzahl der Elemente im XML-Baum +möglicherweise nicht analysieren, wenn das BUFFERING-Limit zu klein +ist. Wenn Ihre Anwendung beispielsweise 50 verschiedene Greifpunkte +vorschlägt, muss das BUFFERING-Limit ebenfalls 50 betragen. diff --git a/v24.04/de/_sources/general.rst.txt b/v24.04/de/_sources/general.rst.txt new file mode 100644 index 0000000..5e96e7d --- /dev/null +++ b/v24.04/de/_sources/general.rst.txt @@ -0,0 +1,51 @@ +Überblick + +Der 3D-Sensor + +rc_visard + + ist eine Stereokamera, die über eine integrierte Recheneinheit +verfügt und der Schutzklasse IP 54 angehört. + +Der + +rc_visard NG + + stellt Echtzeit-Kamerabilder und Tiefenbilder bereit, die zur +Berechnung von 3D-Punktwolken verwendet werden können. Zudem erstellt +er Konfidenz- und Fehlerbilder, mit denen sich die Qualität der +Bilderfassung messen lässt. Dank der standardisierten GenICam- +Schnittstelle ist er mit allen großen Bildverarbeitungsbibliotheken +kompatibel und bietet darüber hinaus eine intuitive, web-basierte +Bedienoberfläche an. + +Mit optional erhältlichen Softwaremodulen bietet der + +rc_visard NG + + Standardlösungen für Anwendungen in der Objekterkennung oder für +robotische Pick-and-Place-Applikationen. + +Dank der intuitiven Kalibrierung, Konfiguration und Bedienung macht +der + +rc_visard NG + + 3D-Wahrnehmung für jedermann möglich. + + +Werden im vorliegenden Handbuch die Begriffe "Sensor" und " + +rc_visard NG + +" verwendet, so beziehen sich diese auf den von Roboception +angebotenen + +rc_visard NG + +. + +Bemerkung: Das vorliegende Handbuch nutzt das metrische System und + verwendet vorrangig die Maßeinheiten Meter und Millimeter. Sofern + nicht anders angegeben, sind Abmessungen in technischen Zeichnungen + in Millimetern angegeben. diff --git a/v24.04/de/_sources/gigevision.rst.txt b/v24.04/de/_sources/gigevision.rst.txt new file mode 100644 index 0000000..cad973a --- /dev/null +++ b/v24.04/de/_sources/gigevision.rst.txt @@ -0,0 +1,837 @@ +GigE Vision 2.0/GenICam-Schnittstelle + +Gigabit Ethernet for Machine Vision (oder kurz "GigE Vision®") ist ein +industrieller Standard für Kameraschnittstellen, der auf UDP/IP +basiert (siehe + +http://www.gigevision.com + +). Der + +rc_visard NG + + nutzt den GigE Vision®-Standard der Version 2.0 und ist damit mit +allen GigE Vision®-2.0-Standard-konformen Frameworks und Bibliotheken +kompatibel. + +GigE Vision® verwendet GenICam ( + +Generic Interface for Cameras + +), um die Eigenschaften der Kamera bzw. des Geräts zu beschreiben. Für +nähere Informationen zu dieser generischen Programmierschnittstelle +für Kameras siehe + +http://www.genicam.org/ + +. + +Über diese Schnittstelle stellt der + +rc_visard NG + + folgende Funktionen zur Verfügung: + +Discovery-Mechanismus, + +IP-Konfiguration, + +Konfiguration kamerabezogener Parameter, + +Bildaufnahme und + +Zeitsynchronisierung über das im Standard IEEE 1588-2008 definierte +Precision Time Protocol (PTPv2). + +Bemerkung: Der + + rc_visard NG + + unterstützt Jumbo-Frames mit einer Größe bis 9000 Byte. Für höchste + Leistung wird empfohlen, die maximale Übertragungseinheit (MTU) des + GigE-Vision-Clients auf 9000 zu stellen. + +Bemerkung: Über seine Homepage stellt Roboception Tools und eine + C++-Programmierschnittstelle mit Beispielen zum Discovery- + Mechanismus, zur Konfiguration und zum Bild-Streaming über die GigE + Vision/GenICam-Schnittstelle zur Verfügung ( + + http://www.roboception.com/download + + ). + +GigE Vision Ports + +GigE Vision ist ein UDP basiertes Protokoll. Auf dem + +rc_visard NG + + sind die UDP Ports statisch und bekannt: + +UDP Port 3956: GigE Vision Control Protocol (GVCP). Zum Auffinden, +steuern und konfigurieren des Geräts. + +UDP Port 50010: Stream channel source port. Nutzt das GigE Vision +Stream Protocol (GVSP) zum transferieren der Bilder. + +Wichtige Parameter der GenICam-Schnittstelle + +Die folgende Liste enthält einen Überblick über relevante GenICam- +Parameter des + +rc_visard NG + +, die über die GenICam-Schnittstelle abgerufen und/oder geändert +werden können. Neben den Standardparametern, die in der *Standard +Feature Naming Convention* (SFNC, siehe + +http://www.emva.org/standards-technology/genicam/genicam-downloads/ + +) definiert werden, bietet der + +rc_visard NG + + zudem eigene Parameter, die sich auf spezielle Eigenschaften der +Module + +Kamera + + und + +Stereo-Matching + + beziehen. + +Wichtige Standardparameter der GenICam-Schnittstelle + +Kategorie: ImageFormatControl + +"ComponentSelector" + Typ: Aufzählung, mögliche Werte: Intensity, IntensityCombined, + Disparity, Confidence oder Error + + Voreinstellung: - + + Beschreibung: Erlaubt dem Benutzer, einen der fünf Bild-Streams zur + Konfiguration auszuwählen (siehe Verfügbare Bild-Streams, + \:Abschnitt \ref{gigevision:sect-provided-image-streams}). + +"ComponentIDValue" (schreibgeschützt) + Typ: Integer + + Beschreibung: ID des vom ComponentSelector ausgewählten Bild- + Streams. + +"ComponentEnable" + Typ: Boolean + + Voreinstellung: - + + Beschreibung: Ist der Parameter auf true gesetzt, aktiviert er den + im ComponentSelector ausgewählten Bild-Stream. Anderenfalls + deaktiviert er diesen Stream. Über ComponentSelector und + ComponentEnable lassen sich einzelne Bild-Streams ein- und + ausschalten. + +"Width" (schreibgeschützt) + Typ: Integer + + Beschreibung: Bildbreite des vom ComponentSelector ausgewählten + Bild-Streams in Pixeln. + +"Height" (schreibgeschützt) + Typ: Integer + + Beschreibung: Bildhöhe des vom ComponentSelector ausgewählten Bild- + Streams in Pixeln. + +"WidthMax" (schreibgeschützt) + Typ: Integer + + Beschreibung: Maximale Breite eines Bildes. + +"HeightMax" (schreibgeschützt) + Typ: Integer + + Beschreibung: Maximale Höhe eines Bildes im Stream. Der Wert + beträgt aufgrund der gestapelten Bilder der linken und rechten + Kamera im IntensityCombined-Stream immer 1920 Pixel (siehe + Verfügbare Bild-Streams, Abschnitt \ref{gigevision:sect-provided- + image-streams}). + +"PixelFormat" + Typ: Aufzählung, mögliche Werte: Mono8 oder YCbCr411_8 (nur bei + Farbkameras), Coord3D_C16, Confidence8 und Error8 + + Beschreibung: Pixelformat der selektierten Komponente. Die + Aufzählung erlaubt nur aus Pixelformaten auszuwählen, die für die + ausgewählte Komponente möglich sind. Bei einer Farbkamera kann man + bei den Komponenten Intensity und IntensityCombined zwischen den + Pixelformaten Mono8 oder YCbCr411_8 wählen. + +Kategorie: AcquisitionControl + +"AcquisitionFrameRate" + Typ: Float, Wertebereich: 1–25 Hz + + Voreinstellung: 25 Hz + + Beschreibung: Bildwiederholrate der Kamera (FPS, Abschnitt + \ref{stereo_camera:sect-cam-params}). + +"ExposureAuto" + Typ: Aufzählung, mögliche Werte: Continuous, Out1High, + AdaptiveOut1, HDR oder Off + + Voreinstellung: Continuous + + Beschreibung: Kombiniert exp_control (Belichtungsregelung, + Abschnitt \ref{stereo_camera:expl-exp-control}) und exp_auto_mode + (Belichtungszeitautomatik Modus, Abschnitt \ref{stereo_camera:expl- + exp-auto-mode}). Off entspricht Manual Belichtungsregelung. + Continuous, Out1High oder AdaptiveOut1 aktivieren Auto + Belichtungsregelung mit dem entsprechenden Belichtungszeitautomatik + Modus wobei Continuous dem Normal exp_auto_mode entspricht. HDR + aktiviert die HDR Belichtungsregelung. + +"ExposureTime" + Typ: Float, Wertebereich: 66–18000 µs + + Voreinstellung: 5000 µs + + Beschreibung: Belichtungszeit der Kameras für den manuellen + Belichtungsmodus, ausgedrückt in Mikrosekunden (Belichtungszeit, + Abschnitt \ref{stereo_camera:expl-exp-value}). + +Kategorie: AnalogControl + +"GainSelector" (schreibgeschützt) + Typ: Aufzählung, Wert: ist immer All + + Voreinstellung: All + + Beschreibung: Der rc_visard NG unterstützt aktuell nur einen + globalen Verstärkungsfaktor. + +"Gain" + Typ: Float, Wertebereich: 0–18 dB + + Voreinstellung: 0 dB + + Beschreibung: Verstärkungsfaktor der Kameras für den manuellen + Belichtungsmodus, ausgedrückt in Dezibel (Verstärkungsfaktor, + Abschnitt \ref{stereo_camera:expl-gain-value}). + +"BalanceWhiteAuto" (nur für Farbkameras) + Typ: Aufzählung, mögliche Werte: Continuous oder Off + + Voreinstellung: Continuous + + Beschreibung: Lässt sich für den manuellen Weißabgleich auf Off + bzw. für den automatischen Weißabgleich auf Continuous setzen. + Dieser Parameter ist nur für Farbkameras verfügbar (Weißabgleich, + Abschnitt \ref{stereo_camera:expl-wb-auto}). + +"BalanceRatioSelector" (nur für Farbkameras) + Typ: Aufzählung, mögliche Werte: Red oder Blue + + Voreinstellung: Red + + Beschreibung: Auswahl des Verhältnisses welches mit BalanceRatio + einstellbar ist. Red bedeutet Verhältnis von Rot zu Grün, und Blue + bedeutet Verhältnis von Blau zu Grün. Diese Einstellung ist nur für + Farbkameras verfügbar. + +"BalanceRatio" (nur für Farbkameras) + Typ: Float, Wertebereich: 0.125 – 8 + + Voreinstellung: 1.2 wenn Red und 2.4 wenn Blue im + BalanceRatioSelector eingestellt sind + + Beschreibung: Gewichtung vom roten oder blauen zum grünen + Farbkanal. Diese Einstellung ist nur für Farbkameras verfügbar + (wb_ratio, Abschnitt \ref{stereo_camera:expl-wb-ratio}). + +Kategorie: DigitalIOControl + +"LineSelector" + Typ: Aufzählung, mögliche Werte: Out1, Out2, In1 oder In2 + + Voreinstellung: Out1 + + Beschreibung: Wählt den Ein- oder Ausgang, um den aktuellen Zustand + abzufragen oder die Betriebsart zu setzen. + +"LineStatus" (schreibgeschützt) + Typ: Boolean + + Beschreibung: Aktueller Zustand des mit LineSelector ausgewählten + Ein- oder Ausgangs. + +"LineStatusAll" (schreibgeschützt) + Typ: Integer + + Beschreibung: Aktueller Zustand der Ein- und Ausgänge, welche in + den unteren vier Bits angegeben werden. + + Bedeutung der Bits des LineStatusAll Parameters. Bit 4 + 3 2 1 GPIO Eingang 2 Eingang 1 Ausgang 2 Ausgang 1 + +"LineSource" + Typ: Aufzählung, mögliche Werte: ExposureActive, + ExposureAlternateActive, Low oder High + + Voreinstellung: Low + + Beschreibung: Betriebszustand des mit LineSelector gewählten + Ausgangs, wie im Abschnitt zum IOControl Modul beschrieben + (out1_mode und out2_mode, Abschnitt \ref{iocontrol:sect-iocontrol- + params}). Siehe auch den Parameter AcquisitionAlternateFilter zum + Filtern von Bildern im Betriebszustand ExposureAlternateActive. + +Kategorie: TransportLayerControl / PtpControl + +"PtpEnable" + Typ: Boolean + + Voreinstellung: false + + Beschreibung: Schaltet die PTP-Synchronisierung ein und aus. + +Kategorie: Scan3dControl + +"Scan3dDistanceUnit" (schreibgeschützt) + Typ: Aufzählung, Wert: ist immer Pixel + + Beschreibung: Einheit für die Disparitätsmessungen, ist immer + Pixel. + +"Scan3dOutputMode" (schreibgeschützt) + Typ: Aufzählung, Wert: ist immer DisparityC + + Beschreibung: Modus für die Tiefenmessungen, ist immer DisparityC. + +"Scan3dFocalLength" (schreibgeschützt) + Typ: Float + + Beschreibung: Brennweite des mit ComponentSelector ausgewählten + Bild-Streams in Pixeln. Im Fall der Komponenten Disparity, + Confidence und Error hängt der Wert auch von der Auflösung ab, die + implizit über DepthQuality eingestellt wurde. + +"Scan3dBaseline" (schreibgeschützt) + Typ: Float + + Beschreibung: Basisabstand der Stereokamera in Metern. + +"Scan3dPrinciplePointU" (schreibgeschützt) + Typ: Float + + Beschreibung: Horizontale Position des Bildhauptpunktes des mit + ComponentSelector ausgewählten Bild-Streams. Im Fall der + Komponenten Disparity, Confidence und Error hängt der Wert auch von + der Auflösung ab, die implizit über DepthQuality eingestellt wurde. + +"Scan3dPrinciplePointV" (schreibgeschützt) + Typ: Float + + Beschreibung: Vertikale Position des Bildhauptpunktes des mit + ComponentSelector ausgewählten Bild-Streams. Im Fall der + Komponenten Disparity, Confidence und Error hängt der Wert auch von + der Auflösung ab, die implizit über DepthQuality eingestellt wurde. + +"Scan3dCoordinateScale" (schreibgeschützt) + Typ: Float + + Beschreibung: Der Skalierungsfaktor, der mit den Disparitätswerten + im Disparitätsbild-Stream zu multiplizieren ist, um die + tatsächlichen Disparitätswerte zu erhalten. Der Wert beträgt immer + 0,0625. + +"Scan3dCoordinateOffset" (schreibgeschützt) + Typ: Float + + Beschreibung: Der Versatz, der zu den Disparitätswerten im + Disparitätsbild-Stream addiert werden muss, um die tatsächlichen + Disparitätswerte zu erhalten. Für den rc_visard NG beträgt der Wert + immer 0 und kann daher ignoriert werden. + +"Scan3dInvalidDataFlag" (schreibgeschützt) + Typ: Boolean + + Beschreibung: Ist immer true, was bedeutet, dass ungültige Daten im + Disparitätsbild mit einem spezifischen Wert markiert werden, der + durch den Parameter Scan3dInvalidDataValue definiert wird. + +"Scan3dInvalidDataValue" (schreibgeschützt) + Typ: Float + + Beschreibung: Ist der Wert, der für ungültige Disparität steht. Der + Wert ist immer 0, was bedeutet, dass Disparitätswerte von 0 immer + ungültigen Messungen entsprechen. Um zwischen ungültigen + Disparitätsmessungen und Messungen, bei denen die Disparität + aufgrund der unendlich weit entfernten Objekte 0 beträgt, + unterscheiden zu können, wird der Disparitätswert für den + letztgenannten Fall auf 0,0625 gesetzt. Dies entspricht noch immer + einer Objektentfernung von mehreren hundert Metern. + +Kategorie: ChunkDataControl + +"ChunkModeActive" + Typ: Boolean + + Voreinstellung: false + + Beschreibung: Schaltet Chunk-Daten an, die mit jedem Bild + mitgeliefert werden. + +Besondere Parameter der GenICam-Schnittstelle des rc_visard NG + +Kategorie: DeviceControl + +"RcSystemReady" (schreibgeschützt) + Typ: Boolean + + Beschreibung: Gibt an, ob der Bootprozess des Geräts abgeschlossen + ist und alle Modules laufen. + +"RcParamLockDisable" + Typ: Boolean + + Voreinstellung: false + + Beschreibung: Wenn dieser Wert auf true gesetzt ist, werden die + Kamera- und Tiefenbildparameter nicht gesperrt, wenn ein GigE + Vision Client mit dem Gerät verbunden wird. Es ist zu beachten, + dass -- abhängig vom verbundenen GigE Vision Client -- + Parameteränderungen durch andere Anwendungen (z.B. die Web GUI) + möglicherweise nicht durch den GigE Vision Client bemerkt werden, + was zu ungewolltem Verhalten führen kann. + +Kategorie: AcquisitionControl + +"AcquisitionAlternateFilter" + Typ: Aufzählung, mögliche Werte: Off, OnlyHigh oder OnlyLow + + Voreinstellung: Off + + Beschreibung: Falls dieser Parameter auf OnlyHigh (oder + entsprechend OnlyLow) und die LineSource für mindestens einen + Ausgang auf ExposureAlternateActive eingestellt wird, dann werden + nur die Kamerabilder übertragen, welche aufgenommen wurden, während + der konfigurierte Ausgang an war, d.h. ein potentiell + angeschlossener Projektor war an (oder bei OnlyLow entsprechend + aus). Dieser Parameter ist ein einfaches Mittel um nur Bilder ohne + ein projiziertes Muster zu bekommen. Der minimale Zeitunterschied + zwischen einem Kamera- und einem Disparitätsbild ist in diesem Fall + etwa 40 ms (siehe IOControl, Abschnitt \ref{iocontrol:sect- + iocontrol-params}). + +"AcquisitionMultiPartMode" + Typ: Aufzählung, mögliche Werte: SingleComponent oder + SynchronizedComponents + + Voreinstellung: SingleComponent + + Beschreibung: Nur wirksam im MultiPart-Modus. Ist dieser Parameter + auf SingleComponent gesetzt, werden die Bilder jeweils sofort als + einzelne Komponente pro Frame/Puffer geschickt, sobald sie + verfügbar sind. Dies entspricht dem Verhalten von Clients, die + MultiPart nicht unterstützen. Ist dieser Parameter auf + SynchronizedComponents gesetzt, werden die aktivierten Komponenten + auf dem rc_visard NG zeitlich synchronisiert und in einem + gemeinsamen Frame/Puffer versendet -- allerdings nur, falls alle + für diesen Zeitpunkt verfügbar sind. + +"ExposureTimeAutoMax" + Typ: Float, Wertebereich: 66–18000 µs + + Voreinstellung: 18000 µs + + Beschreibung: Maximale Belichtungszeit im automatischen + Belichtungsmodus (Maximale Belichtungszeit, Abschnitt + \ref{stereo_camera:expl-exp-max}). + +"ExposureRegionOffsetX" + Typ: Integer, Wertebereich: 0 bis maximale Bildbreite + + Voreinstellung: 0 + + Beschreibung: Horizontaler Offset des Bereichs für die + Belichtungszeitregelung\:(Abschnitt \ref{stereo_camera:expl-exp- + region}) in Pixeln. + +"ExposureRegionOffsetY" + Typ: Integer, Wertebereich: 0 bis maximale Bildhöhe + + Voreinstellung: 0 + + Beschreibung: Vertikaler Offset des Bereichs für die + Belichtungszeitregelung\:(Abschnitt \ref{stereo_camera:expl-exp- + region}) in Pixeln. + +"ExposureRegionWidth" + Typ: Integer, Wertebereich: 0 bis maximale Bildbreite + + Voreinstellung: 0 + + Beschreibung: Breite des Bereichs für die + Belichtungszeitregelung\:(Abschnitt \ref{stereo_camera:expl-exp- + region}) in Pixeln. + +"ExposureRegionHeight" + Typ: Integer, Wertebereich: 0 bis maximale Bildhöhe + + Voreinstellung: 0 + + Beschreibung: Höhe des Bereichs für die + Belichtungszeitregelung\:(Abschnitt \ref{stereo_camera:expl-exp- + region}) in Pixeln. + +"RcExposureAutoAverageMax" + Typ: Float, Wertebereich 0-1 + + Voreinstellung: 0.75 + + Beschreibung: Maximale Helligkeit der automatischen + Belichtungszeitsteuerung\:(Abschnitt \ref{stereo_camera:exp-auto- + max-min-average}) als Wert zwischen 0 (dunkel) und 1 (hell). + +"RcExposureAutoAverageMin" + Typ: Float, Wertebereich 0-1 + + Voreinstellung: 0.25 + + Beschreibung: Minimale Helligkeit der automatischen + Belichtungszeitsteuerung\:(Abschnitt \ref{stereo_camera:exp-auto- + max-min-average}) als Wert zwischen 0 (dunkel) und 1 (hell). + +Kategorie: Scan3dControl + +"FocalLengthFactor" (schreibgeschützt) + Typ: Float + + Beschreibung: Brennweite skaliert auf eine Bildbreite von einem + Pixel. Um die Brennweite für ein bestimmtes Bild in Pixeln zu + ermitteln, muss dieser Wert mit der Breite des empfangenen Bilds + multipliziert werden. Siehe auch den Parameter Scan3dFocalLength. + +"Baseline" (schreibgeschützt) + Typ: Float + + Beschreibung: Dieser Parameter ist überholt. Der Parameter + Scan3dBaseline sollte stattdessen benutzt werden. + +Kategorie: DepthControl + +"DepthAcquisitionMode" + Typ: Aufzählung, mögliche Werte: SingleFrame, SingleFrameOut1 oder + Continuous + + Voreinstellung: Continuous + + Beschreibung: Im Modus SingleFrame wird das Stereo-Matching mit + jedem Aufruf von DepthAcquisitionTrigger durchgeführt. Der Modus + SingleFrameOut1 kann zum Kontrollieren eines externen Projektors + genutzt werden. Dabei wird bei jedem Trigger Out1 auf + ExposureAlternateActive und nach dem Empfangen der Stereobilder auf + Low gesetzt. Im Modus Continuous wird das Stereo-Matching + kontinuierlich durchgeführt. + +"DepthAcquisitionTrigger" + type: Command + + Beschreibung: Dieses Kommando triggert das Stereo-Matching auf den + nächsten verfügbaren Stereobildern, falls DepthAcquisitionMode auf + SingleFrame oder SingleFrameOut1 eingestellt ist. + +"DepthQuality" + Typ: Aufzählung, mögliche Werte: Low, Medium, High oder Full (nur + mit StereoPlus-Lizenz) + + Voreinstellung: High + + Beschreibung: Qualität der Disparitätsbilder. Eine geringere + DepthQuality führt zu Disparitätsbildern mit einer geringeren + Auflösung (Qualität, Abschnitt \ref{stereo_matching:expl-depth- + quality}). + +"DepthDoubleShot" + Typ: Boolean + + Voreinstellung: false + + Beschreibung: True zum Verbessern des Stereo-Matching-Resultats bei + Szenen mit Projektor. Löcher im Tiefenbild werden gefüllt mit + Tiefendaten aus dem Stereo Matching des Bildpaars ohne + Projektormuster (Double-Shot, Abschnitt \ref{stereo_matching:expl- + depth-double-shot}). + +"DepthStaticScene" + Typ: Boolean + + Voreinstellung: false + + Beschreibung: True zum Mitteln über acht aufeinanderfolgende + Kamerabilder zur Verbesserung des Stereo-Matching-Resultats + (Statisch, Abschnitt \ref{stereo_matching:expl-depth-static}). + +"DepthSmooth" (schreibgeschützt ohne StereoPlus-Lizenz) + Typ: Boolean + + Voreinstellung: false + + Beschreibung: True um Disparitätswerte zu glätten (Glättung, + Abschnitt \ref{stereo_matching:expl-depth-smooth}). + +"DepthFill" + Typ: Integer, Wertebereich: 0–4 Pixel + + Voreinstellung: 3 Pixel + + Beschreibung: Wert in Pixeln für Füllen\:(Abschnitt + \ref{stereo_matching:expl-depth-fill}). + +"DepthSeg" + Typ: Integer, Wertebereich: 0–4000 Pixel + + Voreinstellung: 200 Pixel + + Beschreibung: Wert in Pixeln für Segmentierung\:(Abschnitt + \ref{stereo_matching:expl-depth-seg}). + +"DepthMinConf" + Typ: Float, Wertebereich: 0.0–1.0 + + Voreinstellung: 0.0 + + Beschreibung: Wert für die Minimale Konfidenz-Filterung\:(Abschnitt + \ref{stereo_matching:expl-depth-min-conf}). + +"DepthMinDepth" + Typ: Float, Wertebereich: 0.1–100.0 m + + Voreinstellung: 0.1 m + + Beschreibung: Wert in Metern für die Minimale Abstands- + Filterung\:(Abschnitt \ref{stereo_matching:expl-depth-min-depth}). + +"DepthMaxDepth" + Typ: Float, Wertebereich: 0.1–100.0 m + + Voreinstellung: 100.0 m + + Beschreibung: Wert in Metern für die Maximale Abstands- + Filterung\:(Abschnitt \ref{stereo_matching:expl-depth-max-depth}). + +"DepthMaxDepthErr" + Typ: Float, Wertebereich: 0.01–100.0 m + + Voreinstellung: 100.0 m + + Beschreibung: Wert in Metern für die Maximale Fehler- + Filterung\:(Abschnitt \ref{stereo_matching:expl-depth-max-depth- + err}). + +Chunk-Daten + +Der + +rc_visard NG + + unterstützt Chunk-Parameter, die mit jedem Bild mitgeschickt werden. +Chunk-Parameter haben alle den Präfix "Chunk". Ihre Bedeutung +entspricht den gleichlautenden Nicht-Chunk-Parametern. Sie passen +jedoch immer zu dem zugehörigen Bild. Zum Beispiel hängt +"Scan3dFocalLength" von "ComponentSelector" und "DepthQuality" ab, da +die Bildauflösung von beiden Parametern abhängt. Der Parameter +"ChunkScan3dFocalLength", welcher zu einem Bild geliefert wird, passt +hingegen zu der Auflösung dieses Bildes. + +Nützliche Chunk-Parameter: + +ChunkComponentSelector selektiert, für welche Komponente Chunk-Daten +aus dem MultiPart-Puffer gelesen werden. + +ChunkComponentID und ChunkComponentIDValue dienen der eindeutigen +Zuordnung des Bildes zu seiner Komponente (z.B. Kamerabild oder +Disparitätsbild), ohne dies vom Bildformat oder der Bildgröße ableiten +zu müssen. + +ChunkLineStatusAll bietet den Status der Ein- und Ausgänge zum +Zeitpunkt der Bildaufnahme. Siehe LineStatusAll für eine Beschreibung +der Bits. + +ChunkScan3d... sind nützlich zur 3D-Rekonstruktion wie im Abschnitt +Umwandlung von Bild-Streams\:(Abschnitt \ref{gigevision:sect-image- +stream-conversions}) beschrieben. + +ChunkPartIndex gibt den Index des Bild-Parts im MultiPart-Block für +die ausgewählte Komponente (ChunkComponentSelector) zurück. + +ChunkRcOut1Reduction gibt den Anteil der Bildhelligkeit an, um den +Bilder mit GPIO Ausgang 1 (Out1) LOW dunkler sind als Bilder mit Out1 +HIGH. Ein Wert von beispielsweise 0.2 bedeutet, dass die Bilder mit +GPIO Out1 LOW 20% weniger Helligkeit haben als Bilder mit GPIO Out1 +HIGH. Dieser Wert ist nur verfügbar, wenn exp_auto_mode der +Stereokamera auf AdaptiveOut1 oder Out1High gesetzt ist (auto exposure +mode, Abschnitt \ref{stereo_camera:expl-exp-auto-mode}). + +Chunk-Daten werden durch das Setzen des GenICam-Parameters +"ChunkModeActive" auf "True" eingeschaltet. + +Verfügbare Bild-Streams + +Der + +rc_visard NG + + stellt über die GenICam-Schnittstelle die folgenden fünf Bild-Streams +zur Verfügung: + + Name der Komponente PixelFormat Beschreibung Intensity Mono8 +(monochrome Kameras) YCbCr411_8 (Farbkameras) Rektifiziertes Bild +der linken Kamera IntensityCombined Mono8 (monochrome Kameras) +YCbCr411_8 (Farbkameras) Rektifiziertes Bild der linken Kamera, +gestapelt auf das rektifizierte Bild der rechten Kamera Disparity +Coord3D_C16 Disparitätsbild in gewünschter Auflösung, d.h. +DepthQuality in Full, High, Medium oder Low Confidence Confidence8 +Konfidenzbild Error Error8 (Sonderformat: 0x81080001) Fehlerbild + +Jedes Bild wird mit einem Zeitstempel und dem in der Tabelle +angegebenen + +PixelFormat + + ausgegeben. Dieses + +PixelFormat + + sollte verwendet werden, um zwischen den verschiedenen Bildtypen zu +unterscheiden. Bilder, die den gleichen Aufnahmezeitpunkt haben, +können durch Vergleich der GenICam-Zeitstempel einander zugeordnet +werden. + +Umwandlung von Bild-Streams + +Das Disparitätsbild enthält vorzeichenlose 16-Bit-Ganzzahlwerte. Diese +Werte müssen mit dem im GenICam-Parameter + +Scan3dCoordinateScale + + angegebenen Skalierungsfaktor multipliziert werden, um die +Disparitätswerte d in Pixeln zu ermitteln. Um die 3D-Objektkoordinaten +aus den Disparitätswerten berechnen zu können, werden die Brennweite, +der Basisabstand und der Bildhauptpunkt benötigt. Diese Parameter +werden als GenICam-Parameter + +Scan3dFocalLength + +, + +Scan3dBaseline + +, + +Scan3dPrincipalPointU + + und + +Scan3dPrincipalPointV + + zur Verfügung gestellt. Die Brennweite und der Bildhauptpunkt hängen +von der Bildauflösung der mit dem + +ComponentSelector + + selektierten Komponente ab. Sind diese Werte bekannt, können die +Pixel-Koordinaten und die Disparitätswerte mithilfe der im Abschnitt + +Berechnung von Tiefenbildern und Punktwolken + + angegebenen Gleichungen in 3D-Objektkoordination im Kamera- +Koordinatensystem umgerechnet werden. + +Bemerkung: Das Kamera-Koordinatensystem des + + rc_visard NG + + ist in + + Sensor-Koordinatensystem + + definiert. + +Unter der Annahme, dass es sich bei d_{ik} um den 16-Bit- +Disparitätswert in der Spalte i und Zeile k eines Disparitätsbildes +handelt, ist der Fließkomma-Disparitätswert in Pixeln d_{ik} gegeben +durch + + d_{ik}=d16_{ik} \cdot \mathrm{Scan3dCoordinateScale} + +Die 3D-Rekonstruktion (in Metern) kann wie folgt mit den GenICam- +Parametern durchgeführt werden: + + P_x&=\left(i+0.5-\mathrm{Scan3dPrincipalPointU}\right) + \frac{\mathrm{Scan3dBaseline}}{d_{ik}},\\ + P_y&=\left(k+0.5-\mathrm{Scan3dPrincipalPointV}\right) + \frac{\mathrm{Scan3dBaseline}}{d_{ik}},\\ + P_z&=\mathrm{Scan3dFocalLength} + \frac{\mathrm{Scan3dBaseline}}{d_{ik}}. + +Das Konfidenzbild umfasst vorzeichenlose 8-Bit-Ganzzahlwerte. Diese +Werte müssen durch 255 geteilt werden, um die zwischen 0 und 1 +liegenden Konfidenzwerte zu berechnen. + +Das Fehlerbild umfasst vorzeichenlose 8-Bit-Ganzzahlwerte. Der Fehler +e_{ik} muss mit dem im GenICam-Parameter + +Scan3dCoordinateScale + + angegebenen Skalierungsfaktor multipliziert werden, um die +Disparitätsfehlerwerte d_{eps} in Pixeln zu ermitteln. Der +Beschreibung in + +Konfidenz- und Fehlerbilder + + zufolge lässt sich der Tiefenfehler z_{eps} (in Metern) mit den +GenICam-Parametern wie folgt berechnen: + + d_{ik}&=d16_{ik} \cdot \mathrm{Scan3dCoordinateScale},\\ + z_{eps}&=\frac{e_{ik} \cdot \mathrm{Scan3dCoordinateScale} \cdot + \mathrm{Scan3dFocalLength} \cdot + \mathrm{Scan3dBaseline}} {(d_{ik})^2}. + +Bemerkung: Chunk-Daten sollten nach Möglichkeit mit dem Parameter + + ChunkModeActive + + angeschaltet und die zum Bild zugehörigen Parameter + + ChunkScan3dCoordinateScale + + , + + ChunkScan3dFocalLength + + , + + ChunkScan3dBaseline + + , + + ChunkScan3dPrincipalPointU + + und + + ChunkScan3dPrincipalPointV + + genutzt werden, denn deren Werte passen zu der Auflösung des + zugehörigen Bildes. + +Für nähere Informationen zu Disparitäts-, Fehler- und Konfidenzbildern +siehe + +Stereo-Matching + +. diff --git a/v24.04/de/_sources/glossary.rst.txt b/v24.04/de/_sources/glossary.rst.txt new file mode 100644 index 0000000..88c202b --- /dev/null +++ b/v24.04/de/_sources/glossary.rst.txt @@ -0,0 +1,177 @@ +Glossar + +DHCP + Das Dynamic Host Configuration Protocol (DHCP) wird verwendet, um + einem Netzwerkgerät automatisch eine + + IP + + -Adresse zuzuweisen. Einige DHCP-Server akzeptieren lediglich + bekannte Geräte. In diesem Fall muss der Administrator die feste + + MAC-Adresse + + eines Gerätes im DHCP-Server erfassen. + +DNS +mDNS + Das Domain Name System (DNS) verwaltet die Host-Namen und + + IP + + -Adressen aller Netzwerkgeräte. Es dient dazu, den Host-Namen zur + Kommunikation mit einem Gerät in die IP-Adresse zu übersetzen. Das + DNS kann so konfiguriert werden, dass diese Informationen entweder + automatisch abgerufen werden, wenn ein Gerät in einem Netzwerk + erscheint, oder manuell von einem Administrator zu erfassen sind. + Im Gegensatz hierzu arbeitet + + multicast DNS + + (mDNS) ohne einen zentralen Server, wobei jedes Mal, wenn ein + Host-Name aufgelöst werden muss, alle Geräte in einem Netzwerk + abgefragt werden. mDNS ist standardmäßig für die Betriebssysteme + Linux und macOS verfügbar und wird verwendet, wenn '.local' an + einen Host-Namen angehängt wird. + +DOF + Als Freiheitsgrade (Degrees of Freedom, DOF) wird die Anzahl + unabhängiger Translations- und Rotationsparameter bezeichnet. Im + 3D-Raum genügen 6 Freiheitsgrade (drei für Translation und drei für + Rotation), um eine beliebige Position und Orientierung zu + definieren. + +GenICam + GenICam ist eine generische Standard-Schnittstelle für Kameras. Sie + fungiert als einheitliche Schnittstelle für andere Standards, wie + + GigE Vision + + , Camera Link, USB, usw. Für nähere Informationen siehe + + http://genicam.org + + . + +GigE + Gigabit Ethernet (GigE) ist eine Netzwerktechnologie, die mit einer + Übertragungsrate von einem Gigabit pro Sekunde arbeitet. + +GigE Vision + GigE Vision® ist ein Standard für die Konfiguration von Kameras und + Übertragung der Bilder über eine + + GigE + + Netzwerkverbindung. Für nähere Informationen siehe + + http://gigevision.com + + . + +IP +IP-Adresse + Das Internet Protocol (IP) ist ein Standard für die Übertragung von + Daten zwischen verschiedenen Geräten in einem Computernetzwerk. + Jedes Gerät benötigt eine IP-Adresse, die innerhalb des Netzwerks + nur einmal vergeben werden darf. Die IP-Adresse lässt sich über + + DHCP + + , über + + Link-Local + + oder manuell konfigurieren. + +Link-Local + Link-Local ist eine Technologie, mit der sich ein Netzwerkgerät + selbst eine + + IP-Adresse + + aus dem Adressbereich 169.254.0.0/16 zuweist und überprüft, ob + diese im lokalen Netzwerk eindeutig ist. Link-Local kann verwendet + werden, wenn + + DHCP + + nicht verfügbar ist oder die manuelle IP-Konfiguration nicht + vorgenommen wurde bzw. werden kann. Link-Local ist besonders + nützlich, wenn ein Netzwerkgerät direkt an einen Host-Computer + angeschlossen werden soll. Windows 10 greift automatisch auf Link- + Local zurück, wenn DHCP nicht verfügbar ist (Fallback-Option). + Unter Linux muss Link-Local manuell im Netzwerkmanager aktiviert + werden. + +MAC-Adresse + Bei der MAC-Adresse (Media Access Control Address) handelt es sich + um die eindeutige und feste Adresse eines Netzwerkgerätes. Sie wird + auch als Hardware-Adresse bezeichnet. Im Gegensatz zur + + IP-Adresse + + wird die MAC-Adresse einem Gerät (normalerweise) fest zugewiesen; + sie ändert sich nicht. + +NTP + Das Network Time Protocol (NTP) ist ein TCP/IP Protokoll, um Zeit + über ein Netzwerk zu synchronisieren. Im Wesentlichen fordert ein + Client die aktuelle Zeit von einem Server an und nutzt diese, um + seine eigene Uhr zu stellen. + +SDK + Ein Software Development Kit (SDK) ist eine Sammlung von + Softwareentwicklungswerkzeugen bzw. von Softwaremodulen. + +SGM + SGM steht für Semi-Global Matching, einen hochmodernen Stereo- + Matching-Algorithmus, der sich durch kurze Laufzeiten und eine hohe + Genauigkeit – insbesondere an Objekträndern, bei feinen Strukturen + und in schwach texturierten Bildbereichen – auszeichnet. + +TCP + Der Tool Center Point (TCP) ist die Position des Werkzeugs am + Endeffektor eines Roboters. Die Position und Orientierung des TCP + definiert die Position und Orientierung des Werkzeugs im 3D-Raum. + +URI +URL + Ein Uniform Resource Identifier (URI) ist eine Zeichenfolge, mit + der sich Ressourcen in der REST-API des + + rc_visard NG + + identifizieren lassen. Ein Beispiel für eine solche URI ist die + Zeichenkette "/nodes/rc_camera/parameters/fps", die auf die + "fps"-Laufzeitparameter des Stereokamera-Moduls verweist. + + Ein Uniform Resource Locator (URL) gibt zudem die vollständige + Netzwerkadresse und das Netzwerkprotokoll an. Die oben angeführte + Ressource könnte beispielsweise über + "https:///api/v1/nodes/rc_camera/parameters/fps" lokalisiert + werden, wobei sich "" auf die + + IP-Adresse + + des + + rc_visard NG + + bezieht. + +XYZ+Quaternion + Format zur Darstellung von Posen (Positionen und Orientierungen). + Für eine Definition siehe + + Rotationsmatrix und Translationsvektor + + . + +XYZABC + Format zur Darstellung von Posen (Positionen und Orientierungen). + Für eine Definition siehe + + KUKA XYZ-ABC Format + + . diff --git a/v24.04/de/_sources/gripper_db.rst.txt b/v24.04/de/_sources/gripper_db.rst.txt new file mode 100644 index 0000000..0b20d47 --- /dev/null +++ b/v24.04/de/_sources/gripper_db.rst.txt @@ -0,0 +1,705 @@ +GripperDB + +Einleitung + +Das GripperDB Modul ist ein optionales Modul, welches intern auf dem + +rc_visard NG + + läuft, und ist freigeschaltet, sobald eine gültige Lizenz für eines +der Module + +ItemPick und BoxPick + + oder + +SilhouetteMatch + + vorhanden ist. Andernfalls benötigt dieses Modul eine separate + +Lizenz + +. + +Das Modul bietet Services zum Anlegen, Abfragen und Löschen von +Greifern, die dann für die Kollisionsprüfung mit einem Load Carrier +oder anderen erkannten Objekten (nur in Kombination mit + +SilhouetteMatch + +) genutzt werden können. Die angelegten Greifer sind in allen Modulen +auf dem + +rc_visard NG + + verfügbar, die eine Kollisionsprüfung anbieten. + +Spezifikationen des GripperDB Moduls Max. Anzahl Greifer 50 +Mögliche Greiferelement-Geometrien Box, Zylinder, CAD-Element Max. +Anzahl Elemente pro Greifer 15 Kollisionsprüfung verfügbar in +ItemPick und BoxPick\:(Section \ref{itempick:sect-itempick}), +SilhouetteMatch\:(Section \ref{silhouettematch:sect-silhouettematch}) + +Erstellen eines Greifers + +Der Greifer ist eine Kollisionsgeometrie, die zur Prüfung auf +Kollisionen zwischen dem geplanten Griff und dem Load Carrier +verwendet wird. Der Greifer kann aus bis zu 15 miteinander verbundenen +Elementen bestehen. + +Es sind folgende Arten von Elementen möglich: + + Quader (BOX), mit den Abmessungen box.x, box.y, box.z. + + Zylinder (CYLINDER), mit dem Radius cylinder.radius und der Höhe + cylinder.height. + + CAD-Element (CAD), mit der ID cad.id des gewählten CAD-Elements. + +Weiterhin müssen für jeden Greifer der Flanschradius und der Tool +Center Point (TCP) definiert werden. + +Die Konfiguration des Greifers wird in der Regel während des Setups +der Zielanwendung durchgeführt. Das kann über die + +REST-API-Schnittstelle + + oder die + +rc_visard NG + + +Web GUI + + geschehen. + +Flanschradius + +Es werden standardmäßig nur Kollisionen mit dem Greifer, nicht aber +mit der Robotergeometrie geprüft. Um Kollisionen zwischen dem Load +Carrier und dem Roboter zu vermeiden, kann über den Laufzeitparameter +"check_flange" im CollisionCheck Modul (siehe + +Übersicht der Parameter + +) ein zusätzlicher optionaler Test aktiviert werden. Dieser Test +erkennt alle Griffe als Kollisionen, bei denen sich ein Teil des +Roboterflanschs innerhalb des Load Carriers befinden würde (siehe + +Abb. 55 + +). Der Test basiert auf der Greifergeometrie und dem Flanschradius. + + +Hochladen von CAD-Greiferelementen + +Ein Greifer kann aus Boxen, Zylindern und CAD-Elementen bestehen. +Während Boxen und Zylinder während der Erstellung eines Greifers +parametrisiert werden können, müssen CAD-Elemente im Vorfeld +hochgeladen werden, um für die Greifererstellung verfügbar zu sein. +Ein CAD-Element kann über die + +REST-API-Schnittstelle + + wie in Abschnitt + +CAD-Greiferelement API + + beschrieben, oder über the + +rc_visard NG + + +Web GUI + + hochgeladen werden. Unterstützte Dateiformate sind STEP (*.stp, +*.step), STL (*.stl), OBJ (*.obj) und PLY (*.ply). Die maximal +hochzuladende Dateigröße ist auf 30 MB begrenzt. Die Dateien werden +intern in PLY konvertiert und, falls nötig, vereinfacht. Die CAD- +Elemente können dann während der Greifererstellung über ihre ID +referenziert werden. + +Erstellen eines Greifers über die REST-API oder die Web GUI + +Bei der Greifererstellung über die + +REST-API-Schnittstelle + + oder die + +Web GUI + + hat jedes Greifer-Element ein *Parent*-Element, das die Verbindung +zwischen den Elementen definiert. Der Greifer wird immer vom +Roboterflansch ausgehend in Richtung TCP aufgebaut, und mindestens ein +Element muss den Parent 'flange' (Flansch) haben. Die IDs der Elemente +müssen eindeutig sein und dürfen nicht 'tcp' oder 'flange' sein. Die +Pose des Elements muss im Koordinatensystem des *Parent*-Elements +angegeben werden. Das Koordinatensystem jedes Elements befindet sich +genau in seinem geometrischen Mittelpunkt. Damit ein Element also +genau unterhalb seines *Parent*-Elements platziert wird, muss seine +Position aus der Höhe des *Parent*-Elements und seiner eigenen Höhe +berechnet werden (siehe + +Abb. 56 + +). + + +Im Falle eines CAD-Greiferelements wird der Ursprung durch die CAD- +Daten bestimmt und befindet sich nicht notwendigerweise im Mittelpunkt +der Bounding Box des Elements. + +Es wird empfohlen Greifer über die Web GUI zu erstellen, da diese eine +3D Visualisierung der Greifergeometrie bietet und das automatische +Anheften von Kind-Element an ihre Parent-Elemente ermöglicht, indem +die entsprechende Option für dieses Element aktiviert wird. In diesem +Fall bleiben Elemente an ihren Parent angeheftet, auch wenn sich ihre +Größen ändern. Bei CAD-Greiferelementen wird die Bounding Box des +Elements als Referenz verwendet. Das automatische Anheften ist nur +möglich, wenn das Kind-Element in Bezug auf seinen Parent nicht um die +x- oder y-Achse rotiert ist. + +Das Bezugskoordinatensystem für das erste Element liegt immer im +Mittelpunkt des Roboterflanschs, wobei die z-Achse nach unten +gerichtet ist. Es können Greifer mit einer Baumstruktur erstellt +werden, bei denen mehrere Elemente dasselbe *Parent*-Element haben, +solange alle Elemente miteinander verbunden sind. + +Berechnete TCP-Position + +Nach dem Erstellen des Greifers mit dem Service "set_gripper" wird die +TCP-Position im Flanschkoordinatensystem berechnet und als +"tcp_pose_flange" zurückgegeben. Dieser Wert muss mit den +tatsächlichen TCP-Koordinaten des Roboters übereinstimmen. Wenn ein +Greifer über die Web GUI erstellt wird, wird die aktuelle TCP-Position +zu jeder Zeit in der 3D-Visualisierung angezeigt. + +Nicht-rotationssymmetrische Greifer erstellen + +Bei Greifern, die nicht rotationssymmetrisch um die z-Achse sind, muss +sichergestellt werden, dass der Greifer so montiert wird, dass seine +Ausrichtung mit der im GripperDB-Modul gespeicherten Darstellung +übereinstimmt. + +Services + +Das GripperDB Modul wird in der REST-API als "rc_gripper_db" +bezeichnet und in der + +Web GUI + + unter Datenbank ‣ Greifer dargestellt. Die angebotenen Services des +GripperDB Moduls können mithilfe der + +REST-API-Schnittstelle + + oder der Web GUI ausprobiert und getestet werden. + +Das GripperDB Modul stellt folgende Services zur Verfügung. + +set_gripper + + konfiguriert und speichert einen Greifer auf dem + + rc_visard NG + + . Alle Greifer sind dauerhaft gespeichert, auch über Firmware- + Updates und -Wiederherstellungen hinweg. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + PUT http:///api/v2/nodes/rc_gripper_db/services/set_gripper + + Request + + Obligatorische Serviceargumente: + + "elements": Liste von geometrischen Elementen, aus denen der + Greifer besteht. Jedes Element muss den "type" 'CYLINDER' oder + 'BOX' mit den zugehörigen Dimensionen im Feld "cylinder" bzw. + "box", oder den Typ 'CAD' haben, wobei die entsprechende ID + unter "id" im Feld "cad" angegeben werden muss. Die Pose jedes + Elements muss im *Parent*-Koordinatensystem angegeben werden + (siehe + + Erstellen eines Greifers + + ). Die "id" des Elements muss eindeutig sein und darf nicht + 'tcp' oder 'flange' sein. Die "parent_id" ist die ID des + *Parent*-Elements, welche entweder 'flange' ist oder der ID + eines anderen Elements entsprechen muss. + + "flange_radius": Flanschradius der benutzt wird, falls der + Parameter "check_flange" aktiviert ist. + + "id": Eindeutiger Name des Greifers. + + "tcp_parent_id": ID des Elements, auf dem der TCP definiert ist. + + "tcp_pose_parent": Die Pose des TCP im Koordinatensystem des + Elements, das in "tcp_parent_id" angegeben ist. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "elements": [ + { + "box": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "cad": { + "id": "string" + }, + "cylinder": { + "height": "float64", + "radius": "float64" + }, + "id": "string", + "parent_id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "type": "string" + } + ], + "flange_radius": "float64", + "id": "string", + "tcp_parent_id": "string", + "tcp_pose_parent": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + } + } + } + + Response + + "gripper": Gibt den Greifer mit dem zusätzlichen Feld + "tcp_pose_flange" zurück. Dieses Feld gibt die TCP-Koordinaten im + Flanschkoordinatensystem an, um diese mit den Roboter-TCP- + Koordinaten vergleichen zu können. + + "return_code": enthält mögliche Warnungen oder Fehlercodes und + Nachrichten. + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "set_gripper", + "response": { + "gripper": { + "elements": [ + { + "box": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "cad": { + "id": "string" + }, + "cylinder": { + "height": "float64", + "radius": "float64" + }, + "id": "string", + "parent_id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "type": "string" + } + ], + "flange_radius": "float64", + "id": "string", + "tcp_parent_id": "string", + "tcp_pose_flange": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "tcp_pose_parent": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "type": "string" + }, + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +get_grippers + + gibt die mit "gripper_ids" spezifizierten und gespeicherten Greifer + zurück. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + PUT http:///api/v2/nodes/rc_gripper_db/services/get_grippers + + Request + + Wenn keine "gripper_ids" angegeben werden, enthält die + Serviceantwort alle gespeicherten Greifer. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "gripper_ids": [ + "string" + ] + } + } + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "get_grippers", + "response": { + "grippers": [ + { + "elements": [ + { + "box": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "cad": { + "id": "string" + }, + "cylinder": { + "height": "float64", + "radius": "float64" + }, + "id": "string", + "parent_id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "type": "string" + } + ], + "flange_radius": "float64", + "id": "string", + "tcp_parent_id": "string", + "tcp_pose_flange": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "tcp_pose_parent": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "type": "string" + } + ], + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +delete_grippers + + löscht die mit "gripper_ids" spezifizierten, gespeicherten Greifer. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + PUT http:///api/v2/nodes/rc_gripper_db/services/delete_grippers + + Request + + Alle zu löschenden Greifer müssen explizit angegeben werden. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "gripper_ids": [ + "string" + ] + } + } + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "delete_grippers", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +Rückgabecodes + +Zusätzlich zur eigentlichen Serviceantwort gibt jeder Service einen +sogenannten "return_code" bestehend aus einem Integer-Wert und einer +optionalen Textnachricht zurück. Erfolgreiche Service-Anfragen werden +mit einem Wert von "0" quittiert. Positive Werte bedeuten, dass die +Service-Anfrage zwar erfolgreich bearbeitet wurde, aber zusätzliche +Informationen zur Verfügung stehen. Negative Werte bedeuten, dass +Fehler aufgetreten sind. Für den Fall, dass mehrere Rückgabewerte +zutreffend wären, wird der kleinste zurückgegeben, und die +entsprechenden Textnachrichten werden in "return_code.message" +akkumuliert. + +Die folgende Tabelle listet die möglichen Rückgabecodes auf: + +Rückgabecodes der GripperDB Services Code Beschreibung 0 +Erfolgreich -1 Ein ungültiges Argument wurde übergeben. -7 Daten +konnten nicht in den persistenten Speicher geschrieben oder vom +persistenten Speicher gelesen werden. -9 Lizenz für CollisionCheck +ist nicht verfügbar. -10 Das neue Element konnte nicht hinzugefügt +werden, da die maximal speicherbare Anzahl an Greifern überschritten +wurde. 10 Die maximal speicherbare Anzahl an Greifern wurde +erreicht. 11 Bestehender Greifer wurde überschrieben. + +CAD-Greiferelement API + +Für den Upload, Download, das Auflisten und Löschen von CAD- +Greiferelementen werden spezielle REST-API-Endpunkte zur Verfügung +gestellt. CAD-Greiferelemente können auch über die Web GUI hoch- und +runtergeladen werden. Bis zu 50 CAD-Greiferelemente können +gleichzeitig auf dem + +rc_visard NG + + gespeichert werden. + +Die maximal hochzuladende Dateigröße ist auf MB begrenzt. + +GET /cad/gripper_elements + + listet alle CAD-Greiferelemente auf. + + Musteranfrage + + GET /api/v2/cad/gripper_elements HTTP/1.1 + + Musterantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + [ + { + "id": "string" + } + ] + + Antwort-Header: + Content-Type -- application/json application/ubjson + + Statuswerte: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabewert: Array von + GripperElement) + + 404 Not Found -- Element nicht gefunden + + Referenzierte Datenmodelle: + GripperElement\:(Abschnitt \ref{rest_api_datamodel:sect-rest- + datamodel-gripperelement}) + +GET /cad/gripper_elements/{id} + + ruft ein CAD-Greiferelement ab. Falls der angefragte Content-Typ + application/octet-stream ist, wird das Element als Datei + zurückgegeben. + + Musteranfrage + + GET /api/v2/cad/gripper_elements/ HTTP/1.1 + + Musterantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "id": "string" + } + + Parameter: + id (string) -- ID des Elements (obligatorisch) + + Antwort-Header: + Content-Type -- application/json application/ubjson application + /octet-stream + + Statuswerte: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabewert: + GripperElement) + + 404 Not Found -- Element nicht gefunden + + Referenzierte Datenmodelle: + GripperElement\:(Abschnitt \ref{rest_api_datamodel:sect-rest- + datamodel-gripperelement}) + +PUT /cad/gripper_elements/{id} + + erstellt oder aktualisiert ein CAD-Greiferelement. + + Musteranfrage + + PUT /api/v2/cad/gripper_elements/ HTTP/1.1 + Accept: multipart/form-data application/json + + Musterantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "id": "string" + } + + Parameter: + id (string) -- ID des Elements (obligatorisch) + + Formularparameter: + file -- CAD-Datei (obligatorisch) + + Anfrage-Header: + Accept -- multipart/form-data application/json + + Antwort-Header: + Content-Type -- application/json application/ubjson + + Statuswerte: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabewert: + GripperElement) + + 400 Bad Request -- CAD ist ungültig oder die maximale Zahl an + Elementen wurde erreicht. + + 404 Not Found -- Element nicht gefunden + + 413 Request Entity Too Large -- Datei zu groß + + Referenzierte Datenmodelle: + GripperElement\:(Abschnitt \ref{rest_api_datamodel:sect-rest- + datamodel-gripperelement}) + +DELETE /cad/gripper_elements/{id} + + entfernt ein CAD-Greiferelement. + + Musteranfrage + + DELETE /api/v2/cad/gripper_elements/ HTTP/1.1 + Accept: application/json application/ubjson + + Parameter: + id (string) -- ID des Elements (obligatorisch) + + Anfrage-Header: + Accept -- application/json application/ubjson + + Antwort-Header: + Content-Type -- application/json application/ubjson + + Statuswerte: + 200 OK -- Erfolgreiche Verarbeitung + + 404 Not Found -- Element nicht gefunden diff --git a/v24.04/de/_sources/grpc.rst.txt b/v24.04/de/_sources/grpc.rst.txt new file mode 100644 index 0000000..488ada0 --- /dev/null +++ b/v24.04/de/_sources/grpc.rst.txt @@ -0,0 +1,201 @@ +gRPC Bilddatenschnittstelle + +Die gRPC Bilddatenschnittstelle ist eine Alternative zur + +GigE Vision / GenICam Schnittstelle + + zum Streamen von Kamerabildern und synchronisierten Bilddaten (z.B. +linkes Kamerabild und das dazugehörige Disparitätsbild). + +gRPC + + ist ein System zur Interprozesskommunikation über Rechnergrenzen +hinweg, welches auch das Streamen von Daten unterstützt. Es benutzt + +Protocol Buffers + + (siehe + +https://developers.google.com/protocol-buffers/ + +) als Beschreibungssprache und zur Datenserialisierung. Eine +Einführung und mehr Details zu gRPC sind auf der offiziellen Webseite +verfügbar ( + +https://grpc.io/ + +). + +Die Vorteile der gRPC Schnittstelle gegenüber GigE Vision sind: + + Es ist in eigenen Programmen einfacher zu benutzen als GigE Vision. + + Es gibt gRPC Unterstützung für sehr viele Programmiersprachen + (siehe https://grpc.io/). + + Die Kommunikation basiert auf TCP statt auf UDP und funktioniert + deshalb besser über weniger stabile Netzwerke wie z.B. WLAN. + +Die Nachteile der gRPC Schnittstelle im Vergleich zu GigE Vision sind: + + Es unterstützt nicht das Ändern von Parametern. Allerdings können + alle Parameter über die REST-API-Schnittstelle\:(Abschnitt + \ref{rest_api:sect-rest-api}) geändert werden. + + Es ist keine Standard-Bildverarbeitungsschnittstelle wie z.B. GigE + Vision. + +Der + +rc_visard NG + + bietet synchronisierte Bilddaten über gRPC Serverstreams auf Port +50051 an. + +Die Kommunikation wird gestartet indem eine "ImageSetRequest" +Nachricht an den Server geschickt wird. Die Nachricht enthält die +Information über angeforderte Bilder, d.h. linkes, rechtes, +Disparitäts-, Konfidenz- oder Fehlerbild, die separat an- und +abgeschaltet werden können. + +Nach dem Empfangen der Anfrage sendet der Server kontinuierlich +"ImageSet" Nachrichten, welche alle angeforderten Bilder mit allen +Parametern enthalten, die notwendig sind, um die Bilder zu +interpretieren. Die Bilder in einer "ImageSet" Nachricht sind +synchronisiert, d.h. sie sind alle zum selben Zeitpunkt aufgenommen. +Die einzige Ausnahme von dieser Regel besteht, wenn der + +out1_mode + + auf "AlternateExposureActive" gesetzt ist. In diesem Fall werden die +Kamera- und Disparitätsbilder um 40 ms versetzt aufgenommen, sodass +GPIO Out1 auf + +aus + + (LOW) steht, wenn das linke und rechte Bild aufgenommen werden, und +auf + +an + + (HIGH) für das Disparitäts-, Konfidenz- und Fehlerbild. Dies ist +sinnvoll, wenn ein Musterprojektor genutzt wird, da der Projektor dann +bei der Aufnahme des linken und rechten Bildes aus ist und für das +Disparitätsbild an, wodurch die Kamerabilder ungestört sind, aber das +Disparitätsbild deutlich dichter und genauer wird. + +Das Streamen von Bildern wird beendet, sobald der Client die +Verbindung schließt. + +gRPC Servicedefinition + + syntax = "proto3"; + + message Time + { + int32 sec = 1; ///< Seconds + int32 nsec = 2; ///< Nanoseconds + } + + message Gpios + { + uint32 inputs = 1; ///< bitmask of available inputs + uint32 outputs = 2; ///< bitmask of available outputs + uint32 values = 3; ///< bitmask of GPIO values + } + + message Image + { + Time timestamp = 1; ///< Acquisition timestamp of the image + uint32 height = 2; ///< image height (number of rows) + uint32 width = 3; ///< image width (number of columns) + float focal_length = 4; ///< focal length in pixels + float principal_point_u = 5; ///< horizontal position of the principal point + float principal_point_v = 6; ///< vertical position of the principal point + string encoding = 7; ///< Encoding of pixels ["mono8", "mono16", "rgb8"] + bool is_bigendian = 8; ///< is data bigendian, (in our case false) + uint32 step = 9; ///< full row length in bytes + bytes data = 10; ///< actual matrix data, size is (step * height) + Gpios gpios = 11; ///< GPIOs as of acquisition timestamp + float exposure_time = 12; ///< exposure time in seconds + float gain = 13; ///< gain factor in decibel + float noise = 14; ///< noise + float out1_reduction = 16; ///< Fraction of reduction (0.0 - 1.0) of exposure time for images with GPIO Out1=Low in exp_auto_mode=AdaptiveOut1 + float brightness = 17; ///< Current brightness of the image as value between 0 and 1 + } + + message DisparityImage + { + Time timestamp = 1; ///< Acquisition timestamp of the image + float scale = 2; ///< scale factor + float offset = 3; ///< offset in pixels (in our case 0) + float invalid_data_value = 4; ///< value used to mark pixels as invalid (in our case 0) + float baseline = 5; ///< baseline in meters + float delta_d = 6; ///< Smallest allowed disparity increment. The smallest achievable depth range resolution is delta_Z = (Z^2/image.focal_length*baseline)*delta_d. + Image image = 7; ///< disparity image + } + + message Mesh + { + Time timestamp = 1; ///< Acquisition timestamp of disparity image from which the mesh is computed + string format = 2; ///< currently only "ply" is supported + bytes data = 3; ///< actual mesh data + } + + message ImageSet + { + Time timestamp = 1; + Image left = 2; + Image right = 3; + DisparityImage disparity = 4; + Image disparity_error = 5; + Image confidence = 6; + Mesh mesh = 7; + } + + message MeshOptions + { + uint32 max_points = 1; ///< limit maximum number of points, zero means default (up to 3.1MP), minimum is 1000 + enum BinningMethod { + AVERAGE = 0; ///< average over all points in bin + MIN_DEPTH = 1; ///< use point with minimum depth (i.e. closest to camera) in bin + } + BinningMethod binning_method = 2; ///< method used for binning if limited by max_points + bool watertight = 3; ///< connect all edges and fill all holes, e.g. for collision checking + bool textured = 4; ///< add texture information to mesh + } + + message ImageSetRequest + { + bool left_enabled = 1; + bool right_enabled = 2; + bool disparity_enabled = 3; + bool disparity_error_enabled = 4; + bool confidence_enabled = 5; + bool mesh_enabled = 6; + MeshOptions mesh_options = 7; + bool color = 8; ///< send left/right image as color (rgb8) images + } + + service ImageInterface + { + // A server-to-client streaming RPC. + rpc StreamImageSets(ImageSetRequest) returns (stream ImageSet) {} + } + +Umwandlung von Bild-Streams + +Zur Umwandlung von Disparitätsbildern in Punktwolken dient die +Beschreibung im Kapitel + +GigE Vision / GenICam Schnittstelle + +. + +Beispielclient + +Ein einfacher C++ Client kann von + +https://github.com/roboception/grpc_image_client_example + + heruntergeladen werden. diff --git a/v24.04/de/_sources/handeye_calibration.rst.txt b/v24.04/de/_sources/handeye_calibration.rst.txt new file mode 100644 index 0000000..f4510b1 --- /dev/null +++ b/v24.04/de/_sources/handeye_calibration.rst.txt @@ -0,0 +1,1221 @@ +Hand-Auge-Kalibrierung + +Für Anwendungen, bei denen die Kamera in eines oder mehrere +Robotersysteme integriert wird, muss sie zum jeweiligen Roboter- +Koordinatensystem kalibriert werden. Zu diesem Zweck wird der + +rc_visard NG + + mit einer internen Kalibrierroutine, dem Modul zur + +Hand-Auge-Kalibrierung + +, ausgeliefert. Dieses Modul ist ein Basismodul, welches auf jedem + +rc_visard NG + + verfügbar ist. + +Bemerkung: Für die Hand-Auge-Kalibrierung ist es völlig unerheblich, + in Bezug auf welches benutzerdefinierte Roboter-Koordinatensystem + die Kamera kalibriert wird. Hierbei kann es sich um einen + Endeffektor des Roboters (z.B. Flansch oder Tool Center Point + (Werkzeugmittelpunkt)) oder um einen beliebigen anderen Punkt in der + Roboterstruktur handeln. Einzige Voraussetzung für die Hand-Auge- + Kalibrierung ist, dass die Pose (d.h. Positions- und Rotationswerte) + dieses Roboter- Koordinatensystems in Bezug auf ein + benutzerdefiniertes externes Koordinatensystem (z.B. Welt oder + Roboter-Montagepunkt) direkt von der Robotersteuerung erfasst und an + das Kalibriermodul übertragen werden kann. + +Die + +Kalibrierroutine + + ist ein benutzerfreundliches mehrstufiges Verfahren, für das mit +einem Kalibriermuster gearbeitet wird. Entsprechende Kalibriermuster +können von Roboception bezogen werden. + +Kalibrierschnittstellen + +Für die Durchführung der Hand-Auge-Kalibrierung stehen die folgenden +beiden Schnittstellen zur Verfügung: + +Alle Services und Parameter dieses Moduls, die für eine +programmgesteuerte Durchführung der Hand-Auge-Kalibrierung benötigt +werden, sind in der REST-API-Schnittstelle\:(Abschnitt \ref{rest_api +:sect-rest-api}) des rc_visard NG enthalten. Der REST-API-Name dieses +Moduls lautet rc_hand_eye_calibration und seine Services werden in +Services\:(Abschnitt \ref{handeye_calibration:sect-handeye- +calibration-services}) erläutert. Für den beschriebenen Ansatz wird +eine Netzwerkverbindung zwischen dem rc_visard NG und der +Robotersteuerung benötigt, damit die Steuerung die Roboterposen an das +Kalibriermodul des rc_visard NG übertragen kann. + +Für Anwendungsfälle, bei denen sich die Roboterposen nicht +programmgesteuert an das Modul zur Hand-Auge-Kalibrierung des +rc_visard NG übertragen lassen, sieht die Seite Hand-Auge-Kalibrierung +unter dem Menüpunkt Konfiguration der Web GUI \:(Abschnitt +\ref{webgui:sect-web-gui}) einen geführten Prozess vor, mit dem sich +die Kalibrierroutine manuell durchführen lässt. Während der +Kalibrierung muss der Benutzer die Roboterposen, auf die über das +jeweilige Teach-in- oder Handheld-Gerät zugegriffen werden muss, +manuell in die Web GUI eingeben. + +Kameramontage + +Wie in + +Abb. 30 + + und + +Abb. 32 + + dargestellt, ist für die Montage der Kamera zwischen zwei +unterschiedlichen Anwendungsfällen zu unterscheiden: + +Die Kamera wird am Roboter montiert, d.h. sie ist mechanisch mit einem +Roboterpunkt (d.h. Flansch oder flanschmontiertes Werkzeug) verbunden +und bewegt sich demnach mit dem Roboter. + +Die Kamera ist nicht am Roboter montiert, sondern an einem Tisch oder +anderen Ort in der Nähe des Roboters befestigt und verbleibt daher +verglichen mit dem Roboter in einer statischen Position. + +Die allgemeine + +Kalibrierroutine + + ist in beiden Anwendungsfällen sehr ähnlich. Sie unterscheidet sich +jedoch hinsichtlich der semantischen Auslegung der Ausgabedaten, d.h. +der erhaltenen Kalibriertransformation, und hinsichtlich der +Befestigung des Kalibriermusters. + +Kalibrierung einer robotergeführten Kamera + Soll eine robotergeführte Kamera zum Roboter kalibriert werden, so + muss das Kalibriermuster in einer statischen Position zum Roboter, + z.B. auf einem Tisch oder festen Sockel, befestigt werden (siehe + + Abb. 30 + + ). + + Warnung: Es ist äußerst wichtig, dass sich das Kalibriermuster in + Schritt 2 der + + Kalibrierroutine + + nicht bewegt. Daher wird dringend empfohlen, das Muster in + seiner Position sicher zu fixieren, um unbeabsichtigte + Bewegungen, wie sie durch Vibrationen, Kabelbewegungen oder + Ähnliches ausgelöst werden, zu verhindern. + + Das Ergebnis der Kalibrierung (Schritt 3 der + + Kalibrierroutine + + ) ist eine Pose \mathbf{T}^{\text{robot}}_{\text{camera}}, die die + (zuvor unbekannte) relative Transformation zwischen dem + + Kamera + + -Koordinatensystem und dem benutzerdefinierten + + Roboter + + -Koordinatensystem beschreibt, sodass Folgendes gilt: + + \mathbf{p}_{\text{robot}} = + \mathbf{R}^{\text{robot}}_{\text{camera}} \cdot + \mathbf{p}_{\text{camera}} + + \mathbf{t}^{\text{robot}}_{\text{camera}} \:, + + wobei \mathbf{p}_{\text{robot}} = (x,y,z)^T ein 3D-Punkt ist, + dessen Koordinaten im + + Roboter + + -Koordinatensystem angegeben werden, \mathbf{p}_{\text{camera}} + denselben Punkt im + + Kamera + + -Koordinatensystem darstellt, und + \mathbf{R}^{\text{robot}}_{\text{camera}} sowie + \mathbf{t}^{\text{robot}}_{\text{camera}} die 3\times 3 Drehmatrix + und den 3\times 1 Translationsvektor für eine Pose + \mathbf{T}^{\text{robot}}_{\text{camera}} angeben. In der Praxis + wird die Rotation für das Kalibrierergebnis und die Roboterposen + als Eulerwinkel oder Quaternion anstatt einer Rotationsmatrix + definiert (siehe + + Formate für Posendaten + + ). + + + Zusätzliche Benutzereingaben werden benötigt, falls die Bewegung + des Roboters so beschränkt ist, dass der Tool Center Point (TCP) + nur um eine Achse rotieren kann. Das ist üblicherweise für Roboter + mit vier Freiheitsgraden (4DOF) der Fall, welche häufig zur + Palettierung eingesetzt werden. In diesem Fall muss der Benutzer + angeben, welche Achse des Roboterkoordinatensystems der + Rotationsachse des TCP entspricht. Außerdem muss der + vorzeichenbehaftete Offset vom TCP zum Kamerakoordinatensystem + entlang der TCP-Rotationsachse angegeben werden. + + Abb. 31 + + zeigt die Situation. + + Für den + + rc_visard NG + + befindet sich der Ursprung des Kamerakoordinatensystems im + optischen Zentrum der linken Kamera. Die ungefähre Position wird im + Abschnitt + + Koordinatensysteme + + angegeben. + + +Kalibrierung einer statisch montierten Kamera + In Anwendungsfällen, bei denen die Kamera statisch verglichen zum + Roboter montiert wird, muss das Kalibriermuster, wie im Beispiel in + + Abb. 32 + + und + + Abb. 33 + + angegeben, angebracht werden. + + Bemerkung: Für das Modul zur Hand-Auge-Kalibrierung spielt es + keine Rolle, wie das Kalibriermuster in Bezug auf das + benutzerdefinierte + + Roboter + + -Koordinatensystem genau angebracht und positioniert wird. Das + bedeutet, dass die relative Positionierung des Kalibriermusters + zu diesem Koordinatensystem weder bekannt sein muss, noch für die + Kalibrierroutine relevant ist (siehe in + + Abb. 33 + + ). + + Warnung: Es ist äußerst wichtig, das Kalibriermuster sicher am + Roboter anzubringen, damit sich seine relative Position in Bezug + auf das in Schritt 2 der + + Kalibrierroutine + + vom Benutzer definierte + + Roboter + + -Koordinatensystem nicht verändert. + + In diesem Anwendungsfall ist das Ergebnis der Kalibrierung (Schritt + 3 der + + Kalibrierroutine + + ) die Pose \mathbf{T}^{\text{ext}}_{\text{camera}}, die die (zuvor + unbekannte) relative Transformation zwischen dem + + Kamera + + -Koordinatensystem und dem benutzerdefinierten + + Roboter + + -Koordinatensystem beschreibt, sodass Folgendes gilt: + + \mathbf{p}_{\text{ext}} = + \mathbf{R}^{\text{ext}}_{\text{camera}} \cdot + \mathbf{p}_{\text{camera}} + + \mathbf{t}^{\text{ext}}_{\text{camera}} \:, + + wobei \mathbf{p}_{\text{ext}} = (x,y,z)^T ein 3D-Punkt im externen + Referenzkoordinatensystem + + ext + + , \mathbf{p}_{\text{camera}} derselbe Punkt im + Kamerakoordinatensystem + + camera + + und \mathbf{R}^{\text{ext}}_{\text{camera}} sowie + \mathbf{t}^{\text{ext}}_{\text{camera}} die 3\times 3 + Rotationsmatrix und 3\times 1 Translationsvektor der Pose + \mathbf{T}^{\text{ext}}_{\text{camera}} sind. In der Praxis wird + die Rotation für das Kalibrierergebnis und die Roboterposen als + Eulerwinkel oder Quaternion anstatt einer Rotationsmatrix definiert + (siehe + + Formate für Posendaten + + ). + + + Zusätzliche Benutzereingaben werden benötigt, falls die Bewegung + des Roboters so beschränkt ist, dass der Tool Center Point (TCP) + nur um eine Achse rotieren kann. Das ist üblicherweise für Roboter + mit vier Freiheitsgraden (4DOF) der Fall, welche häufig zur + Palettierung eingesetzt werden. In diesem Fall muss der Benutzer + angeben, welche Achse des Roboterkoordinatensystems der + Rotationsachse des TCP entspricht. Außerdem muss der + vorzeichenbehaftete Offset vom TCP zur sichtbaren Oberfläche des + Kalibriermusters entlang der TCP-Rotationsachse angegeben werden. + Das Kalibriermuster muss so angebracht werden, dass die TCP- + Rotationsachse orthogonal zum Kalibriermuster verläuft. + + Abb. 34 + + zeigt die Situation. + + +Kalibrierroutine + +Die Hand-Auge-Kalibrierung kann manuell über die + +Web GUI + + oder programmgesteuert über die + +REST-API-Schnittstelle + + durchgeführt werden. Die allgemeine Vorgehensweise wird beschrieben +anhand der Schritte in der Web GUI unter Konfiguration ‣ Hand-Auge- +Kalibrierung. Verweise auf die zugehörigen REST-API Aufrufe werden an +den entsprechenden Stellen bereitgestellt. + +Schritt 1: Hand-Auge-Kalibrierstatus + +Die Startseite des Assistenten für die Hand-Auge-Kalibrierung zeigt +den aktuellen Status der Hand-Auge-Kalibrierung. Wenn eine Hand-Auge- +Kalibrierung auf dem + +rc_visard NG + + gespeichert ist, wird die Kalibriertransformation hier angezeigt +(siehe + +Abb. 35 + +). + + +Um den Status der Hand-Auge-Kalibrierung programmgesteuert abzufragen +bietet die REST-API den Service "get_calibration" (siehe + +Services + +). Eine vorhandene Hand-Auge-Kalibrierung kann über Kalibrierung +entfernen oder den REST-API Service "remove_calibration" (siehe + +Services + +) gelöscht werden. + +Durch Klick auf Kalibrierung durchführen wird eine neue Hand-Auge- +Kalibrierung gestartet. + +Schritt 2: Testen der Mustererkennung + +Um gute Kalibrierergebnisse zu erzielen müssen die Bilder gut +belichtet sein, damit das Kalibriermuster genau und verlässlich +erkannt werden kann. In diesem Schritt kann die Erkennung des +Kalibriermusters getestet werden und die Kameraeinstellungen können +angepasst werden, falls nötig. Falls Teile des Kalibriermusters +überbelichtet sind, werden die zugehörigen Quadrate rot hervorgehoben. +Die erfolgreiche Erkennung des Kalibriermusters wird durch grüne +Häkchen auf jedem Quadrat und einen dicken grünen Rahmen um das +Kalibriermuster visualisiert, wie in + +Abb. 36 + + dargestellt ist. + + +Schritt 3: Posen aufnehmen + +In diesem Schritt werden Bilder des Kalibriermusters an verschiedenen +Roboterposen aufgenommen. Dabei ist sicherzustellen, dass das +Kalibriermuster bei allen Posen im linken Kamerabild vollständig +sichtbar ist. Zudem müssen die Roboterpositionen sorgsam ausgewählt +werden, damit das Kalibriermuster aus unterschiedlichen Perspektiven +aufgenommen wird. + +Abb. 37 + + zeigt eine schematische Darstellung der empfohlenen acht Ansichten. + + +Warnung: Die Kalibrierqualität, d.h. die Genauigkeit des berechneten + Kalibrierergebnisses, hängt von den Ansichten des Kalibriermusters + ab. Je vielfältiger die Perspektiven sind, desto besser gelingt die + Kalibrierung. Werden sehr ähnliche Ansichten ausgewählt, d.h. wird + die Pose des Roboters vor der Aufnahme einer neuen Kalibrierpose nur + leicht variiert, kann dies zu einer ungenauen Schätzung der + gewünschten Kalibriertransformation führen. + +Nachdem der Roboter die jeweilige Kalibrierposition erreicht hat, muss +die entsprechende Pose \mathbf{T}^{\text{ext}}_{\text{robot}} des +benutzerdefinierten + +Roboter + +-Koordinatensystems im benutzerdefinierten externen +Referenzkoordinatensystem + +ext + + an das Modul zur Hand-Auge-Kalibrierung übertragen werden. Hierfür +bietet das Softwaremodul verschiedene + +Slots + +, in denen die gemeldeten Posen mit den zugehörigen Bildern der linken +Kamera hinterlegt werden können. Alle gefüllten Slots werden dann +verwendet, um die gewünschte Kalibriertransformation zwischen dem + +Kamera + +-Koordinatensystem und dem benutzerdefinierten + +Roboter + +-Koordinatensystem (bei robotergeführten Kameras) bzw. dem +benutzerdefinierten externen Referenzkoordinatensystem + +ext + + (bei statisch montierten Kameras) zu berechnen. + +In der Web GUI kann der Nutzer zwischen vielen verschiedenen Formaten +für die Kalibrierposen wählen (siehe + +Formate für Posendaten + +). Wird die Kalibrierung über die REST-API vorgenommen, dann werden +die Kalibrierdaten immer im Format + +XYZ+Quaternion + + angegeben. Die Web GUI bietet acht Slots ( + +Nahaufnahme 1 + +, + +Nahaufnahme 2 + +, usw.), in die der Benutzer die Posen manuell eintragen kann. Neben +jedem Slot wird eine Empfehlung für die Ansicht des Kalibriermusters +angezeigt. Der Roboter sollte für jeden Slot so bewegt werden, dass +die empfohlene Ansicht erreicht wird. + + +Nach Klick auf Pose setzen kann die Pose des benutzerdefinierten + +Roboter + +-Koordinatensystems manuell in die entsprechenden Textfelder +eingegeben werden. Durch Bild aufnehmen werden die Pose und das +aktuelle Kamerabild im jeweiligen Slot gespeichert. + +Um diese Posen programmgesteuert zu übertragen, bietet die REST-API +den Service "set_pose" (siehe + +Services + +). + +Bemerkung: Der Zugriff auf die Posendaten des Roboters hängt vom + Modell des Roboters und seinem Hersteller ab. Möglicherweise lassen + sie sich über ein im Lieferumfang des Roboters enthaltenes Teach-in- + oder Handheld-Gerät ablesen. + +Warnung: Es ist wichtig darauf zu achten, dass genaue und korrekte + Werte eingegeben werden. Selbst kleinste Ungenauigkeiten oder + Tippfehler können dazu führen, dass die Kalibrierung fehlschlägt. + +Die Web GUI zeigt die aktuell gespeicherten Kalibrierposen (nur mit +den Slot-Nummern 0-7) und die zugehörigen Kamerabilder an und +ermöglicht auch das Löschen von einzelnen Posen über Pose löschen, +oder das Löschen aller gesetzten Posen über Alle Posen löschen. In der +REST-API können die aktuell gespeicherten Kalibrierposen über +"get_poses" abgefragt und über "delete_poses" oder "reset_calibration" +einzeln bzw. komplett gelöscht werden (siehe + +Services + +). + +Wenn mindestens vier Posen gesetzt wurden, gelangt man über die +Schaltfläche Weiter zur Berechnung des Kalibrierergebnisses. + +Bemerkung: Um die Transformation für die Hand-Auge-Kalibrierung + erfolgreich zu berechnen, müssen mindestens vier verschiedene + Roboter- Kalibrierposen übertragen und in Slots hinterlegt werden. + Um Kalibrierfehler zu verhindern, die durch ungenaue Messungen + entstehen können, sind mindestens + + acht Kalibrierposen empfohlen + + . + +Schritt 4: Kalibrierung berechnen + +Bevor das Kalibrierergebnis berechnet werden kann, muss der Nutzer die +korrekten Kalibrierparameter angeben. Diese beinhalten die exakten +Abmessungen des Kalibriermusters und die Art der Sensormontage. +Weiterhin kann die Kalibrierung von 4DOF-Robotern eingestellt werden. +In diesem Fall müssen die Rotationsachse, sowie der Offset vom TCP zum +Kamerakoordinatensystem (für Kameras am Roboter) oder zur Oberfläche +des Kalibriermusters (für statische Kameras) angegeben werden. Für die +REST-API sind die entsprechenden + +Parameter + + aufgelistet. + + +Wenn die Parameter korrekt sind, kann durch Kalibrierung berechnen die +gewünschte Kalibriertransformation aus den aufgenommenen +Kalibrierposen und den zugehörigen Kamerabildern berechnet werden. Die +REST-API bietet diese Funktion über den Service "calibrate" (siehe + +Services + +). + +Je nachdem, wie die Kamera montiert ist, wird dabei die Transformation +(d.h. die Pose) zwischen dem + +Kamera + +-Koordinatensystem und entweder dem benutzerdefinierten + +Roboter + +-Koordinatensystem (bei robotergeführten Kameras) oder dem +benutzerdefinierten externen Referenzkoordinatensystem + +ext + + (bei statisch montierten Kameras) berechnet und ausgegeben (siehe + +Kameramontage + +). + +Damit der Benutzer die Qualität der resultierenden +Kalibriertransformation beurteilen kann, werden die translatorischen +und rotatorischen Kalibrierfehler ausgegeben. Diese Werte werden aus +der Varianz des Kalibrierergebnisses berechnet. + +Wenn der Kalibrierfehler nicht akzeptabel ist, können die +Kalibrierparameter geändert und das Ergebnis neu berechnet werden. +Außerdem ist es möglich, zu Schritt 3 zurückzukehren, um mehr Posen +aufzunehmen oder die vorhandenen Posen zu aktualisieren. + +Durch Klicken auf Kalibrierung speichern oder über den REST-API +Service "save_calibration" (siehe + +Services + +) wird das Kalibrierergebnis gespeichert. + +Parameter + +Das Modul zur Hand-Auge-Kalibrierung wird in der REST-API als +"rc_hand_eye_calibration" bezeichnet und in der + +Web GUI + + unter Konfiguration ‣ Hand-Auge Kalibrierung dargestellt. Der +Benutzer kann die Kalibrierparameter entweder dort oder über die + +REST-API-Schnittstelle + + ändern. + +Übersicht über die Parameter + +Dieses Softwaremodul bietet folgende Laufzeitparameter: + +Laufzeitparameter des rc_hand_eye_calibration-Moduls Name +Typ Min. Max. Default Beschreibung grid_height float64 0.0 +10.0 0.0 Höhe des Kalibriermusters in Metern grid_width float64 +0.0 10.0 0.0 Breite des Kalibriermusters in Metern robot_mounted +bool false true true Angabe, ob der rc_visard auf einem Roboter +montiert ist tcp_offset float64 -10.0 10.0 0.0 Offset vom TCP +entlang tcp_rotation_axis tcp_rotation_axis int32 -1 2 -1 -1 für +aus, 0 für x, 1 für y, 2 für z + +Beschreibung der Laufzeitparameter + +Für die Beschreibungen der Parameter sind die in der Web GUI gewählten +Namen der Parameter in Klammern angegeben. + +grid_width (Breite) + + Breite des Kalibriermusters in Metern. Die Breite sollte mit sehr + hoher Genauigkeit, vorzugsweise im Submillimeterbereich, angegeben + werden. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/parameters?grid_width= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/parameters?grid_width= + +grid_height (Höhe) + + Höhe des Kalibriermusters in Metern. Die Höhe sollte mit sehr hoher + Genauigkeit, vorzugsweise im Submillimeterbereich, angegeben + werden. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/parameters?grid_height= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/parameters?grid_height= + +robot_mounted (Sensormontage) + + Ist dieser Parameter auf *true* gesetzt, dann ist die Kamera an + einem Roboter montiert. Ist er auf *false* gesetzt, ist sie + statisch montiert und das Kalibriermuster ist am Roboter + angebracht. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/parameters?robot_mounted= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/parameters?robot_mounted= + +tcp_offset (TCP-Offset) + + Der vorzeichenbehaftete Offset vom TCP zum Kamerakoordinatensystem + (für Kameras auf dem Roboter) oder der sichtbaren Oberfläche des + Kalibriermusters (für statische Kameras) entlang der TCP- + Rotationsachse in Metern. Dies wird benötigt, falls die + Roboterbewegung eingeschränkt ist, sodass der TCP nur um eine Achse + gedreht werden kann (z.B. bei 4DOF-Robotern). + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/parameters?tcp_offset= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/parameters?tcp_offset= + +tcp_rotation_axis (TCP-Rotationsachse) + + Die Achse des Roboterkoordinatensystems, um die der Roboter seinen + TCP drehen kann. 0 für X-, 1 für Y- und 2 für Z-Achse. Dies wird + benötigt falls, die Roboterbewegung eingeschränkt ist, sodass der + TCP nur um eine Achse gedreht werden kann (z.B. bei 4DOF-Robotern). + -1 bedeutet, dass der Roboter seinen TCP um zwei unabhängige Achsen + drehen kann. "tcp_offset" wird in diesem Fall ignoriert. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/parameters?tcp_rotation_axis= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/parameters?tcp_rotation_axis= + +Services + +Auf die Services, die die REST-API für die programmgesteuerte +Durchführung der Hand-Auge-Kalibrierung und für die Wiederherstellung +der Modulparameter bietet, wird im Folgenden näher eingegangen. + +get_calibration + + Hiermit wird die derzeit auf dem + + rc_visard NG + + gespeicherte Hand-Auge-Kalibrierung abgerufen. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/get_calibration + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/get_calibration + + Request + + Dieser Service hat keine Argumente. + + Response + + Das Feld "error" gibt den Kalibrierfehler in Pixeln an, der aus dem + translatorischen Fehler "translation_error_meter" und dem + rotatorischen Fehler "rotation_error_degree" berechnet wird. Dieser + Wert wird nur aus Kompatibilitätsgründen mit älteren Versionen + angegeben. Die translatorischen und rotatorischen Fehler sollten + bevorzugt werden. + + Rückgabewerte des get_calibration-Services status success + Beschreibung 0 true eine gültige Kalibrierung wurde + zurückgegeben 2 false die Kalibrierung ist nicht verfügbar + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "get_calibration", + "response": { + "error": "float64", + "message": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "robot_mounted": "bool", + "rotation_error_degree": "float64", + "status": "int32", + "success": "bool", + "translation_error_meter": "float64" + } + } + +remove_calibration + + Dieser Service löscht die persistente Hand-Auge-Kalibrierung auf + dem + + rc_visard NG + + . Nach diesem Aufruf gibt der "get_calibration" Service zurück, + dass keine Hand-Auge-Kalibrierung vorliegt. Dieser Service löscht + ebenfalls alle gespeicherten Kalibrierposen und die zugehörigen + Kamerabilder. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/remove_calibration + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/remove_calibration + + Request + + Dieser Service hat keine Argumente. + + Response + + Rückgabewerte des get_calibration-Services status success + Beschreibung 0 true persistente Kalibrierung gelöscht, Gerät + nicht mehr kalibriert 1 true keine persistente Kalibrierung + gefunden, Gerät nicht kalibriert 2 false die Kalibrierung konnte + nicht gelöscht werden + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "remove_calibration", + "response": { + "message": "string", + "status": "int32", + "success": "bool" + } + } + +set_pose + + Dieser Service setzt die Roboterpose als Kalibrierpose für die + Hand-Auge-Kalibrierroutine und nimmt das aktuelle Bild des + Kalibriermusters auf. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/set_pose + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/set_pose + + Request + + Das "slot"-Argument wird verwendet, um den verschiedenen + Kalibrierpositionen eindeutige Ziffern im Wertebereich von 0-15 + zuzuordnen. Wann immer der Service "set_pose" aufgerufen wird, wird + ein Kamerabild aufgezeichnet. Dieser Service schlägt fehl, wenn das + Kalibriermuster im aktuellen Bild nicht erkannt werden kann. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "slot": "uint32" + } + } + + Response + + Rückgabewerte des set_pose-Services status success + Beschreibung 1 true Pose erfolgreich gespeichert 3 true Pose + erfolgreich gespeichert. Es wurden genügend Posen für die + Kalibrierung gespeichert, d.h. die Kalibrierung kann durchgeführt + werden 4 false das Kalibriermuster wurde nicht erkannt, z.B. + weil es im Kamerabild nicht vollständig sichtbar ist 8 false + keine Bilddaten verfügbar 12 false die angegebenen + Orientierungswerte sind ungültig 13 false ungültige Slot-Nummer + + The Feld "overexposed" gibt an, ob Teile des Kalibriermusters bei + diesem Bild überbelichtet sind. + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "set_pose", + "response": { + "message": "string", + "overexposed": "bool", + "status": "int32", + "success": "bool" + } + } + +get_poses + + Dieser Service gibt die aktuell gespeicherten Kalibrierposen für + die Hand-Auge-Kalibrierung zurück. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/get_poses + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/get_poses + + Request + + Dieser Service hat keine Argumente. + + Response + + Rückgabewerte des get_poses-Services status success + Beschreibung 0 true gespeicherte Posen werden zurückgeliefert 1 + true keine Kalibrierposen verfügbar + + The Feld "overexposed" gibt an, ob Teile des Kalibriermusters bei + diesem Bild überbelichtet sind. + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "get_poses", + "response": { + "message": "string", + "poses": [ + { + "overexposed": "bool", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "slot": "uint32" + } + ], + "status": "int32", + "success": "bool" + } + } + +delete_poses + + Dieser Service löscht die Kalibrierposen und die zugehörigen Bilder + mit den angegebenen Nummern in "slots". + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/delete_poses + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/delete_poses + + Request + + Das Argument "slots" gibt die Ziffern der Kalibrierposen an, die + gelöscht werden sollen. Wenn "slots" leer ist, werden keine + Kalibrierposen gelöscht. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "slots": [ + "uint32" + ] + } + } + + Response + + Rückgabewerte des delete_poses-Services status success + Beschreibung 0 true Posen erfolgreich gelöscht 1 true Keine + Slots angegeben + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "delete_poses", + "response": { + "message": "string", + "status": "int32", + "success": "bool" + } + } + +reset_calibration + + Hiermit werden alle zuvor aufgenommenen Posen mitsamt der + zugehörigen Bilder gelöscht. Das letzte hinterlegte + Kalibrierergebnis wird neu geladen. Dieser Service kann verwendet + werden, um die Hand-Auge-Kalibrierung (neu) zu starten. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/reset_calibration + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/reset_calibration + + Request + + Dieser Service hat keine Argumente. + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "reset_calibration", + "response": { + "message": "string", + "status": "int32", + "success": "bool" + } + } + +calibrate + + Dieser Service dient dazu, das Ergebnis der Hand-Auge-Kalibrierung + auf Grundlage der über den Service "set_pose" konfigurierten + Roboterposen zu berechnen und auszugeben. + + Details + + Damit die Kalibrierung für andere Module mit "get_calibration" + verfügbar ist und persistent gespeichert wird, muss + "save_calibration" aufgerufen werden. + + Bemerkung: Zur Berechnung der Transformation der Hand-Auge- + Kalibrierung werden mindestens vier Roboterposen benötigt (siehe + "set_pose"). Empfohlen wird jedoch die Verwendung von acht + Kalibrierposen. + + Dieser Service kann wie folgt aufgerufen werden. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/calibrate + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/calibrate + + Request + + Dieser Service hat keine Argumente. + + Response + + Das Feld "error" gibt den Kalibrierfehler in Pixeln an, der aus dem + translatorischen Fehler "translation_error_meter" und dem + rotatorischen Fehler "rotation_error_degree" berechnet wird. Dieser + Wert wird nur aus Kompatibilitätsgründen mit älteren Versionen + angegeben. Die translatorischen und rotatorischen Fehler sollten + bevorzugt werden. + + Rückgabewerte des calibrate-Services status success + Beschreibung 0 true Kalibrierung erfolgreich, das + Kalibrierergebnis wurde zurückgegeben. 1 false Nicht genügend + Posen gespeichert, um die Kalibrierung durchzuführen 2 false Das + berechnete Ergebnis ist ungültig, bitte prüfen Sie die + Eingabewerte. 3 false Die angegebenen Abmessungen des + Kalibriermusters sind ungültig. 4 false Ungenügende Rotation, + tcp_offset and tcp_rotation_axis müssen angegeben werden 5 false + Genügend Rotation verfügbar, tcp_rotation_axis muss auf -1 gesetzt + werden 6 false Die Posen sind nicht unterschiedlich genug. + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "calibrate", + "response": { + "error": "float64", + "message": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "robot_mounted": "bool", + "rotation_error_degree": "float64", + "status": "int32", + "success": "bool", + "translation_error_meter": "float64" + } + } + +save_calibration + + Hiermit wird das Ergebnis der Hand-Auge-Kalibrierung persistent auf + dem + + rc_visard NG + + gespeichert und das vorherige Ergebnis überschrieben. Das + gespeicherte Ergebnis lässt sich jederzeit über den Service + "get_calibration" abrufen. Dieser Service löscht ebenfalls alle + gespeicherten Kalibrierposen und die zugehörigen Kamerabilder. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/save_calibration + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/save_calibration + + Request + + Dieser Service hat keine Argumente. + + Response + + Rückgabewerte des save_calibration-Services status success + Beschreibung 0 true die Kalibrierung wurde erfolgreich + gespeichert 1 false die Kalibrierung konnte nicht im Dateisystem + gespeichert werden 2 false die Kalibrierung ist nicht verfügbar + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "save_calibration", + "response": { + "message": "string", + "status": "int32", + "success": "bool" + } + } + +set_calibration + + Hiermit wird die übergebene Transformation als Hand-Auge- + Kalibrierung gesetzt. + + Details + + Die Kalibrierung wird im gleichen Format erwartet, in dem sie beim + "calibrate" und "get_calibration" Aufruf zurückgegeben wird. Die + gegebene Kalibrierung wird auch persistent gespeichert, indem + intern "save_calibration" aufgerufen wird. + + Dieser Service kann wie folgt aufgerufen werden. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/set_calibration + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/set_calibration + + Request + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "robot_mounted": "bool" + } + } + + Response + + Rückgabewerte des set_calibration-Services status success + Beschreibung 0 true Setzen der Kalibrierung war erfolgreich 12 + false die angegebenen Orientierungswerte sind ungültig + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "set_calibration", + "response": { + "message": "string", + "status": "int32", + "success": "bool" + } + } + +reset_defaults + + Hiermit werden die Werkseinstellungen der Parameter dieses Moduls + wieder hergestellt und angewandt ("factory reset"). Dies hat keine + Auswirkungen auf das Kalibrierergebnis oder auf die während der + Kalibrierung gefüllten "Slots". Es werden lediglich Parameter, wie + die Maße des Kalibriermusters oder die Montageart des Sensors, + zurückgesetzt. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/reset_defaults + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/reset_defaults + + Request + + Dieser Service hat keine Argumente. + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "reset_defaults", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } diff --git a/v24.04/de/_sources/hardware_spec.rst.txt b/v24.04/de/_sources/hardware_spec.rst.txt new file mode 100644 index 0000000..a5251e2 --- /dev/null +++ b/v24.04/de/_sources/hardware_spec.rst.txt @@ -0,0 +1,399 @@ +Hardware-Spezifikation + +Bemerkung: Die folgenden Hardware-Spezifikationen sind als + allgemeine Richtlinie angegeben. Das Produkt kann hiervon abweichen. + +Lieferumfang + +Der Lieferumfang eines + +rc_visard NG + + umfasst üblicherweise lediglich den + +rc_visard NG + +-Sensor und die Kurzanleitung. Das Handbuch liegt in digitaler Form +vor, ist im Sensor hinterlegt und lässt sich zudem über die + +Web GUI + + oder über die Roboception-Homepage + +http://www.roboception.com/documentation + + aufrufen. + +Bemerkung: Folgende Elemente sind, sofern nicht anders angegeben, + NICHT im Lieferumfang enthalten: + + Kupplungen, Adapter, Halterungen, + + Netzteil, Kabel und Sicherungen, + + Netzwerkkabel. + + In Abschnitt + + Zubehör + + ist angegeben, welche Kabelanbieter empfohlen werden. + +Für den + +rc_visard NG + + ist ein Anschlussset verfügbar. Dieses Set umfasst das +M12/RJ45-Netzwerkkabel, ein 24-V-Netzteil und einen DC/M12-Adapter. +Für nähere Informationen siehe + +Zubehör + +. + +Bemerkung: Das Anschlussset ist lediglich für die Ersteinrichtung, + nicht jedoch für die dauerhafte Installation im industriellen Umfeld + gedacht. + +Das folgende Bild zeigt die wichtigsten Bauteile des + +rc_visard NG + +, auf die in diesem Handbuch Bezug genommen wird. + + +Technische Spezifikation + +Die technischen Spezifikationen für den + +rc_visard NG + + sind in + +Tab. 1 + + angegeben. Die Framerate für die Berechnung des Tiefenbilds in hoher +Auflösung (High: 720 x 540 Pixel) ist signifikant höher, wenn der +Minimale Abstand auf 1.2 Meter verringert werden kann. + +Technische Spezifikation für den rc_visard NG rc_visard NG +160-6 Bildauflösung 1440 x 1080 Pixel, monochrom Sichtfeld 6 mm +Objektiv: Horizontal: 43°, Vertikal: 33° IR Filter 650 nm +Tiefenbild (mit Minimalem Abstand von 0.5 m) 1440 x 1080 Pixel +(Full) bei 3 Hz 720 x 540 Pixel (High) bei 7 Hz 360 x 270 Pixel +(Medium) bei 25 Hz 240 x 180 Pixel (Low) bei 25 Hz Tiefenbild (mit +Minimalem Abstand von 1.2 m) 1440 x 1080 Pixel (Full) bei 3 Hz 720 +x 540 Pixel (High) bei 16 Hz 360 x 270 Pixel (Medium) bei 25 Hz 240 +x 180 Pixel (Low) bei 25 Hz GPU/CPU Orin Nano 8GB Stromversorgung +18–30 V Kühlung Passiv Basisabstand 160 mm Tiefenmessbereich 0,5 +m bis unendlich Abmessungen (B x H x L) 230 mm x 75 mm x 84 mm +Gewicht 0,965 kg + +Die folgende Tabelle zeigt die Auflösungen und Genauigkeiten bei +verschiedenen Abständen. + +Auflösung und Genauigkeit des rc_visard NG in Millimetern, mit Stereo- +Matching in voller Auflösung und Random-Dot-Projektion auf nicht- +reflektierenden und nicht-transparenten Objekten. Abstand +(mm) rc_visard NG 160-6 laterale Auflösung (mm) 500 1000 2000 +3000 0.3 0.6 1.1 1.7 Tiefenauflösung (mm) 500 1000 2000 3000 +0.05 0.2 0.9 2.0 Mittlere Tiefengenauigkeit (mm) 500 1000 2000 +3000 0.2 0.9 3.5 7.8 + +Der + +rc_visard NG + + kann für zusätzliche Funktionalitäten mit On-Board-Softwaremodulen +ausgestattet werden. Diese Softwaremodule können bei Roboception +bestellt werden und benötigen ein Lizenz-Update. + + +CAD-Modelle des + +rc_visard NG + + können von der Roboception-Homepage heruntergeladen werden: + +http://www.roboception.com/download + +. Die CAD-Modelle werden nach bestem Wissen und Gewissen, aber ohne +Garantie für die Richtigkeit bereitgestellt. Wird als +Materialeigenschaft Aluminium zugewiesen (Dichte: +2.76\mathrm{g\over{cm}^3}), weicht das CAD-Modell in Bezug auf Gewicht +und Massenschwerpunkt nicht mehr als fünf Prozent und in Bezug auf das +Trägheitsmoment nicht mehr als zehn Prozent vom Produkt ab. + +Umwelt- und Betriebsbedingungen + +Der + +rc_visard NG + + ist für industrielle Anwendungen konzipiert worden. Die in + +Tab. 3 + + angegebenen Umweltbedingungen für die Lagerung, den Transport und den +Betrieb sind ausnahmslos einzuhalten. + +Umweltbedingungen rc_visard NG Lager-/Transporttemperatur +-25–70 °C Betriebstemperatur 0–50 °C Relative Feuchte (nicht +kondensierend) 20–80 % Schwingungen 5 g Erschütterungen 50 g +Schutzklasse IP 54 Sonstiges Von korrosiven Flüssigkeiten oder +Gasen fernhalten. Von explosiven Flüssigkeiten oder Gasen fernhalten. +Von starken elektromagnetischen Störungen fernhalten. + +Der + +rc_visard NG + + ist für den Betrieb bei einer Umgebungstemperatur zwischen 0 und 50 +°C ausgelegt und arbeitet mit konvektiver (passiver) Kühlung. Während +der Verwendung muss, insbesondere im Bereich der Kühlrippen, ein +ungehinderter Luftstrom sichergestellt sein. Der + +rc_visard NG + + sollte nur mithilfe der vorgesehenen mechanischen +Montageschnittstelle montiert werden. Kein Teil des Gehäuses darf +während des Betriebs abgedeckt werden. Das Gehäuse muss in alle +Richtungen mindestens zehn Zentimeter Abstand zu angrenzenden +Elementen haben und es ist ein ausreichender Luftaustausch mit der +Umgebung nötig, um eine angemessene Kühlung sicherzustellen. Die +Kühlrippen müssen frei von Schmutz und anderen Verunreinigungen +gehalten werden. + +Die Gehäusetemperatur richtet sich nach der Verarbeitungslast, der +Sensororientierung und der Umgebungstemperatur. Erreichen die frei +liegenden Gehäuseflächen des Sensors eine Temperatur von mehr als 60 +°C, wechselt die LED von Grün auf Rot. + +Warnung: Für handgeführte Anwendungen sollte ein wärmeisolierter + Griff am Sensor angebracht werden. So wird das bei Kontakt mit der + 60 °C heißen Oberfläche bestehende Risiko für Brandverletzungen + reduziert. + +Spezifikationen für die Stromversorgung + +Der + +rc_visard NG + + muss an eine Gleichspannungsquelle angeschlossen werden. Der +Lieferumfang des + +rc_visard NG + + umfasst standardmäßig kein Netzteil. Das im Anschlussset enthaltene +Netzteil kann für die Ersteinrichtung verwendet werden. Der Kunde ist +dafür verantwortlich, bei einer dauerhaften Installation für eine +geeignete Gleichspannungsquelle zu sorgen. Jeder + +rc_visard NG + + muss an eine eigene Stromquelle angeschlossen werden. Der Anschluss +an ein Gebäudenetz darf nur über ein Netzteil erfolgen, das gemäß +EN55011 Klasse B zertifiziert ist. + +Grenzwerte für die Stromversorgung Minimum Bemessungswert +Maximum Versorgungsspannung 18 V 24 V 30 V Max. Leistungsaufnahme +25 W Überstromschutz Schutz der Stromversorgung mit einer +2-A-Sicherung + +Warnung: Die Überschreitung der maximalen Bemessungswerte kann zu + Schäden am + + rc_visard NG + + , am Netzteil und an angeschlossener Ausrüstung führen. + +Warnung: Jeder + + rc_visard NG + + muss von einem eigenen Netzteil versorgt werden. + +Warnung: Der Anschluss an das Gebäudenetz darf nur über Netzteile + erfolgen, die gemäß EN 55011 als Gerät der Klasse B zertifiziert + sind. + +Verkabelung + +Die Kabel sind nicht im Standardlieferumfang des + +rc_visard NG + + enthalten. Es obliegt dem Kunden, geeignete Kabel zu beschaffen. In + +Zubehör + + ist eine Übersicht über die empfohlenen Komponenten enthalten. + +Warnung: Die Richtlinien zum Kabelmanagement sind zwingend + einzuhalten. Kabel sind immer mit einer Zugentlastung an der + Halterung des + + rc_visard NG + + zu befestigen, sodass durch Kabelbewegungen keine Kräfte auf die + M12-Anschlüsse des + + rc_visard NG + + wirken. Die verwendeten Kabel müssen lang genug sein, damit sich + der + + rc_visard NG + + voll bewegen kann, ohne dass das Kabel zu stark belastet wird. Der + minimale Biegeradius des Kabels muss beachtet werden. + +Der + +rc_visard NG + + besitzt eine industrielle, achtpolige M12-Buchse (A-kodiert) für die +Ethernet-Verbindung und einen achtpoligen M12-Stecker (A-kodiert) für +den Stromanschluss und die GPIO-Konnektivität. Beide Anschlüsse +befinden sich an der Rückwand des Geräts. Die Lage der beiden +Anschlüsse am + +rc_visard NG + + wird in + +Abb. 4 + + dargestellt. + + +Die Anschlüsse sind so gedreht, dass die üblicherweise 90° +abgewinkelten Stecker horizontal abgehen und von der Kamera (und den +Kühlrippen) wegzeigen. + + +Die Steckerbelegung für den Ethernetanschluss ist in + +Abb. 6 + + angegeben. + + +Die Steckerbelegung für den Stromanschluss ist in + +Tab. 5 + + angegeben. + +Steckerbelegung für den Stromanschluss Pos. Belegung 1 GPIO +Eingang 2 2 Stromzufuhr 3 GPIO Eingang 1 4 GPIO Masse 5 GPIO +Vcc 6 GPIO Ausgang 1 (Bildbelichtung) 7 Masse 8 GPIO Ausgang 2 + +Die GPIO-Signale werden über Optokoppler entkoppelt. + +GPIO Ausgang 1 + + bietet standardmäßig ein Signal zur Belichtungssynchronisierung und +hat für die Dauer der Belichtung einen logischen HIGH-Pegel. Alle +GPIOs können über das IOControl-Modul kontrolliert werden ( + +IOControl und Projektor-Kontrolle + +). Pins von unbenutzten GPIOs sollten ungeerdet bleiben. + +Warnung: Es ist besonders wichtig, dass + + GPIO Eingang 1 + + während des Boot-Vorgangs ungeerdet oder auf LOW gesetzt ist. Der + + rc_visard NG + + fährt nicht hoch, wenn der Pin während des Boot-Vorgangs auf HIGH + gesetzt ist. + +Das GPIO-Schaltschema und die zugehörigen Spezifikationen sind in + +Abb. 7 + + angegeben. Die maximale Spannung für + +GPIO Eingang + + und + +GPIO Vcc + + beträgt 30 V. + + +Warnung: Schließen Sie keine Signale mit Spannungen über 30 V an den + + rc_visard NG + + an. + +Mechanische Schnittstelle + +Der + +rc_visard NG + + verfügt an der Unterseite über eine Montageschnittstelle. + + +Zur Fehlerbehebung sowie zu Konfigurationszwecken kann der Sensor über +die am Koordinatenursprung angegebene, genormte Stativaufnahme +(Gewinde: 1/4 Zoll x 20) montiert werden. Für dynamische Anwendungen, +wie für die Montage an einem Roboterarm, muss der Sensor mit drei +M4-8.8-Maschinenschrauben befestigt werden, die mit einem Drehmoment +von 2,5 Nm anzuziehen und mit einer mittelfesten Gewindesicherung, wie +Loctite 243, zu sichern sind. Die maximale Einschraubtiefe beträgt 6 +mm. Die beiden Löcher mit einem Durchmesser von 4 mm können für +Positionsstifte (ISO 2338 4 m6) verwendet werden, damit der Sensor +präzise positioniert wird. + +Warnung: Für dynamische Anwendungen muss der + + rc_visard NG + + mit drei M4-8.8-Maschinenschrauben befestigt werden, die mit einem + Drehmoment von 2,5 Nm anzuziehen und mit einer mittelfesten + Gewindesicherung zu sichern sind. Es dürfen keine hochfesten + Schrauben verwendet werden. Die Einschraubtiefe muss wenigstens 5 + mm betragen. + +Koordinatensysteme + +Der Ursprung des + +rc_visard NG + +-Koordinatensystems liegt in der Austrittspupille der linken +Kameralinse. Dieses System wird auch als Sensor- oder +Kamerakoordinatensystem bezeichnet. Die ungefähre Lage für den + +rc_visard NG + + wird auf dem nächsten Bild gezeigt. + +Das Montagepunkt-Koordinatensystem für den + +rc_visard NG + + sitzt an der Unterseite, zentriert auf dem Gewinde, wobei die +Ausrichtung der des Sensor-Koordinatensystems entspricht. + +Abb. 9 + + zeigt den ungefähren Versatz. + + +Bemerkung: Der korrekte Versatz zwischen dem + Sensor-/Kamerakoordinatensystem und einem Roboterkoordinatensystem + kann über die + + Hand-Auge Kalibrierung + + bestimmt werden. diff --git a/v24.04/de/_sources/index.rst.txt b/v24.04/de/_sources/index.rst.txt new file mode 100644 index 0000000..212a1bd --- /dev/null +++ b/v24.04/de/_sources/index.rst.txt @@ -0,0 +1,2 @@ +Roboception rc_visard NG Bedienungsanleitung + diff --git a/v24.04/de/_sources/installation.rst.txt b/v24.04/de/_sources/installation.rst.txt new file mode 100644 index 0000000..21e1804 --- /dev/null +++ b/v24.04/de/_sources/installation.rst.txt @@ -0,0 +1,375 @@ +Installation + +Warnung: Vor Installation des Gerätes müssen die Hinweise zur + + Sicherheit + + des + + rc_visard NG + + gelesen und verstanden werden. + +Für den Anschluss an ein Computernetzwerk verfügt der + +rc_visard NG + + über eine Gigabit-Ethernet-Schnittstelle. Die gesamte Kommunikation +mit dem Gerät wird über diese Schnittstelle abgewickelt. Der + +rc_visard NG + + besitzt zudem eine eigene Prozessierungseinheit, welche nach dem +Starten des Geräts eine gewisse Zeit für den Boot-Vorgang benötigt. + +Softwarelizenz + +Jeder + +rc_visard NG + + wird mit einer vorinstallierten Lizenzdatei zur Lizenzierung und zum +Schutz der installierten Softwarepakete ausgeliefert. Die Lizenz ist +an den spezifischen + +rc_visard NG + + gebunden und kann nicht auf andere Geräte übertragen oder mit diesen +verwendet werden. + +Die Funktionalität des + +rc_visard NG + + kann jederzeit durch ein + +Upgrade der Lizenz + + erweitert werden -- zum Beispiel für zusätzlich erhältliche, +optionale Softwaremodule. + +Bemerkung: Der + + rc_visard NG + + muss neu gestartet werden, sobald die Softwarelizenz geändert + wurde. + +Bemerkung: Der Status der Softwarelizenz kann über die verschiedenen + Schnittstellen des + + rc_visard NG + + abgefragt werden, zum Beispiel über die Seite System ‣ Firmware & + Lizenz in der + + Web GUI + + . + +Einschalten + +Bemerkung: Vergewissern Sie sich, + + bevor + + Sie die Stromzufuhr einschalten, dass der M12-Stromanschluss am + + rc_visard NG + + sicher befestigt ist. + +Sobald der + +rc_visard NG + + an den Strom angeschlossen ist, schaltet sich die LED an der +Gerätefront ein. Während des Boot-Vorgangs ändert sich die Farbe der +LED, bis sie schließlich grün leuchtet. Dies bedeutet, dass alle +Prozesse laufen und der + +rc_visard NG + + einsatzbereit ist. + +Ist kein Netzwerkkabel angeschlossen bzw. das Netzwerk nicht +ordnungsgemäß konfiguriert, blinkt die LED alle fünf Sekunden rot. In +diesem Fall muss die Netzwerkkonfiguration des Geräts überprüft +werden. Für nähere Informationen zu den LED-Farbcodes siehe + +LED-Farben + +. + +Aufspüren von rc_visard NG-Geräten + +Roboception- + +rc_visard NG + +-Geräte, die eingeschaltet und mit dem lokalen Netzwerk oder direkt +mit einem Computer verbunden sind, können über den Discover- +Mechanismus von GigE Vision® ausfindig gemacht werden. + +Das Open-Source-Tool "rcdiscover-gui" kann für Windows und Linux +kostenlos heruntergeladen werden: + +https://github.com/roboception/rcdiscover/releases + +. Dieses Tool besteht für Windows 7, 10 und 11 aus einer einzigen +ausführbaren Datei, die ohne Installation direkt ausgeführt werden +kann. Für Linux ist ein Installationspaket für Ubuntu erhältlich. + +Nach dem Start wird jedes verfügbare GigE Vision®-Gerät, und damit +auch jeder verfügbare + +rc_visard NG + +, mit seinem Namen, seiner Seriennummer, der aktuellen IP-Adresse und +der eindeutigen MAC-Adresse aufgelistet. Das Discovery-Tool findet +alle Geräte, die sich über globale Broadcasts erreichen lassen. Es +kann vorkommen, dass falsch konfigurierte Geräte aufgeführt werden, +die anderen Subnetzen als dem des Computers angehören. Ein Häkchen im +Discovery-Tool gibt an, ob ein Gerät richtig konfiguriert und damit +auch über einen Webbrowser erreichbar ist. + + +Wurde das Gerät erfolgreich gefunden, öffnet sich nach einem +Doppelklick auf den Geräteeintrag die + +Web GUI + + des Geräts im Standard-Browser des Betriebssystems. Wir empfehlen, +Google Chrome oder Mozilla Firefox als Webbrowser zu verwenden. + +Zurücksetzen der Konfiguration + +Ein falsch konfiguriertes Gerät lässt sich über die Schaltfläche + +Reset rc_visard + + im Discovery-Tool zurücksetzen. Der Rücksetzmechanismus ist jedoch +nur in den ersten beiden Minuten nach dem Gerätestart verfügbar. Daher +kann es sein, dass der + +rc_visard NG + + neu gestartet werden muss, um seine Konfiguration zurückzusetzen. + + +Wird ein + +rc_visard NG + + trotz falscher Konfiguration vom Discovery-Mechanismus erkannt, kann +er aus der + +rc_visard + +-Dropdown-Liste gewählt werden. Anderenfalls kann die auf dem + +rc_visard NG + + aufgedruckte MAC-Adresse manuell im vorgesehenen Feld eingegeben +werden. + +Nach Eingabe der MAC-Adresse kann aus vier Optionen gewählt werden: + +Reset Parameters: Setzt alle Parameter des rc_visard NG, die über die +Web GUI\ (Abschnitt \ref{webgui:sect-web-gui}) konfiguriert werden +können (z.B. Bildwiederholrate), zurück. + +Reset Network: Setzt die Netzwerkeinstellungen und den +benutzerdefinierten Namen zurück. + +Reset All: Setzt sowohl die rc_visard NG-Parameter als auch die +Netzwerkeinstellungen und den benutzerdefinierten Namen zurück. + +Switch Partitions: Ermöglicht es, einen Rollback vorzunehmen, siehe +Wiederherstellung der vorherigen Firmware-Version\:(Abschnitt +\ref{maintenance:sect-restoring-the-previous-firmware-version}). + +Wird die LED weiß und das Gerät neu gestartet, war der Reset +erfolgreich. Ist keine Reaktion erkennbar, war möglicherweise das +zweiminütige Zeitfenster abgelaufen, sodass das Gerät neu gestartet +werden muss. + +Bemerkung: Der Rücksetzmechanismus ist nur in den ersten beiden + Minuten nach dem Gerätestart verfügbar. + +Netzwerkkonfiguration + +Für die Kommunikation mit anderen Netzwerkgeräten muss dem + +rc_visard NG + + eine Internet-Protokoll-Adresse ( + +IP + +) zugewiesen werden. Jede IP-Adresse darf innerhalb des lokalen +Netzwerks nur einmal vergeben werden. Sie kann entweder manuell +mittels einer durch den Nutzer zugewiesenen persistenten (d.h. +statischen) IP-Adresse festgelegt oder automatisch per + +DHCP + + zugewiesen werden. Ist keine der Methoden verfügbar oder aktiviert, +greift der + +rc_visard NG + + auf eine + +Link-Local + +-Adresse zurück. + +Nach dem + +GigE Vision + +®-Standard wird die Konfiguration der IP-Adresse in folgender +Priorität und Reihenfolge durchgeführt: + + Persistente IP (falls aktiviert) + + DHCP (falls aktiviert) + + Link-Local + + +Zur Konfiguration der Netzwerkeinstellungen und IP-Adresse des + +rc_visard NG + + stehen folgende Möglichkeiten zur Verfügung: + + die Seite System ‣ Netzwerk der rc_visard NG-Web GUI -- falls diese + im lokalen Netzwerk bereits erreichbar ist, siehe Web + GUI\:(Abschnitt \ref{webgui:sect-web-gui}) + + alle Konfigurationsprogramme, welche mit GigE Vision® 2.0 + kompatibel sind, oder das Roboception Kommandozeilenprogramm + gc_config. Üblicherweise wird nach dem Start dieser Programme das + Netzwerk nach allen verfügbaren GigE Vision®-Sensoren durchsucht. + Alle rc_visard NG-Geräte können über ihre Seriennummer und MAC- + Adresse, die beide auf dem Gerät aufgedruckt sind, eindeutig + identifiziert werden. + + das Roboception rcdiscover-gui-Tool, welches temporäre Änderungen + oder das vollständige Zurücksetzen der Netzwerkkonfiguration des + rc_visard NG erlaubt, siehe Aufspüren von rc_visard NG- + Geräten\:(Abschnitt \ref{installation:sect-discovery-of-rcvisard- + devices}) + +Bemerkung: Das Kommandozeilenprogramm "gc_config" ist Bestandteil + der Roboception Open-Source-Bibliothek "rc_genicam_api", welche + kostenlos für Windows und Linux von folgender Seite heruntergeladen + werden kann: + + http://www.roboception.com/download + + . + +Host-Name + +Der Host-Name des + +rc_visard NG + + basiert auf dessen Seriennummer, welche auf dem Gerät aufgedruckt +ist, und lautet "rc-visard-ng-". + +Automatische Konfiguration (werksseitige Voreinstellung) + +Für die Zuweisung von IP-Adressen wird bevorzugt auf + +DHCP + + zugegriffen. Ist DHCP (werksseitige Voreinstellung auf dem + +rc_visard NG + +) aktiviert, versucht das Gerät, wann immer das Netzwerkkabel +eingesteckt wird, einen DHCP-Server zu kontaktieren. Ist ein DHCP- +Server im Netzwerk verfügbar, wird die IP-Adresse automatisch +konfiguriert. + +In einigen Netzwerken ist der DHCP-Server so konfiguriert, dass +lediglich bekannte Geräte akzeptiert werden. In diesem Fall muss die +auf dem Gerät aufgedruckte „Media Access Control“-Adresse, kurz + +MAC-Adresse + +, im DHCP-Server konfiguriert werden. Zudem ist der ebenfalls +aufgedruckte Host-Name des + +rc_visard NG + + im Domain Name Server + +DNS + + einzustellen. Sowohl die MAC-Adresse als auch der Host-Name sind zu +Konfigurationszwecken an den Netzwerkadministrator zu übermitteln. + +Kann der + +rc_visard NG + + nicht innerhalb von 15 Sekunden nach dem Einschalten bzw. dem +Einstecken des Netzwerkkabels Kontakt zu einem DHCP-Server aufbauen, +versucht er, sich selbst eine eindeutige IP-Adresse zuzuweisen. Dieser +Prozess heißt + +Link-Local + +. Diese Option ist besonders nützlich, wenn der + +rc_visard NG + + direkt an einen Computer angeschlossen werden soll. In diesem Fall +muss auch der Computer mit einer Link-Local-Adresse konfiguriert sein. +Bei manchen Betriebssystemen wie Windows 10 ist Link-Local bereits +standardmäßig als Fallback eingestellt. Bei der Arbeit mit anderen +Betriebssystemen, wie z.B. Linux, muss die Link-Local-Adresse direkt +im Netzwerkmanager konfiguriert werden. + +Manuelle Konfiguration + +In einigen Fällen kann es nützlich sein, manuell eine persistente, +d.h. statische IP-Adresse einzurichten. Diese wird auf dem + +rc_visard NG + + gespeichert und beim Systemstart bzw. beim Verbindungswiederaufbau +zugewiesen. Bitte stellen Sie sicher, dass die Einstellungen der IP- +Adresse, der Subnetz-Maske und des Default-Gateway keine Konflikte im +Netzwerk verursachen. + +Warnung: Die IP-Adresse muss eindeutig sein und innerhalb des + Gültigkeitsbereichs des lokalen Netzwerks liegen. Zudem muss die + Subnetz-Maske dem lokalen Netzwerk entsprechen, da anderenfalls + möglicherweise nicht auf den + + rc_visard NG + + zugegriffen werden kann. Dieses Problem lässt sich vermeiden, indem + die unter + + Automatische Konfiguration (werksseitige Voreinstellung) + + beschriebene automatische Konfiguration genutzt wird. + +Kann die gewählte IP-Adresse nicht zugewiesen werden, zum Beispiel +weil ein anderes Gerät im lokalen Netzwerk diese bereits verwendet, +wird auf die automatische IP-Konfiguration mittels + +DHCP + + (falls aktiviert) oder + +Link-Local + + zurückgegriffen. diff --git a/v24.04/de/_sources/interfaces.rst.txt b/v24.04/de/_sources/interfaces.rst.txt new file mode 100644 index 0000000..ea56d85 --- /dev/null +++ b/v24.04/de/_sources/interfaces.rst.txt @@ -0,0 +1,32 @@ +Schnittstellen + +Es stehen die folgenden Schnittstellen zur Konfiguration und +Datenübertragung des + +rc_visard NG + + zur Verfügung: + +Web GUI\:(Abschnitt \ref{webgui:sect-web-gui}) Leicht zu bedienendes +grafisches Interface zum Konfigurieren und Kalibrieren des rc_visard +NG, zum Anzeigen von Livebildern, Aufrufen von Services, Visualisieren +von Ergebnissen, usw. + +GigE Vision 2.0/GenICam-Schnittstelle\:(Abschnitt \ref{gigevision +:sect-genicam}) Konfiguration bild- und kamerabezogener +Einstellungen. + +REST-API-Schnittstelle\:(Abschnitt \ref{rest_api:sect-rest-api}) +Programmierschnittstelle zur Konfiguration des rc_visard NG, zur +Abfrage von Statusinformationen, zum Anfordern von Datenströmen, usw. + +Ethernet KRL Schnittstelle (EKI)\:(Abschnitt \ref{eki:sect-eki}) API +zum Konfigurieren des rc_visard NG und Ausführen von Service-Anfrage +von KUKA KSS Robotern aus. + +gRPC Bilddatenschnittstelle\:(Abschnitt \ref{grpc:sect-grpc}) +Synchronisierte Bilddaten per gRPC. + +Zeitsynchronisation\:(Abschnitt \ref{time_sync:sect-time-sync}) +Zeitsynchronisation zwischen dem rc_visard NG und dem Anwendungs-PC. + diff --git a/v24.04/de/_sources/iocontrol.rst.txt b/v24.04/de/_sources/iocontrol.rst.txt new file mode 100644 index 0000000..1241380 --- /dev/null +++ b/v24.04/de/_sources/iocontrol.rst.txt @@ -0,0 +1,265 @@ +IOControl und Projektor-Kontrolle + +Das IOControl Modul ist ein Modul, welches intern auf dem + +rc_visard + + läuft. + +Das IOControl-Modul ermöglicht das Lesen der digitalen Eingänge und +die Kontrolle der digitalen Ausgänge (GPIOs) des + +rc_visard + +. Die Ausgänge können auf *aus* (LOW) oder *an* (HIGH) gesetzt werden. +Sie können auch so konfiguriert werden, dass sie genau für die +Belichtungszeit jedes Bildes, oder auch nur jedes zweiten Bildes, *an* +sind. + +Das IOControl-Modul dient der Ansteuerung einer externen Lichtquelle +oder eines Projektors, der an einen der GPIO-Ausgänge des + +rc_visard + + angeschlossen wird, und der mit der Bildaufnahme synchronisiert ist. +Für den Fall, dass ein Musterprojektor für die Verbesserung des +Stereo-Matchings verwendet wird, ist das projizierte Muster auch in +den Intensitätsbildern sichtbar. Das kann für Bildverarbeitungs- +Anwendungen, die auf dem Intensitätsbild basieren (z.B. +Kantendetektion), von Nachteil sein. Aus diesem Grund erlaubt das +IOControl-Modul auch das Setzen der Ausgänge für nur jedes zweite +Kamerabild. Somit sind auch Intensitätsbilder ohne projiziertes Muster +verfügbar. + +Bemerkung: Details über die GPIOs des + + rc_visard NG + + werden in + + Verkabelung + + gegeben. + +Parameter + +Das IOControl-Modul wird in der REST-API als "rc_iocontrol" bezeichnet +und in der + +Web GUI + + unter Konfiguration ‣ IOControl dargestellt. Der Benutzer kann die +Parameter über die Web GUI, die REST-API ( + +REST-API-Schnittstelle + +), oder die GenICam-Schnittstelle mit den DigitalIOControl-Parametern +"LineSelector" und "LineSource" ändern ( + +GigE Vision 2.0/GenICam-Schnittstelle + +). + +Übersicht über die Parameter + +Dieses Softwaremodul bietet folgende Laufzeitparameter: + +Laufzeitparameter des rc_iocontrol-Moduls Name Typ Min. +Max. Default Beschreibung out1_mode string - - Low Out1 mode: +[Low, High, ExposureActive, ExposureAlternateActive] out2_mode +string - - Low Out2 mode: [Low, High, ExposureActive, +ExposureAlternateActive] + +Beschreibung der Laufzeitparameter + +out1_mode und out2_mode (Ausgang 1 (Out1) und Ausgang 2 (Out2)) + + Die Betriebsarten für GPIO-Ausgang 1 und GPIO-Ausgang 2 können + individuell gesetzt werden: + + "Low" schaltet den GPIO-Ausgang permanent *aus* (LOW). Das ist + die Standardeinstellung. + + "High" schaltet den GPIO-Ausgang permanent *an* (HIGH). + + "ExposureActive" schaltet den GPIO-Ausgang für die + Belichtungszeit jedes Bildes *an* (HIGH). + + "ExposureAlternateActive" schaltet den GPIO-Ausgang für die + Belichtungszeit jedes zweiten Bildes *an* (HIGH). + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_iocontrol/parameters/parameters?= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_iocontrol/parameters?= + +Abb. 48 + + zeigt, welche Bilder für das Stereo-Matching und die GigE Vision- +Übertragung in der Betriebsart "ExposureActive" mit einer +benutzerdefinierten Bildwiederholrate von 8 Hz benutzt werden. + + +Die Betriebsart "ExposureAlternateActive" ist gedacht, um einen +externen Musterprojektor anzusteuern, der am GPIO-Ausgang 1 des + +rc_visard + + angeschlossen ist. In diesem Fall nutzt das + +Stereo-Matching-Modul + + nur Bilder, bei denen GPIO-Ausgang 1 *an* (HIGH) ist, d.h. der +Projektor ist an. Die maximale Bildwiederholrate, welche für das +Stereo-Matching genutzt wird, ist hierbei die halbe vom Benutzer +konfigurierte Bildwiederholrate (siehe + +FPS + +). Alle Module, die Intensitätsbilder benutzen, wie z.B. + +TagDetect + + und + +ItemPick + +, benutzen die Intensitätsbilder, bei denen der GPIO-Ausgang 1 *aus* +(LOW) ist, d.h. der Projektor ist aus. + +Abb. 49 + + zeigt ein Beispiel. + + +Bemerkung: In der Betriebsart "ExposureAlternateActive" gibt es zu + einem Intensitätsbild mit angeschaltetem GPIO-Ausgang 1 (HIGH), d.h. + mit projiziertem Muster, immer in 40 ms Abstand ein Intensitätsbild + mit ausgeschaltetem GPIO-Ausgang 1 (LOW), d.h. ohne projiziertes + Muster. Dies ist unabhängig von der benutzerdefinierten + Bildwiederholrate und sollte in dieser speziellen Betriebsart für + die Synchronisierung von Disparitäts- und projektionsfreien + Kamerabildern berücksichtigt werden. + +Die Funktionalität kann auch über die DigitalIOControl-Parameter der +GenICam Schnittstelle kontrolliert werden ( + +GigE Vision 2.0/GenICam-Schnittstelle + +). + +Services + +Zusätzlich zur eigentlichen Serviceantwort gibt jeder Service einen +sogenannten "return_code" bestehend aus einem Integer-Wert und einer +optionalen Textnachricht zurück. Erfolgreiche Service-Anfragen werden +mit einem Wert von 0 quittiert. Positive Werte bedeuten, dass die +Service-Anfrage zwar erfolgreich bearbeitet wurde, aber zusätzliche +Informationen zur Verfügung stehen. Negative Werte bedeuten, dass +Fehler aufgetreten sind. + +Dieses Softwaremodul bietet folgende Services. + +get_io_values + + Mit diesem Aufruf kann der aktuelle Zustand der Ein- und Ausgänge + (GPIOs) des + + rc_visard + + abgefragt werden. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_iocontrol/services/get_io_values + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_iocontrol/services/get_io_values + + Request + + Dieser Service hat keine Argumente. + + Response + + Das Feld "timestamp" ist der Zeitpunkt der Messung. + + "input_mask" und "output_mask" sind Bitmasken, die definieren, + welche Bits für die Werte der Eingänge bzw. Ausgänge verwendet + werden. + + "values" beinhaltet die Werte der Bits, die zu den in den Bitmasken + *input_mask`* und "output_mask" definierten Eingängen und Ausgängen + gehören. + + Das Feld "return_code" enthält mögliche Warnungen oder Fehlercodes + und Nachrichten. Mögliche Werte für "return_code" sind in der + Tabelle unten angegeben. + + Code Beschreibung 0 Erfolgreich -2 Interner Fehler -9 + Lizenz für IOControl ist nicht verfügbar + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "get_io_values", + "response": { + "input_mask": "uint32", + "output_mask": "uint32", + "return_code": { + "message": "string", + "value": "int16" + }, + "timestamp": { + "nsec": "int32", + "sec": "int32" + }, + "values": "uint32" + } + } + +reset_defaults + + stellt die Werkseinstellungen der Parameter dieses Moduls wieder + her und wendet sie an („factory reset“). + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_iocontrol/services/reset_defaults + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_iocontrol/services/reset_defaults + + Request + + Dieser Service hat keine Argumente. + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "reset_defaults", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } diff --git a/v24.04/de/_sources/itempick.rst.txt b/v24.04/de/_sources/itempick.rst.txt new file mode 100644 index 0000000..563fac6 --- /dev/null +++ b/v24.04/de/_sources/itempick.rst.txt @@ -0,0 +1,2104 @@ +ItemPick und BoxPick + +Einführung + +Die ItemPick und BoxPick Module liefern eine gebrauchsfertige +Perzeptionslösung, um robotische Pick-and-Place-Anwendungen zu +realisieren. ItemPick detektiert ebene Oberflächen unbekannter Objekte +für die Positionierung eines Sauggreifers. BoxPick erkennt rechteckige +Oberflächen und bestimmt ihre Position, Orientierung und Größe für das +Greifen. Mit der + +Textur + +-Erweiterung kann BoxPick zur Detektion von texturierten Rechtecken +mit konsistenten Orientierungen verwendet werden. Da die +Schnittstellen beider Module sehr ähnlich sind, werden sie in diesem +Kapitel gemeinsam beschrieben. + +Darüber hinaus bieten beide Module: + +eine intuitiv gestaltete Bedienoberfläche für Inbetriebnahme, +Konfiguration und Test auf der rc_visard NG Web GUI\:(Abschnitt +\ref{webgui:sect-web-gui}) + +die Möglichkeit, sogenannte Regions of Interest (ROIs) zu definieren, +um relevante Teilbereiche der Szene auszuwählen (siehe RoiDB, +Abschnitt \ref{roi:sect-roi}) + +eine integrierte Load Carrier Erkennung (siehe LoadCarrier, Abschnitt +\ref{loadcarrier:sect-loadcarrier}), um in Bin-Picking-Anwendungen +("Griff in die Kiste") Greifpunkte nur für Objekte in dem erkannten +Load Carrier zu berechnen + +die Unterstützung von Load Carriern mit Fächern, sodass Greifpunkte +für Objekte nur in einem definierten Teilvolumen des Load Carriers +berechnet werden + +die Unterstützung von sowohl statisch montierten als auch +robotergeführten Kameras. Optional kann es mit der Hand-Auge- +Kalibrierung (Abschnitt \ref{handeye_calibration:sect-handeye- +calibration}) kombiniert werden, um Greifposen in einem +benutzerdefinierten externen Koordinatensystem zu liefern. + +einen Qualitätswert für jeden vorgeschlagenen Greifpunkt, der die +Ebenheit der für das Greifen verfügbaren Oberfläche bewertet + +Auswahl einer Strategie zum Sortieren der zurückgelieferten +Greifpunkte + +eine 3D Visualisierung des Detektionsergebnisses mit Greifpunkten und +einer Greiferanimation in der Web GUI + +Bemerkung: In diesem Kapitel werden die Begriffe Cluster und + Oberfläche synonym verwendet und bezeichnen eine Menge von Punkten + (oder Pixeln) mit ähnlichen geometrischen Eigenschaften. + +Die ItemPick und BoxPick Module sind optional erhältliche Module, +welche intern auf dem + +rc_visard NG + + laufen und gesonderte ItemPick- bzw. BoxPick- + +Lizenzen + + benötigen. Die + +Textur + +-Erweiterung von BoxPick bedarf einer separaten Lizenz. + +Erkennung von Rechtecken (BoxPick) + +Es gibt zwei verschiedene Typen von Objektmodellen für die Erkennung +von Rechtecken im BoxPick Modul. + +Standardmäßig unterstützt BoxPick nur Objektmodelle ("item_models") +des Typs ("type") "RECTANGLE". Mit der + +Textur + +-Erweiterung können auch Objektmodelle des Typs "TEXTURED_BOX" +detektiert werden. Die Erkennung der verschiedenen Objektmodelltypen +wird weiter unten beschrieben. + +Optional können dem BoxPick-Modul folgende Informationen übergeben +werden: + +die ID des Load Carriers, welcher die Objekte enthält + +ein Teilbereich innerhalb eines Load Carriers, in dem Objekte +detektiert werden sollen + +die ID der Region of Interest, innerhalb der nach dem Load Carrier +gesucht wird, oder -- falls kein Load Carrier angegeben ist -- die +Region of Interest, in der nach Objekten gesucht wird + +die aktuelle Roboterpose, wenn die Kamera am Roboter montiert ist und +als Koordinatensystem external gewählt wurde, oder die gewählte Region +of Interest im externen Koordinatensystem definiert ist + +Die zurückgegebene Pose "pose" eines detektierten Objekts "item" ist +die Pose des Mittelpunkts des erkannten Rechtecks im gewünschten +Koordinatensystem "pose_frame", wobei die z-Achse in Richtung der +Kamera zeigt und die x-Achse parallel zu langen Seite des Rechtecks +ausgerichtet ist. Diese Pose hat eine 180° Mehrdeutigkeit in der +Rotation um die z-Achse, welche durch Nutzung der + +Textur + +-Erweiterung im BoxPick Modul aufgelöst werden kann. Jedes erkannte +Rechteck beinhaltet eine "uuid" (Universally Unique Identifier) und +den Zeitstempel "timestamp" des ältesten Bildes, das für die Erkennung +benutzt wurde. + +Erkennung von Objekten des Typs RECTANGLE (BoxPick) + +Das BoxPick-Modul unterstützt mehrere Objektmodelle ("item_models") +vom Typ ("type") Rechteck ("RECTANGLE"). Jedes Rechteck ist durch +seine minimale und maximale Größe definiert, wobei die minimale Größe +kleiner als die maximale Größe sein muss. Die Abmessungen sollten +relativ genau angegeben werden, um Fehldetektionen zu verhindern, +jedoch eine gewisse Toleranz beinhalten, um Messunsicherheiten und +mögliche Produktionsabweichungen zu berücksichtigen. + +Die Erkennung der Rechtecke läuft in mehreren Schritten ab. Zuerst +wird die Punktwolke in möglichst ebene Segmente (Cluster) unterteilt. +Dann werden gerade Liniensegmente in den 2D Bildern erkannt und auf +die zugehörigen Clusterflächen projiziert. Die Cluster und die +erkannten Linien werden in der "Zwischenergebnis" Visualisierung auf +der + +BoxPick + + Seite in der Web GUI angezeigt. Schließlich werden für jedes Cluster +die am besten zu den erkannten Linien passenden Rechtecke extrahiert. + +Erkennung von Objekten des Typs RECTANGLE (BoxPick+Match) + +Mit der + +Textur + +-Erweiterung unterstützt BoxPick zusätzlich Objektmodelle +("item_models") des Typs ("type") "TEXTURED_BOX". Wenn dieser +Objektmodelltyp verwendet wird, kann nur ein einzelnes Objektmodell +pro Anfrage angegeben werden. + +Das "TEXTURED_BOX" Objektmodell sollte für die Detektion mehrerer +Rechtecke mit gleicher Textur, d.h. gleichem Aussehen oder Aufdruck, +verwendet werden, wie zum Beispiel bedruckte Produktverpackungen, +Etiketten, Broschüren oder Bücher. Es wird vorausgesetzt, dass die +Textur bei allen Objekten gleich positioniert ist in Bezug auf die +Objektgeometrie. Weiterhin sollte die Textur nicht repetitiv sein. + +Ein Objekt vom Typ "TEXTURED_BOX" wird definiert durch die exakten +Abmessungen "dimensions" des Objekts in "x", "y" und "z" (wobei "z" +aktuell immer 0 sein muss) sowie eine Toleranz +"dimensions_tolerance_m" die angibt, wie stark die Abmessungen der +erkannten Rechtecke von den gegebenen Dimensionen abweichen dürfen. +Als Standardwert wird eine Toleranz von 0.01 m angenommen. Des +Weiteren muss eine "template_id" angegeben werden, über die die +spezifizierten Abmessungen und die Texturen der erkannten Rechtecke +referenziert werden. Zusätzlich können die maximal mögliche Verformung +der Objekte ("max_deformation_m") in Metern angegeben werden +(Standardwert 0.004 m), um steifere oder flexiblere Objekte zu +beschreiben. + +Wird eine "template_id" zum ersten Mal verwendet, dann detektiert +BoxPick die Rechtecke so wie für den Objektmodelltyp "RECTANGLE" +beschrieben, und nutzt die angegebene Toleranz um den +Abmessungsbereich für die Erkennung festzulegen. Aus den erkannten +Rechtecken werden sogenannte + +Views + + erzeugt, die die Form und die Bildintensitätswerte der Rechtecke +beinhalten, und werden in einem neu erzeugten Template mit der +angegebenen "template_id" gespeichert. Die Views werden schrittweise +erzeugt: Beginnend bei dem Rechteck mit dem höchsten Erkennungs-Score +wird ein View erzeugt und direkt verwendet, um weitere Rechtecke mit +derselben Textur zu finden. Dann werden in allen verbleibenden +Clustern weitere Rechtecke mit den angegebenen Abmessungen detektiert +und es wird wiederum aus dem besten Rechteck ein View generiert, der +für weitere Erkennungen genutzt wird. Jedes Template kann bis zu 10 +verschiedene Views speichern, zum Beispiel um verschiedene Sorten +derselben Produktverpackung abzubilden. Jeder View hat eine eindeutige +ID ("view_uuid") und alle Rechtecke mit gleicher Textur erhalten +dieselbe "view_uuid". Das bedeutet auch, dass alle Objekte ("items") +mit derselben "view_uuid" konsistente Orientierungen haben, da die +Orientierung jedes Objekts an der Textur ausgerichtet ist. Die Views +können angezeigt und gelöscht werden, und ihre Orientierungen können +über die + +Web GUI + + geändert werden, indem das Template oder sein Editierbutton in der +Templateübersicht angeklickt wird. Jedes erkannte Objekt hat ein Feld +"view_pose_set", welches angibt, ob die Orientierung des zum Objekt +zugeordneten Views explizit gesetzt wurde, oder ob sie unbestimmt in +einem zufälligen Zustand ist, welcher eine 180° Mehrdeutigkeit hat. +Der Typ "type" eines zurückgelieferten Objekts mit einer "view_uuid" +lautet "TEXTURED_RECTANGLE". + +Wenn ein Template mit der angegebenen "template_id" bereits existiert, +werden die vorhandenen Views verwendet, um Rechtecke anhand ihrer +Textur zu erkennen. Wenn weitere Rechtecke gefunden werden, die +ebenfalls passende Abmessungen haben, aber eine andere Textur, dann +werden neue Views generiert und dem Template hinzugefügt. Wenn die +maximale Anzahl Views erreicht ist, werden zu selten detektierte Views +gelöscht, damit neu generierte Views dem Template hinzugefügt werden +können, und das Template aktuell gehalten wird. Um zu verhindern, dass +ein Template durch neue Views aktualisiert wird, kann das automatische +Updaten der Views in der Web GUI aus- und eingeschaltet werden. Die +Dimensionstoleranz "dimensions_tolerance_m" und die maximale +Verformung "max_deformation_m" können dort ebenso für jedes Template +geändert werden. Die maximale Verformung bestimmt die Toleranz für die +Texturerkennung, die nötig ist, wenn sich durch flexible +Objektoberflächen Teile der Textur relativ zueinander verschieben. Für +steife Objekte sollte die maximale Verformung möglichst niedrig +gesetzt werden, um eine hohe Erkennungsgenauigkeit zu erreichen. + +Die Abmessungen "dimensions" des Templates können nur beim Erstellen +eines neuen Templates angegeben werden. Sobald das Template erzeugt +wurde, können die Abmessungen nicht mehr geändert werden und müssen +beim Aufruf der Erkennung auch nicht angegeben werden. Wenn die +Abmessungen dennoch beim Aufruf angegeben werden, müssen sie mit den +Abmessungen im vorhandenen Template übereinstimmen. Die Toleranz +"dimensions_tolerance_m" und die maximale Verformung +"max_deformation_m" können jedoch für jeden Detektionsaufruf +unterschiedlich angegeben werden und ihre Werte werden auch im +gespeicherten Template entsprechend aktualisiert. + +Berechnung der Greifpunkte + +Die ItemPick- und BoxPick-Module bieten einen Service, um Greifpunkte +für Sauggreifer zu berechnen. Der Sauggreifer ist durch die Länge und +Breite der Greiffläche definiert. + +Das ItemPick-Modul identifiziert ebene Flächen in der Szene und +unterstützt flexible und/oder deformierbare Objekte. Der Typ ("type") +dieser Objektmodelle ("item_models") ist als unbekannt ("UNKNOWN") +definiert, da sie keine gebräuchliche geometrische Form aufweisen +müssen. Optional kann eine minimale und maximale Größe angegeben +werden. + +Bei BoxPick werden die Greifpunkte auf den erkannten Rechtecken +berechnet (siehe + +Erkennung von Rechtecken (BoxPick) + +). + +Optional können den Modulen zu einer Greifpunktberechnung weitere +Informationen übergeben werden: + +die ID des Load Carriers, welcher die zu greifenden Objekte enthält + +ein Unterabteil (load_carrier_compartment) innerhalb eines Load +Carriers, in dem Objekte erkannt werden sollen (siehe Load Carrier +Abteile, Abschnitt \ref{loadcarrier_db:sect-loadcarrier-compartment}). + +die ID der 3D Region of Interest, innerhalb der nach dem Load Carrier +gesucht wird, oder -- falls kein Load Carrier angegeben ist -- die 3D +Region of Interest, innerhalb der Greifpunkte berechnet werden + +Informationen für die Kollisionsprüfung: Die ID des Greifers, um die +Kollisionsprüfung zu aktivieren, und optional ein Greif-Offset, der +die Vorgreifposition definiert. Details zur Kollisionsprüfung sind in +CollisionCheck\:(Abschnitt \ref{itempick:sect-itempick-collision- +check-dep}) gegeben. + +Ein vom ItemPick- oder BoxPick-Modul ermittelter Greifpunkt +repräsentiert die empfohlene Pose des TCP (Tool Center Point) des +Sauggreifers. Der Greifpunkt "type" ist immer auf "SUCTION" gesetzt. +Für jeden Greifpunkt liegt der Ursprung der Greifpose "pose" im +Mittelpunkt der größten von der jeweiligen Greiffläche umschlossenen +Ellipse. Die Orientierung des Greifpunkts ist ein rechtshändiges +Koordinatensystem, sodass die z-Achse orthogonal zur Greiffläche in +das zu greifende Objekt zeigt und die x-Achse entlang der längsten +Ausdehnung ausgerichtet ist. + + +Zusätzlich enthält jeder Greifpunkt die Abmessungen der maximal +verfügbaren Greiffläche, die als Ellipse mit den Achslängen +"max_suction_surface_length" und "max_suction_surface_width" +beschrieben wird. Der Nutzer kann Greifpunkte mit zu kleinen +Greifflächen herausfiltern, indem die minimalen Abmessungen der +Greiffläche, die vom Sauggreifer benötigt wird, angegeben werden. + +Im BoxPick-Modul entspricht der Greifpunkt dem Zentrum des +detektierten Rechtecks, wobei die Achslängen der Greiffläche durch +Länge und Breite des Rechtecks gegeben sind. Falls mehr als 15% der +Rechtecksfläche ungültige Datenpunkte enthält oder durch andere +Objekte verdeckt ist, wird dem Rechteck kein Greifpunkt zugeordnet. + +Jeder Greifpunkt enthält auch einen Qualitätswert ("quality"), der +einen Hinweis auf die Ebenheit der Greiffläche gibt. Dieser Wert +reicht von 0 bis 1, wobei höhere Werte für eine ebenere rekonstruierte +Oberfläche stehen. + +Jeder berechnete Greifpunkt lässt sich anhand einer "uuid" +(Universally Unique Identifier) eindeutig identifizieren und enthält +zusätzlich den Zeitstempel der ältesten Bildaufnahme, auf der die +Greifpunktberechnung durchgeführt wurde. + +Die Sortierung der Greifpunkte basiert auf der ausgewählten +Sortierstrategie. Folgende Sortierstrategien sind verfügbar und können +über die + +Web GUI + + oder über den "set_sorting_strategies" Service gesetzt werden: + +gravity: höchste Greifpunkte entlang der Gravitationsrichtung werden +zuerst zurückgeliefert. + +surface_area: Greifpunkte mit den größten Oberflächen werden zuerst +zurückgeliefert. + +direction: Greifpunkte mit dem kleinsten Abstand entlang der gesetzten +Richtung vector im angegebenen Referenzkoordinatensystem pose_frame +werden zuerst zurückgeliefert. + +Wenn keine Sortierstrategie gesetzt ist, oder die Standard- +Sortierstrategie in der Web GUI ausgewählt ist, geschieht die +Sortierung der Greifpunkte basierend auf einer Kombination von +"gravity" und "surface_area". + +Wechselwirkung mit anderen Modulen + +Die folgenden, intern auf dem + +rc_visard NG + + laufenden Module liefern Daten für das ItemPick- und BoxPick-Modul +oder haben Einfluss auf die Datenverarbeitung. + +Bemerkung: Jede Konfigurationsänderung dieser Module kann direkte + Auswirkungen auf die Qualität oder das Leistungsverhalten der + ItemPick- und Boxpick-Module haben. + +Stereokamera und Stereo-Matching + +Folgende Daten werden vom ItemPick- und BoxPick-Modul verarbeitet: + +die rektifizierten Bilder des Kamera-Moduls (rc_camera, Abschnitt +\ref{stereo_camera:sect-stereo-camera}) + +die Disparitäts-, Konfidenz- und Fehlerbilder des Stereo-Matching- +Moduls (rc_stereomatching, Abschnitt \ref{stereo_matching:sect-stereo- +matching}) + +Für alle genutzten Bilder ist garantiert, dass diese nach dem Auslösen +des Services aufgenommen wurden. + +IOControl und Projektor-Kontrolle + +Für den Anwendungsfall, dass der + +rc_visard NG + + zusammen mit einem externen Musterprojektor und dem Modul für + +IOControl und Projektor-Kontrolle + + ("rc_iocontrol") betrieben wird, wird empfohlen, den Projektor an +GPIO Out 1 anzuschließen und den Aufnahmemodus des Stereokamera-Moduls +auf "SingleFrameOut1" zu setzen (siehe + +Stereomatching-Parameter + +), damit bei jedem Aufnahme-Trigger ein Bild mit und ohne +Projektormuster aufgenommen wird. + +Alternativ kann der verwendete digitale Ausgang in den Betriebsmodus +"ExposureAlternateActive" geschaltet werden (siehe + +Beschreibung der Laufzeitparameter + +). + +In beiden Fällen sollte die Belichtungszeitregelung ("exp_auto_mode") +auf "AdaptiveOut1" gesetzt werden, um die Belichtung beider Bilder zu +optimieren (siehe + +Stereokamera-Parameter + +). + +Hand-Auge-Kalibrierung + +Falls die Kamera zu einem Roboter kalibriert wurde, können die +ItemPick- und BoxPick-Module automatisch Posen im +Roboterkoordinatensystem ausgeben. Für die + +Services + + kann das Koordinatensystem der berechneten Posen mit dem Argument +"pose_frame" spezifiziert werden. + +Zwei verschiedene Werte für "pose_frame" können gewählt werden: + +Kamera-Koordinatensystem (camera): Alle Posen sind im Kamera- +Koordinatensystem angegeben und es ist kein zusätzliches Wissen über +die Lage der Kamera in seiner Umgebung notwendig. Das bedeutet +insbesondere, dass sich ROIs oder Load Carrier, welche in diesem +Koordinatensystem angegeben sind, mit der Kamera bewegen. Es liegt +daher in der Verantwortung des Anwenders, in solchen Fällen die +entsprechenden Posen der Situation entsprechend zu aktualisieren +(beispielsweise für den Anwendungsfall einer robotergeführten Kamera). + +Benutzerdefiniertes externes Koordinatensystem (external): Alle Posen +sind im sogenannten externen Koordinatensystem angegeben, welches vom +Nutzer während der Hand-Auge-Kalibrierung gewählt wurde. In diesem +Fall bezieht das ItemPick- oder BoxPick-Modul alle notwendigen +Informationen über die Kameramontage und die kalibrierte Hand-Auge- +Transformation automatisch vom Modul Hand-Auge- +Kalibrierung\:(Abschnitt \ref{handeye_calibration:sect-handeye- +calibration}). Für den Fall einer robotergeführten Kamera ist vom +Nutzer zusätzlich die jeweils aktuelle Roboterpose robot_pose +anzugeben. + +Bemerkung: Wenn keine Hand-Auge-Kalibrierung durchgeführt wurde bzw. + zur Verfügung steht, muss als Referenzkoordinatensystem "pose_frame" + immer "camera" angegeben werden. + +Zulässige Werte zur Angabe des Referenzkoordinatensystems sind +"camera" und "external". Andere Werte werden als ungültig +zurückgewiesen. + +Für den Fall einer robotergeführten Kamera ist es abhängig von +"pose_frame" und der Sortierrichtung nötig, zusätzlich die aktuelle +Roboterpose ("robot_pose") zur Verfügung zu stellen: + +Wenn external als pose_frame ausgewählt ist, ist die Angabe der +Roboterpose obligatorisch. + +Wenn die Sortierrichtung in external definiert ist, ist die Angabe der +Roboterpose obligatorisch. + +In allen anderen Fällen ist die Angabe der Roboterpose optional. + +LoadCarrier + +Die ItemPick- und BoxPick-Module nutzen die Funktionalität zur Load +Carrier Erkennung aus dem + +LoadCarrier + + Modul ("rc_load_carrier") mit den Laufzeitparametern, die für dieses +Modul festgelegt wurden. Wenn sich jedoch mehrere Load Carrier in der +Szene befinden, die zu der angegebenen Load Carrier ID passen, wird +nur einer davon zurückgeliefert. In diesem Fall sollte eine 3D Region +of Interest gesetzt werden, um sicherzustellen, dass immer derselbe +Load Carrier für die ItemPick- und BoxPick-Module verwendet wird. + +CollisionCheck + +Die Kollisionsprüfung kann für die Greifpunktberechnung der ItemPick +und BoxPick Module aktiviert werden, indem die ID des benutzten +Greifers und optional ein Greif-Offset an den "compute_grasps" Service +übergeben werden. Der Greifer muss im GripperDB Modul definiert werden +(siehe + +Erstellen eines Greifers + +) und Details über die Kollisionsprüfung werden in + +Integrierte Kollisionsprüfung in anderen Modulen + + gegeben. + +Wenn die Kollisionsprüfung aktiviert ist, werden nur kollisionsfreie +Greifpunkte zurückgeliefert. Jedoch werden in den Visualisierungen auf +der + +BoxPick + +- und + +ItemPick + +-Seite der Web GUI kollidierende Greifpunkte als schwarze Ellipsen +dargestellt. + +Die Laufzeitparameter des CollisionCheck-Moduls beeinflussen die +Kollisionserkennung wie in + +CollisionCheck-Parameter + + beschrieben. + +Parameter + +Die ItemPick- und BoxPick-Module werden in der REST-API als +"rc_itempick" und "rc_boxpick" bezeichnet und in der + +Web GUI + + unter Module ‣ ItemPick und Module ‣ BoxPick dargestellt. Der +Benutzer kann die Parameter entweder dort oder über die + +REST-API-Schnittstelle + + ändern. + +Übersicht über die Parameter + +Diese Softwaremodule bieten folgende Laufzeitparameter: + +Anwendungsspezifische Laufzeitparameter der rc_itempick und rc_boxpick +Module Name Typ Min. Max. Default Beschreibung +max_grasps int32 1 20 5 Maximale Anzahl von bereitgestellten +Greifpunkten + +Laufzeitparameter der rc_itempick und rc_boxpick Module für das +Clustering-Verfahren Name Typ Min. Max. Default +Beschreibung cluster_max_dimension float64 0.05 0.8 0.3 Nur für +rc_itempick. Maximal erlaubter Durchmesser eines Clusters in Metern. +Cluster mit einem größeren Durchmesser werden nicht für die +Greifpunktberechnung berücksichtigt. cluster_max_curvature float64 +0.005 0.5 0.11 Maximal erlaubte Krümmung für Greifflächen +clustering_patch_size int32 3 10 4 Nur für rc_itempick. +Pixelgröße der Patches für die Unterteilung des Tiefenbildes im ersten +Clustering-Schritt clustering_max_surface_rmse float64 0.0005 0.01 +0.004 Maximal erlaubte Abweichung (Root Mean Square Error, RMSE) von +Punkten zur Greiffläche in Metern clustering_discontinuity_factor +float64 0.1 5.0 1.0 Erlaubte Unebenheit von Greifflächen + +Laufzeitparameter des rc_boxpick Moduls für die Rechteckerkennung +Name Typ Min. Max. Default Beschreibung mode string - - +Unconstrained Modus der Rechteckerkennung: [Unconstrained, +PackedGridLayout, PackedLayers] manual_line_sensitivity bool false +true false Gibt an, ob die benutzerdefinierte Linienempfindlichkeit +oder die automatische genutzt werden soll line_sensitivity float64 +0.1 1.0 0.1 Empfindlichkeit des Liniendetektors prefer_splits +bool false true false Gibt an, ob Rechtecke in kleinere Rechtecke +gesplittet werden sollen, falls möglich min_cluster_coverage float64 +0.0 0.99 0.0 Bestimmt den minimalen Anteil an Punkten pro Cluster, +die durch Detektionen abgedeckt sein müssen + +Beschreibung der Laufzeitparameter + +Die Laufzeitparameter werden zeilenweise auf den + +ItemPick + +- bzw. + +BoxPick + +-Seiten in der Web GUI dargestellt. Im folgenden wird der Name des +Parameters in der Web GUI in Klammern hinter dem eigentlichen +Parameternamen angegeben. Die Parameter sind in derselben Reihenfolge +wie in der Web GUI aufgelistet: + +max_grasps (Anzahl Greifpunkte) + + ist die maximale Anzahl von bereitgestellten Greifpunkten. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes//parameters/parameters?max_grasps= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes//parameters?max_grasps= + +cluster_max_dimension (Nur für ItemPick, Maximale Größe) + + is the maximum allowed diameter for a cluster in meters. + Clusters with a diameter larger than this value are not used for + grasp computation. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_itempick/parameters/parameters?cluster_max_dimension= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_itempick/parameters?cluster_max_dimension= + +cluster_max_curvature (Maximale Krümmung) + + ist die maximal erlaubte Krümmung für Greifflächen. Je kleiner + dieser Wert ist, desto mehr mögliche Greifflächen werden in + kleinere Flächen mit weniger Krümmung aufgeteilt. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes//parameters/parameters?cluster_max_curvature= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes//parameters?cluster_max_curvature= + +clustering_patch_size (Nur für ItemPick, Patchgröße) + + ist die Pixelgröße der Patches für die Unterteilung des + Tiefenbildes im ersten Clustering-Schritt. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_itempick/parameters/parameters?clustering_patch_size= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_itempick/parameters?clustering_patch_size= + +clustering_discontinuity_factor (Unstetigkeitsfaktor) + + beschreibt die erlaubte Unebenheit von Greifflächen. Je kleiner + dieser Wert ist, umso mehr werden mögliche Greifflächen in + kleinere Flächen mit weniger Unebenheiten aufgeteilt. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes//parameters/parameters?clustering_discontinuity_factor= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes//parameters?clustering_discontinuity_factor= + +clustering_max_surface_rmse (Maximaler RMSE) + + ist die maximal erlaubte Abweichung (Root Mean Square Error, + RMSE) von Punkten zur Greiffläche in Metern. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes//parameters/parameters?clustering_max_surface_rmse= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes//parameters?clustering_max_surface_rmse= + +mode (Nur für BoxPick, Modus) + + legt den Modus der Rechteckerkennung fest. Mögliche Werte sind + "Unconstrained" ( + + Unbeschränkt + + ), "PackedGridLayout" ( + + Dichtes Gitterlayout + + ) und "PackedLayer" ( + + Dicht geschichtet + + ). Im Modus "PackedGridLayout" werden Rechtecke eines Clusters + in einem dichten Gittermuster erkannt. Im Modus "PackedLayers" + wird angenommen, dass die Boxen Schichten (Layer) bilden, und + die Erkennung der Boxen startet an den Ecken des Clusters. + Dieser Modus sollte für Depalettierszenarien genutzt werden. Im + Modus "Unconstrained" (Standardwert) werden Rechtecke unabhängig + von ihren relativen Positionen zueinander und ihren Positionen + im Cluster erkannt. + + Abb. 27 + + zeigt die Modi für verschiedene Szenarien. + + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_boxpick/parameters/parameters?mode= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_boxpick/parameters?mode= + +manual_line_sensitivity (Nur für BoxPick, Manuelle +Linienempfindlichkeit) + + legt fest, ob die benutzerdefinierte Linienempfindlichkeit für + die Liniendetektion zur Rechteckerkennung verwendet werden soll. + Wenn dieser Parameter auf true gesetzt ist, wird der + benutzerdefinierte Wert in "line_sensitivity" + (Linienempfindlichkeit) zur Detektion verwendet, andernfalls + wird die Linienempfindlichkeit automatisch ermittelt. Dieser + Parameter sollte auf true gesetzt werden, wenn die automatische + Linienempfindlichkeit nicht genügend Linien an den Rändern der + Boxen liefert, sodass Boxen nicht erkannt werden. Die + detektierten Linien werden in der "Zwischenergebnis" + Visualisierung auf der + + BoxPick + + Seite in der Web GUI angezeigt. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_boxpick/parameters/parameters?manual_line_sensitivity= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_boxpick/parameters?manual_line_sensitivity= + +line_sensitivity (Nur für BoxPick, Linienempfindlichkeit) + + legt die Empfindlichkeit für die Detektion von Linien für die + Rechteckerkennung fest, wenn der Parameter + "manual_line_sensitivity" (Manuelle Linienempfindlichkeit) auf + true gesetzt ist. Andernfalls hat dieser Parameter keinen + Einfluss auf die Rechteckerkennung. Höhere Werte liefern mehr + Liniensegmente, aber erhöhen auch die Laufzeit der Detektion. + Dieser Parameter sollte erhöht werden, wenn Boxen nicht erkannt + werden können, weil ihre Ränder nicht als Linien detektiert + werden. Die erkannten Linien werden in der "Zwischenergebnis" + Visualisierung auf der + + BoxPick + + Seite in der Web GUI angezeigt. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_boxpick/parameters/parameters?line_sensitivity= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_boxpick/parameters?line_sensitivity= + +prefer_splits (Nur für BoxPick, Splitting bevorzugen) + + bestimmt, ob Rechtecke in kleinere Rechtecke aufgesplittet + werden, falls die kleineren Rechtecke ebenfalls den angegebenen + Objektmodellen entsprechen. Dieser Parameter sollte auf true + gesetzt werden, wenn Boxen dicht beieinander liegen, und die + Objektmodelle auch zu einem Rechteck der Größe von zwei + angrenzenden Boxen passen. Wenn dieser Parameter auf false + steht, werden in solch einem Fall die Rechtecke bevorzugt, die + sich aus zwei angrenzenden Boxen ergeben. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_boxpick/parameters/parameters?prefer_splits= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_boxpick/parameters?prefer_splits= + +min_cluster_coverage (Nur für BoxPick, Minimale Clusterabdeckung) + + bestimmt den Anteil von Punkten in jedem segmentierten Cluster, + der durch Rechtecksdetektionen abgedeckt sein muss, um diese + Detektionen als valide anzunehmen. Wird die minimale + Clusterabdeckung unterschritten, werden für das jeweilige + Cluster keine Detektionen zurückgeliefert und eine Warnung + ausgegeben. Dieser Parameter sollte genutzt werden, um in einem + Depalettierszenario zu verifizieren, dass alle Objekte in einem + Layer detektiert wurden. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_boxpick/parameters/parameters?min_cluster_coverage= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_boxpick/parameters?min_cluster_coverage= + +Statuswerte + +Statuswerte der "rc_itempick" und "rc_boxpick" Module: + +Statuswerte der rc_itempick und rc_boxpick Module Name +Beschreibung data_acquisition_time Zeit in Sekunden, für die beim +letzten Aufruf auf Bilddaten gewartet werden musste. +grasp_computation_time Laufzeit für die Greifpunktberechnung beim +letzten Aufruf in Sekunden last_timestamp_processed Zeitstempel des +letzten verarbeiteten Bilddatensatzes load_carrier_detection_time +Laufzeit für die letzte Load Carrier Erkennung in Sekunden +processing_time Laufzeit für die letzte Erkennung (einschließlich +Load Carrier Detektion) in Sekunden state Aktueller Zustand des +ItemPick- bzw. BoxPick-Moduls + +Folgende "state"-Werte werden gemeldet. + +Mögliche Werte für den Zustand der ItemPick und BoxPick Module +Zustand Beschreibung IDLE Das Modul ist inaktiv. RUNNING Das +Modul wurde gestartet und ist bereit, Load Carrier zu erkennen und +Greifpunkte zu berechnen. FATAL Ein schwerwiegender Fehler ist +aufgetreten. + +Services + +Die angebotenen Services von "rc_itempick" bzw. "rc_boxpick" können +mithilfe der + +REST-API-Schnittstelle + + oder der + +rc_visard NG + + +Web GUI + + ausprobiert und getestet werden. + +Das ItemPick- bzw. BoxPick-Modul stellt folgende Services zur +Verfügung. + +detect_items (nur BoxPick) + + löst die Erkennung von Rechtecken aus, wie in + + Erkennung von Rechtecken (BoxPick) + + beschrieben. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_boxpick/services/detect_items + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_boxpick/services/detect_items + + Request + + Obligatorische Serviceargumente: + + "pose_frame": siehe + + Hand-Auge-Kalibrierung + + . + + "item_models": Liste der zu erkennenden Objektmodelle. Der Typ + "type" der Modelle muss immer "RECTANGLE" oder "TEXTURED_BOX" + sein. Für den Typ "RECTANGLE" muss das Feld "rectangle" gefüllt + werden, wohingegen für "TEXTURED_BOX" das Feld "textured_box" + angegeben werden muss. Siehe + + Erkennung von Rechtecken (BoxPick) + + für eine ausführliche Beschreibung der Objektmodelle. + + Möglicherweise benötigte Serviceargumente: + + "robot_pose": siehe + + Hand-Auge-Kalibrierung + + . + + Optionale Serviceargumente: + + "load_carrier_id": ID des Load Carriers, welcher die zu + erkennenden Objekte enthält. + + "load_carrier_compartment": Teilvolumen (Fach oder Abteil) in + einem zu detektierenden Load Carrier (Behälter), in dem Objekte + erkannt werden sollen (siehe + + Load Carrier Abteile + + ). + + "region_of_interest_id": Falls "load_carrier_id" gesetzt ist, + die ID der 3D Region of Interest, innerhalb welcher nach dem + Load Carrier gesucht wird. Andernfalls die ID der 3D Region of + Interest, in der nach Objekten gesucht wird. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "item_models": [ + { + "rectangle": { + "max_dimensions": { + "x": "float64", + "y": "float64" + }, + "min_dimensions": { + "x": "float64", + "y": "float64" + } + }, + "textured_box": { + "dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "dimensions_tolerance_m": "float64", + "max_deformation_m": "float64", + "template_id": "string" + }, + "type": "string" + } + ], + "load_carrier_compartment": { + "box": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + } + }, + "load_carrier_id": "string", + "pose_frame": "string", + "region_of_interest_id": "string", + "robot_pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + } + } + } + + Response + + "load_carriers": Liste der erkannten Load Carrier (Behälter). + + "items": Liste von erkannten Rechtecken. + + "timestamp": Zeitstempel des Bildes, auf dem die Erkennung + durchgeführt wurde. + + "return_code": enthält mögliche Warnungen oder Fehlercodes und + Nachrichten. + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "detect_items", + "response": { + "items": [ + { + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "rectangle": { + "x": "float64", + "y": "float64" + }, + "template_id": "string", + "timestamp": { + "nsec": "int32", + "sec": "int32" + }, + "type": "string", + "uuid": "string", + "view_pose_set": "bool", + "view_uuid": "string" + } + ], + "load_carriers": [ + { + "height_open_side": "float64", + "id": "string", + "inner_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "outer_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "overfilled": "bool", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "rim_ledge": { + "x": "float64", + "y": "float64" + }, + "rim_step_height": "float64", + "rim_thickness": { + "x": "float64", + "y": "float64" + }, + "type": "string" + } + ], + "return_code": { + "message": "string", + "value": "int16" + }, + "timestamp": { + "nsec": "int32", + "sec": "int32" + } + } + } + +compute_grasps (für ItemPick) + + löst die Erkennung von Greifpunkten für einen Sauggreifer aus, wie + in + + Berechnung der Greifpunkte + + beschrieben. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_itempick/services/compute_grasps + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_itempick/services/compute_grasps + + Request + + Obligatorische Serviceargumente: + + "pose_frame": siehe + + Hand-Auge-Kalibrierung + + . + + "suction_surface_length": Länge der Greiffläche des verwendeten + Vakuum-Greifsystems. + + "suction_surface_width": Breite der Greiffläche des verwendeten + Vakuum-Greifsystems. + + Möglicherweise benötigte Serviceargumente: + + "robot_pose": siehe + + Hand-Auge-Kalibrierung + + . + + Optionale Serviceargumente: + + "load_carrier_id": ID des Load Carriers, welcher die zu + greifenden Objekte enthält. + + "load_carrier_compartment": Teilvolumen (Fach oder Abteil) in + einem zu detektierenden Load Carrier (Behälter), in dem Objekte + erkannt werden sollen (siehe + + Load Carrier Abteile + + ). + + "region_of_interest_id": Falls "load_carrier_id" gesetzt ist, + die ID der 3D Region of Interest, innerhalb welcher nach dem + Load Carrier gesucht wird. Andernfalls die ID der 3D Region of + Interest, innerhalb der Greifpunkte berechnet werden. + + "item_models": Liste von unbekannten Objekten mit minimaler und + maximaler Größe, wobei die minimale Größe kleiner als die + maximale Größe sein muss. Nur ein Objekt "item_model" vom Typ + "UNKNOWN" wird aktuell unterstützt. + + "collision_detection": siehe + + Integrierte Kollisionsprüfung in anderen Modulen + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "collision_detection": { + "gripper_id": "string", + "pre_grasp_offset": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "item_models": [ + { + "type": "string", + "unknown": { + "max_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "min_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + } + } + } + ], + "load_carrier_compartment": { + "box": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + } + }, + "load_carrier_id": "string", + "pose_frame": "string", + "region_of_interest_id": "string", + "robot_pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "suction_surface_length": "float64", + "suction_surface_width": "float64" + } + } + + Response + + "load_carriers": Liste der erkannten Load Carrier (Behälter). + + "grasps": sortierte Liste von Sauggreifpunkten. + + "timestamp": Zeitstempel des Bildes, auf dem die Erkennung + durchgeführt wurde. + + "return_code": enthält mögliche Warnungen oder Fehlercodes und + Nachrichten. + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "compute_grasps", + "response": { + "grasps": [ + { + "item_uuid": "string", + "max_suction_surface_length": "float64", + "max_suction_surface_width": "float64", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "quality": "float64", + "timestamp": { + "nsec": "int32", + "sec": "int32" + }, + "type": "string", + "uuid": "string" + } + ], + "load_carriers": [ + { + "height_open_side": "float64", + "id": "string", + "inner_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "outer_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "overfilled": "bool", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "rim_ledge": { + "x": "float64", + "y": "float64" + }, + "rim_step_height": "float64", + "rim_thickness": { + "x": "float64", + "y": "float64" + }, + "type": "string" + } + ], + "return_code": { + "message": "string", + "value": "int16" + }, + "timestamp": { + "nsec": "int32", + "sec": "int32" + } + } + } + +compute_grasps (für BoxPick) + + löst die Erkennung von Rechtecken und Berechnung von Greifposen für + diese Rechtecke aus, wie in + + Berechnung der Greifpunkte + + beschrieben. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_boxpick/services/compute_grasps + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_boxpick/services/compute_grasps + + Request + + Obligatorische Serviceargumente: + + "pose_frame": siehe + + Hand-Auge-Kalibrierung + + . + + "item_models": Liste der zu erkennenden Objektmodelle. Der Typ + "type" der Modelle muss immer "RECTANGLE" oder "TEXTURED_BOX" + sein. Für den Typ "RECTANGLE" muss das Feld "rectangle" gefüllt + werden, wohingegen für "TEXTURED_BOX" das Feld "textured_box" + angegeben werden muss. Siehe + + Erkennung von Rechtecken (BoxPick) + + für eine ausführliche Beschreibung der Objektmodelle. + + "suction_surface_length": Länge der Greiffläche des verwendeten + Vakuum-Greifsystems. + + "suction_surface_width": Breite der Greiffläche des verwendeten + Vakuum-Greifsystems. + + Möglicherweise benötigte Serviceargumente: + + "robot_pose": siehe + + Hand-Auge-Kalibrierung + + . + + Optionale Serviceargumente: + + "load_carrier_id": ID des Load Carriers, welcher die zu + greifenden Objekte enthält. + + "load_carrier_compartment": Teilvolumen (Fach oder Abteil) in + einem zu detektierenden Load Carrier (Behälter), in dem Objekte + erkannt werden sollen (siehe + + Load Carrier Abteile + + ). + + "region_of_interest_id": Falls "load_carrier_id" gesetzt ist, + die ID der 3D Region of Interest, innerhalb welcher nach dem + Load Carrier gesucht wird. Andernfalls die ID der 3D Region of + Interest, innerhalb der Greifpunkte berechnet werden. + + "collision_detection": siehe + + Integrierte Kollisionsprüfung in anderen Modulen + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "collision_detection": { + "gripper_id": "string", + "pre_grasp_offset": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "item_models": [ + { + "rectangle": { + "max_dimensions": { + "x": "float64", + "y": "float64" + }, + "min_dimensions": { + "x": "float64", + "y": "float64" + } + }, + "textured_box": { + "dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "dimensions_tolerance_m": "float64", + "max_deformation_m": "float64", + "template_id": "string" + }, + "type": "string" + } + ], + "load_carrier_compartment": { + "box": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + } + }, + "load_carrier_id": "string", + "pose_frame": "string", + "region_of_interest_id": "string", + "robot_pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "suction_surface_length": "float64", + "suction_surface_width": "float64" + } + } + + Response + + "load_carriers": Liste der erkannten Load Carrier (Behälter). + + "items": Liste von erkannten Rechtecken. + + "grasps": sortierte Liste von Sauggreifpunkten. + + "timestamp": Zeitstempel des Bildes, auf dem die Erkennung + durchgeführt wurde. + + "return_code": enthält mögliche Warnungen oder Fehlercodes und + Nachrichten. + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "compute_grasps", + "response": { + "grasps": [ + { + "item_uuid": "string", + "max_suction_surface_length": "float64", + "max_suction_surface_width": "float64", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "quality": "float64", + "timestamp": { + "nsec": "int32", + "sec": "int32" + }, + "type": "string", + "uuid": "string" + } + ], + "items": [ + { + "grasp_uuids": [ + "string" + ], + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "rectangle": { + "x": "float64", + "y": "float64" + }, + "template_id": "string", + "timestamp": { + "nsec": "int32", + "sec": "int32" + }, + "type": "string", + "uuid": "string", + "view_pose_set": "bool", + "view_uuid": "string" + } + ], + "load_carriers": [ + { + "height_open_side": "float64", + "id": "string", + "inner_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "outer_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "overfilled": "bool", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "rim_ledge": { + "x": "float64", + "y": "float64" + }, + "rim_step_height": "float64", + "rim_thickness": { + "x": "float64", + "y": "float64" + }, + "type": "string" + } + ], + "return_code": { + "message": "string", + "value": "int16" + }, + "timestamp": { + "nsec": "int32", + "sec": "int32" + } + } + } + +set_sorting_strategies + + speichert die gewählte Strategie zur Sortierung der Greifpunkte, + die vom "compute_grasps" Service zurückgeliefert werden (siehe + + Berechnung der Greifpunkte + + ). + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes//services/set_sorting_strategies + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes//services/set_sorting_strategies + + Request + + Nur eine Sortierstrategie darf einen Gewichtswert "weight" größer + als 0 haben. Wenn alle Werte für "weight" auf 0 gesetzt sind, wird + die Standardsortierstrategie verwendet. + + Wenn der Wert "weight" für "direction" gesetzt ist, muss "vector" + den Richtungsvektor enthalten und "pose_frame" auf "camera" oder + "external" gesetzt sein. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "direction": { + "pose_frame": "string", + "vector": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "weight": "float64" + }, + "gravity": { + "weight": "float64" + }, + "surface_area": { + "weight": "float64" + } + } + } + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "set_sorting_strategies", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +get_sorting_strategies + + gibt die gewählte Sortierstrategie zurück, die zur Sortierung der + vom "compute-grasps" Service zurückgelieferten Greifpunkte + verwendet wird (siehe + + Berechnung der Greifpunkte + + ). + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes//services/get_sorting_strategies + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes//services/get_sorting_strategies + + Request + + Dieser Service hat keine Argumente. + + Response + + Wenn alle Werte für "weight" 0 sind, wird die + Standardsortierstrategie verwendet. + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "get_sorting_strategies", + "response": { + "direction": { + "pose_frame": "string", + "vector": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "weight": "float64" + }, + "gravity": { + "weight": "float64" + }, + "return_code": { + "message": "string", + "value": "int16" + }, + "surface_area": { + "weight": "float64" + } + } + } + +start + + startet das Modul und versetzt es in den Zustand "RUNNING". + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes//services/start + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes//services/start + + Request + + Dieser Service hat keine Argumente. + + Response + + Es kann vorkommen, dass der Zustandsübergang noch nicht vollständig + abgeschlossen ist, wenn die Serviceantwort generiert wird. In + diesem Fall liefert diese den entsprechenden, sich von "IDLE" + unterscheidenden Zustand zurück. + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "start", + "response": { + "accepted": "bool", + "current_state": "string" + } + } + +stop + + stoppt das Modul und versetzt es in den Zustand "IDLE". + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes//services/stop + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes//services/stop + + Request + + Dieser Service hat keine Argumente. + + Response + + Es kann vorkommen, dass der Zustandsübergang noch nicht vollständig + abgeschlossen ist, wenn die Serviceantwort generiert wird. In + diesem Fall liefert diese den entsprechenden, sich von "IDLE" + unterscheidenden Zustand zurück. + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "stop", + "response": { + "accepted": "bool", + "current_state": "string" + } + } + +reset_defaults + + stellt die Werkseinstellungen der Parameter und der + Sortierstrategie dieses Moduls wieder her und wendet sie an + („factory reset“). + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes//services/reset_defaults + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes//services/reset_defaults + + Request + + Dieser Service hat keine Argumente. + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "reset_defaults", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +set_region_of_interest (veraltet) + + speichert eine 3D Region of Interest auf dem + + rc_visard NG + + . + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie + stattdessen + + set_region_of_interest + + in "rc_roi_db". + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes//services/set_region_of_interest + +get_regions_of_interest (veraltet) + + gibt die mit "region_of_interest_ids" spezifizierten, gespeicherten + 3D Regions of Interest zurück. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie + stattdessen + + get_regions_of_interest + + in "rc_roi_db". + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes//services/get_regions_of_interest + +delete_regions_of_interest (veraltet) + + löscht die mit "region_of_interest_ids" spezifizierten, + gespeicherten 3D Regions of Interest. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie + stattdessen + + delete_regions_of_interest + + in "rc_roi_db". + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes//services/delete_regions_of_interest + +Rückgabecodes + +Zusätzlich zur eigentlichen Serviceantwort gibt jeder Service einen +sogenannten "return_code" bestehend aus einem Integer-Wert und einer +optionalen Textnachricht zurück. Erfolgreiche Service-Anfragen werden +mit einem Wert von "0" quittiert. Positive Werte bedeuten, dass die +Service-Anfrage zwar erfolgreich bearbeitet wurde, aber zusätzliche +Informationen zur Verfügung stehen. Negative Werte bedeuten, dass +Fehler aufgetreten sind. Für den Fall, dass mehrere Rückgabewerte +zutreffend wären, wird der kleinste zurückgegeben, und die +entsprechenden Textnachrichten werden in "return_code.message" +akkumuliert. + +Die folgende Tabelle listet die möglichen Rückgabe-Codes auf: + +Rückgabecodes der Services des ItemPick- bzw. BoxPick-Moduls Code +Beschreibung 0 Erfolgreich -1 Ungültige(s) Argument(e) -3 Ein +interner Timeout ist aufgetreten, beispielsweise während der +Boxerkennung, wenn der Bereich der angegebenen Abmessungen zu groß +ist. -4 Die maximal erlaubte Zeitspanne für die interne Akquise der +Bilddaten wurde überschritten. -8 Das Template wurde während der +Detektion gelöscht. -10 Das neue Element konnte nicht hinzugefügt +werden, da die maximal speicherbare Anzahl an Load Carriern, ROIs oder +Templates überschritten wurde. -11 Sensor nicht verbunden, nicht +unterstützt oder nicht bereit -200 Ein schwerwiegender interner +Fehler ist aufgetreten. -301 Für die Anfrage zur +Greifpunktberechnung compute_grasps wurden mehrere Objektmodelle +(item_models) vom Typ UNKNOWN übergeben. 10 Die maximal speicherbare +Anzahl an Load Carriern, ROIs oder Templates wurde erreicht. 11 Mit +dem Aufruf von set_load_carrier oder set_region_of_interest wurde ein +bereits existierendes Objekt mit derselben id überschrieben. 100 Die +angefragten Load Carrier wurden in der Szene nicht gefunden. 101 Es +wurden keine gültigen Greifflächen in der Szene gefunden. 102 Der +detektierte Load Carrier ist leer. 103 Alle berechneten Greifpunkte +sind in Kollision mit dem Load Carrier. 112 Die Detektionen eines +oder mehrerer Cluster wurden verworfen, da die minimale +Clusterabdeckung nicht erreicht wurde. 300 Ein gültiges robot_pose- +Argument wurde angegeben, ist aber nicht erforderlich. 999 +Zusätzliche Hinweise für die Anwendungsentwicklung + +BoxPick Template API" + +BoxPick Templates sind nur mit der + +Textur + +-Erweiterung von BoxPick verfügbar. Für den Upload, Download, das +Auflisten und Löschen von Templates werden spezielle REST-API- +Endpunkte zur Verfügung gestellt. Templates können auch über die Web +GUI hoch- und runtergeladen werden. Die Templates beinhalten die +Greifpunkte und Posenvorgaben, falls Greifpunkte oder Posenvorgaben +konfiguriert wurden. Bis zu 50 Templates können gleichzeitig auf dem + +rc_visard NG + + gespeichert werden. + +GET /templates/rc_boxpick + + listet alle rc_cadmatch-Templates auf. + + Musteranfrage + + GET /api/v2/templates/rc_boxpick HTTP/1.1 + + Musterantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + [ + { + "id": "string" + } + ] + + Antwort-Header: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabewert: Array der + Templates) + + 404 Not Found -- Modul nicht gefunden + + Referenzierte Datenmodelle: + Template\:(Abschnitt \ref{rest_api_datamodel:sect-rest- + datamodel-template}) + +GET /templates/rc_boxpick/{id} + + ruft ein rc_boxpick-Template ab. Falls der angefragte Content-Typ + application/octet-stream ist, wird das Template als Datei + zurückgegeben. + + Musteranfrage + + GET /api/v2/templates/rc_boxpick/ HTTP/1.1 + + Musterantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "id": "string" + } + + Parameter: + id (string) -- ID des Templates (obligatorisch) + + Antwort-Header: + Content-Type -- application/json application/ubjson application + /octet-stream + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabewert: Template) + + 404 Not Found -- Modul oder Template wurden nicht gefunden. + + Referenzierte Datenmodelle: + Template\:(Abschnitt \ref{rest_api_datamodel:sect-rest- + datamodel-template}) + +PUT /templates/rc_boxpick/{id} + + erstellt oder aktualisiert ein rc_boxpick-Template. + + Musteranfrage + + PUT /api/v2/templates/rc_boxpick/ HTTP/1.1 + Accept: multipart/form-data application/json + + Musterantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "id": "string" + } + + Parameter: + id (string) -- ID des Templates (obligatorisch) + + Formularparameter: + file -- Template-Datei (obligatorisch) + + Anfrage-Header: + Accept -- multipart/form-data application/json + + Antwort-Header: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabewert: Template) + + 400 Bad Request -- Template ist ungültig oder die maximale Zahl + an Templates wurde erreicht. + + 403 Forbidden -- Verboten, z.B. weil keine gültige Lizenz für + das CADMatch-Modul vorliegt. + + 404 Not Found -- Modul oder Template wurden nicht gefunden. + + 413 Request Entity Too Large -- Template ist zu groß. + + Referenzierte Datenmodelle: + Template\:(Abschnitt \ref{rest_api_datamodel:sect-rest- + datamodel-template}) + +DELETE /templates/rc_boxpick/{id} + + entfernt ein rc_boxpick-Template. + + Musteranfrage + + DELETE /api/v2/templates/rc_boxpick/ HTTP/1.1 + Accept: application/json application/ubjson + + Parameter: + id (string) -- ID des Templates (obligatorisch) + + Anfrage-Header: + Accept -- application/json application/ubjson + + Antwort-Header: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung + + 403 Forbidden -- Verboten, z.B. weil keine gültige Lizenz für + das CADMatch-Modul vorliegt. + + 404 Not Found -- Modul oder Template wurden nicht gefunden. diff --git a/v24.04/de/_sources/loadcarrier.rst.txt b/v24.04/de/_sources/loadcarrier.rst.txt new file mode 100644 index 0000000..b6f4979 --- /dev/null +++ b/v24.04/de/_sources/loadcarrier.rst.txt @@ -0,0 +1,1038 @@ +LoadCarrier + +Einleitung + +Das LoadCarrier Modul ermöglicht die Erkennung von Load Carriern, was +oftmals der erste Schritt für die Erkennung von Objekten oder +Berechnung von Greifpunkten in einem Behälter ist. Die Modelle der zu +erkennenden Load Carrier müssen im + +LoadCarrierDB + + Modul definiert werden. + +Das LoadCarrier Modul ist ein optionales Modul, welches intern auf dem + +rc_visard NG + + läuft, und ist freigeschaltet, sobald eine gültige Lizenz für eines +der Module + +ItemPick und BoxPick + + oder + +SilhouetteMatch + + vorhanden ist. Andernfalls benötigt es eine gesonderte LoadCarrier + +Lizenz + +, welche erworben werden muss. + +Erkennung von Load Carriern + +Der Algorithmus zur Erkennung von Load Carriern detektiert Load +Carrier, die einem speziellen Load Carrier Modell entsprechen, welches +im + +LoadCarrierDB + + Modul definiert werden muss. Das Load Carrier Modell wird über seine +ID referenziert, die bei der Load Carrier Detektion übergeben wird. +Die Erkennung von Load Carriern basiert auf der Erkennung des +rechteckigen Load Carrier Rands. Dazu werden detektierte Linien im +linken Kamerabild und die Tiefenwerte des Load Carrier Randes genutzt. +Daher sollte der Rand einen Kontrast zum Hintergrund bilden und das +Disparitätsbild auf dem Rand dicht sein. + +Wenn mehrere Load Carrier mit der angegeben Load Carrier ID in der +Szene sichtbar sind, werden alle von ihnen detektiert und +zurückgeliefert. + +Standardmäßig, wenn "assume_gravity_aligned" aktiv ist und +Gravitationsmessungen verfügbar sind, wird nach Load Carriern gesucht, +deren Randebene senkrecht zur gemessenen Gravitationsrichtung +ausgerichtet ist. Um geneigte Load Carrier zu erkennen, muss +"assume_gravity_aligned" deaktiviert werden oder deren ungefähre +Orientierung als Pose "pose" in einem Referenzkoordinatensystem +"pose_frame" angegeben werden, und der Posentyp "pose_type" auf +"ORIENTATION_PRIOR" gesetzt werden. + +Load Carrier können höchstens bis zu einer Entfernung von 3 Metern von +der Kamera erkannt werden. + +Wenn eine 3D Region of Interest (siehe + +RoiDB + +) genutzt wird, um das Volumen für die Load Carrier Erkennung +einzuschränken, müssen nur die Ränder der Load Carrier vollständig in +der Region of Interest enthalten sein. + +Die Erkennung liefert die Posen der Load Carrier Koordinatensysteme +(siehe + +Load Carrier Definition + +) im gewünschten Referenzkoordinatensystem zurück. + +Bei der Erkennung wird auch ermittelt, ob die Load Carrier überfüllt +("overfilled") sind, was bedeutet, dass Objekte aus dem Load Carrier +herausragen. + + +Füllstandserkennung + +Das LoadCarrier Modul bietet den Service "detect_filling_level" an, um +den Füllstand aller erkannten Load Carrier zu berechnen. + +Dazu werden die Load Carrier in eine konfigurierbare Anzahl von Zellen +unterteilt, welche in einem 2D-Raster angeordnet sind. Die maximale +Anzahl der Zellen beträgt 10x10. Für jede Zelle werden folgende Werte +ermittelt: + +level_in_percent: Minimum, Maximum und Mittelwert des Füllstands vom +Boden in Prozent. Diese Werte können größer als 100% sein, falls die +Zelle überfüllt ist. + +level_free_in_meters: Minimum, Maximum und Mittelwert in Metern des +freien Teils der Zelle vom Rand des Load Carriers gemessen. Diese +Werte können negativ sein, falls die Zelle überfüllt ist. + +cell_size: Abmessungen der 2D-Zelle in Metern. + +cell_position: Position des Mittelpunkts der Zelle in Metern (entweder +im Koordinatensystem camera oder external, siehe Hand-Auge- +Kalibrierung, Abschnitt \ref{itempick:sect-itempick-hand-eye-dep}). +Die z-Koordinate liegt auf der Ebene des Load Carrier Randes. + +coverage: Anteil der gültigen Pixel in dieser Zelle. Dieser Wert +reicht von 0 bis 1 in Schritten von 0.1. Ein niedriger Wert besagt, +dass die Zelle fehlende Daten beinhaltet (d.h. nur wenige Punkte +konnten in der Zelle gemessen werden). + +Diese Werte werden auch für den gesamten Load Carrier berechnet. Falls +keine Zellunterteilung angegeben ist, wird nur der Gesamtfüllstand +("overall_filling_level") berechnet. + + +Wechselwirkung mit anderen Modulen + +Die folgenden, intern auf dem + +rc_visard NG + + laufenden Module liefern Daten für das LoadCarrier Modul oder haben +Einfluss auf die Datenverarbeitung. + +Bemerkung: Jede Konfigurationsänderung dieser Module kann direkte + Auswirkungen auf die Qualität oder das Leistungsverhalten des + LoadCarrier Moduls haben. + +Stereokamera und Stereo-Matching + +Folgende Daten werden vom LoadCarrier Modul verarbeitet: + +Die rektifizierten Bilder des Kamera-Moduls (rc_camera, Abschnitt +\ref{stereo_camera:sect-stereo-camera}); + +Die Disparitäts-, Konfidenz- und Fehlerbilder des Stereo-Matching- +Moduls (rc_stereomatching, Abschnitt \ref{stereo_matching:sect-stereo- +matching}). + +Für alle genutzten Bilder ist garantiert, dass diese nach dem Auslösen +des Services aufgenommen wurden. + +IOControl und Projektor-Kontrolle + +Für den Anwendungsfall, dass der + +rc_visard NG + + zusammen mit einem externen Musterprojektor und dem Modul für + +IOControl und Projektor-Kontrolle + + ("rc_iocontrol") betrieben wird, wird empfohlen, den Projektor an +GPIO Out 1 anzuschließen und den Aufnahmemodus des Stereokamera-Moduls +auf "SingleFrameOut1" zu setzen (siehe + +Stereomatching-Parameter + +, damit bei jedem Aufnahme-Trigger ein Bild mit und ohne +Projektormuster aufgenommen wird. + +Alternativ kann der verwendete digitale Ausgang in den Betriebsmodus +"ExposureAlternateActive" geschaltet werden (siehe + +Beschreibung der Laufzeitparameter + +). + +In beiden Fällen sollte die Belichtungszeitregelung ("exp_auto_mode") +auf "AdaptiveOut1" gesetzt werden, um die Belichtung beider Bilder zu +optimieren (siehe + +Stereokamera-Parameter + +. + +Darüber hinaus sind keine weiteren Änderungen für diesen +Anwendungsfall notwendig. + +Hand-Auge-Kalibrierung + +Falls die Kamera zu einem Roboter kalibriert wurde, kann die Load +Carrier Komponente automatisch Posen im Roboterkoordinatensystem +ausgeben. Für die + +Services + + kann das Koordinatensystem der berechneten Posen mit dem Argument +"pose_frame" spezifiziert werden. + +Zwei verschiedene Werte für "pose_frame" können gewählt werden: + +Kamera-Koordinatensystem (camera): Alle Posen sind im Kamera- +Koordinatensystem angegeben und es ist kein zusätzliches Wissen über +die Lage der Kamera in seiner Umgebung notwendig. Das bedeutet +insbesondere, dass sich Load Carrier, welche in diesem +Koordinatensystem angegeben sind, mit der Kamera bewegen. Es liegt +daher in der Verantwortung des Anwenders, in solchen Fällen die +entsprechenden Posen der Situation entsprechend zu aktualisieren +(beispielsweise für den Anwendungsfall einer robotergeführten Kamera). + +Benutzerdefiniertes externes Koordinatensystem (external): Alle Posen +sind im sogenannten externen Koordinatensystem angegeben, welches vom +Nutzer während der Hand-Auge-Kalibrierung gewählt wurde. In diesem +Fall bezieht die Load Carrier Funktionalität alle notwendigen +Informationen über die Kameramontage und die kalibrierte Hand-Auge- +Transformation automatisch vom Modul Hand-Auge- +Kalibrierung\:(Abschnitt \ref{handeye_calibration:sect-handeye- +calibration}). Für den Fall einer robotergeführten Kamera ist vom +Nutzer zusätzlich die jeweils aktuelle Roboterpose robot_pose +anzugeben. + +Bemerkung: Wenn keine Hand-Auge-Kalibrierung durchgeführt wurde bzw. + zur Verfügung steht, muss als Referenzkoordinatensystem "pose_frame" + immer "camera" angegeben werden. + +Zulässige Werte zur Angabe des Referenzkoordinatensystems sind +"camera" und "external". Andere Werte werden als ungültig +zurückgewiesen. + +Parameter + +Das LoadCarrier Modul wird in der REST-API als "rc_load_carrier" +bezeichnet in der + +Web GUI + + unter Module ‣ LoadCarrier dargestellt. Der Benutzer kann die +Parameter entweder dort oder über die + +REST-API-Schnittstelle + + ändern. + +Übersicht über die Parameter + +Dieses Modul bietet folgende Laufzeitparameter: + +Laufzeitparameter des rc_load_carrier Moduls Name Typ +Min. Max. Default Beschreibung assume_gravity_aligned bool false +true true Wenn dieser Parameter aktiv ist, werden nur waagerechte +Load Carrier erkannt falls eine Gravitationsmessung verfügbar ist. +crop_distance float64 0.0 0.05 0.005 Sicherheitsspielraum um den +das Load Carrier Innenmaß verringert wird, um eine Region of Interest +für die Erkennung zu definieren min_plausibility float64 0.0 0.99 +0.8 Gibt an, wie viel von der Ebene um den Load Carrier Rand herum +mindestens frei sein muss, um als gültige Erkennung zu zählen. +model_tolerance float64 0.003 0.025 0.008 Gibt an, wie weit die +Abmessungen des Load Carriers von den Werten im Modell abweichen +dürfen + +Beschreibung der Laufzeitparameter + +Die Laufzeitparameter werden in der Web GUI zeilenweise im Abschnitt + +LoadCarrier Einstellungen + + auf der Seite + +LoadCarrier + + unter + +Module + + dargestellt. Im folgenden wird der Name des Parameters in der Web GUI +in Klammern hinter dem eigentlichen Parameternamen angegeben. Die +Parameter sind in derselben Reihenfolge wie in der Web GUI +aufgelistet. Wenn die Parameter außerhalb des "rc_load_carrier" Moduls +über die + +REST-API-Schnittstelle + + eines anderen Moduls verwendet werden, sind sie durch den Präfix +"load_carrier_" gekennzeichnet. + +assume_gravity_aligned (Gravitationsausgerichtet) + + Wenn dieser Parameter aktiv ist, werden nur waagerechte Load + Carrier erkannt. Dies kann die Erkennung beschleunigen. Wenn dieser + Parameter nicht aktiv ist, werden auch Load Carrier mit Verkippung + detektiert. + + Für Load Carrier mit einem Orientierungsprior wird dieser Parameter + ignoriert. + +model_tolerance (Modelltoleranz) + + Gibt an, wie weit die Abmessungen des Load Carriers von den Werten + im Modell abweichen dürfen. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_load_carrier/parameters?model_tolerance= + + API version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_load_carrier/parameters?model_tolerance= + +crop_distance (Cropping) + + setzt den Sicherheitsspielraum, um den das Load Carrier Innenmaß + verringert wird, um eine Region of Interest für die Erkennung zu + definieren (siehe + + Abb. 51 + + ). + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_load_carrier/parameters?crop_distance= + + API version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_load_carrier/parameters?crop_distance= + +min_plausibility (Minimale Plausibilität): + + Die minimale Plausibilität gibt an, wie viel von der Ebene um den + Load Carrier Rand herum mindestens frei sein muss, um als gültige + Erkennung zu zählen. Erhöhen Sie die minimale Plausibilität um + falsch-positive Erkennungen zu vermeiden, und verringern Sie den + Wert, wenn ein deutlich sichtbarer Load Carrier nicht erkannt wird. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_load_carrier/parameters?min_plausibility= + + API version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_load_carrier/parameters?min_plausibility= + +Statuswerte + +Das LoadCarrier Modul meldet folgende Statuswerte: + +Statuswerte des rc_load_carrier Moduls Name Beschreibung +data_acquisition_time Zeit in Sekunden, für die beim letzten Aufruf +auf Bilddaten gewartet werden musste last_timestamp_processed +Zeitstempel des letzten verarbeiteten Bilddatensatzes +load_carrier_detection_time Berechnungszeit für die letzte Load +Carrier Detektion in Sekunden + +Services + +Die angebotenen Services des LoadCarrier Moduls können mithilfe der + +REST-API-Schnittstelle + + oder der + +rc_visard NG + + +Web GUI + + auf der Seite + +LoadCarrier + + unter dem Menüpunkt + +Module + + ausprobiert und getestet werden. + +Das LoadCarrier Modul stellt folgende Services zur Verfügung. + +detect_load_carriers + + löst die Erkennung von Load Carriern aus, wie in + + Erkennung von Load Carriern + + beschrieben. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_load_carrier/services/detect_load_carriers + + API version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_load_carrier/services/detect_load_carriers + + Request + + Obligatorische Serviceargumente: + + "pose_frame": siehe + + Hand-Auge Kalibrierung + + . + + "load_carrier_ids": IDs der zu erkennenden Load Carrier. Aktuell + kannnur eine ID angegeben werden. + + Möglicherweise benötigte Serviceargumente: + + "robot_pose": siehe + + Hand-Auge Kalibrierung + + . + + Optionale Serviceargumente: + + "region_of_interest_id": Die ID der 3D Region of Interest, + innerhalb welcher nach den Load Carriern gesucht wird. + + "region_of_interest_2d_id": Die ID der 2D Region of Interest, + innerhalb welcher nach den Load Carriern gesucht wird. + + Bemerkung: Es kann nur eine Art von Region of Interest kann + angegeben werden. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "load_carrier_ids": [ + "string" + ], + "pose_frame": "string", + "region_of_interest_2d_id": "string", + "region_of_interest_id": "string", + "robot_pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + } + } + } + + Response + + "load_carriers": Liste der erkannten Load Carrier (Behälter). + + "timestamp": Zeitstempel des Bildes, auf dem die Erkennung + durchgeführt wurde. + + "return_code": enthält mögliche Warnungen oder Fehlercodes und + Nachrichten. + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "detect_load_carriers", + "response": { + "load_carriers": [ + { + "height_open_side": "float64", + "id": "string", + "inner_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "outer_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "overfilled": "bool", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "rim_ledge": { + "x": "float64", + "y": "float64" + }, + "rim_step_height": "float64", + "rim_thickness": { + "x": "float64", + "y": "float64" + }, + "type": "string" + } + ], + "return_code": { + "message": "string", + "value": "int16" + }, + "timestamp": { + "nsec": "int32", + "sec": "int32" + } + } + } + +detect_filling_level + + löst eine Load Carrier Füllstandserkennung aus, wie in + + Füllstandserkennung + + beschrieben. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_load_carrier/services/detect_filling_level + + API version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_load_carrier/services/detect_filling_level + + Request + + Obligatorische Serviceargumente: + + "pose_frame": siehe + + Hand-Auge Kalibrierung + + . + + "load_carrier_ids": IDs der zu erkennenden Load Carrier. Aktuell + kannnur eine ID angegeben werden. + + Möglicherweise benötigte Serviceargumente: + + "robot_pose": siehe + + Hand-Auge Kalibrierung + + . + + Optionale Serviceargumente: + + "filling_level_cell_count": Anzahl der Zellen im + Füllstandsraster. + + "region_of_interest_id": Die ID der 3D Region of Interest, + innerhalb welcher nach den Load Carriern gesucht wird. + + "region_of_interest_2d_id": Die ID der 2D Region of Interest, + innerhalb welcher nach den Load Carriern gesucht wird. + + Bemerkung: Es kann nur eine Art von Region of Interest kann + angegeben werden. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "filling_level_cell_count": { + "x": "uint32", + "y": "uint32" + }, + "load_carrier_ids": [ + "string" + ], + "pose_frame": "string", + "region_of_interest_2d_id": "string", + "region_of_interest_id": "string", + "robot_pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + } + } + } + + Response + + "load_carriers": Liste an erkannten Load Carriern und deren + Füllstand. + + "timestamp": Zeitstempel des Bildes, auf dem die Erkennung + durchgeführt wurde. + + "return_code": enthält mögliche Warnungen oder Fehlercodes und + Nachrichten. + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "detect_filling_level", + "response": { + "load_carriers": [ + { + "cells_filling_levels": [ + { + "cell_position": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "cell_size": { + "x": "float64", + "y": "float64" + }, + "coverage": "float64", + "level_free_in_meters": { + "max": "float64", + "mean": "float64", + "min": "float64" + }, + "level_in_percent": { + "max": "float64", + "mean": "float64", + "min": "float64" + } + } + ], + "filling_level_cell_count": { + "x": "uint32", + "y": "uint32" + }, + "height_open_side": "float64", + "id": "string", + "inner_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "outer_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "overall_filling_level": { + "cell_position": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "cell_size": { + "x": "float64", + "y": "float64" + }, + "coverage": "float64", + "level_free_in_meters": { + "max": "float64", + "mean": "float64", + "min": "float64" + }, + "level_in_percent": { + "max": "float64", + "mean": "float64", + "min": "float64" + } + }, + "overfilled": "bool", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "rim_ledge": { + "x": "float64", + "y": "float64" + }, + "rim_step_height": "float64", + "rim_thickness": { + "x": "float64", + "y": "float64" + }, + "type": "string" + } + ], + "return_code": { + "message": "string", + "value": "int16" + }, + "timestamp": { + "nsec": "int32", + "sec": "int32" + } + } + } + +reset_defaults + + stellt die Werkseinstellungen der Parameter dieses Moduls wieder + her und wendet sie an („factory reset“). + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_load_carrier/services/reset_defaults + + API version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_load_carrier/services/reset_defaults + + Request + + Dieser Service hat keine Argumente. + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "reset_defaults", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +set_load_carrier (veraltet) + + speichert einen Load Carrier auf dem + + rc_visard NG + + . + + API Version 2 + + Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie + stattdessen + + set_load_carrier + + in "rc_load_carrier_db". + + API version 1 (veraltet) + + Dieser Service kann wie folgt aufgerufen werden. + + PUT http:///api/v1/nodes/rc_load_carrier/services/set_load_carrier + + Die Definitionen von Request und Response sind dieselben wie in + + set_load_carrier + + in "rc_load_carrier_db" beschrieben. + +get_load_carriers (veraltet) + + gibt die mit "load_carrier_ids" spezifizierten, gespeicherten Load + Carrier zurück. + + API Version 2 + + Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie + stattdessen + + get_load_carriers + + in "rc_load_carrier_db". + + API version 1 (veraltet) + + Dieser Service kann wie folgt aufgerufen werden. + + PUT http:///api/v1/nodes/rc_load_carrier/services/get_load_carriers + + Die Definitionen von Request und Response sind dieselben wie in + + get_load_carriers + + in "rc_load_carrier_db" beschrieben. + +delete_load_carriers (veraltet) + + löscht die mit "load_carrier_ids" spezifizierten, gespeicherten + Load Carrier. + + API Version 2 + + Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie + stattdessen + + delete_load_carriers + + in "rc_load_carrier_db". + + API version 1 (veraltet) + + Dieser Service kann wie folgt aufgerufen werden. + + PUT http:///api/v1/nodes/rc_load_carrier/services/delete_load_carriers + + Die Definitionen von Request und Response sind dieselben wie in + + delete_load_carriers + + in "rc_load_carrier_db" beschrieben. + +set_region_of_interest (veraltet) + + speichert eine 3D Region of Interest auf dem + + rc_visard NG + + . + + API Version 2 + + Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie + stattdessen + + set_region_of_interest + + in "rc_roi_db". + + API version 1 (veraltet) + + Dieser Service kann wie folgt aufgerufen werden. + + PUT http:///api/v1/nodes/rc_load_carrier/services/set_region_of_interest + + Die Definitionen von Request und Response sind dieselben wie in + + set_region_of_interest + + in "rc_roi_db" beschrieben. + +get_regions_of_interest (veraltet) + + gibt die mit "region_of_interest_ids" spezifizierten, gespeicherten + 3D Regions of Interest zurück. + + API Version 2 + + Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie + stattdessen + + get_regions_of_interest + + in "rc_roi_db". + + API version 1 (veraltet) + + Dieser Service kann wie folgt aufgerufen werden. + + PUT http:///api/v1/nodes/rc_load_carrier/services/get_regions_of_interest + + Die Definitionen von Request und Response sind dieselben wie in + + get_regions_of_interest + + in "rc_roi_db" beschrieben. + +delete_regions_of_interest (veraltet) + + löscht die mit "region_of_interest_ids" spezifizierten, + gespeicherten 3D Regions of Interest. + + API Version 2 + + Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie + stattdessen + + delete_regions_of_interest + + in "rc_roi_db". + + API version 1 (veraltet) + + Dieser Service kann wie folgt aufgerufen werden. + + PUT http:///api/v1/nodes/rc_load_carrier/services/delete_regions_of_interest + + Die Definitionen von Request und Response sind dieselben wie in + + delete_regions_of_interest + + in "rc_roi_db" beschrieben. + +set_region_of_interest_2d (veraltet) + + speichert eine 2D Region of Interest auf dem + + rc_visard NG + + . + + API Version 2 + + Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie + stattdessen + + set_region_of_interest_2d + + in "rc_roi_db". + + API version 1 (veraltet) + + Dieser Service kann wie folgt aufgerufen werden. + + PUT http:///api/v1/nodes/rc_load_carrier/services/set_region_of_interest_2d + + Die Definitionen von Request und Response sind dieselben wie in + + set_region_of_interest_2d + + in "rc_roi_db" beschrieben. + +get_regions_of_interest_2d (veraltet) + + gibt die mit "region_of_interest_2d_ids" spezifizierten, + gespeicherten 2D Regions of Interest zurück. + + API Version 2 + + Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie + stattdessen + + get_regions_of_interest_2d + + in "rc_roi_db". + + API version 1 (veraltet) + + Dieser Service kann wie folgt aufgerufen werden. + + PUT http:///api/v1/nodes/rc_load_carrier/services/get_region_of_interest_2d + + Die Definitionen von Request und Response sind dieselben wie in + + get_regions_of_interest_2d + + in "rc_roi_db" beschrieben. + +delete_regions_of_interest_2d (veraltet) + + löscht die mit "region_of_interest_2d_ids" spezifizierten, + gespeicherten 2D Regions of Interest. + + API Version 2 + + Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie + stattdessen + + delete_regions_of_interest_2d + + in "rc_roi_db". + + API version 1 (veraltet) + + Dieser Service kann wie folgt aufgerufen werden. + + PUT http:///api/v1/nodes/rc_load_carrier/services/delete_regions_of_interest_2d + + Die Definitionen von Request und Response sind dieselben wie in + + delete_regions_of_interest_2d + + in "rc_roi_db" beschrieben. + +Rückgabecodes + +Zusätzlich zur eigentlichen Serviceantwort gibt jeder Service einen +sogenannten "return_code" bestehend aus einem Integer-Wert und einer +optionalen Textnachricht zurück. Erfolgreiche Service-Anfragen werden +mit einem Wert von "0" quittiert. Positive Werte bedeuten, dass die +Service-Anfrage zwar erfolgreich bearbeitet wurde, aber zusätzliche +Informationen zur Verfügung stehen. Negative Werte bedeuten, dass +Fehler aufgetreten sind. Für den Fall, dass mehrere Rückgabewerte +zutreffend wären, wird der kleinste zurückgegeben, und die +entsprechenden Textnachrichten werden in "return_code.message" +akkumuliert. + +Die folgende Tabelle listet die möglichen Rückgabe-Codes auf: + +Rückgabecodes der Services des LoadCarrier Moduls Code +Beschreibung 0 Erfolgreich -1 Ungültige(s) Argument(e) -4 Die +maximal erlaubte Zeitspanne für die interne Akquise der Bilddaten +wurde überschritten. -10 Das neue Element konnte nicht hinzugefügt +werden, da die maximal speicherbare Anzahl an Load Carriern +überschritten wurde. -11 Sensor nicht verbunden, nicht unterstützt +oder nicht bereit -302 Es wurde mehr als ein Load Carrier an den +detect_load_carriers oder detect_filling_level Service übergeben, aber +nur einer wird unterstützt. 3 Der Timeout während der Load Carrier +Erkennung wurde erreicht. Die Modelltoleranz sollte reduziert werden. +10 Die maximal speicherbare Anzahl an Load Carriern wurde erreicht. +11 Mit dem Aufruf von set_load_carrier wurde ein bereits +existierendes Objekt mit derselben id überschrieben. 100 Die +angefragten Load Carrier wurden in der Szene nicht gefunden. 102 Der +erkannte Load Carrier enthält keine 3D-Punkte 300 Ein gültiges +robot_pose-Argument wurde angegeben, ist aber nicht erforderlich. diff --git a/v24.04/de/_sources/loadcarrier_db.rst.txt b/v24.04/de/_sources/loadcarrier_db.rst.txt new file mode 100644 index 0000000..59101ff --- /dev/null +++ b/v24.04/de/_sources/loadcarrier_db.rst.txt @@ -0,0 +1,490 @@ +LoadCarrierDB + +Einleitung + +Das LoadCarrierDB Modul (Load Carrier Datenbank Modul) ermöglicht die +globale Definition von Load Carriern (Behältern), die dann in vielen +Detektionsmodulen genutzt werden können. Die definierten Load Carrier +Modelle sind in allen Modulen auf dem + +rc_visard NG + + verfügbar, die Load Carrier unterstützen. + +Das LoadCarrierDB Modul ist ein Basismodul, welches auf jedem + +rc_visard NG + + verfügbar ist. + +Spezifikationen des LoadCarrierDB Moduls Unterstützte Load +Carrier Typen 4-seitig oder 3-seitig Mögliche Rand-Arten +durchgängig, abgestuft oder vorspringend Min. Load Carrier +Abmessungen 0.1 m x 0.1 m x 0.05 m Max. Load Carrier Abmessungen 2 +m x 2 m x 2 m Max. Anzahl von Load Carriern 50 Load Carrier +verfügbar in ItemPick und BoxPick\:(Section \ref{itempick:sect- +itempick}) und SilhouetteMatch\:(Section \ref{silhouettematch:sect- +silhouettematch}) Mögliche Posen-Arten keine Pose, +Orientierungsprior, exakte Pose Mögliche Referenzkoordinatensysteme +camera, external + +Load Carrier Definition + +Ein sogenannter Load Carrier ist ein Behälter mit vier Wänden, einem +Boden und einem rechteckigen Rand, der Objekte enthalten kann. Er kann +genutzt werden, um das Volumen, in dem nach Objekten oder Greifpunkten +gesucht wird, zu begrenzen. + +Seine Geometrie ist durch die inneren und äußeren Abmessungen +("inner_dimensions" und "outer_dimensions") definiert. Die maximalen +"outer_dimensions" betragen 2.0 m in allen Dimensionen. + +Der Ursprung des Load Carrier Koordinatensystems liegt im Zentrum des +durch die + +Außenmaße + + definierten Quaders. Dabei ist die z-Achse senkrecht zum Boden des +Load Carriers und zeigt aus dem Load Carrier heraus (siehe + +Abb. 50 + +). + + +Bemerkung: Die Innen- und Außenmaße eines Load Carriers sind + typischerweise in den Angaben des jeweiligen Herstellers + spezifiziert, und können im Produktblatt oder auf der Produktseite + nachgeschlagen werden. + +Das Innenvolumen eines Load Carriers ist durch seine Innenmaße +definiert, aber enthält zusätzlich einen Bereich von 10 cm oberhalb +des Load Carriers, damit Objekte, die aus dem Load Carrier +herausragen, auch für die Detektion oder Greifpunktberechnung +berücksichtigt werden. Weiterhin wird vom Innenvolumen in jeder +Richtung ein zusätzlicher Sicherheitsabstand "crop_distance" +abgezogen, welcher als Laufzeitparameter im LoadCarrier Modul +konfiguriert werden kann (siehe + +Parameter + +). + +Abb. 51 + + zeigt das Innenvolumen eines Load Carriers. Nur Punkte, die sich +innerhalb dieses Volumens befinden, werden für Detektionen +berücksichtigt. + + +Da die Erkennung von Load Carriern auf der Erkennung des Load Carrier +Rands basiert, muss die Geometrie des Randes angegeben werden, wenn +sie nicht aus der Differenz zwischen Außen- und Innenmaßen bestimmt +werden kann. Dazu kann die Randstärke "rim_thickness" explizit gesetzt +werden. Die Randstärke gibt die Breite des äußeren Rands in x- und +y-Richtung an. Wenn eine Randstärke gesetzt ist, kann optional auch +die Randstufenhöhe "rim_step_height" angegeben werden. Die +Randstufenhöhe gibt die Höhe der Stufe zwischen dem äußeren und dem +inneren Teil des Load Carrier Rands an. Wenn die Stufenhöhe angegeben +wird, wird sie auch bei der Kollisionsprüfung berücksichtigt (siehe + +CollisionCheck + +). Beispiele abgestufter Load Carrier sind in + +Abb. 52 + + A, B gezeigt. Zusätzlich zur Randstärke und Randstufenhöhe kann der +Randvorsprung "rim_ledge" angegeben werden, um Load Carrier zu +definieren, deren innerer Rand in den Load Carrier Innenraum +hineinragt, wie zum Beispiel bei Gitterboxen. Der Randvorsprung +"rim_ledge" gibt die Randstärke des inneren Teils des Randes in die x- +und y-Richtung an. Ein Beispiel eines Load Carriers mit vorspringendem +Rand ist in + +Abb. 52 + + C gezeigt. + + +Die unterschiedlichen Randtypen können für gewöhnliche 4-seitige und +3-seitige Load Carrier angewendet werden. Für einen 3-seitigen Load +Carrier muss das Feld "type" auf "THREE_SIDED" gesetzt werden. Wenn +der Typ "STANDARD" oder leer ist, wird ein 4-seitiger Load Carrier +angenommen. Ein 3-seitiger Load Carrier hat eine Seite, die niedriger +ist als die anderen drei Seiten. Die Höhe dieser niedrigeren offenen +Seite "height_open_side" wird vom äußeren Boden des Load Carriers +gemessen. Die offene Seite liegt an der negativen y-Achse des Load +Carrier Koordinatensystems. Beispiele der zwei unterschiedlichen Load +Carrier Typen sind in + +Abb. 53 + + zu sehen. Die Höhe der offenen Seite wird nur während der +Kollisionsprüfung berücksichtigt und ist nicht notwendig für die +Erkennung des Load Carriers. + + +Für einen Load Carrier kann eine Pose bestehend aus "position" und +"orientation" als Quaternion in einem Referenzkoordinatensystem +angegeben werden. Basierend auf dem Posentyp "pose_type" wird diese +Pose entweder als Vorgabe für die Load Carrier Orientierung +("pose_type" ist "ORIENTATION_PRIOR" oder leer) oder als exakte Pose +("pose_type" ist "EXACT_POSE") verwendet. + +Falls die angegebene Pose als Vorgabe (Prior) für die Orientierung +dient, wird garantiert, dass die zurückgelieferte Pose des erkannten +Load Carriers die minimale Rotation bezogen auf den gesetzten Prior +hat. Dieser Posentyp ist nützlich für die Erkennung von geneigten Load +Carriern, oder um Mehrdeutigkeiten in der x- und y-Richtung +aufzulösen, die durch die Symmetrie des Load Carriers verursacht +werden. + +Falls der Posentyp auf "EXACT_POSE" gesetzt ist, wird keine Load +Carrier Erkennung auf den Szenendaten durchgeführt, sondern die +angegebene Pose wird so verwendet, als wäre der Load Carrier in dieser +Pose in der Szene erkannt worden. Dieser Posentyp ist nützlich, wenn +Load Carrier ihre Position nicht verändern und/oder schwer zu erkennen +sind (z.B. weil ihr Rand zu schmal ist oder das Material zu stark +reflektiert). + +Der + +rc_visard NG + + erlaubt das Speichern von bis zu 50 verschiedenen Load Carriern, von +denen jeder mit einer "id" versehen ist. Die für eine spezifische +Anwendung relevanten Load Carrier können mithilfe der + +rc_visard NG + + Web GUI oder der + +REST-API-Schnittstelle + + konfiguriert werden. + +Bemerkung: Die konfigurierten Load Carrier sind persistent auf dem + + rc_visard NG + + gespeichert und auch nach Firmware-Updates und -Wiederherstellungen + verfügbar. + +Load Carrier Abteile + +Bei einigen Detektionsmodulen kann ein Load Carrier Abteil +("load_carrier_compartment") angegeben werden, um das Volumen für die +Erkennung zu begrenzen, zum Beispiel in + +ItemPick's compute_grasps Service + +. Ein Load Carrier Abteil ist eine Box, deren Pose "pose" als +Transformation vom Load Carrier Koordinatensystem in das +Abteilkoordinatensystem, welches im Zentrum der durch das Abteil +definierten Box liegt, angegeben wird (siehe + +Abb. 54 + +). Das Load Carrier Abteil ist nicht Teil der Load Carrier Definition +im LoadCarrierDB Modul, sondern muss für jeden Detektionsaufruf +separat definiert werden. + + +Als Volumen für die Detektion wird der Durchschnitt des Abteil- +Volumens und des Load Carrier Innenraums verwendet. Wenn dieser +Durchschnitt ebenfalls den Bereich von 10 cm oberhalb des Load +Carriers enthalten soll, muss die Höhe der Box, die das Abteil +definiert, entsprechend vergrößert werden. + +Wechselwirkung mit anderen Modulen + +Die folgenden, intern auf dem + +rc_visard NG + + laufenden Module liefern Daten für das LoadCarrierDB Modul oder haben +Einfluss auf die Datenverarbeitung. + +Hand-Auge-Kalibrierung + +Falls die Kamera zu einem Roboter kalibriert wurde, kann die exakte +Pose oder der Orientierungsprior im Roboterkoordinatensystem angegeben +werden, indem das Argument "pose_frame" auf "external" gesetzt wird. + +Zwei verschiedene Werte für "pose_frame" können gewählt werden: + +Kamera-Koordinatensystem (camera): Die Load Carrier Pose oder der +Orientierungsprior sind im Kamera-Koordinatensystem angegeben und es +ist kein zusätzliches Wissen über die Lage der Kamera in seiner +Umgebung notwendig. Das bedeutet insbesondere, dass sich ROIs oder +Load Carrier, welche in diesem Koordinatensystem angegeben sind, mit +der Kamera bewegen. Es liegt daher in der Verantwortung des Anwenders, +in solchen Fällen die entsprechenden Posen der Situation entsprechend +zu aktualisieren (beispielsweise für den Anwendungsfall einer +robotergeführten Kamera). + +Benutzerdefiniertes externes Koordinatensystem (external): Die Load +Carrier Pose oder der Orientierungsprior sind im sogenannten externen +Koordinatensystem angegeben, welches vom Nutzer während der Hand-Auge- +Kalibrierung gewählt wurde. In diesem Fall bezieht das Modul alle +notwendigen Informationen über die Kameramontage und die kalibrierte +Hand-Auge-Transformation automatisch vom Modul Hand-Auge- +Kalibrierung\:(Abschnitt \ref{handeye_calibration:sect-handeye- +calibration}). + +Bemerkung: Wenn keine Hand-Auge-Kalibrierung durchgeführt wurde bzw. + zur Verfügung steht, muss als Referenzkoordinatensystem "pose_frame" + immer "camera" angegeben werden. + +Zulässige Werte zur Angabe des Referenzkoordinatensystems sind +"camera" und "external". Andere Werte werden als ungültig +zurückgewiesen. + +Services + +Das LoadCarrierDB Modul wird in der REST-API als "rc_load_carrier_db" +bezeichnet und in der + +Web GUI + + unter Datenbank ‣ Load Carrier dargestellt. Die angebotenen Services +des LoadCarrierDB Moduls können mithilfe der + +REST-API-Schnittstelle + + oder der Web GUI ausprobiert und getestet werden. + +Das LoadCarrierDB Modul stellt folgende Services zur Verfügung. + +set_load_carrier + + speichert einen Load Carrier auf dem + + rc_visard NG + + . Alle Load Carrier sind dauerhaft gespeichert, auch über Firmware- + Updates und -Wiederherstellungen hinweg. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + PUT http:///api/v2/nodes/rc_load_carrier_db/services/set_load_carrier + + Request + + Die Definition des Typs "load_carrier" wird in + + Load Carrier Definition + + beschrieben. + + Das Feld "type" ist optional und akzeptiert "STANDARD" und + "THREE_SIDED". + + Das Feld "pose_type" ist optional und akzeptiert "NO_POSE", + "EXACT_POSE" und "ORIENTATION_PRIOR". + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "load_carrier": { + "height_open_side": "float64", + "id": "string", + "inner_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "outer_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "pose_type": "string", + "rim_ledge": { + "x": "float64", + "y": "float64" + }, + "rim_step_height": "float64", + "rim_thickness": { + "x": "float64", + "y": "float64" + }, + "type": "string" + } + } + } + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "set_load_carrier", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +get_load_carriers + + gibt die mit "load_carrier_ids" spezifizierten, gespeicherten Load + Carrier zurück. Wenn keine "load_carrier_ids" angegeben werden, + werden alle gespeicherten Load Carrier zurückgeliefert. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + PUT http:///api/v2/nodes/rc_load_carrier_db/services/get_load_carriers + + Request + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "load_carrier_ids": [ + "string" + ] + } + } + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "get_load_carriers", + "response": { + "load_carriers": [ + { + "height_open_side": "float64", + "id": "string", + "inner_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "outer_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "pose_type": "string", + "rim_ledge": { + "x": "float64", + "y": "float64" + }, + "rim_step_height": "float64", + "rim_thickness": { + "x": "float64", + "y": "float64" + }, + "type": "string" + } + ], + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +delete_load_carriers + + löscht die mit "load_carrier_ids" spezifizierten, gespeicherten + Load Carrier. Alle zu löschenden Load Carrier müssen explizit in + "load_carrier_ids" angegeben werden. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + PUT http:///api/v2/nodes/rc_load_carrier_db/services/delete_load_carriers + + Request + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "load_carrier_ids": [ + "string" + ] + } + } + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "delete_load_carriers", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +Rückgabecodes + +Zusätzlich zur eigentlichen Serviceantwort gibt jeder Service einen +sogenannten "return_code" bestehend aus einem Integer-Wert und einer +optionalen Textnachricht zurück. Erfolgreiche Service-Anfragen werden +mit einem Wert von "0" quittiert. Positive Werte bedeuten, dass die +Service-Anfrage zwar erfolgreich bearbeitet wurde, aber zusätzliche +Informationen zur Verfügung stehen. Negative Werte bedeuten, dass +Fehler aufgetreten sind. Für den Fall, dass mehrere Rückgabewerte +zutreffend wären, wird der kleinste zurückgegeben, und die +entsprechenden Textnachrichten werden in "return_code.message" +akkumuliert. + +Die folgende Tabelle listet die möglichen Rückgabecodes auf: + +Rückgabecodes der Services des LoadCarrierDB Moduls Code +Beschreibung 0 Erfolgreich -1 Ungültige(s) Argument(e) -10 Das +neue Element konnte nicht hinzugefügt werden, da die maximal +speicherbare Anzahl an Load Carriern überschritten wurde. 10 Die +maximal speicherbare Anzahl an Load Carriern wurde erreicht. 11 Mit +dem Aufruf von set_load_carrier wurde ein bereits existierendes Objekt +mit derselben id überschrieben. diff --git a/v24.04/de/_sources/maintenance.rst.txt b/v24.04/de/_sources/maintenance.rst.txt new file mode 100644 index 0000000..b23cd61 --- /dev/null +++ b/v24.04/de/_sources/maintenance.rst.txt @@ -0,0 +1,462 @@ +Wartung + +Warnung: Das Gehäuse des + + rc_visard NG + + muss für Wartungsarbeiten nicht geöffnet werden. Das unbefugte + Öffnen des Produkts führt zum Erlöschen der Garantie. + +Reinigung der Kameralinsen + +Glaslinsen sind mit einer Anti-Reflex-Beschichtung versehen, um +Spiegelungen zu verringern. Bei der Reinigung der Linsen ist besonders +vorsichtig vorzugehen. Mit einer weichen Linsenbürste lassen sich +Staub und Schmutzpartikel entfernen. Anschließend kann die Linse mit +einem Tuch in kreisenden Bewegungen abgewischt werden: Dabei ist ein +Spezialreinigungstuch aus Mikrofaser zu verwenden, um Kratzer zu +vermeiden, die die Leistung des Sensors beeinträchtigen können. +Hartnäckiger Schmutz lässt sich mit hochreinem Isopropanol oder einer +für beschichtete Linsen geeigneten Reinigungslösung (z.B. „Uvex +Clear“-Produkte) entfernen. + +Kamerakalibrierung + +Die Kameras werden ab Werk kalibriert. Unter normalen +Betriebsbedingungen bleibt die Kalibrierung für die Lebensdauer des +Sensors erhalten. Wenn der + +rc_visard NG + + einer starken mechanischen Belastung ausgesetzt wird, wenn er +beispielsweise fallen gelassen wird, können sich die Parameter der +Kamera jedoch leicht verändern. In diesem Fall lässt sich die +Kalibrierung über die Web GUI überprüfen und bei Bedarf neu +durchführen (siehe + +Kamerakalibrierung + +). + +Backup der Einstellungen + +Der + +rc_visard NG + + bietet die Möglichkeit, die aktuellen Einstellungen als Backup oder +zum Übertragen auf einen anderen + +rc_visard + + oder + +rc_cube + + herunterzuladen. + +Die aktuellen Einstellungen des + +rc_visard NG + + können über die + +Web GUI + + auf der Seite + +System + + im Abschnitt + +rc_visard NG + + +Einstellungen + + heruntergeladen werden, oder über die + +REST-API-Schnittstelle + + des + +rc_visard NG + + mit Hilfe des Aufrufs + +GET /system/backup + +. + +Beim Herunterladen des Backups kann der Nutzer entscheiden, welche +Einstellungen das Backup enthalten soll: + +nodes: die Einstellungen aller Module (Parameter, bevorzugte TCP- +Orientierungen und Sortierstrategien) + +load_carriers: die erstellten Load Carrier + +regions_of_interest: die erstellten 2D und 3D Regions of Interest + +grippers: die erstellten Greifer (ohne CAD Elemente) + +Das zurückgelieferte Backup sollte als .json-Datei gespeichert werden. + +Die Templates des SilhouetteMatch Moduls sind nicht im Backup +enthalten, aber können manuell über die REST-API oder die Web GUI +heruntergeladen werden (siehe + +Template API + +). + +Ein Backup kann auf dem + +rc_visard NG + + über die + +Web GUI + + auf der Seite + +System + + im Abschnitt + +rc_visard NG + + +Einstellungen + + eingespielt werden, indem die Backup .json-Datei hochgeladen wird. In +der + +Web GUI + + werden die im Backup enthaltenen Einstellungen angezeigt und können +für das Einspielen ausgewählt werden. Der zugehörige Aufruf der + +REST-API-Schnittstelle + + ist + +POST /system/backup + +. + +Warnung: Wenn ein Backup von Load Carriern eingespielt wird, gehen + alle bestehenden Load Carrier auf dem + + rc_visard NG + + verloren und werden durch die Load Carrier im Backup ersetzt. Das + gleiche trifft auf das Einspielen von Greifern und Regions of + Interest zu. + +Wenn ein Backup eingespielt wird, werden nur die Einstellungen +gesetzt, die für den jeweiligen + +rc_visard NG + + zutreffend sind. Parameter für Module, die nicht existieren oder +keine gültige Lizenz haben, werden ignoriert. Wenn ein Backup nur +teilweise eingespielt werden konnte, wird der Benutzer über Warnungen +darüber informiert. + +Aktualisierung der Firmware + +Angaben zur aktuellen Firmware-Version sind auf der Seite System ‣ +Firmware & Lizenz in der + +Web GUI + + angegeben. Diese Informationen lassen sich mithilfe einer + +GET /system + +-Anfrage über die die + +REST-API-Schnittstelle + + des + +rc_visard NG + + abrufen. Die Aktualisierung der Firmware kann entweder über die Web +GUI oder über die REST-API vorgenommen werden. + +Warnung: Ausgehend von einer Firmware-Version älter als 21.07 werden + alle konfigurierten Parameter der Softwaremodule nach einem + Firmware- Update auf die Werkseinstellungen zurückgesetzt. Nur beim + Update ausgehend von Version 21.07 oder höher bleiben die zuletzt + gespeicherten Parameter erhalten. Bevor das Update vorgenommen wird, + sollten daher alle Einstellungen (über die + + REST-API-Schnittstelle + + ) abgefragt und in der Anwendung oder auf dem Client-PC gesichert + werden.Folgende Einstellungen sind davon ausgeschlossen und bleiben + auch nach einem Firmware-Update erhalten: + + die Netzwerkkonfiguration des rc_visard NG, samt der ggf. vergebenen + festen IP-Adresse und des benutzerdefinierten Gerätenamens, + + das letzte Ergebnis der Hand-Auge-Kalibrierung\:(Abschnitt + \ref{handeye_calibration:sect-handeye-calibration}), was bedeutet, + dass der rc_visard NG nicht neu zum Roboter kalibriert werden muss, + es sei denn, die Montage wurde verändert, und + + das letzte Ergebnis der Kamerakalibrierung\:(Abschnitt + \ref{camera_calibration:sect-camera-calibration}), was bedeutet, + dass die Stereokamera des rc_visard nicht neu kalibriert werden + muss. + +Schritt 1: Download der neuesten Firmware + Firmware-Updates werden in Form einer Mender-Artefakt-Datei + bereitgestellt, die an ihrem ".mender"-Suffix erkennbar ist. + + Ist ein neues Firmware-Update für den + + rc_visard NG + + erhältlich, kann die Datei von der Roboception-Homepage ( + + https://www.roboception.com/download + + ) auf den lokalen Rechner heruntergeladen werden. + +Schritt 2: Hochladen der Update-Datei + Soll das Update über die REST-API des + + rc_visard NG + + vorgenommen werden, kann der Benutzer auf die Anfrage + + POST /system/update + + zurückgreifen. + + Um die Firmware über die Web GUI zu aktualisieren, muss auf der + Seite System ‣ Firmware & License die Schaltfläche " + + rc_visard NG + + Update hochladen" betätigt werden. Nachdem die gewünschte Update- + Image-Datei (Dateierweiterung ".mender") aus dem lokalen + Dateisystem ausgewählt und geöffnet wurde, startet das Update. + + Je nach Netzwerkarchitektur und Konfiguration kann das Hochladen + mehrere Minuten in Anspruch nehmen. Während das Update über die Web + GUI läuft, zeigt ein Statusbalken an, wie weit das Update bereits + vorangeschritten ist. + + Bemerkung: Je nach Webbrowser kann es vorkommen, dass der + angezeigte Statusbalken den Abschluss des Updates zu früh angibt. + Es empfiehlt sich, zu warten, bis sich ein + Benachrichtigungsfenster öffnet, das das Ende des Updatevorgangs + anzeigt. Insgesamt ist mit einer Update-Dauer von mindestens fünf + Minuten zu rechnen. + + Warnung: Die Webbrowser-Registerkarte, die die Web GUI enthält, + darf weder geschlossen noch aktualisiert werden, da der Update- + Vorgang anderenfalls unterbrochen wird. Ist dies der Fall, muss + der Update-Vorgang neu gestartet werden. + +Schritt 3: Neustart des +rc_visard NG + + Um ein Firmware-Update auf den + + rc_visard NG + + aufzuspielen, muss nach dem Upload der neuen Image-Datei ein + Neustart vorgenommen werden. + + Bemerkung: Die neue Firmware-Version wird in die inaktive + Partition des + + rc_visard NG + + hochgeladen. Erst nach dem Neustart wird die inaktive Partition + aktiviert und die aktive Partition deaktiviert. Kann das + aktualisierte Firmware-Image nicht geladen werden, bleibt diese + Partition des + + rc_visard NG + + inaktiv und es wird automatisch die zuvor installierte Firmware- + Version von der aktiven Partition verwendet. + + Über die REST-API lässt sich der Neustart mittels der Anfrage + + PUT /system/reboot + + vornehmen. + + Nachdem die neue Firmware über die Web GUI hochgeladen wurde, + öffnet sich ein Benachrichtigungsfenster, in dem der Benutzer + aufgefordert wird, das Gerät sofort neu zu starten oder aber den + Neustart zu verschieben. Soll der + + rc_visard NG + + zu einem späteren Zeitpunkt neu gestartet werden, kann dies über + die Schaltfläche + + Neustart + + auf der Web GUI-Seite + + System + + vorgenommen werden. + +Schritt 4: Bestätigung des Firmware-Updates + Nach dem Neustart des + + rc_visard NG + + ist die Versionsnummer des derzeit aktiven Firmware-Images zu + überprüfen, sodass sichergestellt ist, dass das aktualisierte Image + erfolgreich geladen wurde. Dies kann entweder über die Web GUI auf + der Seite System ‣ Firmware & Lizenz oder über die REST-API mittels + der Anfrage + + GET /system/update + + vorgenommen werden. + + Kann das Firmware-Update nicht erfolgreich aufgespielt werden, ist + der Roboception-Support zu kontaktieren. + +Wiederherstellung der vorherigen Firmware-Version + +Nach einem erfolgreichen Firmware-Update wird das vorherige Firmware- +Image auf der inaktiven Partition des + +rc_visard NG + + hinterlegt und kann von dort bei Bedarf wiederhergestellt werden. +Dieses Verfahren wird auch als + +Rollback + + bezeichnet. + +Bemerkung: Es wird dringend empfohlen, die neueste Firmware-Version + zu verwenden, die von Roboception zur Verfügung gestellt wurde. Auf + das Rollback sollte nur dann zurückgegriffen werden, wenn es mit der + aktualisierten Firmware-Version große Probleme gibt. + +Die Rollback-Funktion kann lediglich über die + +REST-API-Schnittstelle + + des + +rc_visard NG + + aufgerufen werden – mithilfe der Anfrage + +PUT /system/rollback + +. Die Anfrage kann entweder mit einem HTTP-kompatiblen Client oder, +wie in + +Swagger UI + + beschrieben, über einen Webbrowser ausgelöst werden. Wie beim Update- +Prozess ist es auch beim Rollback nötig, das Gerät im Anschluss neu zu +starten, um die wiederhergestellte Firmware-Version zu laden. + +Neustart des rc_visard NG + +Nach einem Firmware-Update oder einem Software-Rollback muss der + +rc_visard NG + + neu gestartet werden. Der Neustart lässt sich entweder +programmgesteuert mithilfe der Anforderung + +PUT /system/reboot + + über die + +REST-API-Schnittstelle + + des + +rc_visard NG + + oder manuell auf der Seite + +System + + der + +Web GUI + + vornehmen. + +Der Neustart ist abgeschlossen, wenn die LED wieder grün leuchtet. + +Aktualisierung der Softwarelizenz + +Lizenzen, die von Roboception zur Aktivierung zusätzlicher Funktionen +erworben werden, können über die Seite System ‣ Firmware & Lizenz der + +Web GUI + + installiert werden. Der + +rc_visard NG + + muss neu gestartet werden, um die Lizenz nutzen zu können. + +Download der Logdateien + +Während des Betriebs dokumentiert der + +rc_visard NG + + wichtige Informationen, Hinweise und Fehler in sogenannten +Logdateien. Zeigt der + +rc_visard NG + + ein unerwartetes oder fehlerhaftes Verhalten, kann mithilfe der +Logdateien nach der Fehlerursache geforscht werden. Logeinträge lassen +sich über die Seite System ‣ Logs auf der + +Web GUI + + ansehen und filtern. Wird der Support kontaktiert ( + +Kontakt + +), sind die Logdateien sehr hilfreich, um Probleme aufzuspüren. Um +diese als tar.gz-Datei herunterzuladen, ist der Button Alle Logs +herunterladen auf der Seite System ‣ Logs der Web GUI unter + +System + + zu klicken. + +Die Logs sind nicht nur über die Web GUI, sondern auch über die + +REST-API-Schnittstelle + + des + +rc_visard NG + + zugänglich. Hierfür können die Anfragen des Typs + +GET /logs + + und + +GET /logs/{log} + + verwendet werden. diff --git a/v24.04/de/_sources/modules.rst.txt b/v24.04/de/_sources/modules.rst.txt new file mode 100644 index 0000000..fb852a0 --- /dev/null +++ b/v24.04/de/_sources/modules.rst.txt @@ -0,0 +1,43 @@ +Softwaremodule + +Der + +rc_visard NG + + wird mit einer Reihe von On-Board-Softwaremodulen mit verschiedenen +Funktionalitäten ausgeliefert. Jedes Softwaremodul bietet über seinen +zugehörigen + +Node + + eine + +REST-API-Schnittstelle + + als Programmierschnittstelle an. + +Die Softwaremodule des + +rc_visard NG + + können unterteilt werden in + +3D-Kamera-Module\:(Abschnitt \ref{camera_modules:sect-3d-camera- +modules}) welche Bildpaare aufnehmen und 3D Tiefeninformationen +bereitstellen, und auch über die GigE Vision/GenICam-Schnittstelle des +rc_visard NG konfigurierbar sind. + +Detektionsmodule\:(Abschnitt \ref{detection_modules:sect-detection- +modules}) welche eine Vielzahl verschiedener Detektionsfunktionen, +wie Greifpunktberechnungen und Objekterkennung anbieten. + +Konfigurationsmodule\:(Abschnitt \ref{configuration_modules:sect- +configuration-modules}) welche es dem Nutzer ermöglichen, +Kalibrierungen durchzuführen und den rc_visard NG für spezielle +Anwendungen zu konfigurieren. + +Datenbankmodule\:(Abschnitt \ref{database_modules:sect-database- +modules}) welche dem Nutzer die Konfiguration globaler Daten +ermöglichen, die in allen anderen Modulen verfügbar sind, wie Load +Carrier, Regions of Interest und Greifer. + diff --git a/v24.04/de/_sources/navigation_modules.rst.txt b/v24.04/de/_sources/navigation_modules.rst.txt new file mode 100644 index 0000000..7f547fd --- /dev/null +++ b/v24.04/de/_sources/navigation_modules.rst.txt @@ -0,0 +1,26 @@ +Navigationsmodule + +Die Navigationsmodule des + +rc_visard NG + + umfassen: + +dynamics (rc_dynamics, Abschnitt \ref{dynamics:sect-dynamics}) +erstellt Schätzungen des dynamischen Zustands des rc_visard, d.h. +seiner Pose, Geschwindigkeit und Beschleunigung. Diese Zustände werden +als kontinuierliche Datenströme über die rc_dynamics-Schnittstelle +übertragen. Zu diesem Zweck verwaltet und verknüpft das Dynamik-Modul +Daten aus den folgenden Submodulen: stereo_visodo (rc_stereovisodo, +Abschnitt \ref{stereo_visodo:sect-visual-odometry}) schätzt die +Bewegung des rc_visard anhand der Bewegungen charakteristischer +Merkmale in den Bildern der linken Kamera. stereo_ins (rc_stereo_ins, +Abschnitt \ref{stereo_ins:sect-stereo-ins}) kombiniert die per +visueller Odometrie ermittelten Werte mit den Daten der integrierten +inertialen Messeinheit (IMU), um auf dieser Grundlage akkurate und +hochfrequente Echtzeit-Zustandsschätzungen bereitzustellen. slam +(rc_slam, Abschnitt \ref{slam:sect-slam}) übernimmt die simultane +Lokalisierung und Kartenerstellung, um akkumulierte Posendaten zu +korrigieren. Die Trajektorie des rc_visard lässt sich über die REST- +API-Schnittstelle\:(Abschnitt \ref{rest_api:sect-rest-api}) abfragen. + diff --git a/v24.04/de/_sources/opc_ua.rst.txt b/v24.04/de/_sources/opc_ua.rst.txt new file mode 100644 index 0000000..d34f2a2 --- /dev/null +++ b/v24.04/de/_sources/opc_ua.rst.txt @@ -0,0 +1,19 @@ +OPC UA Interface + +Der + +rc_visard NG + + bietet auch ein optionales OPC interface. Der OPC UA Server kann via +Lizenzupdate aktiviert werden. + +Der OPC UA Server nutzt das "DataTypeDefinition" Attribut (verfügbar +in OPC UA Version 1.04) für benutzerdefinierte Datentypen und +verwendet auch Methoden und Arrays variabler Länge. Bitte überprüfen +Sie ob Ihr OPC UA Client dies unterstützt. + +Bitte kontaktieren Sie + +support@roboception.de + + wenn Sie Interesse haben den OPC UA Server zu nutzen. diff --git a/v24.04/de/_sources/pipelines.rst.txt b/v24.04/de/_sources/pipelines.rst.txt new file mode 100644 index 0000000..5449937 --- /dev/null +++ b/v24.04/de/_sources/pipelines.rst.txt @@ -0,0 +1,150 @@ +Kamerapipelines + +Der + +rc_visard NG + + unterstützt mehrere Kameras zur selben Zeit. Dazu bietet er bis zu +vier + +Kamerapipelines + +, die vom Benutzer konfiguriert werden können. + +Eine Kamerapipeline beinhaltet verschiedene Softwaremodule für die +Datenaufnahme der mit der Pipeline verbundenen Kamera, für Detektionen +und für die Konfiguration der Module in dieser Pipeline, z.B. durch +eine Hand-Auge-Kalibrierung. + +Der + +rc_visard NG + + unterstützt Kameras vom Typ + +rc_visard + +, + +rc_viscore + + und + +blaze + +. Der Typ der zugehörigen Kamerapipeline muss so konfiguriert werden, +dass er zum angeschlossenen Gerät passt. + +Konfiguration der Kamerapipelines + +Die Kamerapipelines können über die + +Web GUI + + unter System ‣ Kamera Pipelines konfiguriert werden. Diese Seite +zeigt die laufenden Pipelines mit ihrem Typ und dem verbundenen Gerät +an. + + +Durch Klick auf Pipelines konfigurieren kann die Anzahl und der Typ +der laufenden Kamerapipelines wie in der nächsten Abbildung gezeigt +konfiguriert werden. + +Bemerkung: Der + + rc_cube I + + bietet vier Kamerapipelines an, der + + rc_cube S + + zwei. + + +Der Typ einer laufenden Pipeline kann geändert werden, indem ein +anderer Typ im Dropdown-Feld der jeweiligen Pipeline ausgewählt wird. +Eine laufende Pipeline kann entfernt werden, indem man auf Pipeline +entfernen klickt. Einzig die Pipeline 0 kann nie gelöscht werden, da +sie die primäre Pipeline ist. Durch Klick auf + Pipeline hinzufügen +und anschließendes Auswählen des Pipelinetyps kann eine neue Pipeline +erstellt werden. Sobald alle Pipelines wie gewünscht konfiguriert +sind, können die Änderungen durch Klick auf Anwenden & Neustarten +angewendet werden und der + +rc_cube + + startet sofort neu. + +Konfiguration der verbundenen Kameras + +Eine Pipeline eines bestimmten Typs kann nur Geräte desselben Typs +erkennen. Das bedeutet, dass eine Pipeline vom Typ "rc_visard" nur mit +einem + +rc_visard + + verbunden werden kann. Falls mehrere Kameras desselben Typs am + +rc_cube + + angeschlossen sind, kann durch Setzen eines Filtertexts eine +bestimmte Kamera für jede Pipeline ausgewählt werden. Der aktuelle +Filtertext wird für jede laufende Pipeline angezeigt, wie in "fig- +pipelines-running" dargestellt. Standardmäßig ist der Filtertext auf +"*" gesetzt, was bedeutet, dass jedes Gerät, das zum Pipelinetyp +passt, automatisch verbunden wird, aber nur, wenn es eindeutig ist. +Andernfalls wird keine Kamera mit dieser Pipeline verbunden und ein +Fehler angezeigt. + +Um den Filtertext anzupassen und eine Kamera für eine Pipeline +auszuwählen, klickt man auf Kameraverbindung konfigurieren auf der +Seite + +Kamera Pipelines + +, oder wählt die entsprechende Pipeline im Menü unter, z.B., System ‣ +Kamera Pipelines ‣ Pipeline 1. Diese Seite zeigt den aktuellen +Filtertext und weitere Informationen über die verbundene Kamera an. + + +Ein Klick auf Kamera auswählen öffnet einen Dialog zum Editieren des +Filtertexts. + + +Dieser Dialog zeigt weiterhin eine Liste aller erkannten Geräte, die +zum Pipelinetyp passen, und markiert diejenigen, die zum aktuell +eingetragenen Filtertext passen. Es wird auch angezeigt, ob die Geräte +bereits von einer anderen Pipeline verwendet werden. Filtertexte +können durch Klicken auf das + +Interface + +, den + +Namen + + oder die + +Seriennummer + + des gewünschten Geräts ausgewählt werden. Die folgende Tabelle zeigt +mögliche Filtertexte. + +Mögliche Kamera-Filtertexte Filtertext Beschreibung * wählt +jedes Gerät aus, das zum Pipelinetyp passt sensor:* wählt jedes +Gerät aus, das über das sensor Interface angeschlossen ist und dem +Pipelinetyp entspricht. wählt das Gerät mit diesem +benutzerdefinierten Namen aus wählt das Gerät mit +dieser Seriennummer aus sensor: wählt das Gerät +aus, das über das sensor Interface angeschlossen sind, und diese +Seriennummer hat sensor: wählt das Gerät aus, das über das +sensor Interface angeschlossen sind, und diesen benutzerdefinierten +Namen hat falls leer, wird keine Kamera verbunden + +Durch Klick auf Speichern wird der eingegebene Filtertext angewendet +und eine passende Kamera mit dieser Pipeline verbunden, wenn möglich. +Das Ändern des Filtertext ist ohne Neustart des + +rc_cube + + möglich. diff --git a/v24.04/de/_sources/pose_format_abb.rst.txt b/v24.04/de/_sources/pose_format_abb.rst.txt new file mode 100644 index 0000000..66977c1 --- /dev/null +++ b/v24.04/de/_sources/pose_format_abb.rst.txt @@ -0,0 +1,7 @@ +ABB Posenformat + +ABB Roboter beschreiben eine Pose durch Position und Quaternion so wie + +rc_visard NG + + Geräte. Es ist keine Konvertierung der Orientierung notwendig. diff --git a/v24.04/de/_sources/pose_format_fanuc.rst.txt b/v24.04/de/_sources/pose_format_fanuc.rst.txt new file mode 100644 index 0000000..a6becb0 --- /dev/null +++ b/v24.04/de/_sources/pose_format_fanuc.rst.txt @@ -0,0 +1,38 @@ +FANUC XYZ-WPR Format + +Das Posenformat, welches von FANUC Robotern benutzt wird, besteht aus +einer Position XYZ in Millimetern und einer Orientierung WPR, welche +durch drei Winkel in Grad gegeben ist. W rotiert um die x-Achse, P +rotiert um die y-Achse und R rotiert um die z-Achse. Die +Rotationsreihenfolge ist x-y-z und wird berechnet durch r_z(R) r_y(P) +r_x(W). + +Umrechnung von FANUC-WPR in Quaternionen + +Zur Umrechnung von WPR Winkeln in Grad in eine Quaternion +q=(\begin{array}{cccc}x & y & z & w\end{array}) werden zunächst die +Winkel ins Bogenmaß umgerechnet + + W_r = W \frac{\pi}{180} \text{,} \\ P_r = P \frac{\pi}{180} + \text{,} \\ R_r = R \frac{\pi}{180} \text{,} \\ + +und damit wird die Quaternion berechnet als + + x = \cos{(R_r/2)}\cos{(P_r/2)}\sin{(W_r/2)} - + \sin{(R_r/2)}\sin{(P_r/2)}\cos{(W_r/2)} \text{,} \\ y = + \cos{(R_r/2)}\sin{(P_r/2)}\cos{(W_r/2)} + + \sin{(R_r/2)}\cos{(P_r/2)}\sin{(W_r/2)} \text{,} \\ z = + \sin{(R_r/2)}\cos{(P_r/2)}\cos{(W_r/2)} - + \cos{(R_r/2)}\sin{(P_r/2)}\sin{(W_r/2)} \text{,} \\ w = + \cos{(R_r/2)}\cos{(P_r/2)}\cos{(W_r/2)} + + \sin{(R_r/2)}\sin{(P_r/2)}\sin{(W_r/2)} \text{.} + +Umrechnung von Quaternionen in FANUC-WPR + +Die Umrechnung von einer Quaternion q=(\begin{array}{cccc}x & y & z & +w\end{array}) mit ||q||=1 in WPR Winkel in Grad kann wie folgt +durchgeführt werden. + + R &= \text{atan}_2{(2(wz + xy), 1 - 2(y^2 + z^2))} \frac{180}{\pi} + \\ P &= \text{asin}{(2(wy - zx))} \frac{180}{\pi} \\ W &= + \text{atan}_2{(2(wx + yz), 1 - 2(x^2 + y^2))} \frac{180}{\pi} diff --git a/v24.04/de/_sources/pose_format_franka_emika.rst.txt b/v24.04/de/_sources/pose_format_franka_emika.rst.txt new file mode 100644 index 0000000..6d9232e --- /dev/null +++ b/v24.04/de/_sources/pose_format_franka_emika.rst.txt @@ -0,0 +1,93 @@ +Franka Emika Posenformat + +Franka Emika Roboter nutzen eine Transformationsmatrix T um eine Pose +zu definieren. Eine Transformationsmatrix kombiniert eine +Rotationsmatrix R und einen Translationsvektor t=(\begin{array}{cccc}x +& y & z\end{array})^T. + + T = \left(\begin{array}{cccc} r_{00} & r_{01} & r_{02} & x\\ + r_{10} & r_{11} & r_{12} & y\\ r_{20} & r_{21} & r_{22} & z\\ 0 + & 0 & 0 & 1 \end{array}\right) + +Die Posen, die Franka Emika's "Measure Pose" App ausgibt, bestehen aus +einer Translation x, y, z in Millimetern und einer Rotation x, y, z in +Grad. Die Rotationsreihenfolge ist z-y'-x'' (d.h. x-y-z) und die +Rotation wird berechnet durch r_z(z) r_y(y) r_x(x). + +Umrechnung von Transformation in Quaternion + +Die Umrechnung von einer Rotationsmatrix (mit det(R)=1) in eine +Quaternion q=(\begin{array}{cccc}q_x & q_y & q_z & q_w\end{array}) +kann wie folgt durchgeführt werden. + + q_x &= \text{sign}(r_{21}-r_{12}) \frac{1}{2}\sqrt{\text{max}(0, 1 + + r_{00} - r_{11} - r_{22})} \\ q_y &= \text{sign}(r_{02}-r_{20}) + \frac{1}{2}\sqrt{\text{max}(0, 1 - r_{00} + r_{11} - r_{22})} \\ + q_z &= \text{sign}(r_{10}-r_{01}) \frac{1}{2}\sqrt{\text{max}(0, 1 + - r_{00} - r_{11} + r_{22})} \\ q_w &= + \frac{1}{2}\sqrt{\text{max}(0, 1 + r_{00} + r_{11} + r_{22})} + +Der \text{sign} Operator gibt -1 zurück, falls sein Argument negativ +ist. Sonst wird 1 zurück gegeben. Er wird zur Wiederherstellung das +Vorzeichens der Wurzel benutzt. Die \text{max} Funktion stellt sicher, +dass das Argument der Wurzel nicht negativ ist, was in der Praxis +durch Rundungsfehler passieren kann. + +Umrechnung von Rotation-XYZ in Quaternion + +Zur Umrechnung von der Rotationswinkel x, y, z in Grad in eine +Quaternion q=(\begin{array}{cccc}q_x & q_y & q_z & q_w\end{array}) +werden zuerst alle Winkel in das Bogenmaß umgerechnet mit + + X_r = x \frac{\pi}{180} \text{,} \\ Y_r = y \frac{\pi}{180} + \text{,} \\ Z_r = z \frac{\pi}{180} \text{,} \\ + +und damit die Quaternion berechnet durch + + q_x = \cos{(Z_r/2)}\cos{(Y_r/2)}\sin{(X_r/2)} - + \sin{(Z_r/2)}\sin{(Y_r/2)}\cos{(X_r/2)} \text{,} \\ q_y = + \cos{(Z_r/2)}\sin{(Y_r/2)}\cos{(X_r/2)} + + \sin{(Z_r/2)}\cos{(Y_r/2)}\sin{(X_r/2)} \text{,} \\ q_z = + \sin{(Z_r/2)}\cos{(Y_r/2)}\cos{(X_r/2)} - + \cos{(Z_r/2)}\sin{(Y_r/2)}\sin{(X_r/2)} \text{,} \\ q_w = + \cos{(Z_r/2)}\cos{(Y_r/2)}\cos{(X_r/2)} + + \sin{(Z_r/2)}\sin{(Y_r/2)}\sin{(X_r/2)} \text{.} + +Umrechnung von Quaternion und Translation in Transformation + +Die Umrechnung von einer Quaternion q=(\begin{array}{cccc}q_x & q_y & +q_z & q_w\end{array}) und einem Translationsvektor +t=(\begin{array}{cccc}x & y & z\end{array})^T in eine +Transformationsmatrix T kann wie folgt durchgeführt werden. + + T = \left(\begin{array}{cccc} 1 - 2s(q_y^2+q_z^2) & 2s(q_x q_y- + q_z q_w) & 2s(q_x q_z+q_y q_w) & x\\ 2s(q_x q_y+q_z q_w) & 1 - + 2s(q_x^2+q_z^2) & 2s(q_y q_z-q_x q_w) & y\\ 2s(q_x q_z-q_y q_w) + & 2s(q_y q_z+q_x q_w) & 1 - 2s(q_x^2+q_y^2) & z\\ 0 & + 0 & 0 & 1 \end{array}\right) + +wobei s=||q||^{-2}=\frac{1}{q_x^2+q_y^2+q_z^2+q_w^2} und s=1 wenn q +eine Einheitsquaternion ist. + +Umrechnung von Quaternion in Rotation-XYZ + +Die Umrechnung von einer Quaternion q=(\begin{array}{cccc}q_x & q_y & +q_z & q_w\end{array}) mit ||q||=1 in x, y, z Winkel in Grad kann wie +folgt durchgeführt werden. + + x &= \text{atan}_2{(2(q_w q_z + q_x q_y), 1 - 2(q_y^2 + q_z^2))} + \frac{180}{\pi} \\ y &= \text{asin}{(2(q_w q_y - q_z q_x))} + \frac{180}{\pi} \\ z &= \text{atan}_2{(2(q_w q_x + q_y q_z), 1 - + 2(q_x^2 + q_y^2))} \frac{180}{\pi} + +Posenrepräsentation in RaceCom Messages und Statemachines + +In RaceCom Messages und in Statemachines wird eine Pose normalerweise +als eindimensionales Array aus 16 Floatwerten definiert, die in +spaltenweiser Anordnung eine Transformationsmatrix repräsentieren. Die +Indizes der Einträge der folgenden Matrix entsprechen den Array- +Indizes. + + T = \left(\begin{array}{cccc} a_0 & a_4 & a_8 & a_{12}\\ a_1 + & a_5 & a_9 & a_{13}\\ a_2 & a_6 & a_{10} & a_{14}\\ a_3 & + a_7 & a_{11} & a_{15} \end{array}\right) diff --git a/v24.04/de/_sources/pose_format_fruitcore_horst.rst.txt b/v24.04/de/_sources/pose_format_fruitcore_horst.rst.txt new file mode 100644 index 0000000..e0fa84d --- /dev/null +++ b/v24.04/de/_sources/pose_format_fruitcore_horst.rst.txt @@ -0,0 +1,9 @@ +Fruitcore HORST Posenformat + +Fruitcore HORST Roboter beschreiben eine Pose durch eine Position in +Metern und ein Quaternion mit q_0 = w, q_1 = x, q_2 = y und q_3 = z +wie auch + +rc_visard NG + + Geräte. Es ist keine Konvertierung notwendig. diff --git a/v24.04/de/_sources/pose_format_kawasaki.rst.txt b/v24.04/de/_sources/pose_format_kawasaki.rst.txt new file mode 100644 index 0000000..f036db0 --- /dev/null +++ b/v24.04/de/_sources/pose_format_kawasaki.rst.txt @@ -0,0 +1,60 @@ +Kawasaki XYZ-OAT Format + +Das Posenformat, welches von Kawasaki Robotern benutzt wird, besteht +aus einer Position XYZ in Millimetern und einer Orientierung OAT, +welche durch drei Winkel in Grad angegeben wird. O rotiert um die +z-Achse, A rotiert um die gedrehte y-Achse und T rotiert um die +gedrehte z-Achse. Die Rotationsreihenfolge ist z-y'-z'' (d.h. z-y-z) +und wird berechnet durch r_z(O) r_y(A) r_z(T). + +Umrechnung von Kawasaki-OAT in Quaternionen + +Zur Umrechnung von OAT Winkeln in Grad in eine Quaternion +q=(\begin{array}{cccc}x & y & z & w\end{array}) werden zunächst alle +Winkel in das Bogenmaß umgerechnet durch + + O_r = O \frac{\pi}{180} \text{,} \\ A_r = A \frac{\pi}{180} + \text{,} \\ T_r = T \frac{\pi}{180} \text{,} \\ + +und damit wird die Quaternion berechnet durch + + x = \cos{(O_r/2)}\sin{(A_r/2)}\sin{(T_r/2)} - + \sin{(O_r/2)}\sin{(A_r/2)}\cos{(T_r/2)} \text{,} \\ y = + \cos{(O_r/2)}\sin{(A_r/2)}\cos{(T_r/2)} + + \sin{(O_r/2)}\sin{(A_r/2)}\sin{(T_r/2)} \text{,} \\ z = + \sin{(O_r/2)}\cos{(A_r/2)}\cos{(T_r/2)} + + \cos{(O_r/2)}\cos{(A_r/2)}\sin{(T_r/2)} \text{,} \\ w = + \cos{(O_r/2)}\cos{(A_r/2)}\cos{(T_r/2)} - + \sin{(O_r/2)}\cos{(A_r/2)}\sin{(T_r/2)} \text{.} + +Umrechnung von Quaternionen in Kawasaki-OAT + +Die Umrechnung von einer Quaternion q=(\begin{array}{cccc}x & y & z & +w\end{array}) mit ||q||=1 in OAT Winkel in Grad kann wie folgt +durchgeführt werden. + +Wenn x = 0 + +und + + y = 0 ist die Umrechnung + + O &= \text{atan}_2{(2(z - w), 2(z + w))} \frac{180}{\pi} \\ A &= + \text{acos}{(w^2 + z^2)} \frac{180}{\pi} \\ T &= \text{atan}_2{(2(z + + w), 2(w - z))} \frac{180}{\pi} + +Wenn z = 0 + +und + + w = 0 ist die Umrechnung + + O &= \text{atan}_2{(2(y - x), 2(x + y))} \frac{180}{\pi} \\ A &= + \text{acos}{(-1.0)} \frac{180}{\pi} \\ T &= \text{atan}_2{(2(y + + x), 2(y - x))} \frac{180}{\pi} + +In allen anderen Fällen ist die Umrechnung + + O &= \text{atan}_2{(2(yz - wx), 2(xz + wy))} \frac{180}{\pi} \\ A + &= \text{acos}{(w^2 - x^2 - y^2 + z^2)} \frac{180}{\pi} \\ T &= + \text{atan}_2{(2(yz + wx), 2(wy - xz))} \frac{180}{\pi} diff --git a/v24.04/de/_sources/pose_format_kuka.rst.txt b/v24.04/de/_sources/pose_format_kuka.rst.txt new file mode 100644 index 0000000..fc1bcd8 --- /dev/null +++ b/v24.04/de/_sources/pose_format_kuka.rst.txt @@ -0,0 +1,37 @@ +KUKA XYZ-ABC Format + +KUKA Roboter nutzen das sogenannte XYZ-ABC Format. XYZ ist die +Position in Millimetern. ABC sind Winkel in Grad, wobei A um die +z-Achse rotiert, B rotiert um die y-Achse und C rotiert um die +x-Achse. Die Rotationsreihenfolge ist z-y'-x'' (i.e. x-y-z) und wird +berechnet durch r_z(A) r_y(B) r_x(C). + +Umrechnung von KUKA-ABC in Quaternionen + +Zur Umrechnung von ABC Winkeln in Grad in eine Quaternion +q=(\begin{array}{cccc}x & y & z & w\end{array}) werden zuerst alle +Winkel in das Bogenmaß umgerechnet mit + + A_r = A \frac{\pi}{180} \text{,} \\ B_r = B \frac{\pi}{180} + \text{,} \\ C_r = C \frac{\pi}{180} \text{,} \\ + +und damit die Quaternion berechnet durch + + x = \cos{(A_r/2)}\cos{(B_r/2)}\sin{(C_r/2)} - + \sin{(A_r/2)}\sin{(B_r/2)}\cos{(C_r/2)} \text{,} \\ y = + \cos{(A_r/2)}\sin{(B_r/2)}\cos{(C_r/2)} + + \sin{(A_r/2)}\cos{(B_r/2)}\sin{(C_r/2)} \text{,} \\ z = + \sin{(A_r/2)}\cos{(B_r/2)}\cos{(C_r/2)} - + \cos{(A_r/2)}\sin{(B_r/2)}\sin{(C_r/2)} \text{,} \\ w = + \cos{(A_r/2)}\cos{(B_r/2)}\cos{(C_r/2)} + + \sin{(A_r/2)}\sin{(B_r/2)}\sin{(C_r/2)} \text{.} + +Umrechnung von Quaternionen in KUKA-ABC + +Die Umrechnung von einer Quaternion q=(\begin{array}{cccc}x & y & z & +w\end{array}) mit ||q||=1 in ABC Winkel in Grad kann wie folgt +durchgeführt werden. + + A &= \text{atan}_2{(2(wz + xy), 1 - 2(y^2 + z^2))} \frac{180}{\pi} + \\ B &= \text{asin}{(2(wy - zx))} \frac{180}{\pi} \\ C &= + \text{atan}_2{(2(wx + yz), 1 - 2(x^2 + y^2))} \frac{180}{\pi} diff --git a/v24.04/de/_sources/pose_format_mitsubishi.rst.txt b/v24.04/de/_sources/pose_format_mitsubishi.rst.txt new file mode 100644 index 0000000..26e65b2 --- /dev/null +++ b/v24.04/de/_sources/pose_format_mitsubishi.rst.txt @@ -0,0 +1,40 @@ +Mitsubishi XYZ-ABC Format + +Das Posenformat, welches von Mitsubishi Robotern benutzt wird, ist das +gleiche wie für KUKA Roboter (siehe + +KUKA XYZ-ABC Format + +), außer, dass der Winkel A um die x-Achse rotiert und C eine Rotation +um die z-Achse ist. Damit wird die Rotation berechnet durch r_z(C) +r_y(B) r_x(A). + +Umrechnung von Mitsubishi-ABC in Quaternionen + +Zur Umrechnung von ABC Winkeln in Grad in eine Quaternion +q=(\begin{array}{cccc}x & y & z & w\end{array}) werden die Winkel +zunächst ins Bogenmaß umgerechnet mit + + A_r = A \frac{\pi}{180} \text{,} \\ B_r = B \frac{\pi}{180} + \text{,} \\ C_r = C \frac{\pi}{180} \text{,} \\ + +und damit die Quaternion berechnet durch + + x = \cos{(C_r/2)}\cos{(B_r/2)}\sin{(A_r/2)} - + \sin{(C_r/2)}\sin{(B_r/2)}\cos{(A_r/2)} \text{,} \\ y = + \cos{(C_r/2)}\sin{(B_r/2)}\cos{(A_r/2)} + + \sin{(C_r/2)}\cos{(B_r/2)}\sin{(A_r/2)} \text{,} \\ z = + \sin{(C_r/2)}\cos{(B_r/2)}\cos{(A_r/2)} - + \cos{(C_r/2)}\sin{(B_r/2)}\sin{(A_r/2)} \text{,} \\ w = + \cos{(C_r/2)}\cos{(B_r/2)}\cos{(A_r/2)} + + \sin{(C_r/2)}\sin{(B_r/2)}\sin{(A_r/2)} \text{.} + +Umrechnung von Quaternionen in Mitsubishi-ABC + +Die Umrechnung von einer Quaternion q=(\begin{array}{cccc}x & y & z & +w\end{array}) mit ||q||=1 in ABC Winkel in Grad kann wie folgt +durchgeführt werden. + + A &= \text{atan}_2{(2(wx + yz), 1 - 2(x^2 + y^2))} \frac{180}{\pi} + \\ B &= \text{asin}{(2(wy - zx))} \frac{180}{\pi} \\ C &= + \text{atan}_2{(2(wz + xy), 1 - 2(y^2 + z^2))} \frac{180}{\pi} diff --git a/v24.04/de/_sources/pose_format_rt.rst.txt b/v24.04/de/_sources/pose_format_rt.rst.txt new file mode 100644 index 0000000..9fb66b5 --- /dev/null +++ b/v24.04/de/_sources/pose_format_rt.rst.txt @@ -0,0 +1,43 @@ +Rotationsmatrix und Translationsvektor + +Eine Pose kann mit einer Rotationsmatrix R und einem +Translationsvektor T definiert werden. + + R = \left(\begin{array}{ccc} r_{00} & r_{01} & r_{02} \\ r_{10} + & r_{11} & r_{12} \\ r_{20} & r_{21} & r_{22} \end{array}\right), + \qquad T = \left(\begin{array}{c} X \\ Y \\ Z + \end{array}\right). + +Die Posentransformation für einen Punkt P ist + + P' = R P + T. + +Umrechnung von Rotationsmatrizen in Quaternionen + +Die Umrechnung von einer Rotationsmatrix (mit det(R)=1) in eine +Quaternion q=(\begin{array}{cccc}x & y & z & w\end{array}) kann wie +folgt durchgeführt werden. + + x &= \text{sign}(r_{21}-r_{12}) \frac{1}{2}\sqrt{\text{max}(0, 1 + + r_{00} - r_{11} - r_{22})} \\ y &= \text{sign}(r_{02}-r_{20}) + \frac{1}{2}\sqrt{\text{max}(0, 1 - r_{00} + r_{11} - r_{22})} \\ z + &= \text{sign}(r_{10}-r_{01}) \frac{1}{2}\sqrt{\text{max}(0, 1 - + r_{00} - r_{11} + r_{22})} \\ w &= \frac{1}{2}\sqrt{\text{max}(0, 1 + + r_{00} + r_{11} + r_{22})} + +Der \text{sign} Operator gibt -1 zurück, falls sein Argument negativ +ist. Sonst wird 1 zurück gegeben. Er wird zur Wiederherstellung das +Vorzeichens der Wurzel benutzt. Die \text{max} Funktion stellt sicher, +dass das Argument der Wurzel nicht negativ ist, was in der Praxis +durch Rundungsfehler passieren kann. + +Umrechnung von Quaternionen in Rotationsmatrizen + +Die Umrechnung von einer Quaternion q=(\begin{array}{cccc}x & y & z & +w\end{array}) mit ||q||=1 in eine Rotationsmatrix kann wie folgt +durchgeführt werden. + + R = 2 \left(\begin{array}{ccc} \frac{1}{2} - y^2 - z^2 & x y - z + w & x z + y w \\ x y + z w & \frac{1}{2} - x^2 - z^2 & y z - x w + \\ x z - y w & y z + x w & \frac{1}{2} - x^2 - y^2 + \end{array}\right) diff --git a/v24.04/de/_sources/pose_format_ur.rst.txt b/v24.04/de/_sources/pose_format_ur.rst.txt new file mode 100644 index 0000000..41bb81a --- /dev/null +++ b/v24.04/de/_sources/pose_format_ur.rst.txt @@ -0,0 +1,49 @@ +Universal Robots Posenformat + +Das Posenformat, welches von Universal Robots verwendet wird, besteht +aus einer Position XYZ in Millimetern und einer Orientierung im Angle- +Axis Format V=(\begin{array}{ccc}RX & RY & RZ\end{array})^T. Der +Rotationswinkel \theta im Bogenmaß ist die Länge der Rotationsachse U. + + V = \left(\begin{array}{c}RX \\ RY \\ RZ\end{array}\right) = + \left(\begin{array}{c}\theta u_x \\ \theta u_y \\ \theta + u_z\end{array}\right) + +V wird als Rotationsvektor bezeichnet. + +Umrechnung vom Angle-Axis Format in Quaternionen + +Die Umrechnung von einem Rotationsvektor V in eine Quaternion +q=(\begin{array}{cccc}x & y & z & w\end{array}) kann wie folgt +durchgeführt werden. + +Zunächst wird der Winkel \theta im Bogenmaß aus dem Rotationsvektor V +gewonnen durch + + \theta = \sqrt{RX^2 + RY^2 + RZ^2}\text{.} + +Wenn \theta = 0, dann ist die Quaternion gleich +q=(\begin{array}{cccc}0 & 0 & 0 & 1\end{array}), sonst wird sie +berechnet durch + + x = RX \frac{\sin(\theta/2)}{\theta}\text{,} \\ y = RY + \frac{\sin(\theta/2)}{\theta}\text{,} \\ z = RZ + \frac{\sin(\theta/2)}{\theta}\text{,} \\ w = \cos(\theta/2)\text{.} + +Umrechnung von Quaternionen ins Angle-Axis Format + +Die Umrechnung von einer Quaternion q=(\begin{array}{cccc}x & y & z & +w\end{array}) mit ||q||=1 in einen Rotationsvektor im Angle-Axis +Format kann wie folgt durchgeführt werden. + +Zunächst wird der Winkel \theta im Bogenmaß aus dem Quaternion +gewonnen durch + + \theta = 2\cdot\text{acos}(w)\text{.} + +Wenn \theta = 0, dann ist der Rotationsvektor V=(\begin{array}{ccc}0 & +0 & 0\end{array})^T, sonst wird er berechnet durch + + RX = \theta \frac{x}{\sqrt{1-w^2}}\text{,} \\ RY = \theta + \frac{y}{\sqrt{1-w^2}}\text{,} \\ RZ = \theta + \frac{z}{\sqrt{1-w^2}}\text{.} diff --git a/v24.04/de/_sources/pose_format_yaskawa.rst.txt b/v24.04/de/_sources/pose_format_yaskawa.rst.txt new file mode 100644 index 0000000..0644612 --- /dev/null +++ b/v24.04/de/_sources/pose_format_yaskawa.rst.txt @@ -0,0 +1,38 @@ +Yaskawa Posenformat + +Das Posenformat, welches von Yaskawa Robotern benutzt wird, besteht +aus einer Position XYZ in Millimetern und einer Orientierung, welche +durch drei Winkel in Grad gegeben ist. Rx rotiert um die x-Achse, Ry +rotiert um die y-Achse und Rz rotiert um die z-Achse. Die +Rotationsreihenfolge ist x-y-z und wird berechnet durch r_z(Rz) +r_y(Ry) r_x(Rx). + +Umrechnung von Yaskawa Rx, Ry, Rz in Quaternionen + +Zur Umrechnung von Rx, Ry, Rz Winkeln in Grad in eine Quaternion +q=(\begin{array}{cccc}x & y & z & w\end{array}) werden zunächst die +Winkel ins Bogenmaß umgerechnet + + X_r = Rx \frac{\pi}{180} \text{,} \\ Y_r = Ry \frac{\pi}{180} + \text{,} \\ Z_r = Rz \frac{\pi}{180} \text{,} \\ + +und damit wird die Quaternion berechnet als + + x = \cos{(Z_r/2)}\cos{(Y_r/2)}\sin{(X_r/2)} - + \sin{(Z_r/2)}\sin{(Y_r/2)}\cos{(X_r/2)} \text{,} \\ y = + \cos{(Z_r/2)}\sin{(Y_r/2)}\cos{(X_r/2)} + + \sin{(Z_r/2)}\cos{(Y_r/2)}\sin{(X_r/2)} \text{,} \\ z = + \sin{(Z_r/2)}\cos{(Y_r/2)}\cos{(X_r/2)} - + \cos{(Z_r/2)}\sin{(Y_r/2)}\sin{(X_r/2)} \text{,} \\ w = + \cos{(Z_r/2)}\cos{(Y_r/2)}\cos{(X_r/2)} + + \sin{(Z_r/2)}\sin{(Y_r/2)}\sin{(X_r/2)} \text{.} + +Umrechnung von Quaternionen in Yaskawa Rx, Ry, Rz + +Die Umrechnung von einer Quaternion q=(\begin{array}{cccc}x & y & z & +w\end{array}) mit ||q||=1 in Rx, Ry, Rz Winkel in Grad kann wie folgt +durchgeführt werden. + + Rx &= \text{atan}_2{(2(wx + yz), 1 - 2(x^2 + y^2))} \frac{180}{\pi} + \\ Ry &= \text{asin}{(2(wy - zx))} \frac{180}{\pi} \\ Rz &= + \text{atan}_2{(2(wz + xy), 1 - 2(y^2 + z^2))} \frac{180}{\pi} diff --git a/v24.04/de/_sources/rest_api.rst.txt b/v24.04/de/_sources/rest_api.rst.txt new file mode 100644 index 0000000..d983310 --- /dev/null +++ b/v24.04/de/_sources/rest_api.rst.txt @@ -0,0 +1,45 @@ +REST-API-Schnittstelle + +Neben der + +GenICam-Schnittstelle + + bietet der + +rc_visard NG + + eine umfassende RESTful-Web-Schnittstelle (REST-API), auf die jeder +HTTP-Client und jede HTTP-Bibliothek zugreifen kann. Während die +meisten Parameter, Services und Funktionen auch über die +benutzerfreundliche + +Web GUI + + zugänglich sind, dient die REST-API eher als Maschine-Maschine- +Schnittstelle für folgende programmgesteuerte Aufgaben: + +Setzen und Abrufen der Laufzeitparameter der Softwaremodule, z.B. der +Stereokamera oder von Bildverarbeitungsmodulen, + +Aufrufen von Services, z.B. zum Starten und Stoppen einzelner +Softwaremodule, oder zum Nutzen spezieller Funktionen, wie der Hand- +Auge-Kalibrierung, + +Abruf des aktuellen Systemstatus und des Status einzelner +Softwaremodule, sowie + +Aktualisierung der Firmware des rc_visard NG oder seiner Lizenz. + +Bemerkung: In der REST-API des + + rc_visard NG + + bezeichnet der Begriff + + Node + + ein Softwaremodul, das gewisse algorithmische Funktionen bündelt + und eine ganzheitliche Benutzeroberfläche (Parameter, Services, + aktueller Status) besitzt. Beispiele für solche Module sind das + Stereo-Matching-Modul oder das Modul zur Hand-Auge-Kalibrierung. + diff --git a/v24.04/de/_sources/rest_api_datamodel.rst.txt b/v24.04/de/_sources/rest_api_datamodel.rst.txt new file mode 100644 index 0000000..7b7e149 --- /dev/null +++ b/v24.04/de/_sources/rest_api_datamodel.rst.txt @@ -0,0 +1,1105 @@ +Datentyp-Definitionen + +Die REST-API definiert folgende Datenmodelle, die verwendet werden, um +auf die + +verfügbaren Ressourcen + + zuzugreifen oder diese zu ändern, entweder als benötigte +Attribute/Parameter oder als Rückgabewerte. + +DNS: + DNS-Server Einstellungen. + + Ein Objekt des Typs DNS besitzt folgende Eigenschaften: + + dns_servers (string-Array) + + manual_dns_servers (string-Array) + + Musterobjekt + + { + "dns_servers": [ + "string", + "string" + ], + "manual_dns_servers": [ + "string", + "string" + ] + } + + DNS-Objekte sind in + + SysInfo + + enthalten und werden für folgende Anfragen verwendet: + + GET /system/dns + + PUT /system/dns + +FirmwareInfo: + Informationen zu aktuell aktiven und inaktiven Firmware-Images und + dazu, welches Image für den Boot-Vorgang verwendet wird. + + Ein Objekt des Typs FirmwareInfo besitzt folgende Eigenschaften: + + active_image (ImageInfo): siehe Beschreibung von ImageInfo. + + fallback_booted (boolean): TRUE, wenn das gewünschte Image nicht + hochgefahren werden konnte und ein Fallback auf das zuvor genutzte + Image vorgenommen wurde. + + inactive_image (ImageInfo): siehe Beschreibung von ImageInfo. + + next_boot_image (string): Firmware-Image, das beim nächsten + Neustart geladen wird (entweder active_image oder inactive_image). + + Musterobjekt + + { + "active_image": { + "image_version": "string" + }, + "fallback_booted": false, + "inactive_image": { + "image_version": "string" + }, + "next_boot_image": "string" + } + + FirmwareInfo-Objekte sind in + + SysInfo + + enthalten und werden für folgende Anfragen verwendet: + + GET /system/rollback + + GET /system/update + +GripperElement: + CAD-Greiferelement + + Ein Objekt des Typs GripperElement besitzt folgende Eigenschaften: + + id (string): Eindeutiger Name des Elements + + Musterobjekt + + { + "id": "string" + } + + GripperElement-Objekte werden in folgenden Anfragen verwendet: + + GET /cad/gripper_elements + + GET /cad/gripper_elements/{id} + + PUT /cad/gripper_elements/{id} + +HostPort: + Auf dem Host verfügbarer Port + + Ein Objekt des Typs HostPort besitzt folgende Eigenschaften: + + port (integer) + + protocol (string) + + Musterobjekt + + { + "port": 0, + "protocol": "string" + } + + HostPort-Objekte sind in + + UserSpaceContainer + + enthalten. + +ImageInfo: + Informationen zu einem bestimmten Firmware-Image. + + Ein Objekt des Typs ImageInfo besitzt folgende Eigenschaften: + + image_version (string): Image-Version. + + Musterobjekt + + { + "image_version": "string" + } + + ImageInfo-Objekte sind in + + FirmwareInfo + + enthalten. + +LicenseComponentConstraint: + Einschränkungen für die Modul-Version. + + Ein Objekt des Typs LicenseComponentConstraint besitzt folgende + Eigenschaften: + + max_version (string) - optionale höchste unterstützte Version + (exclusive) + + min_version (string) - optionale minimale unterstützte Version + (inclusive) + + Musterobjekt + + { + "max_version": "string", + "min_version": "string" + } + + LicenseComponentConstraint-Objekte sind in + + LicenseConstraints + + enthalten. + +LicenseComponents: + Liste der Lizenzstatus-Angaben der einzelnen Softwaremodule: Der + zugehörige Statusindikator ist auf TRUE gesetzt, wenn das + entsprechende Modul mit einer installierten Softwarelizenz + entsperrt ist. + + Ein Objekt des Typs LicenseComponents besitzt folgende + Eigenschaften: + + hand_eye_calibration (boolean): Modul zur Hand-Auge-Kalibrierung. + + rectification (boolean): Modul zur Bildrektifizierung. + + stereo (boolean): Stereo-Matching-Modul. + + Musterobjekt + + { + "hand_eye_calibration": false, + "rectification": false, + "stereo": false + } + + LicenseComponents-Objekte sind in + + LicenseInfo + + enthalten. + +LicenseConstraints: + Versionseinschränkungen für Module. + + Ein Objekt des Typs LicenseConstraints besitzt folgende + Eigenschaften: + + image_version (LicenseComponentConstraint) - siehe Beschreibung von + LicenseComponentConstraint + + Musterobjekt + + { + "image_version": { + "max_version": "string", + "min_version": "string" + } + } + + LicenseConstraints-Objekte sind in + + LicenseInfo + + enthalten. + +LicenseInfo: + Informationen zur aktuell auf dem Gerät angewandten Softwarelizenz. + + Ein Objekt des Typs LicenseInfo besitzt folgende Eigenschaften: + + components (LicenseComponents): siehe Beschreibung von + LicenseComponents. + + components_constraints (LicenseConstraints) - siehe Beschreibung + von LicenseConstraints + + valid (boolean): Angabe, ob eine Lizenz gültig ist oder nicht. + + Musterobjekt + + { + "components": { + "hand_eye_calibration": false, + "rectification": false, + "stereo": false + }, + "components_constraints": { + "image_version": { + "max_version": "string", + "min_version": "string" + } + }, + "valid": false + } + + LicenseInfo-Objekte werden in folgenden Anfragen verwendet: + + GET /system/license + +Log: + Inhalt einer bestimmten Logdatei im JSON-Format. + + Ein Objekt des Typs Log besitzt folgende Eigenschaften: + + date (float): UNIX-Uhrzeit, zu der das Log zuletzt geändert wurde. + + log (LogEntry-Array): die eigentlichen Logeinträge. + + name (string): Name der Logdatei. + + size (Integer): Größe der Logdatei in Bytes. + + Musterobjekt + + { + "date": 0, + "log": [ + { + "component": "string", + "level": "string", + "message": "string", + "timestamp": 0 + }, + { + "component": "string", + "level": "string", + "message": "string", + "timestamp": 0 + } + ], + "name": "string", + "size": 0 + } + + Log-Objekte werden in folgenden Anfragen verwendet: + + GET /logs/{log} + +LogEntry: + Darstellung eines einzelnen Logeintrags in einer Logdatei. + + Ein Objekt des Typs LogEntry besitzt folgende Eigenschaften: + + component (string): Name des Moduls, das diesen Eintrag angelegt + hat. + + level (string): Logstufe (mögliche Werte: DEBUG, INFO, WARN, ERROR + oder FATAL) + + message (string): eigentliche Lognachricht. + + timestamp (float): UNIX-Uhrzeit des Logeintrags. + + Musterobjekt + + { + "component": "string", + "level": "string", + "message": "string", + "timestamp": 0 + } + + LogEntry-Objekte sind in + + Log + + enthalten. + +LogInfo: + Informationen zu einer bestimmten Logdatei. + + Ein Objekt des Typs LogInfo besitzt folgende Eigenschaften: + + date (float): UNIX-Uhrzeit, zu der das Log zuletzt geändert wurde. + + name (string): Name der Logdatei. + + size (Integer): Größe der Logdatei in Bytes. + + Musterobjekt + + { + "date": 0, + "name": "string", + "size": 0 + } + + LogInfo-Objekte werden in folgenden Anfragen verwendet: + + GET /logs + +ManualDNSServers: + Liste der manuellen DNS-Server. + + Ein Objekt des Typs ManualDNSServers besitzt folgende + Eigenschaften: + + manual_dns_servers (string-Array) + + Musterobjekt + + { + "manual_dns_servers": [ + "string", + "string" + ] + } + + ManualDNSServers-Objekte werden in folgenden Anfragen verwendet: + + PUT /system/dns + +NetworkInfo: + Aktuelle Netzwerk Konfiguration. + + Ein Objekt des Typs NetworkInfo besitzt folgende Eigenschaften: + + current_method (string) - Methode mit der die aktuellen + Einstellungen gesetzt wurden (mögliche Werte: INIT, LinkLocal, + DHCP, PersistentIP, TemporaryIP) + + default_gateway (string) - aktueller Default Gateway + + ip_address (string) - aktuelle IP-Adresse + + settings (NetworkSettings) - siehe Beschreibung von NetworkSettings + + subnet_mask (string) - aktuelle Subnetzmaske + + Musterobjekt + + { + "current_method": "string", + "default_gateway": "string", + "ip_address": "string", + "settings": { + "dhcp_enabled": false, + "persistent_default_gateway": "string", + "persistent_ip_address": "string", + "persistent_ip_enabled": false, + "persistent_subnet_mask": "string" + }, + "subnet_mask": "string" + } + + NetworkInfo-Objekte sind in + + SysInfo + + enthalten und werden für folgende Anfragen verwendet: + + GET /system/network + +NetworkSettings: + Aktuelle Netzwerk Einstellungen. + + Ein Objekt des Typs NetworkSettings besitzt folgende Eigenschaften: + + dhcp_enabled (boolean) - DHCP eingeschaltet + + persistent_default_gateway (string) - Persistenter Default Gateway + + persistent_ip_address (string) - Persistente IP-Adresse + + persistent_ip_enabled (boolean) - Persistente IP aktiviert + + persistent_subnet_mask (string) - Persistente Subnetzmaske + + Musterobjekt + + { + "dhcp_enabled": false, + "persistent_default_gateway": "string", + "persistent_ip_address": "string", + "persistent_ip_enabled": false, + "persistent_subnet_mask": "string" + } + + NetworkSettings-Objekte sind in + + NetworkInfo + + enthalten und werden für folgende Anfragen verwendet: + + GET /system/network/settings + + PUT /system/network/settings + +NodeInfo: + Beschreibung eines auf dem Gerät laufenden Softwaremoduls. + + Ein Objekt des Typs NodeInfo besitzt folgende Eigenschaften: + + name (string): Name des Moduls. + + parameters (string-Array): Liste der Laufzeitparameter des Moduls. + + services (string-Array): Liste der von diesem Modul angebotenen + Services. + + status (string): Status des Moduls (mögliche Werte: unknown, down, + idle oder running). + + Musterobjekt + + { + "name": "string", + "parameters": [ + "string", + "string" + ], + "services": [ + "string", + "string" + ], + "status": "string" + } + + NodeInfo-Objekte werden in folgenden Anfragen verwendet: + + GET /nodes + + GET /nodes/{node} + + GET /pipelines/{pipeline}/nodes + + GET /pipelines/{pipeline}/nodes/{node} + +NodeStatus: + Detaillierter aktueller Status des Moduls, einschließlich + Laufzeitstatistik. + + Ein Objekt des Typs NodeStatus besitzt folgende Eigenschaften: + + status (string): Status des Moduls (mögliche Werte: unknown, down, + idle oder running). + + timestamp (float): UNIX-Uhrzeit, zu der die Werte zuletzt + aktualisiert wurden. + + values (object): Dictionary (Schlüssel-Werte-Auflistung) mit den + aktuellen Statuswerten/Statistiken des Moduls. + + Musterobjekt + + { + "status": "string", + "timestamp": 0, + "values": {} + } + + NodeStatus-Objekte werden in folgenden Anfragen verwendet: + + GET /nodes/{node}/status + + GET /pipelines/{pipeline}/nodes/{node}/status + +NtpStatus: + Status der NTP-Zeitsynchronisierung. + + Ein Objekt des Typs NtpStatus besitzt folgende Eigenschaften: + + accuracy (string): vom Network Time Protocol (NTP) gemeldete + Genauigkeit der Zeitsynchronisierung. + + synchronized (boolean): synchronisiert mit dem NTP-Server. + + Musterobjekt + + { + "accuracy": "string", + "synchronized": false + } + + NtpStatus-Objekte sind in + + SysInfo + + enthalten. + +Parameter: + Darstellung der Laufzeitparameter eines Moduls: Der Datentyp des + Werts („value“) eines Parameters (und damit der Datentyp der Felder + „min“, „max“ und „default“) lässt sich vom Feld „type“ ableiten und + kann ein primitiver Datentyp sein. + + Ein Objekt des Typs Parameter besitzt folgende Eigenschaften: + + default (Typ nicht definiert): ab Werk voreingestellter Wert des + Parameters. + + description (string): Beschreibung des Parameters. + + max (Typ nicht definiert): Höchstwert, der diesem Parameter + zugewiesen werden kann. + + min (Typ nicht definiert): Mindestwert, der diesem Parameter + zugewiesen werden kann. + + name (string): Name des Parameters. + + type (string): als Zeichenfolge dargestellter primitiver Datentyp + des Parameters (mögliche Werte: bool, int8, uint8, int16, uint16, + int32, uint32, int64, uint64, float32, float64 oder string). + + value (Typ nicht definiert): aktueller Wert des Parameters. + + Musterobjekt + + { + "default": {}, + "description": "string", + "max": {}, + "min": {}, + "name": "string", + "type": "string", + "value": {} + } + + Parameter-Objekte werden in folgenden Anfragen verwendet: + + GET /pipelines/{pipeline}/nodes/{node}/parameters + + PUT /pipelines/{pipeline}/nodes/{node}/parameters + + GET /pipelines/{pipeline}/nodes/{node}/parameters/{param} + + PUT /pipelines/{pipeline}/nodes/{node}/parameters/{param} + +ParameterNameValue: + Parametername und -wert. Der Typ des Parameterwerts (Felder 'value' + und 'min', 'max', 'default') ist durch das Feld 'type' angegeben + und kann einer der eingebauten primitiven Datentypen sein. + + Ein Objekt des Typs ParameterNameValue besitzt folgende + Eigenschaften: + + name (string): Name des Parameters. + + value (Typ nicht definiert): aktueller Wert des Parameters. + + Musterobjekt + + { + "name": "string", + "value": {} + } + + ParameterNameValue-Objekte werden in folgenden Anfragen verwendet: + + PUT /pipelines/{pipeline}/nodes/{node}/parameters + +ParameterValue: + Parameterwert. Der Typ des Parameterwerts (Felder 'value' und + 'min', 'max', 'default') ist durch das Feld 'type' angegeben und + kann einer der eingebauten primitiven Datentypen sein. + + Ein Objekt des Typs ParameterValue besitzt folgende Eigenschaften: + + value (Typ nicht definiert): aktueller Wert des Parameters. + + Musterobjekt + + { + "value": {} + } + + ParameterValue-Objekte werden in folgenden Anfragen verwendet: + + PUT /pipelines/{pipeline}/nodes/{node}/parameters/{param} + +PtpStatus: + Status der PTP-Zeitsynchronisierung gemäß IEEE 1588. + + Ein Objekt des Typs PtpStatus besitzt folgende Eigenschaften: + + master_ip (string): IP-Adresse des Haupttaktgebers. + + offset (float): zeitlicher Versatz zum Haupttaktgeber in Sekunden. + + offset_dev (float): Standardabweichung des zeitlichen Versatzes zum + Haupttaktgeber in Sekunden. + + offset_mean (float): mittlere Zeitverschiebung in Sekunden zum + Haupttaktgeber. + + state (string): PTP-Zustand (mögliche Werte: off, unknown, + INITIALIZING, FAULTY, DISABLED, LISTENING, PASSIVE, UNCALIBRATED + oder SLAVE). + + Musterobjekt + + { + "master_ip": "string", + "offset": 0, + "offset_dev": 0, + "offset_mean": 0, + "state": "string" + } + + PtpStatus-Objekte sind in + + SysInfo + + enthalten. + +Service: + Darstellung eines von einem Modul angebotenen Services. + + Ein Objekt des Typs Service besitzt folgende Eigenschaften: + + args (ServiceArgs): siehe Beschreibung von ServiceArgs. + + description (string): Kurzbeschreibung des Services. + + name (string): Name des Services. + + response (ServiceResponse): siehe Beschreibung von ServiceResponse. + + Musterobjekt + + { + "args": {}, + "description": "string", + "name": "string", + "response": {} + } + + Service-Objekte werden in folgenden Anfragen verwendet: + + GET /nodes/{node}/services + + GET /nodes/{node}/services/{service} + + PUT /nodes/{node}/services/{service} + + GET /pipelines/{pipeline}/nodes/{node}/services + + GET /pipelines/{pipeline}/nodes/{node}/services/{service} + + PUT /pipelines/{pipeline}/nodes/{node}/services/{service} + +ServiceArgs: + Argumente, die für den Aufruf eines Services benötigt werden: Diese + Argumente werden in der Regel in einem (verschachtelten) Dictionary + (Schlüssel-Werte-Auflistung) dargestellt. Der genaue Inhalt dieses + Dictionarys hängt vom jeweiligen Modul und vom Serviceaufruf ab. + + ServiceArg-Objekte sind in + + Service + + enthalten. + +ServiceResponse: + Die von dem Serviceaufruf zurückgegebene Antwort: Die Antwort wird + in der Regel in einem (verschachtelten) Dictionary (Schlüssel- + Werte-Auflistung) dargestellt. Der genaue Inhalt dieses Dictionarys + hängt vom jeweiligen Modul und von dem Serviceaufruf ab. + + ServiceResponse-Objekte sind in + + Service + + enthalten. + +SysInfo: + Systeminformationen über das Gerät. + + Ein Objekt des Typs SysInfo besitzt folgende Eigenschaften: + + dns (DNS): siehe Beschreibung von DNS. + + firmware (FirmwareInfo): siehe Beschreibung von FirmwareInfo. + + hostname (string): Host-Name. + + link_speed (Integer): Ethernet-Verbindungsgeschwindigkeit in + Mb/Sekunde. + + mac (string): MAC-Adresse. + + network (NetworkInfo): siehe Beschreibung von NetworkInfo + + ntp_status (NtpStatus): siehe Beschreibung von NtpStatus. + + ptp_status (PtpStatus): siehe Beschreibung von PtpStatus. + + ready (boolean): Das System ist vollständig hochgefahren und + betriebsbereit. + + serial (string): Seriennummer des Geräts. + + time (float): Systemzeit als UNIX-Zeitstempel. + + ui_lock (UILock): siehe Beschreibung von UILock + + uptime (float): Betriebszeit in Sekunden. + + Musterobjekt + + { + "dns": { + "dns_servers": [ + "string", + "string" + ], + "manual_dns_servers": [ + "string", + "string" + ] + }, + "firmware": { + "active_image": { + "image_version": "string" + }, + "fallback_booted": false, + "inactive_image": { + "image_version": "string" + }, + "next_boot_image": "string" + }, + "hostname": "string", + "link_speed": 0, + "mac": "string", + "network": { + "current_method": "string", + "default_gateway": "string", + "ip_address": "string", + "settings": { + "dhcp_enabled": false, + "persistent_default_gateway": "string", + "persistent_ip_address": "string", + "persistent_ip_enabled": false, + "persistent_subnet_mask": "string" + }, + "subnet_mask": "string" + }, + "ntp_status": { + "accuracy": "string", + "synchronized": false + }, + "ptp_status": { + "master_ip": "string", + "offset": 0, + "offset_dev": 0, + "offset_mean": 0, + "state": "string" + }, + "ready": false, + "serial": "string", + "time": 0, + "ui_lock": { + "enabled": false + }, + "uptime": 0 + } + + SysInfo-Objekte werden in folgenden Anfragen verwendet: + + GET /system + +Template: + Template für die Erkennung + + Ein Objekt des Typs Template besitzt folgende Eigenschaften: + + id (string): Eindeutiger Name des Templates + + Musterobjekt + + { + "id": "string" + } + + Template-Objekte werden in folgenden Anfragen verwendet: + + GET /templates/rc_boxpick + + GET /templates/rc_boxpick/{id} + + PUT /templates/rc_boxpick/{id} + + GET /templates/rc_silhouettematch + + GET /templates/rc_silhouettematch/{id} + + PUT /templates/rc_silhouettematch/{id} + +UILock: + UI Lock Status. + + Ein Objekt des Typs UILock besitzt folgende Eigenschaften: + + enabled (boolean) + + Musterobjekt + + { + "enabled": false + } + + UILock-Objekte sind in + + SysInfo + + enthalten und werden für folgende Anfragen verwendet: + + GET /system/ui_lock + +UserSpace: + UserSpace Information + + Ein Objekt des Typs UserSpace besitzt folgende Eigenschaften: + + apps (UserSpaceApp-Array): die UserSpace Apps. + + available (boolean) - UserSpace verfügbar + + enabled (boolean) - UserSpace eingeschaltet + + Musterobjekt + + { + "apps": [ + { + "containers": [ + { + "description": "string", + "health": "string", + "host_ports": [ + { + "port": 0, + "protocol": "string" + }, + { + "port": 0, + "protocol": "string" + } + ], + "name": "string", + "status": "string", + "title": "string", + "url": "string", + "vendor": "string", + "version": "string" + }, + { + "description": "string", + "health": "string", + "host_ports": [ + { + "port": 0, + "protocol": "string" + }, + { + "port": 0, + "protocol": "string" + } + ], + "name": "string", + "status": "string", + "title": "string", + "url": "string", + "vendor": "string", + "version": "string" + } + ], + "name": "string", + "type": "string" + }, + { + "containers": [ + { + "description": "string", + "health": "string", + "host_ports": [ + { + "port": 0, + "protocol": "string" + }, + { + "port": 0, + "protocol": "string" + } + ], + "name": "string", + "status": "string", + "title": "string", + "url": "string", + "vendor": "string", + "version": "string" + }, + { + "description": "string", + "health": "string", + "host_ports": [ + { + "port": 0, + "protocol": "string" + }, + { + "port": 0, + "protocol": "string" + } + ], + "name": "string", + "status": "string", + "title": "string", + "url": "string", + "vendor": "string", + "version": "string" + } + ], + "name": "string", + "type": "string" + } + ], + "available": false, + "enabled": false + } + + UserSpace-Objekte werden in folgenden Anfragen verwendet: + + GET /userspace + +UserSpaceApp: + UserSpace app + + Ein Objekt des Typs UserSpaceApp besitzt folgende Eigenschaften: + + containers (UserSpaceContainer-Array) - Container in dieser App + + name (string): Name der App. + + type (string): Typ der App (mögliche Werte: container, compose). + + Musterobjekt + + { + "containers": [ + { + "description": "string", + "health": "string", + "host_ports": [ + { + "port": 0, + "protocol": "string" + }, + { + "port": 0, + "protocol": "string" + } + ], + "name": "string", + "status": "string", + "title": "string", + "url": "string", + "vendor": "string", + "version": "string" + }, + { + "description": "string", + "health": "string", + "host_ports": [ + { + "port": 0, + "protocol": "string" + }, + { + "port": 0, + "protocol": "string" + } + ], + "name": "string", + "status": "string", + "title": "string", + "url": "string", + "vendor": "string", + "version": "string" + } + ], + "name": "string", + "type": "string" + } + + UserSpaceApp-Objekte sind in + + UserSpace + + enthalten. + +UserSpaceContainer: + Container + + Ein Objekt des Typs UserSpaceContainer besitzt folgende + Eigenschaften: + + description (string) - Wert des Labels + org.opencontainers.image.description + + health (string): Health (Gesundheit) des Containers (falls der + Container einen Health-Check hat) (mögliche Werte: starting, + healthy oder unhealthy). + + host_ports (HostPort-Array): auf dem Host verfügbare Ports + + name (string): Name des Containers. + + status (string): Status des Containers (mögliche Werte: restarting, + running, paused oder exited). + + title (string) - Wert des Labels org.opencontainers.image.title + + url (string) - Wert des Labels org.opencontainers.image.url + + vendor (string) - Wert des Labels org.opencontainers.image.vendor + + version (string) - Wert des Labels org.opencontainers.image.version + + Musterobjekt + + { + "description": "string", + "health": "string", + "host_ports": [ + { + "port": 0, + "protocol": "string" + }, + { + "port": 0, + "protocol": "string" + } + ], + "name": "string", + "status": "string", + "title": "string", + "url": "string", + "vendor": "string", + "version": "string" + } + + UserSpaceContainer-Objekte sind in + + UserSpaceApp + + enthalten. diff --git a/v24.04/de/_sources/rest_api_general.rst.txt b/v24.04/de/_sources/rest_api_general.rst.txt new file mode 100644 index 0000000..759c328 --- /dev/null +++ b/v24.04/de/_sources/rest_api_general.rst.txt @@ -0,0 +1,182 @@ +Allgemeine Struktur der Programmierschnittstelle (API) + +Der allgemeine + +Einstiegspunkt + + zur Programmierschnittstelle (API) des + +rc_visard NG + + ist "http:///api/" wobei "" entweder die IP-Adresse des +Geräts ist oder sein dem jeweiligen DHCP-Server bekannter + +Host-Name + + (siehe + +Netzwerkkonfiguration + +). Greift der Benutzer über einen Webbrowser auf diese Adresse zu, +kann er die Programmierschnittstelle während der Laufzeit mithilfe der + +Swagger UI + + erkunden und testen. + +Für die eigentlichen HTTP-Anfragen wird dem Einstiegspunkt der +Programmierschnittstelle die + +aktuelle Version der Schnittstelle als Postfix angehangen + +, d.h. "http:///api/v2". Alle Daten, die an die REST-API gesandt +und von ihr empfangen werden, entsprechen dem JSON-Datenformat +(JavaScript Object Notation). Die Programmierschnittstelle ist so +gestaltet, dass der Benutzer die in + +Verfügbare Ressourcen und Anfragen + + aufgelisteten sogenannten + +Ressourcen + + über die folgenden HTTP-Anforderungen + +anlegen, abrufen, ändern und löschen + + kann. + + Anfragetyp Beschreibung GET Zugriff auf eine oder mehrere +Ressourcen und Rückgabe des Ergebnisses im JSON-Format PUT Änderung +einer Ressource und Rückgabe der modifizierten Ressource im JSON- +Format DELETE Löschen einer Ressource POST Upload einer Datei +(z.B. einer Lizenz oder eines Firmware-Images) + +Je nach der Art der Anfrage und Datentyp können die + +Argumente + + für HTTP-Anfragen als Teil des + +Pfads + + ( + +URI + +) zur Ressource, als + +Abfrage + +-Zeichenfolge, als + +Formulardaten + + oder im + +Body + + der Anfrage übertragen werden. Die folgenden Beispiele nutzen das +Kommandozeilenprogramm + +curl + +, das für verschiedene Betriebssysteme verfügbar ist (siehe + +https://curl.haxx).se + +. + +Abruf des aktuellen Status eines Moduls, wobei sein Name im Pfad (URI) +verschlüsselt ist curl -X GET +'http:///api/v2/pipelines/0/nodes/rc_stereomatching' + +Abruf einiger Parameterwerte eines Moduls über eine +Abfragezeichenfolge curl -X GET 'http:///api/v2/pipelines/0/no +des/rc_stereomatching/parameters?name=minconf&name=maxdepth' + +Setzen eines Modulparameters als JSON-formatierter Text im Body der +Anfrage curl -X PUT --header 'Content-Type: application/json' -d +'[{"name": "mindepth", "value": 0.1}]' +'http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters' + +Zur Beantwortung solcher Anfragen greift die Programmierschnittstelle +des + +rc_visard NG + + auf übliche Rückgabecodes zurück: + + Statuscode Beschreibung 200 OK Die Anfrage war erfolgreich. Die +Ressource wird im JSON-Format zurückgegeben. 400 Bad Request Ein für +die API-Anfrage benötigtes Attribut oder Argument fehlt oder ist +ungültig. 404 Not Found Auf eine Ressource konnte nicht zugegriffen +werden. Möglicherweise kann die ID einer Ressource nicht gefunden +werden. 403 Forbidden Der Zugriff ist (vorübergehend) verboten. +Möglicherweise sind einige Parameter gesperrt, während eine GigE +Vision-Anwendung verbunden ist. 429 Too many requests Die +Übertragungsrate ist aufgrund einer zu hohen Anfragefrequenz begrenzt. + +Der folgende Eintrag zeigt eine Musterantwort auf eine erfolgreiche +Anfrage, mit der Informationen zum "minconf"-Parameter des +"rc_stereomatching"-Moduls angefordert werden: + + HTTP/1.1 200 OK + Content-Type: application/json + Content-Length: 157 + + { + "name": "minconf", + "min": 0, + "default": 0, + "max": 1, + "value": 0, + "type": "float64", + "description": "Minimum confidence" + } + +Bemerkung: Das tatsächliche Verhalten, die zulässigen Anfragen und + die speziellen Rückgabecodes hängen in hohem Maße von der gewählten + Ressource, vom Kontext und von der Aktion ab. Siehe die + + verfügbaren Ressourcen + + des + + rc_visard NG + + und einzelnen Parameter und Services jedes + + Softwaremoduls + + . + +Verfügbare Ressourcen und Anfragen + +Die für die REST-API verfügbaren Ressourcen lassen sich in folgende +Teilbereiche gliedern: + +/nodes Zugriff auf die globalen Datenbankmodule \:(Abschnitt +\ref{database_modules:sect-database-modules}) des rc_visard NG mit +ihren Laufzeitzuständen, Parametern und angebotenen Services, um Daten +zu speichern, die in mehreren Modulen genutzt werden, z.B. Load +Carrier, Greifer und Regions of Interest. + +/pipelines Zugriff auf den Status und die Konfiguration der +Kamerapipelines. Es gibt immer nur eine Pipeline mit der Nummer 0. + +/pipelines/0/nodes Zugriff auf die 3D-Kamera-, Navigations-, +Detektions- und Konfigurations-Softwaremodule \:(Abschnitt +\ref{modules:sect-modules}) des rc_visard NG mit ihren jeweiligen +Laufzeitzuständen, Parametern und verfügbaren Services. + +/templates Zugriff auf die im rc_visard NG hinterlegten +Objekttemplates. + +/system Zugriff auf Systemzustand, Netzwerkkonfiguration, und +Verwaltung der Lizenzen sowie der Firmware-Updates. + +/userspace Zugriff auf den UserSpace des rc_visard NG. + +/logs Zugriff auf die im rc_visard NG hinterlegten Logdateien. + diff --git a/v24.04/de/_sources/rest_api_nodes.rst.txt b/v24.04/de/_sources/rest_api_nodes.rst.txt new file mode 100644 index 0000000..b524b38 --- /dev/null +++ b/v24.04/de/_sources/rest_api_nodes.rst.txt @@ -0,0 +1,1017 @@ +Module, Parameter und Services + +Die + +Softwaremodule + + des + +rc_visard NG + + heißen in der REST-API + +Nodes + + und vereinen jeweils bestimmte algorithmische Funktionen. Über +folgenden Befehl lassen sich alle globalen Datenbankmodule der REST- +API mit ihren jeweiligen Services und Parametern auflisten: + + curl -X GET http:///api/v2/nodes + +Informationen zu einem bestimmten Modul (z.B. "rc_load_carrier_db") +lassen sich mit folgendem Befehl abrufen: + + curl -X GET http:///api/v2/nodes/rc_load_carrier_db + +Alle verfügbaren 3D-Kamera-, Detektions- und Konfigurationsmodule der +REST-API lassen sich mit ihren Services und Parametern wie folgt +auflisten: + + curl -X GET http:///api/v2/pipelines/0/nodes + +Informationen zu einem bestimmten Modul (z.B. "rc_camera") lassen sich +mit folgendem Befehl abrufen: + + curl -X GET http:///api/v2/pipelines/0/nodes/rc_camera + +Status: + Während der Laufzeit stellt jedes Modul Informationen zu seinem + aktuellen Status bereit. Dies umfasst nicht nur den aktuellen + + Verarbeitungsstatus + + des Moduls (z.B. "running" oder "stale"), sondern die meisten + Module melden auch Laufzeitstatistiken oder schreibgeschützte + Parameter, sogenannte + + Statuswerte + + . Die Statuswerte des "rc_camera"-Moduls lassen sich beispielsweise + wie folgt abrufen: + + curl -X GET http:///api/v2/pipelines/0/nodes/rc_camera/status + + Bemerkung: Die zurückgegebenen + + Statuswerte + + sind modulspezifisch und werden im jeweiligen + + Softwaremodul + + dokumentiert. + + Bemerkung: Statuswerte + + werden nur gemeldet, wenn sich das jeweilige Modul im Zustand + "running" befindet. + +Parameter: + Die meisten Module stellen Parameter über die REST-API des + + rc_visard NG + + zur Verfügung, damit ihr Laufzeitverhalten an den + Anwendungskontext oder die Anforderungen angepasst werden kann. Die + REST-API ermöglicht es, den Wert eines Parameters zu setzen und + abzufragen. Darüber hinaus stellt sie weitere Angaben, wie z.B. den + jeweiligen Standardwert und zulässige Minimal- bzw. Maximalwerte + von Parametern, zur Verfügung. + + Die "rc_stereomatching"-Parameter lassen sich beispielsweise wie + folgt abrufen: + + curl -X GET http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters + + Der "quality"-Parameter dieses Moduls könnte wie folgt auf den Wert + "Full" gesetzt werden: + + curl -X PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters?quality=Full + + oder äquivalent + + curl -X PUT --header 'Content-Type: application/json' -d '{ "value": "Full" }' http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/quality + + Bemerkung: Laufzeitparameter sind modulspezifisch und werden in + dem jeweiligen + + Softwaremodul + + dokumentiert. + + Bemerkung: Die meisten Parameter, die die Module über die REST- + API anbieten, lassen sich auch über die benutzerfreundliche + + Web GUI + + des + + rc_visard NG + + erkunden und austesten. + + Bemerkung: Einige der Parameter, die über die REST-API des + + rc_visard NG + + bereitgestellt werden, sind auch über die + + GigE Vision 2.0/GenICam-Schnittstelle + + zugänglich. Die Einstellung dieser Parameter über die REST-API + und die Web GUI ist verboten, solange ein GenICam-Client + verbunden ist. + + Zudem bietet jedes Modul, das Laufzeitparameter bereitstellt, auch + einen Service, um die Werkseinstellungen aller Parameter + wiederherzustellen. + +Services: + Einige Module bieten auch Services, die sich über die REST-API + aufrufen lassen. Hierzu gehört beispielsweise das oben bereits + genannte Wiederherstellen von Parametern oder auch das Starten und + Stoppen von Modulen. Die + + Services des Moduls zur Hand-Auge-Kalibrierung + + lassen sich beispielsweise wie folgt aufrufen: + + curl -X GET http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services + + Um einen Service eines Moduls aufzurufen, wird eine "PUT"-Anfrage + mit servicespezifischen Argumenten für die jeweilige Ressource + gestellt (siehe das ""args""-Feld des + + Service-Datenmodells + + ). Beispielsweise lässt sich folgendermaßen eine Bildaufnahme mit + dem Stereo-Matching-Modul auslösen: + + curl -X PUT --header 'Content-Type: application/json' -d '{ "args": {} }' http:///api/v2/pipelines/0/nodes/rc_stereomatching/services/acquisition_trigger + + Bemerkung: Die Services und zugehörigen Argumente sind + modulspezifisch und werden im jeweiligen + + Softwaremodul + + dokumentiert. + +Die folgende Liste enthält alle REST-API-Anfragen zum Status der +globalen Datenbankmodule und ihrer Parameter und Services: + +GET /nodes + + Abruf einer Liste aller verfügbaren globalen Nodes. + + Musteranfrage + + GET /api/v2/nodes HTTP/1.1 + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + [ + { + "name": "rc_roi_db", + "parameters": [], + "services": [ + "set_region_of_interest", + "get_regions_of_interest", + "delete_regions_of_interest", + "set_region_of_interest_2d", + "get_regions_of_interest_2d", + "delete_regions_of_interest_2d" + ], + "status": "running" + }, + { + "name": "rc_load_carrier_db", + "parameters": [], + "services": [ + "set_load_carrier", + "get_load_carriers", + "delete_load_carriers" + ], + "status": "running" + }, + { + "name": "rc_gripper_db", + "parameters": [], + "services": [ + "set_gripper", + "get_grippers", + "delete_grippers" + ], + "status": "running" + } + ] + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabe: NodeInfo-Array) + + Referenzierte Datenmodelle: + NodeInfo\:(Abschnitt \ref{rest_api_datamodel:sect-rest- + datamodel-nodeinfo}) + +GET /nodes/{node} + + Abruf von Informationen zu einem einzelnen globalen Modul. + + Musteranfrage + + GET /api/v2/nodes/ HTTP/1.1 + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "name": "rc_roi_db", + "parameters": [], + "services": [ + "set_region_of_interest", + "get_regions_of_interest", + "delete_regions_of_interest", + "set_region_of_interest_2d", + "get_regions_of_interest_2d", + "delete_regions_of_interest_2d" + ], + "status": "running" + } + + Parameter: + node (string) -- Modulname (obligatorisch) + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabe: NodeInfo) + + 404 Not Found -- Modul nicht gefunden + + Referenzierte Datenmodelle: + NodeInfo\:(Abschnitt \ref{rest_api_datamodel:sect-rest- + datamodel-nodeinfo}) + +GET /nodes/{node}/services + + Abruf von Beschreibungen aller von einem globalen Modul angebotenen + Services. + + Musteranfrage + + GET /api/v2/nodes//services HTTP/1.1 + + Musteranfrage + + HTTP/1.1 200 OK + Content-Type: application/json + + [ + { + "args": {}, + "description": "string", + "name": "string", + "response": {} + } + ] + + Parameter: + node (string) -- Modulname (obligatorisch) + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabe: Service-Array) + + 404 Not Found -- Modul nicht gefunden + + Referenzierte Datenmodelle: + Service\:(Abschnitt \ref{rest_api_datamodel:sect-rest-datamodel- + service}) + +GET /nodes/{node}/services/{service} + + Abruf der Beschreibung eines Services eines globalen Moduls. + + Musteranfrage + + GET /api/v2/nodes//services/ HTTP/1.1 + + Musteranfrage + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "args": {}, + "description": "string", + "name": "string", + "response": {} + } + + Parameter: + node (string) -- Modulname (obligatorisch) + + service (string) -- Name des Service (obligatorisch) + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabe: Service) + + 404 Not Found -- Modul oder Service nicht gefunden + + Referenzierte Datenmodelle: + Service\:(Abschnitt \ref{rest_api_datamodel:sect-rest-datamodel- + service}) + +PUT /nodes/{node}/services/{service} + + Aufruf des Services eines Moduls: Die benötigten Argumente und die + zugehörige Antwort hängt vom Modul und vom Service ab. + + Musteranfrage + + PUT /api/v2/nodes//services/ HTTP/1.1 + Accept: application/json application/ubjson + + {} + + Musteranfrage + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "args": {}, + "description": "string", + "name": "string", + "response": {} + } + + Parameter: + node (string) -- Modulname (obligatorisch) + + service (string) -- Name des Service (obligatorisch) + + JSON-Objekt zur Anfrage: + service args (object) -- Beispielargumente (obligatorisch) + + Anfrage-Header: + Accept -- application/json application/ubjson + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Serviceaufruf erledigt (Rückgabe: Service) + + 403 Forbidden -- Service-Aufruf verboten, z.B. weil keine valide + Lizenz für dieses Modul vorliegt. + + 404 Not Found -- Modul oder Service nicht gefunden + + Referenzierte Datenmodelle: + Service\:(Abschnitt \ref{rest_api_datamodel:sect-rest-datamodel- + service}) + +GET /nodes/{node}/status + + Abruf des Status eines globalen Datenbankmoduls. + + Musteranfrage + + GET /api/v2/nodes//status HTTP/1.1 + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "status": "running", + "timestamp": 1503075030.2335997, + "values": [] + } + + Parameter: + node (string) -- Modulname (obligatorisch) + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabe: NodeStatus) + + 404 Not Found -- Modul nicht gefunden + + Referenzierte Datenmodelle: + NodeStatus\:(Abschnitt \ref{rest_api_datamodel:sect-rest- + datamodel-nodestatus}) + +Die folgende Liste enthält alle REST-API-Anfragen zum Status der 3D- +Kamera-, Detektions- und Konfigurationsmodule und ihrer Parameter und +Services: + +GET /pipelines/{pipeline}/nodes + + Abruf einer Liste aller verfügbaren Module. + + Musteranfrage + + GET /api/v2/pipelines//nodes HTTP/1.1 + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + [ + { + "name": "rc_camera", + "parameters": [ + "fps", + "exp_auto", + "exp_value", + "exp_max" + ], + "services": [ + "reset_defaults" + ], + "status": "running" + }, + { + "name": "rc_hand_eye_calibration", + "parameters": [ + "grid_width", + "grid_height", + "robot_mounted" + ], + "services": [ + "reset_defaults", + "set_pose", + "reset", + "save", + "calibrate", + "get_calibration" + ], + "status": "idle" + }, + { + "name": "rc_stereomatching", + "parameters": [ + "quality", + "seg", + "fill", + "minconf", + "mindepth", + "maxdepth", + "maxdeptherr" + ], + "services": [ + "reset_defaults" + ], + "status": "running" + } + ] + + Parameter: + pipeline (string) -- Name der Pipeline (0) (obligatorisch) + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabe: NodeInfo-Array) + + Referenzierte Datenmodelle: + NodeInfo\:(Abschnitt \ref{rest_api_datamodel:sect-rest- + datamodel-nodeinfo}) + +GET /pipelines/{pipeline}/nodes/{node} + + Abruf von Informationen zu einem einzelnen Modul. + + Musteranfrage + + GET /api/v2/pipelines//nodes/ HTTP/1.1 + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "name": "rc_camera", + "parameters": [ + "fps", + "exp_auto", + "exp_value", + "exp_max" + ], + "services": [ + "reset_defaults" + ], + "status": "running" + } + + Parameter: + pipeline (string) -- Name der Pipeline (0) (obligatorisch) + + node (string) -- Modulname (obligatorisch) + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabe: NodeInfo) + + 404 Not Found -- Modul nicht gefunden + + Referenzierte Datenmodelle: + NodeInfo\:(Abschnitt \ref{rest_api_datamodel:sect-rest- + datamodel-nodeinfo}) + +GET /pipelines/{pipeline}/nodes/{node}/parameters + + Abruf von Parametern eines Moduls. + + Musteranfrage + + GET /api/v2/pipelines//nodes//parameters?name= HTTP/1.1 + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + [ + { + "default": 25, + "description": "Frames per second in Hz", + "max": 25, + "min": 1, + "name": "fps", + "type": "float64", + "value": 25 + }, + { + "default": true, + "description": "Switching between auto and manual exposure", + "max": true, + "min": false, + "name": "exp_auto", + "type": "bool", + "value": true + }, + { + "default": 0.007, + "description": "Maximum exposure time in s if exp_auto is true", + "max": 0.018, + "min": 6.6e-05, + "name": "exp_max", + "type": "float64", + "value": 0.007 + } + ] + + Parameter: + pipeline (string) -- Name der Pipeline (0) (obligatorisch) + + node (string) -- Modulname (obligatorisch) + + Anfrageparameter: + name (string) -- Schränkt Ergebnisse auf Parameter mit diesem + Namen ein (optional). + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabe: NodeInfo-Array) + + 404 Not Found -- Modul nicht gefunden + + Referenzierte Datenmodelle: + Parameter\:(Abschnitt \ref{rest_api_datamodel:sect-rest- + datamodel-parameter}) + +PUT /pipelines/{pipeline}/nodes/{node}/parameters + + Aktualisierung mehrerer Parameter. + + Musteranfrage + + PUT /api/v2/pipelines//nodes//parameters HTTP/1.1 + Accept: application/json application/ubjson + + [ + { + "name": "string", + "value": {} + } + ] + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + [ + { + "default": 25, + "description": "Frames per second in Hz", + "max": 25, + "min": 1, + "name": "fps", + "type": "float64", + "value": 10 + }, + { + "default": true, + "description": "Switching between auto and manual exposure", + "max": true, + "min": false, + "name": "exp_auto", + "type": "bool", + "value": false + }, + { + "default": 0.005, + "description": "Manual exposure time in s if exp_auto is false", + "max": 0.018, + "min": 6.6e-05, + "name": "exp_value", + "type": "float64", + "value": 0.005 + } + ] + + Parameter: + pipeline (string) -- Name der Pipeline (0) (obligatorisch) + + node (string) -- Modulname (obligatorisch) + + JSON-Objekt-Array zur Anfrage: + parameters (ParameterNameValue) -- Liste von Parametern + (obligatorisch) + + Anfrage-Header: + Accept -- application/json application/ubjson + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabe: NodeInfo-Array) + + 400 Bad Request -- Ungültiger Parameterwert + + 403 Forbidden -- Aktualisierung des Parameters verboten, z.B. + weil er aufgrund einer laufenden GigE Vision-Anwendung gesperrt + ist oder keine valide Lizenz für dieses Modul vorliegt. + + 404 Not Found -- Modul nicht gefunden + + Referenzierte Datenmodelle: + ParameterNameValue\:(Abschnitt \ref{rest_api_datamodel:sect- + rest-datamodel-parameternamevalue}) + + Parameter\:(Abschnitt \ref{rest_api_datamodel:sect-rest- + datamodel-parameter}) + +GET /pipelines/{pipeline}/nodes/{node}/parameters/{param} + + Abruf eines bestimmten Parameters eines Moduls. + + Musteranfrage + + GET /api/v2/pipelines//nodes//parameters/ HTTP/1.1 + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "default": 25, + "description": "Frames per second in Hertz", + "max": 25, + "min": 1, + "name": "fps", + "type": "float64", + "value": 10 + } + + Parameter: + pipeline (string) -- Name der Pipeline (0) (obligatorisch) + + node (string) -- Modulname (obligatorisch) + + param (string) -- Name des Parameters (obligatorisch) + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabe: Parameter) + + 404 Not Found -- Modul oder Parameter nicht gefunden + + Referenzierte Datenmodelle: + Parameter\:(Abschnitt \ref{rest_api_datamodel:sect-rest- + datamodel-parameter}) + +PUT /pipelines/{pipeline}/nodes/{node}/parameters/{param} + + Aktualisierung eines bestimmten Parameters eines Moduls. + + Musteranfrage + + PUT /api/v2/pipelines//nodes//parameters/ HTTP/1.1 + Accept: application/json application/ubjson + + { + "value": {} + } + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "default": 25, + "description": "Frames per second in Hertz", + "max": 25, + "min": 1, + "name": "fps", + "type": "float64", + "value": 10 + } + + Parameter: + pipeline (string) -- Name der Pipeline (0) (obligatorisch) + + node (string) -- Modulname (obligatorisch) + + param (string) -- Name des Parameters (obligatorisch) + + JSON-Objekt zur Anfrage: + parameter (ParameterValue) -- zu aktualisierender Parameter als + JSON-Objekt (obligatorisch) + + Anfrage-Header: + Accept -- application/json application/ubjson + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabe: Parameter) + + 400 Bad Request -- Ungültiger Parameterwert + + 403 Forbidden -- Aktualisierung des Parameters verboten, z.B. + weil er aufgrund einer laufenden GigE Vision-Anwendung gesperrt + ist oder keine valide Lizenz für dieses Modul vorliegt. + + 404 Not Found -- Modul oder Parameter nicht gefunden + + Referenzierte Datenmodelle: + ParameterValue\:(Abschnitt \ref{rest_api_datamodel:sect-rest- + datamodel-parametervalue}) + + Parameter\:(Abschnitt \ref{rest_api_datamodel:sect-rest- + datamodel-parameter}) + +GET /pipelines/{pipeline}/nodes/{node}/services + + Abruf von Beschreibungen aller von einem Modul angebotenen + Services. + + Musteranfrage + + GET /api/v2/pipelines//nodes//services HTTP/1.1 + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + [ + { + "args": {}, + "description": "Restarts the module.", + "name": "restart", + "response": { + "accepted": "bool", + "current_state": "string" + } + }, + { + "args": {}, + "description": "Starts the module.", + "name": "start", + "response": { + "accepted": "bool", + "current_state": "string" + } + }, + { + "args": {}, + "description": "Stops the module.", + "name": "stop", + "response": { + "accepted": "bool", + "current_state": "string" + } + } + ] + + Parameter: + pipeline (string) -- Name der Pipeline (0) (obligatorisch) + + node (string) -- Modulname (obligatorisch) + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabe: Service-Array) + + 404 Not Found -- Modul nicht gefunden + + Referenzierte Datenmodelle: + Service\:(Abschnitt \ref{rest_api_datamodel:sect-rest-datamodel- + service}) + +GET /pipelines/{pipeline}/nodes/{node}/services/{service} + + Abruf der Beschreibung eines modulspezifischen Services. + + Musteranfrage + + GET /api/v2/pipelines//nodes//services/ HTTP/1.1 + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "args": { + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "slot": "int32" + }, + "description": "Save a pose (grid or gripper) for later calibration.", + "name": "set_pose", + "response": { + "message": "string", + "status": "int32", + "success": "bool" + } + } + + Parameter: + pipeline (string) -- Name der Pipeline (0) (obligatorisch) + + node (string) -- Modulname (obligatorisch) + + service (string) -- Name des Service (obligatorisch) + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabe: Service) + + 404 Not Found -- Modul oder Service nicht gefunden + + Referenzierte Datenmodelle: + Service\:(Abschnitt \ref{rest_api_datamodel:sect-rest-datamodel- + service}) + +PUT /pipelines/{pipeline}/nodes/{node}/services/{service} + + Aufruf des Services eines Moduls: Die benötigten Argumente und die + zugehörige Antwort hängt vom Modul und vom Service ab. + + Musteranfrage + + PUT /api/v2/pipelines//nodes//services/ HTTP/1.1 + Accept: application/json application/ubjson + + {} + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "name": "set_pose", + "response": { + "message": "Grid detected, pose stored.", + "status": 1, + "success": true + } + } + + Parameter: + pipeline (string) -- Name der Pipeline (0) (obligatorisch) + + node (string) -- Modulname (obligatorisch) + + service (string) -- Name des Service (obligatorisch) + + JSON-Objekt zur Anfrage: + service args (object) -- Beispielargumente (obligatorisch) + + Anfrage-Header: + Accept -- application/json application/ubjson + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Serviceaufruf erledigt (Rückgabe: Service) + + 403 Forbidden -- Service-Aufruf verboten, z.B. weil keine valide + Lizenz für dieses Modul vorliegt. + + 404 Not Found -- Modul oder Service nicht gefunden + + Referenzierte Datenmodelle: + Service\:(Abschnitt \ref{rest_api_datamodel:sect-rest-datamodel- + service}) + +GET /pipelines/{pipeline}/nodes/{node}/status + + Abruf des Status eines Moduls. + + Musteranfrage + + GET /api/v2/pipelines//nodes//status HTTP/1.1 + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "status": "running", + "timestamp": 1503075030.2335997, + "values": { + "baseline": "0.0650542", + "color": "0", + "exp": "0.00426667", + "focal": "0.844893", + "fps": "25.1352", + "gain": "12.0412", + "height": "960", + "temp_left": "39.6", + "temp_right": "38.2", + "time": "0.00406513", + "width": "1280" + } + } + + Parameter: + pipeline (string) -- Name der Pipeline (0) (obligatorisch) + + node (string) -- Modulname (obligatorisch) + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabe: NodeStatus) + + 404 Not Found -- Modul nicht gefunden + + Referenzierte Datenmodelle: + NodeStatus\:(Abschnitt \ref{rest_api_datamodel:sect-rest- + datamodel-nodestatus}) diff --git a/v24.04/de/_sources/rest_api_pipelines.rst.txt b/v24.04/de/_sources/rest_api_pipelines.rst.txt new file mode 100644 index 0000000..fa9b3af --- /dev/null +++ b/v24.04/de/_sources/rest_api_pipelines.rst.txt @@ -0,0 +1,10 @@ +Pipelines + +Pipelines repräsentieren die Kamerapipelines des + +rc_visard NG + +. + +Die folgende Liste enthält alle REST-API Anfragen bezüglich der +Konfiguration der Kamerapipelines: diff --git a/v24.04/de/_sources/rest_api_swagger_ui.rst.txt b/v24.04/de/_sources/rest_api_swagger_ui.rst.txt new file mode 100644 index 0000000..c432cba --- /dev/null +++ b/v24.04/de/_sources/rest_api_swagger_ui.rst.txt @@ -0,0 +1,68 @@ +Swagger UI + +Die + +Swagger UI + + des + +rc_visard NG + + ermöglicht es Entwicklern, die REST-API – beispielsweise zu +Entwicklungs- und Testzwecken – leicht darzustellen und zu verwenden. +Der Zugriff auf "http:///api/" oder auf +"http:///api/swagger" (der erste Link leitet automatisch auf den +zweiten Link weiter) öffnet eine Vorschau der allgemeinen API-Struktur +des + +rc_visard NG + +, einschließlich aller + +verfügbaren Ressourcen und Anfragen + + . Auf dieser vereinfachten Benutzeroberfläche lassen sich alle +Funktionen erkunden und austesten. + +Bemerkung: Der Benutzer muss bedenken, dass die Swagger UI des + + rc_visard NG + + , auch wenn sie zur Erprobung der REST-API bestimmt ist, eine voll + funktionstüchtige Schnittstelle ist. Das bedeutet, dass alle + ausgelösten Anfragen tatsächlich bearbeitet werden und den Zustand + und/oder das Verhalten des Geräts beeinflussen. Dies gilt + insbesondere für Anfragen des Typs "PUT", "POST" und "DELETE". + + +Mithilfe dieser Schnittstelle können alle verfügbaren Ressourcen und +Anfragen erprobt werden, indem diese durch Klick auf- und zugeklappt +werden. Die folgende Abbildung zeigt ein Beispiel dafür, wie sich der +aktuelle Zustand eines Moduls abrufen lässt, indem die erforderlichen +Parameter ("pipeline"-Nummer und "node"-Name) ausgefüllt werden und +anschließend + +Execute + + geklickt wird. Daraufhin zeigt die Swagger UI unter anderem den +"curl"-Befehl an, der bei Auslösung der Anfrage ausgeführt wurde, +sowie den Antworttext, in dem der aktuelle Status des angefragten +Moduls in einer Zeichenfolge im JSON-Format enthalten ist. + + +Einige Aktionen, wie das Setzen von Parametern oder der Aufruf von +Services, bedürfen komplexerer Parameter als eine HTTP-Anfrage. Die +Swagger UI erlaubt es Entwicklern, die für diese Aktionen benötigten +Attribute, wie im nächsten Beispiel gezeigt, während der Laufzeit zu +erkunden. In der folgenden Abbildung werden die Attribute, die für den +"set_pose"-Service des "rc_hand_eye_calibration"-Moduls benötigt +werden, erkundet, indem eine "GET"-Anfrage zu dieser Ressource +durchgeführt wird. Die Antwort enthält eine vollständige Beschreibung +des angebotenen Services, einschließlich aller erforderlichen +Argumente mit ihren Namen und Typen in einer Zeichenfolge im JSON- +Format. + + +Der Benutzer kann diesen vorformatierten JSON-Text als Muster für die +Argumente nutzen, um damit den Service tatsächlich aufzurufen: + diff --git a/v24.04/de/_sources/rest_api_syslogs.rst.txt b/v24.04/de/_sources/rest_api_syslogs.rst.txt new file mode 100644 index 0000000..fc95622 --- /dev/null +++ b/v24.04/de/_sources/rest_api_syslogs.rst.txt @@ -0,0 +1,768 @@ +System und Logs + +Die folgenden Ressourcen und Anfragen sind für die System-Level-API +des + +rc_visard NG + + verfügbar. Sie ermöglichen Folgendes: + + Zugriff auf Logdateien (systemweit oder modulspezifisch), + + Abruf von Informationen zum Gerät und zur Laufzeitstatistik, wie + Datum, MAC-Adresse, Uhrzeitsynchronisierungsstatus und verfügbare + Ressourcen, + + Verwaltung installierter Softwarelizenzen, und + + Aktualisierung des Firmware-Images des rc_visard NG. + +GET /logs + + Abruf einer Liste aller verfügbaren Logdateien. + + Musteranfrage + + GET /api/v2/logs HTTP/1.1 + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + [ + { + "date": 1503060035.0625782, + "name": "rcsense-api.log", + "size": 730 + }, + { + "date": 1503060035.741574, + "name": "stereo.log", + "size": 39024 + }, + { + "date": 1503060044.0475223, + "name": "camera.log", + "size": 1091 + } + ] + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabe: LogInfo-Array) + + Referenzierte Datenmodelle: + LogInfo\:(Abschnitt \ref{rest_api_datamodel:sect-rest-datamodel- + loginfo}) + +GET /logs/{log} + + Abruf einer Logdatei: Die Art des Inhalts der Antwort richtet sich + nach dem *format*-Parameter. + + Musteranfrage + + GET /api/v2/logs/?format=&limit= HTTP/1.1 + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "date": 1581609251.8168414, + "log": [ + { + "component": "rc_gev_server", + "level": "INFO", + "message": "Application from IP 10.0.1.7 registered with control access.", + "timestamp": 1581609249.61 + }, + { + "component": "rc_gev_server", + "level": "INFO", + "message": "Application from IP 10.0.1.7 deregistered.", + "timestamp": 1581609249.739 + }, + { + "component": "rc_gev_server", + "level": "INFO", + "message": "Application from IP 10.0.1.7 registered with control access.", + "timestamp": 1581609250.94 + }, + { + "component": "rc_gev_server", + "level": "INFO", + "message": "Application from IP 10.0.1.7 deregistered.", + "timestamp": 1581609251.819 + } + ], + "name": "gev.log", + "size": 42112 + } + + Parameter: + log (string) -- Name der Logdatei (obligatorisch) + + Anfrageparameter: + format (string) -- Rückgabe des Logs im JSON- oder + Rohdatenformat (mögliche Werte: json oder raw; Voreinstellung: + json) (optional) + + limit (integer) -- Beschränkung auf die letzten x Zeilen im + JSON-Format (Voreinstellung: 100) (optional) + + Antwort-Headers: + Content-Type -- text/plain application/json + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabe: Log) + + 404 Not Found -- Log nicht gefunden + + Referenzierte Datenmodelle: + Log\:(Abschnitt \ref{rest_api_datamodel:sect-rest-datamodel- + log}) + +GET /system + + Abruf von Systeminformationen zum Sensor. + + Musteranfrage + + GET /api/v2/system HTTP/1.1 + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "dns": { + "dns_servers": [ + "10.0.0.1", + "1.1.1.1" + ], + "manual_dns_servers": [ + "1.1.1.1" + ] + }, + "firmware": { + "active_image": { + "image_version": "rc_visard_v1.1.0" + }, + "fallback_booted": true, + "inactive_image": { + "image_version": "rc_visard_v1.0.0" + }, + "next_boot_image": "active_image" + }, + "hostname": "rc-visard-ng-1421823000987", + "link_speed": 1000, + "mac": "00:14:2D:2B:D8:AB", + "ntp_status": { + "accuracy": "48 ms", + "synchronized": true + }, + "ptp_status": { + "master_ip": "", + "offset": 0, + "offset_dev": 0, + "offset_mean": 0, + "state": "off" + }, + "ready": true, + "serial": "1421823000987", + "time": 1504080462.641875, + "uptime": 65457.42 + } + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabe: SysInfo) + + Referenzierte Datenmodelle: + SysInfo\:(Abschnitt \ref{rest_api_datamodel:sect-rest-datamodel- + sysinfo}) + +GET /system/backup + + Abruf eines Backups der Einstellungen. + + Musteranfrage + + GET /api/v2/system/backup?pipelines=&load_carriers=®ions_of_interest=&grippers= HTTP/1.1 + + Anfrageparameter: + pipelines (boolean) -- Backup der Pipelines mit + Moduleinstellungen, d.h. Parameter und bevorzugte TCP- + Orientierung (Standardwert: True) (optional) + + load_carriers (boolean) -- Backup der Load Carrier + (Standardwert: True) (optional) + + regions_of_interest (boolean) -- Backup der Regions of Interest + (Standardwert: True) (optional) + + grippers (boolean) -- Backup der Greifer (Standardwert: True) + (optional) + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung + +POST /system/backup + + Backup einspielen. + + Musteranfrage + + POST /api/v2/system/backup HTTP/1.1 + Accept: application/json application/ubjson + + {} + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "return_code": { + "message": "backup restored", + "value": 0 + }, + "warnings": [] + } + + Request JSON Object: + backup (object) -- Backup-Daten als json-Objekt (erforderlich) + + Anfrage-Header: + Accept -- application/json application/ubjson + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung + +GET /system/dns + + Abfragen der DNS-Server Einstellungen. + + Musteranfrage + + GET /api/v2/system/dns HTTP/1.1 + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "dns": { + "dns_servers": [ + "10.0.0.1", + "1.1.1.1" + ], + "manual_dns_servers": [ + "1.1.1.1" + ] + } + } + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabe: DNS) + + Referenzierte Datenmodelle: + DNS\:(Abschnitt \ref{rest_api_datamodel:sect-rest-datamodel- + dns}) + +PUT /system/dns + + Setze manuelle DNS-Server. + + Musteranfrage + + PUT /api/v2/system/dns HTTP/1.1 + Accept: application/json application/ubjson + + {} + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "dns": { + "dns_servers": [ + "10.0.0.1", + "1.1.1.1" + ], + "manual_dns_servers": [ + "1.1.1.1" + ] + } + } + + Request JSON Object: + manual_dns_servers (ManualDNSServers) -- Manuelle DNS-Server + (obligatorisch) + + Anfrage-Header: + Accept -- application/json application/ubjson + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabe: DNS) + + 400 Bad Request -- ungültige/fehlende Argumente + + Referenzierte Datenmodelle: + ManualDNSServers\:(Abschnitt \ref{rest_api_datamodel:sect-rest- + datamodel-manualdnsservers}) + + DNS\:(Abschnitt \ref{rest_api_datamodel:sect-rest-datamodel- + dns}) + +GET /system/license + + Abruf von Informationen zu den auf dem Sensor installierten + Lizenzen. + + Musteranfrage + + GET /api/v2/system/license HTTP/1.1 + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "components": { + "calibration": true, + "hand_eye_calibration": true, + "rectification": true, + "self_calibration": true, + "stereo": true + }, + "valid": true + } + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabe: LicenseInfo) + + Referenzierte Datenmodelle: + LicenseInfo\:(Abschnitt \ref{rest_api_datamodel:sect-rest- + datamodel-licenseinfo}) + +POST /system/license + + Aktualisierung der auf dem Sensor installierten Lizenz mithilfe + einer Lizenzdatei. + + Musteranfrage + + POST /api/v2/system/license HTTP/1.1 + Accept: multipart/form-data + + Formularparameter: + file -- Lizenzdatei (obligatorisch) + + Anfrage-Header: + Accept -- Multipart/Formulardaten + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung + + 400 Bad Request -- Keine gültige Lizenz + +GET /system/network + + Abruf der aktuellen Netzwerk Konfiguration. + + Musteranfrage + + GET /api/v2/system/network HTTP/1.1 + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "current_method": "DHCP", + "default_gateway": "10.0.3.254", + "ip_address": "10.0.1.41", + "settings": { + "dhcp_enabled": true, + "persistent_default_gateway": "", + "persistent_ip_address": "192.168.0.10", + "persistent_ip_enabled": false, + "persistent_subnet_mask": "255.255.255.0" + }, + "subnet_mask": "255.255.252.0" + } + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabe: NetworkInfo) + + Referenzierte Datenmodelle: + NetworkInfo\:(Abschnitt \ref{rest_api_datamodel:sect-rest- + datamodel-networkinfo}) + +GET /system/network/settings + + Abruf der aktuellen Netzwerkeinstellungen. + + Musteranfrage + + GET /api/v2/system/network/settings HTTP/1.1 + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "dhcp_enabled": true, + "persistent_default_gateway": "", + "persistent_ip_address": "192.168.0.10", + "persistent_ip_enabled": false, + "persistent_subnet_mask": "255.255.255.0" + } + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabe: NetworkSettings) + + Referenzierte Datenmodelle: + NetworkSettings\:(Abschnitt \ref{rest_api_datamodel:sect-rest- + datamodel-networksettings}) + +PUT /system/network/settings + + Setzen der aktuellen Netzwerkeinstellungen. + + Musteranfrage + + PUT /api/v2/system/network/settings HTTP/1.1 + Accept: application/json application/ubjson + + {} + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "dhcp_enabled": true, + "persistent_default_gateway": "", + "persistent_ip_address": "192.168.0.10", + "persistent_ip_enabled": false, + "persistent_subnet_mask": "255.255.255.0" + } + + Request JSON Object: + settings (NetworkSettings) -- Anzuwendende Netzwerkeinstellungen + (obligatorisch) + + Anfrage-Header: + Accept -- application/json application/ubjson + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabe: NetworkSettings) + + 400 Bad Request -- ungültige/fehlende Argumente + + 403 Forbidden -- Das Ändern der Netzwerkeinstellungen ist nicht + erlaubt, da eine laufende GigE Vision-Applikation diese sperrt. + + Referenzierte Datenmodelle: + NetworkSettings\:(Abschnitt \ref{rest_api_datamodel:sect-rest- + datamodel-networksettings}) + +PUT /system/reboot + + Neustart des Geräts. + + Musteranfrage + + PUT /api/v2/system/reboot HTTP/1.1 + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung + +GET /system/rollback + + Abruf von Informationen zu Firmware/System-Images, die aktuell auf + dem Gerät aktiv oder inaktiv sind. + + Musteranfrage + + GET /api/v2/system/rollback HTTP/1.1 + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "active_image": { + "image_version": "rc_visard_ng_v22.10.0" + }, + "fallback_booted": false, + "inactive_image": { + "image_version": "rc_visard_ng_v22.10.0" + }, + "next_boot_image": "active_image" + } + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabe: FirmwareInfo) + + Referenzierte Datenmodelle: + FirmwareInfo\:(Abschnitt \ref{rest_api_datamodel:sect-rest- + datamodel-firmwareinfo}) + +PUT /system/rollback + + Rollback auf vorherige Firmware-Version (inaktives System-Image). + + Musteranfrage + + PUT /api/v2/system/rollback HTTP/1.1 + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung + + 400 Bad Request -- Bereits auf die Verwendung der inaktiven + Partition beim nächsten Boot-Vorgang gesetzt. + + 500 Internal Server Error -- Interner Fehler + +GET /system/time + + Abfrage der Systemzeit in UTC als String mit dem Format "YYYY-MM-DD + hh:mm:ss" + + Musteranfrage + + GET /api/v2/system/time HTTP/1.1 + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "utc": "2023-10-05 08:35:26" + } + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung + +PUT /system/time + + Setzen der Systemzeit in UTC als String mit dem Format "YYYY-MM-DD + hh:mm:ss" + + Musteranfrage + + PUT /api/v2/system/time?utc= HTTP/1.1 + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "utc": "2023-10-05 08:35:26" + } + + Anfrageparameter: + utc (string) -- Zeit in UTC als String mit dem Format "YYYY-MM- + DD hh:mm:ss" (obligatorisch) + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung + + 400 Bad Request -- ungültige/fehlende Argumente + + 403 Forbidden -- Ändern der Zeit nicht erlaubt, da + Zeitsynchronisation via NTP oder PTP aktiv ist. + +GET /system/ui_lock + + Abruf des UI Lock Status + + Musteranfrage + + GET /api/v2/system/ui_lock HTTP/1.1 + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "enabled": false + } + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabe: UILock) + + Referenzierte Datenmodelle: + UILock\:(Abschnitt \ref{rest_api_datamodel:sect-rest-datamodel- + uilock}) + +DELETE /system/ui_lock + + UI Lock entfernen. + + Musteranfrage + + DELETE /api/v2/system/ui_lock HTTP/1.1 + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "enabled": false, + "valid": false + } + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung + +POST /system/ui_lock + + Verifizieren oder Setzen des UI Locks. + + Musteranfrage + + POST /api/v2/system/ui_lock?hash=&set= HTTP/1.1 + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "enabled": true, + "valid": true + } + + Anfrageparameter: + hash (string) -- Hash des UI Lock Passworts (obligatorisch) + + set (boolean) -- neuen Hash setzen anstatt zu verifizieren + (optional) + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung + +GET /system/update + + Abruf von Informationen zu Firmware/System-Images, die aktuell auf + dem Gerät aktiv oder inaktiv sind. + + Musteranfrage + + GET /api/v2/system/update HTTP/1.1 + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "active_image": { + "image_version": "rc_visard_ng_v22.10.0" + }, + "fallback_booted": false, + "inactive_image": { + "image_version": "rc_visard_ng_v22.10.0" + }, + "next_boot_image": "active_image" + } + + Antwort-Headers: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabe: FirmwareInfo) + + Referenzierte Datenmodelle: + FirmwareInfo\:(Abschnitt \ref{rest_api_datamodel:sect-rest- + datamodel-firmwareinfo}) + +POST /system/update + + Aktualisierung des Firmware/System-Images mit einer Mender- + Artefakt-Datei: Um die aktualisierte Firmware zu aktivieren, ist + anschließend ein Neustart erforderlich. + + Musteranfrage + + POST /api/v2/system/update HTTP/1.1 + Accept: multipart/form-data + + Formularparameter: + file -- Mender-Artefakt-Datei (obligatorisch) + + Anfrage-Header: + Accept -- Multipart/Formulardaten + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung + + 400 Bad Request -- Client-Fehler, z.B. kein gültiges Mender- + Artefakt diff --git a/v24.04/de/_sources/rest_api_userspace.rst.txt b/v24.04/de/_sources/rest_api_userspace.rst.txt new file mode 100644 index 0000000..2b30e7f --- /dev/null +++ b/v24.04/de/_sources/rest_api_userspace.rst.txt @@ -0,0 +1,78 @@ +UserSpace + +UserSpace Informationen einschließlich laufender Apps und ihre +veröffentlichten Ports können über den userspace Endpunkt abgefragt +werden. Eine App kann vom Typ ("type") "container" oder "compose" +(Compose-Stack mit potenziell mehreren Containern) sein. + +GET /userspace + + Abruf der UserSpace Informationen. + + Musteranfrage + + GET /api/v2/userspace HTTP/1.1 + + Beispielantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "apps": [ + { + "containers": [ + { + "host_ports": [ + { + "port": 8888, + "protocol": "http" + } + ], + "name": "hello_rc_visard_ng", + "status": "running" + } + ], + "name": "hello_rc_visard_ng", + "type": "container" + }, + { + "containers": [ + { + "host_ports": [ + { + "port": 8080, + "protocol": "http" + } + ], + "name": "grafana", + "status": "running" + }, + { + "host_ports": [ + { + "port": 9090, + "protocol": "http" + } + ], + "name": "prometheus", + "status": "running" + } + ], + "name": "rc_visard_monitoring", + "type": "compose" + } + ], + "available": true, + "enabled": true + } + + Antwort-Header: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabewert: UserSpace) + + Referenzierte Datenmodelle: + UserSpace\:(Abschnitt \ref{rest_api_datamodel:sect-rest- + datamodel-userspace}) diff --git a/v24.04/de/_sources/revisions.rst.txt b/v24.04/de/_sources/revisions.rst.txt new file mode 100644 index 0000000..289cfb1 --- /dev/null +++ b/v24.04/de/_sources/revisions.rst.txt @@ -0,0 +1,93 @@ +-[ Revisionen ]- + +Dieses Produkt kann bei Bedarf jederzeit ohne Vorankündigung geändert +werden, um es zu verbessern, zu optimieren oder an eine überarbeitete +Spezifikation anzupassen. Werden solche Änderungen vorgenommen, wird +auch das vorliegende Handbuch überarbeitet. Beachten Sie die +angegebene Versionsnummer. + + +DOKUMENTATIONSVERSION + + 24.04.1 24.04.2024 + +Gültig für + +rc_visard NG + + Firmware 24.04.x + + + HERSTELLER + + + Roboception GmbH + + + Kaflerstraße 2 + 81241 München + Deutschland + + KUNDENSUPPORT + + : + support@roboception.de + + | +49 89 889 50 79-0 (09:00-17:00 CET) + + +Betriebsanleitung bitte vollständig lesen und produktnah aufbewahren. + + +COPYRIGHT + + +Das vorliegende Handbuch und das darin beschriebene Produkt sind durch +Urheberrechte geschützt. Sofern das deutsche Urheber- und +Leistungsschutzrecht nichts anderes vorschreibt, darf der Inhalt +dieses Handbuchs nur mit dem vorherigen Einverständnis von Roboception +bzw. des Inhabers des Schutzrechts verwendet und verbreitet werden. +Das vorliegende Handbuch und das darin beschriebene Produkt dürfen +ohne das vorherige Einverständnis von Roboception weder für Verkaufs- +noch für andere Zwecke weder teilweise noch vollständig vervielfältigt +werden. + +Die in diesem Dokument bereitgestellten Informationen sind nach bestem +Wissen und Gewissen zusammengestellt worden. Roboception haftet jedoch +nicht für deren Verwendung. + +Wurden nach Redaktionsschluss noch Änderungen am Produkt vorgenommen, +kann es vorkommen, dass das Produkt vom Handbuch abweicht. Die im +vorliegenden Dokument enthaltenen Informationen können sich ohne +Vorankündigung ändern. + +Einführung + +-[ Hinweise im Handbuch ]- + +Um Schäden an der Ausrüstung zu vermeiden und die Sicherheit der +Benutzer zu gewährleisten, enthält das vorliegende Handbuch +Sicherheitshinweise, die mit dem Symbol + +Warnung + + gekennzeichnet werden. Zusätzliche Informationen sind als + +Bemerkung + + gekennzeichnet. + +Warnung: Die mit + + Warnung + + gekennzeichneten Sicherheitshinweise geben Verfahren und Maßnahmen + an, die befolgt bzw. ergriffen werden müssen, um Verletzungsgefahren + für Bediener/Benutzer oder Schäden am Gerät zu vermeiden. Beziehen + sich die angegebenen Sicherheitshinweise auf Softwaremodule, dann + weisen diese auf Verfahren hin, die befolgt werden müssen, um + Störungen oder ein Fehlverhalten der Software zu vermeiden. + +Bemerkung: Bemerkungen werden in diesem Handbuch eingesetzt, um + zusätzliche relevante Informationen zu vermitteln. + diff --git a/v24.04/de/_sources/roi.rst.txt b/v24.04/de/_sources/roi.rst.txt new file mode 100644 index 0000000..09c2371 --- /dev/null +++ b/v24.04/de/_sources/roi.rst.txt @@ -0,0 +1,550 @@ +RoiDB + +Einleitung + +Das RoiDB Modul (Region of Interest Datenbankmodul) ermöglicht die +globale Definition von 2D und 3D Regions of Interest (ROIs), die dann +in vielen Detektionsmodulen verwendet werden können. Die definierten +ROIs sind in allen Modulen auf dem + +rc_visard NG + + verfügbar, die 2D oder 3D ROIs unterstützen. + +Das RoiDB Modul ist ein Basismodul, welches auf jedem + +rc_visard NG + + verfügbar ist. + +3D ROIs können in den + +ItemPick und BoxPick + + Modulen verwendet werden. 2D ROIs werden vom + +SilhouetteMatch + + Modul und dem + +LoadCarrier + + Modul unterstützt. + +Spezifikationen des ROIDB Moduls Unterstützte ROI Typen 2D, 3D +Unterstützte ROI Geometrien 2D ROI: Rechteck, 3D ROI: Box, Kugel +Max. Anzahl von ROIs 2D: 100, 3D: 100 ROIs verfügbar in 2D: +SilhouetteMatch\:(Abschnitt \ref{silhouettematch:sect- +silhouettematch}), LoadCarrier\:(Abschnitt \ref{loadcarrier:sect- +loadcarrier}), 3D: ItemPick und BoxPick\:(Section \ref{itempick:sect- +itempick}) Unterstützte Referenzkoordinatensysteme camera, external + +Region of Interest + +Eine sogenannte Region of Interest (ROI) definiert ein abgegrenztes +Raumvolumen (3D ROI, "region_of_interest") oder eine rechteckige +Region im linken Kamerabild (2D ROI, "region_of_interest_2d"), welche +für eine spezifische Anwendung relevant sind. + +Eine ROI kann das Volumen, in dem ein Load Carrier gesucht wird, +einschränken, oder einen Bereich definieren, der nur die zu +erkennenden oder zu greifenden Objekte enthält. Die Verarbeitungszeit +kann sich deutlich verringern, wenn eine ROI genutzt wird. + +Folgende Arten von 3D ROIs ("type") werden unterstützt: + + BOX, für quaderförmige ROIs mit den Abmessungen box.x, box.y, + box.z. + + SPHERE, für kugelförmige ROIs mit dem Radius sphere.radius. + +Die Pose "pose" einer 3D ROI kann entweder relativ zum + +Kamera + +-Koordinatensystem "camera" oder mithilfe der Hand-Auge-Kalibrierung +im + +externen + + Koordinatensystem "external" angegeben werden. Das externe +Koordinatensystem steht nur zur Verfügung, wenn eine + +Hand-Auge-Kalibrierung + + durchgeführt wurde. Wenn der Sensor am Roboter montiert ist, und die +ROI im externen Koordinatensystem definiert ist, dann muss jedem +Detektions-Service, der diese ROI benutzt, die aktuelle Roboterpose +übergeben werden. + +Eine 2D ROI ist als rechteckiger Teil des linken Kamerabilds definiert +und kann sowohl über die + +REST-API-Schnittstelle + + als auch über die + +rc_visard NG + + +Web GUI + + auf der Seite + +Regions of Interest + + unter dem Menüpunkt + +Datenbank + + gesetzt werden. Die Web GUI bietet hierfür ein einfach zu benutzendes +Werkzeug an. Jeder ROI muss ein eindeutiger Name zugewiesen werden, um +diese später adressieren zu können. + +In der REST-API ist eine 2D-ROI über folgende Werte spezifiziert: + +id: Eindeutiger Name der ROI + +offset_x, offset_y: Abstand in Pixeln von der oberen rechten Bildecke +entlang der x- bzw. y-Achse + +width, height: Breite und Höhe in Pixeln + +Der + +rc_visard NG + + erlaubt das Speichern von bis zu 100 verschiedenen 3D ROIs und der +gleichen Anzahl von 2D ROIs. Die Konfiguration von ROIs erfolgt in der +Regel offline während der Einrichtung der gewünschten Anwendung. Die +Konfiguration kann mithilfe der + +REST-API-Schnittstelle + + des RoiDB Moduls vorgenommen werden, oder über die + +rc_visard NG + + +Web GUI + + auf der Seite + +Regions of Interest + + unter dem Menüpunkt + +Datenbank + +. + +Bemerkung: Die erstellten ROIs sind persistent auf dem + + rc_visard NG + + gespeichert und auch nach Firmware-Updates und -Wiederherstellungen + verfügbar. + +Wechselwirkung mit anderen Modulen + +Die folgenden, intern auf dem + +rc_visard NG + + laufenden Module liefern Daten für das RoiDB Modul oder haben +Einfluss auf die Datenverarbeitung. + +Hand-Auge Kalibrierung + +Falls die Kamera zu einem Roboter kalibriert wurde, kann die Pose +einer 3D ROI im Roboterkoordinatensystem angegeben werden, indem das +Argument "pose_frame" auf "external" gesetzt wird. + +Zwei verschiedene Werte für "pose_frame" können gewählt werden: + +Kamera-Koordinatensystem (camera): Die Pose der 3D Region of Interest +ist Kamera-Koordinatensystem angegeben und es ist kein zusätzliches +Wissen über die Lage der Kamera in seiner Umgebung notwendig. Das +bedeutet insbesondere, dass sich ROIs oder Load Carrier, welche in +diesem Koordinatensystem angegeben sind, mit der Kamera bewegen. Es +liegt daher in der Verantwortung des Anwenders, in solchen Fällen die +entsprechenden Posen der Situation entsprechend zu aktualisieren +(beispielsweise für den Anwendungsfall einer robotergeführten Kamera). + +Benutzerdefiniertes externes Koordinatensystem (external): Die Pose +der 3D Region of Interest ist im sogenannten externen +Koordinatensystem angegeben, welches vom Nutzer während der Hand-Auge- +Kalibrierung gewählt wurde. In diesem Fall bezieht das Modul alle +notwendigen Informationen über die Kameramontage und die kalibrierte +Hand-Auge-Transformation automatisch vom Modul Hand-Auge- +Kalibrierung\:(Abschnitt \ref{handeye_calibration:sect-handeye- +calibration}). + +Bemerkung: Wenn keine Hand-Auge-Kalibrierung durchgeführt wurde bzw. + zur Verfügung steht, muss als Referenzkoordinatensystem "pose_frame" + immer "camera" angegeben werden. + +Zulässige Werte zur Angabe des Referenzkoordinatensystems sind +"camera" und "external". Andere Werte werden als ungültig +zurückgewiesen. + +Services + +Das RoiDB Modul wird in der REST-API als "rc_roi_db" bezeichnet und in +der + +Web GUI + + unter Datenbank ‣ Regions of Interest dargestellt. Die angebotenen +Services des RoiDB Moduls können mithilfe der + +REST-API-Schnittstelle + + oder der Web GUI ausprobiert und getestet werden. + +Das RoiDB Modul stellt folgende Services zur Verfügung. + +set_region_of_interest + + speichert eine 3D ROI auf dem + + rc_visard NG + + . Alle ROIs sind dauerhaft gespeichert, auch über Firmware-Updates + und -Wiederherstellungen hinweg. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + PUT http:///api/v2/nodes/rc_roi_db/services/set_region_of_interest + + Request + + Die Definition des Typs "region_of_interest" wird in + + Region of Interest + + beschrieben. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "region_of_interest": { + "box": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "sphere": { + "radius": "float64" + }, + "type": "string" + } + } + } + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "set_region_of_interest", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +set_region_of_interest_2d + + speichert eine 2D ROI auf dem + + rc_visard NG + + . Alle ROIs sind dauerhaft gespeichert, auch über Firmware-Updates + und -Wiederherstellungen hinweg. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + PUT http:///api/v2/nodes/rc_roi_db/services/set_region_of_interest_2d + + Request + + Die Definition des Typs "region_of_interest_2d" wird in + + Region of Interest + + beschrieben. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "region_of_interest_2d": { + "height": "uint32", + "id": "string", + "offset_x": "uint32", + "offset_y": "uint32", + "width": "uint32" + } + } + } + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "set_region_of_interest_2d", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +get_regions_of_interest + + gibt die mit "region_of_interest_ids" spezifizierten, gespeicherten + 3D ROIs zurück. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + PUT http:///api/v2/nodes/rc_roi_db/services/get_regions_of_interest + + Request + + Werden keine "region_of_interest_ids" angegeben, enthält die + Serviceantwort alle gespeicherten ROIs. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "region_of_interest_ids": [ + "string" + ] + } + } + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "get_regions_of_interest", + "response": { + "regions_of_interest": [ + { + "box": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "sphere": { + "radius": "float64" + }, + "type": "string" + } + ], + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +get_regions_of_interest_2d + + gibt die mit "region_of_interest_2d_ids" spezifizierten, + gespeicherten 2D ROIs zurück. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + PUT http:///api/v2/nodes/rc_roi_db/services/get_regions_of_interest_2d + + Request + + Werden keine "region_of_interest_2d_ids" angegeben, enthält die + Serviceantwort alle gespeicherten ROIs. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "region_of_interest_2d_ids": [ + "string" + ] + } + } + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "get_regions_of_interest_2d", + "response": { + "regions_of_interest": [ + { + "height": "uint32", + "id": "string", + "offset_x": "uint32", + "offset_y": "uint32", + "width": "uint32" + } + ], + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +delete_regions_of_interest + + löscht die mit "region_of_interest_ids" spezifizierten, + gespeicherten 3D ROIs. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + PUT http:///api/v2/nodes/rc_roi_db/services/delete_regions_of_interest + + Request + + Alle zu löschenden ROIs müssen explizit angegeben werden. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "region_of_interest_ids": [ + "string" + ] + } + } + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "delete_regions_of_interest", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +delete_regions_of_interest_2d + + löscht die mit "region_of_interest_2d_ids" spezifizierten, + gespeicherten 2D ROIs. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + PUT http:///api/v2/nodes/rc_roi_db/services/delete_regions_of_interest_2d + + Request + + Alle zu löschenden ROIs müssen explizit angegeben werden. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "region_of_interest_2d_ids": [ + "string" + ] + } + } + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "delete_regions_of_interest_2d", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +Rückgabecodes + +Zusätzlich zur eigentlichen Serviceantwort gibt jeder Service einen +sogenannten "return_code" bestehend aus einem Integer-Wert und einer +optionalen Textnachricht zurück. Erfolgreiche Service-Anfragen werden +mit einem Wert von "0" quittiert. Positive Werte bedeuten, dass die +Service-Anfrage zwar erfolgreich bearbeitet wurde, aber zusätzliche +Informationen zur Verfügung stehen. Negative Werte bedeuten, dass +Fehler aufgetreten sind. Für den Fall, dass mehrere Rückgabewerte +zutreffend wären, wird der kleinste zurückgegeben, und die +entsprechenden Textnachrichten werden in "return_code.message" +akkumuliert. + +Die folgende Tabelle listet die möglichen Rückgabe-Codes auf: + +Rückgabe-Codes der Services des RoiDB Moduls Code Beschreibung +0 Erfolgreich -1 Ungültige(s) Argument(e) -10 Das neue Element +konnte nicht hinzugefügt werden, da die maximal speicherbare Anzahl an +ROIs überschritten wurde. 10 Die maximal speicherbare Anzahl an ROIs +wurde erreicht. 11 Mit dem Aufruf von set_region_of_interest oder +set_region_of_interest_2d wurde ein bereits existierendes Objekt mit +derselben id überschrieben. diff --git a/v24.04/de/_sources/safety.rst.txt b/v24.04/de/_sources/safety.rst.txt new file mode 100644 index 0000000..99f278f --- /dev/null +++ b/v24.04/de/_sources/safety.rst.txt @@ -0,0 +1,149 @@ +Sicherheit + +Warnung: Vor Inbetriebnahme des + + rc_visard NG + + -Produkts muss der Bediener alle Anweisungen in diesem Handbuch + gelesen und verstanden haben. + +Bemerkung: Der Begriff "Bediener" bezieht sich auf jede Person, die + in Verbindung mit dem + + rc_visard NG + + mit einer der folgenden Aufgaben betraut ist: + + Installation + + Wartung + + Inspektion + + Kalibrierung + + Programmierung + + Außerbetriebnahme + +Das vorliegende Handbuch geht auf die verschiedenen Softwaremodule des + +rc_visard NG + + ein und erläutert allgemeine Aspekte zum Lebenszyklus des Produkts: +von der Installation über die Verwendung bis hin zur +Außerbetriebnahme. + +Die im vorliegenden Handbuch enthaltenen Zeichnungen und Fotos sind +Beispiele zur Veranschaulichung. Das ausgelieferte Produkt kann +hiervon abweichen. + +Allgemeine Sicherheitshinweise + +Bemerkung: Wird der + + rc_visard NG + + entgegen den hierin angegebenen Sicherheitshinweisen verwendet, so + kann dies zu Personen- oder Sachschäden sowie zum Verlust der + Garantie führen. + +Warnung: + + Der rc_visard NG muss vor der Verwendung ordnungsgemäß montiert + werden. + + Alle Kabel sind am rc_visard NG und an seiner Halterung zu sichern. + + Die Länge der verwendeten Kabel darf 30 Meter nicht überschreiten. + + Die Stromversorgung für den rc_visard NG muss über eine geeignete + Gleichstromquelle erfolgen. + + Jeder rc_visard NG muss an eine separate Gleichstromquelle + angeschlossen werden. + + Das Gehäuse des rc_visard NG muss geerdet werden. + + Die zum rc_visard NG oder zugehöriger Ausrüstung angegebenen + Sicherheitshinweise müssen stets eingehalten werden. + + Der rc_visard NG fällt nicht in den Anwendungsbereich der + europäischen Maschinen-, Niederspannungs- oder + Medizinprodukterichtlinie. + +-[ Risikobewertung und Endanwendung ]- + +Der + +rc_visard NG + + kann auf einem Roboter installiert werden. Der Roboter, der + +rc_visard NG + + und jede andere für die Endanwendung eingesetzte Ausrüstung müssen im +Rahmen einer Risikobewertung begutachtet werden. Der Systemintegrator +ist verpflichtet, die Einhaltung aller lokalen Sicherheitsmaßnahmen +und Vorschriften zu gewährleisten. Je nach Anwendung kann es Risiken +geben, die zusätzliche Schutz- oder Sicherheitsmaßnahmen erfordern. + +Bestimmungsgemäße Verwendung + +Der + +rc_visard NG + + ist für die Datenerfassung (z.B. Kamerabilder, und +Disparitätsbilder) in stationären oder mobilen Robotik-Anwendungen +bestimmt. Der + +rc_visard NG + + kann dabei auf einem Roboter, einer automatischen Maschine, einer +mobilen Plattform oder einer stationären Vorrichtung montiert sein. Er +eignet sich zudem für die Datenerfassung in anderen Anwendungen. + +Warnung: Der + + rc_visard NG + + ist + + NICHT + + für sicherheitskritische Anwendungen bestimmt. + +Der vom + +rc_visard NG + + verwendete Schnittstellenstandard GigE Vision® unterstützt weder +Authentifizierung noch Verschlüsselung. Alle von diesem und an dieses +Gerät gesandten Daten werden ohne Authentifizierung und +Verschlüsselung übermittelt und könnten daher von einem Dritten +abgefangen oder manipuliert werden. Es liegt in der Verantwortung des +Bedieners, den + +rc_visard NG + + nur an ein gesichertes internes Netzwerk anzuschließen. + +Warnung: Der + + rc_visard NG + + muss an gesicherte interne Netzwerke angeschlossen werden. + +Der + +rc_visard NG + + darf nur im Rahmen seiner technischen Spezifikation verwendet werden. +Jede andere Verwendung des Produkts gilt als nicht bestimmungsgemäße +Verwendung. Roboception haftet nicht für Schäden, die aus +unsachgemäßer oder nicht bestimmungsgemäßer Verwendung entstehen. + +Warnung: Die lokalen und/oder nationalen Gesetze, Vorschriften und + Richtlinien zu Automationssicherheit und allgemeiner + Maschinensicherheit sind stets einzuhalten. diff --git a/v24.04/de/_sources/silhouettematch.rst.txt b/v24.04/de/_sources/silhouettematch.rst.txt new file mode 100644 index 0000000..c454ca0 --- /dev/null +++ b/v24.04/de/_sources/silhouettematch.rst.txt @@ -0,0 +1,2694 @@ +SilhouetteMatch + +Einführung + +Das SilhouetteMatch-Modul ist ein optionales Modul, welches intern auf +dem + +rc_visard NG + + läuft, und benötigt eine eigene + +Lizenz + +, welche erworben werden muss. + +Das Modul erkennt Objekte, indem eine vordefinierte Silhouette +("Template") mit Kanten im Bild verglichen wird. + +Das SilhouetteMatch Modul kann Objekte in zwei verschiedenen Szenarien +erkennen: + + Mit kalibrierter Basisebene + + : Die Objekte befinden sich auf einer gemeinsamen Basisebene, die + vor der Objekterkennung kalibriert werden muss, und die Objekte + haben prägnante Kanten auf einer gemeinsamen Ebene, welche parallel + zu der Basisebene ist. + + Mit Objektebenenerkennung + + : Die Objekte können sich auf verschiedenen, vorab unbekannten + Ebenen befinden, falls die Objekte eine planare Oberfläche haben + und ihre Konturen gut in den Kamerabildern sichtbar sind (z.B. + gestapelte flache Objekte). + +Templates für die Objekterkennung können erstellt werden, indem eine +DXF Datei hochgeladen und die Objekthöhe angegeben wird. Die korrekte +Skalierung und Einheit der Konturen wird aus der DXF Datei extrahiert. +Falls die DXF Datei keine Einheit enthält, muss der Nutzer die +korrekte Einheit angeben. Wenn die Außenkontur des Objekts in der DXF +Datei geschlossen ist, wird automatisch ein 3D Kollisionsmodell +erstellt, indem die Kontur auf die Objekthöhe extrudiert wird. Dieses +Modell wird dann zur Kollisionsprüfung und 3D-Visualisierung +verwendet. Das Hochladen der DXF Datei kann in der Web GUI über +guilabel:*+ Neues Template erstellen* im Abschnitt + +SilhouetteMatch Templates und Greifpunkte + + auf der Module ‣ SilhouetteMatch oder Datenbank ‣ Templates Seite +erfolgen. + +Roboception bietet hierfür auch einen Template-Generierungsservice auf +ihrer + +Website + + an, auf der der Benutzer CAD-Daten oder mit dem System aufgenommene +Daten hochladen kann, um Templates generieren zu lassen. + +Templates bestehen aus den prägnanten Kanten eines Objekts. Die Kanten +des Templates werden mit den erkannten Kanten im linken und rechten +Kamerabild abgeglichen, wobei die Größe der Objekte und deren Abstand +zur Kamera mit einbezogen wird. Die Posen der erkannten Objekte werden +zurückgegeben und können beispielsweise benutzt werden, um die Objekte +zu greifen. + +Das SilhouetteMatch-Modul bietet: + +eine intuitiv gestaltete Bedienoberfläche für Inbetriebnahme, +Konfiguration und Test auf der rc_visard NG Web GUI\:(Abschnitt +\ref{webgui:sect-web-gui}) + +eine REST-API-Schnittstelle\:(Abschnitt \ref{rest_api:sect-rest-api}) +und eine KUKA Ethernet KRL Schnittstelle\:(Abschnitt \ref{eki:sect- +eki}) + +die Möglichkeit, sogenannte Regions of Interest (ROIs) zu definieren, +um relevante Teilbereiche des Kamerabilds auszuwählen (siehe Setzen +einer Region of Interest, Abschnitt \ref{silhouettematch:sect- +silhouettematch-roi}) + +eine integrierte Load Carrier Erkennung (siehe LoadCarrier, Abschnitt +\ref{loadcarrier:sect-loadcarrier}), um in Bin-Picking-Anwendungen +("Griff in die Kiste") Greifpunkte nur für Objekte in dem erkannten +Load Carrier zu berechnen + +die Speicherung von bis zu 50 Templates + +die Definition von bis zu 50 Greifpunkten für jedes Template über eine +interaktive Visualisierung in der Web GUI + +eine Kollisionsprüfung zwischen Greifer und Load Carrier, der +kalibrierten Basisebene, anderen erkannten Objekten, und/oder der +Punktwolke + +die Unterstützung von sowohl statisch montierten als auch +robotergeführten Kameras. Optional kann es mit der Hand-Auge- +Kalibrierung (Abschnitt \ref{handeye_calibration:sect-handeye- +calibration}) kombiniert werden, um Greifposen in einem +benutzerdefinierten externen Koordinatensystem zu liefern + +Auswahl einer Strategie zum Sortieren der erkannten Objekte und +zurückgelieferten Greifpunkte + +eine 3D Visualisierung des Detektionsergebnisses mit Greifpunkten und +einer Greiferanimation in der Web GUI + +Taugliche Objekte + +Das SilhouetteMatch-Modul ist für Objekte ausgelegt, die prägnante +Kanten auf einer Ebene besitzen, welche parallel zu der Ebene ist, auf +der die Objekte liegen. Das trifft beispielsweise auf flache, nicht- +transparente Objekte zu, wie gefräste, lasergeschnittene oder +wasserstrahlgeschnittene Teile. Komplexere Objekte können auch erkannt +werden, solange sie prägnante Kanten auf einer Ebene besitzen, z.B. +ein gedrucktes Muster auf einer ebenen Fläche. + +Falls die Objekte nicht auf einer gemeinsamen Ebene liegen oder die +Basisebene nicht vorab kalibriert werden kann, brauchen die Objekte +eine planare Oberfläche und ihre Konturen müssen gut im linken und +rechten Kamerabild sichtbar sein. Weiterhin müssen die Templates für +diese Objekte eine geschlossene Außenkontur haben. + +Taugliche Szene + +Eine für das SilhouetteMatch-Modul taugliche Szene muss folgende +Bedingungen erfüllen: + +Die zu erkennenden Objekte müssen, wie oben beschrieben, tauglich für +das SilhouetteMatch-Modul sein. + +Nur Objekte, die zum selben Template gehören, dürfen gleichzeitig +sichtbar sein (sortenrein). Falls auch andere Objekte sichtbar sind, +muss eine passende Region of Interest (ROI) festgelegt werden. + +Im Falle einer kalibrierten Basisebene: Die Verkippung der Basisebene +zur Blickrichtung der Kamera darf 10 Grad nicht übersteigen. + +Im Falle von verschiedenen oder unbekannten Basisebenen: Die +Verkippung der planaren Oberfläche der Objekte zur Blickrichtung der +Kamera darf 25 Grad nicht übersteigen. + +Die Objekte sind weder teilweise noch komplett verdeckt. + +Alle sichtbaren Objekte liegen richtig herum. + +Die Objektkanten, welche abgeglichen werden sollen, sind sowohl im +linken als auch im rechten Kamerabild zu sehen. + +Kalibrierung der Basisebene + +Falls alle Objekte auf einer gemeinsamen Ebene liegen, die vorab +bekannt ist, sollte diese Ebene kalibriert werden, bevor die +Objekterkennung gestartet wird. Hierbei wird die Distanz und der +Winkel der Ebene, auf welcher die Objekte liegen, gemessen und +persistent auf dem + +rc_visard NG + + gespeichert. + +Durch die Trennung der Kalibrierung der Basisebene von der +eigentlichen Objekterkennung werden beispielsweise Szenarien +ermöglicht, in denen die Basisebene zeitweise verdeckt ist. Darüber +hinaus wird die Berechnungszeit der Objekterkennung für Szenarien +verringert, in denen die Basisebene für eine gewisse Zeit fixiert ist +-- die Basisebene muss in diesem Fall nicht fortlaufend neu detektiert +werden. + +Die Kalibrierung der Basisebene kann mit drei unterschiedlichen +Verfahren durchgeführt werden, auf die im Folgenden näher eingegangen +wird: + +AprilTag-basiert + +Stereo-basiert + +Manuell + +Die Kalibrierung ist erfolgreich, solange der Normalenvektor der +Basisebene höchstens 10 Grad gegen die Blickrichtung der Kamera +verkippt ist. Eine erfolgreiche Kalibrierung wird persistent auf dem + +rc_visard NG + + gespeichert, bis sie entweder gelöscht wird oder eine neue +Kalibrierung durchgeführt wird. + +Bemerkung: Um Datenschutzproblemen entgegenzuwirken, wird die + Visualisierung der Kalibrierung der Basisebene nach einem Neustart + des + + rc_visard NG + + verschwommen dargestellt. + +In Szenarien, in denen die Basisebene nicht direkt kalibriert werden +kann, ist es auch möglich, zu einer zur Basisebene parallel liegenden +Ebene zu kalibrieren. In diesem Fall kann der Parameter "offset" +benutzt werden, um die geschätzte Ebene auf die eigentliche Basisebene +zu verschieben. Der Parameter "offset" gibt die Distanz in Metern an, +um welche die geschätzte Ebene in Richtung der Kamera verschoben wird. + +In der REST-API ist eine Ebene durch eine Normale ("normal") und einen +Abstand ("distance") definiert. "normal" ist ein normalisierter +3-Vektor, welcher die Normale der Ebene spezifiziert. Die Normale +zeigt immer von der Kamera weg. "distance" repräsentiert den Abstand +der Ebene von der Kamera in Richtung der Normale. "normal" und +"distance" können auch als a, b, c, bzw. d der Ebenengleichung +interpretiert werden: + + ax + by + cz + d = 0 + +AprilTag-basierte Kalibrierung der Basisebene + +Die AprilTag-Erkennung (siehe + +TagDetect + +) wird benutzt, um AprilTags in der Szene zu finden und eine Ebene +durch diese zu legen. Mindestens drei AprilTags müssen so auf der +Basisebene platziert werden, dass sie im linken und rechten Kamerabild +zu sehen sind. Die AprilTags sollten ein möglichst großes Dreieck +aufspannen. Je größer das Dreieck ist, desto höher wird die +Genauigkeit der Schätzung der Basisebene. Diese Methode sollte benutzt +werden, wenn die Basisebene untexturiert und kein externer Projektor +mit Zufallsmuster angeschlossen ist. Diese Kalibriermethode ist sowohl +über die + +REST-API-Schnittstelle + + als auch über die + +rc_visard NG + + Web GUI verfügbar. + +Stereo-basierte Kalibrierung der Basisebene + +Die 3D-Punktwolke, welche vom Stereo-Matching-Modul berechnet wird, +wird benutzt um eine Ebene in den 3D-Punkten zu finden. Die Region of +Interest (ROI) sollte für diese Methode deshalb so gewählt werden, +dass nur die relevante Basisebene eingeschlossen wird. Der Parameter +"plane_preference" erlaubt es auszuwählen, ob die zur Kamera am +nächsten gelegene oder die von der Kamera am weitesten entfernte Ebene +als Basisebene benutzt wird. Die am nächsten gelegene Ebene kann in +Szenarien ausgewählt werden, in denen die Basisebene vollständig von +Objekten verdeckt wird oder für die Kalibrierung nicht erreichbar ist. +Diese Methode sollte benutzt werden, wenn die Basisebene texturiert +ist oder ein Projektor mit Zufallsmuster angeschlossen ist. Diese +Kalibriermethode ist sowohl über die + +REST-API-Schnittstelle + + als auch über die + +rc_visard NG + + Web GUI verfügbar. + +Manuelle Kalibrierung der Basisebene + +Die Basisebene kann manuell gesetzt werden, falls die Parameter +bekannt sind -- beispielsweise von einer vorangegangenen Kalibrierung. +Diese Kalibriermethode ist nur über die + +REST-API-Schnittstelle + + und nicht über die + +rc_visard NG + + Web GUI verfügbar. + +Setzen einer Region of Interest + +Falls Objekte nur in einem Teil des Sichtfelds der Kamera erkannt +werden sollen, kann eine 2D Region of Interest (ROI) gesetzt werden, +wie in + +Region of Interest + + beschrieben wird. + +Setzen von Greifpunkten + +Um das SilhouetteMatch-Modul direkt in einer Roboteranwendung zu +nutzen, können für jedes Template bis zu 50 Greifpunkte definiert +werden. Ein Greifpunkt repräsentiert die gewünschte Position und +Orientierung des Roboter-TCPs (Tool Center Point), mit der das Objekt +gegriffen werden kann (siehe + +Abb. 28 + +). + + +Jeder Greifpunkt enthält eine "id", die eindeutig über alle +Greifpunkte eines Objekt-Templates sein muss, die ID des Templates +("template_id"), zu dem der Greifpunkt hinzugefügt wird, und die +Greifpose ("pose") im Koordinatensystem des Templates. Greifpunkte +können über die + +REST-API-Schnittstelle + +, oder über die interaktive Visualisierung in der Web GUI definiert +werden. Zudem kann einem Greifpunkt eine Priorität (von -2 für sehr +niedrig bis 2 für sehr hoch) zugewiesen werden. Prioritäten können +Roboteranwendungen vereinfachen, oder die Rechenzeit der +Kollisionsprüfung verkürzen, wenn der Parameter +"only_highest_priority_grasp" aktiviert ist. In diesem Fall endet die +Kollisionsprüfung, wenn Greifpunkte mit der höchsten Priorität +gefunden sind. Weiterhin können Greifpunkte unterschiedlichen Greifern +zugewiesen werden, indem die ID des Greifers ("gripper_id") +spezifiziert wird. Dieser Greifer wird dann anstelle des Greifers, +welcher im "detect_object" Service definiert ist, für die +Kollisionsprüfung des zugehörigen Greifpunkts verwendet. + +Wird ein Greifpunkt auf einem symmetrischen Objekt definiert, werden +alle Greifpunkte, die zu diesem symmetrisch sind, automatisch im +"detect_object" Service des SilhouetteMatch Moduls mit berücksichtigt. +Symmetrische Greifpunkte zu einem gegebenen Greifpunkt können mittels +des "get_symmetric_grasps" Services abgefragt werden und in der Web +GUI visualisiert werden. + +Benutzer können ebenfalls Replikationen eines Greifpunktes um eine +selbst-definierte Achse definieren. Eine Replikation generiert mehrere +Greifpunkte und sorgt dafür, dass Benutzer nicht zu viele Greifpunkte +manuell setzen müssen. Der Ursprung der Replikation ist als +Koordinatensystem im Objektkoordinatensystem definiert und die x-Achse +dieses Koordinatensystems entspricht der Replikationsachse. Der +Greifpunkt wird repliziert, indem er ausgehend von seiner +ursprünglichen Pose um diese x-Achse gedreht wird. Die Replikation +erfolgt in "step_x_deg"-Grad Schritten. Der Bereich wird durch die +minimalen und maximalen Endpunkte "min_x_deg" und "max_x_deg" +bestimmt. Der minimale (maximale) Endpunkt muss nicht-positiv (nicht- +negativ) sein. + +Setzen von Greifpunkten in der Web GUI + +Die + +rc_visard NG + + Web GUI bietet eine interaktive und intuitive Möglichkeit, +Greifpunkte für Objekt-Templates zu setzen. Im ersten Schritt muss das +Objekt-Template auf den + +rc_visard NG + + hochgeladen werden. Das kann über die Web GUI in einer beliebigen +Kamerapipeline unter Module ‣ SilhouetteMatch erfolgen, indem im +Abschnitt + +Templates und Greifpunkte + + auf + Neues Template hinzufügen geklickt wird, oder unter Datenbank ‣ +Templates im Abschnitt + +SilhouetteMatch Templates und Greifpunkte + +. Wenn der Upload abgeschlossen ist, erscheint ein Fenster mit einer +3D-Visualisierung des Templates, in dem Greifpunkte hinzugefügt oder +existierende Greifpunkte bearbeitet werden können. Dasselbe Fenster +erscheint, wenn ein vorhandenes Template bearbeitet wird. Wenn das +Template ein Kollisionsmodell oder ein Visualisierungsmodell enthält, +wird dieses Modell ebenfalls angezeigt. + +Dieses Fenster bietet zwei Möglichkeiten, um Greifpunkte zu setzen: + +Greifpunkte manuell hinzufügen: Durch Klicken auf das + Symbol wird +ein neuer Greifpunkt im Ursprung des Templates angelegt. Diesem +Greifpunkt kann ein eindeutiger Name gegeben werden, der seiner ID +entspricht. Die gewünschte Pose des Greifpunkts im Koordinatensystem +des Templates kann in den Feldern für Position und Roll/Pitch/Yaw +eingegeben werden. Die Greifpunkte können frei platziert werden, auch +außerhalb oder innerhalb des Templates, und werden mit ihrer +Orientierung zur Überprüfung in der Visualisierung veranschaulicht. + +Greifpunkte interaktiv hinzufügen: Greifpunkte können interaktiv zu +einem Template hinzugefügt werden, indem zuerst auf den Button +Greifpunkt hinzufügen oben rechts in der Visualisierung und +anschließend auf den gewünschten Punkt auf dem Template geklickt wird. +Wenn ein 3D-Modell angezeigt wird, wird der Greifpunkt an die +Oberfläche des Modells angeheftet, andernfalls an die Template- +Oberfläche. Die Orientierung des Greifpunkts entspricht einem +rechtshändigen Koordinatensystem, sodass die z-Achse senkrecht auf der +Template-Oberfläche steht und in das Template hinein gerichtet ist. +Die Position und Orientierung des Greifpunkts im Koordinatensystem des +Templates ist auf der rechten Seite angezeigt. Die Position und +Orientierung des Greifpunkts kann auch interaktiv verändert werden. +Für den Fall, dass An Oberfläche anheften in der Visualisierung +deaktiviert ist (das ist der Standardwert), kann der Greifpunkt in +allen drei Dimensionen frei verschoben und gedreht werden, indem in +der Visualisierung auf Greifpunkt bewegen geklickt wird und der +Greifpunkt dann entlang der Achse zur gewünschten Position verschoben +wird. Die Orientierung des Greifpunkts kann ebenfalls interaktiv +verändert werden, indem die Achse mit der Maus rotiert wird. Wenn An +Oberfläche anheften nicht aktiv ist, kann der Greifpunkt nur auf der +Objektoberfläche verschoben und rotiert werden. + +Benutzer können auch eine Greifpunktpriorität festlegen, indem sie den +Schieberegler Priorität ändern. Ein dedizierter Greifer kann im +Dropdown-Feld Greifer ausgewählt werden. + +Durch Aktivieren des Kontrollkästchens Replizieren können Benutzer den +Greifpunkt um eine benutzerdefinierte Achse replizieren. Die +Replikationsachse und die generierten Greifpunkte werden visualisiert. +Die Lage und Ausrichtung der Replikationsachse relativ zum +Objektkoordinatensystem kann interaktiv angepasst werden, indem im +Visualisierungsmenü auf Replikationsachse bewegen geklickt und die +Achse an die gewünschte Position und Ausrichtung gezogen wird. Die +Greifpunkte werden innerhalb des angegebenen Drehbereichs mit der +ausgewählten Schrittgröße repliziert. Benutzer können eine +Visualisierung die replizierten Greifpunkte durchlaufen, indem sie die +Leiste unter Durchlaufen n repl. Greifpunkte im Abschnitt +Ansichtsoptionen des Visualisierungsmenüs ziehen. Wenn für den +Greifpunkt ein Greifer ausgewählt ist oder im Visualisierungsmenü ein +Greifer ausgewählt wurde, wird der Greifer auch am aktuell +ausgewählten Greifpunkt angezeigt. + +Wenn das Template Symmetrien hat, können die Greifpunkte, die +symmetrisch zum definierten Greifpunkt sind, zusammen mit ihren +Replikationen (sofern definiert) durch Aktivieren von ... Symmetrien +im Abschnitt Ansichtsoptionen des Visualisierungsmenüs angezeigt +werden. Visualisierungen der symmetrischen Greifpunkte können +ebenfalls durchlaufen werden, indem die Leiste unter Durchlaufe n +symm. Greifpunkte bewegt wird. + +Setzen von Greifpunkten über die REST-API + +Greifpunkte können über die + +REST-API-Schnittstelle + + mithilfe des "set_grasp" oder "set_all_grasps" Services gesetzt +werden (siehe + +Interne Services + +). Ein Greifpunkt besteht aus der "id", die eindeutig über alle +Greifpunkte eines Objekt-Templates sein muss, der ID des Templates +("template_id"), zu dem der Greifpunkt hinzugefügt wird, und der +Greifpose ("pose"). Die Pose ist im Koordinatensystem des Templates +angegeben und besteht aus einer Position ("position") in Metern und +einer Orientierung ("orientation") als Quaternion. Ein dedizierter +Greifer kann durch Setzen des Feldes "gripper_id" angegeben werden. +Die "priority" wird durch einen ganzzahligen Wert angegeben, der von +-2 für sehr niedrig bis 2 für sehr hoch reicht. Der +Replikationsursprung ist als eine Transformation im Koordinatensystem +des Objekts definiert und die x-Achse der Transformation entspricht +der Replikationsachse. Der Replikationsbereich wird durch die Felder +"min_x_deg" und "max_x_deg" und die Schrittweite "step_x_deg" +gesteuert. + +Setzen der bevorzugten TCP-Orientierung + +Das SilhouetteMatch-Modul berechnet die Erreichbarkeit von +Greifpunkten basierend auf der bevorzugten Orientierung des Greifers +oder TCPs. Die bevorzugte Orientierung kann über den Service +"set_preferred_orientation" oder über die + +SilhouetteMatch + +-Seite in der Web GUI gesetzt werden. Die resultierende Richtung der +z-Achse des TCP wird genutzt, um Greifpunkte zu verwerfen, die der +Greifer nicht erreichen kann. Weiterhin kann die bevorzugte +Orientierung genutzt werden, um die erreichbaren Greifpunkte zu +sortieren, indem die entsprechende Sortierstrategie ausgewählt wird. + +Die bevorzugte TCP-Orientierung kann im Kamerakoordinatensystem oder +im externen Koordinatensystem gesetzt werden, wenn eine Hand-Auge- +Kalibrierung verfügbar ist. Wenn die bevorzugte TCP-Orientierung im +externen Koordinatensystem definiert ist, und der Sensor am Roboter +montiert ist, muss bei jedem Aufruf der Objekterkennung die aktuelle +Roboterpose angegeben werden, damit die bevorzugte Orientierung zur +Filterung und optional zur Sortierung der Greifpunkte auf den +erkannten Objekten genutzt werden kann. Wenn keine bevorzugte TCP- +Orientierung gesetzt wird, wird die Orientierung der linken Kamera als +die bevorzugte TCP-Orientierung genutzt. + +Setzen der Sortierstrategie + +Die vom "detect_object" Service zurückgelieferten Objekte und +Greifpunkte werden gemäß einer Sortierstrategie sortiert, die vom +Nutzer gewählt werden kann. Folgende Sortierstrategien sind verfügbar +und können über die + +Web GUI + + oder über den "set_sorting_strategies" Service gesetzt werden: + +preferred_orientation: Objekte und Greifpunkte mit der geringsten +Rotationsänderung zwischen ihrer Orientierung und der bevorzugten TCP- +Orientierung werden zuerst zurückgeliefert. + +direction: Objekte und Greifpunkte mit dem kleinsten Abstand entlang +der gesetzten Richtung vector im angegebenen Referenzkoordinatensystem +pose_frame werden zuerst zurückgeliefert. + +Wenn keine Sortierstrategie gesetzt ist, oder die Standard- +Sortierstrategie in der Web GUI ausgewählt ist, geschieht die +Sortierung der Greifpunkte basierend auf einer Kombination von +"preferred_orientation" und dem kleinsten Abstand entlang der z-Achse +der bevorzugten TCP-Orientierung von der Kamera. + +Objekterkennung + +Um eine Objekterkennung durchzuführen, müssen im Allgemeinen die +folgenden Serviceargumente an das SilhouetteMatch-Modul übergeben +werden: + +das Template des Objekts, welches in der Szene erkannt werden soll + +das Koordinatensystem, in dem die Posen der detektierten Objekte +zurückgegeben werden sollen (siehe Hand-Auge-Kalibrierung, Abschnitt +\ref{silhouettematch:sect-silhouettematch-hand-eye-calib}) + +Optional können auch folgende Serviceargumente an das SilhouetteMatch- +Modul übergeben werden: + +Ein Flag object_plane_detection, welches bestimmt, ob die +Oberflächenebene der Objekte für die Erkennung verwendet werden soll +anstelle einer kalibrierten Basisebene. + +ein Versatz offset, falls Objekte nicht direkt auf der Basisebene +liegen, sondern auf einer zu dieser parallelen Ebene. Der Versatz +bezeichnet die Distanz beider Ebenen in Richtung der Kamera. Wenn +dieser Wert nicht gesetzt wird, wird ein Versatz von 0 angenommen. Der +Versatz darf nicht gesetzt werden, wenn object_plane_detection true +ist. + +die ID des Load Carriers, der die zu detektierenden Objekte enthält + +die ID der Region of Interest, innerhalb der nach dem Load Carrier +gesucht wird, oder -- falls kein Load Carrier angegeben ist -- die +Region of Interest, innerhalb der Objekte erkannt werden sollen. Wenn +keine ROI gesetzt wird, werden Objekte im gesamten Kamerabild gesucht. + +die aktuelle Roboterpose, wenn die Kamera am Roboter montiert ist und +als Koordinatensystem external gewählt wurde, oder die bevorzugte TCP- +Orientierung im externen Koordinatensystem angegeben ist + +Informationen für die Kollisionsprüfung: Die ID des Greifers, um die +Kollisionsprüfung zu aktivieren, und optional ein Greif-Offset, der +die Vorgreifposition definiert. Details zur Kollisionsprüfung sind in +CollisionCheck\:(Abschnitt \ref{silhouettematch:sect-silhouettematch- +collision-check-dep}) gegeben. + +Wenn "object_plane_detection" nicht true ist, können Objekte erst nach +einer erfolgreichen Kalibrierung der Basisebene erkannt werden. Es +muss sichergestellt werden, dass sich Position und Orientierung der +Basisebene zwischen Kalibrierung und Objekterkennung nicht ändern. +Anderenfalls muss die Kalibrierung erneuert werden. + +Wenn "object_plane_detection" auf true gesetzt ist, ist eine +Kalibrierung der Basisebene nicht nötig und eine ggf. existierende +Kalibrierung wird ignoriert. Während der Erkennung wird die Szene in +planare Flächen unterteilt und das Matching der Templatekanten wird +für jede dieser Ebenen durchgeführt, solange sie nicht mehr als 25° in +Bezug auf die Sichtachse der Kamera verkippt ist, und solange ihre +Größe ausreichend ist für das gewählte Template. Wenn ein Match +gefunden wird, wird dessen Position und Orientierung durch Kanten im +Kamerabild und durch die Punktwolke innerhalb der Außenkontur des +Templates verfeinert. Aus diesem Grund muss die Außenkontur des +Templates geschlossen und die Oberfläche des Objekts planar sein. + +Im + +Ausprobieren + +-Abschnitt der Seite + +SilhouetteMatch + + der Web GUI kann die Objektdetektion ausprobiert werden. Verschiedene +Bild-Streams können ausgewählt werden, um Zwischenergebnisse und die +finalen Matches anzuzeigen (siehe + +Abb. 29 + +). + + Das + + "Template" + + Bild zeigt das zu erkennende Template in Rot mit den Greifpunkten + (siehe + + Setzen von Greifpunkten + + ) in Grün. Das Template wird verformt dargestellt, passend zu + Abstand und Verkippung der kalibrierten Basisebene, oder - falls + "object_plane_detection" auf true gesetzt war, der höchsten + erkannten Ebene. Die entsprechende Ebene ist in Dunkelblau + dargestellt. + + Das + + "Zwischenergebnis" + + Bild zeigt die Kanten im linken Bild, die für die Suche nach + Matches verwendet wurden, in Hellblau. Die gewählte Region of + Interest wird als petrolfarbenes Rechteck dargestellt. Eine blau + schattierte Fläche auf der linken Seite markiert den Teil des + linken Kamerabilds, welcher nicht mit dem rechten Kamerabild + überlappt. In diesem Bereich können keine Objekte erkannt werden. + Wenn die Objektebenenerkennung verwendet wurde + ("object_plane_detection" ist true), zeigt dieses Bild auch die + erkannten planaren Cluster in der Szene. Cluster, die nicht für das + Matching verwendet wurden, weil sie zu klein oder zu stark geneigt + sind, werden mit einem Streifenmuster dargestellt. + + Das + + "Zwischenergebnis rechts" + + Bild zeigt die Kanten im rechten Bild, die für die Suche nach + Matches verwendet wurden, in Hellblau. Die gewählte Region of + Interest wird als petrolfarbenes Rechteck dargestellt. Eine blau + schattierte Fläche auf der rechten Seite markiert den Teil des + rechten Kamerabilds, welcher nicht mit dem linken Kamerabild + überlappt. In diesem Bereich können keine Objekte erkannt werden. + + Das + + "Ergebnis" + + Bild zeigt das Detektionsergebnis. Die Kanten, die zur + Verfeinerung der Match Posen genutzt wurden, werden in hellem Blau + und erkannte Objekte ("instances") in Rot visualisiert. Blaue + Punkte markieren jeweils den Ursprung der detektierten Objekte, wie + im Template festgelegt. Kollisionsfreie Greifpunkte sind als grüne + Punkte dargestellt, ungeprüfte Greifpunkte als gelbe Punkte, und + kollidierende Greifpunkte werden als rote Punkte visualisiert. + + +Die Posen der Objektursprünge werden im gewählten Koordinatensystem +als Liste ("instances") zurückgegeben. Falls die kalibrierte +Basisebene für die Erkennung genutzt wurde ("object_plane_detection" +nicht oder false gesetzt), wird die Orientierung der erkannten Objekte +mit mit der Normalen der Basisebene ausgerichtet. Andernfalls ist die +Orientierung der Objekte an der Normalen der Ebene ausgerichtet, die +in die zugehörigen Objektpunkte in der 3D Punktwolke eingepasst wurde. + +Wenn das ausgewählte Template auch Greifpunkte hat, dann wird +zusätzlich zu den erkannten Objekten auch eine Liste von Greifpunkten +("grasps") für alle erkannten Objekte zurückgegeben. Die Posen der +Greifpunkte sind im gewünschten Koordinatensystem angegeben und die +Liste ist gemäß der gewählten Sortierstrategie sortiert (siehe + +Setzen der Sortierstrategie + +). Die erkannten Objekte und die Greifpunkte können über ihre UUIDs +einander zugeordnet werden. + +Falls das Template eine kontinuierliche Rotationssymmetrie aufweist +(z.B. zylindrische Objekte), besitzen alle Ergebnisposen die gleiche +Orientierung. Weiterhin werden alle Symmetrien eines Greifpunkts auf +Erreichbarkeit und Kollisionsfreiheit geprüft, und anschließend nur +der jeweilige beste gemäß der gewählten Sortierstrategie +zurückgeliefert. + +Für Objekte mit einer diskreten Symmetrie (z.B. prismatische Objekte), +werden alle kollisionsfreien Symmetrien jedes Greifpunkts, die +entsprechend der gesetzten bevorzugten TCP-Orientierung erreichbar +sind, zurückgeliefert, und gemäß der gewählten Sortierstrategie +sortiert. + +Die Detektionsergebnisse und Berechnungszeiten werden durch +Laufzeitparameter beeinflusst, welche weiter unten aufgezählt und +beschrieben werden. Unsachgemäße Parameterwerte können zu +Zeitüberschreitungen im Detektionsprozess des SilhouetteMatch-Moduls +führen. + +Wechselwirkung mit anderen Modulen + +Die folgenden auf dem + +rc_visard NG + + laufenden Module liefern Daten für das SilhouetteMatch-Modul oder +haben Einfluss auf die Datenverarbeitung. + +Bemerkung: Jede Konfigurationsänderung dieser Module kann direkte + Auswirkungen auf die Qualität oder das Leistungsverhalten des + SilhouetteMatch- Moduls haben. + +Stereokamera und Stereo-Matching + +Das SilhouetteMatch-Modul verarbeitet intern die rektifizierten Bilder +des + +Kamera + +-Moduls ("rc_camera"). Es sollte deshalb auf eine passende +Belichtungszeit geachtet werden, um optimale Ergebnisse zu erhalten. + +Für die Kalibrierung der Basisebene mit der Stereo-Methode, für die +Load Carrier Erkennung, für die automatische Objektebenenerkennung und +für die Kollisionsprüfung mit der Punktwolke wird das Disparitätsbild +des + +Stereo-Matching + +-Moduls ("rc_stereomatching") verarbeitet. + +Für das Erkennen von Objekten mit einer kalibrierten Basisebene, ohne +Load Carrier und ohne Kollisionsprüfung mit der Punktwolke sollte das +Stereo-Matching-Modul nicht parallel zum SilhouetteMatch-Modul +ausgeführt werden, da die Laufzeit der Objekterkennung sonst negativ +beeinflusst wird. + +Für beste Ergebnisse wird empfohlen, + +Glättung + + für + +Stereo-Matching + + zu aktivieren. + +IOControl und Projektor-Kontrolle + +Wenn der + +rc_visard NG + + in Verbindung mit einem externen Musterprojektor und dem Modul + +IOControl und Projektor-Kontrolle + + ("rc_iocontrol") betrieben wird, sollte der Projektor für die +stereobasierte Kalibrierung der Basisebene, für die automatische +Objektebenenerkennung und für die Kollisionsprüfung mit der Punktwolke +benutzt werden. + +Das projizierte Muster darf während der Objektdetektion nicht im +linken oder rechten Kamerabild sichtbar sein, da es den +Detektionsvorgang behindert. Daher wird empfohlen, den Projektor an +GPIO Out 1 anzuschließen und den Aufnahmemodus des Stereokamera-Moduls +auf "SingleFrameOut1" zu setzen (siehe + +Stereomatching-Parameter + +), damit bei jedem Aufnahme-Trigger ein Bild mit und ohne +Projektormuster aufgenommen wird. + +Alternativ kann der verwendete digitale Ausgang in den Betriebsmodus +"ExposureAlternateActive" geschaltet werden (siehe + +Beschreibung der Laufzeitparameter + +). + +In beiden Fällen sollte die Belichtungszeitregelung ("exp_auto_mode") +auf "AdaptiveOut1" gesetzt werden, um die Belichtung beider Bilder zu +optimieren (siehe + +Stereokamera-Parameter + +). + +Hand-Auge-Kalibrierung + +Wenn die Kamera zu einem Roboter kalibriert ist, kann das +SilhouetteMatch-Modul die Ergebnisposen automatisch im +Roboterkoordinatensystem liefern. Für die + +Services + + des SilhouetteMatch-Moduls kann das Referenzkoordinatensystem aller +Posen über das Argument "pose_frame" angegeben werden. + +Es kann zwischen den folgenden zwei Werten für "pose_frame" gewählt +werden: + +Kamera-Koordinatensystem (camera): Alle Posen und Ebenenparameter +werden im Kamera-Koordinatensystem angegeben. + +Benutzerdefiniertes externes Koordinatensystem (external): Alle Posen +und Ebenenparameter sind im sogenannten externen Koordinatensystem +angegeben, welches vom Nutzer während der Hand-Auge-Kalibrierung +gewählt wurde. In diesem Fall bezieht das SilhouetteMatch-Modul alle +notwendigen Informationen über die Kameramontage und die kalibrierte +Hand-Auge-Transformation automatisch vom internen Modul Hand-Auge- +Kalibrierung\:(Abschnitt \ref{handeye_calibration:sect-handeye- +calibration}). Für den Fall einer robotergeführten Kamera ist vom +Nutzer zusätzlich die jeweils aktuelle Roboterpose robot_pose +anzugeben. + +Zulässige Werte zur Angabe des Referenzkoordinatensystems sind +"camera" und "external". Andere Werte werden als ungültig +zurückgewiesen. + +Bemerkung: Wurde keine Hand-Auge-Kalibrierung durchgeführt, muss als + Referenzkoordinatensystem "pose_frame" immer "camera" angegeben + werden. + +Bemerkung: Wird die Hand-Auge-Kalibrierung nach einer Kalibrierung + der Basisebene verändert, wird die Kalibrierung der Basisebene als + ungültig markiert und muss erneuert werden. + +Für den Fall einer robotergeführten Kamera ist es abhängig von +"pose_frame", der bevorzugten TCP-Orientierung und der Sortierrichtung +nötig, zusätzlich die aktuelle Roboterpose ("robot_pose") zur +Verfügung zu stellen: + +Wenn external als pose_frame ausgewählt ist, ist die Angabe der +Roboterpose obligatorisch. + +Wenn die bevorzugte TCP-Orientierung in external definiert ist, ist +die Angabe der Roboterpose obligatorisch. + +Wenn die Sortierrichtung in external definiert ist, ist die Angabe der +Roboterpose obligatorisch. + +In allen anderen Fällen ist die Angabe der Roboterpose optional. + +Wenn die aktuelle Roboterpose während der Kalibrierung der Basisebene +angegeben wird, wird sie persistent auf dem + +rc_visard NG + + gespeichert. Falls für die Services "get_base_plane_calibration" oder +"detect_objects" die dann aktuelle Roboterpose ebenfalls angegeben +wird, wird die Basisebene automatisch zu der neuen Roboterpose +transformiert. Das erlaubt dem Benutzer, die Roboterpose (und damit +die Pose der Kamera) zwischen Kalibrierung der Basisebene und +Objekterkennung zu verändern. + +Bemerkung: Eine Objekterkennung kann nur durchgeführt werden, wenn + die Verkippung der Basisebene zur Sichtachse der Kamera ein 10-Grad- + Limit nicht übersteigt. + +LoadCarrier + +Das SilhouetteMatch Modul nutzt die Funktionalität zur Load Carrier +Erkennung aus dem + +LoadCarrier + + Modul ("rc_load_carrier") mit den Laufzeitparametern, die für dieses +Modul festgelegt wurden. Wenn sich jedoch mehrere Load Carrier in der +Szene befinden, die zu der angegebenen Load Carrier ID passen, wird +nur einer davon zurückgeliefert. In diesem Fall sollte eine Region of +Interest gesetzt werden, um sicherzustellen, dass immer derselbe Load +Carrier für das SilhouetteMatch Modul verwendet wird. + +CollisionCheck + +Die Kollisionsprüfung kann für die Greifpunktberechnung des +SilhouetteMatch-Moduls aktiviert werden, indem das +"collision_detection" Argument an den "detect_object" Service +übergeben wird. Es enthält die ID des benutzten Greifers und optional +einen Greif-Offset. Der Greifer muss im GripperDB Modul definiert +werden (siehe + +Erstellen eines Greifers + +) und Details über die Kollisionsprüfung werden in + +Integrierte Kollisionsprüfung in anderen Modulen + + gegeben. Zusätzlich wird auf Kollisionen zwischen dem Greifer und der +kalibrierten Basisebene geprüft, wenn der Laufzeitparameter +"check_collisions_with_base_plane" auf true gesetzt ist. Wenn das +ausgewählte Template ein Kollisionsmodell enthält und der +Laufzeitparameter "check_collisions_with_matches" true ist, wird +außerdem auch auf Kollisionen zwischen dem Greifer und den anderen +detektierten Objekten (nicht begrenzt auf die Anzahl +"max_number_of_detected_objects") geprüft, wobei das Objekt, auf dem +sich der jeweilige Greifpunkt befindet, von der Prüfung ausgenommen +ist. + +Wenn der Laufzeitparameter "check_collisions_with_point_cloud" auf +true gesetzt ist, werden auch Kollisionen zwischen dem Greifer und +einer wasserdichten Version der Punktwolke geprüft. Wenn diese +Funktionalität in Kombination mit Sauggreifern genutzt wird, muss +sichergestellt werden, dass sich der TCP außerhalb der +Greifergeometrie befindet, oder dass die Greifpunkte oberhalb der +Objektoberfläche definiert sind. Andernfalls wird für jeden Greifpunkt +eine Kollision zwischen Greifer und Punktwolke erkannt. + +Wenn die Kollisionsprüfung aktiviert ist, werden nur kollisionsfreie +Greifpunkte zurückgeliefert. Jedoch werden in der Ergebnis- +Visualisierung oben auf der + +SilhouetteMatch + +-Seite der Web GUI kollidierende Greifpunkte als rote Punkte +dargestellt. Die Objekte, die bei der Kollisionsprüfung betrachtet +werden, werden auch mit roten Kanten visualisiert. + +Die Laufzeitparameter des CollisionCheck-Moduls beeinflussen die +Kollisionserkennung wie in + +CollisionCheck-Parameter + + beschrieben. + +Parameter + +Das SilhouetteMatch-Modul wird in der REST-API als +"rc_silhouettematch" bezeichnet und in der + +Web GUI + + unter Module ‣ SilhouetteMatch dargestellt. Der Benutzer kann die +Parameter entweder dort oder über die + +REST-API-Schnittstelle + + ändern. + +Übersicht über die Parameter + +Dieses Softwaremodul bietet folgende Laufzeitparameter: + +Laufzeitparameter des rc_silhouettematch-Moduls Name Typ +Min. Max. Default Beschreibung check_collisions_with_-base_plane +bool false true true Gibt an, ob Kollisionen zwischen Greifer und +der Basisebene geprüft werden check_collisions_with_matches bool +false true true Gibt an, ob Kollisionen zwischen Greifer und +anderen Matches geprüft werden check_collisions_with_-point_cloud +bool false true false Gibt an, ob Kollisionen zwischen Greifer und +der Punktwolke geprüft werden edge_sensitivity float64 0.1 1.0 +0.7 Empfindlichkeit der Kantenerkennung match_max_distance float64 +0.1 10.0 3.0 Der maximale tolerierte Abstand zwischen dem Template +und den detektierten Kanten im Bild in Pixeln match_percentile +float64 0.7 1.0 0.8 Der Anteil der Template-Pixel, die innerhalb +der maximalen Matchingdistanz liegen müssen, um ein Objekt erfolgreich +zu detektieren max_number_of_detected_objects int32 1 20 10 +Maximale Anzahl der zu detektierenden Objekte +only_highest_priority_grasps bool false true false Falls +aktiviert werden nur Greifpunkte der höchsten Priorität zurückgegeben. +point_cloud_enhancement string - - Off Art der Verbesserung der +Punktwolke mit der Basisebene: [Off, ReplaceBright] quality string +- - High Quality: [Low, Medium, High] + +Beschreibung der Laufzeitparameter + +Die Laufzeitparameter werden zeilenweise auf der SilhouetteMatch-Seite +in der Web GUI dargestellt. Im folgenden wird der Name des Parameters +in der Web GUI in Klammern hinter dem eigentlichen Parameternamen +angegeben. Die Parameter sind in derselben Reihenfolge wie in der Web +GUI aufgelistet: + +max_number_of_detected_objects (Maximale Objektanzahl) + + Dieser Parameter gibt an, wie viele Objekte maximal in der Szene + erkannt werden sollen. Falls mehr als die angegebene Zahl an + Objekten gefunden wurden, werden nur die am besten zur gewählten + Sortierstrategie passenden Ergebnisse zurückgeliefert. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?max_number_of_detected_objects= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?max_number_of_detected_objects= + +quality (Qualität) + + Die Objekterkennung kann auf Bildern mit unterschiedlicher + Auflösung durchgeführt werden: "High" ( + + Hoch + + , volle Auflösung), "Medium" ( + + Mittel + + , halbe Auflösung) oder "Low" ( + + Niedrig + + , Viertel-Auflösung). Je niedriger die Auflösung ist, desto + niedriger ist die Berechnungszeit der Objekterkennung, aber + desto weniger Objektdetails sind erkennbar. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?quality= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?quality= + +match_max_distance (Maximale Matchingdistanz) + + Dieser Parameter gibt den maximal tolerierten Abstand zwischen + dem Template und den detektierten Kanten im Bild in Pixeln an. + Falls das Objekt durch das Template nicht exakt genug + beschrieben wird, wird es möglicherweise nicht erkannt, wenn + dieser Wert zu klein ist. Höhere Werte können jedoch im Fall von + komplexen Szenen und bei ähnlichen Objekten zu Fehldetektionen + führen, und auch die Berechnungszeit erhöhen. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?match_max_distance= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?match_max_distance= + +match_percentile (Matching Perzentil) + + Dieser Parameter kontrolliert, wie strikt der Detektionsprozess + sein soll. Das Matching Perzentil gibt den Anteil der Template- + Pixel an, die innerhalb der maximalen Matchingdistanz liegen + müssen, um ein Objekt erfolgreich zu detektieren. Je höher der + Wert, desto exakter muss ein Match sein, um als gültig angesehen + zu werden. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?match_percentile= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?match_percentile= + +edge_sensitivity (Kantenempfindlichkeit) + + Der Parameter beeinflusst, wie viele Kanten im linken und + rechten Kamerabild gefunden werden. Umso größer dieser Parameter + gewählt wird, umso mehr Kanten werden für die Erkennung benutzt. + Eine große Anzahl von Kanten im Bild kann die Erkennung + verlangsamen. Es muss sichergestellt werden, dass die Kanten der + zu erkennenden Objekte sowohl im linken als auch im rechten + Kamerabild detektiert werden. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?edge_sensitivity= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?edge_sensitivity= + +only_highest_priority_grasps (Nur Greifpunkte höchster Priorität) + + Wenn dieser Parameter auf *true* gesetzt ist, werden ausschließlich + Greifpunkte der höchsten Priorität zurückgegeben. Sofern die + Kollisionsprüfung aktiviert ist, werden ausschließlich + kollisionsfreie Greifpunkt der höchstmöglichen Priorität + zurückgegeben. Dadurch kann Rechenzeit gespart und die Anzahl der + applikationsseitig zu verarbeitenden Greifpunkte reduziert werden. + + Ohne Kollisionsprüfung werden nur Greifpunkt der höchsten Priorität + zurückgegeben. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?only_highest_priority_grasps= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?only_highest_priority_grasps= + +check_collisions_with_base_plane (Kollisionsprüfung mit Basisebene) + + Wenn dieser Parameter auf true gesetzt ist und die + Kollisionsprüfung durch Übergabe eines Greifers an den + "detect_object" Service aktiviert ist, werden alle Greifpunkte + auf Kollisionen zwischen dem Greifer und der kalibrierten + Basisebene geprüft. Nur Greifpunkte, bei denen der Greifer nicht + in Kollision mit der Basisebene wäre, werden zurückgeliefert. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?check_collisions_with_base_plane= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?check_collisions_with_base_plane= + +check_collisions_with_matches (Kollisionsprüfung mit Matches) + + Wenn dieser Parameter auf true gesetzt ist und die + Kollisionsprüfung durch Übergabe eines Greifers an den + "detect_object" Service aktiviert ist, werden alle Greifpunkte + auf Kollisionen zwischen dem Greifer und den anderen + detektierten Objekten (nicht begrenzt auf die Anzahl + "max_number_of_detected_objects") geprüft. Nur Greifpunkte, bei + denen der Greifer nicht in Kollision mit anderen detektierten + Objekten wäre, werden zurückgeliefert. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?check_collisions_with_matches= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?check_collisions_with_matches= + +check_collisions_with_point_cloud (Kollisionsprüfung mit Punktwolke) + + Wenn dieser Parameter auf true gesetzt ist und die + Kollisionsprüfung durch Übergabe eines Greifers an den + "detect_object" Service aktiviert ist, werden alle Greifpunkte + auf Kollisionen zwischen dem Greifer und einer wasserdichten + Version der Punktwolke geprüft. Nur Greifpunkte, bei denen der + Greifer nicht in Kollision mit dieser Punktwolke wäre, werden + zurückgeliefert. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?check_collisions_with_point_cloud= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?check_collisions_with_point_cloud= + +point_cloud_enhancement (Verbesserung mit Basisebene) + + Dieser Parameter wird nur beachtet, wenn + "check_collisions_with_point_cloud" auf true gesetzt ist und die + Detektion ohne Objektebenenerkennung ("object_plane_detection" + ist false) ausgelöst wurde. Standardmäßig ist + "point_cloud_enhancement" auf "Off" ( + + Aus + + ) gesetzt. Wenn "point_cloud_enhancement" auf "ReplaceBright" ( + + Helle Bildpunkte ersetzen + + ) gesetzt wird, wird die kalibrierte Basisebene verwendet, um + die Punktwolke für die Kollisionsprüfung zu verbessern. Dazu + werden Punkte, die zu hellen Pixeln im Bild oder in der + gewählten 2D Region of Interest gehören, auf den Tiefenwert der + kalibrierten Basisebene gesetzt. Dieser Parameter sollte genutzt + werden, wenn dunkle Objekten auf texturlosem, hellem Untergrund + liegen, z.B. auf einem Lichttisch. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?point_cloud_enhancement= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?point_cloud_enhancement= + +Statuswerte + +Dieses Modul meldet folgende Statuswerte. + +Statuswerte des rc_silhouettematch-Moduls Name Beschreibung +data_acquisition_time Zeit in Sekunden, für die beim letzten Aufruf +auf Bilddaten gewartet werden musste last_timestamp_processed +Zeitstempel des letzten verarbeiteten Bilddatensatzes +load_carrier_detection_time Berechnungszeit für die letzte Load +Carrier Detektion in Sekunden ``processing_time` Berechnungszeit für +die letzte Detektion (einschließlich Load Carrier Detektion) in +Sekunden + +Services + +Die angebotenen Services des "rc_silhouettematch"-Moduls können +mithilfe der + +REST-API-Schnittstelle + + oder der + +rc_visard NG + + +Web GUI + + ausprobiert und getestet werden. + +Das SilhouetteMatch-Modul bietet folgende Services. + +detect_object + + führt eine Objekterkennung durch, wie in + + Objekterkennung + + beschrieben. Der Service gibt die Posen aller gefundenen + Objektinstanzen zurück. + + Details + + Das Zeitverhalten dieses Services garantiert, dass nur Bilddaten + zur Erkennung benutzt werden, welche nach dem Anfragezeitpunkt + generiert wurden. + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/detect_object + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/detect_object + + Request + + Obligatorische Serviceargumente: + + "object_id" in "object_to_detect": ID des Templates, welches + erkannt werden soll. + + "pose_frame": siehe + + Hand-Auge-Kalibrierung + + . + + Potentiell obligatorische Serviceargumente: + + "robot_pose": siehe + + Hand-Auge-Kalibrierung + + . + + Optionale Serviceargumente: + + "object_plane_detection": false wenn Objekte auf einer + kalibrierten Basisebene liegen, true wenn die Objekte planare + Oberflächen haben und die Basisebene unbekannt ist oder die + Objekte auf mehreren verschiedenen Ebenen liegen, z.B. auf + Stapeln. + + "offset": Versatz in Metern, um welche die Basisebene in + Richtung der Kamera verschoben werden soll. + + "load_carrier_id": ID des Load Carriers, welcher die zu + erkennenden Objekte enthält. + + "collision_detection": siehe + + Integrierte Kollisionsprüfung in anderen Modulen + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "collision_detection": { + "gripper_id": "string", + "pre_grasp_offset": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "load_carrier_id": "string", + "object_plane_detection": "bool", + "object_to_detect": { + "object_id": "string", + "region_of_interest_2d_id": "string" + }, + "offset": "float64", + "pose_frame": "string", + "robot_pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + } + } + } + + Response + + Die maximale Anzahl der zurückgegebenen Instanzen kann über den + "max_number_of_detected_objects"-Parameter kontrolliert werden. + + "object_id": ID des erkannten Templates. + + "instances": Liste der erkannten Objektinstanzen, sortiert gemäß + der gewählten Sortierstrategie. + + "grasps": Liste von Greifpunkten auf den erkannten Objekten. Die + Greifpunkte sind gemäß der gewählten Sortierstrategie sortiert. Die + "instance_uuid" gibt eine Referenz auf das detektierte Objekt in + "instances" an, zu dem dieser Greifpunkt gehört. Die Liste der + Greifpunkte wird auf die 100 besten Greifpunkte gekürzt, falls mehr + erreichbare Greifpunkte gefunden werden. Jeder Greifpunkt enthält + ein Flag "collision_checked" und das Feld "gripper_id" (siehe + + Integrierte Kollisionsprüfung in anderen Modulen + + ). + + "load_carriers": Liste der erkannten Load Carrier (Behälter). + + "timestamp": Zeitstempel des Bildes, das für die Erkennung benutzt + wurde. + + "return_code": enthält mögliche Warnungen oder Fehlercodes und + Nachrichten. + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "detect_object", + "response": { + "grasps": [ + { + "collision_checked": "bool", + "gripper_id": "string", + "id": "string", + "instance_uuid": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "priority": "int8", + "timestamp": { + "nsec": "int32", + "sec": "int32" + }, + "uuid": "string" + } + ], + "instances": [ + { + "grasp_uuids": [ + "string" + ], + "id": "string", + "object_id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "timestamp": { + "nsec": "int32", + "sec": "int32" + }, + "uuid": "string" + } + ], + "load_carriers": [ + { + "height_open_side": "float64", + "id": "string", + "inner_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "outer_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "overfilled": "bool", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "rim_ledge": { + "x": "float64", + "y": "float64" + }, + "rim_step_height": "float64", + "rim_thickness": { + "x": "float64", + "y": "float64" + }, + "type": "string" + } + ], + "object_id": "string", + "return_code": { + "message": "string", + "value": "int16" + }, + "timestamp": { + "nsec": "int32", + "sec": "int32" + } + } + } + +calibrate_base_plane + + führt die Kalibrierung der Basisebene durch, wie in + + Kalibrierung der Basisebene + + beschrieben. + + Details + + Eine erfolgreiche Kalibrierung der Basisebene wird persistent auf + dem + + rc_visard NG + + gespeichert und vom Service zurückgegeben. Die Kalibrierung ist + dauerhaft -- auch über Firmware-Updates und -Wiederherstellungen + hinweg -- gespeichert. + + Das Zeitverhalten dieses Services garantiert, dass nur Bilddaten + zur Erkennung benutzt werden, welche nach dem Anfragezeitpunkt + generiert wurden. + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/calibrate_base_plane + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/calibrate_base_plane + + Request + + Obligatorische Serviceargumente: + + "plane_estimation_method": Methode der Kalibrierung der + Basisebene. Gültige Werte sind "STEREO", "APRILTAG", "MANUAL". + + "pose_frame": siehe + + Hand-Auge-Kalibrierung + + . + + Potentiell obligatorische Serviceargumente: + + "plane" wenn für "plane_estimation_method" "MANUAL" gewählt ist: + Die Ebene, welche als Basisebene gesetzt wird. + + "robot_pose": siehe + + Hand-Auge-Kalibrierung + + . + + "region_of_interest_2d_id": ID der Region of Interest für die + Kalibrierung der Basisebene. + + Optionale Serviceargumente: + + "offset": Versatz in Metern, um welchen die geschätzte Ebene in + Richtung der Kamera verschoben wird. + + "plane_preference" in "stereo": Ob die der Kamera am nächsten + ("CLOSEST") gelegene oder die am weitesten entfernte + ("FARTHEST") Ebene als Basisebene benutzt wird. Diese Option + kann nur gesetzt werden, falls "plane_estimation_method" auf + "STEREO" gesetzt ist. Valide Werte sind "CLOSEST" und + "FARTHEST". Falls der Wert nicht gesetzt ist, wird "FARTHEST" + verwendet. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "offset": "float64", + "plane": { + "distance": "float64", + "normal": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "plane_estimation_method": "string", + "pose_frame": "string", + "region_of_interest_2d_id": "string", + "robot_pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "stereo": { + "plane_preference": "string" + } + } + } + + Response + + "plane": kalibrierte Basisebene. + + "timestamp": Zeitstempel des Bildes, das für die Kalibrierung + benutzt wurde. + + "return_code": enthält mögliche Warnungen oder Fehlercodes und + Nachrichten. + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "calibrate_base_plane", + "response": { + "plane": { + "distance": "float64", + "normal": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "pose_frame": "string" + }, + "return_code": { + "message": "string", + "value": "int16" + }, + "timestamp": { + "nsec": "int32", + "sec": "int32" + } + } + } + +get_base_plane_calibration + + gibt die derzeitige Kalibrierung der Basisebene zurück. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/get_base_plane_calibration + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/get_base_plane_calibration + + Request + + Obligatorische Serviceargumente: + + "pose_frame": siehe + + Hand-Auge-Kalibrierung + + . + + Potentiell obligatorische Serviceargumente: + + "robot_pose": siehe + + Hand-Auge-Kalibrierung + + . + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "pose_frame": "string", + "robot_pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + } + } + } + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "get_base_plane_calibration", + "response": { + "plane": { + "distance": "float64", + "normal": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "pose_frame": "string" + }, + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +delete_base_plane_calibration + + löscht die derzeitige Kalibrierung der Basisebene. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/delete_base_plane_calibration + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/delete_base_plane_calibration + + Request + + Dieser Service hat keine Argumente. + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "delete_base_plane_calibration", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +set_preferred_orientation + + speichert die bevorzugte TCP-Orientierung zum Berechnen der + Erreichbarkeit der Greifpunkte, die zur Filterung und optional zur + Sortierung der vom "detect_object" Service zurückgelieferten + Greifpunkte verwendet wird (siehe + + Setzen der bevorzugten TCP-Orientierung + + ). + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/set_preferred_orientation + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/set_preferred_orientation + + Request + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "pose_frame": "string" + } + } + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "set_preferred_orientation", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +get_preferred_orientation + + gibt die bevorzugte TCP-Orientierung zurück, die für die Filterung + und optional zur Sortierung der vom "detect_object" Service + zurückgelieferten Greifpunkte verwendet wird (siehe + + Setzen der bevorzugten TCP-Orientierung + + ). + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/get_preferred_orientation + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/get_preferred_orientation + + Request + + Dieser Service hat keine Argumente. + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "get_preferred_orientation", + "response": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "pose_frame": "string", + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +set_sorting_strategies + + speichert die gewählte Strategie zur Sortierung der erkannten + Objekte und Greifpunkte, die vom "detect_object" Service + zurückgeliefert werden (siehe + + Objekterkennung + + ). + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/set_sorting_strategies + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/set_sorting_strategies + + Request + + Nur eine Sortierstrategie darf einen Gewichtswert "weight" größer + als 0 haben. Wenn alle Werte für "weight" auf 0 gesetzt sind, wird + die Standardsortierstrategie verwendet. + + Wenn der Wert "weight" für "direction" gesetzt ist, muss "vector" + den Richtungsvektor enthalten und "pose_frame" auf "camera" oder + "external" gesetzt sein. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "direction": { + "pose_frame": "string", + "vector": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "weight": "float64" + }, + "preferred_orientation": { + "weight": "float64" + } + } + } + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "set_sorting_strategies", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +get_sorting_strategies + + gibt die gewählte Sortierstrategie zurück, die zur Sortierung der + vom "detect_object" Service zurückgelieferten Objekte und + Greifpunkte verwendet wird (siehe + + Objekterkennung + + ). + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/get_sorting_strategies + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/get_sorting_strategies + + Request + + Dieser Service hat keine Argumente. + + Response + + Wenn alle Werte für "weight" 0 sind, wird die + Standardsortierstrategie verwendet. + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "get_sorting_strategies", + "response": { + "direction": { + "pose_frame": "string", + "vector": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "weight": "float64" + }, + "preferred_orientation": { + "weight": "float64" + }, + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +reset_defaults + + stellt die Werkseinstellungen der Parameter und die bevorzugte TCP- + Orientierung sowie die Sortierstrategie dieses Moduls wieder her + und wendet sie an („factory reset“). Dies betrifft nicht die + konfigurierten Templates und die Kalibrierung der Basisebene. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/reset_defaults + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/reset_defaults + + Request + + Dieser Service hat keine Argumente. + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "reset_defaults", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +set_region_of_interest_2d (veraltet) + + speichert eine 2D Region of Interest auf dem + + rc_visard NG + + . + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie + stattdessen + + set_region_of_interest_2d + + in "rc_roi_db". + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/set_region_of_interest_2d + +get_regions_of_interest_2d (veraltet) + + gibt die mit "region_of_interest_2d_ids" spezifizierten, + gespeicherten 2D Regions of Interest zurück. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie + stattdessen + + get_regions_of_interest_2d + + in "rc_roi_db". + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/get_regions_of_interest_2d + +delete_regions_of_interest_2d (veraltet) + + löscht die mit "region_of_interest_2d_ids" spezifizierten, + gespeicherten 2D Regions of Interest. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie + stattdessen + + delete_regions_of_interest_2d + + in "rc_roi_db". + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/delete_regions_of_interest_2d + +Interne Services + +Die folgenden Services für die Konfiguration von Greifpunkten können +sich in Zukunft ohne weitere Ankündigung ändern. Es wird empfohlen, +das Setzen, Abrufen und Löschen von Greifpunkten über die Web GUI +vorzunehmen. + +set_grasp + + speichert einen Greifpunkt für das angegebene Template auf dem + + rc_visard NG + + . Alle Greifpunkte sind dauerhaft gespeichert, auch über Firmware- + Updates und -Wiederherstellungen hinweg. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/set_grasp + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/set_grasp + + Request + + Die Definition des Typs "grasp" wird in + + Setzen von Greifpunkten + + beschrieben. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "grasp": { + "gripper_id": "string", + "id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "priority": "int8", + "replication": { + "max_x_deg": "float64", + "min_x_deg": "float64", + "origin": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "step_x_deg": "float64" + }, + "template_id": "string" + } + } + } + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "set_grasp", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +set_all_grasps + + Ersetzt die gesamte Liste von Greifpunkten auf dem + + rc_visard NG + + für das angegebene Template. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/set_all_grasps + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/set_all_grasps + + Request + + Die Definition des Typs "grasp" wird in + + Setzen von Greifpunkten + + beschrieben. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "grasps": [ + { + "gripper_id": "string", + "id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "priority": "int8", + "replication": { + "max_x_deg": "float64", + "min_x_deg": "float64", + "origin": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "step_x_deg": "float64" + }, + "template_id": "string" + } + ], + "template_id": "string" + } + } + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "set_all_grasps", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +get_grasps + + gibt alle definierten Greifpunkte mit den angegebenen IDs + ("grasp_ids") zurück, die zu den Templates mit den angegebenen + "template_ids" gehören. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/get_grasps + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/get_grasps + + Request + + Wenn keine "grasp_ids" angegeben werden, werden alle Greifpunkte zu + den angegebenen "template_ids" zurückgeliefert. Wenn keine + "template_ids" angegeben werden, werden alle Greifpunkte mit den + geforderten "grasp_ids" zurückgeliefert. Wenn gar keine IDs + angegeben werden, werden alle gespeicherten Greifpunkte + zurückgeliefert. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "grasp_ids": [ + "string" + ], + "template_ids": [ + "string" + ] + } + } + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "get_grasps", + "response": { + "grasps": [ + { + "gripper_id": "string", + "id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "priority": "int8", + "replication": { + "max_x_deg": "float64", + "min_x_deg": "float64", + "origin": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "step_x_deg": "float64" + }, + "template_id": "string" + } + ], + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +delete_grasps + + löscht alle Greifpunkte mit den angegebenen "grasp_ids", die zu den + Templates mit den angegebenen "template_ids" gehören. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/delete_grasps + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/delete_grasps + + Request + + Wenn keine "grasp_ids" angegeben werden, werden alle Greifpunkte + gelöscht, die zu den Templates mit den angegebenen "template_ids" + gehören. Die Liste "template_ids" darf nicht leer sein. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "grasp_ids": [ + "string" + ], + "template_ids": [ + "string" + ] + } + } + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "delete_grasps", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +get_symmetric_grasps + + gibt alle Greifpunkte zurück, die symmetrisch zum angegebenen + Greifpunkt sind. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/get_symmetric_grasps + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/get_symmetric_grasps + + Request + + Die Definition des Typs "grasp" wird in + + Setzen von Greifpunkten + + beschrieben. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "grasp": { + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "replication": { + "max_x_deg": "float64", + "min_x_deg": "float64", + "origin": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "step_x_deg": "float64" + }, + "template_id": "string" + } + } + } + + Response + + Der erste Greifpunkt in der Rückgabeliste ist derselbe, der dem + Service übergeben wurde. Wenn das Template keine exakte Symmetrie + hat, wird nur der übergebene Greifpunkt zurückgeliefert. Wenn das + Template eine kontinuierliche Symmetrie hat (z.B. ein zylindrisches + Objekt), werden nur 12 gleichverteilte Greifpunkte zurückgeliefert. + + Die Definition des Typs "grasp" wird in + + Setzen von Greifpunkten + + beschrieben. + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "get_symmetric_grasps", + "response": { + "grasps": [ + { + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "replication": { + "max_x_deg": "float64", + "min_x_deg": "float64", + "origin": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "step_x_deg": "float64" + }, + "template_id": "string" + } + ], + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +Rückgabecodes + +Zusätzlich zur eigentlichen Serviceantwort gibt jeder Service einen +sogenannten "return_code" bestehend aus einem Integer-Wert und einer +optionalen Textnachricht zurück. Erfolgreiche Service-Anfragen werden +mit einem Wert von "0" quittiert. Positive Werte bedeuten, dass die +Service-Anfrage zwar erfolgreich bearbeitet wurde, aber zusätzliche +Informationen zur Verfügung stehen. Negative Werte bedeuten, dass +Fehler aufgetreten sind. + +Rückgabecodes und Warnungen der Services des SilhouetteMatch-Moduls +Code Beschreibung 0 Erfolgreich -1 Ungültige(s) Argument(e) -3 +Ein interner Timeout ist aufgetreten, beispielsweise während der +Objekterkennung. -4 Die maximal erlaubte Zeitspanne für die interne +Akquise der Bilddaten wurde überschritten. -7 Daten konnten nicht in +den persistenten Speicher geschrieben oder vom persistenten Speicher +gelesen werden. -8 Das Modul befindet sich in einem Zustand, in +welchem dieser Service nicht aufgerufen werden kann. Beispielsweise +kann detect_object nicht aufgerufen werden, solange keine Kalibrierung +der Basisebene durchgeführt wurde. -10 Das neue Element konnte nicht +hinzugefügt werden, da die maximal speicherbare Anzahl an ROIs oder +Templates überschritten wurde. -100 Ein interner Fehler ist +aufgetreten. -101 Die Erkennung der Basisebene schlug fehl. -102 +Die Hand-Auge-Kalibrierung hat sich seit der letzten Kalibrierung der +Basisebene verändert. -104 Die Verkippung zwischen der Basisebene +und der Sichtachse der Kamera überschreitet das 10-Grad-Limit. 10 +Die maximale Anzahl an ROIs oder Templates wurde erreicht. 11 Ein +bestehendes Element wurde überschrieben. 100 Die angefragten Load +Carrier wurden in der Szene nicht gefunden. 101 Keiner der +Greifpunkte ist erreichbar. 102 Der detektierte Load Carrier ist +leer. 103 Alle berechneten Greifpunkte sind in Kollision. 107 Die +Basisebene wurde nicht zur aktuellen Kamerapose transformiert, z.B. +weil keine Roboterpose während der Kalibrierung der Basisebene +angegeben wurde. 108 Das Template ist überholt. 109 Die Ebene für +die Objekterkennung passt nicht zum Load Carrier, z.B. liegen die +Objekte unterhalb des Load Carrier Bodens. 111 Die Pose des +Detektionsergebnisses konnte nicht mit der Punktwolke verfeinert +werden, da die Außenkontur des Templates nicht geschlossen ist. 151 +Das Objekt-Template hat eine kontinuierliche Symmetrie. 999 +Zusätzliche Hinweise für die Anwendungsentwicklung + +Template API + +Für den Upload, Download, das Auflisten und Löschen von Templates +werden spezielle REST-API-Endpunkte zur Verfügung gestellt. Templates +können auch über die Web GUI hoch- und runtergeladen werden. Die +Templates beinhalten die Greifpunkte, falls Greifpunkte konfiguriert +wurden. Bis zu 50 Templates können gleichzeitig auf dem + +rc_visard NG + + gespeichert werden. + +GET /templates/rc_silhouettematch + + listet alle rc_silhouettematch-Templates auf. + + Musteranfrage + + GET /api/v2/templates/rc_silhouettematch HTTP/1.1 + + Musterantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + [ + { + "id": "string" + } + ] + + Antwort-Header: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabewert: Array der + Templates) + + 404 Not Found -- Modul nicht gefunden + + Referenzierte Datenmodelle: + Template\:(Abschnitt \ref{rest_api_datamodel:sect-rest- + datamodel-template}) + +GET /templates/rc_silhouettematch/{id} + + ruft ein rc_silhouettematch-Template ab. Falls der angefragte + Content-Typ application/octet-stream ist, wird das Template als + Datei zurückgegeben. + + Musteranfrage + + GET /api/v2/templates/rc_silhouettematch/ HTTP/1.1 + + Musterantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "id": "string" + } + + Parameter: + id (string) -- ID des Templates (obligatorisch) + + Antwort-Header: + Content-Type -- application/json application/ubjson application + /octet-stream + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabewert: Template) + + 404 Not Found -- Modul oder Template wurden nicht gefunden. + + Referenzierte Datenmodelle: + Template\:(Abschnitt \ref{rest_api_datamodel:sect-rest- + datamodel-template}) + +PUT /templates/rc_silhouettematch/{id} + + erstellt oder aktualisiert ein rc_silhouettematch-Template. + + Musteranfrage + + PUT /api/v2/templates/rc_silhouettematch/ HTTP/1.1 + Accept: multipart/form-data application/json + + Musterantwort + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "id": "string" + } + + Parameter: + id (string) -- ID des Templates (obligatorisch) + + Formularparameter: + file -- Template-Datei oder DXF-Datei (obligatorisch) + + object_height -- Objekthöhe in Metern, benötigt bei DXF-Upload + (optional) + + units -- Einheit für DXF Datei falls nicht in Datei enthalten + (mögliche Werte: mm, cm, m, in, ft) (optional) + + Anfrage-Header: + Accept -- multipart/form-data application/json + + Antwort-Header: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung (Rückgabewert: Template) + + 400 Bad Request -- Template ist ungültig oder die maximale Zahl + an Templates wurde erreicht. + + 403 Forbidden -- Verboten, z.B. weil keine gültige Lizenz für + das SilhouetteMatch-Modul vorliegt. + + 404 Not Found -- Modul oder Template wurden nicht gefunden. + + 413 Request Entity Too Large -- Template ist zu groß. + + Referenzierte Datenmodelle: + Template\:(Abschnitt \ref{rest_api_datamodel:sect-rest- + datamodel-template}) + +DELETE /templates/rc_silhouettematch/{id} + + entfernt ein rc_silhouettematch-Template. + + Musteranfrage + + DELETE /api/v2/templates/rc_silhouettematch/ HTTP/1.1 + Accept: application/json application/ubjson + + Parameter: + id (string) -- ID des Templates (obligatorisch) + + Anfrage-Header: + Accept -- application/json application/ubjson + + Antwort-Header: + Content-Type -- application/json application/ubjson + + Statuscodes: + 200 OK -- Erfolgreiche Verarbeitung + + 403 Forbidden -- Verboten, z.B. weil keine gültige Lizenz für + das SilhouetteMatch-Modul vorliegt. + + 404 Not Found -- Modul oder Template wurden nicht gefunden. diff --git a/v24.04/de/_sources/standards.rst.txt b/v24.04/de/_sources/standards.rst.txt new file mode 100644 index 0000000..7245786 --- /dev/null +++ b/v24.04/de/_sources/standards.rst.txt @@ -0,0 +1,30 @@ +Schnittstellen, Zulassungen und Normen + +Schnittstellen + +Der + +rc_visard NG + + unterstützt folgende Standardinterfaces: + +genicamlogo + +Der generische Schnittstellenstandard für Kameras ist die Grundlage +für die Plug-&-Play-Handhabung von Kameras und Geräten. + +gigelogo + +GigE Vision® ist ein Interfacestandard für die Übermittlung von +Hochgeschwindigkeitsvideo- und zugehörigen Steuerdaten über Ethernet- +Netzwerke. + +Zulassungen + + Der + + rc_visard NG + + hat folgende Zulassungen erhalten: + + EG-Konformitätserklärung diff --git a/v24.04/de/_sources/stereo_camera.rst.txt b/v24.04/de/_sources/stereo_camera.rst.txt new file mode 100644 index 0000000..82e63d3 --- /dev/null +++ b/v24.04/de/_sources/stereo_camera.rst.txt @@ -0,0 +1,660 @@ +Kamera + +Das Kameramodul ist ein Basismodul welches auf jedem + +rc_visard NG + + verfügbar ist. Es ist für die Bildakquise und die Rektifizierung der +Bilder verantwortlich. Das Modul bietet diverse Parameter um z.B. die +Belichtungszeit oder die Bildwiederholrate zu verändern. + +Rektifizierung + +Um die Bildverarbeitung zu vereinfachen rektifiziert das Modul alle +Kamerabilder basierend auf der Kamerakalibrierung. Dies bedeutet, dass +die Verzeichnung entfernt und der Bildhauptpunkt genau in die Mitte +des Bildes gelegt wird. + +Eine rektifizierte Kamera kann mit der Brennweite als einzigen +Modellparameter beschrieben werden. Der + +rc_visard NG + + stellt über seine verschiedenen Schnittstellen einen +Brennweitenfaktor bereit. Er bezieht sich auf die Bildbreite, um +verschiedene Bildauflösungen zu unterstützen. Die Brennweite f in +Pixeln lässt sich leicht bestimmen, indem der Brennweitenfaktor mit +der Bildbreite (in Pixeln) multipliziert wird. + +Im Fall einer Stereokamera richtet die Rektifizierung die Bilder so +aus, dass Objektpunkte in beiden Bildern immer in die gleiche +Bildzeile projiziert werden. Die optischen Achsen der Kameras werden +dadurch exakt parallel ausgerichtet. + +Anzeigen und Herunterladen von Bildern + +Der + +rc_visard NG + + bietet über die GenICam-Schnittstelle zeitgestempelte rektifizierte +Kamerabilder (siehe + +Verfügbare Bild-Streams + +). Live-Streams in geringerer Qualität werden in der + +Web GUI + + bereitgestellt. + +Die Web GUI bietet weiterhin die Möglichkeit, einen Schnappschuss der +aktuellen Szene als .tar.gz-Datei zu speichern, wie in + +Herunterladen von Kamerabildern + + beschrieben wird. + +Parameter + +Das Kamera-Modul wird als "rc_camera" bezeichnet und in der + +Web GUI + + auf der Seite + +Kamera + + dargestellt. Der Benutzer kann die Kamera-Parameter entweder dort +oder direkt über die REST-API ( + +REST-API-Schnittstelle + +) oder GigE Vision ( + +GigE Vision 2.0/GenICam-Schnittstelle + +) ändern. + +Bemerkung: Wird der + + rc_visard NG + + über GigE Vision genutzt, können die Kamera-Parameter nicht über + die Web GUI oder REST-API geändert werden. + +Übersicht über die Parameter + +Dieses Softwaremodul bietet folgende Laufzeitparameter: + +Laufzeitparameter des rc_camera-Moduls Name Typ Min. +Max. Default Beschreibung acquisition_mode string - - +Continuous Aufnahmemodus: [Continuous, Trigger] exp_auto bool +false true true Umschalten zwischen automatischer und manueller +Belichtung (veraltet, nutzen Sie stattdessen exp_control) +exp_auto_average_max float64 0.0 1.0 0.75 Maximaler +Belichtungsmittelwert im Auto Belichtungs Modus exp_auto_average_min +float64 0.0 1.0 0.25 Maximaler Belichtungsmittelwert im Auto +Belichtungs Modus exp_auto_mode string - - Normal Modus für +automatische Belichtung: [Normal, Out1High, AdaptiveOut1] exp_control +string - - Auto Art der Belichtungsregelung: [Manual, Auto, HDR] +exp_height int32 0 1079 0 Höhe der Region für automatische +Belichtung, 0 für das ganze Bild exp_max float64 1e-06 0.023449 +0.018 Maximale Belichtungszeit in Sekunden im Auto Belichtungs Modus +exp_offset_x int32 0 1439 0 Erste Spalte der Region für +automatische Belichtung exp_offset_y int32 0 1079 0 Erste Zeile +der Region für automatische Belichtung exp_value float64 1e-06 +0.023449 0.005 Maximale Belichtungszeit in Sekunden im Auto +Belichtungs Modus exp_width int32 0 1439 0 Breite der Region für +automatische Belichtung, 0 für das ganze Bild fps float64 1.0 25.0 +25.0 Bildwiederholrate in Hertz gain_value float64 0.0 48.0 0.0 +Verstärkung in Dezibel, wenn nicht im Auto Belichtungs Modus gamma +float64 0.1 10.0 0.7 Gammafaktor trigger_activation string - - +RisingEdge Triggeraktivierung: [RisingEdge, FallingEdge, AnyEdge] +trigger_source string - - Software Triggerquelle: [Software, In1, +In2] wb_auto bool false true true Ein- und Ausschalten des +manuellen Weißabgleichs (nur für Farbkameras) wb_ratio_blue float64 +1.0 1.0 1.0 Blau-zu-Grün-Verhältnis, falls wb_auto auf false +gesetzt ist (nur für Farbkameras) wb_ratio_red float64 1.0 1.0 +1.0 Rot-zu-Grün-Verhältnis, falls wb_auto auf false gesetzt ist (nur +für Farbkameras) + +Beschreibung der Laufzeitparameter + + +acquisition_mode (Aufnahmemodus) + + Dieser Wert bestimmt den Aufnahmemodus der Kamera. Im Modus + + Kontinuierlich + + ("Continuous") nimmt die Kamera Bilder mit der in "fps" + angegebenen Bildwiederholrate auf. Im Modus + + Trigger + + ("Trigger") werden nur Bilder aufgenommen, wenn die Kamera ein + Triggersignal empfängt. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?acquisition_mode= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_camera/parameters?acquisition_mode= + +trigger_source (Triggerquelle) + + Dieser Wert wird nur verwendet, wenn der Aufnahmemodus auf + "Trigger" gesetzt ist und bestimmt die Triggerquelle. Im + "Software"-Modus kann ein Trigger über den + "rc_camera/acquisition_trigger" Service gesendet werden. Wenn der + Aufnahmemodus "acquisition_mode" für die Tiefenbilder auf + "SingleFrame" oder "SingleFrameOut1" gesetzt ist (siehe + + Parameter + + ), wird der Kamera-Softwaretrigger automatisch bei jeder + Tiefenbildaufnahme gesendet. Die Modi "In1" und "In2" sind + Hardwaretriggermodi. Ein Bild wird aufgenommen, sobald ein Signal + auf dem jeweiligen Eingang empfangen wird. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?trigger_source= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_camera/parameters?trigger_source= + +trigger_activation (Triggeraktivierung) + + Dieser Wert wird nur verwendet, wenn der Aufnahmemodus auf + "Trigger" gesetzt ist und die Triggerquelle auf "In1" oder "In2" + steht. Er bestimmt die Signalflanke, die genutzt werden soll, um + eine Bildaufnahme auszulösen. Mögliche Werte sind "RisingEdge" + (steigende Flanke), "FallingEdge" (fallende Flanke) oder "AnyEdge" + (steigende und fallende Flanke). + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?trigger_activation= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_camera/parameters?trigger_activation= + +fps (Bildwiederholrate) + + Dieser Wert bezeichnet die Bildwiederholrate der Kamera in Bildern + pro Sekunde und begrenzt zugleich die Frequenz, mit der + Tiefenbilder berechnet werden können. Die Bildwiederholrate + entspricht auch der Frequenz, mit welcher der + + rc_visard NG + + Bilder über GigE Vision bereitstellt. Wird diese Frequenz + verringert, reduziert sich auch die zur Übertragung der Bilder + benötigte Bandbreite des Netzwerks. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?fps= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_camera/parameters?fps= + + Die Kamera läuft im kontinuierlichen Aufnahmemodus immer mit 25 Hz, + um die Funktion von internen Modulen, die eine konstante + Bildwiederholrate benötigen (wie zum Beispiel die visuelle + Odometrie), sicherzustellen. Die vom Benutzer definierte + Bildwiederholrate wird, wie in Abbildung + + Abb. 16 + + gezeigt, durch das Weglassen von Bildern erreicht, die für das + Stereo-Matching und das Übertragen per GigE Vision benutzt werden. + Letzteres dient der Reduktion der Bandbreite. + + +gamma (Gamma) + + Der Gammawert bestimmt, wie das gemessene Licht auf die Helligkeit + eines Pixels abgebildet wird. Ein Gammawert von 1 entspricht einem + linearen Zusammenhang. Kleinere Gammawerte lassen dunkle + Bildbereiche heller erscheinen. Ein Wert um 0.5 entspricht der + menschlichen Wahrnehmung. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?gamma= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_camera/parameters?gamma= + +exp_control (Belichtung Auto, HDR oder Manual) + + Die Belichtungsregelung kann auf *Auto*, *HDR* oder *Manual* + gesetzt werden. Dies ersetzt den veralteten *exp_auto* Parameter. + + *Auto*: Dies ist der Standard Modus der die die Belichtungszeit und + Verstärkung automatisch anpasst, um Unter- und Überbelichtung zu + vermeiden. Wenn die Automatik abgeschaltet wird, werden *exp_value* + und *gain_value* auf die letzten von der Automatik ermittelten + Werte für Belichtungszeit und Verstärkung gesetzt. + + *HDR*: Der HDR Modus berechnet Bilder mit hohem Dynamikbereich + durch Kombination von Bildern mit unterschiedlichen + Belichtungszeiten um über- und unterbelichtete Bereiche zu + vermeiden. Dieser Modus verringert die Bildwiederholrate und ist + nur für statische Szenen geeignet. + + *Manual*: Im manuellen Belichtungsmodus werden die Belichtungszeit + und die Verstärkung konstant gehalten unabhängig von der + resultierenden Bildhelligkeit. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?exp_control= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_camera/parameters?exp_control= + +exp_auto (veraltet) + + Dieser Parameter ist veraltet und wird in einem zukünftigen Release + entfernt. + + Nutzen Sie stattdessen *exp_control*. + + Dieser Wert lässt sich für den automatischen Belichtungsmodus auf + *true* und für den manuellen Belichtungsmodus auf *false* setzen. + Im manuellen Belichtungsmodus wird die gewählte Belichtungszeit + konstant gehalten und die Verstärkung bleibt bei 0,0 dB, auch wenn + die Bilder über- oder unterbelichtet sind. Im automatischen + Belichtungsmodus werden die Belichtungszeit und der + Verstärkungsfaktor automatisch angepasst, sodass das Bild korrekt + belichtet wird. Wenn die Automatik abgeschaltet wird, werden + "exp_value" und "gain_value" auf die letzten von der Automatik + ermittelten Werte für Belichtungszeit und Verstärkung gesetzt. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?exp_auto= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_camera/parameters?exp_auto= + +exp_auto_mode (Modus Belichtungszeitautomatik) + + Der Modus für automatische Belichtung kann auf *Normal*, *Out1High* + oder *AdaptiveOut1* gesetzt werden. Diese Modi sind nur relevant, + wenn der + + rc_visard NG + + mit einer externen Lichtquelle oder einem Projektor betrieben + wird, der an den GPIO-Ausgang 1 des + + rc_visard + + oder + + rc_viscore + + angeschlossen ist. Dieser Ausgang kann durch das IOControl-Modul ( + + IOControl und Projektor-Kontrolle + + ) gesteuert werden. + + *Normal*: Alle Bilder werden für die Regelung der Belichtungszeit + in Betracht gezogen, außer wenn der IOControl-Modus für den GPIO- + Ausgang 1 *ExposureAlternateActive* ist: Dann werden nur Bilder + berücksichtigt, bei denen GPIO-Ausgang 1 HIGH ist, da diese Bilder + heller sein können, falls dieser GPIO-Ausgang benutzt wird um einen + externen Projektor auszulösen. + + *Out1High*: Die Belichtungszeit wird nur anhand der Bilder mit + GPIO-Ausgang 1 HIGH angepasst. Bilder bei denen GPIO-Ausgang 1 LOW + ist, werden für die Belichtungszeitregelung nicht berücksichtigt. + Das bedeutet, die Belichtungszeit ändert sich nicht, solange nur + Bilder mit GPIO-Ausgang 1 LOW aufgenommen werden. Dieser Modus wird + für die Benutzung mit dem Single+Out1 Tiefenbild Aufnahmemodus + (siehe + + Stereo Matching Parameters + + und externem Projektor empfohlen, wenn die Helligkeit der Szene + nur zu den Zeitpunkten berücksichtigt werden soll, wenn GPIO- + Ausgang 1 HIGH ist. Das ist zum Beispiel der Fall, wenn kurz vor + einer Objekterkennung ein heller Teil des Roboters durch das Bild + fährt, der die Belichtungseinstellungen jedoch nicht beeinflussen + soll. + + *AdaptiveOut1*: Dieser Modus nutzt alle Kamerabilder und speichert + die Differenz der Belichtung zwischen Bildern mit GPIO Ausgang 1 + HIGH und LOW. Während der IOControl-Modus für GPIO-Ausgang 1 LOW + ist, werden die Bilder um diese Differenz unterbelichtet, um eine + Überbelichtung zu verhindern, sobald der externe Projektor über + GPIO-Ausgang 1 ausgelöst wird. Die Differenz der Belichtung wird + als + + Out1 Reduktion + + unter den Livebildern angezeigt. Dieser Modus wird empfohlen, wenn + im Stereo-Matching-Modul der Parameter "acquisition_mode" auf + "SingleFrameOut1" ( + + Einzelbild+Out1 + + ) gesetzt ist ( + + Parameter des Stereo-Matching-Moduls + + ), und ein externer Projektor an den GPIO-Ausgang 1 angeschlossen + ist, und wenn die Helligkeit der Szene zu jeder Zeit zur + Belichtungszeitregelung berücksichtigt werden soll.Das ist zum + Beispiel in Anwendungen mit veränderlichen äußeren Lichtbedingungen + der Fall. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?exp_auto_mode= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_camera/parameters?exp_auto_mode= + +exp_max (Maximale Belichtungszeit) + + Dieser Wert gibt die maximale Belichtungszeit im automatischen + Modus in Sekunden an. Die tatsächliche Belichtungszeit wird + automatisch angepasst, sodass das Bild korrekt belichtet wird. Sind + die Bilder trotz maximaler Belichtungszeit noch immer + unterbelichtet, erhöht der + + rc_visard NG + + schrittweise die Verstärkung, um die Helligkeit der Bilder zu + erhöhen. Es ist sinnvoll, die Belichtungszeit zu begrenzen, um die + bei schnellen Bewegungen auftretende Bildunschärfe zu vermeiden + oder zu verringern. Jedoch führt eine höhere Verstärkung auch zu + mehr Bildrauschen. Welcher Kompromiss der beste ist, hängt immer + auch von der Anwendung ab. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?exp_max= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_camera/parameters?exp_max= + +exp_auto_average_max (Maximale Helligkeit) und exp_auto_average_min +(Minimale Helligkeit) + + Die automatische Belichtungszeitsteuerung versucht die + Belichtungszeit und den Verstärkungsfaktor so einzustellen, dass + die mittlere Bildhelligkeit im Bild oder im + + Bereich zur Regelung + + zwischen der maximalen und minimalen Helligkeit liegt. Die + maximale Helligkeit wird benutzt, wenn keine Bildteile in der + Sättigung sind, d.h. keine Überbelichtung durch helle Oberflächen + oder Reflexionen vorhanden sind. Falls Sättigungen auftreten, + werden die Belichtungszeit und der Verstärkungsfaktor verringert, + aber nur bis zur eingestellten minimalen Helligkeit. + + Der Parameter für die maximale Helligkeit hat Vorrang über den + Parameter der minimalen Helligkeit. Falls die minimale Helligkeit + größer als die maximale ist, versucht die automatische + Belichtungszeitsteuerung die mittlere Bildhelligkeit auf die + maximale Helligkeit zu setzen. + + Die aktuelle Helligkeit wird in der Statuszeile unter den Bildern + angezeigt. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_camera/parameters?= + +exp_offset_x, exp_offset_y, exp_width, exp_height (Bereich zur +Regelung) + + Diese Werte definieren eine rechteckige Region im linken + rektifizierten Bild, um den von der automatischen Belichtung + überwachten Bereich zu limitieren. Die Belichtungszeit und der + Verstärkungsfaktor werden so gewählt, dass die definierte Region + optimal belichtet wird. Dies kann zu Über- oder Unterbelichtung in + anderen Bildbereichen führen. Falls die Breite oder Höhe auf 0 + gesetzt werden, dann wird das gesamte linke und rechte Bild von der + automatischen Belichtungsfunktion berücksichtigt. Dies ist die + Standardeinstellung. + + Die Region wird in der Web GUI mit einem Rechteck im linken + rektifizierten Bild visualisiert. Sie kann über Slider oder direkt + im Bild mithilfe der Schaltfläche "Bereich im Bild auswählen" + verändert werden. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_camera/parameters?= + +exp_value (Belichtungszeit) + + Dieser Wert gibt die Belichtungszeit im manuellen Modus in + Sekunden an. Diese Belichtungszeit wird konstant gehalten, auch + wenn die Bilder unterbelichtet sind. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?exp_value= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_camera/parameters?exp_value= + +gain_value (Verstärkungsfaktor) + + Dieser Wert gibt den Verstärkungsfaktor im manuellen Modus in + Dezibel an. Höhere Verstärkungswerte reduzieren die + Belichtungszeit, führen aber zu Rauschen. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?gain_value= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_camera/parameters?gain_value= + +wb_auto (Weißabgleich Auto oder Manuell) + + Dieser Wert kann auf *true* gesetzt werden, um den automatischen + Weißabgleich anzuschalten. Bei *false* kann das Verhältnis der + Farben manuell mit "wb_ratio_red" und "wb_ratio_blue" gesetzt + werden. "wb_ratio_red" und "wb_ratio_blue" werden auf die letzten + von der Automatik ermittelten Werte gesetzt, wenn diese + abgeschaltet wird. Der Weißabgleich ist bei monochromen Kameras + ohne Funktion und wird in diesem Fall in der Web GUI nicht + angezeigt. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?wb_auto= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_camera/parameters?wb_auto= + +wb_ratio_blue und wb_ratio_red (Blau | Grün and Rot | Grün) + + Mit diesen Werten kann das Verhältnis von Blau zu Grün bzw. Rot zu + Grün für einen manuellen Weißabgleich gesetzt werden. Der + Weißabgleich ist bei monochromen Kameras ohne Funktion und wird in + diesem Fall in der Web GUI nicht angezeigt. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_camera/parameters?= + +Die gleichen Parameter sind – mit leicht abweichenden Namen und +teilweise mit anderen Einheiten oder Datentypen – auch über die +GenICam-Schnittstelle verfügbar (siehe + +GigE Vision 2.0/GenICam-Schnittstelle + +). + +Statuswerte + +Dieses Modul meldet folgende Statuswerte: + +Statuswerte des rc_camera-Moduls Name Beschreibung baseline +Basisabstand t der Stereokamera in Metern brightness Aktuelle +Helligkeit als Wert zwischen 0 und 1 color 0 für monochrome Kameras, +1 für Farbkameras exp Aktuelle Belichtungszeit in Sekunden. Dieser +Wert wird unter der Bildvorschau in der Web GUI als Belichtung (ms) +angezeigt. focal Brennweitenfaktor, normalisiert auf eine Bildbreite +von 1 fps Aktuelle Bildwiederholrate der Kamerabilder in Hertz. +Dieser Wert wird unter der Bildvorschau in der Web GUI als FPS (Hz) +angezeigt. gain Aktueller Verstärkungsfaktor in Dezibel. Dieser Wert +wird unter der Bildvorschau in der Web GUI als Verstärkung (dB) +angezeigt. gamma Aktueller Gammawert height Höhe des Kamerabilds +in Pixeln. Dieser Wert wird unter der Bildvorschau in der Web GUI als +zweiter Teil von Auflösung (px) angezeigt. out1_reduction Anteil +der Helligkeits-Reduktion (0.0 - 1.0) für Bilder mit GPIO-Ausgang +1=LOW, wenn exp_auto_mode=AdaptiveOut1 oder exp_auto_mode=Out1High. +Dieser Wert wird unter der Bildvorschau in der Web GUI als Out1 +Reduktion (%) angezeigt. params_override_active 1 wenn die Parameter +temporär durch einen laufenden Kalibrierprozess überschrieben werden +temp_left Temperatur des linken Kamerasensors in Grad Celsius +temp_right Temperatur des rechten Kamerasensors in Grad Celsius test +0 for Live-Bilder und 1 für Test-Bilder time Verarbeitungszeit für +die Bilderfassung in Sekunden width Breite des Kamerabilds in +Pixeln. Dieser Wert wird unter der Bildvorschau in der Web GUI als +erster Teil von Auflösung (px) angezeigt. + +Services + +Das Kamera-Modul bietet folgende Services. + +acquisition_trigger + + triggert eine Bildaufnahme, wenn der Aufnahmemodus auf "Trigger" + und die Triggerquelle auf "Software" gesetzt sind. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/acquisition_trigger + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_camera/services/acquisition_trigger + + Request + + Dieser Service hat keine Argumente. + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "acquisition_trigger", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +reset_defaults + + stellt die Werkseinstellungen der Parameter dieses Moduls wieder + her und wendet sie an („factory reset“). + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/reset_defaults + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_camera/services/reset_defaults + + Request + + Dieser Service hat keine Argumente. + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "reset_defaults", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } diff --git a/v24.04/de/_sources/stereo_matching.rst.txt b/v24.04/de/_sources/stereo_matching.rst.txt new file mode 100644 index 0000000..39287a5 --- /dev/null +++ b/v24.04/de/_sources/stereo_matching.rst.txt @@ -0,0 +1,950 @@ +Stereo-Matching + +Das Stereo-Matching-Modul ist ein Basismodul, das auf jedem + +rc_visard NG + + verfügbar ist, und berechnet auf Grundlage des rektifizierten +Stereobildpaars Disparitäts-, Fehler- und Konfidenzbilder. Weiterhin +bietet das Modul einen Service für die Messung von Tiefenwerten in +einem bestimmten Bildbereich (siehe + +Services + +). + +Um Disparitäts-, Fehler- und Konfidenzbilder in voller Auflösung zu +berechnen, wird eine gesonderte StereoPlus + +Lizenz + + benötigt. Diese Lizenz ist auf jedem + +rc_visard NG + + vorhanden, der nach dem 31.01.2019 gekauft wurde. + +Berechnung von Disparitätsbildern + +Nach der Rektifizierung haben das linke und das rechte Kamerabild die +Eigenschaft, dass ein Objektpunkt in beiden Bildern auf die gleiche +Pixelreihe projiziert wird. Die Pixelspalte des Objektpunkts ist im +rechten Bild maximal so groß wie die Pixelspalte des Objektpunkts im +linken Bild. Der Begriff Disparität bezeichnet den Unterschied +zwischen den Pixelspalten im rechten und linken Bild und gibt indirekt +die Tiefe des Objektpunkts, d.h. dessen Abstand zur Kamera an. Das +Disparitätsbild speichert die Disparitätswerte aller Pixel des linken +Kamerabilds. + +Je größer die Disparität, desto näher liegt der Objektpunkt. Beträgt +die Disparität 0, bedeutet dies, dass die Projektionen des +Objektpunkts in der gleichen Bildspalte liegen und der Objektpunkt +sich in unendlicher Distanz befindet. Häufig gibt es Pixel, für welche +die Disparität nicht bestimmt werden kann. Dies ist der Fall bei +Verdeckungen auf der linken Seite von Objekten, da diese Bereiche von +der rechten Kamera nicht eingesehen werden können. Zudem lässt sich +die Disparität auch bei texturlosen Bereichen nicht bestimmen. Pixel, +für welche die Disparität nicht bestimmt werden kann, werden mit dem +besonderen Disparitätswert 0 als ungültig markiert. Um zwischen +ungültigen Disparitätsmessungen und Messungen, bei denen die +Disparität aufgrund der unendlich weit entfernten Objekte 0 beträgt, +unterscheiden zu können, wird der Disparitätswert für den +letztgenannten Fall auf den kleinstmöglichen Disparitätswert über 0 +gesetzt. + +Um Disparitätswerte zu berechnen, muss der Stereo-Matching-Algorithmus +die zugehörigen Objektpunkte im linken und rechten Kamerabild finden. +Diese Punkte stellen jeweils den gleichen Objektpunkt in der Szene +dar. Für das Stereo-Matching nutzt der + +rc_visard NG + + +SGM + + ( + +Semi-Global Matching + +). Dieser Algorithmus zeichnet sich durch eine kurze Laufzeit aus und +bietet, insbesondere an Objekträndern, bei feinen Strukturen und in +schwach texturierten Bereichen, eine hohe Genauigkeit. + +Unabhängig vom eingesetzten Verfahren ist es beim Stereo-Matching +wichtig, dass das Bild über eine gewisse Textur verfügt, durch Muster +oder Oberflächenstrukturen. Bei einer gänzlich untexturierten Szene, +wie einer weißen Wand ohne jede Struktur, können Disparitätswerte +entweder nicht berechnet werden, oder aber die Ergebnisse sind +fehlerhaft oder von geringer Konfidenz (siehe + +Konfidenz- und Fehlerbilder + +). Bei der Textur in der Szene sollte es sich nicht um ein +künstliches, regelmäßig wiederkehrendes Muster handeln, da diese +Strukturen zu Mehrdeutigkeiten und damit zu falschen +Disparitätsmessungen führen können. + +Für schwach texturierte Objekte oder in untexturierten Umgebungen +lässt sich mithilfe eines externen Musterprojektors eine statische +künstliche Struktur auf die Szene projizieren. Dieses projizierte +Muster sollte zufällig sein und keine wiederkehrenden Strukturen +enthalten. Der + +rc_visard NG + + bietet das IOControl-Modul als optionales Softwaremodul (siehe + +IOControl und Projektor-Kontrolle + +, das einen Musterprojektor ansteuern kann. + +Berechnung von Tiefenbildern und Punktwolken + +Die folgenden Gleichungen zeigen, wie sich die tatsächlichen 3D- +Koordinaten P_x, P_y, P_z eines Objektpunkts bezogen auf das Kamera- +Koordinatensystem aus den Pixelkoordinaten p_{x}, p_{y} des +Disparitätsbilds und dem Disparitätswert d in Pixeln berechnen lassen: + + P_x&=\frac{p_x \cdot t}{d}\\ P_y&=\frac{p_y \cdot t}{d}\\ + P_z&=\frac{f \cdot t}{d}, + +wobei f die Brennweite nach der Rektifizierung (in Pixeln) und t der +während der Kalibrierung ermittelte Stereo-Basisabstand (in Metern) +ist. Diese Werte werden auch über die GenICam-Schnittstelle zur +Verfügung gestellt (siehe + +Besondere Parameter der GenICam-Schnittstelle des rc_visard NG + +). + +Bemerkung: Das Kamera-Koordinatensystem des + + rc_visard NG + + ist in + + Koordinatensysteme + + definiert. + +Bemerkung: Der + + rc_visard NG + + stellt über seine verschiedenen Schnittstellen einen + Brennweitenfaktor bereit. Er bezieht sich auf die Bildbreite, um + verschiedene Bildauflösungen zu unterstützen. Die Brennweite f in + Pixeln lässt sich leicht bestimmen, indem der Brennweitenfaktor mit + der Bildbreite (in Pixeln) multipliziert wird. + +Es ist zu beachten, dass für Gleichungen + +(1) + + davon ausgegangen wird, dass das Bildkoordinatensystem im +Bildhauptpunkt zentriert ist, der üblicherweise in der Bildmitte +liegt, und dass sich p_{x}, p_{y} auf die Mitte des Pixels bezieht, +durch Addieren von 0.5 auf die ganzzahligen Pixelkoordinaten. In der +folgenden Abbildung ist die Definition des Bildkoordinatensystems +dargestellt. + + +Die gleichen Formeln, aber mit den entsprechenden GenICam-Parametern, +sind in + +Umwandlung von Bild-Streams + + angegeben. + +Die Gesamtheit aller aus dem Disparitätsbild errechneten Objektpunkte +ergibt eine Punktwolke, die für 3D-Modellierungsanwendungen verwendet +werden kann. Das Disparitätsbild kann in ein Tiefenbild umgewandelt +werden, indem der Disparitätswert jedes Pixels durch den Wert P_z +ersetzt wird. + +Bemerkung: Auf der Homepage von Roboception ( + + http://www.roboception.com/download + + ) stehen Software und Beispiele zur Verfügung, um Disparitätsbilder, + welche über GigE Vision vom + + rc_visard NG + + empfangen werden, in Tiefenbilder und Punktwolken umzuwandeln. + +Konfidenz- und Fehlerbilder + +Für jedes Disparitätsbild wird zusätzlich ein Fehler- und ein +Konfidenzbild zur Verfügung gestellt, um die Unsicherheit jedes +einzelnen Disparitätswerts anzugeben. Fehler- und Konfidenzbilder +besitzen die gleiche Auflösung und Bildwiederholrate wie das +Disparitätsbild. Im Fehlerbild ist der Disparitätsfehler d_{eps} in +Pixeln angegeben. Er bezieht sich auf den Disparitätswert an der +gleichen Bildkoordinate im Disparitätsbild. Das Konfidenzbild gibt den +entsprechenden Konfidenzwert c zwischen 0 und 1 an. Die Konfidenz gibt +an, wie wahrscheinlich es ist, dass der wahre Disparitätswert +innerhalb des Intervalls des dreifachen Fehlers um die gemessene +Disparität d liegt, d.h. [d-3d_{eps}, d+3d_{eps}]. So lässt sich das +Disparitätsbild mit Fehler- und Konfidenzwerten in Anwendungen +einsetzen, für die probabilistische Folgerungen nötig sind. Die +Konfidenz- und Fehlerwerte für eine ungültige Disparitätsmessung +betragen 0. + +Der Disparitätsfehler d_{eps} (in Pixeln) lässt sich mithilfe der +Brennweite f (in Pixeln), des Basisabstands t (in Metern) und des +Disparitätswerts d (in Pixeln) desselben Pixels im Disparitätsbild in +einen Tiefenfehler z_{eps} (in Metern) umrechnen: + + z_{eps}=\frac{d_{eps}\cdot f\cdot t}{d^2}. + +Durch Kombination der Gleichungen + +(1) + + und + +(2) + + kann der Tiefenfehler zur Tiefe in Bezug gebracht werden: + + z_{eps}=\frac{d_{eps}\cdot{P_z}^2}{f\cdot t}. + +Unter Berücksichtigung der Brennweiten und Basisabstände der +verschiedenen Kameramodelle sowie des typischen kombinierten +Kalibrier- und Stereo-Matching-Fehlers d_{eps} von 0,25 Pixeln lässt +sich die Tiefengenauigkeit wie folgt grafisch darstellen: + + +Anzeigen und Herunterladen von Tiefenbildern und Punktwolken + +Der + +rc_visard NG + + stellt über die GenICam-Schnittstelle zeitgestempelte Disparitäts-, +Fehler- und Konfidenzbilder zur Verfügung (siehe + +Verfügbare Bild-Streams + +). Live-Streams in geringerer Qualität werden auf der + +Tiefenbild + + Seite in der + +Web GUI + + bereitgestellt. + +Die Web GUI bietet weiterhin die Möglichkeit, einen Schnappschuss der +aktuellen Szene mit den Tiefen-, Fehler und Konfidenzbildern, sowie +der Punktwolke als .tar.gz-Datei zu speichern, wie in + +Herunterladen von Kamerabildern + + beschrieben wird. + +Parameter + +Das Stereo-Matching-Modul wird in der REST-API als "rc_stereomatching" +bezeichnet und in der + +Web GUI + + auf der Seite + +Tiefenbild + + dargestellt. Der Benutzer kann die Stereo-Matching-Parameter +entweder dort oder über die REST-API ( + +REST-API-Schnittstelle + +) oder über GigE Vision ( + +GigE Vision 2.0/GenICam-Schnittstelle + +) ändern. + +Übersicht über die Parameter + +Dieses Softwaremodul bietet folgende Laufzeitparameter: + +Laufzeitparameter des rc_stereomatching-Moduls Name Typ +Min. Max. Default Beschreibung acquisition_mode string - - +Continuous Aufnahmemodus: [Continuous, SingleFrame, SingleFrameOut1] +double_shot bool false true false Kombination zweier +Disparitätsbilder von zwei Stereobildpaaren exposure_adapt_timeout +float64 0.0 2.0 0.0 Maximale Zeit in Sekunden, die nach Auslösen +einer Aufnahme im Einzelbild-Modus gewartet wird, bis die Belichtung +angepasst ist fill int32 0 4 3 Disparitätstoleranz (für das +Füllen von Löchern) in Pixeln maxdepth float64 0.1 100.0 100.0 +Maximaler Abstand in Metern maxdeptherr float64 0.01 100.0 100.0 +Maximaler Tiefenfehler in Metern minconf float64 0.5 1.0 0.5 +Mindestkonfidenz mindepth float64 0.1 100.0 0.1 Minimaler +Abstand in Metern quality string - - High Full (Voll), High +(Hoch), Medium (Mittel), oder Low (Niedrig). Full benötigt eine +'StereoPlus'-Lizenz. seg int32 0 4000 200 Mindestgröße der +gültigen Disparitätssegmente in Pixeln smooth bool false true +true Glättung von Disparitätsbildern (benötigt eine +'StereoPlus'-Lizenz) static_scene bool false true false Mitteln +von Bildern in statischen Szenen, um Rauschen zu reduzieren + +Beschreibung der Laufzeitparameter + +Jeder Laufzeitparameter ist durch eine eigene Zeile auf der Seite + +Tiefenbild + + der Web GUI repräsentiert. Der Web GUI-Name des Parameters ist in +Klammern hinter dem Namen des Parameters angegeben und die Parameter +werden in der Reihenfolge, in der sie in der Web GUI erscheinen, +aufgelistet: + + +acquisition_mode (Aufnahmemodus) + + Der Aufnahmemodus kann auf "Continuous" ( + + Kontinuierlich + + ), "SingleFrame" ( + + Einzelbild + + ) oder "SingleFrameOut1" ( + + Einzelbild + Out1 + + ) eingestellt werden. *Kontinuierlich* ist die + Standardeinstellung, bei der das Stereo-Matching kontinuierlich + mit der vom Benutzer eingestellten Bildwiederholrate, + entsprechend der verfügbaren Rechenressourcen, durchgeführt + wird. Bei den beiden anderen Modi wird das Stereo-Matching bei + jedem Drücken des Aufnehmen-Knopfes durchgeführt. Der + *Einzelbild + Out1* Modus kontrolliert zusätzlich einen externen + Projektor, falls dieser an GPIO-Ausgang 1 angeschlossen ist ( + + IOControl und Projektor-Kontrolle + + ). In diesem Modus wird "out1_mode" des IOControl-Moduls + automatisch bei jedem Trigger auf "ExposureAlternateActive" und + nach dem Aufnehmen der Bilder für das Stereo-Matching auf "Low" + gesetzt. + + Bemerkung: Der *Einzelbild + Out1* Modus kann nur dann über + "out1_mode" einen Projektor steuern, wenn die IOControl-Lizenz + auf dem + + rc_visard NG + + verfügbar ist. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?acquisition_mode= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?acquisition_mode= + +exposure_adapt_timeout (Timeout Belichtungsautomatik) + + Der Timeout für die Belichtungsautomatik gibt die maximale + Zeitspanne in Sekunden an, die das System nach dem Auslösen + einer Bildaufnahme warten wird, bis die Belichtungsautomatik die + optimale Belichtungszeit gefunden hat. Dieser Timeout wird nur + im Modus "SingleFrame" ( + + Einzelbild + + ) oder "SingleFrameOut1" ( + + Einzelbild + Out1 + + ) bei aktiver Belichtungsautomatik verwendet. Dieser Wert sollte + erhöht werden, wenn in Anwendungen mit veränderlichen + Lichtbedingungen Bilder unter- oder überbelichtet werden, und + das resultierende Disparitätsbild nicht dicht genug ist. In + diesem Fall werden mehrere Bilder aufgenommen, bis sich die + Belichtungsautomatik angepasst hat oder der Timeout erreicht + ist, und erst dann wird die eigentliche Bildaufnahme ausgelöst. + + Über die REST-API kann dieser Parameter wie folgt gesetzt + werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?exposure_adapt_timeout= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?exposure_adapt_timeout= + +quality (Qualität) + + Disparitätsbilder lassen sich in verschiedenen Auflösungen + berechnen: "Full" ( + + Voll + + , volle Bildauflösung), "High" ( + + Hoch + + , halbe Bildauflösung), "Medium" ( + + Mittel + + , Viertel-Bildauflösung) und "Low" ( + + Niedrig + + , Sechstel-Bildauflösung). Stereo-Matching mit voller Auflösung + ("Full") ist nur mit einer gültigen StereoPlus Lizenz möglich. + Je niedriger die Auflösung, desto höher die Bildwiederholrate + des Disparitätsbilds. Es ist zu beachten, dass die + Bildwiederholrate der Disparitäts-, Konfidenz- und Fehlerbilder + immer höchstens der Bildwiederholrate der Kamera entspricht. + Falls die Projektoreinstellung "ExposureAlternateActive" ist, + kann die Wiederholrate der Bilder höchstens die halbe + Bildwiederholrate der Kamera sein. + + Eine Bildwiederholrate von 25 Hz lässt sich nur bei mittlerer + und niedriger Auflösung erreichen. + + Wenn volle Auflösung eingestellt ist, dann ist der mögliche + Tiefenbereich intern limitiert, aufgrund von beschränktem on- + board Speicherplatz. Es wird empfohlen "mindepth" and "maxdepth" + auf den Tiefenbereich anzupassen der für die Applikation + benötigt wird. + + Auflösung des Tiefenbilds in Abhängigkeit von der gewählten + Qualität Qualität Voll (Full) Hoch (High) Mittel + (Medium) Niedrig (Low) Auflösung (Pixel) 1440 x 1080 720 x + 540 360 x 270 240 x 180 + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?quality= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?quality= + +double_shot (Double-Shot) + + Das Aktivieren dieses Modus führt zu dichteren Disparitätsbildern, + aber einer erhöhten Verarbeitungszeit. + + Bei Szenen, die mit einem Projektor im "Single + Out1" Modus oder + im kontinuierlichen Modus mit der Projektoreinstellung + "ExposureAlternateActive" aufgenommen werden, werden Löcher, die + durch Projektor-Reflexionen verursacht werden, gefüllt mit + Tiefeninformationen aus den Bildern ohne Projektormuster. In diesem + Fall darf der "double_shot" Modus nur verwendet werden, wenn sich + die Szene während der Aufnahme der Bilder nicht verändert. + + Bei allen anderen Szenen werden Löcher im Disparitätsbild mit + Tiefeninformationen aus demselben, herunterskalierten Bild gefüllt. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?double_shot= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?double_shot= + +static_scene (Statisch) + + Mit dieser Option werden acht aufeinanderfolgende Kamerabilder vor + dem Matching gemittelt. Dies reduziert Rauschen, was die Qualität + des Stereo-Matching-Resultats verbessert. Allerdings erhöht sich + auch die Latenz deutlich. Der Zeitstempel des ersten Bildes wird + als Zeitstempel für das Disparitätsbild verwendet. Diese Option + betrifft nur das Matching in voller und hoher Qualität. Sie darf + nur verwendet werden, wenn sich die Szene während der Aufnahme der + acht Bilder nicht verändert. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?static_scene= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?static_scene= + +mindepth (Minimaler Abstand) + + Dieser Wert bezeichnet den geringsten Abstand zur Kamera, ab dem + Messungen möglich sind. Größere Werte verringern implizit den + Disparitätsbereich, wodurch sich auch die Rechenzeit verkürzt. Der + minimale Abstand wird in Metern angegeben. + + Abhängig von den Eigenschaften des Sensors kann der tatsächliche + minimale Abstand größer sein als die Benutzereinstellung. Der + tatsächliche minimale Abstand wird in den Statuswerten angezeigt. + + Wenn volle Auflösung ("Full") eingestellt ist, kann der minimale + Abstand auch aufgrund interner Speicherplatzlimitierungen größer + sein als die Benutzereinstellung. In diesem Fall hilft es, den + maximalen Abstand zu verringern, um dadurch auch den tatsächlichen + minimalen Abstand zu verringern. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?mindepth= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?mindepth= + +maxdepth (Maximaler Abstand) + + Dieser Wert ist der größte Abstand zur Kamera, bis zu dem Messungen + möglich sind. Pixel mit größeren Distanzwerten werden auf + „ungültig“ gesetzt. Wird dieser Wert auf das Maximum gesetzt, so + sind Abstände bis Unendlich möglich. Der maximale Abstand wird in + Metern angegeben. + + Wenn volle Auflösung ("Full") eingestellt ist, kann der minimale + Abstand auch aufgrund interner Speicherplatzlimitierungen größer + sein als die Benutzereinstellung. In diesem Fall hilft es, den + maximalen Abstand zu verringern um dadurch auch den tatsächlichen + minimalen Abstand zu verringern. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?maxdepth= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?maxdepth= + +smooth (Glättung) + + Diese Option aktiviert die Glättung von Disparitätswerten. Sie ist + nur mit gültiger StereoPlus-Lizenz verfügbar. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?smooth= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?smooth= + +fill (Füllen) + + Diese Option wird verwendet, um Löcher im Disparitätsbild durch + Interpolation zu füllen. Der Füllwert gibt die maximale + Disparitätsabweichung am Rand des Lochs an. Größere Füllwerte + können die Anzahl an Löchern verringern, aber die interpolierten + Werte können größere Fehler aufweisen. Maximal 5% der Pixel werden + interpoliert. Kleine Löcher werden dabei bevorzugt interpoliert. + Die Konfidenz für die interpolierten Pixel wird auf einen geringen + Wert von 0,5 eingestellt. Das Auffüllen lässt sich deaktivieren, + wenn der Wert auf 0 gesetzt wird. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?fill= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?fill= + +seg (Segmentierung) + + Der Segmentierungsparameter wird verwendet, um die Mindestanzahl an + Pixeln anzugeben, die eine zusammenhängende Disparitätsregion im + Disparitätsbild ausfüllen muss. Isolierte Regionen, die kleiner + sind, werden im Disparitätsbild auf ungültig gesetzt. Der Wert + bezieht sich immer auf ein Disparitätsbild mit hoher Qualität + (halbe Auflösung) und muss nicht verändert werden, wenn andere + Qualitäten gewählt werden. Die Segmentierung eignet sich, um + Disparitätsfehler zu entfernen. Bei größeren Werten kann es jedoch + vorkommen, dass real vorhandene Objekte entfernt werden. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?seg= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?seg= + +minconf (Minimale Konfidenz) + + Die minimale Konfidenz lässt sich einstellen, um potenziell falsche + Disparitätsmessungen herauszufiltern. Dabei werden alle Pixel, + deren Konfidenz unter dem gewählten Wert liegt, im Disparitätsbild + auf „ungültig“ gesetzt. + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?minconf= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?minconf= + +maxdeptherr (Maximaler Fehler) + + Der maximale Fehler wird verwendet, um Messungen, die zu ungenau + sind, herauszufiltern. Alle Pixel mit einem Tiefenfehler, der den + gewählten Wert überschreitet, werden im Disparitätsbild auf + „ungültig“ gesetzt. Der maximale Tiefenfehler wird in Metern + angegeben. Der Tiefenfehler wächst in der Regel quadratisch mit dem + Abstand eines Objekts zur Kamera (siehe + + Konfidenz- und Fehlerbilder + + ). + + Über die REST-API kann dieser Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?maxdeptherr= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?maxdeptherr= + +Die gleichen Parameter sind – mit leicht abweichenden Namen und +teilweise mit anderen Einheiten oder Datentypen – auch über die +GenICam-Schnittstelle verfügbar (siehe + +GigE Vision 2.0/GenICam-Schnittstelle + +). + +Statuswerte + +Dieses Modul meldet folgende Statuswerte: + +Statuswerte des rc_stereomatching-Moduls Name Beschreibung fps +Tatsächliche Bildwiederholrate der Disparitäts-, Fehler- und +Konfidenzbilder. Dieser Wert wird unter der Bildvorschau in der Web +GUI als Bildwiederholrate (Hz) angezeigt. latency Zeit zwischen +Bildaufnahme und Weitergabe des Disparitätsbildes in Sekunden width +Aktuelle Breite des Disparitäts-, Fehler- und Konfidenzbilds in Pixeln +height Aktuelle Höhe des Disparitäts-, Fehler- und Konfidenzbilds in +Pixeln mindepth Tatsächlicher minimaler Arbeitsabstand in Metern +maxdepth Tatsächlicher maximaler Arbeitsabstand in Metern +time_matching Zeit in Sekunden für die Durchführung des Stereo- +Matchings mittels SGM auf der GPU time_postprocessing Zeit in +Sekunden für die Nachbearbeitung des Matching-Ergebnisses auf der CPU +reduced_depth_range Gibt an, ob der Tiefenbereich aufgrund von +Rechenressourcen verringert ist ist + +Services + +Das Stereo-Matching-Modul bietet folgende Services. + +acquisition_trigger + + signalisiert dem Modul, das Stereo-Matching auf den nächsten + Stereobildern durchzuführen, falls "acquisition_mode" auf + "SingleFrame" (*Einzelbild*) oder "SingleFrameOut1" + (*Einzelbild+Out1*) eingestellt ist. + + Details + + Es wird ein Fehler zurückgegeben, falls "acquisition_mode" auf + "Continuous" (*Kontinuierlich*) eingestellt ist. + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/services/acquisition_trigger + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_stereomatching/services/acquisition_trigger + + Request + + Dieser Service hat keine Argumente. + + Response + + Mögliche Rückgabewerte sind in der Tabelle unten aufgeführt. + + Mögliche Rückgabewerte des acquisition_trigger Serviceaufrufs. + Code Beschreibung 0 Erfolgreich -8 Triggern ist nur im + Einzelbild-Modus möglich. 101 Triggern wird ignoriert, da bereits + ein anderer Triggeraufruf stattfindet. 102 Triggern wird + ignoriert, da keine Empfänger registriert sind. + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "acquisition_trigger", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +measure_depth + + berechnet durchschnittliche, minimale und maximale Tiefenwerte in + einer bestimmten Region of Interest, die optional in Zellen + unterteilt werden kann. + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/services/measure_depth + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_stereomatching/services/measure_depth + + Request + + Optionale Serviceargumente: + + "region_of_interest_2d_id" ist die ID der 2D Region of Interest + (siehe + + RoiDB + + ), die für die Tiefenmessung verwendet wird. + + "region_of_interest_2d" ist eine alternative Definition der + Region of Interest für die Tiefenmessung. Diese Region of + Interest wird ignoriert, falls eine "region_of_interest_2d_id" + gesetzt ist. Die Region of Interest wird immer auf dem + Kamerabild mit voller Auflösung definiert, wobei "offset_x" und + "offset_y" die Pixelkoordinaten der oberen linken Ecke der + rechteckigen Region of Interest sind, und "width" und "height" + die Breite und Höhe des Rechtecks in Pixeln angeben. Der + Standardwert ist eine Region of Interest, die das gesamte Bild + abdeckt. + + "cell_count" ist die Anzahl der Zellen in x und y Richtung, in + die die Region of Interest für die Tiefenmessung unterteilt + wird. Falls nicht angegeben, wird ein "cell_count" von 0, 0 + angenommen und es werden nur die Gesamtwerte "overall" + berechnet. Die Gesamtanzahl der Zellen, die als Produkt aus den + x und y Werten des "cell_count" berechnet werden kann, darf + nicht größer sein als 100. + + "data_acquisition_mode": Falls der Aufnahmemodus auf + "CAPTURE_NEW" (Standardwert) gesetzt ist, wird ein neuer Bild- + Datensatz für die Messung aufgenommen. Falls der Modus auf + "USE_LAST" gesetzt wird, wird der Datensatz der vorherigen + Messung erneut verwendet. + + "pose_frame" bestimmt, ob die Koordinaten der Tiefenmessung im + Kamerakoordinatensystem ("camera"), oder im + Roboterkoordinatensystem ("external") zurückgeliefert werden, + falls eine Hand-Auge-Kalibrierung verfügbar ist (siehe + + Hand-Auge-Kalibrierung + + ). Der Standardwert ist "camera". + + Möglicherweise benötigte Serviceargumente: + + "robot_pose" ist die Pose des Roboters zum Zeitpunkt der + Tiefenmessung. Die Roboterpose wird benötigt, wenn das externe + Koordinatensystem "pose_frame" genutzt wird und die Kamera am + Roboter montiert ist. + + Die Definition der *Request*-Argumente mit jeweiligen Datentypen + ist: + + { + "args": { + "cell_count": { + "x": "uint32", + "y": "uint32" + }, + "data_acquisition_mode": "string", + "pose_frame": "string", + "region_of_interest_2d": { + "height": "uint32", + "offset_x": "uint32", + "offset_y": "uint32", + "width": "uint32" + }, + "region_of_interest_2d_id": "string", + "robot_pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + } + } + } + + Response + + Mögliche return_code Werte des measure_depth Serviceaufrufs. + value Beschreibung 0 Messung erfolgreich -1 Ein ungültiges + Argument wurde angegeben + + "cells" enthält die Tiefenmessungen aller gewünschter Zellen. Die + Zellen sind immer von links nach rechts und oben nach unten in + Bildkoordinaten sortiert. + + "overall" enthält die Tiefenmessung der gesamten Region of + Interest. + + "coverage" ist eine Zahl zwischen 0 und 1, die den Anteil der Pixel + mit gültigen Tiefenmesswerten innerhalb der zugehörigen Zelle + angibt. Ein Anteil von 0 bedeutet, dass die Zelle ungültig ist. + + "min_z" und "max_z" geben die 3D Koordinaten des Punkts in der + Zelle zurück, der den minimalen bzw. maximalen Tiefenwert hat. Der + Tiefenwert ist die z-Koordinate im Kamerakoordinatensystem. + + Für "mean_z" definieren die x- und y-Koordinaten den Punkt in der + Mitte der Zelle, und die z-Koordinate wird bestimmt durch den + mittleren Tiefenmesswert in dieser Zelle. + + "region_of_interest_2d" gibt die Definition der angeforderten + Region of Interest für die Tiefenmessung zurück. + + Wenn "pose_frame" auf "external" gesetzt ist, dann werden die x-, + y- und z-Koordinaten im Roboterkoordinatensystem zurückgeliefert + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "measure_depth", + "response": { + "cell_count": { + "x": "uint32", + "y": "uint32" + }, + "cells": [ + { + "coverage": "float64", + "max_z": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "mean_z": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "min_z": { + "x": "float64", + "y": "float64", + "z": "float64" + } + } + ], + "overall": { + "coverage": "float64", + "max_z": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "mean_z": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "min_z": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "region_of_interest_2d": { + "height": "uint32", + "offset_x": "uint32", + "offset_y": "uint32", + "width": "uint32" + }, + "return_code": { + "message": "string", + "value": "int16" + }, + "timestamp": { + "nsec": "int32", + "sec": "int32" + } + } + } + +reset_defaults + + stellt die Werkseinstellungen der Parameter dieses Moduls wieder + her und wendet sie an („factory reset“). + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/services/reset_defaults + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes/rc_stereomatching/services/reset_defaults + + Request + + Dieser Service hat keine Argumente. + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "reset_defaults", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } diff --git a/v24.04/de/_sources/tagdetect.rst.txt b/v24.04/de/_sources/tagdetect.rst.txt new file mode 100644 index 0000000..65dacb9 --- /dev/null +++ b/v24.04/de/_sources/tagdetect.rst.txt @@ -0,0 +1,836 @@ +TagDetect + +Einführung + +Die TagDetect-Module sind optionale Module, die intern auf dem + +rc_visard NG + + laufen, und benötigen gesonderte + +Lizenzen + +, die erworben werden müssen. Diese Lizenzen sind auf jedem + +rc_visard NG + +, der nach dem 01.07.2020 gekauft wurde, vorhanden. + +Die TagDetect-Module laufen intern auf dem + +rc_visard NG + + und ermöglichen es, 2D-Matrixcodes und Marker (Tags) zu erkennen. +Derzeit gibt es TagDetect-Module für *QR-Codes* und *AprilTags*. Neben +der Erkennung berechnen die Module die Position und Orientierung jedes +Tags im 3D-Kamerakoordinatensystem, um diesen beispielsweise mit einem +Roboter zu manipulieren oder die Pose der Kamera in Bezug auf den Tag +zu berechnen. + +Die Tagerkennung besteht aus drei Schritten: + +Tagerkennung auf dem 2D-Bildpaar (siehe Tagerkennung, Abschnitt +\ref{tagdetect:sect-tag-reading}). + +Schätzung der Pose jedes Tags (siehe Posenschätzung, Abschnitt +\ref{tagdetect:sect-tag-pose-estimation}). + +Wiedererkennung von bisher gesehenen Tags (siehe Tag-Wiedererkennung, +Abschnitt \ref{tagdetect:sect-tag-re-identification}). + +Im Folgenden werden die zwei unterstützten Tagtypen näher beschrieben, +gefolgt von einem Vergleich. + +QR-Code + + +QR-Codes sind zweidimensionale Matrixcodes, welche beliebige, +benutzerspezifizierte Daten enthalten können. Viele Alltagsgeräte, wie +beispielsweise Smartphones, unterstützen die Erkennung von QR-Codes. +Zusätzlich stehen Online- und Offlinetools zur Verfügung, um QR-Codes +zu generieren. + +Die "Pixel" eines QR-Codes werden *Module* genannt. Das Aussehen und +die Auflösung von QR-Codes ändert sich mit der Menge der in ihnen +gespeicherten Daten. Während die speziellen Muster in den drei Ecken +immer 7 Module breit sind, erhöht sich die Anzahl der Module +dazwischen, je mehr Daten gespeichert sind. Der am niedrigsten +aufgelöste QR-Code besitzt eine Größe von 21x21 Modulen und kann bis +zu 152 Bits speichern. + +Auch wenn viele QR-Code-Generatoren speziell designte QR-Codes +erzeugen können (bspw. mit einem Logo, mit runden Ecken oder mit +Punkten als Module), wird eine zuverlässige Erkennung solcher Tags mit +dem TagDetect-Modul nicht garantiert. Gleiches gilt für QR-Codes, +welche Zeichen außerhalb des ASCII-Zeichensatzes beinhalten. + +AprilTag + + +AprilTags sind ähnlich zu QR-Codes. Sie wurden allerdings speziell zur +robusten Identifikation auf weite Entfernungen entwickelt. Wie bei QR- +Codes werden die "Pixel" *Module* genannt. + +Abb. 22 + + veranschaulicht den Aufbau von AprilTags. Sie haben einen +obligatorischen weißen und schwarzen Rahmen, welcher jeweils ein Modul +breit ist. Tags der Familien 16h5, 25h9, 36h10 und 36h11 sind von +diesem Rahmen umschlossen und enthalten innen eine variable Menge an +Datenmodulen. Bei Tags der Familie 41h12 ist der Rahmen nach innen +verschoben und die Datenmodule befinden sich sowohl innerhalb als auch +außerhalb des Rahmens. Anders als QR-Codes speichern AprilTags keine +benutzerdefinierten Informationen, sondern werden durch eine +vordefinierte + +Familie + + und + +ID + + identifiziert. Die Tags in + +Abb. 22 + + sind zum Beispiel aus Familie 16h5, 36h11 bzw. 41h12 und besitzen ID +0, 11 bzw. 0. Alle unterstützten Familien werden in + +Tab. 16 + + aufgelistet. + +AprilTag-Familien Familie Anzahl IDs Empfohlen 16h5 30 - +25h9 35 o 36h10 2320 o 36h11 587 + 41h12 2115 + + +Die Zahl vor dem "h" jeder Familie bezeichnet die Anzahl der +Datenmodule, welche im Tag enthalten sind: Während ein 16h5 Tag 16 +(4x4) Datenmodule enthält ((c) in + +Abb. 22 + +) und ein 36h11 Tag 36 (6x6), beinhaltet ein 41h12 Tag 41 Datenmodule +(3x3 innen und 4x8 außen). Die Zahl hinter dem "h" bezeichnet den +Hamming-Abstand zwischen zwei Tags der Familie. Je höher, desto höher +ist die Robustheit, aber desto weniger IDs stehen bei gleicher Anzahl +an Datenmodulen zur Verfügung (siehe + +Tab. 16 + +). + +Der Vorteil von Familien mit weniger Modulen (bspw. 16h5 im Vergleich +zu 36h11) ist die niedrigere Auflösung der Tags. Jedes Modul ist somit +größer, weshalb der Tag auf eine größere Distanz erkannt werden kann. +Dies hat allerdings auch Nachteile: Zum einen stehen bei niedrigerer +Zahl an Datenmodulen auch weniger IDs zur Verfügung. Wichtiger aber +ist, dass die Robustheit der Tagerkennung signifikant reduziert wird, +da es zu einer höheren Falsch-Positiv-Rate kommt. Dies bedeutet, dass +Tags verwechselt werden oder nicht existierende Tags in zufälliger +Bildtextur oder im Bildrauschen erkannt werden. Die 41h12 Familie hat +ihren Rahmen nach innen verschoben, was im Vergleich zur 36h11 Familie +mehr Datenmodule bei einer geringen Gesamtmodulanzahl ermöglicht. + +Aus diesen Gründen empfehlen wir die Verwendung der 42h12 und +36h11-Familien und raten ausdrücklich von der Familie 16h5 ab. +Letztgenannte Familie sollten nur benutzt werden, wenn eine große +Erkennungsdistanz für die Anwendung unbedingt erforderlich ist. Jedoch +ist die maximale Erkennungsdistanz nur ca. 25% größer, wenn anstelle +der 36h11-Familie die 16h5-Familie verwendet wird. + +Vorgenerierte AprilTags können von der AprilTag-Projektwebseite ( + +https://april.eecs.umich.edu/software/apriltag.html + +) heruntergeladen werden. Jede Familie besteht aus mehreren PNGs, +welche jeweils einen AprilTag enthalten. Jedes Pixel im PNG entspricht +dabei einem Modul des AprilTags. Beim Drucken der Tags der Familien +36h11, 36h10, 25h9 und 16h5 sollte darauf geachtet werden, den weißen +Rand um den AprilTag mit einzuschließen -- dieser ist in den PNGs +enthalten (siehe (a) in + +Abb. 22 + +). Die Tags müssen außerdem ohne Interpolation auf die Druckgröße +skaliert werden, sodass die scharfen Kanten erhalten bleiben. + +Vergleich + +Sowohl QR-Codes als auch AprilTags haben ihre Vor- und Nachteile. +Während QR-Codes die Speicherung von benutzerdefinierten Daten +erlauben, sind die Tags bei AprilTags vordefiniert und in ihrer Anzahl +limitiert. Andererseits haben AprilTags eine niedrigere Auflösung und +können daher auf eine größere Distanz erkannt werden. Zusätzlich hilft +die durchgängige weiß-zu-schwarz-Kante in jedem AprilTag bei einer +präziseren Posenschätzung. + +Bemerkung: Falls die Speicherung von benutzerdefinierten Daten nicht + benötigt wird, sollten AprilTags QR-Codes vorgezogen werden. + +Tagerkennung + +Der erste Schritt der Tagerkennung ist die Detektion der Tags auf dem +Stereo-Bildpaar. Dieser Schritt benötigt die meiste Zeit und seine +Präzision ist entscheidend für die Präzision der finalen Tagpose. Um +die Dauer dieses Schritts zu kontrollieren, kann der Parameter +"quality" vom Benutzer konfiguriert werden. Er hat ein +Herunterskalieren des Stereo-Bildpaares vor der Tagerkennung zur +Folge. + +Hoch + + ("High") ergibt die höchste maximale Erkennungsdistanz und Präzision, +aber auch die längste Dauer der Erkennung. + +Niedrig + + ("Low") führt zur kleinsten maximalen Erkennungsdistanz und +Präzision, aber benötigt auch nur weniger als die halbe Zeit. + +Mittel + + ("Medium") liegt dazwischen. Es sollte beachtet werden, dass dieser +"quality"-Parameter keine Verbindung zum "quality"-Parameter des + +Stereo-Matching + + hat. + + +Die maximale Erkennungsdistanz z für Qualität + +Hoch + + ("High") kann mit folgenden Formeln angenähert werden: + + z = \frac{f s}{p}, + + s = \frac{t}{r}, + +wobei f die + +Brennweite + + in Pixeln und s die Größe jedes Moduls in Metern bezeichnet. s kann +leicht mit letztgenannter Formel berechnet werden, in welcher t der +Taggröße in Metern und r der Breite des Tags in Modulen entspricht +(bei AprilTags ohne den weißen Rahmen). + +Abb. 23 + + veranschaulicht diese Variablen. p bezeichnet die Zahl der Bildpixel +pro Modul, welche für eine Erkennung erforderlich sind. Sie +unterscheidet sich zwischen QR-Codes und AprilTags. Auch der Winkel +des Tags zur Kamera und die Beleuchtung spielen eine Rolle. Ungefähre +Werte für eine robuste Erkennung sind: + +AprilTag: p=5 Pixel/Modul + +QR-Code: p=6 Pixel/Modul + +Die folgenden Tabellen enthalten Beispiele für die maximale +Erkennungsdistanz in unterschiedlichen Situationen. Die Brennweite des + +rc_visard + + wird dafür mit 1075 Pixeln, die Qualität mit "High" angenommen. + +Beispiele zur maximalen Erkennungsdistanz für AprilTags mit einer +Breite von t=4 cm AprilTag-Familie Tagbreite Maximale Distanz +36h11 (empfohlen) 8 Module 1.1 m 16h5 6 Module 1.4 m 41h12 +(empfohlen) 5 Module 1.7 m + +Beispiele zur maximalen Erkennungsdistanz für QR-Codes mit einer +Breite von t=8 cm Tagbreite Maximale Distanz 29 Module 0.49 m +21 Module 0.70 m + +Posenschätzung + +Für jeden erkannten Tag wird dessen Pose im Kamerakoordinatensystem +geschätzt. Eine Bedingung dafür ist, dass der Tag vollständig im +linken und rechten Bild zu sehen ist. Das Koordinatensystem ist wie +unten gezeigt am Tag ausgerichtet. + + +Die z-Achse zeigt "in" den Tag. Es ist zu beachten, dass, auch wenn +AprilTags den weißen Rand in ihrer Definition enthalten, der Ursprung +des Koordinatensystems trotzdem am Übergang des weißen zum schwarzen +Rand liegt. Da AprilTags keine offensichtliche Orientierung haben, +liegt der Ursprung in der oberen linken Ecke des vorgenerierten +AprilTags. + +Während der Posenschätzung wird auch die Größe des Tags geschätzt +unter der Annahme, dass der Tag quadratisch ist. Bei QR-Codes bezieht +sich die Größe auf den gesamten Tag, bei AprilTags dagegen nur auf den +Bereich innerhalb des Übergangs vom schwarzen zum weißen Rand. Das +heißt, dass bei Tags der Familien 16h5, 25h9, 36h10 und 36h11 der +äußere weiße Rand ignoriert wird. + +Der Benutzer kann auch die ungefähre Größe (\pm 10\%) eines Tags +angeben. Alle Tags, die dieser Einschränkung nicht entsprechen, werden +automatisch herausgefiltert. Weiter hilft diese Information in +bestimmten Situationen, Mehrdeutigkeiten in der Posenschätzung +aufzulösen, die entstehen können, wenn mehrere Tags mit derselben ID +im linken und rechten Bild sichtbar und diese Tags parallel zu den +Bildzeilen ausgerichtet sind. + +Bemerkung: Für beste Ergebnisse der Posenschätzung sollte der Tag + sorgfältig gedruckt und auf einem steifen und möglichst ebenen + Untergrund angebracht werden. Jegliche Verzerrung des Tags oder + Unebenheit der Oberfläche verschlechtert die geschätzte Pose. + +Bemerkung: Wir empfehlen, die ungefähre Größe der Tags anzugeben. + Ansonsten, falls mehrere Tags mit derselben ID im linken oder + rechten Bild sichtbar sind, kann es zu einer fehlerhaften + Posenschätzung kommen, wenn die Tags gleich orientiert sind und sie + ungefähr parallel zu den Bildzeilen angeordnet sind. Auch wenn die + Größe nicht angegeben sein sollte, versuchen die TagDetect-Module + jedoch, solche Situationen zu erkennen und verwerfen betroffene + Tags. + +Unten stehende Tabellen enthalten grobe Angaben zur Präzision der +geschätzten Posen von AprilTags. Wir unterscheiden zwischen lateraler +Präzision (also in x- und y-Richtung) und Präzision in z-Richtung. Es +wird angenommen, dass "quality" auf "High" gesetzt ist, und dass die +Blickrichtung der Kamera parallel zur Normalen des Tags ist. Die Größe +eines Tags hat keinen signifikanten Einfluss auf die Präzision in +lateraler und z-Richtung. Im Allgemeinen verbessert ein größerer Tag +allerdings die Präzision. Im Bezug auf die Präzision der Rotation, im +speziellen um die x- und y-Achsen, übertreffen große Tags kleinere +deutlich. + +Ungefähre Präzision der Position von AprilTag Messungen mit Qualität +Hoch in einem idealen Szenario Distanz rc_visard NG 160 - +lateral rc_visard NG 160 - z 0.5 m 0.05 mm 0.3 mm 1.0 m 0.15 mm +1.4 mm 2.0 m 0.5 mm 3.7 mm + +Ungefähre Präzision der Orientierung von AprilTag Messungen mit +Qualität Hoch in einem idealen Szenario für verschiedene Tag-Größen +Distanz 60 x 60 mm 120 x 120 mm 0.5 m 0.2° -- 1.0 m 0.8° 0.3° +2.0 m 2.0° 0.8° 3.0 m -- 1.8° + +Tag-Wiedererkennung + +Jeder Tag besitzt eine ID: bei AprilTags ist dies die + +Familie + + zusammen mit der AprilTag- + +ID + +, bei QR-Codes die enthaltenen Daten. Diese IDs sind jedoch nicht +einzigartig, da mehrere Tags mit derselben ID in einer Szene vorkommen +können. + +Zur Unterscheidung dieser Tags weisen die TagDetect-Module jedem Tag +einen eindeutigen Identifikator zu. Um den Benutzer dabei zu +unterstützen, denselben Tag über mehrere Tagerkennungsläufe hinweg zu +identifizieren, versucht das TagDetect-Modul Tags wiederzuerkennen. +Falls erfolgreich, wird einem Tag derselbe Identifikator zugewiesen. + +Die Tag-Wiedererkennung vergleicht die Positionen der Ecken der Tags +im Kamera-Koordinatensystem, um identische Tags wiederzufinden. Tags +werden als identisch angenommen, falls sie sich nicht oder nur +geringfügig in diesem Koordinatensystem bewegt haben. + +Über den "max_corner_distance"-Parameter kann der Benutzer festlegen, +wie weit ein Tag sich zwischen zwei Erkennungsläufen bewegen darf, um +als identisch zu gelten. Der Parameter definiert die maximale Distanz +zwischen den Ecken zweier Tags, was in + +Abb. 25 + + dargestellt ist. Die euklidischen Abstände der vier +zusammengehörenden Tagecken in 3D werden berechnet. Falls keiner +dieser Abstände den Grenzwert überschreitet, gilt der Tag als +wiedererkannt. + + +Nach einer bestimmten Anzahl von Tagerkennungsläufen werden vorher +gesehene Tags verworfen, falls diese in der Zwischenzeit nicht mehr +erkannt wurden. Dies kann über den Parameter +"forget_after_n_detections" festgelegt werden. + +Hand-Auge-Kalibrierung + +Falls die Kamera zu einem Roboter kalibriert wurde, kann das +TagDetect-Modul automatisch Posen im Roboterkoordinatensystem +ausgeben. Für die + +Services + + kann das Koordinatensystem der berechneten Posen mit dem Argument +"pose_frame" spezifiziert werden. + +Zwei verschiedene "pose_frame"-Werte können gewählt werden: + +Kamera-Koordinatensystem (camera): Alle Posen sind im Kamera- +Koordinatensystem angegeben. + +Benutzerdefiniertes externes Koordinatensystem (external): Alle Posen +sind im sogenannten externen Koordinatensystem angegeben, welches vom +Nutzer während der Hand-Auge-Kalibrierung gewählt wurde. In diesem +Fall bezieht das Modul alle notwendigen Informationen über die +Kameramontage und die kalibrierte Hand-Auge-Transformation automatisch +vom Modul Hand-Auge-Kalibrierung\:(Abschnitt \ref{handeye_calibration +:sect-handeye-calibration}). Für den Fall einer robotergeführten +Kamera ist vom Nutzer zusätzlich die jeweils aktuelle Roboterpose +robot_pose anzugeben. + +Zulässige Werte zur Angabe des Referenzkoordinatensystems sind +"camera" und "external". Andere Werte werden als ungültig +zurückgewiesen. + +Parameter + +Es stehen zwei getrennte Module für die Tagerkennung zur Verfügung, +eines für AprilTag- und eines für QR-Code-Erkennung: +"rc_april_tag_detect" bzw. "rc_qr_code_detect". Abgesehen vom +Modulnamen teilen beide die gleiche Schnittstellendefinition. + +Neben der + +REST-API-Schnittstelle + + stellen die TagDetect-Module außerdem Seiten in der Web GUI unter +Module ‣ AprilTag und Module ‣ QR Code bereit, über welche sie manuell +ausprobiert und konfiguriert werden können. + +Im Folgenden sind die Parameter am Beispiel von "rc_qr_code_detect" +aufgelistet. Sie gleichen denen von "rc_april_tag_detect". + +Dieses Softwaremodul bietet folgende Laufzeitparameter: + +Laufzeitparameter des rc_qr_code_detect-Moduls Name Typ +Min. Max. Default Beschreibung detect_inverted_tags bool false +true false Erkennt Tags, bei denen Schwarz und Weiß vertauscht sind +forget_after_n_detections int32 1 1000 30 Anzahl an +Erkennungsläufen, nach denen ein vorher gesehener Tag während der Tag- +Wiedererkennung verworfen wird max_corner_distance float64 0.001 +0.01 0.005 Maximale Distanz zusammengehöriger Ecken zweier Tags +während der Tag-Wiedererkennung quality string - - High Qualität +der Tagerkennung: [Low, Medium, High] use_cached_images bool false +true false Benutze das zuletzt empfangene Stereo-Bildpaar, anstatt +auf ein neues zu warten + +Über die REST-API können diese Parameter wie folgt gesetzt werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes//parameters/parameters?= + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes//parameters?= + +Statuswerte + +Die TagDetect-Module melden folgende Statuswerte: + +Statuswerte der rc_qr_code_detect- und rc_april_tag_detect-Module +Name Beschreibung data_acquisition_time Zeit in Sekunden, für die +beim letzten Aufruf auf Bilddaten gewartet werden musste +last_timestamp_processed Zeitstempel des letzten verarbeiteten +Bilddatensatzes processing_time Berechnungszeit für die letzte +Erkennung in Sekunden state Der aktuelle Zustand des Moduls + +Der Parameter "state" kann folgende Werte annehmen: + +Mögliche Zustände der TagDetect-Module Zustandsname Beschreibung +IDLE Das Modul ist inaktiv. RUNNING Das Modul läuft und ist bereit +zur Tagerkennung. FATAL Ein schwerwiegender Fehler ist aufgetreten. + +Services + +Die TagDetect-Module implementieren einen Zustandsautomaten, welcher +zum Starten und Stoppen genutzt werden kann. Die eigentliche +Tagerkennung kann mit "detect" ausgelöst werden. + +Die angebotenen Services von "rc_qr_code_detect" bzw. +"rc_april_tag_detect" können mithilfe der + +REST-API-Schnittstelle + + oder der + +rc_visard NG + + +Web GUI + + ausprobiert und getestet werden. + +detect + + löst eine Tagerkennung aus. + + Details + + Abhängig vom "use_cached_images"-Parameter arbeitet das Modul + auf dem zuletzt empfangenen Bildpaar (wenn *true*) oder wartet + auf ein Bildpaar, das nach dem Auslösen des Services aufgenommen + wurde (wenn *false*, dies ist das Standardverhalten). Auch wenn + der Parameter auf *true* steht, arbeitet die Tagerkennung + niemals mehrmals auf einem Bildpaar. + + Es wird empfohlen, "detect" nur im Zustand "RUNNING" aufzurufen. + Es ist jedoch auch im Zustand "IDLE" möglich, was zu einem + Autostart und -stop des Moduls führt. Dies hat allerdings + Nachteile: Erstens dauert der Aufruf deutlich länger, zweitens + funktioniert die Tag-Wiedererkennung nicht. Es wird daher + ausdrücklich empfohlen, das Modul manuell zu starten, bevor + "detect" aufgerufen wird. + + Tags können vom "detect"-Ergebnis aus mehreren Gründen + ausgeschlossen werden, z.B. falls ein Tag nur in einem der + Kamerabilder sichtbar war, oder falls die Posenschätzung + fehlschlug. Diese herausgefilterten Tags werden im Log + aufgelistet, auf welches wie in + + Download der Logdateien + + beschrieben zugegriffen werden kann. + + Auf den Web GUI-Seiten der TagDetect-Module wird eine + Visualisierung der letzten Tagerkennung bereitgestellt. Diese + Visualisierung wird allerdings erst angezeigt, sobald die + Tagerkennung mindestens einmal ausgeführt wurde. In der Web GUI + kann die Tagerkennung außerdem manuell ausprobiert werden, indem + die Detektieren-Schaltfläche betätigt wird. + + Aufgrund von Änderungen der Systemzeit auf dem + + rc_visard NG + + können Zeitsprünge auftreten, sowohl vorwärts als auch + rückwärts (siehe + + Zeitsynchronisierung + + ). Während Vorwärtssprünge keinen Einfluss auf die TagDetect- + Module haben, invalidieren Rücksprünge die bereits empfangenen + Bilder. Deshalb wird, wenn ein Rücksprung erkannt wird, Fehler + -102 beim nächsten "detect"-Aufruf zurückgegeben. Dies geschieht + auch, um den Benutzer darauf hinzuweisen, dass die Zeitstempel + in der "detect"-Antwort ebenso zurückspringen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes//services/detect + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes//services/detect + + Request + + Optionale Serviceargumente: + + "tags" bezeichnet die Liste der Tag-IDs, welche erkannt + werden sollen. Bei QR-Codes ist die ID gleich den enthaltenen + Daten. Bei AprilTags ist es *"_"*, also + beispielsweise *"36h11_5"* für Familie 36h11 und ID 5. + Natürlich kann das AprilTag-Modul nur zur Erkennung von + AprilTags und das QR-Code-Modul nur zur Erkennung von QR- + Codes genutzt werden. + + Die "tags"-Liste kann auch leer gelassen werden. In diesem + Fall werden alle erkannten Tags zurückgegeben. Dieses Feature + sollte nur während der Entwicklung einer Applikation oder zur + Fehlerbehebung benutzt werden. Wann immer möglich sollten die + konkreten Tag-IDs aufgelistet werden, zum einen zur + Vermeidung von Fehldetektionen, zum anderen auch um die + Tagerkennung zu beschleunigen, da nicht benötigte Tags + aussortiert werden können. + + Bei AprilTags kann der Benutzer nicht nur einzelne Tags, + sondern auch eine gesamte Familie spezifizieren, indem die ID + auf "" gesetzt wird, bspw. "36h11". Dadurch werden + alle Tags dieser Familie erkannt. Es ist auch möglich, + mehrere Familien oder eine Kombination aus Familien und + einzelnen Tags anzugeben. Zum Beispiel kann "detect" mit + "36h11", "25h9_3" und "36h10" zur gleichen Zeit aufgerufen + werden. + + Zusätzlich zur ID kann auch die ungefähre Größe (\pm 10\%) + eines Tags angegeben werden. Wie in + + Posenschätzung + + erklärt, verhilft dies Mehrdeutigkeiten aufzulösen, die in + bestimmten Situationen auftreten können, und kann zum + Herausfiltern von Tags genutzt werden, die nicht der + angegebenen Größe entsprechen. + + Die "tags"-Liste ist ODER-verknüpft. Es werden alle Tags + zurückgegeben, die mit einem der "id"-"size"-Paare in der + "tags"-Liste übereinstimmen. + + Das Feld "pose_frame" gibt an, ob die Posen im Kamera- oder + im externen Koordinatensystem zurückgegeben werden (siehe + + Hand-Auge-Kalibrierung + + . Der Standardwert ist "camera". + + Die Definition der *Request*-Argumente mit jeweiligen + Datentypen ist: + + { + "args": { + "pose_frame": "string", + "robot_pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "tags": [ + { + "id": "string", + "size": "float64" + } + ] + } + } + + Response + + "timestamp" wird auf den Zeitstempel des Bildpaares gesetzt, auf + dem die Tagerkennung gearbeitet hat. + + "tags" enthält alle erkannten Tags. + + "id" ist die ID des Tags, vergleichbar zur "id" in der Anfrage. + + "instance_id" ist der zufällige, eindeutige Identifikator eines + Tags, welcher von der Tag-Wiedererkennung zugewiesen wird. + + "pose" enthält "position" und "orientation". Die Orientierung + ist im Quaternionen-Format angegeben. + + "pose_frame" bezeichnet das Koordinatensystem, auf welches obige + Pose bezogen ist, und hat den Wert "camera" oder "external". + + "size" wird auf die gemessene Taggröße gesetzt. + + "return_code" enthält mögliche Warnungen oder Fehlercodes und + Nachrichten. + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "detect", + "response": { + "return_code": { + "message": "string", + "value": "int16" + }, + "tags": [ + { + "id": "string", + "instance_id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "size": "float64", + "timestamp": { + "nsec": "int32", + "sec": "int32" + } + } + ], + "timestamp": { + "nsec": "int32", + "sec": "int32" + } + } + } + +start + + startet das Modul durch einen Übergang von "IDLE" nach "RUNNING". + + Details + + Wenn das Modul läuft, empfängt es die Bilder der Stereokamera und + ist bereit, Tags zu erkennen. Um Rechenressourcen zu sparen, sollte + das Modul nur laufen, wenn dies nötig ist. + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes//services/start + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes//services/start + + Request + + Dieser Service hat keine Argumente. + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "start", + "response": { + "accepted": "bool", + "current_state": "string" + } + } + +stop + + stoppt das Modul durch einen Übergang zu "IDLE". + + Details + + Dieser Übergang kann auf dem Zustand "RUNNING" und "FATAL" + durchgeführt werden. Alle Tag-Wiedererkennungs-Informationen + werden beim Stoppen gelöscht. + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes//services/stop + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes//services/stop + + Request + + Dieser Service hat keine Argumente. + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "stop", + "response": { + "accepted": "bool", + "current_state": "string" + } + } + +restart + + startet das Modul neu. + + Details + + Wenn im Zustand "RUNNING" oder "FATAL", wird das Modul erst + gestoppt und dann wieder gestartet. In "IDLE" wird das Modul nur + gestartet. + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes//services/restart + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes//services/restart + + Request + + Dieser Service hat keine Argumente. + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "restart", + "response": { + "accepted": "bool", + "current_state": "string" + } + } + +reset_defaults + + stellt die Werkseinstellungen der Parameter dieses Moduls wieder + her und wendet sie an („factory reset“). + + Details + + Dieser Service kann wie folgt aufgerufen werden. + + API Version 2 + + PUT http:///api/v2/pipelines/0/nodes//services/reset_defaults + + API Version 1 (veraltet) + + PUT http:///api/v1/nodes//services/reset_defaults + + Request + + Dieser Service hat keine Argumente. + + Response + + Die Definition der *Response* mit jeweiligen Datentypen ist: + + { + "name": "reset_defaults", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +Rückgabecodes + +Zusätzlich zur eigentlichen Serviceantwort gibt jeder Service einen +sogenannten "return_code" bestehend aus einem Integer-Wert und einer +optionalen Textnachricht zurück. Erfolgreiche Service-Anfragen werden +mit einem Wert von "0" quittiert. Positive Werte bedeuten, dass die +Service-Anfrage zwar erfolgreich bearbeitet wurde, aber zusätzliche +Informationen zur Verfügung stehen. Negative Werte bedeuten, dass +Fehler aufgetreten sind. Für den Fall, dass mehrere Rückgabewerte +zutreffend wären, wird der kleinste zurückgegeben, und die +entsprechenden Textnachrichten werden in "return_code.message" +akkumuliert. + +Die folgende Tabelle listet die möglichen Rückgabe-Codes auf: + + Code Beschreibung 0 Erfolg -1 Ein ungültiges Argument + wurde übergeben. -4 Die maximale Wartezeit auf ein Stereo- + Bildpaar wurde überschritten. -9 Die Lizenz ist ungültig. -11 + Sensor nicht verbunden, nicht unterstützt oder nicht bereit -101 + Ein interner Fehler trat während der Tagerkennung auf. -102 Ein + Rückwärtssprung der Systemzeit trat auf -103 Ein interner Fehler + trat während der Posenschätzung auf. -200 Ein schwerwiegender + interner Fehler trat auf. 200 Mehrere Warnungen traten auf. Siehe + die Auflistung in message. 201 Das Modul war nicht im Zustand + RUNNING. diff --git a/v24.04/de/_sources/time_sync.rst.txt b/v24.04/de/_sources/time_sync.rst.txt new file mode 100644 index 0000000..ca6ec92 --- /dev/null +++ b/v24.04/de/_sources/time_sync.rst.txt @@ -0,0 +1,112 @@ +Zeitsynchronisierung + +Der + +rc_visard NG + + stellt für alle Bilder und Nachrichten Zeitstempel zur Verfügung. Um +diese mit der Zeit auf dem Applikations-Rechner zu vergleichen, muss +die Zeit synchronisiert werden. + + Dies kann über das Network Time Protocol (NTP), welches die + Standardeinstellung ist, oder über das Precision Time Protocol + (PTP) erfolgen. + +Die aktuelle Systemzeit sowie der Status der Zeitsynchronisierung +können über die + +REST-API + + abgerufen und darüber hinaus auch in der + +Web GUI + + auf der Seite + +System + + eingesehen werden. + +Bemerkung: Abhängig von der Erreichbarkeit von NTP- oder PTP- + Servern, kann es bis zu mehreren Minuten dauern, bis die Zeit + synchronisiert ist. + +NTP + +Das Network Time Protocol (NTP) ist ein TCP/IP Protokoll um Zeit über +ein Netzwerk zu synchronisieren. Im Wesentlichen fordert ein Client +die aktuelle Zeit periodisch von einem Server an und nutzt diese, um +seine eigene Uhr zu stellen bzw. zu korrigieren. + +Standardmäßig versucht der + +rc_visard NG + + den NTP-Server des NTP-Pool-Projekts zu erreichen, wozu eine +Verbindung zum Internet nötig ist. + +Falls die Netzwerkkonfiguration des + +rc_visard NG + + auf + +DHCP + + (entspricht der Werkseinstellung) konfiguriert ist, werden NTP-Server +auch vom DHCP-Server angefordert und verwendet. + +PTP + +Das Precision Time Protocol (PTP, auch als IEEE1588 bekannt) ist ein +Protokoll, welches eine genauere und robustere Synchronisation der +Uhren erlaubt als NTP. + +Der + +rc_visard + + kann als PTP-Slave konfiguriert werden. Dies ist über die Standard + +GigE Vision 2.0/GenICam-Schnittstelle + + mit dem Parameter "GevIEEE1588" möglich. + +Mindestens ein PTP-Master muss die Zeit im Netzwerk zur Verfügung +stellen. Unter Linux kann ein PTP-Master beispielsweise auf dem +Netzwerkport "eth0" gestartet werden mit "sudo ptpd --masteronly +--foreground -i eth0". + +Während der + +rc_visard + + mit einem PTP-Master synchronisiert ist (Sensor ist im PTP SLAVE- +Status), ist die Synchronisierung via NTP pausiert. + +Manuelles Setzen der Zeit + +Der + +rc_visard NG + + ermöglicht das manuelle Setzen des aktuellen Datums und der Uhrzeit +über den + +/system/time + + Endpoint der REST-API, wenn keine Zeitsynchronisation aktiv ist +(siehe + +System und Logs + +). Eine einfachere Möglichkeit zum Setzen der Systemzeit gibt es auf +der Seite + +System + + der + +Web GUI + + . diff --git a/v24.04/de/_sources/troubleshooting.rst.txt b/v24.04/de/_sources/troubleshooting.rst.txt new file mode 100644 index 0000000..66f732d --- /dev/null +++ b/v24.04/de/_sources/troubleshooting.rst.txt @@ -0,0 +1,337 @@ +Fehlerbehebung + +LED-Farben + +Während des Boot-Vorgangs wechselt die LED mehrmals die Farbe, um die +verschiedenen Boot-Phasen anzuzeigen: + +LED-Farbcodes LED-Farbe Boot-Vorgang Weiß Stromversorgung OK +Blau Normaler Boot-Vorgang Grün Boot-Vorgang abgeschlossen, +rc_visard NG einsatzbereit + +Die LED dient ferner dazu, Probleme oder Fehlerzustände zu +signalisieren, um den Benutzer im Rahmen der Problembehandlung zu +unterstützen. + +LED-Farbcodes LED-Farbe Problem oder Fehlerzustand Aus Der +Sensor wird nicht mit Strom versorgt. Kurzes rotes Blinken alle fünf +Sekunden Keine Netzwerkkonnektivität Rot Ein Prozess wurde beendet +und kann nicht neu gestartet werden. Gelb Temperaturwarnung +(Gehäusetemperatur liegt über 60 °C) + +Probleme mit der Hardware + +LED leuchtet nicht + +Der + +rc_visard NG + + fährt nicht hoch. + +Vergewissern Sie sich, dass alle Kabel ordentlich angeschlossen und +gesichert sind. + +Vergewissern Sie sich, dass eine geeignete Gleichstromquelle (18–30 V) +mit korrekter Polarität an den in der Spezifikation der +Steckerbelegung\:(Abschnitt \ref{hardware_spec:tab-power-pin- +assignments}) mit Stromzufuhr und Masse gekennzeichneten Pins +angeschlossen ist. Wird der Sensor außerhalb des angegebenen +Spannungsbereichs, mit Wechselstrom oder mit umgekehrter Polarität +betrieben, oder ist er an ein Versorgungsnetz angeschlossen, in dem +Spannungsspitzen auftreten, kann dies zu dauerhaften Hardware-Schäden +führen. + +LED leuchtet gelb, obwohl der Sensor anscheinend normal funktioniert + +Dies kann auf eine erhöhte Gehäusetemperatur hinweisen. Der Sensor ist +ggf. so montiert, dass die Luft die Kühlrippen nicht ungehindert +umströmen kann. + +Reinigen Sie die Kühlrippen und das Gehäuse. + +Stellen Sie sicher, dass in alle Richtungen um die Kühlrippen 10 cm +Platz sind, damit die konvektive Kühlung ordentlich funktioniert. + +Vergewissern Sie sich, dass die Umgebungstemperatur der Spezifikation +entspricht. + +Der Sensor kann die Verarbeitungsgeschwindigkeit drosseln wenn die +Kühlung nicht ausreicht oder die Umgebungstemperatur außerhalb des +zugelassenen Bereichs liegt. + +Probleme mit der Zuverlässigkeit und/oder mechanische Schäden + +Dies kann darauf hinweisen, dass die Umgebungsbedingungen +(Vibrationen, Erschütterungen, Schwingungen und Temperatur) außerhalb +der + +entsprechenden Spezifikationen + + liegen. + +Wird der rc_visard NG außerhalb der angegebenen Umgebungsbedingungen +betrieben, kann dies zu Schäden am Gerät und zum Erlöschen der +Garantie führen. + +Stromschlag bei Berührung des Sensors + +Dies deutet auf einen elektrischen Defekt im Sensor, in der +Verkabelung, im Netzteil oder im angrenzenden System hin. + +Schalten Sie das System unverzüglich aus, ziehen Sie alle Kabel und +lassen Sie die Einrichtung des Geräts durch einen qualifizierten +Elektriker überprüfen. + +Vergewissern Sie sich, dass das Sensorgehäuse ordentlich geerdet ist. +Prüfen Sie auf große Erdschleifen. + +Probleme mit der Konnektivität + +LED blinkt alle 5 Sekunden rot + +Wenn die LED alle fünf Sekunden kurz rot blinkt, kann der + +rc_visard NG + + keine Netzwerkverbindung herstellen. + +Überprüfen Sie, ob das Netzwerkkabel ordentlich mit dem rc_visard NG +und dem Netzwerk verbunden ist. + +Ist kein Problem erkennbar, tauschen Sie das Ethernet-Kabel aus. + +Die Kamera wird vom GigE Vision-Client oder vom rcdiscover-gui-Tool +nicht erkannt + +Überprüfen Sie, ob die LED an der Gerätefront des rc_visard NG alle +fünf Sekunden kurz blinkt (überprüfen Sie das Kabel, wenn dies der +Fall ist). + +Vergewissern Sie sich, dass der rc_visard NG an das gleiche Subnetz +angeschlossen ist (der Discovery-Mechanismus nutzt Broadcasts, die +nicht über verschiedene Subnetze funktionieren). + +Die Web GUI kann nicht aufgerufen werden + +Vergewissern Sie sich, dass der rc_visard NG eingeschaltet und an das +gleiche Subnetz wie der Host-Computer angeschlossen ist. + +Überprüfen Sie, ob die LED an der Gerätefront des rc_visard NG alle +fünf Sekunden kurz blinkt (überprüfen Sie das Kabel, wenn dies der +Fall ist). + +Überprüfen Sie, ob die rcdiscover-gui den Sensor erkennt. Gibt das +Tool an, dass der rc_visard NG nicht erreichbar ist, ist die +Netzwerkkonfiguration\:(Abschnitt \ref{installation:sect-network- +configuration}) des rc_visard NG fehlerhaft. + +Wird der rc_visard NG als unerreichbar angegeben, versuchen Sie, einen +Doppelklick auf den Geräteeintrag zu machen, um die Web GUI in einem +Browser zu öffnen. + +Funktioniert das nicht, versuchen Sie, die vom rc_visard NG gemeldete +IP-Adresse direkt als Zieladresse in den Browser einzugeben. + +Zu viele Web-GUI-Instanzen gleichzeitig geöffnet + +Die Web GUI verbraucht Verarbeitungsressourcen des + +rc_visard NG + +, um die zu übertragenden Bilder zu komprimieren und die regelmäßig +vom Browser zusammengestellten Statistiken auszugeben. Werden +gleichzeitig mehrere Instanzen der Web GUI auf einem oder mehreren +Rechnern geöffnet, so kann die Leistung des + +rc_visard NG + + stark abnehmen. Die Web GUI ist für Konfigurations- und +Validierungszwecke gedacht, nicht jedoch, um den + +rc_visard NG + + dauerhaft zu überwachen. + +Probleme mit den Kamerabildern + +Kamerabild ist zu hell + +Wenn die Kamera im manuellen Belichtungsmodus arbeitet, versuchen Sie, +die Belichtungszeit zu verkürzen (siehe Parameter, Abschnitt +\ref{stereo_camera:sect-cam-params}) oder + +schalten Sie auf automatische Belichtung um (siehe Parameter, +Abschnitt \ref{stereo_camera:sect-cam-params}). + +Kamerabild ist zu dunkel + +Wenn die Kamera im manuellen Belichtungsmodus arbeitet, versuchen Sie, +die Belichtungszeit zu verlängern (siehe Parameter, Abschnitt +\ref{stereo_camera:sect-cam-params}) oder + +schalten Sie auf automatische Belichtung um (siehe Parameter, +Abschnitt \ref{stereo_camera:sect-cam-params}). + +Kamerabild rauscht zu stark + +Große Gain-Faktoren verursachen ein Bildrauschen mit hoher Amplitude. +Wollen Sie das Bildrauschen verringern, + +verwenden Sie eine zusätzliche Lichtquelle, um die Lichtintensität der +Aufnahme zu erhöhen, oder + +stellen Sie eine größere maximale Autobelichtungszeit ein (siehe +Parameter, Abschnitt \ref{stereo_camera:sect-cam-params}). + +Kamerabild ist unscharf + +Überprüfen Sie, ob das Objekt zu nahe an der Linse liegt, und erhöhen +Sie bei Bedarf den Abstand zwischen dem Objekt und der Linse. + +Überprüfen Sie, ob die Kameralinsen verschmutzt sind, und reinigen Sie +diese bei Bedarf. + +Trifft keiner der vorstehenden Punkte zu, kann es sein, dass ein +schweres Hardware-Problem vorliegt. Bitte wenden Sie sich an den +Support\:(Abschnitt \ref{contact:sect-contact}). + +Kamerabild ist verschwommen + +Schnelle Bewegungen können in Kombination mit langen Belichtungszeiten +zu Unschärfe führen. Um Bewegungsunschärfe zu verringern, + +verringern Sie die Bewegungsgeschwindigkeit der Kamera, + +verringern Sie die Bewegungsgeschwindigkeit von Objekten im Sichtfeld +der Kamera oder + +verkürzen Sie die Belichtungszeit der Kameras (siehe Parameter, +Abschnitt \ref{stereo_camera:sect-cam-params}). + +Kamerabild ist verzerrt + +Überprüfen Sie, ob die Linsen verschmutzt sind, und reinigen Sie diese +bei Bedarf (siehe Reinigung der Kameralinsen, Abschnitt +\ref{maintenance:sect-lens-cleaning}). + +Trifft keiner der vorstehenden Punkte zu, kann es sein, dass ein +schweres Hardware-Problem vorliegt. Bitte wenden Sie sich an den +Support\:(Abschnitt \ref{contact:sect-contact}). + +Bildwiederholrate ist zu niedrig + +Erhöhen Sie die Bildwiederholrate gemäß den Anweisungen in +Parameter\:(Abschnitt \ref{stereo_camera:sect-cam-params}). + +Die maximale Bildwiederholrate der Kameras beträgt 25 Hz. + +Probleme mit Tiefen-/Disparitäts-, Fehler- oder Konfidenzbildern + +Die folgenden Hinweise gelten auch für Fehler- und Konfidenzbilder, da +sie direkt mit den Disparitätsbildern zusammenhängen. + +Disparitätsbild spärlich befüllt oder leer + +Überprüfen Sie, ob die Kamerabilder gut belichtet und scharf sind. +Befolgen Sie bei Bedarf die Anweisungen in Probleme mit den +Kamerabildern\:(Abschnitt \ref{troubleshooting:sect-camera-issues}). + +Überprüfen Sie, ob die Szene genügend Textur hat (siehe Stereo- +Matching, Abschnitt \ref{stereo_matching:sect-stereo-matching}) und +installieren Sie bei Bedarf einen Musterprojektor. + +Senken Sie den Minimalen Abstand\:(Abschnitt \ref{stereo_matching +:sect-disp-image-parameters}). + +Erhöhen Sie den Maximalen Abstand\:(Abschnitt \ref{stereo_matching +:sect-disp-image-parameters}). + +Überprüfen Sie, ob das Objekt zu nahe an der Kamera liegt. Beachten +Sie die unterschiedlichen Tiefenmessbereiche der Kameravarianten. + +Senken Sie die Minimale Konfidenz\:(Abschnitt \ref{stereo_matching +:sect-disp-image-parameters}). + +Erhöhen Sie den Maximalen Fehler\:(Abschnitt \ref{stereo_matching +:sect-disp-image-parameters}). + +Wählen Sie eine geringere Qualität des Disparitätsbilds\:(Abschnitt +\ref{stereo_matching:sect-disp-image-parameters}). Disparitätsbilder +mit einer geringeren Auflösung sind in der Regel nicht so spärlich +befüllt. + +Überprüfen Sie die Kalibrierung der Kameras und führen Sie bei Bedarf +eine Neukalibrierung durch (siehe Kamerakalibrierung, Abschnitt +\ref{camera_calibration:sect-camera-calibration}). + +Bildwiederholrate der Disparitätsbilder ist zu niedrig + +Überprüfen und erhöhen Sie die Bildwiederholrate der Kamerabilder +(siehe Parameter, Abschnitt \ref{stereo_camera:sect-cam-params}). Die +Bildwiederholrate der Disparitätsbilder kann nicht größer sein als die +Bildwiederholrate der Kamerabilder. + +Wählen Sie eine geringere Qualität des Disparitätsbilds\:(Abschnitt +\ref{stereo_matching:sect-disp-image-parameters}). + +Erhöhen Sie den Minimalen Abstand\:(Abschnitt \ref{stereo_matching +:sect-disp-image-parameters}) so viel wie für die Applikation möglich. + +Disparitätsbild zeigt keine nahe liegenden Objekte + +Überprüfen Sie, ob das Objekt zu nahe an der Linse liegt. Beachten Sie +die unterschiedlichen Tiefenmessbereiche der Kameravarianten. + +Senken Sie den Minimalen Abstand\:(Abschnitt \ref{stereo_matching +:sect-disp-image-parameters}). + +Disparitätsbild zeigt keine weit entfernten Objekte + +Erhöhen Sie den Maximalen Abstand\:(Abschnitt \ref{stereo_matching +:sect-disp-image-parameters}). + +Erhöhen Sie den Maximalen Fehler\:(Abschnitt \ref{stereo_matching +:sect-disp-image-parameters}). + +Senken Sie die Minimale Konfidenz\:(Abschnitt \ref{stereo_matching +:sect-disp-image-parameters}). + +Disparitätsbild rauscht zu stark + +Erhöhen Sie den Segmentierungswert\:(Abschnitt \ref{stereo_matching +:sect-disp-image-parameters}). + +Erhöhen Sie den Füllen-Wert\:(Abschnitt \ref{stereo_matching:sect- +disp-image-parameters}). + +Disparitätswerte oder resultierende Tiefenwerte sind zu ungenau + +Verringern Sie den Abstand zwischen der Kamera und der Szene. Der +Tiefenmessfehler nimmt quadratisch mit dem Abstand zu den Kameras zu. + +Überprüfen Sie, ob die Szene wiederkehrende Muster enthält und +entfernen Sie diese bei Bedarf. Diese könnten falsche +Disparitätsmessungen verursachen. + +Disparitätsbild ist zu glatt + +Senken Sie den Füllen-Wert\:(Abschnitt \ref{stereo_matching:sect-disp- +image-parameters}). + +Disparitätsbild zeigt keine feinen Strukturen + +Senken Sie den Segmentierungswert\:(Abschnitt \ref{stereo_matching +:sect-disp-image-parameters}). + +Senken Sie den Füllen-Wert\:(Abschnitt \ref{stereo_matching:sect-disp- +image-parameters}). + +Probleme mit GigE Vision/GenICam + +Keine Bilder + +Überprüfen Sie, ob die Bildkomponenten aktiviert sind. Siehe +ComponentSelector und ComponentEnable in Wichtige Parameter der +GenICam-Schnittstelle\:(Abschnitt \ref{gigevision:sect-genicam- +params}). diff --git a/v24.04/de/_sources/userspace.rst.txt b/v24.04/de/_sources/userspace.rst.txt new file mode 100644 index 0000000..4dfd813 --- /dev/null +++ b/v24.04/de/_sources/userspace.rst.txt @@ -0,0 +1,125 @@ +UserSpace + +Der UserSpace ermöglicht es Benutzern, Container auf dem + +rc_visard NG + + bereitzustellen und zu verwalten. Es werden Standalone-Container und +docker-compose Stacks unterstützt. + +Bemerkung: Kenntnisse von Docker-Containern werden vorausgesetzt. + +Falls der UserSpace verfügbar und aktiviert ist, kann er durch Klicken +des Menüeintrags + +UserSpace + + in der + +Web GUI + + angesteuert werden. Diese Seite zeigt die laufenden Apps und +Container mit ihrem aktuellen Status und, falls verfügbar, einem +Health-Check. Jeder Container listet die veröffentlichten Ports. Falls +deren Protokoll http oder https ist, können diese Container direkt in +der Web GUI erreicht werden. + +Konfiguration + +Wenn der UserSpace zum ersten Mal aktiviert wird, muss ein Benutzer +für + +Portainer + + erstellt werden: Navigieren Sie in der + +Web GUI + + zu + +UserSpace + + und klicken Sie auf + +UserSpace Apps verwalten + +. Anschließend registrieren Sie das Benutzerkonto des Administrators. +Dieser Schritt muss innerhalb von fünf Minuten abgeschlossen werden, +nachdem der + +rc_visard NG + + hochgefahren wurde. + +Netzwerkzugriff auf die UserSpace Anwendungen + +Um die Container über Netzwerk zu erreichen, müssen die Container- +Ports für den Host veröffentlicht sein. + +UserSpace Informationen einschließlich laufender Apps und ihre +veröffentlichten Ports können über den + +REST-API userspace Endpunkt + + abgefragt werden, oder in der + +Web GUI + + im Menü unter + +UserSpace + + angezeigt werden. + +Alle Ports, die für den Host veröffentlicht sind, werden mit ihrem +Protokoll (UDP oder TCP) aufgelistet. Um ein Protokoll explizit für +einen App-Port zu setzen (z.B. http oder https), können Container- +Labels verwendet werden: + +com.roboception.app.http: alle öffentlichen TCP-Ports nutzen http + +com.roboception.app.https.port=1234,5678: Komma-separierte Liste mit +https-Ports + +Schnittstellen + +Im UserSpace verwaltete Container können auf öffentliche +Schnittstellen des + +rc_visard NG + + zugreifen. Insbesondere können die Container über + +gRPC + + auf die Bilddaten zugreifen und die + +REST-API-Schnittstelle + + aufrufen. Auf den + +rc_visard NG + + (den Host) kann durch die Docker-Bridge-IP zugegriffen werden (im +Standard-Docker-Bridge-Netzwerk 172.17.0.1). + +Einschränkungen + +Container unterliegen bestimmten Einschränkungen: + +Container können nicht privilegiert ausgeführt werden. + +Keinen Zugriff auf das Host-Netzwerk (das Docker Bridge-Netzwerk wird +benutzt). + +Nur Pfade innerhalb geklonter git Repositories mit einem docker- +compose Stack können eingebunden werden, alle anderen Hostpfade nicht. + +Auf Hostgeräte kann nicht zugegriffen werden. Dazu gehören z.B USB- +und GPU-Geräte. + +System Ports und intern verwendete Ports des Hosts können nicht +gebunden werden. Dazu gehören Ports unter 1024, Ports von 4200 bis +4299 und die Ports 2342, 2343, 2344, 2345, 3956, 4840, 5353, 6379, +7000, 7001, 7002, 7003, 9100, 9118, 9256, 9445, 9446, 11311, 22350, +22352, 50010, 50051, 50052, 50053 und 50054. diff --git a/v24.04/de/_sources/warranty.rst.txt b/v24.04/de/_sources/warranty.rst.txt new file mode 100644 index 0000000..6e3d435 --- /dev/null +++ b/v24.04/de/_sources/warranty.rst.txt @@ -0,0 +1,42 @@ +Garantie + +Jede Änderung oder Modifikation der Hard- oder Software dieses +Produkts, die nicht ausdrücklich von Roboception genehmigt wurde, kann +zum Verlust der Gewährleistungs- und Garantierechte führen. + +Warnung: Der + + rc_visard NG + + arbeitet mit komplexer Hardware- und Software-Technologie, die sich + ggf. nicht immer so verhält, wie es der Benutzer beabsichtigt. Der + Käufer muss seine Anwendung so gestalten, dass eine Fehlfunktion des + + rc_visard NG + + nicht zu Körperverletzungen, Sachschäden oder anderen Verlusten + führt. + +Warnung: Der + + rc_visard NG + + darf nicht zerlegt, geöffnet, instand gesetzt oder verändert + werden, da dies eine Stromschlaggefahr oder andere Risiken nach sich + ziehen kann. Kann nachgewiesen werden, dass der Benutzer versucht + hat, das Gerät zu öffnen und/oder zu modifizieren, erlischt die + Garantie. Dies gilt auch, wenn Typenschilder beschädigt, entfernt + oder unkenntlich gemacht wurden. + +Warnung: VORSICHT: Gemäß den europäischen CE-Anforderungen müssen + alle Kabel, die zum Anschluss dieses Geräts verwendet werden, + abgeschirmt und geerdet sein. Der Betrieb mit falschen Kabeln kann + zu Interferenzen mit anderen Geräten oder zu einem unerwünschten + Verhalten des Produkts führen. + +Bemerkung: Dieses Produkt darf nicht über den Hausmüll entsorgt + werden. Durch die korrekte Entsorgung des Produkts tragen Sie zum + Umweltschutz bei. Nähere Informationen zur Wiederverwertung des + Produkts erhalten Sie bei den zuständigen Behörden, bei Ihrem + Entsorgungsunternehmen oder beim Händler, bei dem Sie das Produkt + erworben haben. diff --git a/v24.04/de/_sources/webgui.rst.txt b/v24.04/de/_sources/webgui.rst.txt new file mode 100644 index 0000000..7b076ed --- /dev/null +++ b/v24.04/de/_sources/webgui.rst.txt @@ -0,0 +1,259 @@ +Web GUI + +Die Web GUI des + +rc_visard NG + + dient dazu, das Gerät zu testen, zu kalibrieren und zu konfigurieren. + +Zugriff auf die Web GUI + +Auf die Web GUI kann über die IP-Adresse des + +rc_visard NG + + von jedem Webbrowser aus zugegriffen werden, z.B. Firefox, Google +Chrome oder Microsoft Edge. Am einfachsten lässt sich die Web GUI über +die "rcdiscover-gui" aufrufen, wenn, wie in + +Aufspüren von rc_visard NG-Geräten + + beschrieben, ein Doppelklick auf das gewünschte Gerät vorgenommen +wird. + +Alternativ konfigurieren einige Netzwerkumgebungen den eindeutigen +Host-Namen des + +rc_visard NG + + automatisch in ihrem Domain Name Server ( + +DNS + +). In diesem Fall kann die Web GUI auch direkt über folgende + +URL + + aufgerufen werden: "http://", wobei der Platzhalter +"" gegen den Host-Namen des Geräts auszutauschen ist. + +Für Linux und macOS funktioniert das ohne DNS über das Multicast-DNS- +Protokoll ( + +mDNS + +), das automatisch aktiviert wird, wenn ".local" zum Host-Namen +hinzugefügt wird. So wird die URL einfach zu: "http://.local". + +Kennenlernen der Web GUI + +Die Dashboard-Seite der Web GUI enthält die wichtigsten Informationen +über das Gerät und die Softwaremodule. + + +Über das Menü kann auf die einzelnen Seiten der Web GUI des + +rc_visard NG + + zugegriffen werden: + +Kamera + + zeigt einen Live-Stream der rektifizierten Kamerabilder. Die + Bildwiederholrate lässt sich reduzieren, um Bandbreite zu sparen, + wenn über einen GigE Vision®-Client gestreamt wird. Außerdem lässt + sich die Belichtung manuell oder automatisch einstellen. Für nähere + Informationen siehe + + Parameter + + . + +Tiefenbild + + bietet einen Live-Stream der rektifizierten Bilder der linken + Kamera sowie Disparitäts- und Konfidenzbilder. Auf der Seite lassen + sich verschiedene Einstellungen zur Berechnung und Filterung von + Tiefenbildern vornehmen. Für nähere Informationen siehe + + Parameter + + . + +Module + + ermöglicht den Zugriff auf die Detektionsmodule des + + rc_visard NG + + (siehe + + Detektionsmodule + + ). + +Konfiguration + ermöglicht den Zugriff auf die Konfigurationsmodule des + + rc_visard NG + + (siehe + + Konfigurationsmodule + + ). + +Datenbank + + ermöglicht den Zugriff auf die Datenbankmodule des + + rc_visard NG + + (siehe + + Datenbankmodule + + ). + +System + + ermöglicht dem Nutzer den Zugriff auf allgemeine + Systemeinstellungen, Informationen zum Gerät und den Log-Dateien, + sowie die Möglichkeit, die Firmware oder Lizenzdatei zu + aktualisieren. + +Bemerkung: Weitere Informationen zu den einzelnen Parametern der Web + GUI lassen sich über die jeweils daneben angezeigte Schaltfläche + + Info + + aufrufen. + +Web GUI Zugriffskontrolle + +Die Web GUI bietet einen simplen Mechanismus das User Interface zu +sperren um beiläufige und unbeabsichtigte Änderungen zu vermeiden. + +Beim aktivieren der Web GUI Zugriffskontrolle über die + +System + + Seite muss ein Passwort gesetzt werden. Jetzt ist die Web GUI in +einem gesperrten Zustand wie das Schloss Symbol in der Kopfleiste +anzeigt. Alle Seiten, Kamerabilder, Parameter und Detektionen können +wie gewohnt eingesehen werden, Änderungen sind aber nicht möglich. + +Um die Web GUI temporär zu entsperren und Änderungen vorzunehmen, +klicken Sie das Schloss Symbol und geben Sie das Passwort ein. Während +das aktivieren und deaktivieren der Web GUI Zugriffskontrolle jeden +betrifft der diesen + +rc_visard NG + + nutzt, ist das Entsperren nur pro Browser gültig und wird durch das +Symbol mit dem offenen Schloss angezeigt. Nach 10 Minutuen Inaktivität +wird es automatisch wieder gesperrt. + +Die Web GUI Zugriffskontrolle kann auf der + +System + + Seite wieder deaktiviert werden nachdem das aktuelle Passwort +angegeben wurde. + +Warnung: Dies ist keine Sicherheitsfunktion! Es sperrt nur die Web + GUI und nicht die REST-API. Es ist dazu gedacht um unbeabsichtigte + und beiläufige Änderungen, z.B. über einen angeschlossenen + Bildschirm, zu verhindern. + +Bemerkung: Im Fall eines vergessenen Passworts kann die + Zugriffskontrolle über die REST-API mit + + delete ui_lock + + zurückgesetzt und deaktiviert werden. + +Herunterladen von Kamerabildern + +Die Web GUI bietet eine einfache Möglichkeit, einen Schnappschuss der +aktuellen Szene als .tar.gz-Datei zu speichern. Dazu dient das +Kamerasymbol unterhalb der Live-Streams auf der Seite + +Kamera + +. Dieser Schnappschuss beinhaltet: + +die rektifizierten Kamerabilder in voller Auflösung als .png-Dateien, + +eine Kameraparameter-Datei mit Kameramatrix, Bildabmessungen, +Belichtungszeit, Verstärkungsfaktor und Basisabstand der Kameras. + +die aktuellen IMU-Messungen als imu.csv-Datei, + +eine pipeline_status.json-Datei mit Informationen aller 3D-Kamera-, +Detektions- und Konfigurationsmodule, die auf dem rc_visard NG laufen, + +eine backup.json-Datei mit den Einstellungen des rc_visard NG +einschließlich konfigurierter Greifer, Load Carrier und Regions of +Interest, + +eine system_info.json-Datei mit Systeminformationen des rc_visard NG. + +Die Dateinamen enthalten die Zeitstempel. + +Herunterladen von Tiefenbildern und Punktwolken + +Die Web GUI bietet eine einfache Möglichkeit, die Tiefendaten der +aktuellen Szene als .tar.gz-Datei zu speichern. Dazu dient das +Kamerasymbol unterhalb der Live-Streams auf der Seite + +Tiefenbild + +. Dieser Schnappschuss beinhaltet: + +die rektifizierten linken und rechten Kamerabilder in voller Auflösung +als .png-Dateien, + +eine Parameterdatei für das linke Kamerabild mit Kameramatrix, +Bildabmessungen, Belichtungszeit, Verstärkungsfaktor und Basisabstand +der Kameras, + +die Disparitäts-, Fehler- und Konfidenzbilder in der Auflösung, die +der aktuell eingestellten Qualität entspricht, als .png-Dateien, + +eine Parameterdatei zum Disparitätsbild mit Kameramatrix, +Bildabmessungen, Belichtungszeit, Verstärkungsfaktor und Basisabstand +der Kameras, sowie Informationen über die Disparitätswerte (ungültige +Werte, Skalierung, Offset), + +die aktuellen IMU-Messungen als imu.csv-Datei, + +eine pipeline_status.json-Datei mit Informationen aller 3D-Kamera-, +Detektions- und Konfigurationsmodule, die auf dem rc_visard NG laufen, + +eine backup.json-Datei mit den Einstellungen des rc_visard NG +einschließlich konfigurierter Greifer, Load Carrier und Regions of +Interest, + +eine system_info.json-Datei mit Systeminformationen des rc_visard NG. + +Die Dateinamen enthalten die Zeitstempel. + +Durch Klick auf das Mesh-Symbol unterhalb der Live-Streams auf der +Seite + +Tiefenbild + + kann man einen Schnappschuss herunterladen, der zusätzlich ein Mesh +der Punktwolke in der aktuell eingestellten Auflösung (Qualität) als +>>*<<.ply Datei enthält. + +Bemerkung: Das Herunterladen der Tiefenbilder löst eine Bildaufnahme + aus, in der gleichen Weise wie ein Klick auf den "Aufnehmen"-Button + auf der + + Tiefenbild + + -Seite der Web GUI. Dies kann einen Einfluss auf laufende + Anwendungen haben. diff --git a/v24.04/de/_static/_stemmer.js b/v24.04/de/_static/_stemmer.js new file mode 100644 index 0000000..4f1dc1c --- /dev/null +++ b/v24.04/de/_static/_stemmer.js @@ -0,0 +1,2506 @@ +// generatedy by JSX compiler 0.9.89 (2014-05-20 06:01:03 +0900; 8e8c6105f36f3dfe440ea026a3c93a3444977102) +var JSX = {}; +(function (JSX) { +/** + * extends the class + */ +function $__jsx_extend(derivations, base) { + var ctor = function () {}; + ctor.prototype = base.prototype; + var proto = new ctor(); + for (var i in derivations) { + derivations[i].prototype = proto; + } +} + +/** + * copies the implementations from source interface to target + */ +function $__jsx_merge_interface(target, source) { + for (var k in source.prototype) + if (source.prototype.hasOwnProperty(k)) + target.prototype[k] = source.prototype[k]; +} + +/** + * defers the initialization of the property + */ +function $__jsx_lazy_init(obj, prop, func) { + function reset(obj, prop, value) { + delete obj[prop]; + obj[prop] = value; + return value; + } + + Object.defineProperty(obj, prop, { + get: function () { + return reset(obj, prop, func()); + }, + set: function (v) { + reset(obj, prop, v); + }, + enumerable: true, + configurable: true + }); +} + +var $__jsx_imul = Math.imul; +if (typeof $__jsx_imul === "undefined") { + $__jsx_imul = function (a, b) { + var ah = (a >>> 16) & 0xffff; + var al = a & 0xffff; + var bh = (b >>> 16) & 0xffff; + var bl = b & 0xffff; + return ((al * bl) + (((ah * bl + al * bh) << 16) >>> 0)|0); + }; +} + +/** + * fused int-ops with side-effects + */ +function $__jsx_ipadd(o, p, r) { + return o[p] = (o[p] + r) | 0; +} +function $__jsx_ipsub(o, p, r) { + return o[p] = (o[p] - r) | 0; +} +function $__jsx_ipmul(o, p, r) { + return o[p] = $__jsx_imul(o[p], r); +} +function $__jsx_ipdiv(o, p, r) { + return o[p] = (o[p] / r) | 0; +} +function $__jsx_ipmod(o, p, r) { + return o[p] = (o[p] % r) | 0; +} +function $__jsx_ippostinc(o, p) { + var v = o[p]; + o[p] = (v + 1) | 0; + return v; +} +function $__jsx_ippostdec(o, p) { + var v = o[p]; + o[p] = (v - 1) | 0; + return v; +} + +/** + * non-inlined version of Array#each + */ +function $__jsx_forEach(o, f) { + var l = o.length; + for (var i = 0; i < l; ++i) + f(o[i]); +} + +/* + * global functions, renamed to avoid conflict with local variable names + */ +var $__jsx_parseInt = parseInt; +var $__jsx_parseFloat = parseFloat; +function $__jsx_isNaN(n) { return n !== n; } +var $__jsx_isFinite = isFinite; + +var $__jsx_encodeURIComponent = encodeURIComponent; +var $__jsx_decodeURIComponent = decodeURIComponent; +var $__jsx_encodeURI = encodeURI; +var $__jsx_decodeURI = decodeURI; + +var $__jsx_ObjectToString = Object.prototype.toString; +var $__jsx_ObjectHasOwnProperty = Object.prototype.hasOwnProperty; + +/* + * profiler object, initialized afterwards + */ +function $__jsx_profiler() { +} + +/* + * public interface to JSX code + */ +JSX.require = function (path) { + var m = $__jsx_classMap[path]; + return m !== undefined ? m : null; +}; + +JSX.profilerIsRunning = function () { + return $__jsx_profiler.getResults != null; +}; + +JSX.getProfileResults = function () { + return ($__jsx_profiler.getResults || function () { return {}; })(); +}; + +JSX.postProfileResults = function (url, cb) { + if ($__jsx_profiler.postResults == null) + throw new Error("profiler has not been turned on"); + return $__jsx_profiler.postResults(url, cb); +}; + +JSX.resetProfileResults = function () { + if ($__jsx_profiler.resetResults == null) + throw new Error("profiler has not been turned on"); + return $__jsx_profiler.resetResults(); +}; +JSX.DEBUG = false; +var GeneratorFunction$0 = +(function () { + try { + return Function('import {GeneratorFunction} from "std:iteration"; return GeneratorFunction')(); + } catch (e) { + return function GeneratorFunction () {}; + } +})(); +var __jsx_generator_object$0 = +(function () { + function __jsx_generator_object() { + this.__next = 0; + this.__loop = null; + this.__seed = null; + this.__value = undefined; + this.__status = 0; // SUSPENDED: 0, ACTIVE: 1, DEAD: 2 + } + + __jsx_generator_object.prototype.next = function (seed) { + switch (this.__status) { + case 0: + this.__status = 1; + this.__seed = seed; + + // go next! + this.__loop(this.__next); + + var done = false; + if (this.__next != -1) { + this.__status = 0; + } else { + this.__status = 2; + done = true; + } + return { value: this.__value, done: done }; + case 1: + throw new Error("Generator is already running"); + case 2: + throw new Error("Generator is already finished"); + default: + throw new Error("Unexpected generator internal state"); + } + }; + + return __jsx_generator_object; +}()); +function Among(s, substring_i, result) { + this.s_size = s.length; + this.s = s; + this.substring_i = substring_i; + this.result = result; + this.method = null; + this.instance = null; +}; + +function Among$0(s, substring_i, result, method, instance) { + this.s_size = s.length; + this.s = s; + this.substring_i = substring_i; + this.result = result; + this.method = method; + this.instance = instance; +}; + +$__jsx_extend([Among, Among$0], Object); +function Stemmer() { +}; + +$__jsx_extend([Stemmer], Object); +function BaseStemmer() { + var current$0; + var cursor$0; + var limit$0; + this.cache = ({ }); + current$0 = this.current = ""; + cursor$0 = this.cursor = 0; + limit$0 = this.limit = current$0.length; + this.limit_backward = 0; + this.bra = cursor$0; + this.ket = limit$0; +}; + +$__jsx_extend([BaseStemmer], Stemmer); +BaseStemmer.prototype.setCurrent$S = function (value) { + var current$0; + var cursor$0; + var limit$0; + current$0 = this.current = value; + cursor$0 = this.cursor = 0; + limit$0 = this.limit = current$0.length; + this.limit_backward = 0; + this.bra = cursor$0; + this.ket = limit$0; +}; + + +function BaseStemmer$setCurrent$LBaseStemmer$S($this, value) { + var current$0; + var cursor$0; + var limit$0; + current$0 = $this.current = value; + cursor$0 = $this.cursor = 0; + limit$0 = $this.limit = current$0.length; + $this.limit_backward = 0; + $this.bra = cursor$0; + $this.ket = limit$0; +}; + +BaseStemmer.setCurrent$LBaseStemmer$S = BaseStemmer$setCurrent$LBaseStemmer$S; + +BaseStemmer.prototype.getCurrent$ = function () { + return this.current; +}; + + +function BaseStemmer$getCurrent$LBaseStemmer$($this) { + return $this.current; +}; + +BaseStemmer.getCurrent$LBaseStemmer$ = BaseStemmer$getCurrent$LBaseStemmer$; + +BaseStemmer.prototype.copy_from$LBaseStemmer$ = function (other) { + this.current = other.current; + this.cursor = other.cursor; + this.limit = other.limit; + this.limit_backward = other.limit_backward; + this.bra = other.bra; + this.ket = other.ket; +}; + + +function BaseStemmer$copy_from$LBaseStemmer$LBaseStemmer$($this, other) { + $this.current = other.current; + $this.cursor = other.cursor; + $this.limit = other.limit; + $this.limit_backward = other.limit_backward; + $this.bra = other.bra; + $this.ket = other.ket; +}; + +BaseStemmer.copy_from$LBaseStemmer$LBaseStemmer$ = BaseStemmer$copy_from$LBaseStemmer$LBaseStemmer$; + +BaseStemmer.prototype.in_grouping$AIII = function (s, min, max) { + var ch; + var $__jsx_postinc_t; + if (this.cursor >= this.limit) { + return false; + } + ch = this.current.charCodeAt(this.cursor); + if (ch > max || ch < min) { + return false; + } + ch -= min; + if ((s[ch >>> 3] & 0x1 << (ch & 0x7)) === 0) { + return false; + } + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + return true; +}; + + +function BaseStemmer$in_grouping$LBaseStemmer$AIII($this, s, min, max) { + var ch; + var $__jsx_postinc_t; + if ($this.cursor >= $this.limit) { + return false; + } + ch = $this.current.charCodeAt($this.cursor); + if (ch > max || ch < min) { + return false; + } + ch -= min; + if ((s[ch >>> 3] & 0x1 << (ch & 0x7)) === 0) { + return false; + } + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + return true; +}; + +BaseStemmer.in_grouping$LBaseStemmer$AIII = BaseStemmer$in_grouping$LBaseStemmer$AIII; + +BaseStemmer.prototype.in_grouping_b$AIII = function (s, min, max) { + var ch; + var $__jsx_postinc_t; + if (this.cursor <= this.limit_backward) { + return false; + } + ch = this.current.charCodeAt(this.cursor - 1); + if (ch > max || ch < min) { + return false; + } + ch -= min; + if ((s[ch >>> 3] & 0x1 << (ch & 0x7)) === 0) { + return false; + } + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t - 1) | 0, $__jsx_postinc_t); + return true; +}; + + +function BaseStemmer$in_grouping_b$LBaseStemmer$AIII($this, s, min, max) { + var ch; + var $__jsx_postinc_t; + if ($this.cursor <= $this.limit_backward) { + return false; + } + ch = $this.current.charCodeAt($this.cursor - 1); + if (ch > max || ch < min) { + return false; + } + ch -= min; + if ((s[ch >>> 3] & 0x1 << (ch & 0x7)) === 0) { + return false; + } + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t - 1) | 0, $__jsx_postinc_t); + return true; +}; + +BaseStemmer.in_grouping_b$LBaseStemmer$AIII = BaseStemmer$in_grouping_b$LBaseStemmer$AIII; + +BaseStemmer.prototype.out_grouping$AIII = function (s, min, max) { + var ch; + var $__jsx_postinc_t; + if (this.cursor >= this.limit) { + return false; + } + ch = this.current.charCodeAt(this.cursor); + if (ch > max || ch < min) { + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + return true; + } + ch -= min; + if ((s[ch >>> 3] & 0X1 << (ch & 0x7)) === 0) { + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + return true; + } + return false; +}; + + +function BaseStemmer$out_grouping$LBaseStemmer$AIII($this, s, min, max) { + var ch; + var $__jsx_postinc_t; + if ($this.cursor >= $this.limit) { + return false; + } + ch = $this.current.charCodeAt($this.cursor); + if (ch > max || ch < min) { + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + return true; + } + ch -= min; + if ((s[ch >>> 3] & 0X1 << (ch & 0x7)) === 0) { + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + return true; + } + return false; +}; + +BaseStemmer.out_grouping$LBaseStemmer$AIII = BaseStemmer$out_grouping$LBaseStemmer$AIII; + +BaseStemmer.prototype.out_grouping_b$AIII = function (s, min, max) { + var ch; + var $__jsx_postinc_t; + if (this.cursor <= this.limit_backward) { + return false; + } + ch = this.current.charCodeAt(this.cursor - 1); + if (ch > max || ch < min) { + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t - 1) | 0, $__jsx_postinc_t); + return true; + } + ch -= min; + if ((s[ch >>> 3] & 0x1 << (ch & 0x7)) === 0) { + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t - 1) | 0, $__jsx_postinc_t); + return true; + } + return false; +}; + + +function BaseStemmer$out_grouping_b$LBaseStemmer$AIII($this, s, min, max) { + var ch; + var $__jsx_postinc_t; + if ($this.cursor <= $this.limit_backward) { + return false; + } + ch = $this.current.charCodeAt($this.cursor - 1); + if (ch > max || ch < min) { + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t - 1) | 0, $__jsx_postinc_t); + return true; + } + ch -= min; + if ((s[ch >>> 3] & 0x1 << (ch & 0x7)) === 0) { + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t - 1) | 0, $__jsx_postinc_t); + return true; + } + return false; +}; + +BaseStemmer.out_grouping_b$LBaseStemmer$AIII = BaseStemmer$out_grouping_b$LBaseStemmer$AIII; + +BaseStemmer.prototype.in_range$II = function (min, max) { + var ch; + var $__jsx_postinc_t; + if (this.cursor >= this.limit) { + return false; + } + ch = this.current.charCodeAt(this.cursor); + if (ch > max || ch < min) { + return false; + } + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + return true; +}; + + +function BaseStemmer$in_range$LBaseStemmer$II($this, min, max) { + var ch; + var $__jsx_postinc_t; + if ($this.cursor >= $this.limit) { + return false; + } + ch = $this.current.charCodeAt($this.cursor); + if (ch > max || ch < min) { + return false; + } + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + return true; +}; + +BaseStemmer.in_range$LBaseStemmer$II = BaseStemmer$in_range$LBaseStemmer$II; + +BaseStemmer.prototype.in_range_b$II = function (min, max) { + var ch; + var $__jsx_postinc_t; + if (this.cursor <= this.limit_backward) { + return false; + } + ch = this.current.charCodeAt(this.cursor - 1); + if (ch > max || ch < min) { + return false; + } + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t - 1) | 0, $__jsx_postinc_t); + return true; +}; + + +function BaseStemmer$in_range_b$LBaseStemmer$II($this, min, max) { + var ch; + var $__jsx_postinc_t; + if ($this.cursor <= $this.limit_backward) { + return false; + } + ch = $this.current.charCodeAt($this.cursor - 1); + if (ch > max || ch < min) { + return false; + } + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t - 1) | 0, $__jsx_postinc_t); + return true; +}; + +BaseStemmer.in_range_b$LBaseStemmer$II = BaseStemmer$in_range_b$LBaseStemmer$II; + +BaseStemmer.prototype.out_range$II = function (min, max) { + var ch; + var $__jsx_postinc_t; + if (this.cursor >= this.limit) { + return false; + } + ch = this.current.charCodeAt(this.cursor); + if (! (ch > max || ch < min)) { + return false; + } + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + return true; +}; + + +function BaseStemmer$out_range$LBaseStemmer$II($this, min, max) { + var ch; + var $__jsx_postinc_t; + if ($this.cursor >= $this.limit) { + return false; + } + ch = $this.current.charCodeAt($this.cursor); + if (! (ch > max || ch < min)) { + return false; + } + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + return true; +}; + +BaseStemmer.out_range$LBaseStemmer$II = BaseStemmer$out_range$LBaseStemmer$II; + +BaseStemmer.prototype.out_range_b$II = function (min, max) { + var ch; + var $__jsx_postinc_t; + if (this.cursor <= this.limit_backward) { + return false; + } + ch = this.current.charCodeAt(this.cursor - 1); + if (! (ch > max || ch < min)) { + return false; + } + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t - 1) | 0, $__jsx_postinc_t); + return true; +}; + + +function BaseStemmer$out_range_b$LBaseStemmer$II($this, min, max) { + var ch; + var $__jsx_postinc_t; + if ($this.cursor <= $this.limit_backward) { + return false; + } + ch = $this.current.charCodeAt($this.cursor - 1); + if (! (ch > max || ch < min)) { + return false; + } + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t - 1) | 0, $__jsx_postinc_t); + return true; +}; + +BaseStemmer.out_range_b$LBaseStemmer$II = BaseStemmer$out_range_b$LBaseStemmer$II; + +BaseStemmer.prototype.eq_s$IS = function (s_size, s) { + var cursor$0; + if (((this.limit - this.cursor) | 0) < s_size) { + return false; + } + if (this.current.slice(cursor$0 = this.cursor, ((cursor$0 + s_size) | 0)) !== s) { + return false; + } + this.cursor = (this.cursor + s_size) | 0; + return true; +}; + + +function BaseStemmer$eq_s$LBaseStemmer$IS($this, s_size, s) { + var cursor$0; + if ((($this.limit - $this.cursor) | 0) < s_size) { + return false; + } + if ($this.current.slice(cursor$0 = $this.cursor, ((cursor$0 + s_size) | 0)) !== s) { + return false; + } + $this.cursor = ($this.cursor + s_size) | 0; + return true; +}; + +BaseStemmer.eq_s$LBaseStemmer$IS = BaseStemmer$eq_s$LBaseStemmer$IS; + +BaseStemmer.prototype.eq_s_b$IS = function (s_size, s) { + var cursor$0; + if (((this.cursor - this.limit_backward) | 0) < s_size) { + return false; + } + if (this.current.slice((((cursor$0 = this.cursor) - s_size) | 0), cursor$0) !== s) { + return false; + } + this.cursor = (this.cursor - s_size) | 0; + return true; +}; + + +function BaseStemmer$eq_s_b$LBaseStemmer$IS($this, s_size, s) { + var cursor$0; + if ((($this.cursor - $this.limit_backward) | 0) < s_size) { + return false; + } + if ($this.current.slice((((cursor$0 = $this.cursor) - s_size) | 0), cursor$0) !== s) { + return false; + } + $this.cursor = ($this.cursor - s_size) | 0; + return true; +}; + +BaseStemmer.eq_s_b$LBaseStemmer$IS = BaseStemmer$eq_s_b$LBaseStemmer$IS; + +BaseStemmer.prototype.eq_v$S = function (s) { + return BaseStemmer$eq_s$LBaseStemmer$IS(this, s.length, s); +}; + + +function BaseStemmer$eq_v$LBaseStemmer$S($this, s) { + return BaseStemmer$eq_s$LBaseStemmer$IS($this, s.length, s); +}; + +BaseStemmer.eq_v$LBaseStemmer$S = BaseStemmer$eq_v$LBaseStemmer$S; + +BaseStemmer.prototype.eq_v_b$S = function (s) { + return BaseStemmer$eq_s_b$LBaseStemmer$IS(this, s.length, s); +}; + + +function BaseStemmer$eq_v_b$LBaseStemmer$S($this, s) { + return BaseStemmer$eq_s_b$LBaseStemmer$IS($this, s.length, s); +}; + +BaseStemmer.eq_v_b$LBaseStemmer$S = BaseStemmer$eq_v_b$LBaseStemmer$S; + +BaseStemmer.prototype.find_among$ALAmong$I = function (v, v_size) { + var i; + var j; + var c; + var l; + var common_i; + var common_j; + var first_key_inspected; + var k; + var diff; + var common; + var w; + var i2; + var res; + i = 0; + j = v_size; + c = this.cursor; + l = this.limit; + common_i = 0; + common_j = 0; + first_key_inspected = false; + while (true) { + k = i + (j - i >>> 1); + diff = 0; + common = (common_i < common_j ? common_i : common_j); + w = v[k]; + for (i2 = common; i2 < w.s_size; i2++) { + if (c + common === l) { + diff = -1; + break; + } + diff = this.current.charCodeAt(c + common) - w.s.charCodeAt(i2); + if (diff !== 0) { + break; + } + common++; + } + if (diff < 0) { + j = k; + common_j = common; + } else { + i = k; + common_i = common; + } + if (j - i <= 1) { + if (i > 0) { + break; + } + if (j === i) { + break; + } + if (first_key_inspected) { + break; + } + first_key_inspected = true; + } + } + while (true) { + w = v[i]; + if (common_i >= w.s_size) { + this.cursor = (c + w.s_size | 0); + if (w.method == null) { + return w.result; + } + res = w.method(w.instance); + this.cursor = (c + w.s_size | 0); + if (res) { + return w.result; + } + } + i = w.substring_i; + if (i < 0) { + return 0; + } + } + return -1; +}; + + +function BaseStemmer$find_among$LBaseStemmer$ALAmong$I($this, v, v_size) { + var i; + var j; + var c; + var l; + var common_i; + var common_j; + var first_key_inspected; + var k; + var diff; + var common; + var w; + var i2; + var res; + i = 0; + j = v_size; + c = $this.cursor; + l = $this.limit; + common_i = 0; + common_j = 0; + first_key_inspected = false; + while (true) { + k = i + (j - i >>> 1); + diff = 0; + common = (common_i < common_j ? common_i : common_j); + w = v[k]; + for (i2 = common; i2 < w.s_size; i2++) { + if (c + common === l) { + diff = -1; + break; + } + diff = $this.current.charCodeAt(c + common) - w.s.charCodeAt(i2); + if (diff !== 0) { + break; + } + common++; + } + if (diff < 0) { + j = k; + common_j = common; + } else { + i = k; + common_i = common; + } + if (j - i <= 1) { + if (i > 0) { + break; + } + if (j === i) { + break; + } + if (first_key_inspected) { + break; + } + first_key_inspected = true; + } + } + while (true) { + w = v[i]; + if (common_i >= w.s_size) { + $this.cursor = (c + w.s_size | 0); + if (w.method == null) { + return w.result; + } + res = w.method(w.instance); + $this.cursor = (c + w.s_size | 0); + if (res) { + return w.result; + } + } + i = w.substring_i; + if (i < 0) { + return 0; + } + } + return -1; +}; + +BaseStemmer.find_among$LBaseStemmer$ALAmong$I = BaseStemmer$find_among$LBaseStemmer$ALAmong$I; + +BaseStemmer.prototype.find_among_b$ALAmong$I = function (v, v_size) { + var i; + var j; + var c; + var lb; + var common_i; + var common_j; + var first_key_inspected; + var k; + var diff; + var common; + var w; + var i2; + var res; + i = 0; + j = v_size; + c = this.cursor; + lb = this.limit_backward; + common_i = 0; + common_j = 0; + first_key_inspected = false; + while (true) { + k = i + (j - i >> 1); + diff = 0; + common = (common_i < common_j ? common_i : common_j); + w = v[k]; + for (i2 = w.s_size - 1 - common; i2 >= 0; i2--) { + if (c - common === lb) { + diff = -1; + break; + } + diff = this.current.charCodeAt(c - 1 - common) - w.s.charCodeAt(i2); + if (diff !== 0) { + break; + } + common++; + } + if (diff < 0) { + j = k; + common_j = common; + } else { + i = k; + common_i = common; + } + if (j - i <= 1) { + if (i > 0) { + break; + } + if (j === i) { + break; + } + if (first_key_inspected) { + break; + } + first_key_inspected = true; + } + } + while (true) { + w = v[i]; + if (common_i >= w.s_size) { + this.cursor = (c - w.s_size | 0); + if (w.method == null) { + return w.result; + } + res = w.method(this); + this.cursor = (c - w.s_size | 0); + if (res) { + return w.result; + } + } + i = w.substring_i; + if (i < 0) { + return 0; + } + } + return -1; +}; + + +function BaseStemmer$find_among_b$LBaseStemmer$ALAmong$I($this, v, v_size) { + var i; + var j; + var c; + var lb; + var common_i; + var common_j; + var first_key_inspected; + var k; + var diff; + var common; + var w; + var i2; + var res; + i = 0; + j = v_size; + c = $this.cursor; + lb = $this.limit_backward; + common_i = 0; + common_j = 0; + first_key_inspected = false; + while (true) { + k = i + (j - i >> 1); + diff = 0; + common = (common_i < common_j ? common_i : common_j); + w = v[k]; + for (i2 = w.s_size - 1 - common; i2 >= 0; i2--) { + if (c - common === lb) { + diff = -1; + break; + } + diff = $this.current.charCodeAt(c - 1 - common) - w.s.charCodeAt(i2); + if (diff !== 0) { + break; + } + common++; + } + if (diff < 0) { + j = k; + common_j = common; + } else { + i = k; + common_i = common; + } + if (j - i <= 1) { + if (i > 0) { + break; + } + if (j === i) { + break; + } + if (first_key_inspected) { + break; + } + first_key_inspected = true; + } + } + while (true) { + w = v[i]; + if (common_i >= w.s_size) { + $this.cursor = (c - w.s_size | 0); + if (w.method == null) { + return w.result; + } + res = w.method($this); + $this.cursor = (c - w.s_size | 0); + if (res) { + return w.result; + } + } + i = w.substring_i; + if (i < 0) { + return 0; + } + } + return -1; +}; + +BaseStemmer.find_among_b$LBaseStemmer$ALAmong$I = BaseStemmer$find_among_b$LBaseStemmer$ALAmong$I; + +BaseStemmer.prototype.replace_s$IIS = function (c_bra, c_ket, s) { + var adjustment; + adjustment = ((s.length - (((c_ket - c_bra) | 0))) | 0); + this.current = this.current.slice(0, c_bra) + s + this.current.slice(c_ket); + this.limit = (this.limit + adjustment) | 0; + if (this.cursor >= c_ket) { + this.cursor = (this.cursor + adjustment) | 0; + } else if (this.cursor > c_bra) { + this.cursor = c_bra; + } + return (adjustment | 0); +}; + + +function BaseStemmer$replace_s$LBaseStemmer$IIS($this, c_bra, c_ket, s) { + var adjustment; + adjustment = ((s.length - (((c_ket - c_bra) | 0))) | 0); + $this.current = $this.current.slice(0, c_bra) + s + $this.current.slice(c_ket); + $this.limit = ($this.limit + adjustment) | 0; + if ($this.cursor >= c_ket) { + $this.cursor = ($this.cursor + adjustment) | 0; + } else if ($this.cursor > c_bra) { + $this.cursor = c_bra; + } + return (adjustment | 0); +}; + +BaseStemmer.replace_s$LBaseStemmer$IIS = BaseStemmer$replace_s$LBaseStemmer$IIS; + +BaseStemmer.prototype.slice_check$ = function () { + var bra$0; + var ket$0; + var limit$0; + return ((bra$0 = this.bra) < 0 || bra$0 > (ket$0 = this.ket) || ket$0 > (limit$0 = this.limit) || limit$0 > this.current.length ? false : true); +}; + + +function BaseStemmer$slice_check$LBaseStemmer$($this) { + var bra$0; + var ket$0; + var limit$0; + return ((bra$0 = $this.bra) < 0 || bra$0 > (ket$0 = $this.ket) || ket$0 > (limit$0 = $this.limit) || limit$0 > $this.current.length ? false : true); +}; + +BaseStemmer.slice_check$LBaseStemmer$ = BaseStemmer$slice_check$LBaseStemmer$; + +BaseStemmer.prototype.slice_from$S = function (s) { + var result; + var bra$0; + var ket$0; + var limit$0; + result = false; + if ((bra$0 = this.bra) < 0 || bra$0 > (ket$0 = this.ket) || ket$0 > (limit$0 = this.limit) || limit$0 > this.current.length ? false : true) { + BaseStemmer$replace_s$LBaseStemmer$IIS(this, this.bra, this.ket, s); + result = true; + } + return result; +}; + + +function BaseStemmer$slice_from$LBaseStemmer$S($this, s) { + var result; + var bra$0; + var ket$0; + var limit$0; + result = false; + if ((bra$0 = $this.bra) < 0 || bra$0 > (ket$0 = $this.ket) || ket$0 > (limit$0 = $this.limit) || limit$0 > $this.current.length ? false : true) { + BaseStemmer$replace_s$LBaseStemmer$IIS($this, $this.bra, $this.ket, s); + result = true; + } + return result; +}; + +BaseStemmer.slice_from$LBaseStemmer$S = BaseStemmer$slice_from$LBaseStemmer$S; + +BaseStemmer.prototype.slice_del$ = function () { + return BaseStemmer$slice_from$LBaseStemmer$S(this, ""); +}; + + +function BaseStemmer$slice_del$LBaseStemmer$($this) { + return BaseStemmer$slice_from$LBaseStemmer$S($this, ""); +}; + +BaseStemmer.slice_del$LBaseStemmer$ = BaseStemmer$slice_del$LBaseStemmer$; + +BaseStemmer.prototype.insert$IIS = function (c_bra, c_ket, s) { + var adjustment; + adjustment = BaseStemmer$replace_s$LBaseStemmer$IIS(this, c_bra, c_ket, s); + if (c_bra <= this.bra) { + this.bra = (this.bra + adjustment) | 0; + } + if (c_bra <= this.ket) { + this.ket = (this.ket + adjustment) | 0; + } +}; + + +function BaseStemmer$insert$LBaseStemmer$IIS($this, c_bra, c_ket, s) { + var adjustment; + adjustment = BaseStemmer$replace_s$LBaseStemmer$IIS($this, c_bra, c_ket, s); + if (c_bra <= $this.bra) { + $this.bra = ($this.bra + adjustment) | 0; + } + if (c_bra <= $this.ket) { + $this.ket = ($this.ket + adjustment) | 0; + } +}; + +BaseStemmer.insert$LBaseStemmer$IIS = BaseStemmer$insert$LBaseStemmer$IIS; + +BaseStemmer.prototype.slice_to$S = function (s) { + var result; + var bra$0; + var ket$0; + var limit$0; + result = ''; + if ((bra$0 = this.bra) < 0 || bra$0 > (ket$0 = this.ket) || ket$0 > (limit$0 = this.limit) || limit$0 > this.current.length ? false : true) { + result = this.current.slice(this.bra, this.ket); + } + return result; +}; + + +function BaseStemmer$slice_to$LBaseStemmer$S($this, s) { + var result; + var bra$0; + var ket$0; + var limit$0; + result = ''; + if ((bra$0 = $this.bra) < 0 || bra$0 > (ket$0 = $this.ket) || ket$0 > (limit$0 = $this.limit) || limit$0 > $this.current.length ? false : true) { + result = $this.current.slice($this.bra, $this.ket); + } + return result; +}; + +BaseStemmer.slice_to$LBaseStemmer$S = BaseStemmer$slice_to$LBaseStemmer$S; + +BaseStemmer.prototype.assign_to$S = function (s) { + return this.current.slice(0, this.limit); +}; + + +function BaseStemmer$assign_to$LBaseStemmer$S($this, s) { + return $this.current.slice(0, $this.limit); +}; + +BaseStemmer.assign_to$LBaseStemmer$S = BaseStemmer$assign_to$LBaseStemmer$S; + +BaseStemmer.prototype.stem$ = function () { + return false; +}; + + +BaseStemmer.prototype.stemWord$S = function (word) { + var result; + var current$0; + var cursor$0; + var limit$0; + result = this.cache['.' + word]; + if (result == null) { + current$0 = this.current = word; + cursor$0 = this.cursor = 0; + limit$0 = this.limit = current$0.length; + this.limit_backward = 0; + this.bra = cursor$0; + this.ket = limit$0; + this.stem$(); + result = this.current; + this.cache['.' + word] = result; + } + return result; +}; + +BaseStemmer.prototype.stemWord = BaseStemmer.prototype.stemWord$S; + +BaseStemmer.prototype.stemWords$AS = function (words) { + var results; + var i; + var word; + var result; + var current$0; + var cursor$0; + var limit$0; + results = [ ]; + for (i = 0; i < words.length; i++) { + word = words[i]; + result = this.cache['.' + word]; + if (result == null) { + current$0 = this.current = word; + cursor$0 = this.cursor = 0; + limit$0 = this.limit = current$0.length; + this.limit_backward = 0; + this.bra = cursor$0; + this.ket = limit$0; + this.stem$(); + result = this.current; + this.cache['.' + word] = result; + } + results.push(result); + } + return results; +}; + +BaseStemmer.prototype.stemWords = BaseStemmer.prototype.stemWords$AS; + +function GermanStemmer() { + BaseStemmer.call(this); + this.I_x = 0; + this.I_p2 = 0; + this.I_p1 = 0; +}; + +$__jsx_extend([GermanStemmer], BaseStemmer); +GermanStemmer.prototype.copy_from$LGermanStemmer$ = function (other) { + this.I_x = other.I_x; + this.I_p2 = other.I_p2; + this.I_p1 = other.I_p1; + BaseStemmer$copy_from$LBaseStemmer$LBaseStemmer$(this, other); +}; + +GermanStemmer.prototype.copy_from = GermanStemmer.prototype.copy_from$LGermanStemmer$; + +GermanStemmer.prototype.r_prelude$ = function () { + var v_1; + var v_2; + var v_3; + var v_4; + var v_5; + var v_6; + var lab1; + var lab2; + var lab3; + var lab5; + var lab7; + var lab8; + var lab9; + var cursor$0; + var cursor$1; + var $__jsx_postinc_t; + v_1 = this.cursor; +replab0: + while (true) { + v_2 = this.cursor; + lab1 = true; + lab1: + while (lab1 === true) { + lab1 = false; + lab2 = true; + lab2: + while (lab2 === true) { + lab2 = false; + v_3 = this.cursor; + lab3 = true; + lab3: + while (lab3 === true) { + lab3 = false; + this.bra = this.cursor; + if (! BaseStemmer$eq_s$LBaseStemmer$IS(this, 1, "\u00DF")) { + break lab3; + } + this.ket = this.cursor; + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "ss")) { + return false; + } + break lab2; + } + cursor$0 = this.cursor = v_3; + if (cursor$0 >= this.limit) { + break lab1; + } + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + } + continue replab0; + } + this.cursor = v_2; + break replab0; + } + this.cursor = v_1; +replab4: + while (true) { + v_4 = this.cursor; + lab5 = true; + lab5: + while (lab5 === true) { + lab5 = false; + golab6: + while (true) { + v_5 = this.cursor; + lab7 = true; + lab7: + while (lab7 === true) { + lab7 = false; + if (! BaseStemmer$in_grouping$LBaseStemmer$AIII(this, GermanStemmer.g_v, 97, 252)) { + break lab7; + } + this.bra = this.cursor; + lab8 = true; + lab8: + while (lab8 === true) { + lab8 = false; + v_6 = this.cursor; + lab9 = true; + lab9: + while (lab9 === true) { + lab9 = false; + if (! BaseStemmer$eq_s$LBaseStemmer$IS(this, 1, "u")) { + break lab9; + } + this.ket = this.cursor; + if (! BaseStemmer$in_grouping$LBaseStemmer$AIII(this, GermanStemmer.g_v, 97, 252)) { + break lab9; + } + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "U")) { + return false; + } + break lab8; + } + this.cursor = v_6; + if (! BaseStemmer$eq_s$LBaseStemmer$IS(this, 1, "y")) { + break lab7; + } + this.ket = this.cursor; + if (! BaseStemmer$in_grouping$LBaseStemmer$AIII(this, GermanStemmer.g_v, 97, 252)) { + break lab7; + } + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "Y")) { + return false; + } + } + this.cursor = v_5; + break golab6; + } + cursor$1 = this.cursor = v_5; + if (cursor$1 >= this.limit) { + break lab5; + } + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + } + continue replab4; + } + this.cursor = v_4; + break replab4; + } + return true; +}; + +GermanStemmer.prototype.r_prelude = GermanStemmer.prototype.r_prelude$; + +function GermanStemmer$r_prelude$LGermanStemmer$($this) { + var v_1; + var v_2; + var v_3; + var v_4; + var v_5; + var v_6; + var lab1; + var lab2; + var lab3; + var lab5; + var lab7; + var lab8; + var lab9; + var cursor$0; + var cursor$1; + var $__jsx_postinc_t; + v_1 = $this.cursor; +replab0: + while (true) { + v_2 = $this.cursor; + lab1 = true; + lab1: + while (lab1 === true) { + lab1 = false; + lab2 = true; + lab2: + while (lab2 === true) { + lab2 = false; + v_3 = $this.cursor; + lab3 = true; + lab3: + while (lab3 === true) { + lab3 = false; + $this.bra = $this.cursor; + if (! BaseStemmer$eq_s$LBaseStemmer$IS($this, 1, "\u00DF")) { + break lab3; + } + $this.ket = $this.cursor; + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "ss")) { + return false; + } + break lab2; + } + cursor$0 = $this.cursor = v_3; + if (cursor$0 >= $this.limit) { + break lab1; + } + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + } + continue replab0; + } + $this.cursor = v_2; + break replab0; + } + $this.cursor = v_1; +replab4: + while (true) { + v_4 = $this.cursor; + lab5 = true; + lab5: + while (lab5 === true) { + lab5 = false; + golab6: + while (true) { + v_5 = $this.cursor; + lab7 = true; + lab7: + while (lab7 === true) { + lab7 = false; + if (! BaseStemmer$in_grouping$LBaseStemmer$AIII($this, GermanStemmer.g_v, 97, 252)) { + break lab7; + } + $this.bra = $this.cursor; + lab8 = true; + lab8: + while (lab8 === true) { + lab8 = false; + v_6 = $this.cursor; + lab9 = true; + lab9: + while (lab9 === true) { + lab9 = false; + if (! BaseStemmer$eq_s$LBaseStemmer$IS($this, 1, "u")) { + break lab9; + } + $this.ket = $this.cursor; + if (! BaseStemmer$in_grouping$LBaseStemmer$AIII($this, GermanStemmer.g_v, 97, 252)) { + break lab9; + } + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "U")) { + return false; + } + break lab8; + } + $this.cursor = v_6; + if (! BaseStemmer$eq_s$LBaseStemmer$IS($this, 1, "y")) { + break lab7; + } + $this.ket = $this.cursor; + if (! BaseStemmer$in_grouping$LBaseStemmer$AIII($this, GermanStemmer.g_v, 97, 252)) { + break lab7; + } + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "Y")) { + return false; + } + } + $this.cursor = v_5; + break golab6; + } + cursor$1 = $this.cursor = v_5; + if (cursor$1 >= $this.limit) { + break lab5; + } + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + } + continue replab4; + } + $this.cursor = v_4; + break replab4; + } + return true; +}; + +GermanStemmer.r_prelude$LGermanStemmer$ = GermanStemmer$r_prelude$LGermanStemmer$; + +GermanStemmer.prototype.r_mark_regions$ = function () { + var v_1; + var c; + var lab1; + var lab3; + var lab4; + var lab6; + var lab8; + var limit$0; + var cursor$0; + var cursor$1; + var $__jsx_postinc_t; + this.I_p1 = limit$0 = this.limit; + this.I_p2 = limit$0; + v_1 = cursor$0 = this.cursor; + c = (cursor$0 + 3 | 0); + if (0 > c || c > limit$0) { + return false; + } + cursor$1 = this.cursor = c; + this.I_x = cursor$1; + this.cursor = v_1; +golab0: + while (true) { + lab1 = true; + lab1: + while (lab1 === true) { + lab1 = false; + if (! BaseStemmer$in_grouping$LBaseStemmer$AIII(this, GermanStemmer.g_v, 97, 252)) { + break lab1; + } + break golab0; + } + if (this.cursor >= this.limit) { + return false; + } + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + } +golab2: + while (true) { + lab3 = true; + lab3: + while (lab3 === true) { + lab3 = false; + if (! BaseStemmer$out_grouping$LBaseStemmer$AIII(this, GermanStemmer.g_v, 97, 252)) { + break lab3; + } + break golab2; + } + if (this.cursor >= this.limit) { + return false; + } + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + } + this.I_p1 = this.cursor; + lab4 = true; +lab4: + while (lab4 === true) { + lab4 = false; + if (! (this.I_p1 < this.I_x)) { + break lab4; + } + this.I_p1 = this.I_x; + } +golab5: + while (true) { + lab6 = true; + lab6: + while (lab6 === true) { + lab6 = false; + if (! BaseStemmer$in_grouping$LBaseStemmer$AIII(this, GermanStemmer.g_v, 97, 252)) { + break lab6; + } + break golab5; + } + if (this.cursor >= this.limit) { + return false; + } + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + } +golab7: + while (true) { + lab8 = true; + lab8: + while (lab8 === true) { + lab8 = false; + if (! BaseStemmer$out_grouping$LBaseStemmer$AIII(this, GermanStemmer.g_v, 97, 252)) { + break lab8; + } + break golab7; + } + if (this.cursor >= this.limit) { + return false; + } + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + } + this.I_p2 = this.cursor; + return true; +}; + +GermanStemmer.prototype.r_mark_regions = GermanStemmer.prototype.r_mark_regions$; + +function GermanStemmer$r_mark_regions$LGermanStemmer$($this) { + var v_1; + var c; + var lab1; + var lab3; + var lab4; + var lab6; + var lab8; + var limit$0; + var cursor$0; + var cursor$1; + var $__jsx_postinc_t; + $this.I_p1 = limit$0 = $this.limit; + $this.I_p2 = limit$0; + v_1 = cursor$0 = $this.cursor; + c = (cursor$0 + 3 | 0); + if (0 > c || c > limit$0) { + return false; + } + cursor$1 = $this.cursor = c; + $this.I_x = cursor$1; + $this.cursor = v_1; +golab0: + while (true) { + lab1 = true; + lab1: + while (lab1 === true) { + lab1 = false; + if (! BaseStemmer$in_grouping$LBaseStemmer$AIII($this, GermanStemmer.g_v, 97, 252)) { + break lab1; + } + break golab0; + } + if ($this.cursor >= $this.limit) { + return false; + } + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + } +golab2: + while (true) { + lab3 = true; + lab3: + while (lab3 === true) { + lab3 = false; + if (! BaseStemmer$out_grouping$LBaseStemmer$AIII($this, GermanStemmer.g_v, 97, 252)) { + break lab3; + } + break golab2; + } + if ($this.cursor >= $this.limit) { + return false; + } + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + } + $this.I_p1 = $this.cursor; + lab4 = true; +lab4: + while (lab4 === true) { + lab4 = false; + if (! ($this.I_p1 < $this.I_x)) { + break lab4; + } + $this.I_p1 = $this.I_x; + } +golab5: + while (true) { + lab6 = true; + lab6: + while (lab6 === true) { + lab6 = false; + if (! BaseStemmer$in_grouping$LBaseStemmer$AIII($this, GermanStemmer.g_v, 97, 252)) { + break lab6; + } + break golab5; + } + if ($this.cursor >= $this.limit) { + return false; + } + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + } +golab7: + while (true) { + lab8 = true; + lab8: + while (lab8 === true) { + lab8 = false; + if (! BaseStemmer$out_grouping$LBaseStemmer$AIII($this, GermanStemmer.g_v, 97, 252)) { + break lab8; + } + break golab7; + } + if ($this.cursor >= $this.limit) { + return false; + } + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + } + $this.I_p2 = $this.cursor; + return true; +}; + +GermanStemmer.r_mark_regions$LGermanStemmer$ = GermanStemmer$r_mark_regions$LGermanStemmer$; + +GermanStemmer.prototype.r_postlude$ = function () { + var among_var; + var v_1; + var lab1; + var $__jsx_postinc_t; +replab0: + while (true) { + v_1 = this.cursor; + lab1 = true; + lab1: + while (lab1 === true) { + lab1 = false; + this.bra = this.cursor; + among_var = BaseStemmer$find_among$LBaseStemmer$ALAmong$I(this, GermanStemmer.a_0, 6); + if (among_var === 0) { + break lab1; + } + this.ket = this.cursor; + switch (among_var) { + case 0: + break lab1; + case 1: + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "y")) { + return false; + } + break; + case 2: + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "u")) { + return false; + } + break; + case 3: + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "a")) { + return false; + } + break; + case 4: + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "o")) { + return false; + } + break; + case 5: + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "u")) { + return false; + } + break; + case 6: + if (this.cursor >= this.limit) { + break lab1; + } + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + break; + } + continue replab0; + } + this.cursor = v_1; + break replab0; + } + return true; +}; + +GermanStemmer.prototype.r_postlude = GermanStemmer.prototype.r_postlude$; + +function GermanStemmer$r_postlude$LGermanStemmer$($this) { + var among_var; + var v_1; + var lab1; + var $__jsx_postinc_t; +replab0: + while (true) { + v_1 = $this.cursor; + lab1 = true; + lab1: + while (lab1 === true) { + lab1 = false; + $this.bra = $this.cursor; + among_var = BaseStemmer$find_among$LBaseStemmer$ALAmong$I($this, GermanStemmer.a_0, 6); + if (among_var === 0) { + break lab1; + } + $this.ket = $this.cursor; + switch (among_var) { + case 0: + break lab1; + case 1: + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "y")) { + return false; + } + break; + case 2: + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "u")) { + return false; + } + break; + case 3: + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "a")) { + return false; + } + break; + case 4: + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "o")) { + return false; + } + break; + case 5: + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "u")) { + return false; + } + break; + case 6: + if ($this.cursor >= $this.limit) { + break lab1; + } + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + break; + } + continue replab0; + } + $this.cursor = v_1; + break replab0; + } + return true; +}; + +GermanStemmer.r_postlude$LGermanStemmer$ = GermanStemmer$r_postlude$LGermanStemmer$; + +GermanStemmer.prototype.r_R1$ = function () { + return (! (this.I_p1 <= this.cursor) ? false : true); +}; + +GermanStemmer.prototype.r_R1 = GermanStemmer.prototype.r_R1$; + +function GermanStemmer$r_R1$LGermanStemmer$($this) { + return (! ($this.I_p1 <= $this.cursor) ? false : true); +}; + +GermanStemmer.r_R1$LGermanStemmer$ = GermanStemmer$r_R1$LGermanStemmer$; + +GermanStemmer.prototype.r_R2$ = function () { + return (! (this.I_p2 <= this.cursor) ? false : true); +}; + +GermanStemmer.prototype.r_R2 = GermanStemmer.prototype.r_R2$; + +function GermanStemmer$r_R2$LGermanStemmer$($this) { + return (! ($this.I_p2 <= $this.cursor) ? false : true); +}; + +GermanStemmer.r_R2$LGermanStemmer$ = GermanStemmer$r_R2$LGermanStemmer$; + +GermanStemmer.prototype.r_standard_suffix$ = function () { + var among_var; + var v_1; + var v_2; + var v_3; + var v_4; + var v_5; + var v_6; + var v_7; + var v_8; + var v_9; + var v_10; + var lab0; + var lab1; + var lab2; + var c; + var lab3; + var lab4; + var lab5; + var lab6; + var lab7; + var lab8; + var lab9; + var lab10; + var cursor$0; + var cursor$1; + var limit$0; + var cursor$2; + var cursor$3; + var cursor$4; + var cursor$5; + var cursor$6; + var cursor$7; + var limit$1; + var cursor$8; + v_1 = ((this.limit - this.cursor) | 0); + lab0 = true; +lab0: + while (lab0 === true) { + lab0 = false; + this.ket = this.cursor; + among_var = BaseStemmer$find_among_b$LBaseStemmer$ALAmong$I(this, GermanStemmer.a_1, 7); + if (among_var === 0) { + break lab0; + } + this.bra = cursor$0 = this.cursor; + if (! (! (this.I_p1 <= cursor$0) ? false : true)) { + break lab0; + } + switch (among_var) { + case 0: + break lab0; + case 1: + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "")) { + return false; + } + break; + case 2: + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "")) { + return false; + } + v_2 = ((this.limit - this.cursor) | 0); + lab1 = true; + lab1: + while (lab1 === true) { + lab1 = false; + this.ket = this.cursor; + if (! BaseStemmer$eq_s_b$LBaseStemmer$IS(this, 1, "s")) { + this.cursor = ((this.limit - v_2) | 0); + break lab1; + } + this.bra = this.cursor; + if (! BaseStemmer$eq_s_b$LBaseStemmer$IS(this, 3, "nis")) { + this.cursor = ((this.limit - v_2) | 0); + break lab1; + } + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "")) { + return false; + } + } + break; + case 3: + if (! BaseStemmer$in_grouping_b$LBaseStemmer$AIII(this, GermanStemmer.g_s_ending, 98, 116)) { + break lab0; + } + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "")) { + return false; + } + break; + } + } + cursor$2 = this.cursor = (((limit$0 = this.limit) - v_1) | 0); + v_3 = ((limit$0 - cursor$2) | 0); + lab2 = true; +lab2: + while (lab2 === true) { + lab2 = false; + this.ket = this.cursor; + among_var = BaseStemmer$find_among_b$LBaseStemmer$ALAmong$I(this, GermanStemmer.a_2, 4); + if (among_var === 0) { + break lab2; + } + this.bra = cursor$1 = this.cursor; + if (! (! (this.I_p1 <= cursor$1) ? false : true)) { + break lab2; + } + switch (among_var) { + case 0: + break lab2; + case 1: + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "")) { + return false; + } + break; + case 2: + if (! BaseStemmer$in_grouping_b$LBaseStemmer$AIII(this, GermanStemmer.g_st_ending, 98, 116)) { + break lab2; + } + c = (this.cursor - 3 | 0); + if (this.limit_backward > c || c > this.limit) { + break lab2; + } + this.cursor = c; + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "")) { + return false; + } + break; + } + } + cursor$8 = this.cursor = (((limit$1 = this.limit) - v_3) | 0); + v_4 = ((limit$1 - cursor$8) | 0); + lab3 = true; +lab3: + while (lab3 === true) { + lab3 = false; + this.ket = this.cursor; + among_var = BaseStemmer$find_among_b$LBaseStemmer$ALAmong$I(this, GermanStemmer.a_4, 8); + if (among_var === 0) { + break lab3; + } + this.bra = cursor$3 = this.cursor; + if (! (! (this.I_p2 <= cursor$3) ? false : true)) { + break lab3; + } + switch (among_var) { + case 0: + break lab3; + case 1: + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "")) { + return false; + } + v_5 = ((this.limit - this.cursor) | 0); + lab4 = true; + lab4: + while (lab4 === true) { + lab4 = false; + this.ket = this.cursor; + if (! BaseStemmer$eq_s_b$LBaseStemmer$IS(this, 2, "ig")) { + this.cursor = ((this.limit - v_5) | 0); + break lab4; + } + this.bra = cursor$4 = this.cursor; + v_6 = ((this.limit - cursor$4) | 0); + lab5 = true; + lab5: + while (lab5 === true) { + lab5 = false; + if (! BaseStemmer$eq_s_b$LBaseStemmer$IS(this, 1, "e")) { + break lab5; + } + this.cursor = ((this.limit - v_5) | 0); + break lab4; + } + cursor$5 = this.cursor = ((this.limit - v_6) | 0); + if (! (! (this.I_p2 <= cursor$5) ? false : true)) { + this.cursor = ((this.limit - v_5) | 0); + break lab4; + } + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "")) { + return false; + } + } + break; + case 2: + v_7 = ((this.limit - this.cursor) | 0); + lab6 = true; + lab6: + while (lab6 === true) { + lab6 = false; + if (! BaseStemmer$eq_s_b$LBaseStemmer$IS(this, 1, "e")) { + break lab6; + } + break lab3; + } + this.cursor = ((this.limit - v_7) | 0); + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "")) { + return false; + } + break; + case 3: + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "")) { + return false; + } + v_8 = ((this.limit - this.cursor) | 0); + lab7 = true; + lab7: + while (lab7 === true) { + lab7 = false; + this.ket = this.cursor; + lab8 = true; + lab8: + while (lab8 === true) { + lab8 = false; + v_9 = ((this.limit - this.cursor) | 0); + lab9 = true; + lab9: + while (lab9 === true) { + lab9 = false; + if (! BaseStemmer$eq_s_b$LBaseStemmer$IS(this, 2, "er")) { + break lab9; + } + break lab8; + } + this.cursor = ((this.limit - v_9) | 0); + if (! BaseStemmer$eq_s_b$LBaseStemmer$IS(this, 2, "en")) { + this.cursor = ((this.limit - v_8) | 0); + break lab7; + } + } + this.bra = cursor$6 = this.cursor; + if (! (! (this.I_p1 <= cursor$6) ? false : true)) { + this.cursor = ((this.limit - v_8) | 0); + break lab7; + } + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "")) { + return false; + } + } + break; + case 4: + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "")) { + return false; + } + v_10 = ((this.limit - this.cursor) | 0); + lab10 = true; + lab10: + while (lab10 === true) { + lab10 = false; + this.ket = this.cursor; + among_var = BaseStemmer$find_among_b$LBaseStemmer$ALAmong$I(this, GermanStemmer.a_3, 2); + if (among_var === 0) { + this.cursor = ((this.limit - v_10) | 0); + break lab10; + } + this.bra = cursor$7 = this.cursor; + if (! (! (this.I_p2 <= cursor$7) ? false : true)) { + this.cursor = ((this.limit - v_10) | 0); + break lab10; + } + switch (among_var) { + case 0: + this.cursor = ((this.limit - v_10) | 0); + break lab10; + case 1: + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "")) { + return false; + } + break; + } + } + break; + } + } + this.cursor = ((this.limit - v_4) | 0); + return true; +}; + +GermanStemmer.prototype.r_standard_suffix = GermanStemmer.prototype.r_standard_suffix$; + +function GermanStemmer$r_standard_suffix$LGermanStemmer$($this) { + var among_var; + var v_1; + var v_2; + var v_3; + var v_4; + var v_5; + var v_6; + var v_7; + var v_8; + var v_9; + var v_10; + var lab0; + var lab1; + var lab2; + var c; + var lab3; + var lab4; + var lab5; + var lab6; + var lab7; + var lab8; + var lab9; + var lab10; + var cursor$0; + var cursor$1; + var limit$0; + var cursor$2; + var cursor$3; + var cursor$4; + var cursor$5; + var cursor$6; + var cursor$7; + var limit$1; + var cursor$8; + v_1 = (($this.limit - $this.cursor) | 0); + lab0 = true; +lab0: + while (lab0 === true) { + lab0 = false; + $this.ket = $this.cursor; + among_var = BaseStemmer$find_among_b$LBaseStemmer$ALAmong$I($this, GermanStemmer.a_1, 7); + if (among_var === 0) { + break lab0; + } + $this.bra = cursor$0 = $this.cursor; + if (! (! ($this.I_p1 <= cursor$0) ? false : true)) { + break lab0; + } + switch (among_var) { + case 0: + break lab0; + case 1: + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "")) { + return false; + } + break; + case 2: + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "")) { + return false; + } + v_2 = (($this.limit - $this.cursor) | 0); + lab1 = true; + lab1: + while (lab1 === true) { + lab1 = false; + $this.ket = $this.cursor; + if (! BaseStemmer$eq_s_b$LBaseStemmer$IS($this, 1, "s")) { + $this.cursor = (($this.limit - v_2) | 0); + break lab1; + } + $this.bra = $this.cursor; + if (! BaseStemmer$eq_s_b$LBaseStemmer$IS($this, 3, "nis")) { + $this.cursor = (($this.limit - v_2) | 0); + break lab1; + } + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "")) { + return false; + } + } + break; + case 3: + if (! BaseStemmer$in_grouping_b$LBaseStemmer$AIII($this, GermanStemmer.g_s_ending, 98, 116)) { + break lab0; + } + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "")) { + return false; + } + break; + } + } + cursor$2 = $this.cursor = (((limit$0 = $this.limit) - v_1) | 0); + v_3 = ((limit$0 - cursor$2) | 0); + lab2 = true; +lab2: + while (lab2 === true) { + lab2 = false; + $this.ket = $this.cursor; + among_var = BaseStemmer$find_among_b$LBaseStemmer$ALAmong$I($this, GermanStemmer.a_2, 4); + if (among_var === 0) { + break lab2; + } + $this.bra = cursor$1 = $this.cursor; + if (! (! ($this.I_p1 <= cursor$1) ? false : true)) { + break lab2; + } + switch (among_var) { + case 0: + break lab2; + case 1: + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "")) { + return false; + } + break; + case 2: + if (! BaseStemmer$in_grouping_b$LBaseStemmer$AIII($this, GermanStemmer.g_st_ending, 98, 116)) { + break lab2; + } + c = ($this.cursor - 3 | 0); + if ($this.limit_backward > c || c > $this.limit) { + break lab2; + } + $this.cursor = c; + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "")) { + return false; + } + break; + } + } + cursor$8 = $this.cursor = (((limit$1 = $this.limit) - v_3) | 0); + v_4 = ((limit$1 - cursor$8) | 0); + lab3 = true; +lab3: + while (lab3 === true) { + lab3 = false; + $this.ket = $this.cursor; + among_var = BaseStemmer$find_among_b$LBaseStemmer$ALAmong$I($this, GermanStemmer.a_4, 8); + if (among_var === 0) { + break lab3; + } + $this.bra = cursor$3 = $this.cursor; + if (! (! ($this.I_p2 <= cursor$3) ? false : true)) { + break lab3; + } + switch (among_var) { + case 0: + break lab3; + case 1: + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "")) { + return false; + } + v_5 = (($this.limit - $this.cursor) | 0); + lab4 = true; + lab4: + while (lab4 === true) { + lab4 = false; + $this.ket = $this.cursor; + if (! BaseStemmer$eq_s_b$LBaseStemmer$IS($this, 2, "ig")) { + $this.cursor = (($this.limit - v_5) | 0); + break lab4; + } + $this.bra = cursor$4 = $this.cursor; + v_6 = (($this.limit - cursor$4) | 0); + lab5 = true; + lab5: + while (lab5 === true) { + lab5 = false; + if (! BaseStemmer$eq_s_b$LBaseStemmer$IS($this, 1, "e")) { + break lab5; + } + $this.cursor = (($this.limit - v_5) | 0); + break lab4; + } + cursor$5 = $this.cursor = (($this.limit - v_6) | 0); + if (! (! ($this.I_p2 <= cursor$5) ? false : true)) { + $this.cursor = (($this.limit - v_5) | 0); + break lab4; + } + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "")) { + return false; + } + } + break; + case 2: + v_7 = (($this.limit - $this.cursor) | 0); + lab6 = true; + lab6: + while (lab6 === true) { + lab6 = false; + if (! BaseStemmer$eq_s_b$LBaseStemmer$IS($this, 1, "e")) { + break lab6; + } + break lab3; + } + $this.cursor = (($this.limit - v_7) | 0); + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "")) { + return false; + } + break; + case 3: + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "")) { + return false; + } + v_8 = (($this.limit - $this.cursor) | 0); + lab7 = true; + lab7: + while (lab7 === true) { + lab7 = false; + $this.ket = $this.cursor; + lab8 = true; + lab8: + while (lab8 === true) { + lab8 = false; + v_9 = (($this.limit - $this.cursor) | 0); + lab9 = true; + lab9: + while (lab9 === true) { + lab9 = false; + if (! BaseStemmer$eq_s_b$LBaseStemmer$IS($this, 2, "er")) { + break lab9; + } + break lab8; + } + $this.cursor = (($this.limit - v_9) | 0); + if (! BaseStemmer$eq_s_b$LBaseStemmer$IS($this, 2, "en")) { + $this.cursor = (($this.limit - v_8) | 0); + break lab7; + } + } + $this.bra = cursor$6 = $this.cursor; + if (! (! ($this.I_p1 <= cursor$6) ? false : true)) { + $this.cursor = (($this.limit - v_8) | 0); + break lab7; + } + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "")) { + return false; + } + } + break; + case 4: + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "")) { + return false; + } + v_10 = (($this.limit - $this.cursor) | 0); + lab10 = true; + lab10: + while (lab10 === true) { + lab10 = false; + $this.ket = $this.cursor; + among_var = BaseStemmer$find_among_b$LBaseStemmer$ALAmong$I($this, GermanStemmer.a_3, 2); + if (among_var === 0) { + $this.cursor = (($this.limit - v_10) | 0); + break lab10; + } + $this.bra = cursor$7 = $this.cursor; + if (! (! ($this.I_p2 <= cursor$7) ? false : true)) { + $this.cursor = (($this.limit - v_10) | 0); + break lab10; + } + switch (among_var) { + case 0: + $this.cursor = (($this.limit - v_10) | 0); + break lab10; + case 1: + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "")) { + return false; + } + break; + } + } + break; + } + } + $this.cursor = (($this.limit - v_4) | 0); + return true; +}; + +GermanStemmer.r_standard_suffix$LGermanStemmer$ = GermanStemmer$r_standard_suffix$LGermanStemmer$; + +GermanStemmer.prototype.stem$ = function () { + var v_1; + var v_2; + var v_4; + var lab0; + var lab1; + var lab2; + var lab3; + var cursor$0; + var cursor$1; + var cursor$2; + v_1 = this.cursor; + lab0 = true; +lab0: + while (lab0 === true) { + lab0 = false; + if (! GermanStemmer$r_prelude$LGermanStemmer$(this)) { + break lab0; + } + } + cursor$0 = this.cursor = v_1; + v_2 = cursor$0; + lab1 = true; +lab1: + while (lab1 === true) { + lab1 = false; + if (! GermanStemmer$r_mark_regions$LGermanStemmer$(this)) { + break lab1; + } + } + cursor$1 = this.cursor = v_2; + this.limit_backward = cursor$1; + this.cursor = this.limit; + lab2 = true; +lab2: + while (lab2 === true) { + lab2 = false; + if (! GermanStemmer$r_standard_suffix$LGermanStemmer$(this)) { + break lab2; + } + } + cursor$2 = this.cursor = this.limit_backward; + v_4 = cursor$2; + lab3 = true; +lab3: + while (lab3 === true) { + lab3 = false; + if (! GermanStemmer$r_postlude$LGermanStemmer$(this)) { + break lab3; + } + } + this.cursor = v_4; + return true; +}; + +GermanStemmer.prototype.stem = GermanStemmer.prototype.stem$; + +GermanStemmer.prototype.equals$X = function (o) { + return o instanceof GermanStemmer; +}; + +GermanStemmer.prototype.equals = GermanStemmer.prototype.equals$X; + +function GermanStemmer$equals$LGermanStemmer$X($this, o) { + return o instanceof GermanStemmer; +}; + +GermanStemmer.equals$LGermanStemmer$X = GermanStemmer$equals$LGermanStemmer$X; + +GermanStemmer.prototype.hashCode$ = function () { + var classname; + var hash; + var i; + var char; + classname = "GermanStemmer"; + hash = 0; + for (i = 0; i < classname.length; i++) { + char = classname.charCodeAt(i); + hash = (hash << 5) - hash + char; + hash = hash & hash; + } + return (hash | 0); +}; + +GermanStemmer.prototype.hashCode = GermanStemmer.prototype.hashCode$; + +function GermanStemmer$hashCode$LGermanStemmer$($this) { + var classname; + var hash; + var i; + var char; + classname = "GermanStemmer"; + hash = 0; + for (i = 0; i < classname.length; i++) { + char = classname.charCodeAt(i); + hash = (hash << 5) - hash + char; + hash = hash & hash; + } + return (hash | 0); +}; + +GermanStemmer.hashCode$LGermanStemmer$ = GermanStemmer$hashCode$LGermanStemmer$; + +GermanStemmer.serialVersionUID = 1; +$__jsx_lazy_init(GermanStemmer, "methodObject", function () { + return new GermanStemmer(); +}); +$__jsx_lazy_init(GermanStemmer, "a_0", function () { + return [ new Among("", -1, 6), new Among("U", 0, 2), new Among("Y", 0, 1), new Among("\u00E4", 0, 3), new Among("\u00F6", 0, 4), new Among("\u00FC", 0, 5) ]; +}); +$__jsx_lazy_init(GermanStemmer, "a_1", function () { + return [ new Among("e", -1, 2), new Among("em", -1, 1), new Among("en", -1, 2), new Among("ern", -1, 1), new Among("er", -1, 1), new Among("s", -1, 3), new Among("es", 5, 2) ]; +}); +$__jsx_lazy_init(GermanStemmer, "a_2", function () { + return [ new Among("en", -1, 1), new Among("er", -1, 1), new Among("st", -1, 2), new Among("est", 2, 1) ]; +}); +$__jsx_lazy_init(GermanStemmer, "a_3", function () { + return [ new Among("ig", -1, 1), new Among("lich", -1, 1) ]; +}); +$__jsx_lazy_init(GermanStemmer, "a_4", function () { + return [ new Among("end", -1, 1), new Among("ig", -1, 2), new Among("ung", -1, 1), new Among("lich", -1, 3), new Among("isch", -1, 2), new Among("ik", -1, 2), new Among("heit", -1, 3), new Among("keit", -1, 4) ]; +}); +GermanStemmer.g_v = [ 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32, 8 ]; +GermanStemmer.g_s_ending = [ 117, 30, 5 ]; +GermanStemmer.g_st_ending = [ 117, 30, 4 ]; + +var $__jsx_classMap = { + "src/among.jsx": { + Among: Among, + Among$SII: Among, + Among$SIIF$LBaseStemmer$B$LBaseStemmer$: Among$0 + }, + "src/stemmer.jsx": { + Stemmer: Stemmer, + Stemmer$: Stemmer + }, + "src/base-stemmer.jsx": { + BaseStemmer: BaseStemmer, + BaseStemmer$: BaseStemmer + }, + "src/german-stemmer.jsx": { + GermanStemmer: GermanStemmer, + GermanStemmer$: GermanStemmer + } +}; + + +})(JSX); + +var Among = JSX.require("src/among.jsx").Among; +var Among$SII = JSX.require("src/among.jsx").Among$SII; +var Stemmer = JSX.require("src/stemmer.jsx").Stemmer; +var BaseStemmer = JSX.require("src/base-stemmer.jsx").BaseStemmer; +var GermanStemmer = JSX.require("src/german-stemmer.jsx").GermanStemmer; diff --git a/v24.04/de/_static/ajax-loader.gif b/v24.04/de/_static/ajax-loader.gif new file mode 100644 index 0000000..61faf8c Binary files /dev/null and b/v24.04/de/_static/ajax-loader.gif differ diff --git a/v24.04/de/_static/basic.css b/v24.04/de/_static/basic.css new file mode 100644 index 0000000..0807176 --- /dev/null +++ b/v24.04/de/_static/basic.css @@ -0,0 +1,676 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li div.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 450px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px 7px 0 7px; + background-color: #ffe; + width: 40%; + float: right; +} + +p.sidebar-title { + font-weight: bold; +} + +/* -- topics ---------------------------------------------------------------- */ + +div.topic { + border: 1px solid #ccc; + padding: 7px 7px 0 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +div.admonition dl { + margin-bottom: 0; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist td { + vertical-align: top; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +dl { + margin-bottom: 15px; +} + +dd p { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; +} + +td.linenos pre { + padding: 5px 0px; + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + margin-left: 0.5em; +} + +table.highlighttable td { + padding: 0 0.5em 0 0.5em; +} + +div.code-block-caption { + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +div.code-block-caption + div > div.highlight > pre { + margin-top: 0; +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + padding: 1em 1em 0; +} + +div.literal-block-wrapper div.highlight { + margin: 0; +} + +code.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; +} + +code.descclassname { + background-color: transparent; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: relative; + left: 0px; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/v24.04/de/_static/comment-bright.png b/v24.04/de/_static/comment-bright.png new file mode 100644 index 0000000..15e27ed Binary files /dev/null and b/v24.04/de/_static/comment-bright.png differ diff --git a/v24.04/de/_static/comment-close.png b/v24.04/de/_static/comment-close.png new file mode 100644 index 0000000..4d91bcf Binary files /dev/null and b/v24.04/de/_static/comment-close.png differ diff --git a/v24.04/de/_static/comment.png b/v24.04/de/_static/comment.png new file mode 100644 index 0000000..dfbc0cb Binary files /dev/null and b/v24.04/de/_static/comment.png differ diff --git a/v24.04/de/_static/contentui.css b/v24.04/de/_static/contentui.css new file mode 100644 index 0000000..326d3da --- /dev/null +++ b/v24.04/de/_static/contentui.css @@ -0,0 +1,132 @@ +/* + * right column for sphinx_rtd_theme + */ +.clear { + clear: both; +} + +@media screen and (min-width: 1300px) { + .wy-nav-content { + max-width: none; + } + + .with-columns .wy-nav-content { + background: linear-gradient(90deg, #fcfcfc 52%, #eeeeee 52%); + } + + .with-columns .wy-nav-content .wy-breadcrumbs , + .with-columns .section > h1, + .with-columns .section > h2, + .with-columns .section > h3, + .with-columns footer { + width: 50%; + } + + .with-columns .section { + clear: both; + } + + .left-col.container { + float: left; + width: 50%; + margin-right: 4%; + } + + .right-col.container { + float: left; + width: 45%; + } + + /* + * tab selector fixed in top + */ + .with-columns .contenttab-selector.in-right-col { + display: block; + position: fixed; + top: 0; + right: 0; + width: calc(48% - 144px); + background: #444; + padding: 5px 10px; + } + +} + +/** + * + */ +.toggle-tab { + margin-bottom: 40px; +} + +.toggle-header { + display: block; + clear: both; + cursor: pointer; +} +.toggle-header strong {color: #2980b9 } + +.toggle-header:after { + content: " ▼"; +} + +.toggle-header.open:after { + content: " ▲"; +} + +.toggle-content { + display: none; + margin-bottom: 20px; +} + +/* + * tab menu + */ +ul.contenttab-selector { + display:block; + list-style-type: none; + margin: 0 0 10px; + padding: 0; + line-height: normal; + overflow: auto; +} +ul.contenttab-selector li { + display: block; + cursor: pointer; + font-weight: bold; + margin: 0 5px 0 0; + padding: 5px 10px; + float: left; + background-color: #999; + color: #fff; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; + -khtml-border-radius: 5px; +} +.rst-content .section ul.contenttab-selector, +.rst-content .toctree-wrapper ul.contenttab-selector, +article ul.contenttab-selector{ + line-height: normal; + margin: 0 0 10px; +} +.rst-content .section ul.contenttab-selector li, +.rst-content .toctree-wrapper ul.contenttab-selector li, +article ul.contenttab-selector li{ + margin-left: 0; +} +ul.contenttab-selector li:hover { + background-color: #777; +} +ul.contenttab-selector li.selected { + background-color: #2980b9; +} +ul.contenttab-selector li.selected:hover { + background-color: #333; +} +.content-tabs { + margin: 10px 0 20px 0; +} +.tab-content { + clear: both; +} diff --git a/v24.04/de/_static/contentui.js b/v24.04/de/_static/contentui.js new file mode 100644 index 0000000..6ecdb2f --- /dev/null +++ b/v24.04/de/_static/contentui.js @@ -0,0 +1,74 @@ + +$(function() { + /* + * Right column logic + */ + if ($(".right-col").length) { + $(".right-col").after('
'); + $(".right-col").parents('body').addClass('with-columns'); + } + + /** + * Toggle logic + */ + $('.toggle-content').hide() + $('.toggle-header').click(function () { + $(this).toggleClass("open"); + $(this).next('.toggle-content').toggle('400'); + }) + + /** + * Dynamic multiple content block. + */ + var top_sel = {} + + $('div.content-tabs').each(function() { + var contenttab_sel = $('
    ', { class: "contenttab-selector" }); + var i = 0; + + if ($(this).hasClass('right-col')){ + contenttab_sel.addClass('in-right-col'); + } + + $('.tab-content', this).each(function() { + var sel_item = $('
  • ', { + class: $(this).attr('id'), + text: $(this).find('.tab-title').text() + }); + $(this).find('.tab-title').remove(); + if (i++) { + $(this).hide(); + } else { + sel_item.addClass('selected'); + } + contenttab_sel.append(sel_item); + $(this).addClass('contenttab'); + }); + + $('.tab-content', this).eq(0).before(contenttab_sel); + contenttab_sel = null; + i = null; + }); + + + $('.contenttab-selector li').click(function(evt) { + evt.preventDefault(); + + if ($(this).parents('.in-right-col').length){ + var tabsblock = $('.right-col'); + }else{ + var tabsblock = $(this).parents('.content-tabs'); + } + + var sel_class = $(this).attr('class'); + $('div.contenttab',tabsblock).hide(); + $('div#' + sel_class,tabsblock).show(); + + $('ul.contenttab-selector li', tabsblock).removeClass('selected'); + $('ul.contenttab-selector li.' + sel_class, tabsblock).addClass('selected'); + + sel_class = null; + }); + +}); + diff --git a/v24.04/de/_static/css/badge_only.css b/v24.04/de/_static/css/badge_only.css new file mode 100644 index 0000000..cb09245 --- /dev/null +++ b/v24.04/de/_static/css/badge_only.css @@ -0,0 +1,221 @@ +@charset "UTF-8"; +.fa:before { + -webkit-font-smoothing: antialiased; +} + +.clearfix { + *zoom: 1; +} +.clearfix:before, .clearfix:after { + display: table; + content: ""; +} +.clearfix:after { + clear: both; +} + +@font-face { + font-family: FontAwesome; + font-weight: normal; + font-style: normal; + src: url("../fonts/fontawesome-webfont.eot"); + src: url("../fonts/fontawesome-webfont.eot?#iefix") format("embedded-opentype"), url("../fonts/fontawesome-webfont.woff") format("woff"), url("../fonts/fontawesome-webfont.ttf") format("truetype"), url("../fonts/fontawesome-webfont.svg#FontAwesome") format("svg"); +} +.fa:before { + display: inline-block; + font-family: FontAwesome; + font-style: normal; + font-weight: normal; + line-height: 1; + text-decoration: inherit; +} + +a .fa { + display: inline-block; + text-decoration: inherit; +} + +li .fa { + display: inline-block; +} +li .fa-large:before, +li .fa-large:before { + /* 1.5 increased font size for fa-large * 1.25 width */ + width: 1.875em; +} + +ul.fas { + list-style-type: none; + margin-left: 2em; + text-indent: -0.8em; +} +ul.fas li .fa { + width: 0.8em; +} +ul.fas li .fa-large:before, +ul.fas li .fa-large:before { + /* 1.5 increased font size for fa-large * 1.25 width */ + vertical-align: baseline; +} + +.fa-book:before { + content: ""; +} + +.icon-book:before { + content: ""; +} + +.fa-caret-down:before { + content: ""; +} + +.icon-caret-down:before { + content: ""; +} + +.fa-caret-up:before { + content: ""; +} + +.icon-caret-up:before { + content: ""; +} + +.fa-caret-left:before { + content: ""; +} + +.icon-caret-left:before { + content: ""; +} + +.fa-caret-right:before { + content: ""; +} + +.icon-caret-right:before { + content: ""; +} + +.rst-versions { + position: fixed; + bottom: 0; + left: 0; + width: 300px; + color: #fcfcfc; + background: #1f1d1d; + border-top: solid 10px #343131; + font-family: "Lato", "proxima-nova", "Helvetica Neue", Arial, sans-serif; + z-index: 400; +} +.rst-versions a { + color: #2980B9; + text-decoration: none; +} +.rst-versions .rst-badge-small { + display: none; +} +.rst-versions .rst-current-version { + padding: 12px; + background-color: #272525; + display: block; + text-align: right; + font-size: 90%; + cursor: pointer; + color: #27AE60; + *zoom: 1; +} +.rst-versions .rst-current-version:before, .rst-versions .rst-current-version:after { + display: table; + content: ""; +} +.rst-versions .rst-current-version:after { + clear: both; +} +.rst-versions .rst-current-version .fa { + color: #fcfcfc; +} +.rst-versions .rst-current-version .fa-book { + float: left; +} +.rst-versions .rst-current-version .icon-book { + float: left; +} +.rst-versions .rst-current-version.rst-out-of-date { + background-color: #E74C3C; + color: #fff; +} +.rst-versions .rst-current-version.rst-active-old-version { + background-color: #F1C40F; + color: #000; +} +.rst-versions.shift-up .rst-other-versions { + display: block; +} +.rst-versions .rst-other-versions { + font-size: 90%; + padding: 12px; + color: gray; + display: none; +} +.rst-versions .rst-other-versions hr { + display: block; + height: 1px; + border: 0; + margin: 20px 0; + padding: 0; + border-top: solid 1px #413d3d; +} +.rst-versions .rst-other-versions dd { + display: inline-block; + margin: 0; +} +.rst-versions .rst-other-versions dd a { + display: inline-block; + padding: 6px; + color: #fcfcfc; +} +.rst-versions.rst-badge { + width: auto; + bottom: 20px; + right: 20px; + left: auto; + border: none; + max-width: 300px; +} +.rst-versions.rst-badge .icon-book { + float: none; +} +.rst-versions.rst-badge .fa-book { + float: none; +} +.rst-versions.rst-badge.shift-up .rst-current-version { + text-align: right; +} +.rst-versions.rst-badge.shift-up .rst-current-version .fa-book { + float: left; +} +.rst-versions.rst-badge.shift-up .rst-current-version .icon-book { + float: left; +} +.rst-versions.rst-badge .rst-current-version { + width: auto; + height: 30px; + line-height: 30px; + padding: 0 6px; + display: block; + text-align: center; +} + +@media screen and (max-width: 768px) { + .rst-versions { + width: 85%; + display: none; + } + .rst-versions.shift { + display: block; + } +} + +/*# sourceMappingURL=badge_only.css.map */ diff --git a/v24.04/de/_static/css/badge_only.css.map b/v24.04/de/_static/css/badge_only.css.map new file mode 100644 index 0000000..05bb674 --- /dev/null +++ b/v24.04/de/_static/css/badge_only.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": ";AAyDA,UAAY;EACV,sBAAsB,EAAE,WAAW;;;AAqDrC,SAAS;EARP,KAAK,EAAE,CAAC;;AACR,iCAAS;EAEP,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,EAAE;;AACb,eAAO;EACL,KAAK,EAAE,IAAI;;;AC1Gb,UAkBC;EAjBC,WAAW,ECFJ,WAAW;EDGlB,WAAW,EAHqC,MAAM;EAItD,UAAU,EAJsD,MAAM;EAapE,GAAG,EAAE,uCAAwB;EAC7B,GAAG,EAAE,kQAG2D;;ACftE,UAAU;EACR,OAAO,EAAE,YAAY;EACrB,WAAW,EAAE,WAAW;EACxB,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,MAAM;EACnB,WAAW,EAAE,CAAC;EACd,eAAe,EAAE,OAAO;;;AAG1B,KAAK;EACH,OAAO,EAAE,YAAY;EACrB,eAAe,EAAE,OAAO;;;AAIxB,MAAG;EACD,OAAO,EAAE,YAAY;;AACvB;mBAAiB;;EAGf,KAAK,EAAE,OAAY;;;AAEvB,MAAM;EACJ,eAAe,EAAE,IAAI;EACrB,WAAW,EAAE,GAAG;EAChB,WAAW,EAAE,MAAM;;AAEjB,aAAG;EACD,KAAK,EAAE,KAAI;;AACb;0BAAiB;;EAGf,cAAc,EAAE,QAAQ;;;AAG9B,eAAe;EACb,OAAO,EAAE,GAAO;;;AAElB,iBAAiB;EACf,OAAO,EAAE,GAAO;;;AAElB,qBAAqB;EACnB,OAAO,EAAE,GAAO;;;AAElB,uBAAuB;EACrB,OAAO,EAAE,GAAO;;;AAElB,mBAAmB;EACjB,OAAO,EAAE,GAAO;;;AAElB,qBAAqB;EACnB,OAAO,EAAE,GAAO;;;AAElB,qBAAqB;EACnB,OAAO,EAAE,GAAO;;;AAElB,uBAAuB;EACrB,OAAO,EAAE,GAAO;;;AAElB,sBAAsB;EACpB,OAAO,EAAE,GAAO;;;AAElB,wBAAwB;EACtB,OAAO,EAAE,GAAO;;;ACnElB,aAAa;EACX,QAAQ,EAAE,KAAK;EACf,MAAM,EAAE,CAAC;EACT,IAAI,EAAE,CAAC;EACP,KAAK,EC6E+B,KAAK;ED5EzC,KAAK,EEuC+B,OAAyB;EFtC7D,UAAU,EAAE,OAAkC;EAC9C,UAAU,EAAE,kBAAiC;EAC7C,WAAW,EEkDyB,2DAA2D;EFjD/F,OAAO,EC+E6B,GAAG;;AD9EvC,eAAC;EACC,KAAK,EEkC6B,OAAK;EFjCvC,eAAe,EAAE,IAAI;;AACvB,8BAAgB;EACd,OAAO,EAAE,IAAI;;AACf,kCAAoB;EAClB,OAAO,EAAE,IAAqB;EAC9B,gBAAgB,EAAE,OAAkC;EACpD,OAAO,EAAE,KAAK;EACd,UAAU,EAAE,KAAK;EACjB,SAAS,EAAE,GAAG;EACd,MAAM,EAAE,OAAO;EACf,KAAK,EEX6B,OAAM;EL4F1C,KAAK,EAAE,CAAC;;AACR,mFAAS;EAEP,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,EAAE;;AACb,wCAAO;EACL,KAAK,EAAE,IAAI;;AGrFX,sCAAG;EACD,KAAK,EEmB2B,OAAyB;;AFlB3D,2CAAQ;EACN,KAAK,EAAE,IAAI;;AACb,6CAAU;EACR,KAAK,EAAE,IAAI;;AACb,kDAAiB;EACf,gBAAgB,ECQgB,OAAI;EDPpC,KAAK,EEO2B,IAAM;;AFNxC,yDAAwB;EACtB,gBAAgB,EEsBgB,OAAO;EFrBvC,KAAK,ECzB2B,IAAI;;AD0BxC,0CAA8B;EAC5B,OAAO,EAAE,KAAK;;AAChB,iCAAmB;EACjB,SAAS,EAAE,GAAG;EACd,OAAO,EAAE,IAAqB;EAC9B,KAAK,EEJ6B,IAAY;EFK9C,OAAO,EAAE,IAAI;;AACb,oCAAE;EACA,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,GAAG;EACX,MAAM,EAAE,CAAC;EACT,MAAM,EAAE,MAAM;EACd,OAAO,EAAE,CAAC;EACV,UAAU,EAAE,iBAA6C;;AAC3D,oCAAE;EACA,OAAO,EAAE,YAAY;EACrB,MAAM,EAAE,CAAC;;AACT,sCAAC;EACC,OAAO,EAAE,YAAY;EACrB,OAAO,EAAE,GAAqB;EAC9B,KAAK,EEZyB,OAAyB;;AFa7D,uBAAW;EACT,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,KAAK,EAAE,IAAI;EACX,IAAI,EAAE,IAAI;EACV,MAAM,EAAE,IAAI;EACZ,SAAS,ECkByB,KAAK;;ADjBvC,kCAAU;EACR,KAAK,EAAE,IAAI;;AACb,gCAAQ;EACN,KAAK,EAAE,IAAI;;AACb,qDAA+B;EAC7B,UAAU,EAAE,KAAK;;AACjB,8DAAQ;EACN,KAAK,EAAE,IAAI;;AACb,gEAAU;EACR,KAAK,EAAE,IAAI;;AACf,4CAAoB;EAClB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,KAAuB;EAChC,OAAO,EAAE,KAAK;EACd,UAAU,EAAE,MAAM;;;AGhDpB,oCAAsB;EHmDxB,aAAa;IACX,KAAK,EAAE,GAAG;IACV,OAAO,EAAE,IAAI;;EACb,mBAAO;IACL,OAAO,EAAE,KAAK", +"sources": ["../../../bower_components/wyrm/sass/wyrm_core/_mixin.sass","../../../bower_components/bourbon/dist/css3/_font-face.scss","../../../sass/_theme_badge_fa.sass","../../../sass/_theme_badge.sass","../../../bower_components/wyrm/sass/wyrm_core/_wy_variables.sass","../../../sass/_theme_variables.sass","../../../bower_components/neat/app/assets/stylesheets/grid/_media.scss"], +"names": [], +"file": "badge_only.css" +} diff --git a/v24.04/de/_static/css/basler.css b/v24.04/de/_static/css/basler.css new file mode 100644 index 0000000..749ab2d --- /dev/null +++ b/v24.04/de/_static/css/basler.css @@ -0,0 +1,330 @@ +@import url("https://fonts.googleapis.com/css2?family=Roboto&display=swap"); +body, h1, h2, h3, h4, h5, h6, a, ul, li, p, span { + font-family: "Roboto", sans-serif; } + +.menuselection { + font-weight: 600; } + +.wy-nav-content { + background-color: #ffffff; + max-width: 900px; } + +.wy-nav-content-wrap { + background-color: #eaecee; } + +.codeblock, pre.literal-block, .rst-content .literal-block, .rst-content pre.literal-block, div[class^='highlight'] { + background-color: #f8f9f9; } + +body { + color: #000000; } + +b, strong { + vertical-align: top; } + +p, dd { + font-size: 16px; + color: #000000; + line-height: 1.5em; } + +p.first { + margin-bottom: 0 !important; } + +h1, h2, .rst-content .toctree-wrapper p.caption, h3, h4, h5, h6, legend { + font-weight: 100; + font-size: 25px; + color: #66696d; + font-weight: 100; + margin-bottom: 0px; + line-height: 28px; + text-overflow: ellipsis; + display: block; + white-space: nowrap; } + +h1, h2, h3, h4, h5, h6 { + margin-bottom: 20px; } + +h1 { + font-size: 25px; } + +h2 { + font-size: 22px; } + +h3 { + font-size: 18px; + font-weight: 500; } + +h4 { + font-size: 16px; + font-weight: 600; } + +a { + color: #15487f; } + a:active { + color: #15487f; } + a:visited { + color: #15487f; } + a:hover { + color: #1c61ab; + text-decoration: underline; } + +.wy-nav-top { + background-color: #15487f; } + @media (max-width: 768px) { + .wy-nav-top a { + color: #FFF; } + .wy-nav-top a:hover { + color: #FFF; } + .wy-nav-top a:visited { + color: #FFF; } } + .wy-nav-top i { + color: #FFF; } + +.wy-nav-side { + background-color: #15487f; + border-right: 1px solid rgba(255, 255, 255, 0.2); } + +.wy-side-nav-search { + background-color: #15487f; } + +.wy-side-nav-search input[type=text] { + border: none; + font-size: 14px; + font-weight: 400; + color: #000000; + text-align: left; + border: 1px solid #dbdbdb; + background-color: #ffffff; + height: 36px; + border-radius: 2px; + margin-top: 2px; + margin-bottom: 2px; + padding-left: 10px; + padding-right: 10px; } + +.wy-side-nav-search > a { + line-height: 20px; + color: #fff; } + .wy-side-nav-search > a:hover { + color: #fff; + text-decoration: none; + background-color: transparent; } + .wy-side-nav-search > a:before { + content: ""; + width: 180px; + height: 50px; + background: url(../img/logo_basler.svg) no-repeat 20px center; + display: block; + margin: 0 auto; + margin-bottom: 20px; } + +.wy-menu-vertical header, .wy-menu-vertical p.caption, .wy-menu-vertical a { + color: #ffffff; } + +.wy-menu-vertical a:hover { + background-color: #113c69; } + +.wy-menu-vertical li.current { + background-color: #15487f; } + +.wy-menu-vertical li.current a:hover { + background-color: #113c69; } + +.wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a, .wy-menu-vertical li.toctree-l3.current > a, .wy-menu-vertical li.toctree-l2.current > a, .wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a, .wy-menu-vertical li.toctree-l4 li.toctree-l5.current > a { + background-color: #15487f; } + .wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a:hover, .wy-menu-vertical li.toctree-l3.current > a:hover, .wy-menu-vertical li.toctree-l2.current > a:hover, .wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a:hover, .wy-menu-vertical li.toctree-l4 li.toctree-l5.current > a:hover { + background-color: #113c69; } + +.wy-menu-vertical li.current a { + color: #FFF; } + +.wy-menu-vertical li a, .wy-menu-vertical li.on a span.toctree-expand, .wy-menu-vertical li.current > a span.toctree-expand, .wy-menu-vertical li.toctree-l3 span.toctree-expand, .wy-menu-vertical li.toctree-l2 span.toctree-expand { + line-height: 26px; } + +.wy-menu-vertical li.current a { + border-color: transparent; } + +.wy-menu-vertical li.on a, .wy-menu-vertical li.current > a { + background-color: rgba(0, 0, 0, 0.2); + border: none; + border-bottom: 2px solid #f99c34; } + .wy-menu-vertical li.on a:hover, .wy-menu-vertical li.current > a:hover { + background-color: rgba(0, 0, 0, 0.2); } + +.wy-menu-vertical li a:hover { + background-color: rgba(0, 0, 0, 0.2) !important; + color: rgba(255, 255, 255, 0.9); } + +.wy-menu-vertical a { + padding-left: 1.618em; } + +.wy-menu-vertical li.current a { + padding-left: 1.618em; } + +.wy-menu-vertical li.toctree-l2.current > a { + padding-left: 3em; + background-color: rgba(0, 0, 0, 0.2); } + +.wy-menu-vertical li.toctree-l2 > a { + padding-left: 3em; } + +.wy-menu-vertical li.toctree-l3.current > a { + padding-left: 4.5em; + background-color: rgba(0, 0, 0, 0.2) !important; } + +.wy-menu-vertical li.toctree-l3 > a { + padding-left: 4.5em; } + +.wy-menu-vertical li.toctree-l4.current > a { + padding-left: 5.5em; + background-color: rgba(0, 0, 0, 0.2) !important; } + +.wy-menu-vertical li.toctree-l4 > a { + padding-left: 5.5em; } + +.wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a { + padding-left: 4.5em; } + +.wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a { + padding-left: 5.5em; } + +.wy-menu-vertical li.on a span.toctree-expand, .wy-menu-vertical li.current > a span.toctree-expand { + color: #FFF; } + .wy-menu-vertical li.on a span.toctree-expand:hover, .wy-menu-vertical li.current > a span.toctree-expand:hover { + opacity: 0.9; } + +.wy-menu-vertical li span.toctree-expand { + color: rgba(255, 255, 255, 0); } + +.btn { + padding-top: 0px; + padding-bottom: 0px; + line-height: 34px; + height: 36px; + border-radius: 2px; + margin: 0px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin-top: 2px; + margin-bottom: 2px; + box-shadow: none; } + .btn:hover { + color: #333; + background-color: #e6e6e6 !important; + border-color: #adadad; + text-decoration: none; } + +.btn-neutral { + font-size: 14px; + font-weight: 600; + color: #66696d; + text-align: center; + border: 1px solid #dbdbdb; + border-radius: 2px; + overflow: hidden; + background: #f4f4f4; + /* Old browsers */ + background: -moz-linear-gradient(top, #ffffff 0%, #f5f5f5 100%); + /* FF3.6-15 */ + background: -webkit-linear-gradient(top, #ffffff 0%, #f5f5f5 100%); + /* Chrome10-25,Safari5.1-6 */ + background: linear-gradient(to bottom, #ffffff 0%, #f5f5f5 100%); + /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#f5f5f5',GradientType=0 ); + /* IE6-9 */ } + +.rst-content .sidebar .sidebar-title { + background-color: #dcdfe3; + font-family: "Roboto", sans-serif; } + +.rst-content .sidebar { + background-color: #f8f9f9; + border: 1px solid #e1e4e5; } + +.rst-content .admonition .admonition-title { + background-color: #f99c34; } +.rst-content .admonition.attention { + background-color: #fde4c9; } + .rst-content .admonition.attention .admonition-title { + background-color: #f99c34; } +.rst-content .admonition.caution { + background-color: #fde4c9; } + .rst-content .admonition.caution .admonition-title { + background-color: #f99c34; } +.rst-content .admonition.danger { + background-color: #fec9c2; } + .rst-content .admonition.danger .admonition-title { + background-color: #f22002; } +.rst-content .admonition.error { + background-color: #fec9c2; } + .rst-content .admonition.error .admonition-title { + background-color: #f22002; } +.rst-content .admonition.hint { + background-color: #ABF0AB; } + .rst-content .admonition.hint .admonition-title { + background-color: #00b000; } +.rst-content .admonition.important { + background-color: #ABF0AB; } + .rst-content .admonition.important .admonition-title { + background-color: #00b000; } +.rst-content .admonition.note { + background-color: rgba(20, 72, 126, 0.25); } + .rst-content .admonition.note .admonition-title { + background-color: rgba(20, 72, 126, 0.5); + margin: -12px; } + .rst-content .admonition.note p, .rst-content .admonition.note ul { + margin-top: 0.5em; } +.rst-content .admonition.tip { + background-color: #ABF0AB; } + .rst-content .admonition.tip .admonition-title { + background-color: #00b000; } +.rst-content .admonition.warning { + background-color: #fde4c9; } + .rst-content .admonition.warning .admonition-title { + background-color: #f99c34; + margin: -12px; } + .rst-content .admonition.warning p, .rst-content .admonition.warning ul { + margin-top: 0.5em; } + +.wy-table thead th, .rst-content table.docutils thead th, .rst-content table.field-list thead th { + border: solid 1px #e1e4e5; + border-bottom: solid 2px #e1e4e5; } + +table .first.last.line-block { + margin-left: 0; } +table .headerlink { + display: none; } +table col { + width: auto !important; } + +.math { + position: relative; } + .math .eqno { + position: absolute; + right: 0; + top: 0; } + .math .eqno .headerlink { + display: none; } + +.wy-table-responsive table td, .wy-table-responsive table th { + white-space: normal; } + +.rst-versions { + box-shadow: -2px -3px 6px rgba(0, 0, 0, 0.4); + border-top: none; + color: #FFF; + background-color: #15487f; + font-family: "Kuka Bulo", "Calibri", Helvetica, sans-serif; } + .rst-versions .rst-other-versions dd a { + color: #f99c34; + padding-left: 0; } + .rst-versions .rst-current-version { + background-color: #0e2f53; + color: #FFFFFF; } + .rst-versions .rst-other-versions { + color: #FFF; } + +.rst-current-version .fa.fa-cog { + float: left; } + +/*# sourceMappingURL=basler.css.map */ diff --git a/v24.04/de/_static/css/basler.css.map b/v24.04/de/_static/css/basler.css.map new file mode 100644 index 0000000..23f259a --- /dev/null +++ b/v24.04/de/_static/css/basler.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "AACQ,2EAAmE;AAiC3E,gDAAiD;EAC/C,WAAW,EAhCa,oBAAoB;;AAmC9C,cAAe;EACb,WAAW,EAAE,GAAG;;AAGlB,eAAgB;EACd,gBAAgB,EA9BQ,OAAO;EA+B/B,SAAS,EAAE,KAAK;;AAGlB,oBAAqB;EACnB,gBAAgB,EAvCQ,OAAO;;AA0CjC,mHAAoH;EAClH,gBAAgB,EAAE,OAAkB;;AAKtC,IAAK;EACH,KAAK,EAtDmB,OAAO;;AAyDjC,SAAU;EACR,cAAc,EAAE,GAAG;;AAGrB,KAAM;EACJ,SAAS,EAAE,IAAI;EACf,KAAK,EA/DmB,OAAO;EAgE/B,WAAW,EAAE,KAAK;;AAGpB,OAAQ;EACN,aAAa,EAAE,YAAY;;AAG7B,uEAAwE;EACtE,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,IAAI;EACf,KAAK,EApEmB,OAAO;EAqE/B,WAAW,EArDa,GAAG;EAsD3B,aAAa,EAAE,GAAG;EAClB,WAAW,EAAE,IAAI;EACjB,aAAa,EAAE,QAAQ;EACvB,OAAO,EAAE,KAAK;EACd,WAAW,EAAE,MAAM;;AAGrB,sBAAkB;EAChB,aAAa,EAAE,IAAI;;AAGrB,EAAG;EACD,SAAS,EAAE,IAAI;;AAEjB,EAAG;EACD,SAAS,EAAE,IAAI;;AAEjB,EAAE;EACA,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;;AAElB,EAAE;EACA,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;;AAGlB,CAAE;EACA,KAAK,EAzFmB,OAAO;EA0F/B,QAAS;IACP,KAAK,EA3FiB,OAAO;EA6F/B,SAAU;IACR,KAAK,EA9FiB,OAAO;EAgG/B,OAAQ;IACN,KAAK,EAAE,OAAkB;IACzB,eAAe,EAAE,SAAS;;AAK9B,WAAY;EACV,gBAAgB,EAnHQ,OAAO;EAqH7B,yBAA0B;IAD5B,aAAE;MAEE,KAAK,EAAE,IAAI;MACX,mBAAQ;QACN,KAAK,EAAE,IAAI;MAEb,qBAAU;QACR,KAAK,EAAE,IAAI;EAIjB,aAAE;IACA,KAAK,EAAE,IAAI;;AAGf,YAAa;EACX,gBAAgB,EApIQ,OAAO;EAqI/B,YAAY,EAAE,kCAAkC;;AAGlD,mBAAoB;EAClB,gBAAgB,EAzIQ,OAAO;;AA4IjC,oCAAqC;EACnC,MAAM,EAAE,IAAI;EACZ,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,KAAK,EAnJmB,OAAO;EAoJ/B,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,iBAAiB;EACzB,gBAAgB,EAAE,OAAO;EACzB,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG;EAClB,UAAU,EAAE,GAAG;EACf,aAAa,EAAE,GAAG;EAClB,YAAY,EAAE,IAAI;EAClB,aAAa,EAAE,IAAI;;AAIrB,uBAAwB;EACtB,WAAW,EAAE,IAAI;EACjB,KAAK,EAAE,IAAI;EACX,6BAAQ;IACN,KAAK,EAAE,IAAI;IACX,eAAe,EAAE,IAAI;IACrB,gBAAgB,EAAE,WAAW;EAE/B,8BAAS;IACP,OAAO,EAAE,EAAE;IACX,KAAK,EAAE,KAAK;IACZ,MAAM,EAAE,IAAI;IACZ,UAAU,EAAE,iDAAiD;IAC7D,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,MAAM;IACd,aAAa,EAAE,IAAI;;AAKvB,0EAA2E;EACzE,KAAK,EA5KmB,OAAO;;AA+KjC,yBAA0B;EACxB,gBAAgB,EAAE,OAAuB;;AAG3C,4BAA6B;EAC3B,gBAAgB,EA1LQ,OAAO;;AA4LjC,oCAAqC;EACnC,gBAAgB,EAAE,OAAuB;;AAG3C,yQAA0Q;EACxQ,gBAAgB,EAjMQ,OAAO;EAkM/B,uSAAQ;IACN,gBAAgB,EAAE,OAAuB;;AAI7C,8BAA+B;EAC7B,KAAK,EAAE,IAAI;;AAGb,qOAAoO;EAClO,WAAW,EAAE,IAAI;;AAGnB,8BAA+B;EAC7B,YAAY,EAAE,WAAW;;AAG3B,2DAA4D;EAC1D,gBAAgB,EAAE,kBAAkB;EACpC,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,iBAAqB;EAEpC,uEAAQ;IACN,gBAAgB,EAAE,kBAAkB;;AAGxC,4BAA6B;EAC3B,gBAAgB,EAAE,6BAA6B;EAC/C,KAAK,EAAE,wBACT;;AAEA,mBAAoB;EAClB,YAAY,EAAE,OAAO;;AAEvB,8BAA+B;EAC7B,YAAY,EAAE,OAAO;;AAEvB,2CAA4C;EAC1C,YAAY,EAAE,GAAG;EACjB,gBAAgB,EAAE,kBAAkB;;AAEtC,mCAAoC;EAClC,YAAY,EAAE,GAAG;;AAEnB,2CAA4C;EAC1C,YAAY,EAAE,KAAK;EACnB,gBAAgB,EAAE,6BAA6B;;AAEjD,mCAAmC;EACjC,YAAY,EAAE,KAAK;;AAErB,2CAA4C;EAC1C,YAAY,EAAE,KAAK;EACnB,gBAAgB,EAAE,6BAA6B;;AAEjD,mCAAoC;EAClC,YAAY,EAAE,KAAK;;AAErB,yDAA0D;EACxD,YAAY,EAAE,KAAK;;AAErB,yDAA0D;EACxD,YAAY,EAAE,KAAK;;AAGrB,mGAAoG;EAClG,KAAK,EAAE,IAAI;EACX,+GAAQ;IACN,OAAO,EAAE,GAAG;;AAIhB,wCAAyC;EACvC,KAAK,EAAE,sBACT;;AAIA,IAAI;EACA,WAAW,EAAE,GAAG;EAChB,cAAc,EAAC,GAAG;EAClB,WAAW,EAAE,IAAI;EACjB,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG;EAClB,MAAM,EAAE,GAAG;EACX,WAAW,EAAC,MAAM;EAClB,QAAQ,EAAC,MAAM;EACf,aAAa,EAAC,QAAQ;EACtB,UAAU,EAAE,GAAG;EACf,aAAa,EAAE,GAAG;EAClB,UAAU,EAAE,IAAI;EAChB,UAAQ;IACN,KAAK,EAAE,IAAI;IACX,gBAAgB,EAAE,kBAAkB;IACpC,YAAY,EAAE,OAAO;IACrB,eAAe,EAAE,IAAI;;AAI3B,YAAY;EACR,SAAS,EA/Qa,IAAI;EAgR1B,WAAW,EAtRW,GAAG;EAuRzB,KAAK,EArSiB,OAAO;EAsS7B,UAAU,EAAE,MAAM;EAClB,MAAM,EAAE,iBAA4B;EACpC,aAAa,EAAE,GAAG;EAClB,QAAQ,EAAE,MAAM;EAChB,UAAU,EAzSY,OAAO;EAyST,kBAAkB;EACtC,UAAU,EAAE,mDAAoD;EAAE,cAAc;EAChF,UAAU,EAAE,sDAAsD;EAAE,6BAA6B;EACjG,UAAU,EAAE,oDAAoD;EAAE,sDAAsD;EACxH,MAAM,EAAE,2GAA2G;EAAE,WAAW;;AAKpI,oCAAqC;EACnC,gBAAgB,EAAE,OAAiB;EACnC,WAAW,EA5Ta,oBAAoB;;AA8T9C,qBAAsB;EACpB,gBAAgB,EAAE,OAAkB;EACpC,MAAM,EAAE,iBAAiB;;AAQvB,0CAAkB;EAChB,gBAAgB,EAtUI,OAAO;AAwU7B,kCAAY;EACV,gBAAgB,EAAE,OAAoB;EACtC,oDAAkB;IAChB,gBAAgB,EAhUE,OAAO;AAmU7B,gCAAU;EACR,gBAAgB,EAAE,OAAoB;EACtC,kDAAkB;IAChB,gBAAgB,EAtUE,OAAO;AAyU7B,+BAAS;EACP,gBAAgB,EAAE,OAAiB;EACnC,iDAAkB;IAChB,gBAAgB,EA9UE,OAAO;AAiV7B,8BAAQ;EACN,gBAAgB,EAAE,OAAiB;EACnC,gDAAkB;IAChB,gBAAgB,EApVE,OAAO;AAuV7B,6BAAO;EACL,gBAAgB,EAAE,OAAO;EACzB,+CAAkB;IAChB,gBAAgB,EAzVE,OAAO;AA4V7B,kCAAY;EACV,gBAAgB,EAAE,OAAO;EACzB,oDAAkB;IAChB,gBAAgB,EA/VE,OAAO;AAkW7B,6BAAO;EACL,gBAAgB,EAAE,uBAAoB;EACtC,+CAAkB;IAChB,gBAAgB,EAAE,sBAAmB;IACrC,MAAM,EAAE,KAAK;EAEf,iEAAM;IACJ,UAAU,EAAE,KAAK;AAGrB,4BAAM;EACJ,gBAAgB,EAAE,OAAO;EACzB,8CAAkB;IAChB,gBAAgB,EA/WE,OAAO;AAkX7B,gCAAU;EACR,gBAAgB,EAAE,OAAoB;EACtC,kDAAkB;IAChB,gBAAgB,EApXE,OAAO;IAqXzB,MAAM,EAAE,KAAK;EAEf,uEAAM;IACJ,UAAU,EAAE,KAAK;;AAOzB,gGAAiG;EAC/F,MAAM,EAAE,iBAAiB;EACzB,aAAa,EAAE,iBACjB;;AAGE,4BAAuB;EACrB,WAAW,EAAE,CAAC;AAEhB,iBAAY;EACV,OAAO,EAAE,IAAI;AAEf,SAAI;EACF,KAAK,EAAE,eAAe;;AAM1B,KAAM;EACJ,QAAQ,EAAE,QAAQ;EAClB,WAAM;IACJ,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,CAAC;IACR,GAAG,EAAE,CAAC;IACN,uBAAY;MACV,OAAO,EAAE,IAAI;;AAKnB,4DAA6D;EAC3D,WAAW,EAAE,MAAM;;AAGrB,aAAc;EACZ,UAAU,EAAE,gCAA6B;EACzC,UAAU,EAAE,IAAI;EAChB,KAAK,EAAE,IAAI;EACX,gBAAgB,EAhbQ,OAAO;EAib/B,WAAW,EAAE,6CAA6C;EAC1D,sCAAyB;IACvB,KAAK,EApbiB,OAAO;IAqb7B,YAAY,EAAE,CAAC;EAEjB,kCAAqB;IACnB,gBAAgB,EAAE,OAAwB;IAC1C,KAAK,EAAE,OAAO;EAGhB,iCAAoB;IAClB,KAAK,EAAE,IAAI;;AAGf,+BAAgC;EAC9B,KAAK,EAAE,IAAI", +"sources": ["../../../sass/basler_overrides.scss"], +"names": [], +"file": "basler.css" +} diff --git a/v24.04/de/_static/css/default.css b/v24.04/de/_static/css/default.css new file mode 100644 index 0000000..0ad6e95 --- /dev/null +++ b/v24.04/de/_static/css/default.css @@ -0,0 +1,537 @@ +@import url("https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700"); +body, h1, h2, h3, h4, h5, h6, a, ul, li, p, span { + font-family: "Open Sans", Helvetica, sans-serif; } + +.reference { + white-space: pre; } + +.menuselection { + font-weight: 600; } + +.wy-nav-content { + background-color: #ffffff; + max-width: 900px; } + +.wy-nav-content-wrap { + background-color: #E2E6E9; } + +.codeblock, pre.literal-block, .rst-content .literal-block, .rst-content pre.literal-block, div[class^='highlight'] { + background-color: #f1f3f4; } + +body { + color: #647382; } + +b, strong { + vertical-align: top; } + +p, dd { + font-size: 16px; + color: #647382; + line-height: 1.5em; } + +p.first { + margin-bottom: 0 !important; } + +h1, h2, .rst-content .toctree-wrapper p.caption, h3, h4, h5, h6, legend { + font-weight: 100; + font-size: 25px; + color: #647382; + font-weight: 100; + margin-bottom: 0px; + line-height: 28px; + text-overflow: ellipsis; + display: block; + white-space: nowrap; } + +h1, h2, h3, h4, h5, h6 { + margin-bottom: 20px; } + +h1 { + font-size: 25px; } + +h2 { + font-size: 22px; } + +h3 { + font-size: 18px; + font-weight: 500; } + +h4 { + font-size: 16px; + font-weight: 600; } + +a { + color: #266782; } + a:active { + color: #266782; } + a:visited { + color: #266782; } + a:hover { + color: #3286a9; + text-decoration: underline; } + +@media (min-width: 768px) { + .wy-nav-content { + margin: 0; + padding: 0; + left: 300px; + max-width: 900px; } } + +@media (min-width: 768px) { + .document { + padding-top: 1.618em; + padding-left: 3.236em; + padding-right: 3.236em; } + .document div.section > h1, + .document div.section > h2, + .document div.section > h3, + .document div.section > h4, + .document div.section > h5, + .document div.section > h6, + .document div.section > dl > dt { + padding-top: 70px; + margin-top: -70px; + background: 0; } } + +@media (min-width: 768px) { + .wy-breadcrumbs { + background-color: #46505A; + height: 56px; + color: #FFF; + font-size: 14px; + padding-left: 10px; + position: fixed; + width: 900px; + z-index: 100; } + .wy-breadcrumbs + hr { + display: none; } + .wy-breadcrumbs li { + margin-top: 13px; } + .wy-breadcrumbs li:nth-last-child(2) { + opacity: 0.8; } + .wy-breadcrumbs li a { + color: #FFF; + text-decoration: none; + opacity: 0.8; } + .wy-breadcrumbs li a:hover { + opacity: 1.0; } } + +@media (min-width: 768px) { + .rst-content > footer { + padding-bottom: 1.618em; + padding-top: 0; + padding-left: 3.236em; + padding-right: 3.236em; } } + +@media (min-width: 768px) { + .rst-content > div:first-child { + height: 56px; } } + +.wy-nav-top { + background-color: #46505A; } + @media (max-width: 768px) { + .wy-nav-top a { + color: #FFF; + font-weight: 500; + font-size: 18px; } + .wy-nav-top a:hover { + color: #FFF; } + .wy-nav-top a:visited { + color: #FFF; } } + .wy-nav-top i { + color: #FFF; } + +.wy-nav-side { + background-color: #46505A; } + +.wy-side-nav-search { + background-color: #46505A; + text-align: left; + padding-top: 1px; + padding-left: 14px; } + +.wy-side-nav-search input[type=text] { + border: none; + font-size: 14px; + font-weight: 500; + color: #647382; + text-align: left; + border: 1px solid #dbdbdb; + background-color: #ffffff; + height: 36px; + border-radius: 2px; + margin-top: 2px; + margin-bottom: 2px; + padding-left: 10px; + padding-right: 10px; + margin-left: 5px; + width: 260px; } + +.wy-side-nav-search > div.version { + margin-left: 5px; } + +.wy-side-nav-search > a { + line-height: 1.3; + color: #fff; + font-weight: 500; + font-size: 18px; } + .wy-side-nav-search > a:hover { + color: #fff; + text-decoration: none; + background-color: transparent; } + .wy-side-nav-search > a:before { + content: ""; + width: 300px; + height: 45px; + background: url(../img/logo_roboception.svg) no-repeat; + display: block; + margin: auto auto 10px; } + +.wy-menu-vertical li a em { + display: contents; + font-style: normal; } + +.wy-menu-vertical header, .wy-menu-vertical p.caption, .wy-menu-vertical a { + color: #ffffff; } + +.wy-menu-vertical li { + border-top: 1px solid rgba(255, 255, 255, 0.25); } + +.wy-menu-vertical li a { + border-bottom: 4px solid transparent; + border-top: 4px solid transparent; } + +.wy-menu-vertical li.current { + background-color: #46505A; } + +.wy-menu-vertical li.toctree-l1.current { + background-color: #3a424b; } + +.wy-menu-vertical li.toctree-l1.current ul { + background-color: #3a424b; } + +.wy-menu-vertical li.toctree-l2.current ul { + background-color: #2c333a; } + +.wy-menu-vertical li.toctree-l3.current ul { + background-color: #1f2428; } + +.wy-menu-vertical li.current a { + color: #FFF; } + +.wy-menu-vertical li a { + line-height: 1.3; + height: 42px; + opacity: 0.8; + font-size: 14px; + font-weight: 500; + display: flex; + align-items: center; } + .wy-menu-vertical li a:hover { + opacity: 1.0; } + +.wy-menu-vertical li.current a { + border-color: transparent; } + +.wy-menu-vertical li.on a, .wy-menu-vertical li.current > a { + border-bottom: 4px solid #2D7a99; + border-top: 4px solid transparent; } + +.wy-menu-vertical li.toctree-l1 > a:hover { + background-color: #3a424b; } + .wy-menu-vertical li.toctree-l1 > a:hover span.toctree-expand { + opacity: 1; + color: #FFF; } + +.wy-menu-vertical li.toctree-l2 > a:hover { + background-color: #2c333a; } + .wy-menu-vertical li.toctree-l2 > a:hover span.toctree-expand { + opacity: 1; + color: #FFF; } + +.wy-menu-vertical li.current a { + font-weight: 500; } + .wy-menu-vertical li.current a:hover span.toctree-expand { + color: #FFF; + opacity: 1; } + +.wy-menu-vertical li.toctree-l1.current > a { + background-color: #3a424b; + padding-left: 1.618em; + opacity: 1; } + .wy-menu-vertical li.toctree-l1.current > a:hover { + background-color: #3a424b; } + +.wy-menu-vertical li.toctree-l2.current > a { + background-color: #2c333a; + padding-left: 2.5em; + opacity: 1; } + .wy-menu-vertical li.toctree-l2.current > a:hover { + background-color: #2c333a; } + +.wy-menu-vertical li.toctree-l4.current > a { + background-color: #121417; + padding-left: 4.5em; + opacity: 1; } + .wy-menu-vertical li.toctree-l4.current > a:hover { + background-color: #121417; } + +.wy-menu-vertical li.toctree-l2 > a { + padding-left: 2.5em; } + +.wy-menu-vertical li.toctree-l3 > a { + background-color: #121417; + padding-left: 3.5em; } + +.wy-menu-vertical li.toctree-l4 > a { + background-color: #121417; + padding-left: 4.5em; } + +.wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a { + background-color: #1f2428; + padding-left: 3.5em; + padding-right: 10px; + display: flex; + align-items: center; } + .wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a:hover { + background-color: #121417; } + +.wy-menu-vertical li.toctree-l2.current li.toctree-l3.current > a { + background-color: #121417; + opacity: 1; } + +.wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a { + background-color: #121417; + padding-left: 4.5em; + padding-right: 10px; + display: flex; + align-items: center; } + +.wy-menu-vertical li.toctree-l3 li.toctree-l4.current > a { + border-bottom: 4px solid #2D7a99; + border-top: 4px solid transparent; } + +.wy-menu-vertical li.on a:hover span.toctree-expand, .wy-menu-vertical li.current > a:hover span.toctree-expand, .wy-menu-vertical li > a:hover span.toctree-expand { + opacity: 1.0; } + +.wy-menu-vertical li.current > a span.toctree-expand { + color: #FFF; + line-height: 34px; + padding-right: 5px; + opacity: 1.0; + font-size: 14px; } + .wy-menu-vertical li.current > a span.toctree-expand + em { + display: contents; + font-style: normal; } + +.wy-menu-vertical li.on a span.toctree-expand, +.wy-menu-vertical li > a span.toctree-expand { + color: #FFF; + line-height: 34px; + padding-right: 5px; + opacity: 0; } + .wy-menu-vertical li.on a span.toctree-expand + em, + .wy-menu-vertical li > a span.toctree-expand + em { + display: contents; + font-style: normal; } + +.wy-menu-vertical li span.toctree-expand { + color: #FFF; + opacity: 0; + font-size: 14px; } + +.btn { + padding-top: 0px; + padding-bottom: 0px; + line-height: 34px; + height: 36px; + border-radius: 2px; + margin: 0px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin-top: 2px; + margin-bottom: 2px; + box-shadow: none; } + .btn:hover { + color: #333; + background-color: #e6e6e6 !important; + border-color: #adadad; + text-decoration: none; } + +.btn-neutral { + font-size: 14px; + font-weight: 600; + color: #647382; + text-align: center; + border: 1px solid #dae1e7; + border-radius: 2px; + overflow: hidden; + background: #F9FAFB; + /* Old browsers */ + background: -moz-linear-gradient(top, #ffffff 0%, #f5f5f5 100%); + /* FF3.6-15 */ + background: -webkit-linear-gradient(top, #ffffff 0%, #f5f5f5 100%); + /* Chrome10-25,Safari5.1-6 */ + background: linear-gradient(to bottom, #ffffff 0%, #f5f5f5 100%); + /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#f5f5f5',GradientType=0 ); + /* IE6-9 */ } + +.rst-content dl:not(.docutils) dt { + border-top: 0; + border-bottom: solid 3px #45a2c9; } + +.rst-content dl:not(.docutils) dt:first-child { + margin-top: -70px; } + +.rst-content .sidebar .sidebar-title { + background-color: #d4dade; + font-family: "Open Sans", Helvetica, sans-serif; } + +.rst-content .sidebar { + background-color: #f1f3f4; + border: 1px solid #e1e4e5; } + +.rst-content .admonition .admonition-title { + background-color: #266782; } +.rst-content .admonition.attention { + background-color: #ffeb99; } + .rst-content .admonition.attention .admonition-title { + background-color: #ffcc00; } +.rst-content .admonition.caution { + background-color: #ffeb99; } + .rst-content .admonition.caution .admonition-title { + background-color: #ffcc00; } +.rst-content .admonition.danger { + background-color: #ffeeed; } + .rst-content .admonition.danger .admonition-title { + background-color: #FF2D21; } +.rst-content .admonition.error { + background-color: #ffeeed; } + .rst-content .admonition.error .admonition-title { + background-color: #FF2D21; } +.rst-content .admonition.hint { + background-color: #ABF0AB; } + .rst-content .admonition.hint .admonition-title { + background-color: #07A50F; } +.rst-content .admonition.important { + background-color: #ABF0AB; } + .rst-content .admonition.important .admonition-title { + background-color: #07A50F; } +.rst-content .admonition.note { + background-color: #E2E6E9; } + .rst-content .admonition.note .admonition-title { + background-color: #266782; + margin: -12px; } + .rst-content .admonition.note p, .rst-content .admonition.note ul { + margin-top: 0.5em; } +.rst-content .admonition.tip { + background-color: #ABF0AB; } + .rst-content .admonition.tip .admonition-title { + background-color: #07A50F; } +.rst-content .admonition.warning { + background-color: #fff; + border: 1px solid #FF2D21; } + .rst-content .admonition.warning .admonition-title { + background-color: #FF2D21; + margin: -12px; } + .rst-content .admonition.warning p, .rst-content .admonition.warning ul { + margin-top: 0.5em; } + +.wy-table thead th, .rst-content table.docutils thead th, .rst-content table.field-list thead th { + border: solid 1px #e1e4e5; + border-bottom: solid 2px #e1e4e5; } + +table .first.last.line-block { + margin-left: 0; } +table .headerlink { + display: none; } +table col { + width: auto !important; } + +.math { + position: relative; } + .math .eqno { + position: absolute; + right: 0; + top: 0; } + .math .eqno .headerlink { + display: none; } + +.wy-table-responsive table td, .wy-table-responsive table th { + white-space: normal; } + +@media (min-width: 1200px) { + .rst-versions { + position: fixed; + bottom: unset; + top: 0; + right: 0; + left: 1000px; + width: 200px; + min-height: 56px; + background-color: #3a424b; + height: fit-content; + border-top: 0; + border-left: 1px solid rgba(255, 255, 255, 0.25); } + .rst-versions .rst-current-version { + background-color: #46505A; + color: #FFFFFF; + font-size: 14px; + font-family: "Open Sans", Helvetica, sans-serif; + line-height: 34px; + padding: 11px; + opacity: 0.8; } + .rst-versions .rst-current-version:before { + line-height: 34px; } + .rst-versions .rst-current-version:hover { + opacity: 1; } + .rst-versions .rst-current-version .fa.fa-cog { + line-height: 34px; } + .rst-versions .rst-other-versions dl:last-child dt { + border-top: 1px solid rgba(255, 255, 255, 0.25); + padding-top: 5px; } + .rst-versions .rst-other-versions dt, + .rst-versions .rst-other-versions dd { + color: #FFFFFF; + font-size: 14px; + font-family: "Open Sans", Helvetica, sans-serif; } + .rst-versions .rst-other-versions dt a, + .rst-versions .rst-other-versions dd a { + opacity: 0.8; + text-decoration: none; } + .rst-versions .rst-other-versions dt a:hover, + .rst-versions .rst-other-versions dd a:hover { + opacity: 1.0; } } + +@media (max-width: 1200px) { + .rst-versions { + border-top: 1px solid rgba(255, 255, 255, 0.25); + color: #FFF; + background-color: #46505A; + font-family: "Open Sans", Helvetica, sans-serif; } + .rst-versions .rst-other-versions dd a { + color: #FFF; + padding-left: 0; } + .rst-versions .rst-current-version { + background-color: #3a424b; + color: #FFFFFF; + font-size: 14px; + font-family: "Open Sans", Helvetica, sans-serif; } + .rst-versions .rst-other-versions dt, + .rst-versions .rst-other-versions dd { + color: #FFFFFF; + font-size: 14px; + font-family: "Open Sans", Helvetica, sans-serif; } + .rst-versions .rst-other-versions dt a, + .rst-versions .rst-other-versions dd a { + opacity: 0.8; + text-decoration: none; } + .rst-versions .rst-other-versions dt a:hover, + .rst-versions .rst-other-versions dd a:hover { + opacity: 1.0; } } +.rst-versions .rst-current-version .fa.fa-cog { + float: left; } + +/*# sourceMappingURL=default.css.map */ diff --git a/v24.04/de/_static/css/default.css.map b/v24.04/de/_static/css/default.css.map new file mode 100644 index 0000000..9eaa03c --- /dev/null +++ b/v24.04/de/_static/css/default.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "AACQ,gFAAwE;AAsChF,gDAAiD;EAC/C,WAAW,EArCa,kCAAkC;;AAwC5D,UAAW;EACT,WAAW,EAAE,GAAG;;AAGlB,cAAe;EACb,WAAW,EAAE,GAAG;;AAGlB,eAAgB;EACd,gBAAgB,EAnCQ,OAAO;EAoC/B,SAAS,EAAE,KAAK;;AAGlB,oBAAqB;EACnB,gBAAgB,EA5CQ,OAAO;;AA+CjC,mHAAoH;EAClH,gBAAgB,EAAE,OAAkB;;AAKtC,IAAK;EACH,KAAK,EA/DmB,OAAO;;AAkEjC,SAAU;EACR,cAAc,EAAE,GAAG;;AAGrB,KAAM;EACJ,SAAS,EAAE,IAAI;EACf,KAAK,EAxEmB,OAAO;EAyE/B,WAAW,EAAE,KAAK;;AAGpB,OAAQ;EACN,aAAa,EAAE,YAAY;;AAG7B,uEAAwE;EACtE,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,IAAI;EACf,KAAK,EAzEmB,OAAO;EA0E/B,WAAW,EAzDa,GAAG;EA0D3B,aAAa,EAAE,GAAG;EAClB,WAAW,EAAE,IAAI;EACjB,aAAa,EAAE,QAAQ;EACvB,OAAO,EAAE,KAAK;EACd,WAAW,EAAE,MAAM;;AAGrB,sBAAkB;EAChB,aAAa,EAAE,IAAI;;AAGrB,EAAG;EACD,SAAS,EAAE,IAAI;;AAEjB,EAAG;EACD,SAAS,EAAE,IAAI;;AAEjB,EAAE;EACA,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;;AAElB,EAAE;EACA,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;;AAGlB,CAAE;EACA,KAAK,EA9GmB,OAAO;EA+G/B,QAAS;IACP,KAAK,EAhHiB,OAAO;EAkH/B,SAAU;IACR,KAAK,EAnHiB,OAAO;EAqH/B,OAAQ;IACN,KAAK,EAAE,OAAwB;IAC/B,eAAe,EAAE,SAAS;;AAM5B,yBAA0B;EAD5B,eAAgB;IAEZ,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,KAAK;IACX,SAAS,EAAE,KAAK;;AAKlB,yBAA0B;EAD5B,SAAU;IAEN,WAAW,EAAE,OAAO;IACpB,YAAY,EAAE,OAAO;IACrB,aAAa,EAAE,OAAO;IAEtB;;;;;;mCAMsB;MACpB,WAAW,EAAE,IAAI;MACjB,UAAU,EAAE,KAAK;MACjB,UAAU,EAAE,CAAC;;AAMjB,yBAA0B;EAD5B,eAAgB;IAEZ,gBAAgB,EA1JM,OAAO;IA2J7B,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,IAAI;IACX,SAAS,EAAE,IAAI;IACf,YAAY,EAAE,IAAI;IAClB,QAAQ,EAAE,KAAK;IACf,KAAK,EAAE,KAAK;IACZ,OAAO,EAAE,GAAG;IAEZ,oBAAK;MACH,OAAO,EAAE,IAAI;IAGf,kBAAG;MACD,UAAU,EAAE,IAAI;IAGlB,oCAAqB;MACnB,OAAO,EAAE,GAAG;IAGd,oBAAK;MACH,KAAK,EAAE,IAAI;MACX,eAAe,EAAE,IAAI;MACrB,OAAO,EAAE,GAAG;MAEZ,0BAAQ;QACN,OAAO,EAAE,GAAG;;AAOlB,yBAA0B;EAD5B,qBAAsB;IAElB,cAAc,EAAE,OAAO;IACvB,WAAW,EAAE,CAAC;IACd,YAAY,EAAE,OAAO;IACrB,aAAa,EAAE,OAAO;;AAKxB,yBAA0B;EAD5B,8BAA+B;IAE3B,MAAM,EAAE,IAAI;;AAMhB,WAAY;EACV,gBAAgB,EA7MQ,OAAO;EA+M7B,yBAA0B;IAD5B,aAAE;MAEE,KAAK,EAAE,IAAI;MACX,WAAW,EAAE,GAAG;MAChB,SAAS,EAAE,IAAI;MACf,mBAAQ;QACN,KAAK,EAAE,IAAI;MAEb,qBAAU;QACR,KAAK,EAAE,IAAI;EAIjB,aAAE;IACA,KAAK,EAAE,IAAI;;AAIf,YAAa;EACX,gBAAgB,EAjOQ,OAAO;;AAqOjC,mBAAoB;EAClB,gBAAgB,EAtOQ,OAAO;EAuO/B,UAAU,EAAE,IAAI;EAChB,WAAW,EAAE,GAAG;EAChB,YAAY,EAAE,IAAI;;AAGpB,oCAAqC;EACnC,MAAM,EAAE,IAAI;EACZ,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,KAAK,EAnPmB,OAAO;EAoP/B,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,iBAAiB;EACzB,gBAAgB,EAAE,OAAO;EACzB,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG;EAClB,UAAU,EAAE,GAAG;EACf,aAAa,EAAE,GAAG;EAClB,YAAY,EAAE,IAAI;EAClB,aAAa,EAAE,IAAI;EACnB,WAAW,EAAE,GAAG;EAChB,KAAK,EAAE,KAAK;;AAGd,iCAAkC;EAChC,WAAW,EAAE,GAAG;;AAGlB,uBAAwB;EACtB,WAAW,EAAE,GAAG;EAChB,KAAK,EAAE,IAAI;EACX,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,IAAI;EAEf,6BAAQ;IACN,KAAK,EAAE,IAAI;IACX,eAAe,EAAE,IAAI;IACrB,gBAAgB,EAAE,WAAW;EAE/B,8BAAS;IACP,OAAO,EAAE,EAAE;IACX,KAAK,EAAE,KAAK;IACZ,MAAM,EAAE,IAAI;IACZ,UAAU,EAAE,0CAA0C;IACtD,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,cAAc;;AAI1B,yBAA0B;EACxB,OAAO,EAAE,QAAQ;EACjB,UAAU,EAAE,MAAM;;AAGpB,0EAA2E;EACzE,KAAK,EAnRmB,OAAO;;AAsRjC,oBAAqB;EACnB,UAAU,EAAE,mCAAmC;;AAGjD,sBAAuB;EACrB,aAAa,EAAE,qBAAqB;EACpC,UAAU,EAAE,qBAAqB;;AAGnC,4BAA6B;EAC3B,gBAAgB,EA1SQ,OAAO;;AA6SjC,uCAAwC;EACtC,gBAAgB,EA7SQ,OAAO;;AAgTjC,0CAA2C;EACzC,gBAAgB,EAjTQ,OAAO;;AAoTjC,0CAA2C;EACzC,gBAAgB,EApTQ,OAAO;;AAuTjC,0CAA2C;EACzC,gBAAgB,EAvTQ,OAAO;;AA0TjC,8BAA+B;EAC7B,KAAK,EAAE,IAAI;;AAGb,sBAAuB;EACrB,WAAW,EAAE,GAAG;EAChB,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;EAEnB,4BAAQ;IACN,OAAO,EAAE,GAAG;;AAIhB,8BAA+B;EAC7B,YAAY,EAAE,WAAW;;AAG3B,2DAA4D;EAC1D,aAAa,EAAE,iBAAkB;EACjC,UAAU,EAAE,qBAAqB;;AAGnC,yCAA0C;EACxC,gBAAgB,EAxVQ,OAAO;EAyV/B,6DAAoB;IAClB,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,IAAI;;AAIf,yCAA0C;EACxC,gBAAgB,EA/VQ,OAAO;EAgW/B,6DAAoB;IAClB,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,IAAI;;AAIf,8BAA+B;EAC7B,WAAW,EAAE,GAAG;EAEd,wDAAoB;IAClB,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,CAAC;;AAKhB,2CAA4C;EAC1C,gBAAgB,EAlXQ,OAAO;EAmX/B,YAAY,EAAE,OAAO;EACrB,OAAO,EAAE,CAAC;EACV,iDAAQ;IACN,gBAAgB,EAtXM,OAAO;;AA0XjC,2CAA4C;EAC1C,gBAAgB,EA1XQ,OAAO;EA2X/B,YAAY,EAAE,KAAK;EACnB,OAAO,EAAE,CAAC;EACV,iDAAQ;IACN,gBAAgB,EA9XM,OAAO;;AAkYjC,2CAA4C;EAC1C,gBAAgB,EAjYQ,OAAO;EAkY/B,YAAY,EAAE,KAAK;EACnB,OAAO,EAAE,CAAC;EACV,iDAAQ;IACN,gBAAgB,EArYM,OAAO;;AAyYjC,mCAAoC;EAClC,YAAY,EAAE,KAAK;;AAGrB,mCAAoC;EAClC,gBAAgB,EA9YQ,OAAO;EA+Y/B,YAAY,EAAE,KAAK;;AAGrB,mCAAoC;EAClC,gBAAgB,EAnZQ,OAAO;EAoZ/B,YAAY,EAAE,KAAK;;AAGrB,yDAA0D;EACxD,gBAAgB,EAzZQ,OAAO;EA0Z/B,YAAY,EAAE,KAAK;EACnB,aAAa,EAAE,IAAI;EACnB,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;EACnB,+DAAQ;IACN,gBAAgB,EA9ZM,OAAO;;AAkajC,iEAAkE;EAChE,gBAAgB,EAnaQ,OAAO;EAoa/B,OAAO,EAAE,CAAC;;AAGZ,yDAA0D;EACxD,gBAAgB,EAxaQ,OAAO;EAya/B,YAAY,EAAE,KAAK;EACnB,aAAa,EAAE,IAAI;EACnB,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;;AAGrB,yDAA0D;EACxD,aAAa,EAAE,iBAAkB;EACjC,UAAU,EAAE,qBAAqB;;AAKjC,mKAA4B;EAC1B,OAAO,EAAE,GAAG;;AAIhB,oDAAqD;EACnD,KAAK,EAAE,IAAI;EACX,WAAW,EAAE,IAAI;EACjB,aAAa,EAAE,GAAG;EAClB,OAAO,EAAE,GAAG;EACZ,SAAS,EAAE,IAAI;EAEf,yDAAK;IACH,OAAO,EAAE,QAAQ;IACjB,UAAU,EAAE,MAAM;;AAItB;4CAC6C;EAC3C,KAAK,EAAE,IAAI;EACX,WAAW,EAAE,IAAI;EACjB,aAAa,EAAE,GAAG;EAClB,OAAO,EAAE,CAAC;EAEV;mDAAK;IACH,OAAO,EAAE,QAAQ;IACjB,UAAU,EAAE,MAAM;;AAItB,wCAAyC;EACvC,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,CAAC;EACV,SAAS,EAAE,IAAI;;AAKjB,IAAI;EACA,WAAW,EAAE,GAAG;EAChB,cAAc,EAAC,GAAG;EAClB,WAAW,EAAE,IAAI;EACjB,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG;EAClB,MAAM,EAAE,GAAG;EACX,WAAW,EAAC,MAAM;EAClB,QAAQ,EAAC,MAAM;EACf,aAAa,EAAC,QAAQ;EACtB,UAAU,EAAE,GAAG;EACf,aAAa,EAAE,GAAG;EAClB,UAAU,EAAE,IAAI;EAChB,UAAQ;IACN,KAAK,EAAE,IAAI;IACX,gBAAgB,EAAE,kBAAkB;IACpC,YAAY,EAAE,OAAO;IACrB,eAAe,EAAE,IAAI;;AAI3B,YAAY;EACR,SAAS,EA3da,IAAI;EA4d1B,WAAW,EAleW,GAAG;EAmezB,KAAK,EAlfiB,OAAO;EAmf7B,UAAU,EAAE,MAAM;EAClB,MAAM,EAAE,iBAA4B;EACpC,aAAa,EAAE,GAAG;EAClB,QAAQ,EAAE,MAAM;EAChB,UAAU,EAtfY,OAAO;EAsfT,kBAAkB;EACtC,UAAU,EAAE,mDAAoD;EAAE,cAAc;EAChF,UAAU,EAAE,sDAAsD;EAAE,6BAA6B;EACjG,UAAU,EAAE,oDAAoD;EAAE,sDAAsD;EACxH,MAAM,EAAE,2GAA2G;EAAE,WAAW;;AAKpI,iCAAkC;EAChC,UAAU,EAAE,CAAC;EACb,aAAa,EAAE,iBAAmC;;AAGpD,6CAA8C;EAC5C,UAAU,EAAE,KAAK;;AAInB,oCAAqC;EACnC,gBAAgB,EAAE,OAAiB;EACnC,WAAW,EAvhBa,kCAAkC;;AAyhB5D,qBAAsB;EACpB,gBAAgB,EAAE,OAAkB;EACpC,MAAM,EAAE,iBAAiB;;AAQvB,0CAAkB;EAChB,gBAAgB,EAjhBI,OAAO;AAmhB7B,kCAAY;EACV,gBAAgB,EAAE,OAAoB;EACtC,oDAAkB;IAChB,gBAAgB,EAvhBE,OAAO;AA0hB7B,gCAAU;EACR,gBAAgB,EAAE,OAAoB;EACtC,kDAAkB;IAChB,gBAAgB,EA7hBE,OAAO;AAgiB7B,+BAAS;EACP,gBAAgB,EAAE,OAAiB;EACnC,iDAAkB;IAChB,gBAAgB,EAriBE,OAAO;AAwiB7B,8BAAQ;EACN,gBAAgB,EAAE,OAAiB;EACnC,gDAAkB;IAChB,gBAAgB,EA3iBE,OAAO;AA8iB7B,6BAAO;EACL,gBAAgB,EAAE,OAAO;EACzB,+CAAkB;IAChB,gBAAgB,EAhjBE,OAAO;AAmjB7B,kCAAY;EACV,gBAAgB,EAAE,OAAO;EACzB,oDAAkB;IAChB,gBAAgB,EAtjBE,OAAO;AAyjB7B,6BAAO;EACL,gBAAgB,EAAE,OAAO;EACzB,+CAAkB;IAChB,gBAAgB,EA1jBE,OAAO;IA2jBzB,MAAM,EAAE,KAAK;EAEf,iEAAM;IACJ,UAAU,EAAE,KAAK;AAGrB,4BAAM;EACJ,gBAAgB,EAAE,OAAO;EACzB,8CAAkB;IAChB,gBAAgB,EAtkBE,OAAO;AAykB7B,gCAAU;EACR,gBAAgB,EAAE,IAAI;EACtB,MAAM,EAAE,iBAAc;EACtB,kDAAkB;IAChB,gBAAgB,EA9kBE,OAAO;IA+kBzB,MAAM,EAAE,KAAK;EAEf,uEAAM;IACJ,UAAU,EAAE,KAAK;;AAOzB,gGAAiG;EAC/F,MAAM,EAAE,iBAAiB;EACzB,aAAa,EAAE,iBACjB;;AAGE,4BAAuB;EACrB,WAAW,EAAE,CAAC;AAEhB,iBAAY;EACV,OAAO,EAAE,IAAI;AAEf,SAAI;EACF,KAAK,EAAE,eAAe;;AAM1B,KAAM;EACJ,QAAQ,EAAE,QAAQ;EAClB,WAAM;IACJ,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,CAAC;IACR,GAAG,EAAE,CAAC;IACN,uBAAY;MACV,OAAO,EAAE,IAAI;;AAKnB,4DAA6D;EAC3D,WAAW,EAAE,MAAM;;AAMnB,0BAA2B;EAD7B,aAAc;IAEV,QAAQ,EAAE,KAAK;IACf,MAAM,EAAE,KAAK;IACb,GAAG,EAAE,CAAC;IACN,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,KAAK;IACZ,UAAU,EAAE,IAAI;IAChB,gBAAgB,EAlpBM,OAAO;IAmpB7B,MAAM,EAAE,WAAW;IACnB,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,mCAAmC;IAEhD,kCAAqB;MACnB,gBAAgB,EAzpBI,OAAO;MA0pB3B,KAAK,EAAE,OAAO;MACd,SAAS,EAAE,IAAI;MACf,WAAW,EAhqBS,kCAAkC;MAiqBtD,WAAW,EAAE,IAAI;MACjB,OAAO,EAAE,IAAI;MACb,OAAO,EAAE,GAAG;MAEZ,yCAAS;QACP,WAAW,EAAE,IAAI;MAGnB,wCAAQ;QACN,OAAO,EAAE,CAAC;MAGZ,6CAAW;QACT,WAAW,EAAE,IAAI;IAKrB,kDAAqC;MACnC,UAAU,EAAE,mCAAmC;MAC/C,WAAW,EAAE,GAAG;IAGlB;wCACuB;MACrB,KAAK,EAAE,OAAO;MACd,SAAS,EAAE,IAAI;MACf,WAAW,EA5rBS,kCAAkC;MA8rBtD;4CAAE;QACA,OAAO,EAAE,GAAG;QACZ,eAAe,EAAE,IAAI;MAGvB;kDAAQ;QACN,OAAO,EAAE,GAAG;;AAOlB,0BAA2B;EAD7B,aAAc;IAGV,UAAU,EAAE,mCAAmC;IAC/C,KAAK,EAAE,IAAI;IACX,gBAAgB,EA3sBM,OAAO;IA4sB7B,WAAW,EAhtBW,kCAAkC;IAitBxD,sCAAyB;MACvB,KAAK,EAAE,IAAI;MACX,YAAY,EAAE,CAAC;IAEjB,kCAAqB;MACnB,gBAAgB,EAjtBI,OAAO;MAktB3B,KAAK,EAAE,OAAO;MACd,SAAS,EAAE,IAAI;MACf,WAAW,EAztBS,kCAAkC;IA4tBxD;wCACuB;MACrB,KAAK,EAAE,OAAO;MACd,SAAS,EAAE,IAAI;MACf,WAAW,EAhuBS,kCAAkC;MAkuBtD;4CAAE;QACA,OAAO,EAAE,GAAG;QACZ,eAAe,EAAE,IAAI;MAGvB;kDAAQ;QACN,OAAO,EAAE,GAAG;AAIlB,6CAAgC;EAC9B,KAAK,EAAE,IAAI", +"sources": ["../../../sass/default_overrides.scss"], +"names": [], +"file": "default.css" +} diff --git a/v24.04/de/_static/css/kuka.css b/v24.04/de/_static/css/kuka.css new file mode 100644 index 0000000..69d766d --- /dev/null +++ b/v24.04/de/_static/css/kuka.css @@ -0,0 +1,377 @@ +/* BEGIN Regular */ +@font-face { + font-family: 'Kuka Bulo'; + src: url("../fonts/KUKA-Bulo-WEB.eot"); + src: url("../fonts/KUKA-Bulo-WEB.eot") format("embedded-opentype"), url("../fonts/KUKA-Bulo-WEB.woff2") format("woff2"), url("../fonts/KUKA-Bulo-WEB.woff") format("woff"), url("../fonts/KUKA-Bulo-WEB.ttf") format("truetype"), url("../fonts/KUKA-Bulo-WEB.svg") format("svg"); + font-style: normal; + font-weight: normal; } +/* END Regular */ +/* BEGIN Bold */ +@font-face { + font-family: 'Kuka Bulo Bold'; + src: url("../fonts/KUKA-Bulo-Bold-WEB.eot"); + src: url("../fonts/KUKA-Bulo-Bold-WEB.eot") format("embedded-opentype"), url("../fonts/KUKA-Bulo-Bold-WEB.woff2") format("woff2"), url("../fonts/KUKA-Bulo-Bold-WEB.woff") format("woff"), url("../fonts/KUKA-Bulo-Bold-WEB.ttf") format("truetype"), url("../fonts/KUKA-Bulo-Bold-WEB.svg") format("svg"); + font-style: normal; + font-weight: bold; } +/* END Bold */ +body, h1, h2, h3, h4, h5, h6, a, ul, li, p, span { + font-family: "Kuka Bulo", "Calibri", Helvetica, sans-serif; } + +.wy-nav-content { + background-color: #ffffff; } + +.wy-nav-content-wrap { + background-color: #ECEDEE; } + +.codeblock, pre.literal-block, .rst-content .literal-block, .rst-content pre.literal-block, div[class^='highlight'] { + background-color: #f9fafa; } + +body { + color: #676C71; } + +b, strong { + vertical-align: top; } + +p { + font-size: 16px; + color: #676C71; } + +p.first { + margin-bottom: 0 !important; } + +h1, h2, .rst-content .toctree-wrapper p.caption, h3, h4, h5, h6, legend { + font-weight: 100; + font-size: 25px; + color: #66696d; + font-weight: normal; + margin-bottom: 0px; + line-height: 28px; + text-overflow: ellipsis; + display: block; + white-space: nowrap; } + +h1, h2, h3, h4, h5, h6 { + margin-bottom: 20px; } + +h1 { + font-size: 25px; } + +h2 { + font-size: 22px; } + +h3 { + font-size: 18px; + font-weight: 500; } + +h4 { + font-size: 16px; + font-weight: 600; } + +a { + color: #FF5800; } + a:active { + color: #FF5800; } + a:visited { + color: #FF5800; } + a:hover { + color: #ff7933; + text-decoration: underline; } + +.wy-nav-top { + background-color: transparent; } + @media (max-width: 768px) { + .wy-nav-top a { + color: #676C71; } + .wy-nav-top a:hover { + color: #676C71; } + .wy-nav-top a:visited { + color: #676C71; } } + .wy-nav-top i { + color: #676C71; } + +.wy-nav-side { + background-color: #676C71; + background-image: linear-gradient(to bottom, #fff 0%, #dbdcdd 100%); } + +.wy-side-nav-search { + background-color: transparent; } + .wy-side-nav-search a { + width: 100%; + text-align: left; + padding-left: 10px; } + +.wy-side-nav-search > div.version { + color: #676C71; + text-align: left; + padding-left: 10px; } + +.wy-side-nav-search input[type=text] { + border: none; + font-size: 14px; + font-weight: 400; + color: #676C71; + text-align: left; + border: none; + border-bottom: 2px solid #595d61; + background-color: transparent; + height: 36px; + border-radius: 2px; + margin-top: 2px; + margin-bottom: 2px; + padding-left: 10px; + padding-right: 10px; + box-shadow: none; } + +.wy-side-nav-search > a { + line-height: 20px; + color: #595d61; } + .wy-side-nav-search > a:hover { + color: #595d61; + text-decoration: none; + background-color: transparent; } + .wy-side-nav-search > a:before { + content: ""; + width: 92px; + height: 35px; + background: url(../img/logo_kuka.svg) no-repeat center; + display: block; + margin-bottom: 20px; + margin-left: 0px; + background-size: 120px; + background-position: -14px 0px; } + +.wy-menu-vertical header, .wy-menu-vertical p.caption, .wy-menu-vertical a { + color: #595d61; } + +.wy-menu-vertical a:hover { + background-color: #5b5f64; } + +.wy-menu-vertical li.current { + background-color: transparent; } + +.wy-menu-vertical li.current a:hover { + background-color: #5b5f64; } + +.wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a, .wy-menu-vertical li.toctree-l3.current > a, .wy-menu-vertical li.toctree-l2.current > a, .wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a, .wy-menu-vertical li.toctree-l4 li.toctree-l5.current > a { + background-color: transparent; } + .wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a:hover, .wy-menu-vertical li.toctree-l3.current > a:hover, .wy-menu-vertical li.toctree-l2.current > a:hover, .wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a:hover, .wy-menu-vertical li.toctree-l4 li.toctree-l5.current > a:hover { + background-color: #5b5f64; } + +.wy-menu-vertical li.current a { + color: #595d61; } + .wy-menu-vertical li.current a:hover { + color: #595d61; } + +.wy-menu-vertical li a { + color: #595d61; } + .wy-menu-vertical li a:hover { + color: #595d61; } + +.wy-menu-vertical li a, .wy-menu-vertical li.on a span.toctree-expand, .wy-menu-vertical li.current > a span.toctree-expand, .wy-menu-vertical li.toctree-l3 span.toctree-expand, .wy-menu-vertical li.toctree-l2 span.toctree-expand { + line-height: 26px; } + +.wy-menu-vertical li.current a { + border-color: transparent; } + +.wy-menu-vertical li.on a, .wy-menu-vertical li.current > a { + color: #FF5800; + border-bottom: none !important; + background-color: transparent; + border: none; + border-bottom: 2px solid #FF5800; } + .wy-menu-vertical li.on a:hover, .wy-menu-vertical li.current > a:hover { + color: #FF5800; + border-bottom: none !important; + background-color: transparent; } + +.wy-menu-vertical li a:hover { + color: #595d61; + border-bottom: none !important; + background-color: transparent !important; } + +.wy-menu-vertical a { + padding-left: 1.618em; } + +.wy-menu-vertical li.current a { + padding-left: 1.618em; } + +.wy-menu-vertical li.toctree-l2.current > a { + padding-left: 3em; + color: #FF5800; + border-bottom: none !important; + background-color: transparent; } + +.wy-menu-vertical li.toctree-l2 > a { + padding-left: 3em; } + +.wy-menu-vertical li.toctree-l3.current > a { + padding-left: 4.5em; + color: #FF5800; + border-bottom: none !important; + background-color: transparent !important; } + +.wy-menu-vertical li.toctree-l3 > a { + padding-left: 4.5em; } + +.wy-menu-vertical li.toctree-l4.current > a { + padding-left: 5.5em; + color: #FF5800; + border-bottom: none !important; + background-color: transparent !important; } + +.wy-menu-vertical li.toctree-l4 > a { + padding-left: 5.5em; } + +.wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a { + padding-left: 4.5em; } + +.wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a { + padding-left: 5.5em; } + +.wy-menu-vertical li.on a span.toctree-expand, .wy-menu-vertical li.current > a span.toctree-expand { + color: #595d61; } + +.btn { + line-height: 34px; + height: 45px; + padding: 5px 20px; + border-radius: 0px; + margin: 0px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin-top: 2px; + margin-bottom: 2px; + box-shadow: none; + border: none; } + .btn:hover { + color: #FFF; + background-color: #5A5A5A !important; + border-color: #adadad; + text-decoration: none; } + +.btn-neutral { + font-size: 16px; + font-weight: bold; + color: #FFF !important; + text-align: center; + border: 1px solid #d6d6d8; + border-radius: 0px; + overflow: hidden; + background: #F0F0F1; + /* Old browsers */ + background: -moz-linear-gradient(top, #737B82 0%, #5A5A5A 100%); + /* FF3.6-15 */ + background: -webkit-linear-gradient(top, #737B82 0%, #5A5A5A 100%); + /* Chrome10-25,Safari5.1-6 */ + background: linear-gradient(to bottom, #737B82 0%, #5A5A5A 100%); + /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#737B82', endColorstr='#5A5A5A',GradientType=0 ); + /* IE6-9 */ + border: none !important; } + .btn-neutral:hover { + color: #FFF; + background-color: #5A5A5A !important; + border: none; + text-decoration: none; } + .btn-neutral:visited { + color: #FFF !important; } + .btn-neutral:active { + color: #FFF !important; } + +.rst-content .sidebar .sidebar-title { + background-color: #dfe0e2; + font-family: "Kuka Bulo", "Calibri", Helvetica, sans-serif; } + +.rst-content .sidebar { + background-color: #f9fafa; + border: 1px solid #e1e4e5; } + +.rst-content .admonition .admonition-title { + background-color: #006FA0; } +.rst-content .admonition.attention { + background-color: #ffeb99; } + .rst-content .admonition.attention .admonition-title { + background-color: #FFCD00; } +.rst-content .admonition.caution { + background-color: #ffeb99; } + .rst-content .admonition.caution .admonition-title { + background-color: #FFCD00; } +.rst-content .admonition.danger { + background-color: #ff8181; } + .rst-content .admonition.danger .admonition-title { + background-color: #B40000; } +.rst-content .admonition.error { + background-color: #ff8181; } + .rst-content .admonition.error .admonition-title { + background-color: #B40000; } +.rst-content .admonition.hint { + background-color: #ABF0AB; } + .rst-content .admonition.hint .admonition-title { + background-color: #00780A; } +.rst-content .admonition.important { + background-color: #ABF0AB; } + .rst-content .admonition.important .admonition-title { + background-color: #00780A; } +.rst-content .admonition.note { + background-color: #A6D1E4; } + .rst-content .admonition.note .admonition-title { + background-color: #006FA0; } +.rst-content .admonition.tip { + background-color: #ABF0AB; } + .rst-content .admonition.tip .admonition-title { + background-color: #00780A; } +.rst-content .admonition.warning { + background-color: #ffeb99; } + .rst-content .admonition.warning .admonition-title { + background-color: #FFCD00; } + +.wy-plain-list-disc li li, .rst-content .section ul li li, .rst-content .toctree-wrapper ul li li, article ul li li { + list-style-type: none; } + .wy-plain-list-disc li li:before, .rst-content .section ul li li:before, .rst-content .toctree-wrapper ul li li:before, article ul li li:before { + content: "\2013"; + position: relative; + left: -10px; } + +.wy-table thead th, .rst-content table.docutils thead th, .rst-content table.field-list thead th { + border: solid 1px #e1e4e5; + border-bottom: solid 2px #e1e4e5; } + +table .first.last.line-block { + margin-left: 0; } +table .headerlink { + display: none; } +table col { + width: auto !important; } + +.math { + position: relative; } + .math .eqno { + position: absolute; + right: 0; + top: 0; } + .math .eqno .headerlink { + display: none; } + +.wy-table-responsive table td, .wy-table-responsive table th { + white-space: normal; } + +.rst-versions { + background-image: linear-gradient(to bottom, #fff 0%, #dbdcdd 100%); + box-shadow: -2px -3px 6px rgba(0, 0, 0, 0.4); + border-top: none; + color: #676C71; + font-family: "Kuka Bulo", "Calibri", Helvetica, sans-serif; } + .rst-versions .rst-other-versions dd a { + color: #FF5800; + padding-left: 0; } + .rst-versions .rst-current-version { + background-color: #66696d; + color: #FFFFFF; } + .rst-versions .rst-other-versions { + color: #676C71; } + +.rst-current-version .fa.fa-cog { + float: left; } + +/*# sourceMappingURL=kuka.css.map */ diff --git a/v24.04/de/_static/css/kuka.css.map b/v24.04/de/_static/css/kuka.css.map new file mode 100644 index 0000000..af3277a --- /dev/null +++ b/v24.04/de/_static/css/kuka.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "AAGA,mBAAmB;AACnB,UAUC;EATC,WAAW,EAAE,WAAW;EACxB,GAAG,EAAG,iCAAoC;EAC1C,GAAG,EAAG,4QAIkD;EACtD,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,MAAM;AAEvB,iBAAiB;AAGjB,gBAAgB;AAChB,UAUC;EATC,WAAW,EAAE,gBAAgB;EAC7B,GAAG,EAAG,sCAAyC;EAC/C,GAAG,EAAG,qSAIuD;EAC3D,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,IAAI;AAErB,cAAc;AAkCd,gDAAiD;EAC/C,WAAW,EAjCa,6CAA6C;;AAoCvE,eAAgB;EACd,gBAAgB,EA3BQ,OAAO;;AA8BjC,oBAAqB;EACnB,gBAAgB,EAnCQ,OAAO;;AAsCjC,mHAAoH;EAClH,gBAAgB,EAAE,OAAkB;;AAKtC,IAAK;EACH,KAAK,EAlDmB,OAAO;;AAqDjC,SAAU;EACR,cAAc,EAAE,GAAG;;AAGrB,CAAC;EACG,SAAS,EAAE,IAAI;EACf,KAAK,EA3DiB,OAAO;;AA8DjC,OAAQ;EACN,aAAa,EAAE,YAAY;;AAG7B,uEAAwE;EACtE,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,IAAI;EACf,KAAK,EA/DmB,OAAO;EAgE/B,WAAW,EAhDa,MAAM;EAiD9B,aAAa,EAAE,GAAG;EAClB,WAAW,EAAE,IAAI;EACjB,aAAa,EAAE,QAAQ;EACvB,OAAO,EAAE,KAAK;EACd,WAAW,EAAE,MAAM;;AAGrB,sBAAkB;EAChB,aAAa,EAAE,IAAI;;AAGrB,EAAG;EACD,SAAS,EAAE,IAAI;;AAEjB,EAAG;EACD,SAAS,EAAE,IAAI;;AAEjB,EAAE;EACA,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;;AAElB,EAAE;EACA,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;;AAGlB,CAAE;EACA,KAAK,EAhGmB,OAAO;EAiG/B,QAAS;IACP,KAAK,EAlGiB,OAAO;EAoG/B,SAAU;IACR,KAAK,EArGiB,OAAO;EAuG/B,OAAQ;IACN,KAAK,EAAE,OAAwB;IAC/B,eAAe,EAAE,SAAS;;AAK9B,WAAY;EACV,gBAAgB,EAAE,WAAW;EAE3B,yBAA0B;IAD5B,aAAE;MAEE,KAAK,EApHe,OAAO;MAqH3B,mBAAQ;QACN,KAAK,EAtHa,OAAO;MAwH3B,qBAAU;QACR,KAAK,EAzHa,OAAO;EA6H/B,aAAE;IACA,KAAK,EA9HiB,OAAO;;AAiIjC,YAAa;EACX,gBAAgB,EA/HQ,OAAO;EAgI/B,gBAAgB,EAAE,iDAA+C;;AAInE,mBAAoB;EAClB,gBAAgB,EAAE,WAAW;EAC7B,qBAAE;IACA,KAAK,EAAE,IAAI;IACX,UAAU,EAAE,IAAI;IAChB,YAAY,EAAE,IAAI;;AAItB,iCAAkC;EAChC,KAAK,EAjJmB,OAAO;EAkJ/B,UAAU,EAAE,IAAI;EAChB,YAAY,EAAE,IAAI;;AAGpB,oCAAqC;EACnC,MAAM,EAAE,IAAI;EACZ,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,KAAK,EA1JmB,OAAO;EA2J/B,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,iBAAiB;EAChC,gBAAgB,EAAE,WAAW;EAC7B,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG;EAClB,UAAU,EAAE,GAAG;EACf,aAAa,EAAE,GAAG;EAClB,YAAY,EAAE,IAAI;EAClB,aAAa,EAAE,IAAI;EACnB,UAAU,EAAE,IAAI;;AAIlB,uBAAwB;EACtB,WAAW,EAAE,IAAI;EACjB,KAAK,EAAE,OAAO;EACd,6BAAQ;IACN,KAAK,EAAE,OAAO;IACd,eAAe,EAAE,IAAI;IACrB,gBAAgB,EAAE,WAAW;EAE/B,8BAAS;IACP,OAAO,EAAE,EAAE;IACX,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;IACZ,UAAU,EAAE,0CAA0C;IACtD,OAAO,EAAE,KAAK;IACd,aAAa,EAAE,IAAI;IACnB,WAAW,EAAE,GAAG;IAChB,eAAe,EAAE,KAAK;IACtB,mBAAmB,EAAE,SAAS;;AAIlC,0EAA2E;EACzE,KAAK,EAAE,OAAO;;AAGhB,yBAA0B;EACxB,gBAAgB,EAAE,OAAuB;;AAG3C,4BAA6B;EAC3B,gBAAgB,EAAE,WAAW;;AAE/B,oCAAqC;EACnC,gBAAgB,EAAE,OAAuB;;AAG3C,yQAA0Q;EACxQ,gBAAgB,EAAE,WAAW;EAC7B,uSAAQ;IACN,gBAAgB,EAAE,OAAuB;;AAI7C,8BAA+B;EAC7B,KAAK,EAAE,OAAO;EACd,oCAAQ;IACN,KAAK,EAAE,OAAO;;AAGlB,sBAAuB;EACrB,KAAK,EAAE,OAAO;EACd,4BAAQ;IACN,KAAK,EAAE,OAAO;;AAIlB,qOAAoO;EAClO,WAAW,EAAE,IAAI;;AAGnB,8BAA+B;EAC7B,YAAY,EAAE,WAAW;;AAG3B,2DAA4D;EAC1D,KAAK,EAxOmB,OAAO;EAyO/B,aAAa,EAAE,eAAe;EAC9B,gBAAgB,EAAE,WAAW;EAC7B,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,iBAAqB;EAEpC,uEAAQ;IACR,KAAK,EA/OmB,OAAO;IAgP/B,aAAa,EAAE,eAAe;IAC5B,gBAAgB,EAAE,WAAW;;AAGjC,4BAA6B;EAC3B,KAAK,EAAE,OAAO;EACd,aAAa,EAAE,eAAe;EAC9B,gBAAgB,EAAE,sBAAsB;;AAG1C,mBAAoB;EAClB,YAAY,EAAE,OAAO;;AAEvB,8BAA+B;EAC7B,YAAY,EAAE,OAAO;;AAEvB,2CAA4C;EAC1C,YAAY,EAAE,GAAG;EACjB,KAAK,EAlQmB,OAAO;EAmQ/B,aAAa,EAAE,eAAe;EAC9B,gBAAgB,EAAE,WAAW;;AAE/B,mCAAoC;EAClC,YAAY,EAAE,GAAG;;AAEnB,2CAA4C;EAC1C,YAAY,EAAE,KAAK;EACnB,KAAK,EA3QmB,OAAO;EA4Q/B,aAAa,EAAE,eAAe;EAC9B,gBAAgB,EAAE,sBAAsB;;AAE1C,mCAAmC;EACjC,YAAY,EAAE,KAAK;;AAErB,2CAA4C;EAC1C,YAAY,EAAE,KAAK;EACnB,KAAK,EApRmB,OAAO;EAqR/B,aAAa,EAAE,eAAe;EAC9B,gBAAgB,EAAE,sBAAsB;;AAE1C,mCAAoC;EAClC,YAAY,EAAE,KAAK;;AAErB,yDAA0D;EACxD,YAAY,EAAE,KAAK;;AAErB,yDAA0D;EACxD,YAAY,EAAE,KAAK;;AAGrB,mGAAoG;EAClG,KAAK,EAAE,OAAO;;AAKhB,IAAI;EACA,WAAW,EAAE,IAAI;EACjB,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,QAAQ;EACjB,aAAa,EAAE,GAAG;EAClB,MAAM,EAAE,GAAG;EACX,WAAW,EAAC,MAAM;EAClB,QAAQ,EAAC,MAAM;EACf,aAAa,EAAC,QAAQ;EACtB,UAAU,EAAE,GAAG;EACf,aAAa,EAAE,GAAG;EAClB,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,IAAI;EACZ,UAAQ;IACN,KAAK,EAAE,IAAI;IACX,gBAAgB,EAAE,kBAAkB;IACpC,YAAY,EAAE,OAAO;IACrB,eAAe,EAAE,IAAI;;AAI3B,YAAY;EACR,SAAS,EAtSa,IAAI;EAuS1B,WAAW,EA7SW,IAAI;EA8S1B,KAAK,EAAE,eAAe;EACtB,UAAU,EAAE,MAAM;EAClB,MAAM,EAAE,iBAA4B;EACpC,aAAa,EAAE,GAAG;EAClB,QAAQ,EAAE,MAAM;EAChB,UAAU,EAhUY,OAAO;EAgUT,kBAAkB;EACtC,UAAU,EAAE,mDAAoD;EAAE,cAAc;EAChF,UAAU,EAAE,sDAAsD;EAAE,6BAA6B;EACjG,UAAU,EAAE,oDAAoD;EAAE,sDAAsD;EACxH,MAAM,EAAE,2GAA2G;EAAE,WAAW;EAChI,MAAM,EAAE,eAAe;EACvB,kBAAQ;IACN,KAAK,EAAE,IAAI;IACX,gBAAgB,EAAE,kBAAkB;IACpC,MAAM,EAAE,IAAI;IACZ,eAAe,EAAE,IAAI;EAEvB,oBAAU;IACN,KAAK,EAAE,eAAe;EAE1B,mBAAS;IACL,KAAK,EAAE,eAAe;;AAK9B,oCAAqC;EACnC,gBAAgB,EAAE,OAAiB;EACnC,WAAW,EA/Va,6CAA6C;;AAiWvE,qBAAsB;EACpB,gBAAgB,EAAE,OAAkB;EACpC,MAAM,EAAE,iBAAiB;;AAQvB,0CAAkB;EAChB,gBAAgB,EA7VI,OAAO;AA+V7B,kCAAY;EACV,gBAAgB,EAAE,OAAoB;EACtC,oDAAkB;IAChB,gBAAgB,EAnWE,OAAO;AAsW7B,gCAAU;EACR,gBAAgB,EAAE,OAAoB;EACtC,kDAAkB;IAChB,gBAAgB,EAzWE,OAAO;AA4W7B,+BAAS;EACP,gBAAgB,EAAE,OAAiB;EACnC,iDAAkB;IAChB,gBAAgB,EAjXE,OAAO;AAoX7B,8BAAQ;EACN,gBAAgB,EAAE,OAAiB;EACnC,gDAAkB;IAChB,gBAAgB,EAvXE,OAAO;AA0X7B,6BAAO;EACL,gBAAgB,EAAE,OAAO;EACzB,+CAAkB;IAChB,gBAAgB,EA5XE,OAAO;AA+X7B,kCAAY;EACV,gBAAgB,EAAE,OAAO;EACzB,oDAAkB;IAChB,gBAAgB,EAlYE,OAAO;AAqY7B,6BAAO;EACL,gBAAgB,EAAE,OAAO;EACzB,+CAAkB;IAChB,gBAAgB,EAtYE,OAAO;AAyY7B,4BAAM;EACJ,gBAAgB,EAAE,OAAO;EACzB,8CAAkB;IAChB,gBAAgB,EA9YE,OAAO;AAiZ7B,gCAAU;EACR,gBAAgB,EAAE,OAAoB;EACtC,kDAAkB;IAChB,gBAAgB,EAnZE,OAAO;;AA2ZjC,mHAAoH;EAClH,eAAe,EAAE,IAAI;EACrB,+IAAS;IACP,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE,QAAQ;IAClB,IAAI,EAAE,KAAK;;AAKf,gGAAiG;EAC/F,MAAM,EAAE,iBAAiB;EACzB,aAAa,EAAE,iBACjB;;AAGE,4BAAuB;EACrB,WAAW,EAAE,CAAC;AAEhB,iBAAY;EACV,OAAO,EAAE,IAAI;AAEf,SAAI;EACF,KAAK,EAAE,eAAe;;AAM1B,KAAM;EACJ,QAAQ,EAAE,QAAQ;EAClB,WAAM;IACJ,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,CAAC;IACR,GAAG,EAAE,CAAC;IACN,uBAAY;MACV,OAAO,EAAE,IAAI;;AAKnB,4DAA6D;EAC3D,WAAW,EAAE,MAAM;;AAGrB,aAAc;EACZ,gBAAgB,EAAE,iDAAiD;EACnE,UAAU,EAAE,gCAA6B;EACzC,UAAU,EAAE,IAAI;EAChB,KAAK,EAzdmB,OAAO;EA0d/B,WAAW,EAAE,6CAA6C;EAC1D,sCAAyB;IACvB,KAAK,EA1diB,OAAO;IA2d7B,YAAY,EAAE,CAAC;EAEjB,kCAAqB;IACnB,gBAAgB,EA1dM,OAAO;IA2d7B,KAAK,EAAE,OAAO;EAEhB,iCAAoB;IAClB,KAAK,EApeiB,OAAO;;AAuejC,+BAAgC;EAC9B,KAAK,EAAE,IAAI", +"sources": ["../../../sass/kuka_overrides.scss"], +"names": [], +"file": "kuka.css" +} \ No newline at end of file diff --git a/v24.04/de/_static/css/matrixvision.css b/v24.04/de/_static/css/matrixvision.css new file mode 100644 index 0000000..130b6dc --- /dev/null +++ b/v24.04/de/_static/css/matrixvision.css @@ -0,0 +1,540 @@ +@import url("https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700"); +body, h1, h2, h3, h4, h5, h6, a, ul, li, p, span { + font-family: "Roboto", sans-serif; } + +.menuselection { + font-weight: 600; } + +.wy-nav-content { + background-color: #ffffff; + max-width: 900px; } + +.wy-nav-content-wrap { + background-color: #eaedf0; } + +.codeblock, pre.literal-block, .rst-content .literal-block, .rst-content pre.literal-block, div[class^='highlight'] { + background-color: #f9fafb; } + +body { + color: #222222; } + +b, strong { + vertical-align: top; } + +p, dd { + font-size: 16px; + color: #222222; + line-height: 1.5em; } + +p.first { + margin-bottom: 0 !important; } + +h1, h2, .rst-content .toctree-wrapper p.caption, h3, h4, h5, h6, legend { + font-weight: 400; + font-size: 25px; + color: #222222; + font-weight: 100; + margin-bottom: 0px; + line-height: 28px; + text-overflow: ellipsis; + display: block; + white-space: nowrap; } + +h1, h2, h3, h4, h5, h6 { + margin-bottom: 20px; } + +h1 { + font-size: 25px; } + +h2 { + font-size: 22px; } + +h3 { + font-size: 18px; + font-weight: 400; } + +h4 { + font-size: 16px; + font-weight: 600; } + +a { + color: #3f83a3; } + a:active { + color: #3f83a3; } + a:visited { + color: #3f83a3; } + a:hover { + color: #579dbe; + text-decoration: underline; } + +@media (min-width: 768px) { + .wy-nav-content { + margin: 0; + padding: 0; + left: 300px; + max-width: 900px; } } + +@media (min-width: 768px) { + .document { + padding-top: 1.618em; + padding-left: 3.236em; + padding-right: 3.236em; } + .document div.section > h1, + .document div.section > h2, + .document div.section > h3, + .document div.section > h4, + .document div.section > h5, + .document div.section > h6, + .document div.section > dl > dt { + padding-top: 70px; + margin-top: -70px; + font-weight: 400; + background: 0; } } + +@media (min-width: 768px) { + .wy-breadcrumbs { + background-color: #565C63; + height: 56px; + color: #FFF; + font-size: 14px; + padding-left: 10px; + position: fixed; + width: 900px; + z-index: 100; } + .wy-breadcrumbs + hr { + display: none; } + .wy-breadcrumbs li { + margin-top: 13px; } + .wy-breadcrumbs li:nth-last-child(2) { + opacity: 0.8; } + .wy-breadcrumbs li a { + color: #FFF; + text-decoration: none; + opacity: 0.8; } + .wy-breadcrumbs li a:hover { + opacity: 1.0; } } + +@media (min-width: 768px) { + .rst-content > footer { + padding-bottom: 1.618em; + padding-top: 0; + padding-left: 3.236em; + padding-right: 3.236em; } } + +@media (min-width: 768px) { + .rst-content > div:first-child { + height: 56px; } } + +.wy-nav-top { + background-color: #565C63; } + @media (max-width: 768px) { + .wy-nav-top a { + color: #FFF; } + .wy-nav-top a:hover { + color: #FFF; } + .wy-nav-top a:visited { + color: #FFF; } } + .wy-nav-top i { + color: #FFF; } + +.wy-nav-side { + background-color: #565C63; } + +.wy-side-nav-search { + background-color: #565C63; + text-align: left; + padding-top: 1px; + padding-left: 14px; } + +.wy-side-nav-search input[type=text] { + border: none; + font-size: 14px; + font-weight: 400; + color: #222222; + text-align: left; + border: 1px solid #dbdbdb; + background-color: #ffffff; + height: 36px; + border-radius: 2px; + margin-top: 2px; + margin-bottom: 2px; + padding-left: 10px; + padding-right: 10px; + margin-left: 5px; + width: 260px; } + +.wy-side-nav-search > div.version { + margin-left: 5px; } + +.wy-side-nav-search > a { + line-height: 1.3; + color: #fff; + font-weight: 400; + font-size: 18px; } + .wy-side-nav-search > a:hover { + color: #fff; + text-decoration: none; + background-color: transparent; } + .wy-side-nav-search > a:before { + content: ""; + width: 300px; + height: 45px; + background: url(../img/logo_balluff.svg) no-repeat; + display: block; + margin: auto auto 10px; } + +.wy-menu-vertical li a em { + display: contents; + font-style: normal; } + +.wy-menu-vertical header, .wy-menu-vertical p.caption, .wy-menu-vertical a { + color: #ffffff; } + +.wy-menu-vertical li { + border-top: 0; } + +.wy-menu-vertical li a { + border-bottom: 4px solid transparent; + border-top: 4px solid transparent; } + +.wy-menu-vertical li.current { + background-color: #565C63; } + +.wy-menu-vertical li.toctree-l1.current { + background-color: #67707A; } + +.wy-menu-vertical li.toctree-l1.current ul { + background-color: #67707A; } + +.wy-menu-vertical li.toctree-l2.current ul { + background-color: #747F8B; } + +.wy-menu-vertical li.toctree-l3.current ul { + background-color: #7F8893; } + +.wy-menu-vertical li.current a { + color: #FFF; } + +.wy-menu-vertical li a { + line-height: 1.3; + height: 42px; + opacity: 0.8; + font-size: 14px; + font-weight: 400; + display: flex; + align-items: center; } + .wy-menu-vertical li a:hover { + opacity: 1.0; } + +.wy-menu-vertical li.current a { + border-color: transparent; } + +.wy-menu-vertical li.on a, .wy-menu-vertical li.current > a { + border-bottom: 4px solid rgba(0, 0, 0, 0); + border-top: 4px solid transparent; } + +.wy-menu-vertical li.toctree-l1 > a:hover { + background-color: #67707A; } + .wy-menu-vertical li.toctree-l1 > a:hover span.toctree-expand { + opacity: 1; + color: #FFF; } + +.wy-menu-vertical li.toctree-l2 > a:hover { + background-color: #747F8B; } + .wy-menu-vertical li.toctree-l2 > a:hover span.toctree-expand { + opacity: 1; + color: #FFF; } + +.wy-menu-vertical li.current a { + font-weight: 400; } + .wy-menu-vertical li.current a:hover span.toctree-expand { + color: #FFF; + opacity: 1; } + +.wy-menu-vertical li.toctree-l1.current > a { + background-color: #67707A; + padding-left: 1.618em; + opacity: 1; } + .wy-menu-vertical li.toctree-l1.current > a:hover { + background-color: #67707A; } + +.wy-menu-vertical li.toctree-l2.current > a { + background-color: #747F8B; + padding-left: 2.5em; + opacity: 1; } + .wy-menu-vertical li.toctree-l2.current > a:hover { + background-color: #747F8B; } + +.wy-menu-vertical li.toctree-l4.current > a { + background-color: #8A929B; + padding-left: 4.5em; + opacity: 1; } + .wy-menu-vertical li.toctree-l4.current > a:hover { + background-color: #8A929B; } + +.wy-menu-vertical li.toctree-l2 > a { + padding-left: 2.5em; } + +.wy-menu-vertical li.toctree-l3 > a { + background-color: #8A929B; + padding-left: 3.5em; } + +.wy-menu-vertical li.toctree-l4 > a { + background-color: #8A929B; + padding-left: 4.5em; } + +.wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a { + background-color: #7F8893; + padding-left: 3.5em; + padding-right: 10px; + display: flex; + align-items: center; } + .wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a:hover { + background-color: #8A929B; } + +.wy-menu-vertical li.toctree-l2.current li.toctree-l3.current > a { + background-color: #8A929B; + opacity: 1; } + +.wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a { + background-color: #8A929B; + padding-left: 4.5em; + padding-right: 10px; + display: flex; + align-items: center; } + +.wy-menu-vertical li.toctree-l3 li.toctree-l4.current > a { + border-bottom: 4px solid rgba(0, 0, 0, 0); + border-top: 4px solid transparent; } + +.wy-menu-vertical li.on a:hover span.toctree-expand, .wy-menu-vertical li.current > a:hover span.toctree-expand, .wy-menu-vertical li > a:hover span.toctree-expand { + opacity: 1.0; } + +.wy-menu-vertical li.current > a span.toctree-expand { + color: #FFF; + line-height: 34px; + padding-right: 5px; + opacity: 1.0; + font-size: 14px; } + .wy-menu-vertical li.current > a span.toctree-expand + em { + display: contents; + font-style: normal; } + +.wy-menu-vertical li.on a span.toctree-expand, +.wy-menu-vertical li > a span.toctree-expand { + color: #FFF; + line-height: 34px; + padding-right: 5px; + opacity: 0; } + .wy-menu-vertical li.on a span.toctree-expand + em, + .wy-menu-vertical li > a span.toctree-expand + em { + display: contents; + font-style: normal; } + +.wy-menu-vertical li span.toctree-expand { + color: #FFF; + opacity: 0; + font-size: 14px; } + +.btn { + padding-top: 0px; + padding-bottom: 0px; + line-height: 34px; + height: 36px; + border-radius: 2px; + margin: 0px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin-top: 2px; + margin-bottom: 2px; + box-shadow: none; } + .btn:hover { + color: #333; + background-color: #e6e6e6 !important; + border-color: #adadad; + text-decoration: none; } + +.btn-neutral { + font-size: 14px; + font-weight: 600; + color: #222222; + text-align: center; + border: 1px solid #dbdbdb; + border-radius: 2px; + overflow: hidden; + background: #f4f4f4; + /* Old browsers */ + background: -moz-linear-gradient(top, #ffffff 0%, #f5f5f5 100%); + /* FF3.6-15 */ + background: -webkit-linear-gradient(top, #ffffff 0%, #f5f5f5 100%); + /* Chrome10-25,Safari5.1-6 */ + background: linear-gradient(to bottom, #ffffff 0%, #f5f5f5 100%); + /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#f5f5f5',GradientType=0 ); + /* IE6-9 */ } + +.rst-content dl:not(.docutils) dt { + border-top: 0; + border-bottom: solid 3px #7cb2cc; } + +.rst-content dl:not(.docutils) dt:first-child { + margin-top: -70px; } + +.rst-content .sidebar .sidebar-title { + background-color: #dbe0e5; + font-family: "Roboto", sans-serif; } + +.rst-content .sidebar { + background-color: #f9fafb; + border: 1px solid #e1e4e5; } + +.rst-content .admonition .admonition-title { + background-color: #3f83a3; } +.rst-content .admonition.attention { + background-color: white; } + .rst-content .admonition.attention .admonition-title { + background-color: #ffe0b2; } +.rst-content .admonition.caution { + background-color: white; } + .rst-content .admonition.caution .admonition-title { + background-color: #ffe0b2; } +.rst-content .admonition.danger { + background-color: white; } + .rst-content .admonition.danger .admonition-title { + background-color: #ffcdd2; } +.rst-content .admonition.error { + background-color: white; } + .rst-content .admonition.error .admonition-title { + background-color: #ffcdd2; } +.rst-content .admonition.hint { + background-color: #ABF0AB; } + .rst-content .admonition.hint .admonition-title { + background-color: #c8e6c9; } +.rst-content .admonition.important { + background-color: #ABF0AB; } + .rst-content .admonition.important .admonition-title { + background-color: #c8e6c9; } +.rst-content .admonition.note { + background-color: #BBDEFB; + border: 1px #1565C0 solid; + border-radius: 8px; } + .rst-content .admonition.note .admonition-title { + background-color: #BBDEFB; + margin: -12px; + border-radius: 8px; + color: #222222; } + .rst-content .admonition.note p, .rst-content .admonition.note ul { + margin-top: 0.5em; } +.rst-content .admonition.tip { + background-color: #ABF0AB; } + .rst-content .admonition.tip .admonition-title { + background-color: #c8e6c9; } +.rst-content .admonition.warning { + background-color: #ffe0b2; + border: 1px solid #F9A825; + border-radius: 8px; } + .rst-content .admonition.warning .admonition-title { + background-color: #ffe0b2; + margin: -12px; + border-radius: 8px; + color: #222222; } + .rst-content .admonition.warning p, .rst-content .admonition.warning ul { + margin-top: 0.5em; } + +.wy-table thead th, .rst-content table.docutils thead th, .rst-content table.field-list thead th { + border: solid 1px #e1e4e5; + border-bottom: solid 2px #e1e4e5; } + +table .first.last.line-block { + margin-left: 0; } +table .headerlink { + display: none; } +table col { + width: auto !important; } + +.math { + position: relative; } + .math .eqno { + position: absolute; + right: 0; + top: 0; } + .math .eqno .headerlink { + display: none; } + +.wy-table-responsive table td, .wy-table-responsive table th { + white-space: normal; } + +@media (min-width: 1200px) { + .rst-versions { + position: fixed; + bottom: unset; + top: 0; + right: 0; + left: 1000px; + width: 200px; + min-height: 56px; + background-color: #67707A; + height: fit-content; + border-top: 0; + border-left: 1px solid rgba(255, 255, 255, 0.25); } + .rst-versions .rst-current-version { + background-color: #565C63; + color: #FFFFFF; + font-size: 14px; + font-family: "Roboto", sans-serif; + line-height: 34px; + padding: 11px; + opacity: 0.8; } + .rst-versions .rst-current-version:before { + line-height: 34px; } + .rst-versions .rst-current-version:hover { + opacity: 1; } + .rst-versions .rst-current-version .fa.fa-cog { + line-height: 34px; } + .rst-versions .rst-other-versions dl:last-child dt { + border-top: 1px solid rgba(255, 255, 255, 0.25); + padding-top: 5px; } + .rst-versions .rst-other-versions dt, + .rst-versions .rst-other-versions dd { + color: #FFFFFF; + font-size: 14px; + font-family: "Roboto", sans-serif; } + .rst-versions .rst-other-versions dt a, + .rst-versions .rst-other-versions dd a { + opacity: 0.8; + text-decoration: none; } + .rst-versions .rst-other-versions dt a:hover, + .rst-versions .rst-other-versions dd a:hover { + opacity: 1.0; } } + +@media (max-width: 1200px) { + .rst-versions { + border-top: 1px solid rgba(255, 255, 255, 0.25); + color: #FFF; + background-color: #565C63; + font-family: "Roboto", sans-serif; } + .rst-versions .rst-other-versions dd a { + color: #FFF; + padding-left: 0; } + .rst-versions .rst-current-version { + background-color: #67707A; + color: #FFFFFF; + font-size: 14px; + font-family: "Roboto", sans-serif; } + .rst-versions .rst-other-versions dt, + .rst-versions .rst-other-versions dd { + color: #FFFFFF; + font-size: 14px; + font-family: "Roboto", sans-serif; } + .rst-versions .rst-other-versions dt a, + .rst-versions .rst-other-versions dd a { + opacity: 0.8; + text-decoration: none; } + .rst-versions .rst-other-versions dt a:hover, + .rst-versions .rst-other-versions dd a:hover { + opacity: 1.0; } } +.rst-versions .rst-current-version .fa.fa-cog { + float: left; } + +/*# sourceMappingURL=matrixvision.css.map */ diff --git a/v24.04/de/_static/css/matrixvision.css.map b/v24.04/de/_static/css/matrixvision.css.map new file mode 100644 index 0000000..629ce1d --- /dev/null +++ b/v24.04/de/_static/css/matrixvision.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "AACQ,gFAAwE;AAsChF,gDAAiD;EAC/C,WAAW,EArCa,oBAAoB;;AAwC9C,cAAe;EACb,WAAW,EAAE,GAAG;;AAGlB,eAAgB;EACd,gBAAgB,EA/BQ,OAAO;EAgC/B,SAAS,EAAE,KAAK;;AAGlB,oBAAqB;EACnB,gBAAgB,EAxCQ,OAAO;;AA2CjC,mHAAoH;EAClH,gBAAgB,EAAE,OAAkB;;AAKtC,IAAK;EACH,KAAK,EA3DmB,OAAO;;AA8DjC,SAAU;EACR,cAAc,EAAE,GAAG;;AAGrB,KAAM;EACJ,SAAS,EAAE,IAAI;EACf,KAAK,EApEmB,OAAO;EAqE/B,WAAW,EAAE,KAAK;;AAGpB,OAAQ;EACN,aAAa,EAAE,YAAY;;AAG7B,uEAAwE;EACtE,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,IAAI;EACf,KAAK,EArEmB,OAAO;EAsE/B,WAAW,EArDa,GAAG;EAsD3B,aAAa,EAAE,GAAG;EAClB,WAAW,EAAE,IAAI;EACjB,aAAa,EAAE,QAAQ;EACvB,OAAO,EAAE,KAAK;EACd,WAAW,EAAE,MAAM;;AAGrB,sBAAkB;EAChB,aAAa,EAAE,IAAI;;AAGrB,EAAG;EACD,SAAS,EAAE,IAAI;;AAEjB,EAAG;EACD,SAAS,EAAE,IAAI;;AAEjB,EAAE;EACA,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;;AAElB,EAAE;EACA,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;;AAGlB,CAAE;EACA,KAAK,EA1GmB,OAAO;EA2G/B,QAAS;IACP,KAAK,EA5GiB,OAAO;EA8G/B,SAAU;IACR,KAAK,EA/GiB,OAAO;EAiH/B,OAAQ;IACN,KAAK,EAAE,OAAwB;IAC/B,eAAe,EAAE,SAAS;;AAM5B,yBAA0B;EAD5B,eAAgB;IAEZ,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,KAAK;IACX,SAAS,EAAE,KAAK;;AAMlB,yBAA0B;EAD5B,SAAU;IAEN,WAAW,EAAE,OAAO;IACpB,YAAY,EAAE,OAAO;IACrB,aAAa,EAAE,OAAO;IAEtB;;;;;;mCAMsB;MACpB,WAAW,EAAE,IAAI;MACjB,UAAU,EAAE,KAAK;MACjB,WAAW,EAAE,GAAG;MAChB,UAAU,EAAE,CAAC;;AAMjB,yBAA0B;EAD5B,eAAgB;IAEZ,gBAAgB,EAxJM,OAAO;IAyJ7B,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,IAAI;IACX,SAAS,EAAE,IAAI;IACf,YAAY,EAAE,IAAI;IAClB,QAAQ,EAAE,KAAK;IACf,KAAK,EAAE,KAAK;IACZ,OAAO,EAAE,GAAG;IAEZ,oBAAK;MACH,OAAO,EAAE,IAAI;IAGf,kBAAG;MACD,UAAU,EAAE,IAAI;IAGlB,oCAAqB;MACnB,OAAO,EAAE,GAAG;IAGd,oBAAK;MACH,KAAK,EAAE,IAAI;MACX,eAAe,EAAE,IAAI;MACrB,OAAO,EAAE,GAAG;MAEZ,0BAAQ;QACN,OAAO,EAAE,GAAG;;AAOlB,yBAA0B;EAD5B,qBAAsB;IAElB,cAAc,EAAE,OAAO;IACvB,WAAW,EAAE,CAAC;IACd,YAAY,EAAE,OAAO;IACrB,aAAa,EAAE,OAAO;;AAKxB,yBAA0B;EAD5B,8BAA+B;IAE3B,MAAM,EAAE,IAAI;;AAKhB,WAAY;EACV,gBAAgB,EA1MQ,OAAO;EA4M7B,yBAA0B;IAD5B,aAAE;MAEE,KAAK,EAAE,IAAI;MACX,mBAAQ;QACN,KAAK,EAAE,IAAI;MAEb,qBAAU;QACR,KAAK,EAAE,IAAI;EAIjB,aAAE;IACA,KAAK,EAAE,IAAI;;AAGf,YAAa;EACX,gBAAgB,EA3NQ,OAAO;;AA+NjC,mBAAoB;EAClB,gBAAgB,EAhOQ,OAAO;EAiO/B,UAAU,EAAE,IAAI;EAChB,WAAW,EAAE,GAAG;EAChB,YAAY,EAAE,IAAI;;AAGpB,oCAAqC;EACnC,MAAM,EAAE,IAAI;EACZ,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,KAAK,EA7OmB,OAAO;EA8O/B,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,iBAAiB;EACzB,gBAAgB,EAAE,OAAO;EACzB,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG;EAClB,UAAU,EAAE,GAAG;EACf,aAAa,EAAE,GAAG;EAClB,YAAY,EAAE,IAAI;EAClB,aAAa,EAAE,IAAI;EACnB,WAAW,EAAE,GAAG;EAChB,KAAK,EAAE,KAAK;;AAGd,iCAAkC;EAChC,WAAW,EAAE,GAAG;;AAGlB,uBAAwB;EACtB,WAAW,EAAE,GAAG;EAChB,KAAK,EAAE,IAAI;EACX,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,IAAI;EAEf,6BAAQ;IACN,KAAK,EAAE,IAAI;IACX,eAAe,EAAE,IAAI;IACrB,gBAAgB,EAAE,WAAW;EAE/B,8BAAS;IACP,OAAO,EAAE,EAAE;IACX,KAAK,EAAE,KAAK;IACZ,MAAM,EAAE,IAAI;IACZ,UAAU,EAAE,sCAAsC;IAClD,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,cAAc;;AAI1B,yBAA0B;EACxB,OAAO,EAAE,QAAQ;EACjB,UAAU,EAAE,MAAM;;AAGpB,0EAA2E;EACzE,KAAK,EA7QmB,OAAO;;AAgRjC,oBAAqB;EACnB,UAAU,EAAE,CAAC;;AAGf,sBAAuB;EACrB,aAAa,EAAE,qBAAqB;EACpC,UAAU,EAAE,qBAAqB;;AAGnC,4BAA6B;EAC3B,gBAAgB,EApSQ,OAAO;;AAwSjC,uCAAwC;EACtC,gBAAgB,EAxSQ,OAAO;;AA2SjC,0CAA2C;EACzC,gBAAgB,EA5SQ,OAAO;;AA+SjC,0CAA2C;EACzC,gBAAgB,EA/SQ,OAAO;;AAkTjC,0CAA2C;EACzC,gBAAgB,EAlTQ,OAAO;;AAqTjC,8BAA+B;EAC7B,KAAK,EAAE,IAAI;;AAGb,sBAAuB;EACrB,WAAW,EAAE,GAAG;EAChB,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;EAEnB,4BAAQ;IACN,OAAO,EAAE,GAAG;;AAIhB,8BAA+B;EAC7B,YAAY,EAAE,WAAW;;AAG3B,2DAA4D;EAC1D,aAAa,EAAE,0BAAkB;EACjC,UAAU,EAAE,qBAAqB;;AAGnC,yCAA0C;EACxC,gBAAgB,EAnVQ,OAAO;EAoV/B,6DAAoB;IAClB,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,IAAI;;AAIf,yCAA0C;EACxC,gBAAgB,EA1VQ,OAAO;EA2V/B,6DAAoB;IAClB,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,IAAI;;AAIf,8BAA+B;EAC7B,WAAW,EAAE,GAAG;EAEd,wDAAoB;IAClB,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,CAAC;;AAKhB,2CAA4C;EAC1C,gBAAgB,EA7WQ,OAAO;EA8W/B,YAAY,EAAE,OAAO;EACrB,OAAO,EAAE,CAAC;EACV,iDAAQ;IACN,gBAAgB,EAjXM,OAAO;;AAqXjC,2CAA4C;EAC1C,gBAAgB,EArXQ,OAAO;EAsX/B,YAAY,EAAE,KAAK;EACnB,OAAO,EAAE,CAAC;EACV,iDAAQ;IACN,gBAAgB,EAzXM,OAAO;;AA6XjC,2CAA4C;EAC1C,gBAAgB,EA5XQ,OAAO;EA6X/B,YAAY,EAAE,KAAK;EACnB,OAAO,EAAE,CAAC;EACV,iDAAQ;IACN,gBAAgB,EAhYM,OAAO;;AAoYjC,mCAAoC;EAClC,YAAY,EAAE,KAAK;;AAGrB,mCAAoC;EAClC,gBAAgB,EAzYQ,OAAO;EA0Y/B,YAAY,EAAE,KAAK;;AAGrB,mCAAoC;EAClC,gBAAgB,EA9YQ,OAAO;EA+Y/B,YAAY,EAAE,KAAK;;AAGrB,yDAA0D;EACxD,gBAAgB,EApZQ,OAAO;EAqZ/B,YAAY,EAAE,KAAK;EACnB,aAAa,EAAE,IAAI;EACnB,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;EACnB,+DAAQ;IACN,gBAAgB,EAzZM,OAAO;;AA6ZjC,iEAAkE;EAChE,gBAAgB,EA9ZQ,OAAO;EA+Z/B,OAAO,EAAE,CAAC;;AAGZ,yDAA0D;EACxD,gBAAgB,EAnaQ,OAAO;EAoa/B,YAAY,EAAE,KAAK;EACnB,aAAa,EAAE,IAAI;EACnB,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;;AAGrB,yDAA0D;EACxD,aAAa,EAAE,0BAAkB;EACjC,UAAU,EAAE,qBAAqB;;AAKjC,mKAA4B;EAC1B,OAAO,EAAE,GAAG;;AAIhB,oDAAqD;EACnD,KAAK,EAAE,IAAI;EACX,WAAW,EAAE,IAAI;EACjB,aAAa,EAAE,GAAG;EAClB,OAAO,EAAE,GAAG;EACZ,SAAS,EAAE,IAAI;EAEf,yDAAK;IACH,OAAO,EAAE,QAAQ;IACjB,UAAU,EAAE,MAAM;;AAItB;4CAC6C;EAC3C,KAAK,EAAE,IAAI;EACX,WAAW,EAAE,IAAI;EACjB,aAAa,EAAE,GAAG;EAClB,OAAO,EAAE,CAAC;EAEV;mDAAK;IACH,OAAO,EAAE,QAAQ;IACjB,UAAU,EAAE,MAAM;;AAItB,wCAAyC;EACvC,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,CAAC;EACV,SAAS,EAAE,IAAI;;AAKjB,IAAI;EACA,WAAW,EAAE,GAAG;EAChB,cAAc,EAAC,GAAG;EAClB,WAAW,EAAE,IAAI;EACjB,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG;EAClB,MAAM,EAAE,GAAG;EACX,WAAW,EAAC,MAAM;EAClB,QAAQ,EAAC,MAAM;EACf,aAAa,EAAC,QAAQ;EACtB,UAAU,EAAE,GAAG;EACf,aAAa,EAAE,GAAG;EAClB,UAAU,EAAE,IAAI;EAChB,UAAQ;IACN,KAAK,EAAE,IAAI;IACX,gBAAgB,EAAE,kBAAkB;IACpC,YAAY,EAAE,OAAO;IACrB,eAAe,EAAE,IAAI;;AAI3B,YAAY;EACR,SAAS,EAtda,IAAI;EAud1B,WAAW,EA7dW,GAAG;EA8dzB,KAAK,EA7eiB,OAAO;EA8e7B,UAAU,EAAE,MAAM;EAClB,MAAM,EAAE,iBAA4B;EACpC,aAAa,EAAE,GAAG;EAClB,QAAQ,EAAE,MAAM;EAChB,UAAU,EAjfY,OAAO;EAifT,kBAAkB;EACtC,UAAU,EAAE,mDAAoD;EAAE,cAAc;EAChF,UAAU,EAAE,sDAAsD;EAAE,6BAA6B;EACjG,UAAU,EAAE,oDAAoD;EAAE,sDAAsD;EACxH,MAAM,EAAE,2GAA2G;EAAE,WAAW;;AAKpI,iCAAkC;EAChC,UAAU,EAAE,CAAC;EACb,aAAa,EAAE,iBAAmC;;AAGpD,6CAA8C;EAC5C,UAAU,EAAE,KAAK;;AAInB,oCAAqC;EACnC,gBAAgB,EAAE,OAAiB;EACnC,WAAW,EAlhBa,oBAAoB;;AAohB9C,qBAAsB;EACpB,gBAAgB,EAAE,OAAkB;EACpC,MAAM,EAAE,iBAAiB;;AAQvB,0CAAkB;EAChB,gBAAgB,EA5gBI,OAAO;AA8gB7B,kCAAY;EACV,gBAAgB,EAAE,KAAoB;EACtC,oDAAkB;IAChB,gBAAgB,EAlhBE,OAAO;AAqhB7B,gCAAU;EACR,gBAAgB,EAAE,KAAoB;EACtC,kDAAkB;IAChB,gBAAgB,EAxhBE,OAAO;AA2hB7B,+BAAS;EACP,gBAAgB,EAAE,KAAiB;EACnC,iDAAkB;IAChB,gBAAgB,EAhiBE,OAAO;AAmiB7B,8BAAQ;EACN,gBAAgB,EAAE,KAAiB;EACnC,gDAAkB;IAChB,gBAAgB,EAtiBE,OAAO;AAyiB7B,6BAAO;EACL,gBAAgB,EAAE,OAAO;EACzB,+CAAkB;IAChB,gBAAgB,EA3iBE,OAAO;AA8iB7B,kCAAY;EACV,gBAAgB,EAAE,OAAO;EACzB,oDAAkB;IAChB,gBAAgB,EAjjBE,OAAO;AAojB7B,6BAAO;EACL,gBAAgB,EAAE,OAAO;EACzB,MAAM,EAAE,iBAAiB;EACzB,aAAa,EAAE,GAAG;EAClB,+CAAkB;IAChB,gBAAgB,EAAE,OAAO;IACzB,MAAM,EAAE,KAAK;IACb,aAAa,EAAE,GAAG;IAClB,KAAK,EA5kBa,OAAO;EA8kB3B,iEAAM;IACJ,UAAU,EAAE,KAAK;AAGrB,4BAAM;EACJ,gBAAgB,EAAE,OAAO;EACzB,8CAAkB;IAChB,gBAAgB,EArkBE,OAAO;AAwkB7B,gCAAU;EACR,gBAAgB,EAxkBI,OAAO;EAykB3B,MAAM,EAAE,iBAAiB;EACzB,aAAa,EAAE,GAAG;EAClB,kDAAkB;IAChB,gBAAgB,EA5kBE,OAAO;IA6kBzB,MAAM,EAAE,KAAK;IACb,aAAa,EAAE,GAAG;IAClB,KAAK,EAhmBa,OAAO;EAkmB3B,uEAAM;IACJ,UAAU,EAAE,KAAK;;AAOzB,gGAAiG;EAC/F,MAAM,EAAE,iBAAiB;EACzB,aAAa,EAAE,iBACjB;;AAGE,4BAAuB;EACrB,WAAW,EAAE,CAAC;AAEhB,iBAAY;EACV,OAAO,EAAE,IAAI;AAEf,SAAI;EACF,KAAK,EAAE,eAAe;;AAM1B,KAAM;EACJ,QAAQ,EAAE,QAAQ;EAClB,WAAM;IACJ,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,CAAC;IACR,GAAG,EAAE,CAAC;IACN,uBAAY;MACV,OAAO,EAAE,IAAI;;AAKnB,4DAA6D;EAC3D,WAAW,EAAE,MAAM;;AAMnB,0BAA2B;EAD7B,aAAc;IAEV,QAAQ,EAAE,KAAK;IACf,MAAM,EAAE,KAAK;IACb,GAAG,EAAE,CAAC;IACN,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,KAAK;IACZ,UAAU,EAAE,IAAI;IAChB,gBAAgB,EAppBM,OAAO;IAqpB7B,MAAM,EAAE,WAAW;IACnB,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,mCAAmC;IAEhD,kCAAqB;MACnB,gBAAgB,EA3pBI,OAAO;MA4pB3B,KAAK,EAAE,OAAO;MACd,SAAS,EAAE,IAAI;MACf,WAAW,EAlqBS,oBAAoB;MAmqBxC,WAAW,EAAE,IAAI;MACjB,OAAO,EAAE,IAAI;MACb,OAAO,EAAE,GAAG;MAEZ,yCAAS;QACP,WAAW,EAAE,IAAI;MAGnB,wCAAQ;QACN,OAAO,EAAE,CAAC;MAGZ,6CAAW;QACT,WAAW,EAAE,IAAI;IAKrB,kDAAqC;MACnC,UAAU,EAAE,mCAAmC;MAC/C,WAAW,EAAE,GAAG;IAGlB;wCACuB;MACrB,KAAK,EAAE,OAAO;MACd,SAAS,EAAE,IAAI;MACf,WAAW,EA9rBS,oBAAoB;MAgsBxC;4CAAE;QACA,OAAO,EAAE,GAAG;QACZ,eAAe,EAAE,IAAI;MAGvB;kDAAQ;QACN,OAAO,EAAE,GAAG;;AAOlB,0BAA2B;EAD7B,aAAc;IAGV,UAAU,EAAE,mCAAmC;IAC/C,KAAK,EAAE,IAAI;IACX,gBAAgB,EA7sBM,OAAO;IA8sB7B,WAAW,EAltBW,oBAAoB;IAmtB1C,sCAAyB;MACvB,KAAK,EAAE,IAAI;MACX,YAAY,EAAE,CAAC;IAEjB,kCAAqB;MACnB,gBAAgB,EAntBI,OAAO;MAotB3B,KAAK,EAAE,OAAO;MACd,SAAS,EAAE,IAAI;MACf,WAAW,EA3tBS,oBAAoB;IA8tB1C;wCACuB;MACrB,KAAK,EAAE,OAAO;MACd,SAAS,EAAE,IAAI;MACf,WAAW,EAluBS,oBAAoB;MAouBxC;4CAAE;QACA,OAAO,EAAE,GAAG;QACZ,eAAe,EAAE,IAAI;MAGvB;kDAAQ;QACN,OAAO,EAAE,GAAG;AAIlB,6CAAgC;EAC9B,KAAK,EAAE,IAAI", +"sources": ["../../../sass/matrixvision_overrides.scss"], +"names": [], +"file": "matrixvision.css" +} diff --git a/v24.04/de/_static/css/schunk.css b/v24.04/de/_static/css/schunk.css new file mode 100644 index 0000000..1ba29dd --- /dev/null +++ b/v24.04/de/_static/css/schunk.css @@ -0,0 +1,330 @@ +@import url("https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700"); +body, h1, h2, h3, h4, h5, h6, a, ul, li, p, span { + font-family: "Open Sans", Helvetica, sans-serif; } + +.menuselection { + font-weight: 600; } + +.wy-nav-content { + background-color: #ffffff; + max-width: 900px; } + +.wy-nav-content-wrap { + background-color: #eaecee; } + +.codeblock, pre.literal-block, .rst-content .literal-block, .rst-content pre.literal-block, div[class^='highlight'] { + background-color: #f8f9f9; } + +body { + color: #66696d; } + +b, strong { + vertical-align: top; } + +p, dd { + font-size: 16px; + color: #66696d; + line-height: 1.5em; } + +p.first { + margin-bottom: 0 !important; } + +h1, h2, .rst-content .toctree-wrapper p.caption, h3, h4, h5, h6, legend { + font-weight: 100; + font-size: 25px; + color: #66696d; + font-weight: 100; + margin-bottom: 0px; + line-height: 28px; + text-overflow: ellipsis; + display: block; + white-space: nowrap; } + +h1, h2, h3, h4, h5, h6 { + margin-bottom: 20px; } + +h1 { + font-size: 25px; } + +h2 { + font-size: 22px; } + +h3 { + font-size: 18px; + font-weight: 500; } + +h4 { + font-size: 16px; + font-weight: 600; } + +a { + color: #003d6a; } + a:active { + color: #003d6a; } + a:visited { + color: #003d6a; } + a:hover { + color: #005a9d; + text-decoration: underline; } + +.wy-nav-top { + background-color: #003d6a; } + @media (max-width: 768px) { + .wy-nav-top a { + color: #FFF; } + .wy-nav-top a:hover { + color: #FFF; } + .wy-nav-top a:visited { + color: #FFF; } } + .wy-nav-top i { + color: #FFF; } + +.wy-nav-side { + background-color: #003d6a; + border-right: 1px solid rgba(255, 255, 255, 0.2); } + +.wy-side-nav-search { + background-color: #003d6a; } + +.wy-side-nav-search input[type=text] { + border: none; + font-size: 14px; + font-weight: 400; + color: #66696d; + text-align: left; + border: 1px solid #dbdbdb; + background-color: #ffffff; + height: 36px; + border-radius: 2px; + margin-top: 2px; + margin-bottom: 2px; + padding-left: 10px; + padding-right: 10px; } + +.wy-side-nav-search > a { + line-height: 20px; + color: #fff; } + .wy-side-nav-search > a:hover { + color: #fff; + text-decoration: none; + background-color: transparent; } + .wy-side-nav-search > a:before { + content: ""; + width: 180px; + height: 50px; + background: url(../img/logo_schunk.svg) no-repeat 20px center; + display: block; + margin: 0 auto; + margin-bottom: 20px; } + +.wy-menu-vertical header, .wy-menu-vertical p.caption, .wy-menu-vertical a { + color: #ffffff; } + +.wy-menu-vertical a:hover { + background-color: #002e51; } + +.wy-menu-vertical li.current { + background-color: #003d6a; } + +.wy-menu-vertical li.current a:hover { + background-color: #002e51; } + +.wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a, .wy-menu-vertical li.toctree-l3.current > a, .wy-menu-vertical li.toctree-l2.current > a, .wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a, .wy-menu-vertical li.toctree-l4 li.toctree-l5.current > a { + background-color: #003d6a; } + .wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a:hover, .wy-menu-vertical li.toctree-l3.current > a:hover, .wy-menu-vertical li.toctree-l2.current > a:hover, .wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a:hover, .wy-menu-vertical li.toctree-l4 li.toctree-l5.current > a:hover { + background-color: #002e51; } + +.wy-menu-vertical li.current a { + color: #FFF; } + +.wy-menu-vertical li a, .wy-menu-vertical li.on a span.toctree-expand, .wy-menu-vertical li.current > a span.toctree-expand, .wy-menu-vertical li.toctree-l3 span.toctree-expand, .wy-menu-vertical li.toctree-l2 span.toctree-expand { + line-height: 26px; } + +.wy-menu-vertical li.current a { + border-color: transparent; } + +.wy-menu-vertical li.on a, .wy-menu-vertical li.current > a { + background-color: rgba(0, 0, 0, 0.2); + border: none; + border-bottom: 2px solid #009ee0; } + .wy-menu-vertical li.on a:hover, .wy-menu-vertical li.current > a:hover { + background-color: rgba(0, 0, 0, 0.2); } + +.wy-menu-vertical li a:hover { + background-color: rgba(0, 0, 0, 0.2) !important; + color: rgba(255, 255, 255, 0.9); } + +.wy-menu-vertical a { + padding-left: 1.618em; } + +.wy-menu-vertical li.current a { + padding-left: 1.618em; } + +.wy-menu-vertical li.toctree-l2.current > a { + padding-left: 3em; + background-color: rgba(0, 0, 0, 0.2); } + +.wy-menu-vertical li.toctree-l2 > a { + padding-left: 3em; } + +.wy-menu-vertical li.toctree-l3.current > a { + padding-left: 4.5em; + background-color: rgba(0, 0, 0, 0.2) !important; } + +.wy-menu-vertical li.toctree-l3 > a { + padding-left: 4.5em; } + +.wy-menu-vertical li.toctree-l4.current > a { + padding-left: 5.5em; + background-color: rgba(0, 0, 0, 0.2) !important; } + +.wy-menu-vertical li.toctree-l4 > a { + padding-left: 5.5em; } + +.wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a { + padding-left: 4.5em; } + +.wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a { + padding-left: 5.5em; } + +.wy-menu-vertical li.on a span.toctree-expand, .wy-menu-vertical li.current > a span.toctree-expand { + color: #FFF; } + .wy-menu-vertical li.on a span.toctree-expand:hover, .wy-menu-vertical li.current > a span.toctree-expand:hover { + opacity: 0.9; } + +.wy-menu-vertical li span.toctree-expand { + color: rgba(255, 255, 255, 0); } + +.btn { + padding-top: 0px; + padding-bottom: 0px; + line-height: 34px; + height: 36px; + border-radius: 2px; + margin: 0px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin-top: 2px; + margin-bottom: 2px; + box-shadow: none; } + .btn:hover { + color: #333; + background-color: #e6e6e6 !important; + border-color: #adadad; + text-decoration: none; } + +.btn-neutral { + font-size: 14px; + font-weight: 600; + color: #66696d; + text-align: center; + border: 1px solid #dbdbdb; + border-radius: 2px; + overflow: hidden; + background: #f4f4f4; + /* Old browsers */ + background: -moz-linear-gradient(top, #ffffff 0%, #f5f5f5 100%); + /* FF3.6-15 */ + background: -webkit-linear-gradient(top, #ffffff 0%, #f5f5f5 100%); + /* Chrome10-25,Safari5.1-6 */ + background: linear-gradient(to bottom, #ffffff 0%, #f5f5f5 100%); + /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#f5f5f5',GradientType=0 ); + /* IE6-9 */ } + +.rst-content .sidebar .sidebar-title { + background-color: #dcdfe3; + font-family: "Open Sans", Helvetica, sans-serif; } + +.rst-content .sidebar { + background-color: #f8f9f9; + border: 1px solid #e1e4e5; } + +.rst-content .admonition .admonition-title { + background-color: #009ee0; } +.rst-content .admonition.attention { + background-color: #ffd799; } + .rst-content .admonition.attention .admonition-title { + background-color: #ff9a00; } +.rst-content .admonition.caution { + background-color: #ffd799; } + .rst-content .admonition.caution .admonition-title { + background-color: #ff9a00; } +.rst-content .admonition.danger { + background-color: #fec9c2; } + .rst-content .admonition.danger .admonition-title { + background-color: #f22002; } +.rst-content .admonition.error { + background-color: #fec9c2; } + .rst-content .admonition.error .admonition-title { + background-color: #f22002; } +.rst-content .admonition.hint { + background-color: #ABF0AB; } + .rst-content .admonition.hint .admonition-title { + background-color: #00b000; } +.rst-content .admonition.important { + background-color: #ABF0AB; } + .rst-content .admonition.important .admonition-title { + background-color: #00b000; } +.rst-content .admonition.note { + background-color: #84d0f0; } + .rst-content .admonition.note .admonition-title { + background-color: #009ee0; + margin: -12px; } + .rst-content .admonition.note p, .rst-content .admonition.note ul { + margin-top: 0.5em; } +.rst-content .admonition.tip { + background-color: #ABF0AB; } + .rst-content .admonition.tip .admonition-title { + background-color: #00b000; } +.rst-content .admonition.warning { + background-color: #ffd799; } + .rst-content .admonition.warning .admonition-title { + background-color: #ff9a00; + margin: -12px; } + .rst-content .admonition.warning p, .rst-content .admonition.warning ul { + margin-top: 0.5em; } + +.wy-table thead th, .rst-content table.docutils thead th, .rst-content table.field-list thead th { + border: solid 1px #e1e4e5; + border-bottom: solid 2px #e1e4e5; } + +table .first.last.line-block { + margin-left: 0; } +table .headerlink { + display: none; } +table col { + width: auto !important; } + +.math { + position: relative; } + .math .eqno { + position: absolute; + right: 0; + top: 0; } + .math .eqno .headerlink { + display: none; } + +.wy-table-responsive table td, .wy-table-responsive table th { + white-space: normal; } + +.rst-versions { + box-shadow: -2px -3px 6px rgba(0, 0, 0, 0.4); + border-top: none; + color: #FFF; + background-color: #003d6a; + font-family: "Kuka Bulo", "Calibri", Helvetica, sans-serif; } + .rst-versions .rst-other-versions dd a { + color: #009ee0; + padding-left: 0; } + .rst-versions .rst-current-version { + background-color: #002037; + color: #FFFFFF; } + .rst-versions .rst-other-versions { + color: #FFF; } + +.rst-current-version .fa.fa-cog { + float: left; } + +/*# sourceMappingURL=schunk.css.map */ diff --git a/v24.04/de/_static/css/schunk.css.map b/v24.04/de/_static/css/schunk.css.map new file mode 100644 index 0000000..b80a8a8 --- /dev/null +++ b/v24.04/de/_static/css/schunk.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "AACQ,gFAAwE;AAiChF,gDAAiD;EAC/C,WAAW,EAhCa,kCAAkC;;AAmC5D,cAAe;EACb,WAAW,EAAE,GAAG;;AAGlB,eAAgB;EACd,gBAAgB,EA9BQ,OAAO;EA+B/B,SAAS,EAAE,KAAK;;AAGlB,oBAAqB;EACnB,gBAAgB,EAvCQ,OAAO;;AA0CjC,mHAAoH;EAClH,gBAAgB,EAAE,OAAkB;;AAKtC,IAAK;EACH,KAAK,EAtDmB,OAAO;;AAyDjC,SAAU;EACR,cAAc,EAAE,GAAG;;AAGrB,KAAM;EACJ,SAAS,EAAE,IAAI;EACf,KAAK,EA/DmB,OAAO;EAgE/B,WAAW,EAAE,KAAK;;AAGpB,OAAQ;EACN,aAAa,EAAE,YAAY;;AAG7B,uEAAwE;EACtE,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,IAAI;EACf,KAAK,EApEmB,OAAO;EAqE/B,WAAW,EArDa,GAAG;EAsD3B,aAAa,EAAE,GAAG;EAClB,WAAW,EAAE,IAAI;EACjB,aAAa,EAAE,QAAQ;EACvB,OAAO,EAAE,KAAK;EACd,WAAW,EAAE,MAAM;;AAGrB,sBAAkB;EAChB,aAAa,EAAE,IAAI;;AAGrB,EAAG;EACD,SAAS,EAAE,IAAI;;AAEjB,EAAG;EACD,SAAS,EAAE,IAAI;;AAEjB,EAAE;EACA,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;;AAElB,EAAE;EACA,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;;AAGlB,CAAE;EACA,KAAK,EAzFmB,OAAO;EA0F/B,QAAS;IACP,KAAK,EA3FiB,OAAO;EA6F/B,SAAU;IACR,KAAK,EA9FiB,OAAO;EAgG/B,OAAQ;IACN,KAAK,EAAE,OAAkB;IACzB,eAAe,EAAE,SAAS;;AAK9B,WAAY;EACV,gBAAgB,EAnHQ,OAAO;EAqH7B,yBAA0B;IAD5B,aAAE;MAEE,KAAK,EAAE,IAAI;MACX,mBAAQ;QACN,KAAK,EAAE,IAAI;MAEb,qBAAU;QACR,KAAK,EAAE,IAAI;EAIjB,aAAE;IACA,KAAK,EAAE,IAAI;;AAGf,YAAa;EACX,gBAAgB,EApIQ,OAAO;EAqI/B,YAAY,EAAE,kCAAkC;;AAGlD,mBAAoB;EAClB,gBAAgB,EAzIQ,OAAO;;AA4IjC,oCAAqC;EACnC,MAAM,EAAE,IAAI;EACZ,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,KAAK,EAnJmB,OAAO;EAoJ/B,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,iBAAiB;EACzB,gBAAgB,EAAE,OAAO;EACzB,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG;EAClB,UAAU,EAAE,GAAG;EACf,aAAa,EAAE,GAAG;EAClB,YAAY,EAAE,IAAI;EAClB,aAAa,EAAE,IAAI;;AAIrB,uBAAwB;EACtB,WAAW,EAAE,IAAI;EACjB,KAAK,EAAE,IAAI;EACX,6BAAQ;IACN,KAAK,EAAE,IAAI;IACX,eAAe,EAAE,IAAI;IACrB,gBAAgB,EAAE,WAAW;EAE/B,8BAAS;IACP,OAAO,EAAE,EAAE;IACX,KAAK,EAAE,KAAK;IACZ,MAAM,EAAE,IAAI;IACZ,UAAU,EAAE,iDAAiD;IAC7D,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,MAAM;IACd,aAAa,EAAE,IAAI;;AAKvB,0EAA2E;EACzE,KAAK,EA5KmB,OAAO;;AA+KjC,yBAA0B;EACxB,gBAAgB,EAAE,OAAuB;;AAG3C,4BAA6B;EAC3B,gBAAgB,EA1LQ,OAAO;;AA4LjC,oCAAqC;EACnC,gBAAgB,EAAE,OAAuB;;AAG3C,yQAA0Q;EACxQ,gBAAgB,EAjMQ,OAAO;EAkM/B,uSAAQ;IACN,gBAAgB,EAAE,OAAuB;;AAI7C,8BAA+B;EAC7B,KAAK,EAAE,IAAI;;AAGb,qOAAoO;EAClO,WAAW,EAAE,IAAI;;AAGnB,8BAA+B;EAC7B,YAAY,EAAE,WAAW;;AAG3B,2DAA4D;EAC1D,gBAAgB,EAAE,kBAAkB;EACpC,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,iBAAqB;EAEpC,uEAAQ;IACN,gBAAgB,EAAE,kBAAkB;;AAGxC,4BAA6B;EAC3B,gBAAgB,EAAE,6BAA6B;EAC/C,KAAK,EAAE,wBACT;;AAEA,mBAAoB;EAClB,YAAY,EAAE,OAAO;;AAEvB,8BAA+B;EAC7B,YAAY,EAAE,OAAO;;AAEvB,2CAA4C;EAC1C,YAAY,EAAE,GAAG;EACjB,gBAAgB,EAAE,kBAAkB;;AAEtC,mCAAoC;EAClC,YAAY,EAAE,GAAG;;AAEnB,2CAA4C;EAC1C,YAAY,EAAE,KAAK;EACnB,gBAAgB,EAAE,6BAA6B;;AAEjD,mCAAmC;EACjC,YAAY,EAAE,KAAK;;AAErB,2CAA4C;EAC1C,YAAY,EAAE,KAAK;EACnB,gBAAgB,EAAE,6BAA6B;;AAEjD,mCAAoC;EAClC,YAAY,EAAE,KAAK;;AAErB,yDAA0D;EACxD,YAAY,EAAE,KAAK;;AAErB,yDAA0D;EACxD,YAAY,EAAE,KAAK;;AAGrB,mGAAoG;EAClG,KAAK,EAAE,IAAI;EACX,+GAAQ;IACN,OAAO,EAAE,GAAG;;AAIhB,wCAAyC;EACvC,KAAK,EAAE,sBACT;;AAIA,IAAI;EACA,WAAW,EAAE,GAAG;EAChB,cAAc,EAAC,GAAG;EAClB,WAAW,EAAE,IAAI;EACjB,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG;EAClB,MAAM,EAAE,GAAG;EACX,WAAW,EAAC,MAAM;EAClB,QAAQ,EAAC,MAAM;EACf,aAAa,EAAC,QAAQ;EACtB,UAAU,EAAE,GAAG;EACf,aAAa,EAAE,GAAG;EAClB,UAAU,EAAE,IAAI;EAChB,UAAQ;IACN,KAAK,EAAE,IAAI;IACX,gBAAgB,EAAE,kBAAkB;IACpC,YAAY,EAAE,OAAO;IACrB,eAAe,EAAE,IAAI;;AAI3B,YAAY;EACR,SAAS,EA/Qa,IAAI;EAgR1B,WAAW,EAtRW,GAAG;EAuRzB,KAAK,EArSiB,OAAO;EAsS7B,UAAU,EAAE,MAAM;EAClB,MAAM,EAAE,iBAA4B;EACpC,aAAa,EAAE,GAAG;EAClB,QAAQ,EAAE,MAAM;EAChB,UAAU,EAzSY,OAAO;EAyST,kBAAkB;EACtC,UAAU,EAAE,mDAAoD;EAAE,cAAc;EAChF,UAAU,EAAE,sDAAsD;EAAE,6BAA6B;EACjG,UAAU,EAAE,oDAAoD;EAAE,sDAAsD;EACxH,MAAM,EAAE,2GAA2G;EAAE,WAAW;;AAKpI,oCAAqC;EACnC,gBAAgB,EAAE,OAAiB;EACnC,WAAW,EA5Ta,kCAAkC;;AA8T5D,qBAAsB;EACpB,gBAAgB,EAAE,OAAkB;EACpC,MAAM,EAAE,iBAAiB;;AAQvB,0CAAkB;EAChB,gBAAgB,EAtUI,OAAO;AAwU7B,kCAAY;EACV,gBAAgB,EAAE,OAAoB;EACtC,oDAAkB;IAChB,gBAAgB,EAhUE,OAAO;AAmU7B,gCAAU;EACR,gBAAgB,EAAE,OAAoB;EACtC,kDAAkB;IAChB,gBAAgB,EAtUE,OAAO;AAyU7B,+BAAS;EACP,gBAAgB,EAAE,OAAiB;EACnC,iDAAkB;IAChB,gBAAgB,EA9UE,OAAO;AAiV7B,8BAAQ;EACN,gBAAgB,EAAE,OAAiB;EACnC,gDAAkB;IAChB,gBAAgB,EApVE,OAAO;AAuV7B,6BAAO;EACL,gBAAgB,EAAE,OAAO;EACzB,+CAAkB;IAChB,gBAAgB,EAzVE,OAAO;AA4V7B,kCAAY;EACV,gBAAgB,EAAE,OAAO;EACzB,oDAAkB;IAChB,gBAAgB,EA/VE,OAAO;AAkW7B,6BAAO;EACL,gBAAgB,EAAE,OAAO;EACzB,+CAAkB;IAChB,gBAAgB,EA/WE,OAAO;IAgXzB,MAAM,EAAE,KAAK;EAEf,iEAAM;IACJ,UAAU,EAAE,KAAK;AAGrB,4BAAM;EACJ,gBAAgB,EAAE,OAAO;EACzB,8CAAkB;IAChB,gBAAgB,EA/WE,OAAO;AAkX7B,gCAAU;EACR,gBAAgB,EAAE,OAAoB;EACtC,kDAAkB;IAChB,gBAAgB,EApXE,OAAO;IAqXzB,MAAM,EAAE,KAAK;EAEf,uEAAM;IACJ,UAAU,EAAE,KAAK;;AAOzB,gGAAiG;EAC/F,MAAM,EAAE,iBAAiB;EACzB,aAAa,EAAE,iBACjB;;AAGE,4BAAuB;EACrB,WAAW,EAAE,CAAC;AAEhB,iBAAY;EACV,OAAO,EAAE,IAAI;AAEf,SAAI;EACF,KAAK,EAAE,eAAe;;AAM1B,KAAM;EACJ,QAAQ,EAAE,QAAQ;EAClB,WAAM;IACJ,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,CAAC;IACR,GAAG,EAAE,CAAC;IACN,uBAAY;MACV,OAAO,EAAE,IAAI;;AAKnB,4DAA6D;EAC3D,WAAW,EAAE,MAAM;;AAGrB,aAAc;EACZ,UAAU,EAAE,gCAA6B;EACzC,UAAU,EAAE,IAAI;EAChB,KAAK,EAAE,IAAI;EACX,gBAAgB,EAhbQ,OAAO;EAib/B,WAAW,EAAE,6CAA6C;EAC1D,sCAAyB;IACvB,KAAK,EApbiB,OAAO;IAqb7B,YAAY,EAAE,CAAC;EAEjB,kCAAqB;IACnB,gBAAgB,EAAE,OAAwB;IAC1C,KAAK,EAAE,OAAO;EAGhB,iCAAoB;IAClB,KAAK,EAAE,IAAI;;AAGf,+BAAgC;EAC9B,KAAK,EAAE,IAAI", +"sources": ["../../../sass/schunk_overrides.scss"], +"names": [], +"file": "schunk.css" +} diff --git a/v24.04/de/_static/css/theme.css b/v24.04/de/_static/css/theme.css new file mode 100644 index 0000000..8fce59f --- /dev/null +++ b/v24.04/de/_static/css/theme.css @@ -0,0 +1,6043 @@ +@charset "UTF-8"; +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +article, aside, details, figcaption, figure, footer, header, hgroup, nav, section { + display: block; +} + +audio, canvas, video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +audio:not([controls]) { + display: none; +} + +[hidden] { + display: none; +} + +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +body { + margin: 0; +} + +a:hover, a:active { + outline: 0; +} + +abbr[title] { + border-bottom: 1px dotted; +} + +b, strong { + font-weight: bold; +} + +blockquote { + margin: 0; +} + +dfn { + font-style: italic; +} + +ins { + background: #ff9; + color: #000; + text-decoration: none; +} + +mark { + background: #ff0; + color: #000; + font-style: italic; + font-weight: bold; +} + +pre, code, .rst-content tt, .rst-content code, kbd, samp { + font-family: monospace, serif; + _font-family: "courier new", monospace; + font-size: 1em; +} + +pre { + white-space: pre; +} + +q { + quotes: none; +} + +q:before, q:after { + content: ""; + content: none; +} + +small { + font-size: 85%; +} + +sub, sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +ul, ol, dl { + margin: 0; + padding: 0; + list-style: none; + list-style-image: none; +} + +li { + list-style: none; +} + +dd { + margin: 0; +} + +img { + border: 0; + -ms-interpolation-mode: bicubic; + vertical-align: middle; + max-width: 100%; +} + +svg:not(:root) { + overflow: hidden; +} + +figure { + margin: 0; +} + +form { + margin: 0; +} + +fieldset { + border: 0; + margin: 0; + padding: 0; +} + +label { + cursor: pointer; +} + +legend { + border: 0; + *margin-left: -7px; + padding: 0; + white-space: normal; +} + +button, input, select, textarea { + font-size: 100%; + margin: 0; + vertical-align: baseline; + *vertical-align: middle; +} + +button, input { + line-height: normal; +} + +button, input[type="button"], input[type="reset"], input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; + *overflow: visible; +} + +button[disabled], input[disabled] { + cursor: default; +} + +input[type="checkbox"], input[type="radio"] { + box-sizing: border-box; + padding: 0; + *width: 13px; + *height: 13px; +} + +input[type="search"] { + -webkit-appearance: textfield; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} + +input[type="search"]::-webkit-search-decoration, input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +button::-moz-focus-inner, input::-moz-focus-inner { + border: 0; + padding: 0; +} + +textarea { + overflow: auto; + vertical-align: top; + resize: vertical; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td { + vertical-align: top; +} + +.chromeframe { + margin: 0.2em 0; + background: #ccc; + color: black; + padding: 0.2em 0; +} + +.ir { + display: block; + border: 0; + text-indent: -999em; + overflow: hidden; + background-color: transparent; + background-repeat: no-repeat; + text-align: left; + direction: ltr; + *line-height: 0; +} + +.ir br { + display: none; +} + +.hidden { + display: none !important; + visibility: hidden; +} + +.visuallyhidden { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} + +.visuallyhidden.focusable:active, .visuallyhidden.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} + +.invisible { + visibility: hidden; +} + +.relative { + position: relative; +} + +big, small { + font-size: 100%; +} + +@media print { + html, body, section { + background: none !important; + } + + * { + box-shadow: none !important; + text-shadow: none !important; + filter: none !important; + -ms-filter: none !important; + } + + a, a:visited { + text-decoration: underline; + } + + .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { + content: ""; + } + + pre, blockquote { + page-break-inside: avoid; + } + + thead { + display: table-header-group; + } + + tr, img { + page-break-inside: avoid; + } + + img { + max-width: 100% !important; + } + + @page { + margin: 0.5cm; + } + p, h2, .rst-content .toctree-wrapper p.caption, h3 { + orphans: 3; + widows: 3; + } + + h2, .rst-content .toctree-wrapper p.caption, h3 { + page-break-after: avoid; + } +} +.fa:before, .wy-menu-vertical li span.toctree-expand:before, .wy-menu-vertical li.on a span.toctree-expand:before, .wy-menu-vertical li.current > a span.toctree-expand:before, .rst-content .admonition-title:before, .rst-content h1 .headerlink:before, .rst-content h2 .headerlink:before, .rst-content h3 .headerlink:before, .rst-content h4 .headerlink:before, .rst-content h5 .headerlink:before, .rst-content h6 .headerlink:before, .rst-content dl dt .headerlink:before, .rst-content p.caption .headerlink:before, .rst-content tt.download span:first-child:before, .rst-content code.download span:first-child:before, .icon:before, .wy-dropdown .caret:before, .wy-inline-validate.wy-inline-validate-success .wy-input-context:before, .wy-inline-validate.wy-inline-validate-danger .wy-input-context:before, .wy-inline-validate.wy-inline-validate-warning .wy-input-context:before, .wy-inline-validate.wy-inline-validate-info .wy-input-context:before, .wy-alert, .rst-content .note, .rst-content .attention, .rst-content .caution, .rst-content .danger, .rst-content .error, .rst-content .hint, .rst-content .important, .rst-content .tip, .rst-content .warning, .rst-content .seealso, .rst-content .admonition-todo, .rst-content .admonition, .btn, input[type="text"], input[type="password"], input[type="email"], input[type="url"], input[type="date"], input[type="month"], input[type="time"], input[type="datetime"], input[type="datetime-local"], input[type="week"], input[type="number"], input[type="search"], input[type="tel"], input[type="color"], select, textarea, .wy-menu-vertical li.on a, .wy-menu-vertical li.current > a, .wy-side-nav-search > a, .wy-side-nav-search .wy-dropdown > a, .wy-nav-top a { + -webkit-font-smoothing: antialiased; +} + +.clearfix { + *zoom: 1; +} +.clearfix:before, .clearfix:after { + display: table; + content: ""; +} +.clearfix:after { + clear: both; +} + +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url("../fonts/fontawesome-webfont.eot?v=4.7.0"); + src: url("../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0") format("embedded-opentype"), url("../fonts/fontawesome-webfont.woff2?v=4.7.0") format("woff2"), url("../fonts/fontawesome-webfont.woff?v=4.7.0") format("woff"), url("../fonts/fontawesome-webfont.ttf?v=4.7.0") format("truetype"), url("../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular") format("svg"); + font-weight: normal; + font-style: normal; +} +.fa, .wy-menu-vertical li span.toctree-expand, .wy-menu-vertical li.on a span.toctree-expand, .wy-menu-vertical li.current > a span.toctree-expand, .rst-content .admonition-title, .rst-content h1 .headerlink, .rst-content h2 .headerlink, .rst-content h3 .headerlink, .rst-content h4 .headerlink, .rst-content h5 .headerlink, .rst-content h6 .headerlink, .rst-content dl dt .headerlink, .rst-content p.caption .headerlink, .rst-content tt.download span:first-child, .rst-content code.download span:first-child, .icon { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.3333333333em; + line-height: 0.75em; + vertical-align: -15%; +} + +.fa-2x { + font-size: 2em; +} + +.fa-3x { + font-size: 3em; +} + +.fa-4x { + font-size: 4em; +} + +.fa-5x { + font-size: 5em; +} + +.fa-fw { + width: 1.2857142857em; + text-align: center; +} + +.fa-ul { + padding-left: 0; + margin-left: 2.1428571429em; + list-style-type: none; +} +.fa-ul > li { + position: relative; +} + +.fa-li { + position: absolute; + left: -2.1428571429em; + width: 2.1428571429em; + top: 0.1428571429em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.8571428571em; +} + +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eee; + border-radius: .1em; +} + +.fa-pull-left { + float: left; +} + +.fa-pull-right { + float: right; +} + +.fa.fa-pull-left, .wy-menu-vertical li span.fa-pull-left.toctree-expand, .wy-menu-vertical li.on a span.fa-pull-left.toctree-expand, .wy-menu-vertical li.current > a span.fa-pull-left.toctree-expand, .rst-content .fa-pull-left.admonition-title, .rst-content h1 .fa-pull-left.headerlink, .rst-content h2 .fa-pull-left.headerlink, .rst-content h3 .fa-pull-left.headerlink, .rst-content h4 .fa-pull-left.headerlink, .rst-content h5 .fa-pull-left.headerlink, .rst-content h6 .fa-pull-left.headerlink, .rst-content dl dt .fa-pull-left.headerlink, .rst-content p.caption .fa-pull-left.headerlink, .rst-content tt.download span.fa-pull-left:first-child, .rst-content code.download span.fa-pull-left:first-child, .fa-pull-left.icon { + margin-right: .3em; +} +.fa.fa-pull-right, .wy-menu-vertical li span.fa-pull-right.toctree-expand, .wy-menu-vertical li.on a span.fa-pull-right.toctree-expand, .wy-menu-vertical li.current > a span.fa-pull-right.toctree-expand, .rst-content .fa-pull-right.admonition-title, .rst-content h1 .fa-pull-right.headerlink, .rst-content h2 .fa-pull-right.headerlink, .rst-content h3 .fa-pull-right.headerlink, .rst-content h4 .fa-pull-right.headerlink, .rst-content h5 .fa-pull-right.headerlink, .rst-content h6 .fa-pull-right.headerlink, .rst-content dl dt .fa-pull-right.headerlink, .rst-content p.caption .fa-pull-right.headerlink, .rst-content tt.download span.fa-pull-right:first-child, .rst-content code.download span.fa-pull-right:first-child, .fa-pull-right.icon { + margin-left: .3em; +} + +/* Deprecated as of 4.4.0 */ +.pull-right { + float: right; +} + +.pull-left { + float: left; +} + +.fa.pull-left, .wy-menu-vertical li span.pull-left.toctree-expand, .wy-menu-vertical li.on a span.pull-left.toctree-expand, .wy-menu-vertical li.current > a span.pull-left.toctree-expand, .rst-content .pull-left.admonition-title, .rst-content h1 .pull-left.headerlink, .rst-content h2 .pull-left.headerlink, .rst-content h3 .pull-left.headerlink, .rst-content h4 .pull-left.headerlink, .rst-content h5 .pull-left.headerlink, .rst-content h6 .pull-left.headerlink, .rst-content dl dt .pull-left.headerlink, .rst-content p.caption .pull-left.headerlink, .rst-content tt.download span.pull-left:first-child, .rst-content code.download span.pull-left:first-child, .pull-left.icon { + margin-right: .3em; +} +.fa.pull-right, .wy-menu-vertical li span.pull-right.toctree-expand, .wy-menu-vertical li.on a span.pull-right.toctree-expand, .wy-menu-vertical li.current > a span.pull-right.toctree-expand, .rst-content .pull-right.admonition-title, .rst-content h1 .pull-right.headerlink, .rst-content h2 .pull-right.headerlink, .rst-content h3 .pull-right.headerlink, .rst-content h4 .pull-right.headerlink, .rst-content h5 .pull-right.headerlink, .rst-content h6 .pull-right.headerlink, .rst-content dl dt .pull-right.headerlink, .rst-content p.caption .pull-right.headerlink, .rst-content tt.download span.pull-right:first-child, .rst-content code.download span.pull-right:first-child, .pull-right.icon { + margin-left: .3em; +} + +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} + +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} + +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} + +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} + +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); +} + +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); +} + +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + filter: none; +} + +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} + +.fa-stack-1x, .fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} + +.fa-stack-1x { + line-height: inherit; +} + +.fa-stack-2x { + font-size: 2em; +} + +.fa-inverse { + color: #fff; +} + +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: ""; +} + +.fa-music:before { + content: ""; +} + +.fa-search:before, .icon-search:before { + content: ""; +} + +.fa-envelope-o:before { + content: ""; +} + +.fa-heart:before { + content: ""; +} + +.fa-star:before { + content: ""; +} + +.fa-star-o:before { + content: ""; +} + +.fa-user:before { + content: ""; +} + +.fa-film:before { + content: ""; +} + +.fa-th-large:before { + content: ""; +} + +.fa-th:before { + content: ""; +} + +.fa-th-list:before { + content: ""; +} + +.fa-check:before { + content: ""; +} + +.fa-remove:before, +.fa-close:before, +.fa-times:before { + content: ""; +} + +.fa-search-plus:before { + content: ""; +} + +.fa-search-minus:before { + content: ""; +} + +.fa-power-off:before { + content: ""; +} + +.fa-signal:before { + content: ""; +} + +.fa-gear:before, +.fa-cog:before { + content: ""; +} + +.fa-trash-o:before { + content: ""; +} + +.fa-home:before, .icon-home:before { + content: ""; +} + +.fa-file-o:before { + content: ""; +} + +.fa-clock-o:before { + content: ""; +} + +.fa-road:before { + content: ""; +} + +.fa-download:before, .rst-content tt.download span:first-child:before, .rst-content code.download span:first-child:before { + content: ""; +} + +.fa-arrow-circle-o-down:before { + content: ""; +} + +.fa-arrow-circle-o-up:before { + content: ""; +} + +.fa-inbox:before { + content: ""; +} + +.fa-play-circle-o:before { + content: ""; +} + +.fa-rotate-right:before, +.fa-repeat:before { + content: ""; +} + +.fa-refresh:before { + content: ""; +} + +.fa-list-alt:before { + content: ""; +} + +.fa-lock:before { + content: ""; +} + +.fa-flag:before { + content: ""; +} + +.fa-headphones:before { + content: ""; +} + +.fa-volume-off:before { + content: ""; +} + +.fa-volume-down:before { + content: ""; +} + +.fa-volume-up:before { + content: ""; +} + +.fa-qrcode:before { + content: ""; +} + +.fa-barcode:before { + content: ""; +} + +.fa-tag:before { + content: ""; +} + +.fa-tags:before { + content: ""; +} + +.fa-book:before, .icon-book:before { + content: ""; +} + +.fa-bookmark:before { + content: ""; +} + +.fa-print:before { + content: ""; +} + +.fa-camera:before { + content: ""; +} + +.fa-font:before { + content: ""; +} + +.fa-bold:before { + content: ""; +} + +.fa-italic:before { + content: ""; +} + +.fa-text-height:before { + content: ""; +} + +.fa-text-width:before { + content: ""; +} + +.fa-align-left:before { + content: ""; +} + +.fa-align-center:before { + content: ""; +} + +.fa-align-right:before { + content: ""; +} + +.fa-align-justify:before { + content: ""; +} + +.fa-list:before { + content: ""; +} + +.fa-dedent:before, +.fa-outdent:before { + content: ""; +} + +.fa-indent:before { + content: ""; +} + +.fa-video-camera:before { + content: ""; +} + +.fa-photo:before, +.fa-image:before, +.fa-picture-o:before { + content: ""; +} + +.fa-pencil:before { + content: ""; +} + +.fa-map-marker:before { + content: ""; +} + +.fa-adjust:before { + content: ""; +} + +.fa-tint:before { + content: ""; +} + +.fa-edit:before, +.fa-pencil-square-o:before { + content: ""; +} + +.fa-share-square-o:before { + content: ""; +} + +.fa-check-square-o:before { + content: ""; +} + +.fa-arrows:before { + content: ""; +} + +.fa-step-backward:before { + content: ""; +} + +.fa-fast-backward:before { + content: ""; +} + +.fa-backward:before { + content: ""; +} + +.fa-play:before { + content: ""; +} + +.fa-pause:before { + content: ""; +} + +.fa-stop:before { + content: ""; +} + +.fa-forward:before { + content: ""; +} + +.fa-fast-forward:before { + content: ""; +} + +.fa-step-forward:before { + content: ""; +} + +.fa-eject:before { + content: ""; +} + +.fa-chevron-left:before { + content: ""; +} + +.fa-chevron-right:before { + content: ""; +} + +.fa-plus-circle:before { + content: ""; +} + +.fa-minus-circle:before { + content: ""; +} + +.fa-times-circle:before, .wy-inline-validate.wy-inline-validate-danger .wy-input-context:before { + content: ""; +} + +.fa-check-circle:before, .wy-inline-validate.wy-inline-validate-success .wy-input-context:before { + content: ""; +} + +.fa-question-circle:before { + content: ""; +} + +.fa-info-circle:before { + content: ""; +} + +.fa-crosshairs:before { + content: ""; +} + +.fa-times-circle-o:before { + content: ""; +} + +.fa-check-circle-o:before { + content: ""; +} + +.fa-ban:before { + content: ""; +} + +.fa-arrow-left:before { + content: ""; +} + +.fa-arrow-right:before { + content: ""; +} + +.fa-arrow-up:before { + content: ""; +} + +.fa-arrow-down:before { + content: ""; +} + +.fa-mail-forward:before, +.fa-share:before { + content: ""; +} + +.fa-expand:before { + content: ""; +} + +.fa-compress:before { + content: ""; +} + +.fa-plus:before { + content: ""; +} + +.fa-minus:before { + content: ""; +} + +.fa-asterisk:before { + content: ""; +} + +.fa-exclamation-circle:before, .wy-inline-validate.wy-inline-validate-warning .wy-input-context:before, .wy-inline-validate.wy-inline-validate-info .wy-input-context:before, .rst-content .admonition-title:before { + content: ""; +} + +.fa-gift:before { + content: ""; +} + +.fa-leaf:before { + content: ""; +} + +.fa-fire:before, .icon-fire:before { + content: ""; +} + +.fa-eye:before { + content: ""; +} + +.fa-eye-slash:before { + content: ""; +} + +.fa-warning:before, +.fa-exclamation-triangle:before { + content: ""; +} + +.fa-plane:before { + content: ""; +} + +.fa-calendar:before { + content: ""; +} + +.fa-random:before { + content: ""; +} + +.fa-comment:before { + content: ""; +} + +.fa-magnet:before { + content: ""; +} + +.fa-chevron-up:before { + content: ""; +} + +.fa-chevron-down:before { + content: ""; +} + +.fa-retweet:before { + content: ""; +} + +.fa-shopping-cart:before { + content: ""; +} + +.fa-folder:before { + content: ""; +} + +.fa-folder-open:before { + content: ""; +} + +.fa-arrows-v:before { + content: ""; +} + +.fa-arrows-h:before { + content: ""; +} + +.fa-bar-chart-o:before, +.fa-bar-chart:before { + content: ""; +} + +.fa-twitter-square:before { + content: ""; +} + +.fa-facebook-square:before { + content: ""; +} + +.fa-camera-retro:before { + content: ""; +} + +.fa-key:before { + content: ""; +} + +.fa-gears:before, +.fa-cogs:before { + content: ""; +} + +.fa-comments:before { + content: ""; +} + +.fa-thumbs-o-up:before { + content: ""; +} + +.fa-thumbs-o-down:before { + content: ""; +} + +.fa-star-half:before { + content: ""; +} + +.fa-heart-o:before { + content: ""; +} + +.fa-sign-out:before { + content: ""; +} + +.fa-linkedin-square:before { + content: ""; +} + +.fa-thumb-tack:before { + content: ""; +} + +.fa-external-link:before { + content: ""; +} + +.fa-sign-in:before { + content: ""; +} + +.fa-trophy:before { + content: ""; +} + +.fa-github-square:before { + content: ""; +} + +.fa-upload:before { + content: ""; +} + +.fa-lemon-o:before { + content: ""; +} + +.fa-phone:before { + content: ""; +} + +.fa-square-o:before { + content: ""; +} + +.fa-bookmark-o:before { + content: ""; +} + +.fa-phone-square:before { + content: ""; +} + +.fa-twitter:before { + content: ""; +} + +.fa-facebook-f:before, +.fa-facebook:before { + content: ""; +} + +.fa-github:before, .icon-github:before { + content: ""; +} + +.fa-unlock:before { + content: ""; +} + +.fa-credit-card:before { + content: ""; +} + +.fa-feed:before, +.fa-rss:before { + content: ""; +} + +.fa-hdd-o:before { + content: ""; +} + +.fa-bullhorn:before { + content: ""; +} + +.fa-bell:before { + content: ""; +} + +.fa-certificate:before { + content: ""; +} + +.fa-hand-o-right:before { + content: ""; +} + +.fa-hand-o-left:before { + content: ""; +} + +.fa-hand-o-up:before { + content: ""; +} + +.fa-hand-o-down:before { + content: ""; +} + +.fa-arrow-circle-left:before, .icon-circle-arrow-left:before { + content: ""; +} + +.fa-arrow-circle-right:before, .icon-circle-arrow-right:before { + content: ""; +} + +.fa-arrow-circle-up:before { + content: ""; +} + +.fa-arrow-circle-down:before { + content: ""; +} + +.fa-globe:before { + content: ""; +} + +.fa-wrench:before { + content: ""; +} + +.fa-tasks:before { + content: ""; +} + +.fa-filter:before { + content: ""; +} + +.fa-briefcase:before { + content: ""; +} + +.fa-arrows-alt:before { + content: ""; +} + +.fa-group:before, +.fa-users:before { + content: ""; +} + +.fa-chain:before, +.fa-link:before, +.icon-link:before { + content: ""; +} + +.fa-cloud:before { + content: ""; +} + +.fa-flask:before { + content: ""; +} + +.fa-cut:before, +.fa-scissors:before { + content: ""; +} + +.fa-copy:before, +.fa-files-o:before { + content: ""; +} + +.fa-paperclip:before { + content: ""; +} + +.fa-save:before, +.fa-floppy-o:before { + content: ""; +} + +.fa-square:before { + content: ""; +} + +.fa-navicon:before, +.fa-reorder:before, +.fa-bars:before { + content: ""; +} + +.fa-list-ul:before { + content: ""; +} + +.fa-list-ol:before { + content: ""; +} + +.fa-strikethrough:before { + content: ""; +} + +.fa-underline:before { + content: ""; +} + +.fa-table:before { + content: ""; +} + +.fa-magic:before { + content: ""; +} + +.fa-truck:before { + content: ""; +} + +.fa-pinterest:before { + content: ""; +} + +.fa-pinterest-square:before { + content: ""; +} + +.fa-google-plus-square:before { + content: ""; +} + +.fa-google-plus:before { + content: ""; +} + +.fa-money:before { + content: ""; +} + +.fa-caret-down:before, .wy-dropdown .caret:before, .icon-caret-down:before { + content: ""; +} + +.fa-caret-up:before { + content: ""; +} + +.fa-caret-left:before { + content: ""; +} + +.fa-caret-right:before { + content: ""; +} + +.fa-columns:before { + content: ""; +} + +.fa-unsorted:before, +.fa-sort:before { + content: ""; +} + +.fa-sort-down:before, +.fa-sort-desc:before { + content: ""; +} + +.fa-sort-up:before, +.fa-sort-asc:before { + content: ""; +} + +.fa-envelope:before { + content: ""; +} + +.fa-linkedin:before { + content: ""; +} + +.fa-rotate-left:before, +.fa-undo:before { + content: ""; +} + +.fa-legal:before, +.fa-gavel:before { + content: ""; +} + +.fa-dashboard:before, +.fa-tachometer:before { + content: ""; +} + +.fa-comment-o:before { + content: ""; +} + +.fa-comments-o:before { + content: ""; +} + +.fa-flash:before, +.fa-bolt:before { + content: ""; +} + +.fa-sitemap:before { + content: ""; +} + +.fa-umbrella:before { + content: ""; +} + +.fa-paste:before, +.fa-clipboard:before { + content: ""; +} + +.fa-lightbulb-o:before { + content: ""; +} + +.fa-exchange:before { + content: ""; +} + +.fa-cloud-download:before { + content: ""; +} + +.fa-cloud-upload:before { + content: ""; +} + +.fa-user-md:before { + content: ""; +} + +.fa-stethoscope:before { + content: ""; +} + +.fa-suitcase:before { + content: ""; +} + +.fa-bell-o:before { + content: ""; +} + +.fa-coffee:before { + content: ""; +} + +.fa-cutlery:before { + content: ""; +} + +.fa-file-text-o:before { + content: ""; +} + +.fa-building-o:before { + content: ""; +} + +.fa-hospital-o:before { + content: ""; +} + +.fa-ambulance:before { + content: ""; +} + +.fa-medkit:before { + content: ""; +} + +.fa-fighter-jet:before { + content: ""; +} + +.fa-beer:before { + content: ""; +} + +.fa-h-square:before { + content: ""; +} + +.fa-plus-square:before { + content: ""; +} + +.fa-angle-double-left:before { + content: ""; +} + +.fa-angle-double-right:before { + content: ""; +} + +.fa-angle-double-up:before { + content: ""; +} + +.fa-angle-double-down:before { + content: ""; +} + +.fa-angle-left:before { + content: ""; +} + +.fa-angle-right:before { + content: ""; +} + +.fa-angle-up:before { + content: ""; +} + +.fa-angle-down:before { + content: ""; +} + +.fa-desktop:before { + content: ""; +} + +.fa-laptop:before { + content: ""; +} + +.fa-tablet:before { + content: ""; +} + +.fa-mobile-phone:before, +.fa-mobile:before { + content: ""; +} + +.fa-circle-o:before { + content: ""; +} + +.fa-quote-left:before { + content: ""; +} + +.fa-quote-right:before { + content: ""; +} + +.fa-spinner:before { + content: ""; +} + +.fa-circle:before { + content: ""; +} + +.fa-mail-reply:before, +.fa-reply:before { + content: ""; +} + +.fa-github-alt:before { + content: ""; +} + +.fa-folder-o:before { + content: ""; +} + +.fa-folder-open-o:before { + content: ""; +} + +.fa-smile-o:before { + content: ""; +} + +.fa-frown-o:before { + content: ""; +} + +.fa-meh-o:before { + content: ""; +} + +.fa-gamepad:before { + content: ""; +} + +.fa-keyboard-o:before { + content: ""; +} + +.fa-flag-o:before { + content: ""; +} + +.fa-flag-checkered:before { + content: ""; +} + +.fa-terminal:before { + content: ""; +} + +.fa-code:before { + content: ""; +} + +.fa-mail-reply-all:before, +.fa-reply-all:before { + content: ""; +} + +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: ""; +} + +.fa-location-arrow:before { + content: ""; +} + +.fa-crop:before { + content: ""; +} + +.fa-code-fork:before { + content: ""; +} + +.fa-unlink:before, +.fa-chain-broken:before { + content: ""; +} + +.fa-question:before { + content: ""; +} + +.fa-info:before { + content: ""; +} + +.fa-exclamation:before { + content: ""; +} + +.fa-superscript:before { + content: ""; +} + +.fa-subscript:before { + content: ""; +} + +.fa-eraser:before { + content: ""; +} + +.fa-puzzle-piece:before { + content: ""; +} + +.fa-microphone:before { + content: ""; +} + +.fa-microphone-slash:before { + content: ""; +} + +.fa-shield:before { + content: ""; +} + +.fa-calendar-o:before { + content: ""; +} + +.fa-fire-extinguisher:before { + content: ""; +} + +.fa-rocket:before { + content: ""; +} + +.fa-maxcdn:before { + content: ""; +} + +.fa-chevron-circle-left:before { + content: ""; +} + +.fa-chevron-circle-right:before { + content: ""; +} + +.fa-chevron-circle-up:before { + content: ""; +} + +.fa-chevron-circle-down:before { + content: ""; +} + +.fa-html5:before { + content: ""; +} + +.fa-css3:before { + content: ""; +} + +.fa-anchor:before { + content: ""; +} + +.fa-unlock-alt:before { + content: ""; +} + +.fa-bullseye:before { + content: ""; +} + +.fa-ellipsis-h:before { + content: ""; +} + +.fa-ellipsis-v:before { + content: ""; +} + +.fa-rss-square:before { + content: ""; +} + +.fa-play-circle:before { + content: ""; +} + +.fa-ticket:before { + content: ""; +} + +.fa-minus-square:before { + content: ""; +} + +.fa-minus-square-o:before, .wy-menu-vertical li.on a span.toctree-expand:before, .wy-menu-vertical li.current > a span.toctree-expand:before { + content: ""; +} + +.fa-level-up:before { + content: ""; +} + +.fa-level-down:before { + content: ""; +} + +.fa-check-square:before { + content: ""; +} + +.fa-pencil-square:before { + content: ""; +} + +.fa-external-link-square:before { + content: ""; +} + +.fa-share-square:before { + content: ""; +} + +.fa-compass:before { + content: ""; +} + +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: ""; +} + +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: ""; +} + +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: ""; +} + +.fa-euro:before, +.fa-eur:before { + content: ""; +} + +.fa-gbp:before { + content: ""; +} + +.fa-dollar:before, +.fa-usd:before { + content: ""; +} + +.fa-rupee:before, +.fa-inr:before { + content: ""; +} + +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: ""; +} + +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: ""; +} + +.fa-won:before, +.fa-krw:before { + content: ""; +} + +.fa-bitcoin:before, +.fa-btc:before { + content: ""; +} + +.fa-file:before { + content: ""; +} + +.fa-file-text:before { + content: ""; +} + +.fa-sort-alpha-asc:before { + content: ""; +} + +.fa-sort-alpha-desc:before { + content: ""; +} + +.fa-sort-amount-asc:before { + content: ""; +} + +.fa-sort-amount-desc:before { + content: ""; +} + +.fa-sort-numeric-asc:before { + content: ""; +} + +.fa-sort-numeric-desc:before { + content: ""; +} + +.fa-thumbs-up:before { + content: ""; +} + +.fa-thumbs-down:before { + content: ""; +} + +.fa-youtube-square:before { + content: ""; +} + +.fa-youtube:before { + content: ""; +} + +.fa-xing:before { + content: ""; +} + +.fa-xing-square:before { + content: ""; +} + +.fa-youtube-play:before { + content: ""; +} + +.fa-dropbox:before { + content: ""; +} + +.fa-stack-overflow:before { + content: ""; +} + +.fa-instagram:before { + content: ""; +} + +.fa-flickr:before { + content: ""; +} + +.fa-adn:before { + content: ""; +} + +.fa-bitbucket:before, .icon-bitbucket:before { + content: ""; +} + +.fa-bitbucket-square:before { + content: ""; +} + +.fa-tumblr:before { + content: ""; +} + +.fa-tumblr-square:before { + content: ""; +} + +.fa-long-arrow-down:before { + content: ""; +} + +.fa-long-arrow-up:before { + content: ""; +} + +.fa-long-arrow-left:before { + content: ""; +} + +.fa-long-arrow-right:before { + content: ""; +} + +.fa-apple:before { + content: ""; +} + +.fa-windows:before { + content: ""; +} + +.fa-android:before { + content: ""; +} + +.fa-linux:before { + content: ""; +} + +.fa-dribbble:before { + content: ""; +} + +.fa-skype:before { + content: ""; +} + +.fa-foursquare:before { + content: ""; +} + +.fa-trello:before { + content: ""; +} + +.fa-female:before { + content: ""; +} + +.fa-male:before { + content: ""; +} + +.fa-gittip:before, +.fa-gratipay:before { + content: ""; +} + +.fa-sun-o:before { + content: ""; +} + +.fa-moon-o:before { + content: ""; +} + +.fa-archive:before { + content: ""; +} + +.fa-bug:before { + content: ""; +} + +.fa-vk:before { + content: ""; +} + +.fa-weibo:before { + content: ""; +} + +.fa-renren:before { + content: ""; +} + +.fa-pagelines:before { + content: ""; +} + +.fa-stack-exchange:before { + content: ""; +} + +.fa-arrow-circle-o-right:before { + content: ""; +} + +.fa-arrow-circle-o-left:before { + content: ""; +} + +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: ""; +} + +.fa-dot-circle-o:before { + content: ""; +} + +.fa-wheelchair:before { + content: ""; +} + +.fa-vimeo-square:before { + content: ""; +} + +.fa-turkish-lira:before, +.fa-try:before { + content: ""; +} + +.fa-plus-square-o:before, .wy-menu-vertical li span.toctree-expand:before { + content: ""; +} + +.fa-space-shuttle:before { + content: ""; +} + +.fa-slack:before { + content: ""; +} + +.fa-envelope-square:before { + content: ""; +} + +.fa-wordpress:before { + content: ""; +} + +.fa-openid:before { + content: ""; +} + +.fa-institution:before, +.fa-bank:before, +.fa-university:before { + content: ""; +} + +.fa-mortar-board:before, +.fa-graduation-cap:before { + content: ""; +} + +.fa-yahoo:before { + content: ""; +} + +.fa-google:before { + content: ""; +} + +.fa-reddit:before { + content: ""; +} + +.fa-reddit-square:before { + content: ""; +} + +.fa-stumbleupon-circle:before { + content: ""; +} + +.fa-stumbleupon:before { + content: ""; +} + +.fa-delicious:before { + content: ""; +} + +.fa-digg:before { + content: ""; +} + +.fa-pied-piper-pp:before { + content: ""; +} + +.fa-pied-piper-alt:before { + content: ""; +} + +.fa-drupal:before { + content: ""; +} + +.fa-joomla:before { + content: ""; +} + +.fa-language:before { + content: ""; +} + +.fa-fax:before { + content: ""; +} + +.fa-building:before { + content: ""; +} + +.fa-child:before { + content: ""; +} + +.fa-paw:before { + content: ""; +} + +.fa-spoon:before { + content: ""; +} + +.fa-cube:before { + content: ""; +} + +.fa-cubes:before { + content: ""; +} + +.fa-behance:before { + content: ""; +} + +.fa-behance-square:before { + content: ""; +} + +.fa-steam:before { + content: ""; +} + +.fa-steam-square:before { + content: ""; +} + +.fa-recycle:before { + content: ""; +} + +.fa-automobile:before, +.fa-car:before { + content: ""; +} + +.fa-cab:before, +.fa-taxi:before { + content: ""; +} + +.fa-tree:before { + content: ""; +} + +.fa-spotify:before { + content: ""; +} + +.fa-deviantart:before { + content: ""; +} + +.fa-soundcloud:before { + content: ""; +} + +.fa-database:before { + content: ""; +} + +.fa-file-pdf-o:before { + content: ""; +} + +.fa-file-word-o:before { + content: ""; +} + +.fa-file-excel-o:before { + content: ""; +} + +.fa-file-powerpoint-o:before { + content: ""; +} + +.fa-file-photo-o:before, +.fa-file-picture-o:before, +.fa-file-image-o:before { + content: ""; +} + +.fa-file-zip-o:before, +.fa-file-archive-o:before { + content: ""; +} + +.fa-file-sound-o:before, +.fa-file-audio-o:before { + content: ""; +} + +.fa-file-movie-o:before, +.fa-file-video-o:before { + content: ""; +} + +.fa-file-code-o:before { + content: ""; +} + +.fa-vine:before { + content: ""; +} + +.fa-codepen:before { + content: ""; +} + +.fa-jsfiddle:before { + content: ""; +} + +.fa-life-bouy:before, +.fa-life-buoy:before, +.fa-life-saver:before, +.fa-support:before, +.fa-life-ring:before { + content: ""; +} + +.fa-circle-o-notch:before { + content: ""; +} + +.fa-ra:before, +.fa-resistance:before, +.fa-rebel:before { + content: ""; +} + +.fa-ge:before, +.fa-empire:before { + content: ""; +} + +.fa-git-square:before { + content: ""; +} + +.fa-git:before { + content: ""; +} + +.fa-y-combinator-square:before, +.fa-yc-square:before, +.fa-hacker-news:before { + content: ""; +} + +.fa-tencent-weibo:before { + content: ""; +} + +.fa-qq:before { + content: ""; +} + +.fa-wechat:before, +.fa-weixin:before { + content: ""; +} + +.fa-send:before, +.fa-paper-plane:before { + content: ""; +} + +.fa-send-o:before, +.fa-paper-plane-o:before { + content: ""; +} + +.fa-history:before { + content: ""; +} + +.fa-circle-thin:before { + content: ""; +} + +.fa-header:before { + content: ""; +} + +.fa-paragraph:before { + content: ""; +} + +.fa-sliders:before { + content: ""; +} + +.fa-share-alt:before { + content: ""; +} + +.fa-share-alt-square:before { + content: ""; +} + +.fa-bomb:before { + content: ""; +} + +.fa-soccer-ball-o:before, +.fa-futbol-o:before { + content: ""; +} + +.fa-tty:before { + content: ""; +} + +.fa-binoculars:before { + content: ""; +} + +.fa-plug:before { + content: ""; +} + +.fa-slideshare:before { + content: ""; +} + +.fa-twitch:before { + content: ""; +} + +.fa-yelp:before { + content: ""; +} + +.fa-newspaper-o:before { + content: ""; +} + +.fa-wifi:before { + content: ""; +} + +.fa-calculator:before { + content: ""; +} + +.fa-paypal:before { + content: ""; +} + +.fa-google-wallet:before { + content: ""; +} + +.fa-cc-visa:before { + content: ""; +} + +.fa-cc-mastercard:before { + content: ""; +} + +.fa-cc-discover:before { + content: ""; +} + +.fa-cc-amex:before { + content: ""; +} + +.fa-cc-paypal:before { + content: ""; +} + +.fa-cc-stripe:before { + content: ""; +} + +.fa-bell-slash:before { + content: ""; +} + +.fa-bell-slash-o:before { + content: ""; +} + +.fa-trash:before { + content: ""; +} + +.fa-copyright:before { + content: ""; +} + +.fa-at:before { + content: ""; +} + +.fa-eyedropper:before { + content: ""; +} + +.fa-paint-brush:before { + content: ""; +} + +.fa-birthday-cake:before { + content: ""; +} + +.fa-area-chart:before { + content: ""; +} + +.fa-pie-chart:before { + content: ""; +} + +.fa-line-chart:before { + content: ""; +} + +.fa-lastfm:before { + content: ""; +} + +.fa-lastfm-square:before { + content: ""; +} + +.fa-toggle-off:before { + content: ""; +} + +.fa-toggle-on:before { + content: ""; +} + +.fa-bicycle:before { + content: ""; +} + +.fa-bus:before { + content: ""; +} + +.fa-ioxhost:before { + content: ""; +} + +.fa-angellist:before { + content: ""; +} + +.fa-cc:before { + content: ""; +} + +.fa-shekel:before, +.fa-sheqel:before, +.fa-ils:before { + content: ""; +} + +.fa-meanpath:before { + content: ""; +} + +.fa-buysellads:before { + content: ""; +} + +.fa-connectdevelop:before { + content: ""; +} + +.fa-dashcube:before { + content: ""; +} + +.fa-forumbee:before { + content: ""; +} + +.fa-leanpub:before { + content: ""; +} + +.fa-sellsy:before { + content: ""; +} + +.fa-shirtsinbulk:before { + content: ""; +} + +.fa-simplybuilt:before { + content: ""; +} + +.fa-skyatlas:before { + content: ""; +} + +.fa-cart-plus:before { + content: ""; +} + +.fa-cart-arrow-down:before { + content: ""; +} + +.fa-diamond:before { + content: ""; +} + +.fa-ship:before { + content: ""; +} + +.fa-user-secret:before { + content: ""; +} + +.fa-motorcycle:before { + content: ""; +} + +.fa-street-view:before { + content: ""; +} + +.fa-heartbeat:before { + content: ""; +} + +.fa-venus:before { + content: ""; +} + +.fa-mars:before { + content: ""; +} + +.fa-mercury:before { + content: ""; +} + +.fa-intersex:before, +.fa-transgender:before { + content: ""; +} + +.fa-transgender-alt:before { + content: ""; +} + +.fa-venus-double:before { + content: ""; +} + +.fa-mars-double:before { + content: ""; +} + +.fa-venus-mars:before { + content: ""; +} + +.fa-mars-stroke:before { + content: ""; +} + +.fa-mars-stroke-v:before { + content: ""; +} + +.fa-mars-stroke-h:before { + content: ""; +} + +.fa-neuter:before { + content: ""; +} + +.fa-genderless:before { + content: ""; +} + +.fa-facebook-official:before { + content: ""; +} + +.fa-pinterest-p:before { + content: ""; +} + +.fa-whatsapp:before { + content: ""; +} + +.fa-server:before { + content: ""; +} + +.fa-user-plus:before { + content: ""; +} + +.fa-user-times:before { + content: ""; +} + +.fa-hotel:before, +.fa-bed:before { + content: ""; +} + +.fa-viacoin:before { + content: ""; +} + +.fa-train:before { + content: ""; +} + +.fa-subway:before { + content: ""; +} + +.fa-medium:before { + content: ""; +} + +.fa-yc:before, +.fa-y-combinator:before { + content: ""; +} + +.fa-optin-monster:before { + content: ""; +} + +.fa-opencart:before { + content: ""; +} + +.fa-expeditedssl:before { + content: ""; +} + +.fa-battery-4:before, +.fa-battery:before, +.fa-battery-full:before { + content: ""; +} + +.fa-battery-3:before, +.fa-battery-three-quarters:before { + content: ""; +} + +.fa-battery-2:before, +.fa-battery-half:before { + content: ""; +} + +.fa-battery-1:before, +.fa-battery-quarter:before { + content: ""; +} + +.fa-battery-0:before, +.fa-battery-empty:before { + content: ""; +} + +.fa-mouse-pointer:before { + content: ""; +} + +.fa-i-cursor:before { + content: ""; +} + +.fa-object-group:before { + content: ""; +} + +.fa-object-ungroup:before { + content: ""; +} + +.fa-sticky-note:before { + content: ""; +} + +.fa-sticky-note-o:before { + content: ""; +} + +.fa-cc-jcb:before { + content: ""; +} + +.fa-cc-diners-club:before { + content: ""; +} + +.fa-clone:before { + content: ""; +} + +.fa-balance-scale:before { + content: ""; +} + +.fa-hourglass-o:before { + content: ""; +} + +.fa-hourglass-1:before, +.fa-hourglass-start:before { + content: ""; +} + +.fa-hourglass-2:before, +.fa-hourglass-half:before { + content: ""; +} + +.fa-hourglass-3:before, +.fa-hourglass-end:before { + content: ""; +} + +.fa-hourglass:before { + content: ""; +} + +.fa-hand-grab-o:before, +.fa-hand-rock-o:before { + content: ""; +} + +.fa-hand-stop-o:before, +.fa-hand-paper-o:before { + content: ""; +} + +.fa-hand-scissors-o:before { + content: ""; +} + +.fa-hand-lizard-o:before { + content: ""; +} + +.fa-hand-spock-o:before { + content: ""; +} + +.fa-hand-pointer-o:before { + content: ""; +} + +.fa-hand-peace-o:before { + content: ""; +} + +.fa-trademark:before { + content: ""; +} + +.fa-registered:before { + content: ""; +} + +.fa-creative-commons:before { + content: ""; +} + +.fa-gg:before { + content: ""; +} + +.fa-gg-circle:before { + content: ""; +} + +.fa-tripadvisor:before { + content: ""; +} + +.fa-odnoklassniki:before { + content: ""; +} + +.fa-odnoklassniki-square:before { + content: ""; +} + +.fa-get-pocket:before { + content: ""; +} + +.fa-wikipedia-w:before { + content: ""; +} + +.fa-safari:before { + content: ""; +} + +.fa-chrome:before { + content: ""; +} + +.fa-firefox:before { + content: ""; +} + +.fa-opera:before { + content: ""; +} + +.fa-internet-explorer:before { + content: ""; +} + +.fa-tv:before, +.fa-television:before { + content: ""; +} + +.fa-contao:before { + content: ""; +} + +.fa-500px:before { + content: ""; +} + +.fa-amazon:before { + content: ""; +} + +.fa-calendar-plus-o:before { + content: ""; +} + +.fa-calendar-minus-o:before { + content: ""; +} + +.fa-calendar-times-o:before { + content: ""; +} + +.fa-calendar-check-o:before { + content: ""; +} + +.fa-industry:before { + content: ""; +} + +.fa-map-pin:before { + content: ""; +} + +.fa-map-signs:before { + content: ""; +} + +.fa-map-o:before { + content: ""; +} + +.fa-map:before { + content: ""; +} + +.fa-commenting:before { + content: ""; +} + +.fa-commenting-o:before { + content: ""; +} + +.fa-houzz:before { + content: ""; +} + +.fa-vimeo:before { + content: ""; +} + +.fa-black-tie:before { + content: ""; +} + +.fa-fonticons:before { + content: ""; +} + +.fa-reddit-alien:before { + content: ""; +} + +.fa-edge:before { + content: ""; +} + +.fa-credit-card-alt:before { + content: ""; +} + +.fa-codiepie:before { + content: ""; +} + +.fa-modx:before { + content: ""; +} + +.fa-fort-awesome:before { + content: ""; +} + +.fa-usb:before { + content: ""; +} + +.fa-product-hunt:before { + content: ""; +} + +.fa-mixcloud:before { + content: ""; +} + +.fa-scribd:before { + content: ""; +} + +.fa-pause-circle:before { + content: ""; +} + +.fa-pause-circle-o:before { + content: ""; +} + +.fa-stop-circle:before { + content: ""; +} + +.fa-stop-circle-o:before { + content: ""; +} + +.fa-shopping-bag:before { + content: ""; +} + +.fa-shopping-basket:before { + content: ""; +} + +.fa-hashtag:before { + content: ""; +} + +.fa-bluetooth:before { + content: ""; +} + +.fa-bluetooth-b:before { + content: ""; +} + +.fa-percent:before { + content: ""; +} + +.fa-gitlab:before, .icon-gitlab:before { + content: ""; +} + +.fa-wpbeginner:before { + content: ""; +} + +.fa-wpforms:before { + content: ""; +} + +.fa-envira:before { + content: ""; +} + +.fa-universal-access:before { + content: ""; +} + +.fa-wheelchair-alt:before { + content: ""; +} + +.fa-question-circle-o:before { + content: ""; +} + +.fa-blind:before { + content: ""; +} + +.fa-audio-description:before { + content: ""; +} + +.fa-volume-control-phone:before { + content: ""; +} + +.fa-braille:before { + content: ""; +} + +.fa-assistive-listening-systems:before { + content: ""; +} + +.fa-asl-interpreting:before, +.fa-american-sign-language-interpreting:before { + content: ""; +} + +.fa-deafness:before, +.fa-hard-of-hearing:before, +.fa-deaf:before { + content: ""; +} + +.fa-glide:before { + content: ""; +} + +.fa-glide-g:before { + content: ""; +} + +.fa-signing:before, +.fa-sign-language:before { + content: ""; +} + +.fa-low-vision:before { + content: ""; +} + +.fa-viadeo:before { + content: ""; +} + +.fa-viadeo-square:before { + content: ""; +} + +.fa-snapchat:before { + content: ""; +} + +.fa-snapchat-ghost:before { + content: ""; +} + +.fa-snapchat-square:before { + content: ""; +} + +.fa-pied-piper:before { + content: ""; +} + +.fa-first-order:before { + content: ""; +} + +.fa-yoast:before { + content: ""; +} + +.fa-themeisle:before { + content: ""; +} + +.fa-google-plus-circle:before, +.fa-google-plus-official:before { + content: ""; +} + +.fa-fa:before, +.fa-font-awesome:before { + content: ""; +} + +.fa-handshake-o:before { + content: ""; +} + +.fa-envelope-open:before { + content: ""; +} + +.fa-envelope-open-o:before { + content: ""; +} + +.fa-linode:before { + content: ""; +} + +.fa-address-book:before { + content: ""; +} + +.fa-address-book-o:before { + content: ""; +} + +.fa-vcard:before, +.fa-address-card:before { + content: ""; +} + +.fa-vcard-o:before, +.fa-address-card-o:before { + content: ""; +} + +.fa-user-circle:before { + content: ""; +} + +.fa-user-circle-o:before { + content: ""; +} + +.fa-user-o:before { + content: ""; +} + +.fa-id-badge:before { + content: ""; +} + +.fa-drivers-license:before, +.fa-id-card:before { + content: ""; +} + +.fa-drivers-license-o:before, +.fa-id-card-o:before { + content: ""; +} + +.fa-quora:before { + content: ""; +} + +.fa-free-code-camp:before { + content: ""; +} + +.fa-telegram:before { + content: ""; +} + +.fa-thermometer-4:before, +.fa-thermometer:before, +.fa-thermometer-full:before { + content: ""; +} + +.fa-thermometer-3:before, +.fa-thermometer-three-quarters:before { + content: ""; +} + +.fa-thermometer-2:before, +.fa-thermometer-half:before { + content: ""; +} + +.fa-thermometer-1:before, +.fa-thermometer-quarter:before { + content: ""; +} + +.fa-thermometer-0:before, +.fa-thermometer-empty:before { + content: ""; +} + +.fa-shower:before { + content: ""; +} + +.fa-bathtub:before, +.fa-s15:before, +.fa-bath:before { + content: ""; +} + +.fa-podcast:before { + content: ""; +} + +.fa-window-maximize:before { + content: ""; +} + +.fa-window-minimize:before { + content: ""; +} + +.fa-window-restore:before { + content: ""; +} + +.fa-times-rectangle:before, +.fa-window-close:before { + content: ""; +} + +.fa-times-rectangle-o:before, +.fa-window-close-o:before { + content: ""; +} + +.fa-bandcamp:before { + content: ""; +} + +.fa-grav:before { + content: ""; +} + +.fa-etsy:before { + content: ""; +} + +.fa-imdb:before { + content: ""; +} + +.fa-ravelry:before { + content: ""; +} + +.fa-eercast:before { + content: ""; +} + +.fa-microchip:before { + content: ""; +} + +.fa-snowflake-o:before { + content: ""; +} + +.fa-superpowers:before { + content: ""; +} + +.fa-wpexplorer:before { + content: ""; +} + +.fa-meetup:before { + content: ""; +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} + +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} + +.fa, .wy-menu-vertical li span.toctree-expand, .wy-menu-vertical li.on a span.toctree-expand, .wy-menu-vertical li.current > a span.toctree-expand, .rst-content .admonition-title, .rst-content h1 .headerlink, .rst-content h2 .headerlink, .rst-content h3 .headerlink, .rst-content h4 .headerlink, .rst-content h5 .headerlink, .rst-content h6 .headerlink, .rst-content dl dt .headerlink, .rst-content p.caption .headerlink, .rst-content tt.download span:first-child, .rst-content code.download span:first-child, .icon, .wy-dropdown .caret, .wy-inline-validate.wy-inline-validate-success .wy-input-context, .wy-inline-validate.wy-inline-validate-danger .wy-input-context, .wy-inline-validate.wy-inline-validate-warning .wy-input-context, .wy-inline-validate.wy-inline-validate-info .wy-input-context { + font-family: inherit; +} +.fa:before, .wy-menu-vertical li span.toctree-expand:before, .wy-menu-vertical li.on a span.toctree-expand:before, .wy-menu-vertical li.current > a span.toctree-expand:before, .rst-content .admonition-title:before, .rst-content h1 .headerlink:before, .rst-content h2 .headerlink:before, .rst-content h3 .headerlink:before, .rst-content h4 .headerlink:before, .rst-content h5 .headerlink:before, .rst-content h6 .headerlink:before, .rst-content dl dt .headerlink:before, .rst-content p.caption .headerlink:before, .rst-content tt.download span:first-child:before, .rst-content code.download span:first-child:before, .icon:before, .wy-dropdown .caret:before, .wy-inline-validate.wy-inline-validate-success .wy-input-context:before, .wy-inline-validate.wy-inline-validate-danger .wy-input-context:before, .wy-inline-validate.wy-inline-validate-warning .wy-input-context:before, .wy-inline-validate.wy-inline-validate-info .wy-input-context:before { + font-family: "FontAwesome"; + display: inline-block; + font-style: normal; + font-weight: normal; + line-height: 1; + text-decoration: inherit; +} + +a .fa, a .wy-menu-vertical li span.toctree-expand, .wy-menu-vertical li a span.toctree-expand, .wy-menu-vertical li.on a span.toctree-expand, .wy-menu-vertical li.current > a span.toctree-expand, a .rst-content .admonition-title, .rst-content a .admonition-title, a .rst-content h1 .headerlink, .rst-content h1 a .headerlink, a .rst-content h2 .headerlink, .rst-content h2 a .headerlink, a .rst-content h3 .headerlink, .rst-content h3 a .headerlink, a .rst-content h4 .headerlink, .rst-content h4 a .headerlink, a .rst-content h5 .headerlink, .rst-content h5 a .headerlink, a .rst-content h6 .headerlink, .rst-content h6 a .headerlink, a .rst-content dl dt .headerlink, .rst-content dl dt a .headerlink, a .rst-content p.caption .headerlink, .rst-content p.caption a .headerlink, a .rst-content tt.download span:first-child, .rst-content tt.download a span:first-child, a .rst-content code.download span:first-child, .rst-content code.download a span:first-child, a .icon { + display: inline-block; + text-decoration: inherit; +} + +.btn .fa, .btn .wy-menu-vertical li span.toctree-expand, .wy-menu-vertical li .btn span.toctree-expand, .btn .wy-menu-vertical li.on a span.toctree-expand, .wy-menu-vertical li.on a .btn span.toctree-expand, .btn .wy-menu-vertical li.current > a span.toctree-expand, .wy-menu-vertical li.current > a .btn span.toctree-expand, .btn .rst-content .admonition-title, .rst-content .btn .admonition-title, .btn .rst-content h1 .headerlink, .rst-content h1 .btn .headerlink, .btn .rst-content h2 .headerlink, .rst-content h2 .btn .headerlink, .btn .rst-content h3 .headerlink, .rst-content h3 .btn .headerlink, .btn .rst-content h4 .headerlink, .rst-content h4 .btn .headerlink, .btn .rst-content h5 .headerlink, .rst-content h5 .btn .headerlink, .btn .rst-content h6 .headerlink, .rst-content h6 .btn .headerlink, .btn .rst-content dl dt .headerlink, .rst-content dl dt .btn .headerlink, .btn .rst-content p.caption .headerlink, .rst-content p.caption .btn .headerlink, .btn .rst-content tt.download span:first-child, .rst-content tt.download .btn span:first-child, .btn .rst-content code.download span:first-child, .rst-content code.download .btn span:first-child, .btn .icon, .nav .fa, .nav .wy-menu-vertical li span.toctree-expand, .wy-menu-vertical li .nav span.toctree-expand, .nav .wy-menu-vertical li.on a span.toctree-expand, .wy-menu-vertical li.on a .nav span.toctree-expand, .nav .wy-menu-vertical li.current > a span.toctree-expand, .wy-menu-vertical li.current > a .nav span.toctree-expand, .nav .rst-content .admonition-title, .rst-content .nav .admonition-title, .nav .rst-content h1 .headerlink, .rst-content h1 .nav .headerlink, .nav .rst-content h2 .headerlink, .rst-content h2 .nav .headerlink, .nav .rst-content h3 .headerlink, .rst-content h3 .nav .headerlink, .nav .rst-content h4 .headerlink, .rst-content h4 .nav .headerlink, .nav .rst-content h5 .headerlink, .rst-content h5 .nav .headerlink, .nav .rst-content h6 .headerlink, .rst-content h6 .nav .headerlink, .nav .rst-content dl dt .headerlink, .rst-content dl dt .nav .headerlink, .nav .rst-content p.caption .headerlink, .rst-content p.caption .nav .headerlink, .nav .rst-content tt.download span:first-child, .rst-content tt.download .nav span:first-child, .nav .rst-content code.download span:first-child, .rst-content code.download .nav span:first-child, .nav .icon { + display: inline; +} +.btn .fa.fa-large, .btn .wy-menu-vertical li span.fa-large.toctree-expand, .wy-menu-vertical li .btn span.fa-large.toctree-expand, .btn .rst-content .fa-large.admonition-title, .rst-content .btn .fa-large.admonition-title, .btn .rst-content h1 .fa-large.headerlink, .rst-content h1 .btn .fa-large.headerlink, .btn .rst-content h2 .fa-large.headerlink, .rst-content h2 .btn .fa-large.headerlink, .btn .rst-content h3 .fa-large.headerlink, .rst-content h3 .btn .fa-large.headerlink, .btn .rst-content h4 .fa-large.headerlink, .rst-content h4 .btn .fa-large.headerlink, .btn .rst-content h5 .fa-large.headerlink, .rst-content h5 .btn .fa-large.headerlink, .btn .rst-content h6 .fa-large.headerlink, .rst-content h6 .btn .fa-large.headerlink, .btn .rst-content dl dt .fa-large.headerlink, .rst-content dl dt .btn .fa-large.headerlink, .btn .rst-content p.caption .fa-large.headerlink, .rst-content p.caption .btn .fa-large.headerlink, .btn .rst-content tt.download span.fa-large:first-child, .rst-content tt.download .btn span.fa-large:first-child, .btn .rst-content code.download span.fa-large:first-child, .rst-content code.download .btn span.fa-large:first-child, .btn .fa-large.icon, .nav .fa.fa-large, .nav .wy-menu-vertical li span.fa-large.toctree-expand, .wy-menu-vertical li .nav span.fa-large.toctree-expand, .nav .rst-content .fa-large.admonition-title, .rst-content .nav .fa-large.admonition-title, .nav .rst-content h1 .fa-large.headerlink, .rst-content h1 .nav .fa-large.headerlink, .nav .rst-content h2 .fa-large.headerlink, .rst-content h2 .nav .fa-large.headerlink, .nav .rst-content h3 .fa-large.headerlink, .rst-content h3 .nav .fa-large.headerlink, .nav .rst-content h4 .fa-large.headerlink, .rst-content h4 .nav .fa-large.headerlink, .nav .rst-content h5 .fa-large.headerlink, .rst-content h5 .nav .fa-large.headerlink, .nav .rst-content h6 .fa-large.headerlink, .rst-content h6 .nav .fa-large.headerlink, .nav .rst-content dl dt .fa-large.headerlink, .rst-content dl dt .nav .fa-large.headerlink, .nav .rst-content p.caption .fa-large.headerlink, .rst-content p.caption .nav .fa-large.headerlink, .nav .rst-content tt.download span.fa-large:first-child, .rst-content tt.download .nav span.fa-large:first-child, .nav .rst-content code.download span.fa-large:first-child, .rst-content code.download .nav span.fa-large:first-child, .nav .fa-large.icon { + line-height: 0.9em; +} +.btn .fa.fa-spin, .btn .wy-menu-vertical li span.fa-spin.toctree-expand, .wy-menu-vertical li .btn span.fa-spin.toctree-expand, .btn .rst-content .fa-spin.admonition-title, .rst-content .btn .fa-spin.admonition-title, .btn .rst-content h1 .fa-spin.headerlink, .rst-content h1 .btn .fa-spin.headerlink, .btn .rst-content h2 .fa-spin.headerlink, .rst-content h2 .btn .fa-spin.headerlink, .btn .rst-content h3 .fa-spin.headerlink, .rst-content h3 .btn .fa-spin.headerlink, .btn .rst-content h4 .fa-spin.headerlink, .rst-content h4 .btn .fa-spin.headerlink, .btn .rst-content h5 .fa-spin.headerlink, .rst-content h5 .btn .fa-spin.headerlink, .btn .rst-content h6 .fa-spin.headerlink, .rst-content h6 .btn .fa-spin.headerlink, .btn .rst-content dl dt .fa-spin.headerlink, .rst-content dl dt .btn .fa-spin.headerlink, .btn .rst-content p.caption .fa-spin.headerlink, .rst-content p.caption .btn .fa-spin.headerlink, .btn .rst-content tt.download span.fa-spin:first-child, .rst-content tt.download .btn span.fa-spin:first-child, .btn .rst-content code.download span.fa-spin:first-child, .rst-content code.download .btn span.fa-spin:first-child, .btn .fa-spin.icon, .nav .fa.fa-spin, .nav .wy-menu-vertical li span.fa-spin.toctree-expand, .wy-menu-vertical li .nav span.fa-spin.toctree-expand, .nav .rst-content .fa-spin.admonition-title, .rst-content .nav .fa-spin.admonition-title, .nav .rst-content h1 .fa-spin.headerlink, .rst-content h1 .nav .fa-spin.headerlink, .nav .rst-content h2 .fa-spin.headerlink, .rst-content h2 .nav .fa-spin.headerlink, .nav .rst-content h3 .fa-spin.headerlink, .rst-content h3 .nav .fa-spin.headerlink, .nav .rst-content h4 .fa-spin.headerlink, .rst-content h4 .nav .fa-spin.headerlink, .nav .rst-content h5 .fa-spin.headerlink, .rst-content h5 .nav .fa-spin.headerlink, .nav .rst-content h6 .fa-spin.headerlink, .rst-content h6 .nav .fa-spin.headerlink, .nav .rst-content dl dt .fa-spin.headerlink, .rst-content dl dt .nav .fa-spin.headerlink, .nav .rst-content p.caption .fa-spin.headerlink, .rst-content p.caption .nav .fa-spin.headerlink, .nav .rst-content tt.download span.fa-spin:first-child, .rst-content tt.download .nav span.fa-spin:first-child, .nav .rst-content code.download span.fa-spin:first-child, .rst-content code.download .nav span.fa-spin:first-child, .nav .fa-spin.icon { + display: inline-block; +} + +.btn.fa:before, .wy-menu-vertical li span.btn.toctree-expand:before, .rst-content .btn.admonition-title:before, .rst-content h1 .btn.headerlink:before, .rst-content h2 .btn.headerlink:before, .rst-content h3 .btn.headerlink:before, .rst-content h4 .btn.headerlink:before, .rst-content h5 .btn.headerlink:before, .rst-content h6 .btn.headerlink:before, .rst-content dl dt .btn.headerlink:before, .rst-content p.caption .btn.headerlink:before, .rst-content tt.download span.btn:first-child:before, .rst-content code.download span.btn:first-child:before, .btn.icon:before { + opacity: 0.5; + -webkit-transition: opacity 0.05s ease-in; + -moz-transition: opacity 0.05s ease-in; + transition: opacity 0.05s ease-in; +} + +.btn.fa:hover:before, .wy-menu-vertical li span.btn.toctree-expand:hover:before, .rst-content .btn.admonition-title:hover:before, .rst-content h1 .btn.headerlink:hover:before, .rst-content h2 .btn.headerlink:hover:before, .rst-content h3 .btn.headerlink:hover:before, .rst-content h4 .btn.headerlink:hover:before, .rst-content h5 .btn.headerlink:hover:before, .rst-content h6 .btn.headerlink:hover:before, .rst-content dl dt .btn.headerlink:hover:before, .rst-content p.caption .btn.headerlink:hover:before, .rst-content tt.download span.btn:first-child:hover:before, .rst-content code.download span.btn:first-child:hover:before, .btn.icon:hover:before { + opacity: 1; +} + +.btn-mini .fa:before, .btn-mini .wy-menu-vertical li span.toctree-expand:before, .wy-menu-vertical li .btn-mini span.toctree-expand:before, .btn-mini .rst-content .admonition-title:before, .rst-content .btn-mini .admonition-title:before, .btn-mini .rst-content h1 .headerlink:before, .rst-content h1 .btn-mini .headerlink:before, .btn-mini .rst-content h2 .headerlink:before, .rst-content h2 .btn-mini .headerlink:before, .btn-mini .rst-content h3 .headerlink:before, .rst-content h3 .btn-mini .headerlink:before, .btn-mini .rst-content h4 .headerlink:before, .rst-content h4 .btn-mini .headerlink:before, .btn-mini .rst-content h5 .headerlink:before, .rst-content h5 .btn-mini .headerlink:before, .btn-mini .rst-content h6 .headerlink:before, .rst-content h6 .btn-mini .headerlink:before, .btn-mini .rst-content dl dt .headerlink:before, .rst-content dl dt .btn-mini .headerlink:before, .btn-mini .rst-content p.caption .headerlink:before, .rst-content p.caption .btn-mini .headerlink:before, .btn-mini .rst-content tt.download span:first-child:before, .rst-content tt.download .btn-mini span:first-child:before, .btn-mini .rst-content code.download span:first-child:before, .rst-content code.download .btn-mini span:first-child:before, .btn-mini .icon:before { + font-size: 14px; + vertical-align: -15%; +} + +.wy-alert, .rst-content .note, .rst-content .attention, .rst-content .caution, .rst-content .danger, .rst-content .error, .rst-content .hint, .rst-content .important, .rst-content .tip, .rst-content .warning, .rst-content .seealso, .rst-content .admonition-todo, .rst-content .admonition { + padding: 12px; + line-height: 24px; + margin-bottom: 24px; + background: #e7f2fa; +} + +.wy-alert-title, .rst-content .admonition-title { + color: #fff; + font-weight: bold; + display: block; + color: #fff; + background: #6ab0de; + margin: -12px; + padding: 6px 12px; + margin-bottom: 12px; +} + +.wy-alert.wy-alert-danger, .rst-content .wy-alert-danger.note, .rst-content .wy-alert-danger.attention, .rst-content .wy-alert-danger.caution, .rst-content .danger, .rst-content .error, .rst-content .wy-alert-danger.hint, .rst-content .wy-alert-danger.important, .rst-content .wy-alert-danger.tip, .rst-content .wy-alert-danger.warning, .rst-content .wy-alert-danger.seealso, .rst-content .wy-alert-danger.admonition-todo, .rst-content .wy-alert-danger.admonition { + background: #fdf3f2; +} +.wy-alert.wy-alert-danger .wy-alert-title, .rst-content .wy-alert-danger.note .wy-alert-title, .rst-content .wy-alert-danger.attention .wy-alert-title, .rst-content .wy-alert-danger.caution .wy-alert-title, .rst-content .danger .wy-alert-title, .rst-content .error .wy-alert-title, .rst-content .wy-alert-danger.hint .wy-alert-title, .rst-content .wy-alert-danger.important .wy-alert-title, .rst-content .wy-alert-danger.tip .wy-alert-title, .rst-content .wy-alert-danger.warning .wy-alert-title, .rst-content .wy-alert-danger.seealso .wy-alert-title, .rst-content .wy-alert-danger.admonition-todo .wy-alert-title, .rst-content .wy-alert-danger.admonition .wy-alert-title, .wy-alert.wy-alert-danger .rst-content .admonition-title, .rst-content .wy-alert.wy-alert-danger .admonition-title, .rst-content .wy-alert-danger.note .admonition-title, .rst-content .wy-alert-danger.attention .admonition-title, .rst-content .wy-alert-danger.caution .admonition-title, .rst-content .danger .admonition-title, .rst-content .error .admonition-title, .rst-content .wy-alert-danger.hint .admonition-title, .rst-content .wy-alert-danger.important .admonition-title, .rst-content .wy-alert-danger.tip .admonition-title, .rst-content .wy-alert-danger.warning .admonition-title, .rst-content .wy-alert-danger.seealso .admonition-title, .rst-content .wy-alert-danger.admonition-todo .admonition-title, .rst-content .wy-alert-danger.admonition .admonition-title { + background: #f29f97; +} + +.wy-alert.wy-alert-warning, .rst-content .wy-alert-warning.note, .rst-content .attention, .rst-content .caution, .rst-content .wy-alert-warning.danger, .rst-content .wy-alert-warning.error, .rst-content .wy-alert-warning.hint, .rst-content .wy-alert-warning.important, .rst-content .wy-alert-warning.tip, .rst-content .warning, .rst-content .wy-alert-warning.seealso, .rst-content .admonition-todo, .rst-content .wy-alert-warning.admonition { + background: #ffedcc; +} +.wy-alert.wy-alert-warning .wy-alert-title, .rst-content .wy-alert-warning.note .wy-alert-title, .rst-content .attention .wy-alert-title, .rst-content .caution .wy-alert-title, .rst-content .wy-alert-warning.danger .wy-alert-title, .rst-content .wy-alert-warning.error .wy-alert-title, .rst-content .wy-alert-warning.hint .wy-alert-title, .rst-content .wy-alert-warning.important .wy-alert-title, .rst-content .wy-alert-warning.tip .wy-alert-title, .rst-content .warning .wy-alert-title, .rst-content .wy-alert-warning.seealso .wy-alert-title, .rst-content .admonition-todo .wy-alert-title, .rst-content .wy-alert-warning.admonition .wy-alert-title, .wy-alert.wy-alert-warning .rst-content .admonition-title, .rst-content .wy-alert.wy-alert-warning .admonition-title, .rst-content .wy-alert-warning.note .admonition-title, .rst-content .attention .admonition-title, .rst-content .caution .admonition-title, .rst-content .wy-alert-warning.danger .admonition-title, .rst-content .wy-alert-warning.error .admonition-title, .rst-content .wy-alert-warning.hint .admonition-title, .rst-content .wy-alert-warning.important .admonition-title, .rst-content .wy-alert-warning.tip .admonition-title, .rst-content .warning .admonition-title, .rst-content .wy-alert-warning.seealso .admonition-title, .rst-content .admonition-todo .admonition-title, .rst-content .wy-alert-warning.admonition .admonition-title { + background: #f0b37e; +} + +.wy-alert.wy-alert-info, .rst-content .note, .rst-content .wy-alert-info.attention, .rst-content .wy-alert-info.caution, .rst-content .wy-alert-info.danger, .rst-content .wy-alert-info.error, .rst-content .wy-alert-info.hint, .rst-content .wy-alert-info.important, .rst-content .wy-alert-info.tip, .rst-content .wy-alert-info.warning, .rst-content .seealso, .rst-content .wy-alert-info.admonition-todo, .rst-content .wy-alert-info.admonition { + background: #e7f2fa; +} +.wy-alert.wy-alert-info .wy-alert-title, .rst-content .note .wy-alert-title, .rst-content .wy-alert-info.attention .wy-alert-title, .rst-content .wy-alert-info.caution .wy-alert-title, .rst-content .wy-alert-info.danger .wy-alert-title, .rst-content .wy-alert-info.error .wy-alert-title, .rst-content .wy-alert-info.hint .wy-alert-title, .rst-content .wy-alert-info.important .wy-alert-title, .rst-content .wy-alert-info.tip .wy-alert-title, .rst-content .wy-alert-info.warning .wy-alert-title, .rst-content .seealso .wy-alert-title, .rst-content .wy-alert-info.admonition-todo .wy-alert-title, .rst-content .wy-alert-info.admonition .wy-alert-title, .wy-alert.wy-alert-info .rst-content .admonition-title, .rst-content .wy-alert.wy-alert-info .admonition-title, .rst-content .note .admonition-title, .rst-content .wy-alert-info.attention .admonition-title, .rst-content .wy-alert-info.caution .admonition-title, .rst-content .wy-alert-info.danger .admonition-title, .rst-content .wy-alert-info.error .admonition-title, .rst-content .wy-alert-info.hint .admonition-title, .rst-content .wy-alert-info.important .admonition-title, .rst-content .wy-alert-info.tip .admonition-title, .rst-content .wy-alert-info.warning .admonition-title, .rst-content .seealso .admonition-title, .rst-content .wy-alert-info.admonition-todo .admonition-title, .rst-content .wy-alert-info.admonition .admonition-title { + background: #6ab0de; +} + +.wy-alert.wy-alert-success, .rst-content .wy-alert-success.note, .rst-content .wy-alert-success.attention, .rst-content .wy-alert-success.caution, .rst-content .wy-alert-success.danger, .rst-content .wy-alert-success.error, .rst-content .hint, .rst-content .important, .rst-content .tip, .rst-content .wy-alert-success.warning, .rst-content .wy-alert-success.seealso, .rst-content .wy-alert-success.admonition-todo, .rst-content .wy-alert-success.admonition { + background: #dbfaf4; +} +.wy-alert.wy-alert-success .wy-alert-title, .rst-content .wy-alert-success.note .wy-alert-title, .rst-content .wy-alert-success.attention .wy-alert-title, .rst-content .wy-alert-success.caution .wy-alert-title, .rst-content .wy-alert-success.danger .wy-alert-title, .rst-content .wy-alert-success.error .wy-alert-title, .rst-content .hint .wy-alert-title, .rst-content .important .wy-alert-title, .rst-content .tip .wy-alert-title, .rst-content .wy-alert-success.warning .wy-alert-title, .rst-content .wy-alert-success.seealso .wy-alert-title, .rst-content .wy-alert-success.admonition-todo .wy-alert-title, .rst-content .wy-alert-success.admonition .wy-alert-title, .wy-alert.wy-alert-success .rst-content .admonition-title, .rst-content .wy-alert.wy-alert-success .admonition-title, .rst-content .wy-alert-success.note .admonition-title, .rst-content .wy-alert-success.attention .admonition-title, .rst-content .wy-alert-success.caution .admonition-title, .rst-content .wy-alert-success.danger .admonition-title, .rst-content .wy-alert-success.error .admonition-title, .rst-content .hint .admonition-title, .rst-content .important .admonition-title, .rst-content .tip .admonition-title, .rst-content .wy-alert-success.warning .admonition-title, .rst-content .wy-alert-success.seealso .admonition-title, .rst-content .wy-alert-success.admonition-todo .admonition-title, .rst-content .wy-alert-success.admonition .admonition-title { + background: #1abc9c; +} + +.wy-alert.wy-alert-neutral, .rst-content .wy-alert-neutral.note, .rst-content .wy-alert-neutral.attention, .rst-content .wy-alert-neutral.caution, .rst-content .wy-alert-neutral.danger, .rst-content .wy-alert-neutral.error, .rst-content .wy-alert-neutral.hint, .rst-content .wy-alert-neutral.important, .rst-content .wy-alert-neutral.tip, .rst-content .wy-alert-neutral.warning, .rst-content .wy-alert-neutral.seealso, .rst-content .wy-alert-neutral.admonition-todo, .rst-content .wy-alert-neutral.admonition { + background: #f3f6f6; +} +.wy-alert.wy-alert-neutral .wy-alert-title, .rst-content .wy-alert-neutral.note .wy-alert-title, .rst-content .wy-alert-neutral.attention .wy-alert-title, .rst-content .wy-alert-neutral.caution .wy-alert-title, .rst-content .wy-alert-neutral.danger .wy-alert-title, .rst-content .wy-alert-neutral.error .wy-alert-title, .rst-content .wy-alert-neutral.hint .wy-alert-title, .rst-content .wy-alert-neutral.important .wy-alert-title, .rst-content .wy-alert-neutral.tip .wy-alert-title, .rst-content .wy-alert-neutral.warning .wy-alert-title, .rst-content .wy-alert-neutral.seealso .wy-alert-title, .rst-content .wy-alert-neutral.admonition-todo .wy-alert-title, .rst-content .wy-alert-neutral.admonition .wy-alert-title, .wy-alert.wy-alert-neutral .rst-content .admonition-title, .rst-content .wy-alert.wy-alert-neutral .admonition-title, .rst-content .wy-alert-neutral.note .admonition-title, .rst-content .wy-alert-neutral.attention .admonition-title, .rst-content .wy-alert-neutral.caution .admonition-title, .rst-content .wy-alert-neutral.danger .admonition-title, .rst-content .wy-alert-neutral.error .admonition-title, .rst-content .wy-alert-neutral.hint .admonition-title, .rst-content .wy-alert-neutral.important .admonition-title, .rst-content .wy-alert-neutral.tip .admonition-title, .rst-content .wy-alert-neutral.warning .admonition-title, .rst-content .wy-alert-neutral.seealso .admonition-title, .rst-content .wy-alert-neutral.admonition-todo .admonition-title, .rst-content .wy-alert-neutral.admonition .admonition-title { + color: #404040; + background: #e1e4e5; +} +.wy-alert.wy-alert-neutral a, .rst-content .wy-alert-neutral.note a, .rst-content .wy-alert-neutral.attention a, .rst-content .wy-alert-neutral.caution a, .rst-content .wy-alert-neutral.danger a, .rst-content .wy-alert-neutral.error a, .rst-content .wy-alert-neutral.hint a, .rst-content .wy-alert-neutral.important a, .rst-content .wy-alert-neutral.tip a, .rst-content .wy-alert-neutral.warning a, .rst-content .wy-alert-neutral.seealso a, .rst-content .wy-alert-neutral.admonition-todo a, .rst-content .wy-alert-neutral.admonition a { + color: #2980B9; +} + +.wy-alert p:last-child, .rst-content .note p:last-child, .rst-content .attention p:last-child, .rst-content .caution p:last-child, .rst-content .danger p:last-child, .rst-content .error p:last-child, .rst-content .hint p:last-child, .rst-content .important p:last-child, .rst-content .tip p:last-child, .rst-content .warning p:last-child, .rst-content .seealso p:last-child, .rst-content .admonition-todo p:last-child, .rst-content .admonition p:last-child { + margin-bottom: 0; +} + +.wy-tray-container { + position: fixed; + bottom: 0px; + left: 0; + z-index: 600; +} +.wy-tray-container li { + display: block; + width: 300px; + background: transparent; + color: #fff; + text-align: center; + box-shadow: 0 5px 5px 0 rgba(0, 0, 0, 0.1); + padding: 0 24px; + min-width: 20%; + opacity: 0; + height: 0; + line-height: 56px; + overflow: hidden; + -webkit-transition: all 0.3s ease-in; + -moz-transition: all 0.3s ease-in; + transition: all 0.3s ease-in; +} +.wy-tray-container li.wy-tray-item-success { + background: #27AE60; +} +.wy-tray-container li.wy-tray-item-info { + background: #2980B9; +} +.wy-tray-container li.wy-tray-item-warning { + background: #E67E22; +} +.wy-tray-container li.wy-tray-item-danger { + background: #E74C3C; +} +.wy-tray-container li.on { + opacity: 1; + height: 56px; +} + +@media screen and (max-width: 768px) { + .wy-tray-container { + bottom: auto; + top: 0; + width: 100%; + } + .wy-tray-container li { + width: 100%; + } +} +button { + font-size: 100%; + margin: 0; + vertical-align: baseline; + *vertical-align: middle; + cursor: pointer; + line-height: normal; + -webkit-appearance: button; + *overflow: visible; +} + +button::-moz-focus-inner, input::-moz-focus-inner { + border: 0; + padding: 0; +} + +button[disabled] { + cursor: default; +} + +.btn { + /* Structure */ + display: inline-block; + border-radius: 2px; + line-height: normal; + white-space: nowrap; + text-align: center; + cursor: pointer; + font-size: 100%; + padding: 6px 12px 8px 12px; + color: #fff; + border: 1px solid rgba(0, 0, 0, 0.1); + background-color: #27AE60; + text-decoration: none; + font-weight: normal; + font-family: "Lato", "proxima-nova", "Helvetica Neue", Arial, sans-serif; + box-shadow: 0px 1px 2px -1px rgba(255, 255, 255, 0.5) inset, 0px -2px 0px 0px rgba(0, 0, 0, 0.1) inset; + outline-none: false; + vertical-align: middle; + *display: inline; + zoom: 1; + -webkit-user-drag: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-transition: all 0.1s linear; + -moz-transition: all 0.1s linear; + transition: all 0.1s linear; +} + +.btn-hover { + background: #2e8ece; + color: #fff; +} + +.btn:hover { + background: #2cc36b; + color: #fff; +} +.btn:focus { + background: #2cc36b; + outline: 0; +} +.btn:active { + box-shadow: 0px -1px 0px 0px rgba(0, 0, 0, 0.05) inset, 0px 2px 0px 0px rgba(0, 0, 0, 0.1) inset; + padding: 8px 12px 6px 12px; +} +.btn:visited { + color: #fff; +} +.btn:disabled { + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + filter: alpha(opacity=40); + opacity: 0.4; + cursor: not-allowed; + box-shadow: none; +} + +.btn-disabled { + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + filter: alpha(opacity=40); + opacity: 0.4; + cursor: not-allowed; + box-shadow: none; +} +.btn-disabled:hover, .btn-disabled:focus, .btn-disabled:active { + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + filter: alpha(opacity=40); + opacity: 0.4; + cursor: not-allowed; + box-shadow: none; +} + +.btn::-moz-focus-inner { + padding: 0; + border: 0; +} + +.btn-small { + font-size: 80%; +} + +.btn-info { + background-color: #2980B9 !important; +} +.btn-info:hover { + background-color: #2e8ece !important; +} + +.btn-neutral { + background-color: #f3f6f6 !important; + color: #404040 !important; +} +.btn-neutral:hover { + background-color: #e5ebeb !important; + color: #404040; +} +.btn-neutral:visited { + color: #404040 !important; +} + +.btn-success { + background-color: #27AE60 !important; +} +.btn-success:hover { + background-color: #229955 !important; +} + +.btn-danger { + background-color: #E74C3C !important; +} +.btn-danger:hover { + background-color: #ea6153 !important; +} + +.btn-warning { + background-color: #E67E22 !important; +} +.btn-warning:hover { + background-color: #e98b39 !important; +} + +.btn-invert { + background-color: #222; +} +.btn-invert:hover { + background-color: #2f2f2f !important; +} + +.btn-link { + background-color: transparent !important; + color: #2980B9; + box-shadow: none; + border-color: transparent !important; +} +.btn-link:hover { + background-color: transparent !important; + color: #409ad5 !important; + box-shadow: none; +} +.btn-link:active { + background-color: transparent !important; + color: #409ad5 !important; + box-shadow: none; +} +.btn-link:visited { + color: #9B59B6; +} + +.wy-btn-group .btn, .wy-control .btn { + vertical-align: middle; +} + +.wy-btn-group { + margin-bottom: 24px; + *zoom: 1; +} +.wy-btn-group:before, .wy-btn-group:after { + display: table; + content: ""; +} +.wy-btn-group:after { + clear: both; +} + +.wy-dropdown { + position: relative; + display: inline-block; +} + +.wy-dropdown-active .wy-dropdown-menu { + display: block; +} + +.wy-dropdown-menu { + position: absolute; + left: 0; + display: none; + float: left; + top: 100%; + min-width: 100%; + background: #fcfcfc; + z-index: 100; + border: solid 1px #cfd7dd; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.1); + padding: 12px; +} +.wy-dropdown-menu > dd > a { + display: block; + clear: both; + color: #404040; + white-space: nowrap; + font-size: 90%; + padding: 0 12px; + cursor: pointer; +} +.wy-dropdown-menu > dd > a:hover { + background: #2980B9; + color: #fff; +} +.wy-dropdown-menu > dd.divider { + border-top: solid 1px #cfd7dd; + margin: 6px 0; +} +.wy-dropdown-menu > dd.search { + padding-bottom: 12px; +} +.wy-dropdown-menu > dd.search input[type="search"] { + width: 100%; +} +.wy-dropdown-menu > dd.call-to-action { + background: #e3e3e3; + text-transform: uppercase; + font-weight: 500; + font-size: 80%; +} +.wy-dropdown-menu > dd.call-to-action:hover { + background: #e3e3e3; +} +.wy-dropdown-menu > dd.call-to-action .btn { + color: #fff; +} + +.wy-dropdown.wy-dropdown-up .wy-dropdown-menu { + bottom: 100%; + top: auto; + left: auto; + right: 0; +} + +.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu { + background: #fcfcfc; + margin-top: 2px; +} +.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a { + padding: 6px 12px; +} +.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover { + background: #2980B9; + color: #fff; +} + +.wy-dropdown.wy-dropdown-left .wy-dropdown-menu { + right: 0; + left: auto; + text-align: right; +} + +.wy-dropdown-arrow:before { + content: " "; + border-bottom: 5px solid whitesmoke; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + position: absolute; + display: block; + top: -4px; + left: 50%; + margin-left: -3px; +} +.wy-dropdown-arrow.wy-dropdown-arrow-left:before { + left: 11px; +} + +.wy-form-stacked select { + display: block; +} + +.wy-form-aligned input, .wy-form-aligned textarea, .wy-form-aligned select, .wy-form-aligned .wy-help-inline, .wy-form-aligned label { + display: inline-block; + *display: inline; + *zoom: 1; + vertical-align: middle; +} + +.wy-form-aligned .wy-control-group > label { + display: inline-block; + vertical-align: middle; + width: 10em; + margin: 6px 12px 0 0; + float: left; +} +.wy-form-aligned .wy-control { + float: left; +} +.wy-form-aligned .wy-control label { + display: block; +} +.wy-form-aligned .wy-control select { + margin-top: 6px; +} + +fieldset { + border: 0; + margin: 0; + padding: 0; +} + +legend { + display: block; + width: 100%; + border: 0; + padding: 0; + white-space: normal; + margin-bottom: 24px; + font-size: 150%; + *margin-left: -7px; +} + +label { + display: block; + margin: 0 0 0.3125em 0; + color: #333; + font-size: 90%; +} + +input, select, textarea { + font-size: 100%; + margin: 0; + vertical-align: baseline; + *vertical-align: middle; +} + +.wy-control-group { + margin-bottom: 24px; + *zoom: 1; + max-width: 68em; + margin-left: auto; + margin-right: auto; + *zoom: 1; +} +.wy-control-group:before, .wy-control-group:after { + display: table; + content: ""; +} +.wy-control-group:after { + clear: both; +} +.wy-control-group:before, .wy-control-group:after { + display: table; + content: ""; +} +.wy-control-group:after { + clear: both; +} + +.wy-control-group.wy-control-group-required > label:after { + content: " *"; + color: #E74C3C; +} + +.wy-control-group .wy-form-full, .wy-control-group .wy-form-halves, .wy-control-group .wy-form-thirds { + padding-bottom: 12px; +} +.wy-control-group .wy-form-full select, .wy-control-group .wy-form-halves select, .wy-control-group .wy-form-thirds select { + width: 100%; +} +.wy-control-group .wy-form-full input[type="text"], .wy-control-group .wy-form-full input[type="password"], .wy-control-group .wy-form-full input[type="email"], .wy-control-group .wy-form-full input[type="url"], .wy-control-group .wy-form-full input[type="date"], .wy-control-group .wy-form-full input[type="month"], .wy-control-group .wy-form-full input[type="time"], .wy-control-group .wy-form-full input[type="datetime"], .wy-control-group .wy-form-full input[type="datetime-local"], .wy-control-group .wy-form-full input[type="week"], .wy-control-group .wy-form-full input[type="number"], .wy-control-group .wy-form-full input[type="search"], .wy-control-group .wy-form-full input[type="tel"], .wy-control-group .wy-form-full input[type="color"], .wy-control-group .wy-form-halves input[type="text"], .wy-control-group .wy-form-halves input[type="password"], .wy-control-group .wy-form-halves input[type="email"], .wy-control-group .wy-form-halves input[type="url"], .wy-control-group .wy-form-halves input[type="date"], .wy-control-group .wy-form-halves input[type="month"], .wy-control-group .wy-form-halves input[type="time"], .wy-control-group .wy-form-halves input[type="datetime"], .wy-control-group .wy-form-halves input[type="datetime-local"], .wy-control-group .wy-form-halves input[type="week"], .wy-control-group .wy-form-halves input[type="number"], .wy-control-group .wy-form-halves input[type="search"], .wy-control-group .wy-form-halves input[type="tel"], .wy-control-group .wy-form-halves input[type="color"], .wy-control-group .wy-form-thirds input[type="text"], .wy-control-group .wy-form-thirds input[type="password"], .wy-control-group .wy-form-thirds input[type="email"], .wy-control-group .wy-form-thirds input[type="url"], .wy-control-group .wy-form-thirds input[type="date"], .wy-control-group .wy-form-thirds input[type="month"], .wy-control-group .wy-form-thirds input[type="time"], .wy-control-group .wy-form-thirds input[type="datetime"], .wy-control-group .wy-form-thirds input[type="datetime-local"], .wy-control-group .wy-form-thirds input[type="week"], .wy-control-group .wy-form-thirds input[type="number"], .wy-control-group .wy-form-thirds input[type="search"], .wy-control-group .wy-form-thirds input[type="tel"], .wy-control-group .wy-form-thirds input[type="color"] { + width: 100%; +} + +.wy-control-group .wy-form-full { + float: left; + display: block; + margin-right: 2.3576515979%; + width: 100%; + margin-right: 0; +} +.wy-control-group .wy-form-full:last-child { + margin-right: 0; +} + +.wy-control-group .wy-form-halves { + float: left; + display: block; + margin-right: 2.3576515979%; + width: 48.821174201%; +} +.wy-control-group .wy-form-halves:last-child { + margin-right: 0; +} +.wy-control-group .wy-form-halves:nth-of-type(2n) { + margin-right: 0; +} +.wy-control-group .wy-form-halves:nth-of-type(2n+1) { + clear: left; +} + +.wy-control-group .wy-form-thirds { + float: left; + display: block; + margin-right: 2.3576515979%; + width: 31.7615656014%; +} +.wy-control-group .wy-form-thirds:last-child { + margin-right: 0; +} +.wy-control-group .wy-form-thirds:nth-of-type(3n) { + margin-right: 0; +} +.wy-control-group .wy-form-thirds:nth-of-type(3n+1) { + clear: left; +} + +.wy-control-group.wy-control-group-no-input .wy-control { + margin: 6px 0 0 0; + font-size: 90%; +} + +.wy-control-no-input { + display: inline-block; + margin: 6px 0 0 0; + font-size: 90%; +} + +.wy-control-group.fluid-input input[type="text"], .wy-control-group.fluid-input input[type="password"], .wy-control-group.fluid-input input[type="email"], .wy-control-group.fluid-input input[type="url"], .wy-control-group.fluid-input input[type="date"], .wy-control-group.fluid-input input[type="month"], .wy-control-group.fluid-input input[type="time"], .wy-control-group.fluid-input input[type="datetime"], .wy-control-group.fluid-input input[type="datetime-local"], .wy-control-group.fluid-input input[type="week"], .wy-control-group.fluid-input input[type="number"], .wy-control-group.fluid-input input[type="search"], .wy-control-group.fluid-input input[type="tel"], .wy-control-group.fluid-input input[type="color"] { + width: 100%; +} + +.wy-form-message-inline { + display: inline-block; + padding-left: 0.3em; + color: #666; + vertical-align: middle; + font-size: 90%; +} + +.wy-form-message { + display: block; + color: #999; + font-size: 70%; + margin-top: 0.3125em; + font-style: italic; +} +.wy-form-message p { + font-size: inherit; + font-style: italic; + margin-bottom: 6px; +} +.wy-form-message p:last-child { + margin-bottom: 0; +} + +input { + line-height: normal; +} + +input[type="button"], input[type="reset"], input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; + font-family: "Lato", "proxima-nova", "Helvetica Neue", Arial, sans-serif; + *overflow: visible; +} +input[type="text"], input[type="password"], input[type="email"], input[type="url"], input[type="date"], input[type="month"], input[type="time"], input[type="datetime"], input[type="datetime-local"], input[type="week"], input[type="number"], input[type="search"], input[type="tel"], input[type="color"] { + -webkit-appearance: none; + padding: 6px; + display: inline-block; + border: 1px solid #ccc; + font-size: 80%; + font-family: "Lato", "proxima-nova", "Helvetica Neue", Arial, sans-serif; + box-shadow: inset 0 1px 3px #ddd; + border-radius: 0; + -webkit-transition: border 0.3s linear; + -moz-transition: border 0.3s linear; + transition: border 0.3s linear; +} +input[type="datetime-local"] { + padding: 0.34375em 0.625em; +} +input[disabled] { + cursor: default; +} +input[type="checkbox"], input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; + margin-right: 0.3125em; + *height: 13px; + *width: 13px; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +input[type="text"]:focus, input[type="password"]:focus, input[type="email"]:focus, input[type="url"]:focus, input[type="date"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="week"]:focus, input[type="number"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="color"]:focus { + outline: 0; + outline: thin dotted \9 ; + border-color: #333; +} +input.no-focus:focus { + border-color: #ccc !important; +} +input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 1px auto #129FEA; +} +input[type="text"][disabled], input[type="password"][disabled], input[type="email"][disabled], input[type="url"][disabled], input[type="date"][disabled], input[type="month"][disabled], input[type="time"][disabled], input[type="datetime"][disabled], input[type="datetime-local"][disabled], input[type="week"][disabled], input[type="number"][disabled], input[type="search"][disabled], input[type="tel"][disabled], input[type="color"][disabled] { + cursor: not-allowed; + background-color: #fafafa; +} + +input:focus:invalid, textarea:focus:invalid, select:focus:invalid { + color: #E74C3C; + border: 1px solid #E74C3C; +} + +input:focus:invalid:focus, textarea:focus:invalid:focus, select:focus:invalid:focus { + border-color: #E74C3C; +} + +input[type="file"]:focus:invalid:focus, input[type="radio"]:focus:invalid:focus, input[type="checkbox"]:focus:invalid:focus { + outline-color: #E74C3C; +} + +input.wy-input-large { + padding: 12px; + font-size: 100%; +} + +textarea { + overflow: auto; + vertical-align: top; + width: 100%; + font-family: "Lato", "proxima-nova", "Helvetica Neue", Arial, sans-serif; +} + +select, textarea { + padding: 0.5em 0.625em; + display: inline-block; + border: 1px solid #ccc; + font-size: 80%; + box-shadow: inset 0 1px 3px #ddd; + -webkit-transition: border 0.3s linear; + -moz-transition: border 0.3s linear; + transition: border 0.3s linear; +} + +select { + border: 1px solid #ccc; + background-color: #fff; +} +select[multiple] { + height: auto; +} + +select:focus, textarea:focus { + outline: 0; +} + +select[disabled], textarea[disabled], input[readonly], select[readonly], textarea[readonly] { + cursor: not-allowed; + background-color: #fafafa; +} + +input[type="radio"][disabled], input[type="checkbox"][disabled] { + cursor: not-allowed; +} + +.wy-checkbox, .wy-radio { + margin: 6px 0; + color: #404040; + display: block; +} +.wy-checkbox input, .wy-radio input { + vertical-align: baseline; +} + +.wy-form-message-inline { + display: inline-block; + *display: inline; + *zoom: 1; + vertical-align: middle; +} + +.wy-input-prefix, .wy-input-suffix { + white-space: nowrap; + padding: 6px; +} +.wy-input-prefix .wy-input-context, .wy-input-suffix .wy-input-context { + line-height: 27px; + padding: 0 8px; + display: inline-block; + font-size: 80%; + background-color: #f3f6f6; + border: solid 1px #ccc; + color: #999; +} + +.wy-input-suffix .wy-input-context { + border-left: 0; +} + +.wy-input-prefix .wy-input-context { + border-right: 0; +} + +.wy-switch { + position: relative; + display: block; + height: 24px; + margin-top: 12px; + cursor: pointer; +} +.wy-switch:before { + position: absolute; + content: ""; + display: block; + left: 0; + top: 0; + width: 36px; + height: 12px; + border-radius: 4px; + background: #ccc; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +.wy-switch:after { + position: absolute; + content: ""; + display: block; + width: 18px; + height: 18px; + border-radius: 4px; + background: #999; + left: -3px; + top: -3px; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +.wy-switch span { + position: absolute; + left: 48px; + display: block; + font-size: 12px; + color: #ccc; + line-height: 1; +} + +.wy-switch.active:before { + background: #1e8449; +} +.wy-switch.active:after { + left: 24px; + background: #27AE60; +} + +.wy-switch.disabled { + cursor: not-allowed; + opacity: 0.8; +} + +.wy-control-group.wy-control-group-error .wy-form-message, .wy-control-group.wy-control-group-error > label { + color: #E74C3C; +} +.wy-control-group.wy-control-group-error input[type="text"], .wy-control-group.wy-control-group-error input[type="password"], .wy-control-group.wy-control-group-error input[type="email"], .wy-control-group.wy-control-group-error input[type="url"], .wy-control-group.wy-control-group-error input[type="date"], .wy-control-group.wy-control-group-error input[type="month"], .wy-control-group.wy-control-group-error input[type="time"], .wy-control-group.wy-control-group-error input[type="datetime"], .wy-control-group.wy-control-group-error input[type="datetime-local"], .wy-control-group.wy-control-group-error input[type="week"], .wy-control-group.wy-control-group-error input[type="number"], .wy-control-group.wy-control-group-error input[type="search"], .wy-control-group.wy-control-group-error input[type="tel"], .wy-control-group.wy-control-group-error input[type="color"] { + border: solid 1px #E74C3C; +} +.wy-control-group.wy-control-group-error textarea { + border: solid 1px #E74C3C; +} + +.wy-inline-validate { + white-space: nowrap; +} +.wy-inline-validate .wy-input-context { + padding: 0.5em 0.625em; + display: inline-block; + font-size: 80%; +} + +.wy-inline-validate.wy-inline-validate-success .wy-input-context { + color: #27AE60; +} + +.wy-inline-validate.wy-inline-validate-danger .wy-input-context { + color: #E74C3C; +} + +.wy-inline-validate.wy-inline-validate-warning .wy-input-context { + color: #E67E22; +} + +.wy-inline-validate.wy-inline-validate-info .wy-input-context { + color: #2980B9; +} + +.rotate-90 { + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -ms-transform: rotate(90deg); + -o-transform: rotate(90deg); + transform: rotate(90deg); +} + +.rotate-180 { + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -ms-transform: rotate(180deg); + -o-transform: rotate(180deg); + transform: rotate(180deg); +} + +.rotate-270 { + -webkit-transform: rotate(270deg); + -moz-transform: rotate(270deg); + -ms-transform: rotate(270deg); + -o-transform: rotate(270deg); + transform: rotate(270deg); +} + +.mirror { + -webkit-transform: scaleX(-1); + -moz-transform: scaleX(-1); + -ms-transform: scaleX(-1); + -o-transform: scaleX(-1); + transform: scaleX(-1); +} +.mirror.rotate-90 { + -webkit-transform: scaleX(-1) rotate(90deg); + -moz-transform: scaleX(-1) rotate(90deg); + -ms-transform: scaleX(-1) rotate(90deg); + -o-transform: scaleX(-1) rotate(90deg); + transform: scaleX(-1) rotate(90deg); +} +.mirror.rotate-180 { + -webkit-transform: scaleX(-1) rotate(180deg); + -moz-transform: scaleX(-1) rotate(180deg); + -ms-transform: scaleX(-1) rotate(180deg); + -o-transform: scaleX(-1) rotate(180deg); + transform: scaleX(-1) rotate(180deg); +} +.mirror.rotate-270 { + -webkit-transform: scaleX(-1) rotate(270deg); + -moz-transform: scaleX(-1) rotate(270deg); + -ms-transform: scaleX(-1) rotate(270deg); + -o-transform: scaleX(-1) rotate(270deg); + transform: scaleX(-1) rotate(270deg); +} + +@media only screen and (max-width: 480px) { + .wy-form button[type="submit"] { + margin: 0.7em 0 0; + } + .wy-form input[type="text"], .wy-form input[type="password"], .wy-form input[type="email"], .wy-form input[type="url"], .wy-form input[type="date"], .wy-form input[type="month"], .wy-form input[type="time"], .wy-form input[type="datetime"], .wy-form input[type="datetime-local"], .wy-form input[type="week"], .wy-form input[type="number"], .wy-form input[type="search"], .wy-form input[type="tel"], .wy-form input[type="color"] { + margin-bottom: 0.3em; + display: block; + } + .wy-form label { + margin-bottom: 0.3em; + display: block; + } + + .wy-form input[type="password"], .wy-form input[type="email"], .wy-form input[type="url"], .wy-form input[type="date"], .wy-form input[type="month"], .wy-form input[type="time"], .wy-form input[type="datetime"], .wy-form input[type="datetime-local"], .wy-form input[type="week"], .wy-form input[type="number"], .wy-form input[type="search"], .wy-form input[type="tel"], .wy-form input[type="color"] { + margin-bottom: 0; + } + + .wy-form-aligned .wy-control-group label { + margin-bottom: 0.3em; + text-align: left; + display: block; + width: 100%; + } + .wy-form-aligned .wy-control { + margin: 1.5em 0 0 0; + } + + .wy-form .wy-help-inline, .wy-form-message-inline, .wy-form-message { + display: block; + font-size: 80%; + padding: 6px 0; + } +} +@media screen and (max-width: 768px) { + .tablet-hide { + display: none; + } +} + +@media screen and (max-width: 480px) { + .mobile-hide { + display: none; + } +} + +.float-left { + float: left; +} + +.float-right { + float: right; +} + +.full-width { + width: 100%; +} + +.wy-table, .rst-content table.docutils, .rst-content table.field-list { + border-collapse: collapse; + border-spacing: 0; + empty-cells: show; + margin-bottom: 24px; +} +.wy-table caption, .rst-content table.docutils caption, .rst-content table.field-list caption { + color: #000; + font: italic 85%/1 arial, sans-serif; + padding: 1em 0; + text-align: center; +} +.wy-table td, .rst-content table.docutils td, .rst-content table.field-list td, .wy-table th, .rst-content table.docutils th, .rst-content table.field-list th { + font-size: 90%; + margin: 0; + overflow: visible; + padding: 8px 16px; +} +.wy-table td:first-child, .rst-content table.docutils td:first-child, .rst-content table.field-list td:first-child, .wy-table th:first-child, .rst-content table.docutils th:first-child, .rst-content table.field-list th:first-child { + border-left-width: 0; +} +.wy-table thead, .rst-content table.docutils thead, .rst-content table.field-list thead { + color: #000; + text-align: left; + vertical-align: bottom; + white-space: nowrap; +} +.wy-table thead th, .rst-content table.docutils thead th, .rst-content table.field-list thead th { + font-weight: bold; + border-bottom: solid 2px #e1e4e5; +} +.wy-table td, .rst-content table.docutils td, .rst-content table.field-list td { + background-color: transparent; + vertical-align: middle; +} + +.wy-table td p, .rst-content table.docutils td p, .rst-content table.field-list td p { + line-height: 18px; +} +.wy-table td p:last-child, .rst-content table.docutils td p:last-child, .rst-content table.field-list td p:last-child { + margin-bottom: 0; +} + +.wy-table .wy-table-cell-min, .rst-content table.docutils .wy-table-cell-min, .rst-content table.field-list .wy-table-cell-min { + width: 1%; + padding-right: 0; +} +.wy-table .wy-table-cell-min input[type=checkbox], .rst-content table.docutils .wy-table-cell-min input[type=checkbox], .rst-content table.field-list .wy-table-cell-min input[type=checkbox], .wy-table .wy-table-cell-min input[type=checkbox], .rst-content table.docutils .wy-table-cell-min input[type=checkbox], .rst-content table.field-list .wy-table-cell-min input[type=checkbox] { + margin: 0; +} + +.wy-table-secondary { + color: gray; + font-size: 90%; +} + +.wy-table-tertiary { + color: gray; + font-size: 80%; +} + +.wy-table-odd td, .wy-table-striped tr:nth-child(2n-1) td, .rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td { + background-color: #f3f6f6; +} + +.wy-table-backed { + background-color: #f3f6f6; +} + +/* BORDERED TABLES */ +.wy-table-bordered-all, .rst-content table.docutils { + border: 1px solid #e1e4e5; +} +.wy-table-bordered-all td, .rst-content table.docutils td { + border-bottom: 1px solid #e1e4e5; + border-left: 1px solid #e1e4e5; +} +.wy-table-bordered-all tbody > tr:last-child td, .rst-content table.docutils tbody > tr:last-child td { + border-bottom-width: 0; +} + +.wy-table-bordered { + border: 1px solid #e1e4e5; +} + +.wy-table-bordered-rows td { + border-bottom: 1px solid #e1e4e5; +} +.wy-table-bordered-rows tbody > tr:last-child td { + border-bottom-width: 0; +} + +.wy-table-horizontal tbody > tr:last-child td { + border-bottom-width: 0; +} +.wy-table-horizontal td, .wy-table-horizontal th { + border-width: 0 0 1px 0; + border-bottom: 1px solid #e1e4e5; +} +.wy-table-horizontal tbody > tr:last-child td { + border-bottom-width: 0; +} + +/* RESPONSIVE TABLES */ +.wy-table-responsive { + margin-bottom: 24px; + max-width: 100%; + overflow: auto; +} +.wy-table-responsive table { + margin-bottom: 0 !important; +} +.wy-table-responsive table td, .wy-table-responsive table th { + white-space: nowrap; +} + +a { + color: #2980B9; + text-decoration: none; + cursor: pointer; +} +a:hover { + color: #3091d1; +} +a:visited { + color: #9B59B6; +} + +html { + height: 100%; + overflow-x: hidden; +} + +body { + font-family: "Lato", "proxima-nova", "Helvetica Neue", Arial, sans-serif; + font-weight: normal; + color: #404040; + min-height: 100%; + overflow-x: hidden; + background: #edf0f2; +} + +.wy-text-left { + text-align: left; +} + +.wy-text-center { + text-align: center; +} + +.wy-text-right { + text-align: right; +} + +.wy-text-large { + font-size: 120%; +} + +.wy-text-normal { + font-size: 100%; +} + +.wy-text-small, small { + font-size: 80%; +} + +.wy-text-strike { + text-decoration: line-through; +} + +.wy-text-warning { + color: #E67E22 !important; +} + +a.wy-text-warning:hover { + color: #eb9950 !important; +} + +.wy-text-info { + color: #2980B9 !important; +} + +a.wy-text-info:hover { + color: #409ad5 !important; +} + +.wy-text-success { + color: #27AE60 !important; +} + +a.wy-text-success:hover { + color: #36d278 !important; +} + +.wy-text-danger { + color: #E74C3C !important; +} + +a.wy-text-danger:hover { + color: #ed7669 !important; +} + +.wy-text-neutral { + color: #404040 !important; +} + +a.wy-text-neutral:hover { + color: #595959 !important; +} + +h1, h2, .rst-content .toctree-wrapper p.caption, h3, h4, h5, h6, legend { + margin-top: 0; + font-weight: 700; + font-family: "Roboto Slab", "ff-tisa-web-pro", "Georgia", Arial, sans-serif; +} + +p { + line-height: 24px; + margin: 0; + font-size: 16px; + margin-bottom: 24px; +} + +h1 { + font-size: 175%; +} + +h2, .rst-content .toctree-wrapper p.caption { + font-size: 150%; +} + +h3 { + font-size: 125%; +} + +h4 { + font-size: 115%; +} + +h5 { + font-size: 110%; +} + +h6 { + font-size: 100%; +} + +hr { + display: block; + height: 1px; + border: 0; + border-top: 1px solid #e1e4e5; + margin: 24px 0; + padding: 0; +} + +code, .rst-content tt, .rst-content code { + white-space: nowrap; + max-width: 100%; + background: #fff; + border: solid 1px #e1e4e5; + font-size: 75%; + padding: 0 5px; + font-family: Consolas, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", Monaco, "Courier New", Courier, monospace; + color: #E74C3C; + overflow-x: auto; +} +code.code-large, .rst-content tt.code-large { + font-size: 90%; +} + +.wy-plain-list-disc, .rst-content .section ul, .rst-content .toctree-wrapper ul, article ul { + list-style: disc; + line-height: 24px; + margin-bottom: 24px; +} +.wy-plain-list-disc li, .rst-content .section ul li, .rst-content .toctree-wrapper ul li, article ul li { + list-style: disc; + margin-left: 24px; +} +.wy-plain-list-disc li p:last-child, .rst-content .section ul li p:last-child, .rst-content .toctree-wrapper ul li p:last-child, article ul li p:last-child { + margin-bottom: 0; +} +.wy-plain-list-disc li ul, .rst-content .section ul li ul, .rst-content .toctree-wrapper ul li ul, article ul li ul { + margin-bottom: 0; +} +.wy-plain-list-disc li li, .rst-content .section ul li li, .rst-content .toctree-wrapper ul li li, article ul li li { + list-style: circle; +} +.wy-plain-list-disc li li li, .rst-content .section ul li li li, .rst-content .toctree-wrapper ul li li li, article ul li li li { + list-style: square; +} +.wy-plain-list-disc li ol li, .rst-content .section ul li ol li, .rst-content .toctree-wrapper ul li ol li, article ul li ol li { + list-style: decimal; +} + +.wy-plain-list-decimal, .rst-content .section ol, .rst-content ol.arabic, article ol { + list-style: decimal; + line-height: 24px; + margin-bottom: 24px; +} +.wy-plain-list-decimal li, .rst-content .section ol li, .rst-content ol.arabic li, article ol li { + list-style: decimal; + margin-left: 24px; +} +.wy-plain-list-decimal li p:last-child, .rst-content .section ol li p:last-child, .rst-content ol.arabic li p:last-child, article ol li p:last-child { + margin-bottom: 0; +} +.wy-plain-list-decimal li ul, .rst-content .section ol li ul, .rst-content ol.arabic li ul, article ol li ul { + margin-bottom: 0; +} +.wy-plain-list-decimal li ul li, .rst-content .section ol li ul li, .rst-content ol.arabic li ul li, article ol li ul li { + list-style: disc; +} + +.codeblock-example { + border: 1px solid #e1e4e5; + border-bottom: none; + padding: 24px; + padding-top: 48px; + font-weight: 500; + background: #fff; + position: relative; +} +.codeblock-example:after { + content: "Example"; + position: absolute; + top: 0px; + left: 0px; + background: #9B59B6; + color: white; + padding: 6px 12px; +} +.codeblock-example.prettyprint-example-only { + border: 1px solid #e1e4e5; + margin-bottom: 24px; +} + +.codeblock, pre.literal-block, .rst-content .literal-block, .rst-content pre.literal-block, div[class^='highlight'] { + border: 1px solid #e1e4e5; + padding: 0px; + overflow-x: auto; + background: #fff; + margin: 1px 0 24px 0; +} +.codeblock div[class^='highlight'], pre.literal-block div[class^='highlight'], .rst-content .literal-block div[class^='highlight'], div[class^='highlight'] div[class^='highlight'] { + border: none; + background: none; + margin: 0; +} + +div[class^='highlight'] td.code { + width: 100%; +} + +.linenodiv pre { + border-right: solid 1px #e6e9ea; + margin: 0; + padding: 12px 12px; + font-family: Consolas, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", Monaco, "Courier New", Courier, monospace; + font-size: 12px; + line-height: 1.5; + color: #d9d9d9; +} + +div[class^='highlight'] pre { + white-space: pre; + margin: 0; + padding: 12px 12px; + font-family: Consolas, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", Monaco, "Courier New", Courier, monospace; + font-size: 12px; + line-height: 1.5; + display: block; + overflow: auto; + color: #404040; +} + +@media print { + .codeblock, pre.literal-block, .rst-content .literal-block, .rst-content pre.literal-block, div[class^='highlight'], div[class^='highlight'] pre { + white-space: pre-wrap; + } +} +.hll { + background-color: #ffffcc; + margin: 0 -12px; + padding: 0 12px; + display: block; +} + +.c { + color: #999988; + font-style: italic; +} + +.err { + color: #a61717; + background-color: #e3d2d2; +} + +.k { + font-weight: bold; +} + +.o { + font-weight: bold; +} + +.cm { + color: #999988; + font-style: italic; +} + +.cp { + color: #999999; + font-weight: bold; +} + +.c1 { + color: #999988; + font-style: italic; +} + +.cs { + color: #999999; + font-weight: bold; + font-style: italic; +} + +.gd { + color: #000000; + background-color: #ffdddd; +} + +.gd .x { + color: #000000; + background-color: #ffaaaa; +} + +.ge { + font-style: italic; +} + +.gr { + color: #aa0000; +} + +.gh { + color: #999999; +} + +.gi { + color: #000000; + background-color: #ddffdd; +} + +.gi .x { + color: #000000; + background-color: #aaffaa; +} + +.go { + color: #888888; +} + +.gp { + color: #555555; +} + +.gs { + font-weight: bold; +} + +.gu { + color: #800080; + font-weight: bold; +} + +.gt { + color: #aa0000; +} + +.kc { + font-weight: bold; +} + +.kd { + font-weight: bold; +} + +.kn { + font-weight: bold; +} + +.kp { + font-weight: bold; +} + +.kr { + font-weight: bold; +} + +.kt { + color: #445588; + font-weight: bold; +} + +.m { + color: #009999; +} + +.s { + color: #dd1144; +} + +.n { + color: #333333; +} + +.na { + color: teal; +} + +.nb { + color: #0086b3; +} + +.nc { + color: #445588; + font-weight: bold; +} + +.no { + color: teal; +} + +.ni { + color: purple; +} + +.ne { + color: #990000; + font-weight: bold; +} + +.nf { + color: #990000; + font-weight: bold; +} + +.nn { + color: #555555; +} + +.nt { + color: navy; +} + +.nv { + color: teal; +} + +.ow { + font-weight: bold; +} + +.w { + color: #bbbbbb; +} + +.mf { + color: #009999; +} + +.mh { + color: #009999; +} + +.mi { + color: #009999; +} + +.mo { + color: #009999; +} + +.sb { + color: #dd1144; +} + +.sc { + color: #dd1144; +} + +.sd { + color: #dd1144; +} + +.s2 { + color: #dd1144; +} + +.se { + color: #dd1144; +} + +.sh { + color: #dd1144; +} + +.si { + color: #dd1144; +} + +.sx { + color: #dd1144; +} + +.sr { + color: #009926; +} + +.s1 { + color: #dd1144; +} + +.ss { + color: #990073; +} + +.bp { + color: #999999; +} + +.vc { + color: teal; +} + +.vg { + color: teal; +} + +.vi { + color: teal; +} + +.il { + color: #009999; +} + +.gc { + color: #999; + background-color: #EAF2F5; +} + +.wy-breadcrumbs li { + display: inline-block; +} +.wy-breadcrumbs li.wy-breadcrumbs-aside { + float: right; +} +.wy-breadcrumbs li a { + display: inline-block; + padding: 5px; +} +.wy-breadcrumbs li a:first-child { + padding-left: 0; +} +.wy-breadcrumbs li code, .wy-breadcrumbs li .rst-content tt, .rst-content .wy-breadcrumbs li tt { + padding: 5px; + border: none; + background: none; +} +.wy-breadcrumbs li code.literal, .wy-breadcrumbs li .rst-content tt.literal, .rst-content .wy-breadcrumbs li tt.literal { + color: #404040; +} + +.wy-breadcrumbs-extra { + margin-bottom: 0; + color: #b3b3b3; + font-size: 80%; + display: inline-block; +} + +@media screen and (max-width: 480px) { + .wy-breadcrumbs-extra { + display: none; + } + + .wy-breadcrumbs li.wy-breadcrumbs-aside { + display: none; + } +} +@media print { + .wy-breadcrumbs li.wy-breadcrumbs-aside { + display: none; + } +} +.wy-affix { + position: fixed; + top: 1.618em; +} + +.wy-menu a:hover { + text-decoration: none; +} + +.wy-menu-horiz { + *zoom: 1; +} +.wy-menu-horiz:before, .wy-menu-horiz:after { + display: table; + content: ""; +} +.wy-menu-horiz:after { + clear: both; +} +.wy-menu-horiz ul, .wy-menu-horiz li { + display: inline-block; +} +.wy-menu-horiz li:hover { + background: rgba(255, 255, 255, 0.1); +} +.wy-menu-horiz li.divide-left { + border-left: solid 1px #404040; +} +.wy-menu-horiz li.divide-right { + border-right: solid 1px #404040; +} +.wy-menu-horiz a { + height: 32px; + display: inline-block; + line-height: 32px; + padding: 0 16px; +} + +.wy-menu-vertical { + width: 300px; +} +.wy-menu-vertical header, .wy-menu-vertical p.caption { + height: 32px; + display: inline-block; + line-height: 32px; + padding: 0 1.618em; + margin-bottom: 0; + display: block; + font-weight: bold; + text-transform: uppercase; + font-size: 80%; + color: #6f6f6f; + white-space: nowrap; +} +.wy-menu-vertical ul { + margin-bottom: 0; +} +.wy-menu-vertical li.divide-top { + border-top: solid 1px #404040; +} +.wy-menu-vertical li.divide-bottom { + border-bottom: solid 1px #404040; +} +.wy-menu-vertical li.current { + background: #e3e3e3; +} +.wy-menu-vertical li.current a { + color: gray; + border-right: solid 1px #c9c9c9; + padding: 0.4045em 2.427em; +} +.wy-menu-vertical li.current a:hover { + background: #d6d6d6; +} +.wy-menu-vertical li code, .wy-menu-vertical li .rst-content tt, .rst-content .wy-menu-vertical li tt { + border: none; + background: inherit; + color: inherit; + padding-left: 0; + padding-right: 0; +} +.wy-menu-vertical li span.toctree-expand { + display: block; + float: left; + margin-left: -1.2em; + font-size: 0.8em; + line-height: 1.6em; + color: #4d4d4d; +} +.wy-menu-vertical li.on a, .wy-menu-vertical li.current > a { + color: #404040; + padding: 0.4045em 1.618em; + font-weight: bold; + position: relative; + background: #fcfcfc; + border: none; + border-bottom: solid 1px #c9c9c9; + border-top: solid 1px #c9c9c9; + padding-left: 1.618em -4px; +} +.wy-menu-vertical li.on a:hover, .wy-menu-vertical li.current > a:hover { + background: #fcfcfc; +} +.wy-menu-vertical li.on a:hover span.toctree-expand, .wy-menu-vertical li.current > a:hover span.toctree-expand { + color: gray; +} +.wy-menu-vertical li.on a span.toctree-expand, .wy-menu-vertical li.current > a span.toctree-expand { + display: block; + font-size: 0.8em; + line-height: 1.6em; + color: #333333; +} +.wy-menu-vertical li.toctree-l1.current li.toctree-l2 > ul, .wy-menu-vertical li.toctree-l2.current li.toctree-l3 > ul { + display: none; +} +.wy-menu-vertical li.toctree-l1.current li.toctree-l2.current > ul, .wy-menu-vertical li.toctree-l2.current li.toctree-l3.current > ul { + display: block; +} +.wy-menu-vertical li.toctree-l2.current > a { + background: #c9c9c9; + padding: 0.4045em 2.427em; +} +.wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a { + display: block; + background: #c9c9c9; + padding: 0.4045em 4.045em; +} +.wy-menu-vertical li.toctree-l2 a:hover span.toctree-expand { + color: gray; +} +.wy-menu-vertical li.toctree-l2 span.toctree-expand { + color: #a3a3a3; +} +.wy-menu-vertical li.toctree-l3 { + font-size: 0.9em; +} +.wy-menu-vertical li.toctree-l3.current > a { + background: #bdbdbd; + padding: 0.4045em 4.045em; +} +.wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a { + display: block; + background: #bdbdbd; + padding: 0.4045em 5.663em; + border-top: none; + border-bottom: none; +} +.wy-menu-vertical li.toctree-l3 a:hover span.toctree-expand { + color: gray; +} +.wy-menu-vertical li.toctree-l3 span.toctree-expand { + color: #969696; +} +.wy-menu-vertical li.toctree-l4 { + font-size: 0.9em; +} +.wy-menu-vertical li.current ul { + display: block; +} +.wy-menu-vertical li ul { + margin-bottom: 0; + display: none; +} +.wy-menu-vertical .local-toc li ul { + display: block; +} +.wy-menu-vertical li ul li a { + margin-bottom: 0; + color: #b3b3b3; + font-weight: normal; +} +.wy-menu-vertical a { + display: inline-block; + line-height: 18px; + padding: 0.4045em 1.618em; + display: block; + position: relative; + font-size: 90%; + color: #b3b3b3; +} +.wy-menu-vertical a:hover { + background-color: #4e4a4a; + cursor: pointer; +} +.wy-menu-vertical a:hover span.toctree-expand { + color: #b3b3b3; +} +.wy-menu-vertical a:active { + background-color: #2980B9; + cursor: pointer; + color: #fff; +} +.wy-menu-vertical a:active span.toctree-expand { + color: #fff; +} + +.wy-side-nav-search { + display: block; + width: 300px; + padding: 0.809em; + margin-bottom: 0.809em; + z-index: 200; + background-color: #2980B9; + text-align: center; + padding: 0.809em; + display: block; + color: #fcfcfc; + margin-bottom: 0.809em; +} +.wy-side-nav-search input[type=text] { + width: 100%; + border-radius: 50px; + padding: 6px 12px; + border-color: #2472a4; +} +.wy-side-nav-search img { + display: block; + margin: auto auto 0.809em auto; + height: 45px; + width: 45px; + background-color: #2980B9; + padding: 5px; + border-radius: 100%; +} +.wy-side-nav-search > a, .wy-side-nav-search .wy-dropdown > a { + color: #fcfcfc; + font-size: 100%; + font-weight: bold; + display: inline-block; + padding: 4px 6px; + margin-bottom: 0.809em; +} +.wy-side-nav-search > a:hover, .wy-side-nav-search .wy-dropdown > a:hover { + background: rgba(255, 255, 255, 0.1); +} +.wy-side-nav-search > a img.logo, .wy-side-nav-search .wy-dropdown > a img.logo { + display: block; + margin: 0 auto; + height: auto; + width: auto; + border-radius: 0; + max-width: 100%; + background: rgba(0, 0, 0, 0); +} +.wy-side-nav-search > a.icon img.logo, .wy-side-nav-search .wy-dropdown > a.icon img.logo { + margin-top: 0.85em; +} +.wy-side-nav-search > div.version { + margin-top: -0.4045em; + margin-bottom: 0.809em; + font-weight: normal; + color: rgba(255, 255, 255, 0.3); +} + +.wy-nav .wy-menu-vertical header { + color: #2980B9; +} +.wy-nav .wy-menu-vertical a { + color: #b3b3b3; +} +.wy-nav .wy-menu-vertical a:hover { + background-color: #2980B9; + color: #fff; +} + +[data-menu-wrap] { + -webkit-transition: all 0.2s ease-in; + -moz-transition: all 0.2s ease-in; + transition: all 0.2s ease-in; + position: absolute; + opacity: 1; + width: 100%; + opacity: 0; +} +[data-menu-wrap].move-center { + left: 0; + right: auto; + opacity: 1; +} +[data-menu-wrap].move-left { + right: auto; + left: -100%; + opacity: 0; +} +[data-menu-wrap].move-right { + right: -100%; + left: auto; + opacity: 0; +} + +.wy-body-for-nav { + background: left repeat-y #fcfcfc; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoxOERBMTRGRDBFMUUxMUUzODUwMkJCOThDMEVFNURFMCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxOERBMTRGRTBFMUUxMUUzODUwMkJCOThDMEVFNURFMCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjE4REExNEZCMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjE4REExNEZDMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+EwrlwAAAAA5JREFUeNpiMDU0BAgwAAE2AJgB9BnaAAAAAElFTkSuQmCC); + background-size: 300px 1px; +} + +.wy-grid-for-nav { + position: absolute; + width: 100%; + height: 100%; +} + +.wy-nav-side { + position: fixed; + top: 0; + bottom: 0; + left: 0; + padding-bottom: 2em; + width: 300px; + overflow-x: hidden; + overflow-y: hidden; + min-height: 100%; + background: #343131; + z-index: 200; +} + +.wy-side-scroll { + width: 320px; + position: relative; + overflow-x: hidden; + overflow-y: scroll; + height: 100%; +} + +.wy-nav-top { + display: none; + background: #2980B9; + color: #fff; + padding: 0.4045em 0.809em; + position: relative; + line-height: 50px; + text-align: center; + font-size: 100%; + *zoom: 1; +} +.wy-nav-top:before, .wy-nav-top:after { + display: table; + content: ""; +} +.wy-nav-top:after { + clear: both; +} +.wy-nav-top a { + color: #fff; + font-weight: bold; +} +.wy-nav-top img { + margin-right: 12px; + height: 45px; + width: 45px; + background-color: #2980B9; + padding: 5px; + border-radius: 100%; +} +.wy-nav-top i { + font-size: 30px; + float: left; + cursor: pointer; + padding-top: inherit; +} + +.wy-nav-content-wrap { + margin-left: 300px; + background: #fcfcfc; + min-height: 100%; +} + +.wy-nav-content { + padding: 1.618em 3.236em; + height: 100%; + max-width: 800px; + margin: auto; +} + +.wy-body-mask { + position: fixed; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.2); + display: none; + z-index: 499; +} +.wy-body-mask.on { + display: block; +} + +footer { + color: gray; +} +footer p { + margin-bottom: 12px; +} +footer span.commit code, footer span.commit .rst-content tt, .rst-content footer span.commit tt { + padding: 0px; + font-family: Consolas, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", Monaco, "Courier New", Courier, monospace; + font-size: 1em; + background: none; + border: none; + color: gray; +} + +.rst-footer-buttons { + *zoom: 1; +} +.rst-footer-buttons:before, .rst-footer-buttons:after { + width: 100%; +} +.rst-footer-buttons:before, .rst-footer-buttons:after { + display: table; + content: ""; +} +.rst-footer-buttons:after { + clear: both; +} + +.rst-breadcrumbs-buttons { + margin-top: 12px; + *zoom: 1; +} +.rst-breadcrumbs-buttons:before, .rst-breadcrumbs-buttons:after { + display: table; + content: ""; +} +.rst-breadcrumbs-buttons:after { + clear: both; +} + +#search-results .search li { + margin-bottom: 24px; + border-bottom: solid 1px #e1e4e5; + padding-bottom: 24px; +} +#search-results .search li:first-child { + border-top: solid 1px #e1e4e5; + padding-top: 24px; +} +#search-results .search li a { + font-size: 120%; + margin-bottom: 12px; + display: inline-block; +} +#search-results .context { + color: gray; + font-size: 90%; +} + +@media screen and (max-width: 768px) { + .wy-body-for-nav { + background: #fcfcfc; + } + + .wy-nav-top { + display: block; + } + + .wy-nav-side { + left: -300px; + } + .wy-nav-side.shift { + width: 85%; + left: 0; + } + + .wy-side-scroll { + width: auto; + } + + .wy-side-nav-search { + width: auto; + } + + .wy-menu.wy-menu-vertical { + width: auto; + } + + .wy-nav-content-wrap { + margin-left: 0; + } + .wy-nav-content-wrap .wy-nav-content { + padding: 1.618em; + } + .wy-nav-content-wrap.shift { + position: fixed; + min-width: 100%; + left: 85%; + top: 0; + height: 100%; + overflow: hidden; + } +} +@media screen and (min-width: 1400px) { + .wy-nav-content-wrap { + background: rgba(0, 0, 0, 0.05); + } + + .wy-nav-content { + margin: 0; + background: #fcfcfc; + } +} +@media print { + .rst-versions, footer, .wy-nav-side { + display: none; + } + + .wy-nav-content-wrap { + margin-left: 0; + } +} +.rst-versions { + position: fixed; + bottom: 0; + left: 0; + width: 300px; + color: #fcfcfc; + background: #1f1d1d; + border-top: solid 10px #343131; + font-family: "Lato", "proxima-nova", "Helvetica Neue", Arial, sans-serif; + z-index: 400; +} +.rst-versions a { + color: #2980B9; + text-decoration: none; +} +.rst-versions .rst-badge-small { + display: none; +} +.rst-versions .rst-current-version { + padding: 12px; + background-color: #272525; + display: block; + text-align: right; + font-size: 90%; + cursor: pointer; + color: #27AE60; + *zoom: 1; +} +.rst-versions .rst-current-version:before, .rst-versions .rst-current-version:after { + display: table; + content: ""; +} +.rst-versions .rst-current-version:after { + clear: both; +} +.rst-versions .rst-current-version .fa, .rst-versions .rst-current-version .wy-menu-vertical li span.toctree-expand, .wy-menu-vertical li .rst-versions .rst-current-version span.toctree-expand, .rst-versions .rst-current-version .rst-content .admonition-title, .rst-content .rst-versions .rst-current-version .admonition-title, .rst-versions .rst-current-version .rst-content h1 .headerlink, .rst-content h1 .rst-versions .rst-current-version .headerlink, .rst-versions .rst-current-version .rst-content h2 .headerlink, .rst-content h2 .rst-versions .rst-current-version .headerlink, .rst-versions .rst-current-version .rst-content h3 .headerlink, .rst-content h3 .rst-versions .rst-current-version .headerlink, .rst-versions .rst-current-version .rst-content h4 .headerlink, .rst-content h4 .rst-versions .rst-current-version .headerlink, .rst-versions .rst-current-version .rst-content h5 .headerlink, .rst-content h5 .rst-versions .rst-current-version .headerlink, .rst-versions .rst-current-version .rst-content h6 .headerlink, .rst-content h6 .rst-versions .rst-current-version .headerlink, .rst-versions .rst-current-version .rst-content dl dt .headerlink, .rst-content dl dt .rst-versions .rst-current-version .headerlink, .rst-versions .rst-current-version .rst-content p.caption .headerlink, .rst-content p.caption .rst-versions .rst-current-version .headerlink, .rst-versions .rst-current-version .rst-content tt.download span:first-child, .rst-content tt.download .rst-versions .rst-current-version span:first-child, .rst-versions .rst-current-version .rst-content code.download span:first-child, .rst-content code.download .rst-versions .rst-current-version span:first-child, .rst-versions .rst-current-version .icon { + color: #fcfcfc; +} +.rst-versions .rst-current-version .fa-book, .rst-versions .rst-current-version .icon-book { + float: left; +} +.rst-versions .rst-current-version .icon-book { + float: left; +} +.rst-versions .rst-current-version.rst-out-of-date { + background-color: #E74C3C; + color: #fff; +} +.rst-versions .rst-current-version.rst-active-old-version { + background-color: #F1C40F; + color: #000; +} +.rst-versions.shift-up .rst-other-versions { + display: block; +} +.rst-versions .rst-other-versions { + font-size: 90%; + padding: 12px; + color: gray; + display: none; +} +.rst-versions .rst-other-versions hr { + display: block; + height: 1px; + border: 0; + margin: 20px 0; + padding: 0; + border-top: solid 1px #413d3d; +} +.rst-versions .rst-other-versions dd { + display: inline-block; + margin: 0; +} +.rst-versions .rst-other-versions dd a { + display: inline-block; + padding: 6px; + color: #fcfcfc; +} +.rst-versions.rst-badge { + width: auto; + bottom: 20px; + right: 20px; + left: auto; + border: none; + max-width: 300px; +} +.rst-versions.rst-badge .icon-book { + float: none; +} +.rst-versions.rst-badge .fa-book, .rst-versions.rst-badge .icon-book { + float: none; +} +.rst-versions.rst-badge.shift-up .rst-current-version { + text-align: right; +} +.rst-versions.rst-badge.shift-up .rst-current-version .fa-book, .rst-versions.rst-badge.shift-up .rst-current-version .icon-book { + float: left; +} +.rst-versions.rst-badge.shift-up .rst-current-version .icon-book { + float: left; +} +.rst-versions.rst-badge .rst-current-version { + width: auto; + height: 30px; + line-height: 30px; + padding: 0 6px; + display: block; + text-align: center; +} + +@media screen and (max-width: 768px) { + .rst-versions { + width: 85%; + display: none; + } + .rst-versions.shift { + display: block; + } +} +.rst-content img { + max-width: 100%; + height: auto !important; +} +.rst-content .highlight > pre, .rst-content .linenodiv > pre { + line-height: normal; +} +.rst-content div.figure { + margin-bottom: 24px; +} +.rst-content div.figure p.caption { + font-style: italic; +} +.rst-content div.figure.align-center { + text-align: center; +} +.rst-content .section > img, .rst-content .section > a > img { + margin-bottom: 24px; +} +.rst-content blockquote { + margin-left: 24px; + line-height: 24px; + margin-bottom: 24px; +} +.rst-content .note .last, .rst-content .attention .last, .rst-content .caution .last, .rst-content .danger .last, .rst-content .error .last, .rst-content .hint .last, .rst-content .important .last, .rst-content .tip .last, .rst-content .warning .last, .rst-content .seealso .last, .rst-content .admonition-todo .last, .rst-content .admonition .last { + margin-bottom: 0; +} +.rst-content .admonition-title:before { + margin-right: 4px; +} +.rst-content .admonition table { + border-color: rgba(0, 0, 0, 0.1); +} +.rst-content .admonition table td, .rst-content .admonition table th { + background: transparent !important; + border-color: rgba(0, 0, 0, 0.1) !important; +} +.rst-content .section ol.loweralpha, .rst-content .section ol.loweralpha li { + list-style: lower-alpha; +} +.rst-content .section ol.upperalpha, .rst-content .section ol.upperalpha li { + list-style: upper-alpha; +} +.rst-content .section ol p, .rst-content .section ul p { + margin-bottom: 12px; +} +.rst-content .line-block { + margin-left: 24px; +} +.rst-content .topic-title { + font-weight: bold; + margin-bottom: 12px; +} +.rst-content .toc-backref { + color: #404040; +} +.rst-content .align-right { + float: right; + margin: 0px 0px 24px 24px; +} +.rst-content .align-left { + float: left; + margin: 0px 24px 24px 0px; +} +.rst-content .align-center { + margin: auto; + display: block; +} +.rst-content h1 .headerlink, .rst-content h2 .headerlink, .rst-content .toctree-wrapper p.caption .headerlink, .rst-content h3 .headerlink, .rst-content h4 .headerlink, .rst-content h5 .headerlink, .rst-content h6 .headerlink, .rst-content dl dt .headerlink, .rst-content p.caption .headerlink { + display: none; + visibility: hidden; + font-size: 14px; +} +.rst-content h1 .headerlink:after, .rst-content h2 .headerlink:after, .rst-content .toctree-wrapper p.caption .headerlink:after, .rst-content h3 .headerlink:after, .rst-content h4 .headerlink:after, .rst-content h5 .headerlink:after, .rst-content h6 .headerlink:after, .rst-content dl dt .headerlink:after, .rst-content p.caption .headerlink:after { + visibility: visible; + content: ""; + font-family: FontAwesome; + display: inline-block; +} +.rst-content h1:hover .headerlink, .rst-content h2:hover .headerlink, .rst-content .toctree-wrapper p.caption:hover .headerlink, .rst-content h3:hover .headerlink, .rst-content h4:hover .headerlink, .rst-content h5:hover .headerlink, .rst-content h6:hover .headerlink, .rst-content dl dt:hover .headerlink, .rst-content p.caption:hover .headerlink { + display: inline-block; +} +.rst-content .centered { + text-align: center; +} +.rst-content .sidebar { + float: right; + width: 40%; + display: block; + margin: 0 0 24px 24px; + padding: 24px; + background: #f3f6f6; + border: solid 1px #e1e4e5; +} +.rst-content .sidebar p, .rst-content .sidebar ul, .rst-content .sidebar dl { + font-size: 90%; +} +.rst-content .sidebar .last { + margin-bottom: 0; +} +.rst-content .sidebar .sidebar-title { + display: block; + font-family: "Roboto Slab", "ff-tisa-web-pro", "Georgia", Arial, sans-serif; + font-weight: bold; + background: #e1e4e5; + padding: 6px 12px; + margin: -24px; + margin-bottom: 24px; + font-size: 100%; +} +.rst-content .highlighted { + background: #F1C40F; + display: inline-block; + font-weight: bold; + padding: 0 6px; +} +.rst-content .footnote-reference, .rst-content .citation-reference { + vertical-align: super; + font-size: 90%; +} +.rst-content table.docutils.citation, .rst-content table.docutils.footnote { + background: none; + border: none; + color: gray; +} +.rst-content table.docutils.citation td, .rst-content table.docutils.citation tr, .rst-content table.docutils.footnote td, .rst-content table.docutils.footnote tr { + border: none; + background-color: transparent !important; + white-space: normal; +} +.rst-content table.docutils.citation td.label, .rst-content table.docutils.footnote td.label { + padding-left: 0; + padding-right: 0; + vertical-align: top; +} +.rst-content table.docutils.citation tt, .rst-content table.docutils.citation code, .rst-content table.docutils.footnote tt, .rst-content table.docutils.footnote code { + color: #555; +} +.rst-content table.field-list { + border: none; +} +.rst-content table.field-list td { + border: none; +} +.rst-content table.field-list td > strong { + display: inline-block; +} +.rst-content table.field-list .field-name { + padding-right: 10px; + text-align: left; + white-space: nowrap; +} +.rst-content table.field-list .field-body { + text-align: left; +} +.rst-content tt, .rst-content tt, .rst-content code { + color: #000; + padding: 2px 5px; +} +.rst-content tt big, .rst-content tt em, .rst-content tt big, .rst-content code big, .rst-content tt em, .rst-content code em { + font-size: 100% !important; + line-height: normal; +} +.rst-content tt.literal, .rst-content tt.literal, .rst-content code.literal { + color: #E74C3C; +} +.rst-content tt.xref, a .rst-content tt, .rst-content tt.xref, .rst-content code.xref, a .rst-content tt, a .rst-content code { + font-weight: bold; + color: #404040; +} +.rst-content a tt, .rst-content a tt, .rst-content a code { + color: #2980B9; +} +.rst-content dl { + margin-bottom: 24px; +} +.rst-content dl dt { + font-weight: bold; +} +.rst-content dl p, .rst-content dl table, .rst-content dl ul, .rst-content dl ol { + margin-bottom: 12px !important; +} +.rst-content dl dd { + margin: 0 0 12px 24px; +} +.rst-content dl:not(.docutils) { + margin-bottom: 24px; +} +.rst-content dl:not(.docutils) dt { + display: table; + margin: 6px 0; + font-size: 90%; + line-height: normal; + background: #e7f2fa; + color: #2980B9; + border-top: solid 3px #6ab0de; + padding: 6px; + position: relative; +} +.rst-content dl:not(.docutils) dt:before { + color: #6ab0de; +} +.rst-content dl:not(.docutils) dt .headerlink { + color: #404040; + font-size: 100% !important; +} +.rst-content dl:not(.docutils) dl dt { + margin-bottom: 6px; + border: none; + border-left: solid 3px #cccccc; + background: #f0f0f0; + color: #555; +} +.rst-content dl:not(.docutils) dl dt .headerlink { + color: #404040; + font-size: 100% !important; +} +.rst-content dl:not(.docutils) dt:first-child { + margin-top: 0; +} +.rst-content dl:not(.docutils) tt, .rst-content dl:not(.docutils) tt, .rst-content dl:not(.docutils) code { + font-weight: bold; +} +.rst-content dl:not(.docutils) tt.descname, .rst-content dl:not(.docutils) tt.descclassname, .rst-content dl:not(.docutils) tt.descname, .rst-content dl:not(.docutils) code.descname, .rst-content dl:not(.docutils) tt.descclassname, .rst-content dl:not(.docutils) code.descclassname { + background-color: transparent; + border: none; + padding: 0; + font-size: 100% !important; +} +.rst-content dl:not(.docutils) tt.descname, .rst-content dl:not(.docutils) tt.descname, .rst-content dl:not(.docutils) code.descname { + font-weight: bold; +} +.rst-content dl:not(.docutils) .optional { + display: inline-block; + padding: 0 4px; + color: #000; + font-weight: bold; +} +.rst-content dl:not(.docutils) .property { + display: inline-block; + padding-right: 8px; +} +.rst-content .viewcode-link, .rst-content .viewcode-back { + display: inline-block; + color: #27AE60; + font-size: 80%; + padding-left: 24px; +} +.rst-content .viewcode-back { + display: block; + float: right; +} +.rst-content p.rubric { + margin-bottom: 12px; + font-weight: bold; +} +.rst-content tt.download, .rst-content code.download { + background: inherit; + padding: inherit; + font-weight: normal; + font-family: inherit; + font-size: inherit; + color: inherit; + border: inherit; + white-space: inherit; +} +.rst-content tt.download span:first-child, .rst-content code.download span:first-child { + -webkit-font-smoothing: subpixel-antialiased; +} +.rst-content tt.download span:first-child:before, .rst-content code.download span:first-child:before { + margin-right: 4px; +} +.rst-content .guilabel { + border: 1px solid #7fbbe3; + background: #e7f2fa; + font-size: 80%; + font-weight: 700; + border-radius: 4px; + padding: 2.4px 6px; + margin: auto 2px; +} +.rst-content .versionmodified { + font-style: italic; +} + +@media screen and (max-width: 480px) { + .rst-content .sidebar { + width: 100%; + } +} +span[id*='MathJax-Span'] { + color: #404040; +} + +.math { + text-align: center; +} + +@font-face { + font-family: "Inconsolata"; + font-style: normal; + font-weight: 400; + src: local("Inconsolata"), local("Inconsolata-Regular"), url(../fonts/Inconsolata-Regular.ttf) format("truetype"); +} +@font-face { + font-family: "Inconsolata"; + font-style: normal; + font-weight: 700; + src: local("Inconsolata Bold"), local("Inconsolata-Bold"), url(../fonts/Inconsolata-Bold.ttf) format("truetype"); +} +@font-face { + font-family: "Lato"; + font-style: normal; + font-weight: 400; + src: local("Lato Regular"), local("Lato-Regular"), url(../fonts/Lato-Regular.ttf) format("truetype"); +} +@font-face { + font-family: "Lato"; + font-style: normal; + font-weight: 700; + src: local("Lato Bold"), local("Lato-Bold"), url(../fonts/Lato-Bold.ttf) format("truetype"); +} +@font-face { + font-family: "Lato"; + font-style: italic; + font-weight: 400; + src: local("Lato Italic"), local("Lato-Italic"), url(../fonts/Lato-Italic.ttf) format("truetype"); +} +@font-face { + font-family: "Lato"; + font-style: italic; + font-weight: 700; + src: local("Lato Bold Italic"), local("Lato-BoldItalic"), url(../fonts/Lato-BoldItalic.ttf) format("truetype"); +} +@font-face { + font-family: "Roboto Slab"; + font-style: normal; + font-weight: 400; + src: local("Roboto Slab Regular"), local("RobotoSlab-Regular"), url(../fonts/RobotoSlab-Regular.ttf) format("truetype"); +} +@font-face { + font-family: "Roboto Slab"; + font-style: normal; + font-weight: 700; + src: local("Roboto Slab Bold"), local("RobotoSlab-Bold"), url(../fonts/RobotoSlab-Bold.ttf) format("truetype"); +} +.wy-side-nav-search { + background-color: red; +} + +/*# sourceMappingURL=theme.css.map */ diff --git a/v24.04/de/_static/css/theme.css.map b/v24.04/de/_static/css/theme.css.map new file mode 100644 index 0000000..cf17c0d --- /dev/null +++ b/v24.04/de/_static/css/theme.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": ";AACE,CAAE;ECQI,kBAAoB,EDPJ,UAAU;ECY1B,eAAiB,EDZD,UAAU;EC2B1B,UAAY,ED3BI,UAAU;;;AEFlC,iFAAiF;EAC/E,OAAO,EAAE,KAAK;;;AAEhB,oBAAoB;EAClB,OAAO,EAAE,YAAY;EACrB,QAAQ,EAAE,MAAM;EAChB,KAAK,EAAE,CAAC;;;AAEV,qBAAqB;EACnB,OAAO,EAAE,IAAI;;;AAEf,QAAQ;EACN,OAAO,EAAE,IAAI;;;AAEf,CAAC;EDLO,kBAAoB,ECMd,UAAU;EDDhB,eAAiB,ECCX,UAAU;EDchB,UAAY,ECdN,UAAU;;;AAExB,IAAI;EACF,SAAS,EAAE,IAAI;EACf,wBAAwB,EAAE,IAAI;EAC9B,oBAAoB,EAAE,IAAI;;;AAE5B,IAAI;EACF,MAAM,EAAE,CAAC;;;AAEX,iBAAiB;EACf,OAAO,EAAE,CAAC;;;AAEZ,WAAW;EACT,aAAa,EAAE,UAAU;;;AAE3B,SAAS;EACP,WAAW,EAAE,IAAI;;;AAEnB,UAAU;EACR,MAAM,EAAE,CAAC;;;AAEX,GAAG;EACD,UAAU,EAAE,MAAM;;;AAGpB,GAAG;EACD,UAAU,EAAE,IAAI;EAChB,KAAK,EAAE,IAAI;EACX,eAAe,EAAE,IAAI;;;AAEvB,IAAI;EACF,UAAU,EAAE,IAAI;EAChB,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,IAAI;;;AAEnB,wDAAoB;EAClB,WAAW,EAAE,gBAAgB;EAC7B,YAAY,EAAE,wBAAwB;EACtC,SAAS,EAAE,GAAG;;;AAEhB,GAAG;EACD,WAAW,EAAE,GAAG;;;AAElB,CAAC;EACC,MAAM,EAAE,IAAI;;;AAEd,iBAAiB;EACf,OAAO,EAAE,EAAE;EACX,OAAO,EAAE,IAAI;;;AAEf,KAAK;EACH,SAAS,EAAE,GAAG;;;AAEhB,QAAQ;EACN,SAAS,EAAE,GAAG;EACd,WAAW,EAAE,CAAC;EACd,QAAQ,EAAE,QAAQ;EAClB,cAAc,EAAE,QAAQ;;;AAE1B,GAAG;EACD,GAAG,EAAE,MAAM;;;AAEb,GAAG;EACD,MAAM,EAAE,OAAO;;;AAEjB,UAAU;EACR,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;EACV,UAAU,EAAE,IAAI;EAChB,gBAAgB,EAAE,IAAI;;;AAExB,EAAE;EACA,UAAU,EAAE,IAAI;;;AAElB,EAAE;EACA,MAAM,EAAE,CAAC;;;AAEX,GAAG;EACD,MAAM,EAAE,CAAC;EACT,sBAAsB,EAAE,OAAO;EAC/B,cAAc,EAAE,MAAM;EACtB,SAAS,EAAE,IAAI;;;AAEjB,cAAc;EACZ,QAAQ,EAAE,MAAM;;;AAElB,MAAM;EACJ,MAAM,EAAE,CAAC;;;AAEX,IAAI;EACF,MAAM,EAAE,CAAC;;;AAEX,QAAQ;EACN,MAAM,EAAE,CAAC;EACT,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;;;AAEZ,KAAK;EACH,MAAM,EAAE,OAAO;;;AAEjB,MAAM;EACJ,MAAM,EAAE,CAAC;EACT,YAAY,EAAE,IAAI;EAClB,OAAO,EAAE,CAAC;EACV,WAAW,EAAE,MAAM;;;AAErB,+BAA+B;EAC7B,SAAS,EAAE,IAAI;EACf,MAAM,EAAE,CAAC;EACT,cAAc,EAAE,QAAQ;EACxB,eAAe,EAAE,MAAM;;;AAEzB,aAAa;EACX,WAAW,EAAE,MAAM;;;AAErB,uEAAuE;EACrE,MAAM,EAAE,OAAO;EACf,kBAAkB,EAAE,MAAM;EAC1B,SAAS,EAAE,OAAO;;;AAEpB,iCAAiC;EAC/B,MAAM,EAAE,OAAO;;;AAEjB,2CAA2C;EACzC,UAAU,EAAE,UAAU;EACtB,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,IAAI;;;AAEf,oBAAoB;EAClB,kBAAkB,EAAE,SAAS;EAC7B,eAAe,EAAE,WAAW;EAC5B,kBAAkB,EAAE,WAAW;EAC/B,UAAU,EAAE,WAAW;;;AAEzB,mGAAmG;EACjG,kBAAkB,EAAE,IAAI;;;AAE1B,iDAAiD;EAC/C,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;;;AAEZ,QAAQ;EACN,QAAQ,EAAE,IAAI;EACd,cAAc,EAAE,GAAG;EACnB,MAAM,EAAE,QAAQ;;;AAElB,KAAK;EACH,eAAe,EAAE,QAAQ;EACzB,cAAc,EAAE,CAAC;;;AAEnB,EAAE;EACA,cAAc,EAAE,GAAG;;;AAErB,YAAY;EACV,MAAM,EAAE,OAAO;EACf,UAAU,EAAE,IAAI;EAChB,KAAK,EAAE,KAAK;EACZ,OAAO,EAAE,OAAO;;;AAElB,GAAG;EACD,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,CAAC;EACT,WAAW,EAAE,MAAM;EACnB,QAAQ,EAAE,MAAM;EAChB,gBAAgB,EAAE,WAAW;EAC7B,iBAAiB,EAAE,SAAS;EAC5B,UAAU,EAAE,IAAI;EAChB,SAAS,EAAE,GAAG;EACd,YAAY,EAAE,CAAC;;;AAEjB,MAAM;EACJ,OAAO,EAAE,IAAI;;;AAEf,OAAO;EACL,OAAO,EAAE,eAAe;EACxB,UAAU,EAAE,MAAM;;;AAEpB,eAAe;EACb,MAAM,EAAE,CAAC;EACT,IAAI,EAAE,aAAa;EACnB,MAAM,EAAE,GAAG;EACX,MAAM,EAAE,IAAI;EACZ,QAAQ,EAAE,MAAM;EAChB,OAAO,EAAE,CAAC;EACV,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,GAAG;;;AAEZ,iEAAiE;EAC/D,IAAI,EAAE,IAAI;EACV,MAAM,EAAE,IAAI;EACZ,MAAM,EAAE,CAAC;EACT,QAAQ,EAAE,OAAO;EACjB,QAAQ,EAAE,MAAM;EAChB,KAAK,EAAE,IAAI;;;AAEb,UAAU;EACR,UAAU,EAAE,MAAM;;;AAEpB,SAAS;EACP,QAAQ,EAAE,QAAQ;;;AAEpB,UAAU;EACR,SAAS,EAAE,IAAI;;;AAEjB,YAAY;EACV,mBAAmB;IACjB,UAAU,EAAE,eAAe;;;EAC7B,CAAC;IACC,UAAU,EAAE,eAAe;IAC3B,WAAW,EAAE,eAAe;IAC5B,MAAM,EAAE,eAAe;IACvB,UAAU,EAAE,eAAe;;;EAC7B,YAAY;IACV,eAAe,EAAE,SAAS;;;EAC5B,6DAA6D;IAC3D,OAAO,EAAE,EAAE;;;EACb,eAAe;IACb,iBAAiB,EAAE,KAAK;;;EAC1B,KAAK;IACH,OAAO,EAAE,kBAAkB;;;EAC7B,OAAO;IACL,iBAAiB,EAAE,KAAK;;;EAC1B,GAAG;IACD,SAAS,EAAE,eAAe;;;;IAE1B,MAAM,EAAE,KAAK;;EAEf,kDAAS;IACP,OAAO,EAAE,CAAC;IACV,MAAM,EAAE,CAAC;;;EACX,+CAAM;IACJ,gBAAgB,EAAE,KAAK;;;AChM3B,kqDAAY;EACV,sBAAsB,EAAE,WAAW;;;AAqDrC,SAAS;EARP,KAAK,EAAE,CAAC;;AACR,iCAAS;EAEP,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,EAAE;;AACb,eAAO;EACL,KAAK,EAAE,IAAI;;;AC7Gf;;;GAGG;ACHH;gCACgC;AAEhC,UAWC;EAVC,WAAW,EAAE,aAAa;EAC1B,GAAG,EAAE,+CAAgE;EACrE,GAAG,EAAE,4WAI8F;EAEnG,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,MAAM;;ACVpB,mgBAAmB;EACjB,OAAO,EAAE,YAAY;EACrB,IAAI,EAAE,uCAA8E;EACpF,SAAS,EAAE,OAAO;EAClB,cAAc,EAAE,IAAI;EACpB,sBAAsB,EAAE,WAAW;EACnC,uBAAuB,EAAE,SAAS;;;ACNpC,8DAA8D;AAC9D,MAAsB;EACpB,SAAS,EAAE,cAAS;EACpB,WAAW,EAAE,MAAS;EACtB,cAAc,EAAE,IAAI;;;AAEtB,MAAsB;EAAE,SAAS,EAAE,GAAG;;;AACtC,MAAsB;EAAE,SAAS,EAAE,GAAG;;;AACtC,MAAsB;EAAE,SAAS,EAAE,GAAG;;;AACtC,MAAsB;EAAE,SAAS,EAAE,GAAG;;;ACVtC,MAAsB;EACpB,KAAK,EAAE,cAAW;EAClB,UAAU,EAAE,MAAM;;;ACDpB,MAAsB;EACpB,YAAY,EAAE,CAAC;EACf,WAAW,ECMU,cAAS;EDL9B,eAAe,EAAE,IAAI;;AACrB,WAAK;EAAE,QAAQ,EAAE,QAAQ;;;AAE3B,MAAsB;EACpB,QAAQ,EAAE,QAAQ;EAClB,IAAI,EAAE,eAAa;EACnB,KAAK,ECDgB,cAAS;EDE9B,GAAG,EAAE,cAAU;EACf,UAAU,EAAE,MAAM;;AAClB,YAAuB;EACrB,IAAI,EAAE,eAA0B;;;AEbpC,UAA0B;EACxB,OAAO,EAAE,gBAAgB;EACzB,MAAM,EAAE,iBAA4B;EACpC,aAAa,EAAE,IAAI;;;AAGrB,aAA6B;EAAE,KAAK,EAAE,IAAI;;;AAC1C,cAA8B;EAAE,KAAK,EAAE,KAAK;;;AAG1C,mtBAA8B;EAAE,YAAY,EAAE,IAAI;;AAClD,muBAA+B;EAAE,WAAW,EAAE,IAAI;;;AAGpD,4BAA4B;AAC5B,WAAY;EAAE,KAAK,EAAE,KAAK;;;AAC1B,UAAW;EAAE,KAAK,EAAE,IAAI;;;AAGtB,mqBAAY;EAAE,YAAY,EAAE,IAAI;;AAChC,mrBAAa;EAAE,WAAW,EAAE,IAAI;;;ACpBlC,QAAwB;EACtB,iBAAiB,EAAE,0BAA0B;EACrC,SAAS,EAAE,0BAA0B;;;AAG/C,SAAyB;EACvB,iBAAiB,EAAE,4BAA4B;EACvC,SAAS,EAAE,4BAA4B;;;AAGjD,0BASC;EARC,EAAG;IACD,iBAAiB,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;;EAEjC,IAAK;IACH,iBAAiB,EAAE,cAAc;IACzB,SAAS,EAAE,cAAc;;;AAIrC,kBASC;EARC,EAAG;IACD,iBAAiB,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;;EAEjC,IAAK;IACH,iBAAiB,EAAE,cAAc;IACzB,SAAS,EAAE,cAAc;;;AC5BrC,aAA8B;ECW5B,UAAU,EAAE,0DAAqE;EACjF,iBAAiB,EAAE,aAAgB;EAC/B,aAAa,EAAE,aAAgB;EAC3B,SAAS,EAAE,aAAgB;;;ADbrC,cAA8B;ECU5B,UAAU,EAAE,0DAAqE;EACjF,iBAAiB,EAAE,cAAgB;EAC/B,aAAa,EAAE,cAAgB;EAC3B,SAAS,EAAE,cAAgB;;;ADZrC,cAA8B;ECS5B,UAAU,EAAE,0DAAqE;EACjF,iBAAiB,EAAE,cAAgB;EAC/B,aAAa,EAAE,cAAgB;EAC3B,SAAS,EAAE,cAAgB;;;ADVrC,mBAAmC;ECcjC,UAAU,EAAE,oEAA+E;EAC3F,iBAAiB,EAAE,YAAoB;EACnC,aAAa,EAAE,YAAoB;EAC/B,SAAS,EAAE,YAAoB;;;ADhBzC,iBAAmC;ECajC,UAAU,EAAE,oEAA+E;EAC3F,iBAAiB,EAAE,YAAoB;EACnC,aAAa,EAAE,YAAoB;EAC/B,SAAS,EAAE,YAAoB;;;ADXzC;;;;uBAIuC;EACrC,MAAM,EAAE,IAAI;;;AEfd,SAAyB;EACvB,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,GAAG;EACV,MAAM,EAAE,GAAG;EACX,WAAW,EAAE,GAAG;EAChB,cAAc,EAAE,MAAM;;;AAExB,0BAAyD;EACvD,QAAQ,EAAE,QAAQ;EAClB,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,MAAM;;;AAEpB,YAA4B;EAAE,WAAW,EAAE,OAAO;;;AAClD,YAA4B;EAAE,SAAS,EAAE,GAAG;;;AAC5C,WAA2B;EAAE,KAAK,ELTZ,IAAI;;;AMV1B;oEACoE;AAEpE,gBAAgC;EAAE,OAAO,ENwU1B,GAAO;;;AMvUtB,gBAAgC;EAAE,OAAO,EN2d1B,GAAO;;;AM1dtB,sCAAiC;EAAE,OAAO,EN0jB1B,GAAO;;;AMzjBvB,qBAAqC;EAAE,OAAO,ENsO1B,GAAO;;;AMrO3B,gBAAgC;EAAE,OAAO,ENuW1B,GAAO;;;AMtWtB,eAA+B;EAAE,OAAO,ENknB1B,GAAO;;;AMjnBrB,iBAAiC;EAAE,OAAO,ENsnB1B,GAAO;;;AMrnBvB,eAA+B;EAAE,OAAO,ENytB1B,GAAO;;;AMxtBrB,eAA+B;EAAE,OAAO,ENmR1B,GAAO;;;AMlRrB,mBAAmC;EAAE,OAAO,ENupB1B,GAAO;;;AMtpBzB,aAA6B;EAAE,OAAO,ENqpB1B,GAAO;;;AMppBnB,kBAAkC;EAAE,OAAO,ENspB1B,GAAO;;;AMrpBxB,gBAAgC;EAAE,OAAO,ENyI1B,GAAO;;;AMxItB;;gBAEgC;EAAE,OAAO,ENqqB1B,GAAO;;;AMpqBtB,sBAAsC;EAAE,OAAO,EN8iB1B,GAAO;;;AM7iB5B,uBAAuC;EAAE,OAAO,EN4iB1B,GAAO;;;AM3iB7B,oBAAoC;EAAE,OAAO,EN4f1B,GAAO;;;AM3f1B,iBAAiC;EAAE,OAAO,ENikB1B,GAAO;;;AMhkBvB;cAC8B;EAAE,OAAO,ENgK1B,GAAO;;;AM/JpB,kBAAkC;EAAE,OAAO,EN+qB1B,GAAO;;;AM9qBxB,kCAA+B;EAAE,OAAO,ENwV1B,GAAO;;;AMvVrB,iBAAiC;EAAE,OAAO,ENuP1B,GAAO;;;AMtPvB,kBAAkC;EAAE,OAAO,ENgJ1B,GAAO;;;AM/IxB,eAA+B;EAAE,OAAO,ENmhB1B,GAAO;;;AMlhBrB,yHAAmC;EAAE,OAAO,ENgM1B,GAAO;;;AM/LzB,8BAA8C;EAAE,OAAO,ENY1B,GAAO;;;AMXpC,4BAA4C;EAAE,OAAO,ENc1B,GAAO;;;AMblC,gBAAgC;EAAE,OAAO,ENqW1B,GAAO;;;AMpWtB,wBAAwC;EAAE,OAAO,ENwe1B,GAAO;;;AMve9B;iBACiC;EAAE,OAAO,ENsgB1B,GAAO;;;AMrgBvB,kBAAkC;EAAE,OAAO,ENggB1B,GAAO;;;AM/fxB,mBAAmC;EAAE,OAAO,ENwY1B,GAAO;;;AMvYzB,eAA+B;EAAE,OAAO,EN2Y1B,GAAO;;;AM1YrB,eAA+B;EAAE,OAAO,EN4P1B,GAAO;;;AM3PrB,qBAAqC;EAAE,OAAO,ENoU1B,GAAO;;;AMnU3B,qBAAqC;EAAE,OAAO,ENitB1B,GAAO;;;AMhtB3B,sBAAsC;EAAE,OAAO,EN+sB1B,GAAO;;;AM9sB5B,oBAAoC;EAAE,OAAO,ENgtB1B,GAAO;;;AM/sB1B,iBAAiC;EAAE,OAAO,ENye1B,GAAO;;;AMxevB,kBAAkC;EAAE,OAAO,ENwB1B,GAAO;;;AMvBxB,cAA8B;EAAE,OAAO,ENymB1B,GAAO;;;AMxmBpB,eAA+B;EAAE,OAAO,ENymB1B,GAAO;;;AMxmBrB,kCAA+B;EAAE,OAAO,ENyD1B,GAAO;;;AMxDrB,mBAAmC;EAAE,OAAO,ENyD1B,GAAO;;;AMxDzB,gBAAgC;EAAE,OAAO,EN+d1B,GAAO;;;AM9dtB,iBAAiC;EAAE,OAAO,EN2E1B,GAAO;;;AM1EvB,eAA+B;EAAE,OAAO,EN0P1B,GAAO;;;AMzPrB,eAA+B;EAAE,OAAO,ENiD1B,GAAO;;;AMhDrB,iBAAiC;EAAE,OAAO,EN0V1B,GAAO;;;AMzVvB,sBAAsC;EAAE,OAAO,ENwmB1B,GAAO;;;AMvmB5B,qBAAqC;EAAE,OAAO,ENwmB1B,GAAO;;;AMvmB3B,qBAAqC;EAAE,OAAO,ENpC1B,GAAO;;;AMqC3B,uBAAuC;EAAE,OAAO,ENvC1B,GAAO;;;AMwC7B,sBAAsC;EAAE,OAAO,ENrC1B,GAAO;;;AMsC5B,wBAAwC;EAAE,OAAO,ENxC1B,GAAO;;;AMyC9B,eAA+B;EAAE,OAAO,EN+W1B,GAAO;;;AM9WrB;kBACkC;EAAE,OAAO,EN2a1B,GAAO;;;AM1axB,iBAAiC;EAAE,OAAO,ENsU1B,GAAO;;;AMrUvB,uBAAuC;EAAE,OAAO,ENkrB1B,GAAO;;;AMjrB7B;;oBAEoC;EAAE,OAAO,EN0b1B,GAAO;;;AMzb1B,iBAAiC;EAAE,OAAO,ENkb1B,GAAO;;;AMjbvB,qBAAqC;EAAE,OAAO,ENwX1B,GAAO;;;AMvX3B,iBAAiC;EAAE,OAAO,ENtD1B,GAAO;;;AMuDvB,eAA+B;EAAE,OAAO,ENmnB1B,GAAO;;;AMlnBrB;0BAC0C;EAAE,OAAO,EN+a1B,GAAO;;;AM9ahC,yBAAyC;EAAE,OAAO,EN8f1B,GAAO;;;AM7f/B,yBAAyC;EAAE,OAAO,EN+E1B,GAAO;;;AM9E/B,iBAAiC;EAAE,OAAO,ENzB1B,GAAO;;;AM0BvB,wBAAwC;EAAE,OAAO,ENmjB1B,GAAO;;;AMljB9B,wBAAwC;EAAE,OAAO,ENqL1B,GAAO;;;AMpL9B,mBAAmC;EAAE,OAAO,ENlB1B,GAAO;;;AMmBzB,eAA+B;EAAE,OAAO,ENsb1B,GAAO;;;AMrbrB,gBAAgC;EAAE,OAAO,ENga1B,GAAO;;;AM/ZtB,eAA+B;EAAE,OAAO,ENmjB1B,GAAO;;;AMljBrB,kBAAkC;EAAE,OAAO,EN+N1B,GAAO;;;AM9NxB,uBAAuC;EAAE,OAAO,ENgL1B,GAAO;;;AM/K7B,uBAAuC;EAAE,OAAO,EN4iB1B,GAAO;;;AM3iB7B,gBAAgC;EAAE,OAAO,EN+I1B,GAAO;;;AM9ItB,uBAAuC;EAAE,OAAO,ENyE1B,GAAO;;;AMxE7B,wBAAwC;EAAE,OAAO,ENyE1B,GAAO;;;AMxE9B,sBAAsC;EAAE,OAAO,ENkb1B,GAAO;;;AMjb5B,uBAAuC;EAAE,OAAO,ENuX1B,GAAO;;;AMtX7B,+FAAuC;EAAE,OAAO,EN2lB1B,GAAO;;;AM1lB7B,gGAAuC;EAAE,OAAO,EN2D1B,GAAO;;;AM1D7B,0BAA0C;EAAE,OAAO,ENyb1B,GAAO;;;AMxbhC,sBAAsC;EAAE,OAAO,EN0S1B,GAAO;;;AMzS5B,qBAAqC;EAAE,OAAO,EN0G1B,GAAO;;;AMzG3B,yBAAyC;EAAE,OAAO,ENulB1B,GAAO;;;AMtlB/B,yBAAyC;EAAE,OAAO,ENuD1B,GAAO;;;AMtD/B,cAA8B;EAAE,OAAO,ENnC1B,GAAO;;;AMoCpB,qBAAqC;EAAE,OAAO,ENnD1B,GAAO;;;AMoD3B,sBAAsC;EAAE,OAAO,ENnD1B,GAAO;;;AMoD5B,mBAAmC;EAAE,OAAO,ENnD1B,GAAO;;;AMoDzB,qBAAqC;EAAE,OAAO,ENvD1B,GAAO;;;AMwD3B;gBACgC;EAAE,OAAO,EN4d1B,GAAO;;;AM3dtB,iBAAiC;EAAE,OAAO,EN8I1B,GAAO;;;AM7IvB,mBAAmC;EAAE,OAAO,ENsF1B,GAAO;;;AMrFzB,eAA+B;EAAE,OAAO,EN+Z1B,GAAO;;;AM9ZrB,gBAAgC;EAAE,OAAO,ENoW1B,GAAO;;;AMnWtB,mBAAmC;EAAE,OAAO,ENpD1B,GAAO;;;AMqDzB,mNAA6C;EAAE,OAAO,ENuI1B,GAAO;;;AMtInC,eAA+B;EAAE,OAAO,ENkN1B,GAAO;;;AMjNrB,eAA+B;EAAE,OAAO,EN0S1B,GAAO;;;AMzSrB,kCAA+B;EAAE,OAAO,EN6K1B,GAAO;;;AM5KrB,cAA8B;EAAE,OAAO,ENyI1B,GAAO;;;AMxIpB,oBAAoC;EAAE,OAAO,ENyI1B,GAAO;;;AMxI1B;+BAC+C;EAAE,OAAO,ENiI1B,GAAO;;;AMhIrC,gBAAgC;EAAE,OAAO,EN+Y1B,GAAO;;;AM9YtB,mBAAmC;EAAE,OAAO,ENA1B,GAAO;;;AMCzB,iBAAiC;EAAE,OAAO,ENoa1B,GAAO;;;AMnavB,kBAAkC;EAAE,OAAO,ENgE1B,GAAO;;;AM/DxB,iBAAiC;EAAE,OAAO,EN6T1B,GAAO;;;AM5TvB,qBAAqC;EAAE,OAAO,ENuC1B,GAAO;;;AMtC3B,uBAAuC;EAAE,OAAO,ENmC1B,GAAO;;;AMlC7B,kBAAkC;EAAE,OAAO,EN+a1B,GAAO;;;AM9axB,wBAAwC;EAAE,OAAO,ENkd1B,GAAO;;;AMjd9B,iBAAiC;EAAE,OAAO,EN0K1B,GAAO;;;AMzKvB,sBAAsC;EAAE,OAAO,EN2K1B,GAAO;;;AM1K5B,mBAAmC;EAAE,OAAO,EN3E1B,GAAO;;;AM4EzB,mBAAmC;EAAE,OAAO,EN7E1B,GAAO;;;AM8EzB;oBACoC;EAAE,OAAO,ENlE1B,GAAO;;;AMmE1B,yBAAyC;EAAE,OAAO,EN+kB1B,GAAO;;;AM9kB/B,0BAA0C;EAAE,OAAO,EN4H1B,GAAO;;;AM3HhC,uBAAuC;EAAE,OAAO,ENT1B,GAAO;;;AMU7B,cAA8B;EAAE,OAAO,EN2Q1B,GAAO;;;AM1QpB;eAC+B;EAAE,OAAO,EN6C1B,GAAO;;;AM5CrB,mBAAmC;EAAE,OAAO,ENkD1B,GAAO;;;AMjDzB,sBAAsC;EAAE,OAAO,ENsiB1B,GAAO;;;AMriB5B,wBAAwC;EAAE,OAAO,ENoiB1B,GAAO;;;AMniB9B,oBAAoC;EAAE,OAAO,EN2e1B,GAAO;;;AM1e1B,kBAAkC;EAAE,OAAO,EN8N1B,GAAO;;;AM7NxB,mBAAmC;EAAE,OAAO,ENoc1B,GAAO;;;AMnczB,0BAA0C;EAAE,OAAO,ENuR1B,GAAO;;;AMtRhC,qBAAqC;EAAE,OAAO,EN6hB1B,GAAO;;;AM5hB3B,wBAAwC;EAAE,OAAO,ENsG1B,GAAO;;;AMrG9B,kBAAkC;EAAE,OAAO,EN8b1B,GAAO;;;AM7bxB,iBAAiC;EAAE,OAAO,ENqjB1B,GAAO;;;AMpjBvB,wBAAwC;EAAE,OAAO,ENgL1B,GAAO;;;AM/K9B,iBAAiC;EAAE,OAAO,ENukB1B,GAAO;;;AMtkBvB,kBAAkC;EAAE,OAAO,ENqQ1B,GAAO;;;AMpQxB,gBAAgC;EAAE,OAAO,ENiW1B,GAAO;;;AMhWtB,mBAAmC;EAAE,OAAO,EN2d1B,GAAO;;;AM1dzB,qBAAqC;EAAE,OAAO,ENjD1B,GAAO;;;AMkD3B,uBAAuC;EAAE,OAAO,EN+V1B,GAAO;;;AM9V7B,kBAAkC;EAAE,OAAO,ENsjB1B,GAAO;;;AMrjBxB;mBACmC;EAAE,OAAO,ENgG1B,GAAO;;;AM/FzB,sCAAiC;EAAE,OAAO,ENoK1B,GAAO;;;AMnKvB,iBAAiC;EAAE,OAAO,EN0jB1B,GAAO;;;AMzjBvB,sBAAsC;EAAE,OAAO,ENoC1B,GAAO;;;AMnC5B;cAC8B;EAAE,OAAO,EN+Y1B,GAAO;;;AM9YpB,gBAAgC;EAAE,OAAO,ENoM1B,GAAO;;;AMnMtB,mBAAmC;EAAE,OAAO,ENrD1B,GAAO;;;AMsDzB,eAA+B;EAAE,OAAO,ENhF1B,GAAO;;;AMiFrB,sBAAsC;EAAE,OAAO,ENrB1B,GAAO;;;AMsB5B,uBAAuC;EAAE,OAAO,ENoL1B,GAAO;;;AMnL7B,sBAAsC;EAAE,OAAO,ENkL1B,GAAO;;;AMjL5B,oBAAoC;EAAE,OAAO,ENmL1B,GAAO;;;AMlL1B,sBAAsC;EAAE,OAAO,EN+K1B,GAAO;;;AM9K5B,4DAA4C;EAAE,OAAO,ENrI1B,GAAO;;;AMsIlC,8DAA6C;EAAE,OAAO,ENjI1B,GAAO;;;AMkInC,0BAA0C;EAAE,OAAO,ENjI1B,GAAO;;;AMkIhC,4BAA4C;EAAE,OAAO,ENzI1B,GAAO;;;AM0IlC,gBAAgC;EAAE,OAAO,EN2J1B,GAAO;;;AM1JtB,iBAAiC;EAAE,OAAO,EN6lB1B,GAAO;;;AM5lBvB,gBAAgC;EAAE,OAAO,ENqe1B,GAAO;;;AMpetB,iBAAiC;EAAE,OAAO,ENyG1B,GAAO;;;AMxGvB,oBAAoC;EAAE,OAAO,ENzE1B,GAAO;;;AM0E1B,qBAAqC;EAAE,OAAO,ENlI1B,GAAO;;;AMmI3B;gBACgC;EAAE,OAAO,ENijB1B,GAAO;;;AMhjBtB;;iBAC+B;EAAE,OAAO,EN4O1B,GAAO;;;AM3OrB,gBAAgC;EAAE,OAAO,ENd1B,GAAO;;;AMetB,gBAAgC;EAAE,OAAO,EN0G1B,GAAO;;;AMzGtB;mBACmC;EAAE,OAAO,EN6X1B,GAAO;;;AM5XzB;kBACkC;EAAE,OAAO,EN2F1B,GAAO;;;AM1FxB,oBAAoC;EAAE,OAAO,EN6S1B,GAAO;;;AM5S1B;mBACmC;EAAE,OAAO,ENqG1B,GAAO;;;AMpGzB,iBAAiC;EAAE,OAAO,ENgb1B,GAAO;;;AM/avB;;eAE+B;EAAE,OAAO,ENlI1B,GAAO;;;AMmIrB,kBAAkC;EAAE,OAAO,ENsO1B,GAAO;;;AMrOxB,kBAAkC;EAAE,OAAO,ENoO1B,GAAO;;;AMnOxB,wBAAwC;EAAE,OAAO,EN+b1B,GAAO;;;AM9b9B,oBAAoC;EAAE,OAAO,EN2gB1B,GAAO;;;AM1gB1B,gBAAgC;EAAE,OAAO,ENuc1B,GAAO;;;AMtctB,gBAAgC;EAAE,OAAO,ENyO1B,GAAO;;;AMxOtB,gBAAgC;EAAE,OAAO,EN6f1B,GAAO;;;AM5ftB,oBAAoC;EAAE,OAAO,ENmT1B,GAAO;;;AMlT1B,2BAA2C;EAAE,OAAO,ENoT1B,GAAO;;;AMnTjC,6BAA6C;EAAE,OAAO,ENgI1B,GAAO;;;AM/HnC,sBAAsC;EAAE,OAAO,EN4H1B,GAAO;;;AM3H5B,gBAAgC;EAAE,OAAO,ENqQ1B,GAAO;;;AMpQtB,0EAAqC;EAAE,OAAO,ENpF1B,GAAO;;;AMqF3B,mBAAmC;EAAE,OAAO,EN9E1B,GAAO;;;AM+EzB,qBAAqC;EAAE,OAAO,ENrF1B,GAAO;;;AMsF3B,sBAAsC;EAAE,OAAO,ENrF1B,GAAO;;;AMsF5B,kBAAkC;EAAE,OAAO,ENhC1B,GAAO;;;AMiCxB;eAC+B;EAAE,OAAO,EN0Y1B,GAAO;;;AMzYrB;oBACoC;EAAE,OAAO,EN8Y1B,GAAO;;;AM7Y1B;mBACmC;EAAE,OAAO,EN2Y1B,GAAO;;;AM1YzB,mBAAmC;EAAE,OAAO,ENU1B,GAAO;;;AMTzB,mBAAmC;EAAE,OAAO,ENuM1B,GAAO;;;AMtMzB;eAC+B;EAAE,OAAO,ENqf1B,GAAO;;;AMpfrB;gBACgC;EAAE,OAAO,ENoF1B,GAAO;;;AMnFtB;qBACqC;EAAE,OAAO,EN+a1B,GAAO;;;AM9a3B,oBAAoC;EAAE,OAAO,EN7C1B,GAAO;;;AM8C1B,qBAAqC;EAAE,OAAO,EN1C1B,GAAO;;;AM2C3B;eAC+B;EAAE,OAAO,ENpI1B,GAAO;;;AMqIrB,kBAAkC;EAAE,OAAO,EN6W1B,GAAO;;;AM5WxB,mBAAmC;EAAE,OAAO,ENye1B,GAAO;;;AMxezB;oBACoC;EAAE,OAAO,ENrE1B,GAAO;;;AMsE1B,sBAAsC;EAAE,OAAO,ENqL1B,GAAO;;;AMpL5B,mBAAmC;EAAE,OAAO,ENG1B,GAAO;;;AMFzB,yBAAyC;EAAE,OAAO,ENnE1B,GAAO;;;AMoE/B,uBAAuC;EAAE,OAAO,ENnE1B,GAAO;;;AMoE7B,kBAAkC;EAAE,OAAO,ENif1B,GAAO;;;AMhfxB,sBAAsC;EAAE,OAAO,EN8Y1B,GAAO;;;AM7Y5B,mBAAmC;EAAE,OAAO,ENyZ1B,GAAO;;;AMxZzB,iBAAiC;EAAE,OAAO,EN9J1B,GAAO;;;AM+JvB,iBAAiC;EAAE,OAAO,ENlE1B,GAAO;;;AMmEvB,kBAAkC;EAAE,OAAO,EN1C1B,GAAO;;;AM2CxB,sBAAsC;EAAE,OAAO,EN8B1B,GAAO;;;AM7B5B,qBAAqC;EAAE,OAAO,EN1I1B,GAAO;;;AM2I3B,qBAAqC;EAAE,OAAO,ENsH1B,GAAO;;;AMrH3B,oBAAoC;EAAE,OAAO,ENrO1B,GAAO;;;AMsO1B,iBAAiC;EAAE,OAAO,EN4M1B,GAAO;;;AM3MvB,sBAAsC;EAAE,OAAO,ENU1B,GAAO;;;AMT5B,eAA+B;EAAE,OAAO,EN3K1B,GAAO;;;AM4KrB,mBAAmC;EAAE,OAAO,ENuF1B,GAAO;;;AMtFzB,sBAAsC;EAAE,OAAO,EN2Q1B,GAAO;;;AM1Q5B,4BAA4C;EAAE,OAAO,ENrO1B,GAAO;;;AMsOlC,6BAA6C;EAAE,OAAO,ENrO1B,GAAO;;;AMsOnC,0BAA0C;EAAE,OAAO,ENrO1B,GAAO;;;AMsOhC,4BAA4C;EAAE,OAAO,ENzO1B,GAAO;;;AM0OlC,qBAAqC;EAAE,OAAO,ENrO1B,GAAO;;;AMsO3B,sBAAsC;EAAE,OAAO,ENrO1B,GAAO;;;AMsO5B,mBAAmC;EAAE,OAAO,ENrO1B,GAAO;;;AMsOzB,qBAAqC;EAAE,OAAO,ENzO1B,GAAO;;;AM0O3B,kBAAkC;EAAE,OAAO,ENpD1B,GAAO;;;AMqDxB,iBAAiC;EAAE,OAAO,EN4I1B,GAAO;;;AM3IvB,iBAAiC;EAAE,OAAO,ENwY1B,GAAO;;;AMvYvB;iBACiC;EAAE,OAAO,ENuM1B,GAAO;;;AMtMvB,mBAAmC;EAAE,OAAO,ENzG1B,GAAO;;;AM0GzB,qBAAqC;EAAE,OAAO,ENyQ1B,GAAO;;;AMxQ3B,sBAAsC;EAAE,OAAO,ENyQ1B,GAAO;;;AMxQ5B,kBAAkC;EAAE,OAAO,EN+V1B,GAAO;;;AM9VxB,iBAAiC;EAAE,OAAO,EN9G1B,GAAO;;;AM+GvB;gBACgC;EAAE,OAAO,ENoR1B,GAAO;;;AMnRtB,qBAAqC;EAAE,OAAO,EN+C1B,GAAO;;;AM9C3B,mBAAmC;EAAE,OAAO,ENmB1B,GAAO;;;AMlBzB,wBAAwC;EAAE,OAAO,ENoB1B,GAAO;;;AMnB9B,kBAAkC;EAAE,OAAO,ENqU1B,GAAO;;;AMpUxB,kBAAkC;EAAE,OAAO,EN2B1B,GAAO;;;AM1BxB,gBAAgC;EAAE,OAAO,ENgL1B,GAAO;;;AM/KtB,kBAAkC;EAAE,OAAO,EN2B1B,GAAO;;;AM1BxB,qBAAqC;EAAE,OAAO,ENuH1B,GAAO;;;AMtH3B,iBAAiC;EAAE,OAAO,ENM1B,GAAO;;;AMLvB,yBAAyC;EAAE,OAAO,ENI1B,GAAO;;;AMH/B,mBAAmC;EAAE,OAAO,EN6X1B,GAAO;;;AM5XzB,eAA+B;EAAE,OAAO,ENhH1B,GAAO;;;AMiHrB;oBACoC;EAAE,OAAO,ENuQ1B,GAAO;;;AMtQ1B;;sBAEsC;EAAE,OAAO,ENsV1B,GAAO;;;AMrV5B,yBAAyC;EAAE,OAAO,ENwI1B,GAAO;;;AMvI/B,eAA+B;EAAE,OAAO,ENhG1B,GAAO;;;AMiGrB,oBAAoC;EAAE,OAAO,ENvH1B,GAAO;;;AMwH1B;uBACuC;EAAE,OAAO,ENtJ1B,GAAO;;;AMuJ7B,mBAAmC;EAAE,OAAO,ENyO1B,GAAO;;;AMxOzB,eAA+B;EAAE,OAAO,EN0F1B,GAAO;;;AMzFrB,sBAAsC;EAAE,OAAO,EN1D1B,GAAO;;;AM2D5B,sBAAsC;EAAE,OAAO,ENkW1B,GAAO;;;AMjW5B,oBAAoC;EAAE,OAAO,EN4V1B,GAAO;;;AM3V1B,iBAAiC;EAAE,OAAO,ENlE1B,GAAO;;;AMmEvB,uBAAuC;EAAE,OAAO,ENgO1B,GAAO;;;AM/N7B,qBAAqC;EAAE,OAAO,EN2J1B,GAAO;;;AM1J3B,2BAA2C;EAAE,OAAO,EN2J1B,GAAO;;;AM1JjC,iBAAiC;EAAE,OAAO,ENsR1B,GAAO;;;AMrRvB,qBAAqC;EAAE,OAAO,EN5L1B,GAAO;;;AM6L3B,4BAA4C;EAAE,OAAO,ENxB1B,GAAO;;;AMyBlC,iBAAiC;EAAE,OAAO,ENuP1B,GAAO;;;AMtPvB,iBAAiC;EAAE,OAAO,EN6I1B,GAAO;;;AM5IvB,8BAA8C;EAAE,OAAO,EN9J1B,GAAO;;;AM+JpC,+BAA+C;EAAE,OAAO,EN9J1B,GAAO;;;AM+JrC,4BAA4C;EAAE,OAAO,EN9J1B,GAAO;;;AM+JlC,8BAA8C;EAAE,OAAO,ENlK1B,GAAO;;;AMmKpC,gBAAgC;EAAE,OAAO,EN8D1B,GAAO;;;AM7DtB,eAA+B;EAAE,OAAO,ENrH1B,GAAO;;;AMsHrB,iBAAiC;EAAE,OAAO,ENvS1B,GAAO;;;AMwSvB,qBAAqC;EAAE,OAAO,EN2Z1B,GAAO;;;AM1Z3B,mBAAmC;EAAE,OAAO,ENhN1B,GAAO;;;AMiNzB,qBAAqC;EAAE,OAAO,EN7F1B,GAAO;;;AM8F3B,qBAAqC;EAAE,OAAO,EN7F1B,GAAO;;;AM8F3B,qBAAqC;EAAE,OAAO,EN+O1B,GAAO;;;AM9O3B,sBAAsC;EAAE,OAAO,ENiM1B,GAAO;;;AMhM5B,iBAAiC;EAAE,OAAO,EN6W1B,GAAO;;;AM5WvB,uBAAuC;EAAE,OAAO,EN0I1B,GAAO;;;AMzI7B,4IAAyC;EAAE,OAAO,EN0I1B,GAAO;;;AMzI/B,mBAAmC;EAAE,OAAO,ENqF1B,GAAO;;;AMpFzB,qBAAqC;EAAE,OAAO,ENmF1B,GAAO;;;AMlF3B,uBAAuC;EAAE,OAAO,ENnL1B,GAAO;;;AMoL7B,wBAAwC;EAAE,OAAO,EN0K1B,GAAO;;;AMzK9B,+BAA+C;EAAE,OAAO,ENpF1B,GAAO;;;AMqFrC,uBAAuC;EAAE,OAAO,ENwP1B,GAAO;;;AMvP7B,kBAAkC;EAAE,OAAO,ENjJ1B,GAAO;;;AMkJxB;8BAC8C;EAAE,OAAO,EN/M1B,GAAO;;;AMgNpC;4BAC4C;EAAE,OAAO,EN9M1B,GAAO;;;AM+MlC;+BAC+C;EAAE,OAAO,ENjN1B,GAAO;;;AMkNrC;cAC8B;EAAE,OAAO,ENvG1B,GAAO;;;AMwGpB,cAA8B;EAAE,OAAO,ENhC1B,GAAO;;;AMiCpB;cAC8B;EAAE,OAAO,ENqY1B,GAAO;;;AMpYpB;cAC8B;EAAE,OAAO,EN4C1B,GAAO;;;AM3CpB;;;cAG8B;EAAE,OAAO,ENgD1B,GAAO;;;AM/CpB;;cAE8B;EAAE,OAAO,ENiN1B,GAAO;;;AMhNpB;cAC8B;EAAE,OAAO,EN+C1B,GAAO;;;AM9CpB;cAC8B;EAAE,OAAO,EN3P1B,GAAO;;;AM4PpB,eAA+B;EAAE,OAAO,ENhG1B,GAAO;;;AMiGrB,oBAAoC;EAAE,OAAO,ENpF1B,GAAO;;;AMqF1B,yBAAyC;EAAE,OAAO,EN0P1B,GAAO;;;AMzP/B,0BAA0C;EAAE,OAAO,EN0P1B,GAAO;;;AMzPhC,0BAA0C;EAAE,OAAO,EN0P1B,GAAO;;;AMzPhC,2BAA2C;EAAE,OAAO,EN0P1B,GAAO;;;AMzPjC,2BAA2C;EAAE,OAAO,EN6P1B,GAAO;;;AM5PjC,4BAA4C;EAAE,OAAO,EN6P1B,GAAO;;;AM5PlC,oBAAoC;EAAE,OAAO,ENkU1B,GAAO;;;AMjU1B,sBAAsC;EAAE,OAAO,EN8T1B,GAAO;;;AM7T5B,yBAAyC;EAAE,OAAO,ENya1B,GAAO;;;AMxa/B,kBAAkC;EAAE,OAAO,ENsa1B,GAAO;;;AMraxB,eAA+B;EAAE,OAAO,EN2Z1B,GAAO;;;AM1ZrB,sBAAsC;EAAE,OAAO,EN2Z1B,GAAO;;;AM1Z5B,uBAAuC;EAAE,OAAO,ENoa1B,GAAO;;;AMna7B,kBAAkC;EAAE,OAAO,ENxJ1B,GAAO;;;AMyJxB,yBAAyC;EAAE,OAAO,EN8P1B,GAAO;;;AM7P/B,oBAAoC;EAAE,OAAO,ENgB1B,GAAO;;;AMf1B,iBAAiC;EAAE,OAAO,ENpF1B,GAAO;;;AMqFvB,cAA8B;EAAE,OAAO,EN3W1B,GAAO;;;AM4WpB,4CAAoC;EAAE,OAAO,EN/R1B,GAAO;;;AMgS1B,2BAA2C;EAAE,OAAO,EN/R1B,GAAO;;;AMgSjC,iBAAiC;EAAE,OAAO,EN+U1B,GAAO;;;AM9UvB,wBAAwC;EAAE,OAAO,EN+U1B,GAAO;;;AM9U9B,0BAA0C;EAAE,OAAO,ENgD1B,GAAO;;;AM/ChC,wBAAwC;EAAE,OAAO,ENkD1B,GAAO;;;AMjD9B,0BAA0C;EAAE,OAAO,EN+C1B,GAAO;;;AM9ChC,2BAA2C;EAAE,OAAO,EN+C1B,GAAO;;;AM9CjC,gBAAgC;EAAE,OAAO,ENjW1B,GAAO;;;AMkWtB,kBAAkC;EAAE,OAAO,ENmY1B,GAAO;;;AMlYxB,kBAAkC;EAAE,OAAO,EN7W1B,GAAO;;;AM8WxB,gBAAgC;EAAE,OAAO,ENkC1B,GAAO;;;AMjCtB,mBAAmC;EAAE,OAAO,EN5K1B,GAAO;;;AM6KzB,gBAAgC;EAAE,OAAO,ENgN1B,GAAO;;;AM/MtB,qBAAqC;EAAE,OAAO,ENxF1B,GAAO;;;AMyF3B,iBAAiC;EAAE,OAAO,EN4T1B,GAAO;;;AM3TvB,iBAAiC;EAAE,OAAO,ENtI1B,GAAO;;;AMuIvB,eAA+B;EAAE,OAAO,EN6C1B,GAAO;;;AM5CrB;mBACmC;EAAE,OAAO,EN5D1B,GAAO;;;AM6DzB,gBAAgC;EAAE,OAAO,EN8P1B,GAAO;;;AM7PtB,iBAAiC;EAAE,OAAO,ENuE1B,GAAO;;;AMtEvB,kBAAkC;EAAE,OAAO,EN9W1B,GAAO;;;AM+WxB,cAA8B;EAAE,OAAO,ENtS1B,GAAO;;;AMuSpB,aAA6B;EAAE,OAAO,ENiW1B,GAAO;;;AMhWnB,gBAAgC;EAAE,OAAO,ENuW1B,GAAO;;;AMtWtB,iBAAiC;EAAE,OAAO,EN+I1B,GAAO;;;AM9IvB,oBAAoC;EAAE,OAAO,ENkF1B,GAAO;;;AMjF1B,yBAAyC;EAAE,OAAO,EN6N1B,GAAO;;;AM5N/B,+BAA+C;EAAE,OAAO,EN/W1B,GAAO;;;AMgXrC,8BAA8C;EAAE,OAAO,ENjX1B,GAAO;;;AMkXpC;8BAC8C;EAAE,OAAO,ENzR1B,GAAO;;;AM0RpC,uBAAuC;EAAE,OAAO,ENnM1B,GAAO;;;AMoM7B,qBAAqC;EAAE,OAAO,ENiW1B,GAAO;;;AMhW3B,uBAAuC;EAAE,OAAO,ENoV1B,GAAO;;;AMnV7B;cAC8B;EAAE,OAAO,EN0S1B,GAAO;;;AMzSpB,yEAAwC;EAAE,OAAO,EN0G1B,GAAO;;;AMzG9B,wBAAwC;EAAE,OAAO,EN4M1B,GAAO;;;AM3M9B,gBAAgC;EAAE,OAAO,ENsL1B,GAAO;;;AMrLtB,0BAA0C;EAAE,OAAO,ENzL1B,GAAO;;;AM0LhC,oBAAoC;EAAE,OAAO,ENoW1B,GAAO;;;AMnW1B,iBAAiC;EAAE,OAAO,EN8D1B,GAAO;;;AM7DvB;;qBAEqC;EAAE,OAAO,EN8S1B,GAAO;;;AM7S3B;yBACyC;EAAE,OAAO,EN1F1B,GAAO;;;AM2F/B,gBAAgC;EAAE,OAAO,ENsW1B,GAAO;;;AMrWtB,iBAAiC;EAAE,OAAO,ENlG1B,GAAO;;;AMmGvB,iBAAiC;EAAE,OAAO,ENgH1B,GAAO;;;AM/GvB,wBAAwC;EAAE,OAAO,ENiH1B,GAAO;;;AMhH9B,6BAA6C;EAAE,OAAO,ENyN1B,GAAO;;;AMxNnC,sBAAsC;EAAE,OAAO,ENuN1B,GAAO;;;AMtN5B,oBAAoC;EAAE,OAAO,EN/N1B,GAAO;;;AMgO1B,eAA+B;EAAE,OAAO,EN5N1B,GAAO;;;AM6NrB,wBAAwC;EAAE,OAAO,EN2E1B,GAAO;;;AM1E9B,yBAAyC;EAAE,OAAO,ENyE1B,GAAO;;;AMxE/B,iBAAiC;EAAE,OAAO,ENvN1B,GAAO;;;AMwNvB,iBAAiC;EAAE,OAAO,ENzC1B,GAAO;;;AM0CvB,mBAAmC;EAAE,OAAO,ENpC1B,GAAO;;;AMqCzB,cAA8B;EAAE,OAAO,ENtL1B,GAAO;;;AMuLpB,mBAAmC;EAAE,OAAO,EN7U1B,GAAO;;;AM8UzB,gBAAgC;EAAE,OAAO,EN1R1B,GAAO;;;AM2RtB,cAA8B;EAAE,OAAO,ENsD1B,GAAO;;;AMrDpB,gBAAgC;EAAE,OAAO,ENmL1B,GAAO;;;AMlLtB,eAA+B;EAAE,OAAO,ENrP1B,GAAO;;;AMsPrB,gBAAgC;EAAE,OAAO,ENrP1B,GAAO;;;AMsPtB,kBAAkC;EAAE,OAAO,EN7W1B,GAAO;;;AM8WxB,yBAAyC;EAAE,OAAO,EN7W1B,GAAO;;;AM8W/B,gBAAgC;EAAE,OAAO,EN0L1B,GAAO;;;AMzLtB,uBAAuC;EAAE,OAAO,EN0L1B,GAAO;;;AMzL7B,kBAAkC;EAAE,OAAO,ENyF1B,GAAO;;;AMxFxB;cAC8B;EAAE,OAAO,ENzU1B,GAAO;;;AM0UpB;eAC+B;EAAE,OAAO,EN+M1B,GAAO;;;AM9MrB,eAA+B;EAAE,OAAO,EN4P1B,GAAO;;;AM3PrB,kBAAkC;EAAE,OAAO,ENuK1B,GAAO;;;AMtKxB,qBAAqC;EAAE,OAAO,ENtP1B,GAAO;;;AMuP3B,qBAAqC;EAAE,OAAO,ENiK1B,GAAO;;;AMhK3B,mBAAmC;EAAE,OAAO,EN9P1B,GAAO;;;AM+PzB,qBAAqC;EAAE,OAAO,EN/L1B,GAAO;;;AMgM3B,sBAAsC;EAAE,OAAO,ENxL1B,GAAO;;;AMyL5B,uBAAuC;EAAE,OAAO,ENrM1B,GAAO;;;AMsM7B,4BAA4C;EAAE,OAAO,EN/L1B,GAAO;;;AMgMlC;;uBAEuC;EAAE,OAAO,ENxM1B,GAAO;;;AMyM7B;yBACyC;EAAE,OAAO,EN9M1B,GAAO;;;AM+M/B;uBACuC;EAAE,OAAO,EN/M1B,GAAO;;;AMgN7B;uBACuC;EAAE,OAAO,ENpM1B,GAAO;;;AMqM7B,sBAAsC;EAAE,OAAO,ENjN1B,GAAO;;;AMkN5B,eAA+B;EAAE,OAAO,ENuR1B,GAAO;;;AMtRrB,kBAAkC;EAAE,OAAO,EN5S1B,GAAO;;;AM6SxB,mBAAmC;EAAE,OAAO,EN9E1B,GAAO;;;AM+EzB;;;;oBAIoC;EAAE,OAAO,ENnE1B,GAAO;;;AMoE1B,yBAAyC;EAAE,OAAO,EN/T1B,GAAO;;;AMgU/B;;gBAEgC;EAAE,OAAO,ENqD1B,GAAO;;;AMpDtB;iBACiC;EAAE,OAAO,ENnQ1B,GAAO;;;AMoQvB,qBAAqC;EAAE,OAAO,ENzK1B,GAAO;;;AM0K3B,cAA8B;EAAE,OAAO,EN3K1B,GAAO;;;AM4KpB;;sBAEsC;EAAE,OAAO,ENxJ1B,GAAO;;;AMyJ5B,wBAAwC;EAAE,OAAO,EN2K1B,GAAO;;;AM1K9B,aAA6B;EAAE,OAAO,ENiC1B,GAAO;;;AMhCnB;iBACiC;EAAE,OAAO,EN0Q1B,GAAO;;;AMzQvB;sBACsC;EAAE,OAAO,ENV1B,GAAO;;;AMW5B;wBACwC;EAAE,OAAO,ENX1B,GAAO;;;AMY9B,kBAAkC;EAAE,OAAO,EN1I1B,GAAO;;;AM2IxB,sBAAsC;EAAE,OAAO,ENlV1B,GAAO;;;AMmV5B,iBAAiC;EAAE,OAAO,ENjJ1B,GAAO;;;AMkJvB,oBAAoC;EAAE,OAAO,ENb1B,GAAO;;;AMc1B,kBAAkC;EAAE,OAAO,EN+F1B,GAAO;;;AM9FxB,oBAAoC;EAAE,OAAO,ENuE1B,GAAO;;;AMtE1B,2BAA2C;EAAE,OAAO,ENuE1B,GAAO;;;AMtEjC,eAA+B;EAAE,OAAO,ENzZ1B,GAAO;;;AM0ZrB;mBACmC;EAAE,OAAO,EN5M1B,GAAO;;;AM6MzB,cAA8B;EAAE,OAAO,EN0M1B,GAAO;;;AMzMpB,qBAAqC;EAAE,OAAO,ENxa1B,GAAO;;;AMya3B,eAA+B;EAAE,OAAO,ENI1B,GAAO;;;AMHrB,qBAAqC;EAAE,OAAO,ENuF1B,GAAO;;;AMtF3B,iBAAiC;EAAE,OAAO,EN2M1B,GAAO;;;AM1MvB,eAA+B;EAAE,OAAO,EN+Q1B,GAAO;;;AM9QrB,sBAAsC;EAAE,OAAO,ENzC1B,GAAO;;;AM0C5B,eAA+B;EAAE,OAAO,ENwP1B,GAAO;;;AMvPrB,qBAAqC;EAAE,OAAO,ENrZ1B,GAAO;;;AMsZ3B,iBAAiC;EAAE,OAAO,ENvB1B,GAAO;;;AMwBvB,wBAAwC;EAAE,OAAO,EN3L1B,GAAO;;;AM4L9B,kBAAkC;EAAE,OAAO,EN5X1B,GAAO;;;AM6XxB,wBAAwC;EAAE,OAAO,ENhY1B,GAAO;;;AMiY9B,sBAAsC;EAAE,OAAO,ENnY1B,GAAO;;;AMoY5B,kBAAkC;EAAE,OAAO,ENtY1B,GAAO;;;AMuYxB,oBAAoC;EAAE,OAAO,ENlY1B,GAAO;;;AMmY1B,oBAAoC;EAAE,OAAO,ENlY1B,GAAO;;;AMmY1B,qBAAqC;EAAE,OAAO,EN3b1B,GAAO;;;AM4b3B,uBAAuC;EAAE,OAAO,EN3b1B,GAAO;;;AM4b7B,gBAAgC;EAAE,OAAO,EN+K1B,GAAO;;;AM9KtB,oBAAoC;EAAE,OAAO,ENnV1B,GAAO;;;AMoV1B,aAA6B;EAAE,OAAO,EN9d1B,GAAO;;;AM+dnB,qBAAqC;EAAE,OAAO,EN5R1B,GAAO;;;AM6R3B,sBAAsC;EAAE,OAAO,EN/C1B,GAAO;;;AMgD5B,wBAAwC;EAAE,OAAO,EN9b1B,GAAO;;;AM+b9B,qBAAqC;EAAE,OAAO,ENtf1B,GAAO;;;AMuf3B,oBAAoC;EAAE,OAAO,EN/B1B,GAAO;;;AMgC1B,qBAAqC;EAAE,OAAO,ENzH1B,GAAO;;;AM0H3B,iBAAiC;EAAE,OAAO,ENvI1B,GAAO;;;AMwIvB,wBAAwC;EAAE,OAAO,ENvI1B,GAAO;;;AMwI9B,qBAAqC;EAAE,OAAO,EN4J1B,GAAO;;;AM3J3B,oBAAoC;EAAE,OAAO,EN4J1B,GAAO;;;AM3J1B,kBAAkC;EAAE,OAAO,ENxc1B,GAAO;;;AMycxB,cAA8B;EAAE,OAAO,ENjb1B,GAAO;;;AMkbpB,kBAAkC;EAAE,OAAO,ENvJ1B,GAAO;;;AMwJxB,oBAAoC;EAAE,OAAO,EN3gB1B,GAAO;;;AM4gB1B,aAA6B;EAAE,OAAO,EN7Z1B,GAAO;;;AM8ZnB;;cAE8B;EAAE,OAAO,ENzK1B,GAAO;;;AM0KpB,mBAAmC;EAAE,OAAO,ENpG1B,GAAO;;;AMqGzB,qBAAqC;EAAE,OAAO,ENxb1B,GAAO;;;AMyb3B,yBAAyC;EAAE,OAAO,EN5W1B,GAAO;;;AM6W/B,mBAAmC;EAAE,OAAO,EN9V1B,GAAO;;;AM+VzB,mBAAmC;EAAE,OAAO,EN9P1B,GAAO;;;AM+PzB,kBAAkC;EAAE,OAAO,ENrJ1B,GAAO;;;AMsJxB,iBAAiC;EAAE,OAAO,ENe1B,GAAO;;;AMdvB,uBAAuC;EAAE,OAAO,EN2B1B,GAAO;;;AM1B7B,sBAAsC;EAAE,OAAO,ENoC1B,GAAO;;;AMnC5B,mBAAmC;EAAE,OAAO,ENqC1B,GAAO;;;AMpCzB,oBAAoC;EAAE,OAAO,EN5a1B,GAAO;;;AM6a1B,0BAA0C;EAAE,OAAO,EN9a1B,GAAO;;;AM+ahC,kBAAkC;EAAE,OAAO,EN/V1B,GAAO;;;AMgWxB,eAA+B;EAAE,OAAO,ENoB1B,GAAO;;;AMnBrB,sBAAsC;EAAE,OAAO,EN8K1B,GAAO;;;AM7K5B,qBAAqC;EAAE,OAAO,EN/F1B,GAAO;;;AMgG3B,sBAAsC;EAAE,OAAO,EN6E1B,GAAO;;;AM5E5B,oBAAoC;EAAE,OAAO,EN9M1B,GAAO;;;AM+M1B,gBAAgC;EAAE,OAAO,EN+K1B,GAAO;;;AM9KtB,eAA+B;EAAE,OAAO,EN7H1B,GAAO;;;AM8HrB,kBAAkC;EAAE,OAAO,ENnH1B,GAAO;;;AMoHxB;sBACsC;EAAE,OAAO,ENkI1B,GAAO;;;AMjI5B,0BAA0C;EAAE,OAAO,ENkI1B,GAAO;;;AMjIhC,uBAAuC;EAAE,OAAO,EN0K1B,GAAO;;;AMzK7B,sBAAsC;EAAE,OAAO,ENlI1B,GAAO;;;AMmI5B,qBAAqC;EAAE,OAAO,ENyK1B,GAAO;;;AMxK3B,sBAAsC;EAAE,OAAO,ENnI1B,GAAO;;;AMoI5B,wBAAwC;EAAE,OAAO,ENlI1B,GAAO;;;AMmI9B,wBAAwC;EAAE,OAAO,ENpI1B,GAAO;;;AMqI9B,iBAAiC;EAAE,OAAO,EN1G1B,GAAO;;;AM2GvB,qBAAqC;EAAE,OAAO,EN7Q1B,GAAO;;;AM8Q3B,4BAA4C;EAAE,OAAO,EN1U1B,GAAO;;;AM2UlC,sBAAsC;EAAE,OAAO,ENzE1B,GAAO;;;AM0E5B,mBAAmC;EAAE,OAAO,ENkL1B,GAAO;;;AMjLzB,iBAAiC;EAAE,OAAO,ENX1B,GAAO;;;AMYvB,oBAAoC;EAAE,OAAO,ENuJ1B,GAAO;;;AMtJ1B,qBAAqC;EAAE,OAAO,ENwJ1B,GAAO;;;AMvJ3B;cAC8B;EAAE,OAAO,EN/f1B,GAAO;;;AMggBpB,kBAAkC;EAAE,OAAO,EN4J1B,GAAO;;;AM3JxB,gBAAgC;EAAE,OAAO,EN8G1B,GAAO;;;AM7GtB,iBAAiC;EAAE,OAAO,ENwD1B,GAAO;;;AMvDvB,iBAAiC;EAAE,OAAO,EN9I1B,GAAO;;;AM+IvB;uBACuC;EAAE,OAAO,EN0L1B,GAAO;;;AMzL7B,wBAAwC;EAAE,OAAO,ENjH1B,GAAO;;;AMkH9B,mBAAmC;EAAE,OAAO,ENrH1B,GAAO;;;AMsHzB,uBAAuC;EAAE,OAAO,ENnW1B,GAAO;;;AMoW7B;;uBAEuC;EAAE,OAAO,EN/gB1B,GAAO;;;AMghB7B;iCACiD;EAAE,OAAO,EN9gB1B,GAAO;;;AM+gBvC;uBACuC;EAAE,OAAO,ENlhB1B,GAAO;;;AMmhB7B;0BAC0C;EAAE,OAAO,ENnhB1B,GAAO;;;AMohBhC;wBACwC;EAAE,OAAO,ENxhB1B,GAAO;;;AMyhB9B,wBAAwC;EAAE,OAAO,EN3I1B,GAAO;;;AM4I9B,mBAAmC;EAAE,OAAO,EN3O1B,GAAO;;;AM4OzB,uBAAuC;EAAE,OAAO,ENxI1B,GAAO;;;AMyI7B,yBAAyC;EAAE,OAAO,ENxI1B,GAAO;;;AMyI/B,sBAAsC;EAAE,OAAO,ENwB1B,GAAO;;;AMvB5B,wBAAwC;EAAE,OAAO,ENwB1B,GAAO;;;AMvB9B,iBAAiC;EAAE,OAAO,EN/d1B,GAAO;;;AMgevB,yBAAyC;EAAE,OAAO,ENle1B,GAAO;;;AMme/B,gBAAgC;EAAE,OAAO,ENpc1B,GAAO;;;AMqctB,wBAAwC;EAAE,OAAO,ENljB1B,GAAO;;;AMmjB9B,sBAAsC;EAAE,OAAO,ENxP1B,GAAO;;;AMyP5B;0BAC0C;EAAE,OAAO,ENzP1B,GAAO;;;AM0PhC;yBACyC;EAAE,OAAO,EN7P1B,GAAO;;;AM8P/B;wBACwC;EAAE,OAAO,ENhQ1B,GAAO;;;AMiQ9B,oBAAoC;EAAE,OAAO,ENrQ1B,GAAO;;;AMsQ1B;sBACsC;EAAE,OAAO,ENxR1B,GAAO;;;AMyR5B;uBACuC;EAAE,OAAO,EN7R1B,GAAO;;;AM8R7B,0BAA0C;EAAE,OAAO,EN1R1B,GAAO;;;AM2RhC,wBAAwC;EAAE,OAAO,ENpS1B,GAAO;;;AMqS9B,uBAAuC;EAAE,OAAO,EN3R1B,GAAO;;;AM4R7B,yBAAyC;EAAE,OAAO,EN/R1B,GAAO;;;AMgS/B,uBAAuC;EAAE,OAAO,ENjS1B,GAAO;;;AMkS7B,oBAAoC;EAAE,OAAO,EN+D1B,GAAO;;;AM9D1B,qBAAqC;EAAE,OAAO,EN/F1B,GAAO;;;AMgG3B,2BAA2C;EAAE,OAAO,EN/b1B,GAAO;;;AMgcjC,aAA6B;EAAE,OAAO,ENtU1B,GAAO;;;AMuUnB,oBAAoC;EAAE,OAAO,ENtU1B,GAAO;;;AMuU1B,sBAAsC;EAAE,OAAO,ENkE1B,GAAO;;;AMjE5B,wBAAwC;EAAE,OAAO,ENrK1B,GAAO;;;AMsK9B,+BAA+C;EAAE,OAAO,ENrK1B,GAAO;;;AMsKrC,qBAAqC;EAAE,OAAO,EN5U1B,GAAO;;;AM6U3B,sBAAsC;EAAE,OAAO,ENwH1B,GAAO;;;AMvH5B,iBAAiC;EAAE,OAAO,ENnF1B,GAAO;;;AMoFvB,iBAAiC;EAAE,OAAO,ENze1B,GAAO;;;AM0evB,kBAAkC;EAAE,OAAO,EN9W1B,GAAO;;;AM+WxB,gBAAgC;EAAE,OAAO,ENxK1B,GAAO;;;AMyKtB,4BAA4C;EAAE,OAAO,ENpQ1B,GAAO;;;AMqQlC;qBACqC;EAAE,OAAO,ENS1B,GAAO;;;AMR3B,iBAAiC;EAAE,OAAO,ENjd1B,GAAO;;;AMkdvB,gBAAgC;EAAE,OAAO,ENzoB1B,GAAO;;;AM0oBtB,iBAAiC;EAAE,OAAO,EN/nB1B,GAAO;;;AMgoBvB,0BAA0C;EAAE,OAAO,EN3hB1B,GAAO;;;AM4hBhC,2BAA2C;EAAE,OAAO,EN9hB1B,GAAO;;;AM+hBjC,2BAA2C;EAAE,OAAO,EN5hB1B,GAAO;;;AM6hBjC,2BAA2C;EAAE,OAAO,ENjiB1B,GAAO;;;AMkiBjC,mBAAmC;EAAE,OAAO,ENpR1B,GAAO;;;AMqRzB,kBAAkC;EAAE,OAAO,EN5N1B,GAAO;;;AM6NxB,oBAAoC;EAAE,OAAO,EN5N1B,GAAO;;;AM6N1B,gBAAgC;EAAE,OAAO,EN/N1B,GAAO;;;AMgOtB,cAA8B;EAAE,OAAO,ENlO1B,GAAO;;;AMmOpB,qBAAqC;EAAE,OAAO,ENpe1B,GAAO;;;AMqe3B,uBAAuC;EAAE,OAAO,ENpe1B,GAAO;;;AMqe7B,gBAAgC;EAAE,OAAO,ENtS1B,GAAO;;;AMuStB,gBAAgC;EAAE,OAAO,ENiF1B,GAAO;;;AMhFtB,oBAAoC;EAAE,OAAO,ENlkB1B,GAAO;;;AMmkB1B,oBAAoC;EAAE,OAAO,ENrX1B,GAAO;;;AMsX1B,uBAAuC;EAAE,OAAO,ENpI1B,GAAO;;;AMqI7B,eAA+B;EAAE,OAAO,ENpc1B,GAAO;;;AMqcrB,0BAA0C;EAAE,OAAO,ENhe1B,GAAO;;;AMiehC,mBAAmC;EAAE,OAAO,ENpf1B,GAAO;;;AMqfzB,eAA+B;EAAE,OAAO,ENlN1B,GAAO;;;AMmNrB,uBAAuC;EAAE,OAAO,EN1X1B,GAAO;;;AM2X7B,cAA8B;EAAE,OAAO,ENoD1B,GAAO;;;AMnDpB,uBAAuC;EAAE,OAAO,EN3J1B,GAAO;;;AM4J7B,mBAAmC;EAAE,OAAO,ENzN1B,GAAO;;;AM0NzB,iBAAiC;EAAE,OAAO,ENlH1B,GAAO;;;AMmHvB,uBAAuC;EAAE,OAAO,EN7L1B,GAAO;;;AM8L7B,yBAAyC;EAAE,OAAO,EN7L1B,GAAO;;;AM8L/B,sBAAsC;EAAE,OAAO,EN3C1B,GAAO;;;AM4C5B,wBAAwC;EAAE,OAAO,EN3C1B,GAAO;;;AM4C9B,uBAAuC;EAAE,OAAO,ENrG1B,GAAO;;;AMsG7B,0BAA0C;EAAE,OAAO,ENrG1B,GAAO;;;AMsGhC,kBAAkC;EAAE,OAAO,EN7U1B,GAAO;;;AM8UxB,oBAAoC;EAAE,OAAO,ENnlB1B,GAAO;;;AMolB1B,sBAAsC;EAAE,OAAO,ENnlB1B,GAAO;;;AMolB5B,kBAAkC;EAAE,OAAO,EN/L1B,GAAO;;;AMgMxB,sCAAiC;EAAE,OAAO,ENlX1B,GAAO;;;AMmXvB,qBAAqC;EAAE,OAAO,ENkF1B,GAAO;;;AMjF3B,kBAAkC;EAAE,OAAO,ENmF1B,GAAO;;;AMlFxB,iBAAiC;EAAE,OAAO,EN9c1B,GAAO;;;AM+cvB,2BAA2C;EAAE,OAAO,EN2B1B,GAAO;;;AM1BjC,yBAAyC;EAAE,OAAO,ENmE1B,GAAO;;;AMlE/B,4BAA4C;EAAE,OAAO,ENxK1B,GAAO;;;AMyKlC,gBAAgC;EAAE,OAAO,EN9lB1B,GAAO;;;AM+lBtB,4BAA4C;EAAE,OAAO,ENtoB1B,GAAO;;;AMuoBlC,+BAA+C;EAAE,OAAO,ENqD1B,GAAO;;;AMpDrC,kBAAkC;EAAE,OAAO,ENxlB1B,GAAO;;;AMylBxB,sCAAsD;EAAE,OAAO,EN5oB1B,GAAO;;;AM6oB5C;8CAC8D;EAAE,OAAO,EN9qB1B,GAAO;;;AM+qBpD;;eAE+B;EAAE,OAAO,ENvf1B,GAAO;;;AMwfrB,gBAAgC;EAAE,OAAO,ENhY1B,GAAO;;;AMiYtB,kBAAkC;EAAE,OAAO,ENhY1B,GAAO;;;AMiYxB;wBACwC;EAAE,OAAO,EN1H1B,GAAO;;;AM2H9B,qBAAqC;EAAE,OAAO,ENzR1B,GAAO;;;AM0R3B,iBAAiC;EAAE,OAAO,ENiC1B,GAAO;;;AMhCvB,wBAAwC;EAAE,OAAO,ENiC1B,GAAO;;;AMhC9B,mBAAmC;EAAE,OAAO,ENlH1B,GAAO;;;AMmHzB,yBAAyC;EAAE,OAAO,ENlH1B,GAAO;;;AMmH/B,0BAA0C;EAAE,OAAO,ENlH1B,GAAO;;;AMmHhC,qBAAqC;EAAE,OAAO,ENrN1B,GAAO;;;AMsN3B,sBAAsC;EAAE,OAAO,ENpb1B,GAAO;;;AMqb5B,gBAAgC;EAAE,OAAO,ENmE1B,GAAO;;;AMlEtB,oBAAoC;EAAE,OAAO,ENpD1B,GAAO;;;AMqD1B;+BAC+C;EAAE,OAAO,ENzY1B,GAAO;;;AM0YrC;uBACuC;EAAE,OAAO,EN7a1B,GAAO;;;AM8a7B,sBAAsC;EAAE,OAAO,ENtX1B,GAAO;;;AMuX5B,wBAAwC;EAAE,OAAO,ENlf1B,GAAO;;;AMmf9B,0BAA0C;EAAE,OAAO,ENlf1B,GAAO;;;AMmfhC,iBAAiC;EAAE,OAAO,ENtT1B,GAAO;;;AMuTvB,uBAAuC;EAAE,OAAO,ENptB1B,GAAO;;;AMqtB7B,yBAAyC;EAAE,OAAO,ENptB1B,GAAO;;;AMqtB/B;uBACuC;EAAE,OAAO,ENrtB1B,GAAO;;;AMstB7B;yBACyC;EAAE,OAAO,ENttB1B,GAAO;;;AMutB/B,sBAAsC;EAAE,OAAO,ENJ1B,GAAO;;;AMK5B,wBAAwC;EAAE,OAAO,ENJ1B,GAAO;;;AMK9B,iBAAiC;EAAE,OAAO,ENH1B,GAAO;;;AMIvB,mBAAmC;EAAE,OAAO,EN3W1B,GAAO;;;AM4WzB;kBACkC;EAAE,OAAO,EN5W1B,GAAO;;;AM6WxB;oBACoC;EAAE,OAAO,EN7W1B,GAAO;;;AM8W1B,gBAAgC;EAAE,OAAO,ENtN1B,GAAO;;;AMuNtB,yBAAyC;EAAE,OAAO,EN3b1B,GAAO;;;AM4b/B,mBAAmC;EAAE,OAAO,ENtF1B,GAAO;;;AMuFzB;;2BAE2C;EAAE,OAAO,ENxE1B,GAAO;;;AMyEjC;qCACqD;EAAE,OAAO,ENvE1B,GAAO;;;AMwE3C;2BAC2C;EAAE,OAAO,EN3E1B,GAAO;;;AM4EjC;8BAC8C;EAAE,OAAO,EN5E1B,GAAO;;;AM6EpC;4BAC4C;EAAE,OAAO,ENjF1B,GAAO;;;AMkFlC,iBAAiC;EAAE,OAAO,EN3K1B,GAAO;;;AM4KvB;;eAE+B;EAAE,OAAO,ENzrB1B,GAAO;;;AM0rBrB,kBAAkC;EAAE,OAAO,ENlP1B,GAAO;;;AMmPxB,0BAA0C;EAAE,OAAO,ENK1B,GAAO;;;AMJhC,0BAA0C;EAAE,OAAO,ENK1B,GAAO;;;AMJhC,yBAAyC;EAAE,OAAO,ENK1B,GAAO;;;AMJ/B;uBACuC;EAAE,OAAO,END1B,GAAO;;;AME7B;yBACyC;EAAE,OAAO,ENF1B,GAAO;;;AMG/B,mBAAmC;EAAE,OAAO,ENxsB1B,GAAO;;;AMysBzB,eAA+B;EAAE,OAAO,ENpb1B,GAAO;;;AMqbrB,eAA+B;EAAE,OAAO,EN1hB1B,GAAO;;;AM2hBrB,eAA+B;EAAE,OAAO,ENxY1B,GAAO;;;AMyYrB,kBAAkC;EAAE,OAAO,EN/O1B,GAAO;;;AMgPxB,kBAAkC;EAAE,OAAO,ENziB1B,GAAO;;;AM0iBxB,oBAAoC;EAAE,OAAO,ENjU1B,GAAO;;;AMkU1B,sBAAsC;EAAE,OAAO,EN7K1B,GAAO;;;AM8K5B,sBAAsC;EAAE,OAAO,ENhI1B,GAAO;;;AMiI5B,qBAAqC;EAAE,OAAO,ENJ1B,GAAO;;;AMK3B,iBAAiC;EAAE,OAAO,ENxU1B,GAAO;;;AOzcvB,QAAS;EH8BP,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,GAAG;EACV,MAAM,EAAE,GAAG;EACX,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,IAAI;EACZ,QAAQ,EAAE,MAAM;EAChB,IAAI,EAAE,gBAAa;EACnB,MAAM,EAAE,CAAC;;;AAUT,mDACQ;EACN,QAAQ,EAAE,MAAM;EAChB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,MAAM,EAAE,CAAC;EACT,QAAQ,EAAE,OAAO;EACjB,IAAI,EAAE,IAAI;;;AIvDd,4xBAAK;EACH,WAAW,EAAE,OAAO;;AACpB,+6BAAQ;EACN,WAAW,EC+BuB,aAAa;ED9B/C,OAAO,EAAE,YAAY;EACrB,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,MAAM;EACnB,WAAW,EAAE,CAAC;EACd,eAAe,EAAE,OAAO;;;AAM5B,28BAAkB;EAChB,OAAO,EAAE,YAAY;EACrB,eAAe,EAAE,OAAO;;;AAGxB,syEAAgB;EACd,OAAO,EAAE,MAAM;;AACf,8zEAAuB;EACrB,WAAW,EAAE,KAAI;;AACnB,0wEAAsB;EACpB,OAAO,EAAE,YAAY;;;AAE3B,wjBAA2B;EACzB,OAAO,EAAE,GAAE;EjBpBL,kBAAoB,EAAE,qBAAM;EAK5B,eAAiB,EAAE,qBAAM;EAezB,UAAY,EAAE,qBAAM;;;AiBE5B,4oBAAiC;EAC/B,OAAO,EAAE,CAAC;;;AAGV,4uCAAuB;EACrB,SAAS,EAAE,IAAI;EACf,cAAc,EAAE,IAAI;;;AEpBxB,+RAAS;EACP,OAAO,EAAE,IAAqB;EAC9B,WAAW,EDayB,IAAI;ECZxC,aAAa,EDYuB,IAAI;ECXxC,UAAU,EAAE,OAAmB;;;AAEjC,+CAAe;EACb,KAAK,ECe+B,IAAM;EDd1C,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,KAAK;EACd,KAAK,ECY+B,IAAM;EDX1C,UAAU,EAAE,OAAkB;EAC9B,MAAM,EAAE,KAAsB;EAC9B,OAAO,EAAE,QAA2C;EACpD,aAAa,EAAE,IAAqB;;;AAEtC,+cAAyB;EACvB,UAAU,EAAE,OAAkB;;AAC9B,i6CAAe;EACb,UAAU,EAAE,OAAiB;;;AACjC,wbAA0B;EACxB,UAAU,EAAE,OAAmB;;AAC/B,o3CAAe;EACb,UAAU,EAAE,OAAoB;;;AAEpC,ybAAuB;EACrB,UAAU,EAAE,OAAmB;;AAC/B,m3CAAe;EACb,UAAU,EAAE,OAAkB;;;AAElC,ycAA0B;EACxB,UAAU,EAAE,OAAuB;;AACnC,s5CAAe;EACb,UAAU,EAAE,OAAqB;;;AAErC,4fAA0B;EACxB,UAAU,ECF0B,OAAmB;;ADGvD,4/CAAe;EACb,KAAK,ECpB6B,OAAW;EDqB7C,UAAU,ECHwB,OAAmB;;ADIvD,shBAAC;EACC,KAAK,ECb6B,OAAK;;;ADe3C,wcAAsB;EACpB,aAAa,EAAE,CAAC;;;AAsBlB,kBAAkB;EAChB,QAAQ,EAAE,KAAK;EACf,MAAM,EAAE,GAAG;EACX,IAAI,EAAE,CAAC;EACP,OAAO,EDG6B,GAAG;;ACFvC,qBAAE;EACA,OAAO,EAAE,KAAK;EACd,KAAK,EDT6B,KAAK;ECUvC,UAAU,EAAE,WAAW;EACvB,KAAK,ECrD6B,IAAM;EDsDxC,UAAU,EAAE,MAAM;EAClB,UAAU,EAAE,8BAA0B;EACtC,OAAO,EAAE,MAAmB;EAC5B,SAAS,EAAE,GAAG;EACd,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,CAAC;EACT,WAAW,EAAE,IAAI;EACjB,QAAQ,EAAE,MAAM;EnB3FZ,kBAAoB,EAAE,gBAAM;EAK5B,eAAiB,EAAE,gBAAM;EAezB,UAAY,EAAE,gBAAM;;AmByExB,0CAAsB;EACpB,UAAU,EC5FsB,OAAM;;AD6FxC,uCAAmB;EACjB,UAAU,EC5DsB,OAAK;;AD6DvC,0CAAsB;EACpB,UAAU,EDnFsB,OAAO;;ACoFzC,yCAAqB;EACnB,UAAU,EDtEsB,OAAI;;ACuEtC,wBAAI;EACF,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,IAAI;;;AEhFd,oCAAsB;EFmFxB,kBAAkB;IAChB,MAAM,EAAE,IAAI;IACZ,GAAG,EAAE,CAAC;IACN,KAAK,EAAE,IAAI;;EACX,qBAAE;IACA,KAAK,EAAE,IAAI;;;AG3FjB,MAAM;EACJ,SAAS,EAAE,IAAI;EACf,MAAM,EAAE,CAAC;EACT,cAAc,EAAE,QAAQ;EACxB,eAAe,EAAE,MAAM;EACvB,MAAM,EAAE,OAAO;EACf,WAAW,EAAE,MAAM;EACnB,kBAAkB,EAAE,MAAM;EAC1B,SAAS,EAAE,OAAO;;;AACpB,iDAAiD;EAC/C,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;;;AACZ,gBAAgB;EACd,MAAM,EAAE,OAAO;;;AAEjB,IAAI;;EAEF,OAAO,EAAE,YAAY;EACrB,aAAa,EAAE,GAAG;EAClB,WAAW,EAAE,MAAM;EACnB,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,MAAM;EAClB,MAAM,EAAE,OAAO;EACf,SAAS,EAAE,IAAI;EACf,OAAO,EAAE,iBAA6F;EACtG,KAAK,EFf+B,IAAM;EEgB1C,MAAM,EAAE,4BAAyB;EACjC,gBAAgB,EF7CoB,OAAM;EE8C1C,eAAe,EAAE,IAAI;EACrB,WAAW,EAAE,MAAM;EACnB,WAAW,EFDyB,2DAA2D;EEE/F,UAAU,EAAE,0FAAqF;EACjG,YAAY,EAAE,KAAK;EACnB,cAAc,EAAE,MAAM;EACtB,QAAQ,EAAE,MAAM;EAChB,IAAI,EAAE,CAAC;EACP,iBAAiB,EAAE,IAAI;EtBxDjB,mBAAoB,EsByDb,IAAI;EtBpDX,gBAAiB,EsBoDV,IAAI;EtB/CX,eAAgB,EsB+CT,IAAI;EtBrCX,WAAY,EsBqCL,IAAI;EtBzDX,kBAAoB,EAAE,eAAM;EAK5B,eAAiB,EAAE,eAAM;EAezB,UAAY,EAAE,eAAM;;;AsByC5B,UAAU;EACR,UAAU,EAAE,OAAwB;EACpC,KAAK,EFjC+B,IAAM;;;AEoC1C,UAAO;EACL,UAAU,EAAE,OAAqC;EACjD,KAAK,EFtC6B,IAAM;;AEuC1C,UAAO;EACL,UAAU,EAAE,OAAqC;EACjD,OAAO,EAAE,CAAC;;AACZ,WAAQ;EACN,UAAU,EAAE,oFAA+E;EAC3F,OAAO,EAAE,iBAA6F;;AACxG,YAAS;EACP,KAAK,EF9C6B,IAAM;;AE+C1C,aAAU;EACR,gBAAgB,EAAE,IAAI;EACtB,MAAM,EAAE,2DAA2D;EACnE,MAAM,EAAE,iBAAmB;EAC3B,OAAO,EAAE,GAAG;EACZ,MAAM,EAAE,WAAW;EACnB,UAAU,EAAE,IAAI;;;AAEpB,aAAa;EACX,gBAAgB,EAAE,IAAI;EACtB,MAAM,EAAE,2DAA2D;EACnE,MAAM,EAAE,iBAAmB;EAC3B,OAAO,EAAE,GAAG;EACZ,MAAM,EAAE,WAAW;EACnB,UAAU,EAAE,IAAI;;AAChB,8DAA0B;EACxB,gBAAgB,EAAE,IAAI;EACtB,MAAM,EAAE,2DAA2D;EACnE,MAAM,EAAE,iBAAmB;EAC3B,OAAO,EAAE,GAAI;EACb,MAAM,EAAE,WAAW;EACnB,UAAU,EAAE,IAAI;;;AAGpB,sBAAsB;EACpB,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,CAAC;;;AAEX,UAAU;EACR,SAAS,EAAE,GAAG;;;AAEhB,SAAS;EACP,gBAAgB,EAAE,kBAAgB;;AAClC,eAAO;EACL,gBAAgB,EAAE,kBAA6B;;;AAEnD,YAAY;EACV,gBAAgB,EAAE,kBAA2C;EAC7D,KAAK,EAAE,kBAAsB;;AAC7B,kBAAO;EACL,gBAAgB,EAAE,kBAAuD;EACzE,KAAK,EF5F6B,OAAW;;AE6F/C,oBAAS;EACP,KAAK,EAAE,kBAAsB;;;AAEjC,YAAY;EACV,gBAAgB,EAAE,kBAAiB;;AACnC,kBAAO;EACL,gBAAgB,EAAE,kBAA6B;;;AAEnD,WAAW;EACT,gBAAgB,EAAE,kBAAe;;AACjC,iBAAO;EACL,gBAAgB,EAAE,kBAA4B;;;AAElD,YAAY;EACV,gBAAgB,EAAE,kBAAkB;;AACpC,kBAAO;EACL,gBAAgB,EAAE,kBAA+B;;;AACrD,WAAW;EACT,gBAAgB,EJvIoB,IAAI;;AIwIxC,iBAAO;EACL,gBAAgB,EAAE,kBAAoC;;;AAE1D,SAAS;EACP,gBAAgB,EAAE,sBAAsB;EACxC,KAAK,EF3G+B,OAAK;EE4GzC,UAAU,EAAE,IAAI;EAChB,YAAY,EAAE,sBAAsB;;AACpC,eAAO;EACL,gBAAgB,EAAE,sBAAsB;EACxC,KAAK,EAAE,kBAAoC;EAC3C,UAAU,EAAE,IAAI;;AAClB,gBAAQ;EACN,gBAAgB,EAAE,sBAAsB;EACxC,KAAK,EAAE,kBAAoC;EAC3C,UAAU,EAAE,IAAI;;AAClB,iBAAS;EACP,KAAK,EFtH6B,OAAO;;;AEwH7C,oCAAoC;EAClC,cAAc,EAAE,MAAM;;;AAExB,aAAa;EACX,aAAa,EJ1IuB,IAAI;EhBuExC,KAAK,EAAE,CAAC;;AACR,yCAAS;EAEP,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,EAAE;;AACb,mBAAO;EACL,KAAK,EAAE,IAAI;;;AqB3Ff,YAAY;EACV,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,YAAY;;;AAIvB,qCAAqC;EACnC,OAAO,EAAE,KAAK;;;AAChB,iBAAiB;EACf,QAAQ,EAAE,QAAQ;EAClB,IAAI,EAAE,CAAC;EACP,OAAO,EAAE,IAAI;EACb,KAAK,EAAE,IAAI;EACX,GAAG,EAAE,IAAI;EACT,SAAS,EAAE,IAAI;EACf,UAAU,EHW0B,OAAyB;EGV7D,OAAO,ELmD6B,GAAG;EKlDvC,MAAM,EAAE,iBAAgC;EACxC,UAAU,EAAE,8BAA0B;EACtC,OAAO,EAAE,IAAqB;;AAC9B,0BAAQ;EACN,OAAO,EAAE,KAAK;EACd,KAAK,EAAE,IAAI;EACX,KAAK,EHN6B,OAAW;EGO7C,WAAW,EAAE,MAAM;EACnB,SAAS,EAAE,GAAG;EACd,OAAO,EAAE,MAAuB;EAChC,MAAM,EAAE,OAAO;;AACf,gCAAO;EACL,UAAU,EHFsB,OAAK;EGGrC,KAAK,EHT2B,IAAM;;AGU1C,8BAAY;EACV,UAAU,EAAE,iBAAgC;EAC5C,MAAM,EAAE,KAAuB;;AACjC,6BAAW;EACT,cAAc,EAAE,IAAqB;;AACrC,kDAAoB;EAClB,KAAK,EAAE,IAAI;;AACf,qCAAmB;EACjB,UAAU,EAAE,OAA4B;EACxC,cAAc,EAAE,SAAS;EACzB,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,GAAG;;AACd,2CAAO;EACL,UAAU,EAAE,OAA4B;;AAC1C,0CAAI;EACF,KAAK,EHzB2B,IAAM;;;AG2B5C,6CAA6C;EAC3C,MAAM,EAAE,IAAI;EACZ,GAAG,EAAE,IAAI;EACT,IAAI,EAAE,IAAI;EACV,KAAK,EAAE,CAAC;;;AAGR,iDAAiB;EACf,UAAU,EH9BwB,OAAyB;EG+B3D,UAAU,EAAE,GAAG;;AACjB,mDAAmB;EACjB,OAAO,EAAE,QAA2C;;AACpD,yDAAO;EACL,UAAU,EHlCsB,OAAK;EGmCrC,KAAK,EHzC2B,IAAM;;;AG2C5C,+CAA+C;EAC7C,KAAK,EAAE,CAAC;EACR,IAAI,EAAE,IAAI;EACV,UAAU,EAAE,KAAK;;;AAGjB,yBAAQ;EACN,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,oBAA0B;EACzC,WAAW,EAAE,qBAAqB;EAClC,YAAY,EAAE,qBAAqB;EACnC,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,KAAK;EACd,GAAG,EAAE,IAAI;EACT,IAAI,EAAE,GAAG;EACT,WAAW,EAAE,IAAI;;AACnB,gDAA+B;EAC7B,IAAI,EAAE,IAAI;;;ACtEZ,uBAAM;EACJ,OAAO,EAAE,KAAK;;;AAEhB,oIAA+C;EAC7C,OAAO,EAAE,YAAY;EACrB,QAAQ,EAAE,MAAM;EAChB,KAAK,EAAE,CAAC;EACR,cAAc,EAAE,MAAM;;;AAItB,0CAAO;EACL,OAAO,EAAE,YAAY;EACrB,cAAc,EAAE,MAAM;EACtB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,YAA+C;EACvD,KAAK,EAAE,IAAI;;AACf,4BAAW;EACT,KAAK,EAAE,IAAI;;AACX,kCAAK;EACH,OAAO,EAAE,KAAK;;AAChB,mCAAM;EACJ,UAAU,EAAE,GAAqB;;;AAEvC,QAAQ;EACN,MAAM,EAAE,CAAC;EACT,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;;;AACZ,MAAM;EACJ,OAAO,EAAE,KAAK;EACd,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;EACV,WAAW,EAAE,MAAM;EACnB,aAAa,EN/BuB,IAAI;EMgCxC,SAAS,EAAE,IAAI;EACf,YAAY,EAAE,IAAI;;;AACpB,KAAK;EACH,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,cAAa;EACrB,KAAK,ENR+B,IAAU;EMS9C,SAAS,EAAE,GAAG;;;AAEhB,uBAAuB;EACrB,SAAS,EAAE,IAAI;EACf,MAAM,EAAE,CAAC;EACT,cAAc,EAAE,QAAQ;EACxB,eAAe,EAAE,MAAM;;;AAGzB,iBAAiB;EACf,aAAa,ENhDuB,IAAI;EhBuExC,KAAK,EAAE,CAAC;EuBrGR,SAAS,ECCC,IAAQ;EDChB,WAAI,EAAE,IAAI;EACV,YAAK,EAAE,IAAI;EvBkGb,KAAK,EAAE,CAAC;;AACR,iDAAS;EAEP,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,EAAE;;AACb,uBAAO;EACL,KAAK,EAAE,IAAI;;AALb,iDAAS;EAEP,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,EAAE;;AACb,uBAAO;EACL,KAAK,EAAE,IAAI;;;AsBzBf,yDAAyD;EACvD,OAAO,EAAE,IAAI;EACb,KAAK,EN/C+B,OAAI;;;AMoDxC,qGAA+C;EAC7C,cAAc,EAAE,IAAqB;;AACrC,0HAAM;EACJ,KAAK,EAAE,IAAI;;AAEX,mwEAAqP;EACnP,KAAK,EAAE,IAAI;;;AACnB,+BAA+B;EGlF3B,KAAK,EAAE,IAAsB;EAG3B,OAAO,EAAE,KAAK;EAed,YAAoB,EAAE,aAA+B;EACrD,KAAK,EAAE,IAAuC;ECnB5C,YAAoB,EAAE,CAAC;;ADqBzB,0CAAa;EACX,YAAoB,EAAE,CAAC;;;AHgE/B,iCAAiC;EGtF7B,KAAK,EAAE,IAAsB;EAG3B,OAAO,EAAE,KAAK;EAed,YAAoB,EAAE,aAA+B;EACrD,KAAK,EAAE,aAAuC;;AAE9C,4CAAa;EACX,YAAoB,EAAE,CAAC;;ACA7B,iDAAwB;EACtB,YAAoB,EAAE,CAAC;;AAEvB,mDAA0B;EACxB,KAAK,EALY,IAAkC;;;AJqEzD,iCAAiC;EG1F7B,KAAK,EAAE,IAAsB;EAG3B,OAAO,EAAE,KAAK;EAed,YAAoB,EAAE,aAA+B;EACrD,KAAK,EAAE,cAAuC;;AAE9C,4CAAa;EACX,YAAoB,EAAE,CAAC;;ACA7B,iDAAwB;EACtB,YAAoB,EAAE,CAAC;;AAEvB,mDAA0B;EACxB,KAAK,EALY,IAAkC;;;AJ0EzD,uDAAuD;EACrD,MAAM,EAAE,SAA2B;EACnC,SAAS,EAAE,GAAG;;;AAEhB,oBAAoB;EAClB,OAAO,EAAE,YAAY;EACrB,MAAM,EAAE,SAA2B;EACnC,SAAS,EAAE,GAAG;;;AAOZ,itBAAqP;EACnP,KAAK,EAAE,IAAI;;;AAIjB,uBAAuB;EACrB,OAAO,EAAE,YAAY;EACrB,YAAY,EAAE,KAAK;EACnB,KAAK,EAAE,IAAI;EACX,cAAc,EAAE,MAAM;EACtB,SAAS,EAAE,GAAG;;;AAEhB,gBAAgB;EACd,OAAO,EAAE,KAAK;EACd,KAAK,EN7H+B,IAAI;EM8HxC,SAAS,EAAE,GAAG;EACd,UAAU,EAAE,QAAO;EACnB,UAAU,EAAE,MAAM;;AAClB,kBAAC;EACC,SAAS,EAAE,OAAO;EAClB,UAAU,EAAE,MAAM;EAClB,aAAa,EAAE,GAAqB;;AACtC,6BAAY;EACV,aAAa,EAAE,CAAC;;;AA4DpB,KAAK;EACH,WAAW,EAAE,MAAM;;;AAGnB,+DAAmD;EACjD,kBAAkB,EAAE,MAAM;EAC1B,MAAM,EAAE,OAAO;EACf,WAAW,EJ7JuB,2DAA2D;EI8J7F,SAAS,EAAE,OAAO;;AACpB,6SAAqP;EACnP,kBAAkB,EAAE,IAAI;EACxB,OAAO,EAAE,GAAqB;EAC9B,OAAO,EAAE,YAAY;EACrB,MAAM,EAAE,cAA6B;EACrC,SAAS,EAAE,GAAG;EACd,WAAW,EJrKuB,2DAA2D;EIsK7F,UAAU,EAAE,oBAAmC;EAC/C,aAAa,EAAE,CAAC;ExBxNZ,kBAAoB,EAAE,kBAAM;EAK5B,eAAiB,EAAE,kBAAM;EAezB,UAAY,EAAE,kBAAM;;AwBuM1B,4BAAwB;EACtB,OAAO,EAAE,iBAAkB;;AAC7B,eAAW;EACT,MAAM,EAAE,OAAO;;AACjB,2CAAmC;ExB/N7B,kBAAoB,EwBgOZ,UAAU;ExB3NlB,eAAiB,EwB2NT,UAAU;ExB5MlB,UAAY,EwB4MJ,UAAU;EACtB,OAAO,EAAE,CAAC;EACV,YAAY,EAAE,QAAO;EACrB,OAAO,EAAE,IAAI;EACb,MAAM,EAAE,IAAI;;AACd,oBAAgB;ExBrOV,kBAAoB,EwBsOZ,UAAU;ExBjOlB,eAAiB,EwBiOT,UAAU;ExBlNlB,UAAY,EwBkNJ,UAAU;;AACtB,mGAA6D;EAC3D,kBAAkB,EAAE,IAAI;;AAC5B,iYAAyU;EACvU,OAAO,EAAE,CAAC;EACV,OAAO,EAAE,eAAc;EACvB,YAAY,ENxLsB,IAAU;;AMyL9C,oBAAgB;EACd,YAAY,EAAE,eAA8B;;AAC9C,iFAAqE;EACnE,OAAO,EAAE,gBAAsB;EAC/B,OAAO,EAAE,gBAAgB;;AAC3B,ybAAiY;EAC/X,MAAM,EAAE,WAAW;EACnB,gBAAgB,EAAE,OAAmC;;;AAEzD,iEAAiE;EAC/D,KAAK,ENzN+B,OAAI;EM0NxC,MAAM,EAAE,iBAAc;;;AACxB,mFAAmF;EACjF,YAAY,EN5NwB,OAAI;;;AM8NxC,2HAA+G;EAC7G,aAAa,EN/NqB,OAAI;;;AMiO1C,oBAAoB;EAClB,OAAO,EAAE,IAAqB;EAC9B,SAAS,EAAE,IAAI;;;AAKjB,QAAQ;EACN,QAAQ,EAAE,IAAI;EACd,cAAc,EAAE,GAAG;EACnB,KAAK,EAAE,IAAI;EACX,WAAW,EJzNyB,2DAA2D;;;AI0NjG,gBAAgB;EACd,OAAO,EAAE,aAAgB;EACzB,OAAO,EAAE,YAAY;EACrB,MAAM,EAAE,cAA6B;EACrC,SAAS,EAAE,GAAG;EACd,UAAU,EAAE,oBAAmC;ExBhRzC,kBAAoB,EAAE,kBAAM;EAK5B,eAAiB,EAAE,kBAAM;EAezB,UAAY,EAAE,kBAAM;;;AwB+P5B,MAAM;EACJ,MAAM,EAAE,cAA6B;EACrC,gBAAgB,EJvPoB,IAAM;;AIwP1C,gBAAW;EACT,MAAM,EAAE,IAAI;;;AAChB,4BAA4B;EAC1B,OAAO,EAAE,CAAC;;;AACZ,2FAA2F;EACzF,MAAM,EAAE,WAAW;EACnB,gBAAgB,EAAE,OAAmC;;;AAKrD,+DAAuD;EACrD,MAAM,EAAE,WAAW;;;AACvB,uBAAuB;EACrB,MAAM,EAAE,KAAuB;EAE/B,KAAK,EJ5Q+B,OAAW;EI6Q/C,OAAO,EAAE,KAAK;;AACd,mCAAK;EACH,cAAc,EAAE,QAAQ;;;AAI5B,uBAAuB;EACrB,OAAO,EAAE,YAAY;EACrB,QAAQ,EAAE,MAAM;EAChB,KAAK,EAAE,CAAC;EACR,cAAc,EAAE,MAAM;;;AAuBxB,kCAAkC;EAChC,WAAW,EAAE,MAAM;EACnB,OAAO,EAAE,GAAqB;;AAC9B,sEAAiB;EACf,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,YAAY;EACrB,SAAS,EAAE,GAAG;EACd,gBAAgB,EJtSkB,OAAmB;EIuSrD,MAAM,EAAE,cAA6B;EACrC,KAAK,EN7U6B,IAAI;;;AM+U1C,kCAAkC;EAChC,WAAW,EAAE,CAAC;;;AAChB,kCAAkC;EAChC,YAAY,EAAE,CAAC;;;AAcjB,UAAU;EACR,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,KAAK;EACd,MAAM,ENjV8B,IAAI;EMkVxC,UAAU,EAAE,IAAqB;EACjC,MAAM,EAAE,OAAO;;AACf,iBAAQ;EACN,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,EAAE;EACX,OAAO,EAAE,KAAK;EACd,IAAI,EAAE,CAAC;EACP,GAAG,EAAE,CAAC;EACN,KAAK,EAAE,IAAuB;EAC9B,MAAM,EAAE,IAAqB;EAC7B,aAAa,EAAE,GAAG;EAClB,UAAU,EN9WwB,IAAI;ElBNlC,kBAAoB,EAAE,oBAAM;EAK5B,eAAiB,EAAE,oBAAM;EAezB,UAAY,EAAE,oBAAM;;AwBkW1B,gBAAO;EACL,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,EAAE;EACX,OAAO,EAAE,KAAK;EACd,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG;EAClB,UAAU,ENxXwB,IAAI;EMyXtC,IAAI,EAAE,IAAI;EACV,GAAG,EAAE,IAAI;ExB/XL,kBAAoB,EAAE,oBAAM;EAK5B,eAAiB,EAAE,oBAAM;EAezB,UAAY,EAAE,oBAAM;;AwB6W1B,eAAI;EACF,QAAQ,EAAE,QAAQ;EAClB,IAAI,EAAE,IAAqB;EAC3B,OAAO,EAAE,KAAK;EACd,SAAS,EAAE,IAAI;EACf,KAAK,ENhY6B,IAAI;EMiYtC,WAAW,EAAE,CAAC;;;AAEhB,wBAAQ;EACN,UAAU,EAAE,OAAmB;;AACjC,uBAAO;EACL,IAAI,ENrX8B,IAAI;EMsXtC,UAAU,EJ3YwB,OAAM;;;AI6Y5C,mBAAmB;EACjB,MAAM,EAAE,WAAW;EACnB,OAAO,EAAE,GAAE;;;AAgDX,2GAAyB;EACvB,KAAK,ENpa6B,OAAI;;AMsatC,22BAAqP;EACnP,MAAM,EAAE,iBAAc;;AAC1B,iDAAQ;EACN,MAAM,EAAE,iBAAc;;;AAE1B,mBAAmB;EACjB,WAAW,EAAE,MAAM;;AACnB,qCAAiB;EACf,OAAO,EAAE,aAAgB;EACzB,OAAO,EAAE,YAAY;EACrB,SAAS,EAAE,GAAG;;;AAClB,gEAAgE;EAC9D,KAAK,EJ9c+B,OAAM;;;AIid5C,+DAA+D;EAC7D,KAAK,ENtb+B,OAAI;;;AMyb1C,gEAAgE;EAC9D,KAAK,ENzc+B,OAAO;;;AM4c7C,6DAA6D;EAC3D,KAAK,EJxb+B,OAAK;;;AI8b3C,UAAU;ExBleF,iBAAoB,EAAE,aAAM;EAK5B,cAAiB,EAAE,aAAM;EAKzB,aAAgB,EAAE,aAAM;EAKxB,YAAe,EAAE,aAAM;EAKvB,SAAY,EAAE,aAAM;;;AwBgd5B,WAAW;ExBpeH,iBAAoB,EAAE,cAAM;EAK5B,cAAiB,EAAE,cAAM;EAKzB,aAAgB,EAAE,cAAM;EAKxB,YAAe,EAAE,cAAM;EAKvB,SAAY,EAAE,cAAM;;;AwBkd5B,WAAW;ExBteH,iBAAoB,EAAE,cAAM;EAK5B,cAAiB,EAAE,cAAM;EAKzB,aAAgB,EAAE,cAAM;EAKxB,YAAe,EAAE,cAAM;EAKvB,SAAY,EAAE,cAAM;;;AwBod5B,OAAO;ExBxeC,iBAAoB,EAAE,UAAM;EAK5B,cAAiB,EAAE,UAAM;EAKzB,aAAgB,EAAE,UAAM;EAKxB,YAAe,EAAE,UAAM;EAKvB,SAAY,EAAE,UAAM;;AwBsd1B,iBAAW;ExB1eL,iBAAoB,EwB2eL,wBAAwB;ExBtevC,cAAiB,EwBseF,wBAAwB;ExBjevC,aAAgB,EwBieD,wBAAwB;ExB5dvC,YAAe,EwB4dA,wBAAwB;ExBvdvC,SAAY,EwBudG,wBAAwB;;AAC7C,kBAAY;ExB5eN,iBAAoB,EwB6eL,yBAAyB;ExBxexC,cAAiB,EwBweF,yBAAyB;ExBnexC,aAAgB,EwBmeD,yBAAyB;ExB9dxC,YAAe,EwB8dA,yBAAyB;ExBzdxC,SAAY,EwBydG,yBAAyB;;AAC9C,kBAAY;ExB9eN,iBAAoB,EwB+eL,yBAAyB;ExB1exC,cAAiB,EwB0eF,yBAAyB;ExBrexC,aAAgB,EwBqeD,yBAAyB;ExBhexC,YAAe,EwBgeA,yBAAyB;ExB3dxC,SAAY,EwB2dG,yBAAyB;;;AAEhD,yCAAyC;EAErC,8BAAqB;IACnB,MAAM,EAAE,SAAS;;EAEjB,2aAAqP;IACnP,aAAa,EAAE,KAAK;IACpB,OAAO,EAAE,KAAK;;EAClB,cAAK;IACH,aAAa,EAAE,KAAK;IACpB,OAAO,EAAE,KAAK;;;EAEhB,8YAAqO;IACnO,aAAa,EAAE,CAAC;;;EAElB,wCAAuB;IACrB,aAAa,EAAE,KAAK;IACpB,UAAU,EAAE,IAAI;IAChB,OAAO,EAAE,KAAK;IACd,KAAK,EAAE,IAAI;;EACb,4BAAW;IACT,MAAM,EAAE,WAAW;;;EACvB,mEAAmE;IACjE,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,GAAG;IACd,OAAO,EAAE,KAAuB;;;AHnfhC,oCAAsB;EQhC1B,YAAY;IAER,OAAO,EAAE,IAAI;;;;AR8Bb,oCAAsB;EQ5B1B,YAAY;IAER,OAAO,EAAE,IAAI;;;;AAEjB,WAAW;EACT,KAAK,EAAE,IAAI;;;AAEb,YAAY;EACV,KAAK,EAAE,KAAK;;;AAEd,WAAW;EACT,KAAK,EAAE,IAAI;;;AC4Cb,qEAAS;EACP,eAAe,EAAE,QAAQ;EACzB,cAAc,EAAE,CAAC;EACjB,WAAW,EAAE,IAAI;EACjB,aAAa,EZ/BuB,IAAI;;AYgCxC,6FAAO;EACL,KAAK,EAAE,IAAI;EACX,IAAI,EAAE,8BAA8B;EACpC,OAAO,EAAE,KAAK;EACd,UAAU,EAAE,MAAM;;AACpB,8JAAM;EACJ,SAAS,EZjByB,GAAG;EYkBrC,MAAM,EAAE,CAAC;EACT,QAAQ,EAAE,OAAO;EACjB,OAAO,EZnB2B,QAAmC;;AYoBvE,sOAA8B;EAC5B,iBAAiB,EAAE,CAAC;;AACtB,uFAAK;EACH,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,IAAI;EAChB,cAAc,EAAE,MAAM;EACtB,WAAW,EAAE,MAAM;;AACnB,gGAAE;EACA,WAAW,EZnDqB,IAAI;EYoDpC,aAAa,EAAE,iBAA6B;;AAChD,8EAAE;EACA,gBAAgB,EAAE,WAAW;EAC7B,cAAc,EAAE,MAAM;;;AAE1B,oFAAc;EACZ,WAAW,EAAE,IAAuB;;AACpC,qHAAY;EACV,aAAa,EAAE,CAAC;;;AACpB,8HAA4B;EAC1B,KAAK,EAAE,EAAE;EACT,aAAa,EAAE,CAAC;;AAChB,4XAA0C;EACxC,MAAM,EAAE,CAAC;;;AAEb,mBAAmB;EACjB,KAAK,EV9D+B,IAAY;EU+DhD,SAAS,EAAE,GAAG;;;AAChB,kBAAkB;EAChB,KAAK,EVjE+B,IAAY;EUkEhD,SAAS,EAAE,GAAG;;;AAIhB,6HAAyD;EACvD,gBAAgB,EVzDoB,OAAmB;;;AU2DzD,gBAAgB;EACd,gBAAgB,EV5DoB,OAAmB;;;;AUiEzD,mDAAsB;EACpB,MAAM,EAAE,iBAA6B;;AACrC,yDAAE;EACA,aAAa,EAAE,iBAA6B;EAC5C,WAAW,EAAE,iBAA6B;;AAC5C,qGAAwB;EACtB,mBAAmB,EAAE,CAAC;;;AAE1B,kBAAkB;EAChB,MAAM,EAAE,iBAA6B;;;AAGrC,0BAAE;EACA,aAAa,EAAE,iBAA6B;;AAC9C,gDAAwB;EACtB,mBAAmB,EAAE,CAAC;;;AAGxB,6CAAwB;EACtB,mBAAmB,EAAE,CAAC;;AACxB,gDAAM;EACJ,YAAY,EAAE,SAAS;EACvB,aAAa,EAAE,iBAA6B;;AAC9C,6CAAwB;EACtB,mBAAmB,EAAE,CAAC;;;;AAG1B,oBAAoB;EAClB,aAAa,EZhHuB,IAAI;EYiHxC,SAAS,EAAE,IAAI;EACf,QAAQ,EAAE,IAAI;;AACd,0BAAK;EACH,aAAa,EAAE,YAAY;;AAC3B,4DAAM;EACJ,WAAW,EAAE,MAAM;;;ACzIzB,CAAC;EACC,KAAK,EX+B+B,OAAK;EW9BzC,eAAe,EAAE,IAAI;EACrB,MAAM,EAAE,OAAO;;AACf,OAAO;EACL,KAAK,EbgD6B,OAAwB;;Aa/C5D,SAAS;EACP,KAAK,EX0B6B,OAAO;;;AWA7C,IAAI;EACF,MAAM,EAAE,IAAI;EACZ,UAAU,EAAE,MAAM;;;AAEpB,IAAI;EACF,WAAW,EXOyB,2DAA2D;EWN/F,WAAW,EAAE,MAAM;EACnB,KAAK,EXlB+B,OAAW;EWmB/C,UAAU,EAAE,IAAI;EAChB,UAAU,EAAE,MAAM;EAClB,UAAU,EbnD0B,OAAO;;;AaqD7C,aAAa;EACX,UAAU,EAAE,IAAI;;;AAElB,eAAe;EACb,UAAU,EAAE,MAAM;;;AAEpB,cAAc;EACZ,UAAU,EAAE,KAAK;;;AAEnB,cAAc;EACZ,SAAS,EAAE,IAAI;;;AAEjB,eAAe;EACb,SAAS,EAAE,IAAI;;;AAEjB,qBAAqB;EACnB,SAAS,EAAE,GAAG;;;AAEhB,eAAe;EACb,eAAe,EAAE,YAAY;;;AAE/B,gBAAgB;EACd,KAAK,EAAE,kBAAkB;;;AAC3B,uBAAuB;EACrB,KAAK,EAAE,kBAAgC;;;AACzC,aAAa;EACX,KAAK,EAAE,kBAAgB;;;AACzB,oBAAoB;EAClB,KAAK,EAAE,kBAA8B;;;AACvC,gBAAgB;EACd,KAAK,EAAE,kBAAiB;;;AAC1B,uBAAuB;EACrB,KAAK,EAAE,kBAA+B;;;AACxC,eAAe;EACb,KAAK,EAAE,kBAAe;;;AACxB,sBAAsB;EACpB,KAAK,EAAE,kBAA6B;;;AACtC,gBAAgB;EACd,KAAK,EAAE,kBAAsB;;;AAC/B,uBAAuB;EACrB,KAAK,EAAE,kBAAoC;;;AAkB7C,uEAAyB;EACvB,UAAU,EAAE,CAAC;EACb,WAAW,EAAE,GAAG;EAChB,WAAW,EX5DyB,8DAA8D;;;AW8DpG,CAAC;EACC,WAAW,Eb1FyB,IAAI;Ea2FxC,MAAM,EAAE,CAAC;EACT,SAAS,Eb/F2B,IAAI;EagGxC,aAAa,Eb7FuB,IAAI;;;Aa+F1C,EAAE;EACA,SAAS,EAAE,IAAI;;;AAEjB,2CAAE;EACA,SAAS,EAAE,IAAI;;;AAEjB,EAAE;EACA,SAAS,EAAE,IAAI;;;AAEjB,EAAE;EACA,SAAS,EAAE,IAAI;;;AAEjB,EAAE;EACA,SAAS,EAAE,IAAI;;;AAEjB,EAAE;EACA,SAAS,EAAE,IAAI;;;AAEjB,EAAE;EACA,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,GAAG;EACX,MAAM,EAAE,CAAC;EACT,UAAU,EAAE,iBAA6B;EACzC,MAAM,EAAE,MAAmB;EAC3B,OAAO,EAAE,CAAC;;;AAEZ,wCAAI;EACF,WAAW,EAAE,MAAM;EACnB,SAAS,EAAE,IAAI;EACf,UAAU,EXrH0B,IAAM;EWsH1C,MAAM,EAAE,iBAAiC;EACzC,SAAS,EAAE,GAAG;EACd,OAAO,EAAE,KAAK;EACd,WAAW,EXnGyB,oNAAoN;EWoGxP,KAAK,Eb1H+B,OAAI;Ea2HxC,UAAU,EAAE,IAAI;;AAChB,2CAAY;EACV,SAAS,EAAE,GAAG;;;AAmClB,2FAAmB;EACjB,UAAU,EAAE,IAAI;EAChB,WAAW,EbzKyB,IAAI;Ea0KxC,aAAa,Eb1KuB,IAAI;;Aa2KxC,uGAAE;EACA,UAAU,EAAE,IAAI;EAChB,WAAW,Eb7KuB,IAAI;;Aa8KtC,2JAAY;EACV,aAAa,EAAE,CAAC;;AAClB,mHAAE;EACA,aAAa,EAAE,CAAC;;AAClB,mHAAE;EACA,UAAU,EAAE,MAAM;;AAClB,+HAAE;EACA,UAAU,EAAE,MAAM;;AACtB,+HAAK;EACH,UAAU,EAAE,OAAO;;;AAEzB,oFAAsB;EACpB,UAAU,EAAE,OAAO;EACnB,WAAW,Eb3LyB,IAAI;Ea4LxC,aAAa,Eb5LuB,IAAI;;Aa6LxC,gGAAE;EACA,UAAU,EAAE,OAAO;EACnB,WAAW,Eb/LuB,IAAI;;AagMtC,oJAAY;EACV,aAAa,EAAE,CAAC;;AAClB,4GAAE;EACA,aAAa,EAAE,CAAC;;AAChB,wHAAE;EACA,UAAU,EAAE,IAAI;;;ACrOxB,kBAAkB;EAChB,MAAM,EAAE,iBAA6B;EACrC,aAAa,EAAE,IAAI;EACnB,OAAO,Ed6B6B,IAAI;Ec5BxC,WAAW,EAAE,IAAqB;EAClC,WAAW,EAAE,GAAG;EAChB,UAAU,EZiC0B,IAAM;EYhC1C,QAAQ,EAAE,QAAQ;;AAClB,wBAAO;EACL,OAAO,EAAE,SAAS;EAClB,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,GAAG;EACR,IAAI,EAAE,GAAG;EACT,UAAU,EZiCwB,OAAO;EYhCzC,KAAK,EAAE,KAAoB;EAC3B,OAAO,EAAE,QAA2C;;AACtD,2CAA0B;EACxB,MAAM,EAAE,iBAA6B;EACrC,aAAa,EdcqB,IAAI;;;AcZ1C,mHAAmC;EACjC,MAAM,EAAE,iBAA6B;EACrC,OAAO,EAAE,GAAG;EACZ,UAAU,EAAE,IAAI;EAChB,UAAU,EZe0B,IAAM;EYb1C,MAAM,EAAE,YAAyB;;AACjC,mLAAuB;EACrB,MAAM,EAAE,IAAI;EACZ,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,CAAC;;;AAEb,+BAA+B;EAC7B,KAAK,EAAE,IAAI;;;AACb,cAAc;EACZ,YAAY,EAAE,iBAA0C;EACxD,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,SAA2C;EACpD,WAAW,EZuByB,oNAAoN;EYtBxP,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,KAAK,EdI+B,OAAwB;;;AcH9D,2BAA2B;EACzB,WAAW,EAAE,GAAG;EAChB,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,SAA2C;EACpD,WAAW,EZeyB,oNAAoN;EYdxP,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,OAAO,EAAE,KAAK;EACd,QAAQ,EAAE,IAAI;EACd,KAAK,EZhB+B,OAAW;;;AYoBjD,YAAY;EACV,gJAAgE;IAC9D,WAAW,EAAE,QAAQ;;;ACzDzB,IAAI;EACF,gBAAgB,EAAE,OAAO;EACzB,MAAM,EAAE,OAAO;EACf,OAAO,EAAE,MAAM;EACf,OAAO,EAAE,KAAK;;;AAChB,EAAE;EACA,KAAK,EAAE,OAAO;EACd,UAAU,EAAE,MAAM;;;AACpB,IAAI;EACF,KAAK,EAAE,OAAO;EACd,gBAAgB,EAAE,OAAO;;;AAC3B,EAAE;EACA,WAAW,EAAE,IAAI;;;AACnB,EAAE;EACA,WAAW,EAAE,IAAI;;;AACnB,GAAG;EACD,KAAK,EAAE,OAAO;EACd,UAAU,EAAE,MAAM;;;AACpB,GAAG;EACD,KAAK,EAAE,OAAO;EACd,WAAW,EAAE,IAAI;;;AACnB,GAAG;EACD,KAAK,EAAE,OAAO;EACd,UAAU,EAAE,MAAM;;;AACpB,GAAG;EACD,KAAK,EAAE,OAAO;EACd,WAAW,EAAE,IAAI;EACjB,UAAU,EAAE,MAAM;;;AACpB,GAAG;EACD,KAAK,EAAE,OAAO;EACd,gBAAgB,EAAE,OAAO;;;AAC3B,MAAM;EACJ,KAAK,EAAE,OAAO;EACd,gBAAgB,EAAE,OAAO;;;AAC3B,GAAG;EACD,UAAU,EAAE,MAAM;;;AACpB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;EACd,gBAAgB,EAAE,OAAO;;;AAC3B,MAAM;EACJ,KAAK,EAAE,OAAO;EACd,gBAAgB,EAAE,OAAO;;;AAC3B,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,WAAW,EAAE,IAAI;;;AACnB,GAAG;EACD,KAAK,EAAE,OAAO;EACd,WAAW,EAAE,IAAI;;;AACnB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,WAAW,EAAE,IAAI;;;AACnB,GAAG;EACD,WAAW,EAAE,IAAI;;;AACnB,GAAG;EACD,WAAW,EAAE,IAAI;;;AACnB,GAAG;EACD,WAAW,EAAE,IAAI;;;AACnB,GAAG;EACD,WAAW,EAAE,IAAI;;;AACnB,GAAG;EACD,KAAK,EAAE,OAAO;EACd,WAAW,EAAE,IAAI;;;AACnB,EAAE;EACA,KAAK,EAAE,OAAO;;;AAChB,EAAE;EACA,KAAK,EAAE,OAAO;;;AAChB,EAAE;EACA,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,IAAI;;;AACb,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;EACd,WAAW,EAAE,IAAI;;;AACnB,GAAG;EACD,KAAK,EAAE,IAAI;;;AACb,GAAG;EACD,KAAK,EAAE,MAAM;;;AACf,GAAG;EACD,KAAK,EAAE,OAAO;EACd,WAAW,EAAE,IAAI;;;AACnB,GAAG;EACD,KAAK,EAAE,OAAO;EACd,WAAW,EAAE,IAAI;;;AACnB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,IAAI;;;AACb,GAAG;EACD,KAAK,EAAE,IAAI;;;AACb,GAAG;EACD,WAAW,EAAE,IAAI;;;AACnB,EAAE;EACA,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,IAAI;;;AACb,GAAG;EACD,KAAK,EAAE,IAAI;;;AACb,GAAG;EACD,KAAK,EAAE,IAAI;;;AACb,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,IAAI;EACX,gBAAgB,EAAE,OAAO;;;ACjJ3B,kBAAkB;EAChB,OAAO,EAAE,YAAY;;AACrB,uCAAsB;EACpB,KAAK,EAAE,KAAK;;AACd,oBAAC;EACC,OAAO,EAAE,YAAY;EACrB,OAAO,EAAE,GAAG;;AACZ,gCAAa;EACX,YAAY,EAAE,CAAC;;AACnB,+FAAI;EACF,OAAO,EAAE,GAAG;EACZ,MAAM,EAAE,IAAI;EACZ,UAAU,EAAE,IAAI;;AAChB,uHAAS;EACP,KAAK,EdqB2B,OAAW;;;AcpBjD,qBAAqB;EACnB,aAAa,EAAE,CAAC;EAChB,KAAK,EdqB+B,OAAW;EcpB/C,SAAS,EAAE,GAAG;EACd,OAAO,EAAE,YAAY;;;AbanB,oCAAsB;EaTxB,qBAAqB;IACnB,OAAO,EAAE,IAAI;;;EACf,uCAAuC;IACrC,OAAO,EAAE,IAAI;;;AAEjB,YAAY;EACV,uCAAuC;IACrC,OAAO,EAAE,IAAI;;;AC9BjB,SAAS;EACP,QAAQ,EAAE,KAAK;EACf,GAAG,ECAO,OAAO;;;ADGjB,gBAAO;EACL,eAAe,EAAE,IAAI;;;AAEzB,cAAc;EjC+FZ,KAAK,EAAE,CAAC;;AACR,2CAAS;EAEP,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,EAAE;;AACb,oBAAO;EACL,KAAK,EAAE,IAAI;;AiCnGb,oCAAM;EACJ,OAAO,EAAE,YAAY;;AACvB,uBAAQ;EACN,UAAU,EAAE,wBAAoB;;AAEhC,6BAAa;EACX,WAAW,EAAE,iBAAyB;;AACxC,8BAAc;EACZ,YAAY,EAAE,iBAAyB;;AAC3C,gBAAC;EACC,MAAM,EAAE,IAAmB;EAC3B,OAAO,EAAE,YAAY;EACrB,WAAW,EAAE,IAAmB;EAChC,OAAO,EAAE,MAAiB;;;AAE9B,iBAAiB;EACf,KAAK,EjBuD+B,KAAK;;AiBtDzC,qDAAiB;EACf,MAAM,EAAE,IAAmB;EAC3B,OAAO,EAAE,YAAY;EACrB,WAAW,EAAE,IAAmB;EAChC,OAAO,EAAE,SAAS;EAClB,aAAa,EAAE,CAAC;EAChB,OAAO,EAAE,KAAK;EACd,WAAW,EAAE,IAAI;EACjB,cAAc,EAAE,SAAS;EACzB,SAAS,EAAE,GAAG;EACd,KAAK,EfR6B,OAAwB;EeS1D,WAAW,EAAE,MAAM;;AAErB,oBAAE;EACA,aAAa,EAAE,CAAC;;AAEhB,+BAAY;EACV,UAAU,EAAE,iBAAyB;;AACvC,kCAAe;EACb,aAAa,EAAE,iBAAyB;;AAC1C,4BAAS;EACP,UAAU,EAAE,OAA4C;;AACxD,8BAAC;EACC,KAAK,EfbyB,IAAY;Eec1C,YAAY,EAAE,iBAAsD;EACpE,OAAO,EAAE,gBAAyB;;AAClC,oCAAO;EACL,UAAU,EAAE,OAA4C;;AAC9D,qGAAI;EACF,MAAM,EAAE,IAAI;EACZ,UAAU,EAAE,OAAO;EACnB,KAAK,EAAE,OAAO;EACd,YAAY,EAAE,CAAC;EACf,aAAa,EAAE,CAAC;;AAElB,wCAAmB;EACjB,OAAO,EAAE,KAAK;EACd,KAAK,EAAE,IAAI;EACX,WAAW,EAAE,MAAM;EAGnB,SAAS,EAAE,KAAI;EACf,WAAW,EAAE,KAAK;EAClB,KAAK,EAAE,OAA8B;;AAGzC,2DAAuB;EACrB,KAAK,EfvC6B,OAAW;EewC7C,OAAO,EAAE,gBAAmB;EAC5B,WAAW,EAAE,IAAI;EACjB,QAAQ,EAAE,QAAQ;EAClB,UAAU,EflCwB,OAAyB;EemC3D,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,iBAAsD;EACrE,UAAU,EAAE,iBAAsD;EAClE,YAAY,EAAE,YAAY;;AAE1B,uEAAO;EACL,UAAU,EfzCsB,OAAyB;;Ae0CzD,+GAAmB;EACjB,KAAK,EflDyB,IAAY;;AemD9C,mGAAmB;EAGjB,OAAO,EAAE,KAAK;EACd,SAAS,EAAE,KAAI;EACf,WAAW,EAAE,KAAK;EAClB,KAAK,EAAE,OAA8B;;AAIvC,sHAAI;EACF,OAAO,EAAE,IAAI;;AACf,sIAAc;EACZ,OAAO,EAAE,KAAK;;AAGd,2CAAG;EACD,UAAU,EAAE,OAA4C;EACxD,OAAO,EAAE,gBAAyB;;AACpC,yDAAiB;EACf,OAAO,EAAE,KAAK;EACd,UAAU,EAAE,OAA4C;EACxD,OAAO,EAAE,gBAAyB;;AACtC,2DAA2B;EACzB,KAAK,Ef3E2B,IAAY;;Ae4E9C,mDAAmB;EACjB,KAAK,EAAE,OAA4C;;AACvD,+BAAa;EACX,SAAS,EAAE,KAAI;;AAEb,2CAAG;EACD,UAAU,EAAE,OAA4C;EACxD,OAAO,EAAE,gBAAyB;;AACpC,yDAAiB;EACf,OAAO,EAAE,KAAK;EACd,UAAU,EAAE,OAA4C;EACxD,OAAO,EAAE,gBAAyB;EAClC,UAAU,EAAE,IAAI;EAChB,aAAa,EAAE,IAAI;;AACvB,2DAA2B;EACzB,KAAK,Ef3F2B,IAAY;;Ae4F9C,mDAAmB;EACjB,KAAK,EAAE,OAA4C;;AACvD,+BAAa;EACX,SAAS,EAAE,KAAI;;AAEjB,+BAAa;EACX,OAAO,EAAE,KAAK;;AAChB,uBAAK;EACH,aAAa,EAAE,CAAC;EAChB,OAAO,EAAE,IAAI;;AAEb,kCAAK;EACH,OAAO,EAAE,KAAK;;AAClB,4BAAU;EACR,aAAa,EAAE,CAAC;EAChB,KAAK,Ef1G6B,OAAW;Ee2G7C,WAAW,EAAE,MAAM;;AACrB,mBAAC;EACC,OAAO,EAAE,YAAY;EACrB,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,gBAAmB;EAC5B,OAAO,EAAE,KAAK;EACd,QAAQ,EAAE,QAAQ;EAClB,SAAS,EAAE,GAAG;EACd,KAAK,EfnH6B,OAAW;;AeoH7C,yBAAO;EACL,gBAAgB,EAAE,OAAoC;EACtD,MAAM,EAAE,OAAO;;AACf,6CAAmB;EACjB,KAAK,EfxHyB,OAAW;;AeyH7C,0BAAQ;EACN,gBAAgB,EfnHgB,OAAK;EeoHrC,MAAM,EAAE,OAAO;EACf,KAAK,Ef3H2B,IAAM;;Ae4HtC,8CAAmB;EACjB,KAAK,Ef7HyB,IAAM;;;Ae+H5C,mBAAmB;EACjB,OAAO,EAAE,KAAK;EACd,KAAK,EjBvF+B,KAAK;EiBwFzC,OAAO,EAAE,OAAW;EACpB,aAAa,EAAE,OAAW;EAC1B,OAAO,EjBrF6B,GAAG;EiBsFvC,gBAAgB,Ef/HoB,OAAK;EegIzC,UAAU,EAAE,MAAM;EAClB,OAAO,EAAE,OAAW;EACpB,OAAO,EAAE,KAAK;EACd,KAAK,EfpI+B,OAAyB;EeqI7D,aAAa,EAAE,OAAW;;AAC1B,oCAAgB;EACd,KAAK,EAAE,IAAI;EACX,aAAa,EAAE,IAAI;EACnB,OAAO,EAAE,QAAQ;EACjB,YAAY,EAAE,OAAuB;;AACvC,uBAAG;EACD,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,sBAA0B;EAClC,MAAM,EAAE,IAAI;EACZ,KAAK,EAAE,IAAI;EACX,gBAAgB,Ef/IkB,OAAK;EegJvC,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,IAAI;;AACrB,6DAAqB;EACnB,KAAK,EfpJ6B,OAAyB;EeqJ3D,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,YAAY;EACrB,OAAO,EAAE,OAA2C;EACpD,aAAa,EAAE,OAAW;;AAE1B,yEAAO;EACL,UAAU,EAAE,wBAAoB;;AAClC,+EAAQ;EACN,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,MAAM;EACd,MAAM,EAAE,IAAI;EACZ,KAAK,EAAE,IAAI;EACX,aAAa,EAAE,CAAC;EAChB,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,gBAAa;;AAEzB,yFAAQ;EACN,UAAU,EAAE,MAAM;;AACxB,iCAAa;EACX,UAAU,EAAE,SAAkB;EAC9B,aAAa,EAAE,OAAW;EAC1B,WAAW,EAAE,MAAM;EACnB,KAAK,EAAE,wBAAoB;;;AAI7B,gCAAM;EACJ,KAAK,EfhL6B,OAAK;;AeiLzC,2BAAC;EACC,KAAK,EfzL6B,OAAW;;Ae0L7C,iCAAO;EACL,gBAAgB,EfpLgB,OAAK;EeqLrC,KAAK,Ef3L2B,IAAM;;;Ae6L5C,gBAAgB;EnC3NR,kBAAoB,EAAE,gBAAM;EAK5B,eAAiB,EAAE,gBAAM;EAezB,UAAY,EAAE,gBAAM;EmCyM1B,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,CAAC;EACV,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,CAAC;;AACV,4BAAa;EACX,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,CAAC;;AACZ,0BAAW;EACT,KAAK,EAAE,IAAI;EACX,IAAI,EAAE,KAAK;EACX,OAAO,EAAE,CAAC;;AACZ,2BAAY;EACV,KAAK,EAAE,KAAK;EACZ,IAAI,EAAE,IAAI;EACV,OAAO,EAAE,CAAC;;;AAGd,gBAAgB;EACd,UAAU,EAAE,qBAAuC;EACnD,gBAAgB,EAAE,2uCAA2uC;EAC7vC,eAAe,EAAE,SAAsB;;;AAEzC,gBAAgB;EACd,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;;;AAEd,YAAY;EACV,QAAQ,EAAE,KAAK;EACf,GAAG,EAAE,CAAC;EACN,MAAM,EAAE,CAAC;EACT,IAAI,EAAE,CAAC;EACP,cAAc,EAAE,GAAG;EACnB,KAAK,EjBvL+B,KAAK;EiBwLzC,UAAU,EAAE,MAAM;EAClB,UAAU,EAAE,MAAM;EAClB,UAAU,EAAE,IAAI;EAChB,UAAU,EflO0B,OAAsB;EemO1D,OAAO,EjBvL6B,GAAG;;;AiByLzC,eAAe;EACb,KAAK,EAAE,KAAyB;EAChC,QAAQ,EAAE,QAAQ;EAClB,UAAU,EAAE,MAAM;EAClB,UAAU,EAAE,MAAM;EAClB,MAAM,EAAE,IAAI;;;AAEd,WAAW;EACT,OAAO,EAAE,IAAI;EACb,UAAU,Ef3O0B,OAAK;Ee4OzC,KAAK,EflP+B,IAAM;EemP1C,OAAO,EAAE,gBAAuB;EAChC,QAAQ,EAAE,QAAQ;EAClB,WAAW,EAAE,IAAI;EACjB,UAAU,EAAE,MAAM;EAClB,SAAS,EAAE,IAAI;EjCvLf,KAAK,EAAE,CAAC;;AACR,qCAAS;EAEP,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,EAAE;;AACb,iBAAO;EACL,KAAK,EAAE,IAAI;;AiCmLb,aAAC;EACC,KAAK,Ef1P6B,IAAM;Ee2PxC,WAAW,EAAE,IAAI;;AAEnB,eAAG;EACD,YAAY,EAAE,IAAqB;EACnC,MAAM,EAAE,IAAI;EACZ,KAAK,EAAE,IAAI;EACX,gBAAgB,Ef3PkB,OAAK;Ee4PvC,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,IAAI;;AACrB,aAAC;EACC,SAAS,EAAE,IAAI;EACf,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,OAAO;EACf,WAAW,EAAE,OAAO;;;AAExB,oBAAoB;EAClB,WAAW,EjBjOyB,KAAK;EiBkOzC,UAAU,EfvQ0B,OAAyB;EewQ7D,UAAU,EAAE,IAAI;;;AAElB,eAAe;EACb,OAAO,EAAE,eAAmB;EAC5B,MAAM,EAAE,IAAI;EACZ,SAAS,EAAE,KAAK;EAChB,MAAM,EAAE,IAAI;;;AAEd,aAAa;EACX,QAAQ,EAAE,KAAK;EACf,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,UAAU,EAAE,kBAAc;EAC1B,OAAO,EAAE,IAAI;EACb,OAAO,EAAE,GAAkB;;AAC3B,gBAAI;EACF,OAAO,EAAE,KAAK;;;AAClB,MAAM;EACJ,KAAK,EfjS+B,IAAY;;AekShD,QAAC;EACC,aAAa,EAAE,IAAqB;;AACtC,+FAAgB;EACd,OAAO,EAAE,GAAG;EACZ,WAAW,Ef9QuB,oNAAoN;Ee+QtP,SAAS,EAAE,GAAG;EACd,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,IAAI;EACZ,KAAK,Ef1S6B,IAAY;;;Ae4SlD,mBAAmB;EjC1OjB,KAAK,EAAE,CAAC;;AiC2OR,qDAAiB;EACf,KAAK,EAAE,IAAI;;AjC3Ob,qDAAS;EAEP,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,EAAE;;AACb,yBAAO;EACL,KAAK,EAAE,IAAI;;;AiCyOf,wBAAwB;EACtB,UAAU,EAAE,IAAI;EjChPhB,KAAK,EAAE,CAAC;;AACR,+DAAS;EAEP,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,EAAE;;AACb,8BAAO;EACL,KAAK,EAAE,IAAI;;;AiC8Ob,0BAAU;EACR,aAAa,EjB5TqB,IAAI;EiB6TtC,aAAa,EAAE,iBAA6B;EAC5C,cAAc,EjB9ToB,IAAI;;AiB+TxC,sCAAsB;EACpB,UAAU,EAAE,iBAA6B;EACzC,WAAW,EjBjUuB,IAAI;;AiBkUxC,4BAAY;EACV,SAAS,EAAE,IAAI;EACf,aAAa,EAAE,IAAqB;EACpC,OAAO,EAAE,YAAY;;AACvB,wBAAQ;EACN,KAAK,EflU6B,IAAY;EemU9C,SAAS,EAAE,GAAG;;;AdxUd,oCAAsB;Ec4UxB,gBAAgB;IACd,UAAU,EfjUwB,OAAyB;;;EekU7D,WAAW;IACT,OAAO,EAAE,KAAK;;;EAChB,YAAY;IAER,IAAI,EAAE,MAAmB;;EAG3B,kBAAO;IACL,KAAK,EAAE,GAAG;IACV,IAAI,EAAE,CAAC;;;EACX,eAAe;IACb,KAAK,EAAE,IAAI;;;EACb,mBAAmB;IACjB,KAAK,EAAE,IAAI;;;EACb,yBAAyB;IACvB,KAAK,EAAE,IAAI;;;EACb,oBAAoB;IAClB,WAAW,EAAE,CAAC;;EACd,oCAAe;IACb,OAAO,EC/XD,OAAO;;EDgYf,0BAAO;IACL,QAAQ,EAAE,KAAK;IACf,SAAS,EAAE,IAAI;IACf,IAAI,EAAE,GAAG;IACT,GAAG,EAAE,CAAC;IACN,MAAM,EAAE,IAAI;IACZ,QAAQ,EAAE,MAAM;;;AdxWlB,qCAAsB;Ec2WxB,oBAAoB;IAClB,UAAU,EAAE,mBAAe;;;EAC7B,eAAe;IACb,MAAM,EAAE,CAAC;IACT,UAAU,EfnWwB,OAAyB;;;AeqW/D,YAAY;EACV,mCAAmC;IACjC,OAAO,EAAE,IAAI;;;EACf,oBAAoB;IAClB,WAAW,EAAE,CAAC;;;AErZlB,aAAa;EACX,QAAQ,EAAE,KAAK;EACf,MAAM,EAAE,CAAC;EACT,IAAI,EAAE,CAAC;EACP,KAAK,EnB6E+B,KAAK;EmB5EzC,KAAK,EjBuC+B,OAAyB;EiBtC7D,UAAU,EAAE,OAAkC;EAC9C,UAAU,EAAE,kBAAiC;EAC7C,WAAW,EjBkDyB,2DAA2D;EiBjD/F,OAAO,EnB+E6B,GAAG;;AmB9EvC,eAAC;EACC,KAAK,EjBkC6B,OAAK;EiBjCvC,eAAe,EAAE,IAAI;;AACvB,8BAAgB;EACd,OAAO,EAAE,IAAI;;AACf,kCAAoB;EAClB,OAAO,EAAE,IAAqB;EAC9B,gBAAgB,EAAE,OAAkC;EACpD,OAAO,EAAE,KAAK;EACd,UAAU,EAAE,KAAK;EACjB,SAAS,EAAE,GAAG;EACd,MAAM,EAAE,OAAO;EACf,KAAK,EjBX6B,OAAM;ElB4F1C,KAAK,EAAE,CAAC;;AACR,mFAAS;EAEP,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,EAAE;;AACb,wCAAO;EACL,KAAK,EAAE,IAAI;;AmCrFX,gsDAAG;EACD,KAAK,EjBmB2B,OAAyB;;AiBlB3D,0FAAQ;EACN,KAAK,EAAE,IAAI;;AACb,6CAAU;EACR,KAAK,EAAE,IAAI;;AACb,kDAAiB;EACf,gBAAgB,EnBQgB,OAAI;EmBPpC,KAAK,EjBO2B,IAAM;;AiBNxC,yDAAwB;EACtB,gBAAgB,EjBsBgB,OAAO;EiBrBvC,KAAK,EnBzB2B,IAAI;;AmB0BxC,0CAA8B;EAC5B,OAAO,EAAE,KAAK;;AAChB,iCAAmB;EACjB,SAAS,EAAE,GAAG;EACd,OAAO,EAAE,IAAqB;EAC9B,KAAK,EjBJ6B,IAAY;EiBK9C,OAAO,EAAE,IAAI;;AACb,oCAAE;EACA,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,GAAG;EACX,MAAM,EAAE,CAAC;EACT,MAAM,EAAE,MAAM;EACd,OAAO,EAAE,CAAC;EACV,UAAU,EAAE,iBAA6C;;AAC3D,oCAAE;EACA,OAAO,EAAE,YAAY;EACrB,MAAM,EAAE,CAAC;;AACT,sCAAC;EACC,OAAO,EAAE,YAAY;EACrB,OAAO,EAAE,GAAqB;EAC9B,KAAK,EjBZyB,OAAyB;;AiBa7D,uBAAW;EACT,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,KAAK,EAAE,IAAI;EACX,IAAI,EAAE,IAAI;EACV,MAAM,EAAE,IAAI;EACZ,SAAS,EnBkByB,KAAK;;AmBjBvC,kCAAU;EACR,KAAK,EAAE,IAAI;;AACb,oEAAQ;EACN,KAAK,EAAE,IAAI;;AACb,qDAA+B;EAC7B,UAAU,EAAE,KAAK;;AACjB,gIAAQ;EACN,KAAK,EAAE,IAAI;;AACb,gEAAU;EACR,KAAK,EAAE,IAAI;;AACf,4CAAoB;EAClB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,KAAuB;EAChC,OAAO,EAAE,KAAK;EACd,UAAU,EAAE,MAAM;;;AhBhDpB,oCAAsB;EgBmDxB,aAAa;IACX,KAAK,EAAE,GAAG;IACV,OAAO,EAAE,IAAI;;EACb,mBAAO;IACL,OAAO,EAAE,KAAK;;;ACtElB,gBAAG;EACD,SAAS,EAAE,IAAI;EACf,MAAM,EAAE,eAAe;;AAEzB,4DAAkC;EAChC,WAAW,EAAE,MAAM;;AAErB,uBAAU;EACR,aAAa,EpBOqB,IAAI;;AoBNtC,iCAAS;EACP,UAAU,EAAE,MAAM;;AAEtB,oCAAuB;EACrB,UAAU,EAAE,MAAM;;AAGpB,4DAAoC;EAClC,aAAa,EpBFqB,IAAI;;AoBaxC,uBAAU;EACR,WAAW,EpBduB,IAAI;EoBetC,WAAW,EpBfuB,IAAI;EoBgBtC,aAAa,EpBhBqB,IAAI;;AoBsBtC,4VAAK;EACH,aAAa,EAAE,CAAC;;AAKlB,qCAAQ;EACN,YAAY,EAAE,GAAG;;AAUrB,8BAAiB;EACf,YAAY,EAAE,kBAAc;;AAC5B,oEAAM;EACJ,UAAU,EAAE,sBAAsB;EAClC,YAAY,EAAE,6BAAyB;;AAG3C,2EAAiD;EAC/C,UAAU,EAAE,WAAW;;AACzB,2EAAiD;EAC/C,UAAU,EAAE,WAAW;;AAGzB,sDAA4B;EAC1B,aAAa,EAAE,IAAqB;;AACtC,wBAAW;EACT,WAAW,EpBvDuB,IAAI;;AoB0DxC,yBAAY;EACV,WAAW,EAAE,IAAI;EACjB,aAAa,EAAE,IAAqB;;AACtC,yBAAY;EACV,KAAK,ElB3D6B,OAAW;;AkB4D/C,yBAAY;EACV,KAAK,EAAE,KAAK;EACZ,MAAM,EAAE,iBAA2C;;AACrD,wBAAW;EACT,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,iBAA2C;;AACrD,0BAAa;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,KAAK;;AAMd,qSAAW;EACT,OAAO,EAAE,IAAI;EACb,UAAU,EAAE,MAAM;EAClB,SAAS,EAAE,IAAI;;AAEf,2VAAO;EACL,UAAU,EAAE,OAAO;EACnB,OAAO,EAAE,GAAO;EAChB,WAAW,EAAE,WAAW;EACxB,OAAO,EAAE,YAAY;;AACzB,2VAAmB;EACjB,OAAO,EAAE,YAAY;;AAEzB,sBAAS;EACP,UAAU,EAAE,MAAM;;AAGpB,qBAAQ;EACN,KAAK,EAAE,KAAK;EACZ,KAAK,EAAE,GAAG;EACV,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,aAAuC;EAC/C,OAAO,EpBnG2B,IAAI;EoBoGtC,UAAU,ElBjFwB,OAAmB;EkBkFrD,MAAM,EAAE,iBAA+B;;AAEvC,2EAAS;EACP,SAAS,EAAE,GAAG;;AAChB,2BAAK;EACH,aAAa,EAAE,CAAC;;AAClB,oCAAc;EACZ,OAAO,EAAE,KAAK;EACd,WAAW,ElBlFqB,8DAA8D;EkBmF9F,WAAW,EAAE,IAAI;EACjB,UAAU,ElB1FsB,OAAmB;EkB2FnD,OAAO,EAAE,QAA2C;EACpD,MAAM,EAAE,KAAkB;EAC1B,aAAa,EpBlHmB,IAAI;EoBmHpC,SAAS,EAAE,IAAI;;AAEnB,yBAAY;EACV,UAAU,ElB9FwB,OAAO;EkB+FzC,OAAO,EAAE,YAAY;EACrB,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,KAAuB;;AAGlC,kEAAwC;EACtC,cAAc,EAAE,KAAK;EACrB,SAAS,EAAE,GAAG;;AAIhB,0EAAgD;EAC9C,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,IAAI;EACZ,KAAK,ElBhI6B,IAAY;;AkBiI9C,kKAAM;EACJ,MAAM,EAAE,IAAI;EACZ,gBAAgB,EAAE,sBAAsB;EACxC,WAAW,EAAE,MAAM;;AACrB,4FAAQ;EACN,YAAY,EAAE,CAAC;EACf,aAAa,EAAE,CAAC;EAChB,cAAc,EAAE,GAAG;;AACrB,sKAAI;EACF,KAAK,ElBnJ2B,IAAK;;AkB0JzC,6BAAgB;EAEd,MAAM,EAAE,IAAI;;AACZ,gCAAE;EACA,MAAM,EAAE,IAAI;;AACd,yCAAW;EACT,OAAO,EAAE,YAAY;;AACvB,yCAAW;EACT,aAAa,EAAE,IAAI;EACnB,UAAU,EAAE,IAAI;EAChB,WAAW,EAAE,MAAM;;AACrB,yCAAW;EACT,UAAU,EAAE,IAAI;;AAGpB,mDAAQ;EAEN,KAAK,EpB7L6B,IAAI;EoB8LtC,OAAO,EAAE,OAAO;;AAChB,6HAAO;EACL,SAAS,EAAE,eAAe;EAC1B,WAAW,EAAE,MAAM;;AAErB,2EAAS;EACP,KAAK,EpBvK2B,OAAI;;AoBwKtC,6HAAW;EACT,WAAW,EAAE,IAAI;EACjB,KAAK,ElB9K2B,OAAW;;AkBgL/C,yDAAY;EACV,KAAK,ElBvK6B,OAAK;;AkBwKzC,eAAE;EACA,aAAa,EpBtLqB,IAAI;;AoBuLtC,kBAAE;EACA,WAAW,EAAE,IAAI;;AAEnB,gFAAgB;EACd,aAAa,EAAE,eAAgC;;AAEjD,kBAAE;EACA,MAAM,EAAE,aAA4C;;AAMxD,8BAAiB;EACf,aAAa,EpBrMqB,IAAI;;AoBuMtC,iCAAE;EACA,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,KAAuB;EAC/B,SAAS,EAAE,GAAG;EACd,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,OAA0B;EACtC,KAAK,ElBhM2B,OAAK;EkBiMrC,UAAU,EAAE,iBAAoC;EAChD,OAAO,EAAE,GAAqB;EAC9B,QAAQ,EAAE,QAAQ;;AAClB,wCAAQ;EACN,KAAK,EAAE,OAA0B;;AACnC,6CAAW;EACT,KAAK,ElBjNyB,OAAW;EkBkNzC,SAAS,EAAE,eAAe;;AAE9B,oCAAK;EACH,aAAa,EAAE,GAAqB;EACpC,MAAM,EAAE,IAAI;EACZ,WAAW,EAAE,iBAAuB;EACpC,UAAU,EAAE,OAAa;EACzB,KAAK,ElBhO2B,IAAK;;AkBiOrC,gDAAW;EACT,KAAK,ElB3NyB,OAAW;EkB4NzC,SAAS,EAAE,eAAe;;AAC9B,6CAAc;EACZ,UAAU,EAAE,CAAC;;AAEf,yGAAQ;EACN,WAAW,EAAE,IAAI;;AACjB,yRAA2B;EACzB,gBAAgB,EAAE,WAAW;EAC7B,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,CAAC;EACV,SAAS,EAAE,eAAe;;AAC5B,oIAAU;EACR,WAAW,EAAE,IAAI;;AAErB,wCAAS;EACP,OAAO,EAAE,YAAY;EACrB,OAAO,EAAE,KAAK;EACd,KAAK,EpBtQ2B,IAAI;EoBuQpC,WAAW,EAAE,IAAI;;AACnB,wCAAS;EACP,OAAO,EAAE,YAAY;EACrB,aAAa,EAAE,GAAG;;AAEtB,wDAA8B;EAC5B,OAAO,EAAE,YAAY;EACrB,KAAK,ElB7Q6B,OAAM;EkB8QxC,SAAS,EAAE,GAAG;EACd,YAAY,EpB1PsB,IAAI;;AoB2PxC,2BAAc;EACZ,OAAO,EAAE,KAAK;EACd,KAAK,EAAE,KAAK;;AACd,qBAAQ;EACN,aAAa,EAAE,IAAI;EACnB,WAAW,EAAE,IAAI;;AAEnB,oDAAa;EACX,UAAU,EAAE,OAAO;EACnB,OAAO,EAAE,OAAO;EAChB,WAAW,EAAE,MAAM;EACnB,WAAW,EAAE,OAAO;EACpB,SAAS,EAAE,OAAO;EAClB,KAAK,EAAE,OAAO;EACd,MAAM,EAAE,OAAO;EACf,WAAW,EAAE,OAAO;;AACpB,sFAAgB;EACd,sBAAsB,EAAE,oBAAoB;;AAG5C,oGAAQ;EACN,YAAY,EAAE,GAAG;;AACvB,sBAAS;EACP,MAAM,EAAE,iBAAuC;EAC/C,UAAU,EAAE,OAA6B;EACzC,SAAS,EAAE,GAAG;EACd,WAAW,EAAE,GAAG;EAChB,aAAa,EAAE,GAAqB;EACpC,OAAO,EAAE,SAA4C;EACrD,MAAM,EAAE,QAA2B;;AACrC,6BAAgB;EACd,UAAU,EAAE,MAAM;;;AjB1RlB,oCAAsB;EiBgStB,qBAAQ;IACN,KAAK,EAAE,IAAI;;;ACjUjB,wBAAwB;EACtB,KAAK,EnBkC+B,OAAW;;;AmBhCjD,KAAK;EACH,UAAU,EAAE,MAAM;;;;ECHlB,WAAW,EAAE,aAAa;EAC1B,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,GAAG,EAAE,4GAA4G;;;EAGjH,WAAW,EAAE,aAAa;EAC1B,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,GAAG,EAAE,2GAA2G;;;EAGhH,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,GAAG,EAAE,+FAA+F;;;EAGpG,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,GAAG,EAAE,sFAAsF;;;EAG3F,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,GAAG,EAAE,4FAA4F;;;EAGjG,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,GAAG,EAAE,yGAAyG;;;EAG9G,WAAW,EAAE,aAAa;EAC1B,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,GAAG,EAAE,kHAAkH;;;EAGvH,WAAW,EAAE,aAAa;EAC1B,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,GAAG,EAAE,yGAAyG;;ACShH,mBAAmB;EACjB,gBAAgB,EAAE,GAAG", +"sources": ["../../../bower_components/neat/app/assets/stylesheets/grid/_grid.scss","../../../bower_components/bourbon/dist/addons/_prefixer.scss","../../../bower_components/wyrm/sass/wyrm_core/_reset.sass","../../../bower_components/wyrm/sass/wyrm_core/_mixin.sass","../../../bower_components/font-awesome/scss/font-awesome.scss","../../../bower_components/font-awesome/scss/_path.scss","../../../bower_components/font-awesome/scss/_core.scss","../../../bower_components/font-awesome/scss/_larger.scss","../../../bower_components/font-awesome/scss/_fixed-width.scss","../../../bower_components/font-awesome/scss/_list.scss","../../../bower_components/font-awesome/scss/_variables.scss","../../../bower_components/font-awesome/scss/_bordered-pulled.scss","../../../bower_components/font-awesome/scss/_animated.scss","../../../bower_components/font-awesome/scss/_rotated-flipped.scss","../../../bower_components/font-awesome/scss/_mixins.scss","../../../bower_components/font-awesome/scss/_stacked.scss","../../../bower_components/font-awesome/scss/_icons.scss","../../../bower_components/font-awesome/scss/_screen-reader.scss","../../../bower_components/wyrm/sass/wyrm_core/_font_icon_defaults.sass","../../../bower_components/wyrm/sass/wyrm_core/_wy_variables.sass","../../../bower_components/wyrm/sass/wyrm_core/_alert.sass","../../../sass/_theme_variables.sass","../../../bower_components/neat/app/assets/stylesheets/grid/_media.scss","../../../bower_components/wyrm/sass/wyrm_core/_button.sass","../../../bower_components/wyrm/sass/wyrm_core/_dropdown.sass","../../../bower_components/wyrm/sass/wyrm_core/_form.sass","../../../bower_components/neat/app/assets/stylesheets/grid/_outer-container.scss","../../../bower_components/neat/app/assets/stylesheets/settings/_grid.scss","../../../bower_components/neat/app/assets/stylesheets/grid/_span-columns.scss","../../../bower_components/wyrm/sass/wyrm_core/_neat_extra.sass","../../../bower_components/wyrm/sass/wyrm_core/_generic.sass","../../../bower_components/wyrm/sass/wyrm_core/_table.sass","../../../bower_components/wyrm/sass/wyrm_core/_type.sass","../../../bower_components/wyrm/sass/wyrm_addons/pygments/_pygments.sass","../../../bower_components/wyrm/sass/wyrm_addons/pygments/_pygments_light.sass","../../../sass/_theme_breadcrumbs.sass","../../../sass/_theme_layout.sass","../../../bower_components/neat/app/assets/stylesheets/grid/_private.scss","../../../sass/_theme_badge.sass","../../../sass/_theme_rst.sass","../../../sass/_theme_mathjax.sass","../../../sass/_theme_font_local.sass","../../../sass/theme.sass"], +"names": [], +"file": "theme.css" +} diff --git a/v24.04/de/_static/doctools.js b/v24.04/de/_static/doctools.js new file mode 100644 index 0000000..344db17 --- /dev/null +++ b/v24.04/de/_static/doctools.js @@ -0,0 +1,315 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for all documentation. + * + * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/** + * select a different prefix for underscore + */ +$u = _.noConflict(); + +/** + * make the code below compatible with browsers without + * an installed firebug like debugger +if (!window.console || !console.firebug) { + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", + "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", + "profile", "profileEnd"]; + window.console = {}; + for (var i = 0; i < names.length; ++i) + window.console[names[i]] = function() {}; +} + */ + +/** + * small helper function to urldecode strings + */ +jQuery.urldecode = function(x) { + return decodeURIComponent(x).replace(/\+/g, ' '); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var bbox = span.getBBox(); + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + var parentOfText = node.parentNode.parentNode; + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} + +/** + * Small JavaScript module for the documentation. + */ +var Documentation = { + + init : function() { + this.fixFirefoxAnchorBug(); + this.highlightSearchWords(); + this.initIndexTable(); + if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) { + this.initOnKeyListeners(); + } + }, + + /** + * i18n support + */ + TRANSLATIONS : {}, + PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, + LOCALE : 'unknown', + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext : function(string) { + var translated = Documentation.TRANSLATIONS[string]; + if (typeof translated === 'undefined') + return string; + return (typeof translated === 'string') ? translated : translated[0]; + }, + + ngettext : function(singular, plural, n) { + var translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated === 'undefined') + return (n == 1) ? singular : plural; + return translated[Documentation.PLURALEXPR(n)]; + }, + + addTranslations : function(catalog) { + for (var key in catalog.messages) + this.TRANSLATIONS[key] = catalog.messages[key]; + this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); + this.LOCALE = catalog.locale; + }, + + /** + * add context elements like header anchor links + */ + addContextElements : function() { + $('div[id] > :header:first').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this headline')). + appendTo(this); + }); + $('dt[id]').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this definition')). + appendTo(this); + }); + }, + + /** + * workaround a firefox stupidity + * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 + */ + fixFirefoxAnchorBug : function() { + if (document.location.hash && $.browser.mozilla) + window.setTimeout(function() { + document.location.href += ''; + }, 10); + }, + + /** + * highlight the search words provided in the url in the text + */ + highlightSearchWords : function() { + var params = $.getQueryParameters(); + var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; + if (terms.length) { + var body = $('div.body'); + if (!body.length) { + body = $('body'); + } + window.setTimeout(function() { + $.each(terms, function() { + body.highlightText(this.toLowerCase(), 'highlighted'); + }); + }, 10); + $('') + .appendTo($('#searchbox')); + } + }, + + /** + * init the domain index toggle buttons + */ + initIndexTable : function() { + var togglers = $('img.toggler').click(function() { + var src = $(this).attr('src'); + var idnum = $(this).attr('id').substr(7); + $('tr.cg-' + idnum).toggle(); + if (src.substr(-9) === 'minus.png') + $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); + else + $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); + }).css('display', ''); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { + togglers.click(); + } + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords : function() { + $('#searchbox .highlight-link').fadeOut(300); + $('span.highlighted').removeClass('highlighted'); + }, + + /** + * make the url absolute + */ + makeURL : function(relativeURL) { + return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; + }, + + /** + * get the current relative url + */ + getCurrentURL : function() { + var path = document.location.pathname; + var parts = path.split(/\//); + $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { + if (this === '..') + parts.pop(); + }); + var url = parts.join('/'); + return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + }, + + initOnKeyListeners: function() { + $(document).keyup(function(event) { + var activeElementType = document.activeElement.tagName; + // don't navigate when in search box or textarea + if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') { + switch (event.keyCode) { + case 37: // left + var prevHref = $('link[rel="prev"]').prop('href'); + if (prevHref) { + window.location.href = prevHref; + return false; + } + case 39: // right + var nextHref = $('link[rel="next"]').prop('href'); + if (nextHref) { + window.location.href = nextHref; + return false; + } + } + } + }); + } +}; + +// quick alias for translations +_ = Documentation.gettext; + +$(document).ready(function() { + Documentation.init(); +}); diff --git a/v24.04/de/_static/documentation_options.js b/v24.04/de/_static/documentation_options.js new file mode 100644 index 0000000..b44b088 --- /dev/null +++ b/v24.04/de/_static/documentation_options.js @@ -0,0 +1,10 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '24.04.1', + LANGUAGE: 'de', + COLLAPSE_INDEX: false, + FILE_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, +}; \ No newline at end of file diff --git a/v24.04/de/_static/down-pressed.png b/v24.04/de/_static/down-pressed.png new file mode 100644 index 0000000..5756c8c Binary files /dev/null and b/v24.04/de/_static/down-pressed.png differ diff --git a/v24.04/de/_static/down.png b/v24.04/de/_static/down.png new file mode 100644 index 0000000..1b3bdad Binary files /dev/null and b/v24.04/de/_static/down.png differ diff --git a/v24.04/de/_static/favicon.ico b/v24.04/de/_static/favicon.ico new file mode 100644 index 0000000..2610018 Binary files /dev/null and b/v24.04/de/_static/favicon.ico differ diff --git a/v24.04/de/_static/favicon_KUKA.ico b/v24.04/de/_static/favicon_KUKA.ico new file mode 100644 index 0000000..e245004 Binary files /dev/null and b/v24.04/de/_static/favicon_KUKA.ico differ diff --git a/v24.04/de/_static/favicon_black.ico b/v24.04/de/_static/favicon_black.ico new file mode 100644 index 0000000..57643c7 Binary files /dev/null and b/v24.04/de/_static/favicon_black.ico differ diff --git a/v24.04/de/_static/file.png b/v24.04/de/_static/file.png new file mode 100644 index 0000000..a858a41 Binary files /dev/null and b/v24.04/de/_static/file.png differ diff --git a/v24.04/de/_static/fonts/FontAwesome.otf b/v24.04/de/_static/fonts/FontAwesome.otf new file mode 100644 index 0000000..d4de13e Binary files /dev/null and b/v24.04/de/_static/fonts/FontAwesome.otf differ diff --git a/v24.04/de/_static/fonts/Inconsolata-Bold.ttf b/v24.04/de/_static/fonts/Inconsolata-Bold.ttf new file mode 100644 index 0000000..809c1f5 Binary files /dev/null and b/v24.04/de/_static/fonts/Inconsolata-Bold.ttf differ diff --git a/v24.04/de/_static/fonts/Inconsolata-Regular.ttf b/v24.04/de/_static/fonts/Inconsolata-Regular.ttf new file mode 100644 index 0000000..fc981ce Binary files /dev/null and b/v24.04/de/_static/fonts/Inconsolata-Regular.ttf differ diff --git a/v24.04/de/_static/fonts/KUKA-Bulo-Bold-WEB.eot b/v24.04/de/_static/fonts/KUKA-Bulo-Bold-WEB.eot new file mode 100644 index 0000000..4957353 Binary files /dev/null and b/v24.04/de/_static/fonts/KUKA-Bulo-Bold-WEB.eot differ diff --git a/v24.04/de/_static/fonts/KUKA-Bulo-Bold-WEB.svg b/v24.04/de/_static/fonts/KUKA-Bulo-Bold-WEB.svg new file mode 100644 index 0000000..0c1eac2 --- /dev/null +++ b/v24.04/de/_static/fonts/KUKA-Bulo-Bold-WEB.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v24.04/de/_static/fonts/KUKA-Bulo-Bold-WEB.ttf b/v24.04/de/_static/fonts/KUKA-Bulo-Bold-WEB.ttf new file mode 100644 index 0000000..8faa7ca Binary files /dev/null and b/v24.04/de/_static/fonts/KUKA-Bulo-Bold-WEB.ttf differ diff --git a/v24.04/de/_static/fonts/KUKA-Bulo-Bold-WEB.woff b/v24.04/de/_static/fonts/KUKA-Bulo-Bold-WEB.woff new file mode 100644 index 0000000..876a710 Binary files /dev/null and b/v24.04/de/_static/fonts/KUKA-Bulo-Bold-WEB.woff differ diff --git a/v24.04/de/_static/fonts/KUKA-Bulo-Bold-WEB.woff2 b/v24.04/de/_static/fonts/KUKA-Bulo-Bold-WEB.woff2 new file mode 100644 index 0000000..ba1ba7b Binary files /dev/null and b/v24.04/de/_static/fonts/KUKA-Bulo-Bold-WEB.woff2 differ diff --git a/v24.04/de/_static/fonts/KUKA-Bulo-WEB.eot b/v24.04/de/_static/fonts/KUKA-Bulo-WEB.eot new file mode 100644 index 0000000..662660d Binary files /dev/null and b/v24.04/de/_static/fonts/KUKA-Bulo-WEB.eot differ diff --git a/v24.04/de/_static/fonts/KUKA-Bulo-WEB.svg b/v24.04/de/_static/fonts/KUKA-Bulo-WEB.svg new file mode 100644 index 0000000..c5c3b5d --- /dev/null +++ b/v24.04/de/_static/fonts/KUKA-Bulo-WEB.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v24.04/de/_static/fonts/KUKA-Bulo-WEB.ttf b/v24.04/de/_static/fonts/KUKA-Bulo-WEB.ttf new file mode 100644 index 0000000..654c0ec Binary files /dev/null and b/v24.04/de/_static/fonts/KUKA-Bulo-WEB.ttf differ diff --git a/v24.04/de/_static/fonts/KUKA-Bulo-WEB.woff b/v24.04/de/_static/fonts/KUKA-Bulo-WEB.woff new file mode 100644 index 0000000..87914c7 Binary files /dev/null and b/v24.04/de/_static/fonts/KUKA-Bulo-WEB.woff differ diff --git a/v24.04/de/_static/fonts/KUKA-Bulo-WEB.woff2 b/v24.04/de/_static/fonts/KUKA-Bulo-WEB.woff2 new file mode 100644 index 0000000..e6bc830 Binary files /dev/null and b/v24.04/de/_static/fonts/KUKA-Bulo-WEB.woff2 differ diff --git a/v24.04/de/_static/fonts/Lato-Bold.ttf b/v24.04/de/_static/fonts/Lato-Bold.ttf new file mode 100644 index 0000000..1d23c70 Binary files /dev/null and b/v24.04/de/_static/fonts/Lato-Bold.ttf differ diff --git a/v24.04/de/_static/fonts/Lato-Regular.ttf b/v24.04/de/_static/fonts/Lato-Regular.ttf new file mode 100644 index 0000000..0f3d0f8 Binary files /dev/null and b/v24.04/de/_static/fonts/Lato-Regular.ttf differ diff --git a/v24.04/de/_static/fonts/RobotoSlab-Bold.ttf b/v24.04/de/_static/fonts/RobotoSlab-Bold.ttf new file mode 100644 index 0000000..df5d1df Binary files /dev/null and b/v24.04/de/_static/fonts/RobotoSlab-Bold.ttf differ diff --git a/v24.04/de/_static/fonts/RobotoSlab-Regular.ttf b/v24.04/de/_static/fonts/RobotoSlab-Regular.ttf new file mode 100644 index 0000000..eb52a79 Binary files /dev/null and b/v24.04/de/_static/fonts/RobotoSlab-Regular.ttf differ diff --git a/v24.04/de/_static/fonts/fontawesome-webfont.eot b/v24.04/de/_static/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..c7b00d2 Binary files /dev/null and b/v24.04/de/_static/fonts/fontawesome-webfont.eot differ diff --git a/v24.04/de/_static/fonts/fontawesome-webfont.svg b/v24.04/de/_static/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..8b66187 --- /dev/null +++ b/v24.04/de/_static/fonts/fontawesome-webfont.svg @@ -0,0 +1,685 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/_static/fonts/fontawesome-webfont.ttf b/v24.04/de/_static/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..f221e50 Binary files /dev/null and b/v24.04/de/_static/fonts/fontawesome-webfont.ttf differ diff --git a/v24.04/de/_static/fonts/fontawesome-webfont.woff b/v24.04/de/_static/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..6e7483c Binary files /dev/null and b/v24.04/de/_static/fonts/fontawesome-webfont.woff differ diff --git a/v24.04/de/_static/fonts/fontawesome-webfont.woff2 b/v24.04/de/_static/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000..7eb74fd Binary files /dev/null and b/v24.04/de/_static/fonts/fontawesome-webfont.woff2 differ diff --git a/v24.04/de/_static/img/ic_settings.svg b/v24.04/de/_static/img/ic_settings.svg new file mode 100644 index 0000000..979632c --- /dev/null +++ b/v24.04/de/_static/img/ic_settings.svg @@ -0,0 +1,3 @@ + + + diff --git a/v24.04/de/_static/img/logo_balluff.svg b/v24.04/de/_static/img/logo_balluff.svg new file mode 100644 index 0000000..e759afc --- /dev/null +++ b/v24.04/de/_static/img/logo_balluff.svg @@ -0,0 +1,96 @@ + + + +image/svg+xml + + + \ No newline at end of file diff --git a/v24.04/de/_static/img/logo_basler.svg b/v24.04/de/_static/img/logo_basler.svg new file mode 100644 index 0000000..bb1153a --- /dev/null +++ b/v24.04/de/_static/img/logo_basler.svg @@ -0,0 +1,79 @@ + +image/svg+xml \ No newline at end of file diff --git a/v24.04/de/_static/img/logo_kuka.svg b/v24.04/de/_static/img/logo_kuka.svg new file mode 100644 index 0000000..8231fd2 --- /dev/null +++ b/v24.04/de/_static/img/logo_kuka.svg @@ -0,0 +1 @@ +KUKA-Logo-Orange-Gradient-RGB-37x216-RetinaSZ \ No newline at end of file diff --git a/v24.04/de/_static/img/logo_kuka_white.svg b/v24.04/de/_static/img/logo_kuka_white.svg new file mode 100644 index 0000000..6edb99c --- /dev/null +++ b/v24.04/de/_static/img/logo_kuka_white.svg @@ -0,0 +1 @@ +KUKA-Logo-White-RGB-L-Clear-@2x \ No newline at end of file diff --git a/v24.04/de/_static/img/logo_matrixvision.svg b/v24.04/de/_static/img/logo_matrixvision.svg new file mode 100644 index 0000000..cfdc9a1 --- /dev/null +++ b/v24.04/de/_static/img/logo_matrixvision.svg @@ -0,0 +1,252 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_static/img/logo_roboception.svg b/v24.04/de/_static/img/logo_roboception.svg new file mode 100644 index 0000000..9fbe202 --- /dev/null +++ b/v24.04/de/_static/img/logo_roboception.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/de/_static/img/logo_schunk.svg b/v24.04/de/_static/img/logo_schunk.svg new file mode 100644 index 0000000..4f6d514 --- /dev/null +++ b/v24.04/de/_static/img/logo_schunk.svg @@ -0,0 +1,32 @@ + + + + +SCHUNK_Typenschildlogo_RGB + + + + + + + + + + + diff --git a/v24.04/de/_static/jquery-3.2.1.js b/v24.04/de/_static/jquery-3.2.1.js new file mode 100644 index 0000000..d2d8ca4 --- /dev/null +++ b/v24.04/de/_static/jquery-3.2.1.js @@ -0,0 +1,10253 @@ +/*! + * jQuery JavaScript Library v3.2.1 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2017-03-20T18:59Z + */ +( function( global, factory ) { + + "use strict"; + + if ( typeof module === "object" && typeof module.exports === "object" ) { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"use strict"; + +var arr = []; + +var document = window.document; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var concat = arr.concat; + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + + + + function DOMEval( code, doc ) { + doc = doc || document; + + var script = doc.createElement( "script" ); + + script.text = code; + doc.head.appendChild( script ).parentNode.removeChild( script ); + } +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.2.1", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android <=4.0 only + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && Array.isArray( src ) ? src : []; + + } else { + clone = src && jQuery.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isFunction: function( obj ) { + return jQuery.type( obj ) === "function"; + }, + + isWindow: function( obj ) { + return obj != null && obj === obj.window; + }, + + isNumeric: function( obj ) { + + // As of jQuery 3.0, isNumeric is limited to + // strings and numbers (primitives or objects) + // that can be coerced to finite numbers (gh-2662) + var type = jQuery.type( obj ); + return ( type === "number" || type === "string" ) && + + // parseFloat NaNs numeric-cast false positives ("") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + !isNaN( obj - parseFloat( obj ) ); + }, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + + /* eslint-disable no-unused-vars */ + // See https://github.com/eslint/eslint/issues/6125 + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + globalEval: function( code ) { + DOMEval( code ); + }, + + // Convert dashed to camelCase; used by the css and data modules + // Support: IE <=9 - 11, Edge 12 - 13 + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android <=4.0 only + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var tmp, args, proxy; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: Date.now, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.3 + * https://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-08-08 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + disabledAncestor = addCombinator( + function( elem ) { + return elem.disabled === true && ("form" in elem || "label" in elem); + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[i] = "#" + nid + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement("fieldset"); + + try { + return !!fn( el ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + disabledAncestor( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( preferredDoc !== document && + (subWindow = document.defaultView) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( el ) { + el.className = "i"; + return !el.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( el ) { + el.appendChild( document.createComment("") ); + return !el.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + }); + + // ID filter and find + if ( support.getById ) { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( (elem = elems[i++]) ) { + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( el ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll(":enabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll(":disabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( el ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + !compilerCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return (sel + "").replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( (oldCache = uniqueCache[ key ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context === document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context || document, xml) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( el ) { + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( el ) { + return el.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +}; +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Simple selector that can be filtered directly, removing non-Elements + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + // Complex selector, compare the two sets, removing non-Elements + qualifier = jQuery.filter( qualifier, elements ); + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1; + } ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( nodeName( elem, "iframe" ) ) { + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( jQuery.isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && jQuery.isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( jQuery.isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the master Deferred + master = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + master.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( master.state() === "pending" || + jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return master.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); + } + + return master.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ jQuery.camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ jQuery.camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( jQuery.camelCase ); + } else { + key = jQuery.camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + jQuery.contains( elem.ownerDocument, elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + +var swap = function( elem, options, callback, args ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.apply( elem, args || [] ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, + scale = 1, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + do { + + // If previous iteration zeroed out, double until we get *something*. + // Use string for doubling so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + initialInUnit = initialInUnit / scale; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Update scale, tolerating zero or NaN from tween.cur() + // Break the loop if scale is unchanged or perfect, or if we've just had enough. + } while ( + scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations + ); + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); + +var rscriptType = ( /^$|\/(?:java|ecma)script/i ); + + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // Support: IE <=9 only + option: [ 1, "" ], + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
    " ], + col: [ 2, "", "
    " ], + tr: [ 2, "", "
    " ], + td: [ 3, "", "
    " ], + + _default: [ 0, "", "" ] +}; + +// Support: IE <=9 only +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, contains, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; +} )(); +var documentElement = document.documentElement; + + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 only +// See #13393 for more info +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = {}; + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + // Make a writable jQuery.Event from the native event object + var event = jQuery.event.fix( nativeEvent ); + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: jQuery.isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + this.focus(); + return false; + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + + which: function( event ) { + var button = event.button; + + // Add which for key events + if ( event.which == null && rkeyEvent.test( event.type ) ) { + return event.charCode != null ? event.charCode : event.keyCode; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { + if ( button & 1 ) { + return 1; + } + + if ( button & 2 ) { + return 3; + } + + if ( button & 4 ) { + return 2; + } + + return 0; + } + + return event.which; + } +}, jQuery.event.addProp ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + /* eslint-disable max-len */ + + // See https://github.com/eslint/eslint/issues/3229 + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, + + /* eslint-enable */ + + // Support: IE <=10 - 11, Edge 12 - 13 + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( ">tbody", elem )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.access( src ); + pdataCur = dataPriv.set( dest, pdataOld ); + events = pdataOld.events; + + if ( events ) { + delete pdataCur.handle; + pdataCur.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1>" ); + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = jQuery.contains( elem.ownerDocument, elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rmargin = ( /^margin/ ); + +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + div.style.cssText = + "box-sizing:border-box;" + + "position:relative;display:block;" + + "margin:auto;border:1px;padding:1px;" + + "top:1%;width:50%"; + div.innerHTML = ""; + documentElement.appendChild( container ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = divStyle.marginLeft === "2px"; + boxSizingReliableVal = divStyle.width === "4px"; + + // Support: Android 4.0 - 4.3 only + // Some styles come back with percentage values, even though they shouldn't + div.style.marginRight = "50%"; + pixelMarginRightVal = divStyle.marginRight === "4px"; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + + "padding:0;margin-top:1px;position:absolute"; + container.appendChild( div ); + + jQuery.extend( support, { + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelMarginRight: function() { + computeStyleTests(); + return pixelMarginRightVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }, + + cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style; + +// Return a css property mapped to a potentially vendor prefixed property +function vendorPropName( name ) { + + // Shortcut for names that are not vendor prefixed + if ( name in emptyStyle ) { + return name; + } + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a property mapped along what jQuery.cssProps suggests or to +// a vendor prefixed property. +function finalPropName( name ) { + var ret = jQuery.cssProps[ name ]; + if ( !ret ) { + ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; + } + return ret; +} + +function setPositiveNumber( elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { + var i, + val = 0; + + // If we already have the right measurement, avoid augmentation + if ( extra === ( isBorderBox ? "border" : "content" ) ) { + i = 4; + + // Otherwise initialize for horizontal or vertical properties + } else { + i = name === "width" ? 1 : 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin, so add it if we want it + if ( extra === "margin" ) { + val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); + } + + if ( isBorderBox ) { + + // border-box includes padding, so remove it if we want content + if ( extra === "content" ) { + val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // At this point, extra isn't border nor margin, so remove border + if ( extra !== "margin" ) { + val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } else { + + // At this point, extra isn't content, so add padding + val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // At this point, extra isn't content nor padding, so add border + if ( extra !== "padding" ) { + val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + return val; +} + +function getWidthOrHeight( elem, name, extra ) { + + // Start with computed style + var valueIsBorderBox, + styles = getStyles( elem ), + val = curCSS( elem, name, styles ), + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Computed unit is not pixels. Stop here and return. + if ( rnumnonpx.test( val ) ) { + return val; + } + + // Check for style in case a browser which returns unreliable values + // for getComputedStyle silently falls back to the reliable elem.style + valueIsBorderBox = isBorderBox && + ( support.boxSizingReliable() || val === elem.style[ name ] ); + + // Fall back to offsetWidth/Height when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + if ( val === "auto" ) { + val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ]; + } + + // Normalize "", auto, and prepare for extra + val = parseFloat( val ) || 0; + + // Use the active box-sizing model to add/subtract irrelevant styles + return ( val + + augmentWidthOrHeight( + elem, + name, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: { + "float": "cssFloat" + }, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = jQuery.camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + if ( type === "number" ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = jQuery.camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( i, name ) { + jQuery.cssHooks[ name ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, name, extra ); + } ) : + getWidthOrHeight( elem, name, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = extra && getStyles( elem ), + subtract = extra && augmentWidthOrHeight( + elem, + name, + extra, + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + styles + ); + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ name ] = value; + value = jQuery.css( elem, name ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( !rmargin.test( prefix ) ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && + ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || + jQuery.cssHooks[ tween.prop ] ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = jQuery.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 13 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = jQuery.camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( jQuery.isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + jQuery.proxy( result.stop, result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( jQuery.isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( jQuery.isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + jQuery.isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( jQuery.isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue && type !== false ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = jQuery.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( jQuery.isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( typeof value === "string" && value ) { + classes = value.match( rnothtmlwhite ) || []; + + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( jQuery.isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + if ( typeof value === "string" && value ) { + classes = value.match( rnothtmlwhite ) || []; + + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value; + + if ( typeof stateVal === "boolean" && type === "string" ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( jQuery.isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( type === "string" ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = value.match( rnothtmlwhite ) || []; + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, isFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup contextmenu" ).split( " " ), + function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; +} ); + +jQuery.fn.extend( { + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +} ); + + + + +support.focusin = "onfocusin" in window; + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = jQuery.now(); + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) { + xml = undefined; + } + + if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && jQuery.type( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = jQuery.isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ) + .filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ) + .map( function( i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( jQuery.isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; + } + } + match = responseHeaders[ key.toLowerCase() ]; + } + return match == null ? null : match; + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 13 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available, append data to url + if ( s.data ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( jQuery.isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + + +jQuery._evalUrl = function( url ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + "throws": true + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( jQuery.isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var isFunction = jQuery.isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain requests + if ( s.crossDomain ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Zubehör

    +
    +

    Anschlussset

    +

    Roboception bietet ein optional erhältliches Anschlussset an, um Kunden bei der Einrichtung des rc_visard NG zu unterstützen. Bei dauerhafter Installation muss der Kunde ein geeignetes Netzteil bereitstellen. Das Anschlussset besteht aus folgenden Elementen:

    +
      +
    • Netzwerkkabel mit gerader M12-Buchse und geradem RJ45-Stecker, Länge: 2 m, 5 m oder 10 m
    • +
    • Netzteilkabel mit gerader M12-Buchse und DC-Stecker, Länge: 30 cm
    • +
    • 24 V, 30 W Steckernetzteil, oder 24 V, 60 W Tischnetzteil
    • +
    +

    Für den Anschluss des rc_visard NG an ein Wohn- oder Bürogebäudenetz sind Netzteile erforderlich, die den Emissionsstandards nach EN 55011 Klasse B entsprechen. Das im Anschlussset enthaltene Netzteil E2CFS (30 W, 24 V) der EGSTON System Electronics Eggenburg GmbH (http://www.egston.com) ist entsprechend zertifiziert. Es erfüllt jedoch nicht die Anforderungen in Bezug auf Störaussendungen in Industriebereichen (EN 61000-6-2).

    +
    +_images/rc_visard_connectivity_kit_ng_de.png +

    Abb. 62 Bestandteile des optional erhältlichen Anschlusssets

    +
    +
    +
    +

    Verkabelung

    +

    Kabel sind standardmäßig nicht im Lieferumfang des rc_visard NG enthalten. Es ist Aufgabe des Kunden, geeignete Kabel zu erwerben. In den folgenden Abschnitten wird ein Überblick über die empfohlenen Artikel gegeben.

    +
    +

    Ethernet-Anschluss

    +

    Der rc_visard NG besitzt eine achtpolige M12-Buchse mit A-Kodierung für den Ethernet-Anschluss. Verschiedene Kabellösungen können direkt von Drittanbietern bezogen werden.

    +

    CAT5-Kabel (1 Gbps) für die M12/RJ45-Verbindung

    +
      +
    • Gerader M12-Stecker/Gerader RJ45-Stecker; Kabellänge: 10 m; Phoenix Contact; NBC-MS/10,0-94B/R4AC SCO; Art.-Nr.: 1407417
    • +
    • Gerader M12-Stecker/Gerader RJ45-Stecker; Kabellänge: 10 m; MURR Elektronik; Art.-Nr.: 7700-48521-S4W1000
    • +
    • Gewinkelter M12-Stecker/Gerader RJ45-Stecker; Kabellänge: 10 m; MURR Elektronik; Art.-Nr.: 7700-48551-S4W1000
    • +
    +
    +
    +

    Stromanschluss

    +

    Für den Stromanschluss und die GPIO-Konnektivität ist ein achtpoliger M12-Stecker mit A-Kodierung vorgesehen. Verschiedene Kabellösungen können direkt von Drittanbietern bezogen werden. Eine Auswahl an M12-Kabeln mit offenem Ende ist unten angegeben. Der Kunde muss die Strom- und GPIO-Anschlüsse gemäß der unter Verkabelung angegebenen Steckerbelegung vorsehen. Das Gehäuse des rc_visard NG muss geerdet werden.

    +

    Sensor-/Aktor-Kabel mit M12-Buchse und einseitig offenem Ende

    +
      +
    • Gerade M12-Buchse/Freies Leitungsende, geschirmt; Kabellänge: 10 m; Phoenix Contact; SAC-8P-10,0-PUR/M12FS SH; Art.Nr.: 1522891
    • +
    • Gewinkelte M12-Buchse/Freies Leitungsende, geschirmt; Kabellänge: 10 m; Phoenix Contact; SAC-8P-10,0-PUR/M12FR SH; Art.Nr.: 1522943
    • +
    +

    Sensor-/Aktor-Kabel mit M12-Buchse für die Feldmontage

    +
      +
    • Phoenix Contact; SACC-M12FS-8CON-PG9-M; Art.Nr.:1513347
    • +
    • TE Connectivity T4110011081-000 (Metallgehäuse)
    • +
    • TE Connectivity T4110001081-000 (Kunststoffgehäuse)
    • +
    +
    +
    +

    Netzteile

    +

    Der rc_visard NG ist als EN-55011 Klasse B Gerät klassifiziert, und für kommerzielle, industrielle und geschäftliche Einsatzbereiche vorgesehen. Um den Sensor an ein Gebäudenetz anschließen zu können, wird ein Netzteil gemäß EN 55011/55022 Klasse B benötigt.

    +

    Es ist Aufgabe des Kunden, ein Netzteil zu erwerben und zu installieren, das den Anforderungen der EN 61000-6-2 für die dauerhafte Installation in einem industriellen Umfeld entspricht. Ein Beispiel, das sowohl der EN 61000-6-2 als auch der EN 55011/55022 Klasse B entspricht, ist das Hutschienen-Netzteil PULS MiniLine ML60.241 (24 VDC; 2,5 A) der PULS GmbH (http://www.pulspower.com). Die Installation muss von einem qualifizierten Elektriker vorgenommen werden.

    +

    Es darf immer nur ein rc_visard NG an ein Netzteil angeschlossen werden. Die Länge der verwendeten Kabel darf 30 Meter nicht überschreiten.

    +
    +
    +
    +

    Ersatzteile

    +

    Für den rc_visard NG sind derzeit keine Ersatzteile erhältlich.

    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/appendix.html b/v24.04/de/appendix.html new file mode 100644 index 0000000..bb65bf0 --- /dev/null +++ b/v24.04/de/appendix.html @@ -0,0 +1,711 @@ + + + + + + + + + + + Anhang — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Anhang

    +
    +

    Formate für Posendaten

    +

    Eine Pose besteht aus einer Translation und einer Rotation. Die Translation definiert die Verschiebung entlang der \(x\), \(y\) und \(z\)-Achsen. Die Rotation kann auf viele verschiedene Arten definiert werden. Der rc_visard NG benutzt Quaternionen, um Rotationen zu definieren, und Translationen werden in Metern angegeben. Dies wird als XYZ+Quaternion Format bezeichnet. Dieses Kapitel erklärt Umrechnungen zwischen verschiedenen üblichen Posenformaten und dem XYZ+Quaternion Format.

    +

    Es ist weit verbreitet, Rotationen in 3D durch drei Winkel als Drehungen um die Koordinatenachsen zu definieren. Leider existieren hierfür viele verschiedene Möglichkeiten. Übliche Konventionen sind Euler- oder Kardanwinkel (letztere werden auch als Tait-Bryan Winkel bezeichnet). In beiden Konventionen können die drei Rotationen auf die bereits gedrehten Achsen (intrinsische Rotation) oder auf die Achsen des festen Koordinatensystems (extrinsische Rotation) angewendet werden.

    +

    Wir benutzen \(x\), \(y\) und \(z\) zur Bezeichnung der drei Koordinatenachsen. \(x'\), \(y'\) und \(z'\) bezeichnen die Achsen, die einmal rotiert wurden. \(x''\), \(y''\) und \(z''\) bezeichnen die Achsen nach zwei Rotationen.

    +

    In der ursprünglichen Eulerwinkelkonvention ist die erste und dritte Drehachse immer identisch. Die Rotationsreihenfolge \(z\)-\(x'\)-\(z''\) bedeutet z.B. eine Drehung um die \(z\)-Achse, dann eine Drehung um die gedrehte \(x\)-Achse und schließlich eine Drehung um die (zweimal) gedrehte \(z\)-Achse. In der Kardanwinkelkonvention sind alle drei Drehachsen unterschiedlich, z.B. \(z\)-\(y'\)-\(x''\). Kardanwinkel werden häufig ebenfalls als Eulerwinkel bezeichnet.

    +

    Für jede intrinsische Rotationsreihenfolge gibt es eine äquivalente extrinsische Rotationsreihenfolge, die genau umgekehrt ist. Die intrinsische Rotationsreihenfolge \(z\)-\(y'\)-\(x''\) ist zum Beispiel äquivalent zu der extrinsischen Rotationsreihenfolge \(x\)-\(y\)-\(z\).

    +

    Rotationen um die \(x\), \(y\) und \(z\)-Achse können mit Quaternionen definiert werden als

    +
    +\[\begin{split}\begin{align*} +r_x(\alpha) &= \left(\begin{array}{c}\sin\frac{\alpha}{2} \\ 0 \\ 0 \\ \cos\frac{\alpha}{2}\end{array}\right)\text{,} & +r_y(\beta) &= \left(\begin{array}{c}0 \\ \sin\frac{\beta}{2} \\ 0 \\ \cos\frac{\beta}{2}\end{array}\right)\text{,} & +r_z(\gamma) &= \left(\begin{array}{c}0 \\ 0 \\ \sin\frac{\gamma}{2} \\ \cos\frac{\gamma}{2}\end{array}\right)\text{,} +\end{align*}\end{split}\]
    +

    oder durch Rotationsmatrizen als

    +
    +\[\begin{split}r_x(\alpha) &= +\left(\begin{array}{ccc} + 1 & 0 & 0 \\ + 0 & \cos\alpha & -\sin\alpha \\ + 0 & \sin\alpha & \cos\alpha +\end{array}\right)\text{,} \\ +r_y(\beta) &= +\left(\begin{array}{ccc} + \cos\beta & 0 & \sin\beta \\ + 0 & 1 & 0 \\ + -\sin\beta & 0 & \cos\beta +\end{array}\right)\text{,} \\ +r_z(\gamma) &= +\left(\begin{array}{ccc} + \cos\gamma & -\sin\gamma & 0 \\ + \sin\gamma & \cos\gamma & 0 \\ + 0 & 0 & 1 +\end{array}\right)\text{.}\end{split}\]
    +

    Die extrinsische Rotationsreihenfolge \(x\)-\(y\)-\(z\) kann durch die Multiplikation einzelner Rotationen in umgekehrter Reihenfolge berechnet werden, d.h. \(r_z(\gamma) r_y(\beta) r_x(\alpha)\).

    +

    Basierend auf diesen Definitionen beschreiben die folgenden Abschnitte die Umrechnung zwischen üblichen Konventionen und dem XYZ+Quaternion Format.

    +
    +

    Bemerkung

    +

    Zu beachten sind stets die Einheiten für Positionen und Orientierungen. rc_visard NG Geräte benutzen stets Meter als Längeneinheit, während die meisten Roboterhersteller Längen in Millimeter oder Inch angeben. Winkel werden üblicherweise in Grad angegeben, können aber auch im Bogenmaß angegeben sein.

    +
    + +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/blaze.html b/v24.04/de/blaze.html new file mode 100644 index 0000000..3b29b1c --- /dev/null +++ b/v24.04/de/blaze.html @@ -0,0 +1,1465 @@ + + + + + + + + + + + Blaze — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Blaze

    +

    Das Blaze Softwaremodul ist ein Basismodul, welches auf jedem rc_visard NG verfügbar ist, und stellt Disparitäts-, Konfidenz- und Fehlerbilder einer angeschlossenen Basler blaze RGB-D Kamera zur Verfügung, d.h. einer blaze Time-of-Flight (ToF) Kamera in Kombination mit einer Basler aceA1300 Farbkamera.

    +

    Nach dem Anschluss eines Basler blaze Sensors an den rc_cube kann es bis zu einer Minute dauern, bis dieser gefunden wird. Beim erstmaligen Anschluss an den rc_cube ist der Sensor noch unkalibriert und muss kalibriert werden, bevor er verwendet werden kann. Die Kalibrierung erfolgt über die Web GUI auf der Seite Kamerakalibrierung unter Konfiguration in der entsprechenden Pipeline. Sobald die Kalibrierung gespeichert wurde, verbleibt sie permanent auf dem rc_cube und wird automatisch angewendet, wenn der blaze Sensor wieder mit dem rc_cube verbunden wird, unabhängig von Port und Kamerapipeline.

    +

    Das Blaze Modul läuft nur in Kamerapipelines vom Typ blaze.

    +
    +

    Anzeigen und Herunterladen von Tiefenbildern und Punktwolken

    +

    Der rc_visard NG stellt über die GenICam-Schnittstelle zeitgestempelte Disparitäts-, Fehler- und Konfidenzbilder zur Verfügung (siehe Verfügbare Bild-Streams). Live-Streams in geringerer Qualität werden auf der Tiefenbild Seite in der Web GUI bereitgestellt.

    +

    Die Web GUI bietet weiterhin die Möglichkeit, einen Schnappschuss der aktuellen Szene mit den Tiefen-, Fehler und Konfidenzbildern, sowie der Punktwolke als .tar.gz-Datei zu speichern, wie in Herunterladen von Kamerabildern beschrieben wird.

    +
    +
    +

    Parameter

    +

    Das Blaze Modul wird in der REST-API als rc_blaze bezeichnet und in der Web GUI auf der Seite Tiefenbild in der gewünschten Pipeline dargestellt. Der Benutzer kann die Blaze-Parameter entweder dort oder über die REST-API (REST-API-Schnittstelle) ändern.

    +
    +

    Übersicht über die Parameter

    +

    Dieses Softwaremodul bietet folgende Laufzeitparameter:

    + + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Laufzeitparameter des rc_blaze-Moduls
    NameTypMin.Max.DefaultBeschreibung
    acquisition_modestring--ContinuousAufnahmemodus: [Continuous, SingleFrame]
    ambiguity_filterboolfalsetruetrueMehrdeutigkeitsfilter
    ambiguity_filter_thresholdint320255204Mehrdeutigkeitsfilterschwelle
    exp_valuefloat640.00010.0010.001Belichtungszeit der ToF-Kamera
    fillint32043Toleranz für das Füllen von Löchern in Pixeln
    gamma_correctionboolfalsetruetrueGammakorrektur
    maxdepthfloat640.0110.010.0Maximaler Abstand in Metern
    minconffloat640.01.00.00488Minimale Konfidenz
    mindepthfloat640.110.00.1Minimaler Abstand in Metern
    outlier_removalboolfalsetruetrueAusreißer entfernen
    outlier_removal_thresholdint32085Schwellwert für die Ausreißerentfernung
    segint3204000200Mindestgröße der gültigen Disparitätssegmente in Pixeln
    spatial_filterboolfalsetruetrueRäumlicher Filter
    temporal_filterboolfalsetrue„trueTemporalfilter
    temporal_filter_strengthint3250255200Stärke des Temporalfilters
    thermal_drift_correctionboolfalsetruetrueKorrektur der thermischen Verschiebung
    +
    +
    +

    Beschreibung der Laufzeitparameter

    +

    Jeder Laufzeitparameter ist durch eine eigene Zeile auf der Seite Tiefenbild der Web GUI repräsentiert. Der Web GUI-Name des Parameters ist in Klammern hinter dem Namen des Parameters angegeben und die Parameter werden in der Reihenfolge, in der sie in der Web GUI erscheinen, aufgelistet:

    +
    +

    exp_value (Belichtungszeit)

    +
    +
    +

    Dieser Wert ist die Belichtungszeit der blaze Kamera in Sekunden. Damit wird gesteuert, wie lange die lichtempfindlichen Zellen dem Licht ausgesetzt werden. Wenn der Betriebsmodus geändert wird, wird die Belichtungszeit auf den empfohlenen Standardwert gesetzt. Eine Verkürzung der Belichtungszeit kann die Messgenauigkeit verringern und wird nur empfohlen, wenn das Bild überbelichtet ist.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?exp_value=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_blaze/parameters?exp_value=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    acquisition_mode (Aufnahmemodus)

    +
    +
    +

    Der Aufnahmemodus kann auf ‚Kontinuierlich‘ (Continuous) oder ‚Einzelbild‘ (SingleFrame) eingestellt werden. Der Standardwert ist ‚Kontinuierlich‘ und liefert dauerhaft Tiefenbilder. Im Einzelbildmodus werden nur Bilder aufgenommen, wenn Aufnehmen gedrückt wird.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?acquisition_mode=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_blaze/parameters?acquisition_mode=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    mindepth (Minimaler Abstand)

    +
    +

    Dieser Wert bezeichnet den geringsten Abstand zur Kamera, ab dem Messungen möglich sind. Der minimale Abstand wird in Metern angegeben.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?mindepth=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_blaze/parameters?mindepth=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    maxdepth (Maximaler Abstand)

    +
    +

    Dieser Wert ist der größte Abstand zur Kamera, bis zu dem Messungen möglich sind. Pixel mit größeren Distanzwerten werden auf „ungültig“ gesetzt. Der maximale Abstand wird in Metern angegeben.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?maxdepth=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_blaze/parameters?maxdepth=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    fill (Fill-in)

    +
    +

    Diese Option wird verwendet, um Löcher im Disparitätsbild durch Interpolation zu füllen. Der Füllwert gibt die maximale Disparitätsabweichung am Rand des Lochs an. Größere Füllwerte können die Anzahl an Löchern verringern, aber die interpolierten Werte können größere Fehler aufweisen. Maximal 5% der Pixel werden interpoliert. Kleine Löcher werden dabei bevorzugt interpoliert. Die Konfidenz für die interpolierten Pixel wird auf einen geringen Wert von 0,5 eingestellt. Das Auffüllen lässt sich deaktivieren, wenn der Wert auf 0 gesetzt wird.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?fill=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_blaze/parameters?fill=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    seg (Segmentation)

    +
    +

    Der Segmentierungsparameter wird verwendet, um die Mindestanzahl an Pixeln anzugeben, die eine zusammenhängende Disparitätsregion im Disparitätsbild ausfüllen muss. Isolierte Regionen, die kleiner sind, werden im Disparitätsbild auf ungültig gesetzt. Der Wert bezieht sich immer auf ein Disparitätsbild mit hoher Qualität (halbe Auflösung) und muss nicht verändert werden, wenn andere Qualitäten gewählt werden. Die Segmentierung eignet sich, um Disparitätsfehler zu entfernen. Bei größeren Werten kann es jedoch vorkommen, dass real vorhandene Objekte entfernt werden.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?seg=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_blaze/parameters?seg=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    minconf (Minimale Konfidenz)

    +
    +

    Die minimale Konfidenz lässt sich einstellen, um potenziell falsche Disparitätsmessungen herauszufiltern. Dabei werden alle Pixel, deren Konfidenz unter dem gewählten Wert liegt, im Disparitätsbild auf „ungültig“ gesetzt.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?minconf=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_blaze/parameters?minconf=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    spatial_filter (Räumlicher Filter)

    +
    +

    Dieser Parameter aktiviert den räumlichen Rauschfilter. Dieser Filter verwendet die Werte benachbarter Pixel, um das Rauschen in einem Bild zu minimieren. Er basiert auf den Rohdaten des Bildes.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?spatial_filter=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_blaze/parameters?spatial_filter=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    temporal_filter (Temporalfilter)

    +
    +

    Dieser Parameter aktiviert den zeitlichen Rauschfilter. Dieser Filter verwendet die Werte desselben Pixels zu verschiedenen Zeitpunkten, um das Rauschen in einem Bild herauszufiltern. Er basiert auf den Tiefendaten des Bildes.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?temporal_filter=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_blaze/parameters?temporal_filter=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    temporal_filter_strength (Temporalfilterstärke)

    +
    +

    Dieser Parameter ist Stärke des zeitlichen Filters. Je höher der Wert, desto stärker ist der Filter. Hohe Werte können Bewegungsartefakte verursachen, während niedrige Werte die Wirksamkeit des Filters verringern.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?temporal_filter_strength=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_blaze/parameters?temporal_filter_strength=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    outlier_removal (Ausreißer minimieren)

    +
    +

    Dieser Parameter aktiviert den Filter zum Entfernen von Ausreißern. Dieser Filter entfernt Pixel, die sich signifikant von ihrer lokalen Umgebung unterscheiden.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?outlier_removal=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_blaze/parameters?outlier_removal=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    outlier_removal_threshold (Schwellenwert)

    +
    +

    Dieser Parameter ist die Stärke des Ausreißerentfernungsfilters. Je höher der Wert, desto mehr Ausreißer werden entfernt.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?outlier_removal_threshold=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_blaze/parameters?outlier_removal_threshold=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    ambiguity_filter (Mehrdeutigkeitsfilter)

    +
    +

    Dieser Parameter aktiviert den Mehrdeutigkeitsfilter. Der Mehrdeutigkeitsfilter entfernt Pixel, deren Tiefendaten mehrdeutig sind. In bestimmten anspruchsvollen Szenen, z.B. aufgrund von Streulicht oder Multipath-Effekten, kann die Erkennung fehlschlagen. In diesem Fall sollte der Filter deaktiviert werden.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?ambiguity_filter=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_blaze/parameters?ambiguity_filter=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    ambiguity_filter_threshold (Mehrdeutigkeitsfilterschwelle)

    +
    +

    Dieser Parameter bestimmt die Stärke des Mehrdeutigkeitsfilters. Je höher der Wert, desto stärker ist der Filter. Höhere Werte erhöhen die Verlässlichkeit des Filters.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?ambiguity_filter_threshold=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_blaze/parameters?ambiguity_filter_threshold=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    gamma_correction (Gammakorrektur)

    +
    +

    Dieser Parameter aktiviert die Gammakorrektur für das Intensitätsbild. Das ist eine nichtlineare Operation, um die dunklen Bereiche des Bildes aufzuhellen.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?gamma_correction=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_blaze/parameters?gamma_correction=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    thermal_drift_correction (Thermische Verschiebung)

    +
    +

    Dieser Parameter aktiviert die Korrektur der thermischen Verschiebung.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?thermal_drift_correction=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_blaze/parameters?thermal_drift_correction=<value>
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    Statuswerte

    +

    Dieses Modul meldet folgende Statuswerte:

    + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
    Statuswerte des rc_blaze-Moduls
    NameBeschreibung
    fpsTatsächliche Bildwiederholrate der Disparitäts-, Fehler- und Konfidenzbilder. Dieser Wert wird unter der Bildvorschau in der Web GUI als Bildwiederholrate (Hz) angezeigt.
    latencyZeit zwischen Bildaufnahme und Weitergabe des Disparitätsbildes in Sekunden
    widthAktuelle Breite des Disparitäts-, Fehler- und Konfidenzbilds in Pixeln
    heightAktuelle Höhe des Disparitäts-, Fehler- und Konfidenzbilds in Pixeln
    mindepthTatsächlicher minimaler Arbeitsabstand in Metern
    maxdepthTatsächlicher maximaler Arbeitsabstand in Metern
    +
    +
    +

    Services

    +

    Das Blaze Modul bietet folgende Services.

    +
    +

    acquisition_trigger

    +
    +

    signalisiert dem Modul, ein Tiefenbild aufzunehmen, falls acquisition_mode auf SingleFrame (Einzelbild) eingestellt ist.

    +

    Details

    +
    +

    Es wird ein Fehler zurückgegeben, falls acquisition_mode auf Continuous (Kontinuierlich) eingestellt ist.

    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/services/acquisition_trigger
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_blaze/services/acquisition_trigger
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Mögliche Rückgabewerte sind in der Tabelle unten aufgeführt.

    + + ++++ + + + + + + + + + + + + + + + + + + + +
    Mögliche Rückgabewerte des acquisition_trigger Serviceaufrufs.
    CodeBeschreibung
    0Erfolgreich
    -8Triggern ist nur im Einzelbild-Modus möglich.
    101Triggern wird ignoriert, da bereits ein anderer Triggeraufruf stattfindet.
    102Triggern wird ignoriert, da keine Empfänger registriert sind.
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "acquisition_trigger",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    reset_defaults

    +
    +

    stellt die Werkseinstellungen der Parameter dieses Moduls wieder her und wendet sie an („factory reset“).

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/services/reset_defaults
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_blaze/services/reset_defaults
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "reset_defaults",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/cadmatch.html b/v24.04/de/cadmatch.html new file mode 100644 index 0000000..b952dc0 --- /dev/null +++ b/v24.04/de/cadmatch.html @@ -0,0 +1,3143 @@ + + + + + + + + + + + CADMatch — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    CADMatch

    +
    +

    Einleitung

    +

    Das CADMatch Modul ist ein optionales Modul des rc_visard NG und benötigt eine eigene Lizenz, welche erworben werden muss.

    +

    Dieses Modul bietet eine gebrauchsfertige Lösung für die 3D-Objekterkennung anhand von CAD-Templates und liefert Greifpunkte für allgemeine Greifer. Die Objekte können sich in einer Kiste (Bin, Load Carrier) oder frei platziert im Erfassungsbereich der Kamera befinden.

    +

    Für jedes Objekt, das mit dem CADMatch-Modul erkannt werden soll, wird ein Template benötigt. Um Templates zu erhalten, setzen Sie sich bitte mit dem Roboception Support (Kontakt) in Verbindung.

    +

    Das CADMatch-Modul bietet darüber hinaus:

    +
      +
    • eine intuitiv gestaltete Bedienoberfläche für Inbetriebnahme, Konfiguration und Test auf der rc_visard NG Web GUI
    • +
    • eine REST-API-Schnittstelle und eine KUKA Ethernet KRL Schnittstelle
    • +
    • die Möglichkeit, sogenannte Regions of Interest (ROIs) zu definieren, um relevante Teilbereiche der Szene auszuwählen (siehe RoiDB)
    • +
    • eine integrierte Load Carrier Erkennung (siehe LoadCarrier), um in Bin-Picking-Anwendungen („Griff in die Kiste“) Greifpunkte nur für Objekte in dem erkannten Load Carrier zu berechnen
    • +
    • die Unterstützung von Load Carriern mit Abteilen, sodass Greifpunkte für Objekte nur in einem definierten Teilvolumen des Load Carriers berechnet werden
    • +
    • die Option benutzerdefinierte Posenvorgaben zu nutzen
    • +
    • die Speicherung von bis zu 50 Templates
    • +
    • die Definition von bis zu 100 Greifpunkten für jedes Template über eine interaktive Visualisierung in der Web GUI
    • +
    • eine Kollisionsprüfung zwischen Greifer und Load Carrier, anderen erkannten Objekten, und/oder der Punktwolke
    • +
    • eine Kollisionsprüfung zwischen dem Objekt im Greifer und den Wänden des Load Carriers während der Entnahme
    • +
    • die Unterstützung von sowohl statisch montierten als auch robotergeführten Kameras. Optional kann es mit der Hand-Auge-Kalibrierung kombiniert werden, um Greifposen in einem benutzerdefinierten externen Koordinatensystem zu liefern.
    • +
    • Auswahl einer Strategie zum Sortieren der erkannten Objekte und zurückgelieferten Greifpunkte
    • +
    • eine 3D Visualisierung des Detektionsergebnisses mit Greifpunkten und einer Greiferanimation in der Web GUI
    • +
    +
    +
    +

    Setzen von Greifpunkten

    +

    Das CADMatch-Modul erkennt 3D-Objekte in einer Szene basierend auf einem CAD-Template und liefert die Posen der Objektursprünge zurück. Um das CADMatch-Modul direkt in einer Roboteranwendung zu nutzen, können für jedes Template bis zu 100 Greifpunkte definiert werden. Ein Greifpunkt repräsentiert die gewünschte Position und Orientierung des Roboter-TCPs (Tool Center Point), mit der das Objekt gegriffen werden kann.

    +

    Weitere Details sind unter Setzen von Greifpunkten beschrieben.

    +
    +

    Setzen von Greifpunkten in der Web GUI

    +

    Die rc_visard NG Web GUI bietet eine interaktive und intuitive Möglichkeit, Greifpunkte für Objekt-Templates zu setzen. Im ersten Schritt muss das Objekt-Template auf den rc_visard NG hochgeladen werden. Das kann über die Web GUI in einer beliebigen Kamerapipeline unter Module ‣ CADMatch erfolgen, indem im Abschnitt Templates, Greifpunkte und Posenvorgaben auf + Neues Template hinzufügen geklickt wird, oder unter Datenbank ‣ Templates im Abschnitt CADMatch Templates, Greifpunkte und Posenvorgaben. Wenn der Upload abgeschlossen ist, erscheint ein Fenster mit einer 3D-Visualisierung des Objekts, in dem Greifpunkte hinzugefügt oder existierende Greifpunkte bearbeitet werden können. Dasselbe Fenster erscheint, wenn ein vorhandenes Template bearbeitet wird.

    +

    Weitere Details werden in Setzen von Greifpunkten in der Web GUI beschrieben.

    +
    +
    +

    Setzen von Greifpunkten über die REST-API

    +

    Greifpunkte können über die REST-API-Schnittstelle mithilfe des set_grasp oder set_all_grasps Services gesetzt werden (siehe Interne Services).

    +

    Weitere Details werden in Setzen von Greifpunkten über die REST-API beschrieben.

    +
    +
    +
    +

    Setzen von Posenvorgaben

    +

    Das CADMatch Modul bietet die Möglichkeit, Posenvorgaben für die zu erkennenden Objekte zu definieren. Wenn eine Posenvorgabe gesetzt ist, nutzt die Objekterkennung diese Pose und führt nur eine Verfeinerung durch. Dadurch wird die Erkennung deutlich beschleunigt. Eine Posenvorgabe stellt die ungefähre Position und Orientierung des zu erkennenden Objekts dar. Die Pose kann im Kamera- oder im externen Koordinatensystem definiert werden, wenn eine Hand-Auge-Kalibrierung verfügbar ist.

    +

    Jede Posenvorgabe enthält eine id, die eindeutig über alle Posenvorgaben eines Objekt-Templates sein muss, die ID des Templates (template_id), zu dem die Posenvorgabe hinzugefügt wird, die Posenvorgabe (pose) und das Koordinatensystem (pose_frame) der Pose. Posenvorgaben können über die REST-API-Schnittstelle, oder über die interaktive Visualisierung in der Web GUI definiert werden. Die Web GUI ermöglicht die interaktive Positionierung des Objekts in der aktuellen Punktwolke. Dies kann im Reiter „Posenvorgaben“ während des Editieren eines Templates geschehen.

    +

    Posenvorgaben können in Anwendungen genutzt werden, in denen die ungefähren Posen der Objekte im Voraus bekannt sind. Der rc_visard NG kann bis zu 50 Posenvorgaben pro Template speichern.

    +
    +
    +

    Setzen der bevorzugten TCP-Orientierung

    +

    Das CADMatch-Modul berechnet die Erreichbarkeit von Greifpunkten basierend auf der bevorzugten Orientierung des Greifers oder TCPs. Die bevorzugte Orientierung kann über den Service set_preferred_orientation oder über die CADMatch-Seite in der Web GUI gesetzt werden. Die bevorzugten Orientierung des TCPs wird genutzt, um Greifpunkte zu verwerfen, die der Greifer nicht erreichen kann, und kann auch zur Sortierung der Greifpunkte genutzt werden.

    +

    Die bevorzugte TCP-Orientierung kann im Kamerakoordinatensystem oder im externen Koordinatensystem gesetzt werden, wenn eine Hand-Auge-Kalibrierung verfügbar ist. Wenn die bevorzugte TCP-Orientierung im externen Koordinatensystem definiert ist, und der Sensor am Roboter montiert ist, muss bei jedem Aufruf der Objekterkennung die aktuelle Roboterpose angegeben werden, damit die bevorzugte Orientierung zur Filterung und optional zur Sortierung der Greifpunkte auf den erkannten Objekten genutzt werden kann. Wenn keine bevorzugte TCP-Orientierung gesetzt wird, wird die Orientierung der linken Kamera als die bevorzugte TCP-Orientierung genutzt.

    +
    +
    +

    Setzen der Sortierstrategie

    +

    Die vom detect_object Service zurückgelieferten Matches und Greifpunkte werden gemäß einer Sortierstrategie sortiert, die vom Nutzer gewählt werden kann. Folgende Sortierstrategien sind verfügbar und können über die Web GUI oder über den set_sorting_strategies Service gesetzt werden:

    +
      +
    • gravity: die entlang der Gravitationsrichtung am höchsten gelegenen Matches und Greifpunkte werden zuerst zurückgeliefert.
    • +
    • match_score: Matches mit dem höchsten Match Score und Greifpunkte auf Objekten mit dem höchsten Match Score werden zuerst zurückgeliefert.
    • +
    • preferred_orientation: Matches und Greifpunkte mit der geringsten Rotationsänderung zwischen ihrer Orientierung und der bevorzugten TCP-Orientierung werden zuerst zurückgeliefert.
    • +
    • direction: Matches und Greifpunkte mit dem kleinsten Abstand entlang der gesetzten Sortierrichtung vector im angegebenen Referenzkoordinatensystem pose_frame werden zuerst zurückgeliefert.
    • +
    +

    Wenn keine Sortierstrategie gesetzt ist, oder die Standard-Sortierstrategie in der Web GUI ausgewählt ist, geschieht die Sortierung der Greifpunkte basierend auf einer Kombination von match_score und dem kleinsten Abstand entlang der z-Achse der bevorzugten TCP-Orientierung von der Kamera.

    +
    +
    +

    Objekterkennung

    +

    Das CADMatch-Modul benötigt ein Objekt-Template für die Objekterkennung. Dieses Template enthält Informationen über die dreidimensionale Form des Objekts und markante Kanten, die im Kamerabild sichtbar sein können. CADMatch unterstützt auch partielle Objekt-Templates, die nur einen bestimmten Teil des Objekts beinhalten, der gut erkannt werden kann, zum Beispiel im Fall von Verdeckungen. Weiterhin gibt es Templates, die eine Posenvorgabe zur Erkennung benötigen, die dann nur mit Hilfe die Bilddaten verfeinert wird.

    +

    Die Objekterkennung ist ein zweistufiger Prozess bestehend aus einem initialen Schätzungsschritt und einem Posenverfeinerungsschritt. Als erstes wird die initiale Pose des Objekts anhand der Erscheinung des Objekts im Kamerabild berechnet. Als zweiter Schritt wird die geschätzte Pose anhand der 3D-Punktwolke und der Kanten im Kamerabild verfeinert. Damit das funktionieren kann, müssen die zu detektierenden Objekte im linken und rechten Kamerabild sichtbar sein. Wenn Posenvorgaben gesetzt wurden, findet nur der zweite Verfeinerungsschritt statt, was die Laufzeit deutlich verringert.

    +

    Um eine Objekterkennung durchzuführen, müssen im Allgemeinen die folgenden Serviceargumente an das CADMatch-Modul übergeben werden:

    +
      +
    • die ID des Objekt-Templates, welches in der Szene erkannt werden soll
    • +
    • das Koordinatensystem, in dem die Posen der detektierten Objekte zurückgegeben werden sollen (siehe Hand-Auge-Kalibrierung)
    • +
    +

    Optional können auch folgende Serviceargumente an das CADMatch-Modul übergeben werden:

    +
      +
    • die IDs der Posenvorgaben, die ungefähr den Posen der zu erkennenden Objekten entsprechen. Falls ein Template verwendet wird, das eine Posenvorgabe benötigt, müssen eine oder mehrere Posenvorgaben angegeben werden.
    • +
    • die ID des Load Carriers, der die zu detektierenden Objekte enthält
    • +
    • ein Unterabteil (load_carrier_compartment) innerhalb eines Load Carriers, in dem Objekte erkannt werden sollen (siehe Load Carrier Abteile).
    • +
    • die ID der Region of Interest, innerhalb der nach dem Load Carrier gesucht wird, oder – falls kein Load Carrier angegeben ist – die Region of Interest, innerhalb der Objekte erkannt werden sollen
    • +
    • die aktuelle Roboterpose, wenn die Kamera am Roboter montiert ist und als Koordinatensystem external gewählt wurde, oder die bevorzugte TCP-Orientierung im externen Koordinatensystem angegeben ist, oder die gewählte Region of Interest im externen Koordinatensystem definiert ist
    • +
    • Informationen für die Kollisionsprüfung: Die ID des Greifers, um die Kollisionsprüfung zu aktivieren, und optional ein Greif-Offset, der die Vorgreifposition definiert. Details zur Kollisionsprüfung sind in CollisionCheck gegeben.
    • +
    • Datenaufnahme-Modus: Der Nutzer kann auswählen, ob ein neuer Bilddatensatz für die Erkennung aufgenommen werden soll (Standardwert), oder ob die Detektion mit den zuletzt verwendeten Bilddaten durchgeführt soll.Dies spart die Bildaufnahmezeit, z.B. für den Fall, dass verschiedene Templates im selben Bild erkannt werden sollen.
    • +
    +

    In der Web GUI kann die Objekterkennung in Bereich Ausprobieren auf der CADMatch-Seite getestet werden.

    +

    Die erkannten Objekte werden in einer Liste von matches zurückgeliefert, die entsprechend der gewählten Sortierstrategie sortiert ist. Jedes erkannte Objekt enthält eine uuid (Universally Unique Identifier) und den Zeitstempel (timestamp) des ältesten Bildes, das zur Erkennung benutzt wurde. Die Pose (pose) eines erkannten Objekts entspricht der Pose des Ursprungs des Koordinatensystems des Objekt-Templates, das zur Detektion verwendet wurde. Weiterhin wird ein Matching-Score zurückgegeben, der die Qualität der Erkennung angibt.

    +

    Wenn das ausgewählte Template auch Greifpunkte hat (siehe Setzen von Greifpunkten), dann wird zusätzlich zu den erkannten Objekten auch eine Liste von Greifpunkten (grasps) für alle erkannten Objekte zurückgegeben. Diese Liste ist gemäß der gewählten Sortierstrategie sortiert (siehe Setzen der Sortierstrategie). Die Posen der Greifpunkte sind im gewünschten Koordinatensystem angegeben. Die erkannten Objekte und die Greifpunkte können über ihre UUIDs einander zugeordnet werden.

    +

    Für Objekte mit einer diskreten Symmetrie (z.B. prismatische Objekte), werden alle kollisionsfreien Symmetrien jedes Greifpunkts, die entsprechend der gesetzten bevorzugten TCP-Orientierung erreichbar sind, zurückgeliefert, und gemäß der gewählten Sortierstrategie sortiert.

    +

    Bei Objekten mit einer kontinuierlichen Symmetrie (z.B. zylindrische Objekte), werden alle Symmetrien eines Greifpunkts auf Erreichbarkeit und Kollisionsfreiheit geprüft, und anschließend nur der jeweilige beste gemäß der gewählten Sortierstrategie zurückgeliefert.

    +
    +

    Bemerkung

    +

    Der erste Aufruf der Objekterkennung mit einem neuen Objekt-Template dauert etwas länger als die nachfolgenden Aufrufe, weil das Template erst in das CADMatch-Modul geladen werden muss. Um das zu vermeiden, kann der warmup_template Service genutzt werden, der das Template lädt damit es bereit ist, wenn die erste Detektion getriggert wird.

    +
    +
    +
    +

    Wechselwirkung mit anderen Modulen

    +

    Die folgenden, intern auf dem rc_visard NG laufenden Module liefern Daten für das CADMatch-Modul oder haben Einfluss auf die Datenverarbeitung.

    +
    +

    Bemerkung

    +

    Jede Konfigurationsänderung dieser Module kann direkte Auswirkungen auf die Qualität oder das Leistungsverhalten des CADMatch-Moduls haben.

    +
    +
    +

    Stereokamera und Stereo-Matching

    +

    Folgende Daten werden vom CADMatch-Modul verarbeitet:

    +
      +
    • die rektifizierten Bilder des Kamera-Moduls (rc_camera)
    • +
    • die Disparitäts-, Konfidenz- und Fehlerbilder des Stereo-Matching-Moduls (rc_stereomatching)
    • +
    +

    Der Parameter Qualität (quality) des Stereo-Matching-Moduls muss auf Medium oder höher gesetzt werden (siehe Parameter). Die Einstellung Full oder High wird für CADMatch empfohlen.

    +

    Für alle genutzten Bilder ist garantiert, dass diese nach dem Auslösen des Services aufgenommen wurden.

    +
    +
    +

    IOControl und Projektor-Kontrolle

    +

    Für den Anwendungsfall, dass der rc_visard NG zusammen mit einem externen Musterprojektor und dem Modul für IOControl und Projektor-Kontrolle (rc_iocontrol) betrieben wird, wird empfohlen, den Projektor an GPIO Out 1 anzuschließen und den Aufnahmemodus des Stereokamera-Moduls auf SingleFrameOut1 zu setzen (siehe Stereomatching-Parameter), damit bei jedem Aufnahme-Trigger ein Bild mit und ohne Projektormuster aufgenommen wird.

    +

    Alternativ kann der verwendete digitale Ausgang in den Betriebsmodus ExposureAlternateActive geschaltet werden (siehe Beschreibung der Laufzeitparameter).

    +

    In beiden Fällen sollte die Belichtungszeitregelung (exp_auto_mode) auf AdaptiveOut1 gesetzt werden, um die Belichtung beider Bilder zu optimieren (siehe Stereokamera-Parameter).

    +
    +
    +

    Hand-Auge-Kalibrierung

    +

    Falls die Kamera zu einem Roboter kalibriert wurde, kann das CADMatch-Modul automatisch Posen im Roboterkoordinatensystem ausgeben. Für die Services kann das Koordinatensystem der berechneten Posen mit dem Argument pose_frame spezifiziert werden.

    +

    Zwei verschiedene Werte für pose_frame können gewählt werden:

    +
      +
    1. Kamera-Koordinatensystem (camera): Alle Posen sind im Kamera-Koordinatensystem angegeben und es ist kein zusätzliches Wissen über die Lage der Kamera in seiner Umgebung notwendig. Das bedeutet insbesondere, dass sich ROIs oder Load Carrier, welche in diesem Koordinatensystem angegeben sind, mit der Kamera bewegen. Es liegt daher in der Verantwortung des Anwenders, in solchen Fällen die entsprechenden Posen der Situation entsprechend zu aktualisieren (beispielsweise für den Anwendungsfall einer robotergeführten Kamera).
    2. +
    3. Benutzerdefiniertes externes Koordinatensystem (external): Alle Posen sind im sogenannten externen Koordinatensystem angegeben, welches vom Nutzer während der Hand-Auge-Kalibrierung gewählt wurde. In diesem Fall bezieht das CADMatch-Modul alle notwendigen Informationen über die Kameramontage und die kalibrierte Hand-Auge-Transformation automatisch vom Modul Hand-Auge-Kalibrierung. Für den Fall einer robotergeführten Kamera ist vom Nutzer zusätzlich die jeweils aktuelle Roboterpose robot_pose anzugeben.
    4. +
    +
    +

    Bemerkung

    +

    Wenn keine Hand-Auge-Kalibrierung durchgeführt wurde bzw. zur Verfügung steht, muss als Referenzkoordinatensystem pose_frame immer camera angegeben werden.

    +
    +

    Zulässige Werte zur Angabe des Referenzkoordinatensystems sind camera und external. Andere Werte werden als ungültig zurückgewiesen.

    +

    Für den Fall einer robotergeführten Kamera ist es abhängig von pose_frame, der bevorzugten TCP-Orientierung und der Sortierrichtung nötig, zusätzlich die aktuelle Roboterpose (robot_pose) zur Verfügung zu stellen:

    +
      +
    • Wenn external als pose_frame ausgewählt ist, ist die Angabe der Roboterpose obligatorisch.
    • +
    • Wenn die bevorzugte TCP-Orientierung in external definiert ist, ist die Angabe der Roboterpose obligatorisch.
    • +
    • Wenn die Sortierrichtung in external definiert ist, ist die Angabe der Roboterpose obligatorisch.
    • +
    • In allen anderen Fällen ist die Angabe der Roboterpose optional.
    • +
    +
    +
    +

    LoadCarrier

    +

    Das CADMatch Modul nutzt die Funktionalität zur Load Carrier Erkennung aus dem LoadCarrier Modul (rc_load_carrier) mit den Laufzeitparametern, die für dieses Modul festgelegt wurden. Wenn sich jedoch mehrere Load Carrier in der Szene befinden, die zu der angegebenen Load Carrier ID passen, wird nur einer davon zurückgeliefert. In diesem Fall sollte eine 3D Region of Interest gesetzt werden, um sicherzustellen, dass immer derselbe Load Carrier für das CADMatch Modul verwendet wird.

    +
    +
    +

    CollisionCheck

    +

    Die Kollisionsprüfung kann für die Greifpunktberechnung des CADMatch-Moduls aktiviert werden, indem das collision_detection Argument an den detect_object Service übergeben wird. Es enthält die ID des benutzten Greifers und optional einen Greif-Offset. Der Greifer muss im GripperDB Modul definiert werden (siehe Erstellen eines Greifers) und Details über die Kollisionsprüfung werden in Integrierte Kollisionsprüfung in anderen Modulen gegeben.

    +

    Alternativ können Greifpunkten individuell Greifer IDs zugewiesen werden, und die Kollisionsprüfung kann für alle Greifpunkte mit einer Greifer ID über den Laufzeitparameter check_collisions eingeschaltet werden.

    +

    Wenn das ausgewählte CADMatch Template eine Kollisionsgeometrie enthält und der Laufzeitparameter check_collisions_with_matches auf true gesetzt ist, werden auch Kollisionen zwischen dem Greifer und den anderen detektierten Objekten (nicht limitiert auf die Anzahl max_matches) geprüft. Dabei ist das Objekt, auf dem sich der jeweilige Greifpunkt befindet, von der Prüfung ausgenommen.

    +

    Wenn der Laufzeitparameter check_collisions_with_point_cloud auf true gesetzt ist, werden auch Kollisionen zwischen dem Greifer und einer wasserdichten Version der Punktwolke geprüft. Wenn diese Funktionalität in Kombination mit Sauggreifern genutzt wird, muss sichergestellt werden, dass sich der TCP außerhalb der Greifergeometrie befindet, oder dass die Greifpunkte oberhalb der Objektoberfläche definiert sind. Andernfalls wird für jeden Greifpunkt eine Kollision zwischen Greifer und Punktwolke erkannt.

    +

    Wenn der Laufzeitparameter check_collisions_during_retraction auf true gesetzt ist, und ein Load Carrier sowie ein Greif-Offset angegeben wurden, wird jeder Greifpunkt auf Kollisionen zwischen dem Objekt im Greifer und den Wänden des Load Carriers während der Entnahme geprüft. Die Prüfung findet auf der gesamten linearen Trajektorie von der Greifposition bis zurück zur Vorgreifposition statt.

    +

    Wenn die Kollisionsprüfung aktiviert ist, werden nur Greifpunkte zurückgeliefert, die kollisionsfrei sind, oder die nicht auf Kollisionen geprüft werden konnten (z.B. weil kein Greifer angegeben wurde). In der Ergebnis-Visualisierung oben auf der CADMatch-Seite der Web GUI werden kollisionsfreie Greifpunkte grün dargestellt, ungeprüfte Greifpunkte gelb und kollidierende Greifpunkte rot. Die erkannten Objekte, die bei der Kollisionsprüfung betrachtet werden, werden mit roten Kanten visualisiert.

    +

    Die Laufzeitparameter des CollisionCheck-Moduls beeinflussen die Kollisionserkennung wie in CollisionCheck-Parameter beschrieben.

    +
    +
    +
    +

    Parameter

    +

    Das CADMatch-Modul wird in der REST-API als rc_cadmatch bezeichnet und in der Web GUI unter Module ‣ CADMatch dargestellt. Der Benutzer kann die Parameter entweder dort oder über die REST-API-Schnittstelle ändern.

    +
    +

    Übersicht über die Parameter

    +

    Dieses Softwaremodul bietet folgende Laufzeitparameter:

    + + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Laufzeitparameter des rc_cadmatch-Moduls
    NameTypMin.Max.DefaultBeschreibung
    check_collisionsboolfalsetruefalseGibt an, ob Kollisionen geprüft werden sollen, wenn ein Greifer für einen Greifpunkt definiert wurde
    check_collisions_-during_retractionboolfalsetruefalseGibt an, ob Kollisionen zwischen dem Objekt im Greifer und dem Load Carrier während der Entnahme geprüft werden
    check_collisions_with_matchesboolfalsetruetrueGibt an, ob Kollisionen zwischen Greifer und anderen Matches geprüft werden
    check_collisions_-with_point_cloudboolfalsetruefalseGibt an, ob Kollisionen zwischen Greifer und der Punktwolke geprüft werden
    edge_max_distancefloat640.55.02.0Der maximale tolerierte Abstand zwischen den Templatekanten und den detektierten Kanten im Bild in Pixeln
    edge_sensitivityfloat640.051.00.5Empfindlichkeit des Kantendetektors
    grasp_filter_-orientation_thresholdfloat640.0180.045.0Maximal erlaubte Orientierungsabweichung zwischen Greifpunkt und bevorzugter TCP-Orientierung in Grad
    max_matchesint3213010Maximale Anzahl von Matches
    min_scorefloat640.051.00.3Minimaler Score für Matches
    only_highest_priority_graspsboolfalsetruefalseGibt an, ob ausschließlich Greifpunkte der höchsten Priorität zurückgegeben werden sollen.
    +
    +
    +

    Beschreibung der Laufzeitparameter

    +

    Die Laufzeitparameter werden zeilenweise auf der CADMatch-Seite in der Web GUI dargestellt. Im folgenden wird der Name des Parameters in der Web GUI in Klammern hinter dem eigentlichen Parameternamen angegeben. Die Parameter sind in derselben Reihenfolge wie in der Web GUI aufgelistet:

    +
    +

    max_matches (Maximale Matches)

    +
    +
    +

    ist die maximale Anzahl der zu erkennenden Objekte.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?max_matches=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/parameters?max_matches=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    min_score (Minimaler Score)

    +
    +
    +

    ist der minimale Score für die Erkennung nach der Posenverfeinerung. Umso höher dieser Wert ist, umso besser müssen die 2D-Kanten und die 3D-Punktwolke mit dem angegebenen Template übereinstimmen.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?min_score=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/parameters?min_score=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    edge_sensitivity (Kantenempfindlichkeit)

    +
    +
    +

    ist die Empfindlichkeit des Kantendetektors. Umso höher dieser Wert ist, umso mehr Kanten werden für die Posenverfeinerung genutzt.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?edge_sensitivity=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/parameters?edge_sensitivity=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    edge_max_distance (Maximale Kantendistanz)

    +
    +
    +

    ist die maximal erlaubte Distanz in Pixeln zwischen den Templatekanten und den detektierten Kanten im Bild während der Posenverfeinerung.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?edge_max_distance=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/parameters?edge_max_distance=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    grasp_filter_orientation_threshold (Maximale Abweichung)

    +
    +
    +

    ist die maximale Abweichung der TCP-z-Achse am Greifpunkt von der z-Achse der bevorzugten TCP-Orientierung in Grad. Es werden nur Greifpunkte zurückgeliefert, deren Orientierungsabweichung kleiner als der angegebene Wert ist. Falls der Wert auf Null gesetzt wird, sind alle Abweichungen valide.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?grasp_filter_orientation_threshold=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/parameters?grasp_filter_orientation_threshold=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    only_highest_priority_grasps (Nur Greifpunkte höchster Priorität)

    +
    +

    Wenn dieser Parameter auf true gesetzt ist, werden ausschließlich Greifpunkte der höchsten Priorität zurückgegeben. Sofern die Kollisionsprüfung aktiviert ist, werden ausschließlich kollisionsfreie Greifpunkt der höchstmöglichen Priorität zurückgegeben. Dadurch kann Rechenzeit gespart und die Anzahl der applikationsseitig zu verarbeitenden Greifpunkte reduziert werden.

    +

    Ohne Kollisionsprüfung werden ausschließlich Greifpunkte der höchsten Priorität zurückgegeben.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?only_highest_priority_grasps=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/parameters?only_highest_priority_grasps=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    check_collisions (Kollisionsprüfung)

    +
    +
    +

    Wenn diese Option aktiv ist, wird die Kollisionsprüfung für alle Greifpunkte durchgeführt, denen eine Greifer ID zugewiesen wurde, auch wenn kein Standardgreifer im detect_object Service gesetzt wurde. Wenn ein Load Carrier verwendet wird, wird die Kollisionsprüfung immer zwischen dem Greifer und dem Load Carrier durchgeführt. Kollisionen mit der Punktwolke oder anderen Matches werden nur geprüft, wenn die zugehörigen Laufzeitparameter aktiv sind.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?check_collisions=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/parameters?check_collisions=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    check_collisions_with_matches (Kollisionsprüfung mit Matches)

    +
    +
    +

    Dieser Parameter wird nur beachtet, wenn die Kollisionsprüfung durch Übergabe eines Greifers an den detect_object Service oder durch Setzen des Parameters check_collisions aktiviert ist. Wenn check_collisions_with_matches auf true gesetzt ist, werden alle Greifpunkte auf Kollisionen zwischen dem Greifer und den anderen Matches (nicht begrenzt auf die Anzahl max_matches) geprüft. Nur Greifpunkte, bei denen der Greifer nicht in Kollision mit anderen Matches wäre, werden zurückgeliefert.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?check_collisions_with_matches=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/parameters?check_collisions_with_matches=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    check_collisions_with_point_cloud (Kollisionsprüfung mit Punktwolke)

    +
    +
    +

    Dieser Parameter wird nur beachtet, wenn die Kollisionsprüfung durch Übergabe eines Greifers an den detect_object Service oder durch Setzen des Parameters check_collisions aktiviert ist. Wenn check_collisions_with_point_cloud auf true gesetzt ist, werden alle Greifpunkte auf Kollisionen zwischen dem Greifer und einer wasserdichten Version der Punktwolke geprüft. Nur Greifpunkte, bei denen der Greifer nicht in Kollision mit dieser Punktwolke wäre, werden zurückgeliefert.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?check_collisions_with_point_cloud=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/parameters?check_collisions_with_point_cloud=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    check_collisions_during_retraction (Kollisionsprüfung während Entnahme)

    +
    +
    +

    Dieser Parameter wird nur beachtet, wenn die Kollisionsprüfung durch Übergabe eines Greifers an den detect_object Service oder durch Setzen des Parameters check_collisions aktiviert ist. Wenn check_collisions_during_retraction auf true gesetzt ist und ein Load Carrier sowie ein Greif-Offset angegeben wurden, wird jeder Greifpunkt auf Kollisionen zwischen dem Objekt im Greifer und den Wänden des Load Carriers während der Entnahme geprüft. Die Prüfung findet auf der gesamten linearen Trajektorie von der Greifposition bis zurück zur Vorgreifposition statt. Es werden nur kollisionsfreie Greifpunkte zurückgeliefert.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?check_collisions_during_retraction=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/parameters?check_collisions_during_retraction=<value>
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    Statuswerte

    +

    Das CADMatch-Modul meldet folgende Statuswerte.

    + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Statuswerte des rc_cadmatch-Moduls
    NameBeschreibung
    data_acquisition_timeZeit in Sekunden, für die beim letzten Aufruf auf Bilddaten gewartet werden musste
    last_timestamp_processedZeitstempel des letzten verarbeiteten Bilddatensatzes
    last_request_timestampZeitstempel der letzten Detektionsanfrage
    load_carrier_detection_timeBerechnungszeit für die letzte Load Carrier Detektion in Sekunden
    object_detection_timeBerechnungszeit für die letzte Objekterkennung in Sekunden
    processing_timeBerechnungszeit für die letzte Detektion (einschließlich Load Carrier Detektion) in Sekunden
    stateAktueller Zustand des CADMatch-Moduls
    +

    Folgende state-Werte werden gemeldet.

    + + ++++ + + + + + + + + + + + + + + + + +
    Mögliche Werte für den Zustand des CADMatch-Moduls
    ZustandBeschreibung
    IDLEDas Modul ist inaktiv.
    RUNNINGDas Modul wurde gestartet und ist bereit, Load Carrier und Objekte zu erkennen.
    FATALEin schwerwiegender Fehler ist aufgetreten.
    +
    +
    +

    Services

    +

    Die angebotenen Services von rc_cadmatch können mithilfe der REST-API-Schnittstelle oder der rc_visard NG Web GUI ausprobiert und getestet werden.

    +

    Das CADMatch-Modul stellt folgende Services zur Verfügung.

    +
    +

    detect_object

    +
    +

    führt eine Objekterkennung basierend auf einem Template durch, wie in Objekterkennung beschrieben.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/detect_object
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/services/detect_object
    +
    +
    +
    +
    +
    + +
    +

    Obligatorische Serviceargumente:

    +
    +

    pose_frame: siehe Hand-Auge-Kalibrierung.

    +

    template_id: ID des Templates, welches erkannt werden soll.

    +
    +

    Möglicherweise benötigte Serviceargumente:

    +
    +

    robot_pose: siehe Hand-Auge-Kalibrierung.

    +
    +
    pose_prior_ids: IDs der Posenvorgaben für die zu erkennenden Objekte. Falls das ausgewählte Template eine Posenvorgabe für die Erkennung benötigt, dann muss dieses Argument angegeben werden.
    +
    +

    Optionale Serviceargumente:

    +
    +

    load_carrier_id: ID des Load Carriers, welcher die zu erkennenden Objekte enthält.

    +

    load_carrier_compartment: Teilvolumen (Fach oder Abteil) in einem zu detektierenden Load Carrier (Behälter), in dem Objekte erkannt werden sollen (siehe Load Carrier Abteile).

    +

    region_of_interest_id: Falls load_carrier_id gesetzt ist, die ID der 3D Region of Interest, innerhalb welcher nach dem Load Carrier gesucht wird. Andernfalls die ID der 3D Region of Interest, in der nach Objekten gesucht wird.

    +

    collision_detection: siehe Integrierte Kollisionsprüfung in anderen Modulen

    +

    data_acquisition_mode: Falls der Aufnahmemodus auf CAPTURE_NEW (Standardwert) gesetzt ist, wird ein neuer Bild-Datensatz für die Detektion aufgenommen. Falls der Modus auf USE_LAST gesetzt wird, wird der Datensatz der vorherigen Detektion erneut verwendet.“

    +
    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "collision_detection": {
    +      "gripper_id": "string",
    +      "pre_grasp_offset": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      }
    +    },
    +    "data_acquisition_mode": "string",
    +    "load_carrier_compartment": {
    +      "box": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "pose": {
    +        "orientation": {
    +          "w": "float64",
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "position": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        }
    +      }
    +    },
    +    "load_carrier_id": "string",
    +    "pose_frame": "string",
    +    "pose_prior_ids": [
    +      "string"
    +    ],
    +    "region_of_interest_id": "string",
    +    "robot_pose": {
    +      "orientation": {
    +        "w": "float64",
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "position": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      }
    +    },
    +    "template_id": "string"
    +  }
    +}
    +
    +
    +
    +
    +

    grasps: Liste von Greifpunkten auf den erkannten Objekten. Die Greifpunkte sind gemäß der gewählten Sortierstrategie sortiert. Die match_uuid gibt eine Referenz auf das detektierte Objekt in matches an, zu dem dieser Greifpunkt gehört. Die Liste der Greifpunkte wird auf die 100 besten Greifpunkte gekürzt, falls mehr erreichbare Greifpunkte gefunden werden. Jeder Greifpunkt enthält ein Flag collision_checked und das Feld gripper_id (siehe Integrierte Kollisionsprüfung in anderen Modulen).

    +

    load_carriers: Liste der erkannten Load Carrier (Behälter).

    +

    matches: Liste der erkannten Objekte für das angegebene Template, sortiert gemäß der gewählten Sortierstrategie. Der score gibt an, wie gut das Objekt mit dem Template übereinstimmt. Die grasp_uuids geben die Greifpunkte in der grasps-Liste an, die auf diesem Objekt erreichbar sind.

    +

    timestamp: Zeitstempel des Bildes, auf dem die Erkennung durchgeführt wurde.

    +

    return_code: enthält mögliche Warnungen oder Fehlercodes und Nachrichten.

    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "detect_object",
    +  "response": {
    +    "grasps": [
    +      {
    +        "collision_checked": "bool",
    +        "gripper_id": "string",
    +        "id": "string",
    +        "match_uuid": "string",
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "pose_frame": "string",
    +        "priority": "int8",
    +        "timestamp": {
    +          "nsec": "int32",
    +          "sec": "int32"
    +        },
    +        "uuid": "string"
    +      }
    +    ],
    +    "load_carriers": [
    +      {
    +        "height_open_side": "float64",
    +        "id": "string",
    +        "inner_dimensions": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "outer_dimensions": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "overfilled": "bool",
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "pose_frame": "string",
    +        "rim_ledge": {
    +          "x": "float64",
    +          "y": "float64"
    +        },
    +        "rim_step_height": "float64",
    +        "rim_thickness": {
    +          "x": "float64",
    +          "y": "float64"
    +        },
    +        "type": "string"
    +      }
    +    ],
    +    "matches": [
    +      {
    +        "grasp_uuids": [
    +          "string"
    +        ],
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "pose_frame": "string",
    +        "score": "float32",
    +        "template_id": "string",
    +        "timestamp": {
    +          "nsec": "int32",
    +          "sec": "int32"
    +        },
    +        "uuid": "string"
    +      }
    +    ],
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    },
    +    "timestamp": {
    +      "nsec": "int32",
    +      "sec": "int32"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    set_preferred_orientation

    +
    +

    speichert die bevorzugte TCP-Orientierung zum Berechnen der Erreichbarkeit der Greifpunkte, die zur Filterung und optional zur Sortierung der vom detect_object Service zurückgelieferten Greifpunkte verwendet wird (siehe Setzen der bevorzugten TCP-Orientierung).

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/set_preferred_orientation
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/services/set_preferred_orientation
    +
    +
    +
    +
    +
    + +
    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "orientation": {
    +      "w": "float64",
    +      "x": "float64",
    +      "y": "float64",
    +      "z": "float64"
    +    },
    +    "pose_frame": "string"
    +  }
    +}
    +
    +
    +
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "set_preferred_orientation",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    get_preferred_orientation

    +
    +

    gibt die bevorzugte TCP-Orientierung zurück, die für die Filterung und optional für die Sortierung der vom detect_object Service zurückgelieferten Greifpunkte verwendet wird (siehe Setzen der bevorzugten TCP-Orientierung).

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/get_preferred_orientation
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/services/get_preferred_orientation
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "get_preferred_orientation",
    +  "response": {
    +    "orientation": {
    +      "w": "float64",
    +      "x": "float64",
    +      "y": "float64",
    +      "z": "float64"
    +    },
    +    "pose_frame": "string",
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    set_sorting_strategies

    +
    +

    speichert die gewählte Strategie zur Sortierung der Greifpunkte und erkannten Objekte, die vom detect_object Service zurückgeliefert werden (siehe Objekterkennung).

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/set_sorting_strategies
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/services/set_sorting_strategies
    +
    +
    +
    +
    +
    + +
    +

    Nur eine Sortierstrategie darf einen Gewichtswert weight größer als 0 haben. Wenn alle Werte für weight auf 0 gesetzt sind, wird die Standardsortierstrategie verwendet.

    +

    Wenn der Wert weight für direction gesetzt ist, muss vector den Richtungsvektor enthalten und pose_frame auf camera oder external gesetzt sein.

    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "direction": {
    +      "pose_frame": "string",
    +      "vector": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "weight": "float64"
    +    },
    +    "gravity": {
    +      "weight": "float64"
    +    },
    +    "match_score": {
    +      "weight": "float64"
    +    },
    +    "preferred_orientation": {
    +      "weight": "float64"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "set_sorting_strategies",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    get_sorting_strategies

    +
    +

    gibt die gewählte Sortierstrategie zurück, die zur Sortierung der vom detect_object Service zurückgelieferten Objekte und Greifpunkte verwendet wird (siehe Objekterkennung).

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/get_sorting_strategies
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/services/get_sorting_strategies
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Wenn alle Werte für weight 0 sind, wird die Standardsortierstrategie verwendet.

    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "get_sorting_strategies",
    +  "response": {
    +    "direction": {
    +      "pose_frame": "string",
    +      "vector": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "weight": "float64"
    +    },
    +    "gravity": {
    +      "weight": "float64"
    +    },
    +    "match_score": {
    +      "weight": "float64"
    +    },
    +    "preferred_orientation": {
    +      "weight": "float64"
    +    },
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    warmup_template

    +
    +

    Lädt ein Template, damit es bei der Detektion schon bereit ist. Ohne diesen Service dauert die erste Detektion mit einem neuen Template länger als die folgenden, da dann das Template bei der ersten Detektion erst geladen werden muss.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/warmup_template
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/services/warmup_template
    +
    +
    +
    +
    +
    + +
    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "template_id": "string"
    +  }
    +}
    +
    +
    +

    Die template_id ist die ID des Templates, welches in das CADMatch-Modul geladen werden soll.

    +
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "warmup_template",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    start

    +
    +

    versetzt das CADMatch-Modul in den Zustand RUNNING.“

    +

    Details

    +
    +

    Es kann vorkommen, dass der Zustandsübergang noch nicht vollständig abgeschlossen ist, wenn die Serviceantwort generiert wird. In diesem Fall liefert diese den entsprechenden, sich von RUNNING unterscheidenden Zustand zurück.

    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/start
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/services/start
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "start",
    +  "response": {
    +    "accepted": "bool",
    +    "current_state": "string"
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    stop

    +
    +

    stoppt das Modul und versetzt es in den Zustand IDLE.

    +

    Details

    +
    +

    Es kann vorkommen, dass der Zustandsübergang noch nicht vollständig abgeschlossen ist, wenn die Serviceantwort generiert wird. In diesem Fall liefert diese den entsprechenden, sich von IDLE unterscheidenden Zustand zurück.

    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/stop
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/services/stop
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "stop",
    +  "response": {
    +    "accepted": "bool",
    +    "current_state": "string"
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    reset_defaults

    +
    +

    stellt die Werkseinstellungen der Parameter und die bevorzugte TCP-Orientierung sowie die Sortierstrategie dieses Moduls wieder her und wendet sie an („factory reset“). Dies betrifft nicht die konfigurierten Templates.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/reset_defaults
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/services/reset_defaults
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "reset_defaults",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    set_region_of_interest (veraltet)

    +
    +

    speichert eine 3D Region of Interest auf dem rc_visard NG.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie stattdessen set_region_of_interest in rc_roi_db.
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/services/set_region_of_interest
    +
    +
    +
    +
    +
    +
    +
    +
    +

    get_regions_of_interest (veraltet)

    +
    +

    gibt die mit region_of_interest_ids spezifizierten, gespeicherten 3D Regions of Interest zurück.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie stattdessen get_regions_of_interest in rc_roi_db.
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/services/get_regions_of_interest
    +
    +
    +
    +
    +
    +
    +
    +
    +

    delete_regions_of_interest (veraltet)

    +
    +

    löscht die mit region_of_interest_ids spezifizierten, gespeicherten 3D Regions of Interest.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie stattdessen delete_regions_of_interest in rc_roi_db.
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/services/delete_regions_of_interest
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    Interne Services

    +

    Die folgenden Services für die Konfiguration von Greifpunkten und Posenvorgaben können sich in Zukunft ohne weitere Ankündigung ändern. Es wird empfohlen, das Setzen, Abrufen und Löschen von Greifpunkten und Posenvorgaben über die Web GUI vorzunehmen.

    +
    +

    set_grasp

    +
    +

    speichert einen Greifpunkt für das angegebene Template auf dem rc_visard NG. Alle Greifpunkte sind dauerhaft gespeichert, auch über Firmware-Updates und -Wiederherstellungen hinweg.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/set_grasp
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/services/set_grasp
    +
    +
    +
    +
    +
    + +
    +

    Die Definition des Typs grasp wird in Setzen von Greifpunkten beschrieben.

    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "grasp": {
    +      "gripper_id": "string",
    +      "id": "string",
    +      "pose": {
    +        "orientation": {
    +          "w": "float64",
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "position": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        }
    +      },
    +      "priority": "int8",
    +      "replication": {
    +        "max_x_deg": "float64",
    +        "min_x_deg": "float64",
    +        "origin": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "step_x_deg": "float64"
    +      },
    +      "template_id": "string"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "set_grasp",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    set_all_grasps

    +
    +

    Ersetzt die gesamte Liste von Greifpunkten auf dem rc_visard NG für das angegebene Template.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/set_all_grasps
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/services/set_all_grasps
    +
    +
    +
    +
    +
    + +
    +

    Die Definition des Typs grasp wird in Setzen von Greifpunkten beschrieben.

    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "grasps": [
    +      {
    +        "gripper_id": "string",
    +        "id": "string",
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "priority": "int8",
    +        "replication": {
    +          "max_x_deg": "float64",
    +          "min_x_deg": "float64",
    +          "origin": {
    +            "orientation": {
    +              "w": "float64",
    +              "x": "float64",
    +              "y": "float64",
    +              "z": "float64"
    +            },
    +            "position": {
    +              "x": "float64",
    +              "y": "float64",
    +              "z": "float64"
    +            }
    +          },
    +          "step_x_deg": "float64"
    +        },
    +        "template_id": "string"
    +      }
    +    ],
    +    "template_id": "string"
    +  }
    +}
    +
    +
    +
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "set_all_grasps",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    get_grasps

    +
    +

    gibt alle definierten Greifpunkte mit den angegebenen IDs (grasp_ids) zurück, die zu den Templates mit den angegebenen template_ids gehören.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/get_grasps
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/services/get_grasps
    +
    +
    +
    +
    +
    + +
    +

    Wenn keine grasp_ids angegeben werden, werden alle Greifpunkte zu den angegebenen template_ids zurückgeliefert. Wenn keine template_ids angegeben werden, werden alle Greifpunkte mit den geforderten grasp_ids zurückgeliefert. Wenn gar keine IDs angegeben werden, werden alle gespeicherten Greifpunkte zurückgeliefert.

    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "grasp_ids": [
    +      "string"
    +    ],
    +    "template_ids": [
    +      "string"
    +    ]
    +  }
    +}
    +
    +
    +
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "get_grasps",
    +  "response": {
    +    "grasps": [
    +      {
    +        "gripper_id": "string",
    +        "id": "string",
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "priority": "int8",
    +        "replication": {
    +          "max_x_deg": "float64",
    +          "min_x_deg": "float64",
    +          "origin": {
    +            "orientation": {
    +              "w": "float64",
    +              "x": "float64",
    +              "y": "float64",
    +              "z": "float64"
    +            },
    +            "position": {
    +              "x": "float64",
    +              "y": "float64",
    +              "z": "float64"
    +            }
    +          },
    +          "step_x_deg": "float64"
    +        },
    +        "template_id": "string"
    +      }
    +    ],
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    delete_grasps

    +
    +

    löscht alle Greifpunkte mit den angegebenen grasp_ids, die zu den Templates mit den angegebenen template_ids gehören.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/delete_grasps
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/services/delete_grasps
    +
    +
    +
    +
    +
    + +
    +

    Wenn keine grasp_ids angegeben werden, werden alle Greifpunkte gelöscht, die zu den Templates mit den angegebenen template_ids gehören. Die Liste template_ids darf nicht leer sein.

    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "grasp_ids": [
    +      "string"
    +    ],
    +    "template_ids": [
    +      "string"
    +    ]
    +  }
    +}
    +
    +
    +
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "delete_grasps",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    get_symmetric_grasps

    +
    +

    gibt alle Greifpunkte zurück, die symmetrisch zum angegebenen Greifpunkt sind.“

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/get_symmetric_grasps
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/services/get_symmetric_grasps
    +
    +
    +
    +
    +
    + +
    +

    Die Definition des Typs grasp wird in Setzen von Greifpunkten beschrieben.

    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "grasp": {
    +      "pose": {
    +        "orientation": {
    +          "w": "float64",
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "position": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        }
    +      },
    +      "replication": {
    +        "max_x_deg": "float64",
    +        "min_x_deg": "float64",
    +        "origin": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "step_x_deg": "float64"
    +      },
    +      "template_id": "string"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +

    Der erste Greifpunkt in der Rückgabeliste ist derselbe, der dem Service übergeben wurde. Wenn das Template keine exakte Symmetrie hat, wird nur der übergebene Greifpunkt zurückgeliefert. Wenn das Template eine kontinuierliche Symmetrie hat (z.B. ein zylindrisches Objekt), werden nur 12 gleichverteilte Greifpunkte zurückgeliefert.

    +

    Die Definition des Typs grasp wird in Setzen von Greifpunkten beschrieben.

    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "get_symmetric_grasps",
    +  "response": {
    +    "grasps": [
    +      {
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "replication": {
    +          "max_x_deg": "float64",
    +          "min_x_deg": "float64",
    +          "origin": {
    +            "orientation": {
    +              "w": "float64",
    +              "x": "float64",
    +              "y": "float64",
    +              "z": "float64"
    +            },
    +            "position": {
    +              "x": "float64",
    +              "y": "float64",
    +              "z": "float64"
    +            }
    +          },
    +          "step_x_deg": "float64"
    +        },
    +        "template_id": "string"
    +      }
    +    ],
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    set_pose_prior

    +
    +

    speichert eine Posenvorgabe für das angegebene Template auf dem rc_visard NG. Alle Posenvorgaben sind dauerhaft gespeichert, auch über Firmware-Updates und -Wiederherstellungen hinweg.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/set_pose_prior
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/services/set_pose_prior
    +
    +
    +
    +
    +
    + +
    +

    Die Definition des Typs pose_prior wird in Setzen von Posenvorgaben beschrieben.

    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "pose_prior": {
    +      "id": "string",
    +      "pose": {
    +        "orientation": {
    +          "w": "float64",
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "position": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        }
    +      },
    +      "pose_frame": "string",
    +      "template_id": "string"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "set_pose_prior",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    set_all_pose_priors

    +
    +

    Ersetzt die gesamte Liste von Posenvorgaben auf dem rc_visard NG für das angegebene Template.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/set_all_pose_priors
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/services/set_all_pose_priors
    +
    +
    +
    +
    +
    + +
    +

    Die Definition des Typs pose_prior wird in Setzen von Posenvorgaben beschrieben.

    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "pose_priors": [
    +      {
    +        "id": "string",
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "pose_frame": "string",
    +        "template_id": "string"
    +      }
    +    ],
    +    "template_id": "string"
    +  }
    +}
    +
    +
    +
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "set_all_pose_priors",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    get_pose_priors

    +
    +

    gibt alle definierten Posenvorgaben mit den angegebenen IDs (pose_prior_ids) zurück, die zu den Templates mit den angegebenen template_ids gehören.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/get_pose_priors
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/services/get_pose_priors
    +
    +
    +
    +
    +
    + +
    +

    Wenn keine pose_prior_ids angegeben werden, werden alle Posenvorgaben zu den angegebenen template_ids zurückgeliefert. Wenn keine template_ids angegeben werden, werden alle Posenvorgaben mit den geforderten pose_prior_ids zurückgeliefert. Wenn gar keine IDs angegeben werden, werden alle gespeicherten Posenvorgaben zurückgeliefert.

    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "pose_prior_ids": [
    +      "string"
    +    ],
    +    "template_ids": [
    +      "string"
    +    ]
    +  }
    +}
    +
    +
    +
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "get_pose_priors",
    +  "response": {
    +    "pose_priors": [
    +      {
    +        "id": "string",
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "pose_frame": "string",
    +        "template_id": "string"
    +      }
    +    ],
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    delete_pose_priors

    +
    +

    löscht alle Posenvorgaben mit den angegebenen pose_prior_ids, die zu den Templates mit den angegebenen template_ids gehören.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/delete_pose_priors
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_cadmatch/services/delete_pose_priors
    +
    +
    +
    +
    +
    + +
    +

    Wenn keine pose_prior_ids angegeben werden, werden alle Posenvorgaben gelöscht, die zu den Templates mit den angegebenen template_ids gehören. Die Liste template_ids darf nicht leer sein.

    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "pose_prior_ids": [
    +      "string"
    +    ],
    +    "template_ids": [
    +      "string"
    +    ]
    +  }
    +}
    +
    +
    +
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "delete_pose_priors",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    Rückgabecodes

    +

    Zusätzlich zur eigentlichen Serviceantwort gibt jeder Service einen sogenannten return_code bestehend aus einem Integer-Wert und einer optionalen Textnachricht zurück. Erfolgreiche Service-Anfragen werden mit einem Wert von 0 quittiert. Positive Werte bedeuten, dass die Service-Anfrage zwar erfolgreich bearbeitet wurde, aber zusätzliche Informationen zur Verfügung stehen. Negative Werte bedeuten, dass Fehler aufgetreten sind. Für den Fall, dass mehrere Rückgabewerte zutreffend wären, wird der kleinste zurückgegeben, und die entsprechenden Textnachrichten werden in return_code.message akkumuliert.

    +

    Die folgende Tabelle listet die möglichen Rückgabecodes auf:

    + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Rückgabecodes der Services des CADMatch-Moduls
    CodeBeschreibung
    0Erfolgreich
    -1Ungültige(s) Argument(e)
    -2Ein interner Fehler ist aufgetreten.
    -3Ein interner Timeout ist aufgetreten, beispielsweise während der Objekterkennung.
    -4Die maximal erlaubte Zeitspanne für die interne Akquise der Bilddaten wurde überschritten.
    -8Das Modul befindet sich in einem Zustand, in welchem dieser Service nicht aufgerufen werden kann. Beispielsweise muss die Stereo-Matching Qualität quality mindestens Medium sein.
    -9Ungültige Lizenz
    -10Das neue Element konnte nicht hinzugefügt werden, da die maximal speicherbare Anzahl an Load Carriern oder ROIs überschritten wurde.
    -11Sensor nicht verbunden, nicht unterstützt oder nicht bereit.
    10Die maximal speicherbare Anzahl an Load Carriern oder ROIs wurde erreicht.
    11Existierende Daten wurden überschrieben.
    100Die angefragten Load Carrier wurden in der Szene nicht gefunden.
    101Keiner der gefundenen Greifpunkte ist erreichbar.
    102Der erkannte Load Carrier ist leer.
    103Alle berechneten Greifpunkte sind in Kollision.
    106Die Liste der zurückgelieferten Greifpunkte wurde auf die besten 100 Greifpunkte gekürzt.
    110Hinweise für die Einrichtung der Anwendung, z.B. Reduzieren des Abstands von der Kamera, Setzen einer Region of Interest.
    114Kein Greifer für die Kollisionsprüfung gefunden.
    115Kollisionsprüfung während Entnahme wurde nicht durchgeführt, z.B. weil kein Load Carrier oder kein Greif-Offset angegeben wurden.
    151Das Objekt-Template hat eine kontinuierliche Symmetrie.
    152Die Objekte liegen außerhalb der angegebenen Region of Interest, außerhalb des Load Carriers oder außerhalb des Bildes.
    153Es konnten keine Kanten im Kamerabild erkannt werden. Überprüfen Sie die Kantenempfindlichkeit.
    999Zusätzliche Hinweise für die Anwendungsentwicklung
    +
    +
    +

    Template API

    +

    Für den Upload, Download, das Auflisten und Löschen von Templates werden spezielle REST-API-Endpunkte zur Verfügung gestellt. Templates können auch über die Web GUI hoch- und runtergeladen werden. Die Templates beinhalten die Greifpunkte und Posenvorgaben, falls Greifpunkte oder Posenvorgaben konfiguriert wurden. Bis zu 50 Templates können gleichzeitig auf dem rc_visard NG gespeichert werden.

    +
    +
    + + +
    +
    + +
    +
    +
    + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/camera_calibration.html b/v24.04/de/camera_calibration.html new file mode 100644 index 0000000..3d4b7fb --- /dev/null +++ b/v24.04/de/camera_calibration.html @@ -0,0 +1,789 @@ + + + + + + + + + + + Kamerakalibrierung — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Kamerakalibrierung

    +

    Das Kamerakalibrierungsmodul ist ein Basismodul, welches auf jedem rc_visard NG verfügbar ist.

    +

    Um die Kamera als Messinstrument zu verwenden, müssen die Kameraparameter, wie die Brennweite, die Objektivverzeichnung und die Lage der Kameras zueinander, genau bekannt sein. Diese Parameter werden durch Kalibrierung bestimmt und für die Rektifizierung der Bilder, die Grundlage für alle anderen Bildverarbeitungsmodule ist, verwendet (siehe Rektifizierung).

    +

    Der rc_visard NG ist bereits ab Werk kalibriert. Nichtsdestotrotz kann es vorkommen, dass die Kalibrierung überprüft und neu durchgeführt werden muss, wenn der rc_visard NG einer starken mechanischen Beanspruchung ausgesetzt war.

    +

    Mit dem Kamerakalibrierungsmodul lassen sich die Kalibrierungsüberprüfung und Kalibrierung vornehmen.

    +
    +

    Selbstkalibrierung

    +

    Im Kamerakalibrierungsmodul läuft im Hintergrund automatisch der Selbstkalibriermodus mit niedriger Frequenz. In diesem Modus überwacht der rc_visard NG die Ausrichtung der Bildzeilen beider rektifizierten Bilder. Wirken mechanische Kräfte auf den rc_visard NG ein, wird er beispielsweise fallen gelassen, kann dies zu einer Fehlausrichtung führen. Kommt es zu einem erheblichen Ausrichtungsfehler, wird dieser automatisch korrigiert. Nach einem Neustart und einer Korrektur wird der aktuelle Kalibrierungsversatz in der Logdatei des Kameramoduls erfasst (siehe Download der Logdateien):

    +
    +
    „rc_stereocalib: Current self-calibration offset is 0.00, update counter is 0“
    +

    Der Aktualisierungszähler (update counter) wird nach jeder automatischen Korrektur um eins erhöht. Nach einer manuellen Neukalibrierung des rc_visard NG wird der Zähler auf 0 zurückgesetzt.

    +

    Unter normalen Umständen, wenn der rc_visard NG keiner mechanischen Belastung ausgesetzt ist, dürfte die Selbstkalibrierung des rc_visard NG nicht auftreten. Die Selbstkalibrierung erlaubt dem rc_visard NG, auch nach Erkennung einer falschen Ausrichtung normal zu arbeiten, da diese automatisch korrigiert wird. Dessen ungeachtet wird empfohlen, die Kamera manuell neu zu kalibrieren, wenn der Aktualisierungszähler nicht auf 0 steht.

    +
    +
    +

    Kalibriervorgang

    +

    Die Kamerakalibrierung kann über die Web GUI unter Konfiguration ‣ Kamera Kalibrierung vorgenommen werden. Diese Seite bietet einen Assistenten, der den Benutzer durch den Kalibriervorgang führt.

    +
    +

    Bemerkung

    +

    Die Kamerakalibrierung ist für den rc_visard NG in aller Regel nicht nötig, da er bereits ab Werk kalibriert ist. Eine Neukalibrierung ist nur erforderlich, wenn das Gerät einer starken mechanischen Belastung ausgesetzt war, weil es beispielsweise fallen gelassen wurde.

    +
    +

    Während der Kalibrierung muss das Kalibriermuster in verschiedenen Posen erkannt werden. Dabei müssen alle schwarzen Quadrate des Musters müssen komplett in beiden Kameras sichtbar sein und dürfen nicht verdeckt werden. Jedes korrekt erkannte Quadrat wird mit einem grünen Haken belegt. Das Muster kann nur dann korrekt erkannt werden, wenn alle schwarzen Quadrate erkannt werden. Werden einige der Quadrate nicht oder nur für kurze Zeit erkannt, so kann dies an schlechten Lichtverhältnissen oder einem beschädigten Kalibriermuster liegen. Quadrate, die in überbelichteten Bereichen des Kalibriermusters liegen, werden rot hervorgehoben. In diesem Fall müssen die Beleuchtung oder die Belichtungseinstellungen angepasst werden. Ein dicker grüner Rahmen um das Kalibriermuster zeigt an, dass das Muster korrekt in beiden Kamerabildern erkannt wurde.

    +
    +

    Kalibriereinstellungen

    +

    Die Qualität der Kamerakalibrierung hängt stark von der Qualität des Kalibriermusters ab. Kalibriermuster können von Roboception bezogen werden.

    +
    +_images/webgui_camera_calibration_1_ng_de.png +

    Abb. 41 Kalibriereinstellungen

    +
    +

    Im ersten Schritt muss das verwendete Kalibriermuster angegeben werden. Mit Klick auf Weiter gelangt der Benutzer zum nächsten Schritt.

    +
    +
    +

    Kalibrierung prüfen

    +

    In diesem Schritt kann die aktuelle Kalibrierung überprüft werden. Um diese Prüfung vorzunehmen, muss das Muster so gehalten werden, dass es sich gleichzeitig im Sichtfeld beider Kameras befindet. Nachdem das Muster vollständig erkannt wurde, wird der Kalibrierfehler automatisch berechnet und das Ergebnis auf dem Bildschirm angegeben.

    +
    +_images/webgui_camera_calibration_3_ng_de.png +

    Abb. 42 Überprüfung der Kalibrierung

    +
    +
    +

    Bemerkung

    +

    Um einen aussagekräftigen Kalibrierfehler berechnen zu können, muss das Muster so nah wie möglich an die Kameras gehalten werden. Bedeckt das Muster lediglich einen kleinen Bereich der Kamerabilder, ist der Kalibrierfehler grundsätzlich geringer als wenn das Muster das gesamte Bild ausfüllt. Aus diesem Grund werden zusätzlich zum Kalibrierfehler an der aktuellen Position des Kalibriermusters auch der minimale und maximale Fehler während der Überprüfung der Kalibrierung angezeigt.

    +
    +

    Der typische Kalibrierfehler beläuft sich auf unter 0,2 Pixel. Liegt der Fehler in diesem Bereich, kann der Kalibriervorgang übersprungen werden. Ist der errechnete Kalibrierfehler jedoch größer, sollte eine Neukalibrierung vorgenommen werden, um sicherzustellen, dass der Sensor volle Leistung erbringt. Mit Klick auf Weiter gelangt der Benutzer zum nächsten Schritt.

    +
    +

    Warnung

    +

    Große Kalibrierfehler können durch falsch kalibrierte Kameras, ein unpräzises Kalibriermuster oder eine falsch eingetragene Musterbreite oder Musterhöhe verursacht werden. Bei der Verwendung eines benutzerdefinierten Kalibriermusters muss sichergestellt werden, dass das Muster präzise und die angegebenen Breiten- und Höhendaten korrekt sind. Anderenfalls kann die manuelle Kalibrierung sogar dazu führen, dass die Kameras dekalibriert werden!

    +
    +
    +
    +

    Kalibrieren

    +

    Bevor die Kalibrierung vorgenommen wird, sollte die Belichtungszeit der Kamera richtig eingestellt werden. Um ein gutes Kalibrierergebnis zu erzielen, sollten die Bilder gut belichtet und Bewegungsunschärfe vermieden werden. Die maximale Belichtungszeit im automatischen Modus sollte so klein wie möglich sein, aber dennoch eine gute Belichtung ermöglichen. Die aktuelle Belichtungszeit wird, wie in Abb. 44 gezeigt, unter den Kamerabildern angegeben.

    +

    Für eine vollständige Kalibrierung müssen zunächst beide Kameras einzeln intrinsisch kalibriert werden (Monokalibrierung). Anschließend wird durch die Stereokalibrierung die Ausrichtung der beiden Kameras zueinander bestimmt. In den meisten Fällen wird die intrinsische Kalibrierung der beiden Kameras nicht beeinträchtigt. Daher wird die Monokalibrierung standardmäßig bei einer Neukalibrierung übersprungen, kann aber durch Klick auf Monokalibrierung durchführen durchgeführt werden. Dies sollte nur geschehen, wenn das Ergebnis der Stereokalibrierung nicht zufriedenstellend ist.

    +
    +
    +

    Stereokalibrierung

    +

    Bei der Stereokalibrierung wird die relative Rotation und Translation der Kameras zueinander ermittelt.

    +

    Die Kamerabilder können auch gespiegelt angezeigt werden, um die korrekte Ausrichtung des Kalibriermusters zu vereinfachen.

    +

    Als erstes muss das Kalibriermuster möglichst ruhig und so nah wie möglich an die Kamera gehalten werden. Es muss vollständig in beiden Bildern sichtbar sein und die Kameras sollten senkrecht auf das Kalibriermuster gerichtet sein. Wenn das Kalibriermuster nicht senkrecht zur Sichtachse der Kameras ausgerichtet ist, erscheinen kleine grüne Pfeile auf dem Kamerabild, die auf die erwarteten Positionen der Ecken des Kalibriermusters zeigen (siehe Abb. 43).

    +
    +_images/webgui_camera_calibration_stereo_tilt.png +

    Abb. 43 Pfeile weisen darauf hin, wenn das Muster während der Stereokalibrierung nicht senkrecht zur Blickrichtung der Kamera gehalten wird.

    +
    +

    Das Muster muss für die Erkennung sehr ruhig gehalten werden. Wenn Bewegungsunschärfe auftritt, wird das Muster nicht erkannt. Alle Zellen, die im Kamerabild dargestellt sind, müssen vom Kalibriermuster abgedeckt werden. Dies wird durch eine grüne Füllung der erfassten Zellen dargestellt (siehe Abb. 44).

    +

    Beim rc_visard NG können alle Zellen mit einer einzigen Aufnahme erfasst werden, wenn das Kalibriermuster nah genug gehalten wird.

    +
    +_images/webgui_camera_calibration_4_ng_de.png +

    Abb. 44 Stereokalibrierung: Das Muster sollte so nah wie möglich gehalten werden, um alle dargestellten Zellen zu füllen.

    +
    +
    +

    Bemerkung

    +

    Falls alle Häkchen auf dem Kalibriermuster verschwinden, liegt dies daran, dass die Kamerablickrichtung nicht senkrecht zum Muster steht, oder das Muster zu weit von der Kamera entfernt ist.

    +
    +

    Sobald alle Zellen erfasst und gefüllt sind, verschwinden sie und eine einzelne entfernte Zelle wird angezeigt. Nun muss das Kalibriermuster so weit entfernt wie möglich gehalten werden, damit die kleine Zelle erfasst wird. Pfeile zeigen an, falls das Muster noch zu nah an der Kamera ist. Wenn das Kalibriermuster erfolgreich detektiert wurde, wird die Zelle grün und das Kalibrierergebnis kann berechnet werden (siehe Abb. 45).

    +
    +_images/webgui_camera_calibration_stereo_far.png +

    Abb. 45 Positionierung des Musters so entfernt wie möglich während der Stereokalibrierung

    +
    +

    Führt die Stereokalibrierung nicht zu einem akzeptablen Kalibrierfehler, sollte die Kalibrierung erneut vorgenommen werden, jedoch mit Monokalibrierung (siehe nächster Abschnitt Monokalibrierung).

    +
    +
    +

    Monokalibrierung

    +

    Monokalibrierung ist die intrinsische Kalibrierung jeder einzelnen Kamera. Da die intrinsische Kalibrierung in der Regel nicht beeinträchtigt wird, sollte die Monokalibrierung nur durchgeführt werden, wenn das Ergebnis der Stereokalibrierung nicht zufriedenstellend ist.

    +

    Durch Klicken auf Monokalibrierung durchführen im Reiter Kalibrieren kann die Monokalibrierung gestartet werden.

    +

    Zur Kalibrierung muss das Kalibriermuster in verschiedenen Ausrichtungen vor die Kamera gehalten werden. Die Pfeile, die von den Ecken des Musters bis zu den grünen Bildschirmbereichen führen, geben an, dass alle Musterecken innerhalb der grünen Rechtecke platziert werden müssen. Diese grünen Rechtecke sind sensible Bereiche. Mit dem Schieberegler Größe der sensiblen Bereiche lässt sich die Größe der Rechtecke einstellen, um die Kalibrierung zu vereinfachen. Es ist jedoch zu bedenken, dass die Größe nicht zu stark erhöht werden darf, da dies auf Kosten der Kalibriergenauigkeit gehen kann.

    +

    Häufig wird der Fehler begangen, das Muster bei der Kalibrierung falsch herum zu halten. Dieser Fehler lässt sich leicht erkennen, da sich die von den Musterecken zu den grünen Rechtecken verlaufenden Linien in diesem Fall kreuzen (siehe Abb. 46).

    +
    +_images/webgui_camera_calibration_wrong.png +

    Abb. 46 Wird das Kalibriermuster falsch herum gehalten, kreuzen sich die grünen Linien.

    +
    +
    +

    Bemerkung

    +

    Die Kalibrierung mag umständlich erscheinen, da das Muster hierfür in bestimmten vordefinierten Stellungen gehalten werden muss. Dieses Vorgehen ist jedoch notwendig um ein qualitativ hochwertiges Kalibrierergebnis zu erreichen.

    +
    +

    Für den Prozess der Monokalibrierung ist das Kalibriermuster für beide Kameras in den in Abb. 47 angegebenen Stellungen zu halten.

    +
    +_images/calib-views.png +

    Abb. 47 Musterposen für die Monokalibrierung

    +
    +

    Nachdem die Ecken oder Seiten des Kalibriermusters auf die sensiblen Bereiche ausgerichtet wurden, zeigt der Kalibriervorgang automatisch die nächste Stellung an. Sobald der Prozess für die linke Kamera abgeschlossen ist, ist er ebenso für die rechte Kamera zu wiederholen.

    +

    Anschließend folgen sind die Schritte im vorherigen Abschnitt Stereokalibrierung zu befolgen.

    +
    +
    +

    Kalibrierergebnis speichern

    +

    Mit Klick auf die Schaltfläche Kalibrierung berechnen wird der Kalibriervorgang beendet und das Endergebnis angezeigt. Der eingeblendete Wert ist der mittlere Reprojektionsfehler aller Kalibrierpunkte. Er ist in Pixeln angegeben und beläuft sich typischerweise auf einen Wert von unter 0,2.

    +

    Mit Klick auf Kalibrierung speichern wird das Kalibrierergebnis übernommen und auf dem Gerät gespeichert.

    +
    +

    Bemerkung

    +

    Das eingeblendete Ergebnis ist der nach der Kalibrierung bestehende Mindestfehler. Der reale Fehler liegt auf keinen Fall darunter, könnte theoretisch jedoch höher sein. Dies gilt für jeden Algorithmus zur Kamerakalibrierung und ist der Grund dafür, warum das Kalibriermuster in verschiedenen Positionen vor den Sensor zu halten ist. So ist sichergestellt, dass der reale Kalibrierfehler den errechneten Fehler nicht signifikant überschreitet.

    +
    +
    +

    Warnung

    +

    War vor der Durchführung der Kamerakalibrierung eine Hand-Auge-Kalibrierung auf dem rc_visard NG gespeichert, so sind die Werte der Hand-Auge-Kalibrierung möglicherweise ungültig geworden. Daher ist das Hand-Auge-Kalibrierverfahren zu wiederholen.

    +
    +
    +
    +
    +

    Parameter

    +

    Dieses Modul wird in der REST-API als rc_stereocalib bezeichnet.

    +
    +

    Bemerkung

    +

    Die verfügbaren Parameter und die Statuswerte des Moduls zur Kamerakalibrierung sind nur für den internen Gebrauch bestimmt und können ohne vorherige Ankündigung Änderungen unterzogen werden. Die Kalibrierung sollte gemäß den vorstehenden Anweisungen und ausschließlich in der Web GUI vorgenommen werden.

    +
    +
    +
    +

    Services

    +
    +

    Bemerkung

    +

    Die verfügbaren Services des Moduls zur Kamerakalibrierung sind lediglich für den internen Gebrauch bestimmt und können ohne vorherige Ankündigung Änderungen unterzogen werden. Die Kalibrierung sollte gemäß den vorstehenden Anweisungen und ausschließlich in der Web GUI vorgenommen werden.

    +
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/camera_modules.html b/v24.04/de/camera_modules.html new file mode 100644 index 0000000..edb4041 --- /dev/null +++ b/v24.04/de/camera_modules.html @@ -0,0 +1,677 @@ + + + + + + + + + + + 3D-Kamera-Module — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    3D-Kamera-Module

    +

    Die 3D-Kamera-Software des rc_visard NG enthält die folgenden Module:

    +
      +
    • +
      Kamera (rc_camera)
      +
      erfasst Bildpaare und führt die planare Rektifizierung durch, wodurch die Kamera als Messinstrument verwendet werden kann. Bilder werden sowohl für die weitere interne Verarbeitung durch andere Module als auch als GenICam-Bild-Streams für die externe Verwendung bereitgestellt.
      +
      +
    • +
    +
      +
    • +
      Stereo-Matching (rc_stereomatching)
      +
      nutzt die rektifizierten Stereo-Bildpaare, um 3D-Tiefeninformationen, z.B. für Disparitäts-, Fehler- und Konfidenzbilder, zu berechnen. Diese werden auch als GenICam-Bild-Streams bereitgestellt.
      +
      +
    • +
    +

    Die Module für die Kamera und das Stereo-Matching, welche die Bildpaare und die 3D-Tiefeninformationen bereitstellen, sind auch über die GigE Vision/GenICam-Schnittstelle des rc_visard NG konfigurierbar.

    +
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/collisioncheck.html b/v24.04/de/collisioncheck.html new file mode 100644 index 0000000..f5deb86 --- /dev/null +++ b/v24.04/de/collisioncheck.html @@ -0,0 +1,1259 @@ + + + + + + + + + + + CollisionCheck — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    CollisionCheck

    +
    +

    Einleitung

    +

    Das CollisionCheck Modul ist ein optionales Modul, welches intern auf dem rc_visard NG läuft, und ist freigeschaltet, sobald eine gültige Lizenz für eines der Module ItemPick und BoxPick oder SilhouetteMatch vorhanden ist. Andernfalls benötigt dieses Modul eine separate Lizenz.

    +

    Das Modul ermöglicht die Kollisionsprüfung zwischen dem Greifer und dem Load Carrier, oder anderen detektierten Objekten (nur in Kombination mit SilhouetteMatch). Es ist in die Module ItemPick und BoxPick und SilhouetteMatch integriert, kann aber auch als eigenständiges Modul genutzt werden. Die Greifermodelle für die Kollisionsprüfung müssen über das GripperDB Modul definiert werden.

    +
    +

    Warnung

    +

    Es werden nur Kollisionen zwischen dem Load Carrier und dem Greifer geprüft, aber nicht Kollisionen mit dem Roboter, dem Flansch oder anderen Objekten. Nur in Kombination mit SilhouetteMatch, und nur wenn das gewählte Template eine Kollisionsgeometrie enthält und check_collisions_with_matches im entsprechenden Modul aktiviert ist, werden auch Kollisionen zwischen dem Greifer und den anderen detektierten Objekten geprüft. Kollisionen mit Objekten, die nicht detektiert werden können, werden nicht geprüft. Nur in Kombination mit SilhouetteMatch, und nur wenn check_collisions_with_point_cloud im entsprechenden Modul aktiviert ist, werden auch Kollisionen zwischen dem Greifer und einer wasserdichten Version der Punktwolke geprüft.

    +
    + + ++++ + + + + + + + + +
    Tab. 42 Spezifikationen des CollisionCheck-Moduls
    Kollisionsprüfung mitdetektierter Load Carrier, detektierte Objekte (nur SilhouetteMatch), Basisebene (nur SilhouetteMatch)
    Kollisionsprüfung verfügbar inItemPick und BoxPick, SilhouetteMatch
    +
    +
    +

    Kollisionsprüfung

    +
    +

    Stand-Alone Kollisionsprüfung

    +

    Der Service check_collisions triggert die Kollisionsprüfung zwischen dem angegebenen Greifer und dem angegebenen Load Carrier für jeden der übergebenen Greifpunkte. Eine Kollisionsprüfung mit anderen Objekten ist nicht möglich. Das CollisionCheck-Modul überprüft, ob sich der Greifer in Kollision mit mindestens einem Load Carrier befindet, wenn sich der TCP an der Greifposition befindet. Es können mehrere Load Carrier gleichzeitig getestet werden. Der Griff wird als Kollision markiert, wenn es mit mindestens einem der definierten Load Carriern zu einer Kollision kommen würde.

    +

    Das Argument pre_grasp_offset (Greif-Offset) kann für eine erweiterte Kollisionsprüfung genutzt werden. Der Greif-Offset \(P_{off}\) ist der Offset vom Greifpunkt \(P_{grasp}\) zur Vorgreifposition \(P_{pre}\) im Koordinatensystem des Greifpunkts (siehe Abb. 40). Wenn der Greif-Offset angegeben wird, werden Greifpunkte auch dann als Kollisionen erkannt, wenn der Greifer an einem beliebigen Punkt während der linearen Bewegung zwischen Vorgreifposition und Greifposition in Kollision geraten würde.

    +
    +_images/pre_grasp_offset.svg +

    Abb. 40 Darstellung des Greif-Offsets für die Kollisionsprüfung. Im dargestellten Fall sind sowohl die Vorgreifposition als auch die Greifposition kollisionsfrei, aber die Trajektorie zwischen diesen Punkten hätte eine Kollision mit dem Load Carrier. Deswegen wird dieser Greifpunkt als Kollision erkannt.

    +
    +
    +
    +

    Integrierte Kollisionsprüfung in anderen Modulen

    +

    Die Kollisionsprüfung ist in die Services der folgenden Softwaremodule integriert:

    + +

    Jedem dieser Services kann ein collision_detection-Argument übergeben werden, das aus der ID des Standardgreifers (gripper_id) und aus dem Greif-Offset (pre_grasp_offset, siehe Stand-Alone Kollisionsprüfung) besteht. Der Standardgreifer, der durch das gripper_id Argument übergeben wird, wird nur für Greifpunkte verwendet, denen keine individuelle Greifer-ID zugewiesen wurde. Wenn das collision_detection Argument übergeben wird, liefern diese Services nur die Greifpunkte zurück, an denen der Greifer nicht in Kollision mit dem erkannten Load Carrier ist, oder für die keine Kollisionsprüfung durchgeführt werden konnte. Wenn eine Load Carrier ID angegeben wurde, wird die Kollisionsprüfung immer mit dem Load Carrier durchgeführt. Zusätzliche Funktionen für die Kollisionsprüfung können abhängig vom Modul aktiviert werden.

    +

    Nur in SilhouetteMatch, und nur wenn das gewählte Template eine Kollisionsgeometrie enthält und check_collisions_with_matches im entsprechenden Modul aktiviert ist, werden auch Greifpunkte, bei denen der Greifer in Kollision mit anderen detektierten Objekten wäre, herausgefiltert. Dabei ist das Objekt, auf dem sich der jeweilige Greifpunkt befindet, von der Prüfung ausgenommen.

    +

    Wenn ein Greifer für einen Greifpunkt in einem Template von SilhouetteMatch definiert ist, wird dieser Greifer und nicht der im collision_detection Argument des detect_object Services angegebene Greifer zur Kollisionsprüfung dieses Greifpunkts verwendet (siehe Setzen von Greifpunkten). Die vom detect_object Service zurückgelieferten Greifpunkte enthalten ein Flag collision_checked, das angibt ob der jeweilige Greifpunkt auf Kollisionen geprüft wurde, und das Feld gripper_id. Wenn collision_checked true ist, enthält das Feld gripper_id die ID des Greifers, der für die Kollisionsprüfung dieses Greifpunkts verwendet wurde. Dies ist die ID des Greifers, der für den jeweiligen Greifpunkt definiert wurde, oder, falls kein Greifer definiert wurde, die ID des Greifers die im collision_detection Argument des Serviceaufrufs angegeben wurde. Wenn collision_checked false ist, enthält gripper_id die ID des Greifers, die für den Greifpunkt definiert wurde.

    +

    In SilhouetteMatch werden Kollisionen zwischen dem Greifer und der Basisebene geprüft, wenn der Parameter check_collisions_with_base_plane in SilhouetteMatch aktiviert ist.

    +

    Kollisionen zwischen dem Greifer und einer wasserdichten Version der Punktwolke können in SilhouetteMatch geprüft werden, wenn der Parameter check_collisions_with_point_cloud im jeweiligen Modul aktiviert ist.

    +
    +

    Warnung

    +

    Es werden nur Kollisionen zwischen dem Load Carrier und dem Greifer geprüft, aber nicht Kollisionen mit dem Roboter, dem Flansch oder anderen Objekten. Nur in Kombination mit SilhouetteMatch, und nur wenn das gewählte Template eine Kollisionsgeometrie enthält und check_collisions_with_matches im entsprechenden Modul aktiviert ist, werden auch Kollisionen zwischen dem Greifer und den anderen detektierten Objekten geprüft. Kollisionen mit Objekten, die nicht detektiert werden können, werden nicht geprüft. Nur in Kombination mit SilhouetteMatch, und nur wenn check_collisions_with_point_cloud im entsprechenden Modul aktiviert ist, werden auch Kollisionen zwischen dem Greifer und einer wasserdichten Version der Punktwolke geprüft.

    +
    +

    Die Kollisionsprüfung wird von Laufzeitparametern beeinflusst, die weiter unten aufgeführt und beschrieben werden.

    +
    +
    +
    +

    Parameter

    +

    Das CollisionCheck-Modul wird in der REST-API als rc_collision_check bezeichnet und in der Web GUI unter Konfiguration ‣ CollisionCheck dargestellt. Der Benutzer kann die Parameter entweder dort oder über die REST-API-Schnittstelle ändern.

    +
    +

    Übersicht der Parameter

    +

    Dieses Softwaremodul bietet folgende Laufzeitparameter:

    + + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Tab. 43 Applikationsspezifische Laufzeitparameter des rc_collision_check Moduls
    NameTypMinMaxDefaultBeschreibung
    check_bottomboolfalsetruetrueAktiviert die Kollisionsprüfung mit dem Boden des Load Carriers.
    check_flangeboolfalsefalsetrueBestimmt, ob ein Greifpunkt als Kollision erkannt wird, sobald der Flansch innerhalb des Load Carriers ist.
    collision_distfloat640.00.10.01Minimaler Abstand in Metern zwischen einem Greiferelement und dem Load Carrier und/oder der Basisebene (nur SilhouetteMatch) für einen kollisionsfreien Griff.
    +
    +
    +

    Beschreibung der Laufzeitparameter

    +

    Jeder Laufzeitparameter ist durch eine eigene Zeile in der Web GUI im Abschnitt Einstellungen unter Konfiguration ‣ CollisionCheck repräsentiert. Der Web GUI-Name des Parameters ist in Klammern hinter dem Namen des Parameters angegeben:

    +
    +

    collision_dist (Sicherheitsabstand)

    +
    +

    Minimaler Abstand in Metern zwischen einem Greiferelement und dem Load Carrier und/oder der Basisebene (nur SilhouetteMatch) für einen kollisionsfreien Griff.

    +
    +

    Bemerkung

    +

    Der Sicherheitsabstand wird nicht für die Kollisionsprüfung zwischen dem Greifer und anderen detektierten Objekten angewendet. Er wird auch nicht verwendet um zu prüfen, ob sich der Flansch innerhalb des Load Carriers befindet (check_flange).

    +
    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_collision_check/parameters?collision_dist=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_collision_check/parameters?collision_dist=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    check_flange (Flansch-Check)

    +
    +

    Ermöglicht einen Sicherheitscheck mit dem Flansch, wie in Flanschradius beschrieben. Wenn dieser Parameter gesetzt ist, gelten alle Griffe, bei denen der Flansch innerhalb des Load Carriers wäre, als Kollisionen.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_collision_check/parameters?check_flange=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_collision_check/parameters?check_flange=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    check_bottom (Boden-Check)

    +
    +

    Wenn dieser Check aktiviert ist, werden Kollisionen nicht nur mit den Load Carrier Wänden, sondern auch mit dem Boden geprüft. Falls der TCP innerhalb der Kollisionsgeometrie (z.B. innerhalb des Sauggreifers) liegt, ist es möglicherweise nötig, diesen Check zu deaktivieren.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_collision_check/parameters?check_bottom=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_collision_check/parameters?check_bottom=<value>
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    Statuswerte

    +

    Statuswerte des rc_collision_check-Moduls:

    + + ++++ + + + + + + + + + + + + + + + + +
    Tab. 44 Statuswerte des rc_collision_check-Moduls
    NameBeschreibung
    last_evaluated_graspsAnzahl der ausgewerteten Griffe
    last_collision_free_graspsAnzahl der kollisionsfreien Griffe
    collision_check_timeLaufzeit der Kollisionsprüfung
    +
    +
    +

    Services

    +

    Die angebotenen Services von rc_collision_check können mithilfe der REST-API-Schnittstelle oder der rc_visard NG Web GUI ausprobiert und getestet werden.

    +

    Das CollisionCheck-Modul stellt folgende Services zur Verfügung.

    +
    +

    reset_defaults

    +
    +

    stellt die Werkseinstellungen der Parameter dieses Moduls wieder her und wendet sie an („factory reset“).

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_collision_check/services/reset_defaults
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_collision_check/services/reset_defaults
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "reset_defaults",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    check_collisions (veraltet)

    +
    +

    löst eine Kollisionsprüfung zwischen dem Greifer und einem Load Carrier aus.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_collision_check/services/check_collisions
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_collision_check/services/check_collisions
    +
    +
    +
    +
    +
    + +
    +

    Obligatorische Serviceargumente:

    +
    +

    grasps: Liste von Griffen, die überprüft werden sollen.

    +

    load_carriers: Liste von Load Carriern, die auf Kollisionen überprüft werden sollen. Die Felder der Load Carrier Definition sind in Erkennung von Load Carriern beschrieben. Die Griffe und die Load Carrier Positionen müssen im selben Koordinatensystem angegeben werden.

    +

    gripper_id: Die ID des Greifers, der in der Kollisionsprüfung verwendet werden soll. Der Greifer muss zuvor konfiguriert worden sein.

    +
    +

    Optionale Serviceargumente:

    +
    +
    pre_grasp_offset: Der Greif-Offset in Metern vom Greifpunkt zur Vorgreifposition. Wird ein Greif-Offset angegeben, dann wird die Kollisionsprüfung auf der gesamten linearen Trajektorie von der Vorgreifposition bis zur Greifposition durchgeführt.
    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "grasps": [
    +      {
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "pose_frame": "string",
    +        "uuid": "string"
    +      }
    +    ],
    +    "gripper_id": "string",
    +    "load_carriers": [
    +      {
    +        "id": "string",
    +        "inner_dimensions": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "outer_dimensions": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "pose_frame": "string",
    +        "rim_thickness": {
    +          "x": "float64",
    +          "y": "float64"
    +        }
    +      }
    +    ],
    +    "pre_grasp_offset": {
    +      "x": "float64",
    +      "y": "float64",
    +      "z": "float64"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +

    colliding_grasps: Liste von Griffen, die in Kollision mit einem oder mehreren Load Carriern sind.

    +

    collision_free_grasps: Liste von kollisionsfreien Griffen.

    +

    return_code: enthält mögliche Warnungen oder Fehlercodes und Nachrichten.

    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "check_collisions",
    +  "response": {
    +    "colliding_grasps": [
    +      {
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "pose_frame": "string",
    +        "uuid": "string"
    +      }
    +    ],
    +    "collision_free_grasps": [
    +      {
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "pose_frame": "string",
    +        "uuid": "string"
    +      }
    +    ],
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    set_gripper (veraltet)

    +
    +

    konfiguriert und speichert einen Greifer auf dem rc_visard NG.

    +
    + +
    +Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie stattdessen set_gripper in rc_gripper_db.
    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    PUT http://<host>/api/v1/nodes/rc_collision_check/services/set_gripper
    +
    +
    +

    Die Definitionen von Request und Response sind dieselben wie in set_gripper in rc_gripper_db beschrieben.

    +
    +
    +
    +
    +
    +

    get_grippers (veraltet)

    +
    +

    gibt die mit gripper_ids spezifizierten und gespeicherten Greifer zurück.

    +
    + +
    +Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie stattdessen get_grippers in rc_gripper_db.
    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    PUT http://<host>/api/v1/nodes/rc_collision_check/services/get_grippers
    +
    +
    +

    Die Definitionen von Request und Response sind dieselben wie in get_grippers in rc_gripper_db beschrieben.

    +
    +
    +
    +
    +
    +

    delete_grippers (veraltet)

    +
    +

    löscht die mit gripper_ids spezifizierten, gespeicherten Greifer.

    +
    + +
    +Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie stattdessen delete_grippers in rc_gripper_db.
    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    PUT http://<host>/api/v1/nodes/rc_collision_check/services/delete_grippers
    +
    +
    +

    Die Definitionen von Request und Response sind dieselben wie in delete_grippers in rc_gripper_db beschrieben.

    +
    +
    +
    +
    +
    +
    +

    Rückgabecodes

    +

    Zusätzlich zur eigentlichen Serviceantwort gibt jeder Service einen sogenannten return_code bestehend aus einem Integer-Wert und einer optionalen Textnachricht zurück. Erfolgreiche Service-Anfragen werden mit einem Wert von 0 quittiert. Positive Werte bedeuten, dass die Service-Anfrage zwar erfolgreich bearbeitet wurde, aber zusätzliche Informationen zur Verfügung stehen. Negative Werte bedeuten, dass Fehler aufgetreten sind. Für den Fall, dass mehrere Rückgabewerte zutreffend wären, wird der kleinste zurückgegeben, und die entsprechenden Textnachrichten werden in return_code.message akkumuliert.

    +

    Die folgende Tabelle listet die möglichen Rückgabecodes auf:

    + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Tab. 45 Fehlercodes des CollisionCheck-Services
    CodeBeschreibung
    0Erfolgreich
    -1Ein ungültiges Argument wurde übergeben.
    -7Daten konnten nicht in den persistenten Speicher geschrieben oder vom persistenten Speicher gelesen werden.
    -9Lizenz für CollisionCheck ist nicht verfügbar.
    -10Das neue Element konnte nicht hinzugefügt werden, da die maximal speicherbare Anzahl an Greifern überschritten wurde.
    10Die maximal speicherbare Anzahl an Greifern wurde erreicht.
    11Bestehender Greifer wurde überschrieben.
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/concept_stereo.html b/v24.04/de/concept_stereo.html new file mode 100644 index 0000000..c05abb7 --- /dev/null +++ b/v24.04/de/concept_stereo.html @@ -0,0 +1,675 @@ + + + + + + + + + + + Stereovision — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Stereovision

    +

    Bei der Stereovision werden 3D-Informationen gewonnen, indem zwei aus verschiedenen Blickwinkeln aufgenommene Bilder miteinander verglichen werden. Das zugrunde liegende Prinzip ist darin begründet, dass Objektpunkte je nach Abstand vom Kamerapaar an unterschiedlichen Stellen in beiden Kameras erscheinen. Während sehr weit entfernte Objektpunkte in beiden Kamerabildern etwa an der gleichen Position erscheinen, liegen sehr nahe Objektpunkte an unterschiedlichen Stellen im linken und rechten Kamerabild. Dieser Versatz der Objektpunkte in beiden Kamerabildern wird auch „Disparität“ genannt. Je größer die Disparität, desto näher ist das Objekt der Kamera. Das Prinzip der Stereovision wird in Abb. 14 genauer dargestellt.

    +
    +_images/stereo_sketch_v2_ng_de.svg +

    Abb. 14 Schematische Darstellung des Prinzips der Stereovision: Die Disparität \(d_2\) des weiter entfernten (schwarzen) Objekts ist kleiner als die Disparität \(d_1\) des nahe liegenden (grauen) Objekts.

    +
    +

    Stereovision beruht auf passiver Wahrnehmung. Dies bedeutet, dass keine Licht- oder sonstigen Signale zur Distanzmessung ausgesandt werden, sondern nur das von der Umgebung ausgehende oder reflektierte Licht genutzt wird. Dadurch können die Roboception-Sensoren sowohl im Innen- als auch im Außenbereich eingesetzt werden. Zudem können problemlos mehrere Sensoren störungsfrei zusammen auf engem Raum betrieben werden.

    +

    Um die 3D-Informationen berechnen zu können, muss der Stereo-Matching-Algorithmus die zusammengehörenden Objektpunkte im linken und rechten Kamerabild finden. Hierfür bedient er sich der Bildtextur, d.h. der durch Muster oder Oberflächenstrukturen der Objekte verursachten Schwankungen in der Bildintensität. Das Stereo-Matching-Verfahren kann bei Oberflächen ohne jede Textur, wie z.B. bei glatten, weißen Wänden, keine Werte liefern. Das Stereo-Matching-Verfahren, das der rc_visard NG verwendet, ist SGM (Semi-Global Matching), welches selbst bei feineren Strukturen den bestmöglichen Kompromiss aus Laufzeit und Genauigkeit bietet.

    +

    Für die Berechnung der 3D-Informationen werden folgende Softwaremodule benötigt:

    +
      +
    • Kamera: Dieses Modul dient dazu, synchronisierte Bildpaare aufzunehmen und diese in Bilder umzuwandeln, die weitestgehend den Aufnahmen einer idealen Kamera entsprechen (Rektifizierung).
    • +
    • Stereo-Matching: Dieses Modul errechnet mithilfe des Stereo-Matching-Verfahrens SGM die Disparitäten der rektifizierten Stereo-Bildpaare.
    • +
    +

    Für das Stereo-Matching-Verfahren müssen die Positionen der linken und rechten Kamera sowie ihre Ausrichtung zueinander genau bekannt sein. Dies wird durch Kalibrierung erreicht. Die Kameras des rc_visard NG werden bereits im Werk vorkalibriert. Hat sich der rc_visard NG jedoch, beispielsweise während des Transports, dekalibriert, muss die Stereokamera neu kalibriert werden.

    +
      +
    • Kamerakalibrierung: Mit diesem Modul kann der Benutzer die Stereokamera des rc_visard NG neu kalibrieren.
    • +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/concepts.html b/v24.04/de/concepts.html new file mode 100644 index 0000000..53a7580 --- /dev/null +++ b/v24.04/de/concepts.html @@ -0,0 +1,663 @@ + + + + + + + + + + + Messprinzipien — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Messprinzipien

    +

    Der rc_visard NG ist eine selbstregistrierende 3D-Kamera. Er erstellt rektifizierte Bilder sowie Disparitäts-, Konfidenz- und Fehlerbilder, mit denen sich die Tiefenwerte der Aufnahme berechnen lassen. Zusätzlich werden intern gemessene Beschleunigungs- und Drehraten mit Bewegungsschätzungen aus den Kamerabildern kombiniert, um Echtzeit-Schätzungen der aktuellen Pose (Position und Orientierung), Geschwindigkeit und Beschleunigung des Sensors anbieten zu können.

    +

    Im Folgenden sind die zugrunde liegenden Messprinzipien genauer dargestellt.

    +
    + +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/configuration_modules.html b/v24.04/de/configuration_modules.html new file mode 100644 index 0000000..efcb307 --- /dev/null +++ b/v24.04/de/configuration_modules.html @@ -0,0 +1,685 @@ + + + + + + + + + + + Konfigurationsmodule — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Konfigurationsmodule

    +

    Der rc_visard NG bietet mehrere verschiedene Konfigurationsmodule, welche es dem Nutzer ermöglichen, den rc_visard NG für spezielle Anwendungen zu konfigurieren.

    +

    Die Konfigurationsmodule sind:

    +
      +
    • +
      Hand-Auge-Kalibrierung (rc_hand_eye_calibration)
      +
      ermöglicht dem Benutzer, die Kamera entweder über die Web GUI oder die REST-API zu einem Roboter zu kalibrieren.
      +
      +
    • +
    • +
      CollisionCheck (rc_collision_check)
      +
      bietet eine einfache Möglichkeit zu prüfen, ob ein Greifer in Kollision ist.
      +
      +
    • +
    • +
      Kamerakalibrierung (rc_stereocalib)
      +
      ermöglicht die Überprüfung und Durchführung der Kamerakalibrierung über die Web GUI.
      +
      +
    • +
    • +
      IOControl und Projektor-Kontrolle (rc_iocontrol)
      +
      bietet die Kontrolle über die Ein- und Ausgänge des Sensors mit speziellen Betriebsarten zur Kontrolle eines externen Musterprojektors.
      +
      +
    • +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/contact.html b/v24.04/de/contact.html new file mode 100644 index 0000000..f3bda11 --- /dev/null +++ b/v24.04/de/contact.html @@ -0,0 +1,678 @@ + + + + + + + + + + + Kontakt — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Kontakt

    +
    +

    Support

    +

    Support-Anfragen können Sie uns entweder über die Seite http://www.roboception.com/support oder per E-Mail an support@roboception.de zukommen lassen.

    +
    +
    +

    Downloads

    +

    Software-SDKs usw. können von der Roboception-Homepage heruntergeladen werden: http://www.roboception.com/download.

    +
    +
    +

    Adresse

    +
    +
    Roboception GmbH
    +
    Kaflerstraße 2
    +
    81241 München
    +
    Deutschland
    +

    + + +
    Telefon: +49 89 889 50 79-0
    +

    +
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/database_modules.html b/v24.04/de/database_modules.html new file mode 100644 index 0000000..b3f7757 --- /dev/null +++ b/v24.04/de/database_modules.html @@ -0,0 +1,680 @@ + + + + + + + + + + + Datenbankmodule — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Datenbankmodule

    +

    Der rc_visard NG stellt mehrere Datenbankmodule zur Verfügung, die das Konfigurieren von globalen Daten ermöglichen, die in vielen Detektionsmodulen benötigt werden, zum Beispiel Load Carrier und Regions of Interest. Über die REST-API-Schnittstelle sind die Datenbankmodule nur in API Version 2 verfügbar.

    +

    Die Datenbankmodule sind:

    +
      +
    • +
      LoadCarrierDB (rc_load_carrier_db)
      +
      ermöglicht das Erstellen, Abfragen und Löschen von Load Carriern.
      +
      +
    • +
    • +
      RoiDB (rc_roi_db
      +
      ermöglicht das Erstellen, Abfragen und Löschen von 2D und 3d Regions of Interest.
      +
      +
    • +
    • +
      GripperDB (rc_gripper_db)
      +
      ermöglicht das Erstellen, Abfragen und Löschen von Greifern für die Kollisionsprüfung.
      +
      +
    • +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/detection_modules.html b/v24.04/de/detection_modules.html new file mode 100644 index 0000000..b78e506 --- /dev/null +++ b/v24.04/de/detection_modules.html @@ -0,0 +1,685 @@ + + + + + + + + + + + Detektionsmodule — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Detektionsmodule

    +

    Der rc_visard NG bietet Softwaremodule für unterschiedliche Detektionsanwendungen:

    +
      +
    • +
      LoadCarrier (rc_load_carrier)
      +
      ermöglicht die Erkennung von Load Carriern (Behältern) und ihres Füllstands.
      +
      +
    • +
    • +
      TagDetect (rc_april_tag_detect und rc_qr_code_detect)
      +
      ermöglicht die Erkennung von AprilTags und QR-Codes sowie die Schätzung von deren Pose.
      +
      +
    • +
    • +
      ItemPick und BoxPick (rc_itempick und rc_boxpick)
      +
      bietet eine Standardlösung für robotische Pick-and-Place-Anwendungen für Vakuum-Greifsysteme.
      +
      +
    • +
    • +
      SilhouetteMatch (rc_silhouettematch)
      +
      bietet eine Objekterkennungslösung für Objekte, die sich auf einer Ebene befinden, oder gestapelte planare Objekt.
      +
      +
    • +
    +

    Diese Module sind optional und können durch Kauf einer separaten Lizenz aktiviert werden.

    +
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/disposal.html b/v24.04/de/disposal.html new file mode 100644 index 0000000..b62d8a5 --- /dev/null +++ b/v24.04/de/disposal.html @@ -0,0 +1,684 @@ + + + + + + + + + + + Informationen zur Entsorgung — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Informationen zur Entsorgung

    +_images/weee-mark_small.png +
      +
    1. Entsorgung von Elektro- und Elektronikgeräten

      +

      Das Symbol der „durchgestrichenen Mülltonne“ bedeutet, dass Sie gesetzlich verpflichtet sind, diese Geräte einer vom unsortierten Siedlungsabfall getrennten Erfassung zuzuführen. Die Entsorgung über den Hausmüll, wie bspw. die Restmülltonne oder die Gelbe Tonne ist untersagt. Vermeiden Sie Fehlwürfe durch die korrekte Entsorgung in speziellen Sammel- und Rückgabestellen.

      +
    2. +
    3. Entnahme von Batterien

      +

      Enthalten die Produkte Batterien und Akkus, die aus dem Altgerät zerstörungsfrei entnommen werden können, müssen diese vor der Entsorgung entnommen werden und getrennt als Batterie entsorgt werden.

      +

      Folgende Batterien bzw. Akkumulatoren sind im rc_visard enthalten: Keine

      +
    4. +
    5. Möglichkeiten der Rückgabe von Altgeräten

      +

      Besitzer von Altgeräten können diese an den Hersteller zurückgeben, damit eine ordnungsgemäße Entsorgung sichergestellt ist.“

      +

      Bitte kontaktieren Sie den Support wegen der Rücknahme des Gerätes.

      +
    6. +
    7. Datenschutz

      +

      Endnutzer von Elektro- und Elektronikaltgeräten werden darauf hingewiesen, dass Sie für das Löschen personenbezogener Daten auf den zu entsorgenden Altgeräten selbst verantwortlich sind.

      +
    8. +
    9. WEEE-Registrierungsnummer

      +

      Roboception ist unter der Registrierungsnummer DE 33323989 bei der stiftung elektro-altgeräte register, Nordostpark 72, 90411 Nürnberg, als Hersteller von Elektro- und/ oder Elektronikgeräten registriert.

      +
    10. +
    11. Sammel- und Verwertungsquoten

      +

      Die EU-Mitgliedsstaaten sind nach der WEEE-Richtlinie verpflichtet, Daten zu Elektro- und Elektronikaltgeräten zu erheben und diese an die Europäische Kommission zu übermitteln. Auf der Webseite des Bundesministeriums für Umwelt- und Naturschutz finden Sie weitere Informationen hierzu.

      +
    12. +
    +

    Information zur Entsorgung außerhalb der Europäischen Union

    +

    Das Symbol der durchgestrichenen Mülltonne ist nur in der Europäischen Union gültig. Für die Entsorgung in anderen Ländern außerhalb der Europäischen Union können die örtlichen Behörden oder der Hersteller Auskunft über die richtige Entsorgungsmethode geben.

    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/eki.html b/v24.04/de/eki.html new file mode 100644 index 0000000..8bffee3 --- /dev/null +++ b/v24.04/de/eki.html @@ -0,0 +1,1408 @@ + + + + + + + + + + + KUKA Ethernet KRL Schnittstelle — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    KUKA Ethernet KRL Schnittstelle

    +

    Der rc_visard NG stellt ein Ethernet KRL Interface (EKI-Bridge) zur Verfügung, welches eine Kommunikation von KUKA KRL via KUKA.EthernetKRL XML mit dem rc_visard NG erlaubt.

    +
    +

    Bemerkung

    +

    Dieses Modul ist optional und benötigt eine gesonderte EKIBridge-Lizenz.

    +
    +
    +

    Bemerkung

    +

    Das KUKA.EthernetKRL add-on Software-Paket Version 2.2 oder neuer muss auf der Robotersteuerung aktiviert sein, um dieses Modul zu benutzen.

    +
    +

    Die EKI-Bridge kann benutzt werden, um programmatisch

    +
      +
    • Serviceanfragen auszuführen, z.B. um individuelle Module zu starten und stoppen, oder um angebotene Services wie z.B. die Hand-Auge-Kalibrierung oder Berechnung von Greifposen zu nutzen,
    • +
    • Laufzeitparameter abzufragen und zu ändern, z.B. der Kamera oder Disparitätsberechnung.
    • +
    +
    +

    Bemerkung

    +

    Eine bekannte Einschränkung der EKI Bridge ist, dass Strings, die valide Zahlen darstellen, nach int/float konvertiert werden. Daher sollten benutzerdefinierte Namen (wie ROI IDs, etc.) immer mindestens einen Buchstaben enthalten, sodass diese als Serviceargumente benutzt werden können.

    +
    +
    +

    Konfiguration der Ethernet-Verbindung

    +

    Die EKI-Bridge hört auf Port 7000 auf EKI-XML-Nachrichten und übersetzt diese transparent zur rc_visard NG REST-API v2. Die empfangenen EKI-Nachrichten werden in JSON umgewandelt und an die rc_visard NG REST-API weitergeleitet. Die Antwort der REST-API wird anschließend zurück in EKI-XML gewandelt.

    +

    Die EKI-Bridge erlaubt den Zugriff auf Laufzeitparameter und Services aller Module, die in Softwaremodule beschrieben sind.

    +

    Die Ethernet-Verbindung zum rc_visard NG wird auf der Robotersteuerung mit XML-Dateien konfiguriert. Die EKI-XML-Konfigurationsdateien aller Module auf dem rc_visard NG sind im Abschnitt EKI-XML-Konfigurationsdateien aufgezählt.

    +

    Für jedes Softwaremodul, das Laufzeitparameter anbietet, gibt es eine XML-Konfigurationsdatei, um die Parameter abzufragen und zu setzen. Diese sind nach dem Schema <node_name>-parameters.xml benannt. Für jeden Service eines Softwaremoduls gibt eine eigene XML-Konfigurationsdatei. Diese ist nach dem Schema <node_name>-<service_name>.xml benannt.

    +

    Die IP des rc_visard NG im Netzwerk muss in der XML Datei eingetragen werden.

    +

    Diese Konfigurationsdateien müssen im Verzeichnis C:\KRC\ROBOTER\Config\User\Common\EthernetKRL auf der Robotersteuerung abgelegt werden. Sie werden gelesen, sobald eine Verbindung initialisiert wird.

    +

    Um z.B. eine Ethernet-Verbindung mit dem Ziel aufzubauen, um die rc_stereomatching-Parameter zu konfigurieren, ist der folgende KRL-Code notwendig.

    +
    +
    DECL EKI_Status RET
    +RET = EKI_INIT("rc_stereomatching-parameters")
    +RET = EKI_Open("rc_stereomatching-parameters")
    +
    +; ----------- Desired operation -----------
    +
    +RET = EKI_Close("rc_stereomatching-parameters")
    +
    +
    +
    +
    +

    Bemerkung

    +

    Die EKI-Bridge terminiert automatisch die Verbindung zum Client, wenn eine empfangene XML-Nachricht ungültig ist.

    +
    +
    +
    +

    Allgemeine XML-Struktur

    +

    Für die Datenanfrage nutzt die EKI-Bridge <req> als Wurzelelement (kurz für „Request“).

    +

    Das Wurzelelement enthält immer die folgenden Elemente.

    +
      +
    • <node>: Dieses enthält ein Unterelement, über das die EKI-Bridge das Ziel-Softwaremodul identifiziert. Der Modulname ist bereits in der XML-Konfigurationsdatei vorausgefüllt.
    • +
    • <end_of_request>: „End-of-Request“ Flag, das das Ende der Anfrage markiert und diese auslöst.
    • +
    +

    Die generische XML-Struktur sieht wie folgt aus.

    +
    +
    <SEND>
    +  <XML>
    +    <ELEMENT Tag="req/node/<node_name>" Type="STRING"/>
    +    <ELEMENT Tag="req/end_of_request" Type="BOOL"/>
    +  </XML>
    +</SEND>
    +
    +
    +
    +

    Für den Datenempfang nutzt die EKI-Bridge <res> als Wurzelelement (kurz für „Response“). Das Wurzelelement enthält immer ein <return_code> Unterelement.

    +
    +
    <RECEIVE>
    +  <XML>
    +    <ELEMENT Tag="res/return_code/@value" Type="INT"/>
    +    <ELEMENT Tag="res/return_code/@message" Type="STRING"/>
    +    <ELEMENT Tag="res" Set_Flag="998"/>
    +  </XML>
    +</RECEIVE>
    +
    +
    +
    +
    +

    Bemerkung

    +

    Standardmäßig ist in den Konfigurationsdateien 998 als Flag angegeben, über welches KRL benachrichtigt wird, sobald eine Antwortnachricht empfangen wurde. Falls dieser Wert bereits in Benutzung ist, sollte dieser in der entsprechenden Konfigurationsdatei geändert werden.

    +
    +
    +

    Rückgabecode

    +

    Das <return_code>-Element enthält die Attribute value und message.

    +

    Wie für alle anderen Softwaremodule gibt eine erfolgreiche Anfrage ein res/return_code/@value mit dem Wert 0 zurück. Negative Werte geben an, dass die Anfrage fehlgeschlagen ist. Die Fehlermeldung ist in res/return_code/@message enthalten. Positive Werte geben an, dass die Anfrage erfolgreich war, aber weitere Informationen in res/return_code/@message enthalten sind.

    +

    Die folgenden Rückgabecodes können von der EKI-Bridge zurückgegeben werden:

    + + ++++ + + + + + + + + + + + + + + + + + + + + + + +
    Tab. 54 Rückgabecodes der EKI-Bridge
    CodeBeschreibung
    0Erfolgreich
    -1Parsing-Fehler in der Konvertierung von XML zu JSON
    -2Interner Fehler
    -5Verbindungsfehler von der REST-API
    -9Fehlende oder ungültige Lizenz für das EKI-Bridge-Modul
    +
    +

    Bemerkung

    +

    Die EKI-Bridge liefert auch Rückgabecodes spezifisch zu den individuellen Softwaremodulen zurück. Diese sind im jeweiligen Softwaremodul dokumentiert.

    +
    +
    +

    Bemerkung

    +

    Aufgrund von Limitierungen in KRL ist die maximale Länge eines Strings, der von der EKI-Bridge zurückgegeben wird, auf 512 Zeichen begrenzt. Alle längeren Strings werden gekürzt.

    +
    +
    +
    +
    +

    Services

    +

    Das XML-Schema für die Services der Softwaremodule wird aus den Argumenten und der Antwort in JavaScript Object Notation (JSON) generiert, wie in Softwaremodule beschrieben. Diese Umwandlung ist bis auf die unten beschriebenen Regeln transparent.

    +

    Konvertierung von Posen:

    +
    +

    Eine Pose ist ein JSON-Objekt, das die Schlüssel position und orientation enthält.

    +
    +
    {
    +  "pose": {
    +    "position": {
    +      "x": "float64",
    +      "y": "float64",
    +      "z": "float64",
    +    },
    +    "orientation": {
    +      "x": "float64",
    +      "y": "float64",
    +      "z": "float64",
    +      "w": "float64",
    +    }
    +  }
    +}
    +
    +
    +
    +

    Dieses JSON-Objekt wird zu einem KRL FRAME in der XML-Nachricht konvertiert.

    +
    +
    <pose X="..." Y="..." Z="..." A="..." B="..." C="..."></pose>
    +
    +
    +
    +

    Positionen werden von Metern in Millimetern umgerechnet und Orientierungen von Quaternionen in das KUKA-ABC-Format (in Grad).

    +
    +

    Bemerkung

    +

    Es werden in der EKI-Bridge keine anderen Größenumrechnungen vorgenommen. Alle Abmessungen und 3D-Koordinaten, die nicht zu einer Pose gehören, werden in Metern erwartet und zurückgegeben.

    +
    +
    +

    Arrays:

    +
    +

    Arrays enthalten die Unterelemente <le> (kurz für „List Element“). Als Beispiel wird das JSON-Objekt

    +
    +
    {
    +  "rectangles": [
    +    {
    +      "x": "float64",
    +      "y": "float64"
    +    }
    +  ]
    +}
    +
    +
    +
    +

    in das folgende XML-Fragment konvertiert

    +
    +
    <rectangles>
    +  <le>
    +    <x>...</x>
    +    <y>...</y>
    +  </le>
    +</rectangles>
    +
    +
    +
    +
    +

    XML-Attribute:

    +
    +

    Alle JSON-Schlüssel, deren Wert ein primitiver Datentyp ist und die nicht zu einem Array gehören, werden in XML-Attributen gespeichert. Als Beispiel wird das JSON-Objekt

    +
    +
    {
    +  "item": {
    +    "uuid": "string",
    +    "confidence": "float64",
    +    "rectangle": {
    +      "x": "float64",
    +      "y": "float64"
    +    }
    +  }
    +}
    +
    +
    +
    +

    in das folgende XML-Fragment konvertiert

    +
    +
    <item uuid="..." confidence="...">
    +  <rectangle x="..." y="...">
    +  </rectangle>
    +</item>
    +
    +
    +
    +
    +
    +

    Anfrage-XML-Struktur

    +

    Das <SEND>-Element in der XML-Konfigurationsdatei für einen generischen Service folgt der folgenden Spezifikation:

    +
    +
    <SEND>
    +  <XML>
    +    <ELEMENT Tag="req/node/<node_name>" Type="STRING"/>
    +    <ELEMENT Tag="req/service/<service_name>" Type="STRING"/>
    +    <ELEMENT Tag="req/args/<argX>" Type="<argX_type>"/>
    +    <ELEMENT Tag="req/end_of_request" Type="BOOL"/>
    +  </XML>
    +</SEND>
    +
    +
    +
    +

    Das <service>-Element hat ein XML-Unterelement, über das die EKI-Bridge den angefragten Service identifiziert. Es ist bereits vorausgefüllt in der Konfigurationsdatei enthalten.

    +

    Das <args> Element beinhaltet die Service-Argumente. Diese können jeweils mit der KRL-Instruktion EKI_Set<Type> gesetzt werden.

    +

    Beispielsweise sieht das <SEND>-Element des rc_load_carrier_db get_load_carriers Services (siehe LoadCarrierDB) wie folgt aus.

    +
    +
    <SEND>
    +  <XML>
    +    <ELEMENT Tag="req/node/rc_load_carrier_db" Type="STRING"/>
    +    <ELEMENT Tag="req/service/get_load_carriers" Type="STRING"/>
    +    <ELEMENT Tag="req/args/load_carrier_ids/le" Type="STRING"/>
    +    <ELEMENT Tag="req/end_of_request" Type="BOOL"/>
    +  </XML>
    +</SEND>
    +
    +
    +
    +

    Das <end_of_request>-Element erlaubt es, Anfragen mit Arrays zu übermitteln. Um ein Array zu senden, wird die Anfrage in so viele Nachrichten wie Array-Elemente aufgeteilt. Die letzte Nachricht beinhaltet alle XML-Tags inklusive dem <end_of_request>-Flag, während alle anderen Nachrichten jeweils nur ein Array-Element enthalten.

    +

    Um z.B. zwei Load-Carrier-Modelle mit dem get_load_carriers Service vom rc_load_carrier_db abzufragen, muss der Nutzer zwei XML-Nachrichten senden. Die erste XML-Nachricht lautet:

    +
    +
    <req>
    +  <args>
    +    <load_carrier_ids>
    +      <le>load_carrier1</le>
    +    </load_carrier_ids>
    +  </args>
    +</req>
    +
    +
    +
    +

    Diese Nachricht kann über KRL mit dem EKI_Send Kommando gesendet werden, indem das Listenelement als Pfad angegeben wird.

    +
    +
    DECL EKI_STATUS RET
    +RET = EKI_SetString("rc_load_carrier_db-get_load_carriers", "req/args/load_carrier_ids/le", "load_carrier1")
    +RET = EKI_Send("rc_load_carrier_db-get_load_carriers", "req/args/load_carrier_ids/le")
    +
    +
    +
    +

    Die zweite Nachricht beinhaltet alle XML-Tags und löst die Anfrage beim rc_load_carrier_db Softwaremodul aus.

    +
    +
    <req>
    +  <node>
    +    <rc_load_carrier_db></rc_load_carrier_db>
    +  </node>
    +  <service>
    +    <get_load_carriers></get_load_carriers>
    +  </service>
    +  <args>
    +    <load_carrier_ids>
    +      <le>load_carrier2</le>
    +    </load_carrier_ids>
    +  </args>
    +  <end_of_request></end_of_request>
    +</req>
    +
    +
    +
    +

    Diese Nachricht kann über KRL gesendet werden, indem req als Pfad für EKI_Send angegeben wird:

    +
    +
    DECL EKI_STATUS RET
    +RET = EKI_SetString("rc_load_carrier_db-get_load_carriers", "req/args/load_carrier_ids/le", "load_carrier2")
    +RET = EKI_Send("rc_load_carrier_db-get_load_carriers", "req")
    +
    +
    +
    +
    +
    +

    Antwort-XML-Struktur

    +

    Das <SEND>-Element in der XML-Konfigurationsdatei für einen generischen Service folgt der folgenden Spezifikation:

    +
    +
    <RECEIVE>
    +  <XML>
    +    <ELEMENT Tag="res/<resX>" Type="<resX_type>"/>
    +    <ELEMENT Tag="res/return_code/@value" Type="INT"/>
    +    <ELEMENT Tag="res/return_code/@message" Type="STRING"/>
    +    <ELEMENT Tag="res" Set_Flag="998"/>
    +  </XML>
    +</RECEIVE>
    +
    +
    +
    +

    Beispielsweise sieht das <RECEIVE>-Element des rc_april_tag_detect detect Services (siehe TagDetect) wie folgt aus.

    +
    +
    <RECEIVE>
    +  <XML>
    +    <ELEMENT Tag="res/timestamp/@sec" Type="INT"/>
    +    <ELEMENT Tag="res/timestamp/@nsec" Type="INT"/>
    +    <ELEMENT Tag="res/return_code/@message" Type="STRING"/>
    +    <ELEMENT Tag="res/return_code/@value" Type="INT"/>
    +    <ELEMENT Tag="res/tags/le/pose_frame" Type="STRING"/>
    +    <ELEMENT Tag="res/tags/le/timestamp/@sec" Type="INT"/>
    +    <ELEMENT Tag="res/tags/le/timestamp/@nsec" Type="INT"/>
    +    <ELEMENT Tag="res/tags/le/pose/@X" Type="REAL"/>
    +    <ELEMENT Tag="res/tags/le/pose/@Y" Type="REAL"/>
    +    <ELEMENT Tag="res/tags/le/pose/@Z" Type="REAL"/>
    +    <ELEMENT Tag="res/tags/le/pose/@A" Type="REAL"/>
    +    <ELEMENT Tag="res/tags/le/pose/@B" Type="REAL"/>
    +    <ELEMENT Tag="res/tags/le/pose/@C" Type="REAL"/>
    +    <ELEMENT Tag="res/tags/le/instance_id" Type="STRING"/>
    +    <ELEMENT Tag="res/tags/le/id" Type="STRING"/>
    +    <ELEMENT Tag="res/tags/le/size" Type="REAL"/>
    +    <ELEMENT Tag="res" Set_Flag="998"/>
    +  </XML>
    +</RECEIVE>
    +
    +
    +
    +

    Bei Arrays beinhaltet die Antwort mehrere Instanzen des gleichen XML-Elements. Jedes Element wird in einen separaten Puffer in EKI geschrieben und kann daraus mit KRL-Instruktionen ausgelesen werden. Die Anzahl an Instanzen (Array-Elementen) kann über EKI_CheckBuffer abgefragt werden und jede Instanz mit EKI_Get<Type> ausgelesen werden.

    +

    Beispielsweise können die Ergebnisposen aus einer Antwort des rc_april_tag_detect detect Services in KRL wie folgt ausgelesen werden:

    +
    +
    DECL EKI_STATUS RET
    +DECL INT i
    +DECL INT num_instances
    +DECL FRAME poses[32]
    +
    +DECL FRAME pose = {X 0.0, Y 0.0, Z 0.0, A 0.0, B 0.0, C 0.0}
    +
    +RET = EKI_CheckBuffer("rc_april_tag_detect-detect", "res/tags/le/pose")
    +num_instances = RET.Buff
    +for i=1 to num_instances
    +  RET = EKI_GetFrame("rc_april_tag_detect-detect", "res/tags/le/pose", pose)
    +  poses[i] = pose
    +endfor
    +RET = EKI_ClearBuffer("rc_april_tag_detect-detect", "res")
    +
    +
    +
    +
    +

    Bemerkung

    +

    Vor jeder Anfrage über EKI zum rc_visard NG sollten alle Puffer geleert werden, um sicherzustellen, dass nur die aktuelle Antwort in den EKI-Puffern enthalten ist.

    +
    +
    +
    +
    +

    Parameter

    +

    Die Parameter aller Softwaremodule können über die EKI-Bridge ausgelesen und gesetzt werden. Die XML-Konfigurationsdatei für ein generisches Softwaremodul folgt dieser Spezifikation:

    +
    +
    <SEND>
    +  <XML>
    +    <ELEMENT Tag="req/node/<node_name>" Type="STRING"/>
    +    <ELEMENT Tag="req/parameters/<parameter_x>/@value" Type="INT"/>
    +    <ELEMENT Tag="req/parameters/<parameter_y>/@value" Type="STRING"/>
    +    <ELEMENT Tag="req/end_of_request" Type="BOOL"/>
    +  </XML>
    +</SEND>
    +<RECEIVE>
    +  <XML>
    +    <ELEMENT Tag="res/parameters/<parameter_x>/@value" Type="INT"/>
    +    <ELEMENT Tag="res/parameters/<parameter_x>/@default" Type="INT"/>
    +    <ELEMENT Tag="res/parameters/<parameter_x>/@min" Type="INT"/>
    +    <ELEMENT Tag="res/parameters/<parameter_x>/@max" Type="INT"/>
    +    <ELEMENT Tag="res/parameters/<parameter_y>/@value" Type="REAL"/>
    +    <ELEMENT Tag="res/parameters/<parameter_y>/@default" Type="REAL"/>
    +    <ELEMENT Tag="res/parameters/<parameter_y>/@min" Type="REAL"/>
    +    <ELEMENT Tag="res/parameters/<parameter_y>/@max" Type="REAL"/>
    +    <ELEMENT Tag="res/return_code/@value" Type="INT"/>
    +    <ELEMENT Tag="res/return_code/@message" Type="STRING"/>
    +    <ELEMENT Tag="res" Set_Flag="998"/>
    +  </XML>
    +</RECEIVE>
    +
    +
    +
    +

    Die Anfrage wird als Anfrage zum Lesen von Parametern interpretiert, wenn die value-Attribute aller Parameter leer sind. Falls mindestens ein value-Attribut befüllt ist, wird die Anfrage als Anfrage zum Setzen von Parametern interpretiert und die befüllten Parameter gesetzt.

    +

    Beispielsweise können die aktuellen Werte aller Parameter von rc_stereomatching mit der folgenden XML-Nachricht abgefragt werden:

    +
    +
    <req>
    +  <node>
    +    <rc_stereomatching></rc_stereomatching>
    +  </node>
    +  <parameters></parameters>
    +  <end_of_request></end_of_request>
    +</req>
    +
    +
    +
    +

    Diese XML-Nachricht kann folgendermaßen über KRL gesendet werden:

    +
    +
    DECL EKI_STATUS RET
    +RET = EKI_Send("rc_stereomatching-parameters", "req")
    +
    +
    +
    +

    Die Antwort der EKI-Bridge enthält alle Parameter:

    +
    +
    <res>
    +  <parameters>
    +    <acquisition_mode default="Continuous" max="" min="" value="Continuous"/>
    +    <quality default="High" max="" min="" value="High"/>
    +    <static_scene default="0" max="1" min="0" value="0"/>
    +    <seg default="200" max="4000" min="0" value="200"/>
    +    <smooth default="1" max="1" min="0" value="1"/>
    +    <fill default="3" max="4" min="0" value="3"/>
    +    <minconf default="0.5" max="1.0" min="0.5" value="0.5"/>
    +    <mindepth default="0.1" max="100.0" min="0.1" value="0.1"/>
    +    <maxdepth default="100.0" max="100.0" min="0.1" value="100.0"/>
    +    <maxdeptherr default="100.0" max="100.0" min="0.01" value="100.0"/>
    +  </parameters>
    +  <return_code message="" value="0"/>
    +</res>
    +
    +
    +
    +

    Der quality-Parameter von rc_stereomatching kann mit folgender XML-Nachricht auf Low gesetzt werden:

    +
    +
    <req>
    +    <node>
    +      <rc_stereomatching></rc_stereomatching>
    +    </node>
    +    <parameters>
    +      <quality value="Low"></quality>
    +    </parameters>
    +    <end_of_request></end_of_request>
    +</req>
    +
    +
    +
    +

    Diese XML-Nachricht kann folgendermaßen über KRL gesendet werden:

    +
    +
    DECL EKI_STATUS RET
    +RET = EKI_SetString("rc_stereomatching-parameters", "req/parameters/quality/@value", "Low")
    +RET = EKI_Send("rc_stereomatching-parameters", "req")
    +
    +
    +
    +

    In diesem Fall wird nur der gesetzte Wert von quality zurückgegeben:

    +
    +
    <res>
    +  <parameters>
    +    <quality default="High" max="" min="" value="Low"/>
    +  </parameters>
    +  <return_code message="" value="0"/>
    +</res>
    +
    +
    +
    +
    +
    +

    EKI-XML-Konfigurationsdateien

    +

    Dieser Abschnitt enthält die EKI-XML-Konfigurationsdateien aller Softwaremodule des rc_visard NG. Die sind auch in diesem ZIP-Archiv zum Download verfügbar.

    +

    rc_april_tag_detect

    +
    +
    +
    +

    rc_boxpick

    +
    +
    +

    rc_camera

    +
    +
    +
    +

    rc_collision_check

    +
    +
    +

    rc_gripper_db

    +
    +
    +

    rc_hand_eye_calibration

    +
    +
    +

    rc_iocontrol

    +
    +
    +
    +

    rc_itempick

    +
    +
    +

    rc_load_carrier

    +
    +
    +

    rc_load_carrier_db

    +
    +
    +

    rc_qr_code_detect

    +
    +
    +
    +

    rc_roi_db

    +
    +
    +

    rc_silhouettematch

    +
    +
    +

    rc_stereocalib

    +
    +
    +
    +

    rc_stereomatching

    +
    +
    +
    +
    +

    Beispielanwendungen

    +

    Ausführlichere Beispielanwendungen können unter https://github.com/roboception/eki_examples abgerufen werden.

    +
    +
    +

    Fehlerbehebung

    +

    SmartPad Fehlermeldung: Limit of element memory reached

    +

    Dieser Fehler kann auftreten, wenn die Anzahl der Matches das Speicherlimit überschreitet.

    +
      +
    • Erhöhen Sie den Wert BUFFERING und setzen Sie BUFFSIZE in den EKI Konfigurationsdateien. Passen Sie diese Einstellungen an Ihre spezielle KRC an.
    • +
    • Verringern Sie den Parameter ‚Maximale Matches‘ im Detektionsmodul.
    • +
    • Selbst wenn das Gesamtspeicherlimit (BUFFSIZE) einer Nachricht nicht erreicht wird, kann die KRC die Anzahl der Elemente im XML-Baum möglicherweise nicht analysieren, wenn das BUFFERING-Limit zu klein ist. Wenn Ihre Anwendung beispielsweise 50 verschiedene Greifpunkte vorschlägt, muss das BUFFERING-Limit ebenfalls 50 betragen.
    • +
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/general.html b/v24.04/de/general.html new file mode 100644 index 0000000..ed4e74b --- /dev/null +++ b/v24.04/de/general.html @@ -0,0 +1,672 @@ + + + + + + + + + + + Überblick — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Überblick

    +

    Der 3D-Sensor rc_visard ist eine Stereokamera, die über eine integrierte Recheneinheit verfügt und der Schutzklasse IP 54 angehört.

    +

    Der rc_visard NG stellt Echtzeit-Kamerabilder und Tiefenbilder bereit, die zur Berechnung von 3D-Punktwolken verwendet werden können. Zudem erstellt er Konfidenz- und Fehlerbilder, mit denen sich die Qualität der Bilderfassung messen lässt. Dank der standardisierten GenICam-Schnittstelle ist er mit allen großen Bildverarbeitungsbibliotheken kompatibel und bietet darüber hinaus eine intuitive, web-basierte Bedienoberfläche an.

    +

    Mit optional erhältlichen Softwaremodulen bietet der rc_visard NG Standardlösungen für Anwendungen in der Objekterkennung oder für robotische Pick-and-Place-Applikationen.

    +

    Dank der intuitiven Kalibrierung, Konfiguration und Bedienung macht der rc_visard NG 3D-Wahrnehmung für jedermann möglich.

    +
    +_images/sensor_ng.png +

    Abb. 1 rc_visard NG 160

    +
    +

    Werden im vorliegenden Handbuch die Begriffe „Sensor“ und „rc_visard NG“ verwendet, so beziehen sich diese auf den von Roboception angebotenen rc_visard NG.

    +
    +

    Bemerkung

    +

    Das vorliegende Handbuch nutzt das metrische System und verwendet vorrangig die Maßeinheiten Meter und Millimeter. Sofern nicht anders angegeben, sind Abmessungen in technischen Zeichnungen in Millimetern angegeben.

    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/genindex.html b/v24.04/de/genindex.html new file mode 100644 index 0000000..58d8e36 --- /dev/null +++ b/v24.04/de/genindex.html @@ -0,0 +1,2908 @@ + + + + + + + + + + + + Stichwortverzeichnis — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + +
      + +
    • rc_visard NG >
    • + +
    • Stichwortverzeichnis
    • + + +
    • + + + +
    • + +
    + + +
    +
    +
    +
    + + +

    Stichwortverzeichnis

    + +
    + Sonderzeichen + | A + | B + | C + | D + | E + | F + | G + | H + | I + | K + | L + | M + | N + | O + | P + | Q + | R + | S + | T + | U + | V + | W + | X + | Z + +
    +

    Sonderzeichen

    + + + +
    + +

    A

    + + + +
    + +

    B

    + + + +
    + +

    C

    + + + +
    + +

    D

    + + + +
    + +

    E

    + + + +
      +
    • + ExposureRegionHeight + +
    • +
    • + ExposureRegionOffsetX + +
    • +
    • + ExposureRegionOffsetY + +
    • +
    • + ExposureRegionWidth + +
    • +
    • + ExposureTime + +
    • +
    • + ExposureTimeAutoMax + +
    • +
    • + externes Referenzkoordinatensystem + +
    • +
    + +

    F

    + + + +
    + +

    G

    + + + +
    + +

    H

    + + + +
    + +

    I

    + + + +
    + +

    K

    + + + +
    + +

    L

    + + + +
    + +

    M

    + + + +
    + +

    N

    + + + +
    + +

    O

    + + + +
    + +

    P

    + + + +
    + +

    Q

    + + + +
    + +

    R

    + + + +
    + +

    S

    + + + +
    + +

    T

    + + + +
    + +

    U

    + + + +
    + +

    V

    + + + +
    + +

    W

    + + + +
    + +

    X

    + + + +
    + +

    Z

    + + + +
    + + + +
    +
    + +
    +
    +
    + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/gigevision.html b/v24.04/de/gigevision.html new file mode 100644 index 0000000..ccf0585 --- /dev/null +++ b/v24.04/de/gigevision.html @@ -0,0 +1,1335 @@ + + + + + + + + + + + GigE Vision 2.0/GenICam-Schnittstelle — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    GigE Vision 2.0/GenICam-Schnittstelle

    +

    Gigabit Ethernet for Machine Vision (oder kurz „GigE Vision®“) ist ein industrieller Standard für Kameraschnittstellen, der auf UDP/IP basiert (siehe http://www.gigevision.com). Der rc_visard NG nutzt den GigE Vision®-Standard der Version 2.0 und ist damit mit allen GigE Vision®-2.0-Standard-konformen Frameworks und Bibliotheken kompatibel.

    +

    GigE Vision® verwendet GenICam (Generic Interface for Cameras), um die Eigenschaften der Kamera bzw. des Geräts zu beschreiben. Für nähere Informationen zu dieser generischen Programmierschnittstelle für Kameras siehe http://www.genicam.org/.

    +

    Über diese Schnittstelle stellt der rc_visard NG folgende Funktionen zur Verfügung:

    +
      +
    • Discovery-Mechanismus,
    • +
    • IP-Konfiguration,
    • +
    • Konfiguration kamerabezogener Parameter,
    • +
    • Bildaufnahme und
    • +
    • Zeitsynchronisierung über das im Standard IEEE 1588-2008 definierte Precision Time Protocol (PTPv2).
    • +
    +
    +

    Bemerkung

    +

    Der rc_visard NG unterstützt Jumbo-Frames mit einer Größe bis 9000 Byte. Für höchste Leistung wird empfohlen, die maximale Übertragungseinheit (MTU) des GigE-Vision-Clients auf 9000 zu stellen.

    +
    +
    +

    Bemerkung

    +

    Über seine Homepage stellt Roboception Tools und eine C++-Programmierschnittstelle mit Beispielen zum Discovery-Mechanismus, zur Konfiguration und zum Bild-Streaming über die GigE Vision/GenICam-Schnittstelle zur Verfügung (http://www.roboception.com/download).

    +
    +
    +

    GigE Vision Ports

    +

    GigE Vision ist ein UDP basiertes Protokoll. Auf dem rc_visard NG sind die UDP Ports statisch und bekannt:

    +
      +
    • UDP Port 3956: GigE Vision Control Protocol (GVCP). Zum Auffinden, steuern und konfigurieren des Geräts.
    • +
    • UDP Port 50010: Stream channel source port. Nutzt das GigE Vision Stream Protocol (GVSP) zum transferieren der Bilder.
    • +
    +
    +
    +

    Wichtige Parameter der GenICam-Schnittstelle

    +

    Die folgende Liste enthält einen Überblick über relevante GenICam-Parameter des rc_visard NG, die über die GenICam-Schnittstelle abgerufen und/oder geändert werden können. Neben den Standardparametern, die in der Standard Feature Naming Convention (SFNC, siehe http://www.emva.org/standards-technology/genicam/genicam-downloads/) definiert werden, bietet der rc_visard NG zudem eigene Parameter, die sich auf spezielle Eigenschaften der Module Kamera und Stereo-Matching beziehen.

    +
    +
    +

    Wichtige Standardparameter der GenICam-Schnittstelle

    +
    +

    Kategorie: ImageFormatControl

    +
    +
    ComponentSelector
    +
      +
    • Typ: Aufzählung, mögliche Werte: Intensity, IntensityCombined, Disparity, Confidence oder Error
    • +
    • Voreinstellung: -
    • +
    • Beschreibung: Erlaubt dem Benutzer, einen der fünf Bild-Streams zur Konfiguration auszuwählen (siehe Verfügbare Bild-Streams).
    • +
    +
    +
    +
    +
    ComponentIDValue (schreibgeschützt)
    +
      +
    • Typ: Integer
    • +
    • Beschreibung: ID des vom ComponentSelector ausgewählten Bild-Streams.
    • +
    +
    +
    +
    +
    ComponentEnable
    +
      +
    • Typ: Boolean
    • +
    • Voreinstellung: -
    • +
    • Beschreibung: Ist der Parameter auf true gesetzt, aktiviert er den im ComponentSelector ausgewählten Bild-Stream. Anderenfalls deaktiviert er diesen Stream. Über ComponentSelector und ComponentEnable lassen sich einzelne Bild-Streams ein- und ausschalten.
    • +
    +
    +
    +
    +
    Width (schreibgeschützt)
    +
      +
    • Typ: Integer
    • +
    • Beschreibung: Bildbreite des vom ComponentSelector ausgewählten Bild-Streams in Pixeln.
    • +
    +
    +
    +
    +
    Height (schreibgeschützt)
    +
      +
    • Typ: Integer
    • +
    • Beschreibung: Bildhöhe des vom ComponentSelector ausgewählten Bild-Streams in Pixeln.
    • +
    +
    +
    +
    +
    WidthMax (schreibgeschützt)
    +
      +
    • Typ: Integer
    • +
    • Beschreibung: Maximale Breite eines Bildes.
    • +
    +
    +
    +
    +
    HeightMax (schreibgeschützt)
    +
      +
    • Typ: Integer
    • +
    • Beschreibung: Maximale Höhe eines Bildes im Stream. Der Wert beträgt aufgrund der gestapelten Bilder der linken und rechten Kamera im IntensityCombined-Stream immer 1920 Pixel (siehe Verfügbare Bild-Streams).
    • +
    +
    +
    +
    +
    PixelFormat
    +
      +
    • Typ: Aufzählung, mögliche Werte: Mono8 oder YCbCr411_8 (nur bei Farbkameras), Coord3D_C16, Confidence8 und Error8
    • +
    • Beschreibung: Pixelformat der selektierten Komponente. Die Aufzählung erlaubt nur aus Pixelformaten auszuwählen, die für die ausgewählte Komponente möglich sind. Bei einer Farbkamera kann man bei den Komponenten Intensity und IntensityCombined zwischen den Pixelformaten Mono8 oder YCbCr411_8 wählen.
    • +
    +
    +
    +
    +
    +

    Kategorie: AcquisitionControl

    +
    +
    AcquisitionFrameRate
    +
      +
    • Typ: Float, Wertebereich: 1–25 Hz
    • +
    • Voreinstellung: 25 Hz
    • +
    • Beschreibung: Bildwiederholrate der Kamera (FPS).
    • +
    +
    +
    +
    +
    ExposureAuto
    +
    +
    +
    +
    +
    ExposureTime
    +
      +
    • Typ: Float, Wertebereich: 66–18000 µs
    • +
    • Voreinstellung: 5000 µs
    • +
    • Beschreibung: Belichtungszeit der Kameras für den manuellen Belichtungsmodus, ausgedrückt in Mikrosekunden (Belichtungszeit).
    • +
    +
    +
    +
    +
    +

    Kategorie: AnalogControl

    +
    +
    GainSelector (schreibgeschützt)
    +
      +
    • Typ: Aufzählung, Wert: ist immer All
    • +
    • Voreinstellung: All
    • +
    • Beschreibung: Der rc_visard NG unterstützt aktuell nur einen globalen Verstärkungsfaktor.
    • +
    +
    +
    +
    +
    Gain
    +
      +
    • Typ: Float, Wertebereich: 0–18 dB
    • +
    • Voreinstellung: 0 dB
    • +
    • Beschreibung: Verstärkungsfaktor der Kameras für den manuellen Belichtungsmodus, ausgedrückt in Dezibel (Verstärkungsfaktor).
    • +
    +
    +
    +
    +
    BalanceWhiteAuto (nur für Farbkameras)
    +
      +
    • Typ: Aufzählung, mögliche Werte: Continuous oder Off
    • +
    • Voreinstellung: Continuous
    • +
    • Beschreibung: Lässt sich für den manuellen Weißabgleich auf Off bzw. für den automatischen Weißabgleich auf Continuous setzen. Dieser Parameter ist nur für Farbkameras verfügbar (Weißabgleich).
    • +
    +
    +
    +
    +
    BalanceRatioSelector (nur für Farbkameras)
    +
      +
    • Typ: Aufzählung, mögliche Werte: Red oder Blue
    • +
    • Voreinstellung: Red
    • +
    • Beschreibung: Auswahl des Verhältnisses welches mit BalanceRatio einstellbar ist. Red bedeutet Verhältnis von Rot zu Grün, und Blue bedeutet Verhältnis von Blau zu Grün. Diese Einstellung ist nur für Farbkameras verfügbar.
    • +
    +
    +
    +
    +
    BalanceRatio (nur für Farbkameras)
    +
      +
    • Typ: Float, Wertebereich: 0.125 – 8
    • +
    • Voreinstellung: 1.2 wenn Red und 2.4 wenn Blue im BalanceRatioSelector eingestellt sind
    • +
    • Beschreibung: Gewichtung vom roten oder blauen zum grünen Farbkanal. Diese Einstellung ist nur für Farbkameras verfügbar (wb_ratio).
    • +
    +
    +
    +
    +
    +

    Kategorie: DigitalIOControl

    +
    +
    LineSelector
    +
      +
    • Typ: Aufzählung, mögliche Werte: Out1, Out2, In1 oder In2
    • +
    • Voreinstellung: Out1
    • +
    • Beschreibung: Wählt den Ein- oder Ausgang, um den aktuellen Zustand abzufragen oder die Betriebsart zu setzen.
    • +
    +
    +
    +
    +
    LineStatus (schreibgeschützt)
    +
      +
    • Typ: Boolean
    • +
    • Beschreibung: Aktueller Zustand des mit LineSelector ausgewählten Ein- oder Ausgangs.
    • +
    +
    +
    +
    +
    LineStatusAll (schreibgeschützt)
    +
      +
    • Typ: Integer
    • +
    • Beschreibung: Aktueller Zustand der Ein- und Ausgänge, welche in den unteren vier Bits angegeben werden.
    • +
    + + +++++++ + + + + + + + + + + + + + + + + +
    Tab. 53 Bedeutung der Bits des LineStatusAll Parameters.
    Bit4321
    GPIOEingang 2Eingang 1Ausgang 2Ausgang 1
    +
    +
    +
    +
    LineSource
    +
      +
    • Typ: Aufzählung, mögliche Werte: ExposureActive, ExposureAlternateActive, Low oder High
    • +
    • Voreinstellung: Low
    • +
    • Beschreibung: Betriebszustand des mit LineSelector gewählten Ausgangs, wie im Abschnitt zum IOControl Modul beschrieben (out1_mode und out2_mode). Siehe auch den Parameter AcquisitionAlternateFilter zum Filtern von Bildern im Betriebszustand ExposureAlternateActive.
    • +
    +
    +
    +
    +
    +

    Kategorie: TransportLayerControl / PtpControl

    +
    +
    PtpEnable
    +
      +
    • Typ: Boolean
    • +
    • Voreinstellung: false
    • +
    • Beschreibung: Schaltet die PTP-Synchronisierung ein und aus.
    • +
    +
    +
    +
    +
    +

    Kategorie: Scan3dControl

    +
    +
    Scan3dDistanceUnit (schreibgeschützt)
    +
      +
    • Typ: Aufzählung, Wert: ist immer Pixel
    • +
    • Beschreibung: Einheit für die Disparitätsmessungen, ist immer Pixel.
    • +
    +
    +
    +
    +
    Scan3dOutputMode (schreibgeschützt)
    +
      +
    • Typ: Aufzählung, Wert: ist immer DisparityC
    • +
    • Beschreibung: Modus für die Tiefenmessungen, ist immer DisparityC.
    • +
    +
    +
    +
    +
    Scan3dFocalLength (schreibgeschützt)
    +
      +
    • Typ: Float
    • +
    • Beschreibung: Brennweite des mit ComponentSelector ausgewählten Bild-Streams in Pixeln. Im Fall der Komponenten Disparity, Confidence und Error hängt der Wert auch von der Auflösung ab, die implizit über DepthQuality eingestellt wurde.
    • +
    +
    +
    +
    +
    Scan3dBaseline (schreibgeschützt)
    +
      +
    • Typ: Float
    • +
    • Beschreibung: Basisabstand der Stereokamera in Metern.
    • +
    +
    +
    +
    +
    Scan3dPrinciplePointU (schreibgeschützt)
    +
      +
    • Typ: Float
    • +
    • Beschreibung: Horizontale Position des Bildhauptpunktes des mit ComponentSelector ausgewählten Bild-Streams. Im Fall der Komponenten Disparity, Confidence und Error hängt der Wert auch von der Auflösung ab, die implizit über DepthQuality eingestellt wurde.
    • +
    +
    +
    +
    +
    Scan3dPrinciplePointV (schreibgeschützt)
    +
      +
    • Typ: Float
    • +
    • Beschreibung: Vertikale Position des Bildhauptpunktes des mit ComponentSelector ausgewählten Bild-Streams. Im Fall der Komponenten Disparity, Confidence und Error hängt der Wert auch von der Auflösung ab, die implizit über DepthQuality eingestellt wurde.
    • +
    +
    +
    +
    +
    Scan3dCoordinateScale (schreibgeschützt)
    +
      +
    • Typ: Float
    • +
    • Beschreibung: Der Skalierungsfaktor, der mit den Disparitätswerten im Disparitätsbild-Stream zu multiplizieren ist, um die tatsächlichen Disparitätswerte zu erhalten. Der Wert beträgt immer 0,0625.
    • +
    +
    +
    +
    +
    Scan3dCoordinateOffset (schreibgeschützt)
    +
      +
    • Typ: Float
    • +
    • Beschreibung: Der Versatz, der zu den Disparitätswerten im Disparitätsbild-Stream addiert werden muss, um die tatsächlichen Disparitätswerte zu erhalten. Für den rc_visard NG beträgt der Wert immer 0 und kann daher ignoriert werden.
    • +
    +
    +
    +
    +
    Scan3dInvalidDataFlag (schreibgeschützt)
    +
      +
    • Typ: Boolean
    • +
    • Beschreibung: Ist immer true, was bedeutet, dass ungültige Daten im Disparitätsbild mit einem spezifischen Wert markiert werden, der durch den Parameter Scan3dInvalidDataValue definiert wird.
    • +
    +
    +
    +
    +
    Scan3dInvalidDataValue (schreibgeschützt)
    +
      +
    • Typ: Float
    • +
    • Beschreibung: Ist der Wert, der für ungültige Disparität steht. Der Wert ist immer 0, was bedeutet, dass Disparitätswerte von 0 immer ungültigen Messungen entsprechen. Um zwischen ungültigen Disparitätsmessungen und Messungen, bei denen die Disparität aufgrund der unendlich weit entfernten Objekte 0 beträgt, unterscheiden zu können, wird der Disparitätswert für den letztgenannten Fall auf 0,0625 gesetzt. Dies entspricht noch immer einer Objektentfernung von mehreren hundert Metern.
    • +
    +
    +
    +
    +
    +

    Kategorie: ChunkDataControl

    +
    +
    ChunkModeActive
    +
      +
    • Typ: Boolean
    • +
    • Voreinstellung: false
    • +
    • Beschreibung: Schaltet Chunk-Daten an, die mit jedem Bild mitgeliefert werden.
    • +
    +
    +
    +
    +
    +
    +

    Besondere Parameter der GenICam-Schnittstelle des rc_visard NG

    +
    +

    Kategorie: DeviceControl

    +
    +
    RcSystemReady (schreibgeschützt)
    +
      +
    • Typ: Boolean
    • +
    • Beschreibung: Gibt an, ob der Bootprozess des Geräts abgeschlossen ist und alle Modules laufen.
    • +
    +
    +
    +
    +
    RcParamLockDisable
    +
      +
    • Typ: Boolean
    • +
    • Voreinstellung: false
    • +
    • Beschreibung: Wenn dieser Wert auf true gesetzt ist, werden die Kamera- und Tiefenbildparameter nicht gesperrt, wenn ein GigE Vision Client mit dem Gerät verbunden wird. Es ist zu beachten, dass – abhängig vom verbundenen GigE Vision Client – Parameteränderungen durch andere Anwendungen (z.B. die Web GUI) möglicherweise nicht durch den GigE Vision Client bemerkt werden, was zu ungewolltem Verhalten führen kann.
    • +
    +
    +
    +
    +
    +

    Kategorie: AcquisitionControl

    +
    +
    AcquisitionAlternateFilter
    +
      +
    • Typ: Aufzählung, mögliche Werte: Off, OnlyHigh oder OnlyLow
    • +
    • Voreinstellung: Off
    • +
    • Beschreibung: Falls dieser Parameter auf OnlyHigh (oder entsprechend OnlyLow) und die LineSource für mindestens einen Ausgang auf ExposureAlternateActive eingestellt wird, dann werden nur die Kamerabilder übertragen, welche aufgenommen wurden, während der konfigurierte Ausgang an war, d.h. ein potentiell angeschlossener Projektor war an (oder bei OnlyLow entsprechend aus). Dieser Parameter ist ein einfaches Mittel um nur Bilder ohne ein projiziertes Muster zu bekommen. Der minimale Zeitunterschied zwischen einem Kamera- und einem Disparitätsbild ist in diesem Fall etwa 40 ms (siehe IOControl).
    • +
    +
    +
    +
    +
    AcquisitionMultiPartMode
    +
      +
    • Typ: Aufzählung, mögliche Werte: SingleComponent oder SynchronizedComponents
    • +
    • Voreinstellung: SingleComponent
    • +
    • Beschreibung: Nur wirksam im MultiPart-Modus. Ist dieser Parameter auf SingleComponent gesetzt, werden die Bilder jeweils sofort als einzelne Komponente pro Frame/Puffer geschickt, sobald sie verfügbar sind. Dies entspricht dem Verhalten von Clients, die MultiPart nicht unterstützen. Ist dieser Parameter auf SynchronizedComponents gesetzt, werden die aktivierten Komponenten auf dem rc_visard NG zeitlich synchronisiert und in einem gemeinsamen Frame/Puffer versendet – allerdings nur, falls alle für diesen Zeitpunkt verfügbar sind.
    • +
    +
    +
    +
    +
    ExposureTimeAutoMax
    +
      +
    • Typ: Float, Wertebereich: 66–18000 µs
    • +
    • Voreinstellung: 18000 µs
    • +
    • Beschreibung: Maximale Belichtungszeit im automatischen Belichtungsmodus (Maximale Belichtungszeit).
    • +
    +
    +
    +
    +
    ExposureRegionOffsetX
    +
    +
    +
    +
    +
    ExposureRegionOffsetY
    +
    +
    +
    +
    +
    ExposureRegionWidth
    +
    +
    +
    +
    +
    ExposureRegionHeight
    +
    +
    +
    +
    +
    RcExposureAutoAverageMax
    +
    +
    +
    +
    +
    RcExposureAutoAverageMin
    +
    +
    +
    +
    +
    +

    Kategorie: Scan3dControl

    +
    +
    FocalLengthFactor (schreibgeschützt)
    +
      +
    • Typ: Float
    • +
    • Beschreibung: Brennweite skaliert auf eine Bildbreite von einem Pixel. Um die Brennweite für ein bestimmtes Bild in Pixeln zu ermitteln, muss dieser Wert mit der Breite des empfangenen Bilds multipliziert werden. Siehe auch den Parameter Scan3dFocalLength.
    • +
    +
    +
    +
    +
    Baseline (schreibgeschützt)
    +
      +
    • Typ: Float
    • +
    • Beschreibung: Dieser Parameter ist überholt. Der Parameter Scan3dBaseline sollte stattdessen benutzt werden.
    • +
    +
    +
    +
    +
    +

    Kategorie: DepthControl

    +
    +
    DepthAcquisitionMode
    +
      +
    • Typ: Aufzählung, mögliche Werte: SingleFrame, SingleFrameOut1 oder Continuous
    • +
    • Voreinstellung: Continuous
    • +
    • Beschreibung: Im Modus SingleFrame wird das Stereo-Matching mit jedem Aufruf von DepthAcquisitionTrigger durchgeführt. Der Modus SingleFrameOut1 kann zum Kontrollieren eines externen Projektors genutzt werden. Dabei wird bei jedem Trigger Out1 auf ExposureAlternateActive und nach dem Empfangen der Stereobilder auf Low gesetzt. Im Modus Continuous wird das Stereo-Matching kontinuierlich durchgeführt.
    • +
    +
    +
    +
    +
    DepthAcquisitionTrigger
    +
      +
    • type: Command
    • +
    • Beschreibung: Dieses Kommando triggert das Stereo-Matching auf den nächsten verfügbaren Stereobildern, falls DepthAcquisitionMode auf SingleFrame oder SingleFrameOut1 eingestellt ist.
    • +
    +
    +
    +
    +
    DepthQuality
    +
      +
    • Typ: Aufzählung, mögliche Werte: Low, Medium, High oder Full (nur mit StereoPlus-Lizenz)
    • +
    • Voreinstellung: High
    • +
    • Beschreibung: Qualität der Disparitätsbilder. Eine geringere DepthQuality führt zu Disparitätsbildern mit einer geringeren Auflösung (Qualität).
    • +
    +
    +
    +
    +
    DepthDoubleShot
    +
      +
    • Typ: Boolean
    • +
    • Voreinstellung: false
    • +
    • Beschreibung: True zum Verbessern des Stereo-Matching-Resultats bei Szenen mit Projektor. Löcher im Tiefenbild werden gefüllt mit Tiefendaten aus dem Stereo Matching des Bildpaars ohne Projektormuster (Double-Shot).
    • +
    +
    +
    +
    +
    DepthStaticScene
    +
      +
    • Typ: Boolean
    • +
    • Voreinstellung: false
    • +
    • Beschreibung: True zum Mitteln über acht aufeinanderfolgende Kamerabilder zur Verbesserung des Stereo-Matching-Resultats (Statisch).
    • +
    +
    +
    +
    +
    DepthSmooth (schreibgeschützt ohne StereoPlus-Lizenz)
    +
      +
    • Typ: Boolean
    • +
    • Voreinstellung: false
    • +
    • Beschreibung: True um Disparitätswerte zu glätten (Glättung).
    • +
    +
    +
    +
    +
    DepthFill
    +
      +
    • Typ: Integer, Wertebereich: 0–4 Pixel
    • +
    • Voreinstellung: 3 Pixel
    • +
    • Beschreibung: Wert in Pixeln für Füllen.
    • +
    +
    +
    +
    +
    DepthSeg
    +
      +
    • Typ: Integer, Wertebereich: 0–4000 Pixel
    • +
    • Voreinstellung: 200 Pixel
    • +
    • Beschreibung: Wert in Pixeln für Segmentierung.
    • +
    +
    +
    +
    +
    DepthMinConf
    +
      +
    • Typ: Float, Wertebereich: 0.0–1.0
    • +
    • Voreinstellung: 0.0
    • +
    • Beschreibung: Wert für die Minimale Konfidenz-Filterung.
    • +
    +
    +
    +
    +
    DepthMinDepth
    +
      +
    • Typ: Float, Wertebereich: 0.1–100.0 m
    • +
    • Voreinstellung: 0.1 m
    • +
    • Beschreibung: Wert in Metern für die Minimale Abstands-Filterung.
    • +
    +
    +
    +
    +
    DepthMaxDepth
    +
      +
    • Typ: Float, Wertebereich: 0.1–100.0 m
    • +
    • Voreinstellung: 100.0 m
    • +
    • Beschreibung: Wert in Metern für die Maximale Abstands-Filterung.
    • +
    +
    +
    +
    +
    DepthMaxDepthErr
    +
      +
    • Typ: Float, Wertebereich: 0.01–100.0 m
    • +
    • Voreinstellung: 100.0 m
    • +
    • Beschreibung: Wert in Metern für die Maximale Fehler-Filterung.
    • +
    +
    +
    +
    +
    +
    +

    Chunk-Daten

    +

    Der rc_visard NG unterstützt Chunk-Parameter, die mit jedem Bild mitgeschickt werden. Chunk-Parameter haben alle den Präfix Chunk. Ihre Bedeutung entspricht den gleichlautenden Nicht-Chunk-Parametern. Sie passen jedoch immer zu dem zugehörigen Bild. Zum Beispiel hängt Scan3dFocalLength von ComponentSelector und DepthQuality ab, da die Bildauflösung von beiden Parametern abhängt. Der Parameter ChunkScan3dFocalLength, welcher zu einem Bild geliefert wird, passt hingegen zu der Auflösung dieses Bildes.

    +

    Nützliche Chunk-Parameter:

    +
      +
    • ChunkComponentSelector selektiert, für welche Komponente Chunk-Daten aus dem MultiPart-Puffer gelesen werden.
    • +
    • ChunkComponentID und ChunkComponentIDValue dienen der eindeutigen Zuordnung des Bildes zu seiner Komponente (z.B. Kamerabild oder Disparitätsbild), ohne dies vom Bildformat oder der Bildgröße ableiten zu müssen.
    • +
    • ChunkLineStatusAll bietet den Status der Ein- und Ausgänge zum Zeitpunkt der Bildaufnahme. Siehe LineStatusAll für eine Beschreibung der Bits.
    • +
    • ChunkScan3d... sind nützlich zur 3D-Rekonstruktion wie im Abschnitt Umwandlung von Bild-Streams beschrieben.
    • +
    • ChunkPartIndex gibt den Index des Bild-Parts im MultiPart-Block für die ausgewählte Komponente (ChunkComponentSelector) zurück.
    • +
    • ChunkRcOut1Reduction gibt den Anteil der Bildhelligkeit an, um den Bilder mit GPIO Ausgang 1 (Out1) LOW dunkler sind als Bilder mit Out1 HIGH. Ein Wert von beispielsweise 0.2 bedeutet, dass die Bilder mit GPIO Out1 LOW 20% weniger Helligkeit haben als Bilder mit GPIO Out1 HIGH. Dieser Wert ist nur verfügbar, wenn exp_auto_mode der Stereokamera auf AdaptiveOut1 oder Out1High gesetzt ist (auto exposure mode).
    • +
    +

    Chunk-Daten werden durch das Setzen des GenICam-Parameters ChunkModeActive auf True eingeschaltet.

    +
    +
    +

    Verfügbare Bild-Streams

    +

    Der rc_visard NG stellt über die GenICam-Schnittstelle die folgenden fünf Bild-Streams zur Verfügung:

    + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Name der KomponentePixelFormatBeschreibung
    Intensity
    +
    Mono8 (monochrome Kameras)
    +
    YCbCr411_8 (Farbkameras)
    +
    +
    Rektifiziertes Bild der linken Kamera
    IntensityCombined
    +
    Mono8 (monochrome Kameras)
    +
    YCbCr411_8 (Farbkameras)
    +
    +
    Rektifiziertes Bild der linken Kamera, gestapelt auf das rektifizierte Bild der rechten Kamera
    DisparityCoord3D_C16Disparitätsbild in gewünschter Auflösung, d.h. DepthQuality in Full, High, Medium oder Low
    ConfidenceConfidence8Konfidenzbild
    ErrorError8 (Sonderformat: 0x81080001)Fehlerbild
    +

    Jedes Bild wird mit einem Zeitstempel und dem in der Tabelle angegebenen PixelFormat ausgegeben. Dieses PixelFormat sollte verwendet werden, um zwischen den verschiedenen Bildtypen zu unterscheiden. Bilder, die den gleichen Aufnahmezeitpunkt haben, können durch Vergleich der GenICam-Zeitstempel einander zugeordnet werden.

    +
    +
    +

    Umwandlung von Bild-Streams

    +

    Das Disparitätsbild enthält vorzeichenlose 16-Bit-Ganzzahlwerte. Diese Werte müssen mit dem im GenICam-Parameter Scan3dCoordinateScale angegebenen Skalierungsfaktor multipliziert werden, um die Disparitätswerte \(d\) in Pixeln zu ermitteln. Um die 3D-Objektkoordinaten aus den Disparitätswerten berechnen zu können, werden die Brennweite, der Basisabstand und der Bildhauptpunkt benötigt. Diese Parameter werden als GenICam-Parameter Scan3dFocalLength, Scan3dBaseline, Scan3dPrincipalPointU und Scan3dPrincipalPointV zur Verfügung gestellt. Die Brennweite und der Bildhauptpunkt hängen von der Bildauflösung der mit dem ComponentSelector selektierten Komponente ab. Sind diese Werte bekannt, können die Pixel-Koordinaten und die Disparitätswerte mithilfe der im Abschnitt Berechnung von Tiefenbildern und Punktwolken angegebenen Gleichungen in 3D-Objektkoordination im Kamera-Koordinatensystem umgerechnet werden.

    +
    +

    Bemerkung

    +

    Das Kamera-Koordinatensystem des rc_visard NG ist in Sensor-Koordinatensystem definiert.

    +
    +

    Unter der Annahme, dass es sich bei \(d_{ik}\) um den 16-Bit-Disparitätswert in der Spalte \(i\) und Zeile \(k\) eines Disparitätsbildes handelt, ist der Fließkomma-Disparitätswert in Pixeln \(d_{ik}\) gegeben durch

    +
    +\[d_{ik}=d16_{ik} \cdot \mathrm{Scan3dCoordinateScale}\]
    +

    Die 3D-Rekonstruktion (in Metern) kann wie folgt mit den GenICam-Parametern durchgeführt werden:

    +
    +\[\begin{split}P_x&=\left(i+0.5-\mathrm{Scan3dPrincipalPointU}\right) \frac{\mathrm{Scan3dBaseline}}{d_{ik}},\\ +P_y&=\left(k+0.5-\mathrm{Scan3dPrincipalPointV}\right) \frac{\mathrm{Scan3dBaseline}}{d_{ik}},\\ +P_z&=\mathrm{Scan3dFocalLength} \frac{\mathrm{Scan3dBaseline}}{d_{ik}}.\end{split}\]
    +

    Das Konfidenzbild umfasst vorzeichenlose 8-Bit-Ganzzahlwerte. Diese Werte müssen durch 255 geteilt werden, um die zwischen 0 und 1 liegenden Konfidenzwerte zu berechnen.

    +

    Das Fehlerbild umfasst vorzeichenlose 8-Bit-Ganzzahlwerte. Der Fehler \(e_{ik}\) muss mit dem im GenICam-Parameter Scan3dCoordinateScale angegebenen Skalierungsfaktor multipliziert werden, um die Disparitätsfehlerwerte \(d_{eps}\) in Pixeln zu ermitteln. Der Beschreibung in Konfidenz- und Fehlerbilder zufolge lässt sich der Tiefenfehler \(z_{eps}\) (in Metern) mit den GenICam-Parametern wie folgt berechnen:

    +
    +\[\begin{split}d_{ik}&=d16_{ik} \cdot \mathrm{Scan3dCoordinateScale},\\ +z_{eps}&=\frac{e_{ik} \cdot \mathrm{Scan3dCoordinateScale} \cdot \mathrm{Scan3dFocalLength} + \cdot \mathrm{Scan3dBaseline}} + {(d_{ik})^2}.\end{split}\]
    +
    +

    Bemerkung

    +

    Chunk-Daten sollten nach Möglichkeit mit dem Parameter ChunkModeActive angeschaltet und die zum Bild zugehörigen Parameter ChunkScan3dCoordinateScale, ChunkScan3dFocalLength, ChunkScan3dBaseline, ChunkScan3dPrincipalPointU und ChunkScan3dPrincipalPointV genutzt werden, denn deren Werte passen zu der Auflösung des zugehörigen Bildes.

    +
    +

    Für nähere Informationen zu Disparitäts-, Fehler- und Konfidenzbildern siehe Stereo-Matching.

    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/glossary.html b/v24.04/de/glossary.html new file mode 100644 index 0000000..9e5ee9f --- /dev/null +++ b/v24.04/de/glossary.html @@ -0,0 +1,695 @@ + + + + + + + + + + + Glossar — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Glossar

    +
    +
    DHCP
    +
    Das Dynamic Host Configuration Protocol (DHCP) wird verwendet, um einem Netzwerkgerät automatisch eine IP-Adresse zuzuweisen. Einige DHCP-Server akzeptieren lediglich bekannte Geräte. In diesem Fall muss der Administrator die feste MAC-Adresse eines Gerätes im DHCP-Server erfassen.
    +
    DNS
    mDNS
    +
    Das Domain Name System (DNS) verwaltet die Host-Namen und IP-Adressen aller Netzwerkgeräte. Es dient dazu, den Host-Namen zur Kommunikation mit einem Gerät in die IP-Adresse zu übersetzen. Das DNS kann so konfiguriert werden, dass diese Informationen entweder automatisch abgerufen werden, wenn ein Gerät in einem Netzwerk erscheint, oder manuell von einem Administrator zu erfassen sind. Im Gegensatz hierzu arbeitet multicast DNS (mDNS) ohne einen zentralen Server, wobei jedes Mal, wenn ein Host-Name aufgelöst werden muss, alle Geräte in einem Netzwerk abgefragt werden. mDNS ist standardmäßig für die Betriebssysteme Linux und macOS verfügbar und wird verwendet, wenn ‚.local‘ an einen Host-Namen angehängt wird.
    +
    DOF
    +
    Als Freiheitsgrade (Degrees of Freedom, DOF) wird die Anzahl unabhängiger Translations- und Rotationsparameter bezeichnet. Im 3D-Raum genügen 6 Freiheitsgrade (drei für Translation und drei für Rotation), um eine beliebige Position und Orientierung zu definieren.
    +
    GenICam
    +
    GenICam ist eine generische Standard-Schnittstelle für Kameras. Sie fungiert als einheitliche Schnittstelle für andere Standards, wie GigE Vision, Camera Link, USB, usw. Für nähere Informationen siehe http://genicam.org.
    +
    GigE
    +
    Gigabit Ethernet (GigE) ist eine Netzwerktechnologie, die mit einer Übertragungsrate von einem Gigabit pro Sekunde arbeitet.
    +
    GigE Vision
    +
    GigE Vision® ist ein Standard für die Konfiguration von Kameras und Übertragung der Bilder über eine GigE Netzwerkverbindung. Für nähere Informationen siehe http://gigevision.com.
    +
    IP
    IP-Adresse
    +
    Das Internet Protocol (IP) ist ein Standard für die Übertragung von Daten zwischen verschiedenen Geräten in einem Computernetzwerk. Jedes Gerät benötigt eine IP-Adresse, die innerhalb des Netzwerks nur einmal vergeben werden darf. Die IP-Adresse lässt sich über DHCP, über Link-Local oder manuell konfigurieren.
    + +
    Link-Local ist eine Technologie, mit der sich ein Netzwerkgerät selbst eine IP-Adresse aus dem Adressbereich 169.254.0.0/16 zuweist und überprüft, ob diese im lokalen Netzwerk eindeutig ist. Link-Local kann verwendet werden, wenn DHCP nicht verfügbar ist oder die manuelle IP-Konfiguration nicht vorgenommen wurde bzw. werden kann. Link-Local ist besonders nützlich, wenn ein Netzwerkgerät direkt an einen Host-Computer angeschlossen werden soll. Windows 10 greift automatisch auf Link-Local zurück, wenn DHCP nicht verfügbar ist (Fallback-Option). Unter Linux muss Link-Local manuell im Netzwerkmanager aktiviert werden.
    +
    MAC-Adresse
    +
    Bei der MAC-Adresse (Media Access Control Address) handelt es sich um die eindeutige und feste Adresse eines Netzwerkgerätes. Sie wird auch als Hardware-Adresse bezeichnet. Im Gegensatz zur IP-Adresse wird die MAC-Adresse einem Gerät (normalerweise) fest zugewiesen; sie ändert sich nicht.
    +
    NTP
    +
    Das Network Time Protocol (NTP) ist ein TCP/IP Protokoll, um Zeit über ein Netzwerk zu synchronisieren. Im Wesentlichen fordert ein Client die aktuelle Zeit von einem Server an und nutzt diese, um seine eigene Uhr zu stellen.
    +
    SDK
    +
    Ein Software Development Kit (SDK) ist eine Sammlung von Softwareentwicklungswerkzeugen bzw. von Softwaremodulen.
    +
    SGM
    +
    SGM steht für Semi-Global Matching, einen hochmodernen Stereo-Matching-Algorithmus, der sich durch kurze Laufzeiten und eine hohe Genauigkeit – insbesondere an Objekträndern, bei feinen Strukturen und in schwach texturierten Bildbereichen – auszeichnet.
    +
    TCP
    +
    Der Tool Center Point (TCP) ist die Position des Werkzeugs am Endeffektor eines Roboters. Die Position und Orientierung des TCP definiert die Position und Orientierung des Werkzeugs im 3D-Raum.
    +
    URI
    URL
    +

    Ein Uniform Resource Identifier (URI) ist eine Zeichenfolge, mit der sich Ressourcen in der REST-API des rc_visard NG identifizieren lassen. Ein Beispiel für eine solche URI ist die Zeichenkette /nodes/rc_camera/parameters/fps, die auf die fps-Laufzeitparameter des Stereokamera-Moduls verweist.

    +

    Ein Uniform Resource Locator (URL) gibt zudem die vollständige Netzwerkadresse und das Netzwerkprotokoll an. Die oben angeführte Ressource könnte beispielsweise über https://<ip>/api/v1/nodes/rc_camera/parameters/fps lokalisiert werden, wobei sich <ip> auf die IP-Adresse des rc_visard NG bezieht.

    +
    +
    XYZ+Quaternion
    +
    Format zur Darstellung von Posen (Positionen und Orientierungen). Für eine Definition siehe Rotationsmatrix und Translationsvektor.
    +
    XYZABC
    +
    Format zur Darstellung von Posen (Positionen und Orientierungen). Für eine Definition siehe KUKA XYZ-ABC Format.
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/gripper_db.html b/v24.04/de/gripper_db.html new file mode 100644 index 0000000..d893900 --- /dev/null +++ b/v24.04/de/gripper_db.html @@ -0,0 +1,1322 @@ + + + + + + + + + + + GripperDB — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    GripperDB

    +
    +

    Einleitung

    +

    Das GripperDB Modul ist ein optionales Modul, welches intern auf dem rc_visard NG läuft, und ist freigeschaltet, sobald eine gültige Lizenz für eines der Module ItemPick und BoxPick oder SilhouetteMatch vorhanden ist. Andernfalls benötigt dieses Modul eine separate Lizenz.

    +

    Das Modul bietet Services zum Anlegen, Abfragen und Löschen von Greifern, die dann für die Kollisionsprüfung mit einem Load Carrier oder anderen erkannten Objekten (nur in Kombination mit SilhouetteMatch) genutzt werden können. Die angelegten Greifer sind in allen Modulen auf dem rc_visard NG verfügbar, die eine Kollisionsprüfung anbieten.

    + + ++++ + + + + + + + + + + + + + + +
    Tab. 51 Spezifikationen des GripperDB Moduls
    Max. Anzahl Greifer50
    Mögliche Greiferelement-GeometrienBox, Zylinder, CAD-Element
    Max. Anzahl Elemente pro Greifer15
    Kollisionsprüfung verfügbar inItemPick und BoxPick, SilhouetteMatch
    +
    +
    +

    Erstellen eines Greifers

    +

    Der Greifer ist eine Kollisionsgeometrie, die zur Prüfung auf Kollisionen zwischen dem geplanten Griff und dem Load Carrier verwendet wird. Der Greifer kann aus bis zu 15 miteinander verbundenen Elementen bestehen.

    +

    Es sind folgende Arten von Elementen möglich:

    +
    +
      +
    • Quader (BOX), mit den Abmessungen box.x, box.y, box.z.
    • +
    • Zylinder (CYLINDER), mit dem Radius cylinder.radius und der Höhe cylinder.height.
    • +
    • CAD-Element (CAD), mit der ID cad.id des gewählten CAD-Elements.
    • +
    +
    +

    Weiterhin müssen für jeden Greifer der Flanschradius und der Tool Center Point (TCP) definiert werden.

    +

    Die Konfiguration des Greifers wird in der Regel während des Setups der Zielanwendung durchgeführt. Das kann über die REST-API-Schnittstelle oder die rc_visard NG Web GUI geschehen.

    +
    +

    Flanschradius

    +

    Es werden standardmäßig nur Kollisionen mit dem Greifer, nicht aber mit der Robotergeometrie geprüft. Um Kollisionen zwischen dem Load Carrier und dem Roboter zu vermeiden, kann über den Laufzeitparameter check_flange im CollisionCheck Modul (siehe Übersicht der Parameter) ein zusätzlicher optionaler Test aktiviert werden. Dieser Test erkennt alle Griffe als Kollisionen, bei denen sich ein Teil des Roboterflanschs innerhalb des Load Carriers befinden würde (siehe Abb. 55). Der Test basiert auf der Greifergeometrie und dem Flanschradius.

    +
    +_images/check_flange.svg +

    Abb. 55 Fall A: Der Griff wird nur als Kollision erkannt, wenn check_flange auf true gesetzt ist, denn der Flansch (rot) befindet sich im Load Carrier. Fall B: Der Griff ist in jedem Fall kollisionsfrei.

    +
    +
    +
    +

    Hochladen von CAD-Greiferelementen

    +

    Ein Greifer kann aus Boxen, Zylindern und CAD-Elementen bestehen. Während Boxen und Zylinder während der Erstellung eines Greifers parametrisiert werden können, müssen CAD-Elemente im Vorfeld hochgeladen werden, um für die Greifererstellung verfügbar zu sein. Ein CAD-Element kann über die REST-API-Schnittstelle wie in Abschnitt CAD-Greiferelement API beschrieben, oder über the rc_visard NG Web GUI hochgeladen werden. Unterstützte Dateiformate sind STEP (*.stp, *.step), STL (*.stl), OBJ (*.obj) und PLY (*.ply). Die maximal hochzuladende Dateigröße ist auf 30 MB begrenzt. Die Dateien werden intern in PLY konvertiert und, falls nötig, vereinfacht. Die CAD-Elemente können dann während der Greifererstellung über ihre ID referenziert werden.

    +
    +
    +

    Erstellen eines Greifers über die REST-API oder die Web GUI

    +

    Bei der Greifererstellung über die REST-API-Schnittstelle oder die Web GUI hat jedes Greifer-Element ein Parent-Element, das die Verbindung zwischen den Elementen definiert. Der Greifer wird immer vom Roboterflansch ausgehend in Richtung TCP aufgebaut, und mindestens ein Element muss den Parent ‚flange‘ (Flansch) haben. Die IDs der Elemente müssen eindeutig sein und dürfen nicht ‚tcp‘ oder ‚flange‘ sein. Die Pose des Elements muss im Koordinatensystem des Parent-Elements angegeben werden. Das Koordinatensystem jedes Elements befindet sich genau in seinem geometrischen Mittelpunkt. Damit ein Element also genau unterhalb seines Parent-Elements platziert wird, muss seine Position aus der Höhe des Parent-Elements und seiner eigenen Höhe berechnet werden (siehe Abb. 56).

    +
    +_images/gripper_frames_restapi.svg +

    Abb. 56 Bezugskoordinatensysteme für das Erstellen von Greifern über die REST-API und die Web GUI

    +
    +

    Im Falle eines CAD-Greiferelements wird der Ursprung durch die CAD-Daten bestimmt und befindet sich nicht notwendigerweise im Mittelpunkt der Bounding Box des Elements.

    +

    Es wird empfohlen Greifer über die Web GUI zu erstellen, da diese eine 3D Visualisierung der Greifergeometrie bietet und das automatische Anheften von Kind-Element an ihre Parent-Elemente ermöglicht, indem die entsprechende Option für dieses Element aktiviert wird. In diesem Fall bleiben Elemente an ihren Parent angeheftet, auch wenn sich ihre Größen ändern. Bei CAD-Greiferelementen wird die Bounding Box des Elements als Referenz verwendet. Das automatische Anheften ist nur möglich, wenn das Kind-Element in Bezug auf seinen Parent nicht um die x- oder y-Achse rotiert ist.

    +

    Das Bezugskoordinatensystem für das erste Element liegt immer im Mittelpunkt des Roboterflanschs, wobei die z-Achse nach unten gerichtet ist. Es können Greifer mit einer Baumstruktur erstellt werden, bei denen mehrere Elemente dasselbe Parent-Element haben, solange alle Elemente miteinander verbunden sind.

    +
    +
    +

    Berechnete TCP-Position

    +

    Nach dem Erstellen des Greifers mit dem Service set_gripper wird die TCP-Position im Flanschkoordinatensystem berechnet und als tcp_pose_flange zurückgegeben. Dieser Wert muss mit den tatsächlichen TCP-Koordinaten des Roboters übereinstimmen. Wenn ein Greifer über die Web GUI erstellt wird, wird die aktuelle TCP-Position zu jeder Zeit in der 3D-Visualisierung angezeigt.

    +
    +
    +

    Nicht-rotationssymmetrische Greifer erstellen

    +

    Bei Greifern, die nicht rotationssymmetrisch um die z-Achse sind, muss sichergestellt werden, dass der Greifer so montiert wird, dass seine Ausrichtung mit der im GripperDB-Modul gespeicherten Darstellung übereinstimmt.

    +
    +
    +
    +

    Services

    +

    Das GripperDB Modul wird in der REST-API als rc_gripper_db bezeichnet und in der Web GUI unter Datenbank ‣ Greifer dargestellt. Die angebotenen Services des GripperDB Moduls können mithilfe der REST-API-Schnittstelle oder der Web GUI ausprobiert und getestet werden.

    +

    Das GripperDB Modul stellt folgende Services zur Verfügung.

    +
    +

    set_gripper

    +
    +

    konfiguriert und speichert einen Greifer auf dem rc_visard NG. Alle Greifer sind dauerhaft gespeichert, auch über Firmware-Updates und -Wiederherstellungen hinweg.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    PUT http://<host>/api/v2/nodes/rc_gripper_db/services/set_gripper
    +
    +
    +
    + +
    +

    Obligatorische Serviceargumente:

    +
    +

    elements: Liste von geometrischen Elementen, aus denen der Greifer besteht. Jedes Element muss den type ‚CYLINDER‘ oder ‚BOX‘ mit den zugehörigen Dimensionen im Feld cylinder bzw. box, oder den Typ ‚CAD‘ haben, wobei die entsprechende ID unter id im Feld cad angegeben werden muss. Die Pose jedes Elements muss im Parent-Koordinatensystem angegeben werden (siehe Erstellen eines Greifers). Die id des Elements muss eindeutig sein und darf nicht ‚tcp‘ oder ‚flange‘ sein. Die parent_id ist die ID des Parent-Elements, welche entweder ‚flange‘ ist oder der ID eines anderen Elements entsprechen muss.

    +

    flange_radius: Flanschradius der benutzt wird, falls der Parameter check_flange aktiviert ist.

    +

    id: Eindeutiger Name des Greifers.

    +

    tcp_parent_id: ID des Elements, auf dem der TCP definiert ist.

    +

    tcp_pose_parent: Die Pose des TCP im Koordinatensystem des Elements, das in tcp_parent_id angegeben ist.

    +
    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "elements": [
    +      {
    +        "box": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "cad": {
    +          "id": "string"
    +        },
    +        "cylinder": {
    +          "height": "float64",
    +          "radius": "float64"
    +        },
    +        "id": "string",
    +        "parent_id": "string",
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "type": "string"
    +      }
    +    ],
    +    "flange_radius": "float64",
    +    "id": "string",
    +    "tcp_parent_id": "string",
    +    "tcp_pose_parent": {
    +      "orientation": {
    +        "w": "float64",
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "position": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      }
    +    }
    +  }
    +}
    +
    +
    +
    +
    +

    gripper: Gibt den Greifer mit dem zusätzlichen Feld tcp_pose_flange zurück. Dieses Feld gibt die TCP-Koordinaten im Flanschkoordinatensystem an, um diese mit den Roboter-TCP-Koordinaten vergleichen zu können.

    +

    return_code: enthält mögliche Warnungen oder Fehlercodes und Nachrichten.

    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "set_gripper",
    +  "response": {
    +    "gripper": {
    +      "elements": [
    +        {
    +          "box": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "cad": {
    +            "id": "string"
    +          },
    +          "cylinder": {
    +            "height": "float64",
    +            "radius": "float64"
    +          },
    +          "id": "string",
    +          "parent_id": "string",
    +          "pose": {
    +            "orientation": {
    +              "w": "float64",
    +              "x": "float64",
    +              "y": "float64",
    +              "z": "float64"
    +            },
    +            "position": {
    +              "x": "float64",
    +              "y": "float64",
    +              "z": "float64"
    +            }
    +          },
    +          "type": "string"
    +        }
    +      ],
    +      "flange_radius": "float64",
    +      "id": "string",
    +      "tcp_parent_id": "string",
    +      "tcp_pose_flange": {
    +        "orientation": {
    +          "w": "float64",
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "position": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        }
    +      },
    +      "tcp_pose_parent": {
    +        "orientation": {
    +          "w": "float64",
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "position": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        }
    +      },
    +      "type": "string"
    +    },
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    get_grippers

    +
    +

    gibt die mit gripper_ids spezifizierten und gespeicherten Greifer zurück.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    PUT http://<host>/api/v2/nodes/rc_gripper_db/services/get_grippers
    +
    +
    +
    + +
    +

    Wenn keine gripper_ids angegeben werden, enthält die Serviceantwort alle gespeicherten Greifer.

    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "gripper_ids": [
    +      "string"
    +    ]
    +  }
    +}
    +
    +
    +
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "get_grippers",
    +  "response": {
    +    "grippers": [
    +      {
    +        "elements": [
    +          {
    +            "box": {
    +              "x": "float64",
    +              "y": "float64",
    +              "z": "float64"
    +            },
    +            "cad": {
    +              "id": "string"
    +            },
    +            "cylinder": {
    +              "height": "float64",
    +              "radius": "float64"
    +            },
    +            "id": "string",
    +            "parent_id": "string",
    +            "pose": {
    +              "orientation": {
    +                "w": "float64",
    +                "x": "float64",
    +                "y": "float64",
    +                "z": "float64"
    +              },
    +              "position": {
    +                "x": "float64",
    +                "y": "float64",
    +                "z": "float64"
    +              }
    +            },
    +            "type": "string"
    +          }
    +        ],
    +        "flange_radius": "float64",
    +        "id": "string",
    +        "tcp_parent_id": "string",
    +        "tcp_pose_flange": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "tcp_pose_parent": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "type": "string"
    +      }
    +    ],
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    delete_grippers

    +
    +

    löscht die mit gripper_ids spezifizierten, gespeicherten Greifer.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    PUT http://<host>/api/v2/nodes/rc_gripper_db/services/delete_grippers
    +
    +
    +
    + +
    +

    Alle zu löschenden Greifer müssen explizit angegeben werden.

    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "gripper_ids": [
    +      "string"
    +    ]
    +  }
    +}
    +
    +
    +
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "delete_grippers",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    Rückgabecodes

    +

    Zusätzlich zur eigentlichen Serviceantwort gibt jeder Service einen sogenannten return_code bestehend aus einem Integer-Wert und einer optionalen Textnachricht zurück. Erfolgreiche Service-Anfragen werden mit einem Wert von 0 quittiert. Positive Werte bedeuten, dass die Service-Anfrage zwar erfolgreich bearbeitet wurde, aber zusätzliche Informationen zur Verfügung stehen. Negative Werte bedeuten, dass Fehler aufgetreten sind. Für den Fall, dass mehrere Rückgabewerte zutreffend wären, wird der kleinste zurückgegeben, und die entsprechenden Textnachrichten werden in return_code.message akkumuliert.

    +

    Die folgende Tabelle listet die möglichen Rückgabecodes auf:

    + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Tab. 52 Rückgabecodes der GripperDB Services
    CodeBeschreibung
    0Erfolgreich
    -1Ein ungültiges Argument wurde übergeben.
    -7Daten konnten nicht in den persistenten Speicher geschrieben oder vom persistenten Speicher gelesen werden.
    -9Lizenz für CollisionCheck ist nicht verfügbar.
    -10Das neue Element konnte nicht hinzugefügt werden, da die maximal speicherbare Anzahl an Greifern überschritten wurde.
    10Die maximal speicherbare Anzahl an Greifern wurde erreicht.
    11Bestehender Greifer wurde überschrieben.
    +
    +
    +

    CAD-Greiferelement API

    +

    Für den Upload, Download, das Auflisten und Löschen von CAD-Greiferelementen werden spezielle REST-API-Endpunkte zur Verfügung gestellt. CAD-Greiferelemente können auch über die Web GUI hoch- und runtergeladen werden. Bis zu 50 CAD-Greiferelemente können gleichzeitig auf dem rc_visard NG gespeichert werden.

    +

    Die maximal hochzuladende Dateigröße ist auf MB begrenzt.

    +
    +
    +GET /cad/gripper_elements
    +

    listet alle CAD-Greiferelemente auf.

    +

    Musteranfrage

    +
    GET /api/v2/cad/gripper_elements HTTP/1.1
    +
    +
    +

    Musterantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +[
    +  {
    +    "id": "string"
    +  }
    +]
    +
    +
    + +++ + + + + + + + + +
    Antwort-Header: +
    Statuswerte:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabewert: Array von GripperElement)
    • +
    • 404 Not Found – Element nicht gefunden
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +GET /cad/gripper_elements/{id}
    +

    ruft ein CAD-Greiferelement ab. Falls der angefragte Content-Typ application/octet-stream ist, wird das Element als Datei zurückgegeben.

    +

    Musteranfrage

    +
    GET /api/v2/cad/gripper_elements/<id> HTTP/1.1
    +
    +
    +

    Musterantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "id": "string"
    +}
    +
    +
    + +++ + + + + + + + + + + +
    Parameter:
      +
    • id (string) – ID des Elements (obligatorisch)
    • +
    +
    Antwort-Header:
      +
    • Content-Type – application/json application/ubjson application/octet-stream
    • +
    +
    Statuswerte:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabewert: GripperElement)
    • +
    • 404 Not Found – Element nicht gefunden
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +PUT /cad/gripper_elements/{id}
    +

    erstellt oder aktualisiert ein CAD-Greiferelement.

    +

    Musteranfrage

    +
    PUT /api/v2/cad/gripper_elements/<id> HTTP/1.1
    +Accept: multipart/form-data application/json
    +
    +
    +

    Musterantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "id": "string"
    +}
    +
    +
    + +++ + + + + + + + + + + + + + + + +
    Parameter:
      +
    • id (string) – ID des Elements (obligatorisch)
    • +
    +
    Formularparameter:
     
      +
    • file – CAD-Datei (obligatorisch)
    • +
    +
    Anfrage-Header:
      +
    • Accept – multipart/form-data application/json
    • +
    +
    Antwort-Header: +
    Statuswerte: +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +DELETE /cad/gripper_elements/{id}
    +

    entfernt ein CAD-Greiferelement.

    +

    Musteranfrage

    +
    DELETE /api/v2/cad/gripper_elements/<id> HTTP/1.1
    +Accept: application/json application/ubjson
    +
    +
    + +++ + + + + + + + + + +
    Parameter:
      +
    • id (string) – ID des Elements (obligatorisch)
    • +
    +
    Anfrage-Header:
      +
    • Accept – application/json application/ubjson
    • +
    +
    Antwort-Header: +
    Statuswerte: +
    +
    + +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/grpc.html b/v24.04/de/grpc.html new file mode 100644 index 0000000..356c00c --- /dev/null +++ b/v24.04/de/grpc.html @@ -0,0 +1,785 @@ + + + + + + + + + + + gRPC Bilddatenschnittstelle — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    gRPC Bilddatenschnittstelle

    +

    Die gRPC Bilddatenschnittstelle ist eine Alternative zur GigE Vision / GenICam Schnittstelle zum Streamen von Kamerabildern und synchronisierten Bilddaten (z.B. linkes Kamerabild und das dazugehörige Disparitätsbild). gRPC ist ein System zur Interprozesskommunikation über Rechnergrenzen hinweg, welches auch das Streamen von Daten unterstützt. Es benutzt Protocol Buffers (siehe https://developers.google.com/protocol-buffers/) als Beschreibungssprache und zur Datenserialisierung. Eine Einführung und mehr Details zu gRPC sind auf der offiziellen Webseite verfügbar (https://grpc.io/).

    +

    Die Vorteile der gRPC Schnittstelle gegenüber GigE Vision sind:

    +
    +
      +
    • Es ist in eigenen Programmen einfacher zu benutzen als GigE Vision.
    • +
    • Es gibt gRPC Unterstützung für sehr viele Programmiersprachen (siehe https://grpc.io/).
    • +
    • Die Kommunikation basiert auf TCP statt auf UDP und funktioniert deshalb besser über weniger stabile Netzwerke wie z.B. WLAN.
    • +
    +
    +

    Die Nachteile der gRPC Schnittstelle im Vergleich zu GigE Vision sind:

    +
    +
      +
    • Es unterstützt nicht das Ändern von Parametern. Allerdings können alle Parameter über die REST-API-Schnittstelle geändert werden.
    • +
    • Es ist keine Standard-Bildverarbeitungsschnittstelle wie z.B. GigE Vision.
    • +
    +
    +

    Der rc_visard NG bietet synchronisierte Bilddaten über gRPC Serverstreams auf Port 50051 an.

    +

    Die Kommunikation wird gestartet indem eine ImageSetRequest Nachricht an den Server geschickt wird. Die Nachricht enthält die Information über angeforderte Bilder, d.h. linkes, rechtes, Disparitäts-, Konfidenz- oder Fehlerbild, die separat an- und abgeschaltet werden können.

    +

    Nach dem Empfangen der Anfrage sendet der Server kontinuierlich ImageSet Nachrichten, welche alle angeforderten Bilder mit allen Parametern enthalten, die notwendig sind, um die Bilder zu interpretieren. Die Bilder in einer ImageSet Nachricht sind synchronisiert, d.h. sie sind alle zum selben Zeitpunkt aufgenommen. Die einzige Ausnahme von dieser Regel besteht, wenn der out1_mode auf AlternateExposureActive gesetzt ist. In diesem Fall werden die Kamera- und Disparitätsbilder um 40 ms versetzt aufgenommen, sodass GPIO Out1 auf aus (LOW) steht, wenn das linke und rechte Bild aufgenommen werden, und auf an (HIGH) für das Disparitäts-, Konfidenz- und Fehlerbild. Dies ist sinnvoll, wenn ein Musterprojektor genutzt wird, da der Projektor dann bei der Aufnahme des linken und rechten Bildes aus ist und für das Disparitätsbild an, wodurch die Kamerabilder ungestört sind, aber das Disparitätsbild deutlich dichter und genauer wird.

    +

    Das Streamen von Bildern wird beendet, sobald der Client die Verbindung schließt.

    +
    +

    gRPC Servicedefinition

    +
    syntax = "proto3";
    +
    +message Time
    +{
    +  int32 sec = 1; ///< Seconds
    +  int32 nsec = 2; ///< Nanoseconds
    +}
    +
    +message Gpios
    +{
    +  uint32 inputs  = 1; ///< bitmask of available inputs
    +  uint32 outputs = 2; ///< bitmask of available outputs
    +  uint32 values  = 3; ///< bitmask of GPIO values
    +}
    +
    +message Image
    +{
    +  Time timestamp           = 1; ///< Acquisition timestamp of the image
    +  uint32 height            = 2; ///< image height (number of rows)
    +  uint32 width             = 3; ///< image width (number of columns)
    +  float focal_length       = 4; ///< focal length in pixels
    +  float principal_point_u  = 5; ///< horizontal position of the principal point
    +  float principal_point_v  = 6; ///< vertical position of the principal point
    +  string encoding          = 7; ///< Encoding of pixels ["mono8", "mono16", "rgb8"]
    +  bool is_bigendian        = 8; ///< is data bigendian, (in our case false)
    +  uint32 step              = 9; ///< full row length in bytes
    +  bytes data               = 10; ///< actual matrix data, size is (step * height)
    +  Gpios gpios              = 11; ///< GPIOs as of acquisition timestamp
    +  float exposure_time      = 12; ///< exposure time in seconds
    +  float gain               = 13; ///< gain factor in decibel
    +  float noise              = 14; ///< noise
    +  float out1_reduction     = 16; ///< Fraction of reduction (0.0 - 1.0) of exposure time for images with GPIO Out1=Low in exp_auto_mode=AdaptiveOut1
    +  float brightness         = 17; ///< Current brightness of the image as value between 0 and 1
    +}
    +
    +message DisparityImage
    +{
    +  Time timestamp           = 1; ///< Acquisition timestamp of the image
    +  float scale              = 2; ///< scale factor
    +  float offset             = 3; ///< offset in pixels (in our case 0)
    +  float invalid_data_value = 4; ///< value used to mark pixels as invalid (in our case 0)
    +  float baseline           = 5; ///< baseline in meters
    +  float delta_d            = 6; ///< Smallest allowed disparity increment. The smallest achievable depth range resolution is delta_Z = (Z^2/image.focal_length*baseline)*delta_d.
    +  Image image              = 7; ///< disparity image
    +}
    +
    +message Mesh
    +{
    +  Time timestamp           = 1; ///< Acquisition timestamp of disparity image from which the mesh is computed
    +  string format            = 2; ///< currently only "ply" is supported
    +  bytes data               = 3; ///< actual mesh data
    +}
    +
    +message ImageSet
    +{
    +  Time timestamp             = 1;
    +  Image left                 = 2;
    +  Image right                = 3;
    +  DisparityImage disparity   = 4;
    +  Image disparity_error      = 5;
    +  Image confidence           = 6;
    +  Mesh mesh                  = 7;
    +}
    +
    +message MeshOptions
    +{
    +  uint32 max_points            = 1; ///< limit maximum number of points, zero means default (up to 3.1MP), minimum is 1000
    +  enum BinningMethod {
    +    AVERAGE = 0;                    ///< average over all points in bin
    +    MIN_DEPTH = 1;                  ///< use point with minimum depth (i.e. closest to camera) in bin
    +  }
    +  BinningMethod binning_method = 2; ///< method used for binning if limited by max_points
    +  bool watertight              = 3; ///< connect all edges and fill all holes, e.g. for collision checking
    +  bool textured                = 4; ///< add texture information to mesh
    +}
    +
    +message ImageSetRequest
    +{
    +  bool left_enabled            = 1;
    +  bool right_enabled           = 2;
    +  bool disparity_enabled       = 3;
    +  bool disparity_error_enabled = 4;
    +  bool confidence_enabled      = 5;
    +  bool mesh_enabled            = 6;
    +  MeshOptions mesh_options     = 7;
    +  bool color                   = 8; ///< send left/right image as color (rgb8) images
    +}
    +
    +service ImageInterface
    +{
    +  // A server-to-client streaming RPC.
    +  rpc StreamImageSets(ImageSetRequest) returns (stream ImageSet) {}
    +}
    +
    +
    +
    +
    +

    Umwandlung von Bild-Streams

    +

    Zur Umwandlung von Disparitätsbildern in Punktwolken dient die Beschreibung im Kapitel GigE Vision / GenICam Schnittstelle.

    +
    +
    +

    Beispielclient

    +

    Ein einfacher C++ Client kann von https://github.com/roboception/grpc_image_client_example heruntergeladen werden.

    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/handeye_calibration.html b/v24.04/de/handeye_calibration.html new file mode 100644 index 0000000..a0f884a --- /dev/null +++ b/v24.04/de/handeye_calibration.html @@ -0,0 +1,1999 @@ + + + + + + + + + + + Hand-Auge-Kalibrierung — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Hand-Auge-Kalibrierung

    +

    Für Anwendungen, bei denen die Kamera in eines oder mehrere Robotersysteme integriert wird, muss sie zum jeweiligen Roboter-Koordinatensystem kalibriert werden. Zu diesem Zweck wird der rc_visard NG mit einer internen Kalibrierroutine, dem Modul zur Hand-Auge-Kalibrierung, ausgeliefert. Dieses Modul ist ein Basismodul, welches auf jedem rc_visard NG verfügbar ist.

    +
    +

    Bemerkung

    +

    Für die Hand-Auge-Kalibrierung ist es völlig unerheblich, in Bezug auf welches benutzerdefinierte Roboter-Koordinatensystem die Kamera kalibriert wird. Hierbei kann es sich um einen Endeffektor des Roboters (z.B. Flansch oder Tool Center Point (Werkzeugmittelpunkt)) oder um einen beliebigen anderen Punkt in der Roboterstruktur handeln. Einzige Voraussetzung für die Hand-Auge-Kalibrierung ist, dass die Pose (d.h. Positions- und Rotationswerte) dieses Roboter-Koordinatensystems in Bezug auf ein benutzerdefiniertes externes Koordinatensystem (z.B. Welt oder Roboter-Montagepunkt) direkt von der Robotersteuerung erfasst und an das Kalibriermodul übertragen werden kann.

    +
    +

    Die Kalibrierroutine ist ein benutzerfreundliches mehrstufiges Verfahren, für das mit einem Kalibriermuster gearbeitet wird. Entsprechende Kalibriermuster können von Roboception bezogen werden.

    +
    +

    Kalibrierschnittstellen

    +

    Für die Durchführung der Hand-Auge-Kalibrierung stehen die folgenden beiden Schnittstellen zur Verfügung:

    +
      +
    1. Alle Services und Parameter dieses Moduls, die für eine programmgesteuerte Durchführung der Hand-Auge-Kalibrierung benötigt werden, sind in der REST-API-Schnittstelle des rc_visard NG enthalten. Der REST-API-Name dieses Moduls lautet rc_hand_eye_calibration und seine Services werden in Services erläutert.

      +
      +

      Bemerkung

      +

      Für den beschriebenen Ansatz wird eine Netzwerkverbindung zwischen dem rc_visard NG und der Robotersteuerung benötigt, damit die Steuerung die Roboterposen an das Kalibriermodul des rc_visard NG übertragen kann.

      +
      +
    2. +
    3. Für Anwendungsfälle, bei denen sich die Roboterposen nicht programmgesteuert an das Modul zur Hand-Auge-Kalibrierung des rc_visard NG übertragen lassen, sieht die Seite Hand-Auge-Kalibrierung unter dem Menüpunkt Konfiguration der Web GUI einen geführten Prozess vor, mit dem sich die Kalibrierroutine manuell durchführen lässt.

      +
      +

      Bemerkung

      +

      Während der Kalibrierung muss der Benutzer die Roboterposen, auf die über das jeweilige Teach-in- oder Handheld-Gerät zugegriffen werden muss, manuell in die Web GUI eingeben.

      +
      +
    4. +
    +
    +
    +

    Kameramontage

    +

    Wie in Abb. 30 und Abb. 32 dargestellt, ist für die Montage der Kamera zwischen zwei unterschiedlichen Anwendungsfällen zu unterscheiden:

    +
      +
    1. Die Kamera wird am Roboter montiert, d.h. sie ist mechanisch mit einem Roboterpunkt (d.h. Flansch oder flanschmontiertes Werkzeug) verbunden und bewegt sich demnach mit dem Roboter.
    2. +
    3. Die Kamera ist nicht am Roboter montiert, sondern an einem Tisch oder anderen Ort in der Nähe des Roboters befestigt und verbleibt daher verglichen mit dem Roboter in einer statischen Position.
    4. +
    +

    Die allgemeine Kalibrierroutine ist in beiden Anwendungsfällen sehr ähnlich. Sie unterscheidet sich jedoch hinsichtlich der semantischen Auslegung der Ausgabedaten, d.h. der erhaltenen Kalibriertransformation, und hinsichtlich der Befestigung des Kalibriermusters.

    +
    +
    Kalibrierung einer robotergeführten Kamera
    +

    Soll eine robotergeführte Kamera zum Roboter kalibriert werden, so muss das Kalibriermuster in einer statischen Position zum Roboter, z.B. auf einem Tisch oder festen Sockel, befestigt werden (siehe Abb. 30).

    +
    +

    Warnung

    +

    Es ist äußerst wichtig, dass sich das Kalibriermuster in Schritt 2 der Kalibrierroutine nicht bewegt. Daher wird dringend empfohlen, das Muster in seiner Position sicher zu fixieren, um unbeabsichtigte Bewegungen, wie sie durch Vibrationen, Kabelbewegungen oder Ähnliches ausgelöst werden, zu verhindern.

    +
    +

    Das Ergebnis der Kalibrierung (Schritt 3 der Kalibrierroutine) ist eine Pose \(\mathbf{T}^{\text{robot}}_{\text{camera}}\), die die (zuvor unbekannte) relative Transformation zwischen dem Kamera-Koordinatensystem und dem benutzerdefinierten Roboter-Koordinatensystem beschreibt, sodass Folgendes gilt:

    +
    +(3)\[\mathbf{p}_{\text{robot}} = + \mathbf{R}^{\text{robot}}_{\text{camera}} + \cdot \mathbf{p}_{\text{camera}} + + \mathbf{t}^{\text{robot}}_{\text{camera}} + \:,\]
    +

    wobei \(\mathbf{p}_{\text{robot}} = (x,y,z)^T\) ein 3D-Punkt ist, dessen Koordinaten im Roboter-Koordinatensystem angegeben werden, \(\mathbf{p}_{\text{camera}}\) denselben Punkt im Kamera-Koordinatensystem darstellt, und \(\mathbf{R}^{\text{robot}}_{\text{camera}}\) sowie \(\mathbf{t}^{\text{robot}}_{\text{camera}}\) die \(3\times 3\) Drehmatrix und den \(3\times 1\) Translationsvektor für eine Pose \(\mathbf{T}^{\text{robot}}_{\text{camera}}\) angeben. In der Praxis wird die Rotation für das Kalibrierergebnis und die Roboterposen als Eulerwinkel oder Quaternion anstatt einer Rotationsmatrix definiert (siehe Formate für Posendaten).

    +
    +_images/sketch_handeye_calib_robotmounted_ng_de.svg +

    Abb. 30 Wichtige Koordinatensysteme und Transformationen für die Kalibrierung einer robotergeführten Kamera: Sie wird mit einer festen relativen Position zu einem benutzerdefinierten Roboter-Koordinatensystem (z.B. Flansch oder Werkzeugmittelpunkt) montiert. Es ist wichtig, dass die Pose \(\mathbf{T}^{\text{ext}}_{\text{robot}}\) des Roboter-Koordinatensystems in Bezug auf ein benutzerdefiniertes externes Referenzkoordinatensystem (ext) während der Kalibrierroutine gemessen werden kann. Das Ergebnis des Kalibriervorgangs ist die gewünschte Kalibriertransformation \(\mathbf{T}^{\text{robot}}_{\text{camera}}\), d.h. die Pose des Kamera-Koordinatensystems im benutzerdefinierten Roboter-Koordinatensystem.

    +
    +

    Zusätzliche Benutzereingaben werden benötigt, falls die Bewegung des Roboters so beschränkt ist, dass der Tool Center Point (TCP) nur um eine Achse rotieren kann. Das ist üblicherweise für Roboter mit vier Freiheitsgraden (4DOF) der Fall, welche häufig zur Palettierung eingesetzt werden. In diesem Fall muss der Benutzer angeben, welche Achse des Roboterkoordinatensystems der Rotationsachse des TCP entspricht. Außerdem muss der vorzeichenbehaftete Offset vom TCP zum Kamerakoordinatensystem entlang der TCP-Rotationsachse angegeben werden. Abb. 31 zeigt die Situation.

    +

    Für den rc_visard NG befindet sich der Ursprung des Kamerakoordinatensystems im optischen Zentrum der linken Kamera. Die ungefähre Position wird im Abschnitt Koordinatensysteme angegeben.

    +
    +_images/sketch_handeye_calib_robotmounted_4dof_ng_de.svg +

    Abb. 31 Im Fall eines 4DOF-Roboters müssen die TCP-Rotationsachse und der Offset vom TCP zum Kamerakoordinatensystem entlang der TCP-Rotationsachse angegeben werden. Im dargestellten Fall ist der Offset negativ.

    +
    +
    +
    Kalibrierung einer statisch montierten Kamera
    +

    In Anwendungsfällen, bei denen die Kamera statisch verglichen zum Roboter montiert wird, muss das Kalibriermuster, wie im Beispiel in Abb. 32 und Abb. 33 angegeben, angebracht werden.

    +
    +

    Bemerkung

    +

    Für das Modul zur Hand-Auge-Kalibrierung spielt es keine Rolle, wie das Kalibriermuster in Bezug auf das benutzerdefinierte Roboter-Koordinatensystem genau angebracht und positioniert wird. Das bedeutet, dass die relative Positionierung des Kalibriermusters zu diesem Koordinatensystem weder bekannt sein muss, noch für die Kalibrierroutine relevant ist (siehe in Abb. 33).

    +
    +
    +

    Warnung

    +

    Es ist äußerst wichtig, das Kalibriermuster sicher am Roboter anzubringen, damit sich seine relative Position in Bezug auf das in Schritt 2 der Kalibrierroutine vom Benutzer definierte Roboter-Koordinatensystem nicht verändert.

    +
    +

    In diesem Anwendungsfall ist das Ergebnis der Kalibrierung (Schritt 3 der Kalibrierroutine) die Pose \(\mathbf{T}^{\text{ext}}_{\text{camera}}\), die die (zuvor unbekannte) relative Transformation zwischen dem Kamera-Koordinatensystem und dem benutzerdefinierten Roboter-Koordinatensystem beschreibt, sodass Folgendes gilt:

    +
    +(4)\[\mathbf{p}_{\text{ext}} = + \mathbf{R}^{\text{ext}}_{\text{camera}} + \cdot \mathbf{p}_{\text{camera}} + + \mathbf{t}^{\text{ext}}_{\text{camera}} + \:,\]
    +

    wobei \(\mathbf{p}_{\text{ext}} = (x,y,z)^T\) ein 3D-Punkt im externen Referenzkoordinatensystem ext, \(\mathbf{p}_{\text{camera}}\) derselbe Punkt im Kamerakoordinatensystem camera und \(\mathbf{R}^{\text{ext}}_{\text{camera}}\) sowie \(\mathbf{t}^{\text{ext}}_{\text{camera}}\) die \(3\times 3\) Rotationsmatrix und \(3\times 1\) Translationsvektor der Pose \(\mathbf{T}^{\text{ext}}_{\text{camera}}\) sind. In der Praxis wird die Rotation für das Kalibrierergebnis und die Roboterposen als Eulerwinkel oder Quaternion anstatt einer Rotationsmatrix definiert (siehe Formate für Posendaten).

    +
    +_images/sketch_handeye_calib_static_ng_de.svg +

    Abb. 32 Wichtige Koordinatensysteme und Transformationen für die Kalibrierung einer statisch montierten Kamera: Sie wird mit einer festen Position relativ zu einem benutzerdefinierten externen Referenzkoordinatensystem ext (z.B. Weltkoordinatensystem oder Roboter-Montagepunkt) montiert. Es ist wichtig, dass die Pose \(\mathbf{T}^{\text{ext}}_{\text{robot}}\) des benutzerdefinierten Roboter-Koordinatensystems in Bezug auf dieses Koordinatensystem während der Kalibrierroutine gemessen werden kann. Das Ergebnis des Kalibrierprozesses ist die gewünschte Kalibriertransformation \(\mathbf{T}^{\text{ext}}_{\text{camera}}\), d.h. die Pose des Kamera-Koordinatensystems im benutzerdefinierten externen Koordinatensystem ext.

    +
    +
    +_images/sketch_handeye_calib_gridmount_ng_de.svg +

    Abb. 33 Alternative Montageoptionen für die Befestigung des Kalibriermusters am Roboter

    +
    +

    Zusätzliche Benutzereingaben werden benötigt, falls die Bewegung des Roboters so beschränkt ist, dass der Tool Center Point (TCP) nur um eine Achse rotieren kann. Das ist üblicherweise für Roboter mit vier Freiheitsgraden (4DOF) der Fall, welche häufig zur Palettierung eingesetzt werden. In diesem Fall muss der Benutzer angeben, welche Achse des Roboterkoordinatensystems der Rotationsachse des TCP entspricht. Außerdem muss der vorzeichenbehaftete Offset vom TCP zur sichtbaren Oberfläche des Kalibriermusters entlang der TCP-Rotationsachse angegeben werden. Das Kalibriermuster muss so angebracht werden, dass die TCP-Rotationsachse orthogonal zum Kalibriermuster verläuft. Abb. 34 zeigt die Situation.

    +
    +_images/sketch_handeye_calib_static_4dof_ng_de.svg +

    Abb. 34 Im Fall eines 4DOF-Roboters müssen die TCP-Rotationsachse und der Offset vom TCP zur sichtbaren Oberfläche des Kalibriermusters entlang der TCP-Rotationsachse angegeben werden. Im dargestellten Fall ist der Offset negativ.

    +
    +
    +
    +
    +
    +

    Kalibrierroutine

    +

    Die Hand-Auge-Kalibrierung kann manuell über die Web GUI oder programmgesteuert über die REST-API-Schnittstelle durchgeführt werden. Die allgemeine Vorgehensweise wird beschrieben anhand der Schritte in der Web GUI unter Konfiguration ‣ Hand-Auge-Kalibrierung. Verweise auf die zugehörigen REST-API Aufrufe werden an den entsprechenden Stellen bereitgestellt.

    +
    +

    Schritt 1: Hand-Auge-Kalibrierstatus

    +

    Die Startseite des Assistenten für die Hand-Auge-Kalibrierung zeigt den aktuellen Status der Hand-Auge-Kalibrierung. Wenn eine Hand-Auge-Kalibrierung auf dem rc_visard NG gespeichert ist, wird die Kalibriertransformation hier angezeigt (siehe Abb. 35).

    +
    +
    +_images/webgui_hand_eye_calib1_calib_ng_de.png +

    Abb. 35 Aktueller Status der Hand-Auge-Kalibrierung falls eine Hand-Auge-Kalibrierung gespeichert ist

    +
    +
    +

    Um den Status der Hand-Auge-Kalibrierung programmgesteuert abzufragen bietet die REST-API den Service get_calibration (siehe Services). Eine vorhandene Hand-Auge-Kalibrierung kann über Kalibrierung entfernen oder den REST-API Service remove_calibration (siehe Services) gelöscht werden.

    +

    Durch Klick auf Kalibrierung durchführen wird eine neue Hand-Auge-Kalibrierung gestartet.

    +
    +
    +

    Schritt 2: Testen der Mustererkennung

    +

    Um gute Kalibrierergebnisse zu erzielen müssen die Bilder gut belichtet sein, damit das Kalibriermuster genau und verlässlich erkannt werden kann. In diesem Schritt kann die Erkennung des Kalibriermusters getestet werden und die Kameraeinstellungen können angepasst werden, falls nötig. Falls Teile des Kalibriermusters überbelichtet sind, werden die zugehörigen Quadrate rot hervorgehoben. Die erfolgreiche Erkennung des Kalibriermusters wird durch grüne Häkchen auf jedem Quadrat und einen dicken grünen Rahmen um das Kalibriermuster visualisiert, wie in Abb. 36 dargestellt ist.

    +
    +
    +_images/webgui_hand_eye_calib2_ng_de.png +

    Abb. 36 Testen der Mustererkennung

    +
    +
    +
    +
    +

    Schritt 3: Posen aufnehmen

    +

    In diesem Schritt werden Bilder des Kalibriermusters an verschiedenen Roboterposen aufgenommen. Dabei ist sicherzustellen, dass das Kalibriermuster bei allen Posen im linken Kamerabild vollständig sichtbar ist. Zudem müssen die Roboterpositionen sorgsam ausgewählt werden, damit das Kalibriermuster aus unterschiedlichen Perspektiven aufgenommen wird. Abb. 37 zeigt eine schematische Darstellung der empfohlenen acht Ansichten.

    +
    +_images/handeyecalib-alldraw.png +

    Abb. 37 Empfohlene Ansichten des Kalibriermusters während des Kalibriervorgangs. Im Fall von 4DOF-Robotern müssen andere Ansichten gewählt werden, welche so unterschiedlich wie möglich sein sollten.

    +
    +
    +

    Warnung

    +

    Die Kalibrierqualität, d.h. die Genauigkeit des berechneten Kalibrierergebnisses, hängt von den Ansichten des Kalibriermusters ab. Je vielfältiger die Perspektiven sind, desto besser gelingt die Kalibrierung. Werden sehr ähnliche Ansichten ausgewählt, d.h. wird die Pose des Roboters vor der Aufnahme einer neuen Kalibrierpose nur leicht variiert, kann dies zu einer ungenauen Schätzung der gewünschten Kalibriertransformation führen.

    +
    +

    Nachdem der Roboter die jeweilige Kalibrierposition erreicht hat, muss die entsprechende Pose \(\mathbf{T}^{\text{ext}}_{\text{robot}}\) des benutzerdefinierten Roboter-Koordinatensystems im benutzerdefinierten externen Referenzkoordinatensystem ext an das Modul zur Hand-Auge-Kalibrierung übertragen werden. Hierfür bietet das Softwaremodul verschiedene Slots, in denen die gemeldeten Posen mit den zugehörigen Bildern der linken Kamera hinterlegt werden können. Alle gefüllten Slots werden dann verwendet, um die gewünschte Kalibriertransformation zwischen dem Kamera-Koordinatensystem und dem benutzerdefinierten Roboter-Koordinatensystem (bei robotergeführten Kameras) bzw. dem benutzerdefinierten externen Referenzkoordinatensystem ext (bei statisch montierten Kameras) zu berechnen.

    +

    In der Web GUI kann der Nutzer zwischen vielen verschiedenen Formaten für die Kalibrierposen wählen (siehe Formate für Posendaten). Wird die Kalibrierung über die REST-API vorgenommen, dann werden die Kalibrierdaten immer im Format XYZ+Quaternion angegeben. Die Web GUI bietet acht Slots (Nahaufnahme 1, Nahaufnahme 2, usw.), in die der Benutzer die Posen manuell eintragen kann. Neben jedem Slot wird eine Empfehlung für die Ansicht des Kalibriermusters angezeigt. Der Roboter sollte für jeden Slot so bewegt werden, dass die empfohlene Ansicht erreicht wird.

    +
    +_images/webgui_hand_eye_calib3_ng_de.png +

    Abb. 38 Setzen der ersten Kalibrierpose für die Hand-Auge-Kalibrierung bei einer statisch montierten Kamera

    +
    +

    Nach Klick auf Pose setzen kann die Pose des benutzerdefinierten Roboter-Koordinatensystems manuell in die entsprechenden Textfelder eingegeben werden. Durch Bild aufnehmen werden die Pose und das aktuelle Kamerabild im jeweiligen Slot gespeichert.

    +

    Um diese Posen programmgesteuert zu übertragen, bietet die REST-API den Service set_pose (siehe Services).

    +
    +

    Bemerkung

    +

    Der Zugriff auf die Posendaten des Roboters hängt vom Modell des Roboters und seinem Hersteller ab. Möglicherweise lassen sie sich über ein im Lieferumfang des Roboters enthaltenes Teach-in- oder Handheld-Gerät ablesen.

    +
    +
    +

    Warnung

    +

    Es ist wichtig darauf zu achten, dass genaue und korrekte Werte eingegeben werden. Selbst kleinste Ungenauigkeiten oder Tippfehler können dazu führen, dass die Kalibrierung fehlschlägt.

    +
    +

    Die Web GUI zeigt die aktuell gespeicherten Kalibrierposen (nur mit den Slot-Nummern 0-7) und die zugehörigen Kamerabilder an und ermöglicht auch das Löschen von einzelnen Posen über Pose löschen, oder das Löschen aller gesetzten Posen über Alle Posen löschen. In der REST-API können die aktuell gespeicherten Kalibrierposen über get_poses abgefragt und über delete_poses oder reset_calibration einzeln bzw. komplett gelöscht werden (siehe Services).

    +

    Wenn mindestens vier Posen gesetzt wurden, gelangt man über die Schaltfläche Weiter zur Berechnung des Kalibrierergebnisses.

    +
    +

    Bemerkung

    +

    Um die Transformation für die Hand-Auge-Kalibrierung erfolgreich zu berechnen, müssen mindestens vier verschiedene Roboter-Kalibrierposen übertragen und in Slots hinterlegt werden. Um Kalibrierfehler zu verhindern, die durch ungenaue Messungen entstehen können, sind mindestens acht Kalibrierposen empfohlen.

    +
    +
    +
    +

    Schritt 4: Kalibrierung berechnen

    +

    Bevor das Kalibrierergebnis berechnet werden kann, muss der Nutzer die korrekten Kalibrierparameter angeben. Diese beinhalten die exakten Abmessungen des Kalibriermusters und die Art der Sensormontage. Weiterhin kann die Kalibrierung von 4DOF-Robotern eingestellt werden. In diesem Fall müssen die Rotationsachse, sowie der Offset vom TCP zum Kamerakoordinatensystem (für Kameras am Roboter) oder zur Oberfläche des Kalibriermusters (für statische Kameras) angegeben werden. Für die REST-API sind die entsprechenden Parameter aufgelistet.

    +
    +_images/webgui_hand_eye_calib4_ng_de.png +

    Abb. 39 Setzen der Parameter und Berechnen der Hand-Auge-Kalibrierung in der Web GUI des rc_visard NG

    +
    +

    Wenn die Parameter korrekt sind, kann durch Kalibrierung berechnen die gewünschte Kalibriertransformation aus den aufgenommenen Kalibrierposen und den zugehörigen Kamerabildern berechnet werden. Die REST-API bietet diese Funktion über den Service calibrate (siehe Services).

    +

    Je nachdem, wie die Kamera montiert ist, wird dabei die Transformation (d.h. die Pose) zwischen dem Kamera-Koordinatensystem und entweder dem benutzerdefinierten Roboter-Koordinatensystem (bei robotergeführten Kameras) oder dem benutzerdefinierten externen Referenzkoordinatensystem ext (bei statisch montierten Kameras) berechnet und ausgegeben (siehe Kameramontage).

    +

    Damit der Benutzer die Qualität der resultierenden Kalibriertransformation beurteilen kann, werden die translatorischen und rotatorischen Kalibrierfehler ausgegeben. Diese Werte werden aus der Varianz des Kalibrierergebnisses berechnet.

    +

    Wenn der Kalibrierfehler nicht akzeptabel ist, können die Kalibrierparameter geändert und das Ergebnis neu berechnet werden. Außerdem ist es möglich, zu Schritt 3 zurückzukehren, um mehr Posen aufzunehmen oder die vorhandenen Posen zu aktualisieren.

    +

    Durch Klicken auf Kalibrierung speichern oder über den REST-API Service save_calibration (siehe Services) wird das Kalibrierergebnis gespeichert.

    +
    +
    +
    +

    Parameter

    +

    Das Modul zur Hand-Auge-Kalibrierung wird in der REST-API als rc_hand_eye_calibration bezeichnet und in der Web GUI unter Konfiguration ‣ Hand-Auge Kalibrierung dargestellt. Der Benutzer kann die Kalibrierparameter entweder dort oder über die REST-API-Schnittstelle ändern.

    +
    +

    Übersicht über die Parameter

    +

    Dieses Softwaremodul bietet folgende Laufzeitparameter:

    + + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Tab. 33 Laufzeitparameter des rc_hand_eye_calibration-Moduls
    NameTypMin.Max.DefaultBeschreibung
    grid_heightfloat640.010.00.0Höhe des Kalibriermusters in Metern
    grid_widthfloat640.010.00.0Breite des Kalibriermusters in Metern
    robot_mountedboolfalsetruetrueAngabe, ob der rc_visard auf einem Roboter montiert ist
    tcp_offsetfloat64-10.010.00.0Offset vom TCP entlang tcp_rotation_axis
    tcp_rotation_axisint32-12-1-1 für aus, 0 für x, 1 für y, 2 für z
    +
    +
    +

    Beschreibung der Laufzeitparameter

    +

    Für die Beschreibungen der Parameter sind die in der Web GUI gewählten Namen der Parameter in Klammern angegeben.

    +
    +

    grid_width (Breite)

    +
    +

    Breite des Kalibriermusters in Metern. Die Breite sollte mit sehr hoher Genauigkeit, vorzugsweise im Submillimeterbereich, angegeben werden.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/parameters?grid_width=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_hand_eye_calibration/parameters?grid_width=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    grid_height (Höhe)

    +
    +

    Höhe des Kalibriermusters in Metern. Die Höhe sollte mit sehr hoher Genauigkeit, vorzugsweise im Submillimeterbereich, angegeben werden.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/parameters?grid_height=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_hand_eye_calibration/parameters?grid_height=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    robot_mounted (Sensormontage)

    +
    +

    Ist dieser Parameter auf true gesetzt, dann ist die Kamera an einem Roboter montiert. Ist er auf false gesetzt, ist sie statisch montiert und das Kalibriermuster ist am Roboter angebracht.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/parameters?robot_mounted=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_hand_eye_calibration/parameters?robot_mounted=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    tcp_offset (TCP-Offset)

    +
    +

    Der vorzeichenbehaftete Offset vom TCP zum Kamerakoordinatensystem (für Kameras auf dem Roboter) oder der sichtbaren Oberfläche des Kalibriermusters (für statische Kameras) entlang der TCP-Rotationsachse in Metern. Dies wird benötigt, falls die Roboterbewegung eingeschränkt ist, sodass der TCP nur um eine Achse gedreht werden kann (z.B. bei 4DOF-Robotern).

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/parameters?tcp_offset=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_hand_eye_calibration/parameters?tcp_offset=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    tcp_rotation_axis (TCP-Rotationsachse)

    +
    +

    Die Achse des Roboterkoordinatensystems, um die der Roboter seinen TCP drehen kann. 0 für X-, 1 für Y- und 2 für Z-Achse. Dies wird benötigt falls, die Roboterbewegung eingeschränkt ist, sodass der TCP nur um eine Achse gedreht werden kann (z.B. bei 4DOF-Robotern). -1 bedeutet, dass der Roboter seinen TCP um zwei unabhängige Achsen drehen kann. tcp_offset wird in diesem Fall ignoriert.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/parameters?tcp_rotation_axis=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_hand_eye_calibration/parameters?tcp_rotation_axis=<value>
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    Services

    +

    Auf die Services, die die REST-API für die programmgesteuerte Durchführung der Hand-Auge-Kalibrierung und für die Wiederherstellung der Modulparameter bietet, wird im Folgenden näher eingegangen.

    +
    +

    get_calibration

    +
    +

    Hiermit wird die derzeit auf dem rc_visard NG gespeicherte Hand-Auge-Kalibrierung abgerufen.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/get_calibration
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_hand_eye_calibration/services/get_calibration
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Das Feld error gibt den Kalibrierfehler in Pixeln an, der aus dem translatorischen Fehler translation_error_meter und dem rotatorischen Fehler rotation_error_degree berechnet wird. Dieser Wert wird nur aus Kompatibilitätsgründen mit älteren Versionen angegeben. Die translatorischen und rotatorischen Fehler sollten bevorzugt werden.

    + + +++++ + + + + + + + + + + + + + + + + +
    Tab. 34 Rückgabewerte des get_calibration-Services
    statussuccessBeschreibung
    0trueeine gültige Kalibrierung wurde zurückgegeben
    2falsedie Kalibrierung ist nicht verfügbar
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "get_calibration",
    +  "response": {
    +    "error": "float64",
    +    "message": "string",
    +    "pose": {
    +      "orientation": {
    +        "w": "float64",
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "position": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      }
    +    },
    +    "robot_mounted": "bool",
    +    "rotation_error_degree": "float64",
    +    "status": "int32",
    +    "success": "bool",
    +    "translation_error_meter": "float64"
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    remove_calibration

    +
    +

    Dieser Service löscht die persistente Hand-Auge-Kalibrierung auf dem rc_visard NG. Nach diesem Aufruf gibt der get_calibration Service zurück, dass keine Hand-Auge-Kalibrierung vorliegt. Dieser Service löscht ebenfalls alle gespeicherten Kalibrierposen und die zugehörigen Kamerabilder.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/remove_calibration
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_hand_eye_calibration/services/remove_calibration
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    + + +++++ + + + + + + + + + + + + + + + + + + + + +
    Tab. 35 Rückgabewerte des get_calibration-Services
    statussuccessBeschreibung
    0truepersistente Kalibrierung gelöscht, Gerät nicht mehr kalibriert
    1truekeine persistente Kalibrierung gefunden, Gerät nicht kalibriert
    2falsedie Kalibrierung konnte nicht gelöscht werden
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "remove_calibration",
    +  "response": {
    +    "message": "string",
    +    "status": "int32",
    +    "success": "bool"
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    set_pose

    +
    +

    Dieser Service setzt die Roboterpose als Kalibrierpose für die Hand-Auge-Kalibrierroutine und nimmt das aktuelle Bild des Kalibriermusters auf.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/set_pose
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_hand_eye_calibration/services/set_pose
    +
    +
    +
    +
    +
    + +
    +

    Das slot-Argument wird verwendet, um den verschiedenen Kalibrierpositionen eindeutige Ziffern im Wertebereich von 0-15 zuzuordnen. Wann immer der Service set_pose aufgerufen wird, wird ein Kamerabild aufgezeichnet. Dieser Service schlägt fehl, wenn das Kalibriermuster im aktuellen Bild nicht erkannt werden kann.

    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "pose": {
    +      "orientation": {
    +        "w": "float64",
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "position": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      }
    +    },
    +    "slot": "uint32"
    +  }
    +}
    +
    +
    +
    +
    + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Tab. 36 Rückgabewerte des set_pose-Services
    statussuccessBeschreibung
    1truePose erfolgreich gespeichert
    3truePose erfolgreich gespeichert. Es wurden genügend Posen für die Kalibrierung gespeichert, d.h. die Kalibrierung kann durchgeführt werden
    4falsedas Kalibriermuster wurde nicht erkannt, z.B. weil es im Kamerabild nicht vollständig sichtbar ist
    8falsekeine Bilddaten verfügbar
    12falsedie angegebenen Orientierungswerte sind ungültig
    13falseungültige Slot-Nummer
    +

    The Feld overexposed gibt an, ob Teile des Kalibriermusters bei diesem Bild überbelichtet sind.

    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "set_pose",
    +  "response": {
    +    "message": "string",
    +    "overexposed": "bool",
    +    "status": "int32",
    +    "success": "bool"
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    get_poses

    +
    +

    Dieser Service gibt die aktuell gespeicherten Kalibrierposen für die Hand-Auge-Kalibrierung zurück.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/get_poses
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_hand_eye_calibration/services/get_poses
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    + + +++++ + + + + + + + + + + + + + + + + +
    Tab. 37 Rückgabewerte des get_poses-Services
    statussuccessBeschreibung
    0truegespeicherte Posen werden zurückgeliefert
    1truekeine Kalibrierposen verfügbar
    +

    The Feld overexposed gibt an, ob Teile des Kalibriermusters bei diesem Bild überbelichtet sind.

    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "get_poses",
    +  "response": {
    +    "message": "string",
    +    "poses": [
    +      {
    +        "overexposed": "bool",
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "slot": "uint32"
    +      }
    +    ],
    +    "status": "int32",
    +    "success": "bool"
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    delete_poses

    +
    +

    Dieser Service löscht die Kalibrierposen und die zugehörigen Bilder mit den angegebenen Nummern in slots.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/delete_poses
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_hand_eye_calibration/services/delete_poses
    +
    +
    +
    +
    +
    + +
    +

    Das Argument slots gibt die Ziffern der Kalibrierposen an, die gelöscht werden sollen. Wenn slots leer ist, werden keine Kalibrierposen gelöscht.

    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "slots": [
    +      "uint32"
    +    ]
    +  }
    +}
    +
    +
    +
    +
    + + +++++ + + + + + + + + + + + + + + + + +
    Tab. 38 Rückgabewerte des delete_poses-Services
    statussuccessBeschreibung
    0truePosen erfolgreich gelöscht
    1trueKeine Slots angegeben
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "delete_poses",
    +  "response": {
    +    "message": "string",
    +    "status": "int32",
    +    "success": "bool"
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    reset_calibration

    +
    +

    Hiermit werden alle zuvor aufgenommenen Posen mitsamt der zugehörigen Bilder gelöscht. Das letzte hinterlegte Kalibrierergebnis wird neu geladen. Dieser Service kann verwendet werden, um die Hand-Auge-Kalibrierung (neu) zu starten.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/reset_calibration
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_hand_eye_calibration/services/reset_calibration
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "reset_calibration",
    +  "response": {
    +    "message": "string",
    +    "status": "int32",
    +    "success": "bool"
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    calibrate

    +
    +

    Dieser Service dient dazu, das Ergebnis der Hand-Auge-Kalibrierung auf Grundlage der über den Service set_pose konfigurierten Roboterposen zu berechnen und auszugeben.

    +

    Details

    +
    +

    Damit die Kalibrierung für andere Module mit get_calibration verfügbar ist und persistent gespeichert wird, muss save_calibration aufgerufen werden.

    +
    +

    Bemerkung

    +

    Zur Berechnung der Transformation der Hand-Auge-Kalibrierung werden mindestens vier Roboterposen benötigt (siehe set_pose). Empfohlen wird jedoch die Verwendung von acht Kalibrierposen.

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/calibrate
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_hand_eye_calibration/services/calibrate
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Das Feld error gibt den Kalibrierfehler in Pixeln an, der aus dem translatorischen Fehler translation_error_meter und dem rotatorischen Fehler rotation_error_degree berechnet wird. Dieser Wert wird nur aus Kompatibilitätsgründen mit älteren Versionen angegeben. Die translatorischen und rotatorischen Fehler sollten bevorzugt werden.

    + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Tab. 39 Rückgabewerte des calibrate-Services
    statussuccessBeschreibung
    0trueKalibrierung erfolgreich, das Kalibrierergebnis wurde zurückgegeben.
    1falseNicht genügend Posen gespeichert, um die Kalibrierung durchzuführen
    2falseDas berechnete Ergebnis ist ungültig, bitte prüfen Sie die Eingabewerte.
    3falseDie angegebenen Abmessungen des Kalibriermusters sind ungültig.
    4falseUngenügende Rotation, tcp_offset and tcp_rotation_axis müssen angegeben werden
    5falseGenügend Rotation verfügbar, tcp_rotation_axis muss auf -1 gesetzt werden
    6falseDie Posen sind nicht unterschiedlich genug.
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "calibrate",
    +  "response": {
    +    "error": "float64",
    +    "message": "string",
    +    "pose": {
    +      "orientation": {
    +        "w": "float64",
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "position": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      }
    +    },
    +    "robot_mounted": "bool",
    +    "rotation_error_degree": "float64",
    +    "status": "int32",
    +    "success": "bool",
    +    "translation_error_meter": "float64"
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    save_calibration

    +
    +

    Hiermit wird das Ergebnis der Hand-Auge-Kalibrierung persistent auf dem rc_visard NG gespeichert und das vorherige Ergebnis überschrieben. Das gespeicherte Ergebnis lässt sich jederzeit über den Service get_calibration abrufen. Dieser Service löscht ebenfalls alle gespeicherten Kalibrierposen und die zugehörigen Kamerabilder.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/save_calibration
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_hand_eye_calibration/services/save_calibration
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    + + +++++ + + + + + + + + + + + + + + + + + + + + +
    Tab. 40 Rückgabewerte des save_calibration-Services
    statussuccessBeschreibung
    0truedie Kalibrierung wurde erfolgreich gespeichert
    1falsedie Kalibrierung konnte nicht im Dateisystem gespeichert werden
    2falsedie Kalibrierung ist nicht verfügbar
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "save_calibration",
    +  "response": {
    +    "message": "string",
    +    "status": "int32",
    +    "success": "bool"
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    set_calibration

    +
    +

    Hiermit wird die übergebene Transformation als Hand-Auge-Kalibrierung gesetzt.

    +

    Details

    +
    +

    Die Kalibrierung wird im gleichen Format erwartet, in dem sie beim calibrate und get_calibration Aufruf zurückgegeben wird. Die gegebene Kalibrierung wird auch persistent gespeichert, indem intern save_calibration aufgerufen wird.

    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/set_calibration
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_hand_eye_calibration/services/set_calibration
    +
    +
    +
    +
    +
    + +
    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "pose": {
    +      "orientation": {
    +        "w": "float64",
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "position": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      }
    +    },
    +    "robot_mounted": "bool"
    +  }
    +}
    +
    +
    +
    +
    + + +++++ + + + + + + + + + + + + + + + + +
    Tab. 41 Rückgabewerte des set_calibration-Services
    statussuccessBeschreibung
    0trueSetzen der Kalibrierung war erfolgreich
    12falsedie angegebenen Orientierungswerte sind ungültig
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "set_calibration",
    +  "response": {
    +    "message": "string",
    +    "status": "int32",
    +    "success": "bool"
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    reset_defaults

    +
    +

    Hiermit werden die Werkseinstellungen der Parameter dieses Moduls wieder hergestellt und angewandt („factory reset“). Dies hat keine Auswirkungen auf das Kalibrierergebnis oder auf die während der Kalibrierung gefüllten Slots. Es werden lediglich Parameter, wie die Maße des Kalibriermusters oder die Montageart des Sensors, zurückgesetzt.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/reset_defaults
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_hand_eye_calibration/services/reset_defaults
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "reset_defaults",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/hardware_spec.html b/v24.04/de/hardware_spec.html new file mode 100644 index 0000000..05b93fd --- /dev/null +++ b/v24.04/de/hardware_spec.html @@ -0,0 +1,1030 @@ + + + + + + + + + + + Hardware-Spezifikation — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + +
      + +
    • rc_visard NG >
    • + +
    • Hardware-Spezifikation
    • + + +
    • + + + +
    • + +
    + + +
    +
    +
    +
    + +
    +

    Hardware-Spezifikation

    +
    +

    Bemerkung

    +

    Die folgenden Hardware-Spezifikationen sind als allgemeine Richtlinie angegeben. Das Produkt kann hiervon abweichen.

    +
    +
    +

    Lieferumfang

    +

    Der Lieferumfang eines rc_visard NG umfasst üblicherweise lediglich den rc_visard NG-Sensor und die Kurzanleitung. Das Handbuch liegt in digitaler Form vor, ist im Sensor hinterlegt und lässt sich zudem über die Web GUI oder über die Roboception-Homepage http://www.roboception.com/documentation aufrufen.

    +
    +

    Bemerkung

    +

    Folgende Elemente sind, sofern nicht anders angegeben, NICHT im Lieferumfang enthalten:

    +
      +
    • Kupplungen, Adapter, Halterungen,
    • +
    • Netzteil, Kabel und Sicherungen,
    • +
    • Netzwerkkabel.
    • +
    +

    In Abschnitt Zubehör ist angegeben, welche Kabelanbieter empfohlen werden.

    +
    +

    Für den rc_visard NG ist ein Anschlussset verfügbar. Dieses Set umfasst das M12/RJ45-Netzwerkkabel, ein 24-V-Netzteil und einen DC/M12-Adapter. Für nähere Informationen siehe Zubehör.

    +
    +

    Bemerkung

    +

    Das Anschlussset ist lediglich für die Ersteinrichtung, nicht jedoch für die dauerhafte Installation im industriellen Umfeld gedacht.

    +
    +

    Das folgende Bild zeigt die wichtigsten Bauteile des rc_visard NG, auf die in diesem Handbuch Bezug genommen wird.

    +
    +_images/rc_visard_parts_ng_de.png +

    Abb. 2 Beschreibung der Bauteile

    +
    +
    +
    +

    Technische Spezifikation

    +

    Die technischen Spezifikationen für den rc_visard NG sind in Tab. 1 angegeben. Die Framerate für die Berechnung des Tiefenbilds in hoher Auflösung (High: 720 x 540 Pixel) ist signifikant höher, wenn der Minimale Abstand auf 1.2 Meter verringert werden kann.

    + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Tab. 1 Technische Spezifikation für den rc_visard NG
     rc_visard NG 160-6
    Bildauflösung1440 x 1080 Pixel, monochrom
    Sichtfeld
    +
    6 mm Objektiv: Horizontal: 43°, Vertikal: 33°
    +
    +
    IR Filter650 nm

    Tiefenbild (mit Minimalem

    +
    +
    Abstand von 0.5 m)
    +
    +
    1440 x 1080 Pixel (Full) bei 3 Hz
    +
    720 x 540 Pixel (High) bei 7 Hz
    +
    360 x 270 Pixel (Medium) bei 25 Hz
    +
    240 x 180 Pixel (Low) bei 25 Hz
    +
    +

    Tiefenbild (mit Minimalem

    +
    +
    Abstand von 1.2 m)
    +
    +
    1440 x 1080 Pixel (Full) bei 3 Hz
    +
    720 x 540 Pixel (High) bei 16 Hz
    +
    360 x 270 Pixel (Medium) bei 25 Hz
    +
    240 x 180 Pixel (Low) bei 25 Hz
    +
    +
    GPU/CPUOrin Nano 8GB
    Stromversorgung18–30 V
    KühlungPassiv
    Basisabstand160 mm
    Tiefenmessbereich0,5 m bis unendlich
    Abmessungen (B x H x L)230 mm x 75 mm x 84 mm
    Gewicht0,965 kg
    +

    Die folgende Tabelle zeigt die Auflösungen und Genauigkeiten bei verschiedenen Abständen.

    + + +++++ + + + + + + + + + + + + + + + + + + + + +
    Tab. 2 Auflösung und Genauigkeit des rc_visard NG in Millimetern, mit Stereo-Matching in voller Auflösung und Random-Dot-Projektion auf nicht-reflektierenden und nicht-transparenten Objekten.
     Abstand (mm)rc_visard NG 160-6
    laterale Auflösung (mm)
    +
    500
    +
    1000
    +
    2000
    +
    3000
    +
    +
    +
    0.3
    +
    0.6
    +
    1.1
    +
    1.7
    +
    +
    Tiefenauflösung (mm)
    +
    500
    +
    1000
    +
    2000
    +
    3000
    +
    +
    +
    0.05
    +
    0.2
    +
    0.9
    +
    2.0
    +
    +
    Mittlere Tiefengenauigkeit (mm)
    +
    500
    +
    1000
    +
    2000
    +
    3000
    +
    +
    +
    0.2
    +
    0.9
    +
    3.5
    +
    7.8
    +
    +
    +

    Der rc_visard NG kann für zusätzliche Funktionalitäten mit On-Board-Softwaremodulen ausgestattet werden. Diese Softwaremodule können bei Roboception bestellt werden und benötigen ein Lizenz-Update.

    +
    +_images/rc_visard_160_general.png +

    Abb. 3 Abmessungen des rc_visard NG 160

    +
    +

    CAD-Modelle des rc_visard NG können von der Roboception-Homepage heruntergeladen werden: http://www.roboception.com/download. Die CAD-Modelle werden nach bestem Wissen und Gewissen, aber ohne Garantie für die Richtigkeit bereitgestellt. Wird als Materialeigenschaft Aluminium zugewiesen (Dichte: \(2.76\mathrm{g\over{cm}^3}\)), weicht das CAD-Modell in Bezug auf Gewicht und Massenschwerpunkt nicht mehr als fünf Prozent und in Bezug auf das Trägheitsmoment nicht mehr als zehn Prozent vom Produkt ab.

    +
    +
    +

    Umwelt- und Betriebsbedingungen

    +

    Der rc_visard NG ist für industrielle Anwendungen konzipiert worden. Die in Tab. 3 angegebenen Umweltbedingungen für die Lagerung, den Transport und den Betrieb sind ausnahmslos einzuhalten.

    + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Tab. 3 Umweltbedingungen
     rc_visard NG
    Lager-/Transporttemperatur-25–70 °C
    Betriebstemperatur0–50 °C
    Relative Feuchte (nicht kondensierend)20–80 %
    Schwingungen5 g
    Erschütterungen50 g
    SchutzklasseIP 54
    Sonstiges
      +
    • Von korrosiven Flüssigkeiten oder Gasen fernhalten.
    • +
    • Von explosiven Flüssigkeiten oder Gasen fernhalten.
    • +
    • Von starken elektromagnetischen Störungen fernhalten.
    • +
    +
    +

    Der rc_visard NG ist für den Betrieb bei einer Umgebungstemperatur zwischen 0 und 50 °C ausgelegt und arbeitet mit konvektiver (passiver) Kühlung. Während der Verwendung muss, insbesondere im Bereich der Kühlrippen, ein ungehinderter Luftstrom sichergestellt sein. Der rc_visard NG sollte nur mithilfe der vorgesehenen mechanischen Montageschnittstelle montiert werden. Kein Teil des Gehäuses darf während des Betriebs abgedeckt werden. Das Gehäuse muss in alle Richtungen mindestens zehn Zentimeter Abstand zu angrenzenden Elementen haben und es ist ein ausreichender Luftaustausch mit der Umgebung nötig, um eine angemessene Kühlung sicherzustellen. Die Kühlrippen müssen frei von Schmutz und anderen Verunreinigungen gehalten werden.

    +

    Die Gehäusetemperatur richtet sich nach der Verarbeitungslast, der Sensororientierung und der Umgebungstemperatur. Erreichen die frei liegenden Gehäuseflächen des Sensors eine Temperatur von mehr als 60 °C, wechselt die LED von Grün auf Rot.

    +
    +

    Warnung

    +

    Für handgeführte Anwendungen sollte ein wärmeisolierter Griff am Sensor angebracht werden. So wird das bei Kontakt mit der 60 °C heißen Oberfläche bestehende Risiko für Brandverletzungen reduziert.

    +
    +
    +
    +

    Spezifikationen für die Stromversorgung

    +

    Der rc_visard NG muss an eine Gleichspannungsquelle angeschlossen werden. Der Lieferumfang des rc_visard NG umfasst standardmäßig kein Netzteil. Das im Anschlussset enthaltene Netzteil kann für die Ersteinrichtung verwendet werden. Der Kunde ist dafür verantwortlich, bei einer dauerhaften Installation für eine geeignete Gleichspannungsquelle zu sorgen. Jeder rc_visard NG muss an eine eigene Stromquelle angeschlossen werden. Der Anschluss an ein Gebäudenetz darf nur über ein Netzteil erfolgen, das gemäß EN55011 Klasse B zertifiziert ist.

    + + ++++++ + + + + + + + + + + + + + + + + + + + + + + +
    Tab. 4 Grenzwerte für die Stromversorgung
     MinimumBemessungswertMaximum
    Versorgungsspannung18 V24 V30 V
    Max. Leistungsaufnahme  25 W
    ÜberstromschutzSchutz der Stromversorgung mit einer 2-A-Sicherung
    +
    +

    Warnung

    +

    Die Überschreitung der maximalen Bemessungswerte kann zu Schäden am rc_visard NG, am Netzteil und an angeschlossener Ausrüstung führen.

    +
    +
    +

    Warnung

    +

    Jeder rc_visard NG muss von einem eigenen Netzteil versorgt werden.

    +
    +
    +

    Warnung

    +

    Der Anschluss an das Gebäudenetz darf nur über Netzteile erfolgen, die gemäß EN 55011 als Gerät der Klasse B zertifiziert sind.

    +
    +
    +
    +

    Verkabelung

    +

    Die Kabel sind nicht im Standardlieferumfang des rc_visard NG enthalten. Es obliegt dem Kunden, geeignete Kabel zu beschaffen. In Zubehör ist eine Übersicht über die empfohlenen Komponenten enthalten.

    +
    +

    Warnung

    +

    Die Richtlinien zum Kabelmanagement sind zwingend einzuhalten. Kabel sind immer mit einer Zugentlastung an der Halterung des rc_visard NG zu befestigen, sodass durch Kabelbewegungen keine Kräfte auf die M12-Anschlüsse des rc_visard NG wirken. Die verwendeten Kabel müssen lang genug sein, damit sich der rc_visard NG voll bewegen kann, ohne dass das Kabel zu stark belastet wird. Der minimale Biegeradius des Kabels muss beachtet werden.

    +
    +

    Der rc_visard NG besitzt eine industrielle, achtpolige M12-Buchse (A-kodiert) für die Ethernet-Verbindung und einen achtpoligen M12-Stecker (A-kodiert) für den Stromanschluss und die GPIO-Konnektivität. Beide Anschlüsse befinden sich an der Rückwand des Geräts. Die Lage der beiden Anschlüsse am rc_visard NG wird in Abb. 4 dargestellt.

    +
    +_images/rc_visard_connect_ng_de.png +

    Abb. 4 Lage der elektrischen Anschlüsse des rc_visard NG für die Ethernetverbindung (oben) und die Stromversorgung (unten)

    +
    +

    Die Anschlüsse sind so gedreht, dass die üblicherweise 90° abgewinkelten Stecker horizontal abgehen und von der Kamera (und den Kühlrippen) wegzeigen.

    +
    +_images/rc_visard_pinout_ng_de.png +

    Abb. 5 Steckerbelegung für den Strom- und Ethernetanschluss

    +
    +

    Die Steckerbelegung für den Ethernetanschluss ist in Abb. 6 angegeben.

    +
    +_images/ethernet_cable.png +

    Abb. 6 Steckerbelegung für die M12/Ethernet-Verkabelung

    +
    +

    Die Steckerbelegung für den Stromanschluss ist in Tab. 5 angegeben.

    + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Tab. 5 Steckerbelegung für den Stromanschluss
    Pos.Belegung
    1GPIO Eingang 2
    2Stromzufuhr
    3GPIO Eingang 1
    4GPIO Masse
    5GPIO Vcc
    6GPIO Ausgang 1 (Bildbelichtung)
    7Masse
    8GPIO Ausgang 2
    +

    Die GPIO-Signale werden über Optokoppler entkoppelt. GPIO Ausgang 1 bietet standardmäßig ein Signal zur Belichtungssynchronisierung und hat für die Dauer der Belichtung einen logischen HIGH-Pegel. Alle GPIOs können über das IOControl-Modul kontrolliert werden (IOControl und Projektor-Kontrolle). Pins von unbenutzten GPIOs sollten ungeerdet bleiben.

    +
    +

    Warnung

    +

    Es ist besonders wichtig, dass GPIO Eingang 1 während des Boot-Vorgangs ungeerdet oder auf LOW gesetzt ist. Der rc_visard NG fährt nicht hoch, wenn der Pin während des Boot-Vorgangs auf HIGH gesetzt ist.

    +
    +

    Das GPIO-Schaltschema und die zugehörigen Spezifikationen sind in Abb. 7 angegeben. Die maximale Spannung für GPIO Eingang und GPIO Vcc beträgt 30 V.

    +
    +_images/rc_visard_gpio.png +

    Abb. 7 GPIO-Schaltschema und zugehörige Spezifikationen: Keine Signale über 30 V anschließen!

    +
    +
    +

    Warnung

    +

    Schließen Sie keine Signale mit Spannungen über 30 V an den rc_visard NG an.

    +
    +
    +
    +

    Mechanische Schnittstelle

    +

    Der rc_visard NG verfügt an der Unterseite über eine Montageschnittstelle.

    +
    +_images/rc_visard_mounting_ng_de.png +

    Abb. 8 Montagepunkt für den Anschluss des rc_visard NG an Roboter oder andere Vorrichtungen

    +
    +

    Zur Fehlerbehebung sowie zu Konfigurationszwecken kann der Sensor über die am Koordinatenursprung angegebene, genormte Stativaufnahme (Gewinde: 1/4 Zoll x 20) montiert werden. Für dynamische Anwendungen, wie für die Montage an einem Roboterarm, muss der Sensor mit drei M4-8.8-Maschinenschrauben befestigt werden, die mit einem Drehmoment von 2,5 Nm anzuziehen und mit einer mittelfesten Gewindesicherung, wie Loctite 243, zu sichern sind. Die maximale Einschraubtiefe beträgt 6 mm. Die beiden Löcher mit einem Durchmesser von 4 mm können für Positionsstifte (ISO 2338 4 m6) verwendet werden, damit der Sensor präzise positioniert wird.

    +
    +

    Warnung

    +

    Für dynamische Anwendungen muss der rc_visard NG mit drei M4-8.8-Maschinenschrauben befestigt werden, die mit einem Drehmoment von 2,5 Nm anzuziehen und mit einer mittelfesten Gewindesicherung zu sichern sind. Es dürfen keine hochfesten Schrauben verwendet werden. Die Einschraubtiefe muss wenigstens 5 mm betragen.

    +
    +
    +
    +

    Koordinatensysteme

    +

    Der Ursprung des rc_visard NG-Koordinatensystems liegt in der Austrittspupille der linken Kameralinse. Dieses System wird auch als Sensor- oder Kamerakoordinatensystem bezeichnet. Die ungefähre Lage für den rc_visard NG wird auf dem nächsten Bild gezeigt.

    +

    Das Montagepunkt-Koordinatensystem für den rc_visard NG sitzt an der Unterseite, zentriert auf dem Gewinde, wobei die Ausrichtung der des Sensor-Koordinatensystems entspricht.

    +

    Abb. 9 zeigt den ungefähren Versatz.

    +
    +_images/rc_visard160_frames.png +

    Abb. 9 Ungefähre Position des Sensor-/Kamerakoordinatensystems (in der linken Kameralinse) und des Montagepunkt-Koordinatensystems (am Stativgewinde) für den rc_visard NG 160

    +
    +
    +

    Bemerkung

    +

    Der korrekte Versatz zwischen dem Sensor-/Kamerakoordinatensystem und einem Roboterkoordinatensystem kann über die Hand-Auge Kalibrierung bestimmt werden.

    +
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/http-routingtable.html b/v24.04/de/http-routingtable.html new file mode 100644 index 0000000..93aa104 --- /dev/null +++ b/v24.04/de/http-routingtable.html @@ -0,0 +1,948 @@ + + + + + + + + + + + HTTP Routing Table — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + + +

    HTTP Routing Table

    + +
    + /cad | + /logs | + /nodes | + /pipelines | + /system | + /templates | + /userspace +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    + /cad
    + GET /cad/gripper_elements +
    + GET /cad/gripper_elements/{id} +
    + PUT /cad/gripper_elements/{id} +
    + DELETE /cad/gripper_elements/{id} +
     
    + /logs
    + GET /logs +
    + GET /logs/{log} +
     
    + /nodes
    + GET /nodes +
    + GET /nodes/{node} +
    + GET /nodes/{node}/services +
    + GET /nodes/{node}/services/{service} +
    + GET /nodes/{node}/status +
    + PUT /nodes/{node}/services/{service} +
     
    + /pipelines
    + GET /pipelines/{pipeline}/nodes +
    + GET /pipelines/{pipeline}/nodes/{node} +
    + GET /pipelines/{pipeline}/nodes/{node}/parameters +
    + GET /pipelines/{pipeline}/nodes/{node}/parameters/{param} +
    + GET /pipelines/{pipeline}/nodes/{node}/services +
    + GET /pipelines/{pipeline}/nodes/{node}/services/{service} +
    + GET /pipelines/{pipeline}/nodes/{node}/status +
    + PUT /pipelines/{pipeline}/nodes/{node}/parameters +
    + PUT /pipelines/{pipeline}/nodes/{node}/parameters/{param} +
    + PUT /pipelines/{pipeline}/nodes/{node}/services/{service} +
     
    + /system
    + GET /system +
    + GET /system/backup +
    + GET /system/dns +
    + GET /system/license +
    + GET /system/network +
    + GET /system/network/settings +
    + GET /system/rollback +
    + GET /system/time +
    + GET /system/ui_lock +
    + GET /system/update +
    + POST /system/backup +
    + POST /system/license +
    + POST /system/ui_lock +
    + POST /system/update +
    + PUT /system/dns +
    + PUT /system/network/settings +
    + PUT /system/reboot +
    + PUT /system/rollback +
    + PUT /system/time +
    + DELETE /system/ui_lock +
     
    + /templates
    + GET /templates/rc_boxpick +
    + GET /templates/rc_boxpick/{id} +
    + GET /templates/rc_silhouettematch +
    + GET /templates/rc_silhouettematch/{id} +
    + PUT /templates/rc_boxpick/{id} +
    + PUT /templates/rc_silhouettematch/{id} +
    + DELETE /templates/rc_boxpick/{id} +
    + DELETE /templates/rc_silhouettematch/{id} +
     
    + /userspace
    + GET /userspace +
    + + +
    +
    + +
    +
    +
    + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/index.html b/v24.04/de/index.html new file mode 100644 index 0000000..e1b9cd8 --- /dev/null +++ b/v24.04/de/index.html @@ -0,0 +1,751 @@ + + + + + + + + + + + Roboception rc_visard NG Bedienungsanleitung — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + +
      + +
    • rc_visard NG >
    • + +
    • Roboception rc_visard NG Bedienungsanleitung
    • + + +
    • + + + +
    • + +
    + + +
    +
    +
    +
    + +
    +

    Roboception rc_visard NG Bedienungsanleitung

    +
    + +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/installation.html b/v24.04/de/installation.html new file mode 100644 index 0000000..0a707f2 --- /dev/null +++ b/v24.04/de/installation.html @@ -0,0 +1,766 @@ + + + + + + + + + + + Installation — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Installation

    +
    +

    Warnung

    +

    Vor Installation des Gerätes müssen die Hinweise zur Sicherheit des rc_visard NG gelesen und verstanden werden.

    +
    +

    Für den Anschluss an ein Computernetzwerk verfügt der rc_visard NG über eine Gigabit-Ethernet-Schnittstelle. Die gesamte Kommunikation mit dem Gerät wird über diese Schnittstelle abgewickelt. Der rc_visard NG besitzt zudem eine eigene Prozessierungseinheit, welche nach dem Starten des Geräts eine gewisse Zeit für den Boot-Vorgang benötigt.

    +
    +

    Softwarelizenz

    +

    Jeder rc_visard NG wird mit einer vorinstallierten Lizenzdatei zur Lizenzierung und zum Schutz der installierten Softwarepakete ausgeliefert. Die Lizenz ist an den spezifischen rc_visard NG gebunden und kann nicht auf andere Geräte übertragen oder mit diesen verwendet werden.

    +

    Die Funktionalität des rc_visard NG kann jederzeit durch ein Upgrade der Lizenz erweitert werden – zum Beispiel für zusätzlich erhältliche, optionale Softwaremodule.

    +
    +

    Bemerkung

    +

    Der rc_visard NG muss neu gestartet werden, sobald die Softwarelizenz geändert wurde.

    +
    +
    +

    Bemerkung

    +

    Der Status der Softwarelizenz kann über die verschiedenen Schnittstellen des rc_visard NG abgefragt werden, zum Beispiel über die Seite System ‣ Firmware & Lizenz in der Web GUI.

    +
    +
    +
    +

    Einschalten

    +
    +

    Bemerkung

    +

    Vergewissern Sie sich, bevor Sie die Stromzufuhr einschalten, dass der M12-Stromanschluss am rc_visard NG sicher befestigt ist.

    +
    +

    Sobald der rc_visard NG an den Strom angeschlossen ist, schaltet sich die LED an der Gerätefront ein. Während des Boot-Vorgangs ändert sich die Farbe der LED, bis sie schließlich grün leuchtet. Dies bedeutet, dass alle Prozesse laufen und der rc_visard NG einsatzbereit ist.

    +

    Ist kein Netzwerkkabel angeschlossen bzw. das Netzwerk nicht ordnungsgemäß konfiguriert, blinkt die LED alle fünf Sekunden rot. In diesem Fall muss die Netzwerkkonfiguration des Geräts überprüft werden. Für nähere Informationen zu den LED-Farbcodes siehe LED-Farben.

    +
    +
    +

    Aufspüren von rc_visard NG-Geräten

    +

    Roboception-rc_visard NG-Geräte, die eingeschaltet und mit dem lokalen Netzwerk oder direkt mit einem Computer verbunden sind, können über den Discover-Mechanismus von GigE Vision® ausfindig gemacht werden.

    +

    Das Open-Source-Tool rcdiscover-gui kann für Windows und Linux kostenlos heruntergeladen werden: https://github.com/roboception/rcdiscover/releases. Dieses Tool besteht für Windows 7, 10 und 11 aus einer einzigen ausführbaren Datei, die ohne Installation direkt ausgeführt werden kann. Für Linux ist ein Installationspaket für Ubuntu erhältlich.

    +

    Nach dem Start wird jedes verfügbare GigE Vision®-Gerät, und damit auch jeder verfügbare rc_visard NG, mit seinem Namen, seiner Seriennummer, der aktuellen IP-Adresse und der eindeutigen MAC-Adresse aufgelistet. Das Discovery-Tool findet alle Geräte, die sich über globale Broadcasts erreichen lassen. Es kann vorkommen, dass falsch konfigurierte Geräte aufgeführt werden, die anderen Subnetzen als dem des Computers angehören. Ein Häkchen im Discovery-Tool gibt an, ob ein Gerät richtig konfiguriert und damit auch über einen Webbrowser erreichbar ist.

    +
    +_images/typelabel_ng_de.png +

    Abb. 10 Typenschild des rc_visard NG mit Modellart, Seriennummer und MAC-Adresse

    +
    +
    +_images/rcdiscover_guiwin.png +

    Abb. 11 rcdiscover-gui-Tool zum Aufspüren angeschlossener GigE Vision®-Geräte

    +
    +

    Wurde das Gerät erfolgreich gefunden, öffnet sich nach einem Doppelklick auf den Geräteeintrag die Web GUI des Geräts im Standard-Browser des Betriebssystems. Wir empfehlen, Google Chrome oder Mozilla Firefox als Webbrowser zu verwenden.

    +
    +

    Zurücksetzen der Konfiguration

    +

    Ein falsch konfiguriertes Gerät lässt sich über die Schaltfläche Reset rc_visard im Discovery-Tool zurücksetzen. Der Rücksetzmechanismus ist jedoch nur in den ersten beiden Minuten nach dem Gerätestart verfügbar. Daher kann es sein, dass der rc_visard NG neu gestartet werden muss, um seine Konfiguration zurückzusetzen.

    +
    +_images/rcdiscover_reset.png +

    Abb. 12 Reset-Dialog des rcdiscover-gui-Tools

    +
    +

    Wird ein rc_visard NG trotz falscher Konfiguration vom Discovery-Mechanismus erkannt, kann er aus der rc_visard-Dropdown-Liste gewählt werden. Anderenfalls kann die auf dem rc_visard NG aufgedruckte MAC-Adresse manuell im vorgesehenen Feld eingegeben werden.

    +

    Nach Eingabe der MAC-Adresse kann aus vier Optionen gewählt werden:

    +
      +
    • Reset Parameters: Setzt alle Parameter des rc_visard NG, die über die Web GUI konfiguriert werden können (z.B. Bildwiederholrate), zurück.
    • +
    • Reset Network: Setzt die Netzwerkeinstellungen und den benutzerdefinierten Namen zurück.
    • +
    • Reset All: Setzt sowohl die rc_visard NG-Parameter als auch die Netzwerkeinstellungen und den benutzerdefinierten Namen zurück.
    • +
    • Switch Partitions: Ermöglicht es, einen Rollback vorzunehmen, siehe Wiederherstellung der vorherigen Firmware-Version.
    • +
    +

    Wird die LED weiß und das Gerät neu gestartet, war der Reset erfolgreich. Ist keine Reaktion erkennbar, war möglicherweise das zweiminütige Zeitfenster abgelaufen, sodass das Gerät neu gestartet werden muss.

    +
    +

    Bemerkung

    +

    Der Rücksetzmechanismus ist nur in den ersten beiden Minuten nach dem Gerätestart verfügbar.

    +
    +
    +
    +
    +

    Netzwerkkonfiguration

    +

    Für die Kommunikation mit anderen Netzwerkgeräten muss dem rc_visard NG eine Internet-Protokoll-Adresse (IP) zugewiesen werden. Jede IP-Adresse darf innerhalb des lokalen Netzwerks nur einmal vergeben werden. Sie kann entweder manuell mittels einer durch den Nutzer zugewiesenen persistenten (d.h. statischen) IP-Adresse festgelegt oder automatisch per DHCP zugewiesen werden. Ist keine der Methoden verfügbar oder aktiviert, greift der rc_visard NG auf eine Link-Local-Adresse zurück.

    +

    Nach dem GigE Vision®-Standard wird die Konfiguration der IP-Adresse in folgender Priorität und Reihenfolge durchgeführt:

    +
    +
      +
    1. Persistente IP (falls aktiviert)
    2. +
    3. DHCP (falls aktiviert)
    4. +
    5. Link-Local
    6. +
    +
    +
    +_images/ip_configuration_flowchart_ng_de.svg +

    Abb. 13 Flussdiagramm für die Auswahl der IP-Konfigurationsmethoden des rc_visard NG

    +
    +

    Zur Konfiguration der Netzwerkeinstellungen und IP-Adresse des rc_visard NG stehen folgende Möglichkeiten zur Verfügung:

    +
    +
      +
    • die Seite System ‣ Netzwerk der rc_visard NG-Web GUI – falls diese im lokalen Netzwerk bereits erreichbar ist, siehe Web GUI
    • +
    • alle Konfigurationsprogramme, welche mit GigE Vision® 2.0 kompatibel sind, oder das Roboception Kommandozeilenprogramm gc_config. Üblicherweise wird nach dem Start dieser Programme das Netzwerk nach allen verfügbaren GigE Vision®-Sensoren durchsucht. Alle rc_visard NG-Geräte können über ihre Seriennummer und MAC-Adresse, die beide auf dem Gerät aufgedruckt sind, eindeutig identifiziert werden.
    • +
    • das Roboception rcdiscover-gui-Tool, welches temporäre Änderungen oder das vollständige Zurücksetzen der Netzwerkkonfiguration des rc_visard NG erlaubt, siehe Aufspüren von rc_visard NG-Geräten
    • +
    +
    +
    +

    Bemerkung

    +

    Das Kommandozeilenprogramm gc_config ist Bestandteil der Roboception Open-Source-Bibliothek rc_genicam_api, welche kostenlos für Windows und Linux von folgender Seite heruntergeladen werden kann: http://www.roboception.com/download.

    +
    +
    +

    Host-Name

    +

    Der Host-Name des rc_visard NG basiert auf dessen Seriennummer, welche auf dem Gerät aufgedruckt ist, und lautet rc-visard-ng-<serial number>.

    +
    +
    +

    Automatische Konfiguration (werksseitige Voreinstellung)

    +

    Für die Zuweisung von IP-Adressen wird bevorzugt auf DHCP zugegriffen. Ist DHCP (werksseitige Voreinstellung auf dem rc_visard NG) aktiviert, versucht das Gerät, wann immer das Netzwerkkabel eingesteckt wird, einen DHCP-Server zu kontaktieren. Ist ein DHCP-Server im Netzwerk verfügbar, wird die IP-Adresse automatisch konfiguriert.

    +

    In einigen Netzwerken ist der DHCP-Server so konfiguriert, dass lediglich bekannte Geräte akzeptiert werden. In diesem Fall muss die auf dem Gerät aufgedruckte „Media Access Control“-Adresse, kurz MAC-Adresse, im DHCP-Server konfiguriert werden. Zudem ist der ebenfalls aufgedruckte Host-Name des rc_visard NG im Domain Name Server DNS einzustellen. Sowohl die MAC-Adresse als auch der Host-Name sind zu Konfigurationszwecken an den Netzwerkadministrator zu übermitteln.

    +

    Kann der rc_visard NG nicht innerhalb von 15 Sekunden nach dem Einschalten bzw. dem Einstecken des Netzwerkkabels Kontakt zu einem DHCP-Server aufbauen, versucht er, sich selbst eine eindeutige IP-Adresse zuzuweisen. Dieser Prozess heißt Link-Local. Diese Option ist besonders nützlich, wenn der rc_visard NG direkt an einen Computer angeschlossen werden soll. In diesem Fall muss auch der Computer mit einer Link-Local-Adresse konfiguriert sein. Bei manchen Betriebssystemen wie Windows 10 ist Link-Local bereits standardmäßig als Fallback eingestellt. Bei der Arbeit mit anderen Betriebssystemen, wie z.B. Linux, muss die Link-Local-Adresse direkt im Netzwerkmanager konfiguriert werden.

    +
    +
    +

    Manuelle Konfiguration

    +

    In einigen Fällen kann es nützlich sein, manuell eine persistente, d.h. statische IP-Adresse einzurichten. Diese wird auf dem rc_visard NG gespeichert und beim Systemstart bzw. beim Verbindungswiederaufbau zugewiesen. Bitte stellen Sie sicher, dass die Einstellungen der IP-Adresse, der Subnetz-Maske und des Default-Gateway keine Konflikte im Netzwerk verursachen.

    +
    +

    Warnung

    +

    Die IP-Adresse muss eindeutig sein und innerhalb des Gültigkeitsbereichs des lokalen Netzwerks liegen. Zudem muss die Subnetz-Maske dem lokalen Netzwerk entsprechen, da anderenfalls möglicherweise nicht auf den rc_visard NG zugegriffen werden kann. Dieses Problem lässt sich vermeiden, indem die unter Automatische Konfiguration (werksseitige Voreinstellung) beschriebene automatische Konfiguration genutzt wird.

    +
    +

    Kann die gewählte IP-Adresse nicht zugewiesen werden, zum Beispiel weil ein anderes Gerät im lokalen Netzwerk diese bereits verwendet, wird auf die automatische IP-Konfiguration mittels DHCP (falls aktiviert) oder Link-Local zurückgegriffen.

    +
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/interfaces.html b/v24.04/de/interfaces.html new file mode 100644 index 0000000..f8fac87 --- /dev/null +++ b/v24.04/de/interfaces.html @@ -0,0 +1,693 @@ + + + + + + + + + + + Schnittstellen — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Schnittstellen

    +

    Es stehen die folgenden Schnittstellen zur Konfiguration und Datenübertragung des rc_visard NG zur Verfügung:

    +
      +
    • Web GUI

      +
      +

      Leicht zu bedienendes grafisches Interface zum Konfigurieren und Kalibrieren des rc_visard NG, zum Anzeigen von Livebildern, Aufrufen von Services, Visualisieren von Ergebnissen, usw.

      +
      +
    • +
    • GigE Vision 2.0/GenICam-Schnittstelle

      +
      +

      Konfiguration bild- und kamerabezogener Einstellungen.

      +
      +
    • +
    • REST-API-Schnittstelle

      +
      +

      Programmierschnittstelle zur Konfiguration des rc_visard NG, zur Abfrage von Statusinformationen, zum Anfordern von Datenströmen, usw.

      +
      +
    • +
    + +
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/iocontrol.html b/v24.04/de/iocontrol.html new file mode 100644 index 0000000..889d160 --- /dev/null +++ b/v24.04/de/iocontrol.html @@ -0,0 +1,933 @@ + + + + + + + + + + + IOControl und Projektor-Kontrolle — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    IOControl und Projektor-Kontrolle

    +

    Das IOControl Modul ist ein Modul, welches intern auf dem rc_visard läuft.

    +

    Das IOControl-Modul ermöglicht das Lesen der digitalen Eingänge und die Kontrolle der digitalen Ausgänge (GPIOs) des rc_visard. Die Ausgänge können auf aus (LOW) oder an (HIGH) gesetzt werden. Sie können auch so konfiguriert werden, dass sie genau für die Belichtungszeit jedes Bildes, oder auch nur jedes zweiten Bildes, an sind.

    +

    Das IOControl-Modul dient der Ansteuerung einer externen Lichtquelle oder eines Projektors, der an einen der GPIO-Ausgänge des rc_visard angeschlossen wird, und der mit der Bildaufnahme synchronisiert ist. Für den Fall, dass ein Musterprojektor für die Verbesserung des Stereo-Matchings verwendet wird, ist das projizierte Muster auch in den Intensitätsbildern sichtbar. Das kann für Bildverarbeitungs-Anwendungen, die auf dem Intensitätsbild basieren (z.B. Kantendetektion), von Nachteil sein. Aus diesem Grund erlaubt das IOControl-Modul auch das Setzen der Ausgänge für nur jedes zweite Kamerabild. Somit sind auch Intensitätsbilder ohne projiziertes Muster verfügbar.

    +
    +

    Bemerkung

    +

    Details über die GPIOs des rc_visard NG werden in Verkabelung gegeben.

    +
    +
    +

    Parameter

    +

    Das IOControl-Modul wird in der REST-API als rc_iocontrol bezeichnet und in der Web GUI unter Konfiguration ‣ IOControl dargestellt. Der Benutzer kann die Parameter über die Web GUI, die REST-API (REST-API-Schnittstelle), oder die GenICam-Schnittstelle mit den DigitalIOControl-Parametern LineSelector und LineSource ändern (GigE Vision 2.0/GenICam-Schnittstelle).

    +
    +

    Übersicht über die Parameter

    +

    Dieses Softwaremodul bietet folgende Laufzeitparameter:

    + + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
    Tab. 46 Laufzeitparameter des rc_iocontrol-Moduls
    NameTypMin.Max.DefaultBeschreibung
    out1_modestring--LowOut1 mode: [Low, High, ExposureActive, ExposureAlternateActive]
    out2_modestring--LowOut2 mode: [Low, High, ExposureActive, ExposureAlternateActive]
    +
    +
    +

    Beschreibung der Laufzeitparameter

    +
    +

    out1_mode und out2_mode (Ausgang 1 (Out1) und Ausgang 2 (Out2))

    +
    +
    +

    Die Betriebsarten für GPIO-Ausgang 1 und GPIO-Ausgang 2 können individuell gesetzt werden:

    +

    Low schaltet den GPIO-Ausgang permanent aus (LOW). Das ist die Standardeinstellung.

    +

    High schaltet den GPIO-Ausgang permanent an (HIGH).

    +

    ExposureActive schaltet den GPIO-Ausgang für die Belichtungszeit jedes Bildes an (HIGH).

    +

    ExposureAlternateActive schaltet den GPIO-Ausgang für die Belichtungszeit jedes zweiten Bildes an (HIGH).

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_iocontrol/parameters/parameters?<out1_mode|out2_mode>=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_iocontrol/parameters?<out1_mode|out2_mode>=<value>
    +
    +
    +
    +
    +
    +

    Abb. 48 zeigt, welche Bilder für das Stereo-Matching und die GigE Vision-Übertragung in der Betriebsart ExposureActive mit einer benutzerdefinierten Bildwiederholrate von 8 Hz benutzt werden.

    +
    +_images/fps_exposure_ng_de.png +

    Abb. 48 Beispiel für die Nutzung der Betriebsart ExposureActive für GPIO-Ausgang 1 mit einer benutzerdefinierten Bildwiederholrate von 8 Hz. Die interne Bildaufnahme geschieht immer mit 25 Hz. GPIO-Ausgang 1 ist für die Dauer der Belichtungszeit jedes Bildes an (HIGH). Disparitätsbilder werden für Kamerabilder berechnet, die auch per GigE Vision in der benutzerdefinierten Bildwiederholrate versendet werden.

    +
    +

    Die Betriebsart ExposureAlternateActive ist gedacht, um einen externen Musterprojektor anzusteuern, der am GPIO-Ausgang 1 des rc_visard angeschlossen ist. In diesem Fall nutzt das Stereo-Matching-Modul nur Bilder, bei denen GPIO-Ausgang 1 an (HIGH) ist, d.h. der Projektor ist an. Die maximale Bildwiederholrate, welche für das Stereo-Matching genutzt wird, ist hierbei die halbe vom Benutzer konfigurierte Bildwiederholrate (siehe FPS). Alle Module, die Intensitätsbilder benutzen, wie z.B. TagDetect und ItemPick, benutzen die Intensitätsbilder, bei denen der GPIO-Ausgang 1 aus (LOW) ist, d.h. der Projektor ist aus. Abb. 49 zeigt ein Beispiel.

    +
    +_images/fps_alternate_ng_de.png +

    Abb. 49 Beispiel für die Nutzung der Betriebsart ExposureAlternateActive für GPIO-Ausgang 1 mit einer benutzerdefinierten Bildwiederholrate von 8 Hz. Die interne Bildaufnahme geschieht immer mit 25 Hz. GPIO-Ausgang 1 ist für die Dauer der Belichtungszeit jedes zweiten Bildes an (HIGH). Disparitätsbilder werden für Kamerabilder berechnet, bei denen GPIO-Ausgang 1 an (HIGH) ist, und die auch per GigE Vision in der benutzerdefinierten Bildwiederholrate versendet werden. In der Betriebsart ExposureAlternateActive werden Intensitätsbilder immer paarweise versendet: ein Bild mit GPIO-Ausgang 1 an (HIGH), für das ein Disparitätsbild verfügbar sein kann, und ein Bild mit GPIO-Ausgang 1 aus (LOW).

    +
    +
    +

    Bemerkung

    +

    In der Betriebsart ExposureAlternateActive gibt es zu einem Intensitätsbild mit angeschaltetem GPIO-Ausgang 1 (HIGH), d.h. mit projiziertem Muster, immer in 40 ms Abstand ein Intensitätsbild mit ausgeschaltetem GPIO-Ausgang 1 (LOW), d.h. ohne projiziertes Muster. Dies ist unabhängig von der benutzerdefinierten Bildwiederholrate und sollte in dieser speziellen Betriebsart für die Synchronisierung von Disparitäts- und projektionsfreien Kamerabildern berücksichtigt werden.

    +
    +

    Die Funktionalität kann auch über die DigitalIOControl-Parameter der GenICam Schnittstelle kontrolliert werden (GigE Vision 2.0/GenICam-Schnittstelle).

    +
    +
    +
    +
    +

    Services

    +

    Zusätzlich zur eigentlichen Serviceantwort gibt jeder Service einen sogenannten return_code bestehend aus einem Integer-Wert und einer optionalen Textnachricht zurück. Erfolgreiche Service-Anfragen werden mit einem Wert von 0 quittiert. Positive Werte bedeuten, dass die Service-Anfrage zwar erfolgreich bearbeitet wurde, aber zusätzliche Informationen zur Verfügung stehen. Negative Werte bedeuten, dass Fehler aufgetreten sind.

    +

    Dieses Softwaremodul bietet folgende Services.

    +
    +

    get_io_values

    +
    +

    Mit diesem Aufruf kann der aktuelle Zustand der Ein- und Ausgänge (GPIOs) des rc_visard abgefragt werden.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_iocontrol/services/get_io_values
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_iocontrol/services/get_io_values
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Das Feld timestamp ist der Zeitpunkt der Messung.

    +

    input_mask und output_mask sind Bitmasken, die definieren, welche Bits für die Werte der Eingänge bzw. Ausgänge verwendet werden.

    +

    values beinhaltet die Werte der Bits, die zu den in den Bitmasken input_mask` und output_mask definierten Eingängen und Ausgängen gehören.

    +

    Das Feld return_code enthält mögliche Warnungen oder Fehlercodes und Nachrichten. Mögliche Werte für return_code sind in der Tabelle unten angegeben.

    + ++++ + + + + + + + + + + + + + + + + +
    CodeBeschreibung
    0Erfolgreich
    -2Interner Fehler
    -9Lizenz für IOControl ist nicht verfügbar
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "get_io_values",
    +  "response": {
    +    "input_mask": "uint32",
    +    "output_mask": "uint32",
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    },
    +    "timestamp": {
    +      "nsec": "int32",
    +      "sec": "int32"
    +    },
    +    "values": "uint32"
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    reset_defaults

    +
    +

    stellt die Werkseinstellungen der Parameter dieses Moduls wieder her und wendet sie an („factory reset“).

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_iocontrol/services/reset_defaults
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_iocontrol/services/reset_defaults
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "reset_defaults",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/itempick.html b/v24.04/de/itempick.html new file mode 100644 index 0000000..d2ce1f9 --- /dev/null +++ b/v24.04/de/itempick.html @@ -0,0 +1,2772 @@ + + + + + + + + + + + ItemPick und BoxPick — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    ItemPick und BoxPick

    +
    +

    Einführung

    +

    Die ItemPick und BoxPick Module liefern eine gebrauchsfertige Perzeptionslösung, um robotische Pick-and-Place-Anwendungen zu realisieren. ItemPick detektiert ebene Oberflächen unbekannter Objekte für die Positionierung eines Sauggreifers. BoxPick erkennt rechteckige Oberflächen und bestimmt ihre Position, Orientierung und Größe für das Greifen. Mit der Textur-Erweiterung kann BoxPick zur Detektion von texturierten Rechtecken mit konsistenten Orientierungen verwendet werden. Da die Schnittstellen beider Module sehr ähnlich sind, werden sie in diesem Kapitel gemeinsam beschrieben.

    +

    Darüber hinaus bieten beide Module:

    +
      +
    • eine intuitiv gestaltete Bedienoberfläche für Inbetriebnahme, Konfiguration und Test auf der rc_visard NG Web GUI
    • +
    • die Möglichkeit, sogenannte Regions of Interest (ROIs) zu definieren, um relevante Teilbereiche der Szene auszuwählen (siehe RoiDB)
    • +
    • eine integrierte Load Carrier Erkennung (siehe LoadCarrier), um in Bin-Picking-Anwendungen („Griff in die Kiste“) Greifpunkte nur für Objekte in dem erkannten Load Carrier zu berechnen
    • +
    • die Unterstützung von Load Carriern mit Fächern, sodass Greifpunkte für Objekte nur in einem definierten Teilvolumen des Load Carriers berechnet werden
    • +
    • die Unterstützung von sowohl statisch montierten als auch robotergeführten Kameras. Optional kann es mit der Hand-Auge-Kalibrierung kombiniert werden, um Greifposen in einem benutzerdefinierten externen Koordinatensystem zu liefern.
    • +
    • einen Qualitätswert für jeden vorgeschlagenen Greifpunkt, der die Ebenheit der für das Greifen verfügbaren Oberfläche bewertet
    • +
    • Auswahl einer Strategie zum Sortieren der zurückgelieferten Greifpunkte
    • +
    • eine 3D Visualisierung des Detektionsergebnisses mit Greifpunkten und einer Greiferanimation in der Web GUI
    • +
    +
    +

    Bemerkung

    +

    In diesem Kapitel werden die Begriffe Cluster und Oberfläche synonym verwendet und bezeichnen eine Menge von Punkten (oder Pixeln) mit ähnlichen geometrischen Eigenschaften.

    +
    +

    Die ItemPick und BoxPick Module sind optional erhältliche Module, welche intern auf dem rc_visard NG laufen und gesonderte ItemPick- bzw. BoxPick-Lizenzen benötigen. Die Textur-Erweiterung von BoxPick bedarf einer separaten Lizenz.

    +
    +
    +

    Erkennung von Rechtecken (BoxPick)

    +

    Es gibt zwei verschiedene Typen von Objektmodellen für die Erkennung von Rechtecken im BoxPick Modul.

    +

    Standardmäßig unterstützt BoxPick nur Objektmodelle (item_models) des Typs (type) RECTANGLE. Mit der Textur-Erweiterung können auch Objektmodelle des Typs TEXTURED_BOX detektiert werden. Die Erkennung der verschiedenen Objektmodelltypen wird weiter unten beschrieben.

    +

    Optional können dem BoxPick-Modul folgende Informationen übergeben werden:

    +
      +
    • die ID des Load Carriers, welcher die Objekte enthält
    • +
    • ein Teilbereich innerhalb eines Load Carriers, in dem Objekte detektiert werden sollen
    • +
    • die ID der Region of Interest, innerhalb der nach dem Load Carrier gesucht wird, oder – falls kein Load Carrier angegeben ist – die Region of Interest, in der nach Objekten gesucht wird
    • +
    • die aktuelle Roboterpose, wenn die Kamera am Roboter montiert ist und als Koordinatensystem external gewählt wurde, oder die gewählte Region of Interest im externen Koordinatensystem definiert ist
    • +
    +

    Die zurückgegebene Pose pose eines detektierten Objekts item ist die Pose des Mittelpunkts des erkannten Rechtecks im gewünschten Koordinatensystem pose_frame, wobei die z-Achse in Richtung der Kamera zeigt und die x-Achse parallel zu langen Seite des Rechtecks ausgerichtet ist. Diese Pose hat eine 180° Mehrdeutigkeit in der Rotation um die z-Achse, welche durch Nutzung der Textur-Erweiterung im BoxPick Modul aufgelöst werden kann. Jedes erkannte Rechteck beinhaltet eine uuid (Universally Unique Identifier) und den Zeitstempel timestamp des ältesten Bildes, das für die Erkennung benutzt wurde.

    +
    +

    Erkennung von Objekten des Typs RECTANGLE (BoxPick)

    +

    Das BoxPick-Modul unterstützt mehrere Objektmodelle (item_models) vom Typ (type) Rechteck (RECTANGLE). Jedes Rechteck ist durch seine minimale und maximale Größe definiert, wobei die minimale Größe kleiner als die maximale Größe sein muss. Die Abmessungen sollten relativ genau angegeben werden, um Fehldetektionen zu verhindern, jedoch eine gewisse Toleranz beinhalten, um Messunsicherheiten und mögliche Produktionsabweichungen zu berücksichtigen.

    +

    Die Erkennung der Rechtecke läuft in mehreren Schritten ab. Zuerst wird die Punktwolke in möglichst ebene Segmente (Cluster) unterteilt. Dann werden gerade Liniensegmente in den 2D Bildern erkannt und auf die zugehörigen Clusterflächen projiziert. Die Cluster und die erkannten Linien werden in der „Zwischenergebnis“ Visualisierung auf der BoxPick Seite in der Web GUI angezeigt. Schließlich werden für jedes Cluster die am besten zu den erkannten Linien passenden Rechtecke extrahiert.

    +
    +
    +

    Erkennung von Objekten des Typs RECTANGLE (BoxPick+Match)

    +

    Mit der Textur-Erweiterung unterstützt BoxPick zusätzlich Objektmodelle (item_models) des Typs (type) TEXTURED_BOX. Wenn dieser Objektmodelltyp verwendet wird, kann nur ein einzelnes Objektmodell pro Anfrage angegeben werden.

    +

    Das TEXTURED_BOX Objektmodell sollte für die Detektion mehrerer Rechtecke mit gleicher Textur, d.h. gleichem Aussehen oder Aufdruck, verwendet werden, wie zum Beispiel bedruckte Produktverpackungen, Etiketten, Broschüren oder Bücher. Es wird vorausgesetzt, dass die Textur bei allen Objekten gleich positioniert ist in Bezug auf die Objektgeometrie. Weiterhin sollte die Textur nicht repetitiv sein.

    +

    Ein Objekt vom Typ TEXTURED_BOX wird definiert durch die exakten Abmessungen dimensions des Objekts in x, y und z (wobei z aktuell immer 0 sein muss) sowie eine Toleranz dimensions_tolerance_m die angibt, wie stark die Abmessungen der erkannten Rechtecke von den gegebenen Dimensionen abweichen dürfen. Als Standardwert wird eine Toleranz von 0.01 m angenommen. Des Weiteren muss eine template_id angegeben werden, über die die spezifizierten Abmessungen und die Texturen der erkannten Rechtecke referenziert werden. Zusätzlich können die maximal mögliche Verformung der Objekte (max_deformation_m) in Metern angegeben werden (Standardwert 0.004 m), um steifere oder flexiblere Objekte zu beschreiben.

    +

    Wird eine template_id zum ersten Mal verwendet, dann detektiert BoxPick die Rechtecke so wie für den Objektmodelltyp RECTANGLE beschrieben, und nutzt die angegebene Toleranz um den Abmessungsbereich für die Erkennung festzulegen. Aus den erkannten Rechtecken werden sogenannte Views erzeugt, die die Form und die Bildintensitätswerte der Rechtecke beinhalten, und werden in einem neu erzeugten Template mit der angegebenen template_id gespeichert. Die Views werden schrittweise erzeugt: Beginnend bei dem Rechteck mit dem höchsten Erkennungs-Score wird ein View erzeugt und direkt verwendet, um weitere Rechtecke mit derselben Textur zu finden. Dann werden in allen verbleibenden Clustern weitere Rechtecke mit den angegebenen Abmessungen detektiert und es wird wiederum aus dem besten Rechteck ein View generiert, der für weitere Erkennungen genutzt wird. Jedes Template kann bis zu 10 verschiedene Views speichern, zum Beispiel um verschiedene Sorten derselben Produktverpackung abzubilden. Jeder View hat eine eindeutige ID (view_uuid) und alle Rechtecke mit gleicher Textur erhalten dieselbe view_uuid. Das bedeutet auch, dass alle Objekte (items) mit derselben view_uuid konsistente Orientierungen haben, da die Orientierung jedes Objekts an der Textur ausgerichtet ist. Die Views können angezeigt und gelöscht werden, und ihre Orientierungen können über die Web GUI geändert werden, indem das Template oder sein Editierbutton in der Templateübersicht angeklickt wird. Jedes erkannte Objekt hat ein Feld view_pose_set, welches angibt, ob die Orientierung des zum Objekt zugeordneten Views explizit gesetzt wurde, oder ob sie unbestimmt in einem zufälligen Zustand ist, welcher eine 180° Mehrdeutigkeit hat. Der Typ type eines zurückgelieferten Objekts mit einer view_uuid lautet TEXTURED_RECTANGLE.

    +

    Wenn ein Template mit der angegebenen template_id bereits existiert, werden die vorhandenen Views verwendet, um Rechtecke anhand ihrer Textur zu erkennen. Wenn weitere Rechtecke gefunden werden, die ebenfalls passende Abmessungen haben, aber eine andere Textur, dann werden neue Views generiert und dem Template hinzugefügt. Wenn die maximale Anzahl Views erreicht ist, werden zu selten detektierte Views gelöscht, damit neu generierte Views dem Template hinzugefügt werden können, und das Template aktuell gehalten wird. Um zu verhindern, dass ein Template durch neue Views aktualisiert wird, kann das automatische Updaten der Views in der Web GUI aus- und eingeschaltet werden. Die Dimensionstoleranz dimensions_tolerance_m und die maximale Verformung max_deformation_m können dort ebenso für jedes Template geändert werden. Die maximale Verformung bestimmt die Toleranz für die Texturerkennung, die nötig ist, wenn sich durch flexible Objektoberflächen Teile der Textur relativ zueinander verschieben. Für steife Objekte sollte die maximale Verformung möglichst niedrig gesetzt werden, um eine hohe Erkennungsgenauigkeit zu erreichen.

    +

    Die Abmessungen dimensions des Templates können nur beim Erstellen eines neuen Templates angegeben werden. Sobald das Template erzeugt wurde, können die Abmessungen nicht mehr geändert werden und müssen beim Aufruf der Erkennung auch nicht angegeben werden. Wenn die Abmessungen dennoch beim Aufruf angegeben werden, müssen sie mit den Abmessungen im vorhandenen Template übereinstimmen. Die Toleranz dimensions_tolerance_m und die maximale Verformung max_deformation_m können jedoch für jeden Detektionsaufruf unterschiedlich angegeben werden und ihre Werte werden auch im gespeicherten Template entsprechend aktualisiert.

    +
    +
    +
    +

    Berechnung der Greifpunkte

    +

    Die ItemPick- und BoxPick-Module bieten einen Service, um Greifpunkte für Sauggreifer zu berechnen. Der Sauggreifer ist durch die Länge und Breite der Greiffläche definiert.

    +

    Das ItemPick-Modul identifiziert ebene Flächen in der Szene und unterstützt flexible und/oder deformierbare Objekte. Der Typ (type) dieser Objektmodelle (item_models) ist als unbekannt (UNKNOWN) definiert, da sie keine gebräuchliche geometrische Form aufweisen müssen. Optional kann eine minimale und maximale Größe angegeben werden.

    +

    Bei BoxPick werden die Greifpunkte auf den erkannten Rechtecken berechnet (siehe Erkennung von Rechtecken (BoxPick)).

    +

    Optional können den Modulen zu einer Greifpunktberechnung weitere Informationen übergeben werden:

    +
      +
    • die ID des Load Carriers, welcher die zu greifenden Objekte enthält
    • +
    • ein Unterabteil (load_carrier_compartment) innerhalb eines Load Carriers, in dem Objekte erkannt werden sollen (siehe Load Carrier Abteile).
    • +
    • die ID der 3D Region of Interest, innerhalb der nach dem Load Carrier gesucht wird, oder – falls kein Load Carrier angegeben ist – die 3D Region of Interest, innerhalb der Greifpunkte berechnet werden
    • +
    • Informationen für die Kollisionsprüfung: Die ID des Greifers, um die Kollisionsprüfung zu aktivieren, und optional ein Greif-Offset, der die Vorgreifposition definiert. Details zur Kollisionsprüfung sind in CollisionCheck gegeben.
    • +
    +

    Ein vom ItemPick- oder BoxPick-Modul ermittelter Greifpunkt repräsentiert die empfohlene Pose des TCP (Tool Center Point) des Sauggreifers. Der Greifpunkt type ist immer auf SUCTION gesetzt. Für jeden Greifpunkt liegt der Ursprung der Greifpose pose im Mittelpunkt der größten von der jeweiligen Greiffläche umschlossenen Ellipse. Die Orientierung des Greifpunkts ist ein rechtshändiges Koordinatensystem, sodass die z-Achse orthogonal zur Greiffläche in das zu greifende Objekt zeigt und die x-Achse entlang der längsten Ausdehnung ausgerichtet ist.

    +
    +_images/itempick_grasp_surface.png +

    Abb. 26 Veranschaulichung eines berechneten Greifpunktes mit Greifpose und der zugehörigen Ellipse, welche die Greiffläche bestmöglich beschreibt.

    +
    +

    Zusätzlich enthält jeder Greifpunkt die Abmessungen der maximal verfügbaren Greiffläche, die als Ellipse mit den Achslängen max_suction_surface_length und max_suction_surface_width beschrieben wird. Der Nutzer kann Greifpunkte mit zu kleinen Greifflächen herausfiltern, indem die minimalen Abmessungen der Greiffläche, die vom Sauggreifer benötigt wird, angegeben werden.

    +

    Im BoxPick-Modul entspricht der Greifpunkt dem Zentrum des detektierten Rechtecks, wobei die Achslängen der Greiffläche durch Länge und Breite des Rechtecks gegeben sind. Falls mehr als 15% der Rechtecksfläche ungültige Datenpunkte enthält oder durch andere Objekte verdeckt ist, wird dem Rechteck kein Greifpunkt zugeordnet.

    +

    Jeder Greifpunkt enthält auch einen Qualitätswert (quality), der einen Hinweis auf die Ebenheit der Greiffläche gibt. Dieser Wert reicht von 0 bis 1, wobei höhere Werte für eine ebenere rekonstruierte Oberfläche stehen.

    +

    Jeder berechnete Greifpunkt lässt sich anhand einer uuid (Universally Unique Identifier) eindeutig identifizieren und enthält zusätzlich den Zeitstempel der ältesten Bildaufnahme, auf der die Greifpunktberechnung durchgeführt wurde.

    +

    Die Sortierung der Greifpunkte basiert auf der ausgewählten Sortierstrategie. Folgende Sortierstrategien sind verfügbar und können über die Web GUI oder über den set_sorting_strategies Service gesetzt werden:

    +
      +
    • gravity: höchste Greifpunkte entlang der Gravitationsrichtung werden zuerst zurückgeliefert.
    • +
    • surface_area: Greifpunkte mit den größten Oberflächen werden zuerst zurückgeliefert.
    • +
    • direction: Greifpunkte mit dem kleinsten Abstand entlang der gesetzten Richtung vector im angegebenen Referenzkoordinatensystem pose_frame werden zuerst zurückgeliefert.
    • +
    +

    Wenn keine Sortierstrategie gesetzt ist, oder die Standard-Sortierstrategie in der Web GUI ausgewählt ist, geschieht die Sortierung der Greifpunkte basierend auf einer Kombination von gravity und surface_area.

    +
    +
    +

    Wechselwirkung mit anderen Modulen

    +

    Die folgenden, intern auf dem rc_visard NG laufenden Module liefern Daten für das ItemPick- und BoxPick-Modul oder haben Einfluss auf die Datenverarbeitung.

    +
    +

    Bemerkung

    +

    Jede Konfigurationsänderung dieser Module kann direkte Auswirkungen auf die Qualität oder das Leistungsverhalten der ItemPick- und Boxpick-Module haben.

    +
    +
    +

    Stereokamera und Stereo-Matching

    +

    Folgende Daten werden vom ItemPick- und BoxPick-Modul verarbeitet:

    +
      +
    • die rektifizierten Bilder des Kamera-Moduls (rc_camera)
    • +
    • die Disparitäts-, Konfidenz- und Fehlerbilder des Stereo-Matching-Moduls (rc_stereomatching)
    • +
    +

    Für alle genutzten Bilder ist garantiert, dass diese nach dem Auslösen des Services aufgenommen wurden.

    +
    +
    +

    IOControl und Projektor-Kontrolle

    +

    Für den Anwendungsfall, dass der rc_visard NG zusammen mit einem externen Musterprojektor und dem Modul für IOControl und Projektor-Kontrolle (rc_iocontrol) betrieben wird, wird empfohlen, den Projektor an GPIO Out 1 anzuschließen und den Aufnahmemodus des Stereokamera-Moduls auf SingleFrameOut1 zu setzen (siehe Stereomatching-Parameter), damit bei jedem Aufnahme-Trigger ein Bild mit und ohne Projektormuster aufgenommen wird.

    +

    Alternativ kann der verwendete digitale Ausgang in den Betriebsmodus ExposureAlternateActive geschaltet werden (siehe Beschreibung der Laufzeitparameter).

    +

    In beiden Fällen sollte die Belichtungszeitregelung (exp_auto_mode) auf AdaptiveOut1 gesetzt werden, um die Belichtung beider Bilder zu optimieren (siehe Stereokamera-Parameter).

    +
    +
    +

    Hand-Auge-Kalibrierung

    +

    Falls die Kamera zu einem Roboter kalibriert wurde, können die ItemPick- und BoxPick-Module automatisch Posen im Roboterkoordinatensystem ausgeben. Für die Services kann das Koordinatensystem der berechneten Posen mit dem Argument pose_frame spezifiziert werden.

    +

    Zwei verschiedene Werte für pose_frame können gewählt werden:

    +
      +
    1. Kamera-Koordinatensystem (camera): Alle Posen sind im Kamera-Koordinatensystem angegeben und es ist kein zusätzliches Wissen über die Lage der Kamera in seiner Umgebung notwendig. Das bedeutet insbesondere, dass sich ROIs oder Load Carrier, welche in diesem Koordinatensystem angegeben sind, mit der Kamera bewegen. Es liegt daher in der Verantwortung des Anwenders, in solchen Fällen die entsprechenden Posen der Situation entsprechend zu aktualisieren (beispielsweise für den Anwendungsfall einer robotergeführten Kamera).
    2. +
    3. Benutzerdefiniertes externes Koordinatensystem (external): Alle Posen sind im sogenannten externen Koordinatensystem angegeben, welches vom Nutzer während der Hand-Auge-Kalibrierung gewählt wurde. In diesem Fall bezieht das ItemPick- oder BoxPick-Modul alle notwendigen Informationen über die Kameramontage und die kalibrierte Hand-Auge-Transformation automatisch vom Modul Hand-Auge-Kalibrierung. Für den Fall einer robotergeführten Kamera ist vom Nutzer zusätzlich die jeweils aktuelle Roboterpose robot_pose anzugeben.
    4. +
    +
    +

    Bemerkung

    +

    Wenn keine Hand-Auge-Kalibrierung durchgeführt wurde bzw. zur Verfügung steht, muss als Referenzkoordinatensystem pose_frame immer camera angegeben werden.

    +
    +

    Zulässige Werte zur Angabe des Referenzkoordinatensystems sind camera und external. Andere Werte werden als ungültig zurückgewiesen.

    +

    Für den Fall einer robotergeführten Kamera ist es abhängig von pose_frame und der Sortierrichtung nötig, zusätzlich die aktuelle Roboterpose (robot_pose) zur Verfügung zu stellen:

    +
      +
    • Wenn external als pose_frame ausgewählt ist, ist die Angabe der Roboterpose obligatorisch.
    • +
    • Wenn die Sortierrichtung in external definiert ist, ist die Angabe der Roboterpose obligatorisch.
    • +
    • In allen anderen Fällen ist die Angabe der Roboterpose optional.
    • +
    +
    +
    +

    LoadCarrier

    +

    Die ItemPick- und BoxPick-Module nutzen die Funktionalität zur Load Carrier Erkennung aus dem LoadCarrier Modul (rc_load_carrier) mit den Laufzeitparametern, die für dieses Modul festgelegt wurden. Wenn sich jedoch mehrere Load Carrier in der Szene befinden, die zu der angegebenen Load Carrier ID passen, wird nur einer davon zurückgeliefert. In diesem Fall sollte eine 3D Region of Interest gesetzt werden, um sicherzustellen, dass immer derselbe Load Carrier für die ItemPick- und BoxPick-Module verwendet wird.

    +
    +
    +

    CollisionCheck

    +

    Die Kollisionsprüfung kann für die Greifpunktberechnung der ItemPick und BoxPick Module aktiviert werden, indem die ID des benutzten Greifers und optional ein Greif-Offset an den compute_grasps Service übergeben werden. Der Greifer muss im GripperDB Modul definiert werden (siehe Erstellen eines Greifers) und Details über die Kollisionsprüfung werden in Integrierte Kollisionsprüfung in anderen Modulen gegeben.

    +

    Wenn die Kollisionsprüfung aktiviert ist, werden nur kollisionsfreie Greifpunkte zurückgeliefert. Jedoch werden in den Visualisierungen auf der BoxPick- und ItemPick-Seite der Web GUI kollidierende Greifpunkte als schwarze Ellipsen dargestellt.

    +

    Die Laufzeitparameter des CollisionCheck-Moduls beeinflussen die Kollisionserkennung wie in CollisionCheck-Parameter beschrieben.

    +
    +
    +
    +

    Parameter

    +

    Die ItemPick- und BoxPick-Module werden in der REST-API als rc_itempick und rc_boxpick bezeichnet und in der Web GUI unter Module ‣ ItemPick und Module ‣ BoxPick dargestellt. Der Benutzer kann die Parameter entweder dort oder über die REST-API-Schnittstelle ändern.

    +
    +

    Übersicht über die Parameter

    +

    Diese Softwaremodule bieten folgende Laufzeitparameter:

    + + ++++++++ + + + + + + + + + + + + + + + + + + +
    Tab. 24 Anwendungsspezifische Laufzeitparameter der rc_itempick und rc_boxpick Module
    NameTypMin.Max.DefaultBeschreibung
    max_graspsint321205Maximale Anzahl von bereitgestellten Greifpunkten
    + + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Tab. 25 Laufzeitparameter der rc_itempick und rc_boxpick Module für das Clustering-Verfahren
    NameTypMin.Max.DefaultBeschreibung
    cluster_max_dimensionfloat640.050.80.3Nur für rc_itempick. Maximal erlaubter Durchmesser eines Clusters in Metern. Cluster mit einem größeren Durchmesser werden nicht für die Greifpunktberechnung berücksichtigt.
    cluster_max_curvaturefloat640.0050.50.11Maximal erlaubte Krümmung für Greifflächen
    clustering_patch_sizeint323104Nur für rc_itempick. Pixelgröße der Patches für die Unterteilung des Tiefenbildes im ersten Clustering-Schritt
    clustering_max_surface_rmsefloat640.00050.010.004Maximal erlaubte Abweichung (Root Mean Square Error, RMSE) von Punkten zur Greiffläche in Metern
    clustering_discontinuity_factorfloat640.15.01.0Erlaubte Unebenheit von Greifflächen
    + + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Tab. 26 Laufzeitparameter des rc_boxpick Moduls für die Rechteckerkennung
    NameTypMin.Max.DefaultBeschreibung
    modestring--UnconstrainedModus der Rechteckerkennung: [Unconstrained, PackedGridLayout, PackedLayers]
    manual_line_sensitivityboolfalsetruefalseGibt an, ob die benutzerdefinierte Linienempfindlichkeit oder die automatische genutzt werden soll
    line_sensitivityfloat640.11.00.1Empfindlichkeit des Liniendetektors
    prefer_splitsboolfalsetruefalseGibt an, ob Rechtecke in kleinere Rechtecke gesplittet werden sollen, falls möglich
    min_cluster_coveragefloat640.00.990.0Bestimmt den minimalen Anteil an Punkten pro Cluster, die durch Detektionen abgedeckt sein müssen
    +
    +
    +

    Beschreibung der Laufzeitparameter

    +

    Die Laufzeitparameter werden zeilenweise auf den ItemPick- bzw. BoxPick-Seiten in der Web GUI dargestellt. Im folgenden wird der Name des Parameters in der Web GUI in Klammern hinter dem eigentlichen Parameternamen angegeben. Die Parameter sind in derselben Reihenfolge wie in der Web GUI aufgelistet:

    +
    +

    max_grasps (Anzahl Greifpunkte)

    +
    +
    +

    ist die maximale Anzahl von bereitgestellten Greifpunkten.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/<rc_itempick|rc_boxpick>/parameters/parameters?max_grasps=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/<rc_itempick|rc_boxpick>/parameters?max_grasps=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    cluster_max_dimension (Nur für ItemPick, Maximale Größe)

    +
    +
    +

    is the maximum allowed diameter for a cluster in meters. Clusters with a diameter larger than this value are not used for grasp computation.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_itempick/parameters/parameters?cluster_max_dimension=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_itempick/parameters?cluster_max_dimension=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    cluster_max_curvature (Maximale Krümmung)

    +
    +
    +

    ist die maximal erlaubte Krümmung für Greifflächen. Je kleiner dieser Wert ist, desto mehr mögliche Greifflächen werden in kleinere Flächen mit weniger Krümmung aufgeteilt.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/<rc_itempick|rc_boxpick>/parameters/parameters?cluster_max_curvature=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/<rc_itempick|rc_boxpick>/parameters?cluster_max_curvature=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    clustering_patch_size (Nur für ItemPick, Patchgröße)

    +
    +
    +

    ist die Pixelgröße der Patches für die Unterteilung des Tiefenbildes im ersten Clustering-Schritt.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_itempick/parameters/parameters?clustering_patch_size=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_itempick/parameters?clustering_patch_size=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    clustering_discontinuity_factor (Unstetigkeitsfaktor)

    +
    +
    +

    beschreibt die erlaubte Unebenheit von Greifflächen. Je kleiner dieser Wert ist, umso mehr werden mögliche Greifflächen in kleinere Flächen mit weniger Unebenheiten aufgeteilt.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/<rc_itempick|rc_boxpick>/parameters/parameters?clustering_discontinuity_factor=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/<rc_itempick|rc_boxpick>/parameters?clustering_discontinuity_factor=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    clustering_max_surface_rmse (Maximaler RMSE)

    +
    +
    +

    ist die maximal erlaubte Abweichung (Root Mean Square Error, RMSE) von Punkten zur Greiffläche in Metern.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/<rc_itempick|rc_boxpick>/parameters/parameters?clustering_max_surface_rmse=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/<rc_itempick|rc_boxpick>/parameters?clustering_max_surface_rmse=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    mode (Nur für BoxPick, Modus)

    +
    +
    +

    legt den Modus der Rechteckerkennung fest. Mögliche Werte sind Unconstrained (Unbeschränkt), PackedGridLayout (Dichtes Gitterlayout) und PackedLayer (Dicht geschichtet). Im Modus PackedGridLayout werden Rechtecke eines Clusters in einem dichten Gittermuster erkannt. Im Modus PackedLayers wird angenommen, dass die Boxen Schichten (Layer) bilden, und die Erkennung der Boxen startet an den Ecken des Clusters. Dieser Modus sollte für Depalettierszenarien genutzt werden. Im Modus Unconstrained (Standardwert) werden Rechtecke unabhängig von ihren relativen Positionen zueinander und ihren Positionen im Cluster erkannt. Abb. 27 zeigt die Modi für verschiedene Szenarien.

    +
    +_images/boxpick_modes_new.svg +

    Abb. 27 Darstellung geeigneter BoxPick Modi für unterschiedliche Szenen. Gelb markierte Modi sind anwendbar, aber nicht empfohlen für das jeweilige Szenario. Die grauen Flächen markieren die Rechtecke, die erkannt werden sollen.

    +
    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_boxpick/parameters/parameters?mode=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_boxpick/parameters?mode=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    manual_line_sensitivity (Nur für BoxPick, Manuelle Linienempfindlichkeit)

    +
    +
    +

    legt fest, ob die benutzerdefinierte Linienempfindlichkeit für die Liniendetektion zur Rechteckerkennung verwendet werden soll. Wenn dieser Parameter auf true gesetzt ist, wird der benutzerdefinierte Wert in line_sensitivity (Linienempfindlichkeit) zur Detektion verwendet, andernfalls wird die Linienempfindlichkeit automatisch ermittelt. Dieser Parameter sollte auf true gesetzt werden, wenn die automatische Linienempfindlichkeit nicht genügend Linien an den Rändern der Boxen liefert, sodass Boxen nicht erkannt werden. Die detektierten Linien werden in der „Zwischenergebnis“ Visualisierung auf der BoxPick Seite in der Web GUI angezeigt.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_boxpick/parameters/parameters?manual_line_sensitivity=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_boxpick/parameters?manual_line_sensitivity=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    line_sensitivity (Nur für BoxPick, Linienempfindlichkeit)

    +
    +
    +

    legt die Empfindlichkeit für die Detektion von Linien für die Rechteckerkennung fest, wenn der Parameter manual_line_sensitivity (Manuelle Linienempfindlichkeit) auf true gesetzt ist. Andernfalls hat dieser Parameter keinen Einfluss auf die Rechteckerkennung. Höhere Werte liefern mehr Liniensegmente, aber erhöhen auch die Laufzeit der Detektion. Dieser Parameter sollte erhöht werden, wenn Boxen nicht erkannt werden können, weil ihre Ränder nicht als Linien detektiert werden. Die erkannten Linien werden in der „Zwischenergebnis“ Visualisierung auf der BoxPick Seite in der Web GUI angezeigt.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_boxpick/parameters/parameters?line_sensitivity=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_boxpick/parameters?line_sensitivity=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    prefer_splits (Nur für BoxPick, Splitting bevorzugen)

    +
    +
    +

    bestimmt, ob Rechtecke in kleinere Rechtecke aufgesplittet werden, falls die kleineren Rechtecke ebenfalls den angegebenen Objektmodellen entsprechen. Dieser Parameter sollte auf true gesetzt werden, wenn Boxen dicht beieinander liegen, und die Objektmodelle auch zu einem Rechteck der Größe von zwei angrenzenden Boxen passen. Wenn dieser Parameter auf false steht, werden in solch einem Fall die Rechtecke bevorzugt, die sich aus zwei angrenzenden Boxen ergeben.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_boxpick/parameters/parameters?prefer_splits=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_boxpick/parameters?prefer_splits=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    min_cluster_coverage (Nur für BoxPick, Minimale Clusterabdeckung)

    +
    +
    +

    bestimmt den Anteil von Punkten in jedem segmentierten Cluster, der durch Rechtecksdetektionen abgedeckt sein muss, um diese Detektionen als valide anzunehmen. Wird die minimale Clusterabdeckung unterschritten, werden für das jeweilige Cluster keine Detektionen zurückgeliefert und eine Warnung ausgegeben. Dieser Parameter sollte genutzt werden, um in einem Depalettierszenario zu verifizieren, dass alle Objekte in einem Layer detektiert wurden.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_boxpick/parameters/parameters?min_cluster_coverage=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_boxpick/parameters?min_cluster_coverage=<value>
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    Statuswerte

    +

    Statuswerte der rc_itempick und rc_boxpick Module:

    + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
    Tab. 27 Statuswerte der rc_itempick und rc_boxpick Module
    NameBeschreibung
    data_acquisition_timeZeit in Sekunden, für die beim letzten Aufruf auf Bilddaten gewartet werden musste.
    grasp_computation_timeLaufzeit für die Greifpunktberechnung beim letzten Aufruf in Sekunden
    last_timestamp_processedZeitstempel des letzten verarbeiteten Bilddatensatzes
    load_carrier_detection_timeLaufzeit für die letzte Load Carrier Erkennung in Sekunden
    processing_timeLaufzeit für die letzte Erkennung (einschließlich Load Carrier Detektion) in Sekunden
    stateAktueller Zustand des ItemPick- bzw. BoxPick-Moduls
    +

    Folgende state-Werte werden gemeldet.

    + + ++++ + + + + + + + + + + + + + + + + +
    Tab. 28 Mögliche Werte für den Zustand der ItemPick und BoxPick Module
    ZustandBeschreibung
    IDLEDas Modul ist inaktiv.
    RUNNINGDas Modul wurde gestartet und ist bereit, Load Carrier zu erkennen und Greifpunkte zu berechnen.
    FATALEin schwerwiegender Fehler ist aufgetreten.
    +
    +
    +

    Services

    +

    Die angebotenen Services von rc_itempick bzw. rc_boxpick können mithilfe der REST-API-Schnittstelle oder der rc_visard NG Web GUI ausprobiert und getestet werden.

    +

    Das ItemPick- bzw. BoxPick-Modul stellt folgende Services zur Verfügung.

    +
    +

    detect_items (nur BoxPick)

    +
    +

    löst die Erkennung von Rechtecken aus, wie in Erkennung von Rechtecken (BoxPick) beschrieben.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_boxpick/services/detect_items
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_boxpick/services/detect_items
    +
    +
    +
    +
    +
    + +
    +

    Obligatorische Serviceargumente:

    +
    +

    pose_frame: siehe Hand-Auge-Kalibrierung.

    +

    item_models: Liste der zu erkennenden Objektmodelle. Der Typ type der Modelle muss immer RECTANGLE oder TEXTURED_BOX sein. Für den Typ RECTANGLE muss das Feld rectangle gefüllt werden, wohingegen für TEXTURED_BOX das Feld textured_box angegeben werden muss. Siehe Erkennung von Rechtecken (BoxPick) für eine ausführliche Beschreibung der Objektmodelle.

    +
    +

    Möglicherweise benötigte Serviceargumente:

    +
    +
    robot_pose: siehe Hand-Auge-Kalibrierung.
    +

    Optionale Serviceargumente:

    +
    +

    load_carrier_id: ID des Load Carriers, welcher die zu erkennenden Objekte enthält.

    +

    load_carrier_compartment: Teilvolumen (Fach oder Abteil) in einem zu detektierenden Load Carrier (Behälter), in dem Objekte erkannt werden sollen (siehe Load Carrier Abteile).

    +

    region_of_interest_id: Falls load_carrier_id gesetzt ist, die ID der 3D Region of Interest, innerhalb welcher nach dem Load Carrier gesucht wird. Andernfalls die ID der 3D Region of Interest, in der nach Objekten gesucht wird.

    +
    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "item_models": [
    +      {
    +        "rectangle": {
    +          "max_dimensions": {
    +            "x": "float64",
    +            "y": "float64"
    +          },
    +          "min_dimensions": {
    +            "x": "float64",
    +            "y": "float64"
    +          }
    +        },
    +        "textured_box": {
    +          "dimensions": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "dimensions_tolerance_m": "float64",
    +          "max_deformation_m": "float64",
    +          "template_id": "string"
    +        },
    +        "type": "string"
    +      }
    +    ],
    +    "load_carrier_compartment": {
    +      "box": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "pose": {
    +        "orientation": {
    +          "w": "float64",
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "position": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        }
    +      }
    +    },
    +    "load_carrier_id": "string",
    +    "pose_frame": "string",
    +    "region_of_interest_id": "string",
    +    "robot_pose": {
    +      "orientation": {
    +        "w": "float64",
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "position": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      }
    +    }
    +  }
    +}
    +
    +
    +
    +
    +

    load_carriers: Liste der erkannten Load Carrier (Behälter).

    +

    items: Liste von erkannten Rechtecken.

    +

    timestamp: Zeitstempel des Bildes, auf dem die Erkennung durchgeführt wurde.

    +

    return_code: enthält mögliche Warnungen oder Fehlercodes und Nachrichten.

    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "detect_items",
    +  "response": {
    +    "items": [
    +      {
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "pose_frame": "string",
    +        "rectangle": {
    +          "x": "float64",
    +          "y": "float64"
    +        },
    +        "template_id": "string",
    +        "timestamp": {
    +          "nsec": "int32",
    +          "sec": "int32"
    +        },
    +        "type": "string",
    +        "uuid": "string",
    +        "view_pose_set": "bool",
    +        "view_uuid": "string"
    +      }
    +    ],
    +    "load_carriers": [
    +      {
    +        "height_open_side": "float64",
    +        "id": "string",
    +        "inner_dimensions": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "outer_dimensions": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "overfilled": "bool",
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "pose_frame": "string",
    +        "rim_ledge": {
    +          "x": "float64",
    +          "y": "float64"
    +        },
    +        "rim_step_height": "float64",
    +        "rim_thickness": {
    +          "x": "float64",
    +          "y": "float64"
    +        },
    +        "type": "string"
    +      }
    +    ],
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    },
    +    "timestamp": {
    +      "nsec": "int32",
    +      "sec": "int32"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    compute_grasps (für ItemPick)

    +
    +

    löst die Erkennung von Greifpunkten für einen Sauggreifer aus, wie in Berechnung der Greifpunkte beschrieben.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_itempick/services/compute_grasps
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_itempick/services/compute_grasps
    +
    +
    +
    +
    +
    + +
    +

    Obligatorische Serviceargumente:

    +
    +

    pose_frame: siehe Hand-Auge-Kalibrierung.

    +

    suction_surface_length: Länge der Greiffläche des verwendeten Vakuum-Greifsystems.

    +

    suction_surface_width: Breite der Greiffläche des verwendeten Vakuum-Greifsystems.

    +
    +

    Möglicherweise benötigte Serviceargumente:

    +
    +
    robot_pose: siehe Hand-Auge-Kalibrierung.
    +

    Optionale Serviceargumente:

    +
    +

    load_carrier_id: ID des Load Carriers, welcher die zu greifenden Objekte enthält.

    +

    load_carrier_compartment: Teilvolumen (Fach oder Abteil) in einem zu detektierenden Load Carrier (Behälter), in dem Objekte erkannt werden sollen (siehe Load Carrier Abteile).

    +

    region_of_interest_id: Falls load_carrier_id gesetzt ist, die ID der 3D Region of Interest, innerhalb welcher nach dem Load Carrier gesucht wird. Andernfalls die ID der 3D Region of Interest, innerhalb der Greifpunkte berechnet werden.

    +

    item_models: Liste von unbekannten Objekten mit minimaler und maximaler Größe, wobei die minimale Größe kleiner als die maximale Größe sein muss. Nur ein Objekt item_model vom Typ UNKNOWN wird aktuell unterstützt.

    +

    collision_detection: siehe Integrierte Kollisionsprüfung in anderen Modulen

    +
    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "collision_detection": {
    +      "gripper_id": "string",
    +      "pre_grasp_offset": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      }
    +    },
    +    "item_models": [
    +      {
    +        "type": "string",
    +        "unknown": {
    +          "max_dimensions": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "min_dimensions": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        }
    +      }
    +    ],
    +    "load_carrier_compartment": {
    +      "box": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "pose": {
    +        "orientation": {
    +          "w": "float64",
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "position": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        }
    +      }
    +    },
    +    "load_carrier_id": "string",
    +    "pose_frame": "string",
    +    "region_of_interest_id": "string",
    +    "robot_pose": {
    +      "orientation": {
    +        "w": "float64",
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "position": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      }
    +    },
    +    "suction_surface_length": "float64",
    +    "suction_surface_width": "float64"
    +  }
    +}
    +
    +
    +
    +
    +

    load_carriers: Liste der erkannten Load Carrier (Behälter).

    +

    grasps: sortierte Liste von Sauggreifpunkten.

    +

    timestamp: Zeitstempel des Bildes, auf dem die Erkennung durchgeführt wurde.

    +

    return_code: enthält mögliche Warnungen oder Fehlercodes und Nachrichten.

    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "compute_grasps",
    +  "response": {
    +    "grasps": [
    +      {
    +        "item_uuid": "string",
    +        "max_suction_surface_length": "float64",
    +        "max_suction_surface_width": "float64",
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "pose_frame": "string",
    +        "quality": "float64",
    +        "timestamp": {
    +          "nsec": "int32",
    +          "sec": "int32"
    +        },
    +        "type": "string",
    +        "uuid": "string"
    +      }
    +    ],
    +    "load_carriers": [
    +      {
    +        "height_open_side": "float64",
    +        "id": "string",
    +        "inner_dimensions": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "outer_dimensions": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "overfilled": "bool",
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "pose_frame": "string",
    +        "rim_ledge": {
    +          "x": "float64",
    +          "y": "float64"
    +        },
    +        "rim_step_height": "float64",
    +        "rim_thickness": {
    +          "x": "float64",
    +          "y": "float64"
    +        },
    +        "type": "string"
    +      }
    +    ],
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    },
    +    "timestamp": {
    +      "nsec": "int32",
    +      "sec": "int32"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    compute_grasps (für BoxPick)

    +
    +

    löst die Erkennung von Rechtecken und Berechnung von Greifposen für diese Rechtecke aus, wie in Berechnung der Greifpunkte beschrieben.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_boxpick/services/compute_grasps
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_boxpick/services/compute_grasps
    +
    +
    +
    +
    +
    + +
    +

    Obligatorische Serviceargumente:

    +
    +

    pose_frame: siehe Hand-Auge-Kalibrierung.

    +

    item_models: Liste der zu erkennenden Objektmodelle. Der Typ type der Modelle muss immer RECTANGLE oder TEXTURED_BOX sein. Für den Typ RECTANGLE muss das Feld rectangle gefüllt werden, wohingegen für TEXTURED_BOX das Feld textured_box angegeben werden muss. Siehe Erkennung von Rechtecken (BoxPick) für eine ausführliche Beschreibung der Objektmodelle.

    +

    suction_surface_length: Länge der Greiffläche des verwendeten Vakuum-Greifsystems.

    +

    suction_surface_width: Breite der Greiffläche des verwendeten Vakuum-Greifsystems.

    +
    +

    Möglicherweise benötigte Serviceargumente:

    +
    +
    robot_pose: siehe Hand-Auge-Kalibrierung.
    +

    Optionale Serviceargumente:

    +
    +

    load_carrier_id: ID des Load Carriers, welcher die zu greifenden Objekte enthält.

    +

    load_carrier_compartment: Teilvolumen (Fach oder Abteil) in einem zu detektierenden Load Carrier (Behälter), in dem Objekte erkannt werden sollen (siehe Load Carrier Abteile).

    +

    region_of_interest_id: Falls load_carrier_id gesetzt ist, die ID der 3D Region of Interest, innerhalb welcher nach dem Load Carrier gesucht wird. Andernfalls die ID der 3D Region of Interest, innerhalb der Greifpunkte berechnet werden.

    +

    collision_detection: siehe Integrierte Kollisionsprüfung in anderen Modulen

    +
    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "collision_detection": {
    +      "gripper_id": "string",
    +      "pre_grasp_offset": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      }
    +    },
    +    "item_models": [
    +      {
    +        "rectangle": {
    +          "max_dimensions": {
    +            "x": "float64",
    +            "y": "float64"
    +          },
    +          "min_dimensions": {
    +            "x": "float64",
    +            "y": "float64"
    +          }
    +        },
    +        "textured_box": {
    +          "dimensions": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "dimensions_tolerance_m": "float64",
    +          "max_deformation_m": "float64",
    +          "template_id": "string"
    +        },
    +        "type": "string"
    +      }
    +    ],
    +    "load_carrier_compartment": {
    +      "box": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "pose": {
    +        "orientation": {
    +          "w": "float64",
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "position": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        }
    +      }
    +    },
    +    "load_carrier_id": "string",
    +    "pose_frame": "string",
    +    "region_of_interest_id": "string",
    +    "robot_pose": {
    +      "orientation": {
    +        "w": "float64",
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "position": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      }
    +    },
    +    "suction_surface_length": "float64",
    +    "suction_surface_width": "float64"
    +  }
    +}
    +
    +
    +
    +
    +

    load_carriers: Liste der erkannten Load Carrier (Behälter).

    +

    items: Liste von erkannten Rechtecken.

    +

    grasps: sortierte Liste von Sauggreifpunkten.

    +

    timestamp: Zeitstempel des Bildes, auf dem die Erkennung durchgeführt wurde.

    +

    return_code: enthält mögliche Warnungen oder Fehlercodes und Nachrichten.

    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "compute_grasps",
    +  "response": {
    +    "grasps": [
    +      {
    +        "item_uuid": "string",
    +        "max_suction_surface_length": "float64",
    +        "max_suction_surface_width": "float64",
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "pose_frame": "string",
    +        "quality": "float64",
    +        "timestamp": {
    +          "nsec": "int32",
    +          "sec": "int32"
    +        },
    +        "type": "string",
    +        "uuid": "string"
    +      }
    +    ],
    +    "items": [
    +      {
    +        "grasp_uuids": [
    +          "string"
    +        ],
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "pose_frame": "string",
    +        "rectangle": {
    +          "x": "float64",
    +          "y": "float64"
    +        },
    +        "template_id": "string",
    +        "timestamp": {
    +          "nsec": "int32",
    +          "sec": "int32"
    +        },
    +        "type": "string",
    +        "uuid": "string",
    +        "view_pose_set": "bool",
    +        "view_uuid": "string"
    +      }
    +    ],
    +    "load_carriers": [
    +      {
    +        "height_open_side": "float64",
    +        "id": "string",
    +        "inner_dimensions": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "outer_dimensions": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "overfilled": "bool",
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "pose_frame": "string",
    +        "rim_ledge": {
    +          "x": "float64",
    +          "y": "float64"
    +        },
    +        "rim_step_height": "float64",
    +        "rim_thickness": {
    +          "x": "float64",
    +          "y": "float64"
    +        },
    +        "type": "string"
    +      }
    +    ],
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    },
    +    "timestamp": {
    +      "nsec": "int32",
    +      "sec": "int32"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    set_sorting_strategies

    +
    +

    speichert die gewählte Strategie zur Sortierung der Greifpunkte, die vom compute_grasps Service zurückgeliefert werden (siehe Berechnung der Greifpunkte).

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/<rc_itempick|rc_boxpick>/services/set_sorting_strategies
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/<rc_itempick|rc_boxpick>/services/set_sorting_strategies
    +
    +
    +
    +
    +
    + +
    +

    Nur eine Sortierstrategie darf einen Gewichtswert weight größer als 0 haben. Wenn alle Werte für weight auf 0 gesetzt sind, wird die Standardsortierstrategie verwendet.

    +

    Wenn der Wert weight für direction gesetzt ist, muss vector den Richtungsvektor enthalten und pose_frame auf camera oder external gesetzt sein.

    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "direction": {
    +      "pose_frame": "string",
    +      "vector": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "weight": "float64"
    +    },
    +    "gravity": {
    +      "weight": "float64"
    +    },
    +    "surface_area": {
    +      "weight": "float64"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "set_sorting_strategies",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    get_sorting_strategies

    +
    +

    gibt die gewählte Sortierstrategie zurück, die zur Sortierung der vom compute-grasps Service zurückgelieferten Greifpunkte verwendet wird (siehe Berechnung der Greifpunkte).

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/<rc_itempick|rc_boxpick>/services/get_sorting_strategies
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/<rc_itempick|rc_boxpick>/services/get_sorting_strategies
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Wenn alle Werte für weight 0 sind, wird die Standardsortierstrategie verwendet.

    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "get_sorting_strategies",
    +  "response": {
    +    "direction": {
    +      "pose_frame": "string",
    +      "vector": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "weight": "float64"
    +    },
    +    "gravity": {
    +      "weight": "float64"
    +    },
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    },
    +    "surface_area": {
    +      "weight": "float64"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    start

    +
    +

    startet das Modul und versetzt es in den Zustand RUNNING.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/<rc_itempick|rc_boxpick>/services/start
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/<rc_itempick|rc_boxpick>/services/start
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Es kann vorkommen, dass der Zustandsübergang noch nicht vollständig abgeschlossen ist, wenn die Serviceantwort generiert wird. In diesem Fall liefert diese den entsprechenden, sich von IDLE unterscheidenden Zustand zurück.

    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "start",
    +  "response": {
    +    "accepted": "bool",
    +    "current_state": "string"
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    stop

    +
    +

    stoppt das Modul und versetzt es in den Zustand IDLE.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/<rc_itempick|rc_boxpick>/services/stop
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/<rc_itempick|rc_boxpick>/services/stop
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Es kann vorkommen, dass der Zustandsübergang noch nicht vollständig abgeschlossen ist, wenn die Serviceantwort generiert wird. In diesem Fall liefert diese den entsprechenden, sich von IDLE unterscheidenden Zustand zurück.

    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "stop",
    +  "response": {
    +    "accepted": "bool",
    +    "current_state": "string"
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    reset_defaults

    +
    +

    stellt die Werkseinstellungen der Parameter und der Sortierstrategie dieses Moduls wieder her und wendet sie an („factory reset“).

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/<rc_itempick|rc_boxpick>/services/reset_defaults
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/<rc_itempick|rc_boxpick>/services/reset_defaults
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "reset_defaults",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    set_region_of_interest (veraltet)

    +
    +

    speichert eine 3D Region of Interest auf dem rc_visard NG.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie stattdessen set_region_of_interest in rc_roi_db.
    +
    +
    PUT http://<host>/api/v1/nodes/<rc_itempick|rc_boxpick>/services/set_region_of_interest
    +
    +
    +
    +
    +
    +
    +
    +
    +

    get_regions_of_interest (veraltet)

    +
    +

    gibt die mit region_of_interest_ids spezifizierten, gespeicherten 3D Regions of Interest zurück.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie stattdessen get_regions_of_interest in rc_roi_db.
    +
    +
    PUT http://<host>/api/v1/nodes/<rc_itempick|rc_boxpick>/services/get_regions_of_interest
    +
    +
    +
    +
    +
    +
    +
    +
    +

    delete_regions_of_interest (veraltet)

    +
    +

    löscht die mit region_of_interest_ids spezifizierten, gespeicherten 3D Regions of Interest.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie stattdessen delete_regions_of_interest in rc_roi_db.
    +
    +
    PUT http://<host>/api/v1/nodes/<rc_itempick|rc_boxpick>/services/delete_regions_of_interest
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    Rückgabecodes

    +

    Zusätzlich zur eigentlichen Serviceantwort gibt jeder Service einen sogenannten return_code bestehend aus einem Integer-Wert und einer optionalen Textnachricht zurück. Erfolgreiche Service-Anfragen werden mit einem Wert von 0 quittiert. Positive Werte bedeuten, dass die Service-Anfrage zwar erfolgreich bearbeitet wurde, aber zusätzliche Informationen zur Verfügung stehen. Negative Werte bedeuten, dass Fehler aufgetreten sind. Für den Fall, dass mehrere Rückgabewerte zutreffend wären, wird der kleinste zurückgegeben, und die entsprechenden Textnachrichten werden in return_code.message akkumuliert.

    +

    Die folgende Tabelle listet die möglichen Rückgabe-Codes auf:

    + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Tab. 29 Rückgabecodes der Services des ItemPick- bzw. BoxPick-Moduls
    CodeBeschreibung
    0Erfolgreich
    -1Ungültige(s) Argument(e)
    -3Ein interner Timeout ist aufgetreten, beispielsweise während der Boxerkennung, wenn der Bereich der angegebenen Abmessungen zu groß ist.
    -4Die maximal erlaubte Zeitspanne für die interne Akquise der Bilddaten wurde überschritten.
    -8Das Template wurde während der Detektion gelöscht.
    -10Das neue Element konnte nicht hinzugefügt werden, da die maximal speicherbare Anzahl an Load Carriern, ROIs oder Templates überschritten wurde.
    -11Sensor nicht verbunden, nicht unterstützt oder nicht bereit
    -200Ein schwerwiegender interner Fehler ist aufgetreten.
    -301Für die Anfrage zur Greifpunktberechnung compute_grasps wurden mehrere Objektmodelle (item_models) vom Typ UNKNOWN übergeben.
    10Die maximal speicherbare Anzahl an Load Carriern, ROIs oder Templates wurde erreicht.
    11Mit dem Aufruf von set_load_carrier oder set_region_of_interest wurde ein bereits existierendes Objekt mit derselben id überschrieben.
    100Die angefragten Load Carrier wurden in der Szene nicht gefunden.
    101Es wurden keine gültigen Greifflächen in der Szene gefunden.
    102Der detektierte Load Carrier ist leer.
    103Alle berechneten Greifpunkte sind in Kollision mit dem Load Carrier.
    112Die Detektionen eines oder mehrerer Cluster wurden verworfen, da die minimale Clusterabdeckung nicht erreicht wurde.
    300Ein gültiges robot_pose-Argument wurde angegeben, ist aber nicht erforderlich.
    999Zusätzliche Hinweise für die Anwendungsentwicklung
    +
    +
    +

    BoxPick Template API“

    +

    BoxPick Templates sind nur mit der Textur-Erweiterung von BoxPick verfügbar. Für den Upload, Download, das Auflisten und Löschen von Templates werden spezielle REST-API-Endpunkte zur Verfügung gestellt. Templates können auch über die Web GUI hoch- und runtergeladen werden. Die Templates beinhalten die Greifpunkte und Posenvorgaben, falls Greifpunkte oder Posenvorgaben konfiguriert wurden. Bis zu 50 Templates können gleichzeitig auf dem rc_visard NG gespeichert werden.

    +
    +
    +GET /templates/rc_boxpick
    +

    listet alle rc_cadmatch-Templates auf.

    +

    Musteranfrage

    +
    GET /api/v2/templates/rc_boxpick HTTP/1.1
    +
    +
    +

    Musterantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +[
    +  {
    +    "id": "string"
    +  }
    +]
    +
    +
    + +++ + + + + + + + + +
    Antwort-Header: +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabewert: Array der Templates)
    • +
    • 404 Not Found – Modul nicht gefunden
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +GET /templates/rc_boxpick/{id}
    +

    ruft ein rc_boxpick-Template ab. Falls der angefragte Content-Typ application/octet-stream ist, wird das Template als Datei zurückgegeben.

    +

    Musteranfrage

    +
    GET /api/v2/templates/rc_boxpick/<id> HTTP/1.1
    +
    +
    +

    Musterantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "id": "string"
    +}
    +
    +
    + +++ + + + + + + + + + + +
    Parameter:
      +
    • id (string) – ID des Templates (obligatorisch)
    • +
    +
    Antwort-Header:
      +
    • Content-Type – application/json application/ubjson application/octet-stream
    • +
    +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabewert: Template)
    • +
    • 404 Not Found – Modul oder Template wurden nicht gefunden.
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +PUT /templates/rc_boxpick/{id}
    +

    erstellt oder aktualisiert ein rc_boxpick-Template.

    +

    Musteranfrage

    +
    PUT /api/v2/templates/rc_boxpick/<id> HTTP/1.1
    +Accept: multipart/form-data application/json
    +
    +
    +

    Musterantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "id": "string"
    +}
    +
    +
    + +++ + + + + + + + + + + + + + + + +
    Parameter:
      +
    • id (string) – ID des Templates (obligatorisch)
    • +
    +
    Formularparameter:
     
      +
    • file – Template-Datei (obligatorisch)
    • +
    +
    Anfrage-Header:
      +
    • Accept – multipart/form-data application/json
    • +
    +
    Antwort-Header: +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabewert: Template)
    • +
    • 400 Bad Request – Template ist ungültig oder die maximale Zahl an Templates wurde erreicht.
    • +
    • 403 Forbidden – Verboten, z.B. weil keine gültige Lizenz für das CADMatch-Modul vorliegt.
    • +
    • 404 Not Found – Modul oder Template wurden nicht gefunden.
    • +
    • 413 Request Entity Too Large – Template ist zu groß.
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +DELETE /templates/rc_boxpick/{id}
    +

    entfernt ein rc_boxpick-Template.

    +

    Musteranfrage

    +
    DELETE /api/v2/templates/rc_boxpick/<id> HTTP/1.1
    +Accept: application/json application/ubjson
    +
    +
    + +++ + + + + + + + + + +
    Parameter:
      +
    • id (string) – ID des Templates (obligatorisch)
    • +
    +
    Anfrage-Header:
      +
    • Accept – application/json application/ubjson
    • +
    +
    Antwort-Header: +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung
    • +
    • 403 Forbidden – Verboten, z.B. weil keine gültige Lizenz für das CADMatch-Modul vorliegt.
    • +
    • 404 Not Found – Modul oder Template wurden nicht gefunden.
    • +
    +
    +
    + +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/loadcarrier.html b/v24.04/de/loadcarrier.html new file mode 100644 index 0000000..79b28db --- /dev/null +++ b/v24.04/de/loadcarrier.html @@ -0,0 +1,1649 @@ + + + + + + + + + + + LoadCarrier — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    LoadCarrier

    +
    +

    Einleitung

    +

    Das LoadCarrier Modul ermöglicht die Erkennung von Load Carriern, was oftmals der erste Schritt für die Erkennung von Objekten oder Berechnung von Greifpunkten in einem Behälter ist. Die Modelle der zu erkennenden Load Carrier müssen im LoadCarrierDB Modul definiert werden.

    +

    Das LoadCarrier Modul ist ein optionales Modul, welches intern auf dem rc_visard NG läuft, und ist freigeschaltet, sobald eine gültige Lizenz für eines der Module ItemPick und BoxPick oder SilhouetteMatch vorhanden ist. Andernfalls benötigt es eine gesonderte LoadCarrier Lizenz, welche erworben werden muss.

    +
    +
    +

    Erkennung von Load Carriern

    +

    Der Algorithmus zur Erkennung von Load Carriern detektiert Load Carrier, die einem speziellen Load Carrier Modell entsprechen, welches im LoadCarrierDB Modul definiert werden muss. Das Load Carrier Modell wird über seine ID referenziert, die bei der Load Carrier Detektion übergeben wird. Die Erkennung von Load Carriern basiert auf der Erkennung des rechteckigen Load Carrier Rands. Dazu werden detektierte Linien im linken Kamerabild und die Tiefenwerte des Load Carrier Randes genutzt. Daher sollte der Rand einen Kontrast zum Hintergrund bilden und das Disparitätsbild auf dem Rand dicht sein.

    +

    Wenn mehrere Load Carrier mit der angegeben Load Carrier ID in der Szene sichtbar sind, werden alle von ihnen detektiert und zurückgeliefert.

    +

    Standardmäßig, wenn assume_gravity_aligned aktiv ist und Gravitationsmessungen verfügbar sind, wird nach Load Carriern gesucht, deren Randebene senkrecht zur gemessenen Gravitationsrichtung ausgerichtet ist. Um geneigte Load Carrier zu erkennen, muss assume_gravity_aligned deaktiviert werden oder deren ungefähre Orientierung als Pose pose in einem Referenzkoordinatensystem pose_frame angegeben werden, und der Posentyp pose_type auf ORIENTATION_PRIOR gesetzt werden.

    +

    Load Carrier können höchstens bis zu einer Entfernung von 3 Metern von der Kamera erkannt werden.

    +

    Wenn eine 3D Region of Interest (siehe RoiDB) genutzt wird, um das Volumen für die Load Carrier Erkennung einzuschränken, müssen nur die Ränder der Load Carrier vollständig in der Region of Interest enthalten sein.

    +

    Die Erkennung liefert die Posen der Load Carrier Koordinatensysteme (siehe Load Carrier Definition) im gewünschten Referenzkoordinatensystem zurück.

    +

    Bei der Erkennung wird auch ermittelt, ob die Load Carrier überfüllt (overfilled) sind, was bedeutet, dass Objekte aus dem Load Carrier herausragen.

    +
    +_images/itempick_load_carrier_reference_rim_sidebyside.svg +

    Abb. 19 Illustration verschiedener Load Carrier Modelle und deren Koordinatensysteme

    +
    +
    +
    +

    Füllstandserkennung

    +

    Das LoadCarrier Modul bietet den Service detect_filling_level an, um den Füllstand aller erkannten Load Carrier zu berechnen.

    +

    Dazu werden die Load Carrier in eine konfigurierbare Anzahl von Zellen unterteilt, welche in einem 2D-Raster angeordnet sind. Die maximale Anzahl der Zellen beträgt 10x10. Für jede Zelle werden folgende Werte ermittelt:

    +
      +
    • level_in_percent: Minimum, Maximum und Mittelwert des Füllstands vom Boden in Prozent. Diese Werte können größer als 100% sein, falls die Zelle überfüllt ist.
    • +
    • level_free_in_meters: Minimum, Maximum und Mittelwert in Metern des freien Teils der Zelle vom Rand des Load Carriers gemessen. Diese Werte können negativ sein, falls die Zelle überfüllt ist.
    • +
    • cell_size: Abmessungen der 2D-Zelle in Metern.
    • +
    • cell_position: Position des Mittelpunkts der Zelle in Metern (entweder im Koordinatensystem camera oder external, siehe Hand-Auge-Kalibrierung). Die z-Koordinate liegt auf der Ebene des Load Carrier Randes.
    • +
    • coverage: Anteil der gültigen Pixel in dieser Zelle. Dieser Wert reicht von 0 bis 1 in Schritten von 0.1. Ein niedriger Wert besagt, dass die Zelle fehlende Daten beinhaltet (d.h. nur wenige Punkte konnten in der Zelle gemessen werden).
    • +
    +

    Diese Werte werden auch für den gesamten Load Carrier berechnet. Falls keine Zellunterteilung angegeben ist, wird nur der Gesamtfüllstand (overall_filling_level) berechnet.

    +
    +_images/itempick_lc_filling_level.png +

    Abb. 20 Visualisierungen des Behälterfüllstands: Gesamtfüllstand ohne Raster (links), 4x3 Raster (Mitte), 8x8 Raster (rechts). Der Inhalt wird mit einem Farbverlauf von weiß (auf dem Boden) nach dunkelgrün dargestellt. Die überfüllten Bereiche sind rot dargestellt. Die Nummern stellen die Zell-IDs dar.

    +
    +
    +
    +

    Wechselwirkung mit anderen Modulen

    +

    Die folgenden, intern auf dem rc_visard NG laufenden Module liefern Daten für das LoadCarrier Modul oder haben Einfluss auf die Datenverarbeitung.

    +
    +

    Bemerkung

    +

    Jede Konfigurationsänderung dieser Module kann direkte Auswirkungen auf die Qualität oder das Leistungsverhalten des LoadCarrier Moduls haben.

    +
    +
    +

    Stereokamera und Stereo-Matching

    +

    Folgende Daten werden vom LoadCarrier Modul verarbeitet:

    +
      +
    • Die rektifizierten Bilder des Kamera-Moduls (rc_camera);
    • +
    • Die Disparitäts-, Konfidenz- und Fehlerbilder des Stereo-Matching-Moduls (rc_stereomatching).
    • +
    +

    Für alle genutzten Bilder ist garantiert, dass diese nach dem Auslösen des Services aufgenommen wurden.

    +
    +
    +

    IOControl und Projektor-Kontrolle

    +

    Für den Anwendungsfall, dass der rc_visard NG zusammen mit einem externen Musterprojektor und dem Modul für IOControl und Projektor-Kontrolle (rc_iocontrol) betrieben wird, wird empfohlen, den Projektor an GPIO Out 1 anzuschließen und den Aufnahmemodus des Stereokamera-Moduls auf SingleFrameOut1 zu setzen (siehe Stereomatching-Parameter, damit bei jedem Aufnahme-Trigger ein Bild mit und ohne Projektormuster aufgenommen wird.

    +

    Alternativ kann der verwendete digitale Ausgang in den Betriebsmodus ExposureAlternateActive geschaltet werden (siehe Beschreibung der Laufzeitparameter).

    +

    In beiden Fällen sollte die Belichtungszeitregelung (exp_auto_mode) auf AdaptiveOut1 gesetzt werden, um die Belichtung beider Bilder zu optimieren (siehe Stereokamera-Parameter.

    +

    Darüber hinaus sind keine weiteren Änderungen für diesen Anwendungsfall notwendig.

    +
    +
    +

    Hand-Auge-Kalibrierung

    +

    Falls die Kamera zu einem Roboter kalibriert wurde, kann die Load Carrier Komponente automatisch Posen im Roboterkoordinatensystem ausgeben. Für die Services kann das Koordinatensystem der berechneten Posen mit dem Argument pose_frame spezifiziert werden.

    +

    Zwei verschiedene Werte für pose_frame können gewählt werden:

    +
      +
    1. Kamera-Koordinatensystem (camera): Alle Posen sind im Kamera-Koordinatensystem angegeben und es ist kein zusätzliches Wissen über die Lage der Kamera in seiner Umgebung notwendig. Das bedeutet insbesondere, dass sich Load Carrier, welche in diesem Koordinatensystem angegeben sind, mit der Kamera bewegen. Es liegt daher in der Verantwortung des Anwenders, in solchen Fällen die entsprechenden Posen der Situation entsprechend zu aktualisieren (beispielsweise für den Anwendungsfall einer robotergeführten Kamera).
    2. +
    3. Benutzerdefiniertes externes Koordinatensystem (external): Alle Posen sind im sogenannten externen Koordinatensystem angegeben, welches vom Nutzer während der Hand-Auge-Kalibrierung gewählt wurde. In diesem Fall bezieht die Load Carrier Funktionalität alle notwendigen Informationen über die Kameramontage und die kalibrierte Hand-Auge-Transformation automatisch vom Modul Hand-Auge-Kalibrierung. Für den Fall einer robotergeführten Kamera ist vom Nutzer zusätzlich die jeweils aktuelle Roboterpose robot_pose anzugeben.
    4. +
    +
    +

    Bemerkung

    +

    Wenn keine Hand-Auge-Kalibrierung durchgeführt wurde bzw. zur Verfügung steht, muss als Referenzkoordinatensystem pose_frame immer camera angegeben werden.

    +
    +

    Zulässige Werte zur Angabe des Referenzkoordinatensystems sind camera und external. Andere Werte werden als ungültig zurückgewiesen.

    +
    +
    +
    +

    Parameter

    +

    Das LoadCarrier Modul wird in der REST-API als rc_load_carrier bezeichnet in der Web GUI unter Module ‣ LoadCarrier dargestellt. Der Benutzer kann die Parameter entweder dort oder über die REST-API-Schnittstelle ändern.

    +
    +

    Übersicht über die Parameter

    +

    Dieses Modul bietet folgende Laufzeitparameter:

    + + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Tab. 13 Laufzeitparameter des rc_load_carrier Moduls
    NameTypMin.Max.DefaultBeschreibung
    assume_gravity_alignedboolfalsetruetrueWenn dieser Parameter aktiv ist, werden nur waagerechte Load Carrier erkannt falls eine Gravitationsmessung verfügbar ist.
    crop_distancefloat640.00.050.005Sicherheitsspielraum um den das Load Carrier Innenmaß verringert wird, um eine Region of Interest für die Erkennung zu definieren
    min_plausibilityfloat640.00.990.8Gibt an, wie viel von der Ebene um den Load Carrier Rand herum mindestens frei sein muss, um als gültige Erkennung zu zählen.
    model_tolerancefloat640.0030.0250.008Gibt an, wie weit die Abmessungen des Load Carriers von den Werten im Modell abweichen dürfen
    +
    +
    +

    Beschreibung der Laufzeitparameter

    +

    Die Laufzeitparameter werden in der Web GUI zeilenweise im Abschnitt LoadCarrier Einstellungen auf der Seite LoadCarrier unter Module dargestellt. Im folgenden wird der Name des Parameters in der Web GUI in Klammern hinter dem eigentlichen Parameternamen angegeben. Die Parameter sind in derselben Reihenfolge wie in der Web GUI aufgelistet. Wenn die Parameter außerhalb des rc_load_carrier Moduls über die REST-API-Schnittstelle eines anderen Moduls verwendet werden, sind sie durch den Präfix load_carrier_ gekennzeichnet.

    +
    +

    assume_gravity_aligned (Gravitationsausgerichtet)

    +
    +

    Wenn dieser Parameter aktiv ist, werden nur waagerechte Load Carrier erkannt. Dies kann die Erkennung beschleunigen. +Wenn dieser Parameter nicht aktiv ist, werden auch Load Carrier mit Verkippung detektiert.

    +

    Für Load Carrier mit einem Orientierungsprior wird dieser Parameter ignoriert.

    +
    +
    +
    +

    model_tolerance (Modelltoleranz)

    +
    +

    Gibt an, wie weit die Abmessungen des Load Carriers von den Werten im Modell abweichen dürfen.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_load_carrier/parameters?model_tolerance=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_load_carrier/parameters?model_tolerance=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    crop_distance (Cropping)

    +
    +

    setzt den Sicherheitsspielraum, um den das Load Carrier Innenmaß verringert wird, um eine Region of Interest für die Erkennung zu definieren (siehe Abb. 51).

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_load_carrier/parameters?crop_distance=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_load_carrier/parameters?crop_distance=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    min_plausibility (Minimale Plausibilität):

    +
    +

    Die minimale Plausibilität gibt an, wie viel von der Ebene um den Load Carrier Rand herum mindestens frei sein muss, um als gültige Erkennung zu zählen. Erhöhen Sie die minimale Plausibilität um falsch-positive Erkennungen zu vermeiden, und verringern Sie den Wert, wenn ein deutlich sichtbarer Load Carrier nicht erkannt wird.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_load_carrier/parameters?min_plausibility=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_load_carrier/parameters?min_plausibility=<value>
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    Statuswerte

    +

    Das LoadCarrier Modul meldet folgende Statuswerte:

    + + ++++ + + + + + + + + + + + + + + + + +
    Tab. 14 Statuswerte des rc_load_carrier Moduls
    NameBeschreibung
    data_acquisition_timeZeit in Sekunden, für die beim letzten Aufruf auf Bilddaten gewartet werden musste
    last_timestamp_processedZeitstempel des letzten verarbeiteten Bilddatensatzes
    load_carrier_detection_timeBerechnungszeit für die letzte Load Carrier Detektion in Sekunden
    +
    +
    +

    Services

    +

    Die angebotenen Services des LoadCarrier Moduls können mithilfe der REST-API-Schnittstelle oder der rc_visard NG Web GUI auf der Seite LoadCarrier unter dem Menüpunkt Module ausprobiert und getestet werden.

    +

    Das LoadCarrier Modul stellt folgende Services zur Verfügung.

    +
    +

    detect_load_carriers

    +
    +

    löst die Erkennung von Load Carriern aus, wie in Erkennung von Load Carriern beschrieben.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_load_carrier/services/detect_load_carriers
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_load_carrier/services/detect_load_carriers
    +
    +
    +
    +
    +
    + +
    +

    Obligatorische Serviceargumente:

    +
    +

    pose_frame: siehe Hand-Auge Kalibrierung.

    +

    load_carrier_ids: IDs der zu erkennenden Load Carrier. Aktuell kannnur eine ID angegeben werden.

    +
    +

    Möglicherweise benötigte Serviceargumente:

    +
    +
    robot_pose: siehe Hand-Auge Kalibrierung.
    +

    Optionale Serviceargumente:

    +
    +

    region_of_interest_id: Die ID der 3D Region of Interest, innerhalb welcher nach den Load Carriern gesucht wird.

    +

    region_of_interest_2d_id: Die ID der 2D Region of Interest, innerhalb welcher nach den Load Carriern gesucht wird.

    +
    +

    Bemerkung

    +

    Es kann nur eine Art von Region of Interest kann angegeben werden.

    +
    +
    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "load_carrier_ids": [
    +      "string"
    +    ],
    +    "pose_frame": "string",
    +    "region_of_interest_2d_id": "string",
    +    "region_of_interest_id": "string",
    +    "robot_pose": {
    +      "orientation": {
    +        "w": "float64",
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "position": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      }
    +    }
    +  }
    +}
    +
    +
    +
    +
    +

    load_carriers: Liste der erkannten Load Carrier (Behälter).

    +

    timestamp: Zeitstempel des Bildes, auf dem die Erkennung durchgeführt wurde.

    +

    return_code: enthält mögliche Warnungen oder Fehlercodes und Nachrichten.

    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "detect_load_carriers",
    +  "response": {
    +    "load_carriers": [
    +      {
    +        "height_open_side": "float64",
    +        "id": "string",
    +        "inner_dimensions": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "outer_dimensions": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "overfilled": "bool",
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "pose_frame": "string",
    +        "rim_ledge": {
    +          "x": "float64",
    +          "y": "float64"
    +        },
    +        "rim_step_height": "float64",
    +        "rim_thickness": {
    +          "x": "float64",
    +          "y": "float64"
    +        },
    +        "type": "string"
    +      }
    +    ],
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    },
    +    "timestamp": {
    +      "nsec": "int32",
    +      "sec": "int32"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    detect_filling_level

    +
    +

    löst eine Load Carrier Füllstandserkennung aus, wie in Füllstandserkennung beschrieben.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_load_carrier/services/detect_filling_level
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_load_carrier/services/detect_filling_level
    +
    +
    +
    +
    +
    + +
    +

    Obligatorische Serviceargumente:

    +
    +

    pose_frame: siehe Hand-Auge Kalibrierung.

    +

    load_carrier_ids: IDs der zu erkennenden Load Carrier. Aktuell kannnur eine ID angegeben werden.

    +
    +

    Möglicherweise benötigte Serviceargumente:

    +
    +
    robot_pose: siehe Hand-Auge Kalibrierung.
    +

    Optionale Serviceargumente:

    +
    +

    filling_level_cell_count: Anzahl der Zellen im Füllstandsraster.

    +

    region_of_interest_id: Die ID der 3D Region of Interest, innerhalb welcher nach den Load Carriern gesucht wird.

    +

    region_of_interest_2d_id: Die ID der 2D Region of Interest, innerhalb welcher nach den Load Carriern gesucht wird.

    +
    +

    Bemerkung

    +

    Es kann nur eine Art von Region of Interest kann angegeben werden.

    +
    +
    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "filling_level_cell_count": {
    +      "x": "uint32",
    +      "y": "uint32"
    +    },
    +    "load_carrier_ids": [
    +      "string"
    +    ],
    +    "pose_frame": "string",
    +    "region_of_interest_2d_id": "string",
    +    "region_of_interest_id": "string",
    +    "robot_pose": {
    +      "orientation": {
    +        "w": "float64",
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "position": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      }
    +    }
    +  }
    +}
    +
    +
    +
    +
    +

    load_carriers: Liste an erkannten Load Carriern und deren Füllstand.

    +

    timestamp: Zeitstempel des Bildes, auf dem die Erkennung durchgeführt wurde.

    +

    return_code: enthält mögliche Warnungen oder Fehlercodes und Nachrichten.

    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "detect_filling_level",
    +  "response": {
    +    "load_carriers": [
    +      {
    +        "cells_filling_levels": [
    +          {
    +            "cell_position": {
    +              "x": "float64",
    +              "y": "float64",
    +              "z": "float64"
    +            },
    +            "cell_size": {
    +              "x": "float64",
    +              "y": "float64"
    +            },
    +            "coverage": "float64",
    +            "level_free_in_meters": {
    +              "max": "float64",
    +              "mean": "float64",
    +              "min": "float64"
    +            },
    +            "level_in_percent": {
    +              "max": "float64",
    +              "mean": "float64",
    +              "min": "float64"
    +            }
    +          }
    +        ],
    +        "filling_level_cell_count": {
    +          "x": "uint32",
    +          "y": "uint32"
    +        },
    +        "height_open_side": "float64",
    +        "id": "string",
    +        "inner_dimensions": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "outer_dimensions": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "overall_filling_level": {
    +          "cell_position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "cell_size": {
    +            "x": "float64",
    +            "y": "float64"
    +          },
    +          "coverage": "float64",
    +          "level_free_in_meters": {
    +            "max": "float64",
    +            "mean": "float64",
    +            "min": "float64"
    +          },
    +          "level_in_percent": {
    +            "max": "float64",
    +            "mean": "float64",
    +            "min": "float64"
    +          }
    +        },
    +        "overfilled": "bool",
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "pose_frame": "string",
    +        "rim_ledge": {
    +          "x": "float64",
    +          "y": "float64"
    +        },
    +        "rim_step_height": "float64",
    +        "rim_thickness": {
    +          "x": "float64",
    +          "y": "float64"
    +        },
    +        "type": "string"
    +      }
    +    ],
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    },
    +    "timestamp": {
    +      "nsec": "int32",
    +      "sec": "int32"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    reset_defaults

    +
    +

    stellt die Werkseinstellungen der Parameter dieses Moduls wieder her und wendet sie an („factory reset“).

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_load_carrier/services/reset_defaults
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_load_carrier/services/reset_defaults
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "reset_defaults",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    set_load_carrier (veraltet)

    +
    +

    speichert einen Load Carrier auf dem rc_visard NG.

    +
    + +
    +Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie stattdessen set_load_carrier in rc_load_carrier_db.
    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    PUT http://<host>/api/v1/nodes/rc_load_carrier/services/set_load_carrier
    +
    +
    +

    Die Definitionen von Request und Response sind dieselben wie in set_load_carrier in rc_load_carrier_db beschrieben.

    +
    +
    +
    +
    +
    +

    get_load_carriers (veraltet)

    +
    +

    gibt die mit load_carrier_ids spezifizierten, gespeicherten Load Carrier zurück.

    +
    + +
    +Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie stattdessen get_load_carriers in rc_load_carrier_db.
    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    PUT http://<host>/api/v1/nodes/rc_load_carrier/services/get_load_carriers
    +
    +
    +

    Die Definitionen von Request und Response sind dieselben wie in get_load_carriers in rc_load_carrier_db beschrieben.

    +
    +
    +
    +
    +
    +

    delete_load_carriers (veraltet)

    +
    +

    löscht die mit load_carrier_ids spezifizierten, gespeicherten Load Carrier.

    +
    + +
    +Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie stattdessen delete_load_carriers in rc_load_carrier_db.
    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    PUT http://<host>/api/v1/nodes/rc_load_carrier/services/delete_load_carriers
    +
    +
    +

    Die Definitionen von Request und Response sind dieselben wie in delete_load_carriers in rc_load_carrier_db beschrieben.

    +
    +
    +
    +
    +
    +

    set_region_of_interest (veraltet)

    +
    +

    speichert eine 3D Region of Interest auf dem rc_visard NG.

    +
    + +
    +Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie stattdessen set_region_of_interest in rc_roi_db.
    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    PUT http://<host>/api/v1/nodes/rc_load_carrier/services/set_region_of_interest
    +
    +
    +

    Die Definitionen von Request und Response sind dieselben wie in set_region_of_interest in rc_roi_db beschrieben.

    +
    +
    +
    +
    +
    +

    get_regions_of_interest (veraltet)

    +
    +

    gibt die mit region_of_interest_ids spezifizierten, gespeicherten 3D Regions of Interest zurück.

    +
    + +
    +Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie stattdessen get_regions_of_interest in rc_roi_db.
    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    PUT http://<host>/api/v1/nodes/rc_load_carrier/services/get_regions_of_interest
    +
    +
    +

    Die Definitionen von Request und Response sind dieselben wie in get_regions_of_interest in rc_roi_db beschrieben.

    +
    +
    +
    +
    +
    +

    delete_regions_of_interest (veraltet)

    +
    +

    löscht die mit region_of_interest_ids spezifizierten, gespeicherten 3D Regions of Interest.

    +
    + +
    +Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie stattdessen delete_regions_of_interest in rc_roi_db.
    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    PUT http://<host>/api/v1/nodes/rc_load_carrier/services/delete_regions_of_interest
    +
    +
    +

    Die Definitionen von Request und Response sind dieselben wie in delete_regions_of_interest in rc_roi_db beschrieben.

    +
    +
    +
    +
    +
    +

    set_region_of_interest_2d (veraltet)

    +
    +

    speichert eine 2D Region of Interest auf dem rc_visard NG.

    +
    + +
    +Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie stattdessen set_region_of_interest_2d in rc_roi_db.
    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    PUT http://<host>/api/v1/nodes/rc_load_carrier/services/set_region_of_interest_2d
    +
    +
    +

    Die Definitionen von Request und Response sind dieselben wie in set_region_of_interest_2d in rc_roi_db beschrieben.

    +
    +
    +
    +
    +
    +

    get_regions_of_interest_2d (veraltet)

    +
    +

    gibt die mit region_of_interest_2d_ids spezifizierten, gespeicherten 2D Regions of Interest zurück.

    +
    + +
    +Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie stattdessen get_regions_of_interest_2d in rc_roi_db.
    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    PUT http://<host>/api/v1/nodes/rc_load_carrier/services/get_region_of_interest_2d
    +
    +
    +

    Die Definitionen von Request und Response sind dieselben wie in get_regions_of_interest_2d in rc_roi_db beschrieben.

    +
    +
    +
    +
    +
    +

    delete_regions_of_interest_2d (veraltet)

    +
    +

    löscht die mit region_of_interest_2d_ids spezifizierten, gespeicherten 2D Regions of Interest.

    +
    + +
    +Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie stattdessen delete_regions_of_interest_2d in rc_roi_db.
    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    PUT http://<host>/api/v1/nodes/rc_load_carrier/services/delete_regions_of_interest_2d
    +
    +
    +

    Die Definitionen von Request und Response sind dieselben wie in delete_regions_of_interest_2d in rc_roi_db beschrieben.

    +
    +
    +
    +
    +
    +
    +

    Rückgabecodes

    +

    Zusätzlich zur eigentlichen Serviceantwort gibt jeder Service einen sogenannten return_code bestehend aus einem Integer-Wert und einer optionalen Textnachricht zurück. Erfolgreiche Service-Anfragen werden mit einem Wert von 0 quittiert. Positive Werte bedeuten, dass die Service-Anfrage zwar erfolgreich bearbeitet wurde, aber zusätzliche Informationen zur Verfügung stehen. Negative Werte bedeuten, dass Fehler aufgetreten sind. Für den Fall, dass mehrere Rückgabewerte zutreffend wären, wird der kleinste zurückgegeben, und die entsprechenden Textnachrichten werden in return_code.message akkumuliert.

    +

    Die folgende Tabelle listet die möglichen Rückgabe-Codes auf:

    + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Tab. 15 Rückgabecodes der Services des LoadCarrier Moduls
    CodeBeschreibung
    0Erfolgreich
    -1Ungültige(s) Argument(e)
    -4Die maximal erlaubte Zeitspanne für die interne Akquise der Bilddaten wurde überschritten.
    -10Das neue Element konnte nicht hinzugefügt werden, da die maximal speicherbare Anzahl an Load Carriern überschritten wurde.
    -11Sensor nicht verbunden, nicht unterstützt oder nicht bereit
    -302Es wurde mehr als ein Load Carrier an den detect_load_carriers oder detect_filling_level Service übergeben, aber nur einer wird unterstützt.
    3Der Timeout während der Load Carrier Erkennung wurde erreicht. Die Modelltoleranz sollte reduziert werden.
    10Die maximal speicherbare Anzahl an Load Carriern wurde erreicht.
    11Mit dem Aufruf von set_load_carrier wurde ein bereits existierendes Objekt mit derselben id überschrieben.
    100Die angefragten Load Carrier wurden in der Szene nicht gefunden.
    102Der erkannte Load Carrier enthält keine 3D-Punkte
    300Ein gültiges robot_pose-Argument wurde angegeben, ist aber nicht erforderlich.
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/loadcarrier_db.html b/v24.04/de/loadcarrier_db.html new file mode 100644 index 0000000..03b9269 --- /dev/null +++ b/v24.04/de/loadcarrier_db.html @@ -0,0 +1,1045 @@ + + + + + + + + + + + LoadCarrierDB — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    LoadCarrierDB

    +
    +

    Einleitung

    +

    Das LoadCarrierDB Modul (Load Carrier Datenbank Modul) ermöglicht die globale Definition von Load Carriern (Behältern), die dann in vielen Detektionsmodulen genutzt werden können. Die definierten Load Carrier Modelle sind in allen Modulen auf dem rc_visard NG verfügbar, die Load Carrier unterstützen.

    +

    Das LoadCarrierDB Modul ist ein Basismodul, welches auf jedem rc_visard NG verfügbar ist.

    + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Tab. 47 Spezifikationen des LoadCarrierDB Moduls
    Unterstützte Load Carrier Typen4-seitig oder 3-seitig
    Mögliche Rand-Artendurchgängig, abgestuft oder vorspringend
    Min. Load Carrier Abmessungen0.1 m x 0.1 m x 0.05 m
    Max. Load Carrier Abmessungen2 m x 2 m x 2 m
    Max. Anzahl von Load Carriern50
    Load Carrier verfügbar inItemPick und BoxPick und SilhouetteMatch
    Mögliche Posen-Artenkeine Pose, Orientierungsprior, exakte Pose
    Mögliche Referenzkoordinatensystemecamera, external
    +
    +
    +

    Load Carrier Definition

    +

    Ein sogenannter Load Carrier ist ein Behälter mit vier Wänden, einem Boden und einem rechteckigen Rand, der Objekte enthalten kann. Er kann genutzt werden, um das Volumen, in dem nach Objekten oder Greifpunkten gesucht wird, zu begrenzen.

    +

    Seine Geometrie ist durch die inneren und äußeren Abmessungen (inner_dimensions und outer_dimensions) definiert. Die maximalen outer_dimensions betragen 2.0 m in allen Dimensionen.

    +

    Der Ursprung des Load Carrier Koordinatensystems liegt im Zentrum des durch die Außenmaße definierten Quaders. Dabei ist die z-Achse senkrecht zum Boden des Load Carriers und zeigt aus dem Load Carrier heraus (siehe Abb. 50).

    +
    +_images/itempick_load_carrier_reference.svg +

    Abb. 50 Load Carrier mit Koordinatensystem und inneren und äußeren Abmessungen

    +
    +
    +

    Bemerkung

    +

    Die Innen- und Außenmaße eines Load Carriers sind typischerweise in den Angaben des jeweiligen Herstellers spezifiziert, und können im Produktblatt oder auf der Produktseite nachgeschlagen werden.

    +
    +

    Das Innenvolumen eines Load Carriers ist durch seine Innenmaße definiert, aber enthält zusätzlich einen Bereich von 10 cm oberhalb des Load Carriers, damit Objekte, die aus dem Load Carrier herausragen, auch für die Detektion oder Greifpunktberechnung berücksichtigt werden. Weiterhin wird vom Innenvolumen in jeder Richtung ein zusätzlicher Sicherheitsabstand crop_distance abgezogen, welcher als Laufzeitparameter im LoadCarrier Modul konfiguriert werden kann (siehe Parameter). Abb. 51 zeigt das Innenvolumen eines Load Carriers. Nur Punkte, die sich innerhalb dieses Volumens befinden, werden für Detektionen berücksichtigt.

    +
    +_images/load_carrier_inside_volume.svg +

    Abb. 51 Darstellung des Innenvolumens eines Load Carriers. Nur Punkte, die sich innerhalb dieses Volumens befinden, werden für Detektionen berücksichtigt.

    +
    +

    Da die Erkennung von Load Carriern auf der Erkennung des Load Carrier Rands basiert, muss die Geometrie des Randes angegeben werden, wenn sie nicht aus der Differenz zwischen Außen- und Innenmaßen bestimmt werden kann. Dazu kann die Randstärke rim_thickness explizit gesetzt werden. Die Randstärke gibt die Breite des äußeren Rands in x- und y-Richtung an. Wenn eine Randstärke gesetzt ist, kann optional auch die Randstufenhöhe rim_step_height angegeben werden. Die Randstufenhöhe gibt die Höhe der Stufe zwischen dem äußeren und dem inneren Teil des Load Carrier Rands an. Wenn die Stufenhöhe angegeben wird, wird sie auch bei der Kollisionsprüfung berücksichtigt (siehe CollisionCheck). Beispiele abgestufter Load Carrier sind in Abb. 52 A, B gezeigt. Zusätzlich zur Randstärke und Randstufenhöhe kann der Randvorsprung rim_ledge angegeben werden, um Load Carrier zu definieren, deren innerer Rand in den Load Carrier Innenraum hineinragt, wie zum Beispiel bei Gitterboxen. Der Randvorsprung rim_ledge gibt die Randstärke des inneren Teils des Randes in die x- und y-Richtung an. Ein Beispiel eines Load Carriers mit vorspringendem Rand ist in Abb. 52 C gezeigt.

    +
    +_images/rim_types.svg +

    Abb. 52 Beispiele von Load Carriern mit abgestuftem (A, B) und vorspringendem Rand (C)

    +
    +

    Die unterschiedlichen Randtypen können für gewöhnliche 4-seitige und 3-seitige Load Carrier angewendet werden. Für einen 3-seitigen Load Carrier muss das Feld type auf THREE_SIDED gesetzt werden. Wenn der Typ STANDARD oder leer ist, wird ein 4-seitiger Load Carrier angenommen. Ein 3-seitiger Load Carrier hat eine Seite, die niedriger ist als die anderen drei Seiten. Die Höhe dieser niedrigeren offenen Seite height_open_side wird vom äußeren Boden des Load Carriers gemessen. Die offene Seite liegt an der negativen y-Achse des Load Carrier Koordinatensystems. Beispiele der zwei unterschiedlichen Load Carrier Typen sind in Abb. 53 zu sehen. Die Höhe der offenen Seite wird nur während der Kollisionsprüfung berücksichtigt und ist nicht notwendig für die Erkennung des Load Carriers.

    +
    +_images/lc_types.svg +

    Abb. 53 Beispiele eines 4-seitigen (A) und 3-seitigen Load Carriers (B)

    +
    +

    Für einen Load Carrier kann eine Pose bestehend aus position und orientation als Quaternion in einem Referenzkoordinatensystem angegeben werden. Basierend auf dem Posentyp pose_type wird diese Pose entweder als Vorgabe für die Load Carrier Orientierung (pose_type ist ORIENTATION_PRIOR oder leer) oder als exakte Pose (pose_type ist EXACT_POSE) verwendet.

    +

    Falls die angegebene Pose als Vorgabe (Prior) für die Orientierung dient, wird garantiert, dass die zurückgelieferte Pose des erkannten Load Carriers die minimale Rotation bezogen auf den gesetzten Prior hat. Dieser Posentyp ist nützlich für die Erkennung von geneigten Load Carriern, oder um Mehrdeutigkeiten in der x- und y-Richtung aufzulösen, die durch die Symmetrie des Load Carriers verursacht werden.

    +

    Falls der Posentyp auf EXACT_POSE gesetzt ist, wird keine Load Carrier Erkennung auf den Szenendaten durchgeführt, sondern die angegebene Pose wird so verwendet, als wäre der Load Carrier in dieser Pose in der Szene erkannt worden. Dieser Posentyp ist nützlich, wenn Load Carrier ihre Position nicht verändern und/oder schwer zu erkennen sind (z.B. weil ihr Rand zu schmal ist oder das Material zu stark reflektiert).

    +

    Der rc_visard NG erlaubt das Speichern von bis zu 50 verschiedenen Load Carriern, von denen jeder mit einer id versehen ist. Die für eine spezifische Anwendung relevanten Load Carrier können mithilfe der rc_visard NG Web GUI oder der REST-API-Schnittstelle konfiguriert werden.

    +
    +

    Bemerkung

    +

    Die konfigurierten Load Carrier sind persistent auf dem rc_visard NG gespeichert und auch nach Firmware-Updates und -Wiederherstellungen verfügbar.

    +
    +
    +
    +

    Load Carrier Abteile

    +

    Bei einigen Detektionsmodulen kann ein Load Carrier Abteil (load_carrier_compartment) angegeben werden, um das Volumen für die Erkennung zu begrenzen, zum Beispiel in ItemPick’s compute_grasps Service. Ein Load Carrier Abteil ist eine Box, deren Pose pose als Transformation vom Load Carrier Koordinatensystem in das Abteilkoordinatensystem, welches im Zentrum der durch das Abteil definierten Box liegt, angegeben wird (siehe Abb. 54). Das Load Carrier Abteil ist nicht Teil der Load Carrier Definition im LoadCarrierDB Modul, sondern muss für jeden Detektionsaufruf separat definiert werden.

    +
    +_images/itempick_load_carrier_compartment.svg +

    Abb. 54 Beispiel für ein Abteil innerhalb eines Load Carriers. Das gezeigte Koordinatensystem das Koordinatensystem des Load Carrier Abteils.

    +
    +

    Als Volumen für die Detektion wird der Durchschnitt des Abteil-Volumens und des Load Carrier Innenraums verwendet. Wenn dieser Durchschnitt ebenfalls den Bereich von 10 cm oberhalb des Load Carriers enthalten soll, muss die Höhe der Box, die das Abteil definiert, entsprechend vergrößert werden.

    +
    +
    +

    Wechselwirkung mit anderen Modulen

    +

    Die folgenden, intern auf dem rc_visard NG laufenden Module liefern Daten für das LoadCarrierDB Modul oder haben Einfluss auf die Datenverarbeitung.

    +
    +

    Hand-Auge-Kalibrierung

    +

    Falls die Kamera zu einem Roboter kalibriert wurde, kann die exakte Pose oder der Orientierungsprior im Roboterkoordinatensystem angegeben werden, indem das Argument pose_frame auf external gesetzt wird.

    +

    Zwei verschiedene Werte für pose_frame können gewählt werden:

    +
      +
    1. Kamera-Koordinatensystem (camera): Die Load Carrier Pose oder der Orientierungsprior sind im Kamera-Koordinatensystem angegeben und es ist kein zusätzliches Wissen über die Lage der Kamera in seiner Umgebung notwendig. Das bedeutet insbesondere, dass sich ROIs oder Load Carrier, welche in diesem Koordinatensystem angegeben sind, mit der Kamera bewegen. Es liegt daher in der Verantwortung des Anwenders, in solchen Fällen die entsprechenden Posen der Situation entsprechend zu aktualisieren (beispielsweise für den Anwendungsfall einer robotergeführten Kamera).
    2. +
    3. Benutzerdefiniertes externes Koordinatensystem (external): Die Load Carrier Pose oder der Orientierungsprior sind im sogenannten externen Koordinatensystem angegeben, welches vom Nutzer während der Hand-Auge-Kalibrierung gewählt wurde. In diesem Fall bezieht das Modul alle notwendigen Informationen über die Kameramontage und die kalibrierte Hand-Auge-Transformation automatisch vom Modul Hand-Auge-Kalibrierung.
    4. +
    +
    +

    Bemerkung

    +

    Wenn keine Hand-Auge-Kalibrierung durchgeführt wurde bzw. zur Verfügung steht, muss als Referenzkoordinatensystem pose_frame immer camera angegeben werden.

    +
    +

    Zulässige Werte zur Angabe des Referenzkoordinatensystems sind camera und external. Andere Werte werden als ungültig zurückgewiesen.

    +
    +
    +
    +

    Services

    +

    Das LoadCarrierDB Modul wird in der REST-API als rc_load_carrier_db bezeichnet und in der Web GUI unter Datenbank ‣ Load Carrier dargestellt. Die angebotenen Services des LoadCarrierDB Moduls können mithilfe der REST-API-Schnittstelle oder der Web GUI ausprobiert und getestet werden.

    +

    Das LoadCarrierDB Modul stellt folgende Services zur Verfügung.

    +
    +

    set_load_carrier

    +
    +

    speichert einen Load Carrier auf dem rc_visard NG. Alle Load Carrier sind dauerhaft gespeichert, auch über Firmware-Updates und -Wiederherstellungen hinweg.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    PUT http://<host>/api/v2/nodes/rc_load_carrier_db/services/set_load_carrier
    +
    +
    +
    + +
    +

    Die Definition des Typs load_carrier wird in Load Carrier Definition beschrieben.

    +

    Das Feld type ist optional und akzeptiert STANDARD und THREE_SIDED.

    +

    Das Feld pose_type ist optional und akzeptiert NO_POSE, EXACT_POSE und ORIENTATION_PRIOR.

    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "load_carrier": {
    +      "height_open_side": "float64",
    +      "id": "string",
    +      "inner_dimensions": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "outer_dimensions": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "pose": {
    +        "orientation": {
    +          "w": "float64",
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "position": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        }
    +      },
    +      "pose_frame": "string",
    +      "pose_type": "string",
    +      "rim_ledge": {
    +        "x": "float64",
    +        "y": "float64"
    +      },
    +      "rim_step_height": "float64",
    +      "rim_thickness": {
    +        "x": "float64",
    +        "y": "float64"
    +      },
    +      "type": "string"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "set_load_carrier",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    get_load_carriers

    +
    +

    gibt die mit load_carrier_ids spezifizierten, gespeicherten Load Carrier zurück. Wenn keine load_carrier_ids angegeben werden, werden alle gespeicherten Load Carrier zurückgeliefert.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    PUT http://<host>/api/v2/nodes/rc_load_carrier_db/services/get_load_carriers
    +
    +
    +
    + +
    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "load_carrier_ids": [
    +      "string"
    +    ]
    +  }
    +}
    +
    +
    +
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "get_load_carriers",
    +  "response": {
    +    "load_carriers": [
    +      {
    +        "height_open_side": "float64",
    +        "id": "string",
    +        "inner_dimensions": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "outer_dimensions": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "pose_frame": "string",
    +        "pose_type": "string",
    +        "rim_ledge": {
    +          "x": "float64",
    +          "y": "float64"
    +        },
    +        "rim_step_height": "float64",
    +        "rim_thickness": {
    +          "x": "float64",
    +          "y": "float64"
    +        },
    +        "type": "string"
    +      }
    +    ],
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    delete_load_carriers

    +
    +

    löscht die mit load_carrier_ids spezifizierten, gespeicherten Load Carrier. Alle zu löschenden Load Carrier müssen explizit in load_carrier_ids angegeben werden.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    PUT http://<host>/api/v2/nodes/rc_load_carrier_db/services/delete_load_carriers
    +
    +
    +
    + +
    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "load_carrier_ids": [
    +      "string"
    +    ]
    +  }
    +}
    +
    +
    +
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "delete_load_carriers",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    Rückgabecodes

    +

    Zusätzlich zur eigentlichen Serviceantwort gibt jeder Service einen sogenannten return_code bestehend aus einem Integer-Wert und einer optionalen Textnachricht zurück. Erfolgreiche Service-Anfragen werden mit einem Wert von 0 quittiert. Positive Werte bedeuten, dass die Service-Anfrage zwar erfolgreich bearbeitet wurde, aber zusätzliche Informationen zur Verfügung stehen. Negative Werte bedeuten, dass Fehler aufgetreten sind. Für den Fall, dass mehrere Rückgabewerte zutreffend wären, wird der kleinste zurückgegeben, und die entsprechenden Textnachrichten werden in return_code.message akkumuliert.

    +

    Die folgende Tabelle listet die möglichen Rückgabecodes auf:

    + + ++++ + + + + + + + + + + + + + + + + + + + + + + +
    Tab. 48 Rückgabecodes der Services des LoadCarrierDB Moduls
    CodeBeschreibung
    0Erfolgreich
    -1Ungültige(s) Argument(e)
    -10Das neue Element konnte nicht hinzugefügt werden, da die maximal speicherbare Anzahl an Load Carriern überschritten wurde.
    10Die maximal speicherbare Anzahl an Load Carriern wurde erreicht.
    11Mit dem Aufruf von set_load_carrier wurde ein bereits existierendes Objekt mit derselben id überschrieben.
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/maintenance.html b/v24.04/de/maintenance.html new file mode 100644 index 0000000..01a4ccd --- /dev/null +++ b/v24.04/de/maintenance.html @@ -0,0 +1,759 @@ + + + + + + + + + + + Wartung — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Wartung

    +
    +

    Warnung

    +

    Das Gehäuse des rc_visard NG muss für Wartungsarbeiten nicht geöffnet werden. Das unbefugte Öffnen des Produkts führt zum Erlöschen der Garantie.

    +
    +
    +

    Reinigung der Kameralinsen

    +

    Glaslinsen sind mit einer Anti-Reflex-Beschichtung versehen, um Spiegelungen zu verringern. Bei der Reinigung der Linsen ist besonders vorsichtig vorzugehen. Mit einer weichen Linsenbürste lassen sich Staub und Schmutzpartikel entfernen. Anschließend kann die Linse mit einem Tuch in kreisenden Bewegungen abgewischt werden: Dabei ist ein Spezialreinigungstuch aus Mikrofaser zu verwenden, um Kratzer zu vermeiden, die die Leistung des Sensors beeinträchtigen können. Hartnäckiger Schmutz lässt sich mit hochreinem Isopropanol oder einer für beschichtete Linsen geeigneten Reinigungslösung (z.B. „Uvex Clear“-Produkte) entfernen.

    +
    +
    +

    Kamerakalibrierung

    +

    Die Kameras werden ab Werk kalibriert. Unter normalen Betriebsbedingungen bleibt die Kalibrierung für die Lebensdauer des Sensors erhalten. Wenn der rc_visard NG einer starken mechanischen Belastung ausgesetzt wird, wenn er beispielsweise fallen gelassen wird, können sich die Parameter der Kamera jedoch leicht verändern. In diesem Fall lässt sich die Kalibrierung über die Web GUI überprüfen und bei Bedarf neu durchführen (siehe Kamerakalibrierung).

    +
    +
    +

    Backup der Einstellungen

    +

    Der rc_visard NG bietet die Möglichkeit, die aktuellen Einstellungen als Backup oder zum Übertragen auf einen anderen rc_visard oder rc_cube herunterzuladen.

    +

    Die aktuellen Einstellungen des rc_visard NG können über die Web GUI auf der Seite System im Abschnitt rc_visard NG Einstellungen heruntergeladen werden, oder über die REST-API-Schnittstelle des rc_visard NG mit Hilfe des Aufrufs GET /system/backup.

    +

    Beim Herunterladen des Backups kann der Nutzer entscheiden, welche Einstellungen das Backup enthalten soll:

    +
      +
    • nodes: die Einstellungen aller Module (Parameter, bevorzugte TCP-Orientierungen und Sortierstrategien)
    • +
    • load_carriers: die erstellten Load Carrier
    • +
    • regions_of_interest: die erstellten 2D und 3D Regions of Interest
    • +
    • grippers: die erstellten Greifer (ohne CAD Elemente)
    • +
    +

    Das zurückgelieferte Backup sollte als .json-Datei gespeichert werden.

    +

    Die Templates des SilhouetteMatch Moduls sind nicht im Backup enthalten, aber können manuell über die REST-API oder die Web GUI heruntergeladen werden (siehe Template API).

    +

    Ein Backup kann auf dem rc_visard NG über die Web GUI auf der Seite System im Abschnitt rc_visard NG Einstellungen eingespielt werden, indem die Backup .json-Datei hochgeladen wird. In der Web GUI werden die im Backup enthaltenen Einstellungen angezeigt und können für das Einspielen ausgewählt werden. Der zugehörige Aufruf der REST-API-Schnittstelle ist POST /system/backup.

    +
    +

    Warnung

    +

    Wenn ein Backup von Load Carriern eingespielt wird, gehen alle bestehenden Load Carrier auf dem rc_visard NG verloren und werden durch die Load Carrier im Backup ersetzt. Das gleiche trifft auf das Einspielen von Greifern und Regions of Interest zu.

    +
    +

    Wenn ein Backup eingespielt wird, werden nur die Einstellungen gesetzt, die für den jeweiligen rc_visard NG zutreffend sind. Parameter für Module, die nicht existieren oder keine gültige Lizenz haben, werden ignoriert. Wenn ein Backup nur teilweise eingespielt werden konnte, wird der Benutzer über Warnungen darüber informiert.

    +
    +
    +

    Aktualisierung der Firmware

    +

    Angaben zur aktuellen Firmware-Version sind auf der Seite System ‣ Firmware & Lizenz in der Web GUI angegeben. Diese Informationen lassen sich mithilfe einer GET /system-Anfrage über die die REST-API-Schnittstelle des rc_visard NG abrufen. Die Aktualisierung der Firmware kann entweder über die Web GUI oder über die REST-API vorgenommen werden.

    +
    +

    Warnung

    +

    Ausgehend von einer Firmware-Version älter als 21.07 werden alle konfigurierten Parameter der Softwaremodule nach einem Firmware-Update auf die Werkseinstellungen zurückgesetzt. Nur beim Update ausgehend von Version 21.07 oder höher bleiben die zuletzt gespeicherten Parameter erhalten. Bevor das Update vorgenommen wird, sollten daher alle Einstellungen (über die REST-API-Schnittstelle) abgefragt und in der Anwendung oder auf dem Client-PC gesichert werden.

    +

    Folgende Einstellungen sind davon ausgeschlossen und bleiben auch nach einem Firmware-Update erhalten:

    +
      +
    • die Netzwerkkonfiguration des rc_visard NG, samt der ggf. vergebenen festen IP-Adresse und des benutzerdefinierten Gerätenamens,
    • +
    • das letzte Ergebnis der Hand-Auge-Kalibrierung, was bedeutet, dass der rc_visard NG nicht neu zum Roboter kalibriert werden muss, es sei denn, die Montage wurde verändert, und
    • +
    +
      +
    • das letzte Ergebnis der Kamerakalibrierung, was bedeutet, dass die Stereokamera des rc_visard nicht neu kalibriert werden muss.
    • +
    +
    +
    +
    Schritt 1: Download der neuesten Firmware
    +

    Firmware-Updates werden in Form einer Mender-Artefakt-Datei bereitgestellt, die an ihrem .mender-Suffix erkennbar ist.

    +

    Ist ein neues Firmware-Update für den rc_visard NG erhältlich, kann die Datei von der Roboception-Homepage (https://www.roboception.com/download) auf den lokalen Rechner heruntergeladen werden.

    +
    +
    Schritt 2: Hochladen der Update-Datei
    +

    Soll das Update über die REST-API des rc_visard NG vorgenommen werden, kann der Benutzer auf die Anfrage POST /system/update zurückgreifen.

    +

    Um die Firmware über die Web GUI zu aktualisieren, muss auf der Seite System ‣ Firmware & License die Schaltfläche „rc_visard NG Update hochladen“ betätigt werden. Nachdem die gewünschte Update-Image-Datei (Dateierweiterung .mender) aus dem lokalen Dateisystem ausgewählt und geöffnet wurde, startet das Update.

    +

    Je nach Netzwerkarchitektur und Konfiguration kann das Hochladen mehrere Minuten in Anspruch nehmen. Während das Update über die Web GUI läuft, zeigt ein Statusbalken an, wie weit das Update bereits vorangeschritten ist.

    +
    +

    Bemerkung

    +

    Je nach Webbrowser kann es vorkommen, dass der angezeigte Statusbalken den Abschluss des Updates zu früh angibt. Es empfiehlt sich, zu warten, bis sich ein Benachrichtigungsfenster öffnet, das das Ende des Updatevorgangs anzeigt. Insgesamt ist mit einer Update-Dauer von mindestens fünf Minuten zu rechnen.

    +
    +
    +

    Warnung

    +

    Die Webbrowser-Registerkarte, die die Web GUI enthält, darf weder geschlossen noch aktualisiert werden, da der Update-Vorgang anderenfalls unterbrochen wird. Ist dies der Fall, muss der Update-Vorgang neu gestartet werden.

    +
    +
    +
    Schritt 3: Neustart des rc_visard NG
    +

    Um ein Firmware-Update auf den rc_visard NG aufzuspielen, muss nach dem Upload der neuen Image-Datei ein Neustart vorgenommen werden.

    +
    +

    Bemerkung

    +

    Die neue Firmware-Version wird in die inaktive Partition des rc_visard NG hochgeladen. Erst nach dem Neustart wird die inaktive Partition aktiviert und die aktive Partition deaktiviert. Kann das aktualisierte Firmware-Image nicht geladen werden, bleibt diese Partition des rc_visard NG inaktiv und es wird automatisch die zuvor installierte Firmware-Version von der aktiven Partition verwendet.

    +
    +

    Über die REST-API lässt sich der Neustart mittels der Anfrage PUT /system/reboot vornehmen.

    +

    Nachdem die neue Firmware über die Web GUI hochgeladen wurde, öffnet sich ein Benachrichtigungsfenster, in dem der Benutzer aufgefordert wird, das Gerät sofort neu zu starten oder aber den Neustart zu verschieben. Soll der rc_visard NG zu einem späteren Zeitpunkt neu gestartet werden, kann dies über die Schaltfläche Neustart auf der Web GUI-Seite System vorgenommen werden.

    +
    +
    Schritt 4: Bestätigung des Firmware-Updates
    +

    Nach dem Neustart des rc_visard NG ist die Versionsnummer des derzeit aktiven Firmware-Images zu überprüfen, sodass sichergestellt ist, dass das aktualisierte Image erfolgreich geladen wurde. Dies kann entweder über die Web GUI auf der Seite System ‣ Firmware & Lizenz oder über die REST-API mittels der Anfrage GET /system/update vorgenommen werden.

    +

    Kann das Firmware-Update nicht erfolgreich aufgespielt werden, ist der Roboception-Support zu kontaktieren.

    +
    +
    +
    +
    +

    Wiederherstellung der vorherigen Firmware-Version

    +

    Nach einem erfolgreichen Firmware-Update wird das vorherige Firmware-Image auf der inaktiven Partition des rc_visard NG hinterlegt und kann von dort bei Bedarf wiederhergestellt werden. Dieses Verfahren wird auch als Rollback bezeichnet.

    +
    +

    Bemerkung

    +

    Es wird dringend empfohlen, die neueste Firmware-Version zu verwenden, die von Roboception zur Verfügung gestellt wurde. Auf das Rollback sollte nur dann zurückgegriffen werden, wenn es mit der aktualisierten Firmware-Version große Probleme gibt.

    +
    +

    Die Rollback-Funktion kann lediglich über die REST-API-Schnittstelle des rc_visard NG aufgerufen werden – mithilfe der Anfrage PUT /system/rollback. Die Anfrage kann entweder mit einem HTTP-kompatiblen Client oder, wie in Swagger UI beschrieben, über einen Webbrowser ausgelöst werden. Wie beim Update-Prozess ist es auch beim Rollback nötig, das Gerät im Anschluss neu zu starten, um die wiederhergestellte Firmware-Version zu laden.

    +
    +
    +

    Neustart des rc_visard NG

    +

    Nach einem Firmware-Update oder einem Software-Rollback muss der rc_visard NG neu gestartet werden. Der Neustart lässt sich entweder programmgesteuert mithilfe der Anforderung PUT /system/reboot über die REST-API-Schnittstelle des rc_visard NG oder manuell auf der Seite System der Web GUI vornehmen.

    +

    Der Neustart ist abgeschlossen, wenn die LED wieder grün leuchtet.

    +
    +
    +

    Aktualisierung der Softwarelizenz

    +

    Lizenzen, die von Roboception zur Aktivierung zusätzlicher Funktionen erworben werden, können über die Seite System ‣ Firmware & Lizenz der Web GUI installiert werden. Der rc_visard NG muss neu gestartet werden, um die Lizenz nutzen zu können.

    +
    +
    +

    Download der Logdateien

    +

    Während des Betriebs dokumentiert der rc_visard NG wichtige Informationen, Hinweise und Fehler in sogenannten Logdateien. Zeigt der rc_visard NG ein unerwartetes oder fehlerhaftes Verhalten, kann mithilfe der Logdateien nach der Fehlerursache geforscht werden. Logeinträge lassen sich über die Seite System ‣ Logs auf der Web GUI ansehen und filtern. Wird der Support kontaktiert (Kontakt), sind die Logdateien sehr hilfreich, um Probleme aufzuspüren. Um diese als tar.gz-Datei herunterzuladen, ist der Button Alle Logs herunterladen auf der Seite System ‣ Logs der Web GUI unter System zu klicken.

    +

    Die Logs sind nicht nur über die Web GUI, sondern auch über die REST-API-Schnittstelle des rc_visard NG zugänglich. Hierfür können die Anfragen des Typs GET /logs und GET /logs/{log} verwendet werden.

    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/modules.html b/v24.04/de/modules.html new file mode 100644 index 0000000..2bd3930 --- /dev/null +++ b/v24.04/de/modules.html @@ -0,0 +1,686 @@ + + + + + + + + + + + Softwaremodule — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Softwaremodule

    +

    Der rc_visard NG wird mit einer Reihe von On-Board-Softwaremodulen mit verschiedenen Funktionalitäten ausgeliefert. Jedes Softwaremodul bietet über seinen zugehörigen Node eine REST-API-Schnittstelle als Programmierschnittstelle an.

    +

    Die Softwaremodule des rc_visard NG können unterteilt werden in

    + +
      +
    • +
      Detektionsmodule
      +
      welche eine Vielzahl verschiedener Detektionsfunktionen, wie Greifpunktberechnungen und Objekterkennung anbieten.
      +
      +
    • +
    • +
      Konfigurationsmodule
      +
      welche es dem Nutzer ermöglichen, Kalibrierungen durchzuführen und den rc_visard NG für spezielle Anwendungen zu konfigurieren.
      +
      +
    • +
    +
      +
    • +
      Datenbankmodule
      +
      welche dem Nutzer die Konfiguration globaler Daten ermöglichen, die in allen anderen Modulen verfügbar sind, wie Load Carrier, Regions of Interest und Greifer.
      +
      +
    • +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/navigation_modules.html b/v24.04/de/navigation_modules.html new file mode 100644 index 0000000..71e46b3 --- /dev/null +++ b/v24.04/de/navigation_modules.html @@ -0,0 +1,672 @@ + + + + + + + + + + + Navigationsmodule — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + +
      + +
    • rc_visard NG >
    • + +
    • Navigationsmodule
    • + + +
    • + + + +
    • + +
    + + +
    +
    +
    +
    + + + + +
    +
    + +
    +
    +
    + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/objects.inv b/v24.04/de/objects.inv new file mode 100644 index 0000000..dcc76a9 Binary files /dev/null and b/v24.04/de/objects.inv differ diff --git a/v24.04/de/opc_ua.html b/v24.04/de/opc_ua.html new file mode 100644 index 0000000..67040eb --- /dev/null +++ b/v24.04/de/opc_ua.html @@ -0,0 +1,662 @@ + + + + + + + + + + + OPC UA Interface — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    OPC UA Interface

    +

    Der rc_visard NG bietet auch ein optionales OPC interface. Der OPC UA Server kann via Lizenzupdate aktiviert werden.

    +

    Der OPC UA Server nutzt das DataTypeDefinition Attribut (verfügbar in OPC UA Version 1.04) für benutzerdefinierte Datentypen und verwendet auch Methoden und Arrays variabler Länge. Bitte überprüfen Sie ob Ihr OPC UA Client dies unterstützt.

    +

    Bitte kontaktieren Sie support@roboception.de wenn Sie Interesse haben den OPC UA Server zu nutzen.

    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/pipelines.html b/v24.04/de/pipelines.html new file mode 100644 index 0000000..a5397dc --- /dev/null +++ b/v24.04/de/pipelines.html @@ -0,0 +1,717 @@ + + + + + + + + + + + Kamerapipelines — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Kamerapipelines

    +

    Der rc_visard NG unterstützt mehrere Kameras zur selben Zeit. Dazu bietet er bis zu vier Kamerapipelines, die vom Benutzer konfiguriert werden können.

    +

    Eine Kamerapipeline beinhaltet verschiedene Softwaremodule für die Datenaufnahme der mit der Pipeline verbundenen Kamera, für Detektionen und für die Konfiguration der Module in dieser Pipeline, z.B. durch eine Hand-Auge-Kalibrierung.

    +

    Der rc_visard NG unterstützt Kameras vom Typ rc_visard, rc_viscore und blaze. Der Typ der zugehörigen Kamerapipeline muss so konfiguriert werden, dass er zum angeschlossenen Gerät passt.

    +
    +

    Konfiguration der Kamerapipelines

    +

    Die Kamerapipelines können über die Web GUI unter System ‣ Kamera Pipelines konfiguriert werden. Diese Seite zeigt die laufenden Pipelines mit ihrem Typ und dem verbundenen Gerät an.

    +
    +images/webgui_pipelines.png +

    Beispiel der Seite Kamera Pipelines auf einem rc_cube mit zwei laufenden Pipelines vom Typ rc_visard

    +
    +

    Durch Klick auf Pipelines konfigurieren kann die Anzahl und der Typ der laufenden Kamerapipelines wie in der nächsten Abbildung gezeigt konfiguriert werden.

    +
    +

    Bemerkung

    +

    Der rc_cube I bietet vier Kamerapipelines an, der rc_cube S zwei.

    +
    +
    +images/webgui_pipelines_configure.png +

    Konfiguration der Kamerapipelines

    +
    +

    Der Typ einer laufenden Pipeline kann geändert werden, indem ein anderer Typ im Dropdown-Feld der jeweiligen Pipeline ausgewählt wird. Eine laufende Pipeline kann entfernt werden, indem man auf Pipeline entfernen klickt. Einzig die Pipeline 0 kann nie gelöscht werden, da sie die primäre Pipeline ist. Durch Klick auf + Pipeline hinzufügen und anschließendes Auswählen des Pipelinetyps kann eine neue Pipeline erstellt werden. Sobald alle Pipelines wie gewünscht konfiguriert sind, können die Änderungen durch Klick auf Anwenden & Neustarten angewendet werden und der rc_cube startet sofort neu.

    +
    +
    +

    Konfiguration der verbundenen Kameras

    +

    Eine Pipeline eines bestimmten Typs kann nur Geräte desselben Typs erkennen. Das bedeutet, dass eine Pipeline vom Typ rc_visard nur mit einem rc_visard verbunden werden kann. Falls mehrere Kameras desselben Typs am rc_cube angeschlossen sind, kann durch Setzen eines Filtertexts eine bestimmte Kamera für jede Pipeline ausgewählt werden. Der aktuelle Filtertext wird für jede laufende Pipeline angezeigt, wie in fig-pipelines-running dargestellt. Standardmäßig ist der Filtertext auf * gesetzt, was bedeutet, dass jedes Gerät, das zum Pipelinetyp passt, automatisch verbunden wird, aber nur, wenn es eindeutig ist. Andernfalls wird keine Kamera mit dieser Pipeline verbunden und ein Fehler angezeigt.

    +

    Um den Filtertext anzupassen und eine Kamera für eine Pipeline auszuwählen, klickt man auf Kameraverbindung konfigurieren auf der Seite Kamera Pipelines, oder wählt die entsprechende Pipeline im Menü unter, z.B., System ‣ Kamera Pipelines ‣ Pipeline 1. Diese Seite zeigt den aktuellen Filtertext und weitere Informationen über die verbundene Kamera an.

    +
    +images/webgui_pipeline.png +

    Konfigurieren der Kameraverbindung von Pipeline 1

    +
    +

    Ein Klick auf Kamera auswählen öffnet einen Dialog zum Editieren des Filtertexts.

    +
    +images/webgui_choose_camera.png +

    Auswahl der Kamera durch Setzen eines Filtertexts

    +
    +

    Dieser Dialog zeigt weiterhin eine Liste aller erkannten Geräte, die zum Pipelinetyp passen, und markiert diejenigen, die zum aktuell eingetragenen Filtertext passen. Es wird auch angezeigt, ob die Geräte bereits von einer anderen Pipeline verwendet werden. Filtertexte können durch Klicken auf das Interface, den Namen oder die Seriennummer des gewünschten Geräts ausgewählt werden. Die folgende Tabelle zeigt mögliche Filtertexte.

    + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Mögliche Kamera-Filtertexte
    FiltertextBeschreibung
    *wählt jedes Gerät aus, das zum Pipelinetyp passt
    sensor<n>:*wählt jedes Gerät aus, das über das sensor<n> Interface angeschlossen ist und dem Pipelinetyp entspricht.
    <Name>wählt das Gerät mit diesem benutzerdefinierten Namen aus
    <Seriennummer>wählt das Gerät mit dieser Seriennummer aus
    sensor<n>:<Seriennummer>wählt das Gerät aus, das über das sensor<n> Interface angeschlossen sind, und diese Seriennummer hat
    sensor<n>:<Name>wählt das Gerät aus, das über das sensor<n> Interface angeschlossen sind, und diesen benutzerdefinierten Namen hat
     falls leer, wird keine Kamera verbunden
    +

    Durch Klick auf Speichern wird der eingegebene Filtertext angewendet und eine passende Kamera mit dieser Pipeline verbunden, wenn möglich. Das Ändern des Filtertext ist ohne Neustart des rc_cube möglich.

    +
    +
    + + +
    +
    + +
    +
    +
    + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/pose_format_abb.html b/v24.04/de/pose_format_abb.html new file mode 100644 index 0000000..3d4c6ed --- /dev/null +++ b/v24.04/de/pose_format_abb.html @@ -0,0 +1,660 @@ + + + + + + + + + + + ABB Posenformat — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    ABB Posenformat

    +

    ABB Roboter beschreiben eine Pose durch Position und Quaternion so wie rc_visard NG Geräte. Es ist keine Konvertierung der Orientierung notwendig.

    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/pose_format_fanuc.html b/v24.04/de/pose_format_fanuc.html new file mode 100644 index 0000000..12b45e5 --- /dev/null +++ b/v24.04/de/pose_format_fanuc.html @@ -0,0 +1,682 @@ + + + + + + + + + + + FANUC XYZ-WPR Format — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    FANUC XYZ-WPR Format

    +

    Das Posenformat, welches von FANUC Robotern benutzt wird, besteht aus einer Position \(XYZ\) in Millimetern und einer Orientierung \(WPR\), welche durch drei Winkel in Grad gegeben ist. \(W\) rotiert um die \(x\)-Achse, \(P\) rotiert um die \(y\)-Achse und \(R\) rotiert um die \(z\)-Achse. Die Rotationsreihenfolge ist \(x\)-\(y\)-\(z\) und wird berechnet durch \(r_z(R) r_y(P) r_x(W)\).

    +
    +

    Umrechnung von FANUC-WPR in Quaternionen

    +

    Zur Umrechnung von \(WPR\) Winkeln in Grad in eine Quaternion \(q=(\begin{array}{cccc}x & y & z & w\end{array})\) werden zunächst die Winkel ins Bogenmaß umgerechnet

    +
    +\[\begin{split}W_r = W \frac{\pi}{180} \text{,} \\ +P_r = P \frac{\pi}{180} \text{,} \\ +R_r = R \frac{\pi}{180} \text{,} \\\end{split}\]
    +

    und damit wird die Quaternion berechnet als

    +
    +\[\begin{split}x = \cos{(R_r/2)}\cos{(P_r/2)}\sin{(W_r/2)} - \sin{(R_r/2)}\sin{(P_r/2)}\cos{(W_r/2)} \text{,} \\ +y = \cos{(R_r/2)}\sin{(P_r/2)}\cos{(W_r/2)} + \sin{(R_r/2)}\cos{(P_r/2)}\sin{(W_r/2)} \text{,} \\ +z = \sin{(R_r/2)}\cos{(P_r/2)}\cos{(W_r/2)} - \cos{(R_r/2)}\sin{(P_r/2)}\sin{(W_r/2)} \text{,} \\ +w = \cos{(R_r/2)}\cos{(P_r/2)}\cos{(W_r/2)} + \sin{(R_r/2)}\sin{(P_r/2)}\sin{(W_r/2)} \text{.}\end{split}\]
    +
    +
    +

    Umrechnung von Quaternionen in FANUC-WPR

    +

    Die Umrechnung von einer Quaternion \(q=(\begin{array}{cccc}x & y & z & w\end{array})\) mit \(||q||=1\) in \(WPR\) Winkel in Grad kann wie folgt durchgeführt werden.

    +
    +\[\begin{split}R &= \text{atan}_2{(2(wz + xy), 1 - 2(y^2 + z^2))} \frac{180}{\pi} \\ +P &= \text{asin}{(2(wy - zx))} \frac{180}{\pi} \\ +W &= \text{atan}_2{(2(wx + yz), 1 - 2(x^2 + y^2))} \frac{180}{\pi}\end{split}\]
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/pose_format_franka_emika.html b/v24.04/de/pose_format_franka_emika.html new file mode 100644 index 0000000..f460f09 --- /dev/null +++ b/v24.04/de/pose_format_franka_emika.html @@ -0,0 +1,723 @@ + + + + + + + + + + + Franka Emika Posenformat — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Franka Emika Posenformat

    +

    Franka Emika Roboter nutzen eine Transformationsmatrix \(T\) um eine Pose zu definieren. Eine Transformationsmatrix kombiniert eine Rotationsmatrix \(R\) und einen Translationsvektor \(t=(\begin{array}{cccc}x & y & z\end{array})^T\).

    +
    +\[\begin{split}T = \left(\begin{array}{cccc} + r_{00} & r_{01} & r_{02} & x\\ + r_{10} & r_{11} & r_{12} & y\\ + r_{20} & r_{21} & r_{22} & z\\ + 0 & 0 & 0 & 1 +\end{array}\right)\end{split}\]
    +

    Die Posen, die Franka Emika’s „Measure Pose“ App ausgibt, bestehen aus einer Translation \(x, y, z\) in Millimetern und einer Rotation \(x, y, z\) in Grad. Die Rotationsreihenfolge ist \(z\)-\(y'\)-\(x''\) (d.h. \(x\)-\(y\)-\(z\)) und die Rotation wird berechnet durch \(r_z(z) r_y(y) r_x(x).\)

    +
    +

    Umrechnung von Transformation in Quaternion

    +

    Die Umrechnung von einer Rotationsmatrix (mit \(det(R)=1\)) in eine Quaternion \(q=(\begin{array}{cccc}q_x & q_y & q_z & q_w\end{array})\) kann wie folgt durchgeführt werden.

    +
    +\[\begin{split}q_x &= \text{sign}(r_{21}-r_{12}) \frac{1}{2}\sqrt{\text{max}(0, 1 + r_{00} - r_{11} - r_{22})} \\ +q_y &= \text{sign}(r_{02}-r_{20}) \frac{1}{2}\sqrt{\text{max}(0, 1 - r_{00} + r_{11} - r_{22})} \\ +q_z &= \text{sign}(r_{10}-r_{01}) \frac{1}{2}\sqrt{\text{max}(0, 1 - r_{00} - r_{11} + r_{22})} \\ +q_w &= \frac{1}{2}\sqrt{\text{max}(0, 1 + r_{00} + r_{11} + r_{22})}\end{split}\]
    +

    Der \(\text{sign}\) Operator gibt -1 zurück, falls sein Argument negativ ist. Sonst wird 1 zurück gegeben. Er wird zur Wiederherstellung das Vorzeichens der Wurzel benutzt. Die \(\text{max}\) Funktion stellt sicher, dass das Argument der Wurzel nicht negativ ist, was in der Praxis durch Rundungsfehler passieren kann.

    +
    +
    +

    Umrechnung von Rotation-XYZ in Quaternion

    +

    Zur Umrechnung von der Rotationswinkel \(x, y, z\) in Grad in eine Quaternion \(q=(\begin{array}{cccc}q_x & q_y & q_z & q_w\end{array})\) werden zuerst alle Winkel in das Bogenmaß umgerechnet mit

    +
    +\[\begin{split}X_r = x \frac{\pi}{180} \text{,} \\ +Y_r = y \frac{\pi}{180} \text{,} \\ +Z_r = z \frac{\pi}{180} \text{,} \\\end{split}\]
    +

    und damit die Quaternion berechnet durch

    +
    +\[\begin{split}q_x = \cos{(Z_r/2)}\cos{(Y_r/2)}\sin{(X_r/2)} - \sin{(Z_r/2)}\sin{(Y_r/2)}\cos{(X_r/2)} \text{,} \\ +q_y = \cos{(Z_r/2)}\sin{(Y_r/2)}\cos{(X_r/2)} + \sin{(Z_r/2)}\cos{(Y_r/2)}\sin{(X_r/2)} \text{,} \\ +q_z = \sin{(Z_r/2)}\cos{(Y_r/2)}\cos{(X_r/2)} - \cos{(Z_r/2)}\sin{(Y_r/2)}\sin{(X_r/2)} \text{,} \\ +q_w = \cos{(Z_r/2)}\cos{(Y_r/2)}\cos{(X_r/2)} + \sin{(Z_r/2)}\sin{(Y_r/2)}\sin{(X_r/2)} \text{.}\end{split}\]
    +
    +
    +

    Umrechnung von Quaternion und Translation in Transformation

    +

    Die Umrechnung von einer Quaternion \(q=(\begin{array}{cccc}q_x & q_y & q_z & q_w\end{array})\) und einem Translationsvektor \(t=(\begin{array}{cccc}x & y & z\end{array})^T\) in eine Transformationsmatrix \(T\) kann wie folgt durchgeführt werden.

    +
    +\[\begin{split}T = \left(\begin{array}{cccc} + 1 - 2s(q_y^2+q_z^2) & 2s(q_x q_y-q_z q_w) & 2s(q_x q_z+q_y q_w) & x\\ + 2s(q_x q_y+q_z q_w) & 1 - 2s(q_x^2+q_z^2) & 2s(q_y q_z-q_x q_w) & y\\ + 2s(q_x q_z-q_y q_w) & 2s(q_y q_z+q_x q_w) & 1 - 2s(q_x^2+q_y^2) & z\\ + 0 & 0 & 0 & 1 +\end{array}\right)\end{split}\]
    +

    wobei \(s=||q||^{-2}=\frac{1}{q_x^2+q_y^2+q_z^2+q_w^2}\) und \(s=1\) wenn \(q\) eine Einheitsquaternion ist.

    +
    +
    +

    Umrechnung von Quaternion in Rotation-XYZ

    +

    Die Umrechnung von einer Quaternion \(q=(\begin{array}{cccc}q_x & q_y & q_z & q_w\end{array})\) mit \(||q||=1\) in \(x, y, z\) Winkel in Grad kann wie folgt durchgeführt werden.

    +
    +\[\begin{split}x &= \text{atan}_2{(2(q_w q_z + q_x q_y), 1 - 2(q_y^2 + q_z^2))} \frac{180}{\pi} \\ +y &= \text{asin}{(2(q_w q_y - q_z q_x))} \frac{180}{\pi} \\ +z &= \text{atan}_2{(2(q_w q_x + q_y q_z), 1 - 2(q_x^2 + q_y^2))} \frac{180}{\pi}\end{split}\]
    +
    +
    +

    Posenrepräsentation in RaceCom Messages und Statemachines

    +

    In RaceCom Messages und in Statemachines wird eine Pose normalerweise als eindimensionales Array aus 16 Floatwerten definiert, die in spaltenweiser Anordnung eine Transformationsmatrix repräsentieren. Die Indizes der Einträge der folgenden Matrix entsprechen den Array-Indizes.

    +
    +\[\begin{split}T = \left(\begin{array}{cccc} + a_0 & a_4 & a_8 & a_{12}\\ + a_1 & a_5 & a_9 & a_{13}\\ + a_2 & a_6 & a_{10} & a_{14}\\ + a_3 & a_7 & a_{11} & a_{15} +\end{array}\right)\end{split}\]
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/pose_format_fruitcore_horst.html b/v24.04/de/pose_format_fruitcore_horst.html new file mode 100644 index 0000000..835f63b --- /dev/null +++ b/v24.04/de/pose_format_fruitcore_horst.html @@ -0,0 +1,660 @@ + + + + + + + + + + + Fruitcore HORST Posenformat — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Fruitcore HORST Posenformat

    +

    Fruitcore HORST Roboter beschreiben eine Pose durch eine Position in Metern und ein Quaternion mit \(q_0 = w\), \(q_1 = x\), \(q_2 = y\) und \(q_3 = z\) wie auch rc_visard NG Geräte. Es ist keine Konvertierung notwendig.

    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/pose_format_kawasaki.html b/v24.04/de/pose_format_kawasaki.html new file mode 100644 index 0000000..e9a51b6 --- /dev/null +++ b/v24.04/de/pose_format_kawasaki.html @@ -0,0 +1,693 @@ + + + + + + + + + + + Kawasaki XYZ-OAT Format — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Kawasaki XYZ-OAT Format

    +

    Das Posenformat, welches von Kawasaki Robotern benutzt wird, besteht aus einer Position \(XYZ\) in Millimetern und einer Orientierung \(OAT\), welche durch drei Winkel in Grad angegeben wird. \(O\) rotiert um die \(z\)-Achse, \(A\) rotiert um die gedrehte \(y\)-Achse und \(T\) rotiert um die gedrehte \(z\)-Achse. Die Rotationsreihenfolge ist \(z\)-\(y'\)-\(z''\) (d.h. \(z\)-\(y\)-\(z\)) und wird berechnet durch \(r_z(O) r_y(A) r_z(T)\).

    +
    +

    Umrechnung von Kawasaki-OAT in Quaternionen

    +

    Zur Umrechnung von \(OAT\) Winkeln in Grad in eine Quaternion \(q=(\begin{array}{cccc}x & y & z & w\end{array})\) werden zunächst alle Winkel in das Bogenmaß umgerechnet durch

    +
    +\[\begin{split}O_r = O \frac{\pi}{180} \text{,} \\ +A_r = A \frac{\pi}{180} \text{,} \\ +T_r = T \frac{\pi}{180} \text{,} \\\end{split}\]
    +

    und damit wird die Quaternion berechnet durch

    +
    +\[\begin{split}x = \cos{(O_r/2)}\sin{(A_r/2)}\sin{(T_r/2)} - \sin{(O_r/2)}\sin{(A_r/2)}\cos{(T_r/2)} \text{,} \\ +y = \cos{(O_r/2)}\sin{(A_r/2)}\cos{(T_r/2)} + \sin{(O_r/2)}\sin{(A_r/2)}\sin{(T_r/2)} \text{,} \\ +z = \sin{(O_r/2)}\cos{(A_r/2)}\cos{(T_r/2)} + \cos{(O_r/2)}\cos{(A_r/2)}\sin{(T_r/2)} \text{,} \\ +w = \cos{(O_r/2)}\cos{(A_r/2)}\cos{(T_r/2)} - \sin{(O_r/2)}\cos{(A_r/2)}\sin{(T_r/2)} \text{.}\end{split}\]
    +
    +
    +

    Umrechnung von Quaternionen in Kawasaki-OAT

    +

    Die Umrechnung von einer Quaternion \(q=(\begin{array}{cccc}x & y & z & w\end{array})\) mit \(||q||=1\) in \(OAT\) Winkel in Grad kann wie folgt durchgeführt werden.

    +

    Wenn \(x = 0\) und \(y = 0\) ist die Umrechnung

    +
    +\[\begin{split}O &= \text{atan}_2{(2(z - w), 2(z + w))} \frac{180}{\pi} \\ +A &= \text{acos}{(w^2 + z^2)} \frac{180}{\pi} \\ +T &= \text{atan}_2{(2(z + w), 2(w - z))} \frac{180}{\pi}\end{split}\]
    +

    Wenn \(z = 0\) und \(w = 0\) ist die Umrechnung

    +
    +\[\begin{split}O &= \text{atan}_2{(2(y - x), 2(x + y))} \frac{180}{\pi} \\ +A &= \text{acos}{(-1.0)} \frac{180}{\pi} \\ +T &= \text{atan}_2{(2(y + x), 2(y - x))} \frac{180}{\pi}\end{split}\]
    +

    In allen anderen Fällen ist die Umrechnung

    +
    +\[\begin{split}O &= \text{atan}_2{(2(yz - wx), 2(xz + wy))} \frac{180}{\pi} \\ +A &= \text{acos}{(w^2 - x^2 - y^2 + z^2)} \frac{180}{\pi} \\ +T &= \text{atan}_2{(2(yz + wx), 2(wy - xz))} \frac{180}{\pi}\end{split}\]
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/pose_format_kuka.html b/v24.04/de/pose_format_kuka.html new file mode 100644 index 0000000..da38805 --- /dev/null +++ b/v24.04/de/pose_format_kuka.html @@ -0,0 +1,682 @@ + + + + + + + + + + + KUKA XYZ-ABC Format — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    KUKA XYZ-ABC Format

    +

    KUKA Roboter nutzen das sogenannte XYZ-ABC Format. \(XYZ\) ist die Position in Millimetern. \(ABC\) sind Winkel in Grad, wobei \(A\) um die \(z\)-Achse rotiert, \(B\) rotiert um die \(y\)-Achse und \(C\) rotiert um die \(x\)-Achse. Die Rotationsreihenfolge ist \(z\)-\(y'\)-\(x''\) (i.e. \(x\)-\(y\)-\(z\)) und wird berechnet durch \(r_z(A) r_y(B) r_x(C)\).

    +
    +

    Umrechnung von KUKA-ABC in Quaternionen

    +

    Zur Umrechnung von \(ABC\) Winkeln in Grad in eine Quaternion \(q=(\begin{array}{cccc}x & y & z & w\end{array})\) werden zuerst alle Winkel in das Bogenmaß umgerechnet mit

    +
    +\[\begin{split}A_r = A \frac{\pi}{180} \text{,} \\ +B_r = B \frac{\pi}{180} \text{,} \\ +C_r = C \frac{\pi}{180} \text{,} \\\end{split}\]
    +

    und damit die Quaternion berechnet durch

    +
    +\[\begin{split}x = \cos{(A_r/2)}\cos{(B_r/2)}\sin{(C_r/2)} - \sin{(A_r/2)}\sin{(B_r/2)}\cos{(C_r/2)} \text{,} \\ +y = \cos{(A_r/2)}\sin{(B_r/2)}\cos{(C_r/2)} + \sin{(A_r/2)}\cos{(B_r/2)}\sin{(C_r/2)} \text{,} \\ +z = \sin{(A_r/2)}\cos{(B_r/2)}\cos{(C_r/2)} - \cos{(A_r/2)}\sin{(B_r/2)}\sin{(C_r/2)} \text{,} \\ +w = \cos{(A_r/2)}\cos{(B_r/2)}\cos{(C_r/2)} + \sin{(A_r/2)}\sin{(B_r/2)}\sin{(C_r/2)} \text{.}\end{split}\]
    +
    +
    +

    Umrechnung von Quaternionen in KUKA-ABC

    +

    Die Umrechnung von einer Quaternion \(q=(\begin{array}{cccc}x & y & z & w\end{array})\) mit \(||q||=1\) in \(ABC\) Winkel in Grad kann wie folgt durchgeführt werden.

    +
    +\[\begin{split}A &= \text{atan}_2{(2(wz + xy), 1 - 2(y^2 + z^2))} \frac{180}{\pi} \\ +B &= \text{asin}{(2(wy - zx))} \frac{180}{\pi} \\ +C &= \text{atan}_2{(2(wx + yz), 1 - 2(x^2 + y^2))} \frac{180}{\pi}\end{split}\]
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/pose_format_mitsubishi.html b/v24.04/de/pose_format_mitsubishi.html new file mode 100644 index 0000000..6ceba39 --- /dev/null +++ b/v24.04/de/pose_format_mitsubishi.html @@ -0,0 +1,682 @@ + + + + + + + + + + + Mitsubishi XYZ-ABC Format — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Mitsubishi XYZ-ABC Format

    +

    Das Posenformat, welches von Mitsubishi Robotern benutzt wird, ist das gleiche wie für KUKA Roboter (siehe KUKA XYZ-ABC Format), außer, dass der Winkel \(A\) um die \(x\)-Achse rotiert und \(C\) eine Rotation um die \(z\)-Achse ist. Damit wird die Rotation berechnet durch \(r_z(C) r_y(B) r_x(A)\).

    +
    +

    Umrechnung von Mitsubishi-ABC in Quaternionen

    +

    Zur Umrechnung von \(ABC\) Winkeln in Grad in eine Quaternion \(q=(\begin{array}{cccc}x & y & z & w\end{array})\) werden die Winkel zunächst ins Bogenmaß umgerechnet mit

    +
    +\[\begin{split}A_r = A \frac{\pi}{180} \text{,} \\ +B_r = B \frac{\pi}{180} \text{,} \\ +C_r = C \frac{\pi}{180} \text{,} \\\end{split}\]
    +

    und damit die Quaternion berechnet durch

    +
    +\[\begin{split}x = \cos{(C_r/2)}\cos{(B_r/2)}\sin{(A_r/2)} - \sin{(C_r/2)}\sin{(B_r/2)}\cos{(A_r/2)} \text{,} \\ +y = \cos{(C_r/2)}\sin{(B_r/2)}\cos{(A_r/2)} + \sin{(C_r/2)}\cos{(B_r/2)}\sin{(A_r/2)} \text{,} \\ +z = \sin{(C_r/2)}\cos{(B_r/2)}\cos{(A_r/2)} - \cos{(C_r/2)}\sin{(B_r/2)}\sin{(A_r/2)} \text{,} \\ +w = \cos{(C_r/2)}\cos{(B_r/2)}\cos{(A_r/2)} + \sin{(C_r/2)}\sin{(B_r/2)}\sin{(A_r/2)} \text{.}\end{split}\]
    +
    +
    +

    Umrechnung von Quaternionen in Mitsubishi-ABC

    +

    Die Umrechnung von einer Quaternion \(q=(\begin{array}{cccc}x & y & z & w\end{array})\) mit \(||q||=1\) in \(ABC\) Winkel in Grad kann wie folgt durchgeführt werden.

    +
    +\[\begin{split}A &= \text{atan}_2{(2(wx + yz), 1 - 2(x^2 + y^2))} \frac{180}{\pi} \\ +B &= \text{asin}{(2(wy - zx))} \frac{180}{\pi} \\ +C &= \text{atan}_2{(2(wz + xy), 1 - 2(y^2 + z^2))} \frac{180}{\pi}\end{split}\]
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/pose_format_rt.html b/v24.04/de/pose_format_rt.html new file mode 100644 index 0000000..70cafcc --- /dev/null +++ b/v24.04/de/pose_format_rt.html @@ -0,0 +1,694 @@ + + + + + + + + + + + Rotationsmatrix und Translationsvektor — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + +
      + +
    • rc_visard NG >
    • + +
    • Anhang >
    • + +
    • Rotationsmatrix und Translationsvektor
    • + + +
    • + + + +
    • + +
    + + +
    +
    +
    +
    + +
    +

    Rotationsmatrix und Translationsvektor

    +

    Eine Pose kann mit einer Rotationsmatrix \(R\) und einem Translationsvektor \(T\) definiert werden.

    +
    +\[\begin{split}R = \left(\begin{array}{ccc} + r_{00} & r_{01} & r_{02} \\ + r_{10} & r_{11} & r_{12} \\ + r_{20} & r_{21} & r_{22} +\end{array}\right), \qquad +T = \left(\begin{array}{c} + X \\ + Y \\ + Z +\end{array}\right).\end{split}\]
    +

    Die Posentransformation für einen Punkt \(P\) ist

    +
    +\[P' = R P + T.\]
    +
    +

    Umrechnung von Rotationsmatrizen in Quaternionen

    +

    Die Umrechnung von einer Rotationsmatrix (mit \(det(R)=1\)) in eine Quaternion \(q=(\begin{array}{cccc}x & y & z & w\end{array})\) kann wie folgt durchgeführt werden.

    +
    +\[\begin{split}x &= \text{sign}(r_{21}-r_{12}) \frac{1}{2}\sqrt{\text{max}(0, 1 + r_{00} - r_{11} - r_{22})} \\ +y &= \text{sign}(r_{02}-r_{20}) \frac{1}{2}\sqrt{\text{max}(0, 1 - r_{00} + r_{11} - r_{22})} \\ +z &= \text{sign}(r_{10}-r_{01}) \frac{1}{2}\sqrt{\text{max}(0, 1 - r_{00} - r_{11} + r_{22})} \\ +w &= \frac{1}{2}\sqrt{\text{max}(0, 1 + r_{00} + r_{11} + r_{22})}\end{split}\]
    +

    Der \(\text{sign}\) Operator gibt -1 zurück, falls sein Argument negativ ist. Sonst wird 1 zurück gegeben. Er wird zur Wiederherstellung das Vorzeichens der Wurzel benutzt. Die \(\text{max}\) Funktion stellt sicher, dass das Argument der Wurzel nicht negativ ist, was in der Praxis durch Rundungsfehler passieren kann.

    +
    +
    +

    Umrechnung von Quaternionen in Rotationsmatrizen

    +

    Die Umrechnung von einer Quaternion \(q=(\begin{array}{cccc}x & y & z & w\end{array})\) mit \(||q||=1\) in eine Rotationsmatrix kann wie folgt durchgeführt werden.

    +
    +\[\begin{split}R = 2 \left(\begin{array}{ccc} + \frac{1}{2} - y^2 - z^2 & x y - z w & x z + y w \\ + x y + z w & \frac{1}{2} - x^2 - z^2 & y z - x w \\ + x z - y w & y z + x w & \frac{1}{2} - x^2 - y^2 +\end{array}\right)\end{split}\]
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/pose_format_ur.html b/v24.04/de/pose_format_ur.html new file mode 100644 index 0000000..9a04620 --- /dev/null +++ b/v24.04/de/pose_format_ur.html @@ -0,0 +1,688 @@ + + + + + + + + + + + Universal Robots Posenformat — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Universal Robots Posenformat

    +

    Das Posenformat, welches von Universal Robots verwendet wird, besteht aus einer Position \(XYZ\) in Millimetern und einer Orientierung im Angle-Axis Format \(V=(\begin{array}{ccc}RX & RY & RZ\end{array})^T\). Der Rotationswinkel \(\theta\) im Bogenmaß ist die Länge der Rotationsachse \(U\).

    +
    +\[\begin{split}V = \left(\begin{array}{c}RX \\ RY \\ RZ\end{array}\right) = \left(\begin{array}{c}\theta u_x \\ \theta u_y \\ \theta u_z\end{array}\right)\end{split}\]
    +

    \(V\) wird als Rotationsvektor bezeichnet.

    +
    +

    Umrechnung vom Angle-Axis Format in Quaternionen

    +

    Die Umrechnung von einem Rotationsvektor \(V\) in eine Quaternion \(q=(\begin{array}{cccc}x & y & z & w\end{array})\) kann wie folgt durchgeführt werden.

    +

    Zunächst wird der Winkel \(\theta\) im Bogenmaß aus dem Rotationsvektor \(V\) gewonnen durch

    +
    +\[\theta = \sqrt{RX^2 + RY^2 + RZ^2}\text{.}\]
    +

    Wenn \(\theta = 0\), dann ist die Quaternion gleich \(q=(\begin{array}{cccc}0 & 0 & 0 & 1\end{array})\), sonst wird sie berechnet durch

    +
    +\[\begin{split}x = RX \frac{\sin(\theta/2)}{\theta}\text{,} \\ +y = RY \frac{\sin(\theta/2)}{\theta}\text{,} \\ +z = RZ \frac{\sin(\theta/2)}{\theta}\text{,} \\ +w = \cos(\theta/2)\text{.}\end{split}\]
    +
    +
    +

    Umrechnung von Quaternionen ins Angle-Axis Format

    +

    Die Umrechnung von einer Quaternion \(q=(\begin{array}{cccc}x & y & z & w\end{array})\) mit \(||q||=1\) in einen Rotationsvektor im Angle-Axis Format kann wie folgt durchgeführt werden.

    +

    Zunächst wird der Winkel \(\theta\) im Bogenmaß aus dem Quaternion gewonnen durch

    +
    +\[\theta = 2\cdot\text{acos}(w)\text{.}\]
    +

    Wenn \(\theta = 0\), dann ist der Rotationsvektor \(V=(\begin{array}{ccc}0 & 0 & 0\end{array})^T\), sonst wird er berechnet durch

    +
    +\[\begin{split}RX = \theta \frac{x}{\sqrt{1-w^2}}\text{,} \\ +RY = \theta \frac{y}{\sqrt{1-w^2}}\text{,} \\ +RZ = \theta \frac{z}{\sqrt{1-w^2}}\text{.}\end{split}\]
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/pose_format_yaskawa.html b/v24.04/de/pose_format_yaskawa.html new file mode 100644 index 0000000..e54011c --- /dev/null +++ b/v24.04/de/pose_format_yaskawa.html @@ -0,0 +1,679 @@ + + + + + + + + + + + Yaskawa Posenformat — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Yaskawa Posenformat

    +

    Das Posenformat, welches von Yaskawa Robotern benutzt wird, besteht aus einer Position \(XYZ\) in Millimetern und einer Orientierung, welche durch drei Winkel in Grad gegeben ist. \(Rx\) rotiert um die \(x\)-Achse, \(Ry\) rotiert um die \(y\)-Achse und \(Rz\) rotiert um die \(z\)-Achse. Die Rotationsreihenfolge ist \(x\)-\(y\)-\(z\) und wird berechnet durch \(r_z(Rz) r_y(Ry) r_x(Rx)\).

    +
    +

    Umrechnung von Yaskawa Rx, Ry, Rz in Quaternionen

    +

    Zur Umrechnung von \(Rx, Ry, Rz\) Winkeln in Grad in eine Quaternion \(q=(\begin{array}{cccc}x & y & z & w\end{array})\) werden zunächst die Winkel ins Bogenmaß umgerechnet

    +
    +\[\begin{split}X_r = Rx \frac{\pi}{180} \text{,} \\ +Y_r = Ry \frac{\pi}{180} \text{,} \\ +Z_r = Rz \frac{\pi}{180} \text{,} \\\end{split}\]
    +

    und damit wird die Quaternion berechnet als

    +
    +\[\begin{split}x = \cos{(Z_r/2)}\cos{(Y_r/2)}\sin{(X_r/2)} - \sin{(Z_r/2)}\sin{(Y_r/2)}\cos{(X_r/2)} \text{,} \\ +y = \cos{(Z_r/2)}\sin{(Y_r/2)}\cos{(X_r/2)} + \sin{(Z_r/2)}\cos{(Y_r/2)}\sin{(X_r/2)} \text{,} \\ +z = \sin{(Z_r/2)}\cos{(Y_r/2)}\cos{(X_r/2)} - \cos{(Z_r/2)}\sin{(Y_r/2)}\sin{(X_r/2)} \text{,} \\ +w = \cos{(Z_r/2)}\cos{(Y_r/2)}\cos{(X_r/2)} + \sin{(Z_r/2)}\sin{(Y_r/2)}\sin{(X_r/2)} \text{.}\end{split}\]
    +
    +
    +

    Umrechnung von Quaternionen in Yaskawa Rx, Ry, Rz

    +

    Die Umrechnung von einer Quaternion \(q=(\begin{array}{cccc}x & y & z & w\end{array})\) mit \(||q||=1\) in \(Rx, Ry, Rz\) Winkel in Grad kann wie folgt durchgeführt werden.

    +
    +\[\begin{split}Rx &= \text{atan}_2{(2(wx + yz), 1 - 2(x^2 + y^2))} \frac{180}{\pi} \\ +Ry &= \text{asin}{(2(wy - zx))} \frac{180}{\pi} \\ +Rz &= \text{atan}_2{(2(wz + xy), 1 - 2(y^2 + z^2))} \frac{180}{\pi}\end{split}\]
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/rest_api.html b/v24.04/de/rest_api.html new file mode 100644 index 0000000..8d11726 --- /dev/null +++ b/v24.04/de/rest_api.html @@ -0,0 +1,672 @@ + + + + + + + + + + + REST-API-Schnittstelle — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    REST-API-Schnittstelle

    +

    Neben der GenICam-Schnittstelle bietet der rc_visard NG eine umfassende RESTful-Web-Schnittstelle (REST-API), auf die jeder HTTP-Client und jede HTTP-Bibliothek zugreifen kann. Während die meisten Parameter, Services und Funktionen auch über die benutzerfreundliche Web GUI zugänglich sind, dient die REST-API eher als Maschine-Maschine-Schnittstelle für folgende programmgesteuerte Aufgaben:

    +
      +
    • Setzen und Abrufen der Laufzeitparameter der Softwaremodule, z.B. der Stereokamera oder von Bildverarbeitungsmodulen,
    • +
    • Aufrufen von Services, z.B. zum Starten und Stoppen einzelner Softwaremodule, oder zum Nutzen spezieller Funktionen, wie der Hand-Auge-Kalibrierung,
    • +
    • Abruf des aktuellen Systemstatus und des Status einzelner Softwaremodule, sowie
    • +
    • Aktualisierung der Firmware des rc_visard NG oder seiner Lizenz.
    • +
    +
    +

    Bemerkung

    +

    In der REST-API des rc_visard NG bezeichnet der Begriff Node ein Softwaremodul, das gewisse algorithmische Funktionen bündelt und eine ganzheitliche Benutzeroberfläche (Parameter, Services, aktueller Status) besitzt. Beispiele für solche Module sind das Stereo-Matching-Modul oder das Modul zur Hand-Auge-Kalibrierung.

    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/rest_api_datamodel.html b/v24.04/de/rest_api_datamodel.html new file mode 100644 index 0000000..0cbf701 --- /dev/null +++ b/v24.04/de/rest_api_datamodel.html @@ -0,0 +1,1629 @@ + + + + + + + + + + + Datentyp-Definitionen — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Datentyp-Definitionen

    +

    Die REST-API definiert folgende Datenmodelle, die verwendet werden, um auf die verfügbaren Ressourcen zuzugreifen oder diese zu ändern, entweder als benötigte Attribute/Parameter oder als Rückgabewerte.

    +
    +
    DNS:
    +

    DNS-Server Einstellungen.

    +

    Ein Objekt des Typs DNS besitzt folgende Eigenschaften:

    +
      +
    • dns_servers (string-Array)
    • +
    • manual_dns_servers (string-Array)
    • +
    +

    Musterobjekt

    +
    {
    +  "dns_servers": [
    +    "string",
    +    "string"
    +  ],
    +  "manual_dns_servers": [
    +    "string",
    +    "string"
    +  ]
    +}
    +
    +
    +

    DNS-Objekte sind in SysInfo enthalten und werden für folgende Anfragen verwendet:

    +
    +
    +
    +
    +
    +
    FirmwareInfo:
    +

    Informationen zu aktuell aktiven und inaktiven Firmware-Images und dazu, welches Image für den Boot-Vorgang verwendet wird.

    +

    Ein Objekt des Typs FirmwareInfo besitzt folgende Eigenschaften:

    +
      +
    • active_image (ImageInfo): siehe Beschreibung von ImageInfo.
    • +
    • fallback_booted (boolean): TRUE, wenn das gewünschte Image nicht hochgefahren werden konnte und ein Fallback auf das zuvor genutzte Image vorgenommen wurde.
    • +
    • inactive_image (ImageInfo): siehe Beschreibung von ImageInfo.
    • +
    • next_boot_image (string): Firmware-Image, das beim nächsten Neustart geladen wird (entweder active_image oder inactive_image).
    • +
    +

    Musterobjekt

    +
    {
    +  "active_image": {
    +    "image_version": "string"
    +  },
    +  "fallback_booted": false,
    +  "inactive_image": {
    +    "image_version": "string"
    +  },
    +  "next_boot_image": "string"
    +}
    +
    +
    +

    FirmwareInfo-Objekte sind in SysInfo enthalten und werden für folgende Anfragen verwendet:

    +
    +
    +
    +
    +
    +
    GripperElement:
    +

    CAD-Greiferelement

    +

    Ein Objekt des Typs GripperElement besitzt folgende Eigenschaften:

    +
      +
    • id (string): Eindeutiger Name des Elements
    • +
    +

    Musterobjekt

    +
    {
    +  "id": "string"
    +}
    +
    +
    +

    GripperElement-Objekte werden in folgenden Anfragen verwendet:

    +
    +
    +
    +
    +
    +
    HostPort:
    +

    Auf dem Host verfügbarer Port

    +

    Ein Objekt des Typs HostPort besitzt folgende Eigenschaften:

    +
      +
    • port (integer)
    • +
    • protocol (string)
    • +
    +

    Musterobjekt

    +
    {
    +  "port": 0,
    +  "protocol": "string"
    +}
    +
    +
    +

    HostPort-Objekte sind in UserSpaceContainer enthalten.

    +
    +
    +
    +
    ImageInfo:
    +

    Informationen zu einem bestimmten Firmware-Image.

    +

    Ein Objekt des Typs ImageInfo besitzt folgende Eigenschaften:

    +
      +
    • image_version (string): Image-Version.
    • +
    +

    Musterobjekt

    +
    {
    +  "image_version": "string"
    +}
    +
    +
    +

    ImageInfo-Objekte sind in FirmwareInfo enthalten.

    +
    +
    +
    +
    LicenseComponentConstraint:
    +

    Einschränkungen für die Modul-Version.

    +

    Ein Objekt des Typs LicenseComponentConstraint besitzt folgende Eigenschaften:

    +
      +
    • max_version (string) - optionale höchste unterstützte Version (exclusive)
    • +
    • min_version (string) - optionale minimale unterstützte Version (inclusive)
    • +
    +

    Musterobjekt

    +
    {
    +  "max_version": "string",
    +  "min_version": "string"
    +}
    +
    +
    +

    LicenseComponentConstraint-Objekte sind in LicenseConstraints enthalten.

    +
    +
    +
    +
    LicenseComponents:
    +

    Liste der Lizenzstatus-Angaben der einzelnen Softwaremodule: Der zugehörige Statusindikator ist auf TRUE gesetzt, wenn das entsprechende Modul mit einer installierten Softwarelizenz entsperrt ist.

    +

    Ein Objekt des Typs LicenseComponents besitzt folgende Eigenschaften:

    +
      +
    • hand_eye_calibration (boolean): Modul zur Hand-Auge-Kalibrierung.
    • +
    • rectification (boolean): Modul zur Bildrektifizierung.
    • +
    • stereo (boolean): Stereo-Matching-Modul.
    • +
    +

    Musterobjekt

    +
    {
    +  "hand_eye_calibration": false,
    +  "rectification": false,
    +  "stereo": false
    +}
    +
    +
    +

    LicenseComponents-Objekte sind in LicenseInfo enthalten.

    +
    +
    +
    +
    LicenseConstraints:
    +

    Versionseinschränkungen für Module.

    +

    Ein Objekt des Typs LicenseConstraints besitzt folgende Eigenschaften:

    + +

    Musterobjekt

    +
    {
    +  "image_version": {
    +    "max_version": "string",
    +    "min_version": "string"
    +  }
    +}
    +
    +
    +

    LicenseConstraints-Objekte sind in LicenseInfo enthalten.

    +
    +
    +
    +
    LicenseInfo:
    +

    Informationen zur aktuell auf dem Gerät angewandten Softwarelizenz.

    +

    Ein Objekt des Typs LicenseInfo besitzt folgende Eigenschaften:

    + +

    Musterobjekt

    +
    {
    +  "components": {
    +    "hand_eye_calibration": false,
    +    "rectification": false,
    +    "stereo": false
    +  },
    +  "components_constraints": {
    +    "image_version": {
    +      "max_version": "string",
    +      "min_version": "string"
    +    }
    +  },
    +  "valid": false
    +}
    +
    +
    +

    LicenseInfo-Objekte werden in folgenden Anfragen verwendet:

    +
    +
    +
    +
    +
    +
    Log:
    +

    Inhalt einer bestimmten Logdatei im JSON-Format.

    +

    Ein Objekt des Typs Log besitzt folgende Eigenschaften:

    +
      +
    • date (float): UNIX-Uhrzeit, zu der das Log zuletzt geändert wurde.
    • +
    • log (LogEntry-Array): die eigentlichen Logeinträge.
    • +
    • name (string): Name der Logdatei.
    • +
    • size (Integer): Größe der Logdatei in Bytes.
    • +
    +

    Musterobjekt

    +
    {
    +  "date": 0,
    +  "log": [
    +    {
    +      "component": "string",
    +      "level": "string",
    +      "message": "string",
    +      "timestamp": 0
    +    },
    +    {
    +      "component": "string",
    +      "level": "string",
    +      "message": "string",
    +      "timestamp": 0
    +    }
    +  ],
    +  "name": "string",
    +  "size": 0
    +}
    +
    +
    +

    Log-Objekte werden in folgenden Anfragen verwendet:

    +
    +
    +
    +
    +
    +
    LogEntry:
    +

    Darstellung eines einzelnen Logeintrags in einer Logdatei.

    +

    Ein Objekt des Typs LogEntry besitzt folgende Eigenschaften:

    +
      +
    • component (string): Name des Moduls, das diesen Eintrag angelegt hat.
    • +
    • level (string): Logstufe (mögliche Werte: DEBUG, INFO, WARN, ERROR oder FATAL)
    • +
    • message (string): eigentliche Lognachricht.
    • +
    • timestamp (float): UNIX-Uhrzeit des Logeintrags.
    • +
    +

    Musterobjekt

    +
    {
    +  "component": "string",
    +  "level": "string",
    +  "message": "string",
    +  "timestamp": 0
    +}
    +
    +
    +

    LogEntry-Objekte sind in Log enthalten.

    +
    +
    +
    +
    LogInfo:
    +

    Informationen zu einer bestimmten Logdatei.

    +

    Ein Objekt des Typs LogInfo besitzt folgende Eigenschaften:

    +
      +
    • date (float): UNIX-Uhrzeit, zu der das Log zuletzt geändert wurde.
    • +
    • name (string): Name der Logdatei.
    • +
    • size (Integer): Größe der Logdatei in Bytes.
    • +
    +

    Musterobjekt

    +
    {
    +  "date": 0,
    +  "name": "string",
    +  "size": 0
    +}
    +
    +
    +

    LogInfo-Objekte werden in folgenden Anfragen verwendet:

    +
    +
    +
    +
    +
    +
    +
    ManualDNSServers:
    +

    Liste der manuellen DNS-Server.

    +

    Ein Objekt des Typs ManualDNSServers besitzt folgende Eigenschaften:

    +
      +
    • manual_dns_servers (string-Array)
    • +
    +

    Musterobjekt

    +
    {
    +  "manual_dns_servers": [
    +    "string",
    +    "string"
    +  ]
    +}
    +
    +
    +

    ManualDNSServers-Objekte werden in folgenden Anfragen verwendet:

    +
    +
    +
    +
    +
    +
    NetworkInfo:
    +

    Aktuelle Netzwerk Konfiguration.

    +

    Ein Objekt des Typs NetworkInfo besitzt folgende Eigenschaften:

    +
      +
    • current_method (string) - Methode mit der die aktuellen Einstellungen gesetzt wurden (mögliche Werte: INIT, LinkLocal, DHCP, PersistentIP, TemporaryIP)
    • +
    • default_gateway (string) - aktueller Default Gateway
    • +
    • ip_address (string) - aktuelle IP-Adresse
    • +
    • settings (NetworkSettings) - siehe Beschreibung von NetworkSettings
    • +
    • subnet_mask (string) - aktuelle Subnetzmaske
    • +
    +

    Musterobjekt

    +
    {
    +  "current_method": "string",
    +  "default_gateway": "string",
    +  "ip_address": "string",
    +  "settings": {
    +    "dhcp_enabled": false,
    +    "persistent_default_gateway": "string",
    +    "persistent_ip_address": "string",
    +    "persistent_ip_enabled": false,
    +    "persistent_subnet_mask": "string"
    +  },
    +  "subnet_mask": "string"
    +}
    +
    +
    +

    NetworkInfo-Objekte sind in SysInfo enthalten und werden für folgende Anfragen verwendet:

    +
    +
    +
    +
    +
    +
    NetworkSettings:
    +

    Aktuelle Netzwerk Einstellungen.

    +

    Ein Objekt des Typs NetworkSettings besitzt folgende Eigenschaften:

    +
      +
    • dhcp_enabled (boolean) - DHCP eingeschaltet
    • +
    • persistent_default_gateway (string) - Persistenter Default Gateway
    • +
    • persistent_ip_address (string) - Persistente IP-Adresse
    • +
    • persistent_ip_enabled (boolean) - Persistente IP aktiviert
    • +
    • persistent_subnet_mask (string) - Persistente Subnetzmaske
    • +
    +

    Musterobjekt

    +
    {
    +  "dhcp_enabled": false,
    +  "persistent_default_gateway": "string",
    +  "persistent_ip_address": "string",
    +  "persistent_ip_enabled": false,
    +  "persistent_subnet_mask": "string"
    +}
    +
    +
    +

    NetworkSettings-Objekte sind in NetworkInfo enthalten und werden für folgende Anfragen verwendet:

    +
    +
    +
    +
    +
    +
    NodeInfo:
    +

    Beschreibung eines auf dem Gerät laufenden Softwaremoduls.

    +

    Ein Objekt des Typs NodeInfo besitzt folgende Eigenschaften:

    +
      +
    • name (string): Name des Moduls.
    • +
    • parameters (string-Array): Liste der Laufzeitparameter des Moduls.
    • +
    • services (string-Array): Liste der von diesem Modul angebotenen Services.
    • +
    • status (string): Status des Moduls (mögliche Werte: unknown, down, idle oder running).
    • +
    +

    Musterobjekt

    +
    {
    +  "name": "string",
    +  "parameters": [
    +    "string",
    +    "string"
    +  ],
    +  "services": [
    +    "string",
    +    "string"
    +  ],
    +  "status": "string"
    +}
    +
    +
    +

    NodeInfo-Objekte werden in folgenden Anfragen verwendet:

    +
    +
    +
    +
    +
    +
    NodeStatus:
    +

    Detaillierter aktueller Status des Moduls, einschließlich Laufzeitstatistik.

    +

    Ein Objekt des Typs NodeStatus besitzt folgende Eigenschaften:

    +
      +
    • status (string): Status des Moduls (mögliche Werte: unknown, down, idle oder running).
    • +
    • timestamp (float): UNIX-Uhrzeit, zu der die Werte zuletzt aktualisiert wurden.
    • +
    • values (object): Dictionary (Schlüssel-Werte-Auflistung) mit den aktuellen Statuswerten/Statistiken des Moduls.
    • +
    +

    Musterobjekt

    +
    {
    +  "status": "string",
    +  "timestamp": 0,
    +  "values": {}
    +}
    +
    +
    +

    NodeStatus-Objekte werden in folgenden Anfragen verwendet:

    +
    +
    +
    +
    +
    +
    NtpStatus:
    +

    Status der NTP-Zeitsynchronisierung.

    +

    Ein Objekt des Typs NtpStatus besitzt folgende Eigenschaften:

    +
      +
    • accuracy (string): vom Network Time Protocol (NTP) gemeldete Genauigkeit der Zeitsynchronisierung.
    • +
    • synchronized (boolean): synchronisiert mit dem NTP-Server.
    • +
    +

    Musterobjekt

    +
    {
    +  "accuracy": "string",
    +  "synchronized": false
    +}
    +
    +
    +

    NtpStatus-Objekte sind in SysInfo enthalten.

    +
    +
    +
    +
    Parameter:
    +

    Darstellung der Laufzeitparameter eines Moduls: Der Datentyp des Werts („value“) eines Parameters (und damit der Datentyp der Felder „min“, „max“ und „default“) lässt sich vom Feld „type“ ableiten und kann ein primitiver Datentyp sein.

    +

    Ein Objekt des Typs Parameter besitzt folgende Eigenschaften:

    +
      +
    • default (Typ nicht definiert): ab Werk voreingestellter Wert des Parameters.
    • +
    • description (string): Beschreibung des Parameters.
    • +
    • max (Typ nicht definiert): Höchstwert, der diesem Parameter zugewiesen werden kann.
    • +
    • min (Typ nicht definiert): Mindestwert, der diesem Parameter zugewiesen werden kann.
    • +
    • name (string): Name des Parameters.
    • +
    • type (string): als Zeichenfolge dargestellter primitiver Datentyp des Parameters (mögliche Werte: bool, int8, uint8, int16, uint16, int32, uint32, int64, uint64, float32, float64 oder string).
    • +
    • value (Typ nicht definiert): aktueller Wert des Parameters.
    • +
    +

    Musterobjekt

    +
    {
    +  "default": {},
    +  "description": "string",
    +  "max": {},
    +  "min": {},
    +  "name": "string",
    +  "type": "string",
    +  "value": {}
    +}
    +
    +
    +

    Parameter-Objekte werden in folgenden Anfragen verwendet:

    +
    +
    +
    +
    +
    +
    ParameterNameValue:
    +

    Parametername und -wert. Der Typ des Parameterwerts (Felder ‚value‘ und ‚min‘, ‚max‘, ‚default‘) ist durch das Feld ‚type‘ angegeben und kann einer der eingebauten primitiven Datentypen sein.

    +

    Ein Objekt des Typs ParameterNameValue besitzt folgende Eigenschaften:

    +
      +
    • name (string): Name des Parameters.
    • +
    • value (Typ nicht definiert): aktueller Wert des Parameters.
    • +
    +

    Musterobjekt

    +
    {
    +  "name": "string",
    +  "value": {}
    +}
    +
    +
    +

    ParameterNameValue-Objekte werden in folgenden Anfragen verwendet:

    +
    +
    +
    +
    +
    +
    ParameterValue:
    +

    Parameterwert. Der Typ des Parameterwerts (Felder ‚value‘ und ‚min‘, ‚max‘, ‚default‘) ist durch das Feld ‚type‘ angegeben und kann einer der eingebauten primitiven Datentypen sein.

    +

    Ein Objekt des Typs ParameterValue besitzt folgende Eigenschaften:

    +
      +
    • value (Typ nicht definiert): aktueller Wert des Parameters.
    • +
    +

    Musterobjekt

    +
    {
    +  "value": {}
    +}
    +
    +
    +

    ParameterValue-Objekte werden in folgenden Anfragen verwendet:

    +
    +
    +
    +
    +
    +
    PtpStatus:
    +

    Status der PTP-Zeitsynchronisierung gemäß IEEE 1588.

    +

    Ein Objekt des Typs PtpStatus besitzt folgende Eigenschaften:

    +
      +
    • master_ip (string): IP-Adresse des Haupttaktgebers.
    • +
    • offset (float): zeitlicher Versatz zum Haupttaktgeber in Sekunden.
    • +
    • offset_dev (float): Standardabweichung des zeitlichen Versatzes zum Haupttaktgeber in Sekunden.
    • +
    • offset_mean (float): mittlere Zeitverschiebung in Sekunden zum Haupttaktgeber.
    • +
    • state (string): PTP-Zustand (mögliche Werte: off, unknown, INITIALIZING, FAULTY, DISABLED, LISTENING, PASSIVE, UNCALIBRATED oder SLAVE).
    • +
    +

    Musterobjekt

    +
    {
    +  "master_ip": "string",
    +  "offset": 0,
    +  "offset_dev": 0,
    +  "offset_mean": 0,
    +  "state": "string"
    +}
    +
    +
    +

    PtpStatus-Objekte sind in SysInfo enthalten.

    +
    +
    +
    +
    Service:
    +

    Darstellung eines von einem Modul angebotenen Services.

    +

    Ein Objekt des Typs Service besitzt folgende Eigenschaften:

    + +

    Musterobjekt

    +
    {
    +  "args": {},
    +  "description": "string",
    +  "name": "string",
    +  "response": {}
    +}
    +
    +
    +

    Service-Objekte werden in folgenden Anfragen verwendet:

    +
    +
    +
    +
    +
    +
    ServiceArgs:
    +

    Argumente, die für den Aufruf eines Services benötigt werden: Diese Argumente werden in der Regel in einem (verschachtelten) Dictionary (Schlüssel-Werte-Auflistung) dargestellt. Der genaue Inhalt dieses Dictionarys hängt vom jeweiligen Modul und vom Serviceaufruf ab.

    +

    ServiceArg-Objekte sind in Service enthalten.

    +
    +
    +
    +
    ServiceResponse:
    +

    Die von dem Serviceaufruf zurückgegebene Antwort: Die Antwort wird in der Regel in einem (verschachtelten) Dictionary (Schlüssel-Werte-Auflistung) dargestellt. Der genaue Inhalt dieses Dictionarys hängt vom jeweiligen Modul und von dem Serviceaufruf ab.

    +

    ServiceResponse-Objekte sind in Service enthalten.

    +
    +
    +
    +
    SysInfo:
    +

    Systeminformationen über das Gerät.

    +

    Ein Objekt des Typs SysInfo besitzt folgende Eigenschaften:

    +
      +
    • dns (DNS): siehe Beschreibung von DNS.
    • +
    • firmware (FirmwareInfo): siehe Beschreibung von FirmwareInfo.
    • +
    • hostname (string): Host-Name.
    • +
    • link_speed (Integer): Ethernet-Verbindungsgeschwindigkeit in Mb/Sekunde.
    • +
    • mac (string): MAC-Adresse.
    • +
    • network (NetworkInfo): siehe Beschreibung von NetworkInfo
    • +
    • ntp_status (NtpStatus): siehe Beschreibung von NtpStatus.
    • +
    • ptp_status (PtpStatus): siehe Beschreibung von PtpStatus.
    • +
    • ready (boolean): Das System ist vollständig hochgefahren und betriebsbereit.
    • +
    • serial (string): Seriennummer des Geräts.
    • +
    • time (float): Systemzeit als UNIX-Zeitstempel.
    • +
    • ui_lock (UILock): siehe Beschreibung von UILock
    • +
    • uptime (float): Betriebszeit in Sekunden.
    • +
    +

    Musterobjekt

    +
    {
    +  "dns": {
    +    "dns_servers": [
    +      "string",
    +      "string"
    +    ],
    +    "manual_dns_servers": [
    +      "string",
    +      "string"
    +    ]
    +  },
    +  "firmware": {
    +    "active_image": {
    +      "image_version": "string"
    +    },
    +    "fallback_booted": false,
    +    "inactive_image": {
    +      "image_version": "string"
    +    },
    +    "next_boot_image": "string"
    +  },
    +  "hostname": "string",
    +  "link_speed": 0,
    +  "mac": "string",
    +  "network": {
    +    "current_method": "string",
    +    "default_gateway": "string",
    +    "ip_address": "string",
    +    "settings": {
    +      "dhcp_enabled": false,
    +      "persistent_default_gateway": "string",
    +      "persistent_ip_address": "string",
    +      "persistent_ip_enabled": false,
    +      "persistent_subnet_mask": "string"
    +    },
    +    "subnet_mask": "string"
    +  },
    +  "ntp_status": {
    +    "accuracy": "string",
    +    "synchronized": false
    +  },
    +  "ptp_status": {
    +    "master_ip": "string",
    +    "offset": 0,
    +    "offset_dev": 0,
    +    "offset_mean": 0,
    +    "state": "string"
    +  },
    +  "ready": false,
    +  "serial": "string",
    +  "time": 0,
    +  "ui_lock": {
    +    "enabled": false
    +  },
    +  "uptime": 0
    +}
    +
    +
    +

    SysInfo-Objekte werden in folgenden Anfragen verwendet:

    +
    +
    +
    +
    +
    +
    Template:
    +

    Template für die Erkennung

    +

    Ein Objekt des Typs Template besitzt folgende Eigenschaften:

    +
      +
    • id (string): Eindeutiger Name des Templates
    • +
    +

    Musterobjekt

    +
    {
    +  "id": "string"
    +}
    +
    +
    +

    Template-Objekte werden in folgenden Anfragen verwendet:

    +
    +
    +
    +
    +
    +
    UILock:
    +

    UI Lock Status.

    +

    Ein Objekt des Typs UILock besitzt folgende Eigenschaften:

    +
      +
    • enabled (boolean)
    • +
    +

    Musterobjekt

    +
    {
    +  "enabled": false
    +}
    +
    +
    +

    UILock-Objekte sind in SysInfo enthalten und werden für folgende Anfragen verwendet:

    +
    +
    +
    +
    +
    +
    UserSpace:
    +

    UserSpace Information

    +

    Ein Objekt des Typs UserSpace besitzt folgende Eigenschaften:

    +
      +
    • apps (UserSpaceApp-Array): die UserSpace Apps.
    • +
    • available (boolean) - UserSpace verfügbar
    • +
    • enabled (boolean) - UserSpace eingeschaltet
    • +
    +

    Musterobjekt

    +
    {
    +  "apps": [
    +    {
    +      "containers": [
    +        {
    +          "description": "string",
    +          "health": "string",
    +          "host_ports": [
    +            {
    +              "port": 0,
    +              "protocol": "string"
    +            },
    +            {
    +              "port": 0,
    +              "protocol": "string"
    +            }
    +          ],
    +          "name": "string",
    +          "status": "string",
    +          "title": "string",
    +          "url": "string",
    +          "vendor": "string",
    +          "version": "string"
    +        },
    +        {
    +          "description": "string",
    +          "health": "string",
    +          "host_ports": [
    +            {
    +              "port": 0,
    +              "protocol": "string"
    +            },
    +            {
    +              "port": 0,
    +              "protocol": "string"
    +            }
    +          ],
    +          "name": "string",
    +          "status": "string",
    +          "title": "string",
    +          "url": "string",
    +          "vendor": "string",
    +          "version": "string"
    +        }
    +      ],
    +      "name": "string",
    +      "type": "string"
    +    },
    +    {
    +      "containers": [
    +        {
    +          "description": "string",
    +          "health": "string",
    +          "host_ports": [
    +            {
    +              "port": 0,
    +              "protocol": "string"
    +            },
    +            {
    +              "port": 0,
    +              "protocol": "string"
    +            }
    +          ],
    +          "name": "string",
    +          "status": "string",
    +          "title": "string",
    +          "url": "string",
    +          "vendor": "string",
    +          "version": "string"
    +        },
    +        {
    +          "description": "string",
    +          "health": "string",
    +          "host_ports": [
    +            {
    +              "port": 0,
    +              "protocol": "string"
    +            },
    +            {
    +              "port": 0,
    +              "protocol": "string"
    +            }
    +          ],
    +          "name": "string",
    +          "status": "string",
    +          "title": "string",
    +          "url": "string",
    +          "vendor": "string",
    +          "version": "string"
    +        }
    +      ],
    +      "name": "string",
    +      "type": "string"
    +    }
    +  ],
    +  "available": false,
    +  "enabled": false
    +}
    +
    +
    +

    UserSpace-Objekte werden in folgenden Anfragen verwendet:

    +
    +
    +
    +
    +
    +
    UserSpaceApp:
    +

    UserSpace app

    +

    Ein Objekt des Typs UserSpaceApp besitzt folgende Eigenschaften:

    +
      +
    • containers (UserSpaceContainer-Array) - Container in dieser App
    • +
    • name (string): Name der App.
    • +
    • type (string): Typ der App (mögliche Werte: container, compose).
    • +
    +

    Musterobjekt

    +
    {
    +  "containers": [
    +    {
    +      "description": "string",
    +      "health": "string",
    +      "host_ports": [
    +        {
    +          "port": 0,
    +          "protocol": "string"
    +        },
    +        {
    +          "port": 0,
    +          "protocol": "string"
    +        }
    +      ],
    +      "name": "string",
    +      "status": "string",
    +      "title": "string",
    +      "url": "string",
    +      "vendor": "string",
    +      "version": "string"
    +    },
    +    {
    +      "description": "string",
    +      "health": "string",
    +      "host_ports": [
    +        {
    +          "port": 0,
    +          "protocol": "string"
    +        },
    +        {
    +          "port": 0,
    +          "protocol": "string"
    +        }
    +      ],
    +      "name": "string",
    +      "status": "string",
    +      "title": "string",
    +      "url": "string",
    +      "vendor": "string",
    +      "version": "string"
    +    }
    +  ],
    +  "name": "string",
    +  "type": "string"
    +}
    +
    +
    +

    UserSpaceApp-Objekte sind in UserSpace enthalten.

    +
    +
    +
    +
    UserSpaceContainer:
    +

    Container

    +

    Ein Objekt des Typs UserSpaceContainer besitzt folgende Eigenschaften:

    +
      +
    • description (string) - Wert des Labels org.opencontainers.image.description
    • +
    • health (string): Health (Gesundheit) des Containers (falls der Container einen Health-Check hat) (mögliche Werte: starting, healthy oder unhealthy).
    • +
    • host_ports (HostPort-Array): auf dem Host verfügbare Ports
    • +
    • name (string): Name des Containers.
    • +
    • status (string): Status des Containers (mögliche Werte: restarting, running, paused oder exited).
    • +
    • title (string) - Wert des Labels org.opencontainers.image.title
    • +
    • url (string) - Wert des Labels org.opencontainers.image.url
    • +
    • vendor (string) - Wert des Labels org.opencontainers.image.vendor
    • +
    • version (string) - Wert des Labels org.opencontainers.image.version
    • +
    +

    Musterobjekt

    +
    {
    +  "description": "string",
    +  "health": "string",
    +  "host_ports": [
    +    {
    +      "port": 0,
    +      "protocol": "string"
    +    },
    +    {
    +      "port": 0,
    +      "protocol": "string"
    +    }
    +  ],
    +  "name": "string",
    +  "status": "string",
    +  "title": "string",
    +  "url": "string",
    +  "vendor": "string",
    +  "version": "string"
    +}
    +
    +
    +

    UserSpaceContainer-Objekte sind in UserSpaceApp enthalten.

    +
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/rest_api_general.html b/v24.04/de/rest_api_general.html new file mode 100644 index 0000000..92e5a0f --- /dev/null +++ b/v24.04/de/rest_api_general.html @@ -0,0 +1,810 @@ + + + + + + + + + + + Allgemeine Struktur der Programmierschnittstelle (API) — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Allgemeine Struktur der Programmierschnittstelle (API)

    +

    Der allgemeine Einstiegspunkt zur Programmierschnittstelle (API) des rc_visard NG ist http://<host>/api/ wobei <host> entweder die IP-Adresse des Geräts ist oder sein dem jeweiligen DHCP-Server bekannter Host-Name (siehe Netzwerkkonfiguration). Greift der Benutzer über einen Webbrowser auf diese Adresse zu, kann er die Programmierschnittstelle während der Laufzeit mithilfe der Swagger UI erkunden und testen.

    +

    Für die eigentlichen HTTP-Anfragen wird dem Einstiegspunkt der Programmierschnittstelle die aktuelle Version der Schnittstelle als Postfix angehangen, d.h. http://<host>/api/v2. Alle Daten, die an die REST-API gesandt und von ihr empfangen werden, entsprechen dem JSON-Datenformat (JavaScript Object Notation). Die Programmierschnittstelle ist so gestaltet, dass der Benutzer die in Verfügbare Ressourcen und Anfragen aufgelisteten sogenannten Ressourcen über die folgenden HTTP-Anforderungen anlegen, abrufen, ändern und löschen kann.

    + ++++ + + + + + + + + + + + + + + + + + + + +
    AnfragetypBeschreibung
    GETZugriff auf eine oder mehrere Ressourcen und Rückgabe des Ergebnisses im JSON-Format
    PUTÄnderung einer Ressource und Rückgabe der modifizierten Ressource im JSON-Format
    DELETELöschen einer Ressource
    POSTUpload einer Datei (z.B. einer Lizenz oder eines Firmware-Images)
    +

    Je nach der Art der Anfrage und Datentyp können die Argumente für HTTP-Anfragen als Teil des Pfads (URI) zur Ressource, als Abfrage-Zeichenfolge, als Formulardaten oder im Body der Anfrage übertragen werden. Die folgenden Beispiele nutzen das Kommandozeilenprogramm curl, das für verschiedene Betriebssysteme verfügbar ist (siehe https://curl.haxx).se.

    +
      +
    • Abruf des aktuellen Status eines Moduls, wobei sein Name im Pfad (URI) verschlüsselt ist

      +
      curl -X GET 'http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching'
      +
      +
      +
    • +
    • Abruf einiger Parameterwerte eines Moduls über eine Abfragezeichenfolge

      +
      curl -X GET 'http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters?name=minconf&name=maxdepth'
      +
      +
      +
    • +
    +
      +
    • Setzen eines Modulparameters als JSON-formatierter Text im Body der Anfrage

      +
      curl -X PUT --header 'Content-Type: application/json' -d '[{"name": "mindepth", "value": 0.1}]' 'http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters'
      +
      +
      +
    • +
    +

    Zur Beantwortung solcher Anfragen greift die Programmierschnittstelle des rc_visard NG auf übliche Rückgabecodes zurück:

    + ++++ + + + + + + + + + + + + + + + + + + + + + + +
    StatuscodeBeschreibung
    200 OKDie Anfrage war erfolgreich. Die Ressource wird im JSON-Format zurückgegeben.
    400 Bad RequestEin für die API-Anfrage benötigtes Attribut oder Argument fehlt oder ist ungültig.
    404 Not FoundAuf eine Ressource konnte nicht zugegriffen werden. Möglicherweise kann die ID einer Ressource nicht gefunden werden.
    403 ForbiddenDer Zugriff ist (vorübergehend) verboten. Möglicherweise sind einige Parameter gesperrt, während eine GigE Vision-Anwendung verbunden ist.
    429 Too many requestsDie Übertragungsrate ist aufgrund einer zu hohen Anfragefrequenz begrenzt.
    +

    Der folgende Eintrag zeigt eine Musterantwort auf eine erfolgreiche Anfrage, mit der Informationen zum minconf-Parameter des rc_stereomatching-Moduls angefordert werden:

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +Content-Length: 157
    +
    +{
    +    "name": "minconf",
    +    "min": 0,
    +    "default": 0,
    +    "max": 1,
    +    "value": 0,
    +    "type": "float64",
    +    "description": "Minimum confidence"
    +}
    +
    +
    +
    +

    Bemerkung

    +

    Das tatsächliche Verhalten, die zulässigen Anfragen und die speziellen Rückgabecodes hängen in hohem Maße von der gewählten Ressource, vom Kontext und von der Aktion ab. Siehe die verfügbaren Ressourcen des rc_visard NG und einzelnen Parameter und Services jedes Softwaremoduls.

    +
    +
    +
    +

    Verfügbare Ressourcen und Anfragen

    +

    Die für die REST-API verfügbaren Ressourcen lassen sich in folgende Teilbereiche gliedern:

    +
      +
    • +
      /nodes
      +
      Zugriff auf die globalen Datenbankmodule des rc_visard NG mit ihren Laufzeitzuständen, Parametern und angebotenen Services, um Daten zu speichern, die in mehreren Modulen genutzt werden, z.B. Load Carrier, Greifer und Regions of Interest.
      +
      +
    • +
    • +
      /pipelines
      +
      Zugriff auf den Status und die Konfiguration der Kamerapipelines. Es gibt immer nur eine Pipeline mit der Nummer 0.
      +
      +
    • +
    +
      +
    • +
      /pipelines/0/nodes
      +
      Zugriff auf die 3D-Kamera-, Navigations-, Detektions- und Konfigurations-Softwaremodule des rc_visard NG mit ihren jeweiligen Laufzeitzuständen, Parametern und verfügbaren Services.
      +
      +
    • +
    +
      +
    • +
      /templates
      +
      Zugriff auf die im rc_visard NG hinterlegten Objekttemplates.
      +
      +
    • +
    +
      +
    • +
      /system
      +
      Zugriff auf Systemzustand, Netzwerkkonfiguration, und Verwaltung der Lizenzen sowie der Firmware-Updates.
      +
      +
    • +
    +
      +
    • +
      /userspace
      +
      Zugriff auf den UserSpace des rc_visard NG.
      +
      +
    • +
    +
      +
    • +
      /logs
      +
      Zugriff auf die im rc_visard NG hinterlegten Logdateien.
      +
      +
    • +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/rest_api_nodes.html b/v24.04/de/rest_api_nodes.html new file mode 100644 index 0000000..521df3d --- /dev/null +++ b/v24.04/de/rest_api_nodes.html @@ -0,0 +1,1837 @@ + + + + + + + + + + + Module, Parameter und Services — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Module, Parameter und Services

    +

    Die Softwaremodule des rc_visard NG heißen in der REST-API Nodes und vereinen jeweils bestimmte algorithmische Funktionen. Über folgenden Befehl lassen sich alle globalen Datenbankmodule der REST-API mit ihren jeweiligen Services und Parametern auflisten:

    +
    curl -X GET http://<host>/api/v2/nodes
    +
    +
    +

    Informationen zu einem bestimmten Modul (z.B. rc_load_carrier_db) lassen sich mit folgendem Befehl abrufen:

    +
    curl -X GET http://<host>/api/v2/nodes/rc_load_carrier_db
    +
    +
    +

    Alle verfügbaren 3D-Kamera-, Detektions- und Konfigurationsmodule der REST-API lassen sich mit ihren Services und Parametern wie folgt auflisten:

    +
    curl -X GET http://<host>/api/v2/pipelines/0/nodes
    +
    +
    +

    Informationen zu einem bestimmten Modul (z.B. rc_camera) lassen sich mit folgendem Befehl abrufen:

    +
    curl -X GET http://<host>/api/v2/pipelines/0/nodes/rc_camera
    +
    +
    +
    +
    Status:
    +

    Während der Laufzeit stellt jedes Modul Informationen zu seinem aktuellen Status bereit. Dies umfasst nicht nur den aktuellen Verarbeitungsstatus des Moduls (z.B. running oder stale), sondern die meisten Module melden auch Laufzeitstatistiken oder schreibgeschützte Parameter, sogenannte Statuswerte. Die Statuswerte des rc_camera-Moduls lassen sich beispielsweise wie folgt abrufen:

    +
    curl -X GET http://<host>/api/v2/pipelines/0/nodes/rc_camera/status
    +
    +
    +
    +

    Bemerkung

    +

    Die zurückgegebenen Statuswerte sind modulspezifisch und werden im jeweiligen Softwaremodul dokumentiert.

    +
    +
    +

    Bemerkung

    +

    Statuswerte werden nur gemeldet, wenn sich das jeweilige Modul im Zustand running befindet.

    +
    +
    +
    +
    +
    Parameter:
    +

    Die meisten Module stellen Parameter über die REST-API des rc_visard NG zur Verfügung, damit ihr Laufzeitverhalten an den Anwendungskontext oder die Anforderungen angepasst werden kann. Die REST-API ermöglicht es, den Wert eines Parameters zu setzen und abzufragen. Darüber hinaus stellt sie weitere Angaben, wie z.B. den jeweiligen Standardwert und zulässige Minimal- bzw. Maximalwerte von Parametern, zur Verfügung.

    +

    Die rc_stereomatching-Parameter lassen sich beispielsweise wie folgt abrufen:

    +
    curl -X GET http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters
    +
    +
    +

    Der quality-Parameter dieses Moduls könnte wie folgt auf den Wert Full gesetzt werden:

    +
    curl -X PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters?quality=Full
    +
    +
    +

    oder äquivalent

    +
    curl -X PUT --header 'Content-Type: application/json' -d '{ "value": "Full" }' http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters/quality
    +
    +
    +
    +

    Bemerkung

    +

    Laufzeitparameter sind modulspezifisch und werden in dem jeweiligen Softwaremodul dokumentiert.

    +
    +
    +

    Bemerkung

    +

    Die meisten Parameter, die die Module über die REST-API anbieten, lassen sich auch über die benutzerfreundliche Web GUI des rc_visard NG erkunden und austesten.

    +
    +
    +

    Bemerkung

    +

    Einige der Parameter, die über die REST-API des rc_visard NG bereitgestellt werden, sind auch über die GigE Vision 2.0/GenICam-Schnittstelle zugänglich. Die Einstellung dieser Parameter über die REST-API und die Web GUI ist verboten, solange ein GenICam-Client verbunden ist.

    +
    +

    Zudem bietet jedes Modul, das Laufzeitparameter bereitstellt, auch einen Service, um die Werkseinstellungen aller Parameter wiederherzustellen.

    +
    +
    +
    +
    Services:
    +

    Einige Module bieten auch Services, die sich über die REST-API aufrufen lassen. Hierzu gehört beispielsweise das oben bereits genannte Wiederherstellen von Parametern oder auch das Starten und Stoppen von Modulen. Die Services des Moduls zur Hand-Auge-Kalibrierung lassen sich beispielsweise wie folgt aufrufen:

    +
    curl -X GET http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services
    +
    +
    +

    Um einen Service eines Moduls aufzurufen, wird eine PUT-Anfrage mit servicespezifischen Argumenten für die jeweilige Ressource gestellt (siehe das "args"-Feld des Service-Datenmodells). Beispielsweise lässt sich folgendermaßen eine Bildaufnahme mit dem Stereo-Matching-Modul auslösen:

    +
    curl -X PUT --header 'Content-Type: application/json' -d '{ "args": {} }' http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/services/acquisition_trigger
    +
    +
    +
    +

    Bemerkung

    +

    Die Services und zugehörigen Argumente sind modulspezifisch und werden im jeweiligen Softwaremodul dokumentiert.

    +
    +
    +
    +

    Die folgende Liste enthält alle REST-API-Anfragen zum Status der globalen Datenbankmodule und ihrer Parameter und Services:

    +
    +
    +GET /nodes
    +

    Abruf einer Liste aller verfügbaren globalen Nodes.

    +

    Musteranfrage

    +
    GET /api/v2/nodes HTTP/1.1
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +[
    +  {
    +    "name": "rc_roi_db",
    +    "parameters": [],
    +    "services": [
    +      "set_region_of_interest",
    +      "get_regions_of_interest",
    +      "delete_regions_of_interest",
    +      "set_region_of_interest_2d",
    +      "get_regions_of_interest_2d",
    +      "delete_regions_of_interest_2d"
    +    ],
    +    "status": "running"
    +  },
    +  {
    +    "name": "rc_load_carrier_db",
    +    "parameters": [],
    +    "services": [
    +      "set_load_carrier",
    +      "get_load_carriers",
    +      "delete_load_carriers"
    +    ],
    +    "status": "running"
    +  },
    +  {
    +    "name": "rc_gripper_db",
    +    "parameters": [],
    +    "services": [
    +      "set_gripper",
    +      "get_grippers",
    +      "delete_grippers"
    +    ],
    +    "status": "running"
    +  }
    +]
    +
    +
    + +++ + + + + + + + + + +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabe: NodeInfo-Array)
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +GET /nodes/{node}
    +

    Abruf von Informationen zu einem einzelnen globalen Modul.

    +

    Musteranfrage

    +
    GET /api/v2/nodes/<node> HTTP/1.1
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "name": "rc_roi_db",
    +  "parameters": [],
    +  "services": [
    +    "set_region_of_interest",
    +    "get_regions_of_interest",
    +    "delete_regions_of_interest",
    +    "set_region_of_interest_2d",
    +    "get_regions_of_interest_2d",
    +    "delete_regions_of_interest_2d"
    +  ],
    +  "status": "running"
    +}
    +
    +
    + +++ + + + + + + + + + + + +
    Parameter:
      +
    • node (string) – Modulname (obligatorisch)
    • +
    +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabe: NodeInfo)
    • +
    • 404 Not Found – Modul nicht gefunden
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +GET /nodes/{node}/services
    +

    Abruf von Beschreibungen aller von einem globalen Modul angebotenen Services.

    +

    Musteranfrage

    +
    GET /api/v2/nodes/<node>/services HTTP/1.1
    +
    +
    +

    Musteranfrage

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +[
    +  {
    +    "args": {},
    +    "description": "string",
    +    "name": "string",
    +    "response": {}
    +  }
    +]
    +
    +
    + +++ + + + + + + + + + + + +
    Parameter:
      +
    • node (string) – Modulname (obligatorisch)
    • +
    +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabe: Service-Array)
    • +
    • 404 Not Found – Modul nicht gefunden
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +GET /nodes/{node}/services/{service}
    +

    Abruf der Beschreibung eines Services eines globalen Moduls.

    +

    Musteranfrage

    +
    GET /api/v2/nodes/<node>/services/<service> HTTP/1.1
    +
    +
    +

    Musteranfrage

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "args": {},
    +  "description": "string",
    +  "name": "string",
    +  "response": {}
    +}
    +
    +
    + +++ + + + + + + + + + + + +
    Parameter:
      +
    • node (string) – Modulname (obligatorisch)
    • +
    • service (string) – Name des Service (obligatorisch)
    • +
    +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabe: Service)
    • +
    • 404 Not Found – Modul oder Service nicht gefunden
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +PUT /nodes/{node}/services/{service}
    +

    Aufruf des Services eines Moduls: Die benötigten Argumente und die zugehörige Antwort hängt vom Modul und vom Service ab.

    +

    Musteranfrage

    +
    PUT /api/v2/nodes/<node>/services/<service> HTTP/1.1
    +Accept: application/json application/ubjson
    +
    +{}
    +
    +
    +

    Musteranfrage

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "args": {},
    +  "description": "string",
    +  "name": "string",
    +  "response": {}
    +}
    +
    +
    + +++ + + + + + + + + + + + + + + + + +
    Parameter:
      +
    • node (string) – Modulname (obligatorisch)
    • +
    • service (string) – Name des Service (obligatorisch)
    • +
    +
    JSON-Objekt zur Anfrage:
     
      +
    • service args (object) – Beispielargumente (obligatorisch)
    • +
    +
    Anfrage-Header:
      +
    • Accept – application/json application/ubjson
    • +
    +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Serviceaufruf erledigt (Rückgabe: Service)
    • +
    • 403 Forbidden – Service-Aufruf verboten, z.B. weil keine valide Lizenz für dieses Modul vorliegt.
    • +
    • 404 Not Found – Modul oder Service nicht gefunden
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +GET /nodes/{node}/status
    +

    Abruf des Status eines globalen Datenbankmoduls.

    +

    Musteranfrage

    +
    GET /api/v2/nodes/<node>/status HTTP/1.1
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "status": "running",
    +  "timestamp": 1503075030.2335997,
    +  "values": []
    +}
    +
    +
    + +++ + + + + + + + + + + + +
    Parameter:
      +
    • node (string) – Modulname (obligatorisch)
    • +
    +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabe: NodeStatus)
    • +
    • 404 Not Found – Modul nicht gefunden
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +

    Die folgende Liste enthält alle REST-API-Anfragen zum Status der 3D-Kamera-, Detektions- und Konfigurationsmodule und ihrer Parameter und Services:

    +
    +
    +GET /pipelines/{pipeline}/nodes
    +

    Abruf einer Liste aller verfügbaren Module.

    +

    Musteranfrage

    +
    GET /api/v2/pipelines/<pipeline>/nodes HTTP/1.1
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +[
    +  {
    +    "name": "rc_camera",
    +    "parameters": [
    +      "fps",
    +      "exp_auto",
    +      "exp_value",
    +      "exp_max"
    +    ],
    +    "services": [
    +      "reset_defaults"
    +    ],
    +    "status": "running"
    +  },
    +  {
    +    "name": "rc_hand_eye_calibration",
    +    "parameters": [
    +      "grid_width",
    +      "grid_height",
    +      "robot_mounted"
    +    ],
    +    "services": [
    +      "reset_defaults",
    +      "set_pose",
    +      "reset",
    +      "save",
    +      "calibrate",
    +      "get_calibration"
    +    ],
    +    "status": "idle"
    +  },
    +  {
    +    "name": "rc_stereomatching",
    +    "parameters": [
    +      "quality",
    +      "seg",
    +      "fill",
    +      "minconf",
    +      "mindepth",
    +      "maxdepth",
    +      "maxdeptherr"
    +    ],
    +    "services": [
    +      "reset_defaults"
    +    ],
    +    "status": "running"
    +  }
    +]
    +
    +
    + +++ + + + + + + + + + + + +
    Parameter:
      +
    • pipeline (string) – Name der Pipeline (0) (obligatorisch)
    • +
    +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabe: NodeInfo-Array)
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +GET /pipelines/{pipeline}/nodes/{node}
    +

    Abruf von Informationen zu einem einzelnen Modul.

    +

    Musteranfrage

    +
    GET /api/v2/pipelines/<pipeline>/nodes/<node> HTTP/1.1
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "name": "rc_camera",
    +  "parameters": [
    +    "fps",
    +    "exp_auto",
    +    "exp_value",
    +    "exp_max"
    +  ],
    +  "services": [
    +    "reset_defaults"
    +  ],
    +  "status": "running"
    +}
    +
    +
    + +++ + + + + + + + + + + + +
    Parameter:
      +
    • pipeline (string) – Name der Pipeline (0) (obligatorisch)
    • +
    • node (string) – Modulname (obligatorisch)
    • +
    +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabe: NodeInfo)
    • +
    • 404 Not Found – Modul nicht gefunden
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +GET /pipelines/{pipeline}/nodes/{node}/parameters
    +

    Abruf von Parametern eines Moduls.

    +

    Musteranfrage

    +
    GET /api/v2/pipelines/<pipeline>/nodes/<node>/parameters?name=<name> HTTP/1.1
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +[
    +  {
    +    "default": 25,
    +    "description": "Frames per second in Hz",
    +    "max": 25,
    +    "min": 1,
    +    "name": "fps",
    +    "type": "float64",
    +    "value": 25
    +  },
    +  {
    +    "default": true,
    +    "description": "Switching between auto and manual exposure",
    +    "max": true,
    +    "min": false,
    +    "name": "exp_auto",
    +    "type": "bool",
    +    "value": true
    +  },
    +  {
    +    "default": 0.007,
    +    "description": "Maximum exposure time in s if exp_auto is true",
    +    "max": 0.018,
    +    "min": 6.6e-05,
    +    "name": "exp_max",
    +    "type": "float64",
    +    "value": 0.007
    +  }
    +]
    +
    +
    + +++ + + + + + + + + + + + + + + +
    Parameter:
      +
    • pipeline (string) – Name der Pipeline (0) (obligatorisch)
    • +
    • node (string) – Modulname (obligatorisch)
    • +
    +
    Anfrageparameter:
     
      +
    • name (string) – Schränkt Ergebnisse auf Parameter mit diesem Namen ein (optional).
    • +
    +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabe: NodeInfo-Array)
    • +
    • 404 Not Found – Modul nicht gefunden
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +PUT /pipelines/{pipeline}/nodes/{node}/parameters
    +

    Aktualisierung mehrerer Parameter.

    +

    Musteranfrage

    +
    PUT /api/v2/pipelines/<pipeline>/nodes/<node>/parameters HTTP/1.1
    +Accept: application/json application/ubjson
    +
    +[
    +  {
    +    "name": "string",
    +    "value": {}
    +  }
    +]
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +[
    +  {
    +    "default": 25,
    +    "description": "Frames per second in Hz",
    +    "max": 25,
    +    "min": 1,
    +    "name": "fps",
    +    "type": "float64",
    +    "value": 10
    +  },
    +  {
    +    "default": true,
    +    "description": "Switching between auto and manual exposure",
    +    "max": true,
    +    "min": false,
    +    "name": "exp_auto",
    +    "type": "bool",
    +    "value": false
    +  },
    +  {
    +    "default": 0.005,
    +    "description": "Manual exposure time in s if exp_auto is false",
    +    "max": 0.018,
    +    "min": 6.6e-05,
    +    "name": "exp_value",
    +    "type": "float64",
    +    "value": 0.005
    +  }
    +]
    +
    +
    + +++ + + + + + + + + + + + + + + + + +
    Parameter:
      +
    • pipeline (string) – Name der Pipeline (0) (obligatorisch)
    • +
    • node (string) – Modulname (obligatorisch)
    • +
    +
    JSON-Objekt-Array zur Anfrage:
     
      +
    • parameters (ParameterNameValue) – Liste von Parametern (obligatorisch)
    • +
    +
    Anfrage-Header:
      +
    • Accept – application/json application/ubjson
    • +
    +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabe: NodeInfo-Array)
    • +
    • 400 Bad Request – Ungültiger Parameterwert
    • +
    • 403 Forbidden – Aktualisierung des Parameters verboten, z.B. weil er aufgrund einer laufenden GigE Vision-Anwendung gesperrt ist oder keine valide Lizenz für dieses Modul vorliegt.
    • +
    • 404 Not Found – Modul nicht gefunden
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +GET /pipelines/{pipeline}/nodes/{node}/parameters/{param}
    +

    Abruf eines bestimmten Parameters eines Moduls.

    +

    Musteranfrage

    +
    GET /api/v2/pipelines/<pipeline>/nodes/<node>/parameters/<param> HTTP/1.1
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "default": 25,
    +  "description": "Frames per second in Hertz",
    +  "max": 25,
    +  "min": 1,
    +  "name": "fps",
    +  "type": "float64",
    +  "value": 10
    +}
    +
    +
    + +++ + + + + + + + + + + + +
    Parameter:
      +
    • pipeline (string) – Name der Pipeline (0) (obligatorisch)
    • +
    • node (string) – Modulname (obligatorisch)
    • +
    • param (string) – Name des Parameters (obligatorisch)
    • +
    +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabe: Parameter)
    • +
    • 404 Not Found – Modul oder Parameter nicht gefunden
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +PUT /pipelines/{pipeline}/nodes/{node}/parameters/{param}
    +

    Aktualisierung eines bestimmten Parameters eines Moduls.

    +

    Musteranfrage

    +
    PUT /api/v2/pipelines/<pipeline>/nodes/<node>/parameters/<param> HTTP/1.1
    +Accept: application/json application/ubjson
    +
    +{
    +  "value": {}
    +}
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "default": 25,
    +  "description": "Frames per second in Hertz",
    +  "max": 25,
    +  "min": 1,
    +  "name": "fps",
    +  "type": "float64",
    +  "value": 10
    +}
    +
    +
    + +++ + + + + + + + + + + + + + + + + +
    Parameter:
      +
    • pipeline (string) – Name der Pipeline (0) (obligatorisch)
    • +
    • node (string) – Modulname (obligatorisch)
    • +
    • param (string) – Name des Parameters (obligatorisch)
    • +
    +
    JSON-Objekt zur Anfrage:
     
      +
    • parameter (ParameterValue) – zu aktualisierender Parameter als JSON-Objekt (obligatorisch)
    • +
    +
    Anfrage-Header:
      +
    • Accept – application/json application/ubjson
    • +
    +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabe: Parameter)
    • +
    • 400 Bad Request – Ungültiger Parameterwert
    • +
    • 403 Forbidden – Aktualisierung des Parameters verboten, z.B. weil er aufgrund einer laufenden GigE Vision-Anwendung gesperrt ist oder keine valide Lizenz für dieses Modul vorliegt.
    • +
    • 404 Not Found – Modul oder Parameter nicht gefunden
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +GET /pipelines/{pipeline}/nodes/{node}/services
    +

    Abruf von Beschreibungen aller von einem Modul angebotenen Services.

    +

    Musteranfrage

    +
    GET /api/v2/pipelines/<pipeline>/nodes/<node>/services HTTP/1.1
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +[
    +  {
    +    "args": {},
    +    "description": "Restarts the module.",
    +    "name": "restart",
    +    "response": {
    +      "accepted": "bool",
    +      "current_state": "string"
    +    }
    +  },
    +  {
    +    "args": {},
    +    "description": "Starts the module.",
    +    "name": "start",
    +    "response": {
    +      "accepted": "bool",
    +      "current_state": "string"
    +    }
    +  },
    +  {
    +    "args": {},
    +    "description": "Stops the module.",
    +    "name": "stop",
    +    "response": {
    +      "accepted": "bool",
    +      "current_state": "string"
    +    }
    +  }
    +]
    +
    +
    + +++ + + + + + + + + + + + +
    Parameter:
      +
    • pipeline (string) – Name der Pipeline (0) (obligatorisch)
    • +
    • node (string) – Modulname (obligatorisch)
    • +
    +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabe: Service-Array)
    • +
    • 404 Not Found – Modul nicht gefunden
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +GET /pipelines/{pipeline}/nodes/{node}/services/{service}
    +

    Abruf der Beschreibung eines modulspezifischen Services.

    +

    Musteranfrage

    +
    GET /api/v2/pipelines/<pipeline>/nodes/<node>/services/<service> HTTP/1.1
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "args": {
    +    "pose": {
    +      "orientation": {
    +        "w": "float64",
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "position": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      }
    +    },
    +    "slot": "int32"
    +  },
    +  "description": "Save a pose (grid or gripper) for later calibration.",
    +  "name": "set_pose",
    +  "response": {
    +    "message": "string",
    +    "status": "int32",
    +    "success": "bool"
    +  }
    +}
    +
    +
    + +++ + + + + + + + + + + + +
    Parameter:
      +
    • pipeline (string) – Name der Pipeline (0) (obligatorisch)
    • +
    • node (string) – Modulname (obligatorisch)
    • +
    • service (string) – Name des Service (obligatorisch)
    • +
    +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabe: Service)
    • +
    • 404 Not Found – Modul oder Service nicht gefunden
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +PUT /pipelines/{pipeline}/nodes/{node}/services/{service}
    +

    Aufruf des Services eines Moduls: Die benötigten Argumente und die zugehörige Antwort hängt vom Modul und vom Service ab.

    +

    Musteranfrage

    +
    PUT /api/v2/pipelines/<pipeline>/nodes/<node>/services/<service> HTTP/1.1
    +Accept: application/json application/ubjson
    +
    +{}
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "name": "set_pose",
    +  "response": {
    +    "message": "Grid detected, pose stored.",
    +    "status": 1,
    +    "success": true
    +  }
    +}
    +
    +
    + +++ + + + + + + + + + + + + + + + + +
    Parameter:
      +
    • pipeline (string) – Name der Pipeline (0) (obligatorisch)
    • +
    • node (string) – Modulname (obligatorisch)
    • +
    • service (string) – Name des Service (obligatorisch)
    • +
    +
    JSON-Objekt zur Anfrage:
     
      +
    • service args (object) – Beispielargumente (obligatorisch)
    • +
    +
    Anfrage-Header:
      +
    • Accept – application/json application/ubjson
    • +
    +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Serviceaufruf erledigt (Rückgabe: Service)
    • +
    • 403 Forbidden – Service-Aufruf verboten, z.B. weil keine valide Lizenz für dieses Modul vorliegt.
    • +
    • 404 Not Found – Modul oder Service nicht gefunden
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +GET /pipelines/{pipeline}/nodes/{node}/status
    +

    Abruf des Status eines Moduls.

    +

    Musteranfrage

    +
    GET /api/v2/pipelines/<pipeline>/nodes/<node>/status HTTP/1.1
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "status": "running",
    +  "timestamp": 1503075030.2335997,
    +  "values": {
    +    "baseline": "0.0650542",
    +    "color": "0",
    +    "exp": "0.00426667",
    +    "focal": "0.844893",
    +    "fps": "25.1352",
    +    "gain": "12.0412",
    +    "height": "960",
    +    "temp_left": "39.6",
    +    "temp_right": "38.2",
    +    "time": "0.00406513",
    +    "width": "1280"
    +  }
    +}
    +
    +
    + +++ + + + + + + + + + + + +
    Parameter:
      +
    • pipeline (string) – Name der Pipeline (0) (obligatorisch)
    • +
    • node (string) – Modulname (obligatorisch)
    • +
    +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabe: NodeStatus)
    • +
    • 404 Not Found – Modul nicht gefunden
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/rest_api_pipelines.html b/v24.04/de/rest_api_pipelines.html new file mode 100644 index 0000000..6f1a1a9 --- /dev/null +++ b/v24.04/de/rest_api_pipelines.html @@ -0,0 +1,647 @@ + + + + + + + + + + + Pipelines — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Pipelines

    +

    Pipelines repräsentieren die Kamerapipelines des rc_visard NG.

    +

    Die folgende Liste enthält alle REST-API Anfragen bezüglich der Konfiguration der Kamerapipelines:

    +
    + + +
    +
    + +
    +
    +
    + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/rest_api_swagger_ui.html b/v24.04/de/rest_api_swagger_ui.html new file mode 100644 index 0000000..97a61b1 --- /dev/null +++ b/v24.04/de/rest_api_swagger_ui.html @@ -0,0 +1,685 @@ + + + + + + + + + + + Swagger UI — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Swagger UI

    +

    Die Swagger UI des rc_visard NG ermöglicht es Entwicklern, die REST-API – beispielsweise zu Entwicklungs- und Testzwecken – leicht darzustellen und zu verwenden. Der Zugriff auf http://<host>/api/ oder auf http://<host>/api/swagger (der erste Link leitet automatisch auf den zweiten Link weiter) öffnet eine Vorschau der allgemeinen API-Struktur des rc_visard NG, einschließlich aller verfügbaren Ressourcen und Anfragen . Auf dieser vereinfachten Benutzeroberfläche lassen sich alle Funktionen erkunden und austesten.

    +
    +

    Bemerkung

    +

    Der Benutzer muss bedenken, dass die Swagger UI des rc_visard NG, auch wenn sie zur Erprobung der REST-API bestimmt ist, eine voll funktionstüchtige Schnittstelle ist. Das bedeutet, dass alle ausgelösten Anfragen tatsächlich bearbeitet werden und den Zustand und/oder das Verhalten des Geräts beeinflussen. Dies gilt insbesondere für Anfragen des Typs PUT, POST und DELETE.

    +
    +
    +_images/swagger_ui_overview_ng.png +

    Abb. 58 Startansicht der Swagger UI des rc_visard NG mit den Ressourcen und Anfragen

    +
    +

    Mithilfe dieser Schnittstelle können alle verfügbaren Ressourcen und Anfragen erprobt werden, indem diese durch Klick auf- und zugeklappt werden. Die folgende Abbildung zeigt ein Beispiel dafür, wie sich der aktuelle Zustand eines Moduls abrufen lässt, indem die erforderlichen Parameter (pipeline-Nummer und node-Name) ausgefüllt werden und anschließend Execute geklickt wird. Daraufhin zeigt die Swagger UI unter anderem den curl-Befehl an, der bei Auslösung der Anfrage ausgeführt wurde, sowie den Antworttext, in dem der aktuelle Status des angefragten Moduls in einer Zeichenfolge im JSON-Format enthalten ist.

    +
    +_images/swagger_ui_example_simple_get.png +

    Abb. 59 Ergebnis nach Abfrage des Status des rc_stereomatching-Moduls

    +
    +

    Einige Aktionen, wie das Setzen von Parametern oder der Aufruf von Services, bedürfen komplexerer Parameter als eine HTTP-Anfrage. Die Swagger UI erlaubt es Entwicklern, die für diese Aktionen benötigten Attribute, wie im nächsten Beispiel gezeigt, während der Laufzeit zu erkunden. In der folgenden Abbildung werden die Attribute, die für den set_pose-Service des rc_hand_eye_calibration-Moduls benötigt werden, erkundet, indem eine GET-Anfrage zu dieser Ressource durchgeführt wird. Die Antwort enthält eine vollständige Beschreibung des angebotenen Services, einschließlich aller erforderlichen Argumente mit ihren Namen und Typen in einer Zeichenfolge im JSON-Format.

    +
    +_images/swagger_ui_example_get_service_args.png +

    Abb. 60 Ergebnis der GET-Anfrage zum set_pose-Service zeigt die für diesen Service benötigten Argumente

    +
    +

    Der Benutzer kann diesen vorformatierten JSON-Text als Muster für die Argumente nutzen, um damit den Service tatsächlich aufzurufen:

    +
    +_images/swagger_ui_example_fill_service_args.png +

    Abb. 61 Ausfüllen der Argumente des set_pose-Services

    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/rest_api_syslogs.html b/v24.04/de/rest_api_syslogs.html new file mode 100644 index 0000000..825cdf6 --- /dev/null +++ b/v24.04/de/rest_api_syslogs.html @@ -0,0 +1,1717 @@ + + + + + + + + + + + System und Logs — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    System und Logs

    +

    Die folgenden Ressourcen und Anfragen sind für die System-Level-API des rc_visard NG verfügbar. Sie ermöglichen Folgendes:

    +
    +
      +
    • Zugriff auf Logdateien (systemweit oder modulspezifisch),
    • +
    • Abruf von Informationen zum Gerät und zur Laufzeitstatistik, wie Datum, MAC-Adresse, Uhrzeitsynchronisierungsstatus und verfügbare Ressourcen,
    • +
    • Verwaltung installierter Softwarelizenzen, und
    • +
    • Aktualisierung des Firmware-Images des rc_visard NG.
    • +
    +
    +
    +
    +GET /logs
    +

    Abruf einer Liste aller verfügbaren Logdateien.

    +

    Musteranfrage

    +
    GET /api/v2/logs HTTP/1.1
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +[
    +  {
    +    "date": 1503060035.0625782,
    +    "name": "rcsense-api.log",
    +    "size": 730
    +  },
    +  {
    +    "date": 1503060035.741574,
    +    "name": "stereo.log",
    +    "size": 39024
    +  },
    +  {
    +    "date": 1503060044.0475223,
    +    "name": "camera.log",
    +    "size": 1091
    +  }
    +]
    +
    +
    + +++ + + + + + + + + + +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabe: LogInfo-Array)
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +GET /logs/{log}
    +

    Abruf einer Logdatei: Die Art des Inhalts der Antwort richtet sich nach dem format-Parameter.

    +

    Musteranfrage

    +
    GET /api/v2/logs/<log>?format=<format>&limit=<limit> HTTP/1.1
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "date": 1581609251.8168414,
    +  "log": [
    +    {
    +      "component": "rc_gev_server",
    +      "level": "INFO",
    +      "message": "Application from IP 10.0.1.7 registered with control access.",
    +      "timestamp": 1581609249.61
    +    },
    +    {
    +      "component": "rc_gev_server",
    +      "level": "INFO",
    +      "message": "Application from IP 10.0.1.7 deregistered.",
    +      "timestamp": 1581609249.739
    +    },
    +    {
    +      "component": "rc_gev_server",
    +      "level": "INFO",
    +      "message": "Application from IP 10.0.1.7 registered with control access.",
    +      "timestamp": 1581609250.94
    +    },
    +    {
    +      "component": "rc_gev_server",
    +      "level": "INFO",
    +      "message": "Application from IP 10.0.1.7 deregistered.",
    +      "timestamp": 1581609251.819
    +    }
    +  ],
    +  "name": "gev.log",
    +  "size": 42112
    +}
    +
    +
    + +++ + + + + + + + + + + + + + + +
    Parameter:
      +
    • log (string) – Name der Logdatei (obligatorisch)
    • +
    +
    Anfrageparameter:
     
      +
    • format (string) – Rückgabe des Logs im JSON- oder Rohdatenformat (mögliche Werte: json oder raw; Voreinstellung: json) (optional)
    • +
    • limit (integer) – Beschränkung auf die letzten x Zeilen im JSON-Format (Voreinstellung: 100) (optional)
    • +
    +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabe: Log)
    • +
    • 404 Not Found – Log nicht gefunden
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +GET /system
    +

    Abruf von Systeminformationen zum Sensor.

    +

    Musteranfrage

    +
    GET /api/v2/system HTTP/1.1
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "dns": {
    +    "dns_servers": [
    +      "10.0.0.1",
    +      "1.1.1.1"
    +    ],
    +    "manual_dns_servers": [
    +      "1.1.1.1"
    +    ]
    +  },
    +  "firmware": {
    +    "active_image": {
    +      "image_version": "rc_visard_v1.1.0"
    +    },
    +    "fallback_booted": true,
    +    "inactive_image": {
    +      "image_version": "rc_visard_v1.0.0"
    +    },
    +    "next_boot_image": "active_image"
    +  },
    +  "hostname": "rc-visard-ng-1421823000987",
    +  "link_speed": 1000,
    +  "mac": "00:14:2D:2B:D8:AB",
    +  "ntp_status": {
    +    "accuracy": "48 ms",
    +    "synchronized": true
    +  },
    +  "ptp_status": {
    +    "master_ip": "",
    +    "offset": 0,
    +    "offset_dev": 0,
    +    "offset_mean": 0,
    +    "state": "off"
    +  },
    +  "ready": true,
    +  "serial": "1421823000987",
    +  "time": 1504080462.641875,
    +  "uptime": 65457.42
    +}
    +
    +
    + +++ + + + + + + + + + +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabe: SysInfo)
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +GET /system/backup
    +

    Abruf eines Backups der Einstellungen.

    +

    Musteranfrage

    +
    GET /api/v2/system/backup?pipelines=<pipelines>&load_carriers=<load_carriers>&regions_of_interest=<regions_of_interest>&grippers=<grippers> HTTP/1.1
    +
    +
    + +++ + + + + + + + + + +
    Anfrageparameter:
     
      +
    • pipelines (boolean) – Backup der Pipelines mit Moduleinstellungen, d.h. Parameter und bevorzugte TCP-Orientierung (Standardwert: True) (optional)
    • +
    • load_carriers (boolean) – Backup der Load Carrier (Standardwert: True) (optional)
    • +
    • regions_of_interest (boolean) – Backup der Regions of Interest (Standardwert: True) (optional)
    • +
    • grippers (boolean) – Backup der Greifer (Standardwert: True) (optional)
    • +
    +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung
    • +
    +
    +
    + +
    +
    +POST /system/backup
    +

    Backup einspielen.

    +

    Musteranfrage

    +
    POST /api/v2/system/backup HTTP/1.1
    +Accept: application/json application/ubjson
    +
    +{}
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "return_code": {
    +    "message": "backup restored",
    +    "value": 0
    +  },
    +  "warnings": []
    +}
    +
    +
    + +++ + + + + + + + + + + + +
    Request JSON Object:
     
      +
    • backup (object) – Backup-Daten als json-Objekt (erforderlich)
    • +
    +
    Anfrage-Header:
      +
    • Accept – application/json application/ubjson
    • +
    +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung
    • +
    +
    +
    + +
    +
    +GET /system/dns
    +

    Abfragen der DNS-Server Einstellungen.

    +

    Musteranfrage

    +
    GET /api/v2/system/dns HTTP/1.1
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "dns": {
    +    "dns_servers": [
    +      "10.0.0.1",
    +      "1.1.1.1"
    +    ],
    +    "manual_dns_servers": [
    +      "1.1.1.1"
    +    ]
    +  }
    +}
    +
    +
    + +++ + + + + + + + + + +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabe: DNS)
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +PUT /system/dns
    +

    Setze manuelle DNS-Server.

    +

    Musteranfrage

    +
    PUT /api/v2/system/dns HTTP/1.1
    +Accept: application/json application/ubjson
    +
    +{}
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "dns": {
    +    "dns_servers": [
    +      "10.0.0.1",
    +      "1.1.1.1"
    +    ],
    +    "manual_dns_servers": [
    +      "1.1.1.1"
    +    ]
    +  }
    +}
    +
    +
    + +++ + + + + + + + + + + + + + + +
    Request JSON Object:
     
      +
    • manual_dns_servers (ManualDNSServers) – Manuelle DNS-Server (obligatorisch)
    • +
    +
    Anfrage-Header:
      +
    • Accept – application/json application/ubjson
    • +
    +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabe: DNS)
    • +
    • 400 Bad Request – ungültige/fehlende Argumente
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +GET /system/license
    +

    Abruf von Informationen zu den auf dem Sensor installierten Lizenzen.

    +

    Musteranfrage

    +
    GET /api/v2/system/license HTTP/1.1
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "components": {
    +    "calibration": true,
    +    "hand_eye_calibration": true,
    +    "rectification": true,
    +    "self_calibration": true,
    +    "stereo": true
    +  },
    +  "valid": true
    +}
    +
    +
    + +++ + + + + + + + + + +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabe: LicenseInfo)
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +POST /system/license
    +

    Aktualisierung der auf dem Sensor installierten Lizenz mithilfe einer Lizenzdatei.

    +

    Musteranfrage

    +
    POST /api/v2/system/license HTTP/1.1
    +Accept: multipart/form-data
    +
    +
    + +++ + + + + + + + + +
    Formularparameter:
     
      +
    • file – Lizenzdatei (obligatorisch)
    • +
    +
    Anfrage-Header:
      +
    • Accept – Multipart/Formulardaten
    • +
    +
    Statuscodes: +
    +
    + +
    +
    +GET /system/network
    +

    Abruf der aktuellen Netzwerk Konfiguration.

    +

    Musteranfrage

    +
    GET /api/v2/system/network HTTP/1.1
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "current_method": "DHCP",
    +  "default_gateway": "10.0.3.254",
    +  "ip_address": "10.0.1.41",
    +  "settings": {
    +    "dhcp_enabled": true,
    +    "persistent_default_gateway": "",
    +    "persistent_ip_address": "192.168.0.10",
    +    "persistent_ip_enabled": false,
    +    "persistent_subnet_mask": "255.255.255.0"
    +  },
    +  "subnet_mask": "255.255.252.0"
    +}
    +
    +
    + +++ + + + + + + + + + +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabe: NetworkInfo)
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +GET /system/network/settings
    +

    Abruf der aktuellen Netzwerkeinstellungen.

    +

    Musteranfrage

    +
    GET /api/v2/system/network/settings HTTP/1.1
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "dhcp_enabled": true,
    +  "persistent_default_gateway": "",
    +  "persistent_ip_address": "192.168.0.10",
    +  "persistent_ip_enabled": false,
    +  "persistent_subnet_mask": "255.255.255.0"
    +}
    +
    +
    + +++ + + + + + + + + + +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabe: NetworkSettings)
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +PUT /system/network/settings
    +

    Setzen der aktuellen Netzwerkeinstellungen.

    +

    Musteranfrage

    +
    PUT /api/v2/system/network/settings HTTP/1.1
    +Accept: application/json application/ubjson
    +
    +{}
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "dhcp_enabled": true,
    +  "persistent_default_gateway": "",
    +  "persistent_ip_address": "192.168.0.10",
    +  "persistent_ip_enabled": false,
    +  "persistent_subnet_mask": "255.255.255.0"
    +}
    +
    +
    + +++ + + + + + + + + + + + + + + +
    Request JSON Object:
     
      +
    • settings (NetworkSettings) – Anzuwendende Netzwerkeinstellungen (obligatorisch)
    • +
    +
    Anfrage-Header:
      +
    • Accept – application/json application/ubjson
    • +
    +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabe: NetworkSettings)
    • +
    • 400 Bad Request – ungültige/fehlende Argumente
    • +
    • 403 Forbidden – Das Ändern der Netzwerkeinstellungen ist nicht erlaubt, da eine laufende GigE Vision-Applikation diese sperrt.
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +PUT /system/reboot
    +

    Neustart des Geräts.

    +

    Musteranfrage

    +
    PUT /api/v2/system/reboot HTTP/1.1
    +
    +
    + +++ + + + +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung
    • +
    +
    +
    + +
    +
    +GET /system/rollback
    +

    Abruf von Informationen zu Firmware/System-Images, die aktuell auf dem Gerät aktiv oder inaktiv sind.

    +

    Musteranfrage

    +
    GET /api/v2/system/rollback HTTP/1.1
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "active_image": {
    +    "image_version": "rc_visard_ng_v22.10.0"
    +  },
    +  "fallback_booted": false,
    +  "inactive_image": {
    +    "image_version": "rc_visard_ng_v22.10.0"
    +  },
    +  "next_boot_image": "active_image"
    +}
    +
    +
    + +++ + + + + + + + + + +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabe: FirmwareInfo)
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +PUT /system/rollback
    +

    Rollback auf vorherige Firmware-Version (inaktives System-Image).

    +

    Musteranfrage

    +
    PUT /api/v2/system/rollback HTTP/1.1
    +
    +
    + +++ + + + +
    Statuscodes: +
    +
    + +
    +
    +GET /system/time
    +

    Abfrage der Systemzeit in UTC als String mit dem Format „YYYY-MM-DD hh:mm:ss“

    +

    Musteranfrage

    +
    GET /api/v2/system/time HTTP/1.1
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "utc": "2023-10-05 08:35:26"
    +}
    +
    +
    + +++ + + + + + + +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung
    • +
    +
    +
    + +
    +
    +PUT /system/time
    +

    Setzen der Systemzeit in UTC als String mit dem Format „YYYY-MM-DD hh:mm:ss“

    +

    Musteranfrage

    +
    PUT /api/v2/system/time?utc=<utc> HTTP/1.1
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "utc": "2023-10-05 08:35:26"
    +}
    +
    +
    + +++ + + + + + + + + + +
    Anfrageparameter:
     
      +
    • utc (string) – Zeit in UTC als String mit dem Format „YYYY-MM-DD hh:mm:ss“ (obligatorisch)
    • +
    +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung
    • +
    • 400 Bad Request – ungültige/fehlende Argumente
    • +
    • 403 Forbidden – Ändern der Zeit nicht erlaubt, da Zeitsynchronisation via NTP oder PTP aktiv ist.
    • +
    +
    +
    + +
    +
    +GET /system/ui_lock
    +

    Abruf des UI Lock Status

    +

    Musteranfrage

    +
    GET /api/v2/system/ui_lock HTTP/1.1
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "enabled": false
    +}
    +
    +
    + +++ + + + + + + + + + +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabe: UILock)
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +DELETE /system/ui_lock
    +

    UI Lock entfernen.

    +

    Musteranfrage

    +
    DELETE /api/v2/system/ui_lock HTTP/1.1
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "enabled": false,
    +  "valid": false
    +}
    +
    +
    + +++ + + + + + + +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung
    • +
    +
    +
    + +
    +
    +POST /system/ui_lock
    +

    Verifizieren oder Setzen des UI Locks.

    +

    Musteranfrage

    +
    POST /api/v2/system/ui_lock?hash=<hash>&set=<set> HTTP/1.1
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "enabled": true,
    +  "valid": true
    +}
    +
    +
    + +++ + + + + + + + + + +
    Anfrageparameter:
     
      +
    • hash (string) – Hash des UI Lock Passworts (obligatorisch)
    • +
    • set (boolean) – neuen Hash setzen anstatt zu verifizieren (optional)
    • +
    +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung
    • +
    +
    +
    + +
    +
    +GET /system/update
    +

    Abruf von Informationen zu Firmware/System-Images, die aktuell auf dem Gerät aktiv oder inaktiv sind.

    +

    Musteranfrage

    +
    GET /api/v2/system/update HTTP/1.1
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "active_image": {
    +    "image_version": "rc_visard_ng_v22.10.0"
    +  },
    +  "fallback_booted": false,
    +  "inactive_image": {
    +    "image_version": "rc_visard_ng_v22.10.0"
    +  },
    +  "next_boot_image": "active_image"
    +}
    +
    +
    + +++ + + + + + + + + + +
    Antwort-Headers:
      +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabe: FirmwareInfo)
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +POST /system/update
    +

    Aktualisierung des Firmware/System-Images mit einer Mender-Artefakt-Datei: Um die aktualisierte Firmware zu aktivieren, ist anschließend ein Neustart erforderlich.

    +

    Musteranfrage

    +
    POST /api/v2/system/update HTTP/1.1
    +Accept: multipart/form-data
    +
    +
    + +++ + + + + + + + + +
    Formularparameter:
     
      +
    • file – Mender-Artefakt-Datei (obligatorisch)
    • +
    +
    Anfrage-Header:
      +
    • Accept – Multipart/Formulardaten
    • +
    +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung
    • +
    • 400 Bad Request – Client-Fehler, z.B. kein gültiges Mender-Artefakt
    • +
    +
    +
    + +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/rest_api_userspace.html b/v24.04/de/rest_api_userspace.html new file mode 100644 index 0000000..26b28ea --- /dev/null +++ b/v24.04/de/rest_api_userspace.html @@ -0,0 +1,750 @@ + + + + + + + + + + + UserSpace — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    UserSpace

    +

    UserSpace Informationen einschließlich laufender Apps und ihre veröffentlichten Ports können über den userspace Endpunkt abgefragt werden. Eine App kann vom Typ (type) container oder compose (Compose-Stack mit potenziell mehreren Containern) sein.

    +
    +
    +GET /userspace
    +

    Abruf der UserSpace Informationen.

    +

    Musteranfrage

    +
    GET /api/v2/userspace HTTP/1.1
    +
    +
    +

    Beispielantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "apps": [
    +    {
    +      "containers": [
    +        {
    +          "host_ports": [
    +            {
    +              "port": 8888,
    +              "protocol": "http"
    +            }
    +          ],
    +          "name": "hello_rc_visard_ng",
    +          "status": "running"
    +        }
    +      ],
    +      "name": "hello_rc_visard_ng",
    +      "type": "container"
    +    },
    +    {
    +      "containers": [
    +        {
    +          "host_ports": [
    +            {
    +              "port": 8080,
    +              "protocol": "http"
    +            }
    +          ],
    +          "name": "grafana",
    +          "status": "running"
    +        },
    +        {
    +          "host_ports": [
    +            {
    +              "port": 9090,
    +              "protocol": "http"
    +            }
    +          ],
    +          "name": "prometheus",
    +          "status": "running"
    +        }
    +      ],
    +      "name": "rc_visard_monitoring",
    +      "type": "compose"
    +    }
    +  ],
    +  "available": true,
    +  "enabled": true
    +}
    +
    +
    + +++ + + + + + + + + +
    Antwort-Header: +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabewert: UserSpace)
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/revisions.html b/v24.04/de/revisions.html new file mode 100644 index 0000000..cb8dea2 --- /dev/null +++ b/v24.04/de/revisions.html @@ -0,0 +1,687 @@ + + + + + + + + + + + Einführung — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +

    Revisionen

    +

    Dieses Produkt kann bei Bedarf jederzeit ohne Vorankündigung geändert werden, um es zu verbessern, zu optimieren oder an eine überarbeitete Spezifikation anzupassen. Werden solche Änderungen vorgenommen, wird auch das vorliegende Handbuch überarbeitet. Beachten Sie die angegebene Versionsnummer.

    +

    DOKUMENTATIONSVERSION 24.04.1 + 24.04.2024

    +

    Gültig für rc_visard NG Firmware 24.04.x

    +
    +
    HERSTELLER
    +
    Roboception GmbH
    +
    Kaflerstraße 2
    +
    81241 München
    +
    Deutschland
    +
    KUNDENSUPPORT: support@roboception.de | +49 89 889 50 79-0 (09:00-17:00 CET)
    +

    +
    +

    Betriebsanleitung bitte vollständig lesen und produktnah aufbewahren.

    +

    COPYRIGHT

    +

    Das vorliegende Handbuch und das darin beschriebene Produkt sind durch Urheberrechte geschützt. Sofern das deutsche Urheber- und Leistungsschutzrecht nichts anderes vorschreibt, darf der Inhalt dieses Handbuchs nur mit dem vorherigen Einverständnis von Roboception bzw. des Inhabers des Schutzrechts verwendet und verbreitet werden. Das vorliegende Handbuch und das darin beschriebene Produkt dürfen ohne das vorherige Einverständnis von Roboception weder für Verkaufs- noch für andere Zwecke weder teilweise noch vollständig vervielfältigt werden.

    +

    Die in diesem Dokument bereitgestellten Informationen sind nach bestem Wissen und Gewissen zusammengestellt worden. Roboception haftet jedoch nicht für deren Verwendung.

    +

    Wurden nach Redaktionsschluss noch Änderungen am Produkt vorgenommen, kann es vorkommen, dass das Produkt vom Handbuch abweicht. Die im vorliegenden Dokument enthaltenen Informationen können sich ohne Vorankündigung ändern.

    +
    +

    Einführung

    +

    Hinweise im Handbuch

    +

    Um Schäden an der Ausrüstung zu vermeiden und die Sicherheit der Benutzer zu gewährleisten, enthält das vorliegende Handbuch Sicherheitshinweise, die mit dem Symbol Warnung gekennzeichnet werden. Zusätzliche Informationen sind als Bemerkung gekennzeichnet.

    +
    +

    Warnung

    +

    Die mit Warnung gekennzeichneten Sicherheitshinweise geben Verfahren und Maßnahmen an, die befolgt bzw. ergriffen werden müssen, um Verletzungsgefahren für Bediener/Benutzer oder Schäden am Gerät zu vermeiden. Beziehen sich die angegebenen Sicherheitshinweise auf Softwaremodule, dann weisen diese auf Verfahren hin, die befolgt werden müssen, um Störungen oder ein Fehlverhalten der Software zu vermeiden.

    +
    +
    +

    Bemerkung

    +

    Bemerkungen werden in diesem Handbuch eingesetzt, um zusätzliche relevante Informationen zu vermitteln.

    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/roi.html b/v24.04/de/roi.html new file mode 100644 index 0000000..8e5ba7b --- /dev/null +++ b/v24.04/de/roi.html @@ -0,0 +1,1159 @@ + + + + + + + + + + + RoiDB — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    RoiDB

    +
    +

    Einleitung

    +

    Das RoiDB Modul (Region of Interest Datenbankmodul) ermöglicht die globale Definition von 2D und 3D Regions of Interest (ROIs), die dann in vielen Detektionsmodulen verwendet werden können. Die definierten ROIs sind in allen Modulen auf dem rc_visard NG verfügbar, die 2D oder 3D ROIs unterstützen.

    +

    Das RoiDB Modul ist ein Basismodul, welches auf jedem rc_visard NG verfügbar ist.

    +

    3D ROIs können in den ItemPick und BoxPick Modulen verwendet werden. 2D ROIs werden vom SilhouetteMatch Modul und dem LoadCarrier Modul unterstützt.

    + + ++++ + + + + + + + + + + + + + + + + + +
    Tab. 49 Spezifikationen des ROIDB Moduls
    Unterstützte ROI Typen2D, 3D
    Unterstützte ROI Geometrien2D ROI: Rechteck, 3D ROI: Box, Kugel
    Max. Anzahl von ROIs2D: 100, 3D: 100
    ROIs verfügbar in2D: SilhouetteMatch, LoadCarrier, 3D: ItemPick und BoxPick
    Unterstützte Referenzkoordinatensystemecamera, external
    +
    +
    +

    Region of Interest

    +

    Eine sogenannte Region of Interest (ROI) definiert ein abgegrenztes Raumvolumen (3D ROI, region_of_interest) oder eine rechteckige Region im linken Kamerabild (2D ROI, region_of_interest_2d), welche für eine spezifische Anwendung relevant sind.

    +

    Eine ROI kann das Volumen, in dem ein Load Carrier gesucht wird, einschränken, oder einen Bereich definieren, der nur die zu erkennenden oder zu greifenden Objekte enthält. Die Verarbeitungszeit kann sich deutlich verringern, wenn eine ROI genutzt wird.

    +

    Folgende Arten von 3D ROIs (type) werden unterstützt:

    +
    +
      +
    • BOX, für quaderförmige ROIs mit den Abmessungen box.x, box.y, box.z.
    • +
    • SPHERE, für kugelförmige ROIs mit dem Radius sphere.radius.
    • +
    +
    +

    Die Pose pose einer 3D ROI kann entweder relativ zum Kamera-Koordinatensystem camera oder mithilfe der Hand-Auge-Kalibrierung im externen Koordinatensystem external angegeben werden. Das externe Koordinatensystem steht nur zur Verfügung, wenn eine Hand-Auge-Kalibrierung durchgeführt wurde. Wenn der Sensor am Roboter montiert ist, und die ROI im externen Koordinatensystem definiert ist, dann muss jedem Detektions-Service, der diese ROI benutzt, die aktuelle Roboterpose übergeben werden.

    +

    Eine 2D ROI ist als rechteckiger Teil des linken Kamerabilds definiert und kann sowohl über die REST-API-Schnittstelle als auch über die rc_visard NG Web GUI auf der Seite Regions of Interest unter dem Menüpunkt Datenbank gesetzt werden. Die Web GUI bietet hierfür ein einfach zu benutzendes Werkzeug an. Jeder ROI muss ein eindeutiger Name zugewiesen werden, um diese später adressieren zu können.

    +

    In der REST-API ist eine 2D-ROI über folgende Werte spezifiziert:

    +
      +
    • id: Eindeutiger Name der ROI
    • +
    • offset_x, offset_y: Abstand in Pixeln von der oberen rechten Bildecke entlang der x- bzw. y-Achse
    • +
    • width, height: Breite und Höhe in Pixeln
    • +
    +

    Der rc_visard NG erlaubt das Speichern von bis zu 100 verschiedenen 3D ROIs und der gleichen Anzahl von 2D ROIs. Die Konfiguration von ROIs erfolgt in der Regel offline während der Einrichtung der gewünschten Anwendung. Die Konfiguration kann mithilfe der REST-API-Schnittstelle des RoiDB Moduls vorgenommen werden, oder über die rc_visard NG Web GUI auf der Seite Regions of Interest unter dem Menüpunkt Datenbank.

    +
    +

    Bemerkung

    +

    Die erstellten ROIs sind persistent auf dem rc_visard NG gespeichert und auch nach Firmware-Updates und -Wiederherstellungen verfügbar.

    +
    +
    +
    +

    Wechselwirkung mit anderen Modulen

    +

    Die folgenden, intern auf dem rc_visard NG laufenden Module liefern Daten für das RoiDB Modul oder haben Einfluss auf die Datenverarbeitung.

    +
    +

    Hand-Auge Kalibrierung

    +

    Falls die Kamera zu einem Roboter kalibriert wurde, kann die Pose einer 3D ROI im Roboterkoordinatensystem angegeben werden, indem das Argument pose_frame auf external gesetzt wird.

    +

    Zwei verschiedene Werte für pose_frame können gewählt werden:

    +
      +
    1. Kamera-Koordinatensystem (camera): Die Pose der 3D Region of Interest ist Kamera-Koordinatensystem angegeben und es ist kein zusätzliches Wissen über die Lage der Kamera in seiner Umgebung notwendig. Das bedeutet insbesondere, dass sich ROIs oder Load Carrier, welche in diesem Koordinatensystem angegeben sind, mit der Kamera bewegen. Es liegt daher in der Verantwortung des Anwenders, in solchen Fällen die entsprechenden Posen der Situation entsprechend zu aktualisieren (beispielsweise für den Anwendungsfall einer robotergeführten Kamera).
    2. +
    3. Benutzerdefiniertes externes Koordinatensystem (external): Die Pose der 3D Region of Interest ist im sogenannten externen Koordinatensystem angegeben, welches vom Nutzer während der Hand-Auge-Kalibrierung gewählt wurde. In diesem Fall bezieht das Modul alle notwendigen Informationen über die Kameramontage und die kalibrierte Hand-Auge-Transformation automatisch vom Modul Hand-Auge-Kalibrierung.
    4. +
    +
    +

    Bemerkung

    +

    Wenn keine Hand-Auge-Kalibrierung durchgeführt wurde bzw. zur Verfügung steht, muss als Referenzkoordinatensystem pose_frame immer camera angegeben werden.

    +
    +

    Zulässige Werte zur Angabe des Referenzkoordinatensystems sind camera und external. Andere Werte werden als ungültig zurückgewiesen.

    +
    +
    +
    +

    Services

    +

    Das RoiDB Modul wird in der REST-API als rc_roi_db bezeichnet und in der Web GUI unter Datenbank ‣ Regions of Interest dargestellt. Die angebotenen Services des RoiDB Moduls können mithilfe der REST-API-Schnittstelle oder der Web GUI ausprobiert und getestet werden.

    +

    Das RoiDB Modul stellt folgende Services zur Verfügung.

    +
    +

    set_region_of_interest

    +
    +

    speichert eine 3D ROI auf dem rc_visard NG. Alle ROIs sind dauerhaft gespeichert, auch über Firmware-Updates und -Wiederherstellungen hinweg.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    PUT http://<host>/api/v2/nodes/rc_roi_db/services/set_region_of_interest
    +
    +
    +
    + +
    +

    Die Definition des Typs region_of_interest wird in Region of Interest beschrieben.

    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "region_of_interest": {
    +      "box": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "id": "string",
    +      "pose": {
    +        "orientation": {
    +          "w": "float64",
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "position": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        }
    +      },
    +      "pose_frame": "string",
    +      "sphere": {
    +        "radius": "float64"
    +      },
    +      "type": "string"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "set_region_of_interest",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    set_region_of_interest_2d

    +
    +

    speichert eine 2D ROI auf dem rc_visard NG. Alle ROIs sind dauerhaft gespeichert, auch über Firmware-Updates und -Wiederherstellungen hinweg.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    PUT http://<host>/api/v2/nodes/rc_roi_db/services/set_region_of_interest_2d
    +
    +
    +
    + +
    +

    Die Definition des Typs region_of_interest_2d wird in Region of Interest beschrieben.

    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "region_of_interest_2d": {
    +      "height": "uint32",
    +      "id": "string",
    +      "offset_x": "uint32",
    +      "offset_y": "uint32",
    +      "width": "uint32"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "set_region_of_interest_2d",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    get_regions_of_interest

    +
    +

    gibt die mit region_of_interest_ids spezifizierten, gespeicherten 3D ROIs zurück.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    PUT http://<host>/api/v2/nodes/rc_roi_db/services/get_regions_of_interest
    +
    +
    +
    + +
    +

    Werden keine region_of_interest_ids angegeben, enthält die Serviceantwort alle gespeicherten ROIs.

    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "region_of_interest_ids": [
    +      "string"
    +    ]
    +  }
    +}
    +
    +
    +
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "get_regions_of_interest",
    +  "response": {
    +    "regions_of_interest": [
    +      {
    +        "box": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "id": "string",
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "pose_frame": "string",
    +        "sphere": {
    +          "radius": "float64"
    +        },
    +        "type": "string"
    +      }
    +    ],
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    get_regions_of_interest_2d

    +
    +

    gibt die mit region_of_interest_2d_ids spezifizierten, gespeicherten 2D ROIs zurück.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    PUT http://<host>/api/v2/nodes/rc_roi_db/services/get_regions_of_interest_2d
    +
    +
    +
    + +
    +

    Werden keine region_of_interest_2d_ids angegeben, enthält die Serviceantwort alle gespeicherten ROIs.

    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "region_of_interest_2d_ids": [
    +      "string"
    +    ]
    +  }
    +}
    +
    +
    +
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "get_regions_of_interest_2d",
    +  "response": {
    +    "regions_of_interest": [
    +      {
    +        "height": "uint32",
    +        "id": "string",
    +        "offset_x": "uint32",
    +        "offset_y": "uint32",
    +        "width": "uint32"
    +      }
    +    ],
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    delete_regions_of_interest

    +
    +

    löscht die mit region_of_interest_ids spezifizierten, gespeicherten 3D ROIs.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    PUT http://<host>/api/v2/nodes/rc_roi_db/services/delete_regions_of_interest
    +
    +
    +
    + +
    +

    Alle zu löschenden ROIs müssen explizit angegeben werden.

    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "region_of_interest_ids": [
    +      "string"
    +    ]
    +  }
    +}
    +
    +
    +
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "delete_regions_of_interest",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    delete_regions_of_interest_2d

    +
    +

    löscht die mit region_of_interest_2d_ids spezifizierten, gespeicherten 2D ROIs.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    PUT http://<host>/api/v2/nodes/rc_roi_db/services/delete_regions_of_interest_2d
    +
    +
    +
    + +
    +

    Alle zu löschenden ROIs müssen explizit angegeben werden.

    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "region_of_interest_2d_ids": [
    +      "string"
    +    ]
    +  }
    +}
    +
    +
    +
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "delete_regions_of_interest_2d",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    Rückgabecodes

    +

    Zusätzlich zur eigentlichen Serviceantwort gibt jeder Service einen sogenannten return_code bestehend aus einem Integer-Wert und einer optionalen Textnachricht zurück. Erfolgreiche Service-Anfragen werden mit einem Wert von 0 quittiert. Positive Werte bedeuten, dass die Service-Anfrage zwar erfolgreich bearbeitet wurde, aber zusätzliche Informationen zur Verfügung stehen. Negative Werte bedeuten, dass Fehler aufgetreten sind. Für den Fall, dass mehrere Rückgabewerte zutreffend wären, wird der kleinste zurückgegeben, und die entsprechenden Textnachrichten werden in return_code.message akkumuliert.

    +

    Die folgende Tabelle listet die möglichen Rückgabe-Codes auf:

    + + ++++ + + + + + + + + + + + + + + + + + + + + + + +
    Tab. 50 Rückgabe-Codes der Services des RoiDB Moduls
    CodeBeschreibung
    0Erfolgreich
    -1Ungültige(s) Argument(e)
    -10Das neue Element konnte nicht hinzugefügt werden, da die maximal speicherbare Anzahl an ROIs überschritten wurde.
    10Die maximal speicherbare Anzahl an ROIs wurde erreicht.
    11Mit dem Aufruf von set_region_of_interest oder set_region_of_interest_2d wurde ein bereits existierendes Objekt mit derselben id überschrieben.
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/safety.html b/v24.04/de/safety.html new file mode 100644 index 0000000..314ca1e --- /dev/null +++ b/v24.04/de/safety.html @@ -0,0 +1,716 @@ + + + + + + + + + + + Sicherheit — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Sicherheit

    +
    +

    Warnung

    +

    Vor Inbetriebnahme des rc_visard NG-Produkts muss der Bediener alle Anweisungen in diesem Handbuch gelesen und verstanden haben.

    +
    +
    +

    Bemerkung

    +

    Der Begriff „Bediener“ bezieht sich auf jede Person, die in Verbindung mit dem rc_visard NG mit einer der folgenden Aufgaben betraut ist:

    +
    +
      +
    • Installation
    • +
    • Wartung
    • +
    • Inspektion
    • +
    • Kalibrierung
    • +
    • Programmierung
    • +
    • Außerbetriebnahme
    • +
    +
    +
    +

    Das vorliegende Handbuch geht auf die verschiedenen Softwaremodule des rc_visard NG ein und erläutert allgemeine Aspekte zum Lebenszyklus des Produkts: von der Installation über die Verwendung bis hin zur Außerbetriebnahme.

    +

    Die im vorliegenden Handbuch enthaltenen Zeichnungen und Fotos sind Beispiele zur Veranschaulichung. Das ausgelieferte Produkt kann hiervon abweichen.

    +
    +

    Allgemeine Sicherheitshinweise

    +
    +

    Bemerkung

    +

    Wird der rc_visard NG entgegen den hierin angegebenen Sicherheitshinweisen verwendet, so kann dies zu Personen- oder Sachschäden sowie zum Verlust der Garantie führen.

    +
    +
    +

    Warnung

    +
      +
    • Der rc_visard NG muss vor der Verwendung ordnungsgemäß montiert werden.
    • +
    • Alle Kabel sind am rc_visard NG und an seiner Halterung zu sichern.
    • +
    • Die Länge der verwendeten Kabel darf 30 Meter nicht überschreiten.
    • +
    • Die Stromversorgung für den rc_visard NG muss über eine geeignete Gleichstromquelle erfolgen.
    • +
    • Jeder rc_visard NG muss an eine separate Gleichstromquelle angeschlossen werden.
    • +
    • Das Gehäuse des rc_visard NG muss geerdet werden.
    • +
    • Die zum rc_visard NG oder zugehöriger Ausrüstung angegebenen Sicherheitshinweise müssen stets eingehalten werden.
    • +
    • Der rc_visard NG fällt nicht in den Anwendungsbereich der europäischen Maschinen-, Niederspannungs- oder Medizinprodukterichtlinie.
    • +
    +
    +

    Risikobewertung und Endanwendung

    +

    Der rc_visard NG kann auf einem Roboter installiert werden. Der Roboter, der rc_visard NG und jede andere für die Endanwendung eingesetzte Ausrüstung müssen im Rahmen einer Risikobewertung begutachtet werden. Der Systemintegrator ist verpflichtet, die Einhaltung aller lokalen Sicherheitsmaßnahmen und Vorschriften zu gewährleisten. Je nach Anwendung kann es Risiken geben, die zusätzliche Schutz- oder Sicherheitsmaßnahmen erfordern.

    +
    +
    +

    Bestimmungsgemäße Verwendung

    +

    Der rc_visard NG ist für die Datenerfassung (z.B. Kamerabilder, und Disparitätsbilder) in stationären oder mobilen Robotik-Anwendungen bestimmt. Der rc_visard NG kann dabei auf einem Roboter, einer automatischen Maschine, einer mobilen Plattform oder einer stationären Vorrichtung montiert sein. Er eignet sich zudem für die Datenerfassung in anderen Anwendungen.

    +
    +

    Warnung

    +

    Der rc_visard NG ist NICHT für sicherheitskritische Anwendungen bestimmt.

    +
    +

    Der vom rc_visard NG verwendete Schnittstellenstandard GigE Vision® unterstützt weder Authentifizierung noch Verschlüsselung. Alle von diesem und an dieses Gerät gesandten Daten werden ohne Authentifizierung und Verschlüsselung übermittelt und könnten daher von einem Dritten abgefangen oder manipuliert werden. Es liegt in der Verantwortung des Bedieners, den rc_visard NG nur an ein gesichertes internes Netzwerk anzuschließen.

    +
    +

    Warnung

    +

    Der rc_visard NG muss an gesicherte interne Netzwerke angeschlossen werden.

    +
    +

    Der rc_visard NG darf nur im Rahmen seiner technischen Spezifikation verwendet werden. Jede andere Verwendung des Produkts gilt als nicht bestimmungsgemäße Verwendung. Roboception haftet nicht für Schäden, die aus unsachgemäßer oder nicht bestimmungsgemäßer Verwendung entstehen.

    +
    +

    Warnung

    +

    Die lokalen und/oder nationalen Gesetze, Vorschriften und Richtlinien zu Automationssicherheit und allgemeiner Maschinensicherheit sind stets einzuhalten.

    +
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/search.html b/v24.04/de/search.html new file mode 100644 index 0000000..1c26012 --- /dev/null +++ b/v24.04/de/search.html @@ -0,0 +1,671 @@ + + + + + + + + + + + Suche — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + + + + +
    + +
    + +
    +
    + +
    +
    +
    + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/searchindex.js b/v24.04/de/searchindex.js new file mode 100644 index 0000000..bc1346e --- /dev/null +++ b/v24.04/de/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({docnames:["accessories","appendix","camera_calibration","camera_modules","collisioncheck","concept_stereo","concepts","configuration_modules","contact","database_modules","detection_modules","disposal","eki","general","gigevision","glossary","gripper_db","grpc","handeye_calibration","hardware_spec","index","installation","interfaces","iocontrol","itempick","loadcarrier","loadcarrier_db","maintenance","modules","opc_ua","pose_format_abb","pose_format_fanuc","pose_format_franka_emika","pose_format_fruitcore_horst","pose_format_kawasaki","pose_format_kuka","pose_format_mitsubishi","pose_format_rt","pose_format_ur","pose_format_yaskawa","rest_api","rest_api_datamodel","rest_api_general","rest_api_nodes","rest_api_swagger_ui","rest_api_syslogs","rest_api_userspace","revisions","roi","safety","silhouettematch","standards","stereo_camera","stereo_matching","tagdetect","time_sync","troubleshooting","userspace","warranty","webgui"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:55},filenames:["accessories.rst","appendix.rst","camera_calibration.rst","camera_modules.rst","collisioncheck.rst","concept_stereo.rst","concepts.rst","configuration_modules.rst","contact.rst","database_modules.rst","detection_modules.rst","disposal.rst","eki.rst","general.rst","gigevision.rst","glossary.rst","gripper_db.rst","grpc.rst","handeye_calibration.rst","hardware_spec.rst","index.rst","installation.rst","interfaces.rst","iocontrol.rst","itempick.rst","loadcarrier.rst","loadcarrier_db.rst","maintenance.rst","modules.rst","opc_ua.rst","pose_format_abb.rst","pose_format_fanuc.rst","pose_format_franka_emika.rst","pose_format_fruitcore_horst.rst","pose_format_kawasaki.rst","pose_format_kuka.rst","pose_format_mitsubishi.rst","pose_format_rt.rst","pose_format_ur.rst","pose_format_yaskawa.rst","rest_api.rst","rest_api_datamodel.rst","rest_api_general.rst","rest_api_nodes.rst","rest_api_swagger_ui.rst","rest_api_syslogs.rst","rest_api_userspace.rst","revisions.rst","roi.rst","safety.rst","silhouettematch.rst","standards.rst","stereo_camera.rst","stereo_matching.rst","tagdetect.rst","time_sync.rst","troubleshooting.rst","userspace.rst","warranty.rst","webgui.rst"],objects:{"":{"/cad/gripper_elements":[16,0,1,"get--cad-gripper_elements"],"/cad/gripper_elements/{id}":[16,2,1,"put--cad-gripper_elements-id"],"/logs":[45,0,1,"get--logs"],"/logs/{log}":[45,0,1,"get--logs-log"],"/nodes":[43,0,1,"get--nodes"],"/nodes/{node}":[43,0,1,"get--nodes-node"],"/nodes/{node}/services":[43,0,1,"get--nodes-node-services"],"/nodes/{node}/services/{service}":[43,2,1,"put--nodes-node-services-service"],"/nodes/{node}/status":[43,0,1,"get--nodes-node-status"],"/pipelines/{pipeline}/nodes":[43,0,1,"get--pipelines-pipeline-nodes"],"/pipelines/{pipeline}/nodes/{node}":[43,0,1,"get--pipelines-pipeline-nodes-node"],"/pipelines/{pipeline}/nodes/{node}/parameters":[43,2,1,"put--pipelines-pipeline-nodes-node-parameters"],"/pipelines/{pipeline}/nodes/{node}/parameters/{param}":[43,2,1,"put--pipelines-pipeline-nodes-node-parameters-param"],"/pipelines/{pipeline}/nodes/{node}/services":[43,0,1,"get--pipelines-pipeline-nodes-node-services"],"/pipelines/{pipeline}/nodes/{node}/services/{service}":[43,2,1,"put--pipelines-pipeline-nodes-node-services-service"],"/pipelines/{pipeline}/nodes/{node}/status":[43,0,1,"get--pipelines-pipeline-nodes-node-status"],"/system":[45,0,1,"get--system"],"/system/backup":[45,3,1,"post--system-backup"],"/system/dns":[45,2,1,"put--system-dns"],"/system/license":[45,3,1,"post--system-license"],"/system/network":[45,0,1,"get--system-network"],"/system/network/settings":[45,2,1,"put--system-network-settings"],"/system/reboot":[45,2,1,"put--system-reboot"],"/system/rollback":[45,2,1,"put--system-rollback"],"/system/time":[45,2,1,"put--system-time"],"/system/ui_lock":[45,3,1,"post--system-ui_lock"],"/system/update":[45,3,1,"post--system-update"],"/templates/rc_boxpick":[24,0,1,"get--templates-rc_boxpick"],"/templates/rc_boxpick/{id}":[24,2,1,"put--templates-rc_boxpick-id"],"/templates/rc_silhouettematch":[50,0,1,"get--templates-rc_silhouettematch"],"/templates/rc_silhouettematch/{id}":[50,2,1,"put--templates-rc_silhouettematch-id"],"/userspace":[46,0,1,"get--userspace"]}},objnames:{"0":["http","get","HTTP-get"],"1":["http","delete","HTTP-delete"],"2":["http","put","HTTP-put"],"3":["http","post","HTTP-post"]},objtypes:{"0":"http:get","1":"http:delete","2":"http:put","3":"http:post"},terms:{"0x81080001":14,"10x10":25,"16h5":54,"1mp":17,"21x21":54,"25h9":54,"25h9_3":54,"36h10":54,"36h11":54,"36h11_5":54,"3d_":53,"3x3":54,"41h12":54,"42h12":54,"4dof":18,"4x3":25,"4x4":54,"4x8":54,"6x6":54,"8con":0,"8gb":19,"8x8":25,"94b":0,"\u00c4nderung":[42,58],"\u00c4nderungen":[2,21,25,47,54,59],"boolean":[14,41,45],"default":[4,12,17,18,21,23,24,25,41,42,43,50,52,53,54],"enum":17,"final":[50,54],"float":[12,14,17,41],"for":[12,14,17,24,43,52],"int":[4,6,12,16,18,23,24,25,26,48,50,53,54,57],"m\u00fcssen":[2,4,5,11,12,14,16,18,19,21,24,25,26,47,48,49,50,54,57,58],"n\u00e4chste":2,"n\u00e4chsten":[2,14,19,41,44,45,50,53,54],"n\u00e4chster":2,"return":17,"switch":21,"synchronized":[41,45],"this":24,"true":[4,14,16,18,24,25,41,43,45,46,50,52,53,54],"w\u00e4re":[4,26,50],"w\u00e4ren":[4,16,24,25,26,48,54],"with":[17,24,45],Als:[2,12,15,24,26],Auch:54,Auf:[11,14,18,27,41,42,44,53,54,57,59],Aus:[2,23,24,50,54,56],Bei:[0,2,5,12,14,15,16,21,24,25,26,27,52,53,54],Bin:[24,50],Bis:[16,24,50],Damit:[16,18,36],Dann:[24,52],Das:[0,2,4,5,11,12,13,14,15,16,17,18,19,21,23,24,25,26,27,31,34,36,38,39,41,42,44,45,47,48,49,50,52,53,54,55,59],Dazu:[25,26,50,57,59],Der:[0,1,2,4,6,7,9,10,12,13,14,15,16,17,18,19,21,23,24,25,26,27,28,29,32,37,38,41,42,43,44,48,49,50,51,52,53,54,55,56,57,58],Des:24,Die:[0,1,2,3,4,5,7,9,11,12,14,15,16,17,18,19,21,23,24,25,26,27,28,31,32,34,35,36,37,38,39,41,42,43,44,45,47,48,49,50,52,53,54,55,56,59],Dies:[1,2,4,5,14,17,18,21,23,25,27,43,44,50,52,53,54,55,56,58,59],Diese:[2,3,10,12,14,18,19,21,24,25,27,41,50,52,53,54,56,57],Diesem:50,Dieser:[2,4,5,12,14,16,18,21,23,24,25,26,48,50,52,53,54,57,59],Dieses:[1,2,4,5,12,14,16,18,19,21,23,25,27,47,50,52,53,54,58],Durch:[2,18,50,53,58,59],Ein:[0,2,4,7,14,15,16,17,21,23,24,25,26,27,41,42,50,52,53,54,56],Eine:[0,1,2,4,12,14,17,18,32,37,46,48,50,52,53,54,55],Einige:[15,43,44],Hat:5,Ihr:29,Ihre:[12,14],Ihrem:58,Ist:[2,14,18,21,27,56],Jetzt:59,Kann:[21,27,58],Kein:19,Keine:[11,18,19,45,56],Keinen:57,Keiner:50,Mit:[2,5,13,23,24,25,26,27,48,50,52,53],NICHT:[19,49],Nach:[2,16,17,18,21,27,53,54,59],Nicht:[14,18],Nun:2,Nur:[4,14,26,27,57],ODER:54,Seine:26,Sicherheit:[20,21,47],Sie:[4,8,11,12,14,15,18,19,21,23,24,25,29,45,47,50,52,53,54,56,57,58,59],Sind:[14,52],Soll:[18,27],Sonst:[32,37],Viele:54,Von:19,Vor:[12,21,49,54],War:2,Wenn:[2,4,12,14,16,18,24,25,26,27,34,38,48,50,52,53,54,56,57],Wie:[12,18,27,54],Wir:[1,21,54],Wird:[2,4,18,19,21,24,27,49,50,52,53,56],Zum:[14,54],Zur:[2,17,18,19,21,31,32,34,35,36,39,42,54],a_0:32,a_1:32,a_2:32,a_3:32,a_4:32,a_5:32,a_6:32,a_7:32,a_8:32,a_9:32,a_r:[34,35,36],abb:[1,2,4,5,16,18,19,23,24,25,26,50,52,54],abbild:[44,52,53],abc:[1,12,15],abdeckt:53,abfrag:[9,16,22,42,44,45],abfragezeichenfolg:42,abgebildet:52,abgedeckt:[2,19,24],abgefang:49,abgefragt:[12,15,18,21,23,27,46,50,57],abgeg:50,abgegrenzt:48,abgeh:19,abgelauf:21,abgelegt:12,abgeruf:[12,14,15,18,55],abgeschaltet:[17,52],abgeschirmt:58,abgeschloss:[2,14,24,27,50,56,57],abgeseh:54,abgestuft:26,abgewickelt:21,abgewinkelt:19,abgewischt:27,abgezog:26,abhang:[4,14,24,50,54,55],abhangt:14,ableit:[14,41],ables:18,abmess:[12,13,16,18,19,24,25,26,48],abmessungsbereich:24,abnehm:56,abruf:[18,27,40,42,43,44,45,46,50],abschluss:27,abschnitt:[0,1,2,4,12,14,16,18,19,25,27,50],abstand:[4,5,14,19,23,24,48,50,54,56],abteil:24,abteilkoordinatensyst:26,abweich:[19,24,25,49,52,53],abweicht:47,abzubild:24,abzufrag:[12,14,18,43],accept:[16,24,43,45,50],accepted:[24,43,54],access:[15,21,45],accuracy:[41,45],achievabl:17,achs:[1,16,18,24,26,31,34,35,36,39,48,50,52,54],achslang:24,acht:[14,18,53],achtpol:[0,19],acos:[34,38],acquisition:17,acquisition_mod:12,acquisition_trigg:[12,43],acquisitionalternatefilt:14,acquisitionframerat:14,acquisitionmultipartmod:14,active_imag:[41,45],actual:17,adapt:19,adaptiveout1:[14,17,24,25,50,52],add:[12,17],addi:53,addiert:14,address:15,administrator:[15,57],adress:[15,20,21,27,41,42,45,56,59],adressbereich:15,adressi:48,ahnlich:[18,24,50,54],akkumulator:11,akkumuliert:[4,16,24,25,26,48,54],akkus:11,akquis:[24,25,50],aktion:[42,44],aktiv:[25,27,41,45,50,53,55],aktivi:[14,24,45,50,53,59],aktivier:27,aktiviert:[4,10,12,14,15,16,21,24,27,29,41,50,53,56,57,59],aktor:0,aktualisi:[18,24,25,26,27,48,59],aktualisier:[20,40,43,45],aktualisiert:[16,24,27,41,45,50],aktualisierungszahl:2,aktuell:[2,6,12,14,15,16,18,21,23,24,25,27,40,41,42,43,44,45,48,50,52,53,54,55,57,59],akzeptabel:18,akzeptabl:2,akzepti:15,akzeptiert:[21,26],algorithm:[40,43],algorithmus:[2,5,15,25,53],align:1,all:[1,2,4,12,13,14,15,16,17,18,19,21,23,24,25,26,27,28,32,34,35,42,43,44,45,48,49,50,52,53,54,55,56,57,58,59],allerding:[14,17,53,54],allgemein:[18,19,20,44,50,54,59],allowed:[17,24],alltagsgerat:54,alpha:1,alt:[18,24,27],alternateexposureactiv:17,alternativ:[17,18,24,25,50,53,59],altgerat:11,aluminium:19,amplitud:56,analysi:12,anbiet:[6,16,28,43],anbietet:12,and:[2,3,10,11,12,13,14,15,16,17,18,19,21,23,27,28,34,41,42,43,44,45,47,49,53,54,57,58],anderenfall:[2,14,21,27,50],andererseit:54,andernfall:[4,16,24,25,50],andert:[15,21,52,54],anford:22,anforder:[0,27,42,43,58],anfrag:[4,8,16,17,22,23,24,25,26,27,41,43,44,45,48,50,54],anfragefrequenz:42,anfrageparamet:[43,45],anfragetyp:42,anfragezeitpunkt:50,angab:[18,24,25,26,27,41,43,48,50,54],angeb:[1,18,50,53,54],angebot:[4,12,13,16,24,25,26,41,42,43,44,48,50,54],angebracht:[18,19,54],angefordert:[17,42,53,55],angefragt:[12,16,24,25,44,50],angefuhrt:15,angegeb:[0,1,2,4,12,13,14,16,18,19,23,24,25,26,27,34,41,47,48,49,50,52,53,54,56,59],angehang:42,angehangt:15,angeheftet:[16,50],angehor:21,angehort:13,angeklickt:24,angelegt:[16,41,50],angemess:19,angenahert:54,angenomm:[24,26,50,53,54],angeordnet:[25,54],angepasst:[2,18,43,50,52,53],angeschaltet:[14,23],angeschloss:[0,14,15,19,21,23,49,50,52,53,56,59],angeseh:50,angesteuert:57,angewandt:[18,41],angewendet:[1,4,26],angezeigt:[2,16,18,24,27,50,52,53,54,57,59],angibt:[4,24,27,53],angrenz:[19,24,56],anhand:[18,24,52],anhang:20,anheft:[16,50],ankund:[2,50],anleg:[16,42],annahm:[14,54],annehm:54,anordn:32,anpasst:52,ansatz:18,anschein:56,anschliess:[0,2,12,19,27,44,45,50,57],anschluss:[19,21,27,58],anschlussset:[19,20],anseh:27,ansicht:18,ansichtsoption:50,anson:54,anspruch:27,anstatt:[18,45,54],anstell:[50,54],ansteu:53,ansteuer:23,anteil:[14,24,25,50,52,53],anti:27,antwort:[16,24,41,43,44,45,46,50,54],antwortnachricht:12,antworttext:44,anweis:[2,49,56],anwend:[7,10,12,13,14,18,19,20,22,23,24,25,26,27,28,42,43,48,49,50,52,53,54,58,59],anwendbar:24,anwendungsbereich:49,anwendungsentwickl:[24,50],anwendungsfall:[18,24,25,26,48],anwendungskontext:43,anyedg:52,anzahl:[4,12,15,16,25,26,48,50,53,54],anzeig:22,anzeigt:[27,59],anzubring:18,anzugeb:[24,25,50,53,54],anzunehm:24,anzupass:[47,53],anzuschalt:52,anzuschliess:[24,25,49,50],anzusteu:23,anzuwend:45,anzuzeig:[50,56],anzuzieh:19,api:[2,4,7,9,12,15,17,18,20,22,23,25,26,27,28,41,43,44,45,46,48,52,53,54,55,57,59],app:[32,41,46,57],application:[16,24,42,43,45,46,50],applikation:[13,45,53,54,55,56],applikationsseit:50,apps:[41,46,57],april:54,apriltag:10,aquivalent:[1,43],arbeit:[2,21],arbeitet:[15,19,54,56,58],arbeitsabstand:53,archiv:12,are:24,arg:[4,12,16,18,24,25,26,41,43,48,50,53,54],argument:[4,12,16,18,23,24,25,26,32,37,41,42,43,44,45,48,50,52,53,54],argx:12,argx_typ:12,array:[1,12,16,24,31,32,34,35,36,37,38,39,41,43,45,50],arrays:[12,29],art:[0,1,16,18,25,26,42,45,48,50,52],artefakt:[27,45],artikel:0,ascii:54,asin:[31,32,35,36,39],aspekt:49,assistent:[2,18],atan:[31,32,34,35,36,39],attribut:[12,29,41,42,44],aufbau:[21,54],aufbewahr:47,aufdruck:24,aufeinanderfolg:[14,53],auffind:14,auffull:53,aufgab:[0,40,49],aufgebaut:16,aufgedruckt:21,aufgefordert:27,aufgefuhrt:[4,21,53],aufgelistet:[18,21,24,25,42,50,53,54,57],aufgelost:[15,24,54],aufgenomm:[5,14,17,18,24,25,50,52,53,54],aufgeruf:[4,16,18,23,24,25,26,27,48,50,52,53,54,56,59],aufgespielt:27,aufgesplittet:24,aufgeteilt:[12,24],aufgetret:[4,16,23,24,25,26,48,50,54],aufgezahlt:[12,50],aufgezeichnet:18,aufgrund:[12,14,42,43,53,54],auflist:[16,24,41,43,50,54],auflos:[14,50,52,54,56,59],aufnahm:[2,5,6,17,18,24,25,50,53,56],aufnahmemodus:[24,25,50],aufnahmezeitpunkt:14,aufnehm:[28,53,59],aufruf:[14,18,19,22,23,24,25,26,27,40,41,43,44,48,50,54,57,59],aufspann:50,aufspur:[20,59],auftret:[2,12,52,54,56],auftritt:2,aufweis:[24,53],aufweist:50,aufzahl:14,aufzubau:12,aufzulos:[26,54],aufzunehm:[5,18],aufzuruf:[43,44,54],aufzuspiel:27,aufzuspur:27,aug:[2,7,12,19,27,40,41,43,53],ausdehn:24,ausdruck:[54,58],ausfind:21,ausfuhr:[12,22,24],ausfuhrbar:21,ausfull:[44,53],ausfullt:2,ausgabedat:18,ausgang:[7,14,19,24,25,50,52,53],ausgeb:[24,25,54],ausgedruckt:14,ausgefuhrt:[21,44,50,54,57],ausgefullt:44,ausgegang:53,ausgegeb:[14,18,24],ausgeh:[5,16,27,50],ausgelegt:[19,50],ausgeles:12,ausgeliefert:[18,21,28,49],ausgelost:[18,27,44,50,52,53,54],ausgenomm:[4,50],ausgerichtet:[2,24,25,50,52,54],ausgesandt:5,ausgeschaltet:23,ausgeschloss:[27,54],ausgesetzt:[2,27],ausgestattet:19,ausgewahlt:[14,18,24,27,50],ausgewertet:4,ausgibt:32,auskunft:11,ausleg:18,auslos:[24,25,43,44,53,54],auslost:12,ausnahm:17,ausnahmslos:19,ausprobi:50,ausprobiert:[4,16,24,25,26,48,50,54],ausreich:[19,50],ausreicht:56,ausricht:[2,5,16,19,50],ausrichtungsfehl:2,ausrust:[19,47,49],auss:[26,36,52,54],aussagekraft:2,ausschalt:[14,52],ausschliess:[2,50],ausseh:[24,54],aussenbereich:5,aussenkontur:50,aussenmass:26,ausserbetriebnahm:49,ausserd:[18,50,54,59],ausserhalb:[11,25,50,54,56],ausserst:18,aussortiert:54,aust:[43,44],austrittspupill:19,auswahl:[0,14,21,24,50,52],auswirk:[18,24,25,50],auszeichnet:15,auszufuhr:12,auszugeb:[18,56],auszulos:52,auszutausch:59,auszuwahl:[14,24,50],authentifizier:49,auto:[14,43],autobelichtungszeit:56,automat:[2,12,14,15,16,24,25,26,27,44,48,49,50,52,53,54,56,59],automationssich:49,autostart:54,availabl:[17,41,46],averag:17,b_r:[35,36],backup:[20,45,59],backups:[27,45],bad:[16,24,42,43,45,50],balanceratio:14,balanceratioselector:14,balancewhiteauto:14,bandbreit:[52,59],base_plan:50,baselin:[14,17,43,52],basi:23,basier:[1,24,26,50,52],basiert:[13,14,16,17,21,24,25,26],basisabstand:[14,19,52,53,59],basiseb:4,basismodul:[2,18,26,48,52,53],batteri:11,baum:12,baumstruktur:16,bauteil:19,beabsichtigt:58,beacht:[1,14,47,53,54,56],beachtet:[19,50,54],beanspruch:2,beantwort:42,bearbeitet:[4,16,23,24,25,26,44,48,50,54],bedarf:[24,27,47,56],bedeckt:2,bedenk:[2,44],bedeut:[4,16,23,24,25,26,48,50,54],bedeutet:[1,5,11,14,18,21,24,25,26,27,44,48,52,53,54],bedi:[47,49],bedien:[13,22,49],bedienoberflach:[13,24,50],bedient:5,beding:[50,54],bedruckt:24,bedurf:44,beeinfluss:[24,44,50,52],beeinflusst:[4,50],beeintracht:27,beeintrachtigt:2,beendet:[2,17,56],befehl:[43,44],befest:[18,19],befestigt:[18,19,21],befind:[10,16,19,24,26,50,54],befindet:[2,4,16,18,43,50,53],befolg:[2,56],befolgt:47,befullt:[12,56],begang:2,begin:[1,31,32,34,35,36,37,38,39],beginn:24,begrenz:[26,52],begrenzt:[12,16,42,50,52],begriff:[13,24,40,49,53],begrundet:5,begutachtet:49,behalt:[10,24,25,26,50],behalterfullstand:25,behindert:50,behord:[11,58],beid:[1,2,5,14,18,19,21,24,25,50,52,53,54],beieinand:24,beilauf:59,beim:[2,12,18,21,24,25,27,41,45,50,53,54,58,59],beinhalt:[18,24,50,54],beinhaltet:[12,23,24,25,54,59],beispiel:[0,1,9,12,14,15,18,21,23,24,26,40,42,44,49,52,53],beispielantwort:[43,45,46],beispielargument:43,beispielsweis:[2,5,12,14,15,24,25,26,27,43,44,48,50,54,55],bekannt:[2,5,12,14,15,18,21,42,50,55],bekomm:14,belast:[2,27],belastet:19,belauft:2,beleg:19,belegt:2,beleucht:[2,54],belicht:[2,19,24,25,50,53,56,59],belichtet:[2,18,52,56],belichtungseinstell:[2,52],belichtungsfunktion:52,belichtungsmittelwert:52,belichtungsmodus:[14,52,56],belichtungsregel:[14,52],belichtungssynchronisier:19,belichtungszeit:[2,14,23,50,53,56,59],belichtungszeitautomat:14,belichtungszeitregel:[14,24,25,50,52],belichtungszeitsteuer:[14,52],belieb:[4,15,18,50,54],bemerk:47,bemerkt:14,bemessungswert:19,benachrichtigt:12,benachrichtigungsfen:27,benannt:12,benot:[19,24,52,54],benotigt:[0,4,5,9,12,14,15,16,18,21,24,25,41,42,43,44,50,52,53,54],benutz:[1,2,4,5,7,12,14,17,18,23,24,25,27,42,44,47,48,50,52,53,54,56,57,58],benutzerdefiniert:[2,12,18,21,23,24,25,26,27,29,48,50,54],benutzereingab:18,benutzereinstell:53,benutzerfreund:[18,40,43],benutzerkonto:57,benutzeroberflach:[40,44],benutzerspezifiziert:54,benutzt:[1,12,14,16,17,23,24,31,32,34,36,37,39,48,50,52,54,57],berechn:[2,3,5,6,12,13,14,19,25,50,54,59],berechnet:[1,2,18,23,24,25,31,32,34,35,36,38,39,50,52,53,54],berechnungszeit:[25,50,54],bereich:[2,14,19,24,25,26,48,50,53,54,56],bereit:[1,2,5,12,13,21,24,25,26,27,43,45,48,52,53,54],bereitgestellt:[3,18,19,24,27,43,47,52,53,54],bereitstell:[0,3,28],bereitstellt:[43,52],bereitzustell:57,berucksicht:[24,53],berucksichtigt:[23,24,26,50,52],beruhr:56,beruht:5,besagt:25,beschadigt:[2,58],beschaff:19,beschicht:27,beschichtet:27,beschleun:[6,25,54],beschrank:45,beschrankt:[18,53],beschreib:[1,12,14,16,17,19,26,30,33,41,42,43,44,48,54],beschreibt:[18,24],beschreibungssprach:17,beschrieb:[4,12,14,16,18,21,24,25,26,27,47,48,50,52,53,54,59],besitz:[11,50,53,54],besitzt:[0,19,21,40,41,54],besond:[15,19,21,27,53],bess:[17,18],best:[19,24,47,50,52,54],bestandteil:[0,21],bestat:27,besteh:[2,4,16,19,23,24,25,26,27,32,48,50,54],besteht:[0,1,4,16,17,21,31,34,38,39,50,54],bestellt:19,bestimm:[52,53],bestimmt:[2,4,14,16,19,24,26,41,43,44,49,50,52,53,54,57],bestimmungsgemass:20,bestmog:[5,24],beta:1,betatigt:[27,54],betracht:52,betrachtet:50,betrag:[12,19,26,53],betragt:[14,19,25,53,56],betraut:49,betrieb:[5,19,24,25,27,50,52,56,58],betriebsanleit:47,betriebsart:[7,14,23],betriebsbeding:[20,27],betriebsbereit:41,betriebsmodus:[24,25,50],betriebssystem:[15,21,42],betriebstemperatur:19,betriebszeit:41,betriebszustand:14,betrifft:[50,53,59],betroff:54,betwe:[17,43],beurteil:18,bevor:[2,18,21,27,50,54],bevorzugt:[18,21,24,27,45,53],beweg:[4,18,19,24,25,26,27,48,50,52,54,56],bewegt:[18,50,54],bewegungsgeschwind:56,bewegungsschatz:6,bewegungsunscharf:[2,56],bewertet:24,bezeichn:[1,24],bezeichnet:[1,2,4,15,16,18,19,23,24,25,26,27,38,40,48,50,52,53,54],bezieh:[13,14,47],bezieht:[15,24,25,26,48,49,50,52,53,54],bezog:[0,2,18,26,50,53,54],bezug:[0,16,18,19,24,50,53,54],bezugskoordinatensyst:16,bezugskoordinatensystem:16,bibliothek:[14,21,40],biegeradius:19,biet:[24,43],bietet:[0,2,4,5,7,10,13,14,16,17,18,19,23,25,27,28,29,40,43,48,50,52,53,54,59],bigendian:17,bild:[2,3,5,6,15,18,19,22,23,24,25,50,53,54,55,56,59],bildabmess:59,bildakquis:52,bildauflos:[14,19,52,53],bildaufnahm:[14,23,24,43,52,53,59],bildbelicht:19,bildbereich:[15,52,53],bildbreit:[14,52,53],bilddat:[17,18,22,24,25,50,54,57],bilddatensatz:[24,25,50,54],bilddatenschnittstell:[20,22],bildeck:48,bilderfass:[13,52],bildformat:14,bildgross:14,bildhauptpunkt:[14,52,53],bildhell:[14,52],bildhoh:[14,53],bildintensitat:5,bildintensitatswert:24,bildkomponent:56,bildkoordinat:53,bildkoordinatensyst:53,bildkoordinatensystem:53,bildmitt:53,bildpaar:[3,5,14,28,54],bildpixel:54,bildpunkt:50,bildrausch:[52,54,56],bildrektifizier:41,bildschirm:[2,59],bildschirmbereich:2,bildspalt:53,bildteil:52,bildtextur:[5,54],bildtyp:14,bildunscharf:52,bildverarbeit:[23,52],bildverarbeitungsbibliothek:13,bildverarbeitungsmodul:[2,40],bildverarbeitungsschnittstell:17,bildvorschau:[52,53],bildwiederholrat:[14,21,23,53,56,59],bildzeil:[2,52,54],binning:17,binning_method:17,binningmethod:17,bish:54,bit:[23,54],bitmask:[17,23],bitt:[11,18,21,29,47,56],blau:[14,50,56],bleib:[16,19,27,54],bleibt:[27,52],blickricht:[2,50,54],blickwinkeln:5,blink:56,blinkt:[21,56],block:14,blue:14,board:[19,28,53],bod:[25,26,50],body:42,bogenmass:[1,31,32,34,35,36,38,39],bool:[4,12,17,18,24,25,41,43,50,52,53,54],boot:[19,21,41,45,56],bootprozess:14,bounding:16,box:[16,24,26,48],boxerkenn:24,boxpick:[4,10,16,25,26,48],brandverletz:19,brauch:50,breit:[2,14,24,26,48,52,53],brennweit:[2,14,52,53,54],brennweitenfaktor:[52,53],bridg:57,brightness:[17,52],broadcast:[21,56],broschur:24,brows:[21,56,59],bryan:1,bspw:[11,54],buch:24,buchs:[0,19],buchstab:12,buff:[12,17],buffering:12,buffsiz:12,bundelt:40,bundesministerium:11,burogebaudenetz:0,button:[27,50,59],byt:[14,17,41],bzw:[11,14,15,16,18,21,23,25,26,43,47,48,50,52,53,54,55],c_r:[35,36],cad:[19,27,41,50],cadmatch:24,calibrat:[12,43],calibrate_base_plan:12,calibration:[2,43,45],camera:[15,17,18,24,25,26,45,48,50,53,54],cameras:14,capture_new:53,carri:[4,9,10,12,16,24,27,28,42,45,48,50,59],cas:17,cat5:0,ccc:[1,37,38],cccc:[31,32,34,35,36,37,38,39],cdot:[14,18,38,53],cell:53,cell_count:53,cell_position:25,cell_siz:25,cells_filling_level:25,celsius:52,cent:[15,16,18,24,50],cet:47,change_stat:12,channel:14,check:[41,57],check_collision:12,check_collisions_with_:50,check_collisions_with_base_plan:4,check_collisions_with_match:4,check_collisions_with_point_cloud:4,check_flang:16,checking:17,chrom:[21,59],chunkcomponentid:14,chunkcomponentidvalu:14,chunkcomponentselector:14,chunklinestatusall:14,chunkmodeactiv:14,chunkpartindex:14,chunkrcout1reduction:14,chunkscan3d:14,chunkscan3dbaselin:14,chunkscan3dcoordinatescal:14,chunkscan3dfocallength:14,chunkscan3dprincipalpointu:14,chunkscan3dprincipalpointv:14,clear:27,client:[12,14,15,17,27,29,40,43,45,55,56,59],clos:[17,50],clust:[24,50],clusterflach:24,cod:[4,10,12,16,23,24,25,26,50,53],colliding_grasps:4,collision:17,collision_check_tim:4,collision_checked:[4,50],collision_detection:[4,24,50],collision_free_grasps:4,collisioncheck:[7,16,26],color:[17,43,52],column:17,com:[0,8,12,14,15,17,19,21,27,53,57],command:14,common:12,component:[41,45],componentenabl:[14,56],componentidvalu:14,components_constraint:41,componentselector:[14,56],compos:[41,46,57],comput:[15,21,24,56],computation:24,compute_grasps:[4,12,26],computed:17,computernetzwerk:[15,21],confidenc:[12,14,17,42],confidence8:14,confidence_enabled:17,config:12,configuration:15,connect:17,connectivity:0,contact:0,contain:[41,46,57],content:[16,24,42,43,45,46,50],continuous:[12,14,52,53],control:[14,15,21,45],convention:14,coord3d_c16:14,copyright:47,cos:[1,31,32,34,35,36,38,39],count:2,coverag:[25,53],cpu:[19,53],crop_distanc:26,csv:59,curl:[42,43,44],current:[2,17],current_method:[41,45],current_stat:[24,43,54],currently:17,cylind:16,d16_:14,d_1:5,d_2:5,dabei:[2,4,14,18,26,27,49,53,54],dadurch:[5,50,52,53,54],dafur:[2,19,44,50,54],dageg:54,dah:[2,12,14,18,21,24,25,26,27,48,49,50,54],daneb:59,dank:13,dar:[25,53],daran:2,darauf:[2,11,18,54,56],daraufhin:44,daraus:12,darf:[0,2,15,16,19,21,24,27,47,49,50,53,54,58],dargestellt:[2,4,5,6,16,18,19,23,24,25,26,41,48,50,52,53,54],darin:[5,47],darstell:[4,5,12,15,16,18,24,26,41,53,54],darstellt:18,darub:[13,24,25,27,43,50,55],darunt:2,darzustell:44,dashboard:59,dass:[2,4,5,11,12,14,15,16,18,19,21,23,24,25,26,27,32,36,37,42,44,47,48,50,52,53,54,56,58],dasselb:[16,50],dat:[4,9,11,15,16,17,24,25,26,28,41,42,45,48,49,50,54],data:[16,17,24,45,50],data_acquisition_mod:53,data_acquisition_tim:[24,25,50,54],datatypedefinition:29,datei:[12,16,21,24,27,42,45,50,52,53,59],dateierweiter:27,dateiformat:16,dateigross:16,dateinam:59,dateisyst:[18,27],datenanfrag:12,datenbank:[16,26,48,50,59],datenbankmodul:[20,28,42,43,48,59],datenempfang:12,datenerfass:49,datenformat:42,datenmodell:[16,24,41,43,45,46,50],datenmodul:54,datenpunkt:24,datensatz:53,datenschutz:11,datenschutzproblem:50,datenserialisier:17,datenstrom:22,datentyp:[4,12,16,18,23,24,25,26,29,42,48,50,52,53,54],datenubertrag:22,datenverarbeit:[24,25,26,48,50],datum:[45,55],dau:[19,23,27,54,55],dauerhaft:[0,16,19,26,48,50,56],dauert:54,davon:[24,27,50,53],dazugehor:17,dazwisch:54,deaktivi:[4,53,59],deaktiviert:[14,25,27,50,59],debug:41,decibel:17,decl:12,dediziert:50,default_gateway:[41,45],defekt:56,defini:[1,15,23,24,25,26,32,48,50,52,53],definiert:[1,4,14,15,16,18,23,24,25,26,32,37,41,48,50,52,53,54],definition:[1,4,15,16,18,23,24,25,48,50,52,53,54],deformierbar:24,degre:15,dekalibriert:[2,5],delet:[16,24,42,44,45,50,59],delete_base_plane_calibration:12,delete_grasps:12,delete_gripp:[12,43],delete_load_carri:[12,43],delete_pos:12,delete_regions_of_inter:[12,43],delete_regions_of_interest_2d:[12,43],delta_d:17,delta_z:17,demnach:18,demselb:53,denen:[4,6,13,14,16,18,23,26,50,52,53,54],dennoch:[2,24],denselb:[18,54],depalettierszenari:24,depalettierszenario:24,deprecated:18,depth:17,depthacquisitionmod:14,depthacquisitiontrigg:14,depthdoubleshot:14,depthfill:14,depthmaxdepth:14,depthmaxdeptherr:14,depthminconf:14,depthmindepth:14,depthquality:14,depthseg:14,depthsmooth:14,depthstaticsc:14,deregistered:45,deren:[10,12,14,25,26,47,50,53,57],derselb:[18,24,25,26,48,50,54],derzeit:[0,18,27,50,54],description:[41,42,43],deshalb:[17,50,54],designt:54,desired:12,dess:[2,18,21,50,53,54],desselb:53,desto:[5,18,24,50,53,54],desweg:4,det:[32,37],detail:[4,16,17,18,23,24,25,26,48,50,52,53,54],detailliert:41,detect:12,detect_filling_level:12,detect_inverted_tag:54,detect_item:12,detect_load_carri:12,detect_object:[4,12],detected:43,detekti:[50,54],detektier:[24,50],detektiert:[2,4,24,25,50],detektion:[24,25,26,42,43,48,50,54,59],detektionsanwend:10,detektionsaufruf:[24,26],detektionsergebnis:[24,50],detektionsfunktion:28,detektionsmodul:[9,12,20,26,28,48,59],detektionsprozess:50,detektionsvorgang:50,deutet:56,deutlich:[17,25,48,53,54],deutsch:47,deutschland:[8,47],develop:17,development:15,dezibel:[14,52],dhcp:[15,21,41,42,45,55],dhcp_enabled:[41,45],dialog:21,diamet:24,dicht:[17,19,24,25,53],dick:[2,18],dictionary:41,dictionarys:41,dien:14,dient:[5,15,17,18,23,26,40,52,56,59],dieselb:[4,24,25],differenz:[26,52],digital:[19,23,24,25,50],digitaliocontrol:23,dimension:[16,24,26,50],dimensions_tolerance_m:24,dimensionstoleranz:24,direction:[24,50],direkt:[0,15,18,21,24,25,50,52,56,57,59],disabled:41,discov:21,discovery:[14,21,56],diskret:50,disparitat:[3,5,6,14,17,20,23,24,25,53,59],disparitatsabweich:53,disparitatsberechn:12,disparitatsbereich:53,disparitatsbild:[14,17,23,25,49,50,56,59],disparitatsfehl:53,disparitatsfehlerwert:14,disparitatsmess:[14,53,56],disparitatsregion:53,disparitatssegment:53,disparitatstoleranz:53,disparitatswert:[14,53,56,59],disparity:[14,17],disparity_enabled:17,disparity_error:17,disparity_error_enabled:17,disparityc:14,disparityimag:17,distanc:50,distanz:[50,53,54],distanzmess:5,distanzwert:53,divers:52,dns:[15,21,41,45,59],dns_serv:[41,45],dock:57,documentation:19,dof:15,dokument:47,dokumentationsversion:47,dokumentiert:[12,27,43],domain:[15,21,59],doppelklick:[21,56,59],doubl:14,down:41,download:[2,12,14,16,19,20,21,24,50,53,54],dreh:18,drehachs:1,drehbereich:50,drehmatrix:18,drehmoment:19,drehrat:6,drehung:1,drei:[1,15,19,26,31,34,39,50,54],dreieck:50,dreifach:53,dringend:[18,27],dritt:[1,49],drittanbiet:0,dropdown:[21,50],drosseln:56,druck:[53,54],druckgross:54,dunkel:[14,56],dunkelblau:50,dunkelgrun:25,dunkl:[14,50,52],durchfuhr:[2,7,18,27,53],durchgang:[26,54],durchgefuhrt:[2,4,14,16,18,21,24,25,26,31,32,34,35,36,37,38,39,44,48,50,53,54],durchgestrich:11,durchlauf:50,durchmess:[19,24],durchschnitt:[26,53],durchsucht:21,durchzufuhr:[18,28,50,53],durf:[2,16,19,24,25,47,50],durft:2,dxf:50,dynam:19,dynamic:15,dynamikbereich:52,e2cf:0,eben:[10,24,25,50,54],ebenengleich:50,ebenenparamet:50,ebenfall:[1,12,18,21,24,26,50],ebenso:[2,24,54],echtzeit:[6,13],eck:[2,24,53,54],edg:[17,59],editierbutton:24,edu:54,eecs:54,eggenburg:0,egston:0,eher:40,eig:[4,12,14,15,16,17,19,21,50,53,55],eigenschaft:[14,24,41,53],eigenstand:4,eigent:[4,16,23,24,25,26,41,42,48,50,53,54],eignet:[49,53],einand:[14,50],einbezog:50,eindeut:[14,15,16,18,21,24,41,48,50,54,59],eindimensional:32,einfach:[7,14,17,48,55,59],einfluss:[24,25,26,48,50,54,59],einfuhr:[17,20],eingab:21,eingabewert:18,eingang:[14,19,23,52],eingeb:18,eingebaut:41,eingeblendet:2,eingebund:57,eingegang:[18,50],eingegeb:[18,21,50],eingehalt:49,eingepasst:50,eingeschaltet:[14,21,24,41,56],eingeschloss:50,eingeschrankt:18,eingeseh:[53,55,59],eingesetzt:[5,18,47,49,53],eingespielt:27,eingesteckt:21,eingestellt:[2,14,18,21,52,53,59],eingetrag:[2,12],einhalt:49,einheit:[1,14,15,50,52,53],einheitsquaternion:32,einricht:[0,48,56],eins:2,einsatzbereich:0,einsatzbereit:[21,56],einschalt:20,einschliess:[24,41,44,46,50,57,59],einschrank:[12,20,41,48,54],einschraubtief:19,einseit:0,einsetz:53,einspiel:[27,45],einsteck:21,einstell:[2,4,12,14,20,21,22,25,41,43,45,53,59],einstellbar:14,einstiegspunkt:42,eintrag:[18,32,41,42],einverstandnis:47,einzelbild:[52,53],einzeln:[1,2,14,18,24,40,41,42,43,53,54,59],einzig:[2,17,18,21,52],einzigart:54,einzugeb:56,einzuhalt:[19,49],einzuricht:21,einzuschliess:54,einzuschrank:25,einzustell:[21,52],eki:22,eki_checkbuff:12,eki_clearbuff:12,eki_clos:12,eki_exampl:12,eki_get:12,eki_getfram:12,eki_init:12,eki_op:12,eki_s:12,eki_set:12,eki_setstring:12,eki_status:12,ekibridg:12,electronics:0,elektr:[0,19,56],elektro:11,elektromagnet:19,elektron:0,elektronikaltgerat:11,elektronikgerat:11,element:[0,4,12,16,19,24,25,26,27,41,48,50],ellips:24,emika:1,emissionsstandard:0,empfang:[12,14,17,42,52,53,54],empfangt:[52,54],empfehl:[18,21,54],empfiehlt:27,empfind:[24,50],empfohl:[0,2,14,16,18,19,24,25,27,50,52,53,54],emva:14,en55011:19,enabled:[41,45,46],encoding:17,end:[0,1,12,27,31,32,34,35,36,37,38,39],end_of_requ:12,endanwend:49,endeffektor:[15,18],endergebnis:2,endet:50,endfor:12,endnutz:11,endpoint:55,endpunkt:[16,24,46,50,57],eng:5,entfern:[18,25,27,45,53,54,56],entfernt:[2,5,14,16,24,50,52,53,56,58],entgeg:49,entgegenzuwirk:50,enthalt:[0,3,4,11,12,14,16,17,18,19,23,24,25,26,27,41,43,44,47,48,49,50,53,54,56,59],entity:[16,24,50],entkoppelt:19,entlang:[1,18,24,48,50],entnahm:11,entnomm:11,entscheid:[27,54],entsorg:[20,58],entsorgt:[11,58],entsorgungsmethod:11,entsorgungsunternehm:58,entsperr:59,entsperrt:41,entsprech:[0,4,5,12,14,16,18,21,24,25,26,32,41,42,48,50,53,54,56],entspricht:[0,14,18,19,24,50,52,53,54,55,56,59],entsteh:[18,49,54],entwed:[4,7,8,15,16,18,21,24,25,26,27,41,42,48,50,52,53],entwickelt:54,entwickl:[44,54],eps:[14,53],erbringt:2,erdschleif:56,erfass:[11,15],erfasst:[2,3,18],erfolg:[19,49,50,54,55],erfolgreich:[2,4,12,16,18,21,23,24,25,26,27,42,43,45,46,48,50,53,54],erfolgt:[48,50],erford:[0,2,24,25,44,45,49,54],erfull:50,erfullt:0,ergeb:24,ergebnis:[2,18,22,27,42,43,44,50,53,54],ergebnispos:[12,50],ergibt:[53,54],ergriff:47,erhalt:[0,13,14,18,21,24,27,50,51,54,58],erheb:[2,11],erhoh:[12,24,25,50,52,56],erhoht:[2,24,52,53,54,56],erkannt:[2,4,16,18,21,24,25,26,50,54,56],erkenn:[2,4,10,18,26,41,48,50,54],erkennbar:[21,27,50,56],erkennt:[16,24,50,54,56],erkennungsgenau:24,erkennungslauf:54,erklart:[1,54],erkund:[42,43,44],erkundet:44,erlaub:54,erlaubt:[2,12,14,21,23,24,25,26,44,45,48,50,55],erlautert:[18,49],erledigt:43,erlischt:58,erlosch:[27,56],ermitteln:14,ermittelt:[2,24,25,52,53],ermog:[2,7,9,28,45,54],ermoglicht:[4,7,9,10,16,18,21,23,25,26,43,44,48,50,54,55,57,59],erneuert:50,erneut:[2,53],erprob:44,erprobt:44,errechnet:[2,5,53],erreich:[2,19,21,24,50,53,55,57],erreichbar:[21,50,55,56],erreicht:[4,5,12,16,18,24,25,26,48,50,52,53,57],error8:14,error:[14,18,24,41,45],ersatzteil:20,erschein:[2,5,52,53],erscheint:[15,50],erschutter:[19,56],ersetz:50,ersetzt:[27,50,52,53],erst:[1,2,12,16,18,21,24,25,27,44,50,52,53,54,57],ersteinricht:19,erstell:[9,24,50],erstellt:[6,13,16,24,27,48,50,57],erwartet:[2,12,18],erweiter:24,erweitert:[4,21],erwerb:0,erworb:[25,27,50,54,58],erzeug:54,erzeugt:24,erziel:[2,18],etc:12,eth0:55,ethernet:[14,15,19,20,21,22,41,50,51,56],ethernetanschluss:19,ethernetkrl:12,ethernetverbind:19,etikett:24,etwa:[5,14],euklid:54,eul:1,eulerwinkel:[1,18],eulerwinkelkonvention:1,europa:[11,49,58],exact_pos:26,exakt:[18,24,26,50,52],exclusiv:41,execut:44,existi:[1,27],existier:[24,25,26,48,50,54],existiert:24,exited:41,exp:[43,52],exp_auto:43,exp_auto_mod:[14,17,24,25,50],exp_control:14,exp_max:43,exp_valu:43,explizit:[16,24,26,48,57],explosiv:19,exposur:[14,17,43],exposure_tim:17,exposureactiv:[14,23],exposurealternateactiv:[14,23,24,25,50,52,53],exposureauto:14,exposureregionheight:14,exposureregionoffsetx:14,exposureregionoffsety:14,exposureregionwidth:14,exposuretim:14,exposuretimeautomax:14,ext:18,extern:[3,7,14,18,23,24,25,26,48,50,52,53,54],external:[24,25,26,48,50,53,54],extrahiert:[24,50],extrins:1,extrudiert:50,fach:24,factor:17,factory:[4,18,23,24,25,50,52,53,54],fahrt:[19,52,56],faktor:56,fall:[2,4,12,14,15,16,17,18,21,23,24,25,26,27,32,34,37,41,48,50,52,53,54,55,56,57,59],fallback:[15,21,41],fallback_booted:[41,45],fallend:52,fallingedg:52,fallt:49,fals:[4,14,17,18,24,25,41,43,45,50,52,53,54],falsch:[2,21,25,53,54,56,58],family:54,fanuc:1,farb:[20,21,52],farbcod:21,farbkamera:14,farbkameras:[14,52],farbkanal:14,farbverlauf:25,farth:50,fatal:[24,41,54],faulty:41,featur:[14,54],fehl:[2,3,4,12,14,16,18,20,23,24,25,26,27,45,48,50,54,59],fehlausricht:2,fehldetektion:[24,50,54],fehlend:[12,25,45],fehlerbeheb:[19,20,54],fehlerbild:[6,13,14,17,24,25],fehlercod:[16,23,24,25,50,54],fehlerhaft:[27,53,54,56],fehlermeld:12,fehlerursach:27,fehlerwert:53,fehlerzustand:56,fehlfunktion:58,fehlgeschlag:12,fehlschlagt:18,fehlschlug:54,fehlt:42,fehlverhalt:47,fehlwurf:11,fein:[5,15,53,56],feld:[4,16,18,21,23,24,26,41,43,50,54],feldmontag:0,fenst:50,fern:56,fernhalt:19,fest:[1,15,18,24,27],festgelegt:[21,24,50,54],festleg:[50,54],festzuleg:24,feucht:19,fil:[16,24,45,50],fill:[12,17,43],filling_level_cell_count:25,filt:[14,19,27],filter:[14,50,59],find:[5,11,24,50,53],findet:21,firefox:[21,59],firmwar:[16,20,21,26,40,41,42,45,47,48,50,59],firmwareinfo:[41,45],fixi:18,fixiert:50,flach:[24,50],flag:[4,12,50],flang:16,flange_radius:16,flank:52,flansch:[16,18],flanschkoordinatensyst:16,flanschmontiert:18,flanschradius:4,flexibl:24,fliesskomma:14,float32:41,float64:[4,12,16,18,24,25,26,41,42,43,48,50,52,53,54],floatwert:32,flussdiagramm:21,flussig:19,focal:[17,43,52],focal_length:17,focallengthfactor:14,folg:[2,54],folgend:[0,1,3,4,5,6,11,12,14,16,18,19,21,22,23,24,25,26,27,32,40,41,42,43,44,45,48,49,50,51,52,53,54,56,59],folgendermass:[12,43],folger:53,folgt:[4,12,14,16,18,23,24,25,26,31,32,34,35,36,37,38,39,43,48,50,52,53,54],forbidd:[24,42,43,45,50],fordert:[15,55],foreground:55,forget_after_n_detection:54,form:[16,19,24,27,45,50],format:[12,15,17,18,20,41,42,44,45,54],formatiert:42,formel:54,formeln:[53,54],formulardat:[42,45],formularparamet:[16,24,45,50],fortlauf:50,fotos:49,found:[16,24,42,43,45,50],fps:[14,15,23,43,53],frac:[1,14,31,32,34,35,36,37,38,39,53,54],fraction:17,fragment:12,fram:[12,14,43],framerat:19,framework:14,franka:1,freedom:15,frei:[19,25,50],freien:25,freies:0,freigeschaltet:[4,16,25],freiheitsgrad:[15,18],frequenz:[2,52],from:[17,45],fruh:27,fruitcor:1,fuhr:[2,14,18,19,49,50,52,53,56,58],fuhrt:[2,3,14,27,50,52,53,54,58],full:[2,14,17,19,43,56],fullstand:[10,25],fullstandsrast:25,fullung:2,fullwert:53,funf:[14,19,21,27,56,57],fungiert:15,funktion:[4,14,18,27,32,37,40,43,44,52],funktionalitat:[19,21,23,24,25,28,50],funktioni:56,funktioniert:[17,54,56,59],funktionstucht:44,fur:[0,2,3,4,5,7,9,10,11,12,13,14,15,16,17,18,20,21,23,25,26,27,28,29,36,37,40,41,42,43,44,45,47,48,49,50,51,52,53,55,56,57,59],gain:[14,17,43,52,56],gainselector:14,gamma:1,gammafaktor:52,gammawert:52,ganz:52,ganzheit:40,ganzlich:53,ganzzahl:[50,53],ganzzahlwert:14,gar:50,garanti:[19,20,27,49,56],garantierecht:58,garantiert:[24,25,26,50,54],gas:19,gateway:[21,41],gbps:0,gc_config:21,geachtet:[50,54],geandert:[12,14,17,18,21,24,41,47,52],gearbeitet:[18,54],geb:[2,11,12,47,49,53,59],gebaudenetz:[0,19],gebracht:53,gebrauch:[2,24],gebrauchsfert:24,gebund:[21,57],gedacht:[19,23,56,59],gedreht:[1,18,19,34,50],gedruckt:[50,54],geeignet:[0,19,24,27,49,52,56],geerdet:[0,49,56,58],gefolgt:54,gefordert:50,geforscht:27,gefrast:50,gefuhrt:18,gefullt:[2,14,18,24,53],gefund:[16,18,21,24,25,42,43,45,50,53],geg:[50,59],gegeb:[0,14,18,23,24,31,32,37,39,50],gegensatz:15,gegenub:17,gegriff:50,geh:[2,27],gehalt:[2,19,24,52],gehaus:[0,19,27,49,56],gehauseflach:19,gehausetemperatur:[19,56],gehor:[12,23,50,57],gehort:[43,50],geht:49,gekauft:[53,54],gekennzeichnet:[25,47,56],geklickt:[44,50],geklont:57,gekurzt:[12,50],gelad:[18,27,41],gelangt:[2,18],gelass:[2,27,54],gelb:[11,24,50,56],geleert:12,geleg:50,gelegt:52,geles:[4,12,14,16,21,49,50],geliefert:14,gelingt:18,geloscht:[18,24,50,54],gelt:[4,54,56],gemacht:[21,58],gemass:[0,2,19,41,50,56,58],gemeinsam:[14,24,50],gemeldet:[18,24,41,43,56],gemess:[6,18,25,26,50,52,53,54],gemittelt:53,genannt:[5,43,54],genau:[1,2,5,6,15,16,17,18,23,24,41,50,52,53,55],genehmigt:58,geneigt:[25,26,50],gener:[12,14,15,51],generator:54,generi:[50,54],generic:14,generiert:[12,24,50],generierungsservic:50,genicam:[3,13,15,17,20,22,23,28,40,43,52,53,55],genomm:19,genormt:19,genug:[2,15,18,19,24,50,53,56],genutzt:[4,5,14,16,17,21,23,24,25,26,41,42,48,50,52,53,54],geoffnet:[27,56,58],geometr:[16,24],geometri:[16,26,48],geplant:16,gepruft:[4,16,50],gerad:[0,24],gerat:[0,1,2,4,11,14,15,18,19,20,27,30,33,41,42,44,45,47,49,51,56,57,58,59],gerateeintrag:[21,56],geratefront:[21,56],geratenam:27,geratestart:21,gerichtet:[2,16,50],gering:[2,14,50,52,53,54,56],geringfug:54,gesamt:[2,4,21,25,50,52,53,54],gesamtanzahl:53,gesamtfullstand:25,gesamtmodulanzahl:54,gesamtspeicherlimit:12,gesamtwert:53,gesandt:[42,49],geschaft:0,geschaltet:[24,25,50],geschatzt:[50,54],gescheh:[2,16],geschichtet:24,geschickt:[14,17],geschieht:[23,24,50,52,54],geschirmt:0,geschloss:[27,50],geschrieb:[4,12,16,50],geschutzt:47,geschwind:6,geseh:54,gesendet:[12,52],gesetz:[11,49],gesetzt:[4,12,14,16,17,18,19,23,24,25,26,27,41,43,45,48,50,52,53,54,58,59],gesichert:[27,49,56],gesondert:[12,24,25,53,54],gespart:50,gespeichert:[2,4,12,16,18,21,24,25,26,27,48,50,54],gesperrt:[14,42,43,59],gespiegelt:2,gesplittet:24,gestalt:58,gestaltet:[24,42,50],gestapelt:[10,14,50],gestartet:[2,17,18,21,24,27,50,54,55,56],gestellt:[14,16,24,27,43,50,53],gesteuert:[50,52],gestoppt:54,gestreamt:59,gesucht:[24,25,26,48,50],gesund:41,get:[16,24,27,41,42,43,44,45,46,50],get_base_plane_calibration:12,get_calibration:[12,43],get_calibration_pos:12,get_grasps:12,get_gripp:[12,43],get_grippers_schmalz_vac:12,get_grippers_schunk:12,get_io_valu:12,get_load_carri:[12,43],get_pos:12,get_preferred_orientation:12,get_region_of_interest_2d:25,get_regions_of_inter:[12,43],get_regions_of_interest_2d:[12,43],get_sorting_strategi:12,get_symmetric_grasps:12,geteilt:14,getestet:[4,16,18,24,25,26,48,50,54],getrennt:[11,54],gev:45,gevieee1588:55,gewahlt:[4,14,16,18,21,24,25,26,42,48,50,52,54],gewahrleist:[47,49,58],gewandelt:12,gewartet:[24,25,50,53,54],gewicht:[14,19],gewichtswert:[24,50],gewind:19,gewindesicher:19,gewinkelt:0,gewiss:[19,21,24,40,47,50,53],gewohn:26,gewohnt:59,gewonn:[5,38],geword:2,gewunscht:[14,18,24,25,27,41,48,50,53,59],gezeigt:[2,19,26,44,52,54],gezog:[50,52],ggf:[27,50,56,58],gibt:[1,4,12,14,15,16,17,18,21,23,24,25,26,27,32,37,42,48,50,52,53,54,55,56],gig:[3,15,17,20,21,22,23,28,42,43,45,49,51,52,53,55,59],gigabit:[14,15,21],gigevision:[14,15],gilt:[2,18,44,49,54,58],git:57,github:[12,17,21],gitterbox:26,gitterlayout:24,gittermust:24,glaslins:27,glatt:[5,14,56],glattung:[14,50],gleich:[5,12,14,18,24,27,36,38,48,50,52,53,54,56,59],gleichlaut:14,gleichspannungsquell:19,gleichstromquell:[49,56],gleichung:[14,53],gleichverteilt:50,gleichzeit:[2,4,16,24,50,56],glied:42,global:[5,9,14,15,21,26,28,42,43,48,53],glossar:20,gmbh:[0,8,47],googl:[17,21,59],gpio:[0,14,17,19,23,24,25,50,52,53],gpios:[17,19,23],gpu:[19,53,57],grad:[1,12,31,32,34,35,36,39,50,52],grafana:46,grafisch:[22,53],grasp:[4,24,50],grasp_computation_tim:24,grasp_id:50,grasp_uuid:[24,50],grasps:[4,24,50],grau:[5,24],gravitationsmess:25,gravitationsricht:[24,25],gravity:24,greif:[4,7,9,24,27,28,42,45,50,59],greifend:[24,48],greiferanimation:[24,50],greiferelement:[4,41],greifererstell:16,greifergeometri:[16,50],greifermodell:4,greifflach:24,greifpos:[12,24,50],greifposition:4,greifpunkt:[4,12,25,26],greifpunktberechn:[24,26,28,50],greifpunktprioritat:50,greifsystem:[10,24],greift:[15,21,42],grenzwert:54,grid:43,grid_height:43,grid_width:43,griff:[4,16,19,24,50],gripp:[16,27,43,45],gripper_element:[16,41],gripper_id:[4,16,24,50],gripperdb:[4,9,24,50],gripperelement:[16,41],grob:54,gross:[2,5,13,14,16,25,27,41,50,52,53,56],grossenumrechn:12,grosst:[24,53],grpc:[20,22,57],grpc_image_client_exampl:17,grun:[2,14,18,19,21,27,50,56],grund:[2,23,50,54],grundlag:[2,18,51,53],grundsatz:2,gui:[2,4,7,14,18,19,20,21,22,23,24,25,26,27,40,43,48,52,53,54,55,56,57],guilabel:50,gultig:[4,11,16,18,24,25,27,41,45,47,50,53,59],gultigkeitsbereich:21,gut:[2,18,50,56],gvcp:14,gvsp:14,haftet:[47,49],hak:2,hakch:[2,18,21],halb:[23,50,53,54],halt:2,halter:[19,49],hamming:54,hand:[2,7,12,19,27,40,41,43,53],hand_eye_calibration:[41,45],handbuch:[13,19,47,49],handeln:[18,53],handelt:[14,15],handgefuhrt:19,handhab:51,handheld:18,handl:58,hang:[14,42],hangt:[2,14,18,41,43,52],hard:58,hardwar:[15,20,58],hardwaretriggermodi:52,hartnack:27,hash:45,hatt:4,haufig:[1,2,18,53],haupttaktgeb:41,hausmull:[11,58],haxx:42,hdr:14,head:[16,24,42,43,45,46,50],health:[41,57],healthy:41,height:[14,16,17,43,48,52,53],height_open_sid:[24,25,26,50],heightmax:14,heiss:[19,43],heisst:[21,54],hell:[14,50,52,56],hellblau:50,hellig:14,hello_rc_visard_ng:46,her:[4,23,24,25,50,52,53,54],heraus:26,herausfilt:[24,54],herausgefiltert:[4,54],herausrag:[25,26],herauszufilt:53,hergestellt:18,herstell:[11,18,26,47,56],hertz:[43,52],herum:[2,25,50],heruntergelad:[8,17,19,21,27,54],herunterlad:27,herunterskali:54,herunterskaliert:53,herunterzulad:27,hervorgehob:[2,18],hierbei:[18,23,50],hierfur:[1,2,5,18,27,48,50],hierin:49,hiermit:18,hiervon:[19,49],hierzu:[11,15,43],high:[12,14,17,19,23,50,52,53,54],hilf:27,hilfreich:27,hilft:[53,54],hinaus:[13,24,25,43,50,55],hinein:50,hineinragt:26,hingeg:14,hingewies:11,hinsicht:18,hint:[4,24,25,50,53,54],hintergrund:[2,25],hinterlegt:[18,19,27,42],hinweg:[16,17,26,48,50,54],hinweis:[21,24,27,47,50,56],hinzufug:50,hinzugefugt:[4,16,24,25,26,48,50,59],hinzuweis:54,hoch:[14,16,19,24,41,53,56],hochf:19,hochgefahr:[41,57],hochgelad:[16,27,50],hochgeschwindigkeitsvideo:51,hochlad:[27,50],hochmodern:15,hochrein:27,hochst:[25,50,53],hochstmog:50,hochstwert:41,hochwert:2,hochzulad:16,hoh:[2,14,15,16,19,24,26,27,42,48,50,52,53,54,56],hohendat:2,hol:17,homepag:[8,14,19,27,53],horizontal:[14,17,19],horst:1,hort:12,host:[4,15,16,18,23,24,25,26,41,42,43,44,48,50,52,53,54,56,57,59],host_port:[41,46],hostgerat:57,hostnam:[41,45],hostpfad:57,hostport:41,html:54,http:[0,4,8,14,15,16,18,19,21,23,24,25,26,27,40,42,43,44,45,46,48,50,52,53,54,57,59],https:[12,15,17,21,27,42,54,57],hundert:14,hutschi:0,ideal:5,ident:[1,54],identifi:[15,24],identifikation:54,identifikator:54,identifizi:[15,24,54],identifiziert:[12,21,24,54],idl:[24,41,43,54],ids:[12,16,25,50,54],ieee1588:55,ieee:[14,41],ignoriert:[14,18,25,27,50,53,54],illustration:25,imag:[17,27,41,42,45],image_version:[41,45],imageinfo:41,imageinterfac:17,imageset:17,imagesetrequ:17,imm:[0,1,4,12,14,16,18,19,21,23,24,25,26,42,48,50,52,53,54,58],implementi:54,implizit:[14,53],imu:59,in1:[14,52],in2:[14,52],inactive_imag:[41,45],inaktiv:[24,27,41,45,54],inaktivitat:59,inbetriebnahm:[24,49,50],inch:1,inclusiv:41,increment:17,ind:[5,12,16,17,18,21,24,26,27,44,48,50,52,53,54],index:14,indirekt:53,individuell:[4,12,23],indiz:32,industriebereich:0,industriell:[0,14,19],info:[8,41,45,59],information:[4,5,12,14,15,16,17,19,20,21,23,24,25,26,27,41,42,43,45,46,47,48,50,54,57,58,59],informiert:27,inhab:47,inhalt:[25,41,45,47],init:41,initialisiert:12,initializing:41,inklusiv:12,inn:[5,26,54],innenmass:[25,26],innenraum:26,innenvolum:26,inner_dimension:[4,24,25,26,50],innerhalb:[2,4,15,16,21,24,25,26,50,53,54,57],input:17,input_mask:23,insbesond:[15,19,24,25,26,44,48,53,57],insgesamt:27,inspektion:49,installation:[0,19,20,49],installationspaket:21,installi:[0,56],installiert:[21,27,41,45,49],instanc:50,instance_id:[12,54],instance_uuid:50,instand:58,instanz:[12,50,56],instruktion:12,int16:[4,16,18,23,24,25,26,41,48,50,52,53,54],int32:[17,18,23,24,25,41,43,50,52,53,54],int64:41,int8:[41,50],integ:[4,14,16,23,24,25,26,41,45,48,50,54],integriert:[13,18,24,50],intensitatsbild:23,intensity:14,intensitycombined:14,inter:[9,24,25,27,28,42,45,53,59],interaktiv:50,interess:29,interfac:[12,14,20,22,59],interfacestandard:51,interferenz:58,intern:[2,3,12,18,23,24,25,45,49,52,53,54],internal:45,internet:[15,21,55],interpolation:[53,54],interpoliert:53,interpreti:17,interpretiert:[12,50],interprozesskommunikation:17,intervall:53,intrins:[1,2],intuitiv:[13,24,50],invalid:17,invalid_data_valu:17,invalidi:54,iocontrol:[7,14,19,52,53],ip_address:[41,45],is_bigendian:17,iso:19,isoliert:53,isopropanol:27,item:[12,24],item_model:24,item_uuid:24,itempick:[4,10,16,23,25,26,48],javascript:[12,42],jed:[1,2,4,5,12,14,15,16,18,19,21,23,24,25,26,28,40,42,43,48,49,50,52,53,54,57,58,59],jedermann:13,jederzeit:[18,21,47],jedoch:[0,2,5,14,18,19,21,24,27,47,50,52,53,54,56],jeglich:54,jeweil:[4,12,14,16,18,23,24,25,26,27,41,42,43,48,50,52,53,54,59],json:[12,16,24,27,41,42,43,44,45,46,50,59],jumbo:14,kabel:[0,19,49,56,58],kabelanbiet:19,kabelbeweg:[18,19],kabellang:0,kabellos:0,kabelmanagement:19,kabeln:[0,58],kaflerstrass:[8,47],kalibri:[5,7,22,50,53,59],kalibrier:[5,7,12,13,19,27,28,40,41,43,49,53,56],kalibrierdat:18,kalibrierergebnis:18,kalibrierfehl:[2,18],kalibriergenau:2,kalibriermethod:50,kalibriermodul:18,kalibriermust:[2,18],kalibrierparamet:18,kalibrierpos:18,kalibrierposition:18,kalibrierprozess:[18,52],kalibrierpunkt:2,kalibrierqualitat:18,kalibriert:[2,5,18,24,25,26,27,48,50,54],kalibriertransformation:18,kalibrierungsuberpruf:2,kalibrierungsversatz:2,kalibrierverfahr:2,kalibriervorgang:18,kamera:[2,5,6,7,12,14,17,18,19,20,24,25,26,27,28,42,43,48,50,53,54,56,59],kamerabezog:[14,22],kamerabild:[2,5,6,13,14,17,18,20,23,25,48,49,50,52,53,54],kamerablickricht:2,kameraeinstell:18,kamerakalibrier:[5,7,20,52,56],kamerakalibrierungsmodul:2,kamerakoordinatensyst:[18,19,50,53,54],kamerakoordinatensystem:[18,19],kameralins:[19,20,56],kameramatrix:59,kameramodell:53,kameramodul:[2,52],kameramontag:[24,25,26,48,50,54],kamerapaar:5,kameraparamet:[2,59],kamerapipelin:[42,50],kamerapos:50,kameras:[2,5,14,15,18,24,27,50,51,52,56,59],kameraschnittstell:14,kamerasensor:52,kamerasymbol:59,kameravariant:56,kannnur:25,kant:[50,54],kantendetektion:23,kantenerkenn:50,kapitel:[1,17,24],kardanwinkel:1,kardanwinkelkonvention:1,kauf:[10,58],kawasaki:1,kenntnis:57,kind:16,kist:[24,50],kit:15,klamm:[4,18,24,25,50,53],klass:[0,19],klassifiziert:0,klein:[2,4,5,12,16,18,24,25,26,48,50,52,53,54],kleinstmog:53,klick:[2,18,27,44,50,57,59],knopf:53,kodier:0,kodiert:19,kollidier:[24,50],kollision:[4,7,16,24,50],kollisionserkenn:[24,50],kollisionsfrei:[4,16,24,50],kollisionsgeometri:[4,16],kollisionsmodell:50,kollisionspruf:[9,16,24,26],kombination:[4,16,24,50,52,53,54,56],kombiniert:[6,14,24,32,50,53],komm:[4,54],komma:57,kommando:[12,14],kommandozeilenprogramm:[21,42],kommerziell:0,kommission:11,kommt:[2,54],kommunikation:[12,15,17,21],kompatibel:[13,14,21],kompatibilitatsgrund:18,kompatibl:27,komplett:[2,18,50],komplex:[44,50,58],komponent:[14,19,25],komprimi:56,kompromiss:[5,52],kondensier:19,konfidenz:[6,13,14,17,24,25,56],konfidenzbild:[3,14,20,53,59],konfidenzwert:[14,53],konfiguration:[2,4,13,14,15,16,18,20,22,23,24,27,28,41,42,45,48,50,56,59],konfigurationsander:[24,25,50],konfigurationsmethod:21,konfigurationsmodul:[20,28,43,59],konfigurationsprogramm:21,konfigurationszweck:[19,21],konfiguri:[7,9,12,14,15,22,28,59],konfigurierbar:[3,25,28],konfiguriert:[4,12,14,15,16,18,21,23,24,26,27,50,54,55,59],konflikt:21,konform:14,konformitatserklar:51,konkret:54,konn:[0,1,2,4,5,6,8,10,11,12,13,14,16,17,18,19,21,23,24,25,26,27,28,42,44,46,47,48,50,52,53,54,55,56,57,59],konnektivitat:[0,19,20],konnt:[2,4,15,16,18,24,25,26,27,41,42,43,48,49,50,56],konsistent:24,konstant:52,kontakt:[19,20,21,27],kontakti:[11,21,27,29],kontaktiert:27,kontext:42,kontinui:[14,17,50,52,53],kontrast:25,kontroll:[7,19,52,53],kontrolli:[14,54],kontrolliert:[19,23,50,53],kontrollkastch:50,kontur:50,konvektiv:[19,56],konvention:1,konvertier:[12,30,33],konvertiert:[12,16],konzipiert:19,koordinat:[12,14,16,18,25,53],koordinatenachs:1,koordinatensyst:[4,14,16,18,19,24,25,26,48,50,53,54],koordinatensystem:[1,18,20,25,26,50,53,54],koordinatenurspr:19,kopfleist:59,korperverletz:58,korrekt:[2,11,18,19,50,52,56,58],korrektur:2,korrigi:55,korrigiert:2,korrosiv:19,kost:2,kostenlos:21,kraft:[2,19],kratz:27,krc:12,kreisend:27,kreuz:2,krl:[20,22,50],kss:22,kugel:48,kugelform:48,kuhlripp:[19,56],kuhlung:[19,56],kuka:[1,15,20,22,36,50],kund:[0,19],kundensupport:47,kunstlich:53,kunststoffgehaus:0,kupplung:19,kurz:[2,12,14,15,21,52,53,56],kurzanleit:19,kurzbeschreib:41,label:[41,57],lad:27,lag:[2,19,24,25,26,48,50],lager:19,land:11,lang:[0,1,12,19,24,29,38,49,54,56],langenein:1,larg:[16,24,50],lasergeschnitt:50,lass:[2,6,8,14,15,18,21,27,42,43,44,50,52,53,56,59],lasst:[2,13,14,15,18,19,21,24,27,41,43,44,52,53,59],last_collision_free_grasps:4,last_evaluated_grasps:4,last_timestamp_processed:[24,25,50,54],lat:43,latency:53,latenz:53,lateral:[19,54],lauf:[14,21,24,54,59],laufend:[24,25,26,41,43,45,46,48,50,52,57,59],lauft:[2,4,16,23,24,25,27,50,52,54],laufzeit:[4,5,15,24,42,43,44,50,53],laufzeitparamet:[12,15,16,26,40,41,43],laufzeitstatist:[41,43,45],laufzeitverhalt:43,laufzeitzustand:42,lautet:[12,18,21,24],lay:24,lebensdau:27,lebenszyklus:49,led:[19,20,21,27],ledig:[2,15,18,19,21,27],leer:[12,18,24,26,50,54,56],left:[1,14,17,32,37,38],left_enabled:17,leg:50,legt:24,leicht:[2,18,22,27,44,52,53,54],leid:1,leist:50,leistung:[2,14,27,56],leistungsaufnahm:19,leistungsschutzrecht:47,leistungsverhalt:[24,25,50],leitet:44,leitungs:0,length:[17,42],les:[12,23,47],letzt:[1,12,18,24,25,27,45,50,52,54],letztgenannt:[14,53,54],leuchtet:[21,27,56],level:[41,45],level_free_in_met:25,level_in_percent:25,licens:[27,41,45],licensecomponent:41,licensecomponentconstraint:41,licenseconstraint:41,licenseinfo:[41,45],licht:[5,52],lichtbeding:[52,53],lichtintensitat:56,lichtquell:[23,52,56],lichttisch:50,lichtverhaltnis:2,lief:[4,5,24,25,26,48,50],liefert:[12,24,25],lieferumfang:[0,18,20],lieg:[2,5,21,24,50,53,56],liegend:[5,6,14,19,50,56],liegt:[2,4,16,19,24,25,26,48,49,52,53,54,56],limit:[12,17,45,50],limited:17,limiti:52,limitier:12,limitiert:[53,54],linear:[4,52],lineselector:[14,23],linesourc:[14,23],linestatus:14,lini:[2,24,25],liniendetektion:24,liniendetektor:24,liniensegment:24,link:[2,5,14,15,17,18,19,21,25,44,48,50,52,53,54,59],link_speed:[41,45],linklocal:41,lins:[27,56],linsenburst:27,linux:[15,21,55,59],list:[4,12,14,16,21,24,25,41,43,45,50,54,57],listenelement:12,listening:41,listet:[4,16,24,25,26,48,50,54,57],liv:[52,53,59],livebild:[22,52],lizenz:[4,10,12,14,16,19,21,23,24,25,27,40,41,42,43,45,50,53,54],lizenzdatei:[21,45,59],lizenzier:21,lizenzstatus:41,lizenzupdat:29,load:[4,9,10,12,16,24,27,28,42,45,48,50,59],load_carri:[4,24,25,26,27,45,50],load_carrier1:12,load_carrier2:12,load_carrier_:25,load_carrier_compartment:[24,26],load_carrier_detection_tim:[24,25,50],load_carrier_id:[12,24,25,26,50],loadcarri:[10,26,48],loadcarrierdb:[9,12,25],local:[15,21,59],locator:15,loch:[14,19,53],lock:[41,45],loctit:19,log:[27,41,42,54,55,59],logdatei:[2,20,41,42,45,54],logeintrag:[27,41],logentry:41,loginfo:[41,45],logisch:19,lognachricht:41,logo:54,logstuf:41,lokal:[15,21,27,49],lokalisiert:15,losch:[9,11,16,18,24,42,50],loschend:[16,26,48],loscht:[4,16,18,24,25,26,48,50],lost:[4,12,24,25,54,59],low:[12,14,17,19,23,50,52,53,54],luft:56,luftaustausch:19,luftstrom:19,m12:[0,19,21],m12fr:0,m12fs:0,mac:[15,21,41,45],mach:56,machin:14,macht:13,macos:[15,59],mag:2,mail:8,mal:[15,24,57],manch:21,manipuli:54,manipuliert:49,manual:[14,43,50],manual_dns_serv:[41,45],manualdnsserv:[41,45],manuell:[2,14,15,18,27,41,45,54,56,59],many:42,mark:[17,54],marki:[24,50],markiert:[4,12,14,24,50,53],maschin:[40,49],maschinenschraub:19,maschinensich:49,mask:21,mass:[18,19,42,56],massein:13,massenschwerpunkt:19,massnahm:47,mast:55,master_ip:[41,45],masteronly:55,match:12,matching:[3,5,14,15,23,40,41,43,52,54,56],material:26,materialeigenschaft:19,mathbf:18,mathrm:[14,19],matrix:[17,32],matrixcod:54,maus:50,max:[4,12,16,18,19,23,24,25,26,32,37,41,42,43,48,50,52,53,54],max_corner_distanc:54,max_deformation_m:24,max_dimension:24,max_point:17,max_suction_surface_length:24,max_suction_surface_width:24,max_version:41,max_x_deg:50,max_z:53,maxdepth:[12,42,43],maxdeptherr:[12,43],maximal:[2,4,12,14,16,19,23,25,26,48,56],maximalwert:43,maximum:[17,19,24,25,43,53],mdns:[15,59],mean:[17,24,25],mean_z:53,measur:32,measure_depth:12,mechan:[2,18,20,27,56],mechanismus:[14,21,56,59],media:[15,21],medium:[14,19,50,53,54],medizinprodukterichtlini:49,mehr:[4,5,7,9,12,14,16,17,18,19,24,25,26,27,42,43,46,48,50,52,53,54,55,56],mehrdeut:[24,26,53,54],mehrmal:[54,56],mehrstuf:18,meist:[1,2,40,43,54],meld:[43,54],meldet:[25,50,52,53],memory:12,mend:[27,45],meng:[24,54],menschlich:52,menu:[57,59],menueintrag:57,menupunkt:[18,25,48],mesh:[17,59],mesh_enabled:17,mesh_option:17,meshoption:17,mess:13,messag:[4,12,16,17,18,23,24,25,26,41,43,45,48,50,52,53,54],messinstrument:[2,3],messprinzipi:20,messung:[14,18,23,53,59],messunsich:24,met:[0,1,4,12,13,14,17,18,19,24,25,33,49,50,52,53,54],metallgehaus:0,method:[17,21,29,41,50],metrisch:13,microsoft:59,mikrofas:27,mikrosekund:14,millimet:[1,12,13,31,32,34,35,38,39],min:[4,12,18,23,24,25,26,41,42,43,50,52,53,54],min_depth:17,min_dimension:24,min_version:41,min_x_deg:50,min_z:53,minconf:[12,42,43],mindepth:[12,42,43],mindest:[4,12,14,16,18,19,25,27,50,54,55],mindestanzahl:53,mindestfehl:2,mindestgross:53,mindestkonfidenz:53,mindestwert:41,minilin:0,minimal:[2,4,14,19,26,41,43,50,56],minimum:[17,19,25,42],minut:[21,27,55,57],minutu:59,miteinand:[5,16],mitgeliefert:14,mitgeschickt:14,mitgliedsstaat:11,mithilf:[4,5,14,16,19,24,25,26,27,42,44,45,48,50,52,53,54],mitsamt:18,mitsubishi:1,mitt:[25,52,53,54],mittel:[14,21,27,50,53,54],mittelf:19,mitteln:[14,53],mittelpunkt:[16,24,25],mittelwert:25,mittl:[2,19,41,52,53],ml60:0,mobil:49,mod:[14,23],modell:[12,18,19,24,25,26,50],modellart:21,modellierungsanwend:53,modellparamet:52,modi:[24,52,53],modifikation:58,modifizi:58,modifiziert:42,modul:[2,5,10,12,14,15,19,20,27,28,40,41,42,44,59],moduleinstell:45,modulgross:54,modulnam:[12,43,54],modulparamet:[18,42],modulspezif:[43,45],modus:[2,14,53],moglich:[1,2,4,7,11,13,14,16,18,21,23,25,26,27,41,45,48,50,52,55,56,59],moglicherweis:[2,4,12,14,18,21,24,25,42,50,53],mono16:17,mono8:[14,17],monochrom:[14,19,52],montag:[18,19,27],montageart:18,montageoption:18,montagepunkt:[18,19],montageschnittstell:19,montiert:[16,18,19,24,48,49,50,53,56],mozilla:21,mtu:14,mulltonn:11,multicast:[15,59],multipart:[14,16,24,45,50],multiplikation:1,multiplizi:14,multipliziert:[14,52,53],munch:[8,47],murr:0,musst:[24,25,50,54],must:[2,5,14,18,23,44,50,53,54,56],musteranfrag:[16,24,43,45,46,50],musterantwort:[16,24,42,50],musterbreit:2,mustereck:2,musterhoh:2,musterobjekt:41,musterpos:2,musterprojektor:[7,17,23,24,25,50,53,56],nachbearbeit:53,nachd:[2,18,27,57,59],nachgeschlag:26,nachgewies:58,nachricht:[4,12,16,17,23,24,25,50,54,55],nachteil:[17,23,54],nah:[2,5,14,15,18,19,21,50,53,54,56,58,59],nahaufnahm:18,nam:[4,12,14,15,16,18,23,24,25,26,41,42,43,44,45,46,48,50,52,53,54,59],naming:14,nano:19,nanosecond:17,national:49,natur:54,naturschutz:11,navigation:42,navigi:57,nbc:0,neb:[14,18,40,54],negativ:[4,12,16,18,23,24,25,26,32,37,48,50,54],nehm:27,network:[15,21,41,45,55],networkinfo:[41,45],networksetting:[41,45],netzteil:[19,56],netzteilkabel:0,netzwerk:[12,15,17,21,41,45,49,51,52,55,56,57],netzwerkadministrator:21,netzwerkadress:15,netzwerkarchitektur:27,netzwerkeinstell:[21,45],netzwerkgerat:[15,21],netzwerkkabel:[0,19,21,56],netzwerkkonfiguration:[20,27,42,55,56],netzwerkkonnektivitat:56,netzwerkmanag:[15,21],netzwerkport:55,netzwerkprotokoll:15,netzwerktechnologi:15,netzwerkumgeb:59,netzwerkverbind:[15,18,56],netzwerkzugriff:20,neu:[2,4,5,12,16,18,21,24,25,26,27,45,48,50,53,54,56],neukalibrier:[2,56],neustart:[2,20,41,45,50],next_boot_imag:[41,45],nichtsdestotrotz:2,niederspann:49,niedrig:[2,24,25,26,50,53,54,56],niemal:54,nimmt:[18,52,56],no_pos:26,nod:[4,12,15,16,18,23,24,25,26,27,28,40,41,42,43,44,48,50,52,53,54],node_nam:12,nodeinfo:[41,43],nodestatus:[41,43],nois:17,nordostpark:11,norm:20,normal:[2,14,27,50,52,54,56],normalenvektor:50,normalerweis:[15,32],normalisiert:[50,52],not:[16,24,42,43,45,50],notation:[12,42],notig:[2,4,16,18,19,24,27,50,53,54,55],notwend:[2,12,17,24,25,26,30,33,48,50,54],notwendigerweis:16,nsec:[12,17,23,24,25,50,53,54],ntp:[15,41,45],ntp_status:[41,45],ntpstatus:41,num_instanc:12,numb:[17,21],numm:[18,25,42,44],nurnberg:11,nutz:[4,7,12,18,21,24,25,26,27,28,29,32,35,40,42,44,48,50,52,54,57,59],nutzlich:[14,15,21,26],nutzt:[3,12,13,14,15,23,24,29,50,52,53,55,56,59],nutzung:[23,24],o_r:34,oat:1,oben:[15,19,43,50,53],ober:[48,53,54],oberflach:[5,18,19,24,50,52,54],oberflacheneb:50,oberflachenstruktur:[5,53],oberhalb:[26,50],obig:54,obj:16,object:[12,41,42,43,45],object_height:50,object_id:50,object_plane_detection:50,object_to_detect:50,objekt:[4,5,10,12,14,16,25,26,41,43,45,48,53,56],objektdetail:50,objektdetektion:50,objektebenenerkenn:50,objektentfern:14,objekterkenn:[13,28,52],objekterkennungslos:10,objektgeometri:24,objekthoh:50,objektinstanz:50,objektiv:19,objektivverzeichn:2,objektkant:50,objektkoordinat:14,objektkoordinatensyst:50,objektkoordination:14,objektmodell:24,objektmodelltyp:24,objektoberflach:[24,50],objektpunkt:[5,50,52,53],objektrand:[15,53],objekttemplat:42,objektursprung:50,obliegt:19,obligator:[4,16,24,25,43,45,50,54],obwohl:56,octet:[16,24,50],odometri:52,off:[0,4,14,26,41,45,50,59],offensicht:54,offent:57,offiziell:17,offlin:48,offlinetool:54,offn:[27,56,58],offnet:[21,27,44],offset:[2,4,14,17,24,41,45,50,59],offset_dev:[41,45],offset_mean:[41,45],offset_x:[48,53],offset_y:[48,53],oftmal:25,ohn:[2,5,14,15,19,21,23,24,25,27,47,49,50,52,53,54,59],onlin:54,only:17,only_highest_priority_grasp:50,onlyhigh:14,onlylow:14,opc:20,open:21,opencontain:41,operation:12,operator:[32,37],optimal:[50,52,53],optimi:[24,25,47,50],option:[15,16,21,50,53],optional:[0,4,10,12,13,16,21,23,24,25,26,29,41,43,45,48,50,53,54],optisch:[18,52],optokoppl:19,ordent:56,ordnungsgemass:[11,21,49],org:[14,15,41],orientation:[4,12,16,18,24,25,26,43,48,50,53,54],orientation_prior:[25,26],orientier:[1,6,12,15,24,25,26,27,30,31,34,38,39,45],orientiert:54,orientierungsprior:[25,26],orientierungswert:18,origin:50,orin:19,ort:18,orthogonal:[18,24],ortlich:11,our:17,out1:[14,17,52,53],out1_mod:[14,17,53],out1_reduction:[17,52],out1high:[14,52],out2:14,out2_mod:14,out:[24,25,50],outer_dimension:[4,24,25,26,50],output:17,output_mask:23,over:[17,19],overall:53,overall_filling_level:25,overexposed:18,overfilled:[24,25,50],p_r:31,p_x:[14,53],p_y:[14,53],p_z:[14,53],paar:54,paarweis:23,packedgridlayout:24,packedlay:24,paket:12,palettier:18,parallel:[24,50,52,54],param:[41,43],paramet:[15,16,17,21,26,27,40,41,42,44,45,55,56,59],parameter_x:12,parameter_y:12,parameterander:14,parameterdatei:59,parameternam:[24,25,41,50],parameternamevalu:[41,43],parametervalu:[41,43],parameterwert:[41,42,43,50],parametrisiert:16,params_override_activ:52,parent:16,parent_id:16,parsing:12,part:14,partition:[21,27,45],pass:[12,14,24,50],passend:[24,50],passi:[32,37],passiv:[5,19,41],passt:[14,50],passwort:[45,59],patch:24,paused:41,pausiert:55,pegel:19,per:[8,21,22,23,43,52],period:55,permanent:23,persistent:[4,16,18,21,26,41,48,50],persistent_default_gateway:[41,45],persistent_ip_address:[41,45],persistent_ip_enabled:[41,45],persistent_subnet_mask:[41,45],persistentip:41,person:49,personenbezog:11,perspektiv:18,perzeptionslos:24,petrolfarb:50,pfad:[12,42,57],pfeil:[2,54],pg9:0,phas:56,phoenix:0,pick:[10,13,24],picking:[24,50],pin:[19,56],pipelin:[4,18,23,24,25,41,42,43,44,45,50,52,53,54],pipeline_status:59,pitch:50,pixel:[2,14,17,19,25,50,52,53,54],pixelformat:14,pixelgross:24,pixelkoordinat:53,pixeln:[2,14,18,24,48,50,52,53,54],pixelreih:53,pixelspalt:53,plac:[10,13,24],plain:45,plan:50,planar:[3,10,50],plane_estimation_method:50,plane_preferenc:50,plattform:49,platz:56,platzhalt:59,platziert:[2,16,50],play:51,plug:51,ply:[16,17,59],png:[54,59],pngs:54,point:[15,16,17,18,24,50],point_cloud:50,polaritat:56,pool:55,port:[12,17,41,46,57],portain:57,pos:[1,2,4,6,10,12,15,16,19,24,25,26,30,32,33,37,43,48,50,53,54],pose_fram:[4,12,24,25,26,48,50,53,54],pose_typ:[25,26],posendat:[18,20],posenformat:[1,31,34,36],posentransformation:37,posentyp:[25,26],posenvorgab:24,position:[1,2,4,5,6,12,14,15,17,18,19,24,25,26,30,31,33,34,35,38,39,43,48,50,53],positionier:[2,18,24],positioniert:[18,19,24],positionsstift:19,positiv:[4,12,16,23,24,25,26,48,50,54],post:[27,42,44,45],postfix:42,potentiell:[14,50],potenziell:[46,53],prafix:[14,25],pragnant:50,praxis:[18,32,37],prazis:[2,19,54],pre:4,pre_grasp_offset:[4,24,50],precision:[14,55],preferred_orientation:50,primitiv:[12,41],principal:17,principal_point_u:17,principal_point_v:17,prinzip:5,prinzips:5,prior:26,prioritat:21,priority:50,prismat:50,privilegiert:57,pro:[14,15,16,24,52,54,59],probabilist:53,probl:[21,56],problem:[20,27],problembehandl:56,problemlos:5,processing_tim:[24,50,54],produkt:[11,19,27,47,49,53,58],produktblatt:26,produktionsabweich:24,produktnah:47,produktseit:26,produktverpack:24,programm:[17,21],programmat:12,programmgesteuert:[18,27,40],programmier:49,programmierschnittstell:[14,22,28],programmiersprach:17,projekt:55,projektion:53,projektionsfrei:23,projektor:[7,14,17,19,52,53],projektoreinstell:53,projektormust:[14,24,25,50,53],projektwebseit:54,projizi:53,projiziert:[14,23,24,50,52,53],prometheus:46,proto3:17,protocol:[14,15,17,41,46,55],protokoll:[14,15,21,55,57,59],prozent:[19,25],prozess:[2,18,21,27,56],prozessierungsein:21,pruf:[4,7,18,56],prufung:[2,4,16,50],ptp:[14,41,45],ptp_status:[41,45],ptpd:55,ptpenabl:14,ptpstatus:41,ptpv2:14,puff:[12,14],pul:0,pulspow:0,punkt:[4,18,24,25,26,37,50,53,54,56],punktwolk:[4,13,14,17,24],pur:0,put:[4,16,18,23,24,25,26,27,41,42,43,44,45,48,50,52,53,54],q_0:33,q_1:33,q_2:33,q_3:33,q_w:32,q_x:32,q_y:32,q_z:32,qquad:37,quad:[16,26],quaderform:48,quadrat:[2,18,53,54,56],qualifiziert:[0,56],qualitat:[2,13,14,18,24,25,52,56,59],qualitativ:2,qualitatswert:24,quality:[12,24,43,54],quaternion:[1,12,15,18,26,30,33,50,54],quittiert:[4,16,23,24,25,26,48,50,54],r4ac:0,r_r:31,r_x:[1,31,32,35,36,39],r_y:[1,31,32,34,35,36,39],r_z:[1,31,32,34,35,36,39],radius:[16,48],rahm:[2,18,49,54,56],rand:[24,25,26,53,54],randeb:25,randstark:26,randstufenhoh:26,randtyp:26,randvorspr:26,rang:17,rast:25,rat:54,raum:[5,15],raumvolum:48,rausch:[52,53],rauscht:56,raw:45,rc_april_tag_detect:[10,12],rc_boxpick:[10,12,41],rc_cadmatch:24,rc_camera:[3,12,15,24,25,43,50],rc_collision_check:[7,12],rc_cub:27,rc_genicam_api:21,rc_gev_serv:45,rc_gripper_db:[4,9,12,16,43],rc_hand_eye_calibration:[7,12,43,44],rc_iocontrol:[7,12,24,25,50],rc_itempick:[10,12],rc_load_carri:[10,12,24,50],rc_load_carrier_db:[9,12,25,26,43],rc_qr_code_detect:[10,12],rc_roi_db:[9,12,24,25,43,48,50],rc_silhouettematch:[10,12,41],rc_stereocalib:[2,7,12],rc_stereomatching:[3,12,24,25,42,43,44,50],rc_visard:[0,1,2,3,4,5,6,7,9,10,11,12,13,15,16,17,18,22,23,24,25,26,28,29,30,33,40,42,43,44,45,47,48,49,50,51,52,53,54,55,56,57,58,59],rc_visard_monitoring:46,rc_visard_ng_v22:45,rc_visard_v1:45,rc_viscor:52,rcdiscov:[21,56,59],rcexposureautoaveragemax:14,rcexposureautoaveragemin:14,rcparamlockdisabl:14,rcsens:45,rcsystemready:14,reached:12,ready:[41,45],reaktion:21,real:[2,12,53],realisi:24,reboot:[27,45],receiv:12,rechenein:13,rechenressourc:[53,54],rechenzeit:[50,53],rechn:[27,55,56],rechnergrenz:17,recht:[2,5,14,17,25,48,50,52,53,54,59],rechteck:[2,25,26,48,50,52,53],rechtecksdetektion:24,rechtecksflach:24,rechtshand:[24,50],rectangl:12,rectification:[41,45],red:14,redaktionsschluss:47,reduced_depth_rang:53,reduction:17,reduktion:52,reduzi:[52,53,59],reduziert:[19,25,50,52,53,54],referenz:[16,50],referenziert:[16,24,25,43,45,46,50],referenzkoordinatensyst:[18,24,25,26,48,50],referenzkoordinatensystem:[24,25,26,48,50,54],reflektiert:[5,26],reflex:27,reflexion:[52,53],regel:[2,16,17,41,48,53,56],regelmass:[53,56],regeln:12,region:[9,24,25,27,28,42,45,52,53,59],region_of_inter:48,region_of_interest_2d:[48,53],region_of_interest_2d_id:[25,48,50,53],region_of_interest_id:[24,25,48],regions_of_inter:[27,45,48],regist:11,registered:45,registerkart:27,registri:57,registriert:[11,53],registrierungsnumm:11,reicht:[24,25,50],reih:28,reihenfolg:[1,21,24,25,50,53],reinig:[20,56],reinigungslos:27,reit:2,rekonstruiert:24,rekonstruktion:14,rektifizier:[2,3,5,53],rektifiziert:[2,3,5,6,14,24,25,50,52,53,59],relativ:[2,18,19,24,48,50],releas:[21,52],relevant:[14,18,24,26,47,48,50,52],remove_calibration:12,repetitiv:24,repl:50,replacebright:50,replication:50,replikation:50,replikationsachs:50,replikationsbereich:50,replikationsurspr:50,replizi:50,repliziert:50,repositori:57,reprasenti:32,reprasentiert:[4,24,50,53],reprojektionsfehl:2,req:12,requ:[4,12,16,18,23,24,25,26,42,43,45,48,50,52,53,54],res:12,reset:[4,18,21,23,24,25,43,50,52,53,54],reset_calibration:12,reset_default:[12,43],resolution:17,resourc:15,respons:[4,12,16,18,23,24,25,26,41,43,48,50,52,53,54],ressourc:[15,41,43,44,45],rest:[2,4,7,9,12,15,17,18,20,22,23,24,25,26,27,28,41,42,43,44,48,52,53,54,55,57,59],restart:[12,43],restarting:41,restful:40,restmulltonn:11,restored:45,resultat:[14,53],resultier:[18,50,52,53,56],resx:12,resx_typ:12,ret:12,return_cod:[4,12,16,18,23,24,25,26,45,48,50,52,54],revision:47,rgb8:17,richtet:[19,45,52],richtig:[2,11,19,21,50],richtlini:[11,19,49],richtung:[16,19,24,26,50,53,54,56],richtungsvektor:[24,50],right:[1,14,17,32,37,38],right_enabled:17,rim_ledg:[24,25,26,50],rim_step_height:[24,25,26,50],rim_thickness:[4,24,25,26,50],risik:[49,58],risiko:19,risikobewert:49,risingedg:52,rj45:[0,19],roboception:[0,2,5,8,11,12,13,14,17,18,19,21,27,29,47,49,50,53,57,58],robot:[1,4,7,10,12,13,15,16,18,19,22,24,25,26,27,30,31,32,33,34,35,36,39,48,49,50,52,53,54],robot_mounted:43,robot_pos:[24,25,50,53,54],roboteranwend:50,roboterarm:19,roboterbeweg:18,roboterflansch:16,robotergefuhrt:[18,24,25,26,48,50,54],robotergeometri:16,roboterherstell:1,roboterkoordinatensyst:[19,24,25,26,48,50,53,54],roboterkoordinatensystem:18,roboterpos:[18,24,25,48,50,53,54],roboterposition:18,roboterpunkt:18,robotersteuer:[12,18],roboterstruktur:18,robotersystem:18,robust:[54,55],rohdatenformat:45,roi:[12,48,50],roidb:[9,24,25,53],rois:[24,26,48,50],roll:[18,50,54],rollback:[21,27,41,45],root:24,rot:[2,14,16,18,19,21,25,50,54,56],rotation:[1,2,15,18,24,26,36,54],rotation_error_degre:18,rotationsachs:38,rotationsander:50,rotationsmatrix:[1,15,18,32],rotationsmatriz:1,rotationsparamet:15,rotationsreihenfolg:[1,31,32,34,35,39],rotationssymmetri:50,rotationsvektor:38,rotationswert:18,rotationswinkel:[32,38],rotator:18,roti:18,rotiert:[1,16,31,34,35,36,39,50],row:17,rows:17,rpc:17,ruckgab:[11,24,25,42,43,45,54],ruckgabecod:42,ruckgabelist:50,ruckgabestell:11,ruckgabewert:[4,16,24,25,26,41,46,48,50,54],rucknahm:11,rucksetzmechanismus:21,rucksprung:54,ruckwand:19,ruckwart:54,ruckwartsspr:54,ruft:[16,24,50],ruhig:2,rund:54,rundungsfehl:[32,37],running:[24,41,43,46,54],runtergelad:[16,24,50],s4w1000:0,sac:0,sacc:0,sachschad:[49,58],sammel:11,sammlung:15,samt:27,sattig:52,sauggreif:[4,24,50],sauggreifpunkt:24,sav:43,save_calibration:12,scal:17,scan3dbaselin:14,scan3dcoordinateoffset:14,scan3dcoordinatescal:14,scan3ddistanceunit:14,scan3dfocallength:14,scan3dinvaliddataflag:14,scan3dinvaliddatavalu:14,scan3doutputmod:14,scan3dprincipalpointu:14,scan3dprincipalpointv:14,scan3dprinciplepointu:14,scan3dprinciplepointv:14,schad:[19,47,49,56],schalt:56,schaltet:[14,21,23],schaltflach:[2,18,21,27,52,54,59],schaltschema:19,scharf:[54,56],schattiert:50,schatzung:[6,10,18,50,54],schema:12,schemat:[5,18],schicht:24,schieberegl:[2,50],schlagt:18,schlecht:2,schliess:19,schliesslich:[1,21,24],schliesst:17,schloss:59,schlug:50,schlussel:[12,41],schmal:26,schmutz:[19,27],schmutzpartikel:27,schnappschuss:[52,53,59],schnell:[52,56],schnittstell:[3,4,9,13,15,16,17,18,20,21,23,24,25,26,27,28,42,43,44,48,50,52,53,54,55,56],schnittstellendefinition:54,schnittstellenstandard:[49,51],schrankt:43,schraub:19,schreibgeschutzt:[14,43],schritt:[2,24,25,27,50,54,57],schrittgross:50,schrittweis:[24,52],schrittweit:50,schutz:[19,21,49],schutzklass:[13,19],schutzrecht:47,schwach:[15,53],schwankung:5,schwarz:[2,5,24,54],schwer:[26,56],schwerwieg:[24,54],schwingung:[19,56],sco:0,scor:24,sdk:15,sdks:8,sec:[12,17,23,24,25,50,53,54],sechstel:53,second:[17,43],seg:[12,43],segment:24,segmentier:14,segmentiert:24,segmentierungsparamet:53,segmentierungswert:56,seh:[26,50,54],sei:27,seit:[2,8,18,21,24,25,26,27,48,50,52,53,54,55,57,59],seitig:26,sekund:[15,21,24,25,41,50,52,53,54,56],selb:[4,5,11,12,15,17,18,21,50],selbstkalibriermodus:2,selbstregistrier:6,selektiert:14,self:2,self_calibration:45,selt:24,semant:18,semi:[5,15,53],send:[12,17],sendet:17,senk:56,senkrecht:[2,25,26,50],sensibl:2,sensor:[0,2,5,6,7,13,14,18,19,21,24,25,27,45,48,50,53,54,55,56],sensorgehaus:56,sensororientier:19,separat:[4,10,12,16,17,24,26,49],separiert:57,serial:[21,41,45],seriennumm:[21,41],serv:[15,17,21,29,41,42,45,55,59],serverstream:17,servic:[17,22,40,41,42,44],service_nam:12,serviceanfrag:12,serviceantwort:[4,16,23,24,25,26,48,50,54],servicearg:41,serviceargument:[4,12,16,24,25,50,53,54],serviceaufruf:[4,41,43],servicerespons:41,servicespezif:43,set:[19,45],set_all_grasps:12,set_calibration:12,set_flag:12,set_grasp:12,set_gripp:[12,43],set_gripper_schmalz_vac:12,set_gripper_schunk:12,set_load_carri:[12,24,43],set_pos:[12,43,44],set_preferred_orientation:12,set_region_of_inter:[12,43],set_region_of_interest_2d:[12,43],set_sorting_strategi:12,set_stroke_schunk:12,setting:[41,45],setups:16,setz:[4,12,14,18,23,24,25,40,42,43,44,45,52,57],setzt:[18,21,25],sfnc:14,sgm:[5,15,53],shot:14,sicher:[18,19,21,32,37,56],sichergestellt:[2,11,16,19,27,50],sicherheitsabstand:26,sicherheitscheck:4,sicherheitsfunktion:59,sicherheitshinweis:[20,47],sicherheitskrit:49,sicherheitsmassnahm:49,sicherheitsspielraum:25,sichern:[19,49],sicherzustell:[2,12,18,19,24,50,52],sichtachs:[2,50],sichtbar:[2,18,23,25,50,54],sichtfeld:[2,19,50,56],siedlungsabfall:11,sieh:[2,4,12,14,15,16,17,18,19,21,23,24,25,26,27,36,41,42,43,50,52,53,54,55,56,59],sieht:[12,18],sign:[32,37],signal:[5,19,52],signalflank:52,signalisi:56,signalisiert:53,signifikant:[2,19,54],silhouett:50,silhouettematch:[4,10,16,25,26,27,48],simpl:59,sin:[1,31,32,34,35,36,38,39],singl:[52,53],singlecomponent:14,singlefram:[14,52,53],singleframeout1:[14,24,25,50,52,53],sinnvoll:[17,52],situation:[18,24,25,26,48,54],sitzt:19,siz:[12,17,41,45,54],skalier:[50,59],skaliert:[14,54],skalierungsfaktor:14,slav:[41,55],slid:52,slot:[18,43],small:17,smartpad:12,smartphon:54,smooth:12,sobald:[2,4,12,14,16,17,21,24,25,52,54],sockel:18,sodass:[12,17,18,19,21,24,27,50,52,54],sof:[13,19,47,50],sofort:[14,27],softwar:[3,8,12,15,27,47,52,53,54,58],softwareentwicklungswerkzeug:15,softwarelizenz:[20,41,45],softwaremodul:[4,5,10,12,13,15,18,19,20,21,23,24,27,40,41,42,43,47,49,50,52,53,54,59],softwarepaket:21,softwaretrigg:52,sogar:2,sogenannt:[4,16,23,24,25,26,27,35,42,43,48,50,54],solang:[16,43,50,52],solch:[15,24,25,26,40,42,47,48,54],sollen:[4,18,24,50,54],sollt:[2,12,14,18,19,23,24,25,27,50,53,54],somit:[23,54],sond:[4,5,18,26,27,43,50,54],sonderformat:14,sonstig:[5,19],sorg:19,sorgfalt:54,sorgsam:18,sorgt:50,sort:24,sortenrein:50,sorti:[24,50],sortier:[24,50],sortierricht:[24,50],sortierstrategi:[24,27],sortiert:[24,50,53],sourc:[14,21],sowi:[5,6,10,18,19,24,40,42,44,49,50,53,55,59],sowohl:[0,3,4,5,21,24,48,50,54],spalt:[14,52],spaltenweis:32,spannung:19,spannungsbereich:56,spannungsspitz:56,spar:[54,59],sparlich:56,spat:[27,48],speich:[4,16,18,24,26,42,48,50,52,53,54,59],speicher:[50,54],speicherbar:[4,16,24,25,26,48,50],speicherlimit:12,speicherplatz:53,speicherplatzlimitier:53,speichert:[4,16,24,25,26,48,50,52,53],sperr:59,sperrt:[45,59],spezialreinigungstuch:27,speziell:[7,11,12,14,16,23,24,25,28,40,42,50,54],spezif:[12,14,21,26,48],spezifikation:[12,20,47,49,56],spezifizi:54,spezifiziert:[4,16,24,25,26,48,50,54],spher:48,spiegel:27,spiel:54,spielt:18,sqrt:[32,37,38],squar:24,stabil:17,stack:[46,57],stal:43,standalon:57,standard:[14,15,17,21,24,26,50,52,55,57],standardabweich:41,standardeinstell:[23,52,53,55],standardgreif:4,standardinterfac:51,standardisiert:13,standardlieferumfang:19,standardlos:[10,13],standardmass:[0,2,12,15,16,19,21,24,25,50,55],standardsortierstrategi:[24,50],standardverhalt:54,standardwert:[24,43,45,50,53,54],stapeln:50,stark:[2,19,24,26,27,50,56],start:[12,18,21,27,40,43],startansicht:44,startet:[24,27,54],starting:41,startseit:18,stat:[24,41,45,54],static_sc:12,stationar:49,statisch:[14,18,21,24,50,52],statist:[41,56],stativaufnahm:19,stativgewind:19,statt:17,stattdess:[4,14,24,25,50,52],stattfindet:53,status:[14,18,21,40,41,42,43,44,45,46,55,57],statusbalk:27,statuscod:[24,42,43,45,46,50],statusindikator:41,statusinformation:22,statuswert:[2,16,41,43],statuszeil:52,staub:27,steck:[0,19],steckerbeleg:[0,56],steckernetzteil:0,steh:[4,16,18,21,22,23,24,25,26,48,50,53,54],stehend:54,steht:[2,14,15,17,24,25,26,48,50,52,54],steif:[24,54],steigend:52,stell:[5,14,15,18,21,24,25,43,50,53,54,55,56],stellt:[4,9,12,13,14,16,23,24,25,26,32,37,43,48,50,52,53,54,55],stellung:2,step:[16,17],step_x_deg:50,stereo:[3,5,14,15,23,40,41,43,45,52,54,56],stereobasiert:50,stereobild:[14,53],stereobildpaar:53,stereokamera:[5,13,14,15,27,40,52,54],stereomatching:[24,25,50],stereoplus:[14,53],stereovision:[6,20],stet:[1,49],steu:[14,53],steuer:18,steuerdat:51,stiftung:11,stl:16,stop:[12,43],stopp:[12,40,43,54],stoppt:[24,54],stops:43,storaussend:0,stored:43,storung:[19,47],storungsfrei:5,stp:16,strategi:[24,50],stream:[3,16,24,50,52,53,59],streamimageset:17,streaming:[14,17],streifenmust:50,strikt:50,string:[4,12,16,17,18,23,24,25,26,41,43,45,48,50,52,53,54],strom:[0,19,21,56],stromanschluss:21,stromquell:19,stromschlag:56,stromschlaggefahr:58,stromversorg:[20,49,56],stromzufuhr:[19,21,56],struktur:[5,15,44,53,56],stuf:26,stufenhoh:26,submillimeterbereich:18,subnet_mask:[41,45],subnetz:[21,56],subnetzmask:41,success:[18,43],such:50,suction:24,suction_surface_length:24,suction_surface_width:24,sudo:55,suffix:27,support:[11,20,27,29,47,56],supported:17,surface_area:24,swagg:[27,42],switching:43,symbol:[11,47,50,59],symm:50,symmetr:50,symmetri:[26,50],synchronisation:55,synchronisi:[15,55],synchronisier:[14,23,55],synchronisiert:[5,14,17,22,23,41,55],synchronizedcomponent:14,synonym:24,syntax:17,sysinfo:[41,45],syst:[0,13,15,17,19,21,27,41,42,50,53,55,56,57,59],system_info:59,systemeinstell:59,systeminformation:[41,45,59],systemintegrator:49,systemstart:21,systemstatus:40,systemweit:45,systemzeit:[41,45,54,55],systemzustand:42,szen:[14,24,25,26,52,53,54,56,59],szenari:[24,50],szenario:24,szenendat:26,t4110001081:0,t4110011081:0,t_r:34,tab:[19,54],tabell:[4,14,16,19,23,24,25,26,48,53,54],tag:12,tagbreit:54,tagdetect:[10,12,23,50],tageck:54,tagerkennungslauf:54,taggross:54,tagpos:54,tagtyp:54,tait:1,tar:[27,52,53,59],tatsach:[14,16,42,44,52,53],tausch:56,tcp:[4,15,17,24,27,45,55,57],tcp_parent_id:16,tcp_pose_flang:16,tcp_pose_parent:16,tcps:50,teach:18,technisch:[13,20,49],technologi:[15,58],technology:14,teil:[16,18,19,24,25,26,42,48,50,52,54],teilbereich:[24,42,50],teilvolum:24,teilweis:[27,47,50,52,53],telefon:8,temp_left:[43,52],temp_right:[43,52],temperatur:[19,52,56],temperaturwarn:56,templat:[4,27,41,42],template_id:[24,50],templatekant:50,templateubersicht:24,temporar:[21,52,59],temporaryip:41,terminiert:12,test:[16,24,42,50,52,59],testzweck:44,text:[1,18,31,32,34,35,36,37,38,39,42,44,45],textfeld:18,textnachricht:[4,16,23,24,25,26,48,50,54],textur:[5,17,24,53,56],textured:17,textured_box:24,textured_rectangl:24,texturerkenn:24,texturiert:[15,24,50,53],texturlos:[50,53],than:24,the:[16,17,18,24,43],theoret:2,theta:38,three_sided:26,tief:[20,53],tiefenauflos:19,tiefenbereich:53,tiefenbild:[13,14,19,24,52],tiefenbildaufnahm:52,tiefenbildparamet:14,tiefendat:[14,59],tiefenfehl:[14,53],tiefengenau:[19,53],tiefeninformation:[3,28,53],tiefenmess:[14,53],tiefenmessbereich:[19,56],tiefenmessfehl:56,tiefenmesswert:53,tiefenwert:[6,25,50,53,56],tim:[14,15,17,18,41,43,45,52,55],time_matching:53,time_postprocessing:53,timeout:[24,25,50],timestamp:[12,17,23,24,25,41,43,45,50,53,54],tippfehl:18,tisch:18,tischnetzteil:0,titl:41,toleranz:24,toleriert:50,tonn:11,too:[16,24,42,50],tool:[14,15,16,18,21,24,50,56],trag:58,tragheitsmoment:19,trajektori:4,transferi:14,transformation:[18,24,25,26,48,50,54],transformationsmatrix:32,transformiert:50,translation:[1,2,15],translation_error_met:18,translationsvektor:[1,15,18,32],translator:18,transparent:[12,50],transport:[5,19],transporttemperatur:19,trat:54,trennung:50,trifft:[27,50,56],trigg:[14,24,25,50,52,53],triggeraufruf:53,triggersignal:52,triggert:[4,14,52],trotz:[21,52],trotzd:54,tuch:27,typ:[4,12,14,16,18,23,24,25,26,41,42,43,44,45,46,48,50,52,53,54],typenschild:[21,58],typisch:[2,53],typischerweis:[2,26],typs:[26,27,41,44,48,50],u_x:38,u_y:38,u_z:38,uber:[0,2,3,4,7,8,9,11,12,13,14,15,17,19,21,26,27,28,40,41,42,43,46,48,49,51,54,55,56,57,58,59],uberarbeitet:47,uberbelicht:52,uberbelichtet:[2,18,53],uberblick:[0,14,20],ubereinstimm:[16,24,54],ubereinstimmt:16,uberfullt:25,ubergab:50,ubergang:54,ubergeb:[4,16,18,24,25,48,50,54],uberholt:[14,50],uberlappt:50,ubermitteln:[11,12,21],ubermittelt:49,ubermittl:51,ubernomm:2,uberpruf:[2,7,27,29,50,56],uberpruft:[2,4,15,21],uberschreit:[0,19,49],uberschreitet:[2,12,50,53,54],uberschrieb:[4,16,18,24,25,26,48,50,52],uberschritt:[4,16,24,25,26,48,50,54],ubersetz:15,ubersetzt:12,ubersicht:[16,19],uberspr:2,ubersteig:50,ubersteigt:50,uberstromschutz:19,ubertrag:[14,15,18,21,23,27,42,52,56],ubertragungsein:14,ubertragungsrat:[15,42],ubertreff:54,uberwach:56,uberwacht:[2,52],ubjson:[16,24,43,45,46,50],ublich:[1,42],ublicherweis:[1,18,19,21,53],ubuntu:21,udp:[14,17,57],uhr:[15,55],uhrzeit:[41,55],uhrzeitsynchronisierungsstatus:45,ui_lock:[41,45,59],uilock:[41,45],uint16:41,uint32:[17,18,23,25,41,48,53],uint64:41,uint8:41,umfass:40,umfasst:[14,19,43],umfeld:[0,19],umgeb:[5,19,24,25,26,48,53],umgebungsbeding:56,umgebungstemperatur:[19,56],umgekehrt:[1,56],umgerechnet:[12,14,31,32,34,35,36,39],umgewandelt:[12,53],umich:54,umrechn:[1,53],umschalt:52,umschloss:[24,54],umso:[24,50],umstand:2,umstrom:56,umwandl:[12,53],umwelt:[11,20],umweltschutz:58,umzuwandeln:[5,53],unabhang:[15,18,23,24,52,53],unbeabsichtigt:[18,59],unbedingt:54,unbefugt:27,unbekannt:[18,24,50],unbenutzt:19,unbeschrankt:24,unbestimmt:24,uncalibrated:41,unconstrained:24,uneb:[24,54],unend:[14,19,53],unerheb:18,unerreichbar:56,unerwartet:27,unerwunscht:58,ungeachtet:2,ungeerdet:19,ungefahr:[18,19,25],ungehindert:[19,56],ungenau:[18,53,56],ungenug:18,ungepruft:50,ungestort:17,ungewollt:14,ungult:[2,4,12,14,16,18,24,25,26,42,43,45,48,50,53,54,59],unhealthy:41,uniform:15,union:11,uniqu:24,unit:50,universal:1,universally:24,unix:41,unkennt:58,unknown:[24,41],unprazis:2,unsachgemass:[49,50],unscharf:56,unsich:53,unsortiert:11,unt:[0,2,4,11,12,14,15,16,18,19,21,23,24,25,26,27,44,48,50,52,53,54,55,57],unterabteil:24,unterbelicht:52,unterbelichtet:52,unterbroch:27,unterelement:12,untergrund:[50,54],unterhalb:[16,50,59],unterlieg:57,untersagt:11,unterscheid:[14,18,24,53,54],unterscheidet:[18,54],unterschied:[1,5,10,18,24,26,50,52,53,54,56],unterschritt:24,unterseit:19,unterstutz:[0,14,17,24,26,48,50,52,53,54,56],unterstutzt:[14,16,17,24,25,26,29,41,48,49,51,54,57],unterteil:24,unterteilt:[24,25,28,50,53],unterzog:2,untexturiert:[50,53],unverzug:56,updat:[2,16,19,24,26,27,41,42,45,48,50],updatevorgang:27,upgrad:21,upload:[16,24,27,42,50],uptim:[41,45],urheb:47,urheberrecht:47,uri:[15,42],url:[15,41,59],ursprung:[1,16,18,19,24,26,50,53,54],usb:[15,57],use:17,use_cached_imag:54,use_last:53,used:[17,24],user:[12,59],userspac:[20,41,42],userspaceapp:41,userspacecontain:41,usw:[8,15,18,22],utc:45,uuid:[4,12,24,50],uvex:27,vakuum:[10,24],valid:[12,24,41,43,45,50],validierungszweck:56,valu:[4,12,16,17,18,23,24,25,26,41,42,43,45,48,50,52,53,54],variabl:[29,54],varianz:18,variiert:18,vcc:19,vdc:0,vector:[24,50],vektor:50,vendor:41,veraltet:[23,53,54],verand:[26,27,50,52,53],verandert:[18,27,50,52,53,58],veranschaulich:[24,49],veranschaulicht:[50,54],verantwort:[11,19,24,25,26,48,49,52],verarbeit:[3,16,24,43,45,46,50],verarbeitet:[24,25,50,54],verarbeitungsgeschwind:56,verarbeitungslast:19,verarbeitungsressourc:56,verarbeitungsstatus:43,verarbeitungszeit:[48,52,53],verbess:[14,47,50],verbesser:[14,23],verbessert:[53,54],verbind:[0,16,17,19,49,50,54,55],verbindungsfehl:12,verbindungsgeschwind:41,verbindungswiederaufbau:21,verbleib:24,verbleibt:18,verbot:[24,42,43,50],verbraucht:56,verbreitet:[1,47],verbund:[14,16,18,21,24,25,42,43,54,56],verdeck:53,verdeckt:[2,24,50],verein:43,vereinfach:[2,50,52],vereinfacht:[16,44,54],verfahr:[5,18,27,47,50,53],verfeiner:50,verfeinert:50,verform:24,verformt:50,verfug:[4,9,12,14,16,18,21,22,23,24,25,26,27,43,48,50,53,54,55],verfugbar:[2,4,9,12,15,16,17,18,19,21,23,24,25,26,28,29,41,43,44,45,48,50,52,53,57],verfugt:[13,19,21,53],vergeb:[15,21,27],vergess:59,vergewiss:[21,56],vergleich:[14,16,17,55],vergleichbar:54,vergleicht:54,verglich:[5,18,50],vergrossert:26,verhalt:[14,27,42,44,58],verhaltnis:[14,52],verhilft:54,verhind:[18,24,52,59],verifizi:[24,45],verkabel:[20,23,56],verkauf:47,verkipp:[25,50],verkippt:50,verknupft:54,verkurz:[50,56],verkurzt:53,verlang:56,verlangsam:50,verlass:18,verlauf:2,verlauft:18,verletzungsgefahr:47,verlor:27,verlust:[49,58],vermeid:[11,16,21,25,27,47,52,54,59],vermied:2,vermitteln:47,veroffentlicht:[46,57],verpflichtet:[11,49],verring:[12,25,27,48,52,53,56],verringert:[19,25,50,52,53],versatz:[5,14,19,41,50],verschachtelt:41,verschieb:[1,24,27,50],verschied:[0,1,2,5,7,12,14,15,18,19,21,24,25,26,28,42,48,49,50,52,53,56,59],verschlechtert:54,verschlussel:49,verschlusselt:42,verschmutzt:56,verschob:[50,54],verschwind:2,verschwomm:[50,56],verseh:[26,27],versendet:[14,23,52],versetzt:[17,24],version:[4,9,12,14,18,20,21,23,24,25,29,41,42,45,50,52,53,54],versionseinschrank:41,versionsnumm:[27,47],versorgt:[19,56],versorgungsnetz:56,versorgungsspann:19,verstand:[21,49],verstark:52,verstarkungsfaktor:[14,59],verstarkungswert:52,versuch:[54,56],versucht:[21,52,54,55,58],vertauscht:54,vertical:17,vertikal:[14,19],verunrein:19,verursach:[21,56],verursacht:[2,5,26,53],vervielfaltigt:47,verwalt:[42,45,57],verwaltet:[15,57],verwechselt:54,verweis:18,verweist:15,verwend:[2,3,18,19,20,21,27,44,45,47,54,56],verwendet:[0,2,3,4,5,13,14,15,16,18,19,21,23,24,25,26,27,29,38,41,47,48,49,50,52,53,54,55,57,58],verwerf:[50,54],verwertungsquot:11,verworf:[24,54],verzeichn:52,verzeichnis:12,verzerr:54,verzerrt:56,via:[12,29,45,55],vibration:[18,56],viele:[1,12,17,50,52,54,56],vielen:[9,18,26,48],vielfalt:18,vielzahl:28,vier:[14,18,21,26,54],viertel:[50,53],view:24,view_pose_set:24,view_uuid:24,views:24,visard:[21,45],vision:[3,15,17,20,21,22,23,28,42,43,45,49,51,52,53,55,59],visualisi:22,visualisier:[16,24,25,50,54],visualisiert:[18,50,52],visualisierungsmenu:50,visualisierungsmenus:50,visualisierungsmodell:50,visuell:52,voll:[2,44,50,53,59],vollig:18,vollstand:[2,15,18,21,24,25,41,44,47,50,54],volum:[25,26,48],vorab:50,vorangegang:50,vorangeschritt:27,vorankund:47,vorausgefullt:12,vorausgesetzt:[24,57],voraussetz:18,vordefiniert:[2,50,54],voreingestellt:41,voreinstell:[14,45],vorfeld:16,vorformatiert:44,vorgab:26,vorgang:[19,21,27,41,45,56],vorgeh:2,vorgehensweis:18,vorgeneriert:54,vorgenomm:[0,2,12,15,18,27,41,47,48,59],vorgeschlag:24,vorgeseh:[0,19,21],vorgezog:54,vorgreifposition:[4,24,50],vorh:54,vorhand:[4,16,18,24,25,50,52,53,54],vorher:[2,18,20,21,45,47,53],vorinstalliert:21,vorkalibriert:5,vorkomm:[2,21,24,27,47,53,54],vorlieg:[13,47,49],vorliegt:[18,24,43,50,56],vornehm:[2,27,59],vorrang:[13,52],vorricht:[19,49],vorschau:44,vorschlagt:12,vorschreibt:47,vorschrift:49,vorseh:0,vorsicht:[27,58],vorspring:26,vorsteh:[2,56],vorteil:[17,54],vorubergeh:42,vorwart:54,vorwartssprung:54,vorzeich:[32,37],vorzeichenbehaftet:18,vorzeichenlos:14,vorzugeh:27,vorzugsweis:18,vorzunehm:[2,21,50,59],w_r:31,waagerecht:25,wach:53,wahl:[14,18,56],wahlt:14,wahr:53,wahrend:[1,2,4,5,12,14,16,18,19,21,24,25,26,27,40,42,43,44,48,50,52,53,54,55,56,59],wahrnehm:[5,13,52],wahrschein:53,wand:[4,5,26,53],wann:[18,21,54],warmeisoliert:19,warn:41,warning:45,warnung:[4,16,23,24,25,27,47,54],wart:[27,53,54],wartet:54,wartezeit:54,wartung:[20,49],wartungsarbeit:27,warum:2,wasserdicht:[4,50],wasserstrahlgeschnitt:50,watertight:17,wb_ratio:14,web:[2,4,7,8,13,14,18,19,20,21,22,23,24,25,26,27,40,43,48,52,53,54,55,56,57],webbrows:[21,27,42,59],webseit:[11,17],websit:50,wechselstrom:56,wechselt:[19,56],wed:[18,27,47,49,50],weee:11,wegen:11,weglass:52,wegzeig:19,weich:27,weicht:19,weight:[24,50],weis:[2,47,54,59],weiss:[5,21,25,53,54,56],weissabgleich:14,weit:[1,2,3,4,5,11,12,14,18,24,25,27,43,44,50,53,54,56,59],weitergab:53,weitergeleitet:12,weiterhin:[16,18,24,26,50,52,53],weitestgeh:5,welch:[2,3,4,5,7,12,14,16,17,18,19,21,23,24,25,26,27,28,31,34,36,38,39,41,48,50,52,53,54,55],welt:18,weltkoordinatensyst:18,wend:56,wendet:[4,23,24,25,50,52,53,54],wenig:[14,17,24,25,50,54],wenigst:19,werd:[0,1,2,3,4,5,6,8,9,10,11,12,13,14,15,16,17,18,19,21,23,24,25,26,27,28,29,31,32,34,35,36,37,38,39,41,42,43,44,46,47,48,49,50,52,53,54,55,56,57,58,59],werk:[2,5,27,41],werkseinstell:[4,18,23,24,25,27,43,50,52,53,54,55],werkzeug:[15,18,48],werkzeugmittelpunkt:18,wert:[2,4,5,12,14,16,18,23,25,26,41,43,45,48,50,52,54,56,59],wertebereich:[14,18],wesent:[15,55],weshalb:54,which:17,wichtig:[18,19,27,53,54,56,59],width:[14,17,43,48,52,53],widthmax:14,wied:[4,18,23,24,25,27,50,52,53,54,59],wiedererkannt:54,wiederhergestellt:27,wiederherstell:[16,18,20,21,26,32,37,43,48,50],wiederherzustell:43,wiederhol:2,wiederholrat:53,wiederkehr:[53,56],wiederum:24,wiederverwert:58,wiederzuerkenn:54,wiederzufind:54,windows:[15,21],winkel:[1,31,32,34,35,36,38,39,50,54],winkeln:[31,34,35,36,39],wirk:[2,19],wirksam:14,wiss:[19,24,25,26,47,48],wlan:17,wobei:[14,15,16,18,19,24,32,35,42,50,53,54,59],wodurch:[3,17,53],wohingeg:24,wohn:0,woll:56,word:[4,19,26,47],wozu:55,wpr:1,wurd:[1,2,4,12,14,15,16,18,21,23,24,25,26,27,41,44,47,48,50,53,54,56,57,58,59],wurzel:[32,37],wurzelelement:12,www:[0,8,14,19,21,27,53],x_r:[32,39],xyz:[1,15,18,38,39],xyzabc:15,y_r:[32,39],yaskawa:1,yaw:50,ycbcr411_8:14,yyyy:45,z_r:[32,39],zahl:[2,12,16,24,25,50,53,54],zehn:19,zeich:[12,54],zeichenfolg:[15,41,42,44],zeichenkett:15,zeichensatz:54,zeichnet:53,zeichnung:[13,49],zeig:[2,53],zeigt:[2,18,19,23,24,26,27,42,44,50,54,56,57,59],zeil:[4,14,45,52,53],zeilenweis:[24,25,50],zeit:[2,15,16,21,24,25,45,50,52,53,54],zeitfen:21,zeitgestempelt:[52,53],zeitlich:[14,41],zeitpunkt:[14,17,23,27,52,53],zeitspann:[24,25,50,53],zeitsprung:54,zeitstempel:[14,24,25,41,50,53,54,55,59],zeitsynchronisation:[22,45,55],zeitsynchronisier:[14,20,41,54],zeituberschreit:50,zeitunterschied:14,zeitverhalt:50,zeitverschieb:41,zeitweis:50,zell:[2,25,53],zellunterteil:25,zentimet:19,zentral:15,zentriert:[19,53],zentrum:[18,24,26],zerlegt:58,zero:17,zerstorungsfrei:11,zertifiziert:[0,19],zieh:[50,56,58],ziel:12,zieladress:56,zielanwend:16,ziff:18,zip:12,zoll:19,zubehor:[19,20],zud:[5,13,14,15,18,19,21,43,49,50,53],zueinand:[2,5,24],zuerst:[24,32,35,50],zufall:[24,53,54],zufallsmust:50,zufolg:14,zufriedenstell:2,zugang:[27,40,43],zugegriff:[18,21,42,54,57,59],zugehor:[14,16,18,19,24,27,28,41,43,49,50,51,53],zugeklappt:44,zugelass:56,zugentlast:19,zugeordnet:[14,24,50],zugewies:[4,15,19,21,41,48,50,54],zugleich:52,zugreif:[40,57],zugriff:[12,18,42,44,45,57],zugrund:[5,6],zukomm:8,zukunft:[50,52],zulass:[20,24,25,26,42,43,48,50,54],zuletzt:[27,41,54],zunach:[2,31,34,36,38,39],zuordnung:14,zuruck:[4,12,14,15,16,18,21,23,24,25,26,32,37,42,48,50,53,54],zuruckgeb:11,zuruckgegeb:[4,12,16,18,24,25,26,41,42,43,48,50,53,54],zuruckgegriff:[21,27],zuruckgeliefert:[4,18,24,25,26,27,50,53],zuruckgesetzt:[2,18,27,59],zuruckgewies:[24,25,26,48,50,54],zuruckgreif:27,zuruckspring:54,zuruckzukehr:18,zuruckzusetz:21,zusamm:[5,24,25,50,54],zusammengehor:[5,54],zusammengestellt:[47,56],zusammenhang:[52,53,56],zusatz:[2,4,6,16,18,19,21,23,24,25,26,27,47,48,49,50,53,54,56,59],zustand:[14,23,41,43,44,50,58,59],zustandsautomat:54,zustandsnam:54,zustandsubergang:24,zutreff:[4,16,24,25,26,27,48,54],zuverlass:[54,56],zuvor:[4,18,27,41],zuweis:21,zuweist:15,zuzufuhr:11,zuzugreif:41,zuzuordn:18,zuzuweis:[15,21],zweck:[18,47],zwei:[1,5,12,18,24,25,26,48,50,53,54],zweidimensional:54,zweier:[53,54],zweimal:1,zweiminut:21,zweit:[12,23,44,52,54],zwingend:19,zwisch:[1,4,14,15,16,18,19,22,26,50,52,53,54,56],zwischenergebnis:[24,50],zwischenzeit:54,zylind:16,zylindr:50},titles:["Zubeh\u00f6r","Anhang","Kamerakalibrierung","3D-Kamera-Module","CollisionCheck","Stereovision","Messprinzipien","Konfigurationsmodule","Kontakt","Datenbankmodule","Detektionsmodule","Informationen zur Entsorgung","KUKA Ethernet KRL Schnittstelle","\u00dcberblick","GigE Vision 2.0/GenICam-Schnittstelle","Glossar","GripperDB","gRPC Bilddatenschnittstelle","Hand-Auge-Kalibrierung","Hardware-Spezifikation","Roboception rc_visard NG Bedienungsanleitung","Installation","Schnittstellen","IOControl und Projektor-Kontrolle","ItemPick und BoxPick","LoadCarrier","LoadCarrierDB","Wartung","Softwaremodule","OPC UA Interface","ABB Posenformat","FANUC XYZ-WPR Format","Franka Emika Posenformat","Fruitcore HORST Posenformat","Kawasaki XYZ-OAT Format","KUKA XYZ-ABC Format","Mitsubishi XYZ-ABC Format","Rotationsmatrix und Translationsvektor","Universal Robots Posenformat","Yaskawa Posenformat","REST-API-Schnittstelle","Datentyp-Definitionen","Allgemeine Struktur der Programmierschnittstelle (API)","Module, Parameter und Services","Swagger UI","System und Logs","UserSpace","Einf\u00fchrung","RoiDB","Sicherheit","SilhouetteMatch","Schnittstellen, Zulassungen und Normen","Kamera","Stereo-Matching","TagDetect","Zeitsynchronisierung","Fehlerbehebung","UserSpace","Garantie","Web GUI"],titleterms:{Nicht:16,Nur:[24,50],Sicherheit:49,abb:30,abc:[35,36],abhang:53,abstand:53,abteil:26,acquisition_mod:[52,53],acquisition_trigg:[52,53],acquisitioncontrol:14,adress:8,aktualisier:27,allgemein:[12,42,49],alon:4,analogcontrol:14,and:[4,24,25,26,48,50,52],anfrag:[12,42],angl:38,anhang:1,anschluss:0,anschlussset:0,antwort:12,anwend:57,anwendungsspezif:24,anzahl:24,anzeig:[52,53],api:[16,24,40,42,50],applikationsspezif:4,apriltag:[50,54],assume_gravity_aligned:25,auflos:[19,53],aufnahmemodus:[52,53],aufnehm:18,aufspur:21,aug:[18,24,25,26,48,50,54],ausgang:23,auto:52,automat:21,axis:38,backup:27,basiert:50,basiseb:50,bedeut:14,bedienungsanleit:20,beispiel:54,beispielanwend:12,beispielclient:17,belicht:52,belichtungsautomat:53,belichtungszeit:52,belichtungszeitautomat:52,berechn:[18,24,53],berechnet:16,bereich:52,beschreib:[4,18,23,24,25,50,52,53],besond:14,bestimmungsgemass:49,betriebsbeding:19,bevorzug:24,bevorzugt:50,bild:[14,17,52],bilddatenschnittstell:17,bildwiederholrat:52,bit:14,blau:52,bod:4,boxpick:24,breit:[18,54],bridg:12,bzw:24,cad:16,calibrat:18,calibrate_base_plan:50,carri:[25,26],check:4,check_bottom:4,check_collision:4,check_collisions_with_base_plan:50,check_collisions_with_match:50,check_collisions_with_point_cloud:50,check_flang:4,chunk:14,chunkdatacontrol:14,cluster_max_curvatur:24,cluster_max_dimension:24,clusterabdeck:24,clustering:24,clustering_discontinuity_factor:24,clustering_max_surface_rms:24,clustering_patch_siz:24,cod:[48,54],collision_dist:4,collisioncheck:[4,24,50],compute_grasps:24,crop_distanc:25,cropping:25,dat:14,datenbankmodul:9,datentyp:41,definition:[26,41],delete_base_plane_calibration:50,delete_grasps:50,delete_gripp:[4,16],delete_load_carri:[25,26],delete_pos:18,delete_regions_of_inter:[24,25,48],delete_regions_of_interest_2d:[25,48,50],depthcontrol:14,detect:54,detect_filling_level:25,detect_item:24,detect_load_carri:25,detect_object:50,detektionsmodul:10,devicecontrol:14,digitaliocontrol:14,disparitat:56,disparitatsbild:53,dot:19,doubl:53,double_shot:53,download:[8,27],edge_sensitivity:50,einfuhr:[24,47,50,54],einleit:[4,16,25,26,48],einschalt:21,einschrank:57,einstell:27,eki:12,emika:32,entsorg:11,erkenn:[24,25],erkennungsdistanz:54,ersatzteil:0,erstell:16,ethernet:[0,12],exp_auto:52,exp_auto_average_max:52,exp_auto_average_min:52,exp_auto_mod:52,exp_control:52,exp_height:52,exp_max:52,exp_offset_x:52,exp_offset_y:52,exp_valu:52,exp_width:52,exposure_adapt_timeout:53,famili:54,fanuc:31,farb:56,farbcod:56,fehl:[53,56],fehlerbeheb:[12,56],fehlerbild:53,fehlercod:4,fill:53,firmwar:27,flansch:4,flanschradius:16,format:[1,31,34,35,36,38],fps:52,franka:32,fruitcor:33,full:53,fullstandserkenn:25,fur:[1,19,24,54],gain_valu:52,gamma:52,garanti:58,genau:19,genicam:[14,56],gerat:21,get_base_plane_calibration:50,get_calibration:18,get_grasps:50,get_gripp:[4,16],get_io_valu:23,get_load_carri:[25,26],get_pos:18,get_preferred_orientation:50,get_regions_of_inter:[24,25,48],get_regions_of_interest_2d:[25,48,50],get_sorting_strategi:[24,50],get_symmetric_grasps:50,gewahlt:53,gig:[14,56],glattung:53,glossar:15,gravitationsausgerichtet:25,greif:16,greiferelement:16,greifpunkt:[24,50],grenzwert:19,grid_height:18,grid_width:18,gripperdb:16,gross:[24,54],grpc:17,grun:52,gui:[16,50,59],hand:[18,24,25,26,48,50,54],hardwar:[19,56],hdr:52,hellig:52,herunterlad:[52,53,59],hoch:[50,54],hochlad:16,hoh:18,horst:33,host:21,ideal:54,imageformatcontrol:14,information:11,installation:21,integriert:4,inter:[48,50],interfac:29,intern:50,iocontrol:[23,24,25,50],itempick:24,kalibri:2,kalibrier:[2,18,24,25,26,48,50,54],kalibriereinstell:2,kalibrierergebnis:2,kalibrierroutin:18,kalibrierschnittstell:18,kalibrierstatus:18,kalibriervorgang:2,kamera:[3,52],kamerabild:[56,59],kamerakalibrier:[2,27],kameralins:27,kameramontag:18,kantenempfind:50,kategori:14,kawasaki:34,kennenlern:59,kollisionspruf:[4,50],konfidenz:53,konfidenzbild:56,konfiguration:[12,21,57],konfigurationsdatei:12,konfigurationsmodul:7,konnektivitat:56,kontakt:8,kontroll:[23,24,25,50],koordinatensystem:19,krl:12,krummung:24,kuka:[12,35],laufzeitparamet:[4,18,23,24,25,50,52,53,54],led:56,lieferumfang:19,line_sensitivity:24,linestatusall:14,linienempfind:24,load:[25,26],loadcarri:[24,25,50],loadcarrierdb:26,log:45,logdatei:27,manual:52,manual_line_sensitivity:24,manuell:[21,24,50,52,55],match:[24,50],match_max_distanc:50,match_percentil:50,matching:[19,24,25,50,53],matchingdistanz:50,max_grasps:24,max_number_of_detected_object:50,maxdepth:53,maxdeptherr:53,maximal:[24,50,52,53,54],measure_depth:53,mechan:19,messag:32,messprinzipi:6,messung:54,millimet:19,min_cluster_coverag:24,min_plausibility:25,minconf:53,mindepth:53,minimal:[24,25,52,53],mitsubishi:36,mod:24,model_toleranc:25,modelltoleranz:25,modul:[3,4,16,18,23,24,25,26,43,48,50,52,53,54],modus:[24,52],moglich:[24,53,54],monokalibrier:2,mustererkenn:18,nam:21,netzteil:0,netzwerkkonfiguration:21,netzwerkzugriff:57,neustart:27,norm:51,ntp:55,oat:34,objekt:[19,24,50],objektanzahl:50,objekterkenn:50,offset:18,only_highest_priority_grasps:50,opc:29,orientier:[50,54],out1:23,out1_mod:23,out2:23,out2_mod:23,paramet:[2,4,12,14,18,23,24,25,43,50,52,53,54],patchgross:24,perzentil:50,plausibilitat:25,point_cloud_enhancement:50,port:14,pos:18,posendat:1,posenformat:[30,32,33,38,39],posenreprasentation:32,posenschatz:54,position:[16,54],prazision:54,prefer_split:24,prioritat:50,problem:56,programmierschnittstell:42,projektion:19,projektor:[23,24,25,50],pruf:2,ptp:55,ptpcontrol:14,punktwolk:[50,53,59],qualitat:[50,53,54],quality:[50,53],quaternion:[31,32,34,35,36,37,38,39],racecom:32,random:19,rc_april_tag_detect:54,rc_boxpick:24,rc_camera:52,rc_collision_check:4,rc_hand_eye_calibration:18,rc_iocontrol:23,rc_itempick:24,rc_load_carri:25,rc_qr_code_detect:54,rc_silhouettematch:50,rc_stereomatching:53,rc_visard:[14,19,20,21,27],rechteck:24,rechteckerkenn:24,rectangl:24,reflektier:19,regel:52,region:[48,50],reinig:27,rektifizier:52,remove_calibration:18,reset_calibration:18,reset_default:[4,18,23,24,25,50,52,53,54],ressourc:42,rest:[16,40,50],restart:54,return_cod:53,rmse:24,roboception:20,robot:38,robot_mounted:18,roidb:48,rot:52,rotation:32,rotationsachs:18,rotationsmatrix:37,rotationsmatriz:37,rotationssymmetr:16,ruckgab:48,ruckgabecod:[4,12,16,24,25,26,48,50,54],ruckgabewert:[18,53],save_calibration:18,scan3dcontrol:14,schnittstell:[12,14,19,22,40,51,57],schritt:18,seg:53,segmentier:53,selbstkalibrier:2,sensormontag:18,servic:[2,4,12,16,18,23,24,25,26,43,48,50,52,53,54],serviceaufruf:53,servicedefinition:17,set_all_grasps:50,set_calibration:18,set_grasp:50,set_gripp:[4,16],set_load_carri:[25,26],set_pos:18,set_preferred_orientation:50,set_region_of_inter:[24,25,48],set_region_of_interest_2d:[25,48,50],set_sorting_strategi:[24,50],setz:[50,55],shot:53,sicherheitsabstand:4,sicherheitshinweis:49,silhouettematch:50,smooth:53,softwarelizenz:[21,27],softwaremodul:28,sortierstrategi:50,speich:2,spezifikation:[4,16,19,26,48],splitting:24,stand:4,standardparamet:14,start:[24,54],statemachin:32,static_sc:53,statisch:53,statuswert:[4,24,25,50,52,53,54],steckerbeleg:19,stereo:[19,24,25,50,53],stereokalibrier:2,stereokamera:[24,25,50],stereovision:5,stop:[24,54],stream:[14,17],stromanschluss:[0,19],stromversorg:19,struktur:[12,42],support:8,swagg:44,syst:45,szen:50,szenario:54,tag:54,tagdetect:54,tagerkenn:54,tauglich:50,tcp:[16,18,50],tcp_offset:18,tcp_rotation_axis:18,technisch:19,templat:[24,50],test:18,tief:56,tiefenbild:[53,59],timeout:53,transformation:32,translation:32,translationsvektor:37,transparent:19,transportlayercontrol:14,trigger_activation:52,trigger_sourc:52,triggeraktivier:52,triggerquell:52,typs:24,uber:[16,18,23,24,25,50,52,53],uberblick:13,ubersicht:[4,18,23,24,25,50,52,53],umrechn:[31,32,34,35,36,37,38,39],umwandl:[14,17],umwelt:19,umweltbeding:19,ungefahr:54,universal:38,unstetigkeitsfaktor:24,userspac:[46,57],veraltet:[4,24,25,50,52],verbesser:50,verbind:12,verfahr:24,verfugbar:[14,42],vergleich:54,verkabel:[0,19],verschied:54,version:27,verstarkungsfaktor:52,verwend:49,vision:[14,56],voll:19,voreinstell:21,vorher:27,warnung:50,wartung:27,wb_auto:52,wb_ratio_blu:52,wb_ratio_red:52,web:[16,50,59],wechselwirk:[24,25,26,48,50],weissabgleich:52,werksseit:21,wert:[24,53],wichtig:14,wiedererkenn:54,wiederherstell:27,wpr:31,xml:12,xyz:[31,32,34,35,36],yaskawa:39,zeit:55,zeitsynchronisier:55,zubehor:0,zugriff:59,zugriffskontroll:59,zulass:51,zurucksetz:21,zustand:[24,54]}}) \ No newline at end of file diff --git a/v24.04/de/silhouettematch.html b/v24.04/de/silhouettematch.html new file mode 100644 index 0000000..cfc98e5 --- /dev/null +++ b/v24.04/de/silhouettematch.html @@ -0,0 +1,3114 @@ + + + + + + + + + + + SilhouetteMatch — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    SilhouetteMatch

    +
    +

    Einführung

    +

    Das SilhouetteMatch-Modul ist ein optionales Modul, welches intern auf dem rc_visard NG läuft, und benötigt eine eigene Lizenz, welche erworben werden muss.

    +

    Das Modul erkennt Objekte, indem eine vordefinierte Silhouette („Template“) mit Kanten im Bild verglichen wird.

    +

    Das SilhouetteMatch Modul kann Objekte in zwei verschiedenen Szenarien erkennen:

    +
    +

    Mit kalibrierter Basisebene: Die Objekte befinden sich auf einer gemeinsamen Basisebene, die vor der Objekterkennung kalibriert werden muss, und die Objekte haben prägnante Kanten auf einer gemeinsamen Ebene, welche parallel zu der Basisebene ist.

    +

    Mit Objektebenenerkennung: Die Objekte können sich auf verschiedenen, vorab unbekannten Ebenen befinden, falls die Objekte eine planare Oberfläche haben und ihre Konturen gut in den Kamerabildern sichtbar sind (z.B. gestapelte flache Objekte).

    +
    +

    Templates für die Objekterkennung können erstellt werden, indem eine DXF Datei hochgeladen und die Objekthöhe angegeben wird. Die korrekte Skalierung und Einheit der Konturen wird aus der DXF Datei extrahiert. Falls die DXF Datei keine Einheit enthält, muss der Nutzer die korrekte Einheit angeben. Wenn die Außenkontur des Objekts in der DXF Datei geschlossen ist, wird automatisch ein 3D Kollisionsmodell erstellt, indem die Kontur auf die Objekthöhe extrudiert wird. Dieses Modell wird dann zur Kollisionsprüfung und 3D-Visualisierung verwendet. Das Hochladen der DXF Datei kann in der Web GUI über guilabel:+ Neues Template erstellen im Abschnitt SilhouetteMatch Templates und Greifpunkte auf der Module ‣ SilhouetteMatch oder Datenbank ‣ Templates Seite erfolgen.

    +

    Roboception bietet hierfür auch einen Template-Generierungsservice auf ihrer Website an, auf der der Benutzer CAD-Daten oder mit dem System aufgenommene Daten hochladen kann, um Templates generieren zu lassen.

    +

    Templates bestehen aus den prägnanten Kanten eines Objekts. Die Kanten des Templates werden mit den erkannten Kanten im linken und rechten Kamerabild abgeglichen, wobei die Größe der Objekte und deren Abstand zur Kamera mit einbezogen wird. Die Posen der erkannten Objekte werden zurückgegeben und können beispielsweise benutzt werden, um die Objekte zu greifen.

    +

    Das SilhouetteMatch-Modul bietet:

    +
      +
    • eine intuitiv gestaltete Bedienoberfläche für Inbetriebnahme, Konfiguration und Test auf der rc_visard NG Web GUI
    • +
    • eine REST-API-Schnittstelle und eine KUKA Ethernet KRL Schnittstelle
    • +
    • die Möglichkeit, sogenannte Regions of Interest (ROIs) zu definieren, um relevante Teilbereiche des Kamerabilds auszuwählen (siehe Setzen einer Region of Interest)
    • +
    • eine integrierte Load Carrier Erkennung (siehe LoadCarrier), um in Bin-Picking-Anwendungen („Griff in die Kiste“) Greifpunkte nur für Objekte in dem erkannten Load Carrier zu berechnen
    • +
    • die Speicherung von bis zu 50 Templates
    • +
    • die Definition von bis zu 50 Greifpunkten für jedes Template über eine interaktive Visualisierung in der Web GUI
    • +
    • eine Kollisionsprüfung zwischen Greifer und Load Carrier, der kalibrierten Basisebene, anderen erkannten Objekten, und/oder der Punktwolke
    • +
    • die Unterstützung von sowohl statisch montierten als auch robotergeführten Kameras. Optional kann es mit der Hand-Auge-Kalibrierung kombiniert werden, um Greifposen in einem benutzerdefinierten externen Koordinatensystem zu liefern
    • +
    • Auswahl einer Strategie zum Sortieren der erkannten Objekte und zurückgelieferten Greifpunkte
    • +
    • eine 3D Visualisierung des Detektionsergebnisses mit Greifpunkten und einer Greiferanimation in der Web GUI
    • +
    +
    +

    Taugliche Objekte

    +

    Das SilhouetteMatch-Modul ist für Objekte ausgelegt, die prägnante Kanten auf einer Ebene besitzen, welche parallel zu der Ebene ist, auf der die Objekte liegen. Das trifft beispielsweise auf flache, nicht-transparente Objekte zu, wie gefräste, lasergeschnittene oder wasserstrahlgeschnittene Teile. Komplexere Objekte können auch erkannt werden, solange sie prägnante Kanten auf einer Ebene besitzen, z.B. ein gedrucktes Muster auf einer ebenen Fläche.

    +

    Falls die Objekte nicht auf einer gemeinsamen Ebene liegen oder die Basisebene nicht vorab kalibriert werden kann, brauchen die Objekte eine planare Oberfläche und ihre Konturen müssen gut im linken und rechten Kamerabild sichtbar sein. Weiterhin müssen die Templates für diese Objekte eine geschlossene Außenkontur haben.

    +
    +
    +

    Taugliche Szene

    +

    Eine für das SilhouetteMatch-Modul taugliche Szene muss folgende Bedingungen erfüllen:

    +
      +
    • Die zu erkennenden Objekte müssen, wie oben beschrieben, tauglich für das SilhouetteMatch-Modul sein.
    • +
    • Nur Objekte, die zum selben Template gehören, dürfen gleichzeitig sichtbar sein (sortenrein). Falls auch andere Objekte sichtbar sind, muss eine passende Region of Interest (ROI) festgelegt werden.
    • +
    • Im Falle einer kalibrierten Basisebene: Die Verkippung der Basisebene zur Blickrichtung der Kamera darf 10 Grad nicht übersteigen.
    • +
    • Im Falle von verschiedenen oder unbekannten Basisebenen: Die Verkippung der planaren Oberfläche der Objekte zur Blickrichtung der Kamera darf 25 Grad nicht übersteigen.
    • +
    • Die Objekte sind weder teilweise noch komplett verdeckt.
    • +
    • Alle sichtbaren Objekte liegen richtig herum.
    • +
    • Die Objektkanten, welche abgeglichen werden sollen, sind sowohl im linken als auch im rechten Kamerabild zu sehen.
    • +
    +
    +
    +
    +

    Kalibrierung der Basisebene

    +

    Falls alle Objekte auf einer gemeinsamen Ebene liegen, die vorab bekannt ist, sollte diese Ebene kalibriert werden, bevor die Objekterkennung gestartet wird. Hierbei wird die Distanz und der Winkel der Ebene, auf welcher die Objekte liegen, gemessen und persistent auf dem rc_visard NG gespeichert.

    +

    Durch die Trennung der Kalibrierung der Basisebene von der eigentlichen Objekterkennung werden beispielsweise Szenarien ermöglicht, in denen die Basisebene zeitweise verdeckt ist. Darüber hinaus wird die Berechnungszeit der Objekterkennung für Szenarien verringert, in denen die Basisebene für eine gewisse Zeit fixiert ist – die Basisebene muss in diesem Fall nicht fortlaufend neu detektiert werden.

    +

    Die Kalibrierung der Basisebene kann mit drei unterschiedlichen Verfahren durchgeführt werden, auf die im Folgenden näher eingegangen wird:

    +
      +
    • AprilTag-basiert
    • +
    • Stereo-basiert
    • +
    • Manuell
    • +
    +

    Die Kalibrierung ist erfolgreich, solange der Normalenvektor der Basisebene höchstens 10 Grad gegen die Blickrichtung der Kamera verkippt ist. Eine erfolgreiche Kalibrierung wird persistent auf dem rc_visard NG gespeichert, bis sie entweder gelöscht wird oder eine neue Kalibrierung durchgeführt wird.

    +
    +

    Bemerkung

    +

    Um Datenschutzproblemen entgegenzuwirken, wird die Visualisierung der Kalibrierung der Basisebene nach einem Neustart des rc_visard NG verschwommen dargestellt.

    +
    +

    In Szenarien, in denen die Basisebene nicht direkt kalibriert werden kann, ist es auch möglich, zu einer zur Basisebene parallel liegenden Ebene zu kalibrieren. In diesem Fall kann der Parameter offset benutzt werden, um die geschätzte Ebene auf die eigentliche Basisebene zu verschieben. Der Parameter offset gibt die Distanz in Metern an, um welche die geschätzte Ebene in Richtung der Kamera verschoben wird.

    +

    In der REST-API ist eine Ebene durch eine Normale (normal) und einen Abstand (distance) definiert. normal ist ein normalisierter 3-Vektor, welcher die Normale der Ebene spezifiziert. Die Normale zeigt immer von der Kamera weg. distance repräsentiert den Abstand der Ebene von der Kamera in Richtung der Normale. normal und distance können auch als \(a\), \(b\), \(c\), bzw. \(d\) der Ebenengleichung interpretiert werden:

    +
    +\[ax + by + cz + d = 0\]
    +
    +

    AprilTag-basierte Kalibrierung der Basisebene

    +

    Die AprilTag-Erkennung (siehe TagDetect) wird benutzt, um AprilTags in der Szene zu finden und eine Ebene durch diese zu legen. Mindestens drei AprilTags müssen so auf der Basisebene platziert werden, dass sie im linken und rechten Kamerabild zu sehen sind. Die AprilTags sollten ein möglichst großes Dreieck aufspannen. Je größer das Dreieck ist, desto höher wird die Genauigkeit der Schätzung der Basisebene. Diese Methode sollte benutzt werden, wenn die Basisebene untexturiert und kein externer Projektor mit Zufallsmuster angeschlossen ist. Diese Kalibriermethode ist sowohl über die REST-API-Schnittstelle als auch über die rc_visard NG Web GUI verfügbar.

    +
    +
    +

    Stereo-basierte Kalibrierung der Basisebene

    +

    Die 3D-Punktwolke, welche vom Stereo-Matching-Modul berechnet wird, wird benutzt um eine Ebene in den 3D-Punkten zu finden. Die Region of Interest (ROI) sollte für diese Methode deshalb so gewählt werden, dass nur die relevante Basisebene eingeschlossen wird. Der Parameter plane_preference erlaubt es auszuwählen, ob die zur Kamera am nächsten gelegene oder die von der Kamera am weitesten entfernte Ebene als Basisebene benutzt wird. Die am nächsten gelegene Ebene kann in Szenarien ausgewählt werden, in denen die Basisebene vollständig von Objekten verdeckt wird oder für die Kalibrierung nicht erreichbar ist. Diese Methode sollte benutzt werden, wenn die Basisebene texturiert ist oder ein Projektor mit Zufallsmuster angeschlossen ist. Diese Kalibriermethode ist sowohl über die REST-API-Schnittstelle als auch über die rc_visard NG Web GUI verfügbar.

    +
    +
    +

    Manuelle Kalibrierung der Basisebene

    +

    Die Basisebene kann manuell gesetzt werden, falls die Parameter bekannt sind – beispielsweise von einer vorangegangenen Kalibrierung. Diese Kalibriermethode ist nur über die REST-API-Schnittstelle und nicht über die rc_visard NG Web GUI verfügbar.

    +
    +
    +
    +

    Setzen einer Region of Interest

    +

    Falls Objekte nur in einem Teil des Sichtfelds der Kamera erkannt werden sollen, kann eine 2D Region of Interest (ROI) gesetzt werden, wie in Region of Interest beschrieben wird.

    +
    +
    +

    Setzen von Greifpunkten

    +

    Um das SilhouetteMatch-Modul direkt in einer Roboteranwendung zu nutzen, können für jedes Template bis zu 50 Greifpunkte definiert werden. Ein Greifpunkt repräsentiert die gewünschte Position und Orientierung des Roboter-TCPs (Tool Center Point), mit der das Objekt gegriffen werden kann (siehe Abb. 28).

    +
    +_images/grasp_points_silm.svg +

    Abb. 28 Definition von Greifpunkten bezogen auf den Roboter-TCP

    +
    +

    Jeder Greifpunkt enthält eine id, die eindeutig über alle Greifpunkte eines Objekt-Templates sein muss, die ID des Templates (template_id), zu dem der Greifpunkt hinzugefügt wird, und die Greifpose (pose) im Koordinatensystem des Templates. Greifpunkte können über die REST-API-Schnittstelle, oder über die interaktive Visualisierung in der Web GUI definiert werden. Zudem kann einem Greifpunkt eine Priorität (von -2 für sehr niedrig bis 2 für sehr hoch) zugewiesen werden. Prioritäten können Roboteranwendungen vereinfachen, oder die Rechenzeit der Kollisionsprüfung verkürzen, wenn der Parameter only_highest_priority_grasp aktiviert ist. In diesem Fall endet die Kollisionsprüfung, wenn Greifpunkte mit der höchsten Priorität gefunden sind. Weiterhin können Greifpunkte unterschiedlichen Greifern zugewiesen werden, indem die ID des Greifers (gripper_id) spezifiziert wird. Dieser Greifer wird dann anstelle des Greifers, welcher im detect_object Service definiert ist, für die Kollisionsprüfung des zugehörigen Greifpunkts verwendet.

    +

    Wird ein Greifpunkt auf einem symmetrischen Objekt definiert, werden alle Greifpunkte, die zu diesem symmetrisch sind, automatisch im detect_object Service des SilhouetteMatch Moduls mit berücksichtigt. Symmetrische Greifpunkte zu einem gegebenen Greifpunkt können mittels des get_symmetric_grasps Services abgefragt werden und in der Web GUI visualisiert werden.

    +

    Benutzer können ebenfalls Replikationen eines Greifpunktes um eine selbst-definierte Achse definieren. Eine Replikation generiert mehrere Greifpunkte und sorgt dafür, dass Benutzer nicht zu viele Greifpunkte manuell setzen müssen. Der Ursprung der Replikation ist als Koordinatensystem im Objektkoordinatensystem definiert und die x-Achse dieses Koordinatensystems entspricht der Replikationsachse. Der Greifpunkt wird repliziert, indem er ausgehend von seiner ursprünglichen Pose um diese x-Achse gedreht wird. Die Replikation erfolgt in step_x_deg-Grad Schritten. Der Bereich wird durch die minimalen und maximalen Endpunkte min_x_deg und max_x_deg bestimmt. Der minimale (maximale) Endpunkt muss nicht-positiv (nicht-negativ) sein.

    +
    +

    Setzen von Greifpunkten in der Web GUI

    +

    Die rc_visard NG Web GUI bietet eine interaktive und intuitive Möglichkeit, Greifpunkte für Objekt-Templates zu setzen. Im ersten Schritt muss das Objekt-Template auf den rc_visard NG hochgeladen werden. Das kann über die Web GUI in einer beliebigen Kamerapipeline unter Module ‣ SilhouetteMatch erfolgen, indem im Abschnitt Templates und Greifpunkte auf + Neues Template hinzufügen geklickt wird, oder unter Datenbank ‣ Templates im Abschnitt SilhouetteMatch Templates und Greifpunkte. Wenn der Upload abgeschlossen ist, erscheint ein Fenster mit einer 3D-Visualisierung des Templates, in dem Greifpunkte hinzugefügt oder existierende Greifpunkte bearbeitet werden können. Dasselbe Fenster erscheint, wenn ein vorhandenes Template bearbeitet wird. Wenn das Template ein Kollisionsmodell oder ein Visualisierungsmodell enthält, wird dieses Modell ebenfalls angezeigt.

    +

    Dieses Fenster bietet zwei Möglichkeiten, um Greifpunkte zu setzen:

    +
      +
    1. Greifpunkte manuell hinzufügen: Durch Klicken auf das + Symbol wird ein neuer Greifpunkt im Ursprung des Templates angelegt. Diesem Greifpunkt kann ein eindeutiger Name gegeben werden, der seiner ID entspricht. Die gewünschte Pose des Greifpunkts im Koordinatensystem des Templates kann in den Feldern für Position und Roll/Pitch/Yaw eingegeben werden. Die Greifpunkte können frei platziert werden, auch außerhalb oder innerhalb des Templates, und werden mit ihrer Orientierung zur Überprüfung in der Visualisierung veranschaulicht.
    2. +
    3. Greifpunkte interaktiv hinzufügen: Greifpunkte können interaktiv zu einem Template hinzugefügt werden, indem zuerst auf den Button Greifpunkt hinzufügen oben rechts in der Visualisierung und anschließend auf den gewünschten Punkt auf dem Template geklickt wird. Wenn ein 3D-Modell angezeigt wird, wird der Greifpunkt an die Oberfläche des Modells angeheftet, andernfalls an die Template-Oberfläche. Die Orientierung des Greifpunkts entspricht einem rechtshändigen Koordinatensystem, sodass die z-Achse senkrecht auf der Template-Oberfläche steht und in das Template hinein gerichtet ist. Die Position und Orientierung des Greifpunkts im Koordinatensystem des Templates ist auf der rechten Seite angezeigt. Die Position und Orientierung des Greifpunkts kann auch interaktiv verändert werden. Für den Fall, dass An Oberfläche anheften in der Visualisierung deaktiviert ist (das ist der Standardwert), kann der Greifpunkt in allen drei Dimensionen frei verschoben und gedreht werden, indem in der Visualisierung auf Greifpunkt bewegen geklickt wird und der Greifpunkt dann entlang der Achse zur gewünschten Position verschoben wird. Die Orientierung des Greifpunkts kann ebenfalls interaktiv verändert werden, indem die Achse mit der Maus rotiert wird. Wenn An Oberfläche anheften nicht aktiv ist, kann der Greifpunkt nur auf der Objektoberfläche verschoben und rotiert werden.
    4. +
    +

    Benutzer können auch eine Greifpunktpriorität festlegen, indem sie den Schieberegler Priorität ändern. Ein dedizierter Greifer kann im Dropdown-Feld Greifer ausgewählt werden.

    +

    Durch Aktivieren des Kontrollkästchens Replizieren können Benutzer den Greifpunkt um eine benutzerdefinierte Achse replizieren. Die Replikationsachse und die generierten Greifpunkte werden visualisiert. Die Lage und Ausrichtung der Replikationsachse relativ zum Objektkoordinatensystem kann interaktiv angepasst werden, indem im Visualisierungsmenü auf Replikationsachse bewegen geklickt und die Achse an die gewünschte Position und Ausrichtung gezogen wird. Die Greifpunkte werden innerhalb des angegebenen Drehbereichs mit der ausgewählten Schrittgröße repliziert. Benutzer können eine Visualisierung die replizierten Greifpunkte durchlaufen, indem sie die Leiste unter Durchlaufen n repl. Greifpunkte im Abschnitt Ansichtsoptionen des Visualisierungsmenüs ziehen. Wenn für den Greifpunkt ein Greifer ausgewählt ist oder im Visualisierungsmenü ein Greifer ausgewählt wurde, wird der Greifer auch am aktuell ausgewählten Greifpunkt angezeigt.

    +

    Wenn das Template Symmetrien hat, können die Greifpunkte, die symmetrisch zum definierten Greifpunkt sind, zusammen mit ihren Replikationen (sofern definiert) durch Aktivieren von … Symmetrien im Abschnitt Ansichtsoptionen des Visualisierungsmenüs angezeigt werden. Visualisierungen der symmetrischen Greifpunkte können ebenfalls durchlaufen werden, indem die Leiste unter Durchlaufe n symm. Greifpunkte bewegt wird.

    +
    +
    +

    Setzen von Greifpunkten über die REST-API

    +

    Greifpunkte können über die REST-API-Schnittstelle mithilfe des set_grasp oder set_all_grasps Services gesetzt werden (siehe Interne Services). Ein Greifpunkt besteht aus der id, die eindeutig über alle Greifpunkte eines Objekt-Templates sein muss, der ID des Templates (template_id), zu dem der Greifpunkt hinzugefügt wird, und der Greifpose (pose). Die Pose ist im Koordinatensystem des Templates angegeben und besteht aus einer Position (position) in Metern und einer Orientierung (orientation) als Quaternion. Ein dedizierter Greifer kann durch Setzen des Feldes gripper_id angegeben werden. Die priority wird durch einen ganzzahligen Wert angegeben, der von -2 für sehr niedrig bis 2 für sehr hoch reicht. Der Replikationsursprung ist als eine Transformation im Koordinatensystem des Objekts definiert und die x-Achse der Transformation entspricht der Replikationsachse. Der Replikationsbereich wird durch die Felder min_x_deg und max_x_deg und die Schrittweite step_x_deg gesteuert.

    +
    +
    +
    +

    Setzen der bevorzugten TCP-Orientierung

    +

    Das SilhouetteMatch-Modul berechnet die Erreichbarkeit von Greifpunkten basierend auf der bevorzugten Orientierung des Greifers oder TCPs. Die bevorzugte Orientierung kann über den Service set_preferred_orientation oder über die SilhouetteMatch-Seite in der Web GUI gesetzt werden. Die resultierende Richtung der z-Achse des TCP wird genutzt, um Greifpunkte zu verwerfen, die der Greifer nicht erreichen kann. Weiterhin kann die bevorzugte Orientierung genutzt werden, um die erreichbaren Greifpunkte zu sortieren, indem die entsprechende Sortierstrategie ausgewählt wird.

    +

    Die bevorzugte TCP-Orientierung kann im Kamerakoordinatensystem oder im externen Koordinatensystem gesetzt werden, wenn eine Hand-Auge-Kalibrierung verfügbar ist. Wenn die bevorzugte TCP-Orientierung im externen Koordinatensystem definiert ist, und der Sensor am Roboter montiert ist, muss bei jedem Aufruf der Objekterkennung die aktuelle Roboterpose angegeben werden, damit die bevorzugte Orientierung zur Filterung und optional zur Sortierung der Greifpunkte auf den erkannten Objekten genutzt werden kann. Wenn keine bevorzugte TCP-Orientierung gesetzt wird, wird die Orientierung der linken Kamera als die bevorzugte TCP-Orientierung genutzt.

    +
    +
    +

    Setzen der Sortierstrategie

    +

    Die vom detect_object Service zurückgelieferten Objekte und Greifpunkte werden gemäß einer Sortierstrategie sortiert, die vom Nutzer gewählt werden kann. Folgende Sortierstrategien sind verfügbar und können über die Web GUI oder über den set_sorting_strategies Service gesetzt werden:

    +
      +
    • preferred_orientation: Objekte und Greifpunkte mit der geringsten Rotationsänderung zwischen ihrer Orientierung und der bevorzugten TCP-Orientierung werden zuerst zurückgeliefert.
    • +
    • direction: Objekte und Greifpunkte mit dem kleinsten Abstand entlang der gesetzten Richtung vector im angegebenen Referenzkoordinatensystem pose_frame werden zuerst zurückgeliefert.
    • +
    +

    Wenn keine Sortierstrategie gesetzt ist, oder die Standard-Sortierstrategie in der Web GUI ausgewählt ist, geschieht die Sortierung der Greifpunkte basierend auf einer Kombination von preferred_orientation und dem kleinsten Abstand entlang der z-Achse der bevorzugten TCP-Orientierung von der Kamera.

    +
    +
    +

    Objekterkennung

    +

    Um eine Objekterkennung durchzuführen, müssen im Allgemeinen die folgenden Serviceargumente an das SilhouetteMatch-Modul übergeben werden:

    +
      +
    • das Template des Objekts, welches in der Szene erkannt werden soll
    • +
    • das Koordinatensystem, in dem die Posen der detektierten Objekte zurückgegeben werden sollen (siehe Hand-Auge-Kalibrierung)
    • +
    +

    Optional können auch folgende Serviceargumente an das SilhouetteMatch-Modul übergeben werden:

    +
      +
    • Ein Flag object_plane_detection, welches bestimmt, ob die Oberflächenebene der Objekte für die Erkennung verwendet werden soll anstelle einer kalibrierten Basisebene.
    • +
    • ein Versatz offset, falls Objekte nicht direkt auf der Basisebene liegen, sondern auf einer zu dieser parallelen Ebene. Der Versatz bezeichnet die Distanz beider Ebenen in Richtung der Kamera. Wenn dieser Wert nicht gesetzt wird, wird ein Versatz von 0 angenommen. Der Versatz darf nicht gesetzt werden, wenn object_plane_detection true ist.
    • +
    • die ID des Load Carriers, der die zu detektierenden Objekte enthält
    • +
    • die ID der Region of Interest, innerhalb der nach dem Load Carrier gesucht wird, oder – falls kein Load Carrier angegeben ist – die Region of Interest, innerhalb der Objekte erkannt werden sollen. Wenn keine ROI gesetzt wird, werden Objekte im gesamten Kamerabild gesucht.
    • +
    • die aktuelle Roboterpose, wenn die Kamera am Roboter montiert ist und als Koordinatensystem external gewählt wurde, oder die bevorzugte TCP-Orientierung im externen Koordinatensystem angegeben ist
    • +
    • Informationen für die Kollisionsprüfung: Die ID des Greifers, um die Kollisionsprüfung zu aktivieren, und optional ein Greif-Offset, der die Vorgreifposition definiert. Details zur Kollisionsprüfung sind in CollisionCheck gegeben.
    • +
    +

    Wenn object_plane_detection nicht true ist, können Objekte erst nach einer erfolgreichen Kalibrierung der Basisebene erkannt werden. Es muss sichergestellt werden, dass sich Position und Orientierung der Basisebene zwischen Kalibrierung und Objekterkennung nicht ändern. Anderenfalls muss die Kalibrierung erneuert werden.

    +

    Wenn object_plane_detection auf true gesetzt ist, ist eine Kalibrierung der Basisebene nicht nötig und eine ggf. existierende Kalibrierung wird ignoriert. Während der Erkennung wird die Szene in planare Flächen unterteilt und das Matching der Templatekanten wird für jede dieser Ebenen durchgeführt, solange sie nicht mehr als 25° in Bezug auf die Sichtachse der Kamera verkippt ist, und solange ihre Größe ausreichend ist für das gewählte Template. Wenn ein Match gefunden wird, wird dessen Position und Orientierung durch Kanten im Kamerabild und durch die Punktwolke innerhalb der Außenkontur des Templates verfeinert. Aus diesem Grund muss die Außenkontur des Templates geschlossen und die Oberfläche des Objekts planar sein.

    +

    Im Ausprobieren-Abschnitt der Seite SilhouetteMatch der Web GUI kann die Objektdetektion ausprobiert werden. Verschiedene Bild-Streams können ausgewählt werden, um Zwischenergebnisse und die finalen Matches anzuzeigen (siehe Abb. 29).

    +
    +

    Das „Template“ Bild zeigt das zu erkennende Template in Rot mit den Greifpunkten (siehe Setzen von Greifpunkten) in Grün. Das Template wird verformt dargestellt, passend zu Abstand und Verkippung der kalibrierten Basisebene, oder - falls object_plane_detection auf true gesetzt war, der höchsten erkannten Ebene. Die entsprechende Ebene ist in Dunkelblau dargestellt.

    +

    Das „Zwischenergebnis“ Bild zeigt die Kanten im linken Bild, die für die Suche nach Matches verwendet wurden, in Hellblau. Die gewählte Region of Interest wird als petrolfarbenes Rechteck dargestellt. Eine blau schattierte Fläche auf der linken Seite markiert den Teil des linken Kamerabilds, welcher nicht mit dem rechten Kamerabild überlappt. In diesem Bereich können keine Objekte erkannt werden. Wenn die Objektebenenerkennung verwendet wurde (object_plane_detection ist true), zeigt dieses Bild auch die erkannten planaren Cluster in der Szene. Cluster, die nicht für das Matching verwendet wurden, weil sie zu klein oder zu stark geneigt sind, werden mit einem Streifenmuster dargestellt.

    +

    Das „Zwischenergebnis rechts“ Bild zeigt die Kanten im rechten Bild, die für die Suche nach Matches verwendet wurden, in Hellblau. Die gewählte Region of Interest wird als petrolfarbenes Rechteck dargestellt. Eine blau schattierte Fläche auf der rechten Seite markiert den Teil des rechten Kamerabilds, welcher nicht mit dem linken Kamerabild überlappt. In diesem Bereich können keine Objekte erkannt werden.

    +

    Das „Ergebnis“ Bild zeigt das Detektionsergebnis. Die Kanten, die zur Verfeinerung der Match Posen genutzt wurden, werden in hellem Blau und erkannte Objekte (instances) in Rot visualisiert. Blaue Punkte markieren jeweils den Ursprung der detektierten Objekte, wie im Template festgelegt. Kollisionsfreie Greifpunkte sind als grüne Punkte dargestellt, ungeprüfte Greifpunkte als gelbe Punkte, und kollidierende Greifpunkte werden als rote Punkte visualisiert.

    +
    +
    +_images/silhouetteMatchStreams.png +

    Abb. 29 „Template“, „Zwischenergebnis“ und „Ergebnis“ Bilder des SilhouetteMatch Moduls in der Web GUI für eine Detektion mit automatischer Objektebenenerkennung (object_plane_detection ist true)

    +
    +

    Die Posen der Objektursprünge werden im gewählten Koordinatensystem als Liste (instances) zurückgegeben. Falls die kalibrierte Basisebene für die Erkennung genutzt wurde (object_plane_detection nicht oder false gesetzt), wird die Orientierung der erkannten Objekte mit mit der Normalen der Basisebene ausgerichtet. Andernfalls ist die Orientierung der Objekte an der Normalen der Ebene ausgerichtet, die in die zugehörigen Objektpunkte in der 3D Punktwolke eingepasst wurde.

    +

    Wenn das ausgewählte Template auch Greifpunkte hat, dann wird zusätzlich zu den erkannten Objekten auch eine Liste von Greifpunkten (grasps) für alle erkannten Objekte zurückgegeben. Die Posen der Greifpunkte sind im gewünschten Koordinatensystem angegeben und die Liste ist gemäß der gewählten Sortierstrategie sortiert (siehe Setzen der Sortierstrategie). Die erkannten Objekte und die Greifpunkte können über ihre UUIDs einander zugeordnet werden.

    +

    Falls das Template eine kontinuierliche Rotationssymmetrie aufweist (z.B. zylindrische Objekte), besitzen alle Ergebnisposen die gleiche Orientierung. Weiterhin werden alle Symmetrien eines Greifpunkts auf Erreichbarkeit und Kollisionsfreiheit geprüft, und anschließend nur der jeweilige beste gemäß der gewählten Sortierstrategie zurückgeliefert.

    +

    Für Objekte mit einer diskreten Symmetrie (z.B. prismatische Objekte), werden alle kollisionsfreien Symmetrien jedes Greifpunkts, die entsprechend der gesetzten bevorzugten TCP-Orientierung erreichbar sind, zurückgeliefert, und gemäß der gewählten Sortierstrategie sortiert.

    +

    Die Detektionsergebnisse und Berechnungszeiten werden durch Laufzeitparameter beeinflusst, welche weiter unten aufgezählt und beschrieben werden. Unsachgemäße Parameterwerte können zu Zeitüberschreitungen im Detektionsprozess des SilhouetteMatch-Moduls führen.

    +
    +
    +

    Wechselwirkung mit anderen Modulen

    +

    Die folgenden auf dem rc_visard NG laufenden Module liefern Daten für das SilhouetteMatch-Modul oder haben Einfluss auf die Datenverarbeitung.

    +
    +

    Bemerkung

    +

    Jede Konfigurationsänderung dieser Module kann direkte Auswirkungen auf die Qualität oder das Leistungsverhalten des SilhouetteMatch-Moduls haben.

    +
    +
    +

    Stereokamera und Stereo-Matching

    +

    Das SilhouetteMatch-Modul verarbeitet intern die rektifizierten Bilder des Kamera-Moduls (rc_camera). Es sollte deshalb auf eine passende Belichtungszeit geachtet werden, um optimale Ergebnisse zu erhalten.

    +

    Für die Kalibrierung der Basisebene mit der Stereo-Methode, für die Load Carrier Erkennung, für die automatische Objektebenenerkennung und für die Kollisionsprüfung mit der Punktwolke wird das Disparitätsbild des Stereo-Matching-Moduls (rc_stereomatching) verarbeitet.

    +

    Für das Erkennen von Objekten mit einer kalibrierten Basisebene, ohne Load Carrier und ohne Kollisionsprüfung mit der Punktwolke sollte das Stereo-Matching-Modul nicht parallel zum SilhouetteMatch-Modul ausgeführt werden, da die Laufzeit der Objekterkennung sonst negativ beeinflusst wird.

    +

    Für beste Ergebnisse wird empfohlen, Glättung für Stereo-Matching zu aktivieren.

    +
    +
    +

    IOControl und Projektor-Kontrolle

    +

    Wenn der rc_visard NG in Verbindung mit einem externen Musterprojektor und dem Modul IOControl und Projektor-Kontrolle (rc_iocontrol) betrieben wird, sollte der Projektor für die stereobasierte Kalibrierung der Basisebene, für die automatische Objektebenenerkennung und für die Kollisionsprüfung mit der Punktwolke benutzt werden.

    +

    Das projizierte Muster darf während der Objektdetektion nicht im linken oder rechten Kamerabild sichtbar sein, da es den Detektionsvorgang behindert. Daher wird empfohlen, den Projektor an GPIO Out 1 anzuschließen und den Aufnahmemodus des Stereokamera-Moduls auf SingleFrameOut1 zu setzen (siehe Stereomatching-Parameter), damit bei jedem Aufnahme-Trigger ein Bild mit und ohne Projektormuster aufgenommen wird.

    +

    Alternativ kann der verwendete digitale Ausgang in den Betriebsmodus ExposureAlternateActive geschaltet werden (siehe Beschreibung der Laufzeitparameter).

    +

    In beiden Fällen sollte die Belichtungszeitregelung (exp_auto_mode) auf AdaptiveOut1 gesetzt werden, um die Belichtung beider Bilder zu optimieren (siehe Stereokamera-Parameter).

    +
    +
    +

    Hand-Auge-Kalibrierung

    +

    Wenn die Kamera zu einem Roboter kalibriert ist, kann das SilhouetteMatch-Modul die Ergebnisposen automatisch im Roboterkoordinatensystem liefern. Für die Services des SilhouetteMatch-Moduls kann das Referenzkoordinatensystem aller Posen über das Argument pose_frame angegeben werden.

    +

    Es kann zwischen den folgenden zwei Werten für pose_frame gewählt werden:

    +
      +
    1. Kamera-Koordinatensystem (camera): Alle Posen und Ebenenparameter werden im Kamera-Koordinatensystem angegeben.
    2. +
    3. Benutzerdefiniertes externes Koordinatensystem (external): Alle Posen und Ebenenparameter sind im sogenannten externen Koordinatensystem angegeben, welches vom Nutzer während der Hand-Auge-Kalibrierung gewählt wurde. In diesem Fall bezieht das SilhouetteMatch-Modul alle notwendigen Informationen über die Kameramontage und die kalibrierte Hand-Auge-Transformation automatisch vom internen Modul Hand-Auge-Kalibrierung. Für den Fall einer robotergeführten Kamera ist vom Nutzer zusätzlich die jeweils aktuelle Roboterpose robot_pose anzugeben.
    4. +
    +

    Zulässige Werte zur Angabe des Referenzkoordinatensystems sind camera und external. Andere Werte werden als ungültig zurückgewiesen.

    +
    +

    Bemerkung

    +

    Wurde keine Hand-Auge-Kalibrierung durchgeführt, muss als Referenzkoordinatensystem pose_frame immer camera angegeben werden.

    +
    +
    +

    Bemerkung

    +

    Wird die Hand-Auge-Kalibrierung nach einer Kalibrierung der Basisebene verändert, wird die Kalibrierung der Basisebene als ungültig markiert und muss erneuert werden.

    +
    +

    Für den Fall einer robotergeführten Kamera ist es abhängig von pose_frame, der bevorzugten TCP-Orientierung und der Sortierrichtung nötig, zusätzlich die aktuelle Roboterpose (robot_pose) zur Verfügung zu stellen:

    +
      +
    • Wenn external als pose_frame ausgewählt ist, ist die Angabe der Roboterpose obligatorisch.
    • +
    • Wenn die bevorzugte TCP-Orientierung in external definiert ist, ist die Angabe der Roboterpose obligatorisch.
    • +
    • Wenn die Sortierrichtung in external definiert ist, ist die Angabe der Roboterpose obligatorisch.
    • +
    • In allen anderen Fällen ist die Angabe der Roboterpose optional.
    • +
    +

    Wenn die aktuelle Roboterpose während der Kalibrierung der Basisebene angegeben wird, wird sie persistent auf dem rc_visard NG gespeichert. Falls für die Services get_base_plane_calibration oder detect_objects die dann aktuelle Roboterpose ebenfalls angegeben wird, wird die Basisebene automatisch zu der neuen Roboterpose transformiert. Das erlaubt dem Benutzer, die Roboterpose (und damit die Pose der Kamera) zwischen Kalibrierung der Basisebene und Objekterkennung zu verändern.

    +
    +

    Bemerkung

    +

    Eine Objekterkennung kann nur durchgeführt werden, wenn die Verkippung der Basisebene zur Sichtachse der Kamera ein 10-Grad-Limit nicht übersteigt.

    +
    +
    +
    +

    LoadCarrier

    +

    Das SilhouetteMatch Modul nutzt die Funktionalität zur Load Carrier Erkennung aus dem LoadCarrier Modul (rc_load_carrier) mit den Laufzeitparametern, die für dieses Modul festgelegt wurden. Wenn sich jedoch mehrere Load Carrier in der Szene befinden, die zu der angegebenen Load Carrier ID passen, wird nur einer davon zurückgeliefert. In diesem Fall sollte eine Region of Interest gesetzt werden, um sicherzustellen, dass immer derselbe Load Carrier für das SilhouetteMatch Modul verwendet wird.

    +
    +
    +

    CollisionCheck

    +

    Die Kollisionsprüfung kann für die Greifpunktberechnung des SilhouetteMatch-Moduls aktiviert werden, indem das collision_detection Argument an den detect_object Service übergeben wird. Es enthält die ID des benutzten Greifers und optional einen Greif-Offset. Der Greifer muss im GripperDB Modul definiert werden (siehe Erstellen eines Greifers) und Details über die Kollisionsprüfung werden in Integrierte Kollisionsprüfung in anderen Modulen gegeben. Zusätzlich wird auf Kollisionen zwischen dem Greifer und der kalibrierten Basisebene geprüft, wenn der Laufzeitparameter check_collisions_with_base_plane auf true gesetzt ist. Wenn das ausgewählte Template ein Kollisionsmodell enthält und der Laufzeitparameter check_collisions_with_matches true ist, wird außerdem auch auf Kollisionen zwischen dem Greifer und den anderen detektierten Objekten (nicht begrenzt auf die Anzahl max_number_of_detected_objects) geprüft, wobei das Objekt, auf dem sich der jeweilige Greifpunkt befindet, von der Prüfung ausgenommen ist.

    +

    Wenn der Laufzeitparameter check_collisions_with_point_cloud auf true gesetzt ist, werden auch Kollisionen zwischen dem Greifer und einer wasserdichten Version der Punktwolke geprüft. Wenn diese Funktionalität in Kombination mit Sauggreifern genutzt wird, muss sichergestellt werden, dass sich der TCP außerhalb der Greifergeometrie befindet, oder dass die Greifpunkte oberhalb der Objektoberfläche definiert sind. Andernfalls wird für jeden Greifpunkt eine Kollision zwischen Greifer und Punktwolke erkannt.

    +

    Wenn die Kollisionsprüfung aktiviert ist, werden nur kollisionsfreie Greifpunkte zurückgeliefert. Jedoch werden in der Ergebnis-Visualisierung oben auf der SilhouetteMatch-Seite der Web GUI kollidierende Greifpunkte als rote Punkte dargestellt. Die Objekte, die bei der Kollisionsprüfung betrachtet werden, werden auch mit roten Kanten visualisiert.

    +

    Die Laufzeitparameter des CollisionCheck-Moduls beeinflussen die Kollisionserkennung wie in CollisionCheck-Parameter beschrieben.

    +
    +
    +
    +

    Parameter

    +

    Das SilhouetteMatch-Modul wird in der REST-API als rc_silhouettematch bezeichnet und in der Web GUI unter Module ‣ SilhouetteMatch dargestellt. Der Benutzer kann die Parameter entweder dort oder über die REST-API-Schnittstelle ändern.

    +
    +

    Übersicht über die Parameter

    +

    Dieses Softwaremodul bietet folgende Laufzeitparameter:

    + + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Tab. 30 Laufzeitparameter des rc_silhouettematch-Moduls
    NameTypMin.Max.DefaultBeschreibung
    check_collisions_with_-base_planeboolfalsetruetrueGibt an, ob Kollisionen zwischen Greifer und der Basisebene geprüft werden
    check_collisions_with_matchesboolfalsetruetrueGibt an, ob Kollisionen zwischen Greifer und anderen Matches geprüft werden
    check_collisions_with_-point_cloudboolfalsetruefalseGibt an, ob Kollisionen zwischen Greifer und der Punktwolke geprüft werden
    edge_sensitivityfloat640.11.00.7Empfindlichkeit der Kantenerkennung
    match_max_distancefloat640.110.03.0Der maximale tolerierte Abstand zwischen dem Template und den detektierten Kanten im Bild in Pixeln
    match_percentilefloat640.71.00.8Der Anteil der Template-Pixel, die innerhalb der maximalen Matchingdistanz liegen müssen, um ein Objekt erfolgreich zu detektieren
    max_number_of_detected_objectsint3212010Maximale Anzahl der zu detektierenden Objekte
    only_highest_priority_graspsboolfalsetruefalseFalls aktiviert werden nur Greifpunkte der höchsten Priorität zurückgegeben.
    point_cloud_enhancementstring--OffArt der Verbesserung der Punktwolke mit der Basisebene: [Off, ReplaceBright]
    qualitystring--HighQuality: [Low, Medium, High]
    +
    +
    +

    Beschreibung der Laufzeitparameter

    +

    Die Laufzeitparameter werden zeilenweise auf der SilhouetteMatch-Seite in der Web GUI dargestellt. Im folgenden wird der Name des Parameters in der Web GUI in Klammern hinter dem eigentlichen Parameternamen angegeben. Die Parameter sind in derselben Reihenfolge wie in der Web GUI aufgelistet:

    +
    +

    max_number_of_detected_objects (Maximale Objektanzahl)

    +
    +
    +

    Dieser Parameter gibt an, wie viele Objekte maximal in der Szene erkannt werden sollen. Falls mehr als die angegebene Zahl an Objekten gefunden wurden, werden nur die am besten zur gewählten Sortierstrategie passenden Ergebnisse zurückgeliefert.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?max_number_of_detected_objects=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_silhouettematch/parameters?max_number_of_detected_objects=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    quality (Qualität)

    +
    +
    +

    Die Objekterkennung kann auf Bildern mit unterschiedlicher Auflösung durchgeführt werden: High (Hoch, volle Auflösung), Medium (Mittel, halbe Auflösung) oder Low (Niedrig, Viertel-Auflösung). Je niedriger die Auflösung ist, desto niedriger ist die Berechnungszeit der Objekterkennung, aber desto weniger Objektdetails sind erkennbar.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?quality=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_silhouettematch/parameters?quality=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    match_max_distance (Maximale Matchingdistanz)

    +
    +
    +

    Dieser Parameter gibt den maximal tolerierten Abstand zwischen dem Template und den detektierten Kanten im Bild in Pixeln an. Falls das Objekt durch das Template nicht exakt genug beschrieben wird, wird es möglicherweise nicht erkannt, wenn dieser Wert zu klein ist. Höhere Werte können jedoch im Fall von komplexen Szenen und bei ähnlichen Objekten zu Fehldetektionen führen, und auch die Berechnungszeit erhöhen.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?match_max_distance=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_silhouettematch/parameters?match_max_distance=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    match_percentile (Matching Perzentil)

    +
    +
    +

    Dieser Parameter kontrolliert, wie strikt der Detektionsprozess sein soll. Das Matching Perzentil gibt den Anteil der Template-Pixel an, die innerhalb der maximalen Matchingdistanz liegen müssen, um ein Objekt erfolgreich zu detektieren. Je höher der Wert, desto exakter muss ein Match sein, um als gültig angesehen zu werden.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?match_percentile=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_silhouettematch/parameters?match_percentile=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    edge_sensitivity (Kantenempfindlichkeit)

    +
    +
    +

    Der Parameter beeinflusst, wie viele Kanten im linken und rechten Kamerabild gefunden werden. Umso größer dieser Parameter gewählt wird, umso mehr Kanten werden für die Erkennung benutzt. Eine große Anzahl von Kanten im Bild kann die Erkennung verlangsamen. Es muss sichergestellt werden, dass die Kanten der zu erkennenden Objekte sowohl im linken als auch im rechten Kamerabild detektiert werden.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?edge_sensitivity=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_silhouettematch/parameters?edge_sensitivity=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    only_highest_priority_grasps (Nur Greifpunkte höchster Priorität)

    +
    +

    Wenn dieser Parameter auf true gesetzt ist, werden ausschließlich Greifpunkte der höchsten Priorität zurückgegeben. Sofern die Kollisionsprüfung aktiviert ist, werden ausschließlich kollisionsfreie Greifpunkt der höchstmöglichen Priorität zurückgegeben. Dadurch kann Rechenzeit gespart und die Anzahl der applikationsseitig zu verarbeitenden Greifpunkte reduziert werden.

    +

    Ohne Kollisionsprüfung werden nur Greifpunkt der höchsten Priorität zurückgegeben.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?only_highest_priority_grasps=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_silhouettematch/parameters?only_highest_priority_grasps=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    check_collisions_with_base_plane (Kollisionsprüfung mit Basisebene)

    +
    +
    +

    Wenn dieser Parameter auf true gesetzt ist und die Kollisionsprüfung durch Übergabe eines Greifers an den detect_object Service aktiviert ist, werden alle Greifpunkte auf Kollisionen zwischen dem Greifer und der kalibrierten Basisebene geprüft. Nur Greifpunkte, bei denen der Greifer nicht in Kollision mit der Basisebene wäre, werden zurückgeliefert.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?check_collisions_with_base_plane=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_silhouettematch/parameters?check_collisions_with_base_plane=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    check_collisions_with_matches (Kollisionsprüfung mit Matches)

    +
    +
    +

    Wenn dieser Parameter auf true gesetzt ist und die Kollisionsprüfung durch Übergabe eines Greifers an den detect_object Service aktiviert ist, werden alle Greifpunkte auf Kollisionen zwischen dem Greifer und den anderen detektierten Objekten (nicht begrenzt auf die Anzahl max_number_of_detected_objects) geprüft. Nur Greifpunkte, bei denen der Greifer nicht in Kollision mit anderen detektierten Objekten wäre, werden zurückgeliefert.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?check_collisions_with_matches=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_silhouettematch/parameters?check_collisions_with_matches=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    check_collisions_with_point_cloud (Kollisionsprüfung mit Punktwolke)

    +
    +
    +

    Wenn dieser Parameter auf true gesetzt ist und die Kollisionsprüfung durch Übergabe eines Greifers an den detect_object Service aktiviert ist, werden alle Greifpunkte auf Kollisionen zwischen dem Greifer und einer wasserdichten Version der Punktwolke geprüft. Nur Greifpunkte, bei denen der Greifer nicht in Kollision mit dieser Punktwolke wäre, werden zurückgeliefert.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?check_collisions_with_point_cloud=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_silhouettematch/parameters?check_collisions_with_point_cloud=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    point_cloud_enhancement (Verbesserung mit Basisebene)

    +
    +
    +

    Dieser Parameter wird nur beachtet, wenn check_collisions_with_point_cloud auf true gesetzt ist und die Detektion ohne Objektebenenerkennung (object_plane_detection ist false) ausgelöst wurde. Standardmäßig ist point_cloud_enhancement auf Off (Aus) gesetzt. Wenn point_cloud_enhancement auf ReplaceBright (Helle Bildpunkte ersetzen) gesetzt wird, wird die kalibrierte Basisebene verwendet, um die Punktwolke für die Kollisionsprüfung zu verbessern. Dazu werden Punkte, die zu hellen Pixeln im Bild oder in der gewählten 2D Region of Interest gehören, auf den Tiefenwert der kalibrierten Basisebene gesetzt. Dieser Parameter sollte genutzt werden, wenn dunkle Objekten auf texturlosem, hellem Untergrund liegen, z.B. auf einem Lichttisch.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?point_cloud_enhancement=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_silhouettematch/parameters?point_cloud_enhancement=<value>
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    Statuswerte

    +

    Dieses Modul meldet folgende Statuswerte.

    + + ++++ + + + + + + + + + + + + + + + + + + + +
    Tab. 31 Statuswerte des rc_silhouettematch-Moduls
    NameBeschreibung
    data_acquisition_timeZeit in Sekunden, für die beim letzten Aufruf auf Bilddaten gewartet werden musste
    last_timestamp_processedZeitstempel des letzten verarbeiteten Bilddatensatzes
    load_carrier_detection_timeBerechnungszeit für die letzte Load Carrier Detektion in Sekunden
    ``processing_time`Berechnungszeit für die letzte Detektion (einschließlich Load Carrier Detektion) in Sekunden
    +
    +
    +

    Services

    +

    Die angebotenen Services des rc_silhouettematch-Moduls können mithilfe der REST-API-Schnittstelle oder der rc_visard NG Web GUI ausprobiert und getestet werden.

    +

    Das SilhouetteMatch-Modul bietet folgende Services.

    +
    +

    detect_object

    +
    +

    führt eine Objekterkennung durch, wie in Objekterkennung beschrieben. Der Service gibt die Posen aller gefundenen Objektinstanzen zurück.

    +

    Details

    +
    +

    Das Zeitverhalten dieses Services garantiert, dass nur Bilddaten zur Erkennung benutzt werden, welche nach dem Anfragezeitpunkt generiert wurden.

    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/services/detect_object
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/detect_object
    +
    +
    +
    +
    +
    + +
    +

    Obligatorische Serviceargumente:

    +
    +

    object_id in object_to_detect: ID des Templates, welches erkannt werden soll.

    +

    pose_frame: siehe Hand-Auge-Kalibrierung.

    +
    +

    Potentiell obligatorische Serviceargumente:

    +
    +
    robot_pose: siehe Hand-Auge-Kalibrierung.
    +

    Optionale Serviceargumente:

    +
    +

    object_plane_detection: false wenn Objekte auf einer kalibrierten Basisebene liegen, true wenn die Objekte planare Oberflächen haben und die Basisebene unbekannt ist oder die Objekte auf mehreren verschiedenen Ebenen liegen, z.B. auf Stapeln.

    +

    offset: Versatz in Metern, um welche die Basisebene in Richtung der Kamera verschoben werden soll.

    +

    load_carrier_id: ID des Load Carriers, welcher die zu erkennenden Objekte enthält.

    +

    collision_detection: siehe Integrierte Kollisionsprüfung in anderen Modulen

    +
    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "collision_detection": {
    +      "gripper_id": "string",
    +      "pre_grasp_offset": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      }
    +    },
    +    "load_carrier_id": "string",
    +    "object_plane_detection": "bool",
    +    "object_to_detect": {
    +      "object_id": "string",
    +      "region_of_interest_2d_id": "string"
    +    },
    +    "offset": "float64",
    +    "pose_frame": "string",
    +    "robot_pose": {
    +      "orientation": {
    +        "w": "float64",
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "position": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      }
    +    }
    +  }
    +}
    +
    +
    +
    +
    +

    Die maximale Anzahl der zurückgegebenen Instanzen kann über den max_number_of_detected_objects-Parameter kontrolliert werden.

    +

    object_id: ID des erkannten Templates.

    +

    instances: Liste der erkannten Objektinstanzen, sortiert gemäß der gewählten Sortierstrategie.

    +

    grasps: Liste von Greifpunkten auf den erkannten Objekten. Die Greifpunkte sind gemäß der gewählten Sortierstrategie sortiert. Die instance_uuid gibt eine Referenz auf das detektierte Objekt in instances an, zu dem dieser Greifpunkt gehört. Die Liste der Greifpunkte wird auf die 100 besten Greifpunkte gekürzt, falls mehr erreichbare Greifpunkte gefunden werden. Jeder Greifpunkt enthält ein Flag collision_checked und das Feld gripper_id (siehe Integrierte Kollisionsprüfung in anderen Modulen).

    +

    load_carriers: Liste der erkannten Load Carrier (Behälter).

    +

    timestamp: Zeitstempel des Bildes, das für die Erkennung benutzt wurde.

    +

    return_code: enthält mögliche Warnungen oder Fehlercodes und Nachrichten.

    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "detect_object",
    +  "response": {
    +    "grasps": [
    +      {
    +        "collision_checked": "bool",
    +        "gripper_id": "string",
    +        "id": "string",
    +        "instance_uuid": "string",
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "pose_frame": "string",
    +        "priority": "int8",
    +        "timestamp": {
    +          "nsec": "int32",
    +          "sec": "int32"
    +        },
    +        "uuid": "string"
    +      }
    +    ],
    +    "instances": [
    +      {
    +        "grasp_uuids": [
    +          "string"
    +        ],
    +        "id": "string",
    +        "object_id": "string",
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "pose_frame": "string",
    +        "timestamp": {
    +          "nsec": "int32",
    +          "sec": "int32"
    +        },
    +        "uuid": "string"
    +      }
    +    ],
    +    "load_carriers": [
    +      {
    +        "height_open_side": "float64",
    +        "id": "string",
    +        "inner_dimensions": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "outer_dimensions": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "overfilled": "bool",
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "pose_frame": "string",
    +        "rim_ledge": {
    +          "x": "float64",
    +          "y": "float64"
    +        },
    +        "rim_step_height": "float64",
    +        "rim_thickness": {
    +          "x": "float64",
    +          "y": "float64"
    +        },
    +        "type": "string"
    +      }
    +    ],
    +    "object_id": "string",
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    },
    +    "timestamp": {
    +      "nsec": "int32",
    +      "sec": "int32"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    calibrate_base_plane

    +
    +

    führt die Kalibrierung der Basisebene durch, wie in Kalibrierung der Basisebene beschrieben.

    +

    Details

    +
    +

    Eine erfolgreiche Kalibrierung der Basisebene wird persistent auf dem rc_visard NG gespeichert und vom Service zurückgegeben. Die Kalibrierung ist dauerhaft – auch über Firmware-Updates und -Wiederherstellungen hinweg – gespeichert.

    +

    Das Zeitverhalten dieses Services garantiert, dass nur Bilddaten zur Erkennung benutzt werden, welche nach dem Anfragezeitpunkt generiert wurden.

    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/services/calibrate_base_plane
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/calibrate_base_plane
    +
    +
    +
    +
    +
    + +
    +

    Obligatorische Serviceargumente:

    +
    +

    plane_estimation_method: Methode der Kalibrierung der Basisebene. Gültige Werte sind STEREO, APRILTAG, MANUAL.

    +

    pose_frame: siehe Hand-Auge-Kalibrierung.

    +
    +

    Potentiell obligatorische Serviceargumente:

    +
    +

    plane wenn für plane_estimation_method MANUAL gewählt ist: Die Ebene, welche als Basisebene gesetzt wird.

    +

    robot_pose: siehe Hand-Auge-Kalibrierung.

    +

    region_of_interest_2d_id: ID der Region of Interest für die Kalibrierung der Basisebene.

    +
    +

    Optionale Serviceargumente:

    +
    +

    offset: Versatz in Metern, um welchen die geschätzte Ebene in Richtung der Kamera verschoben wird.

    +

    plane_preference in stereo: Ob die der Kamera am nächsten (CLOSEST) gelegene oder die am weitesten entfernte (FARTHEST) Ebene als Basisebene benutzt wird. Diese Option kann nur gesetzt werden, falls plane_estimation_method auf STEREO gesetzt ist. Valide Werte sind CLOSEST und FARTHEST. Falls der Wert nicht gesetzt ist, wird FARTHEST verwendet.

    +
    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "offset": "float64",
    +    "plane": {
    +      "distance": "float64",
    +      "normal": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      }
    +    },
    +    "plane_estimation_method": "string",
    +    "pose_frame": "string",
    +    "region_of_interest_2d_id": "string",
    +    "robot_pose": {
    +      "orientation": {
    +        "w": "float64",
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "position": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      }
    +    },
    +    "stereo": {
    +      "plane_preference": "string"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +

    plane: kalibrierte Basisebene.

    +

    timestamp: Zeitstempel des Bildes, das für die Kalibrierung benutzt wurde.

    +

    return_code: enthält mögliche Warnungen oder Fehlercodes und Nachrichten.

    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "calibrate_base_plane",
    +  "response": {
    +    "plane": {
    +      "distance": "float64",
    +      "normal": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "pose_frame": "string"
    +    },
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    },
    +    "timestamp": {
    +      "nsec": "int32",
    +      "sec": "int32"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    get_base_plane_calibration

    +
    +

    gibt die derzeitige Kalibrierung der Basisebene zurück.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/services/get_base_plane_calibration
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/get_base_plane_calibration
    +
    +
    +
    +
    +
    + +
    +

    Obligatorische Serviceargumente:

    +
    +
    pose_frame: siehe Hand-Auge-Kalibrierung.
    +

    Potentiell obligatorische Serviceargumente:

    +
    +
    robot_pose: siehe Hand-Auge-Kalibrierung.
    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "pose_frame": "string",
    +    "robot_pose": {
    +      "orientation": {
    +        "w": "float64",
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "position": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      }
    +    }
    +  }
    +}
    +
    +
    +
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "get_base_plane_calibration",
    +  "response": {
    +    "plane": {
    +      "distance": "float64",
    +      "normal": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "pose_frame": "string"
    +    },
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    delete_base_plane_calibration

    +
    +

    löscht die derzeitige Kalibrierung der Basisebene.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/services/delete_base_plane_calibration
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/delete_base_plane_calibration
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "delete_base_plane_calibration",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    set_preferred_orientation

    +
    +

    speichert die bevorzugte TCP-Orientierung zum Berechnen der Erreichbarkeit der Greifpunkte, die zur Filterung und optional zur Sortierung der vom detect_object Service zurückgelieferten Greifpunkte verwendet wird (siehe Setzen der bevorzugten TCP-Orientierung).

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/services/set_preferred_orientation
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/set_preferred_orientation
    +
    +
    +
    +
    +
    + +
    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "orientation": {
    +      "w": "float64",
    +      "x": "float64",
    +      "y": "float64",
    +      "z": "float64"
    +    },
    +    "pose_frame": "string"
    +  }
    +}
    +
    +
    +
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "set_preferred_orientation",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    get_preferred_orientation

    +
    +

    gibt die bevorzugte TCP-Orientierung zurück, die für die Filterung und optional zur Sortierung der vom detect_object Service zurückgelieferten Greifpunkte verwendet wird (siehe Setzen der bevorzugten TCP-Orientierung).

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/services/get_preferred_orientation
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/get_preferred_orientation
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "get_preferred_orientation",
    +  "response": {
    +    "orientation": {
    +      "w": "float64",
    +      "x": "float64",
    +      "y": "float64",
    +      "z": "float64"
    +    },
    +    "pose_frame": "string",
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    set_sorting_strategies

    +
    +

    speichert die gewählte Strategie zur Sortierung der erkannten Objekte und Greifpunkte, die vom detect_object Service zurückgeliefert werden (siehe Objekterkennung).

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/services/set_sorting_strategies
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/set_sorting_strategies
    +
    +
    +
    +
    +
    + +
    +

    Nur eine Sortierstrategie darf einen Gewichtswert weight größer als 0 haben. Wenn alle Werte für weight auf 0 gesetzt sind, wird die Standardsortierstrategie verwendet.

    +

    Wenn der Wert weight für direction gesetzt ist, muss vector den Richtungsvektor enthalten und pose_frame auf camera oder external gesetzt sein.

    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "direction": {
    +      "pose_frame": "string",
    +      "vector": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "weight": "float64"
    +    },
    +    "preferred_orientation": {
    +      "weight": "float64"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "set_sorting_strategies",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    get_sorting_strategies

    +
    +

    gibt die gewählte Sortierstrategie zurück, die zur Sortierung der vom detect_object Service zurückgelieferten Objekte und Greifpunkte verwendet wird (siehe Objekterkennung).

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/services/get_sorting_strategies
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/get_sorting_strategies
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Wenn alle Werte für weight 0 sind, wird die Standardsortierstrategie verwendet.

    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "get_sorting_strategies",
    +  "response": {
    +    "direction": {
    +      "pose_frame": "string",
    +      "vector": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "weight": "float64"
    +    },
    +    "preferred_orientation": {
    +      "weight": "float64"
    +    },
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    reset_defaults

    +
    +

    stellt die Werkseinstellungen der Parameter und die bevorzugte TCP-Orientierung sowie die Sortierstrategie dieses Moduls wieder her und wendet sie an („factory reset“). Dies betrifft nicht die konfigurierten Templates und die Kalibrierung der Basisebene.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/services/reset_defaults
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/reset_defaults
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "reset_defaults",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    set_region_of_interest_2d (veraltet)

    +
    +

    speichert eine 2D Region of Interest auf dem rc_visard NG.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie stattdessen set_region_of_interest_2d in rc_roi_db.
    +
    +
    PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/set_region_of_interest_2d
    +
    +
    +
    +
    +
    +
    +
    +
    +

    get_regions_of_interest_2d (veraltet)

    +
    +

    gibt die mit region_of_interest_2d_ids spezifizierten, gespeicherten 2D Regions of Interest zurück.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie stattdessen get_regions_of_interest_2d in rc_roi_db.
    +
    +
    PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/get_regions_of_interest_2d
    +
    +
    +
    +
    +
    +
    +
    +
    +

    delete_regions_of_interest_2d (veraltet)

    +
    +

    löscht die mit region_of_interest_2d_ids spezifizierten, gespeicherten 2D Regions of Interest.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +Dieser Service ist in API Version 2 nicht verfügbar. Nutzen Sie stattdessen delete_regions_of_interest_2d in rc_roi_db.
    +
    +
    PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/delete_regions_of_interest_2d
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    Interne Services

    +

    Die folgenden Services für die Konfiguration von Greifpunkten können sich in Zukunft ohne weitere Ankündigung ändern. Es wird empfohlen, das Setzen, Abrufen und Löschen von Greifpunkten über die Web GUI vorzunehmen.

    +
    +

    set_grasp

    +
    +

    speichert einen Greifpunkt für das angegebene Template auf dem rc_visard NG. Alle Greifpunkte sind dauerhaft gespeichert, auch über Firmware-Updates und -Wiederherstellungen hinweg.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/services/set_grasp
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/set_grasp
    +
    +
    +
    +
    +
    + +
    +

    Die Definition des Typs grasp wird in Setzen von Greifpunkten beschrieben.

    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "grasp": {
    +      "gripper_id": "string",
    +      "id": "string",
    +      "pose": {
    +        "orientation": {
    +          "w": "float64",
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "position": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        }
    +      },
    +      "priority": "int8",
    +      "replication": {
    +        "max_x_deg": "float64",
    +        "min_x_deg": "float64",
    +        "origin": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "step_x_deg": "float64"
    +      },
    +      "template_id": "string"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "set_grasp",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    set_all_grasps

    +
    +

    Ersetzt die gesamte Liste von Greifpunkten auf dem rc_visard NG für das angegebene Template.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/services/set_all_grasps
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/set_all_grasps
    +
    +
    +
    +
    +
    + +
    +

    Die Definition des Typs grasp wird in Setzen von Greifpunkten beschrieben.

    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "grasps": [
    +      {
    +        "gripper_id": "string",
    +        "id": "string",
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "priority": "int8",
    +        "replication": {
    +          "max_x_deg": "float64",
    +          "min_x_deg": "float64",
    +          "origin": {
    +            "orientation": {
    +              "w": "float64",
    +              "x": "float64",
    +              "y": "float64",
    +              "z": "float64"
    +            },
    +            "position": {
    +              "x": "float64",
    +              "y": "float64",
    +              "z": "float64"
    +            }
    +          },
    +          "step_x_deg": "float64"
    +        },
    +        "template_id": "string"
    +      }
    +    ],
    +    "template_id": "string"
    +  }
    +}
    +
    +
    +
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "set_all_grasps",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    get_grasps

    +
    +

    gibt alle definierten Greifpunkte mit den angegebenen IDs (grasp_ids) zurück, die zu den Templates mit den angegebenen template_ids gehören.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/services/get_grasps
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/get_grasps
    +
    +
    +
    +
    +
    + +
    +

    Wenn keine grasp_ids angegeben werden, werden alle Greifpunkte zu den angegebenen template_ids zurückgeliefert. Wenn keine template_ids angegeben werden, werden alle Greifpunkte mit den geforderten grasp_ids zurückgeliefert. Wenn gar keine IDs angegeben werden, werden alle gespeicherten Greifpunkte zurückgeliefert.

    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "grasp_ids": [
    +      "string"
    +    ],
    +    "template_ids": [
    +      "string"
    +    ]
    +  }
    +}
    +
    +
    +
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "get_grasps",
    +  "response": {
    +    "grasps": [
    +      {
    +        "gripper_id": "string",
    +        "id": "string",
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "priority": "int8",
    +        "replication": {
    +          "max_x_deg": "float64",
    +          "min_x_deg": "float64",
    +          "origin": {
    +            "orientation": {
    +              "w": "float64",
    +              "x": "float64",
    +              "y": "float64",
    +              "z": "float64"
    +            },
    +            "position": {
    +              "x": "float64",
    +              "y": "float64",
    +              "z": "float64"
    +            }
    +          },
    +          "step_x_deg": "float64"
    +        },
    +        "template_id": "string"
    +      }
    +    ],
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    delete_grasps

    +
    +

    löscht alle Greifpunkte mit den angegebenen grasp_ids, die zu den Templates mit den angegebenen template_ids gehören.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/services/delete_grasps
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/delete_grasps
    +
    +
    +
    +
    +
    + +
    +

    Wenn keine grasp_ids angegeben werden, werden alle Greifpunkte gelöscht, die zu den Templates mit den angegebenen template_ids gehören. Die Liste template_ids darf nicht leer sein.

    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "grasp_ids": [
    +      "string"
    +    ],
    +    "template_ids": [
    +      "string"
    +    ]
    +  }
    +}
    +
    +
    +
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "delete_grasps",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    get_symmetric_grasps

    +
    +

    gibt alle Greifpunkte zurück, die symmetrisch zum angegebenen Greifpunkt sind.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/services/get_symmetric_grasps
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/get_symmetric_grasps
    +
    +
    +
    +
    +
    + +
    +

    Die Definition des Typs grasp wird in Setzen von Greifpunkten beschrieben.

    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "grasp": {
    +      "pose": {
    +        "orientation": {
    +          "w": "float64",
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "position": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        }
    +      },
    +      "replication": {
    +        "max_x_deg": "float64",
    +        "min_x_deg": "float64",
    +        "origin": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "step_x_deg": "float64"
    +      },
    +      "template_id": "string"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +

    Der erste Greifpunkt in der Rückgabeliste ist derselbe, der dem Service übergeben wurde. Wenn das Template keine exakte Symmetrie hat, wird nur der übergebene Greifpunkt zurückgeliefert. Wenn das Template eine kontinuierliche Symmetrie hat (z.B. ein zylindrisches Objekt), werden nur 12 gleichverteilte Greifpunkte zurückgeliefert.

    +

    Die Definition des Typs grasp wird in Setzen von Greifpunkten beschrieben.

    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "get_symmetric_grasps",
    +  "response": {
    +    "grasps": [
    +      {
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "replication": {
    +          "max_x_deg": "float64",
    +          "min_x_deg": "float64",
    +          "origin": {
    +            "orientation": {
    +              "w": "float64",
    +              "x": "float64",
    +              "y": "float64",
    +              "z": "float64"
    +            },
    +            "position": {
    +              "x": "float64",
    +              "y": "float64",
    +              "z": "float64"
    +            }
    +          },
    +          "step_x_deg": "float64"
    +        },
    +        "template_id": "string"
    +      }
    +    ],
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    Rückgabecodes

    +

    Zusätzlich zur eigentlichen Serviceantwort gibt jeder Service einen sogenannten return_code bestehend aus einem Integer-Wert und einer optionalen Textnachricht zurück. Erfolgreiche Service-Anfragen werden mit einem Wert von 0 quittiert. Positive Werte bedeuten, dass die Service-Anfrage zwar erfolgreich bearbeitet wurde, aber zusätzliche Informationen zur Verfügung stehen. Negative Werte bedeuten, dass Fehler aufgetreten sind.

    + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Tab. 32 Rückgabecodes und Warnungen der Services des SilhouetteMatch-Moduls
    CodeBeschreibung
    0Erfolgreich
    -1Ungültige(s) Argument(e)
    -3Ein interner Timeout ist aufgetreten, beispielsweise während der Objekterkennung.
    -4Die maximal erlaubte Zeitspanne für die interne Akquise der Bilddaten wurde überschritten.
    -7Daten konnten nicht in den persistenten Speicher geschrieben oder vom persistenten Speicher gelesen werden.
    -8Das Modul befindet sich in einem Zustand, in welchem dieser Service nicht aufgerufen werden kann. Beispielsweise kann detect_object nicht aufgerufen werden, solange keine Kalibrierung der Basisebene durchgeführt wurde.
    -10Das neue Element konnte nicht hinzugefügt werden, da die maximal speicherbare Anzahl an ROIs oder Templates überschritten wurde.
    -100Ein interner Fehler ist aufgetreten.
    -101Die Erkennung der Basisebene schlug fehl.
    -102Die Hand-Auge-Kalibrierung hat sich seit der letzten Kalibrierung der Basisebene verändert.
    -104Die Verkippung zwischen der Basisebene und der Sichtachse der Kamera überschreitet das 10-Grad-Limit.
    10Die maximale Anzahl an ROIs oder Templates wurde erreicht.
    11Ein bestehendes Element wurde überschrieben.
    100Die angefragten Load Carrier wurden in der Szene nicht gefunden.
    101Keiner der Greifpunkte ist erreichbar.
    102Der detektierte Load Carrier ist leer.
    103Alle berechneten Greifpunkte sind in Kollision.
    107Die Basisebene wurde nicht zur aktuellen Kamerapose transformiert, z.B. weil keine Roboterpose während der Kalibrierung der Basisebene angegeben wurde.
    108Das Template ist überholt.
    109Die Ebene für die Objekterkennung passt nicht zum Load Carrier, z.B. liegen die Objekte unterhalb des Load Carrier Bodens.
    111Die Pose des Detektionsergebnisses konnte nicht mit der Punktwolke verfeinert werden, da die Außenkontur des Templates nicht geschlossen ist.
    151Das Objekt-Template hat eine kontinuierliche Symmetrie.
    999Zusätzliche Hinweise für die Anwendungsentwicklung
    +
    +
    +

    Template API

    +

    Für den Upload, Download, das Auflisten und Löschen von Templates werden spezielle REST-API-Endpunkte zur Verfügung gestellt. Templates können auch über die Web GUI hoch- und runtergeladen werden. Die Templates beinhalten die Greifpunkte, falls Greifpunkte konfiguriert wurden. Bis zu 50 Templates können gleichzeitig auf dem rc_visard NG gespeichert werden.

    +
    +
    +GET /templates/rc_silhouettematch
    +

    listet alle rc_silhouettematch-Templates auf.

    +

    Musteranfrage

    +
    GET /api/v2/templates/rc_silhouettematch HTTP/1.1
    +
    +
    +

    Musterantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +[
    +  {
    +    "id": "string"
    +  }
    +]
    +
    +
    + +++ + + + + + + + + +
    Antwort-Header: +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabewert: Array der Templates)
    • +
    • 404 Not Found – Modul nicht gefunden
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +GET /templates/rc_silhouettematch/{id}
    +

    ruft ein rc_silhouettematch-Template ab. Falls der angefragte Content-Typ application/octet-stream ist, wird das Template als Datei zurückgegeben.

    +

    Musteranfrage

    +
    GET /api/v2/templates/rc_silhouettematch/<id> HTTP/1.1
    +
    +
    +

    Musterantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "id": "string"
    +}
    +
    +
    + +++ + + + + + + + + + + +
    Parameter:
      +
    • id (string) – ID des Templates (obligatorisch)
    • +
    +
    Antwort-Header:
      +
    • Content-Type – application/json application/ubjson application/octet-stream
    • +
    +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabewert: Template)
    • +
    • 404 Not Found – Modul oder Template wurden nicht gefunden.
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +PUT /templates/rc_silhouettematch/{id}
    +

    erstellt oder aktualisiert ein rc_silhouettematch-Template.

    +

    Musteranfrage

    +
    PUT /api/v2/templates/rc_silhouettematch/<id> HTTP/1.1
    +Accept: multipart/form-data application/json
    +
    +
    +

    Musterantwort

    +
    HTTP/1.1 200 OK
    +Content-Type: application/json
    +
    +{
    +  "id": "string"
    +}
    +
    +
    + +++ + + + + + + + + + + + + + + + +
    Parameter:
      +
    • id (string) – ID des Templates (obligatorisch)
    • +
    +
    Formularparameter:
     
      +
    • file – Template-Datei oder DXF-Datei (obligatorisch)
    • +
    • object_height – Objekthöhe in Metern, benötigt bei DXF-Upload (optional)
    • +
    • units – Einheit für DXF Datei falls nicht in Datei enthalten (mögliche Werte: mm, cm, m, in, ft) (optional)
    • +
    +
    Anfrage-Header:
      +
    • Accept – multipart/form-data application/json
    • +
    +
    Antwort-Header: +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung (Rückgabewert: Template)
    • +
    • 400 Bad Request – Template ist ungültig oder die maximale Zahl an Templates wurde erreicht.
    • +
    • 403 Forbidden – Verboten, z.B. weil keine gültige Lizenz für das SilhouetteMatch-Modul vorliegt.
    • +
    • 404 Not Found – Modul oder Template wurden nicht gefunden.
    • +
    • 413 Request Entity Too Large – Template ist zu groß.
    • +
    +
    Referenzierte Datenmodelle:
      +
    +
    + +
    +
    +DELETE /templates/rc_silhouettematch/{id}
    +

    entfernt ein rc_silhouettematch-Template.

    +

    Musteranfrage

    +
    DELETE /api/v2/templates/rc_silhouettematch/<id> HTTP/1.1
    +Accept: application/json application/ubjson
    +
    +
    + +++ + + + + + + + + + +
    Parameter:
      +
    • id (string) – ID des Templates (obligatorisch)
    • +
    +
    Anfrage-Header:
      +
    • Accept – application/json application/ubjson
    • +
    +
    Antwort-Header: +
    Statuscodes:
      +
    • 200 OK – Erfolgreiche Verarbeitung
    • +
    • 403 Forbidden – Verboten, z.B. weil keine gültige Lizenz für das SilhouetteMatch-Modul vorliegt.
    • +
    • 404 Not Found – Modul oder Template wurden nicht gefunden.
    • +
    +
    +
    + +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/standards.html b/v24.04/de/standards.html new file mode 100644 index 0000000..9119fed --- /dev/null +++ b/v24.04/de/standards.html @@ -0,0 +1,677 @@ + + + + + + + + + + + Schnittstellen, Zulassungen und Normen — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Schnittstellen, Zulassungen und Normen

    +
    +

    Schnittstellen

    +

    Der rc_visard NG unterstützt folgende Standardinterfaces:

    +

    genicamlogo

    +

    Der generische Schnittstellenstandard für Kameras ist die Grundlage für die Plug-&-Play-Handhabung von Kameras und Geräten.

    +

    gigelogo

    +

    GigE Vision® ist ein Interfacestandard für die Übermittlung von Hochgeschwindigkeitsvideo- und zugehörigen Steuerdaten über Ethernet-Netzwerke.

    +
    +
    +

    Zulassungen

    +
    +

    Der rc_visard NG hat folgende Zulassungen erhalten:

    +
    +
    CE
    +
    EG-Konformitätserklärung
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/stereo_camera.html b/v24.04/de/stereo_camera.html new file mode 100644 index 0000000..78903c5 --- /dev/null +++ b/v24.04/de/stereo_camera.html @@ -0,0 +1,1507 @@ + + + + + + + + + + + Kamera — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Kamera

    +

    Das Kameramodul ist ein Basismodul welches auf jedem rc_visard NG verfügbar ist. Es ist für die Bildakquise und die Rektifizierung der Bilder verantwortlich. Das Modul bietet diverse Parameter um z.B. die Belichtungszeit oder die Bildwiederholrate zu verändern.

    +
    +

    Rektifizierung

    +

    Um die Bildverarbeitung zu vereinfachen rektifiziert das Modul alle Kamerabilder basierend auf der Kamerakalibrierung. Dies bedeutet, dass die Verzeichnung entfernt und der Bildhauptpunkt genau in die Mitte des Bildes gelegt wird.

    +

    Eine rektifizierte Kamera kann mit der Brennweite als einzigen Modellparameter beschrieben werden. Der rc_visard NG stellt über seine verschiedenen Schnittstellen einen Brennweitenfaktor bereit. Er bezieht sich auf die Bildbreite, um verschiedene Bildauflösungen zu unterstützen. Die Brennweite \(f\) in Pixeln lässt sich leicht bestimmen, indem der Brennweitenfaktor mit der Bildbreite (in Pixeln) multipliziert wird.

    +

    Im Fall einer Stereokamera richtet die Rektifizierung die Bilder so aus, dass Objektpunkte in beiden Bildern immer in die gleiche Bildzeile projiziert werden. Die optischen Achsen der Kameras werden dadurch exakt parallel ausgerichtet.

    +
    +
    +

    Anzeigen und Herunterladen von Bildern

    +

    Der rc_visard NG bietet über die GenICam-Schnittstelle zeitgestempelte rektifizierte Kamerabilder (siehe Verfügbare Bild-Streams). Live-Streams in geringerer Qualität werden in der Web GUI bereitgestellt.

    +

    Die Web GUI bietet weiterhin die Möglichkeit, einen Schnappschuss der aktuellen Szene als .tar.gz-Datei zu speichern, wie in Herunterladen von Kamerabildern beschrieben wird.

    +
    +
    +

    Parameter

    +

    Das Kamera-Modul wird als rc_camera bezeichnet und in der Web GUI auf der Seite Kamera dargestellt. Der Benutzer kann die Kamera-Parameter entweder dort oder direkt über die REST-API (REST-API-Schnittstelle) oder GigE Vision (GigE Vision 2.0/GenICam-Schnittstelle) ändern.

    +
    +

    Bemerkung

    +

    Wird der rc_visard NG über GigE Vision genutzt, können die Kamera-Parameter nicht über die Web GUI oder REST-API geändert werden.

    +
    +
    +

    Übersicht über die Parameter

    +

    Dieses Softwaremodul bietet folgende Laufzeitparameter:

    + + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Tab. 6 Laufzeitparameter des rc_camera-Moduls
    NameTypMin.Max.DefaultBeschreibung
    acquisition_modestring--ContinuousAufnahmemodus: [Continuous, Trigger]
    exp_autoboolfalsetruetrueUmschalten zwischen automatischer und manueller Belichtung (veraltet, nutzen Sie stattdessen exp_control)
    exp_auto_average_maxfloat640.01.00.75Maximaler Belichtungsmittelwert im Auto Belichtungs Modus
    exp_auto_average_minfloat640.01.00.25Maximaler Belichtungsmittelwert im Auto Belichtungs Modus
    exp_auto_modestring--NormalModus für automatische Belichtung: [Normal, Out1High, AdaptiveOut1]
    exp_controlstring--AutoArt der Belichtungsregelung: [Manual, Auto, HDR]
    exp_heightint32010790Höhe der Region für automatische Belichtung, 0 für das ganze Bild
    exp_maxfloat641e-060.0234490.018Maximale Belichtungszeit in Sekunden im Auto Belichtungs Modus
    exp_offset_xint32014390Erste Spalte der Region für automatische Belichtung
    exp_offset_yint32010790Erste Zeile der Region für automatische Belichtung
    exp_valuefloat641e-060.0234490.005Maximale Belichtungszeit in Sekunden im Auto Belichtungs Modus
    exp_widthint32014390Breite der Region für automatische Belichtung, 0 für das ganze Bild
    fpsfloat641.025.025.0Bildwiederholrate in Hertz
    gain_valuefloat640.048.00.0Verstärkung in Dezibel, wenn nicht im Auto Belichtungs Modus
    gammafloat640.110.00.7Gammafaktor
    trigger_activationstring--RisingEdgeTriggeraktivierung: [RisingEdge, FallingEdge, AnyEdge]
    trigger_sourcestring--SoftwareTriggerquelle: [Software, In1, In2]
    wb_autoboolfalsetruetrueEin- und Ausschalten des manuellen Weißabgleichs (nur für Farbkameras)
    wb_ratio_bluefloat641.01.01.0Blau-zu-Grün-Verhältnis, falls wb_auto auf false gesetzt ist (nur für Farbkameras)
    wb_ratio_redfloat641.01.01.0Rot-zu-Grün-Verhältnis, falls wb_auto auf false gesetzt ist (nur für Farbkameras)
    +
    +
    +

    Beschreibung der Laufzeitparameter

    +
    +_images/webgui_camera_ng_de.png +

    Abb. 15 Seite Kamera in der Web GUI

    +
    +
    +

    acquisition_mode (Aufnahmemodus)

    +
    +

    Dieser Wert bestimmt den Aufnahmemodus der Kamera. Im Modus Kontinuierlich (Continuous) nimmt die Kamera Bilder mit der in fps angegebenen Bildwiederholrate auf. Im Modus Trigger (Trigger) werden nur Bilder aufgenommen, wenn die Kamera ein Triggersignal empfängt.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/parameters?acquisition_mode=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_camera/parameters?acquisition_mode=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    trigger_source (Triggerquelle)

    +
    +

    Dieser Wert wird nur verwendet, wenn der Aufnahmemodus auf Trigger gesetzt ist und bestimmt die Triggerquelle. Im Software-Modus kann ein Trigger über den rc_camera/acquisition_trigger Service gesendet werden. Wenn der Aufnahmemodus acquisition_mode für die Tiefenbilder auf SingleFrame oder SingleFrameOut1 gesetzt ist (siehe Parameter), wird der Kamera-Softwaretrigger automatisch bei jeder Tiefenbildaufnahme gesendet. Die Modi In1 und In2 sind Hardwaretriggermodi. Ein Bild wird aufgenommen, sobald ein Signal auf dem jeweiligen Eingang empfangen wird.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/parameters?trigger_source=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_camera/parameters?trigger_source=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    trigger_activation (Triggeraktivierung)

    +
    +

    Dieser Wert wird nur verwendet, wenn der Aufnahmemodus auf Trigger gesetzt ist und die Triggerquelle auf In1 oder In2 steht. Er bestimmt die Signalflanke, die genutzt werden soll, um eine Bildaufnahme auszulösen. Mögliche Werte sind RisingEdge (steigende Flanke), FallingEdge (fallende Flanke) oder AnyEdge (steigende und fallende Flanke).

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/parameters?trigger_activation=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_camera/parameters?trigger_activation=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    fps (Bildwiederholrate)

    +
    +

    Dieser Wert bezeichnet die Bildwiederholrate der Kamera in Bildern pro Sekunde und begrenzt zugleich die Frequenz, mit der Tiefenbilder berechnet werden können. Die Bildwiederholrate entspricht auch der Frequenz, mit welcher der rc_visard NG Bilder über GigE Vision bereitstellt. Wird diese Frequenz verringert, reduziert sich auch die zur Übertragung der Bilder benötigte Bandbreite des Netzwerks.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/parameters?fps=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_camera/parameters?fps=<value>
    +
    +
    +
    +
    +

    Die Kamera läuft im kontinuierlichen Aufnahmemodus immer mit 25 Hz, um die Funktion von internen Modulen, die eine konstante Bildwiederholrate benötigen (wie zum Beispiel die visuelle Odometrie), sicherzustellen. Die vom Benutzer definierte Bildwiederholrate wird, wie in Abbildung Abb. 16 gezeigt, durch das Weglassen von Bildern erreicht, die für das Stereo-Matching und das Übertragen per GigE Vision benutzt werden. Letzteres dient der Reduktion der Bandbreite.

    +
    +_images/fps_ng_de.png +

    Abb. 16 Die interne Bildaufnahme geschieht immer mit 25 Hz. Der fps Parameter bestimmt, wie viele dieser Kamerabilder per GigE Vision versendet werden.

    +
    +
    +
    +
    +

    gamma (Gamma)

    +
    +

    Der Gammawert bestimmt, wie das gemessene Licht auf die Helligkeit eines Pixels abgebildet wird. Ein Gammawert von 1 entspricht einem linearen Zusammenhang. Kleinere Gammawerte lassen dunkle Bildbereiche heller erscheinen. Ein Wert um 0.5 entspricht der menschlichen Wahrnehmung.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/parameters?gamma=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_camera/parameters?gamma=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    exp_control (Belichtung Auto, HDR oder Manual)

    +
    +

    Die Belichtungsregelung kann auf Auto, HDR oder Manual gesetzt werden. Dies ersetzt den veralteten exp_auto Parameter.

    +

    Auto: Dies ist der Standard Modus der die die Belichtungszeit und Verstärkung automatisch anpasst, um Unter- und Überbelichtung zu vermeiden. Wenn die Automatik abgeschaltet wird, werden exp_value und gain_value auf die letzten von der Automatik ermittelten Werte für Belichtungszeit und Verstärkung gesetzt.

    +

    HDR: Der HDR Modus berechnet Bilder mit hohem Dynamikbereich durch Kombination von Bildern mit unterschiedlichen Belichtungszeiten um über- und unterbelichtete Bereiche zu vermeiden. Dieser Modus verringert die Bildwiederholrate und ist nur für statische Szenen geeignet.

    +

    Manual: Im manuellen Belichtungsmodus werden die Belichtungszeit und die Verstärkung konstant gehalten unabhängig von der resultierenden Bildhelligkeit.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/parameters?exp_control=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_camera/parameters?exp_control=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    exp_auto (veraltet)

    +
    +

    Dieser Parameter ist veraltet und wird in einem zukünftigen Release entfernt. Nutzen Sie stattdessen exp_control.

    +

    Dieser Wert lässt sich für den automatischen Belichtungsmodus auf true und für den manuellen Belichtungsmodus auf false setzen. Im manuellen Belichtungsmodus wird die gewählte Belichtungszeit konstant gehalten und die Verstärkung bleibt bei 0,0 dB, auch wenn die Bilder über- oder unterbelichtet sind. Im automatischen Belichtungsmodus werden die Belichtungszeit und der Verstärkungsfaktor automatisch angepasst, sodass das Bild korrekt belichtet wird. Wenn die Automatik abgeschaltet wird, werden exp_value und gain_value auf die letzten von der Automatik ermittelten Werte für Belichtungszeit und Verstärkung gesetzt.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/parameters?exp_auto=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_camera/parameters?exp_auto=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    exp_auto_mode (Modus Belichtungszeitautomatik)

    +
    +

    Der Modus für automatische Belichtung kann auf Normal, Out1High oder AdaptiveOut1 gesetzt werden. Diese Modi sind nur relevant, wenn der rc_visard NG mit einer externen Lichtquelle oder einem Projektor betrieben wird, der an den GPIO-Ausgang 1 des rc_visard oder rc_viscore angeschlossen ist. Dieser Ausgang kann durch das IOControl-Modul (IOControl und Projektor-Kontrolle) gesteuert werden.

    +

    Normal: Alle Bilder werden für die Regelung der Belichtungszeit in Betracht gezogen, außer wenn der IOControl-Modus für den GPIO-Ausgang 1 ExposureAlternateActive ist: Dann werden nur Bilder berücksichtigt, bei denen GPIO-Ausgang 1 HIGH ist, da diese Bilder heller sein können, falls dieser GPIO-Ausgang benutzt wird um einen externen Projektor auszulösen.

    +

    Out1High: Die Belichtungszeit wird nur anhand der Bilder mit GPIO-Ausgang 1 HIGH angepasst. Bilder bei denen GPIO-Ausgang 1 LOW ist, werden für die Belichtungszeitregelung nicht berücksichtigt. Das bedeutet, die Belichtungszeit ändert sich nicht, solange nur Bilder mit GPIO-Ausgang 1 LOW aufgenommen werden. Dieser Modus wird für die Benutzung mit dem Single+Out1 Tiefenbild Aufnahmemodus (siehe Stereo Matching Parameters und externem Projektor empfohlen, wenn die Helligkeit der Szene nur zu den Zeitpunkten berücksichtigt werden soll, wenn GPIO-Ausgang 1 HIGH ist. Das ist zum Beispiel der Fall, wenn kurz vor einer Objekterkennung ein heller Teil des Roboters durch das Bild fährt, der die Belichtungseinstellungen jedoch nicht beeinflussen soll.

    +

    AdaptiveOut1: Dieser Modus nutzt alle Kamerabilder und speichert die Differenz der Belichtung zwischen Bildern mit GPIO Ausgang 1 HIGH und LOW. Während der IOControl-Modus für GPIO-Ausgang 1 LOW ist, werden die Bilder um diese Differenz unterbelichtet, um eine Überbelichtung zu verhindern, sobald der externe Projektor über GPIO-Ausgang 1 ausgelöst wird. Die Differenz der Belichtung wird als Out1 Reduktion unter den Livebildern angezeigt. Dieser Modus wird empfohlen, wenn im Stereo-Matching-Modul der Parameter acquisition_mode auf SingleFrameOut1 (Einzelbild+Out1) gesetzt ist (Parameter des Stereo-Matching-Moduls), und ein externer Projektor an den GPIO-Ausgang 1 angeschlossen ist, und wenn die Helligkeit der Szene zu jeder Zeit zur Belichtungszeitregelung berücksichtigt werden soll.Das ist zum Beispiel in Anwendungen mit veränderlichen äußeren Lichtbedingungen der Fall.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/parameters?exp_auto_mode=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_camera/parameters?exp_auto_mode=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    exp_max (Maximale Belichtungszeit)

    +
    +

    Dieser Wert gibt die maximale Belichtungszeit im automatischen Modus in Sekunden an. Die tatsächliche Belichtungszeit wird automatisch angepasst, sodass das Bild korrekt belichtet wird. Sind die Bilder trotz maximaler Belichtungszeit noch immer unterbelichtet, erhöht der rc_visard NG schrittweise die Verstärkung, um die Helligkeit der Bilder zu erhöhen. Es ist sinnvoll, die Belichtungszeit zu begrenzen, um die bei schnellen Bewegungen auftretende Bildunschärfe zu vermeiden oder zu verringern. Jedoch führt eine höhere Verstärkung auch zu mehr Bildrauschen. Welcher Kompromiss der beste ist, hängt immer auch von der Anwendung ab.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/parameters?exp_max=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_camera/parameters?exp_max=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    exp_auto_average_max (Maximale Helligkeit) und exp_auto_average_min (Minimale Helligkeit)

    +
    +

    Die automatische Belichtungszeitsteuerung versucht die Belichtungszeit und den Verstärkungsfaktor so einzustellen, dass die mittlere Bildhelligkeit im Bild oder im Bereich zur Regelung zwischen der maximalen und minimalen Helligkeit liegt. Die maximale Helligkeit wird benutzt, wenn keine Bildteile in der Sättigung sind, d.h. keine Überbelichtung durch helle Oberflächen oder Reflexionen vorhanden sind. Falls Sättigungen auftreten, werden die Belichtungszeit und der Verstärkungsfaktor verringert, aber nur bis zur eingestellten minimalen Helligkeit.

    +

    Der Parameter für die maximale Helligkeit hat Vorrang über den Parameter der minimalen Helligkeit. Falls die minimale Helligkeit größer als die maximale ist, versucht die automatische Belichtungszeitsteuerung die mittlere Bildhelligkeit auf die maximale Helligkeit zu setzen.

    +

    Die aktuelle Helligkeit wird in der Statuszeile unter den Bildern angezeigt.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/parameters?<exp_auto_average_max|exp_auto_average_min>=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_camera/parameters?<exp_auto_average_max|exp_auto_average_min>=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    exp_offset_x, exp_offset_y, exp_width, exp_height (Bereich zur Regelung)

    +
    +

    Diese Werte definieren eine rechteckige Region im linken rektifizierten Bild, um den von der automatischen Belichtung überwachten Bereich zu limitieren. Die Belichtungszeit und der Verstärkungsfaktor werden so gewählt, dass die definierte Region optimal belichtet wird. Dies kann zu Über- oder Unterbelichtung in anderen Bildbereichen führen. Falls die Breite oder Höhe auf 0 gesetzt werden, dann wird das gesamte linke und rechte Bild von der automatischen Belichtungsfunktion berücksichtigt. Dies ist die Standardeinstellung.

    +

    Die Region wird in der Web GUI mit einem Rechteck im linken rektifizierten Bild visualisiert. Sie kann über Slider oder direkt im Bild mithilfe der Schaltfläche Bereich im Bild auswählen verändert werden.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/parameters?<exp_offset_x|exp_offset_y|exp_width|exp_height>=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_camera/parameters?<exp_offset_x|exp_offset_y|exp_width|exp_height>=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    exp_value (Belichtungszeit)

    +
    +
    +

    Dieser Wert gibt die Belichtungszeit im manuellen Modus in Sekunden an. Diese Belichtungszeit wird konstant gehalten, auch wenn die Bilder unterbelichtet sind.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/parameters?exp_value=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_camera/parameters?exp_value=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    gain_value (Verstärkungsfaktor)

    +
    +

    Dieser Wert gibt den Verstärkungsfaktor im manuellen Modus in Dezibel an. Höhere Verstärkungswerte reduzieren die Belichtungszeit, führen aber zu Rauschen.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/parameters?gain_value=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_camera/parameters?gain_value=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    wb_auto (Weißabgleich Auto oder Manuell)

    +
    +

    Dieser Wert kann auf true gesetzt werden, um den automatischen Weißabgleich anzuschalten. Bei false kann das Verhältnis der Farben manuell mit wb_ratio_red und wb_ratio_blue gesetzt werden. wb_ratio_red und wb_ratio_blue werden auf die letzten von der Automatik ermittelten Werte gesetzt, wenn diese abgeschaltet wird. Der Weißabgleich ist bei monochromen Kameras ohne Funktion und wird in diesem Fall in der Web GUI nicht angezeigt.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/parameters?wb_auto=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_camera/parameters?wb_auto=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    wb_ratio_blue und wb_ratio_red (Blau | Grün and Rot | Grün)

    +
    +

    Mit diesen Werten kann das Verhältnis von Blau zu Grün bzw. Rot zu Grün für einen manuellen Weißabgleich gesetzt werden. Der Weißabgleich ist bei monochromen Kameras ohne Funktion und wird in diesem Fall in der Web GUI nicht angezeigt.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/parameters?<wb_ratio_blue|wb_ratio_red>=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_camera/parameters?<wb_ratio_blue|wb_ratio_red>=<value>
    +
    +
    +
    +
    +
    +

    Die gleichen Parameter sind – mit leicht abweichenden Namen und teilweise mit anderen Einheiten oder Datentypen – auch über die GenICam-Schnittstelle verfügbar (siehe GigE Vision 2.0/GenICam-Schnittstelle).

    +
    +
    +
    +
    +

    Statuswerte

    +

    Dieses Modul meldet folgende Statuswerte:

    + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Tab. 7 Statuswerte des rc_camera-Moduls
    NameBeschreibung
    baselineBasisabstand \(t\) der Stereokamera in Metern
    brightness Aktuelle Helligkeit als Wert zwischen 0 und 1
    color0 für monochrome Kameras, 1 für Farbkameras
    expAktuelle Belichtungszeit in Sekunden. Dieser Wert wird unter der Bildvorschau in der Web GUI als Belichtung (ms) angezeigt.
    focalBrennweitenfaktor, normalisiert auf eine Bildbreite von 1
    fpsAktuelle Bildwiederholrate der Kamerabilder in Hertz. Dieser Wert wird unter der Bildvorschau in der Web GUI als FPS (Hz) angezeigt.
    gainAktueller Verstärkungsfaktor in Dezibel. Dieser Wert wird unter der Bildvorschau in der Web GUI als Verstärkung (dB) angezeigt.
    gammaAktueller Gammawert
    heightHöhe des Kamerabilds in Pixeln. Dieser Wert wird unter der Bildvorschau in der Web GUI als zweiter Teil von Auflösung (px) angezeigt.
    out1_reduction Anteil der Helligkeits-Reduktion (0.0 - 1.0) für Bilder mit GPIO-Ausgang 1=LOW, wenn exp_auto_mode=AdaptiveOut1 oder exp_auto_mode=Out1High. Dieser Wert wird unter der Bildvorschau in der Web GUI als Out1 Reduktion (%) angezeigt.
    params_override_active1 wenn die Parameter temporär durch einen laufenden Kalibrierprozess überschrieben werden
    temp_leftTemperatur des linken Kamerasensors in Grad Celsius
    temp_rightTemperatur des rechten Kamerasensors in Grad Celsius
    test0 for Live-Bilder und 1 für Test-Bilder
    timeVerarbeitungszeit für die Bilderfassung in Sekunden
    widthBreite des Kamerabilds in Pixeln. Dieser Wert wird unter der Bildvorschau in der Web GUI als erster Teil von Auflösung (px) angezeigt.
    +
    +
    +

    Services

    +

    Das Kamera-Modul bietet folgende Services.

    +
    +

    acquisition_trigger

    +
    +

    triggert eine Bildaufnahme, wenn der Aufnahmemodus auf Trigger und die Triggerquelle auf Software gesetzt sind.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/acquisition_trigger
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_camera/services/acquisition_trigger
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "acquisition_trigger",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    reset_defaults

    +
    +

    stellt die Werkseinstellungen der Parameter dieses Moduls wieder her und wendet sie an („factory reset“).

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/reset_defaults
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_camera/services/reset_defaults
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "reset_defaults",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/stereo_matching.html b/v24.04/de/stereo_matching.html new file mode 100644 index 0000000..b747ae4 --- /dev/null +++ b/v24.04/de/stereo_matching.html @@ -0,0 +1,1621 @@ + + + + + + + + + + + Stereo-Matching — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Stereo-Matching

    +

    Das Stereo-Matching-Modul ist ein Basismodul, das auf jedem rc_visard NG verfügbar ist, und berechnet auf Grundlage des rektifizierten Stereobildpaars Disparitäts-, Fehler- und Konfidenzbilder. Weiterhin bietet das Modul einen Service für die Messung von Tiefenwerten in einem bestimmten Bildbereich (siehe Services).

    +

    Um Disparitäts-, Fehler- und Konfidenzbilder in voller Auflösung zu berechnen, wird eine gesonderte StereoPlus Lizenz benötigt. Diese Lizenz ist auf jedem rc_visard NG vorhanden, der nach dem 31.01.2019 gekauft wurde.

    +
    +

    Berechnung von Disparitätsbildern

    +

    Nach der Rektifizierung haben das linke und das rechte Kamerabild die Eigenschaft, dass ein Objektpunkt in beiden Bildern auf die gleiche Pixelreihe projiziert wird. Die Pixelspalte des Objektpunkts ist im rechten Bild maximal so groß wie die Pixelspalte des Objektpunkts im linken Bild. Der Begriff Disparität bezeichnet den Unterschied zwischen den Pixelspalten im rechten und linken Bild und gibt indirekt die Tiefe des Objektpunkts, d.h. dessen Abstand zur Kamera an. Das Disparitätsbild speichert die Disparitätswerte aller Pixel des linken Kamerabilds.

    +

    Je größer die Disparität, desto näher liegt der Objektpunkt. Beträgt die Disparität 0, bedeutet dies, dass die Projektionen des Objektpunkts in der gleichen Bildspalte liegen und der Objektpunkt sich in unendlicher Distanz befindet. Häufig gibt es Pixel, für welche die Disparität nicht bestimmt werden kann. Dies ist der Fall bei Verdeckungen auf der linken Seite von Objekten, da diese Bereiche von der rechten Kamera nicht eingesehen werden können. Zudem lässt sich die Disparität auch bei texturlosen Bereichen nicht bestimmen. Pixel, für welche die Disparität nicht bestimmt werden kann, werden mit dem besonderen Disparitätswert 0 als ungültig markiert. Um zwischen ungültigen Disparitätsmessungen und Messungen, bei denen die Disparität aufgrund der unendlich weit entfernten Objekte 0 beträgt, unterscheiden zu können, wird der Disparitätswert für den letztgenannten Fall auf den kleinstmöglichen Disparitätswert über 0 gesetzt.

    +

    Um Disparitätswerte zu berechnen, muss der Stereo-Matching-Algorithmus die zugehörigen Objektpunkte im linken und rechten Kamerabild finden. Diese Punkte stellen jeweils den gleichen Objektpunkt in der Szene dar. Für das Stereo-Matching nutzt der rc_visard NG SGM (Semi-Global Matching). Dieser Algorithmus zeichnet sich durch eine kurze Laufzeit aus und bietet, insbesondere an Objekträndern, bei feinen Strukturen und in schwach texturierten Bereichen, eine hohe Genauigkeit.

    +

    Unabhängig vom eingesetzten Verfahren ist es beim Stereo-Matching wichtig, dass das Bild über eine gewisse Textur verfügt, durch Muster oder Oberflächenstrukturen. Bei einer gänzlich untexturierten Szene, wie einer weißen Wand ohne jede Struktur, können Disparitätswerte entweder nicht berechnet werden, oder aber die Ergebnisse sind fehlerhaft oder von geringer Konfidenz (siehe Konfidenz- und Fehlerbilder). Bei der Textur in der Szene sollte es sich nicht um ein künstliches, regelmäßig wiederkehrendes Muster handeln, da diese Strukturen zu Mehrdeutigkeiten und damit zu falschen Disparitätsmessungen führen können.

    +

    Für schwach texturierte Objekte oder in untexturierten Umgebungen lässt sich mithilfe eines externen Musterprojektors eine statische künstliche Struktur auf die Szene projizieren. Dieses projizierte Muster sollte zufällig sein und keine wiederkehrenden Strukturen enthalten. Der rc_visard NG bietet das IOControl-Modul als optionales Softwaremodul (siehe IOControl und Projektor-Kontrolle, das einen Musterprojektor ansteuern kann.

    +
    +
    +

    Berechnung von Tiefenbildern und Punktwolken

    +

    Die folgenden Gleichungen zeigen, wie sich die tatsächlichen 3D-Koordinaten \(P_x, P_y, P_z\) eines Objektpunkts bezogen auf das Kamera-Koordinatensystem aus den Pixelkoordinaten \(p_{x}, p_{y}\) des Disparitätsbilds und dem Disparitätswert \(d\) in Pixeln berechnen lassen:

    +
    +(1)\[\begin{split}P_x&=\frac{p_x \cdot t}{d}\\ +P_y&=\frac{p_y \cdot t}{d}\\ +P_z&=\frac{f \cdot t}{d},\end{split}\]
    +

    wobei \(f\) die Brennweite nach der Rektifizierung (in Pixeln) und \(t\) der während der Kalibrierung ermittelte Stereo-Basisabstand (in Metern) ist. Diese Werte werden auch über die GenICam-Schnittstelle zur Verfügung gestellt (siehe Besondere Parameter der GenICam-Schnittstelle des rc_visard NG).

    +
    +

    Bemerkung

    +

    Das Kamera-Koordinatensystem des rc_visard NG ist in Koordinatensysteme definiert.

    +
    +
    +

    Bemerkung

    +

    Der rc_visard NG stellt über seine verschiedenen Schnittstellen einen Brennweitenfaktor bereit. Er bezieht sich auf die Bildbreite, um verschiedene Bildauflösungen zu unterstützen. Die Brennweite \(f\) in Pixeln lässt sich leicht bestimmen, indem der Brennweitenfaktor mit der Bildbreite (in Pixeln) multipliziert wird.

    +
    +

    Es ist zu beachten, dass für Gleichungen (1) davon ausgegangen wird, dass das Bildkoordinatensystem im Bildhauptpunkt zentriert ist, der üblicherweise in der Bildmitte liegt, und dass sich \(p_{x}, p_{y}\) auf die Mitte des Pixels bezieht, durch Addieren von 0.5 auf die ganzzahligen Pixelkoordinaten. In der folgenden Abbildung ist die Definition des Bildkoordinatensystems dargestellt.

    +
    +_images/image_coordinates.png +

    Abb. 17 Bildkoordinatensystem: Der Ursprung des Bildkoordinatensystems befindet sich in der Bildmitte – \(w\) ist die Bildbreite und \(h\) die Bildhöhe.

    +
    +

    Die gleichen Formeln, aber mit den entsprechenden GenICam-Parametern, sind in Umwandlung von Bild-Streams angegeben.

    +

    Die Gesamtheit aller aus dem Disparitätsbild errechneten Objektpunkte ergibt eine Punktwolke, die für 3D-Modellierungsanwendungen verwendet werden kann. Das Disparitätsbild kann in ein Tiefenbild umgewandelt werden, indem der Disparitätswert jedes Pixels durch den Wert \(P_z\) ersetzt wird.

    +
    +

    Bemerkung

    +

    Auf der Homepage von Roboception (http://www.roboception.com/download) stehen Software und Beispiele zur Verfügung, um Disparitätsbilder, welche über GigE Vision vom rc_visard NG empfangen werden, in Tiefenbilder und Punktwolken umzuwandeln.

    +
    +
    +
    +

    Konfidenz- und Fehlerbilder

    +

    Für jedes Disparitätsbild wird zusätzlich ein Fehler- und ein Konfidenzbild zur Verfügung gestellt, um die Unsicherheit jedes einzelnen Disparitätswerts anzugeben. Fehler- und Konfidenzbilder besitzen die gleiche Auflösung und Bildwiederholrate wie das Disparitätsbild. Im Fehlerbild ist der Disparitätsfehler \(d_{eps}\) in Pixeln angegeben. Er bezieht sich auf den Disparitätswert an der gleichen Bildkoordinate im Disparitätsbild. Das Konfidenzbild gibt den entsprechenden Konfidenzwert \(c\) zwischen 0 und 1 an. Die Konfidenz gibt an, wie wahrscheinlich es ist, dass der wahre Disparitätswert innerhalb des Intervalls des dreifachen Fehlers um die gemessene Disparität \(d\) liegt, d.h. \([d-3d_{eps}, d+3d_{eps}]\). So lässt sich das Disparitätsbild mit Fehler- und Konfidenzwerten in Anwendungen einsetzen, für die probabilistische Folgerungen nötig sind. Die Konfidenz- und Fehlerwerte für eine ungültige Disparitätsmessung betragen 0.

    +

    Der Disparitätsfehler \(d_{eps}\) (in Pixeln) lässt sich mithilfe der Brennweite \(f\) (in Pixeln), des Basisabstands \(t\) (in Metern) und des Disparitätswerts \(d\) (in Pixeln) desselben Pixels im Disparitätsbild in einen Tiefenfehler \(z_{eps}\) (in Metern) umrechnen:

    +
    +(2)\[z_{eps}=\frac{d_{eps}\cdot f\cdot t}{d^2}.\]
    +

    Durch Kombination der Gleichungen (1) und (2) kann der Tiefenfehler zur Tiefe in Bezug gebracht werden:

    +
    +\[z_{eps}=\frac{d_{eps}\cdot{P_z}^2}{f\cdot t}.\]
    +

    Unter Berücksichtigung der Brennweiten und Basisabstände der verschiedenen Kameramodelle sowie des typischen kombinierten Kalibrier- und Stereo-Matching-Fehlers \(d_{eps}\) von 0,25 Pixeln lässt sich die Tiefengenauigkeit wie folgt grafisch darstellen:

    +
    +_images/reconstruction_error.png +
    +
    +
    +

    Anzeigen und Herunterladen von Tiefenbildern und Punktwolken

    +

    Der rc_visard NG stellt über die GenICam-Schnittstelle zeitgestempelte Disparitäts-, Fehler- und Konfidenzbilder zur Verfügung (siehe Verfügbare Bild-Streams). Live-Streams in geringerer Qualität werden auf der Tiefenbild Seite in der Web GUI bereitgestellt.

    +

    Die Web GUI bietet weiterhin die Möglichkeit, einen Schnappschuss der aktuellen Szene mit den Tiefen-, Fehler und Konfidenzbildern, sowie der Punktwolke als .tar.gz-Datei zu speichern, wie in Herunterladen von Kamerabildern beschrieben wird.

    +
    +
    +

    Parameter

    +

    Das Stereo-Matching-Modul wird in der REST-API als rc_stereomatching bezeichnet und in der Web GUI auf der Seite Tiefenbild dargestellt. Der Benutzer kann die Stereo-Matching-Parameter entweder dort oder über die REST-API (REST-API-Schnittstelle) oder über GigE Vision (GigE Vision 2.0/GenICam-Schnittstelle) ändern.

    +
    +

    Übersicht über die Parameter

    +

    Dieses Softwaremodul bietet folgende Laufzeitparameter:

    + + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Tab. 8 Laufzeitparameter des rc_stereomatching-Moduls
    NameTypMin.Max.DefaultBeschreibung
    acquisition_modestring--ContinuousAufnahmemodus: [Continuous, SingleFrame, SingleFrameOut1]
    double_shotboolfalsetruefalseKombination zweier Disparitätsbilder von zwei Stereobildpaaren
    exposure_adapt_timeoutfloat640.02.00.0Maximale Zeit in Sekunden, die nach Auslösen einer Aufnahme im Einzelbild-Modus gewartet wird, bis die Belichtung angepasst ist
    fillint32043Disparitätstoleranz (für das Füllen von Löchern) in Pixeln
    maxdepthfloat640.1100.0100.0Maximaler Abstand in Metern
    maxdeptherrfloat640.01100.0100.0Maximaler Tiefenfehler in Metern
    minconffloat640.51.00.5Mindestkonfidenz
    mindepthfloat640.1100.00.1Minimaler Abstand in Metern
    qualitystring--HighFull (Voll), High (Hoch), Medium (Mittel), oder Low (Niedrig). Full benötigt eine ‚StereoPlus‘-Lizenz.
    segint3204000200Mindestgröße der gültigen Disparitätssegmente in Pixeln
    smoothboolfalsetruetrueGlättung von Disparitätsbildern (benötigt eine ‚StereoPlus‘-Lizenz)
    static_sceneboolfalsetruefalseMitteln von Bildern in statischen Szenen, um Rauschen zu reduzieren
    +
    +
    +

    Beschreibung der Laufzeitparameter

    +

    Jeder Laufzeitparameter ist durch eine eigene Zeile auf der Seite Tiefenbild der Web GUI repräsentiert. Der Web GUI-Name des Parameters ist in Klammern hinter dem Namen des Parameters angegeben und die Parameter werden in der Reihenfolge, in der sie in der Web GUI erscheinen, aufgelistet:

    +
    +_images/webgui_depth_image_ng_de.png +

    Abb. 18 Seite Tiefenbild der Web GUI

    +
    +
    +

    acquisition_mode (Aufnahmemodus)

    +
    +
    +

    Der Aufnahmemodus kann auf Continuous (Kontinuierlich), SingleFrame (Einzelbild) oder SingleFrameOut1 (Einzelbild + Out1) eingestellt werden. Kontinuierlich ist die Standardeinstellung, bei der das Stereo-Matching kontinuierlich mit der vom Benutzer eingestellten Bildwiederholrate, entsprechend der verfügbaren Rechenressourcen, durchgeführt wird. Bei den beiden anderen Modi wird das Stereo-Matching bei jedem Drücken des Aufnehmen-Knopfes durchgeführt. Der Einzelbild + Out1 Modus kontrolliert zusätzlich einen externen Projektor, falls dieser an GPIO-Ausgang 1 angeschlossen ist (IOControl und Projektor-Kontrolle). In diesem Modus wird out1_mode des IOControl-Moduls automatisch bei jedem Trigger auf ExposureAlternateActive und nach dem Aufnehmen der Bilder für das Stereo-Matching auf Low gesetzt.

    +
    +

    Bemerkung

    +

    Der Einzelbild + Out1 Modus kann nur dann über out1_mode einen Projektor steuern, wenn die IOControl-Lizenz auf dem rc_visard NG verfügbar ist.

    +
    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?acquisition_mode=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_stereomatching/parameters?acquisition_mode=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    exposure_adapt_timeout (Timeout Belichtungsautomatik)

    +
    +
    +

    Der Timeout für die Belichtungsautomatik gibt die maximale Zeitspanne in Sekunden an, die das System nach dem Auslösen einer Bildaufnahme warten wird, bis die Belichtungsautomatik die optimale Belichtungszeit gefunden hat. Dieser Timeout wird nur im Modus SingleFrame (Einzelbild) oder SingleFrameOut1 (Einzelbild + Out1) bei aktiver Belichtungsautomatik verwendet. Dieser Wert sollte erhöht werden, wenn in Anwendungen mit veränderlichen Lichtbedingungen Bilder unter- oder überbelichtet werden, und das resultierende Disparitätsbild nicht dicht genug ist. In diesem Fall werden mehrere Bilder aufgenommen, bis sich die Belichtungsautomatik angepasst hat oder der Timeout erreicht ist, und erst dann wird die eigentliche Bildaufnahme ausgelöst.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?exposure_adapt_timeout=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_stereomatching/parameters?exposure_adapt_timeout=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    quality (Qualität)

    +
    +
    +

    Disparitätsbilder lassen sich in verschiedenen Auflösungen berechnen: Full (Voll, volle Bildauflösung), High (Hoch, halbe Bildauflösung), Medium (Mittel, Viertel-Bildauflösung) und Low (Niedrig, Sechstel-Bildauflösung). Stereo-Matching mit voller Auflösung (Full) ist nur mit einer gültigen StereoPlus Lizenz möglich. Je niedriger die Auflösung, desto höher die Bildwiederholrate des Disparitätsbilds. Es ist zu beachten, dass die Bildwiederholrate der Disparitäts-, Konfidenz- und Fehlerbilder immer höchstens der Bildwiederholrate der Kamera entspricht. Falls die Projektoreinstellung ExposureAlternateActive ist, kann die Wiederholrate der Bilder höchstens die halbe Bildwiederholrate der Kamera sein.

    +

    Eine Bildwiederholrate von 25 Hz lässt sich nur bei mittlerer und niedriger Auflösung erreichen.

    +

    Wenn volle Auflösung eingestellt ist, dann ist der mögliche Tiefenbereich intern limitiert, aufgrund von beschränktem on-board Speicherplatz. Es wird empfohlen mindepth and maxdepth auf den Tiefenbereich anzupassen der für die Applikation benötigt wird.

    + + +++++++ + + + + + + + + + + + + + + +
    Tab. 9 Auflösung des Tiefenbilds in Abhängigkeit von der gewählten Qualität
    QualitätVoll (Full)Hoch (High)Mittel (Medium)Niedrig (Low)
    Auflösung (Pixel)1440 x 1080720 x 540360 x 270240 x 180
    +
    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?quality=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_stereomatching/parameters?quality=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    double_shot (Double-Shot)

    +
    +

    Das Aktivieren dieses Modus führt zu dichteren Disparitätsbildern, aber einer erhöhten Verarbeitungszeit.

    +

    Bei Szenen, die mit einem Projektor im Single + Out1 Modus oder im kontinuierlichen Modus mit der Projektoreinstellung ExposureAlternateActive aufgenommen werden, werden Löcher, die durch Projektor-Reflexionen verursacht werden, gefüllt mit Tiefeninformationen aus den Bildern ohne Projektormuster. In diesem Fall darf der double_shot Modus nur verwendet werden, wenn sich die Szene während der Aufnahme der Bilder nicht verändert.

    +

    Bei allen anderen Szenen werden Löcher im Disparitätsbild mit Tiefeninformationen aus demselben, herunterskalierten Bild gefüllt.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?double_shot=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_stereomatching/parameters?double_shot=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    static_scene (Statisch)

    +
    +

    Mit dieser Option werden acht aufeinanderfolgende Kamerabilder vor dem Matching gemittelt. Dies reduziert Rauschen, was die Qualität des Stereo-Matching-Resultats verbessert. Allerdings erhöht sich auch die Latenz deutlich. Der Zeitstempel des ersten Bildes wird als Zeitstempel für das Disparitätsbild verwendet. Diese Option betrifft nur das Matching in voller und hoher Qualität. Sie darf nur verwendet werden, wenn sich die Szene während der Aufnahme der acht Bilder nicht verändert.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?static_scene=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_stereomatching/parameters?static_scene=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    mindepth (Minimaler Abstand)

    +
    +

    Dieser Wert bezeichnet den geringsten Abstand zur Kamera, ab dem Messungen möglich sind. Größere Werte verringern implizit den Disparitätsbereich, wodurch sich auch die Rechenzeit verkürzt. Der minimale Abstand wird in Metern angegeben.

    +

    Abhängig von den Eigenschaften des Sensors kann der tatsächliche minimale Abstand größer sein als die Benutzereinstellung. Der tatsächliche minimale Abstand wird in den Statuswerten angezeigt.

    +

    Wenn volle Auflösung (Full) eingestellt ist, kann der minimale Abstand auch aufgrund interner Speicherplatzlimitierungen größer sein als die Benutzereinstellung. In diesem Fall hilft es, den maximalen Abstand zu verringern, um dadurch auch den tatsächlichen minimalen Abstand zu verringern.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?mindepth=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_stereomatching/parameters?mindepth=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    maxdepth (Maximaler Abstand)

    +
    +

    Dieser Wert ist der größte Abstand zur Kamera, bis zu dem Messungen möglich sind. Pixel mit größeren Distanzwerten werden auf „ungültig“ gesetzt. Wird dieser Wert auf das Maximum gesetzt, so sind Abstände bis Unendlich möglich. Der maximale Abstand wird in Metern angegeben.

    +

    Wenn volle Auflösung (Full) eingestellt ist, kann der minimale Abstand auch aufgrund interner Speicherplatzlimitierungen größer sein als die Benutzereinstellung. In diesem Fall hilft es, den maximalen Abstand zu verringern um dadurch auch den tatsächlichen minimalen Abstand zu verringern.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?maxdepth=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_stereomatching/parameters?maxdepth=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    smooth (Glättung)

    +
    +

    Diese Option aktiviert die Glättung von Disparitätswerten. Sie ist nur mit gültiger StereoPlus-Lizenz verfügbar.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?smooth=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_stereomatching/parameters?smooth=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    fill (Füllen)

    +
    +

    Diese Option wird verwendet, um Löcher im Disparitätsbild durch Interpolation zu füllen. Der Füllwert gibt die maximale Disparitätsabweichung am Rand des Lochs an. Größere Füllwerte können die Anzahl an Löchern verringern, aber die interpolierten Werte können größere Fehler aufweisen. Maximal 5% der Pixel werden interpoliert. Kleine Löcher werden dabei bevorzugt interpoliert. Die Konfidenz für die interpolierten Pixel wird auf einen geringen Wert von 0,5 eingestellt. Das Auffüllen lässt sich deaktivieren, wenn der Wert auf 0 gesetzt wird.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?fill=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_stereomatching/parameters?fill=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    seg (Segmentierung)

    +
    +

    Der Segmentierungsparameter wird verwendet, um die Mindestanzahl an Pixeln anzugeben, die eine zusammenhängende Disparitätsregion im Disparitätsbild ausfüllen muss. Isolierte Regionen, die kleiner sind, werden im Disparitätsbild auf ungültig gesetzt. Der Wert bezieht sich immer auf ein Disparitätsbild mit hoher Qualität (halbe Auflösung) und muss nicht verändert werden, wenn andere Qualitäten gewählt werden. Die Segmentierung eignet sich, um Disparitätsfehler zu entfernen. Bei größeren Werten kann es jedoch vorkommen, dass real vorhandene Objekte entfernt werden.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?seg=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_stereomatching/parameters?seg=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    minconf (Minimale Konfidenz)

    +
    +

    Die minimale Konfidenz lässt sich einstellen, um potenziell falsche Disparitätsmessungen herauszufiltern. Dabei werden alle Pixel, deren Konfidenz unter dem gewählten Wert liegt, im Disparitätsbild auf „ungültig“ gesetzt.

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?minconf=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_stereomatching/parameters?minconf=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    maxdeptherr (Maximaler Fehler)

    +
    +

    Der maximale Fehler wird verwendet, um Messungen, die zu ungenau sind, herauszufiltern. Alle Pixel mit einem Tiefenfehler, der den gewählten Wert überschreitet, werden im Disparitätsbild auf „ungültig“ gesetzt. Der maximale Tiefenfehler wird in Metern angegeben. Der Tiefenfehler wächst in der Regel quadratisch mit dem Abstand eines Objekts zur Kamera (siehe Konfidenz- und Fehlerbilder).

    +

    Über die REST-API kann dieser Parameter wie folgt gesetzt werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?maxdeptherr=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_stereomatching/parameters?maxdeptherr=<value>
    +
    +
    +
    +
    +
    +

    Die gleichen Parameter sind – mit leicht abweichenden Namen und teilweise mit anderen Einheiten oder Datentypen – auch über die GenICam-Schnittstelle verfügbar (siehe GigE Vision 2.0/GenICam-Schnittstelle).

    +
    +
    +
    +
    +

    Statuswerte

    +

    Dieses Modul meldet folgende Statuswerte:

    + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Tab. 10 Statuswerte des rc_stereomatching-Moduls
    NameBeschreibung
    fpsTatsächliche Bildwiederholrate der Disparitäts-, Fehler- und Konfidenzbilder. Dieser Wert wird unter der Bildvorschau in der Web GUI als Bildwiederholrate (Hz) angezeigt.
    latencyZeit zwischen Bildaufnahme und Weitergabe des Disparitätsbildes in Sekunden
    widthAktuelle Breite des Disparitäts-, Fehler- und Konfidenzbilds in Pixeln
    heightAktuelle Höhe des Disparitäts-, Fehler- und Konfidenzbilds in Pixeln
    mindepthTatsächlicher minimaler Arbeitsabstand in Metern
    maxdepthTatsächlicher maximaler Arbeitsabstand in Metern
    time_matchingZeit in Sekunden für die Durchführung des Stereo-Matchings mittels SGM auf der GPU
    time_postprocessingZeit in Sekunden für die Nachbearbeitung des Matching-Ergebnisses auf der CPU
    reduced_depth_rangeGibt an, ob der Tiefenbereich aufgrund von Rechenressourcen verringert ist ist
    +
    +
    +

    Services

    +

    Das Stereo-Matching-Modul bietet folgende Services.

    +
    +

    acquisition_trigger

    +
    +

    signalisiert dem Modul, das Stereo-Matching auf den nächsten Stereobildern durchzuführen, falls acquisition_mode auf SingleFrame (Einzelbild) oder SingleFrameOut1 (Einzelbild+Out1) eingestellt ist.

    +

    Details

    +
    +

    Es wird ein Fehler zurückgegeben, falls acquisition_mode auf Continuous (Kontinuierlich) eingestellt ist.

    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/services/acquisition_trigger
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_stereomatching/services/acquisition_trigger
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Mögliche Rückgabewerte sind in der Tabelle unten aufgeführt.

    + + ++++ + + + + + + + + + + + + + + + + + + + +
    Tab. 11 Mögliche Rückgabewerte des acquisition_trigger Serviceaufrufs.
    CodeBeschreibung
    0Erfolgreich
    -8Triggern ist nur im Einzelbild-Modus möglich.
    101Triggern wird ignoriert, da bereits ein anderer Triggeraufruf stattfindet.
    102Triggern wird ignoriert, da keine Empfänger registriert sind.
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "acquisition_trigger",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    measure_depth

    +
    +

    berechnet durchschnittliche, minimale und maximale Tiefenwerte in einer bestimmten Region of Interest, die optional in Zellen unterteilt werden kann.

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/services/measure_depth
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_stereomatching/services/measure_depth
    +
    +
    +
    +
    +
    + +
    +

    Optionale Serviceargumente:

    +
    +

    region_of_interest_2d_id ist die ID der 2D Region of Interest (siehe RoiDB), die für die Tiefenmessung verwendet wird.

    +

    region_of_interest_2d ist eine alternative Definition der Region of Interest für die Tiefenmessung. Diese Region of Interest wird ignoriert, falls eine region_of_interest_2d_id gesetzt ist. Die Region of Interest wird immer auf dem Kamerabild mit voller Auflösung definiert, wobei offset_x und offset_y die Pixelkoordinaten der oberen linken Ecke der rechteckigen Region of Interest sind, und width und height die Breite und Höhe des Rechtecks in Pixeln angeben. Der Standardwert ist eine Region of Interest, die das gesamte Bild abdeckt.

    +

    cell_count ist die Anzahl der Zellen in x und y Richtung, in die die Region of Interest für die Tiefenmessung unterteilt wird. Falls nicht angegeben, wird ein cell_count von 0, 0 angenommen und es werden nur die Gesamtwerte overall berechnet. Die Gesamtanzahl der Zellen, die als Produkt aus den x und y Werten des cell_count berechnet werden kann, darf nicht größer sein als 100.

    +

    data_acquisition_mode: Falls der Aufnahmemodus auf CAPTURE_NEW (Standardwert) gesetzt ist, wird ein neuer Bild-Datensatz für die Messung aufgenommen. Falls der Modus auf USE_LAST gesetzt wird, wird der Datensatz der vorherigen Messung erneut verwendet.

    +

    pose_frame bestimmt, ob die Koordinaten der Tiefenmessung im Kamerakoordinatensystem (camera), oder im Roboterkoordinatensystem (external) zurückgeliefert werden, falls eine Hand-Auge-Kalibrierung verfügbar ist (siehe Hand-Auge-Kalibrierung). Der Standardwert ist camera.

    +
    +

    Möglicherweise benötigte Serviceargumente:

    +
    +
    robot_pose ist die Pose des Roboters zum Zeitpunkt der Tiefenmessung. Die Roboterpose wird benötigt, wenn das externe Koordinatensystem pose_frame genutzt wird und die Kamera am Roboter montiert ist.
    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "cell_count": {
    +      "x": "uint32",
    +      "y": "uint32"
    +    },
    +    "data_acquisition_mode": "string",
    +    "pose_frame": "string",
    +    "region_of_interest_2d": {
    +      "height": "uint32",
    +      "offset_x": "uint32",
    +      "offset_y": "uint32",
    +      "width": "uint32"
    +    },
    +    "region_of_interest_2d_id": "string",
    +    "robot_pose": {
    +      "orientation": {
    +        "w": "float64",
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "position": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      }
    +    }
    +  }
    +}
    +
    +
    +
    +
    + + ++++ + + + + + + + + + + + + + +
    Tab. 12 Mögliche return_code Werte des measure_depth Serviceaufrufs.
    valueBeschreibung
    0Messung erfolgreich
    -1Ein ungültiges Argument wurde angegeben
    +

    cells enthält die Tiefenmessungen aller gewünschter Zellen. Die Zellen sind immer von links nach rechts und oben nach unten in Bildkoordinaten sortiert.

    +

    overall enthält die Tiefenmessung der gesamten Region of Interest.

    +

    coverage ist eine Zahl zwischen 0 und 1, die den Anteil der Pixel mit gültigen Tiefenmesswerten innerhalb der zugehörigen Zelle angibt. Ein Anteil von 0 bedeutet, dass die Zelle ungültig ist.

    +

    min_z und max_z geben die 3D Koordinaten des Punkts in der Zelle zurück, der den minimalen bzw. maximalen Tiefenwert hat. Der Tiefenwert ist die z-Koordinate im Kamerakoordinatensystem.

    +

    Für mean_z definieren die x- und y-Koordinaten den Punkt in der Mitte der Zelle, und die z-Koordinate wird bestimmt durch den mittleren Tiefenmesswert in dieser Zelle.

    +

    region_of_interest_2d gibt die Definition der angeforderten Region of Interest für die Tiefenmessung zurück.

    +

    Wenn pose_frame auf external gesetzt ist, dann werden die x-, y- und z-Koordinaten im Roboterkoordinatensystem zurückgeliefert

    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "measure_depth",
    +  "response": {
    +    "cell_count": {
    +      "x": "uint32",
    +      "y": "uint32"
    +    },
    +    "cells": [
    +      {
    +        "coverage": "float64",
    +        "max_z": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "mean_z": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        },
    +        "min_z": {
    +          "x": "float64",
    +          "y": "float64",
    +          "z": "float64"
    +        }
    +      }
    +    ],
    +    "overall": {
    +      "coverage": "float64",
    +      "max_z": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "mean_z": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "min_z": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      }
    +    },
    +    "pose_frame": "string",
    +    "region_of_interest_2d": {
    +      "height": "uint32",
    +      "offset_x": "uint32",
    +      "offset_y": "uint32",
    +      "width": "uint32"
    +    },
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    },
    +    "timestamp": {
    +      "nsec": "int32",
    +      "sec": "int32"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    reset_defaults

    +
    +

    stellt die Werkseinstellungen der Parameter dieses Moduls wieder her und wendet sie an („factory reset“).

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/services/reset_defaults
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/rc_stereomatching/services/reset_defaults
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "reset_defaults",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/tagdetect.html b/v24.04/de/tagdetect.html new file mode 100644 index 0000000..5816967 --- /dev/null +++ b/v24.04/de/tagdetect.html @@ -0,0 +1,1499 @@ + + + + + + + + + + + TagDetect — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    TagDetect

    +
    +

    Einführung

    +

    Die TagDetect-Module sind optionale Module, die intern auf dem rc_visard NG laufen, und benötigen gesonderte Lizenzen, die erworben werden müssen. Diese Lizenzen sind auf jedem rc_visard NG, der nach dem 01.07.2020 gekauft wurde, vorhanden.

    +

    Die TagDetect-Module laufen intern auf dem rc_visard NG und ermöglichen es, 2D-Matrixcodes und Marker (Tags) zu erkennen. Derzeit gibt es TagDetect-Module für QR-Codes und AprilTags. Neben der Erkennung berechnen die Module die Position und Orientierung jedes Tags im 3D-Kamerakoordinatensystem, um diesen beispielsweise mit einem Roboter zu manipulieren oder die Pose der Kamera in Bezug auf den Tag zu berechnen.

    +

    Die Tagerkennung besteht aus drei Schritten:

    +
      +
    1. Tagerkennung auf dem 2D-Bildpaar (siehe Tagerkennung).
    2. +
    3. Schätzung der Pose jedes Tags (siehe Posenschätzung).
    4. +
    5. Wiedererkennung von bisher gesehenen Tags (siehe Tag-Wiedererkennung).
    6. +
    +

    Im Folgenden werden die zwei unterstützten Tagtypen näher beschrieben, gefolgt von einem Vergleich.

    +
    +

    QR-Code

    +
    +_images/example_qr_code.png +

    Abb. 21 Beispiel eines QR-Codes

    +
    +

    QR-Codes sind zweidimensionale Matrixcodes, welche beliebige, benutzerspezifizierte Daten enthalten können. Viele Alltagsgeräte, wie beispielsweise Smartphones, unterstützen die Erkennung von QR-Codes. Zusätzlich stehen Online- und Offlinetools zur Verfügung, um QR-Codes zu generieren.

    +

    Die „Pixel“ eines QR-Codes werden Module genannt. Das Aussehen und die Auflösung von QR-Codes ändert sich mit der Menge der in ihnen gespeicherten Daten. Während die speziellen Muster in den drei Ecken immer 7 Module breit sind, erhöht sich die Anzahl der Module dazwischen, je mehr Daten gespeichert sind. Der am niedrigsten aufgelöste QR-Code besitzt eine Größe von 21x21 Modulen und kann bis zu 152 Bits speichern.

    +

    Auch wenn viele QR-Code-Generatoren speziell designte QR-Codes erzeugen können (bspw. mit einem Logo, mit runden Ecken oder mit Punkten als Module), wird eine zuverlässige Erkennung solcher Tags mit dem TagDetect-Modul nicht garantiert. Gleiches gilt für QR-Codes, welche Zeichen außerhalb des ASCII-Zeichensatzes beinhalten.

    +
    +
    +

    AprilTag

    +
    +_images/apriltag_dim_vis.png +

    Abb. 22 Ein 16h5 Tag (links), ein 36h11 Tag (Mitte) und ein 41h12 Tag (rechts). AprilTags bestehen aus einem obligatorischen weißen (a) und schwarzen (b) Rahmen und einer variablen Menge an Datenmodulen (c).

    +
    +

    AprilTags sind ähnlich zu QR-Codes. Sie wurden allerdings speziell zur robusten Identifikation auf weite Entfernungen entwickelt. Wie bei QR-Codes werden die „Pixel“ Module genannt. Abb. 22 veranschaulicht den Aufbau von AprilTags. Sie haben einen obligatorischen weißen und schwarzen Rahmen, welcher jeweils ein Modul breit ist. Tags der Familien 16h5, 25h9, 36h10 und 36h11 sind von diesem Rahmen umschlossen und enthalten innen eine variable Menge an Datenmodulen. Bei Tags der Familie 41h12 ist der Rahmen nach innen verschoben und die Datenmodule befinden sich sowohl innerhalb als auch außerhalb des Rahmens. Anders als QR-Codes speichern AprilTags keine benutzerdefinierten Informationen, sondern werden durch eine vordefinierte Familie und ID identifiziert. Die Tags in Abb. 22 sind zum Beispiel aus Familie 16h5, 36h11 bzw. 41h12 und besitzen ID 0, 11 bzw. 0. Alle unterstützten Familien werden in Tab. 16 aufgelistet.

    + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Tab. 16 AprilTag-Familien
    FamilieAnzahl IDsEmpfohlen
    16h530-
    25h935o
    36h102320o
    36h11587+
    41h122115+
    +

    Die Zahl vor dem „h“ jeder Familie bezeichnet die Anzahl der Datenmodule, welche im Tag enthalten sind: Während ein 16h5 Tag 16 (4x4) Datenmodule enthält ((c) in Abb. 22) und ein 36h11 Tag 36 (6x6), beinhaltet ein 41h12 Tag 41 Datenmodule (3x3 innen und 4x8 außen). Die Zahl hinter dem „h“ bezeichnet den Hamming-Abstand zwischen zwei Tags der Familie. Je höher, desto höher ist die Robustheit, aber desto weniger IDs stehen bei gleicher Anzahl an Datenmodulen zur Verfügung (siehe Tab. 16).

    +

    Der Vorteil von Familien mit weniger Modulen (bspw. 16h5 im Vergleich zu 36h11) ist die niedrigere Auflösung der Tags. Jedes Modul ist somit größer, weshalb der Tag auf eine größere Distanz erkannt werden kann. Dies hat allerdings auch Nachteile: Zum einen stehen bei niedrigerer Zahl an Datenmodulen auch weniger IDs zur Verfügung. Wichtiger aber ist, dass die Robustheit der Tagerkennung signifikant reduziert wird, da es zu einer höheren Falsch-Positiv-Rate kommt. Dies bedeutet, dass Tags verwechselt werden oder nicht existierende Tags in zufälliger Bildtextur oder im Bildrauschen erkannt werden. Die 41h12 Familie hat ihren Rahmen nach innen verschoben, was im Vergleich zur 36h11 Familie mehr Datenmodule bei einer geringen Gesamtmodulanzahl ermöglicht.

    +

    Aus diesen Gründen empfehlen wir die Verwendung der 42h12 und 36h11-Familien und raten ausdrücklich von der Familie 16h5 ab. Letztgenannte Familie sollten nur benutzt werden, wenn eine große Erkennungsdistanz für die Anwendung unbedingt erforderlich ist. Jedoch ist die maximale Erkennungsdistanz nur ca. 25% größer, wenn anstelle der 36h11-Familie die 16h5-Familie verwendet wird.

    +

    Vorgenerierte AprilTags können von der AprilTag-Projektwebseite (https://april.eecs.umich.edu/software/apriltag.html) heruntergeladen werden. Jede Familie besteht aus mehreren PNGs, welche jeweils einen AprilTag enthalten. Jedes Pixel im PNG entspricht dabei einem Modul des AprilTags. Beim Drucken der Tags der Familien 36h11, 36h10, 25h9 und 16h5 sollte darauf geachtet werden, den weißen Rand um den AprilTag mit einzuschließen – dieser ist in den PNGs enthalten (siehe (a) in Abb. 22). Die Tags müssen außerdem ohne Interpolation auf die Druckgröße skaliert werden, sodass die scharfen Kanten erhalten bleiben.

    +
    +
    +

    Vergleich

    +

    Sowohl QR-Codes als auch AprilTags haben ihre Vor- und Nachteile. Während QR-Codes die Speicherung von benutzerdefinierten Daten erlauben, sind die Tags bei AprilTags vordefiniert und in ihrer Anzahl limitiert. Andererseits haben AprilTags eine niedrigere Auflösung und können daher auf eine größere Distanz erkannt werden. Zusätzlich hilft die durchgängige weiß-zu-schwarz-Kante in jedem AprilTag bei einer präziseren Posenschätzung.

    +
    +

    Bemerkung

    +

    Falls die Speicherung von benutzerdefinierten Daten nicht benötigt wird, sollten AprilTags QR-Codes vorgezogen werden.

    +
    +
    +
    +
    +

    Tagerkennung

    +

    Der erste Schritt der Tagerkennung ist die Detektion der Tags auf dem Stereo-Bildpaar. Dieser Schritt benötigt die meiste Zeit und seine Präzision ist entscheidend für die Präzision der finalen Tagpose. Um die Dauer dieses Schritts zu kontrollieren, kann der Parameter quality vom Benutzer konfiguriert werden. Er hat ein Herunterskalieren des Stereo-Bildpaares vor der Tagerkennung zur Folge. Hoch (High) ergibt die höchste maximale Erkennungsdistanz und Präzision, aber auch die längste Dauer der Erkennung. Niedrig (Low) führt zur kleinsten maximalen Erkennungsdistanz und Präzision, aber benötigt auch nur weniger als die halbe Zeit. Mittel (Medium) liegt dazwischen. Es sollte beachtet werden, dass dieser quality-Parameter keine Verbindung zum quality-Parameter des Stereo-Matching hat.

    +
    +_images/tag_sizes_vis.png +

    Abb. 23 Visualisierung der Modulgröße \(s\), der Größe eines Tags in Modulen \(r\) und der Größe eines Tags in Metern \(t\) für AprilTags (links und Mitte) und QR-Codes (rechts)

    +
    +

    Die maximale Erkennungsdistanz \(z\) für Qualität Hoch (High) kann mit folgenden Formeln angenähert werden:

    +
    +\[z = \frac{f s}{p},\]
    +
    +\[s = \frac{t}{r},\]
    +

    wobei \(f\) die Brennweite in Pixeln und \(s\) die Größe jedes Moduls in Metern bezeichnet. \(s\) kann leicht mit letztgenannter Formel berechnet werden, in welcher \(t\) der Taggröße in Metern und \(r\) der Breite des Tags in Modulen entspricht (bei AprilTags ohne den weißen Rahmen). Abb. 23 veranschaulicht diese Variablen. \(p\) bezeichnet die Zahl der Bildpixel pro Modul, welche für eine Erkennung erforderlich sind. Sie unterscheidet sich zwischen QR-Codes und AprilTags. Auch der Winkel des Tags zur Kamera und die Beleuchtung spielen eine Rolle. Ungefähre Werte für eine robuste Erkennung sind:

    +
      +
    • AprilTag: \(p=5\) Pixel/Modul
    • +
    • QR-Code: \(p=6\) Pixel/Modul
    • +
    +

    Die folgenden Tabellen enthalten Beispiele für die maximale Erkennungsdistanz in unterschiedlichen Situationen. Die Brennweite des rc_visard wird dafür mit 1075 Pixeln, die Qualität mit High angenommen.

    + + +++++ + + + + + + + + + + + + + + + + + + + + +
    Tab. 17 Beispiele zur maximalen Erkennungsdistanz für AprilTags mit einer Breite von \(t=4\) cm
    AprilTag-FamilieTagbreiteMaximale Distanz
    36h11 (empfohlen)8 Module1.1 m
    16h56 Module1.4 m
    41h12 (empfohlen)5 Module1.7 m
    + + ++++ + + + + + + + + + + + + + +
    Tab. 18 Beispiele zur maximalen Erkennungsdistanz für QR-Codes mit einer Breite von \(t=8\) cm
    TagbreiteMaximale Distanz
    29 Module0.49 m
    21 Module0.70 m
    +
    +
    +

    Posenschätzung

    +

    Für jeden erkannten Tag wird dessen Pose im Kamerakoordinatensystem geschätzt. Eine Bedingung dafür ist, dass der Tag vollständig im linken und rechten Bild zu sehen ist. Das Koordinatensystem ist wie unten gezeigt am Tag ausgerichtet.

    +
    +_images/tag_coord_frames.png +

    Abb. 24 Koordinatensysteme für AprilTags (links und Mitte) bzw. QR-Codes (rechts)

    +
    +

    Die z-Achse zeigt „in“ den Tag. Es ist zu beachten, dass, auch wenn AprilTags den weißen Rand in ihrer Definition enthalten, der Ursprung des Koordinatensystems trotzdem am Übergang des weißen zum schwarzen Rand liegt. Da AprilTags keine offensichtliche Orientierung haben, liegt der Ursprung in der oberen linken Ecke des vorgenerierten AprilTags.

    +

    Während der Posenschätzung wird auch die Größe des Tags geschätzt unter der Annahme, dass der Tag quadratisch ist. Bei QR-Codes bezieht sich die Größe auf den gesamten Tag, bei AprilTags dagegen nur auf den Bereich innerhalb des Übergangs vom schwarzen zum weißen Rand. Das heißt, dass bei Tags der Familien 16h5, 25h9, 36h10 und 36h11 der äußere weiße Rand ignoriert wird.

    +

    Der Benutzer kann auch die ungefähre Größe (\(\pm 10\%\)) eines Tags angeben. Alle Tags, die dieser Einschränkung nicht entsprechen, werden automatisch herausgefiltert. Weiter hilft diese Information in bestimmten Situationen, Mehrdeutigkeiten in der Posenschätzung aufzulösen, die entstehen können, wenn mehrere Tags mit derselben ID im linken und rechten Bild sichtbar und diese Tags parallel zu den Bildzeilen ausgerichtet sind.

    +
    +

    Bemerkung

    +

    Für beste Ergebnisse der Posenschätzung sollte der Tag sorgfältig gedruckt und auf einem steifen und möglichst ebenen Untergrund angebracht werden. Jegliche Verzerrung des Tags oder Unebenheit der Oberfläche verschlechtert die geschätzte Pose.

    +
    +
    +

    Bemerkung

    +

    Wir empfehlen, die ungefähre Größe der Tags anzugeben. Ansonsten, falls mehrere Tags mit derselben ID im linken oder rechten Bild sichtbar sind, kann es zu einer fehlerhaften Posenschätzung kommen, wenn die Tags gleich orientiert sind und sie ungefähr parallel zu den Bildzeilen angeordnet sind. Auch wenn die Größe nicht angegeben sein sollte, versuchen die TagDetect-Module jedoch, solche Situationen zu erkennen und verwerfen betroffene Tags.

    +
    +

    Unten stehende Tabellen enthalten grobe Angaben zur Präzision der geschätzten Posen von AprilTags. Wir unterscheiden zwischen lateraler Präzision (also in x- und y-Richtung) und Präzision in z-Richtung. Es wird angenommen, dass quality auf High gesetzt ist, und dass die Blickrichtung der Kamera parallel zur Normalen des Tags ist. Die Größe eines Tags hat keinen signifikanten Einfluss auf die Präzision in lateraler und z-Richtung. Im Allgemeinen verbessert ein größerer Tag allerdings die Präzision. Im Bezug auf die Präzision der Rotation, im speziellen um die x- und y-Achsen, übertreffen große Tags kleinere deutlich.

    + + +++++ + + + + + + + + + + + + + + + + + + + + +
    Tab. 19 Ungefähre Präzision der Position von AprilTag Messungen mit Qualität Hoch in einem idealen Szenario
    Distanzrc_visard NG 160 - lateralrc_visard NG 160 - z
    0.5 m0.05 mm0.3 mm
    1.0 m0.15 mm1.4 mm
    2.0 m0.5 mm3.7 mm
    + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + +
    Tab. 20 Ungefähre Präzision der Orientierung von AprilTag Messungen mit Qualität Hoch in einem idealen Szenario für verschiedene Tag-Größen
    Distanz60 x 60 mm120 x 120 mm
    0.5 m0.2°
    1.0 m0.8°0.3°
    2.0 m2.0°0.8°
    3.0 m1.8°
    +
    +
    +

    Tag-Wiedererkennung

    +

    Jeder Tag besitzt eine ID: bei AprilTags ist dies die Familie zusammen mit der AprilTag-ID, bei QR-Codes die enthaltenen Daten. Diese IDs sind jedoch nicht einzigartig, da mehrere Tags mit derselben ID in einer Szene vorkommen können.

    +

    Zur Unterscheidung dieser Tags weisen die TagDetect-Module jedem Tag einen eindeutigen Identifikator zu. Um den Benutzer dabei zu unterstützen, denselben Tag über mehrere Tagerkennungsläufe hinweg zu identifizieren, versucht das TagDetect-Modul Tags wiederzuerkennen. Falls erfolgreich, wird einem Tag derselbe Identifikator zugewiesen.

    +

    Die Tag-Wiedererkennung vergleicht die Positionen der Ecken der Tags im Kamera-Koordinatensystem, um identische Tags wiederzufinden. Tags werden als identisch angenommen, falls sie sich nicht oder nur geringfügig in diesem Koordinatensystem bewegt haben.

    +

    Über den max_corner_distance-Parameter kann der Benutzer festlegen, wie weit ein Tag sich zwischen zwei Erkennungsläufen bewegen darf, um als identisch zu gelten. Der Parameter definiert die maximale Distanz zwischen den Ecken zweier Tags, was in Abb. 25 dargestellt ist. Die euklidischen Abstände der vier zusammengehörenden Tagecken in 3D werden berechnet. Falls keiner dieser Abstände den Grenzwert überschreitet, gilt der Tag als wiedererkannt.

    +
    +_images/tag-re-identification.png +

    Abb. 25 Vereinfachte Darstellung der Tag-Wiedererkennung. Die euklidischen Abstände zwischen zusammengehörigen Tagecken in 3D werden berechnet (rote Pfeile).

    +
    +

    Nach einer bestimmten Anzahl von Tagerkennungsläufen werden vorher gesehene Tags verworfen, falls diese in der Zwischenzeit nicht mehr erkannt wurden. Dies kann über den Parameter forget_after_n_detections festgelegt werden.

    +
    +
    +

    Hand-Auge-Kalibrierung

    +

    Falls die Kamera zu einem Roboter kalibriert wurde, kann das TagDetect-Modul automatisch Posen im Roboterkoordinatensystem ausgeben. Für die Services kann das Koordinatensystem der berechneten Posen mit dem Argument pose_frame spezifiziert werden.

    +

    Zwei verschiedene pose_frame-Werte können gewählt werden:

    +
      +
    1. Kamera-Koordinatensystem (camera): Alle Posen sind im Kamera-Koordinatensystem angegeben.
    2. +
    3. Benutzerdefiniertes externes Koordinatensystem (external): Alle Posen sind im sogenannten externen Koordinatensystem angegeben, welches vom Nutzer während der Hand-Auge-Kalibrierung gewählt wurde. In diesem Fall bezieht das Modul alle notwendigen Informationen über die Kameramontage und die kalibrierte Hand-Auge-Transformation automatisch vom Modul Hand-Auge-Kalibrierung. Für den Fall einer robotergeführten Kamera ist vom Nutzer zusätzlich die jeweils aktuelle Roboterpose robot_pose anzugeben.
    4. +
    +

    Zulässige Werte zur Angabe des Referenzkoordinatensystems sind camera und external. Andere Werte werden als ungültig zurückgewiesen.

    +
    +
    +

    Parameter

    +

    Es stehen zwei getrennte Module für die Tagerkennung zur Verfügung, eines für AprilTag- und eines für QR-Code-Erkennung: rc_april_tag_detect bzw. rc_qr_code_detect. Abgesehen vom Modulnamen teilen beide die gleiche Schnittstellendefinition.

    +

    Neben der REST-API-Schnittstelle stellen die TagDetect-Module außerdem Seiten in der Web GUI unter Module ‣ AprilTag und Module ‣ QR Code bereit, über welche sie manuell ausprobiert und konfiguriert werden können.

    +

    Im Folgenden sind die Parameter am Beispiel von rc_qr_code_detect aufgelistet. Sie gleichen denen von rc_april_tag_detect.

    +

    Dieses Softwaremodul bietet folgende Laufzeitparameter:

    + + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Tab. 21 Laufzeitparameter des rc_qr_code_detect-Moduls
    NameTypMin.Max.DefaultBeschreibung
    detect_inverted_tagsboolfalsetruefalseErkennt Tags, bei denen Schwarz und Weiß vertauscht sind
    forget_after_n_detectionsint321100030Anzahl an Erkennungsläufen, nach denen ein vorher gesehener Tag während der Tag-Wiedererkennung verworfen wird
    max_corner_distancefloat640.0010.010.005Maximale Distanz zusammengehöriger Ecken zweier Tags während der Tag-Wiedererkennung
    qualitystring--HighQualität der Tagerkennung: [Low, Medium, High]
    use_cached_imagesboolfalsetruefalseBenutze das zuletzt empfangene Stereo-Bildpaar, anstatt auf ein neues zu warten
    +

    Über die REST-API können diese Parameter wie folgt gesetzt werden.

    +
    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/<rc_qr_code_detect|rc_april_tag_detect>/parameters/parameters?<parameter-name>=<value>
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/<rc_qr_code_detect|rc_april_tag_detect>/parameters?<parameter-name>=<value>
    +
    +
    +
    +
    +
    +
    +
    +

    Statuswerte

    +

    Die TagDetect-Module melden folgende Statuswerte:

    + + ++++ + + + + + + + + + + + + + + + + + + + +
    Tab. 22 Statuswerte der rc_qr_code_detect- und rc_april_tag_detect-Module
    NameBeschreibung
    data_acquisition_timeZeit in Sekunden, für die beim letzten Aufruf auf Bilddaten gewartet werden musste
    last_timestamp_processedZeitstempel des letzten verarbeiteten Bilddatensatzes
    processing_timeBerechnungszeit für die letzte Erkennung in Sekunden
    stateDer aktuelle Zustand des Moduls
    +

    Der Parameter state kann folgende Werte annehmen:

    + + ++++ + + + + + + + + + + + + + + + + +
    Tab. 23 Mögliche Zustände der TagDetect-Module
    ZustandsnameBeschreibung
    IDLEDas Modul ist inaktiv.
    RUNNINGDas Modul läuft und ist bereit zur Tagerkennung.
    FATALEin schwerwiegender Fehler ist aufgetreten.
    +
    +
    +

    Services

    +

    Die TagDetect-Module implementieren einen Zustandsautomaten, welcher zum Starten und Stoppen genutzt werden kann. Die eigentliche Tagerkennung kann mit detect ausgelöst werden.

    +

    Die angebotenen Services von rc_qr_code_detect bzw. rc_april_tag_detect können mithilfe der REST-API-Schnittstelle oder der rc_visard NG Web GUI ausprobiert und getestet werden.

    +
    +

    detect

    +
    +

    löst eine Tagerkennung aus.

    +
    +

    Details

    +
    +

    Abhängig vom use_cached_images-Parameter arbeitet das Modul auf dem zuletzt empfangenen Bildpaar (wenn true) oder wartet auf ein Bildpaar, das nach dem Auslösen des Services aufgenommen wurde (wenn false, dies ist das Standardverhalten). Auch wenn der Parameter auf true steht, arbeitet die Tagerkennung niemals mehrmals auf einem Bildpaar.

    +

    Es wird empfohlen, detect nur im Zustand RUNNING aufzurufen. Es ist jedoch auch im Zustand IDLE möglich, was zu einem Autostart und -stop des Moduls führt. Dies hat allerdings Nachteile: Erstens dauert der Aufruf deutlich länger, zweitens funktioniert die Tag-Wiedererkennung nicht. Es wird daher ausdrücklich empfohlen, das Modul manuell zu starten, bevor detect aufgerufen wird.

    +

    Tags können vom detect-Ergebnis aus mehreren Gründen ausgeschlossen werden, z.B. falls ein Tag nur in einem der Kamerabilder sichtbar war, oder falls die Posenschätzung fehlschlug. Diese herausgefilterten Tags werden im Log aufgelistet, auf welches wie in Download der Logdateien beschrieben zugegriffen werden kann.

    +

    Auf den Web GUI-Seiten der TagDetect-Module wird eine Visualisierung der letzten Tagerkennung bereitgestellt. Diese Visualisierung wird allerdings erst angezeigt, sobald die Tagerkennung mindestens einmal ausgeführt wurde. In der Web GUI kann die Tagerkennung außerdem manuell ausprobiert werden, indem die Detektieren-Schaltfläche betätigt wird.

    +

    Aufgrund von Änderungen der Systemzeit auf dem rc_visard NG können Zeitsprünge auftreten, sowohl vorwärts als auch rückwärts (siehe Zeitsynchronisierung). Während Vorwärtssprünge keinen Einfluss auf die TagDetect-Module haben, invalidieren Rücksprünge die bereits empfangenen Bilder. Deshalb wird, wenn ein Rücksprung erkannt wird, Fehler -102 beim nächsten detect-Aufruf zurückgegeben. Dies geschieht auch, um den Benutzer darauf hinzuweisen, dass die Zeitstempel in der detect-Antwort ebenso zurückspringen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/<rc_qr_code_detect|rc_april_tag_detect>/services/detect
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/<rc_qr_code_detect|rc_april_tag_detect>/services/detect
    +
    +
    +
    +
    +
    + +
    +

    Optionale Serviceargumente:

    +
    +

    tags bezeichnet die Liste der Tag-IDs, welche erkannt werden sollen. Bei QR-Codes ist die ID gleich den enthaltenen Daten. Bei AprilTags ist es „<Familie>_<ID>“, also beispielsweise „36h11_5“ für Familie 36h11 und ID 5. Natürlich kann das AprilTag-Modul nur zur Erkennung von AprilTags und das QR-Code-Modul nur zur Erkennung von QR-Codes genutzt werden.

    +

    Die tags-Liste kann auch leer gelassen werden. In diesem Fall werden alle erkannten Tags zurückgegeben. Dieses Feature sollte nur während der Entwicklung einer Applikation oder zur Fehlerbehebung benutzt werden. Wann immer möglich sollten die konkreten Tag-IDs aufgelistet werden, zum einen zur Vermeidung von Fehldetektionen, zum anderen auch um die Tagerkennung zu beschleunigen, da nicht benötigte Tags aussortiert werden können.

    +

    Bei AprilTags kann der Benutzer nicht nur einzelne Tags, sondern auch eine gesamte Familie spezifizieren, indem die ID auf „<family>“ gesetzt wird, bspw. „36h11“. Dadurch werden alle Tags dieser Familie erkannt. Es ist auch möglich, mehrere Familien oder eine Kombination aus Familien und einzelnen Tags anzugeben. Zum Beispiel kann detect mit „36h11“, „25h9_3“ und „36h10“ zur gleichen Zeit aufgerufen werden.

    +

    Zusätzlich zur ID kann auch die ungefähre Größe (\(\pm 10\%\)) eines Tags angegeben werden. Wie in Posenschätzung erklärt, verhilft dies Mehrdeutigkeiten aufzulösen, die in bestimmten Situationen auftreten können, und kann zum Herausfiltern von Tags genutzt werden, die nicht der angegebenen Größe entsprechen.

    +

    Die tags-Liste ist ODER-verknüpft. Es werden alle Tags zurückgegeben, die mit einem der id-size-Paare in der tags-Liste übereinstimmen.

    +

    Das Feld pose_frame gibt an, ob die Posen im Kamera- oder im externen Koordinatensystem zurückgegeben werden (siehe Hand-Auge-Kalibrierung. Der Standardwert ist camera.

    +

    Die Definition der Request-Argumente mit jeweiligen Datentypen ist:

    +
    {
    +  "args": {
    +    "pose_frame": "string",
    +    "robot_pose": {
    +      "orientation": {
    +        "w": "float64",
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      },
    +      "position": {
    +        "x": "float64",
    +        "y": "float64",
    +        "z": "float64"
    +      }
    +    },
    +    "tags": [
    +      {
    +        "id": "string",
    +        "size": "float64"
    +      }
    +    ]
    +  }
    +}
    +
    +
    +
    +
    +
    +

    timestamp wird auf den Zeitstempel des Bildpaares gesetzt, auf dem die Tagerkennung gearbeitet hat.

    +

    tags enthält alle erkannten Tags.

    +

    id ist die ID des Tags, vergleichbar zur id in der Anfrage.

    +

    instance_id ist der zufällige, eindeutige Identifikator eines Tags, welcher von der Tag-Wiedererkennung zugewiesen wird.

    +

    pose enthält position und orientation. Die Orientierung ist im Quaternionen-Format angegeben.

    +

    pose_frame bezeichnet das Koordinatensystem, auf welches obige Pose bezogen ist, und hat den Wert camera oder external.

    +

    size wird auf die gemessene Taggröße gesetzt.

    +

    return_code enthält mögliche Warnungen oder Fehlercodes und Nachrichten.

    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "detect",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    },
    +    "tags": [
    +      {
    +        "id": "string",
    +        "instance_id": "string",
    +        "pose": {
    +          "orientation": {
    +            "w": "float64",
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          },
    +          "position": {
    +            "x": "float64",
    +            "y": "float64",
    +            "z": "float64"
    +          }
    +        },
    +        "pose_frame": "string",
    +        "size": "float64",
    +        "timestamp": {
    +          "nsec": "int32",
    +          "sec": "int32"
    +        }
    +      }
    +    ],
    +    "timestamp": {
    +      "nsec": "int32",
    +      "sec": "int32"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    start

    +
    +

    startet das Modul durch einen Übergang von IDLE nach RUNNING.

    +

    Details

    +
    +

    Wenn das Modul läuft, empfängt es die Bilder der Stereokamera und ist bereit, Tags zu erkennen. Um Rechenressourcen zu sparen, sollte das Modul nur laufen, wenn dies nötig ist.

    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/<rc_qr_code_detect|rc_april_tag_detect>/services/start
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/<rc_qr_code_detect|rc_april_tag_detect>/services/start
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "start",
    +  "response": {
    +    "accepted": "bool",
    +    "current_state": "string"
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +

    stop

    +
    +

    stoppt das Modul durch einen Übergang zu IDLE.

    +
    +

    Details

    +
    +

    Dieser Übergang kann auf dem Zustand RUNNING und FATAL durchgeführt werden. Alle Tag-Wiedererkennungs-Informationen werden beim Stoppen gelöscht.

    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/<rc_qr_code_detect|rc_april_tag_detect>/services/stop
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/<rc_qr_code_detect|rc_april_tag_detect>/services/stop
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "stop",
    +  "response": {
    +    "accepted": "bool",
    +    "current_state": "string"
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    restart

    +
    +

    startet das Modul neu.

    +
    +

    Details

    +
    +

    Wenn im Zustand RUNNING oder FATAL, wird das Modul erst gestoppt und dann wieder gestartet. In IDLE wird das Modul nur gestartet.

    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/<rc_qr_code_detect|rc_april_tag_detect>/services/restart
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/<rc_qr_code_detect|rc_april_tag_detect>/services/restart
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "restart",
    +  "response": {
    +    "accepted": "bool",
    +    "current_state": "string"
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    reset_defaults

    +
    +

    stellt die Werkseinstellungen der Parameter dieses Moduls wieder her und wendet sie an („factory reset“).

    +

    Details

    +
    +

    Dieser Service kann wie folgt aufgerufen werden.

    +
    + +
    +
    PUT http://<host>/api/v2/pipelines/0/nodes/<rc_qr_code_detect|rc_april_tag_detect>/services/reset_defaults
    +
    +
    +
    +
    +
    PUT http://<host>/api/v1/nodes/<rc_qr_code_detect|rc_april_tag_detect>/services/reset_defaults
    +
    +
    +
    +
    +
    + +
    +Dieser Service hat keine Argumente.
    +
    +

    Die Definition der Response mit jeweiligen Datentypen ist:

    +
    {
    +  "name": "reset_defaults",
    +  "response": {
    +    "return_code": {
    +      "message": "string",
    +      "value": "int16"
    +    }
    +  }
    +}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    Rückgabecodes

    +

    Zusätzlich zur eigentlichen Serviceantwort gibt jeder Service einen sogenannten return_code bestehend aus einem Integer-Wert und einer optionalen Textnachricht zurück. Erfolgreiche Service-Anfragen werden mit einem Wert von 0 quittiert. Positive Werte bedeuten, dass die Service-Anfrage zwar erfolgreich bearbeitet wurde, aber zusätzliche Informationen zur Verfügung stehen. Negative Werte bedeuten, dass Fehler aufgetreten sind. Für den Fall, dass mehrere Rückgabewerte zutreffend wären, wird der kleinste zurückgegeben, und die entsprechenden Textnachrichten werden in return_code.message akkumuliert.

    +

    Die folgende Tabelle listet die möglichen Rückgabe-Codes auf:

    +
    +
    ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CodeBeschreibung
    0Erfolg
    -1Ein ungültiges Argument wurde übergeben.
    -4Die maximale Wartezeit auf ein Stereo-Bildpaar wurde überschritten.
    -9Die Lizenz ist ungültig.
    -11Sensor nicht verbunden, nicht unterstützt oder nicht bereit
    -101Ein interner Fehler trat während der Tagerkennung auf.
    -102Ein Rückwärtssprung der Systemzeit trat auf
    -103Ein interner Fehler trat während der Posenschätzung auf.
    -200Ein schwerwiegender interner Fehler trat auf.
    200Mehrere Warnungen traten auf. Siehe die Auflistung in message.
    201Das Modul war nicht im Zustand RUNNING.
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/time_sync.html b/v24.04/de/time_sync.html new file mode 100644 index 0000000..767f98b --- /dev/null +++ b/v24.04/de/time_sync.html @@ -0,0 +1,684 @@ + + + + + + + + + + + Zeitsynchronisierung — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Zeitsynchronisierung

    +

    Der rc_visard NG stellt für alle Bilder und Nachrichten Zeitstempel zur Verfügung. Um diese mit der Zeit auf dem Applikations-Rechner zu vergleichen, muss die Zeit synchronisiert werden.

    +
    +
    Dies kann über das Network Time Protocol (NTP), welches die Standardeinstellung ist, oder über das Precision Time Protocol (PTP) erfolgen.
    +

    Die aktuelle Systemzeit sowie der Status der Zeitsynchronisierung können über die REST-API abgerufen und darüber hinaus auch in der Web GUI auf der Seite System eingesehen werden.

    +
    +

    Bemerkung

    +

    Abhängig von der Erreichbarkeit von NTP- oder PTP-Servern, kann es bis zu mehreren Minuten dauern, bis die Zeit synchronisiert ist.

    +
    +
    +

    NTP

    +

    Das Network Time Protocol (NTP) ist ein TCP/IP Protokoll um Zeit über ein Netzwerk zu synchronisieren. Im Wesentlichen fordert ein Client die aktuelle Zeit periodisch von einem Server an und nutzt diese, um seine eigene Uhr zu stellen bzw. zu korrigieren.

    +

    Standardmäßig versucht der rc_visard NG den NTP-Server des NTP-Pool-Projekts zu erreichen, wozu eine Verbindung zum Internet nötig ist.

    +

    Falls die Netzwerkkonfiguration des rc_visard NG auf DHCP (entspricht der Werkseinstellung) konfiguriert ist, werden NTP-Server auch vom DHCP-Server angefordert und verwendet.

    +
    +
    +

    PTP

    +

    Das Precision Time Protocol (PTP, auch als IEEE1588 bekannt) ist ein Protokoll, welches eine genauere und robustere Synchronisation der Uhren erlaubt als NTP.

    +

    Der rc_visard kann als PTP-Slave konfiguriert werden. Dies ist über die Standard GigE Vision 2.0/GenICam-Schnittstelle mit dem Parameter GevIEEE1588 möglich.

    +

    Mindestens ein PTP-Master muss die Zeit im Netzwerk zur Verfügung stellen. Unter Linux kann ein PTP-Master beispielsweise auf dem Netzwerkport eth0 gestartet werden mit sudo ptpd --masteronly --foreground -i eth0.

    +

    Während der rc_visard mit einem PTP-Master synchronisiert ist (Sensor ist im PTP SLAVE-Status), ist die Synchronisierung via NTP pausiert.

    +
    +
    +

    Manuelles Setzen der Zeit

    +

    Der rc_visard NG ermöglicht das manuelle Setzen des aktuellen Datums und der Uhrzeit über den /system/time Endpoint der REST-API, wenn keine Zeitsynchronisation aktiv ist (siehe System und Logs). Eine einfachere Möglichkeit zum Setzen der Systemzeit gibt es auf der Seite System der Web GUI .

    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/troubleshooting.html b/v24.04/de/troubleshooting.html new file mode 100644 index 0000000..61902b7 --- /dev/null +++ b/v24.04/de/troubleshooting.html @@ -0,0 +1,865 @@ + + + + + + + + + + + Fehlerbehebung — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Fehlerbehebung

    +
    +

    LED-Farben

    +

    Während des Boot-Vorgangs wechselt die LED mehrmals die Farbe, um die verschiedenen Boot-Phasen anzuzeigen:

    + + ++++ + + + + + + + + + + + + + + + + +
    Tab. 55 LED-Farbcodes
    LED-FarbeBoot-Vorgang
    WeißStromversorgung OK
    BlauNormaler Boot-Vorgang
    GrünBoot-Vorgang abgeschlossen, rc_visard NG einsatzbereit
    +

    Die LED dient ferner dazu, Probleme oder Fehlerzustände zu signalisieren, um den Benutzer im Rahmen der Problembehandlung zu unterstützen.

    + + ++++ + + + + + + + + + + + + + + + + + + + +
    Tab. 56 LED-Farbcodes
    LED-FarbeProblem oder Fehlerzustand
    AusDer Sensor wird nicht mit Strom versorgt.
    Kurzes rotes Blinken alle fünf SekundenKeine Netzwerkkonnektivität
    RotEin Prozess wurde beendet und kann nicht neu gestartet werden.
    GelbTemperaturwarnung (Gehäusetemperatur liegt über 60 °C)
    +
    +
    +

    Probleme mit der Hardware

    +

    LED leuchtet nicht

    +

    Der rc_visard NG fährt nicht hoch.

    +
      +
    • Vergewissern Sie sich, dass alle Kabel ordentlich angeschlossen und gesichert sind.
    • +
    • Vergewissern Sie sich, dass eine geeignete Gleichstromquelle (18–30 V) mit korrekter Polarität an den in der Spezifikation der Steckerbelegung mit Stromzufuhr und Masse gekennzeichneten Pins angeschlossen ist. Wird der Sensor außerhalb des angegebenen Spannungsbereichs, mit Wechselstrom oder mit umgekehrter Polarität betrieben, oder ist er an ein Versorgungsnetz angeschlossen, in dem Spannungsspitzen auftreten, kann dies zu dauerhaften Hardware-Schäden führen.
    • +
    +

    LED leuchtet gelb, obwohl der Sensor anscheinend normal funktioniert

    +

    Dies kann auf eine erhöhte Gehäusetemperatur hinweisen. Der Sensor ist ggf. so montiert, dass die Luft die Kühlrippen nicht ungehindert umströmen kann.

    +
      +
    • Reinigen Sie die Kühlrippen und das Gehäuse.
    • +
    • Stellen Sie sicher, dass in alle Richtungen um die Kühlrippen 10 cm Platz sind, damit die konvektive Kühlung ordentlich funktioniert.
    • +
    • Vergewissern Sie sich, dass die Umgebungstemperatur der Spezifikation entspricht.
    • +
    +

    Der Sensor kann die Verarbeitungsgeschwindigkeit drosseln wenn die Kühlung nicht ausreicht oder die Umgebungstemperatur außerhalb des zugelassenen Bereichs liegt.

    +

    Probleme mit der Zuverlässigkeit und/oder mechanische Schäden

    +

    Dies kann darauf hinweisen, dass die Umgebungsbedingungen (Vibrationen, Erschütterungen, Schwingungen und Temperatur) außerhalb der entsprechenden Spezifikationen liegen.

    +
      +
    • Wird der rc_visard NG außerhalb der angegebenen Umgebungsbedingungen betrieben, kann dies zu Schäden am Gerät und zum Erlöschen der Garantie führen.
    • +
    +

    Stromschlag bei Berührung des Sensors

    +

    Dies deutet auf einen elektrischen Defekt im Sensor, in der Verkabelung, im Netzteil oder im angrenzenden System hin.

    +
      +
    • Schalten Sie das System unverzüglich aus, ziehen Sie alle Kabel und lassen Sie die Einrichtung des Geräts durch einen qualifizierten Elektriker überprüfen.
    • +
    • Vergewissern Sie sich, dass das Sensorgehäuse ordentlich geerdet ist. Prüfen Sie auf große Erdschleifen.
    • +
    +
    +
    +

    Probleme mit der Konnektivität

    +

    LED blinkt alle 5 Sekunden rot

    +

    Wenn die LED alle fünf Sekunden kurz rot blinkt, kann der rc_visard NG keine Netzwerkverbindung herstellen.

    +
      +
    • Überprüfen Sie, ob das Netzwerkkabel ordentlich mit dem rc_visard NG und dem Netzwerk verbunden ist.
    • +
    • Ist kein Problem erkennbar, tauschen Sie das Ethernet-Kabel aus.
    • +
    +

    Die Kamera wird vom GigE Vision-Client oder vom rcdiscover-gui-Tool nicht erkannt

    +
      +
    • Überprüfen Sie, ob die LED an der Gerätefront des rc_visard NG alle fünf Sekunden kurz blinkt (überprüfen Sie das Kabel, wenn dies der Fall ist).
    • +
    • Vergewissern Sie sich, dass der rc_visard NG an das gleiche Subnetz angeschlossen ist (der Discovery-Mechanismus nutzt Broadcasts, die nicht über verschiedene Subnetze funktionieren).
    • +
    +

    Die Web GUI kann nicht aufgerufen werden

    +
      +
    • Vergewissern Sie sich, dass der rc_visard NG eingeschaltet und an das gleiche Subnetz wie der Host-Computer angeschlossen ist.
    • +
    • Überprüfen Sie, ob die LED an der Gerätefront des rc_visard NG alle fünf Sekunden kurz blinkt (überprüfen Sie das Kabel, wenn dies der Fall ist).
    • +
    • Überprüfen Sie, ob die rcdiscover-gui den Sensor erkennt. Gibt das Tool an, dass der rc_visard NG nicht erreichbar ist, ist die Netzwerkkonfiguration des rc_visard NG fehlerhaft.
    • +
    • Wird der rc_visard NG als unerreichbar angegeben, versuchen Sie, einen Doppelklick auf den Geräteeintrag zu machen, um die Web GUI in einem Browser zu öffnen.
    • +
    • Funktioniert das nicht, versuchen Sie, die vom rc_visard NG gemeldete IP-Adresse direkt als Zieladresse in den Browser einzugeben.
    • +
    +

    Zu viele Web-GUI-Instanzen gleichzeitig geöffnet

    +

    Die Web GUI verbraucht Verarbeitungsressourcen des rc_visard NG, um die zu übertragenden Bilder zu komprimieren und die regelmäßig vom Browser zusammengestellten Statistiken auszugeben. Werden gleichzeitig mehrere Instanzen der Web GUI auf einem oder mehreren Rechnern geöffnet, so kann die Leistung des rc_visard NG stark abnehmen. Die Web GUI ist für Konfigurations- und Validierungszwecke gedacht, nicht jedoch, um den rc_visard NG dauerhaft zu überwachen.

    +
    +
    +

    Probleme mit den Kamerabildern

    +

    Kamerabild ist zu hell

    +
      +
    • Wenn die Kamera im manuellen Belichtungsmodus arbeitet, versuchen Sie, die Belichtungszeit zu verkürzen (siehe Parameter) oder
    • +
    • schalten Sie auf automatische Belichtung um (siehe Parameter).
    • +
    +

    Kamerabild ist zu dunkel

    +
      +
    • Wenn die Kamera im manuellen Belichtungsmodus arbeitet, versuchen Sie, die Belichtungszeit zu verlängern (siehe Parameter) oder
    • +
    • schalten Sie auf automatische Belichtung um (siehe Parameter).
    • +
    +

    Kamerabild rauscht zu stark

    +

    Große Gain-Faktoren verursachen ein Bildrauschen mit hoher Amplitude. Wollen Sie das Bildrauschen verringern,

    +
      +
    • verwenden Sie eine zusätzliche Lichtquelle, um die Lichtintensität der Aufnahme zu erhöhen, oder
    • +
    • stellen Sie eine größere maximale Autobelichtungszeit ein (siehe Parameter).
    • +
    +

    Kamerabild ist unscharf

    +
      +
    • Überprüfen Sie, ob das Objekt zu nahe an der Linse liegt, und erhöhen Sie bei Bedarf den Abstand zwischen dem Objekt und der Linse.
    • +
    • Überprüfen Sie, ob die Kameralinsen verschmutzt sind, und reinigen Sie diese bei Bedarf.
    • +
    • Trifft keiner der vorstehenden Punkte zu, kann es sein, dass ein schweres Hardware-Problem vorliegt. Bitte wenden Sie sich an den Support.
    • +
    +

    Kamerabild ist verschwommen

    +

    Schnelle Bewegungen können in Kombination mit langen Belichtungszeiten zu Unschärfe führen. Um Bewegungsunschärfe zu verringern,

    +
      +
    • verringern Sie die Bewegungsgeschwindigkeit der Kamera,
    • +
    • verringern Sie die Bewegungsgeschwindigkeit von Objekten im Sichtfeld der Kamera oder
    • +
    • verkürzen Sie die Belichtungszeit der Kameras (siehe Parameter).
    • +
    +

    Kamerabild ist verzerrt

    +
      +
    • Überprüfen Sie, ob die Linsen verschmutzt sind, und reinigen Sie diese bei Bedarf (siehe Reinigung der Kameralinsen).
    • +
    • Trifft keiner der vorstehenden Punkte zu, kann es sein, dass ein schweres Hardware-Problem vorliegt. Bitte wenden Sie sich an den Support.
    • +
    +

    Bildwiederholrate ist zu niedrig

    +
      +
    • Erhöhen Sie die Bildwiederholrate gemäß den Anweisungen in Parameter.
    • +
    • Die maximale Bildwiederholrate der Kameras beträgt 25 Hz.
    • +
    +
    +
    +

    Probleme mit Tiefen-/Disparitäts-, Fehler- oder Konfidenzbildern

    +

    Die folgenden Hinweise gelten auch für Fehler- und Konfidenzbilder, da sie direkt mit den Disparitätsbildern zusammenhängen.

    +

    Disparitätsbild spärlich befüllt oder leer

    + +
      +
    • Überprüfen Sie die Kalibrierung der Kameras und führen Sie bei Bedarf eine Neukalibrierung durch (siehe Kamerakalibrierung).
    • +
    +

    Bildwiederholrate der Disparitätsbilder ist zu niedrig

    +
      +
    • Überprüfen und erhöhen Sie die Bildwiederholrate der Kamerabilder (siehe Parameter). Die Bildwiederholrate der Disparitätsbilder kann nicht größer sein als die Bildwiederholrate der Kamerabilder.
    • +
    • Wählen Sie eine geringere Qualität des Disparitätsbilds.
    • +
    • Erhöhen Sie den Minimalen Abstand so viel wie für die Applikation möglich.
    • +
    +

    Disparitätsbild zeigt keine nahe liegenden Objekte

    +
      +
    • Überprüfen Sie, ob das Objekt zu nahe an der Linse liegt. Beachten Sie die unterschiedlichen Tiefenmessbereiche der Kameravarianten.
    • +
    • Senken Sie den Minimalen Abstand.
    • +
    +

    Disparitätsbild zeigt keine weit entfernten Objekte

    + +

    Disparitätsbild rauscht zu stark

    + +

    Disparitätswerte oder resultierende Tiefenwerte sind zu ungenau

    +
      +
    • Verringern Sie den Abstand zwischen der Kamera und der Szene. Der Tiefenmessfehler nimmt quadratisch mit dem Abstand zu den Kameras zu.
    • +
    • Überprüfen Sie, ob die Szene wiederkehrende Muster enthält und entfernen Sie diese bei Bedarf. Diese könnten falsche Disparitätsmessungen verursachen.
    • +
    +

    Disparitätsbild ist zu glatt

    + +

    Disparitätsbild zeigt keine feinen Strukturen

    + +
    +
    +

    Probleme mit GigE Vision/GenICam

    +

    Keine Bilder

    + +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/userspace.html b/v24.04/de/userspace.html new file mode 100644 index 0000000..97c6aeb --- /dev/null +++ b/v24.04/de/userspace.html @@ -0,0 +1,691 @@ + + + + + + + + + + + UserSpace — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    UserSpace

    +

    Der UserSpace ermöglicht es Benutzern, Container auf dem rc_visard NG bereitzustellen und zu verwalten. Es werden Standalone-Container und docker-compose Stacks unterstützt.

    +
    +

    Bemerkung

    +

    Kenntnisse von Docker-Containern werden vorausgesetzt.

    +
    +

    Falls der UserSpace verfügbar und aktiviert ist, kann er durch Klicken des Menüeintrags UserSpace in der Web GUI angesteuert werden. Diese Seite zeigt die laufenden Apps und Container mit ihrem aktuellen Status und, falls verfügbar, einem Health-Check. Jeder Container listet die veröffentlichten Ports. Falls deren Protokoll http oder https ist, können diese Container direkt in der Web GUI erreicht werden.

    +
    +

    Konfiguration

    +

    Wenn der UserSpace zum ersten Mal aktiviert wird, muss ein Benutzer für Portainer erstellt werden: Navigieren Sie in der Web GUI zu UserSpace und klicken Sie auf UserSpace Apps verwalten. Anschließend registrieren Sie das Benutzerkonto des Administrators. Dieser Schritt muss innerhalb von fünf Minuten abgeschlossen werden, nachdem der rc_visard NG hochgefahren wurde.

    +
    +
    +

    Netzwerkzugriff auf die UserSpace Anwendungen

    +

    Um die Container über Netzwerk zu erreichen, müssen die Container-Ports für den Host veröffentlicht sein.

    +

    UserSpace Informationen einschließlich laufender Apps und ihre veröffentlichten Ports können über den REST-API userspace Endpunkt abgefragt werden, oder in der Web GUI im Menü unter UserSpace angezeigt werden.

    +

    Alle Ports, die für den Host veröffentlicht sind, werden mit ihrem Protokoll (UDP oder TCP) aufgelistet. Um ein Protokoll explizit für einen App-Port zu setzen (z.B. http oder https), können Container-Labels verwendet werden:

    +
      +
    • com.roboception.app.http: alle öffentlichen TCP-Ports nutzen http
    • +
    • com.roboception.app.https.port=1234,5678: Komma-separierte Liste mit https-Ports
    • +
    +
    +
    +

    Schnittstellen

    +

    Im UserSpace verwaltete Container können auf öffentliche Schnittstellen des rc_visard NG zugreifen. Insbesondere können die Container über gRPC auf die Bilddaten zugreifen und die REST-API-Schnittstelle aufrufen. Auf den rc_visard NG (den Host) kann durch die Docker-Bridge-IP zugegriffen werden (im Standard-Docker-Bridge-Netzwerk 172.17.0.1).

    +
    +
    +

    Einschränkungen

    +

    Container unterliegen bestimmten Einschränkungen:

    +
      +
    • Container können nicht privilegiert ausgeführt werden.
    • +
    • Keinen Zugriff auf das Host-Netzwerk (das Docker Bridge-Netzwerk wird benutzt).
    • +
    • Nur Pfade innerhalb geklonter git Repositories mit einem docker-compose Stack können eingebunden werden, alle anderen Hostpfade nicht.
    • +
    • Auf Hostgeräte kann nicht zugegriffen werden. Dazu gehören z.B USB- und GPU-Geräte.
    • +
    • System Ports und intern verwendete Ports des Hosts können nicht gebunden werden. Dazu gehören Ports unter 1024, Ports von 4200 bis 4299 und die Ports 2342, 2343, 2344, 2345, 3956, 4840, 5353, 6379, 7000, 7001, 7002, 7003, 9100, 9118, 9256, 9445, 9446, 11311, 22350, 22352, 50010, 50051, 50052, 50053 und 50054.
    • +
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/warranty.html b/v24.04/de/warranty.html new file mode 100644 index 0000000..b4fc0df --- /dev/null +++ b/v24.04/de/warranty.html @@ -0,0 +1,676 @@ + + + + + + + + + + + Garantie — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Garantie

    +

    Jede Änderung oder Modifikation der Hard- oder Software dieses Produkts, die nicht ausdrücklich von Roboception genehmigt wurde, kann zum Verlust der Gewährleistungs- und Garantierechte führen.

    +
    +

    Warnung

    +

    Der rc_visard NG arbeitet mit komplexer Hardware- und Software-Technologie, die sich ggf. nicht immer so verhält, wie es der Benutzer beabsichtigt. Der Käufer muss seine Anwendung so gestalten, dass eine Fehlfunktion des rc_visard NG nicht zu Körperverletzungen, Sachschäden oder anderen Verlusten führt.

    +
    +
    +

    Warnung

    +

    Der rc_visard NG darf nicht zerlegt, geöffnet, instand gesetzt oder verändert werden, da dies eine Stromschlaggefahr oder andere Risiken nach sich ziehen kann. Kann nachgewiesen werden, dass der Benutzer versucht hat, das Gerät zu öffnen und/oder zu modifizieren, erlischt die Garantie. Dies gilt auch, wenn Typenschilder beschädigt, entfernt oder unkenntlich gemacht wurden.

    +
    +
    +

    Warnung

    +

    VORSICHT: Gemäß den europäischen CE-Anforderungen müssen alle Kabel, die zum Anschluss dieses Geräts verwendet werden, abgeschirmt und geerdet sein. Der Betrieb mit falschen Kabeln kann zu Interferenzen mit anderen Geräten oder zu einem unerwünschten Verhalten des Produkts führen.

    +
    +
    +

    Bemerkung

    +

    Dieses Produkt darf nicht über den Hausmüll entsorgt werden. Durch die korrekte Entsorgung des Produkts tragen Sie zum Umweltschutz bei. Nähere Informationen zur Wiederverwertung des Produkts erhalten Sie bei den zuständigen Behörden, bei Ihrem Entsorgungsunternehmen oder beim Händler, bei dem Sie das Produkt erworben haben.

    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/de/webgui.html b/v24.04/de/webgui.html new file mode 100644 index 0000000..36c87f8 --- /dev/null +++ b/v24.04/de/webgui.html @@ -0,0 +1,745 @@ + + + + + + + + + + + Web GUI — rc_visard NG 24.04.1 + Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Web GUI

    +

    Die Web GUI des rc_visard NG dient dazu, das Gerät zu testen, zu kalibrieren und zu konfigurieren.

    +
    +

    Zugriff auf die Web GUI

    +

    Auf die Web GUI kann über die IP-Adresse des rc_visard NG von jedem Webbrowser aus zugegriffen werden, z.B. Firefox, Google Chrome oder Microsoft Edge. Am einfachsten lässt sich die Web GUI über die rcdiscover-gui aufrufen, wenn, wie in Aufspüren von rc_visard NG-Geräten beschrieben, ein Doppelklick auf das gewünschte Gerät vorgenommen wird.

    +

    Alternativ konfigurieren einige Netzwerkumgebungen den eindeutigen Host-Namen des rc_visard NG automatisch in ihrem Domain Name Server (DNS). In diesem Fall kann die Web GUI auch direkt über folgende URL aufgerufen werden: http://<host-name>, wobei der Platzhalter <host-name> gegen den Host-Namen des Geräts auszutauschen ist.

    +

    Für Linux und macOS funktioniert das ohne DNS über das Multicast-DNS-Protokoll (mDNS), das automatisch aktiviert wird, wenn .local zum Host-Namen hinzugefügt wird. So wird die URL einfach zu: http://<host-name>.local.

    +
    +
    +

    Kennenlernen der Web GUI

    +

    Die Dashboard-Seite der Web GUI enthält die wichtigsten Informationen über das Gerät und die Softwaremodule.

    +
    +_images/webgui_dashboard_ng_de.png +

    Abb. 57 Dashboard-Seite der Web GUI des rc_visard NG

    +
    +

    Über das Menü kann auf die einzelnen Seiten der Web GUI des rc_visard NG zugegriffen werden:

    +
    +
    Kamera
    +
    zeigt einen Live-Stream der rektifizierten Kamerabilder. Die Bildwiederholrate lässt sich reduzieren, um Bandbreite zu sparen, wenn über einen GigE Vision®-Client gestreamt wird. Außerdem lässt sich die Belichtung manuell oder automatisch einstellen. Für nähere Informationen siehe Parameter.
    +
    Tiefenbild
    +
    bietet einen Live-Stream der rektifizierten Bilder der linken Kamera sowie Disparitäts- und Konfidenzbilder. Auf der Seite lassen sich verschiedene Einstellungen zur Berechnung und Filterung von Tiefenbildern vornehmen. Für nähere Informationen siehe Parameter.
    +
    +
    +
    Module
    +
    ermöglicht den Zugriff auf die Detektionsmodule des rc_visard NG (siehe Detektionsmodule).
    +
    Konfiguration
    +
    ermöglicht den Zugriff auf die Konfigurationsmodule des rc_visard NG (siehe Konfigurationsmodule).
    +
    +
    +
    Datenbank
    +
    ermöglicht den Zugriff auf die Datenbankmodule des rc_visard NG (siehe Datenbankmodule).
    +
    System
    +
    ermöglicht dem Nutzer den Zugriff auf allgemeine Systemeinstellungen, Informationen zum Gerät und den Log-Dateien, sowie die Möglichkeit, die Firmware oder Lizenzdatei zu aktualisieren.
    +
    +
    +

    Bemerkung

    +

    Weitere Informationen zu den einzelnen Parametern der Web GUI lassen sich über die jeweils daneben angezeigte Schaltfläche Info aufrufen.

    +
    +
    +
    +

    Web GUI Zugriffskontrolle

    +

    Die Web GUI bietet einen simplen Mechanismus das User Interface zu sperren um beiläufige und unbeabsichtigte Änderungen zu vermeiden.

    +

    Beim aktivieren der Web GUI Zugriffskontrolle über die System Seite muss ein Passwort gesetzt werden. Jetzt ist die Web GUI in einem gesperrten Zustand wie das Schloss Symbol in der Kopfleiste anzeigt. Alle Seiten, Kamerabilder, Parameter und Detektionen können wie gewohnt eingesehen werden, Änderungen sind aber nicht möglich.

    +

    Um die Web GUI temporär zu entsperren und Änderungen vorzunehmen, klicken Sie das Schloss Symbol und geben Sie das Passwort ein. Während das aktivieren und deaktivieren der Web GUI Zugriffskontrolle jeden betrifft der diesen rc_visard NG nutzt, ist das Entsperren nur pro Browser gültig und wird durch das Symbol mit dem offenen Schloss angezeigt. Nach 10 Minutuen Inaktivität wird es automatisch wieder gesperrt.

    +

    Die Web GUI Zugriffskontrolle kann auf der System Seite wieder deaktiviert werden nachdem das aktuelle Passwort angegeben wurde.

    +
    +

    Warnung

    +

    Dies ist keine Sicherheitsfunktion! Es sperrt nur die Web GUI und nicht die REST-API. Es ist dazu gedacht um unbeabsichtigte und beiläufige Änderungen, z.B. über einen angeschlossenen Bildschirm, zu verhindern.

    +
    +
    +

    Bemerkung

    +

    Im Fall eines vergessenen Passworts kann die Zugriffskontrolle über die REST-API mit delete ui_lock zurückgesetzt und deaktiviert werden.

    +
    +
    +
    +

    Herunterladen von Kamerabildern

    +

    Die Web GUI bietet eine einfache Möglichkeit, einen Schnappschuss der aktuellen Szene als .tar.gz-Datei zu speichern. Dazu dient das Kamerasymbol unterhalb der Live-Streams auf der Seite Kamera. Dieser Schnappschuss beinhaltet:

    +
      +
    • die rektifizierten Kamerabilder in voller Auflösung als .png-Dateien,
    • +
    • eine Kameraparameter-Datei mit Kameramatrix, Bildabmessungen, Belichtungszeit, Verstärkungsfaktor und Basisabstand der Kameras.
    • +
    • die aktuellen IMU-Messungen als imu.csv-Datei,
    • +
    • eine pipeline_status.json-Datei mit Informationen aller 3D-Kamera-, Detektions- und Konfigurationsmodule, die auf dem rc_visard NG laufen,
    • +
    • eine backup.json-Datei mit den Einstellungen des rc_visard NG einschließlich konfigurierter Greifer, Load Carrier und Regions of Interest,
    • +
    • eine system_info.json-Datei mit Systeminformationen des rc_visard NG.
    • +
    +

    Die Dateinamen enthalten die Zeitstempel.

    +
    +
    +

    Herunterladen von Tiefenbildern und Punktwolken

    +

    Die Web GUI bietet eine einfache Möglichkeit, die Tiefendaten der aktuellen Szene als .tar.gz-Datei zu speichern. Dazu dient das Kamerasymbol unterhalb der Live-Streams auf der Seite Tiefenbild. Dieser Schnappschuss beinhaltet:

    +
      +
    • die rektifizierten linken und rechten Kamerabilder in voller Auflösung als .png-Dateien,
    • +
    • eine Parameterdatei für das linke Kamerabild mit Kameramatrix, Bildabmessungen, Belichtungszeit, Verstärkungsfaktor und Basisabstand der Kameras,
    • +
    • die Disparitäts-, Fehler- und Konfidenzbilder in der Auflösung, die der aktuell eingestellten Qualität entspricht, als .png-Dateien,
    • +
    • eine Parameterdatei zum Disparitätsbild mit Kameramatrix, Bildabmessungen, Belichtungszeit, Verstärkungsfaktor und Basisabstand der Kameras, sowie Informationen über die Disparitätswerte (ungültige Werte, Skalierung, Offset),
    • +
    • die aktuellen IMU-Messungen als imu.csv-Datei,
    • +
    • eine pipeline_status.json-Datei mit Informationen aller 3D-Kamera-, Detektions- und Konfigurationsmodule, die auf dem rc_visard NG laufen,
    • +
    • eine backup.json-Datei mit den Einstellungen des rc_visard NG einschließlich konfigurierter Greifer, Load Carrier und Regions of Interest,
    • +
    • eine system_info.json-Datei mit Systeminformationen des rc_visard NG.
    • +
    +

    Die Dateinamen enthalten die Zeitstempel.

    +

    Durch Klick auf das Mesh-Symbol unterhalb der Live-Streams auf der Seite Tiefenbild kann man einen Schnappschuss herunterladen, der zusätzlich ein Mesh der Punktwolke in der aktuell eingestellten Auflösung (Qualität) als *.ply Datei enthält.

    +
    +

    Bemerkung

    +

    Das Herunterladen der Tiefenbilder löst eine Bildaufnahme aus, in der gleichen Weise wie ein Klick auf den „Aufnehmen“-Button auf der Tiefenbild-Seite der Web GUI. Dies kann einen Einfluss auf laufende Anwendungen haben.

    +
    +
    +
    + + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    + © Copyright 2023, Roboception GmbH. + +

    +
    + +
    + +
    +
    + +
    + +
    + +
    + + Optionen + de + + +
    +
    +
    Sprachen
    + + +
    en
    + + + +
    de
    + + +
    + +
    +
    Versionen
    + +
    v23.10
    + +
    v24.01
    + +
    v24.04
    + +
    + + +
    +
    Downloads
    + +
    PDF (en)
    + +
    PDF (de)
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/.buildinfo b/v24.04/en/.buildinfo new file mode 100644 index 0000000..8fafb89 --- /dev/null +++ b/v24.04/en/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 81ee2a0baeeee6cc62bb760e99be1b79 +tags: 20105804c9d2c81676a1cec6f0615c7f diff --git a/v24.04/en/.nojekyll b/v24.04/en/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/v24.04/en/_downloads/02795ba1755c845648330ae24d1e5fd1/rc_load_carrier_db-get_load_carriers.xml b/v24.04/en/_downloads/02795ba1755c845648330ae24d1e5fd1/rc_load_carrier_db-get_load_carriers.xml new file mode 100644 index 0000000..ac8ba0e --- /dev/null +++ b/v24.04/en/_downloads/02795ba1755c845648330ae24d1e5fd1/rc_load_carrier_db-get_load_carriers.xml @@ -0,0 +1,49 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/03e2ac36811a7cdda39045932e8a7220/rc_stereomatching-parameters.xml b/v24.04/en/_downloads/03e2ac36811a7cdda39045932e8a7220/rc_stereomatching-parameters.xml new file mode 100644 index 0000000..be889b7 --- /dev/null +++ b/v24.04/en/_downloads/03e2ac36811a7cdda39045932e8a7220/rc_stereomatching-parameters.xml @@ -0,0 +1,86 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/04ac820e8f72927578640d58a5dc5593/rc_hand_eye_calibration-reset_calibration.xml b/v24.04/en/_downloads/04ac820e8f72927578640d58a5dc5593/rc_hand_eye_calibration-reset_calibration.xml new file mode 100644 index 0000000..42a25ca --- /dev/null +++ b/v24.04/en/_downloads/04ac820e8f72927578640d58a5dc5593/rc_hand_eye_calibration-reset_calibration.xml @@ -0,0 +1,30 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/04f45afeb2d5fce153de77fdd56007a9/rc_itempick-get_sorting_strategies.xml b/v24.04/en/_downloads/04f45afeb2d5fce153de77fdd56007a9/rc_itempick-get_sorting_strategies.xml new file mode 100644 index 0000000..530ba23 --- /dev/null +++ b/v24.04/en/_downloads/04f45afeb2d5fce153de77fdd56007a9/rc_itempick-get_sorting_strategies.xml @@ -0,0 +1,34 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/053880118288a1a08754484fe6dfb7c0/rc_collision_check-set_stroke_schunk.xml b/v24.04/en/_downloads/053880118288a1a08754484fe6dfb7c0/rc_collision_check-set_stroke_schunk.xml new file mode 100644 index 0000000..6cf02b3 --- /dev/null +++ b/v24.04/en/_downloads/053880118288a1a08754484fe6dfb7c0/rc_collision_check-set_stroke_schunk.xml @@ -0,0 +1,56 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/08d923a4518a6d58c2375571c1eafe49/rc_silhouettematch-detect_object.xml b/v24.04/en/_downloads/08d923a4518a6d58c2375571c1eafe49/rc_silhouettematch-detect_object.xml new file mode 100644 index 0000000..483bd38 --- /dev/null +++ b/v24.04/en/_downloads/08d923a4518a6d58c2375571c1eafe49/rc_silhouettematch-detect_object.xml @@ -0,0 +1,96 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/09b2d9d3bd205f65a8e5063576f1ba15/rc_qr_code_detect-detect.xml b/v24.04/en/_downloads/09b2d9d3bd205f65a8e5063576f1ba15/rc_qr_code_detect-detect.xml new file mode 100644 index 0000000..eb6f576 --- /dev/null +++ b/v24.04/en/_downloads/09b2d9d3bd205f65a8e5063576f1ba15/rc_qr_code_detect-detect.xml @@ -0,0 +1,50 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/0e33ee3494516eb27f098fdbd3c915aa/rc_itempick-compute_grasps.xml b/v24.04/en/_downloads/0e33ee3494516eb27f098fdbd3c915aa/rc_itempick-compute_grasps.xml new file mode 100644 index 0000000..eba3c5f --- /dev/null +++ b/v24.04/en/_downloads/0e33ee3494516eb27f098fdbd3c915aa/rc_itempick-compute_grasps.xml @@ -0,0 +1,97 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/0e6315c2465024a25ced5571cd8c909d/rc_collision_check-parameters.xml b/v24.04/en/_downloads/0e6315c2465024a25ced5571cd8c909d/rc_collision_check-parameters.xml new file mode 100644 index 0000000..24e2177 --- /dev/null +++ b/v24.04/en/_downloads/0e6315c2465024a25ced5571cd8c909d/rc_collision_check-parameters.xml @@ -0,0 +1,41 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/0f9b9096a87f42cd10ddaeb1b804f07b/rc_april_tag_detect-start.xml b/v24.04/en/_downloads/0f9b9096a87f42cd10ddaeb1b804f07b/rc_april_tag_detect-start.xml new file mode 100644 index 0000000..d023769 --- /dev/null +++ b/v24.04/en/_downloads/0f9b9096a87f42cd10ddaeb1b804f07b/rc_april_tag_detect-start.xml @@ -0,0 +1,29 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/15c7eb768168e8570b2dcb5b3f38b108/rc_stereomatching-acquisition_trigger.xml b/v24.04/en/_downloads/15c7eb768168e8570b2dcb5b3f38b108/rc_stereomatching-acquisition_trigger.xml new file mode 100644 index 0000000..9fa0992 --- /dev/null +++ b/v24.04/en/_downloads/15c7eb768168e8570b2dcb5b3f38b108/rc_stereomatching-acquisition_trigger.xml @@ -0,0 +1,27 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/1b66776b61ecf031f3f36ef2ed07c167/rc_boxpick-start.xml b/v24.04/en/_downloads/1b66776b61ecf031f3f36ef2ed07c167/rc_boxpick-start.xml new file mode 100644 index 0000000..11066a5 --- /dev/null +++ b/v24.04/en/_downloads/1b66776b61ecf031f3f36ef2ed07c167/rc_boxpick-start.xml @@ -0,0 +1,29 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/1bd56a23569b7258dc913535e931fc76/rc_silhouettematch-set_grasp.xml b/v24.04/en/_downloads/1bd56a23569b7258dc913535e931fc76/rc_silhouettematch-set_grasp.xml new file mode 100644 index 0000000..1e1c723 --- /dev/null +++ b/v24.04/en/_downloads/1bd56a23569b7258dc913535e931fc76/rc_silhouettematch-set_grasp.xml @@ -0,0 +1,46 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/1d9a50f158c280a551d7523a9df119dd/rc_april_tag_detect-parameters.xml b/v24.04/en/_downloads/1d9a50f158c280a551d7523a9df119dd/rc_april_tag_detect-parameters.xml new file mode 100644 index 0000000..aa49713 --- /dev/null +++ b/v24.04/en/_downloads/1d9a50f158c280a551d7523a9df119dd/rc_april_tag_detect-parameters.xml @@ -0,0 +1,51 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/1f57c25dc0b089297e848967f7c41ce7/rc_gripper_db-get_grippers_schmalz_vac.xml b/v24.04/en/_downloads/1f57c25dc0b089297e848967f7c41ce7/rc_gripper_db-get_grippers_schmalz_vac.xml new file mode 100644 index 0000000..f4f6b4b --- /dev/null +++ b/v24.04/en/_downloads/1f57c25dc0b089297e848967f7c41ce7/rc_gripper_db-get_grippers_schmalz_vac.xml @@ -0,0 +1,64 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/215164fd1f0de042dd42a5ce3fafabde/rc_load_carrier-detect_load_carriers.xml b/v24.04/en/_downloads/215164fd1f0de042dd42a5ce3fafabde/rc_load_carrier-detect_load_carriers.xml new file mode 100644 index 0000000..d0a5903 --- /dev/null +++ b/v24.04/en/_downloads/215164fd1f0de042dd42a5ce3fafabde/rc_load_carrier-detect_load_carriers.xml @@ -0,0 +1,61 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/219819e13ff4d1e4918342f63e847d00/rc_iocontrol-get_io_values.xml b/v24.04/en/_downloads/219819e13ff4d1e4918342f63e847d00/rc_iocontrol-get_io_values.xml new file mode 100644 index 0000000..105d499 --- /dev/null +++ b/v24.04/en/_downloads/219819e13ff4d1e4918342f63e847d00/rc_iocontrol-get_io_values.xml @@ -0,0 +1,32 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/24108a5431b0201f8fd7ac8ab35ca1d3/rc_hand_eye_calibration-get_calibration.xml b/v24.04/en/_downloads/24108a5431b0201f8fd7ac8ab35ca1d3/rc_hand_eye_calibration-get_calibration.xml new file mode 100644 index 0000000..cce2a4f --- /dev/null +++ b/v24.04/en/_downloads/24108a5431b0201f8fd7ac8ab35ca1d3/rc_hand_eye_calibration-get_calibration.xml @@ -0,0 +1,40 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/24b62e25ec757744cc843c5f35302563/rc_qr_code_detect-parameters.xml b/v24.04/en/_downloads/24b62e25ec757744cc843c5f35302563/rc_qr_code_detect-parameters.xml new file mode 100644 index 0000000..4ee6839 --- /dev/null +++ b/v24.04/en/_downloads/24b62e25ec757744cc843c5f35302563/rc_qr_code_detect-parameters.xml @@ -0,0 +1,51 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/2af046057904b6e498cac21dfb8626f1/rc_silhouettematch-set_all_grasps.xml b/v24.04/en/_downloads/2af046057904b6e498cac21dfb8626f1/rc_silhouettematch-set_all_grasps.xml new file mode 100644 index 0000000..ff69c65 --- /dev/null +++ b/v24.04/en/_downloads/2af046057904b6e498cac21dfb8626f1/rc_silhouettematch-set_all_grasps.xml @@ -0,0 +1,47 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/2c25f2e603e356588a91e3bf79f9f6b7/rc_gripper_db-get_grippers.xml b/v24.04/en/_downloads/2c25f2e603e356588a91e3bf79f9f6b7/rc_gripper_db-get_grippers.xml new file mode 100644 index 0000000..aaa458d --- /dev/null +++ b/v24.04/en/_downloads/2c25f2e603e356588a91e3bf79f9f6b7/rc_gripper_db-get_grippers.xml @@ -0,0 +1,58 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/37406c493402b87236268d1ac115c550/rc_camera-reset_defaults.xml b/v24.04/en/_downloads/37406c493402b87236268d1ac115c550/rc_camera-reset_defaults.xml new file mode 100644 index 0000000..59d7d4e --- /dev/null +++ b/v24.04/en/_downloads/37406c493402b87236268d1ac115c550/rc_camera-reset_defaults.xml @@ -0,0 +1,27 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/3d49b3ccc4deef4c43c3cb974465af60/rc_gripper_db-set_gripper_schmalz_vac.xml b/v24.04/en/_downloads/3d49b3ccc4deef4c43c3cb974465af60/rc_gripper_db-set_gripper_schmalz_vac.xml new file mode 100644 index 0000000..5e68df4 --- /dev/null +++ b/v24.04/en/_downloads/3d49b3ccc4deef4c43c3cb974465af60/rc_gripper_db-set_gripper_schmalz_vac.xml @@ -0,0 +1,89 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/3f5956390347b4268bdba51eb0376160/rc_iocontrol-reset_defaults.xml b/v24.04/en/_downloads/3f5956390347b4268bdba51eb0376160/rc_iocontrol-reset_defaults.xml new file mode 100644 index 0000000..3a12e40 --- /dev/null +++ b/v24.04/en/_downloads/3f5956390347b4268bdba51eb0376160/rc_iocontrol-reset_defaults.xml @@ -0,0 +1,27 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/4106b2c0536a731e7d96b5e0113542dc/rc_load_carrier_db-delete_load_carriers.xml b/v24.04/en/_downloads/4106b2c0536a731e7d96b5e0113542dc/rc_load_carrier_db-delete_load_carriers.xml new file mode 100644 index 0000000..ea0a3a3 --- /dev/null +++ b/v24.04/en/_downloads/4106b2c0536a731e7d96b5e0113542dc/rc_load_carrier_db-delete_load_carriers.xml @@ -0,0 +1,28 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/4200514524c36e4c845009c7f873d0c2/rc_boxpick-get_sorting_strategies.xml b/v24.04/en/_downloads/4200514524c36e4c845009c7f873d0c2/rc_boxpick-get_sorting_strategies.xml new file mode 100644 index 0000000..b926ed5 --- /dev/null +++ b/v24.04/en/_downloads/4200514524c36e4c845009c7f873d0c2/rc_boxpick-get_sorting_strategies.xml @@ -0,0 +1,34 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/44555819d13a1330bcd24961126f8041/rc_silhouettematch-parameters.xml b/v24.04/en/_downloads/44555819d13a1330bcd24961126f8041/rc_silhouettematch-parameters.xml new file mode 100644 index 0000000..15a0f73 --- /dev/null +++ b/v24.04/en/_downloads/44555819d13a1330bcd24961126f8041/rc_silhouettematch-parameters.xml @@ -0,0 +1,76 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/44d30828f3f2bbe9d336c1c539b753af/rc_qr_code_detect-restart.xml b/v24.04/en/_downloads/44d30828f3f2bbe9d336c1c539b753af/rc_qr_code_detect-restart.xml new file mode 100644 index 0000000..243d742 --- /dev/null +++ b/v24.04/en/_downloads/44d30828f3f2bbe9d336c1c539b753af/rc_qr_code_detect-restart.xml @@ -0,0 +1,29 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/4730bff4b3a860f9d449e2a1686dfe6c/rc_silhouettematch-get_sorting_strategies.xml b/v24.04/en/_downloads/4730bff4b3a860f9d449e2a1686dfe6c/rc_silhouettematch-get_sorting_strategies.xml new file mode 100644 index 0000000..a396211 --- /dev/null +++ b/v24.04/en/_downloads/4730bff4b3a860f9d449e2a1686dfe6c/rc_silhouettematch-get_sorting_strategies.xml @@ -0,0 +1,33 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/50d6ba622c3c661ff89d33ea1b1de64e/rc_roi_db-get_regions_of_interest_2d.xml b/v24.04/en/_downloads/50d6ba622c3c661ff89d33ea1b1de64e/rc_roi_db-get_regions_of_interest_2d.xml new file mode 100644 index 0000000..5f5eded --- /dev/null +++ b/v24.04/en/_downloads/50d6ba622c3c661ff89d33ea1b1de64e/rc_roi_db-get_regions_of_interest_2d.xml @@ -0,0 +1,33 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/50eabaa82a30832202e29aceb058bb93/rc_hand_eye_calibration-save_calibration.xml b/v24.04/en/_downloads/50eabaa82a30832202e29aceb058bb93/rc_hand_eye_calibration-save_calibration.xml new file mode 100644 index 0000000..201ec48 --- /dev/null +++ b/v24.04/en/_downloads/50eabaa82a30832202e29aceb058bb93/rc_hand_eye_calibration-save_calibration.xml @@ -0,0 +1,30 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/5657329bd14ca80bc5169d60aa2d9466/rc_roi_db-get_regions_of_interest.xml b/v24.04/en/_downloads/5657329bd14ca80bc5169d60aa2d9466/rc_roi_db-get_regions_of_interest.xml new file mode 100644 index 0000000..46e10c6 --- /dev/null +++ b/v24.04/en/_downloads/5657329bd14ca80bc5169d60aa2d9466/rc_roi_db-get_regions_of_interest.xml @@ -0,0 +1,41 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/586948af1c41db59e2ae80a5c2ea0e05/rc_roi_db-set_region_of_interest.xml b/v24.04/en/_downloads/586948af1c41db59e2ae80a5c2ea0e05/rc_roi_db-set_region_of_interest.xml new file mode 100644 index 0000000..330e623 --- /dev/null +++ b/v24.04/en/_downloads/586948af1c41db59e2ae80a5c2ea0e05/rc_roi_db-set_region_of_interest.xml @@ -0,0 +1,40 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/5c2019e0cd1e993a88b1ce41e4caeb09/rc_silhouettematch-calibrate_base_plane.xml b/v24.04/en/_downloads/5c2019e0cd1e993a88b1ce41e4caeb09/rc_silhouettematch-calibrate_base_plane.xml new file mode 100644 index 0000000..c1c7687 --- /dev/null +++ b/v24.04/en/_downloads/5c2019e0cd1e993a88b1ce41e4caeb09/rc_silhouettematch-calibrate_base_plane.xml @@ -0,0 +1,49 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/5d3889119f769917e3f72dd2f354cc1b/rc_iocontrol-parameters.xml b/v24.04/en/_downloads/5d3889119f769917e3f72dd2f354cc1b/rc_iocontrol-parameters.xml new file mode 100644 index 0000000..3d2d585 --- /dev/null +++ b/v24.04/en/_downloads/5d3889119f769917e3f72dd2f354cc1b/rc_iocontrol-parameters.xml @@ -0,0 +1,36 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/66a6ac04f9ffab79c6b9ea024ac9a7fa/rc_silhouettematch-delete_base_plane_calibration.xml b/v24.04/en/_downloads/66a6ac04f9ffab79c6b9ea024ac9a7fa/rc_silhouettematch-delete_base_plane_calibration.xml new file mode 100644 index 0000000..daba5f7 --- /dev/null +++ b/v24.04/en/_downloads/66a6ac04f9ffab79c6b9ea024ac9a7fa/rc_silhouettematch-delete_base_plane_calibration.xml @@ -0,0 +1,27 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/681efb1b312b105fe4a304500439b942/rc_hand_eye_calibration-get_poses.xml b/v24.04/en/_downloads/681efb1b312b105fe4a304500439b942/rc_hand_eye_calibration-get_poses.xml new file mode 100644 index 0000000..f0e9a5b --- /dev/null +++ b/v24.04/en/_downloads/681efb1b312b105fe4a304500439b942/rc_hand_eye_calibration-get_poses.xml @@ -0,0 +1,38 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/6bbb9deecbc631165e34da617e985c8f/rc_visard_ng_eki_xml_config_files.zip b/v24.04/en/_downloads/6bbb9deecbc631165e34da617e985c8f/rc_visard_ng_eki_xml_config_files.zip new file mode 100644 index 0000000..d52d60f Binary files /dev/null and b/v24.04/en/_downloads/6bbb9deecbc631165e34da617e985c8f/rc_visard_ng_eki_xml_config_files.zip differ diff --git a/v24.04/en/_downloads/7027b81ba1b99329dd761a0f633411d6/rc_silhouettematch-delete_grasps.xml b/v24.04/en/_downloads/7027b81ba1b99329dd761a0f633411d6/rc_silhouettematch-delete_grasps.xml new file mode 100644 index 0000000..40346cc --- /dev/null +++ b/v24.04/en/_downloads/7027b81ba1b99329dd761a0f633411d6/rc_silhouettematch-delete_grasps.xml @@ -0,0 +1,29 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/703b4b82e725f76dbbf37836692932b9/rc_hand_eye_calibration-get_calibration_poses.xml b/v24.04/en/_downloads/703b4b82e725f76dbbf37836692932b9/rc_hand_eye_calibration-get_calibration_poses.xml new file mode 100644 index 0000000..3c52c8c --- /dev/null +++ b/v24.04/en/_downloads/703b4b82e725f76dbbf37836692932b9/rc_hand_eye_calibration-get_calibration_poses.xml @@ -0,0 +1,37 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/73cb832705410930dea5ef4d8ff957cd/rc_silhouettematch-get_preferred_orientation.xml b/v24.04/en/_downloads/73cb832705410930dea5ef4d8ff957cd/rc_silhouettematch-get_preferred_orientation.xml new file mode 100644 index 0000000..a1bf60c --- /dev/null +++ b/v24.04/en/_downloads/73cb832705410930dea5ef4d8ff957cd/rc_silhouettematch-get_preferred_orientation.xml @@ -0,0 +1,32 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/73dcd5595a93199158398b6c557704e7/rc_stereomatching-reset_defaults.xml b/v24.04/en/_downloads/73dcd5595a93199158398b6c557704e7/rc_stereomatching-reset_defaults.xml new file mode 100644 index 0000000..41513e8 --- /dev/null +++ b/v24.04/en/_downloads/73dcd5595a93199158398b6c557704e7/rc_stereomatching-reset_defaults.xml @@ -0,0 +1,27 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/76ad2f4208d8af0774bc2034d2cd0a38/rc_silhouettematch-get_grasps.xml b/v24.04/en/_downloads/76ad2f4208d8af0774bc2034d2cd0a38/rc_silhouettematch-get_grasps.xml new file mode 100644 index 0000000..8b0d74e --- /dev/null +++ b/v24.04/en/_downloads/76ad2f4208d8af0774bc2034d2cd0a38/rc_silhouettematch-get_grasps.xml @@ -0,0 +1,48 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/784dbdfdd14a4469e7d0fa5c190215d9/rc_april_tag_detect-reset_defaults.xml b/v24.04/en/_downloads/784dbdfdd14a4469e7d0fa5c190215d9/rc_april_tag_detect-reset_defaults.xml new file mode 100644 index 0000000..687b3a9 --- /dev/null +++ b/v24.04/en/_downloads/784dbdfdd14a4469e7d0fa5c190215d9/rc_april_tag_detect-reset_defaults.xml @@ -0,0 +1,27 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/7853012e4ec0eaefd9aa4a20cfd30d56/rc_hand_eye_calibration-delete_poses.xml b/v24.04/en/_downloads/7853012e4ec0eaefd9aa4a20cfd30d56/rc_hand_eye_calibration-delete_poses.xml new file mode 100644 index 0000000..01757c9 --- /dev/null +++ b/v24.04/en/_downloads/7853012e4ec0eaefd9aa4a20cfd30d56/rc_hand_eye_calibration-delete_poses.xml @@ -0,0 +1,31 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/78949d3bfa7c8adea1560805d8dfafb2/rc_hand_eye_calibration-set_pose.xml b/v24.04/en/_downloads/78949d3bfa7c8adea1560805d8dfafb2/rc_hand_eye_calibration-set_pose.xml new file mode 100644 index 0000000..f36417d --- /dev/null +++ b/v24.04/en/_downloads/78949d3bfa7c8adea1560805d8dfafb2/rc_hand_eye_calibration-set_pose.xml @@ -0,0 +1,38 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/79d3f83a88f7315e7033994a85a4ca62/rc_qr_code_detect-start.xml b/v24.04/en/_downloads/79d3f83a88f7315e7033994a85a4ca62/rc_qr_code_detect-start.xml new file mode 100644 index 0000000..11b0d26 --- /dev/null +++ b/v24.04/en/_downloads/79d3f83a88f7315e7033994a85a4ca62/rc_qr_code_detect-start.xml @@ -0,0 +1,29 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/7ad77651713b4f0ad5e1d130ad172547/rc_roi_db-set_region_of_interest_2d.xml b/v24.04/en/_downloads/7ad77651713b4f0ad5e1d130ad172547/rc_roi_db-set_region_of_interest_2d.xml new file mode 100644 index 0000000..2775a4e --- /dev/null +++ b/v24.04/en/_downloads/7ad77651713b4f0ad5e1d130ad172547/rc_roi_db-set_region_of_interest_2d.xml @@ -0,0 +1,32 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/7bcd2892d5265659a62c5d9760ed713c/rc_stereocalib-reset_defaults.xml b/v24.04/en/_downloads/7bcd2892d5265659a62c5d9760ed713c/rc_stereocalib-reset_defaults.xml new file mode 100644 index 0000000..0c5141e --- /dev/null +++ b/v24.04/en/_downloads/7bcd2892d5265659a62c5d9760ed713c/rc_stereocalib-reset_defaults.xml @@ -0,0 +1,27 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/85a8a115074439986e41e6a27417a99e/rc_boxpick-parameters.xml b/v24.04/en/_downloads/85a8a115074439986e41e6a27417a99e/rc_boxpick-parameters.xml new file mode 100644 index 0000000..76f3095 --- /dev/null +++ b/v24.04/en/_downloads/85a8a115074439986e41e6a27417a99e/rc_boxpick-parameters.xml @@ -0,0 +1,71 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/85d101b202fd6183b98d8d874b15a1cc/rc_gripper_db-set_stroke_schunk.xml b/v24.04/en/_downloads/85d101b202fd6183b98d8d874b15a1cc/rc_gripper_db-set_stroke_schunk.xml new file mode 100644 index 0000000..372074a --- /dev/null +++ b/v24.04/en/_downloads/85d101b202fd6183b98d8d874b15a1cc/rc_gripper_db-set_stroke_schunk.xml @@ -0,0 +1,56 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/8af6225545dfef4564e5e1fa5502d3e3/rc_stereomatching-measure_depth.xml b/v24.04/en/_downloads/8af6225545dfef4564e5e1fa5502d3e3/rc_stereomatching-measure_depth.xml new file mode 100644 index 0000000..2812808 --- /dev/null +++ b/v24.04/en/_downloads/8af6225545dfef4564e5e1fa5502d3e3/rc_stereomatching-measure_depth.xml @@ -0,0 +1,71 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/90382df9fb5b2eafbc3c74d8e002a1e5/rc_silhouettematch-get_symmetric_grasps.xml b/v24.04/en/_downloads/90382df9fb5b2eafbc3c74d8e002a1e5/rc_silhouettematch-get_symmetric_grasps.xml new file mode 100644 index 0000000..256a047 --- /dev/null +++ b/v24.04/en/_downloads/90382df9fb5b2eafbc3c74d8e002a1e5/rc_silhouettematch-get_symmetric_grasps.xml @@ -0,0 +1,59 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/917b00d2abce9b8cb641e90ec1ff63f3/rc_itempick-start.xml b/v24.04/en/_downloads/917b00d2abce9b8cb641e90ec1ff63f3/rc_itempick-start.xml new file mode 100644 index 0000000..c268d64 --- /dev/null +++ b/v24.04/en/_downloads/917b00d2abce9b8cb641e90ec1ff63f3/rc_itempick-start.xml @@ -0,0 +1,29 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/9460647c0cd91c3f6a8cf6666b391187/rc_hand_eye_calibration-calibrate.xml b/v24.04/en/_downloads/9460647c0cd91c3f6a8cf6666b391187/rc_hand_eye_calibration-calibrate.xml new file mode 100644 index 0000000..c361eee --- /dev/null +++ b/v24.04/en/_downloads/9460647c0cd91c3f6a8cf6666b391187/rc_hand_eye_calibration-calibrate.xml @@ -0,0 +1,40 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/96675f04ecc37061ae8d901ebae48744/rc_hand_eye_calibration-reset_defaults.xml b/v24.04/en/_downloads/96675f04ecc37061ae8d901ebae48744/rc_hand_eye_calibration-reset_defaults.xml new file mode 100644 index 0000000..ab35b83 --- /dev/null +++ b/v24.04/en/_downloads/96675f04ecc37061ae8d901ebae48744/rc_hand_eye_calibration-reset_defaults.xml @@ -0,0 +1,27 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/9756efafbf692cefbb8fb850bcecdde0/rc_boxpick-set_sorting_strategies.xml b/v24.04/en/_downloads/9756efafbf692cefbb8fb850bcecdde0/rc_boxpick-set_sorting_strategies.xml new file mode 100644 index 0000000..2dbc126 --- /dev/null +++ b/v24.04/en/_downloads/9756efafbf692cefbb8fb850bcecdde0/rc_boxpick-set_sorting_strategies.xml @@ -0,0 +1,34 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/97d8bad0d4cf8e356658bad87a22f9d9/rc_load_carrier-detect_filling_level.xml b/v24.04/en/_downloads/97d8bad0d4cf8e356658bad87a22f9d9/rc_load_carrier-detect_filling_level.xml new file mode 100644 index 0000000..42de4a2 --- /dev/null +++ b/v24.04/en/_downloads/97d8bad0d4cf8e356658bad87a22f9d9/rc_load_carrier-detect_filling_level.xml @@ -0,0 +1,89 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/9810d3c4f1d5e67abde685959153c8cb/rc_boxpick-reset_defaults.xml b/v24.04/en/_downloads/9810d3c4f1d5e67abde685959153c8cb/rc_boxpick-reset_defaults.xml new file mode 100644 index 0000000..e9cbe7e --- /dev/null +++ b/v24.04/en/_downloads/9810d3c4f1d5e67abde685959153c8cb/rc_boxpick-reset_defaults.xml @@ -0,0 +1,27 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/98d3a23ed39fee1d47bfb1ebf46c2ea5/rc_collision_check-check_collisions.xml b/v24.04/en/_downloads/98d3a23ed39fee1d47bfb1ebf46c2ea5/rc_collision_check-check_collisions.xml new file mode 100644 index 0000000..4071687 --- /dev/null +++ b/v24.04/en/_downloads/98d3a23ed39fee1d47bfb1ebf46c2ea5/rc_collision_check-check_collisions.xml @@ -0,0 +1,71 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/9a0f3004eb0450cdc9828b538065f4e4/rc_gripper_db-set_gripper_schunk.xml b/v24.04/en/_downloads/9a0f3004eb0450cdc9828b538065f4e4/rc_gripper_db-set_gripper_schunk.xml new file mode 100644 index 0000000..2bb4fc2 --- /dev/null +++ b/v24.04/en/_downloads/9a0f3004eb0450cdc9828b538065f4e4/rc_gripper_db-set_gripper_schunk.xml @@ -0,0 +1,71 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/9d0b736cd19394c098dc7de340a72383/rc_roi_db-delete_regions_of_interest_2d.xml b/v24.04/en/_downloads/9d0b736cd19394c098dc7de340a72383/rc_roi_db-delete_regions_of_interest_2d.xml new file mode 100644 index 0000000..6661345 --- /dev/null +++ b/v24.04/en/_downloads/9d0b736cd19394c098dc7de340a72383/rc_roi_db-delete_regions_of_interest_2d.xml @@ -0,0 +1,28 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/9d216f6e7f34427ea9765e73616d9159/rc_itempick-reset_defaults.xml b/v24.04/en/_downloads/9d216f6e7f34427ea9765e73616d9159/rc_itempick-reset_defaults.xml new file mode 100644 index 0000000..6802435 --- /dev/null +++ b/v24.04/en/_downloads/9d216f6e7f34427ea9765e73616d9159/rc_itempick-reset_defaults.xml @@ -0,0 +1,27 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/9dadf6dbdbcc2caa4ee4c9a8ad2dcd36/rc_stereocalib-parameters.xml b/v24.04/en/_downloads/9dadf6dbdbcc2caa4ee4c9a8ad2dcd36/rc_stereocalib-parameters.xml new file mode 100644 index 0000000..81ebf89 --- /dev/null +++ b/v24.04/en/_downloads/9dadf6dbdbcc2caa4ee4c9a8ad2dcd36/rc_stereocalib-parameters.xml @@ -0,0 +1,66 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/a2473efcf107027373f4b1ff02a8767e/rc_load_carrier-parameters.xml b/v24.04/en/_downloads/a2473efcf107027373f4b1ff02a8767e/rc_load_carrier-parameters.xml new file mode 100644 index 0000000..1c58d4f --- /dev/null +++ b/v24.04/en/_downloads/a2473efcf107027373f4b1ff02a8767e/rc_load_carrier-parameters.xml @@ -0,0 +1,46 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/a3fc0616dd509ca6ad5bfa3e234415f9/rc_silhouettematch-set_preferred_orientation.xml b/v24.04/en/_downloads/a3fc0616dd509ca6ad5bfa3e234415f9/rc_silhouettematch-set_preferred_orientation.xml new file mode 100644 index 0000000..cfa3cc4 --- /dev/null +++ b/v24.04/en/_downloads/a3fc0616dd509ca6ad5bfa3e234415f9/rc_silhouettematch-set_preferred_orientation.xml @@ -0,0 +1,32 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/a81593c07a26d3551422b4bad3d92f1e/rc_april_tag_detect-detect.xml b/v24.04/en/_downloads/a81593c07a26d3551422b4bad3d92f1e/rc_april_tag_detect-detect.xml new file mode 100644 index 0000000..a46eead --- /dev/null +++ b/v24.04/en/_downloads/a81593c07a26d3551422b4bad3d92f1e/rc_april_tag_detect-detect.xml @@ -0,0 +1,50 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/a9a8b14add94b8cbb28035be50d17807/rc_qr_code_detect-reset_defaults.xml b/v24.04/en/_downloads/a9a8b14add94b8cbb28035be50d17807/rc_qr_code_detect-reset_defaults.xml new file mode 100644 index 0000000..6a36bb4 --- /dev/null +++ b/v24.04/en/_downloads/a9a8b14add94b8cbb28035be50d17807/rc_qr_code_detect-reset_defaults.xml @@ -0,0 +1,27 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/a9daddbe8754d9e6b66ea5967b590a0c/rc_stereocalib-change_state.xml b/v24.04/en/_downloads/a9daddbe8754d9e6b66ea5967b590a0c/rc_stereocalib-change_state.xml new file mode 100644 index 0000000..754018b --- /dev/null +++ b/v24.04/en/_downloads/a9daddbe8754d9e6b66ea5967b590a0c/rc_stereocalib-change_state.xml @@ -0,0 +1,29 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/ac0c9bfa32ece1e124ed31ef017961f7/rc_gripper_db-delete_grippers.xml b/v24.04/en/_downloads/ac0c9bfa32ece1e124ed31ef017961f7/rc_gripper_db-delete_grippers.xml new file mode 100644 index 0000000..610b814 --- /dev/null +++ b/v24.04/en/_downloads/ac0c9bfa32ece1e124ed31ef017961f7/rc_gripper_db-delete_grippers.xml @@ -0,0 +1,28 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/ad0bdeecea5279c909be5f87992db186/rc_silhouettematch-set_sorting_strategies.xml b/v24.04/en/_downloads/ad0bdeecea5279c909be5f87992db186/rc_silhouettematch-set_sorting_strategies.xml new file mode 100644 index 0000000..70b29a1 --- /dev/null +++ b/v24.04/en/_downloads/ad0bdeecea5279c909be5f87992db186/rc_silhouettematch-set_sorting_strategies.xml @@ -0,0 +1,33 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/af2891186ad82ce5bcf14ae0ec0f8214/rc_collision_check-reset_defaults.xml b/v24.04/en/_downloads/af2891186ad82ce5bcf14ae0ec0f8214/rc_collision_check-reset_defaults.xml new file mode 100644 index 0000000..996254f --- /dev/null +++ b/v24.04/en/_downloads/af2891186ad82ce5bcf14ae0ec0f8214/rc_collision_check-reset_defaults.xml @@ -0,0 +1,27 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/c104bd28e9a02ed561ba5cfe6d006439/rc_itempick-set_sorting_strategies.xml b/v24.04/en/_downloads/c104bd28e9a02ed561ba5cfe6d006439/rc_itempick-set_sorting_strategies.xml new file mode 100644 index 0000000..5570590 --- /dev/null +++ b/v24.04/en/_downloads/c104bd28e9a02ed561ba5cfe6d006439/rc_itempick-set_sorting_strategies.xml @@ -0,0 +1,34 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/c9cd37edd5d0c0b4b31636d5ebac84ff/rc_qr_code_detect-stop.xml b/v24.04/en/_downloads/c9cd37edd5d0c0b4b31636d5ebac84ff/rc_qr_code_detect-stop.xml new file mode 100644 index 0000000..8e3cdd0 --- /dev/null +++ b/v24.04/en/_downloads/c9cd37edd5d0c0b4b31636d5ebac84ff/rc_qr_code_detect-stop.xml @@ -0,0 +1,29 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/cce9cbd427ee15045234a8414bff69e4/rc_hand_eye_calibration-remove_calibration.xml b/v24.04/en/_downloads/cce9cbd427ee15045234a8414bff69e4/rc_hand_eye_calibration-remove_calibration.xml new file mode 100644 index 0000000..4aec1ed --- /dev/null +++ b/v24.04/en/_downloads/cce9cbd427ee15045234a8414bff69e4/rc_hand_eye_calibration-remove_calibration.xml @@ -0,0 +1,30 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/cf8cc9109fb970d7b2609f58d5e22a45/rc_itempick-stop.xml b/v24.04/en/_downloads/cf8cc9109fb970d7b2609f58d5e22a45/rc_itempick-stop.xml new file mode 100644 index 0000000..ed0b658 --- /dev/null +++ b/v24.04/en/_downloads/cf8cc9109fb970d7b2609f58d5e22a45/rc_itempick-stop.xml @@ -0,0 +1,29 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/d189940df08d28e4d88a958aa94c2490/rc_boxpick-detect_items.xml b/v24.04/en/_downloads/d189940df08d28e4d88a958aa94c2490/rc_boxpick-detect_items.xml new file mode 100644 index 0000000..9b0c909 --- /dev/null +++ b/v24.04/en/_downloads/d189940df08d28e4d88a958aa94c2490/rc_boxpick-detect_items.xml @@ -0,0 +1,96 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/d231605f55531fd7c6f84efe4865b85c/rc_gripper_db-set_gripper.xml b/v24.04/en/_downloads/d231605f55531fd7c6f84efe4865b85c/rc_gripper_db-set_gripper.xml new file mode 100644 index 0000000..1e603eb --- /dev/null +++ b/v24.04/en/_downloads/d231605f55531fd7c6f84efe4865b85c/rc_gripper_db-set_gripper.xml @@ -0,0 +1,80 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/d2b67179b130cab139516bdf9ce97f8f/rc_april_tag_detect-stop.xml b/v24.04/en/_downloads/d2b67179b130cab139516bdf9ce97f8f/rc_april_tag_detect-stop.xml new file mode 100644 index 0000000..c233f27 --- /dev/null +++ b/v24.04/en/_downloads/d2b67179b130cab139516bdf9ce97f8f/rc_april_tag_detect-stop.xml @@ -0,0 +1,29 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/d4fabf4b6346063d793730c7c1245fe5/rc_hand_eye_calibration-parameters.xml b/v24.04/en/_downloads/d4fabf4b6346063d793730c7c1245fe5/rc_hand_eye_calibration-parameters.xml new file mode 100644 index 0000000..7e26242 --- /dev/null +++ b/v24.04/en/_downloads/d4fabf4b6346063d793730c7c1245fe5/rc_hand_eye_calibration-parameters.xml @@ -0,0 +1,51 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/d96b54547ed3e4302bf41612b497003f/rc_april_tag_detect-restart.xml b/v24.04/en/_downloads/d96b54547ed3e4302bf41612b497003f/rc_april_tag_detect-restart.xml new file mode 100644 index 0000000..ee482c5 --- /dev/null +++ b/v24.04/en/_downloads/d96b54547ed3e4302bf41612b497003f/rc_april_tag_detect-restart.xml @@ -0,0 +1,29 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/da8f1169f13b09826c95f4f13b93773c/rc_gripper_db-get_grippers_schunk.xml b/v24.04/en/_downloads/da8f1169f13b09826c95f4f13b93773c/rc_gripper_db-get_grippers_schunk.xml new file mode 100644 index 0000000..ca38fae --- /dev/null +++ b/v24.04/en/_downloads/da8f1169f13b09826c95f4f13b93773c/rc_gripper_db-get_grippers_schunk.xml @@ -0,0 +1,55 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/db0e7a3e91a48d7e55de7a85dd97c58c/rc_boxpick-stop.xml b/v24.04/en/_downloads/db0e7a3e91a48d7e55de7a85dd97c58c/rc_boxpick-stop.xml new file mode 100644 index 0000000..292d5d2 --- /dev/null +++ b/v24.04/en/_downloads/db0e7a3e91a48d7e55de7a85dd97c58c/rc_boxpick-stop.xml @@ -0,0 +1,29 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/dfb2acadd7cf0de405b1d2c3a403eecc/rc_itempick-parameters.xml b/v24.04/en/_downloads/dfb2acadd7cf0de405b1d2c3a403eecc/rc_itempick-parameters.xml new file mode 100644 index 0000000..9208cec --- /dev/null +++ b/v24.04/en/_downloads/dfb2acadd7cf0de405b1d2c3a403eecc/rc_itempick-parameters.xml @@ -0,0 +1,56 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/e2525f35aca37889459742359875675d/rc_load_carrier_db-set_load_carrier.xml b/v24.04/en/_downloads/e2525f35aca37889459742359875675d/rc_load_carrier_db-set_load_carrier.xml new file mode 100644 index 0000000..aba6572 --- /dev/null +++ b/v24.04/en/_downloads/e2525f35aca37889459742359875675d/rc_load_carrier_db-set_load_carrier.xml @@ -0,0 +1,48 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/e4292fd9e65ab142b0d6b8a4fe88e420/rc_hand_eye_calibration-set_calibration.xml b/v24.04/en/_downloads/e4292fd9e65ab142b0d6b8a4fe88e420/rc_hand_eye_calibration-set_calibration.xml new file mode 100644 index 0000000..a65795f --- /dev/null +++ b/v24.04/en/_downloads/e4292fd9e65ab142b0d6b8a4fe88e420/rc_hand_eye_calibration-set_calibration.xml @@ -0,0 +1,37 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/e46fd39d5582764442c36fd125a3a8f6/rc_silhouettematch-get_base_plane_calibration.xml b/v24.04/en/_downloads/e46fd39d5582764442c36fd125a3a8f6/rc_silhouettematch-get_base_plane_calibration.xml new file mode 100644 index 0000000..3f705cf --- /dev/null +++ b/v24.04/en/_downloads/e46fd39d5582764442c36fd125a3a8f6/rc_silhouettematch-get_base_plane_calibration.xml @@ -0,0 +1,39 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/e82de54e1a50807bb652b228f7a53316/rc_load_carrier-reset_defaults.xml b/v24.04/en/_downloads/e82de54e1a50807bb652b228f7a53316/rc_load_carrier-reset_defaults.xml new file mode 100644 index 0000000..49d7f9e --- /dev/null +++ b/v24.04/en/_downloads/e82de54e1a50807bb652b228f7a53316/rc_load_carrier-reset_defaults.xml @@ -0,0 +1,27 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/ea9aba6241a31a8ae72400294987f9f2/rc_boxpick-compute_grasps.xml b/v24.04/en/_downloads/ea9aba6241a31a8ae72400294987f9f2/rc_boxpick-compute_grasps.xml new file mode 100644 index 0000000..05ae7f6 --- /dev/null +++ b/v24.04/en/_downloads/ea9aba6241a31a8ae72400294987f9f2/rc_boxpick-compute_grasps.xml @@ -0,0 +1,118 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/ec774f2f93f3121bd37a3110b4aa3da6/rc_camera-parameters.xml b/v24.04/en/_downloads/ec774f2f93f3121bd37a3110b4aa3da6/rc_camera-parameters.xml new file mode 100644 index 0000000..424aa0b --- /dev/null +++ b/v24.04/en/_downloads/ec774f2f93f3121bd37a3110b4aa3da6/rc_camera-parameters.xml @@ -0,0 +1,111 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/eec428121195ebe074fbe0afe06fc347/rc_silhouettematch-reset_defaults.xml b/v24.04/en/_downloads/eec428121195ebe074fbe0afe06fc347/rc_silhouettematch-reset_defaults.xml new file mode 100644 index 0000000..f980e3a --- /dev/null +++ b/v24.04/en/_downloads/eec428121195ebe074fbe0afe06fc347/rc_silhouettematch-reset_defaults.xml @@ -0,0 +1,27 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_downloads/ff5c4929bf25fe8ec47d030bec059419/rc_roi_db-delete_regions_of_interest.xml b/v24.04/en/_downloads/ff5c4929bf25fe8ec47d030bec059419/rc_roi_db-delete_regions_of_interest.xml new file mode 100644 index 0000000..da89293 --- /dev/null +++ b/v24.04/en/_downloads/ff5c4929bf25fe8ec47d030bec059419/rc_roi_db-delete_regions_of_interest.xml @@ -0,0 +1,28 @@ + + + + x.x.x.x + 7000 + Server + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_images/apriltag_dim_vis.png b/v24.04/en/_images/apriltag_dim_vis.png new file mode 100644 index 0000000..052af65 Binary files /dev/null and b/v24.04/en/_images/apriltag_dim_vis.png differ diff --git a/v24.04/en/_images/boxpick_modes_new.svg b/v24.04/en/_images/boxpick_modes_new.svg new file mode 100644 index 0000000..623cd17 --- /dev/null +++ b/v24.04/en/_images/boxpick_modes_new.svg @@ -0,0 +1,1380 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PackedLayers + PackedGridLayout + Unconstrained + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PackedLayers + PackedGridLayout + Unconstrained + + + + PackedLayers + PackedGridLayout + Unconstrained + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PackedLayers + PackedGridLayout + Unconstrained + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PackedLayers + PackedGridLayout + Unconstrained + + + + + + + + + diff --git a/v24.04/en/_images/calib-views.png b/v24.04/en/_images/calib-views.png new file mode 100644 index 0000000..a737279 Binary files /dev/null and b/v24.04/en/_images/calib-views.png differ diff --git a/v24.04/en/_images/ce-mark_small.png b/v24.04/en/_images/ce-mark_small.png new file mode 100644 index 0000000..2e7b8cc Binary files /dev/null and b/v24.04/en/_images/ce-mark_small.png differ diff --git a/v24.04/en/_images/check_flange.svg b/v24.04/en/_images/check_flange.svg new file mode 100644 index 0000000..d16c75a --- /dev/null +++ b/v24.04/en/_images/check_flange.svg @@ -0,0 +1,757 @@ + + + +image/svg+xmlico_robot_inactive + + + + + + + + +ico_robot_inactive + + + + + + + + + + + + + + +A + +B + + \ No newline at end of file diff --git a/v24.04/en/_images/ethernet_cable.png b/v24.04/en/_images/ethernet_cable.png new file mode 100644 index 0000000..d6443f6 Binary files /dev/null and b/v24.04/en/_images/ethernet_cable.png differ diff --git a/v24.04/en/_images/example_qr_code.png b/v24.04/en/_images/example_qr_code.png new file mode 100644 index 0000000..2fafa56 Binary files /dev/null and b/v24.04/en/_images/example_qr_code.png differ diff --git a/v24.04/en/_images/fps_alternate.png b/v24.04/en/_images/fps_alternate.png new file mode 100644 index 0000000..d96c5e6 Binary files /dev/null and b/v24.04/en/_images/fps_alternate.png differ diff --git a/v24.04/en/_images/fps_exposure.png b/v24.04/en/_images/fps_exposure.png new file mode 100644 index 0000000..f057db1 Binary files /dev/null and b/v24.04/en/_images/fps_exposure.png differ diff --git a/v24.04/en/_images/fps_ng_en.png b/v24.04/en/_images/fps_ng_en.png new file mode 100644 index 0000000..e57e150 Binary files /dev/null and b/v24.04/en/_images/fps_ng_en.png differ diff --git a/v24.04/en/_images/genicam_logo_small.png b/v24.04/en/_images/genicam_logo_small.png new file mode 100644 index 0000000..dbdb6dd Binary files /dev/null and b/v24.04/en/_images/genicam_logo_small.png differ diff --git a/v24.04/en/_images/gige_logo_small.png b/v24.04/en/_images/gige_logo_small.png new file mode 100644 index 0000000..092db29 Binary files /dev/null and b/v24.04/en/_images/gige_logo_small.png differ diff --git a/v24.04/en/_images/grasp_points_silm.svg b/v24.04/en/_images/grasp_points_silm.svg new file mode 100644 index 0000000..54a4fdb --- /dev/null +++ b/v24.04/en/_images/grasp_points_silm.svg @@ -0,0 +1,940 @@ + + + +image/svg+xmlico_robot_inactive + + + + + + + + + + + + + + + + + + + + + + + +ico_robot_inactive + + + + + + + + + + + + + + +y + + + +z + + + +x + + + + + +Pgrasp + + + + + +TCP + +y +z +x + \ No newline at end of file diff --git a/v24.04/en/_images/gripper_frames_restapi.svg b/v24.04/en/_images/gripper_frames_restapi.svg new file mode 100644 index 0000000..97f7e17 --- /dev/null +++ b/v24.04/en/_images/gripper_frames_restapi.svg @@ -0,0 +1,829 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Pcyl + Pbox + + + + hbox + + + + hcyl + + Pdiff = (0, 0, (hcyl+hbox)/2) + Pdiff + + diff --git a/v24.04/en/_images/handeyecalib-alldraw.png b/v24.04/en/_images/handeyecalib-alldraw.png new file mode 100644 index 0000000..e72801e Binary files /dev/null and b/v24.04/en/_images/handeyecalib-alldraw.png differ diff --git a/v24.04/en/_images/image_coordinates.png b/v24.04/en/_images/image_coordinates.png new file mode 100644 index 0000000..85cf974 Binary files /dev/null and b/v24.04/en/_images/image_coordinates.png differ diff --git a/v24.04/en/_images/ip_configuration_flowchart_ng_en.svg b/v24.04/en/_images/ip_configuration_flowchart_ng_en.svg new file mode 100644 index 0000000..5d2df01 --- /dev/null +++ b/v24.04/en/_images/ip_configuration_flowchart_ng_en.svg @@ -0,0 +1,486 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Yes + Yes + Yes + Use Persistent IP + Use DHCP + Successful? + Successful? + No + No + No + Start + End + Yes + No + Persistent IPenabled? + DHCP enabled? + Use Link-Local Address + diff --git a/v24.04/en/_images/itempick_grasp_surface.png b/v24.04/en/_images/itempick_grasp_surface.png new file mode 100644 index 0000000..6723b68 Binary files /dev/null and b/v24.04/en/_images/itempick_grasp_surface.png differ diff --git a/v24.04/en/_images/itempick_lc_filling_level.png b/v24.04/en/_images/itempick_lc_filling_level.png new file mode 100644 index 0000000..8c9a98f Binary files /dev/null and b/v24.04/en/_images/itempick_lc_filling_level.png differ diff --git a/v24.04/en/_images/itempick_load_carrier_compartment.svg b/v24.04/en/_images/itempick_load_carrier_compartment.svg new file mode 100644 index 0000000..e2be2e2 --- /dev/null +++ b/v24.04/en/_images/itempick_load_carrier_compartment.svg @@ -0,0 +1,278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + x + + + y + + + z + + + + compartment.box.y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + compartment.box.x + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + compartment.box.z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_images/itempick_load_carrier_reference.svg b/v24.04/en/_images/itempick_load_carrier_reference.svg new file mode 100644 index 0000000..2e291f6 --- /dev/null +++ b/v24.04/en/_images/itempick_load_carrier_reference.svg @@ -0,0 +1,323 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + x + + + y + + + z + + + + outer_dimensions.x + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + inner_dimensions.x + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + inner_dimensions.y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + outer_dimensions.y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + inner_dimensions.z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + outer_dimensions.z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_images/itempick_load_carrier_reference_rim_sidebyside.svg b/v24.04/en/_images/itempick_load_carrier_reference_rim_sidebyside.svg new file mode 100644 index 0000000..8d2adc1 --- /dev/null +++ b/v24.04/en/_images/itempick_load_carrier_reference_rim_sidebyside.svg @@ -0,0 +1,1775 @@ + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + x + + + + z + + + + + outer_dimensions.x + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + inner_dimensions.x + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + inner_dimensions.y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + outer_dimensions.y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + inner_dimensions.z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + outer_dimensions.z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + z + + + + + rim_thickness.y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + rim_thickness.x + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + x + + + + y + + + + \ No newline at end of file diff --git a/v24.04/en/_images/lc_types.svg b/v24.04/en/_images/lc_types.svg new file mode 100644 index 0000000..5361d4b --- /dev/null +++ b/v24.04/en/_images/lc_types.svg @@ -0,0 +1,1633 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + x + + + y + + + z + + + + outer_dimension y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + outer_dimension x + + + + + + + + dimension z + + + outer_ + + + + + + + + + inner_dimension x + + + + + + inner_ + + + dimension z + + + + + + + inner_ + + + iimension y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + x + + + y + + + z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + outer_dimension y + + + + + outer_dimension x + + + + + dimension z + + + outer_ + + + + + inner_dimension x + + + + inner_ + + + dimension z + + + + inner_ + + + dimension y + + + + height_open_side + + A + B + + diff --git a/v24.04/en/_images/load_carrier_inside_volume.svg b/v24.04/en/_images/load_carrier_inside_volume.svg new file mode 100644 index 0000000..e518c57 --- /dev/null +++ b/v24.04/en/_images/load_carrier_inside_volume.svg @@ -0,0 +1,233 @@ + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + 0.1 m + + + + + + crop_distance + + diff --git a/v24.04/en/_images/pre_grasp_offset.svg b/v24.04/en/_images/pre_grasp_offset.svg new file mode 100644 index 0000000..717ce34 --- /dev/null +++ b/v24.04/en/_images/pre_grasp_offset.svg @@ -0,0 +1,964 @@ + + + +image/svg+xmlico_robot_inactive + + + + + + + + +ico_robot_inactive + + + + + + + + + + + + + + +y +z +x +Ppre +Pgrasp +y +z +x +Poff=Pgrasp-Ppre + \ No newline at end of file diff --git a/v24.04/en/_images/rc_visard160_frames.png b/v24.04/en/_images/rc_visard160_frames.png new file mode 100644 index 0000000..5cabfd5 Binary files /dev/null and b/v24.04/en/_images/rc_visard160_frames.png differ diff --git a/v24.04/en/_images/rc_visard_160_general.png b/v24.04/en/_images/rc_visard_160_general.png new file mode 100644 index 0000000..f7bd933 Binary files /dev/null and b/v24.04/en/_images/rc_visard_160_general.png differ diff --git a/v24.04/en/_images/rc_visard_connect_ng_en.png b/v24.04/en/_images/rc_visard_connect_ng_en.png new file mode 100644 index 0000000..3a3efb2 Binary files /dev/null and b/v24.04/en/_images/rc_visard_connect_ng_en.png differ diff --git a/v24.04/en/_images/rc_visard_connectivity_kit.png b/v24.04/en/_images/rc_visard_connectivity_kit.png new file mode 100644 index 0000000..d3041e7 Binary files /dev/null and b/v24.04/en/_images/rc_visard_connectivity_kit.png differ diff --git a/v24.04/en/_images/rc_visard_gpio.png b/v24.04/en/_images/rc_visard_gpio.png new file mode 100644 index 0000000..11cbe7b Binary files /dev/null and b/v24.04/en/_images/rc_visard_gpio.png differ diff --git a/v24.04/en/_images/rc_visard_mounting_ng_en.png b/v24.04/en/_images/rc_visard_mounting_ng_en.png new file mode 100644 index 0000000..ff2d7ab Binary files /dev/null and b/v24.04/en/_images/rc_visard_mounting_ng_en.png differ diff --git a/v24.04/en/_images/rc_visard_parts_ng_en.png b/v24.04/en/_images/rc_visard_parts_ng_en.png new file mode 100644 index 0000000..6cb39f3 Binary files /dev/null and b/v24.04/en/_images/rc_visard_parts_ng_en.png differ diff --git a/v24.04/en/_images/rc_visard_pinout_ng_en.png b/v24.04/en/_images/rc_visard_pinout_ng_en.png new file mode 100644 index 0000000..e543d95 Binary files /dev/null and b/v24.04/en/_images/rc_visard_pinout_ng_en.png differ diff --git a/v24.04/en/_images/rcdiscover_guiwin.png b/v24.04/en/_images/rcdiscover_guiwin.png new file mode 100644 index 0000000..40a00ae Binary files /dev/null and b/v24.04/en/_images/rcdiscover_guiwin.png differ diff --git a/v24.04/en/_images/rcdiscover_reset.png b/v24.04/en/_images/rcdiscover_reset.png new file mode 100644 index 0000000..f48098b Binary files /dev/null and b/v24.04/en/_images/rcdiscover_reset.png differ diff --git a/v24.04/en/_images/reconstruction_error.png b/v24.04/en/_images/reconstruction_error.png new file mode 100644 index 0000000..9cb7314 Binary files /dev/null and b/v24.04/en/_images/reconstruction_error.png differ diff --git a/v24.04/en/_images/rim_types.svg b/v24.04/en/_images/rim_types.svg new file mode 100644 index 0000000..982172f --- /dev/null +++ b/v24.04/en/_images/rim_types.svg @@ -0,0 +1,1169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + outer_dimension z + + + + + rim_thickness (x, y) + + + + inner_dimension (x, y) + + + outer_dimension (x, y) + + + + inner_dimension z + + + + + rim_step_height + + + + + + + + + + + + + + + + + + + + + + + + + + + + outer_dimension z + + + rim_thickness (x, y) + + + inner_dimension (x, y) + + + outer_dimension (x, y) + + + inner_dimension z + + + rim_step_height + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + rim_thickness (x, y) + + + + + rim_ledge (x, y) + + + + + outer_dimension z + + + + + inner_dimension z + + + + + rim_step_height + + + + inner_dimension (x, y) + + + outer_dimension (x, y) + + A + B + C + + diff --git a/v24.04/en/_images/sensor_ng.png b/v24.04/en/_images/sensor_ng.png new file mode 100644 index 0000000..5d25b8a Binary files /dev/null and b/v24.04/en/_images/sensor_ng.png differ diff --git a/v24.04/en/_images/silhouetteMatchStreams.png b/v24.04/en/_images/silhouetteMatchStreams.png new file mode 100644 index 0000000..ff1f752 Binary files /dev/null and b/v24.04/en/_images/silhouetteMatchStreams.png differ diff --git a/v24.04/en/_images/sketch_handeye_calib_gridmount.svg b/v24.04/en/_images/sketch_handeye_calib_gridmount.svg new file mode 100644 index 0000000..2202cbb --- /dev/null +++ b/v24.04/en/_images/sketch_handeye_calib_gridmount.svg @@ -0,0 +1,943 @@ + + + +image/svg+xmlico_robot_inactive + + + +ico_robot_inactive robot +camera + + + robot +camera + + + \ No newline at end of file diff --git a/v24.04/en/_images/sketch_handeye_calib_robotmounted.svg b/v24.04/en/_images/sketch_handeye_calib_robotmounted.svg new file mode 100644 index 0000000..62b11cd --- /dev/null +++ b/v24.04/en/_images/sketch_handeye_calib_robotmounted.svg @@ -0,0 +1,796 @@ + + + +image/svg+xmlico_robot_inactive + + + + + + + + +ico_robot_inactiverobot + +ext + +camera + + + + +T + + + + +robot + + + + +ext + + + + +T + + + + +camera + + + + +robot + + + + +calibration grid + + \ No newline at end of file diff --git a/v24.04/en/_images/sketch_handeye_calib_robotmounted_4dof.svg b/v24.04/en/_images/sketch_handeye_calib_robotmounted_4dof.svg new file mode 100644 index 0000000..853f364 --- /dev/null +++ b/v24.04/en/_images/sketch_handeye_calib_robotmounted_4dof.svg @@ -0,0 +1,950 @@ + + + +image/svg+xmlico_robot_inactive + + + + + + + + +ico_robot_inactiverobot + + + +ext + + + +camera + + + + + + +T + + + + + + +robot + + + + + + +ext + + + + + + +T + + + + + + +camera + + + + + + +robot + + + + + + +calibration grid + + + +TCP rotation axis + + + +TCP offset + + + + \ No newline at end of file diff --git a/v24.04/en/_images/sketch_handeye_calib_static.svg b/v24.04/en/_images/sketch_handeye_calib_static.svg new file mode 100644 index 0000000..71d2257 --- /dev/null +++ b/v24.04/en/_images/sketch_handeye_calib_static.svg @@ -0,0 +1,817 @@ + + + +image/svg+xmlico_robot_inactive + + + + + + + + +ico_robot_inactiverobot + +ext + +camera + + + + +T + + + + +robot + + + + +ext + + + + +T + + + + +camera + + + + +ext + + + + + calibrationgrid + + \ No newline at end of file diff --git a/v24.04/en/_images/sketch_handeye_calib_static_4dof.svg b/v24.04/en/_images/sketch_handeye_calib_static_4dof.svg new file mode 100644 index 0000000..2ffbf76 --- /dev/null +++ b/v24.04/en/_images/sketch_handeye_calib_static_4dof.svg @@ -0,0 +1,1001 @@ + + + +image/svg+xmlico_robot_inactive + + + + + + + + +ico_robot_inactiveext + + +camera + + + + + +T + + + + + +robot + + + + + +ext + + + + + +T + + + + + +camera + + + + + +ext + + + + + + calibrationgrid + + +robot + + +TCP rotation axis + + +TCP offset + + + \ No newline at end of file diff --git a/v24.04/en/_images/stereo_sketch_v2.svg b/v24.04/en/_images/stereo_sketch_v2.svg new file mode 100644 index 0000000..4a3639a --- /dev/null +++ b/v24.04/en/_images/stereo_sketch_v2.svg @@ -0,0 +1,399 @@ + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + Image plane + Left camera + Right camera + + + + Left image + + + + + + + + + + + + + + Right image + + + + + + + + d + 1 + + + d + 2 + + + + + + diff --git a/v24.04/en/_images/swagger_ui_example_fill_service_args.png b/v24.04/en/_images/swagger_ui_example_fill_service_args.png new file mode 100644 index 0000000..5655b93 Binary files /dev/null and b/v24.04/en/_images/swagger_ui_example_fill_service_args.png differ diff --git a/v24.04/en/_images/swagger_ui_example_get_service_args.png b/v24.04/en/_images/swagger_ui_example_get_service_args.png new file mode 100644 index 0000000..efad52e Binary files /dev/null and b/v24.04/en/_images/swagger_ui_example_get_service_args.png differ diff --git a/v24.04/en/_images/swagger_ui_example_simple_get.png b/v24.04/en/_images/swagger_ui_example_simple_get.png new file mode 100644 index 0000000..07abff9 Binary files /dev/null and b/v24.04/en/_images/swagger_ui_example_simple_get.png differ diff --git a/v24.04/en/_images/swagger_ui_overview_ng.png b/v24.04/en/_images/swagger_ui_overview_ng.png new file mode 100644 index 0000000..82e2ece Binary files /dev/null and b/v24.04/en/_images/swagger_ui_overview_ng.png differ diff --git a/v24.04/en/_images/tag-re-identification.png b/v24.04/en/_images/tag-re-identification.png new file mode 100644 index 0000000..eb06171 Binary files /dev/null and b/v24.04/en/_images/tag-re-identification.png differ diff --git a/v24.04/en/_images/tag_coord_frames.png b/v24.04/en/_images/tag_coord_frames.png new file mode 100644 index 0000000..d97cd0b Binary files /dev/null and b/v24.04/en/_images/tag_coord_frames.png differ diff --git a/v24.04/en/_images/tag_sizes_vis.png b/v24.04/en/_images/tag_sizes_vis.png new file mode 100644 index 0000000..1e77363 Binary files /dev/null and b/v24.04/en/_images/tag_sizes_vis.png differ diff --git a/v24.04/en/_images/typelabel_ng_en.png b/v24.04/en/_images/typelabel_ng_en.png new file mode 100644 index 0000000..4473951 Binary files /dev/null and b/v24.04/en/_images/typelabel_ng_en.png differ diff --git a/v24.04/en/_images/webgui_camera_calibration_1_ng_en.png b/v24.04/en/_images/webgui_camera_calibration_1_ng_en.png new file mode 100644 index 0000000..51f10e2 Binary files /dev/null and b/v24.04/en/_images/webgui_camera_calibration_1_ng_en.png differ diff --git a/v24.04/en/_images/webgui_camera_calibration_3_ng_en.png b/v24.04/en/_images/webgui_camera_calibration_3_ng_en.png new file mode 100644 index 0000000..9cf640f Binary files /dev/null and b/v24.04/en/_images/webgui_camera_calibration_3_ng_en.png differ diff --git a/v24.04/en/_images/webgui_camera_calibration_4_ng_en.png b/v24.04/en/_images/webgui_camera_calibration_4_ng_en.png new file mode 100644 index 0000000..30f1e76 Binary files /dev/null and b/v24.04/en/_images/webgui_camera_calibration_4_ng_en.png differ diff --git a/v24.04/en/_images/webgui_camera_calibration_stereo_far.png b/v24.04/en/_images/webgui_camera_calibration_stereo_far.png new file mode 100644 index 0000000..e80d23e Binary files /dev/null and b/v24.04/en/_images/webgui_camera_calibration_stereo_far.png differ diff --git a/v24.04/en/_images/webgui_camera_calibration_stereo_tilt.png b/v24.04/en/_images/webgui_camera_calibration_stereo_tilt.png new file mode 100644 index 0000000..ea84d09 Binary files /dev/null and b/v24.04/en/_images/webgui_camera_calibration_stereo_tilt.png differ diff --git a/v24.04/en/_images/webgui_camera_calibration_wrong.png b/v24.04/en/_images/webgui_camera_calibration_wrong.png new file mode 100644 index 0000000..b197854 Binary files /dev/null and b/v24.04/en/_images/webgui_camera_calibration_wrong.png differ diff --git a/v24.04/en/_images/webgui_camera_ng_en.png b/v24.04/en/_images/webgui_camera_ng_en.png new file mode 100644 index 0000000..ae3bd07 Binary files /dev/null and b/v24.04/en/_images/webgui_camera_ng_en.png differ diff --git a/v24.04/en/_images/webgui_dashboard_ng_en.png b/v24.04/en/_images/webgui_dashboard_ng_en.png new file mode 100644 index 0000000..c1b94a4 Binary files /dev/null and b/v24.04/en/_images/webgui_dashboard_ng_en.png differ diff --git a/v24.04/en/_images/webgui_depth_image_ng_en.png b/v24.04/en/_images/webgui_depth_image_ng_en.png new file mode 100644 index 0000000..61c1119 Binary files /dev/null and b/v24.04/en/_images/webgui_depth_image_ng_en.png differ diff --git a/v24.04/en/_images/webgui_hand_eye_calib1_calib_ng_en.png b/v24.04/en/_images/webgui_hand_eye_calib1_calib_ng_en.png new file mode 100644 index 0000000..10813e2 Binary files /dev/null and b/v24.04/en/_images/webgui_hand_eye_calib1_calib_ng_en.png differ diff --git a/v24.04/en/_images/webgui_hand_eye_calib2_ng_en.png b/v24.04/en/_images/webgui_hand_eye_calib2_ng_en.png new file mode 100644 index 0000000..93f17fe Binary files /dev/null and b/v24.04/en/_images/webgui_hand_eye_calib2_ng_en.png differ diff --git a/v24.04/en/_images/webgui_hand_eye_calib3_ng_en.png b/v24.04/en/_images/webgui_hand_eye_calib3_ng_en.png new file mode 100644 index 0000000..eab85bd Binary files /dev/null and b/v24.04/en/_images/webgui_hand_eye_calib3_ng_en.png differ diff --git a/v24.04/en/_images/webgui_hand_eye_calib4_ng_en.png b/v24.04/en/_images/webgui_hand_eye_calib4_ng_en.png new file mode 100644 index 0000000..d883f3c Binary files /dev/null and b/v24.04/en/_images/webgui_hand_eye_calib4_ng_en.png differ diff --git a/v24.04/en/_images/weee-mark_small.png b/v24.04/en/_images/weee-mark_small.png new file mode 100644 index 0000000..fa2ef91 Binary files /dev/null and b/v24.04/en/_images/weee-mark_small.png differ diff --git a/v24.04/en/_raw_sources/accessories.rst.txt b/v24.04/en/_raw_sources/accessories.rst.txt new file mode 100644 index 0000000..4a0202c --- /dev/null +++ b/v24.04/en/_raw_sources/accessories.rst.txt @@ -0,0 +1,110 @@ +.. include:: global_rst.glb + +.. _sect-accessories: + +Accessories +=========== + +Connectivity kit +---------------- + +.. index:: + single: connectivity kit + single: cables + single: power cable + single: network cable + +|company| offers an optional connectivity kit to aid customers with setting up the |rc_xxx|. +For permanent installation, the customer is responsible for providing a suitable power supply. +The connectivity kit consists of a: + +- network cable with straight M12 plug to straight RJ45 connector in either 2 m, 5 m, or 10 m length, +- power adapter cable with straight M12 socket to DC barrel connector in 30 cm length, +- 24 V, 30 W wall power supply, or a 24 V, 60 W desktop power supply. + +Connecting the |rc_xxx| to residential or office grid power requires a power supply that +meets EN 55011 Class B emission standards. The E2CFS 30W 24V by EGSTON System Electronics +Eggenburg GmbH (http://www.egston.com) contained in the connectivity kit is certified +accordingly. However, it does not meet immunity standards for industrial environments +under EN 61000-6-2. + +.. figure:: images/rc_visard_connectivity_kit.* + :width: 160mm + :align: center + + The optional connectivity kit's components + + +Wiring +------ + +Cables are by default not provided with the |rc_xxx|. It is the customer's responsibility +to obtain appropriate parts. The following sections provide an overview of suggested components. + +Ethernet connections +"""""""""""""""""""" +.. index:: + single: network cable + +The |rc_xxx| provides an industrial 8-pin A-coded M12 socket connector for Ethernet connectivity. +Various cabling solutions can be obtained directly from third party vendors. + +**CAT5 (1 Gbps) M12 plug to RJ45** + +- Straight M12 plug to straight RJ45 connector, 10 m length: Phoenix Contact NBC-MS/ 10,0-94B/R4AC SCO, Art.-Nr.: 1407417 +- Straight M12 plug to straight RJ45 connector, 10 m length: MURR Electronics Art.-Nr.: 7700-48521-S4W1000 +- Angled M12 plug to straight RJ45 connector, 10 m length: MURR Electronics Art.-Nr.: 7700-48551-S4W1000 + +Power connections +""""""""""""""""" + +.. index:: + single: power cable + +An 8-pin A-coded M12 plug connector is provided for power and GPIO connectivity. +Various cabling solutions can be obtained from third party vendors. A selection of M12 +to open ended cables is provided below. Customers are required to provide power and GPIO +connections to the cables according to the pinouts described in +:ref:`sect-wiring`:latex:`\:(Section \ref{hardware_spec:sect-wiring})`. +The |rc_xxx|'s housing must be connected to ground. + +**Sensor/Actor cable M12 socket to open end** + +- Straight M12 socket connector to open end, shielded, 10m length: Phoenix Contact SAC-8P-10,0-PUR/M12FS SH, Art.Nr.: 1522891 +- Angled M12 socket connector to open end, shielded 10m length: Phoenix Contact SAC-8P-10,0-PUR/M12FR SH, Art.Nr.: 1522943 + +**Sensor/Actor M12 socket for field termination** + +- Phoenix Contact SACC-M12FS-8CON-PG9-M, Art.Nr.:1513347 +- TE Connectivity T4110011081-000 (metal housing) +- TE Connectivity T4110001081-000 (plastic housing) + +Power supplies +"""""""""""""" + +.. index:: + single: power supply + +The |rc_xxx| is classified as an EN-55011 Class B device and immune to light +industrial and industrial environments. For connecting the sensor to residential +grid power, a power supply under EN 55011/55022 Class B has to be used. + +It is the customer's responsibility to obtain and install a suitable power supply +satisfying EN 61000-6-2 for permanent installation in industrial environments. One +example that satisfies both EN 61000-6-2 and EN 55011/55022 Class B is the DIN-Rail +mounted PULS MiniLine ML60.241 24V/DC 2.5 A by PULS GmbH (http://www.pulspower.com). +A certified electrician must perform installation. + +Only one |rc_xxx| shall be connected to a power supply at any time, and the total +length of cables must be less than 30 m. + + + +Spare parts +----------- + +.. index:: + single: spare parts + +No user-serviceable spare parts are currently available for |rc_xxx| +devices. diff --git a/v24.04/en/_raw_sources/appendix.rst.txt b/v24.04/en/_raw_sources/appendix.rst.txt new file mode 100644 index 0000000..4316923 --- /dev/null +++ b/v24.04/en/_raw_sources/appendix.rst.txt @@ -0,0 +1,103 @@ +.. include:: global_rst.glb + +.. _sect-appendix: + +Appendix +======== + +.. _sect-pose-formats: + +Pose formats +------------ + +A pose consists of a translation and rotation. The translation defines the +shift along the :math:`x`, :math:`y` and :math:`z` axes. +The rotation can be defined in many different ways. The +|rc_xxx| uses quaternions to define rotations and translations are given in meters. +This is called the +XYZ+quaternion format. This chapter explains the conversion between different +common conventions and the XYZ+quaternion format. + +It is quite common to define rotations in 3D by three angles that define +rotations around the three coordinate axes. Unfortunately, there are many +different ways to do that. The most common conventions are Euler and Cardan +angles (also called Tait-Bryan angles). In both conventions, the rotations can +be applied to the previously rotated axis (intrinsic rotation) or to the axis +of a fixed coordinate system (extrinsic rotation). + +We use :math:`x`, :math:`y` and :math:`z` to denote the three coordinate axes. +:math:`x'`, :math:`y'` and :math:`z'` refer to the axes that have been rotated +one time. Similarly, :math:`x''`, :math:`y''` and :math:`z''` are the axes +after two rotations. + +In the (original) Euler angle convention, the first and the third axis are +always the same. The rotation order :math:`z`-:math:`x'`-:math:`z''` means +rotating around the :math:`z`-axis, then around the already rotated +:math:`x`-axis and finally around the (two times) rotated :math:`z`-axis. In +the Cardan angle convention, three different rotation axes are used, e.g. +:math:`z`-:math:`y'`-:math:`x''`. Cardan angles are often also just called +Euler angles. + +For each intrinsic rotation order, there is an equivalent extrinsic rotation +order, which is inverted, e.g. the intrinsic rotation order +:math:`z`-:math:`y'`-:math:`x''` is equivalent to the extrinsic rotation order +:math:`x`-:math:`y`-:math:`z`. + +Rotations around the :math:`x`, :math:`y` and :math:`z` axes can be defined +by quaternions as + +.. math:: + \begin{align*} + r_x(\alpha) &= \left(\begin{array}{c}\sin\frac{\alpha}{2} \\ 0 \\ 0 \\ \cos\frac{\alpha}{2}\end{array}\right)\text{,} & + r_y(\beta) &= \left(\begin{array}{c}0 \\ \sin\frac{\beta}{2} \\ 0 \\ \cos\frac{\beta}{2}\end{array}\right)\text{,} & + r_z(\gamma) &= \left(\begin{array}{c}0 \\ 0 \\ \sin\frac{\gamma}{2} \\ \cos\frac{\gamma}{2}\end{array}\right)\text{,} + \end{align*} + +or by rotation matrices as + +.. math:: + r_x(\alpha) &= + \left(\begin{array}{ccc} + 1 & 0 & 0 \\ + 0 & \cos\alpha & -\sin\alpha \\ + 0 & \sin\alpha & \cos\alpha + \end{array}\right)\text{,} \\ + r_y(\beta) &= + \left(\begin{array}{ccc} + \cos\beta & 0 & \sin\beta \\ + 0 & 1 & 0 \\ + -\sin\beta & 0 & \cos\beta + \end{array}\right)\text{,} \\ + r_z(\gamma) &= + \left(\begin{array}{ccc} + \cos\gamma & -\sin\gamma & 0 \\ + \sin\gamma & \cos\gamma & 0 \\ + 0 & 0 & 1 + \end{array}\right)\text{.} + +The extrinsic rotation order :math:`x`-:math:`y`-:math:`z` can be computed by +multiplying the individual rotations in inverse order, i.e. :math:`r_z(\gamma) +r_y(\beta) r_x(\alpha)`. + +Based on these definitions, the following sections explain the conversion +between common conventions and the XYZ+quaternion format. + +.. Note:: Please be aware of units for positions and orientations. |rc_xxx| + devices always specify positions in meters, while most robot manufacturers use + millimeters or inches. Angles are typically specified in degrees, but may + sometimes also be given in radians. + +.. toctree:: + :maxdepth: 1 + + pose_format_rt + pose_format_abb + pose_format_fanuc + pose_format_franka_emika + pose_format_fruitcore_horst + pose_format_kawasaki + pose_format_kuka + pose_format_mitsubishi + pose_format_ur + pose_format_yaskawa + diff --git a/v24.04/en/_raw_sources/blaze.rst.txt b/v24.04/en/_raw_sources/blaze.rst.txt new file mode 100644 index 0000000..296b5f9 --- /dev/null +++ b/v24.04/en/_raw_sources/blaze.rst.txt @@ -0,0 +1,631 @@ + +.. include:: global_rst.glb + +.. _sect-blaze: + +Blaze +===== + +.. index:: + single: blaze + single: depth image + +The blaze module is a base module which is available on every |rc_xxx| +and provides disparity, confidence and error images of a connected Basler |blaze| camera +in an RGB-D setup, i.e. the blaze +Time-of-Flight (ToF) camera in combination with the Basler aceA1300 color camera. + +After connecting the Basler blaze sensor to the |rc_cube|, it can take up to about one minute until it is found. Upon first +connection of the sensor to the |rc_cube|, the sensor must be calibrated before it can be used. +Calibration can be done through the |webgui| on the page :ref:`sect-camera-calibration`:latex:`\:(Section +\ref{camera_calibration:sect-camera-calibration})` under *Configuration* in the respective pipeline. +After storing the calibration, it will persistently reside on the |rc_cube| and automatically be +used whenever the sensor is connected to the |rc_cube| again, regardless of the port or pipeline. + +The blaze module only runs in camera pipelines of type ``blaze``. + +.. _sect-disp-accessing-images: + +Viewing and downloading images and point clouds +----------------------------------------------- + +.. index:: + pair: timestamp; image + pair: point cloud; download + +The |rc_xxx| provides time-stamped disparity, error, and confidence images over the +GenICam interface (see :ref:`sect-provided-image-streams`:latex:`, \:Section \ref{gigevision:sect-provided-image-streams}`). +Live streams of the images are provided with reduced quality on the *Depth Image* page in the desired pipeline of the +:ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})`. + +The |webgui| also provides the possibility to download a snapshot of the current scene containing the depth, error and confidence +images, as well as a point cloud in ply format as described in +:ref:`sect-webgui-depth-snapshot`:latex:`\:(Section \ref{webgui:sect-webgui-depth-snapshot})`. + +.. _sect-disp-image-parameters: + +Parameters +---------- + +.. index:: + pair: parameters; disparity image + pair: disparity image; Web GUI + pair: depth image; Web GUI + +The blaze module is called ``rc_blaze`` in the |rest-api| and it is represented by the +*Depth Image* page in the desired pipeline in the :ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})`, +when a Basler |blaze| camera is connected and running in the corresponding pipeline. +The user can change the |blaze| parameters there, or use the |rest-api| +(:ref:`sect-rest-api`:latex:`, Section \ref{rest_api:sect-rest-api}`). + +Parameter overview +^^^^^^^^^^^^^^^^^^ + +.. include:: _gen/nodes/params/rc_blaze.txt + +Description of run-time parameters +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Each run-time parameter is represented by a row on the |webgui|'s *Depth Image* page. The name in the +|webgui| is given in brackets behind the parameter name and the parameters are listed in the order +they appear in the |webgui|: + +.. .. figure:: images/webgui_depth_image_blaze.png +.. :width: 100 % +.. :align: center +.. +.. The |webgui|'s *Depth Image* page for the |blaze| camera pipeline + +.. _expl-depth-exp-value: + +.. index:: + pair: blaze; exposure time + +``exp_value`` (*Exposure Time*) +''''''''''''''''''''''''''''''' + This parameter is the exposure time of the |blaze| camera in seconds. It controls for how long the + photosensitive cells are exposed to light. If the operating mode is changed, the exposure + time is set to the recommended default value. Reducing the exposure time may reduce measurement + accuracy and is only recommended when the image is overexposed. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?exp_value= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?exp_value= + +.. _expl-depth-acquisition-mode: + +.. index:: + pair: blaze; acquisition mode + +``acquisition_mode`` (*Acquisition Mode*) +''''''''''''''''''''''''''''''''''''''''' + The acquisition mode can be set to ``Continuous`` (*Continuous*) or ``SingleFrame`` (*Single*). + The first one is the default and continuously provides depth images. + In single frame mode, images are only captured when the :guilabel:`Acquire` button is clicked. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?acquisition_mode= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?acquisition_mode= + +.. _expl-depth-min-depth: + +.. index:: + pair: blaze; minimum distance + +``mindepth`` (*Minimum Distance*) +''''''''''''''''''''''''''''''''' + The minimum distance is the smallest distance from the camera + at which measurements should be possible. The minimum distance + is given in meters. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?mindepth= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?mindepth= + +.. _expl-depth-max-depth: + +.. index:: + pair: blaze; maximum distance + +``maxdepth`` (*Maximum Distance*) +''''''''''''''''''''''''''''''''' + The maximum distance is the largest distance from the camera + at which measurements should be possible. Pixels with larger distance values are + set to invalid in the disparity image. The maximum distance is given in meters. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?maxdepth= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?maxdepth= + +.. _expl-depth-fill: + +.. index:: + pair: blaze; fill-in + +``fill`` (*Fill-in*) +'''''''''''''''''''' + This option is used to fill holes in the disparity image by interpolation. + The fill-in value is the maximum allowed disparity step on the border of the + hole. Larger fill-in values can decrease the number of holes, but the interpolated + values can have larger errors. At most 5% of pixels are interpolated. Interpolation + of small holes is preferred over interpolation of larger holes. The confidence for + the interpolated pixels is set to a low value of 0.5. A fill-in value of 0 + switches hole filling off. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?fill= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?fill= + +.. _expl-depth-seg: + +.. index:: + pair: blaze; segmentation + +``seg`` (*Segmentation*) +'''''''''''''''''''''''' + The segmentation parameter is used to set the minimum number of + pixels that a connected disparity region in the disparity image must fill. + Isolated regions that are smaller are set to invalid in the disparity image. + Segmentation is useful for removing erroneous disparities. However, + larger values may also remove real objects. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?seg= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?seg= + +.. _expl-depth-min-conf: + +.. index:: + pair: blaze; minimum confidence + +``minconf`` (*Minimum Confidence*) +'''''''''''''''''''''''''''''''''' + The minimum confidence can be set to filter potentially false disparity measurements. + All pixels with less confidence than the chosen value are set to invalid + in the disparity image. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?minconf= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?minconf= + +.. _expl-depth-spatial-filter: + +.. index:: + pair: blaze; spatial filter + +``spatial_filter`` (*Spatial Filter*) +''''''''''''''''''''''''''''''''''''' + This parameter enables the spatial noise filter. The spatial noise filter uses the + values of neighboring pixels to filter out noise in an image. + It is based on the raw data of the image. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?spatial_filter= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?spatial_filter= + +.. _expl-depth-temporal-filter: + +.. index:: + pair: blaze; temporal filter + +``temporal_filter`` (*Temporal Filter*) +''''''''''''''''''''''''''''''''''''''' + This parameter enables the temporal noise filter. The temporal noise filter + uses the values of the same pixel at different points in time to filter out + noise in an image. It is based on the depth data of the image. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?temporal_filter= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?temporal_filter= + + +.. _expl-depth-temporal-filter-strength: + +.. index:: + pair: blaze; temporal filter strength + +``temporal_filter_strength`` (*Strength*) +''''''''''''''''''''''''''''''''''''''''' + + This parameter represents the strength of the temporal filter. + The higher the value, the stronger the filter. High values may + cause motion artifacts, while low values reduce the efficacy of the filter. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?temporal_filter_strength= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?temporal_filter_strength= + +.. _expl-depth-outlier-removal: + +.. index:: + pair: blaze; outlier removal + +``outlier_removal`` (*Outlier Removal*) +''''''''''''''''''''''''''''''''''''''' + + This parameter enables the outlier removal filter. + It removes pixels that differ significantly from their local environment. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?outlier_removal= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?outlier_removal= + +.. _expl-depth-outlier-removal-threshold: + +.. index:: + pair: blaze; outlier removal threshold + +``outlier_removal_threshold`` (*Threshold*) +''''''''''''''''''''''''''''''''''''''''''' + + This parameter determines the strength of the outlier removal filter. + The higher the value, the more outliers will be removed. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?outlier_removal_threshold= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?outlier_removal_threshold= + +.. _expl-depth-ambiguity-filter: + +.. index:: + pair: blaze; ambiguity filter + +``ambiguity_filter`` (*Ambiguity Filter*) +''''''''''''''''''''''''''''''''''''''''' + + This parameter enables the ambiguity filter. The ambiguity filter removes + pixels whose depth data is ambiguous. In certain demanding scenes, e.g., + because of stray light or multi-path effects, detection may fail. In this case, + the filter should be disabled. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?ambiguity_filter= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?ambiguity_filter= + + +.. _expl-depth-ambiguity-filter-threshold: + +.. index:: + pair: blaze; ambiguity filter threshold + +``ambiguity_filter_threshold`` (*Threshold*) +'''''''''''''''''''''''''''''''''''''''''''' + + This parameter determines the strength of the ambiguity filter. + The higher the value, the stronger the filter. + Higher values increase the reliability of the filter. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?ambiguity_filter_threshold= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?ambiguity_filter_threshold= + + +.. _expl-depth-gamma-correction: + +.. index:: + pair: blaze; gamma correction + +``gamma_correction`` (*Gamma Correction*) +''''''''''''''''''''''''''''''''''''''''' + + This parameter enables gamma correction on the intensity image, which is + a nonlinear operation to lighten the dark regions of the image. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?gamma_correction= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?gamma_correction= + + +.. _expl-depth-thermal-drift-correction: + +.. index:: + pair: blaze; thermal drift correction + +``thermal_drift_correction`` (*Thermal Drift Correction*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + + This parameter activates the correction of the thermal drift. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?thermal_drift_correction= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/parameters?thermal_drift_correction= + + +Status values +------------- + +This module reports the following status values: + +.. tabularcolumns:: |l|L| +.. csv-table:: The ``rc_blaze`` module's status values + :header: Name, Description + + "``fps``","Actual frame rate of the disparity, error, and confidence images. This value is shown in the |webgui| below the image preview as *FPS (Hz)*." + "``latency``","Time in seconds between image acquisition and publishing of disparity image" + "``width``","Current width of the disparity, error, and confidence images in pixels" + "``height``","Current height of the disparity, error, and confidence images in pixels" + "``mindepth``","Actual minimum working distance in meters" + "``maxdepth``","Actual maximum working distance in meters" + +.. _sect-stereo-matching-services: + +Services +-------- + +The Blaze module offers the following services. + +``acquisition_trigger`` +^^^^^^^^^^^^^^^^^^^^^^^ + + Signals the module to acquire a depth image, if the parameter ``acquisition_mode`` is set to ``SingleFrame``. + + .. toggle-header:: + :header: **Details** + + An error is returned if the ``acquisition_mode`` is set to ``Continuous``. + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/services/acquisition_trigger + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/services/acquisition_trigger + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_blaze_acquisition_trigger_request.txt + + .. tab:: **Response** + + Possible return codes are shown below. + + .. tabularcolumns:: |c|L| + .. _tab-stereo-acquisition-trigger-return-codes: + .. csv-table:: Possible return codes of the ``acquisition_trigger`` service call. + :header: Code, Description + + "0", "Success" + "-8", "Triggering is only possible in SingleFrame acquisition mode" + "101", "Trigger is ignored, because there is a trigger call pending" + "102", "Trigger is ignored, because there are no subscribers" + + .. include:: _gen/nodes/services/rc_blaze_acquisition_trigger_response.txt + +``reset_defaults`` +^^^^^^^^^^^^^^^^^^ + + Restores and applies the default values for this module's parameters + ("factory reset"). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/services/reset_defaults + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_blaze/services/reset_defaults + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_blaze_reset_defaults_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_blaze_reset_defaults_response.txt + diff --git a/v24.04/en/_raw_sources/cadmatch.rst.txt b/v24.04/en/_raw_sources/cadmatch.rst.txt new file mode 100644 index 0000000..982d286 --- /dev/null +++ b/v24.04/en/_raw_sources/cadmatch.rst.txt @@ -0,0 +1,1837 @@ +.. include:: global_rst.glb + +.. _sect-cadmatch: + +CADMatch +======== + +.. index:: ! CADMatch + single: bin picking + single: grasp computation + single: 3D object detection + single: object detection + +.. |cadm| replace:: CADMatch + +Introduction +------------ + +.. Short description and functionalities + +The |cadm| module is an optional module of the |rc_xxx| and requires a separate |cadm| :ref:`license` +:latex:`(Section \ref{maintenance:sect-updating-license})` to be purchased. + +.. only:: rc_cube and (roboception or schunk or basler) + + .. note:: This module is not available in camera pipelines of type ``blaze``. + +This module provides an out-of-the-box perception solution for 3D object detection and grasping. +|cadm| targets the detection of 3D objects based on a CAD template for picking +with a general gripper. The objects can be located in a bin or placed arbitrarily in the +field of view of the camera. + +For the |cadm| module to work, special object templates are required for each type of object to +be detected. Please get in touch with the |manufacturer| support (:ref:`sect-contact`:latex:`, +Section \ref{contact:sect-contact}`) to order a template for your CAD file. + +.. only:: rc_cube + + .. note:: + + This module is pipeline specific. Changes to its settings or parameters only affect + the respective camera pipeline and have no influence on other pipelines running on the |rc_cube|. + + However, the object templates, grasp points and pose priors are stored globally. Setting, changing + or deleting an object template, its grasps or pose priors affects all camera pipelines. + + +The |cadm| module offers: + +- A dedicated page on the |rc_xxx| :ref:`sect-web-gui`:latex:`\:(Section \ref{webgui:sect-web-gui})` + for easy setup, configuration, testing, and application tuning. +- A :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` and a + :doc:`eki`:latex:`\:(Section \ref{eki:sect-eki})`. +- The definition of regions of interest to select relevant volumes in the scene + (see :ref:`sect-roi`:latex:`, Section \ref{roi:sect-roi}`). +- A load carrier detection functionality for bin-picking applications + (see :ref:`sect-loadcarrier`:latex:`, Section \ref{loadcarrier:sect-loadcarrier}`), + to provide grasps for objects inside a bin only. +- The definition of compartments inside a load carrier to provide grasps + for specific volumes of the bin only. +- The option to use user-defined object pose priors. +- Storing of up to 50 templates. +- The definition of up to 100 grasp points for each template via an interactive visualization in the |webgui|. +- Collision checking between the gripper and the load carrier, other detected objects and/or the point cloud. +- Collision checking between the object in the gripper and the load carrier walls during retraction. +- Support for static and robot-mounted cameras and + optional integration with the :doc:`handeye_calibration` + :latex:`(Section \ref{handeye_calibration:sect-handeye-calibration})` module, + to provide grasps in the user-configured external reference frame. +- Selection of a sorting strategy to sort the detected objects and returned grasps. +- 3D visualization of the detection results with grasp points and gripper animations in the |webgui|. + +.. _sect-cadmatch-grasps: + +Setting of grasp points +----------------------- + +.. index:: + single: CADMatch; grasp points + single: CADMatch; object template + +The |cadm| module detects 3D objects in a scene based on a CAD template and returns the +poses of the object origins. To use |cadm| directly in a robot application, up to 100 grasp points +can be defined for each template. A grasp point represents the desired position and orientation +of the robot's TCP (Tool Center Point) to grasp an object. + +Please consult :ref:`sect-silhouettematch-grasps`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-grasps})` for further details. + +Setting grasp points in the |webgui| +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The |rc_xxx| |webgui| provides an intuitive and interactive way of defining grasp points for object templates. +In a first step, the object template has to be uploaded to the |rc_xxx|. This can be done +in the |webgui| in any pipeline under :menuselection:`Modules --> CADMatch` +by clicking on :guilabel:`+ Add a new Template` in the +*Templates, Grasps and Pose Priors* section, or in :menuselection:`Database --> Templates` in the +*CADMatch Templates, Grasps and Pose Priors* section. Once the +template upload is complete, a dialog with a 3D visualization of the object template is shown +for adding or editing grasp +points. The same dialog appears when editing an existing template. + +More details are given in +:ref:`sect-silhouettematch-grasps-webgui`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-grasps-webgui})`. + +Setting grasp points via the |rest-api| +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grasp points can be set via the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` +using the ``set_grasp`` or ``set_all_grasps`` services +(see :ref:`sect-cadmatch-internal-services`:latex:`, Section \ref{cadmatch:sect-cadmatch-internal-services}`). + +More details are given in :ref:`sect-silhouettematch-grasps-rest-api`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-grasps-rest-api})`. + +.. _sect-cadmatch-pose-priors: + +Setting of pose priors +---------------------- + +.. index:: + single: CADMatch; pose priors + single: CADMatch; object template + +The |cadm| module offers the possibility to define prior poses of the objects to be detected. +If a pose prior is given, the object detection will use this pose prior and only refine the +given pose. This speeds up the detection significantly. A pose prior represents the approximate +position and orientation of the object to be detected. The pose can be defined in the camera or +the external coordinate frame, if a hand-eye calibration is available. + +Each pose prior consists of an ``id`` which must be +unique within all pose priors for an object template, the ``template_id`` representing the template the pose +prior applies to, the ``pose`` and the ``pose_frame`` of the prior. +Pose priors can be set via the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`, +or by using the interactive visualization in the |webgui|. The |webgui| allows to interactively position the object +in the current point cloud. This can be done in the "Pose Priors" tab during editing a template. + +Pose priors should be used in applications where the approximate object poses are known beforehand. +The |rcxxx| can store up to 50 pose priors per template. + +.. _sect-cadmatch-set-preferred-orientation: + +Setting the preferred orientation of the TCP +-------------------------------------------- + +.. index:: + single: CADMatch; preferred orientation + +The |cadm| module determines the reachability of grasp points based on the *preferred orientation* of the +gripper or TCP. The preferred orientation can be set via the ``set_preferred_orientation`` service call or on +the *CADMatch* page in the |webgui|. +The resulting direction of the TCP's z axis is used to reject grasps which cannot be reached by the gripper. +Furthermore, the preferred orientation can be used to sort the reachable grasps by setting the corresponding +sorting strategy. + +The preferred orientation can be set in the camera coordinate frame or in the external coordinate frame, in case +a hand-eye calibration is available. If the preferred orientation is specified in the external coordinate frame +and the sensor is robot mounted, the current robot pose has to be given to each object detection call, so that the +preferred orientation can be used for filtering and, optionally, sorting the grasps on the detected objects. +If no preferred orientation is set, the orientation of the left camera is used as the preferred orientation of the TCP. + +.. _sect-cadmatch-set-sorting-strategies: + +Setting the sorting strategies +------------------------------ + +The objects and grasps returned by the ``detect_object`` service call are sorted according to a sorting strategy which can be +chosen by the user. The following sorting strategies are available and +can be set in the :ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})` +or using the ``set_sorting_strategies`` service call: + +- ``gravity``: highest matches and grasp points along the gravity direction are returned first, +- ``match_score``: matches with the highest match score and grasp points on objects with the highest match score are returned first, +- ``preferred_orientation``: matches and grasp points with minimal rotation difference between their orientation and the preferred orientation of the TCP are returned first, +- ``direction``: matches and grasp points with the shortest distance along a defined direction ``vector`` in a given ``pose_frame`` are returned first. + +If no sorting strategy is set or default sorting is chosen in the Web GUI, sorting is done based on a combination of +``match_score`` and the minimal distance from the camera along the z axis of the preferred orientation of the TCP. + + +.. _sect-cadmatch-detect-objects: + +Detection of objects +-------------------- + +.. index:: + single: CADMatch; object detection + single: CADMatch; object template + single: CADMatch; sorting + +The |cadm| module requires an object template for object detection. This template contains +information about the 3D shape of the object and prominent edges that can be visible in the +camera images. |cadm| also supports partial object templates, which contain only a specific +part of the object that can be detected well, e.g., in case of occlusions. Furthermore, templates +can require a pose prior for the detection which is then only refined using the image data. + +The object detection is a two-stage process consisting of a prior estimation step and a pose refinement step. +First, a pose prior is computed based on the appearance +of the object in the camera images. Second, the pose is refined by using the 3D point cloud and +edges in the camera image. For this to work, the objects to detect must be visible in both left and right camera images. +If pose priors are given, only the pose refinement step is performed based, which decreases runtime significantly. + +For triggering the object detection, in general, the following information +must be provided to the |cadm| module: + +- The template ID of the object to be detected in the scene. +- The coordinate frame in which the poses of the detected objects and the grasp points shall be returned + (ref. :ref:`sect-cadmatch-hand-eye-dep`:latex:`, Section \ref{cadmatch:sect-cadmatch-hand-eye-dep}`). + +Optionally, further information can be given to the |cadm| module: + +- The IDs of the pose priors which approximately match the poses of the objects to be detected. + In case a template is used that requires a pose prior, one or more pose prior IDs have to be provided. +- The ID of the load carrier which contains the items to be detected. +- A compartment inside the load carrier where to detect objects (see :ref:`sect-loadcarrier-compartment`:latex:`, Section \ref{loadcarrier_db:sect-loadcarrier-compartment}`). +- The ID of the 3D region of interest where to search for the load carriers if a + load carrier is set. + Otherwise, the ID of the 3D region of interest where to search for the objects. +- The current robot pose in case the camera is mounted on the robot and + the chosen coordinate frame for the poses is ``external``, or the preferred orientation + is given in the external frame, or the chosen region of interest is defined in the external frame. +- Collision detection information: The ID of the gripper to enable collision checking and optionally + a pre-grasp offset to define a pre-grasp position. + Details on collision + checking are given below in :ref:`sect-cadmatch-collision-check-dep`:latex:`\:(Section \ref{cadmatch:sect-cadmatch-collision-check-dep})`. +- Data acquisition mode: The user can choose if a new image dataset is acquired for the detection (default), or if the detection should be + performed on the previously used image dataset. This saves data acquisition time, e.g. in case several detections with different + templates have to be run on the same image. + +On the |webgui| the detection can be tested in the *Try Out* section of the |cadm| module's page. + +The detected objects are returned in a list of ``matches``, sorted according to the selected sorting strategy +(see :ref:`sect-cadmatch-set-sorting-strategies`:latex:`, Section \ref{cadmatch:sect-cadmatch-set-sorting-strategies}`). +Each detected object +includes a ``uuid`` (Universally Unique Identifier) and the +``timestamp`` of the oldest image that was used to detect it. +The ``pose`` of a detected object corresponds to the pose of the origin of the object template used for detection. +Furthermore, the matching ``score`` is given to indicate the quality of the detection. + +If the chosen template also has grasp points attached +(see :ref:`sect-cadmatch-grasps`:latex:`, Section \ref{cadmatch:sect-cadmatch-grasps}`), +a list of ``grasps`` for all objects is returned in addition to the list of detected objects. +The grasps are sorted according to the selected sorting strategy +(see :ref:`sect-cadmatch-set-sorting-strategies`:latex:`, Section \ref{cadmatch:sect-cadmatch-set-sorting-strategies}`). +The grasp poses are given in the desired coordinate frame. There are references between the detected objects +and the grasps via their ``uuids``. + +For objects with a discrete symmetry (e.g. prismatic objects), all collision-free symmetries of +each grasp point which are reachable according to the given preferred +TCP orientation are returned, ordered by the given sorting strategy. + +For objects with a continuous symmetry (e.g. cylindrical objects), all grasps symmetric +to each grasp point on an object are checked for reachability and collisions, and only the +best one according to the given sorting strategy is returned. + +.. Note:: + The first detection call with a new object template takes longer than the following detection calls, + because the object template has to be loaded into the |cadm| module first. To avoid this, the + ``warmup_template`` service can be used to load a template so that it is ready when the first detection + is triggered. + +.. _sect-cadmatch-dependencies: + +Interaction with other modules +------------------------------ + +Internally, the |cadm| module depends on, and interacts with other on-board +modules as listed below. + +.. Note:: + All changes and configuration updates to these modules will affect + the performance of the |cadm| modules. + + +.. _sect-cadmatch-stereo-camera-matching: + +Stereo camera and Stereo matching +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The |cadm| module makes internally use of the following data: + +- Rectified images from the :doc:`stereo_camera` module + (``rc_camera``:latex:`, Section \ref{stereo_camera:sect-stereo-camera}`); + +- Disparity, error, and confidence images from the :doc:`stereo_matching` module + (``rc_stereomatching``:latex:`, Section \ref{stereo_matching:sect-stereo-matching}`). + +The ``quality`` parameter of the stereo matching module must be set to ``Medium`` +or higher (see :ref:`sect-disp-image-parameters`:latex:`, Section \ref{stereo_matching:sect-disp-image-parameters}`). We recommend ``Full`` or ``High`` quality for using |cadm|. + +All processed images are guaranteed to be captured after the module trigger time. + +.. _sect-cadmatch-iocontrol-dep: + +IO and Projector Control +^^^^^^^^^^^^^^^^^^^^^^^^ + +In case the |rc_xxx| is used in conjunction with an external random dot projector and +the :doc:`iocontrol` module (``rc_iocontrol``:latex:`, Section \ref{iocontrol:sect-iocontrol}`), +it is recommended to connect the projector to GPIO Out 1 and set +the stereo-camera module's acquisition mode to ``SingleFrameOut1`` +(see :ref:`Stereo matching parameters`:latex:`, Section \ref{stereo_matching:sect-disp-image-parameters}`), so that +on each image acquisition trigger an image with and without projector pattern is acquired. + +Alternatively, the output mode for the GPIO output in use should be set to ``ExposureAlternateActive`` +(see :ref:`sect-iocontrol-params`:latex:`, Section \ref{iocontrol:sect-iocontrol-params}`). + +In either case, +the *Auto Exposure Mode* ``exp_auto_mode`` should be set to ``AdaptiveOut1`` to optimize the exposure +of both images (see :ref:`Stereo camera parameters`:latex:`, Section \ref{stereo_camera:sect-cam-params}`). + +.. _sect-cadmatch-hand-eye-dep: + +Hand-eye calibration +^^^^^^^^^^^^^^^^^^^^ + +In case the camera has been calibrated to a robot, the |cadm| module +can automatically provide poses in the robot coordinate frame. +For the |cadm| node's :ref:`sect-cadmatch-services`:latex:`\:(Section \ref{cadmatch:sect-cadmatch-services})`, the frame of the +output poses can be controlled with the ``pose_frame`` argument. + +Two different ``pose_frame`` values can be chosen: + +1. **Camera frame** (``camera``). + All poses provided by the modules are in the camera frame, + and no prior knowledge about the pose of the camera in the environment is required. + This means that the configured regions of interest and load carriers move with the camera. + It is the user's responsibility to update the configured poses + if the camera frame moves (e.g. with a robot-mounted camera). + +2. **External frame** (``external``). + All poses provided by the modules are in the external frame, + configured by the user during the hand-eye calibration process. + The module relies on the on-board + :doc:`Hand-eye calibration module`:latex:`\:(Section \ref{handeye_calibration:sect-handeye-calibration})` + to retrieve the sensor mounting (static or robot mounted) and + the hand-eye transformation. + If the mounting is static, no further information is needed. + If the sensor is robot-mounted, the ``robot_pose`` is required + to transform poses to and from the ``external`` frame. + +.. Note:: + If no hand-eye calibration is available, all ``pose_frame`` values should be set to ``camera``. + +All ``pose_frame`` values that are not ``camera`` or ``external`` are rejected. + +If the sensor is robot-mounted, the current ``robot_pose`` has to be provided depending on the value of ``pose_frame``, +the definition of the preferred TCP orientation and the sorting direction: + +- If ``pose_frame`` is set to ``external``, providing the robot pose is obligatory. +- If the preferred TCP orientation is defined in ``external``, providing the robot pose is obligatory. +- If the sorting direction is defined in ``external``, providing the robot pose is obligatory. +- In all other cases, providing the robot pose is optional. + +.. _sect-cadmatch-load-carrier-dep: + +LoadCarrier +^^^^^^^^^^^ + +The |cadm| module uses the load carrier detection functionality provided by the +:doc:`loadcarrier` module (``rc_load_carrier``:latex:`, Section \ref{loadcarrier:sect-loadcarrier}`), +with the run-time parameters specified for this module. However, only one load carrier will be +returned and used in case multiple matching load carriers could be found in the scene. In case multiple +load carriers of the same type are visible, a region of interest should be set to ensure that always the +same load carrier is used for the |cadm| module. + +.. _sect-cadmatch-collision-check-dep: + +CollisionCheck +^^^^^^^^^^^^^^ + +.. index:: + single: CADMatch; collision check + +Collision checking can be easily enabled for +grasp computation of the |cadm| module by passing a ``collision_detection`` argument to the +``detect_object`` service call. It contains the ID of the used gripper and +optionally a pre-grasp offset. The gripper has to be +defined in the GripperDB module +(see :ref:`sect-gripper-db-gripper`:latex:`, Section \ref{gripper_db:sect-gripper-db-gripper}`) +and details about collision checking are given in +:ref:`sect-collision-check-other-modules`:latex:`\:(Section \ref{collisioncheck:sect-collision-check-other-modules})`. + +Alternatively, grasp points can be assigned individual gripper IDs, and collision checking can be enabled for all +grasp points with gripper IDs by enabling the run-time parameter ``check_collisions``. + +If the selected |cadm| template contains a collision geometry and the run-time parameter ``check_collisions_with_matches`` is true, +also collisions between the gripper and all other detected objects (not limited to ``max_matches``) will be checked. The object +on which the grasp point to be checked is located, is excluded from the collision check. + +If the run-time parameter ``check_collisions_with_point_cloud`` is true, +also collisions between the gripper and a watertight version of the point cloud are checked. +If this feature is used with suctions grippers, it should be ensured that the TCP is defined +to be outside the gripper geometry, or that the grasp points are defined above the object surface. +Otherwise every grasp will result in a collision between the gripper and the point cloud. + +If the run-time parameter ``check_collisions_during_retraction`` is true and a load carrier and a pre-grasp offset are given, +each grasp point will be checked for collisions between the object in the gripper and the load carrier walls during retraction. +This collision check is performed along the full linear trajectory from the grasp point back to the pre-grasp position. + +If collision checking is enabled, only grasps which are collision free or could not be checked for collisions +(e.g. because no gripper was given) will be returned. +The result image on top of the *CADMatch* +page of the |webgui| also shows collision-free grasps in green, unchecked grasps in yellow and colliding grasp points in red. +The detected objects which are considered in the collision check are also visualized with their edges in red. + +The CollisionCheck module's run-time parameters affect the collision detection as described in +:ref:`CollisionCheck Parameters`:latex:`\:(Section \ref{collisioncheck:sect-collisioncheck-parameters})`. + +.. _sect-cadmatch-parameters: + +Parameters +---------- + +.. index:: + single: CADMatch; parameters + +The |cadm| module is called ``rc_cadmatch`` +in the |rest-api| and is represented in the +:ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})` +:cubeonly:`in the desired pipeline` under +:menuselection:`Modules --> CADMatch`. +The user can explore and configure the ``rc_cadmatch`` +module's run-time parameters, e.g. for development and testing, using the |webgui| or the +:doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`. + +Parameter overview +^^^^^^^^^^^^^^^^^^ + +.. include:: _gen/nodes/params/rc_cadmatch.txt + +Description of run-time parameters +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Each run-time parameter is represented by a row on the |webgui|'s *CADMatch* page. +The name in the |webgui| is given in brackets behind the parameter name and the parameters are +listed in the order they appear in the |webgui|: + +.. _expl-cadmatch-max-matches: + +``max_matches`` (*Maximum Matches*) +''''''''''''''''''''''''''''''''''' + is the maximum number of objects to detect. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?max_matches= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?max_matches= + +.. _expl-cadmatch-min-score: + +``min_score`` (*Minimum Score*) +''''''''''''''''''''''''''''''' + is the minimum detection score after refinement. The higher this value, the better 2D edges and 3D point cloud must match the given template. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?min_score= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?min_score= + +.. _expl-cadmatch-edge-sensitivity: + +``edge_sensitivity`` (*Edge Sensitivity*) +''''''''''''''''''''''''''''''''''''''''' + is the sensitivity of the edge detector. The higher the value of this parameter, the more edges will be used for pose refinement. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?edge_sensitivity= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?edge_sensitivity= + +.. _expl-cadmatch-edge-max-distance: + +``edge_max_distance`` (*Maximum Edge Distance*) +''''''''''''''''''''''''''''''''''''''''''''''' + is the maximum allowed distance in pixels between the template edges and the detected edges in the image during the refinement step. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?edge_max_distance= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?edge_max_distance= + + +.. _expl-cadmatch-grasp-filter-orientation-threshold: + +``grasp_filter_orientation_threshold`` (*Grasp Orientation Threshold*) +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + is the maximum deviation of the TCP's z axis at the grasp point from the z axis of the TCP's preferred orientation in degrees. + Only grasp points which are within this threshold are returned. When set + to zero, any deviations are valid. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?grasp_filter_orientation_threshold= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?grasp_filter_orientation_threshold= + +.. _expl-cadmatch-only-highest-priority-grasps: + +``only_highest_priority_grasps`` (*Only Highest Priority Grasps*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + If set to true, only grasps with the highest priority will be returned. If collision checking is enabled, only the collision-free + grasps among the group of grasps with the highest priority are returned. + This can save computation time and reduce the number of grasps to be parsed on the application side. + + Without collision checking, only grasps of highest priority are returned. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?only_highest_priority_grasps= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?only_highest_priority_grasps= + +.. _expl-cadmatch-check-collisions: + +``check_collisions`` (*Check Collisions*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + If this parameter is enabled, collision checking will be performed for all grasps which have a gripper ID assigned, + even when no default gripper is given in the ``detect_object`` service call. If a load carrier is used, the collision + check will always be performed between the gripper and the load carrier. + Collision checking with the point cloud and other matches is only performed when the corresponding runtime parameters are enabled. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?check_collisions= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?check_collisions= + +.. _expl-cadmatch-check-collisions-with-matches: + +``check_collisions_with_matches`` (*Check Collisions with Matches*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + This parameter is only used when collision checking is enabled by passing a gripper to the ``detect_object`` service call + or by enabling the ``check_collisions`` runtime parameter. + If ``check_collisions_with_matches`` is set to true, + all grasp points will be checked for collisions between the gripper and all other detected objects (not limited to + ``max_matches``), and only grasp points at which the gripper would not collide with any other detected object + will be returned. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?check_collisions_with_matches= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?check_collisions_with_matches= + +.. _expl-cadmatch-check-collisions-with-point-cloud: + +``check_collisions_with_point_cloud`` (*Check Collisions with Point Cloud*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + This parameter is only used when collision checking is enabled by passing a gripper to the ``detect_object`` service call + or by enabling the ``check_collisions`` runtime parameter. + If ``check_collisions_with_point_cloud`` is set to true, + all grasp points will be checked for collisions between the gripper a watertight version of the point cloud, and only grasp points + at which the gripper would not collide with this point cloud will be returned. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?check_collisions_with_point_cloud= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?check_collisions_with_point_cloud= + + +.. _expl-cadmatch-check-collisions-during-retraction: + +``check_collisions_during_retraction`` (*Check Collisions during Retraction*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + This parameter is only used when collision checking is enabled by passing a gripper to the ``detect_object`` service call + or by enabling the ``check_collisions`` runtime parameter. + When ``check_collisions_during_retraction`` is enabled and a load carrier and a pre-grasp offset are given, + each grasp point will be checked for collisions + between the object in the gripper and the load carrier walls during retraction. + This collision checking is performed along the full linear trajectory from the grasp point back to the pre-grasp position. + Only collision-free grasp points will be returned. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?check_collisions_during_retraction= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?check_collisions_during_retraction= + + +.. _sect-cadmatch-status-values: + +Status values +------------- + +.. index:: + single: CADMatch; status + +The ``rc_cadmatch`` module reports the following status values: + +.. tabularcolumns:: |l|L| +.. csv-table:: The ``rc_cadmatch`` module's status values + :header: Name, Description + + "``data_acquisition_time``","Time in seconds required by the last active service to acquire images" + "``last_timestamp_processed``","The timestamp of the last processed dataset" + "``last_request_timestamp``","The timestamp of the last detection request" + "``load_carrier_detection_time``","Processing time of the last load carrier detection in seconds" + "``object_detection_time``","Processing time of the last last object detection in seconds" + "``processing_time``","Processing time of the last detection (including load carrier detection) in seconds" + "``state``","The current state of the rc_cadmatch node" + +The reported ``state`` can take one of the following values. + +.. tabularcolumns:: |l|l| +.. _tab-cadmatch-states: +.. csv-table:: Possible states of the CADMatch module + :header: State name, Description + + "IDLE", "The module is idle." + "RUNNING", "The module is running and ready for load carrier detection and object detection." + "FATAL", "A fatal error has occurred." + +.. _sect-cadmatch-services: + +Services +-------- + +.. index:: + single: CADMatch; services + +The user can explore and call the ``rc_cadmatch`` module's services, +e.g. for development and testing, using the +:doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` or +the |rc_xxx| +:ref:`sect-web-gui`:latex:`\:(Section \ref{webgui:sect-web-gui})`. + +The |cadm| modules offer the following services. + + +.. _expl-cadmatch-srv-detect-object: + +``detect_object`` +^^^^^^^^^^^^^^^^^ + + Triggers the detection of objects as described in + :ref:`sect-cadmatch-detect-objects`:latex:`\:(Section \ref{cadmatch:sect-cadmatch-detect-objects})` + based on an object template. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/detect_object + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/detect_object + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/detect_object + + .. tabs:: + + .. tab:: **Request** + + Required arguments: + + ``pose_frame``: see :ref:`sect-cadmatch-hand-eye-dep`:latex:`\:(Section \ref{cadmatch:sect-cadmatch-hand-eye-dep})`. + + ``template_id``: the ID of the template to be detected. + + Potentially required arguments: + + ``robot_pose``: see :ref:`sect-cadmatch-hand-eye-dep`:latex:`\:(Section \ref{cadmatch:sect-cadmatch-hand-eye-dep})`. + + ``pose_prior_ids``: IDs of the pose priors for the items to be detected. In case the chosen template requires a pose prior for the detection, + this argument must be provided. + + Optional arguments: + + ``load_carrier_id``: ID of the load carrier which contains the items to be detected. + + ``load_carrier_compartment``: compartment inside the load carrier where to detect items + (see :ref:`sect-loadcarrier-compartment`:latex:`, Section \ref{loadcarrier_db:sect-loadcarrier-compartment}`). + + ``region_of_interest_id``: if ``load_carrier_id`` is set, + ID of the 3D region of interest where to search for the load carriers. + Otherwise, ID of the 3D region of interest where to search for the objects. + + ``collision_detection``: see :ref:`sect-collision-check-other-modules`:latex:`\:(Section \ref{collisioncheck:sect-collision-check-other-modules})`. + + ``data_acquisition_mode``: if set to ``CAPTURE_NEW`` (default), a new image dataset will be used for the detection. If set to ``USE_LAST`` the previous + dataset will be used for the detection. + + + .. include:: _gen/nodes/services/rc_cadmatch_detect_object_request.txt + + .. tab:: **Response** + + ``grasps``: list of grasps on the detected objects, ordered according to the chosen sorting strategy. + The ``match_uuid`` gives the reference to the detected object in ``matches`` + this grasp belongs to. The list of returned grasps will be trimmed to the 100 best grasps if more reachable grasps are found. + Each grasp contains a flag ``collision_checked`` and a ``gripper_id`` + (see :ref:`sect-collision-check-other-modules`:latex:`, Section \ref{collisioncheck:sect-collision-check-other-modules}`). + + ``load_carriers``: list of detected load carriers. + + ``matches``: list of detected objects matching the template. The matches are ordered according to the chosen sorting strategy. The ``score`` indicates how well the object matches the template. The + ``grasp_uuids`` refer to the grasps in ``grasps`` which are reachable on this object. + + ``timestamp``: timestamp of the image set the detection ran on. + + ``return_code``: holds possible warnings or error codes and messages. + + .. include:: _gen/nodes/services/rc_cadmatch_detect_object_response.txt + +.. _expl-cadmatch-srv-set-preferred-orientation: + +``set_preferred_orientation`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Persistently stores the preferred orientation of the gripper to compute the reachability of the grasps, + which is used for filtering and, optionally, sorting the grasps returned by the ``detect_object`` service + (see :ref:`sect-cadmatch-set-preferred-orientation`:latex:`, Section \ref{cadmatch:sect-cadmatch-set-preferred-orientation}`). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/set_preferred_orientation + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/set_preferred_orientation + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/set_preferred_orientation + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_cadmatch_set_preferred_orientation_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_set_preferred_orientation_response.txt + +.. _expl-cadmatch-srv-get-preferred-orientation: + +``get_preferred_orientation`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns the preferred orientation of the gripper to compute the reachability of the grasps, + which is used for filtering and, optionally, sorting the grasps returned by the ``detect_object`` service + (see :ref:`sect-cadmatch-set-preferred-orientation`:latex:`, Section \ref{cadmatch:sect-cadmatch-set-preferred-orientation}`). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/get_preferred_orientation + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/get_preferred_orientation + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/get_preferred_orientation + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_cadmatch_get_preferred_orientation_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_get_preferred_orientation_response.txt + + +.. _expl-cadmatch-srv-set-sorting-strategies: + +``set_sorting_strategies`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Persistently stores the sorting strategy for sorting the grasps and matches returned by the ``detect_object`` service + (see :ref:`sect-cadmatch-detect-objects`:latex:`, Section \ref{cadmatch:sect-cadmatch-detect-objects}`). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/set_sorting_strategies + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/set_sorting_strategies + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/set_sorting_strategies + + .. tabs:: + + .. tab:: **Request** + + Only one strategy may have a ``weight`` greater than 0. If all ``weight`` values are set to 0, the module will use the + default sorting strategy. + + If the weight for ``direction`` is set, the + ``vector`` must contain the direction vector and ``pose_frame`` must be either ``camera`` or ``external``. + + .. include:: _gen/nodes/services/rc_cadmatch_set_sorting_strategies_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_set_sorting_strategies_response.txt + +.. _expl-cadmatch-srv-get-sorting-strategies: + +``get_sorting_strategies`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns the sorting strategy for sorting the grasps and matches returned by the ``detect_object`` service + (see :ref:`sect-cadmatch-detect-objects`:latex:`, Section \ref{cadmatch:sect-cadmatch-detect-objects}`). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/get_sorting_strategies + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/get_sorting_strategies + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/get_sorting_strategies + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_cadmatch_get_sorting_strategies_request.txt + + .. tab:: **Response** + + All ``weight`` values are 0 when the module uses the default sorting strategy. + + .. include:: _gen/nodes/services/rc_cadmatch_get_sorting_strategies_response.txt + +.. _expl-cadmatch-srv-warmup-template: + +``warmup_template`` +^^^^^^^^^^^^^^^^^^^ + + Loads a template so that it is ready when the first detection with this template is triggered. + Without using this service, the first detection with a new template takes longer than the following ones, + because the template is then loaded at the first detection. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/warmup_template + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/warmup_template + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/warmup_template + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_cadmatch_warmup_template_request.txt + + The ``template_id`` is the ID of the template to be loaded into the |cadm| module. + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_warmup_template_response.txt + + +.. _expl-cadmatch-srv-start: + +``start`` +^^^^^^^^^ + + Starts the module. If the command is accepted, the module moves to state ``RUNNING``. + + .. toggle-header:: + :header: **Details** + + The ``current_state`` value in the service response may differ from ``RUNNING`` if + the state transition is still in process when the service returns. + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/start + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/start + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/start + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_cadmatch_start_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_start_response.txt + + +.. _expl-cadmatch-srv-stop: + +``stop`` +^^^^^^^^ + + Stops the module. If the command is accepted, the module moves to state ``IDLE``. + + .. toggle-header:: + :header: **Details** + + The ``current_state`` value in the service response may differ from ``IDLE`` if + the state transition is still in process when the service returns. + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/stop + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/stop + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/stop + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_cadmatch_stop_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_stop_response.txt + +.. only:: rc_cube + + .. _expl-cadmatch-srv-trigger-dump: + + ``trigger_dump`` + ^^^^^^^^^^^^^^^^ + Triggers dumping of the detection that corresponds to the given timestamp, + or the latest detection, if no timestamp is given. The dumps are saved to the + connected USB drive. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/trigger_dump + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/trigger_dump + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_cadmatch_trigger_dump_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_trigger_dump_response.txt + +.. _expl-cadmatch-srv-reset-params: + +``reset_defaults`` +^^^^^^^^^^^^^^^^^^ + + Resets all parameters of the module to its default values, + as listed in above table. + Also resets preferred orientation and sorting strategies. + The reset does not apply to templates. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/reset_defaults + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/reset_defaults + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/reset_defaults + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_cadmatch_reset_defaults_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_reset_defaults_response.txt + + +.. _expl-cadmatch-srv-set-roi: + +``set_region_of_interest`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Persistently stores a 3D region of interest on the |rc_xxx|. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-roi-srv-set-roi`:latex:`\:(Section \ref{roi:expl-roi-srv-set-roi})` in ``rc_roi_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/set_region_of_interest + +.. _expl-cadmatch-srv-get-roi: + +``get_regions_of_interest`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns the configured 3D regions of interest with the requested ``region_of_interest_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-roi-srv-get-roi`:latex:`\:(Section \ref{roi:expl-roi-srv-get-roi})` in ``rc_roi_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/get_regions_of_interest + +.. _expl-cadmatch-srv-delete-roi: + +``delete_regions_of_interest`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Deletes the configured 3D regions of interest with the requested ``region_of_interest_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-roi-srv-delete-roi`:latex:`\:(Section \ref{roi:expl-roi-srv-delete-roi})` in ``rc_roi_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/delete_regions_of_interest + +.. _sect-cadmatch-internal-services: + +Internal services +----------------- + +The following services for configuring grasps and pose priors can change in future without notice. +Setting, retrieving and deleting grasps and pose priors is recommended to be done via the |webgui|. + +.. only:: rc_cube + + .. note:: + + Configuring grasps and pose priors is global for all templates on the |rc_cube| and affects all + camera pipelines. + +.. _expl-cadmatch-srv-set-grasp: + +``set_grasp`` +^^^^^^^^^^^^^ + + Persistently stores a grasp for the given object template on the |rc_xxx|. + All configured grasps are persistent over firmware updates and rollbacks. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/set_grasp + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/set_grasp + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/set_grasp + + .. tabs:: + + .. tab:: **Request** + + Details for the definition of the ``grasp`` type are given in + :ref:`sect-cadmatch-grasps`:latex:`\:(Section \ref{cadmatch:sect-cadmatch-grasps})`. + + .. include:: _gen/nodes/services/rc_cadmatch_set_grasp_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_set_grasp_response.txt + +.. _expl-cadmatch-srv-set-all-grasps: + +``set_all_grasps`` +^^^^^^^^^^^^^^^^^^ + + Replaces the list of grasps for the given object template on the |rc_xxx|. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/set_all_grasps + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/set_all_grasps + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/set_all_grasps + + .. tabs:: + + .. tab:: **Request** + + Details for the definition of the ``grasp`` type are given in + :ref:`sect-cadmatch-grasps`:latex:`\:(Section \ref{cadmatch:sect-cadmatch-grasps})`. + + .. include:: _gen/nodes/services/rc_cadmatch_set_all_grasps_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_set_all_grasps_response.txt + + +.. _expl-cadmatch-srv-get-grasps: + +``get_grasps`` +^^^^^^^^^^^^^^ + + Returns all configured grasps which have the requested ``grasp_ids`` and belong to the requested ``template_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/get_grasps + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/get_grasps + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/get_grasps + + .. tabs:: + + .. tab:: **Request** + + If no ``grasp_ids`` are provided, all grasps belonging to the requested ``template_ids`` are returned. + If no ``template_ids`` are provided, all grasps with the requested ``grasp_ids`` are returned. + If neither IDs are provided, all configured grasps are returned. + + .. include:: _gen/nodes/services/rc_cadmatch_get_grasps_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_get_grasps_response.txt + +.. _expl-cadmatch-srv-delete-grasps: + +``delete_grasps`` +^^^^^^^^^^^^^^^^^ + + Deletes all grasps with the requested ``grasp_ids`` that belong to the requested ``template_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/delete_grasps + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/delete_grasps + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/delete_grasps + + .. tabs:: + + .. tab:: **Request** + + If no ``grasp_ids`` are provided, all grasps belonging to the requested ``template_ids`` are deleted. + The ``template_ids`` list must not be empty. + + .. include:: _gen/nodes/services/rc_cadmatch_delete_grasps_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_delete_grasps_response.txt + +.. _expl-cadmatch-srv-get-symmetric-grasps: + +``get_symmetric_grasps`` +^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns all grasps that are symmetric to the given grasp. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/get_symmetric_grasps + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/get_symmetric_grasps + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/get_symmetric_grasps + + .. tabs:: + + .. tab:: **Request** + + Details for the definition of the ``grasp`` type are given in + :ref:`sect-cadmatch-grasps`:latex:`\:(Section \ref{cadmatch:sect-cadmatch-grasps})`. + + .. include:: _gen/nodes/services/rc_cadmatch_get_symmetric_grasps_request.txt + + .. tab:: **Response** + + The first grasp in the returned list is the one that was passed with the service call. + If the object template does not have an exact symmetry, only the grasp passed with the + service call will be returned. If the object template has a continuous symmetry (e.g. a + cylindrical object), only 12 equally spaced sample grasps will be returned. + + Details for the definition of the ``grasp`` type are given in + :ref:`sect-cadmatch-grasps`:latex:`\:(Section \ref{cadmatch:sect-cadmatch-grasps})`. + + .. include:: _gen/nodes/services/rc_cadmatch_get_symmetric_grasps_response.txt + +.. _expl-cadmatch-srv-set-pose-prior: + +``set_pose_prior`` +^^^^^^^^^^^^^^^^^^ + + Persistently stores a pose prior for the given object template on the |rc_xxx|. + All configured pose priors are persistent over firmware updates and rollbacks. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/set_pose_prior + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/set_pose_prior + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/set_pose_prior + + .. tabs:: + + .. tab:: **Request** + + Details for the definition of the ``pose_prior`` type are given in + :ref:`sect-cadmatch-pose-priors`:latex:`\:(Section \ref{cadmatch:sect-cadmatch-pose-priors})`. + + .. include:: _gen/nodes/services/rc_cadmatch_set_pose_prior_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_set_pose_prior_response.txt + +.. _expl-cadmatch-srv-set-all-pose-priors: + +``set_all_pose_priors`` +^^^^^^^^^^^^^^^^^^^^^^^ + + Replaces the list of pose priors for the given object template on the |rc_xxx|. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/set_all_pose_priors + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/set_all_pose_priors + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/set_all_pose_priors + + .. tabs:: + + .. tab:: **Request** + + Details for the definition of the ``pose_prior`` type are given in + :ref:`sect-cadmatch-pose-priors`:latex:`\:(Section \ref{cadmatch:sect-cadmatch-pose-priors})`. + + .. include:: _gen/nodes/services/rc_cadmatch_set_all_pose_priors_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_set_all_pose_priors_response.txt + + +.. _expl-cadmatch-srv-get-pose-priors: + +``get_pose_priors`` +^^^^^^^^^^^^^^^^^^^^^ + + Returns all configured pose priors which have the requested ``pose_prior_ids`` and belong to the requested ``template_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/get_pose_priors + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/get_pose_priors + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/get_pose_priors + + .. tabs:: + + .. tab:: **Request** + + If no ``pose_prior_ids`` are provided, all pose priors belonging to the requested ``template_ids`` are returned. + If no ``template_ids`` are provided, all pose priors with the requested ``pose_prior_ids`` are returned. + If neither IDs are provided, all configured pose priors are returned. + + .. include:: _gen/nodes/services/rc_cadmatch_get_pose_priors_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_get_pose_priors_response.txt + +.. _expl-cadmatch-srv-delete-pose-priors: + +``delete_pose_priors`` +^^^^^^^^^^^^^^^^^^^^^^ + + Deletes all pose priors with the requested ``pose_prior_ids`` that belong to the requested ``template_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/delete_pose_priors + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/services/delete_pose_priors + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_cadmatch/services/delete_pose_priors + + .. tabs:: + + .. tab:: **Request** + + If no ``pose_prior_ids`` are provided, all pose priors belonging to the requested ``template_ids`` are deleted. + The ``template_ids`` list must not be empty. + + .. include:: _gen/nodes/services/rc_cadmatch_delete_pose_priors_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_cadmatch_delete_pose_priors_response.txt + +Return codes +------------ + +.. index:: + pair: CADMatch; return codes + +Each service response contains a ``return_code``, +which consists of a ``value`` plus an optional ``message``. +A successful service returns with a ``return_code`` value of ``0``. +Negative ``return_code`` values indicate that the service failed. +Positive ``return_code`` values indicate that the service succeeded with additional information. +The smaller value is selected in case a service has multiple ``return_code`` values, +but all messages are appended in the ``return_code`` message. + +The following table contains a list of common codes: + +.. tabularcolumns:: |c|L| +.. _tab-cadmatch-return-codes: +.. csv-table:: Return codes of the CADMatch services + :header: Code, Description + + "0", "Success" + "-1", "An invalid argument was provided." + "-2", "An internal error occurred." + "-3", "An internal timeout occurred." + "-4", "Data acquisition took longer than allowed." + "-8", "Not applicable, stereo quality must be at least Medium." + "-9", "No valid license for the module." + "-10", "New element could not be added as the maximum storage capacity of load carriers or regions of interest has been exceeded." + "-11", "Sensor not connected, not supported or not ready." + "10", "The maximum storage capacity of load carriers or regions of interest has been reached." + "11", "Existing data was overwritten." + "100", "The requested load carrier was not detected in the scene." + "101", "None of the detected grasps is reachable." + "102", "The detected load carrier is empty." + "103", "All detected grasps are in collision." + "106", "The list of returned grasps has been trimmed to the 100 best grasps." + "110", "Hints for setting up the application, e.g. reducing the distance from the camera, setting a region of interest." + "114", "No gripper was found for collision checking." + "115", "Collision checking during retraction was skipped, e.g. because no load carrier or no pre-grasp offset were given." + "151", "The object template has a continuous symmetry." + "152", "The objects are outside the given region of interest, outside the load carrier or outside the image." + "153", "No edges could be detected in the camera image. Check the Edge Sensitivity." + "999", "Additional hints for application development" + +.. _sect-cadmatch-template-upload: + +Template API +------------ + +.. index:: + single: CADMatch; template api + single: CADMatch; template download + single: CADMatch; template upload + single: CADMatch; template deletion + +For template upload, download, listing and removal, special |rest-api| endpoints are provided. +Templates can also be uploaded, downloaded and removed via the |webgui|. +The templates include the grasp points and pose priors, if grasp points or pose priors have been configured. +Up to 50 templates can be stored persistently on the |rc_xxx|. + +.. only:: rc_cube + + .. include:: _gen/swagger/rc_cube/templates_rc_cadmatch.txt + + diff --git a/v24.04/en/_raw_sources/camera_calibration.rst.txt b/v24.04/en/_raw_sources/camera_calibration.rst.txt new file mode 100644 index 0000000..2d7530c --- /dev/null +++ b/v24.04/en/_raw_sources/camera_calibration.rst.txt @@ -0,0 +1,349 @@ + +.. include:: global_rst.glb + +.. _sect-camera-calibration: + +Camera calibration +================== + +.. index:: + pair: camera; calibration + +.. only:: rc_visard or rc_visard_ng + + The camera calibration module is a base module which is available on every |rc_xxx|. + +.. only:: rc_cube + + The camera calibration module is a base module which is available on every |rc_cube|, but + cannot be used in camera pipelines of type ``rc_visard``. + +.. only:: rc_cube + + .. note:: + + This module is pipeline specific. Changes to its settings or parameters only affect + the respective camera pipeline and have no influence on other pipelines running on the |rc_cube|. + +To use the camera as measuring instrument, camera parameters such as focal length, +lens distortion, and the relationship of the cameras to each other must be exactly known. The +parameters are determined by calibration and used for image rectification +(see :ref:`sect-stereo-camera-rectification`:latex:`, Section \ref{stereo_camera:sect-stereo-camera-rectification}`), +which is the basis for all other image processing modules. + +.. only:: rc_visard or rc_visard_ng + + The |rc_xxx| is calibrated at + production time. Nevertheless, checking calibration and recalibration might be necessary + if the |rc_xxx| was exposed to strong mechanical impact. + +The camera calibration module is responsible for checking calibration and calibrating. + +.. only:: rc_visard or rc_visard_ng + + Self-calibration + ---------------- + + .. index:: + single: self-calibration + + The camera calibration module automatically runs in self-calibration mode at a low + frequency in the background. In this mode, the |rc_xxx| observes the alignment of image + rows of both rectified images. A mechanical impact, such as one caused by dropping the |rc_xxx|, + might result in a misalignment. If a significant misalignment is detected, then it is + automatically corrected. After each reboot and after each correction, the current self-calibration + offset is reported in the camera module's log file + (see :ref:`sect-downloading-log-files`:latex:`, Section \ref{maintenance:sect-downloading-log-files}`) + as: + + *"rc_stereocalib: Current self-calibration offset is 0.00, update counter is 0"* + + The update counter is incremented after each automatic correction. It is reset to 0 after manual + recalibration of the |rc_xxx|. + + Under normal conditions, such as the absence of mechanical impact on the |rc_xxx|, self-calibration should never + occur. Self-calibration allows the |rc_xxx| to work normally even after misalignment is detected, since it + is automatically corrected. Nevertheless, checking camera calibration manually is recommended + if the update counter is not 0. + +Calibration process +------------------- + +Manual calibration can be done through the :ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})` +:cubeonly:`in the desired pipeline` under :menuselection:`Configuration --> Camera Calibration`. +This page provides a wizard to guide the user through the calibration process. + +.. only:: rc_visard or rc_visard_ng + + .. Note:: Camera calibration is normally unnecessary for the |rc_xxx| since it is calibrated at + production time. Therefore, calibration is only required after strong mechanical impacts, + such as occur when dropping the |rc_xxx|. + +During calibration, the calibration grid must be detected in different poses. +When holding the calibration grid, make sure that all black squares +of the grid are completely visible and not occluded in both camera images. A green check mark overlays each correctly +detected square. The correct detection of the grid is only possible if all of the black +squares are detected. Some of the squares not being detected, or being detected only briefly might indicate bad +lighting conditions, or a damaged grid. Squares in overexposed parts of the calibration grid are highlighted in red. +In this case, the lighting conditions or exposure setting must be adjusted. +A thick green border around the calibration grid indicates that +it was detected correctly in both camera images. + +Calibration settings +^^^^^^^^^^^^^^^^^^^^ + +.. index:: + single: calibration grid + +The quality of camera calibration heavily depends on the quality of the calibration grid. +Calibration grids can be obtained from |company|. + +.. figure:: images/webgui_camera_calibration_1.png + :width: 100 % + :align: center + + Calibration settings + +In the first step, the calibration grid must be specified. The *Next* button proceeds to the next step. + +.. only:: rc_cube + + Adjust focus + ^^^^^^^^^^^^ + + In this step, the focus of the cameras can be adjusted. For this, the grid must be held + such that it is simultaneously visible in both cameras. After the grid is detected, the green bars at the right image borders + indicate the blur of the image. Adjust the focus of each camera so that the bar in each image + is minimal. + + .. Note:: While calibrating an |rc_viscore|, the camera exposure settings are temporarily changed + to values that allow for easier calibration. The exposure settings can still be changed and + will be reset when the calibration is done or cancelled. + + .. only:: roboception or basler or schunk + + For calibrating the Basler *blaze* sensor, the color camera should be focussed to close distance so that the calibration + grid can be detected when it almost fills the image. The camera can be refocussed to working + distance after calibration if necessary. + + Furthermore, the exposure time of the blaze Time-of-Flight camera should be reduced to a minimum. + Otherwise, the calibration grid cannot be detected due to over exposure. + + .. figure:: images/webgui_camera_calibration_2.png + :width: 100 % + :align: center + + Adjust the focus of each camera + +Verify calibration +^^^^^^^^^^^^^^^^^^ + +In the next step, the current calibration can be verified. To perform +the verification, the grid must be held such that it is simultaneously visible in both cameras. +When the grid is detected, the calibration error is automatically computed and the result is +displayed on the screen. + +.. figure:: images/webgui_camera_calibration_3.png + :width: 100 % + :align: center + + Verification of calibration + +.. Note:: To compute a meaningful calibration error, the grid should be held as close as possible + to the cameras. If the grid only covers a small section of the camera images, the calibration + error will always be less than when the grid covers the full image. For this reason, the minimal + and maximal calibration error during verification are shown in addition to the calibration error + at the current grid position. + +The typical calibration error is below 0.2 pixels. If the error is in this range, +then the calibration procedure can be skipped. If the calibration error is greater, the +calibration procedure should be performed to guarantee full sensor performance. The button +*Next* starts the procedure. + +.. Warning:: A large error during verification can be due to miscalibrated cameras, an inaccurate + calibration grid, or wrong grid width or height. In case you use a custom calibration grid, + please make sure that the grid is accurate and + the entered grid width and height are correct. Otherwise, manual calibration will actually + decalibrate the cameras! + +Calibrate +^^^^^^^^^ + +The camera's exposure time should be set appropriately before starting the calibration. +To achieve good calibration results, the images should be well-exposed and motion blur should +be avoided. Thus, the maximum auto-exposure time should be as short as possible, but still allow a good exposure. +The current exposure time is displayed below the camera images as shown +in :numref:`fig-webgui-calibration-stereo`. + +Full calibration consists of calibrating each camera individually (monocalibration) and then performing a stereo +calibration to determine the relationship between them. In most cases, +the intrinsic calibration of each camera does not get corrupted. For this reason, monocalibration is +skipped by default during a recalibration, but can be performed by clicking :guilabel:`Perform Monocalibration` +in the *Calibrate* tab. This should only be done if the result of the stereo calibration is +not satisfactory. + +.. only:: rc_cube and (roboception or basler or schunk) + + When a Basler |blaze| sensor is connected to the |rc_cube| for the first time, it is uncalibrated and needs to + be fully calibrated. In this case, monocalibration is offered automatically and cannot be skipped to ensure + a complete calibration of the sensor. After saving the calibration, it will persistently reside on the |rc_cube| + and automatically be used whenever the |blaze| sensor is connected to the |rc_cube| again, regardless of the port or pipeline. + +.. _sect-stereo-calibration: + +Stereo calibration +^^^^^^^^^^^^^^^^^^ + +.. index:: + pair: camera calibration; stereo calibration + +During stereo calibration, both cameras are calibrated to each other to find their +relative rotation and translation. + +The camera images can also be displayed mirrored to simplify the correct positioning of the calibration grid. + +First, the grid should be held as close as possible to the camera and very still. It must be fully visible +in both images and the cameras should look perpendicularly onto the grid. If the grid is +not perpendicular to the line of sight of the cameras, this will be indicated by small +green arrows pointing to the expected positions of the grid corners (see +:numref:`fig-webgui-calibration-tilted`). + +.. _fig-webgui-calibration-tilted: +.. figure:: images/webgui_camera_calibration_stereo_tilt.png + :width: 80 % + :align: center + + Arrows indicating that the grid is not perpendicular to the camera's line of sight during stereo calibration + +The grid must be kept very still for detection. If motion blur occurs, the grid will not be detected. +All grid cells that are drawn onto the image have to be covered +by the calibration grid. This is visualized by filling the covered cells in green (see +:numref:`fig-webgui-calibration-stereo`). + +.. only:: rc_visard or rc_visard_ng + + For the |rc_xxx| all cells can be covered at once by holding the grid close enough. + +.. only:: rc_cube + + Depending on the camera, the grid has to be held at different positions until all grid cells + have been covered and filled in green. + +.. _fig-webgui-calibration-stereo: +.. figure:: images/webgui_camera_calibration_4.png + :width: 100 % + :align: center + + Stereo calibration: Hold the grid as close as possible to fill all visualized cells + +.. Note:: If the check marks on the calibration grid all vanish, then either the camera does not + look perpendicularly onto the grid, or the grid is too far away from the camera. + +Once all grid cells are covered, they disappear and a single far cell is visualized. +Now, the grid should be held as far as possible from the cameras, so that the small cell +is covered. Arrows will indicate if the grid is still too close to the camera. +When the grid is successfully detected at the far pose, the cell is filled +in green and the result can be computed (see :numref:`fig-webgui-calibration-far`). + +.. _fig-webgui-calibration-far: +.. figure:: images/webgui_camera_calibration_stereo_far.png + :width: 80 % + :align: center + + Holding the grid far away during stereo calibration + +If stereo calibration yields an unsatisfactory calibration error, then calibration should be +repeated with monocalibration (see next Section :ref:`sect-monocalibration`). + + +.. _sect-monocalibration: + +Monocalibration +^^^^^^^^^^^^^^^ + +.. index:: + pair: camera calibration; monocalibration + +Monocalibration is the intrinsic calibration of each camera individually. Since the intrinsic calibration +normally does not get corrupted, the monocalibration should only be performed if the result of stereo +calibration is not satisfactory. + +Click :guilabel:`Perform Monocalibration` in the *Calibrate* tab to start monocalibration. + +For monocalibration, the grid has to be held in certain poses. The arrows from the grid +corners to the green areas indicate that all grid corners should be placed inside the +green areas. The green areas are called sensitive areas. The *Size of Sensitive Area* +slider can control their size to ease calibration. +However, please be aware that increasing their size too much may result in slightly +lower calibration accuracy. + +Holding the grid upside down is a common mistake made during calibration. Spotting this in +this case is easy because the green lines from the grid corners into the green areas will +cross each other as shown in :numref:`fig-webgui-calibration-wrong`. + +.. _fig-webgui-calibration-wrong: +.. figure:: images/webgui_camera_calibration_wrong.png + :width: 60 % + :align: center + + Wrongly holding the grid upside down leads to crossed green lines. + +.. Note:: Calibration might appear cumbersome as it involves holding the grid in certain + predefined poses. However, these poses are required to ensure an unbiased, high-quality calibration + result. + +The monocalibration process involves five poses for each camera as shown in :numref:`fig-poses-monocalibration`. + +.. _fig-poses-monocalibration: +.. figure:: images/calib-views.png + :width: 100 % + :align: center + + Poses required for monocamera calibration + +After the corners or sides of the grid are placed on top of the sensitive areas, the process +automatically shows the next pose required. When the process is finished for the left camera, +the same procedure is repeated for the right one. + +Continue with the guidelines given in the previous Section :ref:`sect-stereo-calibration`. + +Storing the calibration result +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Clicking the :guilabel:`Compute Calibration` button finishes the process and displays the final result. +The indicated result is the mean reprojection error of all calibration points. It is given in +pixels and typically has a value below 0.2. + +Pressing :guilabel:`Save Calibration` applies the calibration and saves it to the device. + +.. Note:: The given result is the minimum error left after calibration. The real error + is definitely not less than this, but could in theory be larger. This is true for every + camera-calibration algorithm and the reason why we enforce holding the grid in very specific + poses. Doing so ensures that the real calibration error cannot significantly + exceed the reported error. + +.. Warning:: If a hand-eye calibration was stored on the |rc_xxx| before camera calibration, + the hand-eye calibration values could have become invalid. Please repeat the hand-eye + calibration procedure. + +Parameters +---------- + +.. index:: + pair: camera calibration; parameters + +The module is called ``rc_stereocalib`` in the |rest-api|. + +.. Note:: The camera calibration module's available parameters and status values are + for internal use only and may change in the future without further notice. Calibration should + only be performed through the |webgui| as described above. + +Services +-------- + +.. index:: + pair: camera calibration; services + +.. Note:: The camera calibration module's available service calls are for internal + use only and may change in the future without further notice. Calibration should only be + performed through the |webgui| as described above. diff --git a/v24.04/en/_raw_sources/camera_modules.rst.txt b/v24.04/en/_raw_sources/camera_modules.rst.txt new file mode 100644 index 0000000..acfaee0 --- /dev/null +++ b/v24.04/en/_raw_sources/camera_modules.rst.txt @@ -0,0 +1,62 @@ +.. include:: global_rst.glb + +.. _sect-3d-camera-modules: + +3D camera modules +================= + +The |rc_xxx|'s 3D camera software consists of the following modules: + +- :doc:`stereo_camera` (``rc_camera``:latex:`, Section \ref{stereo_camera:sect-stereo-camera}`) + acquires image pairs and performs planar rectification for using the + camera as a measurement device. + Images are provided both for further internal processing by other modules + and for external use as :ref:`GenICam image streams `. + +.. only:: rc_cube + + - :doc:`stereo_matching` (``rc_stereomatching``:latex:`, Section \ref{stereo_matching:sect-stereo-matching}`) + uses the rectified stereo image pairs of the connected stereo camera, e.g. the |rc_visard|, to compute 3D depth + information such as disparity, error, and confidence images. + These are provided as GenICam streams, too. + +.. only:: rc_visard or rc_visard_ng + + - :doc:`stereo_matching` (``rc_stereomatching``:latex:`, Section \ref{stereo_matching:sect-stereo-matching}`) + uses the rectified stereo image pairs to compute 3D depth + information such as disparity, error, and confidence images. + These are provided as GenICam streams, too. + +.. only:: rc_cube and (roboception or schunk or basler) + + - :doc:`blaze` (``rc_blaze``:latex:`, Section \ref{blaze:sect-blaze}`) + provides 3D depth information such as disparity, error, and confidence images of the connected + Basler blaze RGB-D camera. + These are provided as GenICam streams, too. + +.. only:: rc_cube + + These modules are pipeline specific, which means that they run inside each + camera pipeline. Changes to their settings or parameters + only affect the corresponding pipeline and have no influence on the other + camera pipelines running on the |rc_cube|. + +.. only:: rc_cube and (roboception or schunk or basler) + + .. note:: + The Stereo Matching module is only available in camera pipelines of type ``rc_visard`` or ``rc_viscore``. + The Blaze module is only available in camera pipelines of type ``blaze``. + +The :doc:`stereo_camera` and the :doc:`stereo_matching` modules, which +acquire image pairs and compute 3D depth information such as disparity, +error, and confidence images, are also accessible via the |rc_xxx|'s +:doc:`GigE Vision/GenICam interface`. + + +.. toctree-filt:: + :maxdepth: 2 + :hidden: + + stereo_camera + stereo_matching + :matrixvision_visard_exclude:blaze diff --git a/v24.04/en/_raw_sources/collisioncheck.rst.txt b/v24.04/en/_raw_sources/collisioncheck.rst.txt new file mode 100644 index 0000000..881660b --- /dev/null +++ b/v24.04/en/_raw_sources/collisioncheck.rst.txt @@ -0,0 +1,561 @@ +.. include:: global_rst.glb + +.. _sect-collision: + +CollisionCheck +================ + +.. index:: ! CollisionCheck + single: collision check + +Introduction +------------ + +The CollisionCheck module is an optional on-board module of the |rcxxx| and is licensed with +any of the modules |pick_modules| or |match_modules|. +Otherwise it requires a separate CollisionCheck :ref:`license` +:latex:`(Section \ref{maintenance:sect-updating-license})` to be purchased. + +The module provides an easy way to check if a gripper is in collision with a load carrier, +:cubeonly:`the point cloud (ony in combination with CADMatch),` +or other detected objects (only in combination with |match_modules|). It is integrated +with the |pick_modules| and |match_modules| modules, but can be used as standalone product. +The models of the grippers for collision checking have to be +defined in the :doc:`gripper_db`:latex:`\:(Section \ref{gripper_db:sect-gripper-db})` module. + +.. Warning:: + + Collisions are checked only between the load carrier and the gripper, not the robot itself, the flange, other objects or + the item located in the robot gripper. Only in combination with |match_modules|, + and only in case the selected template contains a collision + geometry and ``check_collisions_with_matches`` is enabled in the respective detection module, + also collisions between the gripper and other *detected* objects will be checked. + Collisions with objects that cannot be detected will not be checked. + Only in combination with |match_modules| and + only if ``check_collisions_with_point_cloud`` is enabled in the respective detection module, + collisions between the gripper and a watertight version of the point cloud will be checked. + +.. only:: rc_cube + + .. note:: + + This module is pipeline specific. Changes to its settings or parameters only affect + the respective camera pipeline and have no influence on other pipelines running on the |rc_cube|. + +.. only:: rc_cube + + .. tabularcolumns:: |l|L| + .. _tab-collisioncheck-spec: + .. csv-table:: Specifications of the CollisionCheck module + + "Collision checking with", "detected load carrier, detected objects (only |match_modules|), baseplane (only :doc:`silhouettematch`:latex:`, Section \ref{silhouettematch:sect-silhouettematch}`), point cloud (only :doc:`cadmatch`:latex:`, Section \ref{cadmatch:sect-cadmatch}`)" + "Collision checking available in", "|pick_modules|, |match_modules|" + +.. only:: rc_visard or rc_visard_ng + + .. tabularcolumns:: |l|L| + .. _tab-collisioncheck-spec: + .. csv-table:: Specifications of the CollisionCheck module + + "Collision checking with", "detected load carrier, detected objects (only |match_modules|), baseplane (only :doc:`silhouettematch`:latex:`, Section \ref{silhouettematch:sect-silhouettematch}`)" + "Collision checking available in", "|pick_modules|, |match_modules|" + +Collision checking +------------------ + +.. _sect-collision-check-pre-grasp-offset: + +Stand-alone collision checking +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The ``check_collisions`` service call triggers collision checking between the chosen gripper and the provided load carriers +for each of the provided grasps. Checking collisions with other objects :cubeonly:`or the point cloud` +is not possible with the stand-alone ``check_collisions`` service. +The CollisionCheck module checks if the chosen gripper is +in collision with at least one of the load carriers, when the TCP of the gripper is positioned in the +grasp position. It is possible to check the collision with multiple load carriers simultaneously. The grasps +which are in collision with any of the defined load carriers will be returned as colliding. + +The ``pre_grasp_offset`` can be used for additional collision checking. +The pre-grasp offset :math:`P_{off}` is the offset between the grasp point :math:`P_{grasp}` and the pre-grasp position :math:`P_{pre}` +in the grasp's coordinate frame (see :numref:`fig-collision-check-pre-grasp-offset`). +If the pre-grasp offset is defined, the grasp will be detected as colliding +if the gripper is in collision at any point +during motion from the pre-grasp position to the grasp position (assuming +a linear movement). + +.. _fig-collision-check-pre-grasp-offset: +.. figure:: images/pre_grasp_offset.* + :width: 300 px + :align: center + + Illustration of the pre-grasp offset parameter for collision checking. In this case, the pre-grasp position as + well as the grasp position are collision free. However, the trajectory between these poses would have collisions. + Thus, this grasp pose would be marked as colliding. + +.. _sect-collision-check-other-modules: + +Collision checking within other modules +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Collision checking is integrated in the following modules' services: + +.. only:: rc_visard or rc_visard_ng + + - :ref:`sect-itempick`:latex:`\:(Section \ref{itempick:sect-itempick})`: ``compute_grasps`` + (see :ref:`compute_grasps for ItemPick`:latex:`, Section \ref{itempick:expl-itempick-srv-compute-grasps}` and + :ref:`compute_grasps for BoxPick`:latex:`, Section \ref{itempick:expl-itempick-srv-compute-grasps-boxpick}`) + + - :ref:`sect-silhouettematch`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch})`: ``detect_object`` + (see :ref:`expl-silhouettematch-srv-detect-objects`:latex:`, Section \ref{silhouettematch:expl-silhouettematch-srv-detect-objects}`) + +.. only:: rc_cube + + - :ref:`sect-itempick`:latex:`\:(Section \ref{itempick:sect-itempick})`: ``compute_grasps`` + (see :ref:`compute_grasps for ItemPick`:latex:`, Section \ref{itempick:expl-itempick-srv-compute-grasps}` and + :ref:`compute_grasps for BoxPick`:latex:`, Section \ref{itempick:expl-itempick-srv-compute-grasps-boxpick}`) + + - :ref:`sect-silhouettematch`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch})`: ``detect_object`` + (see :ref:`expl-silhouettematch-srv-detect-objects`:latex:`, Section \ref{silhouettematch:expl-silhouettematch-srv-detect-objects}`) + + - :ref:`sect-cadmatch`:latex:`\:(Section \ref{cadmatch:sect-cadmatch})`: ``detect_object`` + (see :ref:`expl-cadmatch-srv-detect-object`:latex:`, Section \ref{cadmatch:expl-cadmatch-srv-detect-object}`) + +Each of these services can take a ``collision_detection`` argument consisting of the ``gripper_id`` of the default gripper +and the ``pre_grasp_offset`` as described in the previous section +:ref:`sect-collision-check-pre-grasp-offset`:latex:`\:(Section \ref{collisioncheck:sect-collision-check-pre-grasp-offset})`. +The default gripper given by the ``gripper_id`` argument is only used for grasp points which do not have an individual gripper ID assigned. +When the ``collision_detection`` argument is given, these services only return the +grasps at which the gripper is not in collision or which could not be checked for collisions. +When a load carrier ID is provided to these services, +collision checking will always be performed between the gripper and the load carrier. +Additional collision check features can be enabled depending on the module. + +Only for |match_modules|, and only in case the selected template contains a collision +geometry and ``check_collisions_with_matches`` is enabled in the respective detection module, +grasp points at which the gripper would be in collision with other *detected* objects are also rejected. The object +on which the grasp point to be checked is located, is excluded from the collision check. + +When a gripper is defined for a grasp point in the object template for |match_modules|, then this gripper will be used +for collision checking at that specific grasp point instead of the default gripper defined in the ``collision_detection`` argument +of the ``detect_object`` service (see :ref:`sect-silhouettematch-grasps`:latex:`, Section \ref{silhouettematch:sect-silhouettematch-grasps}`). +The grasps returned by the ``detect_object`` service contain a flag ``collision_checked``, indicating whether the grasp was checked for collisions, +and the field ``gripper_id``. If ``collision_checked`` is true, the returned ``gripper_id`` contains the ID of the gripper that was used for the collision check. +That is the ID of the gripper defined for that specific grasp, or, if empty, the gripper that was given in the +``collision_detection`` argument of the request. If ``collision_checked`` is false, the returned ``gripper_id`` +is the gripper ID that was defined for that grasp. + +In :doc:`silhouettematch`:latex:`, Section \ref{silhouettematch:sect-silhouettematch}`, collisions between +the gripper and the base plane can be checked, if ``check_collisions_with_base_plane`` is enabled in SilhouetteMatch. + +Collisions between the gripper and a watertight version of the point cloud can be checked in |match_modules| +if ``check_collisions_with_point_cloud`` is enabled in the respective module. + +.. Warning:: + + Collisions are checked only between the load carrier and the gripper, not the robot itself, the flange or other objects. + Only in combination with |match_modules|, + and only in case the selected template contains a collision + geometry and ``check_collisions_with_matches`` is enabled in the respective detection module, + also collisions between the gripper and other *detected* objects are checked. + Collisions with objects that cannot be detected will not be checked. + Only in combination with |match_modules|, and + only if ``check_collisions_with_point_cloud`` is enabled, collisions between the gripper and a watertight version of the point cloud are checked. + + .. only:: rc_cube + + Only in combination with :doc:`cadmatch`:latex:`, Section \ref{cadmatch:sect-cadmatch}` and + only if ``check_collisions_during_retraction`` is enabled + in CADMatch and a load carrier and a pre-grasp offset are given, collisions between the object in the + gripper and the walls of the given load carrier are checked along the linear + trajectory from the grasp point to the pre-grasp pose. + +The collision-check results are affected by run-time parameters, which are listed +and explained further below. + +Parameters +---------- + +The CollisionCheck module is called ``rc_collision_check`` +in the |rest-api| and is represented in the +:ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})` +:cubeonly:`in the desired pipeline` under :menuselection:`Configuration --> CollisionCheck`. +The user can explore and configure the ``rc_collision_check`` +module's run-time parameters, e.g. for development and testing, using the |webgui| or the +:doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`. + +.. _sect-collisioncheck-parameters: + +Parameter overview +^^^^^^^^^^^^^^^^^^ + +.. include:: _gen/nodes/params/rc_collision_check.txt + + +Description of run-time parameters +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Each run-time parameter is represented by a row in the |webgui|'s +*Settings* section :cubeonly:`in the desired pipeline` under +:menuselection:`Configuration --> CollisionCheck`. +The name in the |webgui| is given in brackets behind the parameter name: + +.. _expl-collisioncheck-collision-dist: + +``collision_dist`` (*Collision Distance*) +''''''''''''''''''''''''''''''''''''''''' + Minimal distance in meters between any part of the gripper and the load carrier and/or the base plane (only SilhouetteMatch) + for a grasp to be considered collision free. + + .. note:: + The collision distance is not applied when checking collisions between :cubeonly:`the + gripper and the point cloud, or` the gripper and other detected objects. It is not applied + when checking if the flange is inside the load carrier (``check_flange``), either. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_collision_check/parameters?collision_dist= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_collision_check/parameters?collision_dist= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_collision_check/parameters?collision_dist= + +.. _expl-collisioncheck-check-flange: + +``check_flange`` (*Check Flange*) +''''''''''''''''''''''''''''''''' + Performs an additional safety check as described in + :ref:`sect-collisioncheck-flange`:latex:`\:(Section \ref{gripper_db:sect-collisioncheck-flange})`. + If this parameter is set, all grasps in which any part of the robot's flange is inside the load carrier are marked as colliding. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_collision_check/parameters?check_flange= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_collision_check/parameters?check_flange= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_collision_check/parameters?check_flange= + +.. _expl-collisioncheck-check-bottom: + +``check_bottom`` (*Check Bottom*) +''''''''''''''''''''''''''''''''' + When this check is enabled the collisions will be checked not only with the side walls of the load carrier but also with its bottom. + It might be necessary to disable this check if the TCP is inside the collision geometry (e.g. is defined inside a suction cup). + + .. only:: rc_cube + + The load carrier bottom will always be excluded for the collision check between the object in the gripper and the load carrier + during retraction in combination with :doc:`cadmatch`:latex:`, Section \ref{cadmatch:sect-cadmatch}` when + ``check_collisions_during_retraction`` is enabled. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_collision_check/parameters?check_bottom= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_collision_check/parameters?check_bottom= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_collision_check/parameters?check_bottom= + +.. _sect-collisioncheck-status-values: + +Status values +------------- + +The ``rc_collision_check`` module reports the following status values: + +.. tabularcolumns:: |l|L| +.. csv-table:: The ``rc_collision_check`` module status values + :header: Name, Description + + "``last_evaluated_grasps``","Number of evaluated grasps" + "``last_collision_free_grasps``","Number of collision-free grasps" + "``collision_check_time``","Collision checking runtime" + +.. _sect-collisioncheck-services: + +Services +-------- + +The user can explore and call the ``rc_collision_check`` module's services, +e.g. for development and testing, using +:doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` or +the |rc_xxx| +:ref:`sect-web-gui`:latex:`\:(Section \ref{webgui:sect-web-gui})`. + +The CollisionCheck module offers the following services. + +.. _expl-collisioncheck-srv-reset-params: + +``reset_defaults`` +^^^^^^^^^^^^^^^^^^ + + Resets all parameters of the module to its default values, + as listed in above table. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_collision_check/services/reset_defaults + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_collision_check/services/reset_defaults + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_collision_check/services/reset_defaults + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_collision_check_reset_defaults_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_collision_check_reset_defaults_response.txt + + +.. _expl-collisioncheck-srv-check-collision: + +``check_collisions`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Triggers a collision check between a gripper and a load carrier. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_collision_check/services/check_collisions + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_collision_check/services/check_collisions + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_collision_check/services/check_collisions + + .. tabs:: + + .. tab:: **Request** + + Required arguments: + + ``grasps``: list of grasps that should be checked. + + ``load_carriers``: list of load carriers against which the collision should be checked. + The fields of the load carrier definition are described in + :ref:`sect-loadcarrier-detect-lc`:latex:`\:(Section \ref{loadcarrier:sect-loadcarrier-detect-lc})`. + The position frame of the grasps and load carriers has to be the same. + + ``gripper_id``: the id of the gripper that is used to check the collisions. The gripper has to be configured beforehand. + + Optional arguments: + + ``pre_grasp_offset``: the offset in meters from the grasp position to the pre-grasp position in the grasp frame. + If this argument is set, the collisions will not only be checked in the grasp point, but also on the path from the + pre-grasp position to the grasp position (assuming a linear movement). + + .. include:: _gen/nodes/services/rc_collision_check_check_collisions_request.txt + + .. tab:: **Response** + + ``colliding_grasps``: list of grasps in collision with one or more load carriers. + + ``collision_free_grasps``: list of collision-free grasps. + + ``return_code``: holds possible warnings or error codes and messages. + + .. include:: _gen/nodes/services/rc_collision_check_check_collisions_response.txt + + +.. _expl-collisioncheck-srv-set-grippers: + +``set_gripper`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Persistently stores a gripper on the |rc_xxx|. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-gripper-db-srv-set-gripper`:latex:`\:(Section \ref{gripper_db:expl-gripper-db-srv-set-gripper})` + in ``rc_gripper_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_collision_check/services/set_gripper + + The definitions of the request and response are the same as described in + :ref:`expl-gripper-db-srv-set-gripper`:latex:`\:(Section \ref{gripper_db:expl-gripper-db-srv-set-gripper})` + in ``rc_gripper_db``. + +.. _expl-collisioncheck-srv-get-grippers: + +``get_grippers`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns the configured grippers with the requested ``gripper_ids``. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-gripper-db-srv-get-grippers`:latex:`\:(Section \ref{gripper_db:expl-gripper-db-srv-get-grippers})` + in ``rc_gripper_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_collision_check/services/get_grippers + + The definitions of the request and response are the same as described in + :ref:`expl-gripper-db-srv-get-grippers`:latex:`\:(Section \ref{gripper_db:expl-gripper-db-srv-get-grippers})` + in ``rc_gripper_db``. + +.. _expl-collisioncheck-srv-delete-grippers: + +``delete_grippers`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Deletes the configured grippers with the requested ``gripper_ids``. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-gripper-db-srv-delete-grippers`:latex:`\:(Section \ref{gripper_db:expl-gripper-db-srv-delete-grippers})` + in ``rc_gripper_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_collision_check/services/delete_grippers + + The definitions of the request and response are the same as described in + :ref:`expl-gripper-db-srv-delete-grippers`:latex:`\:(Section \ref{gripper_db:expl-gripper-db-srv-delete-grippers})` + in ``rc_gripper_db``. + + +.. _sect-collisioncheck-return-codes: + +Return codes +------------ + +.. index:: + pair: CollisionCheck; return codes + +Each service response contains a ``return_code``, +which consists of a ``value`` plus an optional ``message``. +A successful service returns with a ``return_code`` value of ``0``. +Negative ``return_code`` values indicate that the service failed. +Positive ``return_code`` values indicate that the service succeeded with additional information. +The smaller value is selected in case a service has multiple ``return_code`` values, +but all messages are appended in the ``return_code`` message. + +The following table contains a list of common codes: + +.. tabularcolumns:: |c|L| +.. _tab-collisioncheck-return-codes: +.. csv-table:: Return codes of the CollisionCheck services + :header: Code, Description + + "0", "Success" + "-1", "An invalid argument was provided" + "-7", "Data could not be read or written to persistent storage" + "-9", "No valid license for the module" + "-10", "New gripper could not be added as the maximum storage capacity of grippers has been exceeded" + "10", "The maximum storage capacity of grippers has been reached" + "11", "Existing gripper was overwritten" diff --git a/v24.04/en/_raw_sources/concept_stereo.rst.txt b/v24.04/en/_raw_sources/concept_stereo.rst.txt new file mode 100644 index 0000000..9722af1 --- /dev/null +++ b/v24.04/en/_raw_sources/concept_stereo.rst.txt @@ -0,0 +1,55 @@ +.. include:: global_rst.glb + +.. _sect-concepts-stereo: + +Stereo vision +------------- + +.. index:: + single: stereo matching + single: SGM + single: disparity + single: disparity image + +In *stereo vision*, 3D information about a scene can be extracted by comparing two images taken from different +viewpoints. The main idea behind using a camera pair for measuring depth is the fact that object points appear at different +positions in the two camera images depending on their distance from the camera pair. Very distant object points +appear at approximately the same position in both images, whereas very close object points occupy different positions +in the left and right camera image. The object points' displacement in the two images is called *disparity*. The +larger the disparity, the closer the object is to the camera. The principle is illustrated in :numref:`fig-stereo_vision`. + +.. _fig-stereo_vision: +.. figure:: images/stereo_sketch_v2.* + :width: 70 % + :align: center + + Sketch of the stereo-vision principle: The more distant object (black) exhibits a smaller disparity :math:`d_2` + than that of the close object (gray), :math:`d_1`. + +Stereo vision is a form of passive sensing, meaning that it emits neither light nor other signals to measure distances, but +uses only light that the environment emits or reflects. Thus, the |company| products utilizing this sensing principle +can work indoors and outdoors and multiple devices can work together without interferences. + +To compute the 3D information, the +stereo matching algorithm must be able to find corresponding object points in the left and right camera images. +For this, the algorithm requires texture, meaning changes in image intensity values due to +patterns or the objects' surface structure, in the images. Stereo matching is not possible for completely untextured regions, +such as a flat white wall without any visible surface structure. The stereo matching method used +by the |rc_xxx| is |sgm|, which provides the best trade-off between runtime and accuracy, even for fine structures. + +The following software modules are required to compute 3D information: + +- :ref:`sect-stereo-camera`: This module is responsible for capturing synchronized image pairs and transforming them + into images approaching those taken by an ideal camera (rectification). +- :ref:`sect-stereo-matching`: This module computes disparities for the rectified stereo image pair + using |sgm-short|\ :latex:`\:(Section \ref{stereo_matching:sect-stereo-matching})`. + +.. only:: rc_visard or rc_visard_ng + + For stereo matching, the position and orientation of the left and right cameras relative to each other has to be known with + very high accuracy. This is achieved by calibration. The |rc_xxx|'s cameras are pre-calibrated during production. + However, if the |rc_xxx| has been decalibrated, during transport for example, then the user has + to recalibrate the stereo camera: + + - :ref:`sect-camera-calibration`: This module enables the user to recalibrate the |rc_xxx|'s stereo camera\ :latex:`\:(Section \ref{camera_calibration:sect-camera-calibration})`. + diff --git a/v24.04/en/_raw_sources/concepts.rst.txt b/v24.04/en/_raw_sources/concepts.rst.txt new file mode 100644 index 0000000..ed7c75c --- /dev/null +++ b/v24.04/en/_raw_sources/concepts.rst.txt @@ -0,0 +1,30 @@ +.. include:: global_rst.glb + +.. _sect-concepts: + +Measurement principles +====================== + +.. only:: rc_visard or rc_visard_ng + + The |rc_xxx| is a self-registering 3D camera. It provides rectified camera, + disparity, confidence, and error images, which enable the viewed scene's depth values along + with their uncertainties to be computed. Furthermore, the motion of visual features in the + images is combined with acceleration and turn-rate measurements at a high rate, which + enables the sensor to provide real-time estimates of its current pose, velocity, and acceleration. + +.. only:: rc_cube + + The |rc_xxx| is a high-performance 3D-image-processing device that is used + in combination one or more 3D cameras such as |company|'s 3D camera |rc_visard|. + Together, they provide rectified camera, + disparity, confidence, and error images, which allow the viewed scene's depth values along + with their uncertainties to be computed. + +In the following, the underlying measurement principles are explained in more detail. + +.. toctree-filt:: + :maxdepth: 2 + + concept_stereo + :rc_cube_exclude:concept_dynamics diff --git a/v24.04/en/_raw_sources/configuration_modules.rst.txt b/v24.04/en/_raw_sources/configuration_modules.rst.txt new file mode 100644 index 0000000..6c1cce0 --- /dev/null +++ b/v24.04/en/_raw_sources/configuration_modules.rst.txt @@ -0,0 +1,44 @@ +.. include:: global_rst.glb + +.. _sect-configuration-modules: + +Configuration modules +===================== + +The |rc_xxx| provides several configuration modules which enable the user to configure +the |rc_xxx| for specific applications. + +The configuration modules are: + +- :doc:`handeye_calibration` (``rc_hand_eye_calibration``:latex:`, Section \ref{handeye_calibration:sect-handeye-calibration}`) + enables the user to calibrate the camera with respect to a robot, + either via the |webgui| or the |restapi|. + +- :doc:`collisioncheck` (``rc_collision_check``:latex:`, Section \ref{collisioncheck:sect-collision}`) + provides an easy way to check if a gripper is in collision. + +- :doc:`camera_calibration` (``rc_stereocalib``:latex:`, Section \ref{camera_calibration:sect-camera-calibration}`) + enables the user to check and perform camera calibration via the + :ref:`WEB GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})`. + +- :doc:`iocontrol` (``rc_iocontrol``:latex:`, Section \ref{iocontrol:sect-iocontrol}`) + provides control over the sensor's general purpose inputs and outputs with special modes + for controlling an external random dot projector. + + +.. only:: rc_cube + + These modules are pipeline specific, which means that they run inside each + camera pipeline. Changes to their settings or parameters + only affect the corresponding pipeline and have no influence on the other + camera pipelines running on the |rc_cube|. + +.. toctree-filt:: + :maxdepth: 2 + :hidden: + + handeye_calibration + collisioncheck + camera_calibration + iocontrol + diff --git a/v24.04/en/_raw_sources/contact.rst.txt b/v24.04/en/_raw_sources/contact.rst.txt new file mode 100644 index 0000000..ced614e --- /dev/null +++ b/v24.04/en/_raw_sources/contact.rst.txt @@ -0,0 +1,116 @@ +.. include:: global_rst.glb + +.. _sect-contact: + +Contact +======= + +Support +^^^^^^^ + +.. only:: roboception + + For support issues, please see http://www.roboception.com/support or contact support@roboception.de. + +.. only:: matrixvision + + For support issues, please see https://www.balluff.com. + +.. only:: schunk + + For support issues, please contact service.greifsysteme@de.schunk.com, or call +49 7133-103-2333. + +.. only:: basler + + For support issues, please see https://www.baslerweb.com/en/sales-support/support-contact/ or contact + + | **Technical Support Team** + | + | Europe, Middle East, Africa + | +49 4102 463 515 + | support.europe@baslerweb.com + | + | The Americas + | +1 610 280 0171 + | support.usa@baslerweb.com + | + | Asia-Pacific + | +65 6367 1355 + | support.asia@baslerweb.com + | + +Downloads +^^^^^^^^^ + +.. only:: roboception or schunk or matrixvision + + Software SDKs, etc. can be downloaded from http://www.roboception.com/download. + +.. only:: basler + + Software SDKs, etc. can be downloaded from https://www.baslerweb.com/3d-software. + +Address +^^^^^^^ + +.. only:: roboception + + | Roboception GmbH + | Kaflerstrasse 2 + | 81241 Munich + | Germany + | + | Web: http://www.roboception.com + | Email: info@roboception.de + | Phone: +49 89 889 50 79-0 + | + +.. only:: matrixvision + + | Balluff GmbH + | Schurwaldstrasse 9 + | D-73765 Neuhausen a.d.F. + | Germany + | + | Web: https://www.balluff.com + | Email: balluff@balluff.de + | Phone: +49 7158 173-0 + | + +.. only:: schunk + + | **Manufacturer:** + | Roboception GmbH + | Kaflerstrasse 2 + | 81241 Munich + | Germany + | + | Web: http://www.roboception.com + | Email: info@roboception.de + | Phone: +49 89 889 50 79-0 + | + | + | **Distributor:** + | SCHUNK GmbH & Co. KG + | Spann- und Greiftechnik + | Bahnhofstr. 106 - 134 + | D-74348 Lauffen/Neckar + | Germany + | + | Web: http://www.schunk.com + | Email: info@de.schunk.com + | Phone: +49-7133-103-0 + | + +.. only:: basler + + | Basler AG + | An der Strusbek 60-62 + | 22926 Ahrensburg + | Germany + | + | Web: http://www.baslerweb.com + | Email: info@baslerweb.com + | Phone: +49 4102 463 0 + | + diff --git a/v24.04/en/_raw_sources/database_modules.rst.txt b/v24.04/en/_raw_sources/database_modules.rst.txt new file mode 100644 index 0000000..264ac6a --- /dev/null +++ b/v24.04/en/_raw_sources/database_modules.rst.txt @@ -0,0 +1,36 @@ +.. include:: global_rst.glb + +.. _sect-database-modules: + +Database modules +================ + +The |rc_xxx| provides several database modules which enable the user to configure +global data which is used in many detection modules, such as load carriers and regions of interest. +Via the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` the database modules are +only available in API version 2. + +The database modules are: + +- :doc:`loadcarrier_db` (``rc_load_carrier_db``:latex:`, Section \ref{loadcarrier_db:sect-loadcarrier-db}`) + allows setting, retrieving and deleting load carriers. + +- :doc:`roi` (``rc_roi_db``:latex:`\:, Section \ref{roi:sect-roi})` + allows setting, retrieving and deleting 2D and 3D regions of interest. + +- :doc:`gripper_db` (``rc_gripper_db``:latex:`, Section \ref{gripper_db:sect-gripper-db}`) + allows setting, retrieving and deleting grippers for collision checking. + +.. only:: rc_cube + + These modules are global on the |rc_cube|, which means that they run outside the camera pipelines. + Changes to their settings or parameters affect all pipelines running on the |rc_cube|. + +.. toctree-filt:: + :maxdepth: 2 + :hidden: + + loadcarrier_db + roi + gripper_db + diff --git a/v24.04/en/_raw_sources/detection_modules.rst.txt b/v24.04/en/_raw_sources/detection_modules.rst.txt new file mode 100644 index 0000000..6337d12 --- /dev/null +++ b/v24.04/en/_raw_sources/detection_modules.rst.txt @@ -0,0 +1,47 @@ +.. include:: global_rst.glb + +.. _sect-detection-modules: + +Detection modules +================= + +The |rc_xxx| offers software modules for different detection applications: + +- :doc:`loadcarrier` (``rc_load_carrier``:latex:`, Section \ref{loadcarrier:sect-loadcarrier}`) + allows detecting load carriers and their filling levels. + +- :doc:`tagdetect` (``rc_april_tag_detect`` and ``rc_qr_code_detect``:latex:`, Section \ref{tagdetect:sect-tag-detection}`) + allows the detection of AprilTags and QR codes, as well as the estimation of their poses. + +- :doc:`itempick` (``rc_itempick`` and ``rc_boxpick``:latex:`, Section \ref{itempick:sect-itempick}`) + provides an out-of-the-box perception solution for robotic pick-and-place + applications of unknown objects or boxes. + +- :doc:`silhouettematch` (``rc_silhouettematch``:latex:`, Section \ref{silhouettematch:sect-silhouettematch}`) + provides an object detection solution for objects placed on a plane or stacked planar objects. + +.. only:: rc_cube + + - :doc:`cadmatch` (``rc_cadmatch``:latex:`, Section \ref{cadmatch:sect-cadmatch}`) + provides an object detection solution for 3D objects. + +.. only:: rc_cube + + These modules are pipeline specific, which means that they run inside each + camera pipeline. Changes to their settings or parameters + only affect the corresponding pipeline and have no influence on the other + camera pipelines running on the |rc_cube|. + +These modules are optional and can be activated by +purchasing a separate +:ref:`license`:latex:`\:(Section \ref{maintenance:sect-updating-license})`. + +.. toctree-filt:: + :maxdepth: 2 + :hidden: + + loadcarrier + tagdetect + itempick + silhouettematch + :rc_cube_only:cadmatch diff --git a/v24.04/en/_raw_sources/disposal.rst.txt b/v24.04/en/_raw_sources/disposal.rst.txt new file mode 100644 index 0000000..37dbb76 --- /dev/null +++ b/v24.04/en/_raw_sources/disposal.rst.txt @@ -0,0 +1,65 @@ +.. include:: global_rst.glb + +.. _sect-disposal: + +Information on disposal +======================= + +.. image:: images/weee-mark_small.* + :width: 200 + +#. **Disposal of Waste Electrical & Electronic Equipment** + + This symbol on the product(s) and / or accompanying documents means that used electrical and electronic products + should not be mixed with general household waste. For proper treatment, recovery and recycling, please contact + your supplier or the manufacturer. Disposing of this product correctly will help save valuable resources and + prevent any potential negative effects on human health and the environment, which could otherwise arise from + inappropriate waste handling. + + +#. **Removal of batteries** + + If the products contain batteries and accumulators that can be removed from the product without destruction, + these must be removed before disposal and disposed of separately as batteries. + + The following batteries or accumulators are contained in the rc_visard: None + + +#. **Options for returning old equipment** + + Owners of old devices can return them to the manufacturer to ensure proper disposal. + + Please :ref:`contact support`:latex:`\:(Section \ref{contact:sect-contact})` about returning the device for disposal. + + +#. **Data protection** + + End users of Electrical & Electronic Equipment are responsible for deleting personal data on the waste equipment to be disposed of. + + +#. **WEEE registration number** + + .. only:: roboception or schunk or matrixvision + + |manufacturer| is registered under the registration number DE 33323989 at the stiftung elektro-altgeräte register, + Nordostpark 72, 90411 Nuremberg, Germany, as a producer of electrical and/or electronic equipment. + + .. only:: basler + + |manufacturer| is registered under the registration number DE 83888045 at the stiftung elektro-altgeräte register, + Nordostpark 72, 90411 Nuremberg, Germany, as a producer of electrical and/or electronic equipment. + + +#. **Collection and recovery quotas** + + According to the WEEE Directive, EU member states are obliged to collect data on waste electrical and electronic + equipment and to transmit this data to the European Commission. Further information can be found on the German + Ministry for the Environment website. + + +**Information on Disposal outside the European Union** + +This symbol is valid only in the European Union. If you wish to discard this product please contact +your local authorities or dealer and ask for the correct method of disposal. + + \ No newline at end of file diff --git a/v24.04/en/_raw_sources/eki.rst.txt b/v24.04/en/_raw_sources/eki.rst.txt new file mode 100644 index 0000000..0d9d7e0 --- /dev/null +++ b/v24.04/en/_raw_sources/eki.rst.txt @@ -0,0 +1,606 @@ +.. include:: global_rst.glb + +.. _sect-eki: + +KUKA Ethernet KRL Interface +=========================== + +.. index:: + single: eki + +The |rc_xxx| provides an Ethernet KRL Interface (|eki-bridge|), +which allows communicating with the |rc_xxx| from KUKA KRL via +KUKA.EthernetKRL XML. + +.. Note:: + + The component is optional and requires a separate |company|'s EKIBridge + :ref:`license ` :latex:`(Section \ref{maintenance:sect-updating-license})` + to be purchased. + +.. Note:: + + The KUKA.EthernetKRL add-on software package version 2.2 or newer must be + activated on the robot controller to use this component. + +The |eki-bridge| can be used to programmatically + +* do service calls, e.g. to start and stop individual computational nodes, + or to use offered services such as the hand-eye calibration or the + computation of grasp poses; +* set and get run-time parameters of computation nodes, + e.g. of the camera, or disparity calculation. + +.. Note:: + + A known limitation of the |eki-bridge| is that strings representing valid numbers will be converted to int/float. + Hence user-defined names (like ROI IDs, etc.) should always contain at least one letter so they can be used in service call arguments. + +Ethernet connection configuration +--------------------------------- + +The |eki-bridge| listens on port 7000 for EKI XML messages and transparently +bridges the |rc_xxx|'s :doc:`REST-API v2`:latex:`\:(Section \ref{rest_api:sect-rest-api})`. +The received EKI messages are transformed to JSON and forwarded to the +|rc_xxx|'s |rest-api|. +The response from the |rest-api| is transformed back to EKI XML. + +The |eki-bridge| gives access to run-time parameters and offered services +of all computational nodes described in +:doc:`modules`:latex:`\:(Section \ref{modules:sect-modules})`. + +.. only:: latex + + The Ethernet connection to the |rc_xxx| on the robot controller is configured + using XML configuration files. + + .. only:: roboception or schunk or matrixvision + + The EKI XML configuration files of all nodes running on the |rc_xxx| are + available for download at: + + :latex:`\begin{center}\url{https://doc.rc-visard.com/latest/en/eki.html#eki-xml-configuration-files}\end{center}` + +.. only:: html + + The Ethernet connection to the |rc_xxx| on the robot controller is configured + using XML configuration files. + The EKI XML configuration files of all nodes running on the |rc_xxx| are + listed at :ref:`sect-eki-configs`. + +Each node offering run-time parameters has an XML configuration file +for setting and getting its parameters. +These are named following the scheme ``-parameters.xml``. +Each node's service has its own XML configuration file. +These are named following the scheme ``-.xml``. + +The IP of the |rc_xxx| in the network needs to be filled in the XML file. + +.. only:: rc_cube + + The port is already set to 7000, which corresponds to pipeline 0. + This needs to be adjusted if a different pipeline should be used. + The port number is 7000 + pipeline number, so 7001 for pipeline 1, etc. + +These files must be stored in the directory +``C:\KRC\ROBOTER\Config\User\Common\EthernetKRL`` +of the robot controller and they are read in when a connection is initialized. + +As an example, an Ethernet connection to configure the ``rc_stereomatching`` +parameters is established with the following KRL code. + + .. code-block:: c + + DECL EKI_Status RET + RET = EKI_INIT("rc_stereomatching-parameters") + RET = EKI_Open("rc_stereomatching-parameters") + + ; ----------- Desired operation ----------- + + RET = EKI_Close("rc_stereomatching-parameters") + +.. note:: The |eki-bridge| automatically terminates the connection to the client + if the received XML telegram is invalid. + +Generic XML structure +--------------------- + +For data transmission, the |eki-bridge| uses ```` as root XML element +(short for request). + +The root tag always includes the following elements. + +* ````. This includes a child XML element used by the |eki-bridge| + to identify the target node. + The node name is already included in the XML configuration file. +* ````. End of request flag that triggers the request. + +The following listing shows the generic XML structure for data transmission. + + .. code-block:: xml + + + + + + + + +For data reception, the |eki-bridge| uses ```` as root XML element +(short for response). +The root tag always includes a ```` child element. + + .. code-block:: xml + + + + + + + + + +.. note:: By default the XML configuration files uses 998 as flag to notify KRL + that the response data record has been received. If this value is already + in use, it should be changed in the corresponding XML configuration file. + +Return code +^^^^^^^^^^^ + +The ```` element consists of a ``value`` and a ``message`` attribute. + +As for all other components, a successful request returns with a +``res/return_code/@value`` of 0. +Negative values indicate that the request failed. +The error message is contained in ``res/return_code/@message``. +Positive values indicate that the request succeeded with additional information, +contained in ``res/return_code/@message`` as well. + +The following codes can be issued by the |eki-bridge| component. + +.. tabularcolumns:: |c|L| +.. _tab-eki-return-codes: +.. csv-table:: Return codes of the |eki-bridge| component + :header: Code, Description + + "0", "Success" + "-1", "Parsing error in the conversion from XML to JSON" + "-2", "Internal error " + "-5", "Connection error from the |rest-api|" + "-9", "Missing or invalid license for |eki-bridge| component" + +.. note:: The |eki-bridge| can also return return code values specific + to individual nodes. They are documented in the respective + :ref:`software module `:latex:`\:(Section \ref{modules:sect-modules})`. + +.. note:: Due to limitations in KRL, the maximum length of a string returned + by the |eki-bridge| is 512 characters. All messages larger than this value + are truncated. + +Services +-------- + +For the nodes' services, the XML schema is generated from the service's +arguments and response in JavaScript Object Notation (JSON) described in +:doc:`modules`:latex:`\:(Section \ref{modules:sect-modules})`. +The conversion is done transparently, except for the conversion rules +described below. + +Conversions of poses: + + A pose is a JSON object that includes ``position`` and ``orientation`` keys. + + .. code-block:: json + + { + "pose": { + "position": { + "x": "float64", + "y": "float64", + "z": "float64", + }, + "orientation": { + "x": "float64", + "y": "float64", + "z": "float64", + "w": "float64", + } + } + } + + This JSON object is converted to a KRL ``FRAME`` in the XML message. + + .. code-block:: xml + + + + Positions are converted from meters to millimeters and orientations are + converted from quaternions to KUKA ABC (in degrees). + + .. note:: No other unit conversions are included in the |eki-bridge|. + All dimensions and 3D coordinates that don't belong to a pose are + expected and returned in meters. + +Arrays: + + Arrays are identified by adding the child element ```` + (short for list element) to the list name. As an example, the JSON object + + .. code-block:: json + + { + "rectangles": [ + { + "x": "float64", + "y": "float64" + } + ] + } + + is converted to the XML fragment + + .. code-block:: xml + + + + ... + ... + + + +Use of XML attributes: + + All JSON keys whose values are a primitive data type and don't belong to an + array are stored in attributes. As an example, the JSON object + + .. code-block:: json + + { + "item": { + "uuid": "string", + "confidence": "float64", + "rectangle": { + "x": "float64", + "y": "float64" + } + } + } + + is converted to the XML fragment + + .. code-block:: xml + + + + + + +Request XML structure +^^^^^^^^^^^^^^^^^^^^^ + +The ```` element in the XML configuration file for a generic +service follows the specification below. + + .. code-block:: xml + + + + + + + + + + +The ```` element includes a child XML element that is used by the +|eki-bridge| to identify the target service from the XML telegram. +The service name is already included in the configuration file. + +The ```` element includes the service arguments and should be configured +with ``EKI_Set`` KRL instructions. + +As an example, the ```` element of the ``rc_load_carrier_db``'s +``get_load_carriers`` service +(see :ref:`sect-loadcarrier-db`:latex:`, Section \ref{loadcarrier_db:sect-loadcarrier-db}`) is: + + .. code-block:: xml + + + + + + + + + + +The ```` element allows to have arrays in the request. +For configuring an array, the request is split into as many +packages as the size of the array. +The last telegram contains all tags, including the ```` +flag, while all other telegrams contain one array element each. + +As an example, for requesting two load carrier models to the ``rc_load_carrier_db``'s +``get_load_carriers`` service, the user needs to send two XML messages. +The first XML telegram is: + + .. code-block:: xml + + + + + load_carrier1 + + + + +This telegram can be sent from KRL with the ``EKI_Send`` command, +by specifying the list element as path: + + .. code-block:: c + + DECL EKI_STATUS RET + RET = EKI_SetString("rc_load_carrier_db-get_load_carriers", "req/args/load_carrier_ids/le", "load_carrier1") + RET = EKI_Send("rc_load_carrier_db-get_load_carriers", "req/args/load_carrier_ids/le") + +The second telegram includes all tags and triggers the request to the +``rc_load_carrier_db`` node: + + .. code-block:: xml + + + + + + + + + + + load_carrier2 + + + + + +This telegram can be sent from KRL by specifying ``req`` as path for ``EKI_Send``: + + .. code-block:: c + + DECL EKI_STATUS RET + RET = EKI_SetString("rc_load_carrier_db-get_load_carriers", "req/args/load_carrier_ids/le", "load_carrier2") + RET = EKI_Send("rc_load_carrier_db-get_load_carriers", "req") + +Response XML structure +^^^^^^^^^^^^^^^^^^^^^^ + +The ```` element in the XML configuration file for a generic +service follows the specification below: + + .. code-block:: xml + + + + + + + + + + +As an example, the ```` element of the ``rc_april_tag_detect``'s +``detect`` service +(see :ref:`sect-tag-detection`:latex:`, Section \ref{tagdetect:sect-tag-detection}`) is: + + .. code-block:: xml + + + + + + + + + + + + + + + + + + + + + + + +For arrays, the response includes multiple instances of the same XML element. +Each element is written into a separate buffer within EKI and can be read +from the buffer with KRL instructions. +The number of instances can be requested with ``EKI_CheckBuffer`` and each +instance can then be read by calling ``EKI_Get``. + +As an example, the tag poses received after a call to the +``rc_april_tag_detect``'s ``detect`` service can be read in KRL using the +following code: + + .. code-block:: c + + DECL EKI_STATUS RET + DECL INT i + DECL INT num_instances + DECL FRAME poses[32] + + DECL FRAME pose = {X 0.0, Y 0.0, Z 0.0, A 0.0, B 0.0, C 0.0} + + RET = EKI_CheckBuffer("rc_april_tag_detect-detect", "res/tags/le/pose") + num_instances = RET.Buff + for i=1 to num_instances + RET = EKI_GetFrame("rc_april_tag_detect-detect", "res/tags/le/pose", pose) + poses[i] = pose + endfor + RET = EKI_ClearBuffer("rc_april_tag_detect-detect", "res") + +.. note:: Before each request from EKI to the |rc_xxx|, all buffers should + be cleared in order to store only the current response in the EKI buffers. + +Parameters +---------- + +All nodes' parameters can be set and queried from the |eki-bridge|. +The XML configuration file for a generic node follows the specification below: + + .. code-block:: xml + + + + + + + + + + + + + + + + + + + + + + + + + +The request is interpreted as a *get* request if all parameter's +``value`` attributes are empty. +If any ``value`` attribute is non-empty, it is interpreted as *set* request +of the non-empty parameters. + +As an example, the current value of all parameters of ``rc_stereomatching`` +can be queried using the XML telegram: + + .. code-block:: xml + + + + + + + + + +This XML telegram can be sent out with Ethernet KRL using: + + .. code-block:: c + + DECL EKI_STATUS RET + RET = EKI_Send("rc_stereomatching-parameters", "req") + +The response from the |eki-bridge| contains all parameters: + + .. code-block:: xml + + + + + + + + + + + + + + + + + +The ``quality`` parameter of ``rc_stereomatching`` can be set to ``Low`` +by the XML telegram: + + .. code-block:: xml + + + + + + + + + + + +This XML telegram can be sent out with Ethernet KRL using: + + .. code-block:: c + + DECL EKI_STATUS RET + RET = EKI_SetString("rc_stereomatching-parameters", "req/parameters/quality/@value", "Low") + RET = EKI_Send("rc_stereomatching-parameters", "req") + + +In this case, only the applied value of ``quality`` is returned by the +|eki-bridge|: + + .. code-block:: xml + + + + + + + + +.. only:: html + + .. include:: eki_configs.rst_incl + + +.. only:: rc_visard or rc_cube + + Migration to firmware version 22.01 + ----------------------------------- + + From firmware version 22.01 on the |eki-bridge| reflects |rc_xxx|'s :doc:`REST-API v2`:latex:`\:(Section \ref{rest_api:sect-rest-api})`. + + This requires the following changes: + + * Configuring load carriers, grippers and regions of interest is now only accessible in the global database modules: + + + Use the ``rc_load_carrier_db`` XML files for getting, setting and deleting of load carriers. + + Use the ``rc_gripper_db`` XML files for getting, setting and deleting of grippers. + + Use the ``rc_roi_db`` XML files for getting, setting and deleting of regions of interest. + + * Load carrier detection and filling level detection is now only accessible via the ``rc_load_carrier`` node. + + + Use the ``rc_load_carrier`` XML files for ``detect_load_carriers`` and ``detect_filling_level`` services. + +.. only:: roboception or matrixvision or schunk + + Example applications + -------------------- + + More detailed robot application examples can be found at https://github.com/roboception/eki_examples. + + +Troubleshooting +--------------- + +**SmartPad error message: Limit of element memory reached** + +This error may occur if the number of matches exceeds the memory limit. + +- Increase BUFFERING and set BUFFSIZE in EKI config files. Adapt these settings to your particular KRC. +- Decrease the 'Maximum Matches' parameter in the detection module +- Even if the total memory limit (BUFFSIZE) of a message is not reached, the KRC might not + be able to parse the number of child elements in the XML tree if the + BUFFERING limit is too small. For example, if your application proposes 50 + different grasps, the BUFFERING limit needs to be 50 too. diff --git a/v24.04/en/_raw_sources/general.rst.txt b/v24.04/en/_raw_sources/general.rst.txt new file mode 100644 index 0000000..1d75127 --- /dev/null +++ b/v24.04/en/_raw_sources/general.rst.txt @@ -0,0 +1,170 @@ +.. include:: global_rst.glb + +.. _sect-general: + +Overview +======== + +.. only:: rc_cube + + + The |rc_xxx| is a high-performance 3D-image-processing device. + It enhances the computing capabilities of the |company| stereo camera |rc_visard| and + supports :mvexclude:`the Basler blaze camera in an RGB-D setup and` the |rc_viscore|. + + .. only:: roboception or basler + + Information about the supported devices are provided in + + .. only:: roboception + + * |rc_visard|: https://doc.rc-visard.com + * |rc_viscore|: https://doc.rc-viscore.com + * |blaze|: https://www.baslerweb.com/en/products/cameras/3d-cameras/blaze-rgb-d. + + .. only:: basler + + * https://www.baslerweb.com/en/products/cameras/3d-cameras/. + + .. NOTE:: Unless specified, the information provided in this manual applies to both the |rc_visard| 65 and |rc_visard| 160 + versions of the |company| |rc_visard| sensor, as well as the |rc_visard_ng|. + + .. only:: roboception or schunk or basler + + .. NOTE:: The term "blaze" used throughout the manual always refers to the Basler blaze camera in an RGB-D setup, i.e. the blaze + Time-of-Flight camera in combination with the Basler aceA1300 color camera. + +.. only:: rc_visard or rc_visard_ng + + The 3D sensor |rc_xxx| is an IP54-protected :visardonly:`, self-registering` stereo-camera + with on-board computing capabilities. + +The |rc_xxx| provides real-time camera images and depth images, which can +be used to compute 3D point clouds. Additionally, it provides +confidence and error images as quality measures for each image acquisition. +It offers an intuitive web UI (user interface) and a standardized +GenICam interface, making it compatible with all major image processing +libraries. + +With optionally available software modules the |rc_xxx| provides out-of-the-box solutions +for object detection and robotic pick-and-place applications. + +.. only:: rc_cube + + The |rc_cube| is offered in two versions: *rc_cube S* and *rc_cube I*. + + The *rc_cube S* is suitable for research, development and testing environments. It supports one |rc_visard| without additional hardware. + A separate 2.5Gbit switch (not part of the product scope) enables the support of two |rc_visard| devices at a time or allows to connect + an |rc_viscore| :mvexclude:`or a Basler blaze` device. + + The *rc_cube I* is intended for operational use in an industrial environment. It supports four |rc_visard| cameras, or two |rc_viscore| + :mvexclude:`or Basler blaze` devices without additional hardware. + + .. only:: basler + + .. figure:: images/cube_overview_basler.* + :width: 80 % + :align: center + + Schematic representation of the |rc_cube| and the connected 3D cameras. + Unless only a single |rc_visard| is connected to the *rc_cube S*, a separate 2.5Gbit switch is required. + + .. only:: matrixvision + + .. figure:: images/cube_overview_mv.* + :width: 80 % + :align: center + + Schematic representation of the |rc_cube| and the connected 3D cameras. + Unless only a single |rc_visard| is connected to the *rc_cube S*, a separate 2.5Gbit switch is required. + + .. only:: schunk + + .. figure:: images/cube_overview_schunk.* + :width: 80 % + :align: center + + Schematic representation of the |rc_cube| and the connected 3D cameras. + Unless only a single |rc_visard| is connected to the *rc_cube S*, a separate 2.5Gbit switch is required. + + .. only:: roboception + + .. figure:: images/cube_overview.* + :width: 80 % + :align: center + + Schematic representation of the |rc_cube| and the connected 3D cameras. + Unless only a single |rc_visard| is connected to the *rc_cube S*, a separate 2.5Gbit switch is required. + +.. only:: rc_visard + + The |rc_visard| also provides self-localization based on image and inertial data. + A mobile navigation solution can be established with the optional on-board SLAM module. + + The |rc_visard| is offered with two different stereo baselines: The |rc_visard| 65 + is optimally suited for mounting on robotic manipulators, whereas the |rc_visard| 160 can be + employed as a navigation or as externally-fixed sensor. + +.. only:: rc_visard or rc_visard_ng + + The |rc_xxx|'s intuitive calibration, configuration, and use enable 3D vision for everyone. + + .. only:: roboception and rc_visard + + .. figure:: images/sensor.png + :width: 40 % + :align: center + + |rc_visard| 65 and |rc_visard| 160 + + .. only:: roboception and rc_visard_ng + + .. figure:: images/sensor_ng.png + :width: 40 % + :align: center + + |rc_visard_ng| 160 + + .. only:: matrixvision + + .. figure:: images/sensor_mv.png + :width: 40 % + :align: center + + |rc_visard| 65 and |rc_visard| 160 + + .. only:: basler + + .. figure:: images/sensor_basler.png + :width: 40 % + :align: center + + |manufacturer| |rc_visard| 65 and |rc_visard| 160 + + .. only:: schunk + + .. figure:: images/sensor_schunk.png + :width: 40 % + :align: center + + |manufacturer| |rc_visard| 65 and |rc_visard| 160 + + +.. only:: rc_visard + + The terms "sensor," "|rc_visard| 65," and "|rc_visard| 160" used throughout the manual all refer to the |company| |rc_visard| family of self-registering cameras. + Installation and control for all sensors are exactly the same, and all use the same mounting base. + + .. NOTE:: Unless specified, the information provided in this manual applies to both the |rc_visard| 65 and |rc_visard| 160 versions of the |company| |rc_visard| sensor. + +.. only:: rc_visard_ng + + The terms "sensor" and "|rc_xxx|" used throughout the manual all refer to the |company| |rc_visard_ng|. + +.. only:: rc_cube + + .. NOTE:: Unless specified, the information provided in this manual applies to both the *rc_cube S* and *rc_cube I* versions of the |rc_cube|. + +.. NOTE:: This manual uses the metric system and mostly uses the units meter and + millimeter. Unless otherwise specified, all dimensions in technical drawings are + in millimeters. diff --git a/v24.04/en/_raw_sources/gigevision.rst.txt b/v24.04/en/_raw_sources/gigevision.rst.txt new file mode 100644 index 0000000..f20c037 --- /dev/null +++ b/v24.04/en/_raw_sources/gigevision.rst.txt @@ -0,0 +1,771 @@ +.. include:: global_rst.glb + +.. _sect-genicam: + +GigE Vision 2.0/GenICam image interface +----------------------------------------- + +.. index:: + see: GigE Vision; GenICam + +Gigabit Ethernet for Machine Vision ("GigE Vision\ |reg|" for short) is an industrial camera interface standard based on UDP/IP +(see http://www.gigevision.com). +The |rc_xxx| is a GigE Vision\ |reg| version 2.0 device and is hence compatible with all GigE Vision\ |reg| 2.0 compliant frameworks and libraries. + +GigE Vision\ |reg| uses GenICam to describe the camera/device features. For more information about this *Generic Interface for Cameras* see http://www.genicam.org/. + +Via this interface the |rc_xxx| provides features such as + +* discovery, +* IP configuration, +* configuration of camera related parameters, +* image grabbing, and +* time synchronization via IEEE 1588-2008 PrecisionTimeProtocol (PTPv2). + +.. note:: The |rc_xxx| supports jumbo frames of up to 9000 bytes. Setting an MTU of 9000 + on your GigE Vision client side is recommended for best performance. + +.. only:: roboception or schunk or matrixvision + + .. note:: |manufacturer| provides tools and a C++ API with examples for discovery, configuration, and image + streaming via the GigE Vision/GenICam interface. See http://www.roboception.com/download. + +.. _sect-gev-ports: + +GigE Vision ports +^^^^^^^^^^^^^^^^^ + +GigE Vision is a UDP based protocol. On the |rc_xxx| the UDP ports are fixed and known: + +* UDP port 3956: GigE Vision Control Protocol (GVCP). Used for discovery, control and configuration. +* UDP port 50010: Stream channel source port for GigE Vision Stream Protocol (GVSP) used for image streaming. + +.. _sect-genicam-params: + +Important GenICam parameters +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The following list gives an overview of the relevant GenICam features of +the |rc_xxx| that can be read and/or changed +via the GenICam interface. In addition to the standard parameters, which are defined in +the Standard Feature Naming Convention (SFNC, see +http://www.emva.org/standards-technology/genicam/genicam-downloads/), +|rc_xxx| devices also offer custom parameters that account for special +features of the +:ref:`sect-stereo-camera`:latex:`\:(Section \ref{stereo_camera:sect-stereo-camera})` +and the +:ref:`sect-stereo-matching`:latex:`\:(Section \ref{stereo_matching:sect-stereo-matching})` +module. + +Important standard GenICam features +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Category: ImageFormatControl +++++++++++++++++++++++++++++ + +.. index:: + pair: ComponentSelector; GenICam + +``ComponentSelector`` + - type: Enumeration, one of ``Intensity``, ``IntensityCombined``, ``Disparity``, ``Confidence``, or ``Error`` + - default: - + - description: Allows the user to select one of the five image streams for configuration (see :ref:`sect-provided-image-streams`:latex:`, \:Section \ref{gigevision:sect-provided-image-streams}`). + +.. index:: + pair: ComponentIDValue; GenICam + +``ComponentIDValue`` (read-only) + - type: Integer + - description: The ID of the image stream selected by the ``ComponentSelector``. + +.. index:: + pair: ComponentEnable; GenICam + +``ComponentEnable`` + - type: Boolean + - default: - + - description: If set to ``true``, it enables the image stream selected by ``ComponentSelector``; otherwise, it disables the stream. + Using ``ComponentSelector`` and ``ComponentEnable``, individual image streams can be switched on and off. + +.. index:: + pair: Width; GenICam + +``Width`` (read-only) + - type: Integer + - description: Image width in pixel of image stream that is currently selected by ``ComponentSelector``. + +.. index:: + pair: Height; GenICam + +``Height`` (read-only) + - type: Integer + - description: Image height in pixel of image stream that is currently selected by ``ComponentSelector``. + +.. index:: + pair: WidthMax; GenICam + +``WidthMax`` (read-only) + - type: Integer + - description: Maximum width of an image. + +.. index:: + pair: HeightMax; GenICam + +``HeightMax`` (read-only) + - type: Integer + - description: Maximum height of an image in the streams. This is always 1920 pixels due to the + stacked left and right images in the ``IntensityCombined`` stream (see :ref:`sect-provided-image-streams`:latex:`, Section \ref{gigevision:sect-provided-image-streams}`). + +.. index:: + pair: PixelFormat; GenICam + +``PixelFormat`` + - type: Enumeration, one of ``Mono8``, ``YCbCr411_8`` (color cameras only), ``Coord3D_C16``, ``Confidence8`` and ``Error8`` + - description: Pixel format of the selected component. The enumeration only permits to choose the format + among the possibly formats for the selected component. For a color camera, ``Mono8`` or ``YCbCr411_8`` + can be chosen for the ``Intensity`` and ``IntensityCombined`` component. + +Category: AcquisitionControl +++++++++++++++++++++++++++++ + +.. index:: + pair: AcquisitionFrameRate; GenICam + pair: frame rate; GenICam + +``AcquisitionFrameRate`` + - type: Float, ranges from 1 Hz to 25 Hz + - default: 25 Hz + - description: Frame rate of the camera + (:ref:`FPS `:latex:`, Section \ref{stereo_camera:sect-cam-params}`). + +.. index:: + pair: ExposureAuto; GenICam + +``ExposureAuto`` + - type: Enumeration, one of ``Continuous``, ``Out1High``, ``AdaptiveOut1``, ``HDR`` or ``Off`` + - default: ``Continuous`` + - description: Combines ``exp_control`` (:ref:`exposure control `:latex:`, Section \ref{stereo_camera:expl-exp-control}`) + and ``exp_auto_mode`` (:ref:`auto exposure mode `:latex:`, Section \ref{stereo_camera:expl-exp-auto-mode}`). + ``Off`` maps to `Manual` :ref:`exposure control `. + ``Continuous``, ``Out1High`` or ``AdaptiveOut1`` enable `Auto` :ref:`exposure control ` + with the respective :ref:`auto exposure mode ` where ``Continuous`` maps to the `Normal` ``exp_auto_mode``. + ``HDR`` enables high-dynamic-range exposure control. + +.. index:: + pair: ExposureTime; GenICam + +``ExposureTime`` + - type: Float, ranges from 66 µs to 18000 µs + - default: 5000 µs + - description: The cameras' exposure time in microseconds for the manual exposure mode + (:ref:`Exposure `:latex:`, Section \ref{stereo_camera:expl-exp-value}`). + +Category: AnalogControl ++++++++++++++++++++++++ + +``GainSelector`` (read-only) + - type: Enumeration, is always ``All`` + - default: ``All`` + - description: The |rc_xxx| currently supports only one overall gain setting. + +.. index:: + pair: Gain; GenICam + +``Gain`` + - type: Float, ranges from 0 dB to 18 dB + - default: 0 dB + - description: The cameras' gain value in decibel that is used in manual exposure mode + (:ref:`Gain `:latex:`, Section \ref{stereo_camera:expl-gain-value}`). + +.. index:: + pair: BalanceWhiteAuto; GenICam + +``BalanceWhiteAuto`` (color cameras only) + - type: Enumeration, one of ``Continuous`` or ``Off`` + - default: ``Continuous`` + - description: Can be set to ``Off`` for manual white balancing mode or to ``Continuous`` + for auto white balancing. This feature is only available on color cameras + (:ref:`wb_auto `:latex:`, Section \ref{stereo_camera:expl-wb-auto}`). + +.. index:: + pair: BalanceRatioSelector; GenICam + +``BalanceRatioSelector`` (color cameras only) + - type: Enumeration, one of ``Red`` or ``Blue`` + - default: ``Red`` + - description: Selects ratio to be modified by ``BalanceRatio``. ``Red`` means red to green + ratio and ``Blue`` means blue to green ratio. This feature is only available on color cameras. + +.. index:: + pair: BalanceRatio; GenICam + +``BalanceRatio`` (color cameras only) + - type: Float, ranges from 0.125 to 8 + - default: 1.2 if ``Red`` and 2.4 if ``Blue`` is selected in ``BalanceRatioSelector`` + - description: Weighting of red or blue to green color channel. This feature is only available + on color cameras + (:ref:`wb_ratio `:latex:`, Section \ref{stereo_camera:expl-wb-ratio}`). + +.. _sect-genicam-iocontrol: + +Category: DigitalIOControl +++++++++++++++++++++++++++ + +.. index:: + pair: LineSelector; GenICam + +``LineSelector`` + - type: Enumeration, one of ``Out1``, ``Out2``, ``In1`` or ``In2`` + - default: ``Out1`` + - description: Selects the input or output line for getting the current status or setting + the source. + +.. index:: + pair: LineStatus; GenICam + +``LineStatus`` (read-only) + - type: Boolean + - description: Current status of the line selected by ``LineSelector``. + +.. index:: + pair: LineStatusAll; GenICam + +``LineStatusAll`` (read-only) + - type: Integer + - description: Current status of GPIO inputs and outputs represented in the lowest four bits. + + .. table:: Meaning of bits of ``LineStatusAll`` field. + + +------+------+------+-------+-------+ + | Bit | 4 | 3 | 2 | 1 | + +======+======+======+=======+=======+ + | GPIO | In 2 | In 1 | Out 2 | Out 1 | + +------+------+------+-------+-------+ + +.. index:: + pair: LineSource; GenICam + +``LineSource`` + - type: Enumeration, one of ``ExposureActive``, ``ExposureAlternateActive``, ``Low`` or ``High`` + - default: ``Low`` + - description: Mode for output line selected by ``LineSelector`` as described in the IOControl + module (:ref:`out1_mode and out2_mode`:latex:`, + Section \ref{iocontrol:sect-iocontrol-params}`). See also parameter + ``AcquisitionAlternateFilter`` for filtering images in ``ExposureAlternateActive`` mode. + +Category: TransportLayerControl / PtpControl +++++++++++++++++++++++++++++++++++++++++++++ + +.. index:: + pair: PtpEnable; GenICam + pair: PTP; synchronization + pair: time; synchronization + +``PtpEnable`` + - type: Boolean + - default: ``false`` + - description: Switches PTP synchronization on and off. + +Category: Scan3dControl ++++++++++++++++++++++++ + +.. index:: + pair: Scan3dDistanceUnit; GenICam + +``Scan3dDistanceUnit`` (read-only) + - type: Enumeration, is always ``Pixel`` + - description: Unit for the disparity measurements, which is always ``Pixel``. + +.. index:: + pair: Scan3dOutputMode; GenICam + +``Scan3dOutputMode`` (read-only) + - type: Enumeration, is always ``DisparityC`` + - description: Mode for the depth measurements, which is always ``DisparityC``. + +.. index:: + pair: Scan3dFocalLength; GenICam + +``Scan3dFocalLength`` (read-only) + - type: Float + - description: Focal length in pixel of image stream selected by ``ComponentSelector``. In case of + the component ``Disparity``, ``Confidence`` and ``Error``, the value also depends on the + resolution that is implicitly selected by ``DepthQuality``. + +.. index:: + pair: Scan3dBaseline; GenICam + +``Scan3dBaseline`` (read-only) + - type: Float + - description: Baseline of the stereo camera in meters. + +.. index:: + pair: Scan3dPrinciplePointU; GenICam + +``Scan3dPrinciplePointU`` (read-only) + - type: Float + - description: Horizontal location of the principle point in pixel of image stream selected by + ``ComponentSelector``. In case of the component ``Disparity``, ``Confidence`` and ``Error``, + the value also depends on the resolution that is implicitly selected by ``DepthQuality``. + +.. index:: + pair: Scan3dPrinciplePointV; GenICam + +``Scan3dPrinciplePointV`` (read-only) + - type: Float + - description: Vertical location of the principle point in pixel of image stream selected by + ``ComponentSelector``. In case of the component ``Disparity``, ``Confidence`` and ``Error``, + the value also depends on the resolution that is implicitly selected by ``DepthQuality``. + +.. index:: + pair: Scan3dCoordinateScale; GenICam + +``Scan3dCoordinateScale`` (read-only) + - type: Float + - description: The scale factor that has to be multiplied with the disparity values in the disparity + image stream to get the actual disparity measurements. This value is always 0.0625. + +.. index:: + pair: Scan3dCoordinateOffset; GenICam + +``Scan3dCoordinateOffset`` (read-only) + - type: Float + - description: The offset that has to be added to the disparity values in the disparity + image stream to get the actual disparity measurements. For the |rc_xxx|, this value + is always 0 and can therefore be disregarded. + +.. index:: + pair: Scan3dInvalidDataFlag; GenICam + +``Scan3dInvalidDataFlag`` (read-only) + - type: Boolean + - description: Is always ``true``, which means that invalid data in the + disparity image is marked by a specific value defined by the + ``Scan3dInvalidDataValue`` parameter. + +.. index:: + pair: Scan3dInvalidDataValue; GenICam + +``Scan3dInvalidDataValue`` (read-only) + - type: Float + - description: Is the value which stands for invalid disparity. This value is always 0, which means that + disparity values of 0 correspond to invalid measurements. To distinguish between invalid disparity measurements and + disparity measurements of 0 for objects which are infinitely far away, the |rc_xxx| sets the disparity value for the latter + to the smallest possible disparity value of 0.0625. This still corresponds to an object distance of several hundred meters. + +Category: ChunkDataControl +++++++++++++++++++++++++++ + +.. index:: + pair: Chunk data; GenICam + +``ChunkModeActive`` + - type: Boolean + - default: False + - description: Enables chunk data that is delivered with every image. + +.. _sect-custom-genicam-params: + +Custom GenICam features of the |rc_xxx| +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Category: DeviceControl ++++++++++++++++++++++++ + +.. index:: + pair: system ready; GenICam + +``RcSystemReady`` (read-only) + - type: Boolean + - description: Returns whether the device's boot process has completed and all modules are running. + +.. index:: + pair: disable parameter lock; GenICam + +``RcParamLockDisable`` + - type: Boolean + - default: False + - description: If set to true, the camera and depth image parameters are not locked when a GigE Vision + client is connected to the device. Please note that depending on the connected GigE Vision client, + parameter changes by other applications (e.g. the |webgui|) might not be noticed by the GigE Vision client, + which could lead to unwanted results. + +Category: AcquisitionControl +++++++++++++++++++++++++++++ + +.. index:: + pair: AcquisitionAlternateFilter; GenICam + +``AcquisitionAlternateFilter`` + - type: Enumeration, one of ``Off``, ``OnlyHigh`` or ``OnlyLow`` + - default: ``Off`` + - description: If this parameter is set to ``OnlyHigh`` (or ``OnlyLow``) and the ``LineSource`` + is set to ``ExposureAlternateActive`` for any output, then only camera images are delivered + that are captured while the output is high, i.e. a potentially connected projector is on (or + low, i.e. a potentially connected projector is off). This parameter is a simple means for only + getting images without projected pattern. The minimal time difference between camera and + disparity images will be about 40 ms in this case + (see :ref:`IOControl`:latex:`, Section \ref{iocontrol:sect-iocontrol-params}`). + +.. index:: + pair: AcquisitionMultiPartMode; GenICam + +``AcquisitionMultiPartMode`` + - type: Enumeration, one of ``SingleComponent`` or ``SynchronizedComponents`` + - default: ``SingleComponent`` + - description: Only effective in MultiPart mode. If this parameter is set to ``SingleComponent`` + the images are sent immediately as a single component per frame/buffer when they become available. + This is the same behavior as when MultiPart is not supported by the client. + If set to ``SynchronizedComponents`` all enabled components are time synchronized on the |rc_xxx| + and only sent (in one frame/buffer) when they are all available for that timestamp. + +.. index:: + pair: ExposureTimeAutoMax; GenICam + +``ExposureTimeAutoMax`` + - type: Float, ranges from 66 µs to 18000 µs + - default: 18000 µs + - description: Maximal exposure time in auto exposure mode + (:ref:`Max Exposure `:latex:`, Section \ref{stereo_camera:expl-exp-max}`). + +.. index:: + pair: ExposureRegionOffsetX; GenICam + +``ExposureRegionOffsetX`` + - type: Integer in the range of 0 to the maximum image width + - default: 0 + - description: Horizontal offset of :ref:`exposure region`:latex:`\:(Section \ref{stereo_camera:expl-exp-region})` in pixel. + +.. index:: + pair: ExposureRegionOffsetY; GenICam + +``ExposureRegionOffsetY`` + - type: Integer in the range of 0 to the maximum image height + - default: 0 + - description: Vertical offset of :ref:`exposure region`:latex:`\:(Section \ref{stereo_camera:expl-exp-region})` in pixel. + +.. index:: + pair: ExposureRegionWidth; GenICam + +``ExposureRegionWidth`` + - type: Integer in the range of 0 to the maximum image width + - default: 0 + - description: Width of :ref:`exposure region`:latex:`\:(Section \ref{stereo_camera:expl-exp-region})` in pixel. + +.. index:: + pair: ExposureRegionHeight; GenICam + +``ExposureRegionHeight`` + - type: Integer in the range of 0 to the maximum image height + - default: 0 + - description: Height of :ref:`exposure region`:latex:`\:(Section \ref{stereo_camera:expl-exp-region})` in pixel. + +.. index:: + pair: RcExposureAutoAverageMax; GenICam + +``RcExposureAutoAverageMax`` + - type: Float in the range of 0 to 1 + - default: 0.75 + - description: Maximum brightness for the :ref:`auto exposure function`:latex:`\:(Section \ref{stereo_camera:exp-auto-max-min-average})` + as value between 0 (dark) and 1 (bright). + +.. index:: + pair: RcExposureAutoAverageMin; GenICam + +``RcExposureAutoAverageMin`` + - type: Float in the range of 0 to 1 + - default: 0.25 + - description: Minimum brightness for the :ref:`auto exposure function`:latex:`\:(Section \ref{stereo_camera:exp-auto-max-min-average})` + as value between 0 (dark) and 1 (bright). + +Category: Scan3dControl ++++++++++++++++++++++++ + +.. index:: + pair: focal length factor; GenICam + pair: FocalLengthFactor; GenICam + +``FocalLengthFactor`` (read-only) + - type: Float + - description: The focal length scaled to an image width of 1 pixel. To get the focal length in pixels for a + certain image, this value must be multiplied by the width of the received image. See also parameter + ``Scan3dFocalLength``. + +.. index:: + pair: Baseline; GenICam + +``Baseline`` (read-only) + - type: Float + - description: This parameter is deprecated. The parameter ``Scan3dBaseline`` should be used instead. + +Category: DepthControl +++++++++++++++++++++++ + +.. index:: + pair: DepthAcquisitionMode; GenICam + +``DepthAcquisitionMode`` + - type: Enumeration, one of ``SingleFrame``, ``SingleFrameOut1`` or ``Continuous`` + - default: ``Continuous`` + - description: In single frame mode, stereo matching is performed upon each + call of ``DepthAcquisitionTrigger``. The ``SingleFrameOut1`` mode can be + used to control an external projector. It sets the line source of ``Out1`` to + ``ExposureAlternateActive`` upon each trigger and resets it to ``Low`` as soon + as the images for stereo matching are grabbed. In continuous mode, + stereo matching is performed continuously. + +.. index:: + pair: DepthAcquisitionTrigger; GenICam + +``DepthAcquisitionTrigger`` + - type: Command + - description: This command triggers stereo matching of the next available + stereo image pair, if ``DepthAcquisitionMode`` is set to ``SingleFrame`` or ``SingleFrameOut1``. + +.. index:: + pair: quality; GenICam + pair: DepthQuality; GenICam + +``DepthQuality`` + - type: Enumeration, one of ``Low``, ``Medium``, ``High``, or ``Full`` **(only with StereoPlus license)** + - default: ``High`` + - description: Quality of disparity images. Lower quality results in disparity + images with lower resolution + (:ref:`Quality `:latex:`, Section \ref{stereo_matching:expl-depth-quality}`). + +.. index:: + pair: double_shot; GenICam + pair: DepthDoubleShot; GenICam + +``DepthDoubleShot`` + - type: Boolean + - default: ``False`` + - description: ``True`` for improving the stereo matching result of a scene recorded with a projector by filling holes with depth information computed from images without projector pattern. + (:ref:`Double-Shot `:latex:`, Section \ref{stereo_matching:expl-depth-double-shot}`). + +.. index:: + pair: static_scene; GenICam + pair: DepthStaticScene; GenICam + +``DepthStaticScene`` + - type: Boolean + - default: ``False`` + - description: ``True`` for averaging 8 consecutive camera images for improving the stereo matching result. + (:ref:`Static `:latex:`, Section \ref{stereo_matching:expl-depth-static}`). + +.. index:: + pair: smooth; GenICam + pair: DepthSmooth; GenICam + +``DepthSmooth`` (read-only if StereoPlus license is not available) + - type: Boolean + - default: ``False`` + - description: ``True`` for advanced smoothing of disparity values. + (:ref:`Smoothing `:latex:`, Section \ref{stereo_matching:expl-depth-smooth}`). + +.. index:: + pair: fill-in; GenICam + pair: DepthFill; GenICam + +``DepthFill`` + - type: Integer, ranges from 0 pixel to 4 pixels + - default: 3 pixels + - description: Value in pixels for + :ref:`Fill-In `:latex:`\:(Section \ref{stereo_matching:expl-depth-fill})`. + +.. index:: + pair: segmentation; GenICam + pair: DepthSeg; GenICam + +``DepthSeg`` + - type: Integer, ranges from 0 pixel to 4000 pixels + - default: 200 pixels + - description: Value in pixels for + :ref:`Segmentation `:latex:`\:(Section \ref{stereo_matching:expl-depth-seg})`. + +.. index:: + pair: minimum confidence; GenICam + pair: DepthMinConf; GenICam + +``DepthMinConf`` + - type: Float, ranges from 0.0 to 1.0 + - default: 0.0 + - description: Value for :ref:`Minimum Confidence ` + filtering\ :latex:`\:(Section \ref{stereo_matching:expl-depth-min-conf})`. + +.. index:: + pair: minimum distance; GenICam + pair: DepthMinDepth; GenICam + +``DepthMinDepth`` + - type: Float, ranges from 0.1 m to 100.0 m + - default: 0.1 m + - description: Value in meters for :ref:`Minimum Distance ` + filtering\ :latex:`\:(Section \ref{stereo_matching:expl-depth-min-depth})`. + +.. index:: + pair: maximum distance; GenICam + pair: DepthMaxDepth; GenICam + +``DepthMaxDepth`` + - type: Float, ranges from 0.1m to 100.0 m + - default: 100.0 m + - description: Value in meters for :ref:`Maximum Distance ` + filtering\ :latex:`\:(Section \ref{stereo_matching:expl-depth-max-depth})`. + +.. index:: + pair: maximum depth error; GenICam + pair: DepthMaxDepthErr; GenICam + +``DepthMaxDepthErr`` + - type: Float, ranges from 0.01 m to 100.0 m + - default: 100.0 m + - description: Value in meters for :ref:`Maximum Depth Error ` + filtering\ :latex:`\:(Section \ref{stereo_matching:expl-depth-max-depth-err})`. + +.. _sect-chunk-data: + +Chunk data +^^^^^^^^^^ + +The |rc_xxx| supports chunk parameters that are transmitted with every +image. Chunk parameters all have the prefix ``Chunk``. Their meaning equals +their non-chunk counterparts, except that they belong to the corresponding +image, e.g. ``Scan3dFocalLength`` depends on ``ComponentSelector`` and +``DepthQuality`` as both can change the image resolution. The parameter +``ChunkScan3dFocalLength`` that is delivered with an image fits to the +resolution of the corresponding image. + +Particularly useful chunk parameters are: + +- ``ChunkComponentSelector`` selects for which component to extract the chunk + data in MultiPart mode. + +- ``ChunkComponentID`` and ``ChunkComponentIDValue`` provide the relation of + the image to its component (e.g. camera image or disparity image) without + guessing from the image format or size. + +- ``ChunkLineStatusAll`` provides the status of all GPIOs at the time of image + acquisition. See ``LineStatusAll`` above for a description of bits. + +- ``ChunkScan3d...`` parameters are useful for 3D reconstruction as described + in Section :ref:`sect-image-stream-conversions`:latex:`\:(Section \ref{gigevision:sect-image-stream-conversions})`. + +- ``ChunkPartIndex`` provides the index of the image part in this MultiPart + block for the selected component (``ChunkComponentSelector``). + +- ``ChunkRcOut1Reduction`` gives a ratio of how much the brightness of the images with GPIO Out1 LOW is + lower than the brightness of the images with GPIO Out1 HIGH. For example, a value of 0.2 means that the images with + GPIO Out1 LOW have 20% less brightness than the images with GPIO Out1 HIGH. This value is only available if + ``exp_auto_mode`` of the stereo camera is set to ``AdaptiveOut1`` or ``Out1High`` (:ref:`auto exposure mode `:latex:`, Section \ref{stereo_camera:expl-exp-auto-mode}`). + +Chunk data is enabled by setting the GenICam parameter ``ChunkModeActive`` to +``True``. + +.. _sect-provided-image-streams: + +Provided image streams +^^^^^^^^^^^^^^^^^^^^^^ + +The |rc_xxx| provides the following five different image streams via the GenICam interface: + +.. index:: + pair: Intensity; GenICam image stream + pair: IntensityCombined; GenICam image stream + pair: Disparity; GenICam image stream + pair: Error; GenICam image stream + pair: Confidence; GenICam image stream + pair: PixelFormat; GenICam + +.. tabularcolumns:: |p{30mm}|p{40mm}|p{30mm}|p{40mm}| + ++-----------------------+----------------------------------------+---------------------------------------------------------------------+ +| Component name | PixelFormat | Description | ++=======================+========================================+=====================================================================+ +| ``Intensity`` | | ``Mono8`` (monochrome cameras) | Left rectified camera image | +| | | ``YCbCr411_8`` (color cameras) | | ++-----------------------+----------------------------------------+---------------------------------------------------------------------+ +| ``IntensityCombined`` | | ``Mono8`` (monochrome cameras) | Left rectified camera image stacked on right rectified camera image | +| | | ``YCbCr411_8`` (color cameras) | | ++-----------------------+----------------------------------------+---------------------------------------------------------------------+ +| ``Disparity`` | ``Coord3D_C16`` | Disparity image in desired resolution, i.e., ``DepthQuality`` of | +| | | ``Full``, ``High``, ``Medium`` or ``Low`` | +| | | | +| | | | ++-----------------------+----------------------------------------+---------------------------------------------------------------------+ +| ``Confidence`` | ``Confidence8`` | Confidence image | ++-----------------------+----------------------------------------+---------------------------------------------------------------------+ +| ``Error`` | ``Error8`` (custom: 0x81080001) | Disparity error image | ++-----------------------+----------------------------------------+---------------------------------------------------------------------+ + +.. index:: + pair: timestamp; image + pair: timestamp; GenICam + +Each image comes with a buffer timestamp and the *PixelFormat* given in the above table. This PixelFormat +should be used to distinguish between the different image types. Images belonging to the same acquisition +timestamp can be found by comparing the GenICam buffer timestamps. + +.. _sect-image-stream-conversions: + +Image stream conversions +^^^^^^^^^^^^^^^^^^^^^^^^ + +.. index:: + pair: conversions; GenICam image stream + +The disparity image contains 16 bit unsigned integer values. These values must be multiplied by the scale value +given in the GenICam feature *Scan3dCoordinateScale* to get the disparity values :math:`d` in pixels. To +compute the 3D object coordinates from the disparity values, the focal length and the baseline as well as the +principle point are required. +These parameters are transmitted as GenICam features *Scan3dFocalLength*, *Scan3dBaseline*, +*Scan3dPrincipalPointU* and *Scan3dPrincipalPointV*. The focal length and principal point depend on the image +resolution of the selected component. +Knowing these values, the pixel coordinates and the disparities can be transformed into 3D +object coordinates in the camera coordinate frame +using the equations described in :ref:`sect-point-clouds`:latex:`\:(Section \ref{stereo_matching:sect-point-clouds})`. + +.. only:: rc_visard or rc_visard_ng + + .. note:: The |rc_xxx|'s camera coordinate frame is defined as shown in + :ref:`sensor coordinate frame`:latex:`\:(Section \ref{hardware_spec:sect-coordinate-frames})`. + +Assuming that :math:`d16_{ik}` is the 16 bit disparity value at column :math:`i` and row :math:`k` +of a disparity image, the float disparity in pixels :math:`d_{ik}` is given by + +.. math:: + + d_{ik}=d16_{ik} \cdot \mathrm{Scan3dCoordinateScale} + +The 3D reconstruction in meters can be written with the GenICam parameters as: + +.. math:: + + P_x&=\left(i+0.5-\mathrm{Scan3dPrincipalPointU}\right) \frac{\mathrm{Scan3dBaseline}}{d_{ik}},\\ + P_y&=\left(k+0.5-\mathrm{Scan3dPrincipalPointV}\right) \frac{\mathrm{Scan3dBaseline}}{d_{ik}},\\ + P_z&=\mathrm{Scan3dFocalLength} \frac{\mathrm{Scan3dBaseline}}{d_{ik}}. + +The confidence image contains 8 bit unsigned integer values. These values have to be divided by 255 to +get the confidence as value between 0 an 1. + +The error image contains 8 bit unsigned integer values. The error :math:`e_{ik}` must be multiplied +by the scale value given in the GenICam feature *Scan3dCoordinateScale* to get the disparity-error +values :math:`d_{eps}` in pixels. According to the description in +:ref:`sect-confidence-error`:latex:`\:(Section \ref{stereo_matching:sect-confidence-error})`, the +depth error :math:`z_{eps}` in meters can be computed with GenICam parameters as + +.. math:: + + d_{ik}&=d16_{ik} \cdot \mathrm{Scan3dCoordinateScale},\\ + z_{eps}&=\frac{e_{ik} \cdot \mathrm{Scan3dCoordinateScale} \cdot \mathrm{Scan3dFocalLength} + \cdot \mathrm{Scan3dBaseline}} + {(d_{ik})^2}. + +.. note:: It is preferable to enable chunk data with the parameter *ChunkModeActive* and to use + the chunk parameters *ChunkScan3dCoordinateScale*, *ChunkScan3dFocalLength*, + *ChunkScan3dBaseline*, *ChunkScan3dPrincipalPointU* and *ChunkScan3dPrincipalPointV* + that are delivered with every image, because their values already fit to the image + resolution of the corresponding image. + +For more information about disparity, error, and confidence images, please refer to +:ref:`sect-stereo-matching`:latex:`\:(Section \ref{stereo_matching:sect-stereo-matching})`. diff --git a/v24.04/en/_raw_sources/glossary.rst.txt b/v24.04/en/_raw_sources/glossary.rst.txt new file mode 100644 index 0000000..e5d29f4 --- /dev/null +++ b/v24.04/en/_raw_sources/glossary.rst.txt @@ -0,0 +1,302 @@ +.. include:: global_rst.glb + +.. raw:: latex + + \newpage + +.. _glossary: + +Glossary +======== + +.. only:: rc_visard + + .. glossary:: + :sorted: + + DHCP + The Dynamic Host Configuration Protocol (DHCP) is used to automatically assign an + :term:`IP` address to a network device. Some DHCP servers only accept known devices. + In this case, an administrator needs to configure the DHCP server with the + fixed :term:`MAC address` of a device. + + .. disparity + .. disparity image + .. Disparity is the displacement of the projections of an object point in two camera + .. images. If the images are :term:`rectified`, then the disparity is the difference + .. between the column index of the projection in the left image and the column index + .. of the projection in the right image. The disparity is inversely proportional to + .. the distance (i.e., depth) + .. of the object point from the camera and becomes 0 if the object point is at infinity. + .. A disparity image contains disparities for each pixel. + + DNS + mDNS + The Domain Name Server (DNS) manages the host names and :term:`IP` addresses of all + network devices. It is responsible for resolving the host name into the IP address for + communication with a device. A DNS can be configured to get this information + automatically when a device appears on a network or manually by an administrator. In + contrast, *multicast DNS* (mDNS) works without a central server by querying all devices + on a local network each time a host name needs to be resolved. mDNS is available by + default on Linux and Mac operating systems and is used when '.local' is appended to a host + name. + + DOF + The Degrees Of Freedom (DOF) are the number of independent parameters for translation + and rotation. In 3D space, 6DOF (i.e. three for translation and three rotation) are + sufficient to describe an arbitrary position and orientation. + + GenICam + GenICam is a generic standard interface for cameras. It serves as a unified interface + around other standards such as :term:`GigE Vision`, Camera Link, USB, etc. See + http://genicam.org for more information. + + GigE + Gigabit Ethernet (GigE) is a networking technology for transmitting data at + one gigabit per second. + + GigE Vision + GigE Vision\ |reg| is a standard for configuring cameras and transmitting images over a + :term:`GigE` network link. See http://gigevision.com for more information. + + IMU + An Inertial Measurement Unit (IMU) consists of three accelerometers and three gyroscopes + that measure the linear accelerations and the turn rates in all three dimensions. + + INS + An Inertial Navigation System (INS) is a 3D measurement system which uses inertial + measurements (accelerations and turn rates) to compute position and orientation information. + We refer to our combination of stereo vision and inertial navigation as stereo INS. + + IP + IP address + The Internet Protocol (IP) is a standard for sending data between devices in a computer + network. Every device requires an IP address, which must be unique in the network. + The IP address can be configured by :term:`DHCP`, :term:`Link-Local`, or manually. + + Link-Local + Link-Local is a technology where network devices associate themselves with an :term:`IP address` + from the 169.254.0.0/16 IP range and check if it is unique in the local network. + Link-Local can be used if + :term:`DHCP` is unavailable and manual IP configuration is not or cannot be done. + Link-Local is especially useful for connecting a network device directly to a + host computer. By default, Windows 10 reverts automatically to Link-Local if + DHCP is unavailable. Under Linux, Link-Local must be enabled manually in the network + manager. + + MAC address + The Media Access Control (MAC) address is a unique, persistent address for + networking devices. It is also known as the hardware address of a device. In contrast + to the :term:`IP address`, the MAC address is (normally) permanently given to + a device and does not change. + + NTP + The Network Time Protocol (NTP) is a TCP/IP protocol for synchronizing time over a network. + Basically a client requests the current time from a server, and uses it to set its own clock. + + PTP + The Precision Time Protocol (PTP, also known as IEEE1588) is a protocol which enables more precise + and robust clock synchronization than with NTP. + + .. pose + .. A pose represents an object's *position* and *orientation* + .. relative to some *reference coordinate system* or *reference frame*. + .. It can be described by means of a rotation and translation transformation + .. that brings the object from a reference pose to the observed pose. + .. This rotation transformation can be represented in different ways, e.g., + .. as a rotation matrix or a quaternion. + + .. rectification + .. rectified + .. Rectification is a transformation process for images. In a stereo camera setting, + .. both images are often projected onto a common plane with parallel optical axes. + .. The resulting rectified images are free of lens distortion. Moreover, + .. an object point in the scene is always projected into the same row in both images. + .. The column index will be the same if the object point is at infinity. For closer + .. objects, the column index in the right image will be smaller than in the left image. + + SDK + A Software Development Kit (SDK) is a collection of software development tools or + a collection of software components. + + SLAM + SLAM stands for Simultaneous Localization and Mapping and describes the process of + creating a map of an unknown environment and simultaneously updating the sensor pose + within the map. + + SGM + SGM stands for Semi-Global Matching and is a state-of-the-art stereo matching algorithm + which offers brief run times and a great accuracy, especially at object borders, fine + structures, and in weakly textured areas. + + TCP + The Tool Center Point (TCP) is the position of the tool at the end effector of + a robot. The position and orientation of the TCP determines the position and + orientation of the tool in 3D space. + + UDP + The User Datagram Protocol (UDP) is the minimal message-oriented transport + layer of the Internet Protocol (:term:`IP`) family. It uses a simple + connectionless transmission model with a minimum of protocol mechanism + such as integrity verification (via checksum). The |rc_xxx| uses UDP + for publishing its + :ref:`estimated dynamical states `:latex:`\:(Section + \ref{dynamics:sect-dynamics-streams})` + via the + :ref:`rc_dynamics interface `:latex:`\:(Section + \ref{rc_dynamics:sect-rc-dynamics-interface})`. + To receive this data, applications may use datagram sockets to + bind to the endpoint of the data transmission consisting of a combination + of an :term:`IP address` and a service port number such as + ``192.168.0.100:49500``, which is typically referred to as a + *destination* of an rc_dynamics data stream in this documentation. + + URI + URL + A Uniform Resource Identifier (URI) is a string of characters + identifying resources of the |rc_xxx|'s |restapi|. An example of such a + URI is ``/nodes/rc_camera/parameters/fps``, which points + to the ``fps`` run-time parameter of the stereo camera module. + + A Uniform Resource Locator (URL) additionally specifies the full + network location and protocol, i.e., an exemplary URL to locate the + above resource would be + ``https:///api/v1/nodes/rc_camera/parameters/fps`` + where ```` refers to the |rc_xxx|'s :term:`IP address`. + + XYZABC + Format to represent a pose. See :ref:`sect-xyzabc-format`:latex:`\:(Section \ref{pose_format_kuka:sect-xyzabc-format})` + for its definition. + + XYZ+quaternion + Format to represent a pose. See :ref:`sect-xyz-quaternion-format`:latex:`\:(Section \ref{pose_format_rt:sect-xyz-quaternion-format})` + for its definition. + + +.. only:: rc_cube or rc_visard_ng + + .. glossary:: + :sorted: + + DHCP + The Dynamic Host Configuration Protocol (DHCP) is used to automatically assign an + :term:`IP` address to a network device. Some DHCP servers only accept known devices. + In this case, an administrator needs to configure the DHCP server with the + fixed :term:`MAC address` of a device. + + .. disparity + .. disparity image + .. Disparity is the displacement of the projections of an object point in two camera + .. images. If the images are :term:`rectified`, then the disparity is the difference + .. between the column index of the projection in the left image and the column index + .. of the projection in the right image. The disparity is inversely proportional to + .. the distance (i.e., depth) + .. of the object point from the camera and becomes 0 if the object point is at infinity. + .. A disparity image contains disparities for each pixel. + + DNS + mDNS + The Domain Name Server (DNS) manages the host names and :term:`IP` addresses of all + network devices. It is responsible for resolving the host name into the IP address for + communication with a device. A DNS can be configured to get this information + automatically when a device appears on a network or manually by an administrator. In + contrast, *multicast DNS* (mDNS) works without a central server by querying all devices + on a local network each time a host name needs to be resolved. mDNS is available by + default on Linux and Mac operating systems and is used when '.local' is appended to a host + name. + + DOF + The Degrees Of Freedom (DOF) are the number of independent parameters for translation + and rotation. In 3D space, 6 DOF (i.e. three for translation and three rotation) are + sufficient to describe an arbitrary position and orientation. + + GenICam + GenICam is a generic standard interface for cameras. It serves as a unified interface + around other standards such as :term:`GigE Vision`, Camera Link, USB, etc. See + http://genicam.org for more information. + + GigE + Gigabit Ethernet (GigE) is a networking technology for transmitting data at + one gigabit per second. + + GigE Vision + GigE Vision\ |reg| is a standard for configuring cameras and transmitting images over a + :term:`GigE` network link. See http://gigevision.com for more information. + + IP + IP address + The Internet Protocol (IP) is a standard for sending data between devices in a computer + network. Every device requires an IP address, which must be unique in the network. + The IP address can be configured by :term:`DHCP`, :term:`Link-Local`, or manually. + + Link-Local + Link-Local is a technology where network devices associate themselves with an :term:`IP address` + from the 169.254.0.0/16 IP range and check if it is unique in the local network. + Link-Local can be used if + :term:`DHCP` is unavailable and manual IP configuration is not or cannot be done. + Link-Local is especially useful for connecting a network device directly to a + host computer. By default, Windows 10 reverts automatically to Link-Local if + DHCP is unavailable. Under Linux, Link-Local must be enabled manually in the network + manager. + + MAC address + The Media Access Control (MAC) address is a unique, persistent address for + networking devices. It is also known as the hardware address of a device. In contrast + to the :term:`IP address`, the MAC address is (normally) permanently given to + a device and does not change. + + NTP + The Network Time Protocol (NTP) is a TCP/IP protocol for synchronizing time over a network. + Basically a client requests the current time from a server, and uses it to set its own clock. + + .. pose + .. A pose represents an object's *position* and *orientation* + .. relative to some *reference coordinate system* or *reference frame*. + .. It can be described by means of a rotation and translation transformation + .. that brings the object from a reference pose to the observed pose. + .. This rotation transformation can be represented in different ways, e.g., + .. as a rotation matrix or a quaternion. + + .. rectification + .. rectified + .. Rectification is a transformation process for images. In a stereo camera setting, + .. both images are often projected onto a common plane with parallel optical axes. + .. The resulting rectified images are free of lens distortion. Moreover, + .. an object point in the scene is always projected into the same row in both images. + .. The column index will be the same if the object point is at infinity. For closer + .. objects, the column index in the right image will be smaller than in the left image. + + SDK + A Software Development Kit (SDK) is a collection of software development tools or + a collection of software components. + + SGM + SGM stands for Semi-Global Matching and is a state-of-the-art stereo matching algorithm + which offers short run times and a great accuracy, especially at object borders, fine + structures, and in weakly textured areas. + + TCP + The Tool Center Point (TCP) is the position of the tool at the end effector of + a robot. The position and orientation of the TCP determines the position and + orientation of the tool in 3D space. + + URI + URL + A Uniform Resource Identifier (URI) is a string of characters + identifying resources of the |rc_xxx|'s |restapi|. An example of such a + URI is ``/nodes/rc_camera/parameters/fps``, which points + to the ``fps`` run-time parameter of the stereo camera module. + + A Uniform Resource Locator (URL) additionally specifies the full + network location and protocol, i.e., an exemplary URL to locate the + above resource would be + ``https:///api/v1/nodes/rc_camera/parameters/fps`` + where ```` refers to the |rc_xxx|'s :term:`IP address`. + + XYZABC + Format to represent a pose. See :ref:`sect-xyzabc-format`:latex:`\:(Section \ref{pose_format_kuka:sect-xyzabc-format})` + for its definition. + + XYZ+quaternion + Format to represent a pose. See :ref:`sect-xyz-quaternion-format`:latex:`\:(Section \ref{pose_format_rt:sect-xyz-quaternion-format})` + for its definition. diff --git a/v24.04/en/_raw_sources/gripper_db.rst.txt b/v24.04/en/_raw_sources/gripper_db.rst.txt new file mode 100644 index 0000000..1dbcf2f --- /dev/null +++ b/v24.04/en/_raw_sources/gripper_db.rst.txt @@ -0,0 +1,331 @@ +.. include:: global_rst.glb + +.. _sect-gripper-db: + +GripperDB +========= + +.. index:: ! GripperDB + single: collision check + +Introduction +------------ + +The GripperDB module (gripper database module) is an optional on-board module of the |rcxxx| and is licensed with +any of the modules |pick_modules| or |match_modules|. +Otherwise it requires a separate CollisionCheck :ref:`license` +:latex:`(Section \ref{maintenance:sect-updating-license})` to be purchased. + +The module provides services to set, retrieve and delete grippers which can then be used +for checking collisions with a load carrier or other detected objects +(only in combination with |match_modules|). The specified grippers are available for all +modules supporting collision checking on the |rc_xxx|. + +.. only:: rc_cube + + .. note:: + + This module is global on the |rc_cube|. Changes to its settings or parameters affect + every camera pipeline running on the |rc_cube|. + +.. tabularcolumns:: |l|L| +.. _tab-collisioncheck-spec: +.. csv-table:: Specifications of the GripperDB module + + "Max. number of grippers", "50" + "Supported gripper element geometries", "Box, Cylinder, CAD Element" + "Max. number of elements per gripper", "15" + "Collision checking available in", "|pick_modules|, |match_modules|" + +.. _sect-gripper-db-gripper: + +Setting a gripper +------------------ + +The gripper is a collision geometry used to determine whether the grasp is in collision with the load carrier. +The gripper consists of up to 15 elements connected to each other. + +At this point, the gripper can be built of elements of the following types: + + - ``BOX``, with dimensions ``box.x``, ``box.y``, ``box.z``. + - ``CYLINDER``, with radius ``cylinder.radius`` and height ``cylinder.height``. + - ``CAD``, with the id ``cad.id`` of the chosen CAD element. + +Additionally, for each gripper the flange radius, and information about the Tool Center Point (TCP) have to +be defined. + +The configuration of the gripper is normally performed offline during the setup of the desired application. +This can be done via the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` or the |rcxxx| +:ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})`. + +.. _sect-collisioncheck-flange: + +Robot flange radius +^^^^^^^^^^^^^^^^^^^ + +Collisions are checked only with the gripper, the robot body is not considered. +As a safety feature, to prevent collisions between the load carrier and the robot, all grasps having any part of the +robot's flange inside the load carrier can be designated as colliding (see :numref:`fig-collision-check-gripper-flange-radius`). +This check is based on the defined gripper geometry and the flange radius value. It is optional to use +this functionality, and it can be turned on and off with the CollisionCheck module's run-time parameter ``check_flange`` as described +in :ref:`sect-collisioncheck-parameters`:latex:`\:(Section \ref{collisioncheck:sect-collisioncheck-parameters})`. + +.. _fig-collision-check-gripper-flange-radius: +.. figure:: images/check_flange.* + :width: 50% + :align: center + + Case A would be marked as collision only if ``check_flange`` is true, because the robot's flange (red) is inside the + load carrier. Case B is collision free independent of ``check_flange``. + + +.. _sect-collisioncheck-cad-elements: + +Uploading gripper CAD elements +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A gripper can consist of boxes, cylinders and CAD elements. While boxes and cylinders can be parameterized when +the gripper is created, the CAD elements must be uploaded beforehand to be available during gripper creation. +A CAD element can be uploaded via the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` as described +in Section :ref:`sect-collisioncheck-cad-element-upload`:latex:`\:(Section \ref{gripper_db:sect-collisioncheck-cad-element-upload})` +or via the |rcxxx| :ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})`. +Supported file formats are STEP (\*.stp, \*.step), STL (\*.stl), OBJ (\*.obj) and PLY (\*.ply). +The maximum file size to be uploaded is limited to :visardonly:`10` :ngonly:`30` :cubeonly:`30` MB. +The files are internally converted to PLY and, if necessary, simplified. +The CAD elements can be referenced during gripper creation by their ID. + +.. _sect-collisioncheck-gripper-creation: + +Creating a gripper via the |rest-api| or the |webgui| +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When creating a gripper via the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` or the +:ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})`, +each element of the gripper has a `parent` element, which defines how they are connected. +The gripper is always built in the direction from the robot flange to the TCP, and at least one element must +have 'flange' as parent. The elements' IDs must be unique and must not be 'tcp' or 'flange'. +The pose of the child element has to be given in the coordinate frame of the parent element. +The coordinate frame of an element is always in its +geometric center. Accordingly, for a child element to be exactly below the parent element, the position of +the child element must be computed from the heights of both parent and child element +(see :numref:`fig-collision-check-gripper-frames-restapi`). + +.. _fig-collision-check-gripper-frames-restapi: +.. figure:: images/gripper_frames_restapi.* + :width: 50% + :align: center + + Reference frames for gripper creation via the |rest-api| and the |webgui| + +In case a CAD element is used, the element's origin is defined in the CAD data and is not necessarily located +in the center of the element's bounding box. + +It is recommended to create a gripper via the |webgui|, because it provides a 3D visualization of the +gripper geometry and also allows to automatically attach the child element to the bottom of its parent element, when the +corresponding option for this element is activated. In this case, the elements also stay attached when +any of their sizes change. Automatic attachment of CAD elements uses the element's bounding box as reference. +Automatic attachment is only possible when the child element is not rotated around the x or y axis with respect to its parent. + +The reference frame for the first element for the gripper creation is always the center of the robot's flange +with the z axis pointing outwards. It is possible to create a gripper with a tree structure, +corresponding to multiple elements having the same parent element, as long as they are all connected. + +Calculated TCP position +^^^^^^^^^^^^^^^^^^^^^^^ + +After gripper creation via the ``set_gripper`` service call, the TCP position in the flange coordinate +system is calculated and returned as ``tcp_pose_flange``. +It is important to check if this value is the same as the robot's true TCP position. When creating a +gripper in the |webgui| the current TCP position is always displayed in the 3D gripper visualization. + +Creating rotationally asymmetric grippers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +For grippers which are not rotationally symmetric around the z axis, it is crucial to ensure that the gripper is properly mounted, +so that the representation stored in the GripperDB module corresponds to reality. + +.. _sect-collisioncheck-services: + +Services +-------- + +The GripperDB module is called ``rc_gripper_db`` in the |rest-api| and is represented in the +:ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})` under +:menuselection:`Database --> Grippers`. +The user can explore and call the GripperDB module's services, +e.g. for development and testing, using the +:doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` or +the |webgui|. + +The GripperDB module offers the following services. + +.. _expl-gripper-db-srv-set-gripper: + +``set_gripper`` +^^^^^^^^^^^^^^^ + + Persistently stores a gripper on the |rc_xxx|. + All configured grippers are persistent over firmware updates and rollbacks. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v2/nodes/rc_gripper_db/services/set_gripper + + .. tabs:: + + .. tab:: **Request** + + Required arguments: + + ``elements``: list of geometric elements for the gripper. + Each element must be of ``type`` 'CYLINDER' or 'BOX' with the corresponding dimensions in + the ``cylinder`` or ``box`` field, or of type 'CAD' with the corresponding ``id`` in the ``cad`` field. + The pose of each element must be given in the coordinate frame + of the parent element (see :ref:`sect-gripper-db-gripper`:latex:`\:(Section \ref{gripper_db:sect-gripper-db-gripper})` + for an explanation of the coordinate frames). The element's ``id`` must be unique and must not be + 'tcp' or 'flange'. The ``parent_id`` is the ID of the parent element. It can either be 'flange' + or it must correspond to another element in list. + + ``flange_radius``: radius of the flange used in case the ``check_flange`` run-time parameter is active. + + ``id``: unique name of the gripper + + ``tcp_parent_id``: ID of the element on which the TCP is defined + + ``tcp_pose_parent``: The pose of the TCP with respect to the coordinate frame of the element specified in ``tcp_parent_id``. + + .. include:: _gen/nodes/services/rc_collision_check_set_gripper_request.txt + + .. tab:: **Response** + + ``gripper``: returns the gripper as defined in the request with an additional field ``tcp_pose_flange``. + This gives the coordinates of the TCP in the flange coordinate frame for comparison with the true + settings of the robot's TCP. + + ``return_code``: holds possible warnings or error codes and messages. + + .. include:: _gen/nodes/services/rc_collision_check_set_gripper_response.txt + +.. _expl-gripper-db-srv-get-grippers: + +``get_grippers`` +^^^^^^^^^^^^^^^^ + + Returns the configured grippers with the requested ``gripper_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v2/nodes/rc_gripper_db/services/get_grippers + + .. tabs:: + + .. tab:: **Request** + + If no ``gripper_ids`` are provided, all configured grippers are returned. + + .. include:: _gen/nodes/services/rc_collision_check_get_grippers_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_collision_check_get_grippers_response.txt + +.. _expl-gripper-db-srv-delete-grippers: + +``delete_grippers`` +^^^^^^^^^^^^^^^^^^^ + + Deletes the configured grippers with the requested ``gripper_ids``. + + .. toggle-header:: + :header: **Details** + + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v2/nodes/rc_gripper_db/services/delete_grippers + + .. tabs:: + + .. tab:: **Request** + + All grippers to be deleted must be explicitly stated in ``gripper_ids``. + + .. include:: _gen/nodes/services/rc_collision_check_delete_grippers_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_collision_check_delete_grippers_response.txt + + +.. _sect-gripper-db-return-codes: + +Return codes +------------ + +.. index:: + pair: GripperDB; return codes + + +Each service response contains a ``return_code``, +which consists of a ``value`` plus an optional ``message``. +A successful service returns with a ``return_code`` value of ``0``. +Negative ``return_code`` values indicate that the service failed. +Positive ``return_code`` values indicate that the service succeeded with additional information. +The smaller value is selected in case a service has multiple ``return_code`` values, +but all messages are appended in the ``return_code`` message. + +The following table contains a list of common codes: + +.. tabularcolumns:: |c|L| +.. _tab-collisioncheck-return-codes: +.. csv-table:: Return codes of the GripperDB services + :header: Code, Description + + "0", "Success" + "-1", "An invalid argument was provided" + "-7", "Data could not be read or written to persistent storage" + "-9", "No valid license for the module" + "-10", "New gripper could not be added as the maximum storage capacity of grippers has been exceeded" + "10", "The maximum storage capacity of grippers has been reached" + "11", "Existing gripper was overwritten" + +.. _sect-collisioncheck-cad-element-upload: + +CAD element API +--------------- + +.. index:: + single: gripper CAD element api + single: gripper CAD element download + single: gripper CAD element upload + single: gripper CAD element deletion + +For gripper CAD element upload, download, listing and removal, special |rest-api| endpoints are provided. +CAD elements can also be uploaded, downloaded and removed via the |webgui|. +Up to 50 CAD elements can be stored persistently on the |rc_xxx|. + +The maximum file size to be uploaded is limited to :visardonly:`10` :cubeonly:`30` MB. + +.. only:: rc_visard + + .. include:: _gen/swagger/rc_visard/cad.txt + +.. only:: rc_visard_ng + + .. include:: _gen/swagger/rc_visard_ng/cad.txt + +.. only:: rc_cube + + .. include:: _gen/swagger/rc_cube/cad.txt diff --git a/v24.04/en/_raw_sources/grpc.rst.txt b/v24.04/en/_raw_sources/grpc.rst.txt new file mode 100644 index 0000000..edc325b --- /dev/null +++ b/v24.04/en/_raw_sources/grpc.rst.txt @@ -0,0 +1,83 @@ +.. include:: global_rst.glb + +.. _sect-grpc: + +gRPC image stream interface +=========================== + +.. index:: + single: gRPC + +The gRPC image streaming interface can be used as an alternative to the +:ref:`GigE Vision / GenICam interface `:latex:`\ (Section \ref{gigevision:sect-genicam})` +for getting camera images and synchronized sets of images (e.g. left camera +image and corresponding disparity image). `gRPC `_ is a +remote procedure call system that also +supports streaming. It uses `Protocol Buffers `_ +(see https://developers.google.com/protocol-buffers/) +as interface description language and data serialization. For a gRPC +introduction and more details please see the official website (https://grpc.io/). + +The advantages of the gRPC interface in comparison to GigE Vision are: + + * It is simpler to use in own programs than GigE Vision. + * There is gRPC support for a lot of programming languages (see https://grpc.io/). + * The communication is based on TCP instead of UDP and therefore it also works over less stable networks, e.g. WLAN. + +The disadvantages of the gRPC interface in comparison to GigE Vision are: + + * It does not support changing parameters, but the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` can be used for changing parameters. + * It is not a standard vision interface like GigE Vision. + +.. only:: rc_cube + + The |rc_xxx| provides synchronized image sets via gRPC server side streams on + a separate port for each pipeline. The port is 50051 + pipeline number, + so 50051 for pipeline 0, 50052 for pipeline 1, etc. + +.. only:: rc_visard or rc_visard_ng + + The |rc_xxx| provides synchronized image sets via gRPC server side streams on + port 50051. + +The communication is started by sending an ``ImageSetRequest`` +message to the server. The message contains the information about requested +images, i.e. left, right, disparity, confidence and disparity_error images can +be enabled separately. + +After getting the request, the server starts continuously sending ``ImageSet`` +messages that contain all requested images with all parameters necessary for +interpreting the images. The images that are contained in an ``ImageSet`` +message are synchronized, i.e. they are all captured at the same time. The only +exception to this rule is if the +:ref:`out1_mode `:latex:`\ (Section \ref{iocontrol:expl-iocontrol-out1-mode})` +is set to ``AlternateExposureActive``. In this case, the camera and disparity +images are taken 40 ms apart, so that the GPIO Out1 is LOW when the +left and right images are taken, and HIGH for the disparity, confidence and +error images. This mode is useful when a random dot projector is used, +because the projector would be off for capturing the left and +right image, and on for the disparity image, which results in undisturbed camera +images and a much denser and more accurate disparity image. + +Streaming of images is done until the client closes the connection. + +gRPC service definition +----------------------- + +.. _protobuf-image-interface: + +.. literalinclude:: _protobuf/image_interface.proto + :language: protobuf + +Image stream conversions +------------------------ + +The conversion of disparity images into a point cloud can be done as described in the +:ref:`GigE Vision / GenICam interface `:latex:`\ (Section \ref{gigevision:sect-image-stream-conversions})`. + +.. only:: roboception or schunk or matrixvision + + Example client + -------------- + + A simple example C++ client can be found at https://github.com/roboception/grpc_image_client_example. diff --git a/v24.04/en/_raw_sources/handeye_calibration.rst.txt b/v24.04/en/_raw_sources/handeye_calibration.rst.txt new file mode 100644 index 0000000..b0cb9f9 --- /dev/null +++ b/v24.04/en/_raw_sources/handeye_calibration.rst.txt @@ -0,0 +1,1235 @@ + +.. include:: global_rst.glb + +.. _sect-handeye-calibration: + +Hand-eye calibration +==================== + +.. index:: + pair: hand-eye calibration; robot frame + pair: hand-eye calibration; external reference frame + +For applications, in which the camera is integrated into one or more +robot systems, it needs to be calibrated w.r.t. some robot +reference frames. For this purpose, the |rcxxx| is shipped with an on-board +calibration routine called the *hand-eye calibration* module. It is a base +module which is available on every |rcxxx|. + +.. only:: rc_cube + + .. note:: + + This module is pipeline specific. Changes to its settings or parameters only affect + the respective camera pipeline and have no influence on other pipelines running on the |rc_cube|. + +.. note:: The implemented calibration routine is + completely agnostic about the user-defined robot frame to which the camera is + calibrated. It might be a robot's end-effector (e.g., flange or tool + center point) or any point on the robot structure. + The method's only requirement is that the pose (i.e., translation and + rotation) of this robot + frame w.r.t. a user-defined external reference frame (e.g., world or robot + mounting point) is exactly observable by the robot controller and can be + reported to the calibration module. + +The +:ref:`sect-handeye-calibration-procedure` +:latex:`\:(Section \ref{handeye_calibration:sect-handeye-calibration-procedure})` +itself is an easy-to-use multi-step procedure using +a calibration grid which can be obtained from |company|. + +Calibration interfaces +---------------------- + +The following two interfaces are offered to conduct hand-eye +calibration: + +#. All services and parameters of this module required to conduct the + hand-eye calibration **programmatically** are exposed by the |rcxxx|'s + :ref:`sect-rest-api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`. + The respective node name of this module is ``rc_hand_eye_calibration`` + and the respective service calls are documented + :ref:`sect-handeye-calibration-services`:latex:`\:(Section \ref{handeye_calibration:sect-handeye-calibration-services})`. + + .. note:: The described approach requires a network connection + between the |rcxxx| and the robot controller to + pass robot poses from the controller to the |rcxxx|'s + calibration module. + +#. For use cases where robot poses cannot be passed programmatically to the + |rcxxx|'s hand-eye calibration module, the + :ref:`Web GUI`'s *Hand-Eye Calibration* page under *Configuration* + :cubeonly:`in the desired pipeline` + offers a guided + process to conduct the calibration routine **manually**. + + .. note:: During the process, the described approach requires the user to + manually enter into the |webgui| robot poses, which need to be accessed + from the respective robot-teaching or handheld device. + + +.. _sect-handeyecalib-mounting: + +Camera mounting +--------------- + +.. index:: + pair: hand-eye calibration; mounting + +As illustrated in :numref:`fig-sketch-handeyecalib-robot-mounted` and +:numref:`fig-sketch-handeyecalib-static`, two different use +cases w.r.t. to the mounting of the camera generally have to be considered: + +a. The camera is **mounted on the robot**, i.e., it is mechanically fixed + to a robot link (e.g., at its flange or a flange-mounted tool), and + hence moves with the robot. + +#. The camera is not mounted on the robot but is fixed + to a table or other place in the robot's vicinity and remains at a **static** position + w.r.t. the robot. + +While the general +:ref:`sect-handeye-calibration-procedure`:latex:`\:(Section +\ref{handeye_calibration:sect-handeye-calibration-procedure})` is very similar +in both use cases, +the calibration process's output, i.e., the resulting calibration transform, +will be semantically different, and the fixture of the calibration grid +will also differ. + + +Calibration with a robot-mounted camera + When calibrating a robot-mounted camera with the robot, the calibration + grid has to be secured in a static position w.r.t. the robot, e.g., on a table + or some other fixed-base coordinate system as sketched in + :numref:`fig-sketch-handeyecalib-robot-mounted`. + + .. warning:: It is extremely important that the calibration grid does not move + during step 2 of the + :ref:`sect-handeye-calibration-procedure`:latex:`\:(Section + \ref{handeye_calibration:sect-handeye-calibration-procedure})`. + Securely fixing its position + to prevent unintended movements such as those caused by + vibrations, moving cables, or the like is therefore strongly + recommended. + + The result of the calibration (step 3 of the + :ref:`sect-handeye-calibration-procedure`:latex:`, Section + \ref{handeye_calibration:sect-handeye-calibration-procedure}`) is a pose + :math:`\mathbf{T}^{\text{robot}}_{\text{camera}}` describing the + (previously unknown) relative positional and rotational transformation + from the *camera* frame into the user-selected *robot* frame such that + + .. math:: + :label: handeye-calib-robotmounted-result + + \mathbf{p}_{\text{robot}} = + \mathbf{R}^{\text{robot}}_{\text{camera}} + \cdot \mathbf{p}_{\text{camera}} + + \mathbf{t}^{\text{robot}}_{\text{camera}} + \:, + + where :math:`\mathbf{p}_{\text{robot}} = (x,y,z)^T` is a 3D point + with its coordinates expressed in the *robot* frame, + :math:`\mathbf{p}_{\text{camera}}` is the same point represented in the + *camera* coordinate frame, and :math:`\mathbf{R}^{\text{robot}}_{\text{camera}}` + as well as :math:`\mathbf{t}^{\text{robot}}_{\text{camera}}` are the + corresponding :math:`3\times 3` rotation matrix and :math:`3\times 1` + translation vector of the pose :math:`\mathbf{T}^{\text{robot}}_{\text{camera}}`, + respectively. In practice, in the calibration result and in the provided robot + poses, the rotation is defined by Euler angles or as quaternion instead of + a rotation matrix (see :ref:`sect-pose-formats`:latex:`,\:Section \ref{appendix:sect-pose-formats}`). + + .. _fig-sketch-handeyecalib-robot-mounted: + .. figure:: images/sketch_handeye_calib_robotmounted.* + :width: 60 % + :align: center + + Important frames and transformations for calibrating a camera that + is mounted on a general robot. The camera is mounted with a fixed relative + position to a user-defined *robot* frame (e.g., flange or TCP). It is + important that the pose :math:`\mathbf{T}^{\text{ext}}_{\text{robot}}` of + this *robot* frame w.r.t. a user-defined external reference frame *ext* + is observable during the calibration routine. The result of the calibration + process is the desired calibration transformation + :math:`\mathbf{T}^{\text{robot}}_{\text{camera}}`, i.e., the pose of the + *camera* frame within the user-defined *robot* frame. + + Additional user input is required if the movement of the robot is constrained and + the robot can rotate the Tool Center Point (TCP) only + around one axis. This is typically the case for robots with four Degrees Of + Freedom (4DOF) that are often used for palletizing tasks. In this case, + the user must specify which axis of the *robot* frame is the rotation axis of the TCP. + Further, the signed offset from the TCP to the + *camera* coordinate system along the TCP rotation axis has to be provided. + :numref:`fig-sketch-handeyecalib-robot-mounted-4dof` illustrates the situation. + + .. only:: rc_visard or rc_visard_ng + + For the |rc_xxx|, the camera coordinate system is located in the optical + center of the left camera. The approximate location is given in section + :ref:`sect-coordinate-frames`:latex:`\:(Section \ref{hardware_spec:sect-coordinate-frames})`. + + .. only:: rc_cube + + For the |rc_visard| or |rc_visard_ng|, the camera coordinate system is located in the optical + center of the left camera. The approximate location is given in section + `Coordinate Frames `_. + + .. _fig-sketch-handeyecalib-robot-mounted-4dof: + .. figure:: images/sketch_handeye_calib_robotmounted_4dof.* + :width: 60 % + :align: center + + In case of a 4DOF robot, the TCP rotation axis and the offset from the + TCP to the camera + coordinate system along the TCP rotation axis must be provided. + In the illustrated case, this offset is negative. + +Calibration with a statically-mounted camera + In use cases where the camera is positioned statically w.r.t. the + robot, the calibration grid needs to be mounted to the robot as + shown for example in :numref:`fig-sketch-handeyecalib-static` and + :numref:`fig-sketch-handeyecalib-gridmount`. + + .. note:: The hand-eye calibration module is + completely agnostic about the exact mounting and positioning of the + calibration grid w.r.t. the user-defined *robot* frame. That means, + the relative positioning of the calibration grid to + that frame neither needs to + be known, nor it is relevant for the calibration routine, as shown in + :numref:`fig-sketch-handeyecalib-gridmount`. + + .. warning:: + It is extremely important that the calibration grid is attached + securely to the robot such that it does + not change its relative position w.r.t. the user-defined *robot* frame + during step 2 of the :ref:`sect-handeye-calibration-procedure`:latex:`\:(Section + \ref{handeye_calibration:sect-handeye-calibration-procedure})`. + + In this use case, the result of the calibration (step 3 of the + :ref:`sect-handeye-calibration-procedure`:latex:`, Section + \ref{handeye_calibration:sect-handeye-calibration-procedure}`) is the pose + :math:`\mathbf{T}^{\text{ext}}_{\text{camera}}` + describing the + (previously unknown) relative positional and rotational transformation + between the *camera* frame and the user-selected external reference frame *ext* + such that + + .. math:: + :label: handeye-calib-static-result + + \mathbf{p}_{\text{ext}} = + \mathbf{R}^{\text{ext}}_{\text{camera}} + \cdot \mathbf{p}_{\text{camera}} + + \mathbf{t}^{\text{ext}}_{\text{camera}} + \:, + + where :math:`\mathbf{p}_{\text{ext}} = (x,y,z)^T` is a 3D point + with its coordinates expressed in the external reference frame *ext*, + :math:`\mathbf{p}_{\text{camera}}` is the same point represented in the + *camera* coordinate frame, and :math:`\mathbf{R}^{\text{ext}}_{\text{camera}}` + as well as :math:`\mathbf{t}^{\text{ext}}_{\text{camera}}` are the + corresponding :math:`3\times 3` rotation matrix and :math:`3\times 1` + translation vector of the pose :math:`\mathbf{T}^{\text{ext}}_{\text{camera}}`, + respectively. In practice, in the calibration result and in the provided robot + poses, the rotation is defined by Euler angles or as quaternion instead of + a rotation matrix (see :ref:`sect-pose-formats`:latex:`,\:Section \ref{appendix:sect-pose-formats}`). + + .. _fig-sketch-handeyecalib-static: + .. figure:: images/sketch_handeye_calib_static.* + :width: 60 % + :align: center + + Important frames and transformations for calibrating a + statically mounted camera: The latter is mounted with a fixed + position relative to a user-defined external reference frame *ext* (e.g., + the world coordinate frame or the robot's mounting point). It is + important that the pose :math:`\mathbf{T}^{\text{ext}}_{\text{robot}}` of the + user-defined *robot* frame w.r.t. this frame + is observable during the calibration routine. The result of the calibration + process is the desired calibration transformation + :math:`\mathbf{T}^{\text{ext}}_{\text{camera}}`, i.e., the pose of the + *camera* frame in the user-defined external reference frame *ext*. + + .. _fig-sketch-handeyecalib-gridmount: + .. figure:: images/sketch_handeye_calib_gridmount.* + :width: 60 % + :align: center + + Alternate mounting options for attaching the + calibration grid to the robot + + Additional user input is required if the movement of the robot is constrained and + the robot can rotate the Tool Center Point (TCP) only + around one axis. This is typically the case for robots with four Degrees Of + Freedom (4DOF) that are often used for palletizing tasks. In this case, + the user must specify which axis of the *robot* frame is the rotation axis of the TCP. + Further, the signed offset from the TCP to the + visible surface of the calibration grid along the TCP rotation axis has to be provided. + The grid must be mounted such that the TCP rotation axis is orthogonal to the grid. + :numref:`fig-sketch-handeyecalib-robot-static-4dof` illustrates the situation. + + .. _fig-sketch-handeyecalib-robot-static-4dof: + .. figure:: images/sketch_handeye_calib_static_4dof.* + :width: 60 % + :align: center + + In case of a 4DOF robot, the TCP rotation axis and the offset from the + TCP to the visible surface of the grid along the TCP rotation axis must + be provided. In the illustrated case, this offset is negative. + + +.. _sect-handeye-calibration-procedure: + +Calibration routine +------------------- + +.. index:: + pair: hand-eye calibration; calibration + +The hand-eye calibration can be performed manually using the +:doc:`webgui`:latex:`\:(Section \ref{webgui:sect-web-gui})` or programmatically +via the :ref:`sect-rest-api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`. +The general calibration routine will be described by following the steps of the +hand-eye calibration wizard provided on the |webgui|. +This wizard can be found in the |rc_xxx|'s |webgui| :cubeonly:`in the desired pipeline` +under :menuselection:`Configuration --> Hand-Eye Calibration`. References +to the corresponding |rest-api| calls are provided at the appropriate places. + +Step 1: Hand-Eye Calibration Status +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +The starting page of the hand-eye calibration wizard shows the current status +of the hand-eye calibration. +If a hand-eye calibration is saved on the |rc_xxx|, the calibration transformation is displayed here +(see :numref:`fig-handeyecalib-webgui1`). + + .. _fig-handeyecalib-webgui1: + .. figure:: images/webgui_hand_eye_calib1_calib.png + :width: 100 % + :align: center + + Current status of the hand-eye calibration in case a hand-eye calibration is saved + +To query the hand-eye calibration status programmatically, the module's |restapi| +offers the ``get_calibration`` service call (see +:ref:`sect-handeye-calibration-services`:latex:`, Section \ref{handeye_calibration:sect-handeye-calibration-services}`). +An existing hand-eye calibration can be removed by pressing +:guilabel:`Remove Calibration` or using ``remove_calibration`` in the |rest-api| (see +:ref:`sect-handeye-calibration-services`:latex:`, Section \ref{handeye_calibration:sect-handeye-calibration-services}`). + +To start a new hand-eye calibration, click on :guilabel:`Perform Hand-Eye Calibration` or :guilabel:`Next`. + +Step 2: Checking Grid Detection +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To achieve good calibration results, the images should be +well exposed so that the calibration +grid can be detected accurately and reliably. In this step, the +grid detection can be checked and the camera settings +can be adjusted if necessary. In case parts of the calibration grid +are overexposed, the respective squares of the calibration grid will be +highlighted in red. A successful grid detection is visualized +by green check marks on every square of the calibration grid and a thick green +border around the grid as shown in :numref:`fig-handeyecalib-webgui2`. + + .. _fig-handeyecalib-webgui2: + .. figure:: images/webgui_hand_eye_calib2.png + :width: 100 % + :align: center + + Checking the calibration grid detection + +Step 3: Record Poses +^^^^^^^^^^^^^^^^^^^^ +In this step, the user records images of the calibration grid at several +different robot poses. These poses must each ensure that the +calibration grid is completely visible in the left camera image. +Furthermore, the robot poses +need to be selected properly to achieve a variety of different +perspectives for the camera to perceive the calibration grid. +:numref:`fig-handeyecalib-poses` shows a schematic recommendation of four +different grid positions which should be recorded from a close and a far +point of view, resulting in eight images for the calibration. + +.. _fig-handeyecalib-poses: +.. figure:: images/handeyecalib-alldraw.png + :width: 70 % + :align: center + + Recommended views on the calibration grid during the calibration procedure. + In case of a 4DOF robot, other views have to be chosen, which should be as + different as possible. + +.. warning:: Calibration quality, i.e., the accuracy of the + calculated calibration result, depends on the calibration-grid views provided. + The more diverse the perspectives are, the better + is the calibration. Choosing very similar views, i.e., varying + the robot pose only slightly before recording a new calibration pose, may lead to + inaccurate estimation of the desired calibration transformation. + +.. index:: + pair: hand-eye calibration; slot + +After the robot reaches each calibration pose, the +corresponding pose :math:`\mathbf{T}^{\text{ext}}_{\text{robot}}` +of the user-defined *robot* frame in the user-defined +external reference frame *ext* needs to be reported +to the hand-eye calibration module. For this purpose, the module +offers different *slots* to store the reported poses and the +corresponding left camera images. +All filled slots will then be used to +calculate the desired calibration transformation between the +*camera* frame and either the user-defined *robot* frame +(robot-mounted camera) or the user-defined external reference frame *ext* +(static camera). + +In the |webgui|, the user can choose between many different pose formats for providing the +calibration poses (see :ref:`sect-pose-formats`:latex:`,\:Section \ref{appendix:sect-pose-formats}`). +When calibrating using the |rest-api|, the poses are always +given in *XYZ+quaternion*. +The |webgui| offers eight slots (*Close View 1*, +*Close View 2*, etc.) for the user to fill manually with robot poses. +Next to each slot, a figure suggests a respective dedicated viewpoint on the grid. +For each slot, the robot should be operated to achieve the suggested view. + +.. _fig-handeyecalib-webgui3: +.. figure:: images/webgui_hand_eye_calib3.png + :width: 100 % + :align: center + + Filling the first slot in the hand-eye calibration process for a + statically mounted camera + +To record a calibration pose, click on :guilabel:`Set Pose` for the respective slot +and enter the *robot* frame's pose into the respective text fields. The pose is +then stored with the corresponding camera image +by clicking the :guilabel:`Take Picture to Proceed` button. This will save +the calibration pose in the respective slot. + +To transmit the poses programmatically, the module's |restapi| +offers the ``set_pose`` service call (see +:ref:`sect-handeye-calibration-services`:latex:`, Section \ref{handeye_calibration:sect-handeye-calibration-services}`). + +.. note:: The user's acquisition of robot pose data + depends on the robot model and manufacturer -- it might be read from a + teaching or handheld device, which is shipped with the robot. + +.. warning:: Please be careful to correctly and accurately enter the + values; even small variations or typos may lead to + calibration-process failure. + +The |webgui| displays the currently saved poses (only with slot numbers from 0 to 7) +with their camera images and also allows to delete them by clicking +*Delete Pose* to remove a single pose, or clicking :guilabel:`Clear all Poses` to remove all poses. +In the |rest-api| the currently stored poses can be retrieved via ``get_poses`` and removed +via ``delete_poses`` for single poses or ``reset_calibration`` for removing all poses +(see :ref:`sect-handeye-calibration-services`:latex:`, Section \ref{handeye_calibration:sect-handeye-calibration-services}`). + +When at least four poses are set, the user can continue to the computation of the calibration result +by pressing :guilabel:`Next`. + +.. Complying to the +.. suggestions to observe the grid from close and far distance from +.. different viewing angles as sketched in :numref:`fig-handeyecalib-poses`, in this +.. example the following corresponding camera images have been sent to the +.. hand-eye calibration module with their associated robot pose: + +.. .. _fig-handeyecalib-images: +.. .. figure:: images/handeyecalib-allpics.png +.. :width: 100 % +.. :align: center + +.. Recorded camera images as input for the calibration procedure + +.. NOTE:: To successfully calculate the hand-eye calibration + transformation, at least four different robot calibration + poses need to be reported and stored in slots. + However, to prevent errors induced by possible + inaccurate measurements, at least **eight calibration poses are + recommended**. + +Step 4: Compute Calibration +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Before computing the calibration result, the user has to provide the correct calibration +parameters. These include the exact calibration grid dimensions and the sensor mounting type. +The |webgui| also offers settings for calibrating +4DOF robots. In this case, the rotation axis, as well as the offset from +the TCP to the camera coordinate system (robot-mounted camera) +or grid surface (statically mounted camera) must be given. +For the |restapi|, the respective parameters are listed in +:ref:`sect-handeye-calibration-params`:latex:`\:(Section +\ref{handeye_calibration:sect-handeye-calibration-params})`. + +.. _fig-handeyecalib-webgui4: +.. figure:: images/webgui_hand_eye_calib4.png + :width: 100 % + :align: center + + Defining hand-eye calibration parameters and computing the calibration result via the |rcxxx|'s |webgui| + +When the parameters are correct, the desired calibration transformation +can be computed from the collected poses and camera images by clicking +:guilabel:`Compute Calibration`. The |restapi| offers this functionality via the +``calibrate`` service call +(see :ref:`sect-handeye-calibration-services`:latex:`, Section \ref{handeye_calibration:sect-handeye-calibration-services}`). + +Depending on the way the camera is mounted, the calibration result contains the +transformation (i.e., the pose) between the *camera* frame and +either the user-defined *robot* frame (robot-mounted camera) +or the user-defined external reference frame *ext* +(statically mounted camera); see +:ref:`sect-handeyecalib-mounting`:latex:`\:(Section +\ref{handeye_calibration:sect-handeyecalib-mounting})`. + +.. index:: + pair: error; hand-eye calibration + +To enable users to judge the quality of the resulting calibration +transformation, the translational and rotational +calibration errors are reported, which are computed from the variance of the +calibration result. + +If the calibration error is not acceptable, the user can change the calibration +parameters and recompute the result, or return to step 3 of the +calibration procedure and add more poses or update poses. + +To save the calibration result, press :guilabel:`Save Calibration` or use the +|restapi| ``save_calibration`` service call +(see :ref:`sect-handeye-calibration-services`:latex:`, Section \ref{handeye_calibration:sect-handeye-calibration-services}`). + +.. _sect-handeye-calibration-params: + +Parameters +---------- + +.. index:: + pair: parameters; hand-eye calibration + +The hand-eye calibration module is called ``rc_hand_eye_calibration`` in the |rest-api| and is +represented in the +:ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})` +:cubeonly:`in the desired pipeline` under :menuselection:`Configuration --> Hand-Eye Calibration`. +The user can change the calibration parameters there or use the +:ref:`sect-rest-api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`. + +Parameter overview +^^^^^^^^^^^^^^^^^^ + +.. include:: _gen/nodes/params/rc_hand_eye_calibration.txt + +Description of run-time parameters +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The parameter descriptions are given with the corresponding |webgui| names in +brackets. + +.. _expl-hand-eye-calibration-grid-width: + +``grid_width`` (*Width*) +''''''''''''''''''''''''''''''''' + Width of the calibration grid in meters. The width should be given with + a very high accuracy, preferably with sub-millimeter accuracy. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/parameters?grid_width= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_hand_eye_calibration/parameters?grid_width= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/parameters?grid_width= + +.. _expl-hand-eye-calibration-grid-height: + +``grid_height`` (*Height*) +''''''''''''''''''''''''''''''''''' + Height of the calibration grid in meters. The height should be given + with a very high accuracy, preferably with sub-millimeter accuracy. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/parameters?grid_height= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_hand_eye_calibration/parameters?grid_height= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/parameters?grid_height= + +.. _expl-hand-eye-calibration-robot-mounted: + +``robot_mounted`` (*Sensor Mounting*) +''''''''''''''''''''''''''''''''''''' + If set to `true`, the camera is mounted on the robot. + If set to `false`, the camera is mounted statically and the calibration grid is mounted on the robot. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/parameters?robot_mounted= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_hand_eye_calibration/parameters?robot_mounted= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/parameters?robot_mounted= + +.. _expl-hand-eye-calibration-tcp-offset: + +``tcp_offset`` (*TCP Offset*) +''''''''''''''''''''''''''''' + The signed offset from the TCP to the camera coordinate system (robot-mounted sensor) + or the visible surface of the calibration grid (statically mounted sensor) along the + TCP rotation axis in meters. + This is required if the robot's movement is constrained and it + can rotate its TCP only around one axis (e.g., 4DOF robot). + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/parameters?tcp_offset= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_hand_eye_calibration/parameters?tcp_offset= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/parameters?tcp_offset= + +.. _expl-hand-eye-calibration-tcp-rotation-axis: + +``tcp_rotation_axis`` (*TCP Rotation Axis*) +''''''''''''''''''''''''''''''''''''''''''' + The axis of the *robot* frame around which the robot can rotate its TCP. + 0 is used for X, 1 for Y and 2 + for the Z axis. This is required if the robot's movement is constrained and it + can rotate its TCP only around one + axis (e.g., 4DOF robot). -1 means that the robot can rotate its TCP around two + independent rotation axes. ``tcp_offset`` is ignored in this case. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/parameters?tcp_rotation_axis= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_hand_eye_calibration/parameters?tcp_rotation_axis= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/parameters?tcp_rotation_axis= + +.. _sect-handeye-calibration-services: + +Services +-------- + +The |rest-api| service calls offered to programmatically conduct the +hand-eye calibration and to restore this module's parameters are +explained below. + +``get_calibration`` +^^^^^^^^^^^^^^^^^^^ + + returns the hand-eye calibration currently stored on the |rc_xxx|. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/get_calibration + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_hand_eye_calibration/services/get_calibration + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/get_calibration + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_get_calibration_request.txt + + .. tab:: **Response** + + The field ``error`` gives the calibration error in pixels which is computed from + the translational error ``translation_error_meter`` and the rotational error + ``rotation_error_degree``. This value is only given for compatibility with older + versions. The translational and rotational errors should be preferred. + + .. tabularcolumns:: |c|c|L| + .. csv-table:: Return codes of the ``get_calibration`` service call + :header: "``status``", "``success``", "Description" + + "0", "``true``", "returned valid calibration pose" + "2", "``false``", "calibration result is not available" + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_get_calibration_response.txt + +``remove_calibration`` +^^^^^^^^^^^^^^^^^^^^^^ + + removes the persistent hand-eye calibration on the |rcxxx|. + After this call the ``get_calibration`` service reports again that no hand-eye calibration is available. + This service call will also delete all the stored calibration poses and + corresponding camera images in the ``slots``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/remove_calibration + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_hand_eye_calibration/services/remove_calibration + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/remove_calibration + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_remove_calibration_request.txt + + .. tab:: **Response** + + .. tabularcolumns:: |c|c|L| + .. csv-table:: Return codes of the ``get_calibration`` service call + :header: "``status``", "``success``", "Description" + + "0", "``true``", "removed persistent calibration, device reports as uncalibrated" + "1", "``true``", "no persistent calibration found, device reports as uncalibrated" + "2", "``false``", "could not remove persistent calibration" + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_remove_calibration_response.txt + + +``set_pose`` +^^^^^^^^^^^^ + + allows to provide a robot pose as calibration pose to the hand-eye calibration + routine and records the current image of the calibration grid. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/set_pose + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_hand_eye_calibration/services/set_pose + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/set_pose + + .. tabs:: + + .. tab:: **Request** + + The ``slot`` argument is used to assign unique numbers to the different calibration + poses. The range for ``slot`` is from 0 to 15. At each instant when ``set_pose`` is called, an image is + recorded. This service call fails if the grid was undetectable in + the current image. + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_set_pose_request.txt + + .. tab:: **Response** + + .. tabularcolumns:: |c|c|L| + .. csv-table:: Return codes of the ``set_pose`` service call + :header: "``status``", "``success``", "Description" + + "1", "``true``", "pose stored successfully" + "3", "``true``", "pose stored successfully; collected enough poses for calibration, i.e., ready to calibrate" + "4", "``false``", "calibration grid was not detected, e.g., not fully visible in camera image" + "8", "``false``", "no image data available" + "12", "``false``", "given orientation values are invalid" + "13", "``false``", "invalid slot number" + + The field ``overexposed`` indicates if parts of the calibration grid were overexposed in this image. + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_set_pose_response.txt + +``get_poses`` +^^^^^^^^^^^^^ + + returns the robot poses that are currently stored for the hand-eye calibration routine. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/get_poses + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_hand_eye_calibration/services/get_poses + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/get_poses + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_get_poses_request.txt + + .. tab:: **Response** + + .. tabularcolumns:: |c|c|L| + .. csv-table:: Return codes of the ``get_poses`` service call + :header: "``status``", "``success``", "Description" + + "0", "``true``", "stored poses are returned" + "1", "``true``", "no calibration pose available" + + The field ``overexposed`` indicates if parts of the calibration grid were overexposed in this image. + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_get_poses_response.txt + + +``delete_poses`` +^^^^^^^^^^^^^^^^ + + deletes the calibration poses and corresponding images with the specified ``slots``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/delete_poses + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_hand_eye_calibration/services/delete_poses + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/delete_poses + + .. tabs:: + + .. tab:: **Request** + + The ``slots`` argument specifies which calibration poses should be deleted. + If no slots are provided, nothing will be deleted. + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_delete_poses_request.txt + + .. tab:: **Response** + + .. tabularcolumns:: |c|c|L| + .. csv-table:: Return codes of the ``delete_poses`` service call + :header: "``status``", "``success``", "Description" + + "0", "``true``", "poses successfully deleted" + "1", "``true``", "no slots given" + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_delete_poses_response.txt + + +``reset_calibration`` +^^^^^^^^^^^^^^^^^^^^^ + + deletes all previously provided poses and corresponding images. + The last saved calibration result is reloaded. + This service might be used to (re-)start the hand-eye calibration from scratch. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/reset_calibration + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_hand_eye_calibration/services/reset_calibration + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/reset_calibration + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_reset_calibration_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_reset_calibration_response.txt + +``calibrate`` +^^^^^^^^^^^^^ + + calculates and returns the hand-eye calibration transformation with the + robot poses configured by the ``set_pose`` service. + + .. toggle-header:: + :header: **Details** + + ``save_calibration`` + must be called to make the calibration available for other modules via + the ``get_calibration`` service call and to store it persistently. + + .. NOTE:: For calculating the hand-eye calibration + transformation at least four robot calibration poses are + required (see ``set_pose`` service). However, eight + calibration poses are recommended. + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/calibrate + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_hand_eye_calibration/services/calibrate + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/calibrate + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_calibrate_request.txt + + .. tab:: **Response** + + The field ``error`` gives the calibration error in pixels which is computed from + the translational error ``translation_error_meter`` and the rotational error + ``rotation_error_degree``. This value is only given for compatibility with older + versions. The translational and rotational errors should be preferred. + + .. tabularcolumns:: |c|c|L| + .. csv-table:: Return codes of the ``calibrate`` service call + :header: "``status``", "``success``", "Description" + + "0", "``true``", "calibration successful, returned calibration result" + "1", "``false``", "not enough poses to perform calibration" + "2", "``false``", "calibration result is invalid, please verify the input data" + "3", "``false``", "given calibration grid dimensions are not valid" + "4", "``false``", "insufficient rotation, ``tcp_offset`` and ``tcp_rotation_axis`` must be specified" + "5", "``false``", "sufficient rotation available, ``tcp_rotation_axis`` must be set to -1" + "6", "``false``", "poses are not distinct enough from each other" + + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_calibrate_response.txt + +``save_calibration`` +^^^^^^^^^^^^^^^^^^^^ + + persistently saves the result of hand-eye calibration to the |rcxxx| and overwrites + the existing one. The stored result can be retrieved any time by the + ``get_calibration`` service. This service call will also delete all the stored calibration poses and + corresponding camera images in the ``slots``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/save_calibration + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_hand_eye_calibration/services/save_calibration + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/save_calibration + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_save_calibration_request.txt + + .. tab:: **Response** + + .. tabularcolumns:: |c|c|L| + .. csv-table:: Return codes of the ``save_calibration`` service call + :header: "``status``", "``success``", "Description" + + "0", "``true``", "calibration saved successfully" + "1", "``false``", "could not save calibration file" + "2", "``false``", "calibration result is not available" + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_save_calibration_response.txt + +``set_calibration`` +^^^^^^^^^^^^^^^^^^^ + + sets the hand-eye calibration transformation with arguments of this call. + + .. toggle-header:: + :header: **Details** + + The calibration transformation is expected in the same format as returned by + the ``calibrate`` and ``get_calibration`` calls. The given calibration + information is also stored persistently on the sensor by internally calling + ``save_calibration``. + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/set_calibration + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_hand_eye_calibration/services/set_calibration + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/set_calibration + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_set_calibration_request.txt + + .. tab:: **Response** + + .. tabularcolumns:: |c|c|L| + .. csv-table:: Return codes of the ``set_calibration`` service call + :header: "``status``", "``success``", "Description" + + "0", "``true``", "setting the calibration transformation was successful" + "12", "``false``", "given orientation values are invalid" + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_set_calibration_response.txt + +``reset_defaults`` +^^^^^^^^^^^^^^^^^^ + + restores and applies the default values for this module's parameters + ("factory reset"). Does not affect the calibration result itself or any + of the ``slots`` saved during calibration. Only parameters such as the + grid dimensions and the mount type will be reset. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/reset_defaults + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_hand_eye_calibration/services/reset_defaults + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/reset_defaults + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_reset_defaults_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_hand_eye_calibration_reset_defaults_response.txt diff --git a/v24.04/en/_raw_sources/hardware_spec.rst.txt b/v24.04/en/_raw_sources/hardware_spec.rst.txt new file mode 100644 index 0000000..d64d654 --- /dev/null +++ b/v24.04/en/_raw_sources/hardware_spec.rst.txt @@ -0,0 +1,549 @@ +.. include:: global_rst.glb + +.. _sect-hardware-specification: + +Hardware specification +====================== + +.. NOTE:: The following hardware specifications are provided here as a general reference; differences with the product may exist. + +Scope of delivery +----------------- + +.. only:: roboception + + Standard delivery for an |rc_xxx| includes the |rc_xxx| sensor and a quickstart guide only. The full + manual is available in digital form and is always installed on the sensor, accessible through the + :ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})`, and available at + http://www.roboception.com/documentation. + +.. only:: matrixvision or schunk or basler + + Standard delivery for an |rc_xxx| includes the |rc_xxx| sensor and a quickstart guide only. The full + manual is available in digital form and is always installed on the sensor, accessible through the + :ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})`. + +.. Note:: The following items are not included in the delivery unless otherwise specified: + + - Couplings, adapters, mounts + - Power supply unit, cabling, and fuses + - Network cabling + + Please refer to :ref:`sect-accessories`:latex:`\:(Section \ref{accessories:sect-accessories})` for suggested third-party cable vendors. + +A connectivity kit can be purchased for the |rc_xxx|. It contains an M12 to RJ45 network cable, +24 V power supply, and a DC plug to M12 power adapter. Please refer to :ref:`sect-accessories`:latex:`\:(Section \ref{accessories:sect-accessories})` for details. + +.. Note:: The connectivity kit is intended only for initial setup, not for permanent installation + in industrial environment. + +The following picture shows the important parts of the |rc_xxx| which are referenced later in the documentation. + +.. index:: + pair: components; rc_visard + +.. figure:: images/rc_visard_parts.* + :width: 100% + :align: center + + Parts description + +Technical specification +----------------------- + +.. index:: + single: specifications; rc_visard + single: resolution + single: frame rate + +.. only:: rc_visard + + The common technical specifications for the |rc_xxx| variants are given in :numref:`tab-common-hardware-specifications`. + The |rc_xxx| 160 is available with two different types of lenses: 4 mm and 6 mm focal length. + The |rc_xxx| 65 is only available with 4 mm lenses. + + .. tabularcolumns:: |\X{5}{11}|\X{6}{11}| + + .. _tab-common-hardware-specifications: + + .. table:: Common technical specifications for both |rc_xxx| baselines + + +----------------------+---------------------------------------------------------------+ + | | |rc_xxx| 65 / |rc_xxx| 160 | + +======================+===============================================================+ + | Image resolution | 1280 x 960 pixel, color or monochrome | + +----------------------+---------------------------------------------------------------+ + | Field of view | | 4 mm lens: Horizontal: 61°, Vertical: 48° | + | | | 6 mm lens: Horizontal: 43°, Vertical: 33° | + +----------------------+---------------------------------------------------------------+ + | IR Cutoff | 650 nm | + +----------------------+---------------------------------------------------------------+ + | Depth image | | 1280 x 960 pixel (Full) @ 1 Hz (with StereoPlus license) | + | | | 640 x 480 pixel (High) @ 3 Hz | + | | | 320 x 240 pixel (Medium) @ 15 Hz | + | | | 214 x 160 pixel (Low) @ 25 Hz | + +----------------------+---------------------------------------------------------------+ + | Egomotion | |imu-rate|, low latency | + +----------------------+---------------------------------------------------------------+ + | Computing unit | Nvidia Tegra K1 | + +----------------------+---------------------------------------------------------------+ + | Power supply | 18 V to 30 V | + +----------------------+---------------------------------------------------------------+ + | Cooling | Passive | + +----------------------+---------------------------------------------------------------+ + + The |rc_xxx| 65 and |rc_xxx| 160 differ in their baselines, which affects depth range and resolution as well as the sensors' size and weight. + + .. tabularcolumns:: |\X{5}{11}|\X{3}{11}|\X{3}{11}| + + .. _tab-hardware-differences: + + .. table:: Differing technical specifications for the |rc_xxx| variants + + +-------------------+------------------------+------------------------+ + | | |rc_xxx| 65 | |rc_xxx| 160 | + +===================+========================+========================+ + | Baseline | 65 mm | 160 mm | + +-------------------+------------------------+------------------------+ + | Depth range | 0.2 m to infinity | 0.5 m to infinity | + +-------------------+------------------------+------------------------+ + | Size (W x H x L) | 135 mm x 75 mm x 96 mm | 230 mm x 75 mm x 84 mm | + +-------------------+------------------------+------------------------+ + | Mass | 0.68 kg | 0.84 kg | + +-------------------+------------------------+------------------------+ + + The combination of baselines and lens types leads to different + resolutions and accuracies. + + .. table:: Resolution and accuracy of the |rc_xxx| variants in millimeters with full + resolution stereo matching and random dot projection on non-reflective and + non-transparent objects. + + +------------------+----------------+------------------+-------------------+--------------------+ + | | distance (mm) | |rc_xxx| 65-4 | |rc_xxx| 160-4 | |rc_xxx| 160-6 | + +==================+================+==================+===================+====================+ + | lateral | | 200 | | 0.2 | | - | | - | + | resolution | | 500 | | 0.5 | | 0.5 | | 0.3 | + | (mm) | | 1000 | | 0.9 | | 0.9 | | 0.6 | + | | | 2000 | | 1.9 | | 1.9 | | 1.3 | + | | | 3000 | | 2.8 | | 2.8 | | 1.9 | + +------------------+----------------+------------------+-------------------+--------------------+ + | depth resolution | | 200 | | 0.04 | | - | | - | + | (mm) | | 500 | | 0.2 | | 0.1 | | 0.06 | + | | | 1000 | | 0.9 | | 0.4 | | 0.3 | + | | | 2000 | | 3.6 | | 1.5 | | 1.0 | + | | | 3000 | | 8.0 | | 3.3 | | 2.2 | + +------------------+----------------+------------------+-------------------+--------------------+ + | Average depth | | 200 | | 0.2 | | - | | - | + | accuracy (mm) | | 500 | | 0.9 | | 0.4 | | 0.3 | + | | | 1000 | | 3.6 | | 1.5 | | 1.0 | + | | | 2000 | | 14.2 | | 5.8 | | 3.9 | + | | | 3000 | | 32.1 | | 13.0 | | 8.8 | + +------------------+----------------+------------------+-------------------+--------------------+ + +.. only:: rc_visard_ng + + The technical specifications for the |rc_xxx| are given in :numref:`tab-common-hardware-specifications-ng`. + The frame rate for computing the depth image in High resolution (720 x 540 pixel) is significantly + higher when increasing the minimum distance to 1.2 meters. + + .. tabularcolumns:: |\X{5}{11}|\X{6}{11}| + + .. _tab-common-hardware-specifications-ng: + + .. table:: Technical specifications for the |rc_xxx| + + +----------------------+---------------------------------------------------------------+ + | | |rc_xxx| 160-6 | + +======================+===============================================================+ + | Image resolution | 1440 x 1080 pixel, monochrome | + +----------------------+---------------------------------------------------------------+ + | Field of view | | 6 mm lens: Horizontal: 43°, Vertical: 33° | + +----------------------+---------------------------------------------------------------+ + | IR Cutoff | 650 nm | + +----------------------+---------------------------------------------------------------+ + | Depth image | | 1440 x 1080 pixel (Full) @ 3 Hz | + | (with Minimum | | 720 x 540 pixel (High) @ 7 Hz | + | Distance of 0.5 m) | | 360 x 270 pixel (Medium) @ 25 Hz | + | | | 240 x 180 pixel (Low) @ 25 Hz | + +----------------------+---------------------------------------------------------------+ + | Depth image | | 1440 x 1080 pixel (Full) @ 3 Hz | + | (with Minimum | | 720 x 540 pixel (High) @ 16 Hz | + | Distance of 1.2 m) | | 360 x 270 pixel (Medium) @ 25 Hz | + | | | 240 x 180 pixel (Low) @ 25 Hz | + +----------------------+---------------------------------------------------------------+ + | Computing unit | Orin Nano 8GB | + +----------------------+---------------------------------------------------------------+ + | Power supply | 18 V to 30 V | + +----------------------+---------------------------------------------------------------+ + | Cooling | Passive | + +----------------------+---------------------------------------------------------------+ + | Baseline | 160 mm | + +----------------------+---------------------------------------------------------------+ + | Depth range | 0.5 m to infinity | + +----------------------+---------------------------------------------------------------+ + | Size (W x H x L) | 230 mm x 75 mm x 84 mm | + +----------------------+---------------------------------------------------------------+ + | Mass | 0.965 kg | + +----------------------+---------------------------------------------------------------+ + + The resolutions and accuracies at different distances are given in the following table. + + .. table:: Resolution and accuracy of the |rc_xxx| in millimeters with full + resolution stereo matching and random dot projection on non-reflective and + non-transparent objects. + + +------------------+----------------+------------------+ + | | distance (mm) | |rc_xxx| 160-6 | + +==================+================+==================+ + | lateral | | 500 | | 0.3 | + | resolution | | 1000 | | 0.6 | + | (mm) | | 2000 | | 1.1 | + | | | 3000 | | 1.7 | + +------------------+----------------+------------------+ + | depth resolution | | 500 | | 0.05 | + | (mm) | | 1000 | | 0.2 | + | | | 2000 | | 0.9 | + | | | 3000 | | 2.0 | + +------------------+----------------+------------------+ + | Average depth | | 500 | | 0.2 | + | accuracy (mm) | | 1000 | | 0.9 | + | | | 2000 | | 3.5 | + | | | 3000 | | 7.8 | + +------------------+----------------+------------------+ + +The |rc_xxx| can be equipped with on-board software modules for additional +features. These software modules can be ordered from the |company| and require a license update. + +.. index:: + single: dimensions; rc_visard + +.. only:: rc_visard + + .. figure:: images/rc_visard_65_general.* + :width: 160mm + :align: center + + Overall dimensions of the |rc_xxx| 65 + + +.. figure:: images/rc_visard_160_general.* + :width: 160mm + :align: center + + Overall dimensions of the |rc_xxx| 160 + +.. index:: + single: CAD model + +.. only:: roboception or matrixvision + + CAD models of the |rc_xxx| can be downloaded from http://www.roboception.com/download. The CAD models are provided as-is, + with no guarantee of correctness. When a material property of aluminum is assigned (density of :math:`2.76\mathrm{g\over{cm}^3}`), + the mass properties of the CAD model are within 5% of the actual product with respect to weight and center of mass, + and within 10% with respect to moment of inertia. + +.. only:: schunk + + CAD models of the |rc_xxx| can be downloaded from http://www.schunk.com/de_de/services/downloads/cad-ecad-daten. The CAD models are provided as-is, + with no guarantee of correctness. When a material property of aluminum is assigned (density of :math:`2.76\mathrm{g\over{cm}^3}`), + the mass properties of the CAD model are within 5% of the actual product with respect to weight and center of mass, + and within 10% with respect to moment of inertia. + + +Environmental and operating conditions +-------------------------------------- + +.. index:: + single: operating conditions + single: temperature range + single: humidity + single: protection class + single: IP54 + +The |rc_xxx| is designed for industrial applications. Always respect the storage, transport, and operating environmental +conditions outlined in :numref:`tab-hardware-environment`. + +.. tabularcolumns:: |\X{5}{11}|\X{6}{11}| + +.. _tab-hardware-environment: + +.. table:: Environmental conditions + + +---------------------------------------+-------------------------------------------------------+ + | | |rc_xxx| | + +=======================================+=======================================================+ + | Storage/Transport temperature | -25 °C to 70 °C | + +---------------------------------------+-------------------------------------------------------+ + | Operating temperature | 0 °C to 50 °C | + +---------------------------------------+-------------------------------------------------------+ + | Relative humidity (non condensing) | 20 % to 80 % | + +---------------------------------------+-------------------------------------------------------+ + | Vibration | 5 g | + +---------------------------------------+-------------------------------------------------------+ + | Shock | 50 g | + +---------------------------------------+-------------------------------------------------------+ + | Protection class | IP54 | + +---------------------------------------+-------------------------------------------------------+ + | Others | * Free from corrosive liquids or gases | + | | * Free from explosive liquids or gases | + | | * Free from powerful electromagnetic interference | + +---------------------------------------+-------------------------------------------------------+ + +.. index:: + single: cooling + +The |rc_xxx| is designed for an operating temperature (surrounding environment) of 0 °C to 50 °C and +relies on convective (passive) cooling. Unobstructed airflow, especially around the cooling fins, +needs to be ensured during use. The |rc_xxx| should only be mounted using the provided +mechanical mounting interface, and all parts of the housing must remain uncovered. A free space of at least 10 cm extending in +all directions from the housing, and sufficient air exchange with the environment is +required to ensure adequate cooling. Cooling fins must be free of dirt and other contamination. + +.. index:: + pair: LED; housing temperature + +The housing temperature depends on the processing load, sensor orientation, and surrounding +environmental temperatures. When the sensor's exposed housing surfaces exceed 60°C, the LED at the front will turn from green to red. + +.. Warning:: For hand-guided applications, a heat-insulated handle should be attached to the + sensor to reduce the risk of burn injuries due to skin exposure to surface temperatures exceeding 60°C. + + +Power-supply specifications +--------------------------- + +.. index:: ! power supply + +The |rc_xxx| needs to be supplied by a DC voltage source. The |rc_xxx|'s standard package doesn't include a DC power supply. +The power supply contained in the connectivity kit may be used for initial setup. +For permanent installation, it is the customer's responsibility to provide suitable +DC power. Each |rc_xxx| must be connected to a separate power supply. Connection to domestic +grid power is only allowed through a power supply certified as EN55011 Class B. + +.. only:: rc_visard + + .. tabularcolumns:: |\X{5}{11}|\X{2}{11}|\X{2}{11}|\X{2}{11}| + + .. _tab-hardware-power: + + .. table:: Absolute maximum ratings for power supply + + +-----------------------------------+---------------+---------------+----------------------------------------------+ + | | *Min* | *Nominal* | *Max* | + +===================================+===============+===============+==============================================+ + | Supply voltage | 18.0 V | 24 V | 30.0 V | + +-----------------------------------+---------------+---------------+----------------------------------------------+ + | Max power consumption | | | 25 W | + +-----------------------------------+---------------+---------------+----------------------------------------------+ + | Overcurrent protection | Supply must be fuse-protected to a maximum of 2 A | + +-----------------------------------+---------------+---------------+----------------------------------------------+ + | EMC compliance | see :ref:`sect-standards`:latex:`\:(Section \ref{standards:sect-standards})` | + +-----------------------------------+---------------+---------------+----------------------------------------------+ + +.. only:: rc_visard_ng + + .. tabularcolumns:: |\X{5}{11}|\X{2}{11}|\X{2}{11}|\X{2}{11}| + + .. _tab-hardware-power: + + .. table:: Absolute maximum ratings for power supply + + +-----------------------------------+---------------+---------------+----------------------------------------------+ + | | *Min* | *Nominal* | *Max* | + +===================================+===============+===============+==============================================+ + | Supply voltage | 18.0 V | 24 V | 30.0 V | + +-----------------------------------+---------------+---------------+----------------------------------------------+ + | Max power consumption | | | 25 W | + +-----------------------------------+---------------+---------------+----------------------------------------------+ + | Overcurrent protection | Supply must be fuse-protected to a maximum of 2 A | + +-----------------------------------+---------------+---------------+----------------------------------------------+ + +.. Warning:: Exceeding maximum power rating values may lead to damage of the |rc_xxx|, power + supply, and connected equipment. + +.. Warning:: A separate power supply must power each |rc_xxx|. + +.. Warning:: Connection to domestic grid power is allowed through a power supply certified + as EN55011 Class B only. + +.. _sect-wiring: + +Wiring +------ + +.. index:: cables + +Cables are not provided with the |rc_xxx| standard package. It is the customer's responsibility +to obtain the proper cabling. :ref:`sect-accessories`:latex:`\:(Section \ref{accessories:sect-accessories})` provides an overview of suggested components. + +.. Warning:: Proper cable management is mandatory. Cabling must always be secured to the |rc_xxx| + mount with a strain-relief clamp so that no forces due to cable movements are exerted on the |rc_xxx|'s + M12 connectors. Enough slack needs to be provided to allow for full range of movement of the |rc_xxx| + without straining the cable. The cable's minimum bend radius needs to be observed. + +The |rc_xxx| provides an industrial 8-pin A-coded M12 socket connector for Ethernet +connectivity and an 8-pin A-coded M12 plug connector for power and GPIO connectivity. +Both connectors are located at the back. :visardonly:`Their locations (distance from center lines) are +identical for both baseline variants.` The location of both connectors on the +|rc_xxx| is shown in :numref:`fig-electrical-connections`. + +.. _fig-electrical-connections: +.. figure:: images/rc_visard_connect.* + :width: 100% + :align: center + + Locations of the electrical connections for the |rc_xxx|, with Ethernet on top and power on the bottom + +Connectors are rotated so that standard 90° angled connectors will exit horizontally, away from the camera (away from the cooling fins). + +.. index:: + pair: pin assignments; Ethernet + +.. _fig-pin-assignments: +.. figure:: images/rc_visard_pinout.* + :width: 100% + :align: center + + Pin positions for power and Ethernet connector + +Pin assignments for the Ethernet connector are given in :numref:`fig-ethernet-pin-assignments`. + +.. _fig-ethernet-pin-assignments: +.. figure:: images/ethernet_cable.* + :width: 100% + :align: center + + Pin assignments for M12 to Ethernet cabling + +.. index:: + pair: pin assignments; power + pair: pin assignments; GPIO + +Pin assignments for the power connector are given in :numref:`tab-power-pin-assignments`. + + +.. tabularcolumns:: |p{20mm}|p{40mm}| + +.. _tab-power-pin-assignments: + +.. table:: Pin assignments for the power connector + + +---------+-----------------------------+ + | **Pin** | *Assignment* | + +=========+=============================+ + | 1 | GPIO In 2 | + +---------+-----------------------------+ + | 2 | Power | + +---------+-----------------------------+ + | 3 | GPIO In 1 | + +---------+-----------------------------+ + | 4 | GPIO Gnd | + +---------+-----------------------------+ + | 5 | GPIO Vcc | + +---------+-----------------------------+ + | 6 | GPIO Out 1 (image exposure) | + +---------+-----------------------------+ + | 7 | Gnd | + +---------+-----------------------------+ + | 8 | GPIO Out 2 | + +---------+-----------------------------+ + + +GPIOs are decoupled by photocoupler. *GPIO Out 1* by default provides an exposure sync signal with +a logic high level for the duration of the image exposure. All GPIOs can be controlled via the +IOControl module (:ref:`sect-iocontrol`:latex:`, Section \ref{iocontrol:sect-iocontrol}`). +Pins of unsused GPIOs should be left floating. + +.. Warning:: It is especially important that during the boot phase *GPIO In 1* + is left floating or remains low. The |rc_xxx| will not boot if the pin is high during boot time. + +GPIO circuitry and specifications are shown in :numref:`fig-gpio`. The maximum rated voltage for +*GPIO In* and *GPIO Vcc* is 30 V. + +.. _fig-gpio: +.. figure:: images/rc_visard_gpio.* + :width: 160mm + :align: center + + GPIO circuitry and specifications -- do not connect signals higher than 30 V + +.. Warning:: Do not connect signals with voltages higher than 30 V to the |rc_xxx|. + +.. _sect-mechanical: + +Mechanical interface +-------------------- + +.. index:: + single: mounting + single: tripod + +.. only:: rc_visard + + The |rc_xxx| 65 and |rc_xxx| 160 offer identical mounting-point setups at the bottom. + +.. only:: rc_visard_ng + + The |rc_xxx| offers a mounting-point at the bottom. + + +.. figure:: images/rc_visard_mounting.* + :width: 160mm + :align: center + + Mounting-point for connecting the |rc_xxx| to robots or other mountings + + +For troubleshooting and static applications, the sensor may be mounted using the standardized tripod +thread (UNC 1/4"-20) indicated at the coordinate-frame origin. For dynamic applications such +as mounting on a robotic arm, the sensor must be mounted with three M4 (metric standard) 8.8 machine +screws tightened to 2.5 Nm and secured with a medium-strength threadlocking adhesive such +as Loctite 243. Maximum thread depth is 6 mm. The two 4 mm diameter holes may be used for positioning +pins (ISO 2338 4 m6) to ensure precise repositioning of the sensor. + +.. Warning:: For dynamic applications, the |rc_xxx| must be mounted with three M4 8.8 machine screws + tightened to 2.5 Nm torque and secured with threadlocking adhesive. Do not use high-strength bolts. + The engaged thread depth must be at least 5 mm. + +.. _sect-coordinate-frames: + +Coordinate frames +----------------- + +.. index:: + single: coordinate frames; mounting + +The |rc_xxx|'s coordinate-frame origin is defined as the exit pupil of the left camera lens. This frame is +called sensor coordinate frame or camera coordinate frame. An approximate location for the |rc_xxx| is shown in the next image. + +The mounting-point frame for the |rc_xxx| is defined to be at the bottom, centered in the tripod thread, +with orientation identical to that of the sensor's coordinate frame. + +.. only:: rc_visard + + :numref:`fig-rc-visard-65` and :numref:`fig-rc-visard-160` show approximate offsets. + + .. _fig-rc-visard-65: + .. figure:: images/rc_visard_frames.* + :width: 160mm + :align: center + + Approximate location of sensor/camera coordinate frame (inside left lens) and mounting-point frame (at tripod thread) for the |rc_xxx| 65 + +.. only:: rc_visard_ng + + :numref:`fig-rc-visard-160` shows approximate offsets. + +.. _fig-rc-visard-160: +.. figure:: images/rc_visard160_frames.* + :width: 160mm + :align: center + + Approximate locations of sensor/camera coordinate frame (inside left lens) and mounting-point frame (at tripod thread) for the |rc_xxx| 160 + +.. Note:: The correct offset between the sensor/camera frame and a robot + coordinate frame can be calibrated through the :doc:`hand-eye-calibration + procedure`:latex:`\:(Section \ref{handeye_calibration:sect-handeye-calibration})`. + + diff --git a/v24.04/en/_raw_sources/index.rst.txt b/v24.04/en/_raw_sources/index.rst.txt new file mode 100644 index 0000000..6e014b6 --- /dev/null +++ b/v24.04/en/_raw_sources/index.rst.txt @@ -0,0 +1,33 @@ +.. Roboception Sensor Manual documentation master file, created by + sphinx-quickstart on Wed Jan 11 22:27:28 2017. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +.. include:: global_rst.glb + +|company| |rcxxx| User Manual +================================= + +.. toctree-filt:: + :maxdepth: 2 + :includehidden: + + revisions + safety + :rc_cube_exclude:hardware_spec + installation + concepts + :rc_cube_only:pipelines + modules + interfaces + :rc_visard_exclude:userspace + maintenance + :rc_cube_exclude:accessories + troubleshooting + contact + appendix + +.. not working, since it would appear as text after the appendix in the pdf +.. * :ref:`genindex` + + diff --git a/v24.04/en/_raw_sources/installation.rst.txt b/v24.04/en/_raw_sources/installation.rst.txt new file mode 100644 index 0000000..e30c9e0 --- /dev/null +++ b/v24.04/en/_raw_sources/installation.rst.txt @@ -0,0 +1,426 @@ +.. include:: global_rst.glb + +.. _sect-installation: + +Installation +============ + +.. index:: + single: installation + +.. Warning:: The instructions on :ref:`sect-safety`:latex:`\:(Section \ref{safety:sect-safety})` related to the |rc_xxx| must be read and understood prior to installation. + +.. only:: rc_visard or rc_visard_ng + + The |rc_xxx| offers a Gigabit Ethernet interface for connecting the device to a computer + network. All communications to and from the device are performed via this interface. The + |rc_xxx| has an on-board computing resource that requires booting time after powering + up the device. + +.. only:: rc_cube + + The |rc_cube| offers multiple Gigabit Ethernet interfaces: + + * One interface labeled "external" for connecting the device to a local computer network, and + * up to four interfaces labeled "sensor" for connecting one or more 3D cameras such as the + |rc_visard| or |rc_viscore| :mvexclude:`or Basler blaze` sensor + (see :ref:`sect-camera-connection`:latex:`, Section \ref{installation:sect-camera-connection}`). + + All other Ethernet ports are disabled. + + For commissioning, operation, or troubleshooting the user can connect input devices + such as a mouse and a keyboard as well as a computer screen directly to the |rc_xxx|. + However, this is optional as the functionality of the |rc_cube| is fully accessible + via the local network it is connected to. + + .. note:: If a screen is used on the |rc_cube|, it must be connected before booting, + or the |rc_cube| must be restarted to activate the screen. + +Software license +---------------- + +.. only:: rc_visard or rc_visard_ng + + Every |rc_xxx| device ships with a pre-installed license file for licensing + and protection of the installed software packages. The license + is bound to that specific |rc_xxx| device and cannot be used or + transferred to other devices. + +.. only:: rc_cube + + Every |rc_xxx| device ships with a USB dongle for licensing + and protection of the installed software packages. The purchased + software licenses are installed on and are bound to this dongle and + its ID. + +The functionality of the |rc_xxx| can +be enhanced anytime by +:ref:`upgrading the license`:latex:`\:(Section \ref{maintenance:sect-updating-license})`, +e.g., for optionally available software modules. + +.. note:: The |rc_xxx| requires to be rebooted whenever the installed + licenses have changed. + +.. only:: rc_visard or rc_visard_ng + + .. note:: The license status can be retrieved + via the |rc_xxx|'s various interfaces + such as the :menuselection:`System --> Firmware & License` page of the + :ref:`Web GUI`:latex:`\ (Section \ref{webgui:sect-web-gui})`. + +.. only:: rc_cube + + .. note:: The dongle ID and the license status can be retrieved + via the |rc_xxx|'s various interfaces + such as the :menuselection:`System --> Firmware & License` page of the + :ref:`Web GUI`:latex:`\ (Section \ref{webgui:sect-web-gui})`. + + .. note:: For the software components to be properly licensed, the USB dongle + must be plugged to the |rc_xxx| **before power up**. + + .. note:: The |rc_xxx| requires to be rebooted, whenever the license + dongle is plugged to or unplugged from the device. + +Power up +-------- + +.. only:: rc_visard or rc_visard_ng + + .. index:: + single: LED + + .. Note:: Always fully connect and tighten the M12 power connector on the |rc_xxx| + *before* turning on the power supply. + + After connecting the |rc_xxx| to the power, the LED on the front of the device should + immediately illuminate. During the device's boot process, the LED will change + color and will eventually turn green. This signals that all processes are up and + running. + + If the network is not plugged in or the network is not properly configured, then the LED + will flash red every 5 seconds. In this case, the device's network configuration + should be verified. See :ref:`sect-led-colors`:latex:`\:(Section \ref{troubleshooting:sect-led-colors})` + for more information on the LED color codes. + +.. only:: rc_cube + + .. note:: The *rc_cube I* does not come with a power supply. A separate 24V/20Amp (e.g. top hat rail) power supply is required. + + The |rc_xxx| is booted by using the power switch on the device. + If a computer screen is connected it will display the |rc_xxx|'s + |webgui| when the boot process is finished. + + .. Note:: For successful operation please make sure that the |rcvisard| being + connected to the |rc_xxx| is powered and booted. + +.. _sect-discovery-of-rcvisard-devices: + +Discovery of |rc_xxx| devices +------------------------------- + +.. index:: + single: discovery GUI + single: reset + +|company| |rc_xxx| devices that are powered up and connected to the local network or directly to a +computer can be found using the standard GigE Vision\ |reg| discovery mechanism. + +.. only:: basler + + |manufacturer| offers the open-source tool ``rcdiscover-gui``, which is available for Windows and Linux. + The tool's Windows version consists of a single executable for Windows 7, 10 and 11, which can be executed without installation. + For Linux an installation package is available for Ubuntu. + +.. only:: roboception or matrixvision + + |manufacturer| offers the open-source tool ``rcdiscover-gui``, which can be downloaded free of charge from + https://github.com/roboception/rcdiscover/releases for Windows and Linux. + The tool's Windows version consists of a single executable for Windows 7, 10 and 11, which can be executed without installation. + For Linux an installation package is available for Ubuntu. + +.. only:: schunk + + |manufacturer| offers the open-source tool ``rcdiscover-gui``, which can be downloaded free of charge from + http://www.schunk.com/de_de/services/downloads/software for Windows and Linux. + The tool's Windows version consists of a single executable for Windows 7, 10 and 11, which can be executed without installation. + For Linux an installation package is available for Ubuntu. + + +At startup, all available GigE Vision\ |reg| devices -- including |rc_xxx| devices -- are +listed with their names, serial numbers, current IP addresses, and unique MAC addresses. The +discovery tool finds all devices reachable by global broadcasts. Misconfigured devices +that are located in different subnets than the application host may also be listed. A tickmark in the +discovery tool indicates whether devices are actually reachable via a +web browser. + +.. index:: + single: serial number + +.. only:: rc_visard or rc_visard_ng + + .. figure:: images/typelabel.png + :width: 50% + :align: center + + Label on the |rc_xxx| indicating model, serial number and MAC address + +.. only:: roboception or schunk or matrixvision + + .. figure:: images/rcdiscover_guiwin.png + :width: 90 % + :align: center + + ``rcdiscover-gui`` tool for finding connected GigE Vision\ |reg| devices + +.. only:: basler + + .. figure:: images/rcdiscover_guiwin_basler.png + :width: 90 % + :align: center + + ``rcdiscover-gui`` tool for finding connected GigE Vision\ |reg| devices + +After successful discovery, a double click on the device row opens the :ref:`Web GUI`:latex:`\ (Section +\ref{webgui:sect-web-gui})` of the device in the operating system's default web browser. +Google Chrome or Mozilla Firefox are recommended as web browser. + +Resetting configuration +^^^^^^^^^^^^^^^^^^^^^^^ + +.. only:: rc_cube + + .. Note:: The ``rcdiscover-gui`` resetting mechanism is currently not implemented for |rc_cube| devices. + +.. only:: rc_visard or rc_visard_ng + + A misconfigured device can be reset by using the *Reset rc_visard* button in the + discovery tool. The reset mechanism is only available for two minutes + after device startup. Thus, the |rc_xxx| may require rebooting before + being able to reset the device. + + .. figure:: images/rcdiscover_reset.png + :width: 50 % + :align: center + + Reset dialog of the ``rcdiscover-gui`` tool + + If the discovery tool still successfully detects the the misconfigured |rc_xxx|, + then the latter can be selected from the *rc-visard* drop-down menu. Otherwise, + the |rc_xxx|'s MAC address, which is printed on the device label, can be entered + manually into the designated fields. + + One of four options can be chosen after entering the MAC address: + + - *Reset Parameters*: Reset all |rc_xxx| parameters, such as frame rate, that are configurable via + :ref:`Web GUI`:latex:`\ (Section \ref{webgui:sect-web-gui})`. + - *Reset Network*: Reset network settings and user-defined name. + - *Reset All*: Reset the |rc_xxx| parameters as well as network settings and user-defined name. + - *Switch Partitions*: Allows a rollback to be performed as described in + :ref:`sect-restoring-the-previous-firmware-version`:latex:`\:(Section \ref{maintenance:sect-restoring-the-previous-firmware-version})`. + + A white status LED followed by a device reboot indicates a successful reset. + If no reaction is noticeable, the two minutes time slot may have elapsed, requiring + another reboot. + + .. Note:: The reset mechanism is only available for the first two minutes after startup. + +.. _sect-network-configuration: + +Network configuration +--------------------- + +.. index:: + single: network configuration + single: IP address + +The |rc_xxx| requires an Internet Protocol (:term:`IP`) address for communication with other network +devices. The IP address must be unique in the local network, and can be set either manually via a +user-configurable persistent IP address, or automatically via :term:`DHCP`. +If none of these IP configuration methods apply, the |rc_xxx| falls back to a :term:`Link-Local` IP address. + +.. only:: rc_cube + + The network settings of the |rc_visard| that is used in combination with the |rc_xxx| + are automatically configured when the |rc_visard| is connected to the |rc_xxx|. + + .. note:: To not conflict with the internal network between the |rc_xxx| and + the connected |rc_visard|, the IP address assigned to the |rc_xxx| in the + local network must not be in the range of ``172.23.42.0/24`` and ``172.17.0.0/16``. + +Following the :term:`GigE Vision`\ |reg| standard, the priority of IP configuration methods on the |rc_xxx| is + + 1. Persistent IP (if enabled) + 2. DHCP (if enabled) + 3. Link-Local + +.. figure:: images/ip_configuration_flowchart.* + :width: 60% + :align: center + + |rc_xxx|'s IP configuration method selection flowchart + +Options for changing the |rc_xxx|'s network settings and IP configuration are: + + * the :menuselection:`System --> Network` page of the |rc_xxx|'s |webgui| -- if it is reachable in the local network already, + see :ref:`sect-web-gui`:latex:`\:(Section \ref{webgui:sect-web-gui})` + * any configuration tool compatible with :term:`GigE Vision`\ |reg| 2.0, + or |manufacturer|'s command-line tool ``gc_config``. Typically, these tools scan for all available GigE Vision\ |reg| + devices on the network. All |rc_xxx| devices can be uniquely identified by their serial number and MAC address, + which are both printed on the device. + * temporarily changing or completely resetting the |rc_xxx|'s network configuration via |manufacturer|'s + ``rcdiscover-gui`` tool, see :ref:`sect-discovery-of-rcvisard-devices`:latex:`\:(Section \ref{installation:sect-discovery-of-rcvisard-devices})` + +.. only:: roboception or schunk or matrixvision + + .. note:: The command-line tool ``gc_config`` is part of |manufacturer|'s open-source convenience layer ``rc_genicam_api``, + which can be downloaded free of charge for Windows and Linux from http://www.roboception.com/download. + +.. _sect-network-hostname: + +Host name +^^^^^^^^^ + +.. index:: + single: host name + single: serial number + +.. only:: rc_visard + + The |rc_xxx|'s host name is based on its serial number, which is printed on the device, and + is defined as ``rc-visard-``. + +.. only:: rc_visard_ng + + The |rc_xxx|'s host name is based on its serial number, which is printed on the device, and + is defined as ``rc-visard-ng-``. + +.. only:: rc_cube + + The |rc_xxx|'s host name is based on its serial number, which is printed on the device, and + is defined as ``rc-cube-``. + +.. _sect-auto-network-configuration: + +Automatic configuration (factory default) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. index:: + single: DHCP + single: host name + single: MAC address + +The Dynamic Host Configuration Protocol (:term:`DHCP`) is preferred for setting an IP +address. If DHCP is active on the |rc_xxx|, which is the factory default, the +device tries to contact a DHCP server at startup and every time the network cable is being +plugged in. If a DHCP server is available on the network, the IP address +is automatically configured. + +In some networks, the DHCP server is configured so that it only accepts known +devices. In this case, the Media Access Control address (:term:`MAC address`), which is printed on +the device label, needs to be configured in the DHCP server. At the same time, the |rc_xxx|'s host +name can also be set in the Domain Name Server (:term:`DNS`). Both MAC address and host name should +be sent to the network administrator for configuration. + +.. index:: + single: Link-Local + +If the |rc_xxx| cannot contact a DHCP server within about 15 seconds after startup, or +after plugging in the network cable, it assigns itself a unique +IP address. This process is called :term:`Link-Local`. This option is especially useful for +connecting the |rc_xxx| directly to a computer. The computer must be configured for Link-Local +as well. Link-Local might already be configured as a standard fallback option, +as it is under Windows 10. Other operating systems such as Linux require Link-Local +to be explicitly configured in their network managers. + +.. _sect-manual-network-configuration: + +Manual configuration +^^^^^^^^^^^^^^^^^^^^ + +.. index:: + pair: Baumer; IpConfigTool + pair: GigE Vision; IP address + +Specifying a persistent, i.e. static IP address manually might be useful in some cases. +This address is stored on the |rc_xxx| to be used on device startup or network reconnection. +Please make sure the selected IP address, subnet mask and gateway will not cause any +conflicts on the network. + +.. Warning:: The IP address must be unique within the local network and within the local network's range of valid addresses. + Furthermore, the subnet mask must match the local network; otherwise, the |rcxxx| + may become inaccessible. This can be avoided by using + automatic configuration as explained in :ref:`sect-auto-network-configuration`:latex:`\ (Section \ref{installation:sect-auto-network-configuration})`. + +If this IP address cannot be assigned, e.g. because it is already used by another device in the network, +IP configuration will fall back to automatic configuration via :term:`DHCP` (if enabled) or a :term:`Link-Local` address. + +.. only:: rc_cube + + .. _sect-camera-connection: + + Connection of cameras + --------------------- + + .. index:: + pair: camera connection; installation + + Depending on the |rc_cube| model, two or more 3D cameras can be connected + to the Ethernet ports labelled *sensor0*, *sensor1*, etc. + + The *rc_cube S* has one 2.5 Gigabit Ethernet port for connecting up to two sensors, e.g. + + .. only:: matrixvision + + * connecting one |rc_visard| without additional hardware + * connecting two |rc_visard| devices via a separate 2.5Gbit switch + * connecting one |rc_viscore| via a separate 2.5Gbit switch + + .. only:: roboception or schunk or basler + + * connecting one |rc_visard| without additional hardware + * connecting two |rc_visard| devices via a separate 2.5Gbit switch + * connecting one |rc_viscore| via a separate 2.5Gbit switch + * connecting one |blaze| via a separate 2.5Gbit switch + + The *rc_cube I* has four 1 Gigabit Ethernet ports for connecting up to four sensors, e.g. + + .. only:: matrixvision + + * connecting up to four |rc_visard| devices without additional hardware + * connecting up to two |rc_viscore| devices without additional hardware + + .. only:: roboception or schunk or basler + + * connecting up to four |rc_visard| devices without additional hardware + * connecting up to two |rc_viscore| devices without additional hardware + * connecting up to two |blaze| sensors devices without additional hardware + + It is also possible to connect 3D cameras of different types to an |rc_cube|, if the + number of Ethernet ports permits. However, the + *rc_cube S* cannot process more than two sensors at the same time, the *rc_cube I* not + more than four. + + .. Warning:: The |rc_viscore| :mvexclude:`or Basler blaze` sensor must not be connected via a 1Gbit switch or slower, as this + leads to severe loss of images. + + The |rc_cube| offers up to four software *camera pipelines* for processing data from the connected sensors. + The configuration of the camera pipelines is explained in :doc:`pipelines`:latex:`\:(see Section \ref{pipelines:sect-pipelines})`. + + .. only:: roboception or schunk or basler + + .. _sect-blaze-installation: + + Basler blaze sensors + ^^^^^^^^^^^^^^^^^^^^ + + .. index:: + pair: blaze; installation + pair: blaze; calibration + + After connecting the Basler blaze sensor, it can take up to about one minute until it is found. Upon first + connection of the sensor to the |rc_cube|, the sensor must be calibrated before it can be used. + Calibration can be done through the |webgui| on the page :ref:`sect-camera-calibration`:latex:`\:(Section + \ref{camera_calibration:sect-camera-calibration})` under *Configuration* in the respective pipeline. + After storing the calibration, it will persistently reside on the |rc_cube| and automatically be + used whenever the sensor is connected to the |rc_cube| again, regardless of the port or pipeline. + diff --git a/v24.04/en/_raw_sources/interfaces.rst.txt b/v24.04/en/_raw_sources/interfaces.rst.txt new file mode 100644 index 0000000..18d7d96 --- /dev/null +++ b/v24.04/en/_raw_sources/interfaces.rst.txt @@ -0,0 +1,54 @@ +.. include:: global_rst.glb + + +.. _sect-interfaces: + +Interfaces +========== + +The following interfaces are provided for configuring and obtaining data from the |rc_xxx|: + +- :doc:`webgui`:latex:`\:(Section \ref{webgui:sect-web-gui})` + + Easy-to-use graphical interface to configure the |rc_xxx|, do calibrations, view live images, + do service calls, visualize results, etc. + +- :doc:`GigE Vision 2.0/GenICam`:latex:`\:(Section \ref{gigevision:sect-genicam})` + + Images and camera related configuration. + +- :doc:`REST API`:latex:`\:(Section \ref{rest_api:sect-rest-api})` + + API to configure the |rc_xxx|, query status information, do service calls, etc. + +.. only:: rc_visard + + - :doc:`rc_dynamics streams`:latex:`\:(Section \ref{rc_dynamics:sect-rc-dynamics-interface})` + + Real-time streams containing state estimates with poses, velocities, etc. are provided over the *rc_dynamics* interface. + It sends *protobuf*-encoded messages via UDP. + +- :doc:`Ethernet KRL Interface (EKI)`:latex:`\:(Section \ref{eki:sect-eki})` + + API to configure the |rc_xxx| and do service calls from KUKA KSS robots. + +- :doc:`gRPC image stream`:latex:`\:(Section \ref{grpc:sect-grpc})` + + Stream synchronized image sets via gRPC. + +- :doc:`Time synchronization`:latex:`\:(Section \ref{time_sync:sect-time-sync})` + + Time synchronization between the |rc_xxx| and the application host. + +.. toctree-filt:: + :hidden: + :maxdepth: 2 + + webgui + gigevision + rest_api + :rc_cube_exclude:rc_dynamics + eki + grpc + opc_ua + time_sync diff --git a/v24.04/en/_raw_sources/iocontrol.rst.txt b/v24.04/en/_raw_sources/iocontrol.rst.txt new file mode 100644 index 0000000..a791d57 --- /dev/null +++ b/v24.04/en/_raw_sources/iocontrol.rst.txt @@ -0,0 +1,269 @@ + +.. include:: global_rst.glb + +.. _sect-iocontrol: + +IO and Projector Control +======================== + +The IOControl module is an on-board module of the |rc_visard|. + +The IOControl module allows reading the status of the general purpose +digital inputs and controlling the digital general purpose outputs (GPIOs) +of the |rc_visard|. +The outputs can be set to LOW or HIGH, +or configured to be HIGH for the exposure time of every image or every second image. + +.. only:: rc_cube + + .. note:: + + This module is pipeline specific. Changes to its settings or parameters only affect + the respective camera pipeline and have no influence on other pipelines running on the |rc_cube|. + +The purpose of the IOControl module is the control of an external light source +or a projector, which is connected to one of the |rc_visard|'s GPIOs to be +synchronized by the image acquisition trigger. +In case a pattern projector is used to improve stereo matching, the intensity images +also show the projected pattern, which might be a disadvantage for image processing +tasks that are based on the intensity image (e.g. edge detection). For this reason, +the IOControl module allows setting GPIO outputs to HIGH for the exposure time of +every second image, so that intensity images without the projected pattern are also available. + +.. only:: rc_visard or rc_visard_ng + + .. Note:: For more details on the |rc_xxx|'s GPIOs please refer to + :ref:`sect-wiring`:latex:`, Section \ref{hardware_spec:sect-wiring}`. + +.. _sect-iocontrol-parameters: + +Parameters +---------- + +The IOControl module is called ``rc_iocontrol`` in the |rest-api| and is represented in the +:ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})` +:cubeonly:`in the desired pipeline` under :menuselection:`Configuration --> IOControl`. +The user can change the parameters via the |webgui|, the +:doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`, or via GigE Vision +using the DigitalIOControl parameters ``LineSelector`` and ``LineSource`` +(:ref:`sect-genicam-iocontrol`:latex:`, Section \ref{gigevision:sect-genicam-iocontrol}`). + +Parameter overview +^^^^^^^^^^^^^^^^^^ + +.. include:: _gen/nodes/params/rc_iocontrol.txt + +.. _sect-iocontrol-params: + +Description of run-time parameters +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. _expl-iocontrol-out1-mode: + +``out1_mode`` and ``out2_mode`` (*Out1* and *Out2*) +''''''''''''''''''''''''''''''''''''''''''''''''''' + The output modes for GPIO Out 1 and Out 2 can be set individually: + + ``Low`` sets the output permanently to LOW. This is the factory default. + + ``High`` sets the output permanently to HIGH. + + ``ExposureActive`` sets the output to HIGH for the exposure time of every + image. + + ``ExposureAlternateActive`` sets the output to HIGH for the exposure time + of every second image. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_iocontrol/parameters/parameters?= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_iocontrol/parameters?= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_iocontrol/parameters?= + +:numref:`fig-fps-exposure` shows which images are used for stereo +matching and transmission via GigE Vision in ``ExposureActive`` mode with a +user-defined frame rate of 8 Hz. + +.. _fig-fps-exposure: +.. figure:: images/fps_exposure.* + :width: 100 % + :align: center + + Example of using the ``ExposureActive`` mode for GPIO Out 1 with a user-defined + frame rate of 8 Hz. The internal image acquisition is always |cam-rate|. + GPIO Out 1 is HIGH for the exposure time of every image. A disparity + image is computed for camera images that are sent out via GigE Vision according + to the user-defined frame rate. + +The mode ``ExposureAlternateActive`` is meant to be used when an external random +dot projector is connected to the |rc_visard|'s GPIO Out 1. +When setting Out 1 to ``ExposureAlternateActive``, the +:ref:`stereo matching`:latex:`\:(Section \ref{stereo_matching:sect-stereo-matching})` +module only uses images with GPIO Out 1 being HIGH, i.e. projector is on. The maximum +frame rate that is used for stereo matching is therefore half of the frame rate +configured by the user +(see :ref:`FPS`:latex:`, Section \ref{stereo_camera:sect-cam-params}`). All +modules which make use of the intensity image, like +:ref:`TagDetect`:latex:`\:(Section \ref{tagdetect:sect-tag-detection})` and +:ref:`ItemPick`:latex:`\:(Section \ref{itempick:sect-itempick})`, +use the intensity images with GPIO Out 1 being LOW, i.e. projector is off. +:numref:`fig-fps-alternate` shows an example. + +.. _fig-fps-alternate: +.. figure:: images/fps_alternate.* + :width: 100 % + :align: center + + Example of using the ``ExposureAlternateActive`` mode for GPIO Out 1 with a + user-defined frame rate of 8 Hz. The internal image acquisition is always |cam-rate|. + GPIO Out 1 is HIGH for the exposure time of every second image. A disparity + image is computed for images where Out 1 is HIGH and that are sent out via GigE + Vision according to the user-defined frame rate. In ``ExposureAlternateActive`` + mode, intensity images are always transmitted pairwise: one with GPIO Out 1 HIGH, for which a + disparity image might be available, and one with GPIO Out 1 LOW. + +.. Note:: In ``ExposureAlternateActive`` mode, an intensity image with GPIO Out 1 being HIGH (i.e. with + projection) is always 40 ms away from an intensity image with Out 1 being LOW (i.e. without + projection), regardless of the user-defined frame rate. This needs to be + considered when synchronizing disparity images and camera images without projection + in this special mode. + +The functionality can also be controlled by the DigitalIOControl parameters +of the GenICam interface (:ref:`sect-genicam-iocontrol`:latex:`, Section \ref{gigevision:sect-genicam-iocontrol}`). + + +.. _sect-iocontrol-services: + +Services +-------- + +Each service response contains a ``return_code``, +which consists of a ``value`` plus an optional ``message``. +A successful service returns with a ``return_code`` value of ``0``. +Negative ``return_code`` values indicate that the service failed. +Positive ``return_code`` values indicate that the service succeeded with additional information. + +The IOControl module offers the following services. + +``get_io_values`` +^^^^^^^^^^^^^^^^^ + + Retrieves the current state of the |rc_visard|'s general purpose inputs + and outputs (GPIOs). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_iocontrol/services/get_io_values + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_iocontrol/services/get_io_values + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_iocontrol/services/get_io_values + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_iocontrol_get_io_values_request.txt + + .. tab:: **Response** + + The returned ``timestamp`` is the time of measurement. + + ``input_mask`` and ``output_mask`` are bit masks defining which bits are used for input and + output values, respectively. + + ``values`` holds the values of the bits corresponding to input and output as given by the + ``input_mask`` and ``output_mask``. + + ``return_code`` holds possible warnings or error codes and messages. + Possible ``return_code`` values are shown below. + + .. tabularcolumns:: |c|L| + .. csv-table:: + :header: Code, Description + + "0", "Success" + "-2", "Internal error" + "-9", "License for `IOControl` is not available" + + .. include:: _gen/nodes/services/rc_iocontrol_get_io_values_response.txt + +``reset_defaults`` +^^^^^^^^^^^^^^^^^^ + + Restores and applies the default values for this module's parameters + ("factory reset"). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_iocontrol/services/reset_defaults + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_iocontrol/services/reset_defaults + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_iocontrol/services/reset_defaults + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_iocontrol_reset_defaults_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_iocontrol_reset_defaults_response.txt diff --git a/v24.04/en/_raw_sources/itempick.rst.txt b/v24.04/en/_raw_sources/itempick.rst.txt new file mode 100644 index 0000000..4f3d1c2 --- /dev/null +++ b/v24.04/en/_raw_sources/itempick.rst.txt @@ -0,0 +1,1510 @@ + +.. include:: global_rst.glb + +.. _sect-itempick: + +ItemPick and BoxPick +==================== + +.. index:: ! ItemPick + single: bin picking + single: grasp computation + +.. index:: ! BoxPick + +Introduction +------------ + +.. Short description and functionalities + +The ItemPick and BoxPick modules provide out-of-the-box perception solutions for robotic pick-and-place +applications. ItemPick targets the detection of flat surfaces of unknown objects for picking +with a suction gripper. BoxPick detects rectangular surfaces and determines their position, +orientation and size for grasping. With the +Match extension, BoxPick can be used to +detect textured rectangles with consistent orientations. The interface of both modules is very similar. Therefore +both modules are described together in this chapter. + +In addition, both modules offer: + +- A dedicated page on the |rc_xxx| :ref:`sect-web-gui`:latex:`\:(Section \ref{webgui:sect-web-gui})` + for easy setup, configuration, testing, and application tuning. +- The definition of regions of interest to select relevant volumes in the scene + (see :ref:`sect-roi`:latex:`, Section \ref{roi:sect-roi}`). +- A load carrier detection functionality for bin-picking applications + (see :ref:`sect-loadcarrier`:latex:`, Section \ref{loadcarrier:sect-loadcarrier}`), + to provide grasps for items inside a bin only. +- The definition of compartments inside a load carrier to provide grasps + for specific volumes of the bin only. +- Support for static and robot-mounted cameras and + optional integration with the :doc:`handeye_calibration` + :latex:`(Section \ref{handeye_calibration:sect-handeye-calibration})` module, + to provide grasps in the user-configured external reference frame. +- A quality value associated to each suggested grasp and related to the flatness of the grasping surface. +- Selection of a sorting strategy to sort the returned grasps. +- 3D visualization of the detection results with grasp points and gripper animations in the |webgui|. + +.. only:: rc_cube + + .. note:: + + These modules are pipeline specific. Changes to their settings or parameters only affect + the respective camera pipeline and have no influence on other pipelines running on the |rc_cube|. + +.. Note:: + + In this chapter, cluster and surface are used as synonyms and identify a set of + points (or pixels) with defined geometrical properties. + +The modules are optional on-board modules of the |rc_xxx| +and require separate ItemPick or BoxPick :ref:`licenses` +:latex:`(Section \ref{maintenance:sect-updating-license})` to be purchased. +The +Match extension of BoxPick requires an extra license. + +.. _sect-itempick-detect-items: + +Detection of items (BoxPick) +---------------------------- + +.. index:: + single: BoxPick; item models + +There are two different types of models for the rectangles to be detected by the BoxPick module. + +Per default, BoxPick only supports ``item_models`` of +``type`` ``RECTANGLE``. With the +Match extension, also item models +of ``type`` ``TEXTURED_BOX`` can be detected. The detection of the +different item model types is described below. + +Optionally, further information can be given to the BoxPick module: + +- The ID of the load carrier which contains the items to be detected. +- A compartment inside the load carrier where to detect items. +- The ID of the region of interest where to search for the load carriers if a + load carrier is set. + Otherwise, the ID of the region of interest where to search for the items. +- The current robot pose in case the camera is mounted on the robot and + the chosen coordinate frame for the poses is ``external`` or the chosen + region of interest is defined in the external frame. + +The returned ``pose`` of a detected ``item`` is the pose of the center of the detected rectangle in the +desired reference frame (``pose_frame``), with its z axis pointing towards the camera and the x axis +aligned with the long side of the item. This pose has a 180° rotation ambiguity around the z axis, which can be resolved +by using the +Match extension with a ``TEXTURED_BOX`` item model. +Each detected item includes a ``uuid`` (Universally Unique Identifier) and the +``timestamp`` of the oldest image that was used to detect it. + +.. _sect-itempick-detect-items-rectangle: + +Detection of items of type RECTANGLE (BoxPick) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. index:: + single: BoxPick; RECTANGLE + +BoxPick supports multiple ``item_models`` of ``type`` ``RECTANGLE``. +Each item model is defined by its minimum and maximum size, with the +minimum dimensions strictly smaller than the maximum dimensions. +The dimensions should be given fairly accurately to avoid misdetections, +while still considering a certain tolerance to account for possible production variations +and measurement inaccuracies. + +The detection of the rectangles runs in several steps. First, the point cloud is segmented into +preferably plane clusters. Then, straight line segments are detected in the 2D images +and projected onto the corresponding clusters. The clusters and the detected lines are +visualized in the "Intermediate Result" visualization +on the |webgui|'s *BoxPick* page. Finally, for each cluster, the set of +rectangles best fitting to the detected line segments is extracted. + +.. _sect-itempick-detect-items-textured-box: + +Detection of items of type TEXTURED_BOX (BoxPick+Match) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. index:: + single: BoxPick; views + single: BoxPick; texture + single: BoxPick; TEXTURED_BOX + +With the +Match extension, BoxPick additionally supports ``item_models`` of ``type`` ``TEXTURED_BOX``. +When this item model type is used, only one item model can be given for each request. + +The ``TEXTURED_BOX`` item model type should be used to detect multiple rectangles that have the same texture, i.e. the same look or print, +such as printed product packaging, labels, brochures or books. It is required that for all objects the texture is at the same position with respect +to the object geometry. Furthermore, the texture should not be repetitive. + +A ``TEXTURED_BOX`` item is defined by the item's exact ``dimensions`` ``x``, ``y`` and ``z`` (currently ``z`` +must always be 0) with a tolerance ``dimensions_tolerance_m`` that indicates, +how much the detected dimensions are allowed to deviate from the given dimensions. By default, a tolerance of 0.01 m is assumed. +Furthermore, a ``template_id`` must be given, which will be used to refer to the specified dimensions and the +textures of the detected rectangles. Additionally, the maximum possible deformation of the items ``max_deformation_m`` +can be given in meters (default 0.004 m), to account for rigid or more flexible objects. + +If a ``template_id`` is used for the first time, BoxPick will run the detection of rectangles as for the item +model type ``RECTANGLE``, and use the given dimensions tolerance to specify the dimensions range. From the detected +rectangles, so-called *views* are created, which contain the shape and the image intensity values of the rectangles, +and are stored in a newly created template with the given ``template_id``. The views are created iteratively: Starting +from the detected rectangle with the highest score, a view is created and then used to detect more rectangles with the same +texture. Then, all remaining clusters are used to detect further rectangles by the given dimensions range and again a view is +created from the best rectangle and used for further detections. +Each template can store up to 10 different views, for example corresponding to different types of the same product packaging. +Each view will be assigned a unique ID (``view_uuid``) +and all rectangle items with a matching texture will be assigned the same ``view_uuid``. That also means that all items +with the same ``view_uuid`` will have consistent orientations, because the orientation of each item is aligned with its texture. +The views can be displayed, deleted and the orientation of each view can be set via the +:ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})` by clicking on the template or its edit symbol in the template list. +Each detected item contains a field ``view_pose_set`` indicating whether the orientation of the item's view was explicitly set or +is still unset at its original random state, which has a 180° ambiguity. The ``type`` of a returned item with a ``view_uuid`` will be +``TEXTURED_RECTANGLE``. + +If the template with the given ``template_id`` already exists, the existing views will be used to detect rectangles based on their +texture. If additional rectangles are found with matching dimensions, but different texture, new views will be generated and added +to the template. When the maximum number of views is reached, views that are matched only rarely will be deleted so that newly generated +views can be added to the template and the template is kept up-to-date. To prevent a template from being updated, automatic updating can be disabled and enabled for +each template in the |webgui| by clicking on the template or the edit symbol in the template list. +The dimension tolerance and the maximum deformation can also be changed there for each template. The maximum deformation determines +the tolerance for the texture matching, representing possible shifts within the texture, e.g. caused by deformations of the object surface. +For rigid objects the ``max_deformation_m`` should be set to a low value in meters to ensure accurate matching. + +The template's ``dimensions`` can only be specified when creating a new template. Once the template is generated, the dimensions cannot be changed +and do not need to be given in the detect request. If the dimensions are still given in the request, they must match the existing dimensions +in the template. However, the ``dimensions_tolerance_m`` +and ``max_deformation_m`` can be set differently in every detect request and their values will also be updated in the stored template. + +.. _sect-itempick-compute-grasps: + +Computation of grasps +--------------------- + +.. index:: + single: BoxPick; grasp + single: ItemPick; grasp + single: BoxPick; grasp sorting + single: ItemPick; grasp sorting + +The ItemPick and BoxPick modules offer a service for computing grasps for +suction grippers. The gripper is defined by its suction surface length and width. + +The ItemPick module identifies flat surfaces in the scene and supports +flexible and/or deformable items. The ``type`` of these ``item_models`` is +called ``UNKNOWN`` since they don't need to have a standard geometrical shape. +Optionally, the user can also specify the minimum and maximum size of the item. + +For BoxPick, the grasps are computed on the detected rectangular ``items`` +(see :ref:`sect-itempick-detect-items`:latex:`, Section \ref{itempick:sect-itempick-detect-items}`). + +Optionally, further information can be given to the modules in a grasp +computation request: + +- The ID of the load carrier which contains the items to be grasped. +- A compartment inside the load carrier where to compute grasps + (see :ref:`sect-loadcarrier-compartment`:latex:`, Section \ref{loadcarrier_db:sect-loadcarrier-compartment}`). +- The ID of the 3D region of interest where to search for the load carriers if a + load carrier is set. + Otherwise, the ID of the 3D region of interest where to compute grasps. +- Collision detection information: The ID of the gripper to enable collision checking and optionally + a pre-grasp offset to define a pre-grasp position. + Details on collision + checking are given below in :ref:`sect-itempick-collision-check-dep`:latex:`\:(Section \ref{itempick:sect-itempick-collision-check-dep})`. + + +A grasp provided by the ItemPick and BoxPick modules represents the recommended +pose of the TCP (Tool Center Point) of the suction gripper. +The grasp ``type`` is always set to ``SUCTION``. +The computed grasp pose is the center of the biggest ellipse that can be inscribed in +each surface. +The grasp orientation is a right-handed coordinate system and is defined such +that its z axis is normal to the surface pointing inside the object at the grasp position and +its x axis is directed along the maximum elongation of the ellipse. + +.. _fig-itempick-grasp-surface: +.. figure:: images/itempick_grasp_surface.png + :width: 300 px + :align: center + + Illustration of suction grasp with coordinate system and ellipse representing + the maximum suction surface. + +Each grasp includes the dimensions of the maximum suction surface available, +modelled as an ellipse of axes ``max_suction_surface_length`` and +``max_suction_surface_width``. The user is enabled to filter grasps by specifying +the minimum suction surface required by the suction device in use. + +In the BoxPick module, the grasp position corresponds to the center of the detected +rectangle and the dimensions of the maximum suction surface available matches the estimated +rectangle dimensions. Detected rectangles with missing data or occlusions by other objects for more +than 15% of their surface do not get an associated grasp. + +Each grasp also includes a ``quality`` value, which gives an +indication of the flatness of the grasping surface. +The ``quality`` value varies between 0 and 1, where higher numbers correspond to a +flatter reconstructed surface. + +.. In case of multi-cup suction devices, the suction surface +.. is expected to cover all suction elements. + +The grasp definition is complemented by a ``uuid`` (Universally Unique Identifier) +and the ``timestamp`` of the oldest image that was used to compute the grasp. + +Grasp sorting is performed based on the selected sorting strategy. The following sorting strategies +are available and can be set in the :ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})` +or using the ``set_sorting_strategies`` service call: + +- ``gravity``: highest grasp points along the gravity direction are returned first, +- ``surface_area``: grasp points with the largest surface area are returned first, +- ``direction``: grasp points with the shortest distance along a defined direction ``vector`` in a given ``pose_frame`` are returned first. + +If no sorting strategy is set or default sorting is chosen in the |webgui|, sorting is done based on a combination of +``gravity`` and ``surface_area``. + +.. _sect-itempick-dependencies: + +Interaction with other modules +------------------------------ + +Internally, the ItemPick and BoxPick modules depend on, and interact with other on-board +modules as listed below. + +.. Note:: + All changes and configuration updates to these modules will affect + the performance of the ItemPick and BoxPick modules. + +.. For each load carrier detection and grasp computation, the ItemPick module +.. acquires datasets of synchronized images and estimates the gravity vector. +.. The data acquisition step normally takes between 500 ms and 600 ms +.. with "High" depth image quality. + +.. _sect-itempick-stereo-camera-matching: + +Stereo camera and Stereo matching +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The ItemPick and BoxPick modules make internally use of the following data: + +- Rectified images from the :doc:`stereo_camera` module + (``rc_camera``:latex:`, Section \ref{stereo_camera:sect-stereo-camera}`); + +- Disparity, error, and confidence images from the :doc:`stereo_matching` module + (``rc_stereomatching``:latex:`, Section \ref{stereo_matching:sect-stereo-matching}`). + +All processed images are guaranteed to be captured after the module trigger time. + +.. _sect-itempick-iocontrol-dep: + +IO and Projector Control +^^^^^^^^^^^^^^^^^^^^^^^^ + +In case the |rc_xxx| is used in conjunction with an external random dot projector and +the :doc:`iocontrol` module (``rc_iocontrol``:latex:`, Section \ref{iocontrol:sect-iocontrol}`), +it is recommended to connect the projector to GPIO Out 1 and set +the stereo-camera module's acquisition mode to ``SingleFrameOut1`` +(see :ref:`Stereo matching parameters`:latex:`, Section \ref{stereo_matching:sect-disp-image-parameters}`), so that +on each image acquisition trigger an image with and without projector pattern is acquired. + +Alternatively, the output mode for the GPIO output in use should be set to ``ExposureAlternateActive`` +(see :ref:`sect-iocontrol-params`:latex:`, Section \ref{iocontrol:sect-iocontrol-params}`). + +In either case, +the *Auto Exposure Mode* ``exp_auto_mode`` should be set to ``AdaptiveOut1`` to optimize the exposure +of both images (see :ref:`Stereo camera parameters`:latex:`, Section \ref{stereo_camera:sect-cam-params}`). + +.. _sect-itempick-hand-eye-dep: + +Hand-eye calibration +^^^^^^^^^^^^^^^^^^^^ + +In case the camera has been calibrated to a robot, the ItemPick and BoxPick modules +can automatically provide poses in the robot coordinate frame. +For the ItemPick and BoxPick nodes' :ref:`sect-itempick-services`:latex:`\:(Section \ref{itempick:sect-itempick-services})`, the frame of the +output poses can be controlled with the ``pose_frame`` argument. + +Two different ``pose_frame`` values can be chosen: + +1. **Camera frame** (``camera``). + All poses provided by the modules are in the camera frame, + and no prior knowledge about the pose of the camera in the environment is required. + This means that the configured regions of interest and load carriers move with the camera. + It is the user's responsibility to update the configured poses + if the camera frame moves (e.g. with a robot-mounted camera). + +2. **External frame** (``external``). + All poses provided by the modules are in the external frame, + configured by the user during the hand-eye calibration process. + The module relies on the on-board + :doc:`Hand-eye calibration module`:latex:`\:(Section \ref{handeye_calibration:sect-handeye-calibration})` + to retrieve the sensor mounting (static or robot mounted) and + the hand-eye transformation. + If the mounting is static, no further information is needed. + If the sensor is robot-mounted, the ``robot_pose`` is required + to transform poses to and from the ``external`` frame. + +.. Note:: + If no hand-eye calibration is available, all ``pose_frame`` values should be set to ``camera``. + +All ``pose_frame`` values that are not ``camera`` or ``external`` are rejected. + +If the sensor is robot-mounted, the current ``robot_pose`` has to be provided depending on the value of ``pose_frame`` +and the definition of the sorting direction: + +- If ``pose_frame`` is set to ``external``, providing the robot pose is obligatory. +- If the sorting direction is defined in ``external``, providing the robot pose is obligatory. +- In all other cases, providing the robot pose is optional. + +.. _sect-itempick-load-carrier-dep: + +LoadCarrier +^^^^^^^^^^^ + +The ItemPick and BoxPick modules use the load carrier detection functionality provided by the +:doc:`loadcarrier` module (``rc_load_carrier``:latex:`, Section \ref{loadcarrier:sect-loadcarrier}`), +with the run-time parameters specified for this module. However, only one load carrier will be +returned and used in case multiple matching load carriers could be found in the scene. In case multiple +load carriers of the same type are visible, a 3D region of interest should be set to ensure that always the +same load carrier is used for the ItemPick and BoxPick modules. + +.. _sect-itempick-collision-check-dep: + +CollisionCheck +^^^^^^^^^^^^^^ + +Collision checking can be easily enabled for +grasp computation of the ItemPick and BoxPick modules by passing the ID of the used gripper and +optionally a pre-grasp offset to the +``compute_grasps`` service call. The gripper has to be +defined in the GripperDB module +(see :ref:`sect-gripper-db-gripper`:latex:`, Section \ref{gripper_db:sect-gripper-db-gripper}`) +and details about collision checking are given in :ref:`sect-collision-check-other-modules`:latex:`\:(Section \ref{collisioncheck:sect-collision-check-other-modules})`. + +If collision checking is enabled, only grasps which are collision free will be returned. +However, the visualization images on the *ItemPick* or *BoxPick* +page of the |webgui| also show colliding grasp points as black ellipses. + +The CollisionCheck module's run-time parameters affect the collision detection as described in +:ref:`CollisionCheck Parameters`:latex:`\:(Section \ref{collisioncheck:sect-collisioncheck-parameters})`. + + +.. _sect-itempick-parameters: + +Parameters +---------- + +.. index:: + single: BoxPick; parameters + single: ItemPick; parameters + +The ItemPick and BoxPick modules are called ``rc_itempick`` and ``rc_boxpick`` +in the |rest-api| and are represented in the :ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})` +:cubeonly:`in the desired pipeline` under +:menuselection:`Modules --> ItemPick` and :menuselection:`Modules --> BoxPick`. +The user can explore and configure the ``rc_itempick`` and ``rc_boxpick`` +module's run-time parameters, e.g. for development and testing, using the |webgui| or the +:doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`. + +Parameter overview +^^^^^^^^^^^^^^^^^^ + +.. only:: rc_cube + + .. note:: The default values in the parameter table + below show the values of the |rc_visard|. The values can be + different for other sensors. + +.. include:: _gen/nodes/params/rc_itempick_split.txt + +Description of run-time parameters +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Each run-time parameter is represented by a row on the |webgui|'s *ItemPick* or *BoxPick* page. +The name in the |webgui| is given in brackets behind the parameter name and the parameters are +listed in the order they appear in the |webgui|: + +.. _expl-itempick-max-grasps: + +``max_grasps`` (*Maximum Grasps*) +''''''''''''''''''''''''''''''''' + sets the maximum number of provided grasps. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes//parameters/parameters?max_grasps= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//parameters?max_grasps= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//parameters?max_grasps= + +.. _expl-itempick-cluster-max-dimension: + +``cluster_max_dimension`` (**Only for ItemPick**, *Cluster Maximum Dimension*) +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + is the maximum allowed diameter for a cluster in meters. Clusters with a diameter larger than this value are not used for grasp computation. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_itempick/parameters/parameters?cluster_max_dimension= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_itempick/parameters?cluster_max_dimension= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_itempick/parameters?cluster_max_dimension= + +.. _expl-itempick-cluster-max-curvature: + +``cluster_max_curvature`` (*Cluster Maximum Curvature*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''' + is the maximum curvature allowed within one cluster. The smaller this value, the more clusters will be split apart. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes//parameters/parameters?cluster_max_curvature= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//parameters?cluster_max_curvature= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//parameters?cluster_max_curvature= + +.. _expl-itempick-clustering-patch-size: + +``clustering_patch_size`` (**Only for ItemPick**, *Patch Size*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + is the size of the square patches the depth map is subdivided into during the first clustering step in pixels. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_itempick/parameters/parameters?clustering_patch_size= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_itempick/parameters?clustering_patch_size= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_itempick/parameters?clustering_patch_size= + +.. _expl-itempick-clustering-discontinuity-factor: + +``clustering_discontinuity_factor`` (*Discontinuity Factor*) +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + is the factor used to discriminate depth discontinuities within a patch. The smaller this value, the more clusters will be split apart. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes//parameters/parameters?clustering_discontinuity_factor= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//parameters?clustering_discontinuity_factor= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//parameters?clustering_discontinuity_factor= + +.. _expl-itempick-clustering-max-surface-rmse: + +``clustering_max_surface_rmse`` (*Maximum Surface RMSE*) +'''''''''''''''''''''''''''''''''''''''''''''''''''''''' + is the maximum root-mean-square error (RMSE) in meters of points belonging to a surface. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes//parameters/parameters?clustering_max_surface_rmse= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//parameters?clustering_max_surface_rmse= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//parameters?clustering_max_surface_rmse= + +.. _expl-boxpick-mode: + +``mode`` (**Only for BoxPick**, *Mode*) +''''''''''''''''''''''''''''''''''''''' + determines the mode of the rectangle detection. Possible values are ``Unconstrained``, ``PackedGridLayout`` and ``PackedLayers``. + In ``PackedGridLayout`` mode, rectangles of a cluster are detected in a dense grid pattern. + In ``PackedLayers`` mode, boxes are assumed to form layers and box detection will start searching for items at the cluster corners. + Use this mode in de-palletizing applications. + In ``Unconstrained`` mode (default), rectangles are detected without posing any constraints on their relative locations or their + positions in the segmented cluster. :numref:`fig-boxpick-modes` illustrates the modes for different scenarios. + + .. _fig-boxpick-modes: + .. figure:: images/boxpick_modes_new.* + :width: 100% + :align: center + + Illustration of appropriate BoxPick modes for different scenes. Modes marked with yellow are applicable but not + recommended for the corresponding scene. The gray areas indicate the rectangles to be detected. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_boxpick/parameters/parameters?mode= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_boxpick/parameters?mode= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_boxpick/parameters?mode= + +.. _expl-boxpick-manual-line-sensitivity: + +``manual_line_sensitivity`` (**Only for BoxPick**, *Manual Line Sensitivity*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + determines whether the user-defined line sensitivity should be used + to extract the lines for rectangle detection. If this + parameter is set to true, the user-defined ``line_sensitivity`` value + will be used. If this parameter is set to false, automatic line sensitivity + will be used. This parameter should be set to true when automatic line sensitivity + does not give enough lines at the box boundaries so that boxes cannot be detected. + The detected line segments are visualized in the "Intermediate Result" visualization on the + |webgui|'s *BoxPick* page. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_boxpick/parameters/parameters?manual_line_sensitivity= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_boxpick/parameters?manual_line_sensitivity= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_boxpick/parameters?manual_line_sensitivity= + +.. _expl-boxpick-line-sensitivity: + +``line_sensitivity`` (**Only for BoxPick**, *Line Sensitivity*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + determines the line sensitivity for extracting the lines for rectangle detection, if the + parameter ``manual_line_sensitivity`` is set to true. Otherwise, the value of this parameter + has no effect on the rectangle detection. Higher values give more line segments, but also + increase the runtime of the box detection. This parameter should be increased when boxes + cannot be detected because their boundary edges are not detected. The detected line segments + are visualized in the "Intermediate Result" visualization on the |webgui|'s *BoxPick* page. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_boxpick/parameters/parameters?line_sensitivity= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_boxpick/parameters?line_sensitivity= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_boxpick/parameters?line_sensitivity= + +.. _expl-boxpick-prefer-splits: + +``prefer_splits`` (**Only for BoxPick**, *Prefer Splits*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + determines whether rectangles should be split into smaller ones if the smaller ones also match the given + item models. This parameter should be set to true for packed box layouts in which the given item models + would also match a rectangle of the size of two adjoining boxes. If this parameter is set to false, the larger + rectangles will be preferred in these cases. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_boxpick/parameters/parameters?prefer_splits= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_boxpick/parameters?prefer_splits= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_boxpick/parameters?prefer_splits= + +.. _expl-boxpick-min-cluster-coverage: + +``min_cluster_coverage`` (**Only for BoxPick**, *Minimum Cluster Coverage*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + determines which ratio of each segmented cluster must be covered with rectangle detections to + consider the detections to be valid. If the minimum cluster coverage is not reached for a cluster, + no rectangle detections will be returned for this cluster and a warning will be given. + This parameter should be used to verify that all items on a layer in a de-palletizing scenario are + detected. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_boxpick/parameters/parameters?min_cluster_coverage= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_boxpick/parameters?min_cluster_coverage= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_boxpick/parameters?min_cluster_coverage= + + +.. _sect-itempick-status-values: + +Status values +------------- + +.. index:: + single: BoxPick; status + single: ItemPick; status + +The ``rc_itempick`` and ``rc_boxpick`` modules report the following status values: + +.. tabularcolumns:: |l|L| +.. csv-table:: The ``rc_itempick`` and ``rc_boxpick`` modules status values + :header: Name, Description + + "``data_acquisition_time``","Time in seconds required by the last active service to acquire images" + "``grasp_computation_time``","Processing time of the last grasp computation in seconds" + "``last_timestamp_processed``","The timestamp of the last processed dataset" + "``load_carrier_detection_time``","Processing time of the last load carrier detection in seconds" + "``processing_time``","Processing time of the last detection (including load carrier detection) in seconds" + "``state``","The current state of the rc_itempick and rc_boxpick node" + +The reported ``state`` can take one of the following values. + +.. tabularcolumns:: |l|l| +.. _tab-itempick-states: +.. csv-table:: Possible states of the ItemPick and BoxPick modules + :header: State name, Description + + "IDLE", "The module is idle." + "RUNNING", "The module is running and ready for load carrier detection and grasp computation." + "FATAL", "A fatal error has occurred." + +.. _sect-itempick-services: + +Services +-------- + +.. index:: + single: BoxPick; services + single: ItemPick; services + +The user can explore and call the ``rc_itempick`` and ``rc_boxpick`` module's services, +e.g. for development and testing, using the +:doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` or +the |rc_xxx| +:ref:`sect-web-gui`:latex:`\:(Section \ref{webgui:sect-web-gui})`. + +The ItemPick and BoxPick modules offer the following services. + +.. _expl-itempick-srv-detect-items: + +``detect_items`` (BoxPick only) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + Triggers the detection of rectangles as described in + :ref:`sect-itempick-detect-items`:latex:`\:(Section \ref{itempick:sect-itempick-detect-items})`. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_boxpick/services/detect_items + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_boxpick/services/detect_items + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_boxpick/services/detect_items + + .. tabs:: + + .. tab:: **Request** + + Required arguments: + + ``pose_frame``: see :ref:`sect-itempick-hand-eye-dep`:latex:`\:(Section \ref{itempick:sect-itempick-hand-eye-dep})`. + + ``item_models``: list of item models to be detected. + The type of the item model must be ``RECTANGLE`` or ``TEXTURED_BOX``. For type ``RECTANGLE``, ``rectangle`` must be filled, + while for ``TEXTURED_BOX``, ``textured_box`` must be filled. + See :ref:`sect-itempick-detect-items`:latex:`\:(Section \ref{itempick:sect-itempick-detect-items})` for a detailed description + of the item model types. + + Potentially required arguments: + + ``robot_pose``: see :ref:`sect-itempick-hand-eye-dep`:latex:`\:(Section \ref{itempick:sect-itempick-hand-eye-dep})`. + + Optional arguments: + + ``load_carrier_id``: ID of the load carrier which contains the items to be detected. + + ``load_carrier_compartment``: compartment inside the load carrier where to detect items + (see :ref:`sect-loadcarrier-compartment`:latex:`, Section \ref{loadcarrier_db:sect-loadcarrier-compartment}`). + + ``region_of_interest_id``: if ``load_carrier_id`` is set, + ID of the 3D region of interest where to search for the load carriers. + Otherwise, ID of the 3D region of interest where to search for the items. + + .. include:: _gen/nodes/services/rc_boxpick_detect_items_request.txt + + + .. tab:: **Response** + + ``load_carriers``: list of detected load carriers. + + ``items``: list of detected rectangles. + + ``timestamp``: timestamp of the image set the detection ran on. + + ``return_code``: holds possible warnings or error codes and messages. + + .. include:: _gen/nodes/services/rc_boxpick_detect_items_response.txt + +.. _expl-itempick-srv-compute-grasps: + +``compute_grasps`` (for ItemPick) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Triggers the computation of grasping poses for a suction device as described in + :ref:`sect-itempick-compute-grasps`:latex:`\:(Section \ref{itempick:sect-itempick-compute-grasps})`. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_itempick/services/compute_grasps + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_itempick/services/compute_grasps + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_itempick/services/compute_grasps + + .. tabs:: + + .. tab:: **Request** + + Required arguments: + + ``pose_frame``: see :ref:`sect-itempick-hand-eye-dep`:latex:`\:(Section \ref{itempick:sect-itempick-hand-eye-dep})`. + + ``suction_surface_length``: length of the suction device grasping surface. + + ``suction_surface_width``: width of the suction device grasping surface. + + Potentially required arguments: + + ``robot_pose``: see :ref:`sect-itempick-hand-eye-dep`:latex:`\:(Section \ref{itempick:sect-itempick-hand-eye-dep})`. + + Optional arguments: + + ``load_carrier_id``: ID of the load carrier which contains the items to be grasped. + + ``load_carrier_compartment``: compartment inside the load carrier where to compute grasps + (see :ref:`sect-loadcarrier-compartment`:latex:`, Section \ref{loadcarrier_db:sect-loadcarrier-compartment}`). + + ``region_of_interest_id``: if ``load_carrier_id`` is set, + ID of the 3D region of interest where to search for the load carriers. + Otherwise, ID of the 3D region of interest where to compute grasps. + + ``item_models``: list of unknown items with minimum and maximum dimensions, with the + minimum dimensions strictly smaller than the maximum dimensions. + Only one ``item_model`` of type ``UNKNOWN`` is currently supported. + + ``collision_detection``: see :ref:`sect-collision-check-other-modules`:latex:`\:(Section \ref{collisioncheck:sect-collision-check-other-modules})`. + + .. include:: _gen/nodes/services/rc_itempick_compute_grasps_request.txt + + + .. tab:: **Response** + + ``load_carriers``: list of detected load carriers. + + ``grasps``: sorted list of suction grasps. + + ``timestamp``: timestamp of the image set the detection ran on. + + ``return_code``: holds possible warnings or error codes and messages. + + .. include:: _gen/nodes/services/rc_itempick_compute_grasps_response.txt + + + +.. _expl-itempick-srv-compute-grasps-boxpick: + +``compute_grasps`` (for BoxPick) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Triggers the detection of rectangles and the computation of grasping poses + for the detected rectangles as described in + :ref:`sect-itempick-compute-grasps`:latex:`\:(Section \ref{itempick:sect-itempick-compute-grasps})`. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_boxpick/services/compute_grasps + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_boxpick/services/compute_grasps + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_boxpick/services/compute_grasps + + .. tabs:: + + .. tab:: **Request** + + Required arguments: + + ``pose_frame``: see :ref:`sect-itempick-hand-eye-dep`:latex:`\:(Section \ref{itempick:sect-itempick-hand-eye-dep})`. + + ``item_models``: list of item models to be detected. + The type of the item model must be ``RECTANGLE`` or ``TEXTURED_BOX``. For type ``RECTANGLE``, ``rectangle`` must be filled, + while for ``TEXTURED_BOX``, ``textured_box`` must be filled. + See :ref:`sect-itempick-detect-items`:latex:`\:(Section \ref{itempick:sect-itempick-detect-items})` for a detailed description + of the item model types. + + ``suction_surface_length``: length of the suction device grasping surface. + + ``suction_surface_width``: width of the suction device grasping surface. + + Potentially required arguments: + + ``robot_pose``: see :ref:`sect-itempick-hand-eye-dep`:latex:`\:(Section \ref{itempick:sect-itempick-hand-eye-dep})`. + + Optional arguments: + + ``load_carrier_id``: ID of the load carrier which contains the items to be grasped. + + ``load_carrier_compartment``: compartment inside the load carrier where to compute grasps + (see :ref:`sect-loadcarrier-compartment`:latex:`, Section \ref{loadcarrier_db:sect-loadcarrier-compartment}`). + + ``region_of_interest_id``: if ``load_carrier_id`` is set, + ID of the 3D region of interest where to search for the load carriers. + Otherwise, ID of the 3D region of interest where to compute grasps. + + ``collision_detection``: see :ref:`sect-collision-check-other-modules`:latex:`\:(Section \ref{collisioncheck:sect-collision-check-other-modules})`. + + .. include:: _gen/nodes/services/rc_boxpick_compute_grasps_request.txt + + + .. tab:: **Response** + + ``load_carriers``: list of detected load carriers. + + ``items``: list of detected rectangles. + + ``grasps``: sorted list of suction grasps. + + ``timestamp``: timestamp of the image set the detection ran on. + + ``return_code``: holds possible warnings or error codes and messages. + + .. include:: _gen/nodes/services/rc_boxpick_compute_grasps_response.txt + + +.. _expl-itempick-srv-set-sorting-strategies: + +``set_sorting_strategies`` +^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Persistently stores the sorting strategy for sorting the grasps returned by the ``compute_grasps`` service + (see :ref:`sect-itempick-compute-grasps`:latex:`, Section \ref{itempick:sect-itempick-compute-grasps}`). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes//services/set_sorting_strategies + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//services/set_sorting_strategies + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//services/set_sorting_strategies + + .. tabs:: + + .. tab:: **Request** + + Only one strategy may have a ``weight`` greater than 0. If all ``weight`` values are set to 0, the module will use the + default sorting strategy. + + If the weight for ``direction`` is set, the + ``vector`` must contain the direction vector and ``pose_frame`` must be either ``camera`` or ``external``. + + .. include:: _gen/nodes/services/rc_itempick_set_sorting_strategies_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_itempick_set_sorting_strategies_response.txt + +.. _expl-itempick-srv-get-sorting-strategies: + +``get_sorting_strategies`` +^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns the sorting strategy for sorting the grasps returned by the ``compute-grasps`` service + (see :ref:`sect-itempick-compute-grasps`:latex:`, Section \ref{itempick:sect-itempick-compute-grasps}`). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes//services/get_sorting_strategies + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//services/get_sorting_strategies + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//services/get_sorting_strategies + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_itempick_get_sorting_strategies_request.txt + + .. tab:: **Response** + + All ``weight`` values are 0 when the module uses the default sorting strategy. + + .. include:: _gen/nodes/services/rc_itempick_get_sorting_strategies_response.txt + +.. _expl-itempick-srv-start: + +``start`` +^^^^^^^^^ + + Starts the module. If the command is accepted, the module moves to state ``RUNNING``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes//services/start + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//services/start + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//services/start + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_itempick_start_request.txt + + .. tab:: **Response** + + The ``current_state`` value in the service response may differ from ``RUNNING`` if + the state transition is still in process when the service returns. + + .. include:: _gen/nodes/services/rc_itempick_start_response.txt + +.. _expl-itempick-srv-stop: + +``stop`` +^^^^^^^^ + + Stops the module. If the command is accepted, the module moves to state ``IDLE``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes//services/stop + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//services/stop + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//services/stop + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_itempick_stop_request.txt + + .. tab:: **Response** + + The ``current_state`` value in the service response may differ from ``IDLE`` if + the state transition is still in process when the service returns. + + .. include:: _gen/nodes/services/rc_itempick_stop_response.txt + +.. only:: rc_cube + + .. _expl-itempick-srv-trigger-dump: + + ``trigger_dump`` + ^^^^^^^^^^^^^^^^ + Triggers dumping of the detection that corresponds to the given timestamp, + or the latest detection, if no timestamp is given. The dumps are saved to the + connected USB drive. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//services/trigger_dump + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//services/trigger_dump + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/_trigger_dump_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/_trigger_dump_response.txt + + +.. _expl-itempick-srv-reset-params: + +``reset_defaults`` +^^^^^^^^^^^^^^^^^^ + + Resets all parameters of the module to its default values, + as listed in above table. Also resets sorting strategies. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes//services/reset_defaults + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//services/reset_defaults + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//services/reset_defaults + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_itempick_reset_defaults_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_itempick_reset_defaults_response.txt + +.. _expl-itempick-srv-set-roi: + +``set_region_of_interest`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Persistently stores a 3D region of interest on the |rc_xxx|. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-roi-srv-set-roi`:latex:`\:(Section \ref{roi:expl-roi-srv-set-roi})` in ``rc_roi_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//services/set_region_of_interest + +.. _expl-itempick-srv-get-roi: + +``get_regions_of_interest`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns the configured 3D regions of interest with the requested ``region_of_interest_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-roi-srv-get-roi`:latex:`\:(Section \ref{roi:expl-roi-srv-get-roi})` in ``rc_roi_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//services/get_regions_of_interest + +.. _expl-itempick-srv-delete-roi: + +``delete_regions_of_interest`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Deletes the configured 3D regions of interest with the requested ``region_of_interest_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-roi-srv-delete-roi`:latex:`\:(Section \ref{roi:expl-roi-srv-delete-roi})` in ``rc_roi_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//services/delete_regions_of_interest + + +.. _sect-itempick-return-codes: + +Return codes +------------ + +.. index:: + pair: ItemPick; return codes + pair: BoxPick; return codes + + +Each service response contains a ``return_code``, +which consists of a ``value`` plus an optional ``message``. +A successful service returns with a ``return_code`` value of ``0``. +Negative ``return_code`` values indicate that the service failed. +Positive ``return_code`` values indicate that the service succeeded with additional information. +The smaller value is selected in case a service has multiple ``return_code`` values, +but all messages are appended in the ``return_code`` message. + +The following table contains a list of common codes: + +.. tabularcolumns:: |c|L| +.. _tab-itempick-return-codes: +.. csv-table:: Return codes of the ItemPick and BoxPick services + :header: Code, Description + + "0", "Success" + "-1", "An invalid argument was provided" + "-3", "An internal timeout occurred, e.g. during box detection if the given dimension range is too large" + "-4", "Data acquisition took longer than allowed" + "-8", "The template has been deleted during detection." + "-10", "New element could not be added as the maximum storage capacity of load carriers, regions of interest or template has been exceeded" + "-11", "Sensor not connected, not supported or not ready" + "-200", "Fatal internal error" + "-301", "More than one item model of type ``UNKNOWN`` provided to the ``compute_grasps`` service" + "10", "The maximum storage capacity of load carriers, regions of interest or templates has been reached" + "11", "An existent persistent model was overwritten by the call to ``set_load_carrier`` or ``set_region_of_interest``" + "100", "The requested load carriers were not detected in the scene" + "101", "No valid surfaces or grasps were found in the scene" + "102", "The detected load carrier is empty" + "103", "All computed grasps are in collision with the load carrier" + "112", "Rejected detections of one or more clusters, because min_cluster_coverage was not reached." + "300", "A valid ``robot_pose`` was provided as argument but it is not required" + "999", "Additional hints for application development" + + +.. _sect-boxpick-template-upload: + +BoxPick Template API +-------------------- + +.. index:: + single: BoxPick; template api + single: BoxPick; template download + single: BoxPick; template upload + single: BoxPick; template deletion + +BoxPick templates are only available with the +Match extension of BoxPick. +For template upload, download, listing and removal, special |rest-api| endpoints are provided. +Templates can also be uploaded, downloaded and removed via the |webgui|. +The templates include the dimensions, the views and their poses, if set. +Up to 50 templates can be stored persistently on the |rc_xxx|. + +.. only:: rc_visard + + .. include:: _gen/swagger/rc_visard/templates_rc_boxpick.txt + +.. only:: rc_visard_ng + + .. include:: _gen/swagger/rc_visard_ng/templates_rc_boxpick.txt + +.. only:: rc_cube + + .. include:: _gen/swagger/rc_cube/templates_rc_boxpick.txt diff --git a/v24.04/en/_raw_sources/loadcarrier.rst.txt b/v24.04/en/_raw_sources/loadcarrier.rst.txt new file mode 100644 index 0000000..b762d9a --- /dev/null +++ b/v24.04/en/_raw_sources/loadcarrier.rst.txt @@ -0,0 +1,945 @@ + +.. include:: global_rst.glb + +.. _sect-loadcarrier: + +LoadCarrier +=========== + +.. index:: ! LoadCarrier + single: load carrier detection + pair: BoxPick; load carrier + pair: ItemPick; load carrier + pair: SilhouetteMatch; load carrier + +.. only:: rc_cube + + .. index:: + single: CADMatch; load carrier + +Introduction +------------ + +The LoadCarrier module allows the detection of load carriers, which is usually the first step +when objects or grasp points inside a bin should be found. The models of the load carriers +to be detected have to be defined in the :doc:`loadcarrier_db`:latex:`\:(Section +\ref{loadcarrier_db:sect-loadcarrier-db})` module. + +The LoadCarrier module is an optional on-board module of the |rc_xxx| and is licensed with +any of the modules |pick_modules| or |match_modules|. Otherwise it requires a +separate LoadCarrier +:ref:`license`:latex:`\:(Section \ref{maintenance:sect-updating-license})` +to be purchased. + +.. only:: rc_cube + + .. note:: + + This module is pipeline specific. Changes to its settings or parameters only affect + the respective camera pipeline and have no influence on other pipelines running on the |rc_cube|. + +.. _sect-loadcarrier-detect-lc: + +Detection of load carriers +-------------------------- + +.. index:: + pair: load carrier; detection + +The load carrier detection algorithm detects load carriers that match a specific load carrier +model, which must be defined in the :doc:`loadcarrier_db`:latex:`\:(Section \ref{loadcarrier_db:sect-loadcarrier-db})` module. +The load carrier model is referenced by its ID, which is passed to the load carrier detection. +The detection of a load carrier is based on the detection of its +rectangular rim. For this, it uses lines detected in the left camera image and the +depth values of the load carrier rim. Thus, the rim should form a contrast to the +background and the disparity image must be dense on the rim. + +If multiple load carriers of the specified load carrier ID are visible in the scene, +all of them will be detected and returned by the load carrier detection. + +By default, when ``assume_gravity_aligned`` is true and gravity +measurements are available, the algorithm searches for load carriers whose rim planes +are perpendicular to the measured gravity vector. To detect tilted load carriers, +``assume_gravity_aligned`` must be set to false or the load carrier's approximate +orientation must be specified as ``pose`` and the ``pose_type`` should be set to +``ORIENTATION_PRIOR``. + +Load carriers can be detected at a distance of up to 3 meters from the camera. + +When a 3D region of interest (see :ref:`sect-roi`:latex:`, Section \ref{roi:sect-roi}`) +is used to limit the volume in which load carriers should be detected, +only the load carriers' rims must be fully included in the region of interest. + +The detection algorithm returns the poses of the load carriers' origins +(see :ref:`sect-loadcarrier-definition`:latex:`, Section \ref{loadcarrier_db:sect-loadcarrier-definition}`) +in the desired pose frame. + +The detection functionality also determines if the detected load carriers are ``overfilled``, +which means, that objects protrude from the plane defined by the load carrier's outer part of the rim. + +.. _fig-loadcarrier-load-carrier-models: +.. figure:: images/itempick_load_carrier_reference_rim_sidebyside.* + :width: 100% + :align: center + + Load carrier models and reference frames + + +.. Because of the symmetry of the load carrier model, there is an ambiguity +.. in the definition of the x axis sense. +.. :numref:`fig-loadcarrier-load-carrier-orientation` visualizes how the sense of +.. the load carrier x axis is defined for rectangular load carriers. +.. +.. .. _fig-loadcarrier-load-carrier-orientation: +.. .. figure:: images/itempick_load_carrier_orientation.png +.. :width: 600 px +.. :align: center +.. +.. Disambiguation of the coordinate system for a rectangular load carrier. +.. All load carrier are viewed from the left eye of the |rc_visard|. +.. The dashed line represents the orientation where the x axis flips +.. (-45 degrees on the image plane). + +.. _sect-loadcarrier-detect-filling-level: + +Detection of filling level +-------------------------- + +.. index:: + pair: BoxPick; filling level + pair: ItemPick; filling level + pair: SilhouetteMatch; filling level + pair: LoadCarrier; filling level + +.. only:: rc_cube + + .. index:: + single: CADMatch; filling level + +The LoadCarrier module offers the ``detect_filling_level`` +service to compute the filling level of all detected load carriers. + +The load carriers are subdivided into a configurable number of cells in a 2D grid. +The maximum number of cells is 10x10. +For each cell, the following values are reported: + +- ``level_in_percent``: minimum, maximum and mean cell filling level in percent + from the load carrier floor. + These values can be larger than 100% if the cell is overfilled. +- ``level_free_in_meters``: minimum, maximum and mean cell free level in meters + from the load carrier rim. These values can be negative if the cell is overfilled. +- ``cell_size``: dimensions of the 2D cell in meters. +- ``cell_position``: position of the cell center in meters + (either in ``camera`` or ``external`` frame, see :ref:`sect-loadcarrier-hand-eye-dep`:latex:`, Section \ref{loadcarrier:sect-loadcarrier-hand-eye-dep}`). + The z-coordinate is on the level of the load carrier rim. +- ``coverage``: represents the proportion of valid pixels in this cell. + It varies between 0 and 1 with steps of 0.1. + A low coverage indicates that the cell contains several missing data + (i.e. only a few points were actually measured in this cell). + +These values are also calculated for the whole load carrier itself. +If no cell subdivision is specified, only the overall filling level is computed. + +.. _fig-loadcarrier-lc-filling-level: +.. figure:: images/itempick_lc_filling_level.png + :width: 100% + :align: center + + Visualizations of the load carrier filling level: overall filling level without + grid (left), 4x3 grid (center), 8x8 grid (right). + The load carrier content is shown in a green gradient from white + (on the load carrier floor) to dark green. + The overfilled regions are visualized in red. Numbers indicate cell IDs. + +.. _sect-loadcarrier-dependencies: + +Interaction with other modules +------------------------------ + +Internally, the LoadCarrier module depends on, and interacts with other on-board +modules as listed below. + +.. Note:: + All changes and configuration updates to these modules will affect + the performance of the LoadCarrier module. + +.. For each load carrier detection, the LoadCarrier module +.. acquires datasets of synchronized images and estimates the gravity vector. +.. The data acquisition step normally takes between 500 ms and 600 ms +.. with "High" depth image quality. + +.. _sect-loadcarrier-stereo-camera-matching: + +Stereo camera and Stereo matching +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The LoadCarrier module makes internally use of the following data: + +- Rectified images from the :doc:`stereo_camera` module + (``rc_camera``:latex:`, Section \ref{stereo_camera:sect-stereo-camera}`); + +- Disparity, error, and confidence images from the :doc:`stereo_matching` module + (``rc_stereomatching``:latex:`, Section \ref{stereo_matching:sect-stereo-matching}`). + +All processed images are guaranteed to be captured after the module trigger time. + +.. _sect-loadcarrier-iocontrol-dep: + +IO and Projector Control +^^^^^^^^^^^^^^^^^^^^^^^^ + +In case the |rc_xxx| is used in conjunction with an external random dot +projector and the :doc:`iocontrol` module (``rc_iocontrol``:latex:`, +Section \ref{iocontrol:sect-iocontrol}`), it is recommended to connect +the projector to GPIO Out 1 and set the stereo-camera module's +acquisition mode to ``SingleFrameOut1`` (see :ref:`Stereo matching +parameters`:latex:`, Section +\ref{stereo_matching:sect-disp-image-parameters})`, so that on each +image acquisition trigger an image with and without projector pattern is +acquired. + +Alternatively, the output mode for the GPIO output in use should be set +to ``ExposureAlternateActive`` (see :ref:`sect-iocontrol-params`:latex:`, +Section \ref{iocontrol:sect-iocontrol-params}`). + +In either case, +the *Auto Exposure Mode* ``exp_auto_mode`` should be set to ``AdaptiveOut1`` to optimize the exposure +of both images (see :ref:`Stereo camera parameters`:latex:`, Section \ref{stereo_camera:sect-cam-params})`. + +No additional changes are required to use the LoadCarrier module +in combination with a random dot projector. + +.. _sect-loadcarrier-hand-eye-dep: + +Hand-eye calibration +^^^^^^^^^^^^^^^^^^^^ + +In case the camera has been calibrated to a robot, the loadcarrier module +can automatically provide poses in the robot coordinate frame. +For the loadcarrier nodes' :ref:`sect-loadcarrier-services`:latex:`\:(Section \ref{loadcarrier:sect-loadcarrier-services})`, the frame of the +output poses can be controlled with the ``pose_frame`` argument. + +Two different ``pose_frame`` values can be chosen: + +1. **Camera frame** (``camera``). + All poses provided by the modules are in the camera frame, + and no prior knowledge about the pose of the camera in the environment is required. + This means that the configured load carriers move with the camera. + It is the user's responsibility to update the configured poses + if the camera frame moves (e.g. with a robot-mounted camera). + +2. **External frame** (``external``). + All poses provided by the modules are in the external frame, + configured by the user during the hand-eye calibration process. + The module relies on the on-board + :doc:`Hand-eye calibration module`:latex:`\:(Section \ref{handeye_calibration:sect-handeye-calibration})` + to retrieve the sensor mounting (static or robot mounted) and + the hand-eye transformation. + If the mounting is static, no further information is needed. + If the sensor is robot-mounted, the ``robot_pose`` is required + to transform poses to and from the ``external`` frame. + +.. Note:: + If no hand-eye calibration is available, all ``pose_frame`` values should be set to ``camera``. + +All ``pose_frame`` values that are not ``camera`` or ``external`` are rejected. + +.. _sect-loadcarrier-parameters: + +Parameters +---------- + +.. index:: + single: LoadCarrier; parameters + +The LoadCarrier module is called ``rc_load_carrier`` +in the |rest-api| and is represented in the +:ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})`:cubeonly:`in the desired pipeline` under +:menuselection:`Modules --> LoadCarrier`. +The user can explore and configure the LoadCarrier +module's run-time parameters, e.g. for development and testing, using the +|webgui| or the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`. + +Parameter overview +^^^^^^^^^^^^^^^^^^ + +.. only:: rc_cube + + .. note:: The default values in the parameter table + below show the values of the |rc_visard|. The values can be + different for other sensors. + +.. include:: _gen/nodes/params/rc_load_carrier.txt + +Description of run-time parameters +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Each run-time parameter is represented by a row on the *LoadCarrier Settings* section +of the |webgui|'s *LoadCarrier* page under *Modules*. +The name in the |webgui| is given in brackets behind the parameter name and the parameters are +listed in the order they appear in the |webgui|. The parameters are prefixed with ``load_carrier_`` +when they are used outside the ``rc_load_carrier`` module from another detection module +using the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`. + +.. _expl-loadcarrier-assume-gravity-aligned: + +``assume_gravity_aligned`` (*Assume Gravity Aligned*) +''''''''''''''''''''''''''''''''''''''''''''''''''''' + If this parameter is set to true, then only load carriers without tilt will be detected. This can speed up the detection. + If this parameter is set to false, tilted load carriers will also be detected. + + This parameter is ignored for load carriers with an orientation prior. + +.. only:: rc_cube + + .. Note:: + Gravity alignment is only available for pipelines of type ``rc_visard``. + The gravity vector is estimated from linear acceleration readings from the on-board IMU. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_load_carrier/parameters?assume_gravity_aligned= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_load_carrier/parameters?assume_gravity_aligned= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/parameters?assume_gravity_aligned= + +.. _expl-loadcarrier-model-tolerance: + +``model_tolerance`` (*Model Tolerance*) +''''''''''''''''''''''''''''''''''''''' + indicates how much the estimated load carrier dimensions are allowed to differ from the load carrier model dimensions in meters. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_load_carrier/parameters?model_tolerance= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_load_carrier/parameters?model_tolerance= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/parameters?model_tolerance= + +.. _expl-loadcarrier-crop-distance: + +``crop_distance`` (*Crop Distance*) +''''''''''''''''''''''''''''''''''' + sets the safety margin in meters by which the load carrier's inner dimensions are + reduced to define the region of interest for detection (ref. :numref:`fig-loadcarrier-inside-volume`). + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_load_carrier/parameters?crop_distance= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_load_carrier/parameters?crop_distance= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/parameters?crop_distance= + +.. _expl-loadcarrier-min-plausibility: + +``min_plausibility`` (*Minimum Plausibility*): +'''''''''''''''''''''''''''''''''''''''''''''' + The minimum plausibility defines how much of the plane around the load carrier rim must at least be free to count as valid detection. + Increase the minimal plausibility to reject false positive detections and decrease the value in case a clearly visible load carrier cannot be detected. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_load_carrier/parameters?min_plausibility= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_load_carrier/parameters?min_plausibility= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/parameters?min_plausibility= + +.. _sect-loadcarrier-status-values: + +Status values +------------- + +The LoadCarrier module reports the following status values: + +.. tabularcolumns:: |l|L| +.. csv-table:: The ``rc_load_carrier`` module's status values + :header: Name, Description + + "``data_acquisition_time``","Time in seconds required to acquire image pair" + "``last_timestamp_processed``","The timestamp of the last processed image pair" + "``load_carrier_detection_time``","Processing time of the last detection in seconds" + +.. _sect-loadcarrier-services: + +Services +-------- + +.. index:: + single: LoadCarrier; services + +The user can explore and call the LoadCarrier module's services, +e.g. for development and testing, using the +:doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` or +the |rc_xxx| +:ref:`sect-web-gui`:latex:`\:(Section \ref{webgui:sect-web-gui})` on the +*LoadCarrier* page under *Modules*. + +The LoadCarrier module offers the following services. + +.. _expl-loadcarrier-srv-detect-lc: + +``detect_load_carriers`` +^^^^^^^^^^^^^^^^^^^^^^^^ + + Triggers a load carrier detection as described in + :ref:`sect-loadcarrier-detect-lc`:latex:`\:(Section \ref{loadcarrier:sect-loadcarrier-detect-lc})`. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_load_carrier/services/detect_load_carriers + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_load_carrier/services/detect_load_carriers + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/services/detect_load_carriers + + .. tabs:: + + .. tab:: **Request** + + Required arguments: + + ``pose_frame``: see :ref:`sect-loadcarrier-hand-eye-dep`:latex:`\:(Section \ref{loadcarrier:sect-loadcarrier-hand-eye-dep})`. + + ``load_carrier_ids``: IDs of the load carriers which should be detected. Currently only one ID can be specified. + + Potentially required arguments: + + ``robot_pose``: see :ref:`sect-loadcarrier-hand-eye-dep`:latex:`\:(Section \ref{loadcarrier:sect-loadcarrier-hand-eye-dep})`. + + Optional arguments: + + ``region_of_interest_id``: ID of the 3D region of interest where to search for the load carriers. + + ``region_of_interest_2d_id``: ID of the 2D region of interest where to search for the load carriers. + + .. note:: Only one type of region of interest can be set. + + .. include:: _gen/nodes/services/rc_load_carrier_detect_load_carriers_request.txt + + .. tab:: **Response** + + ``load_carriers``: list of detected load carriers. + + ``timestamp``: timestamp of the image set the detection ran on. + + ``return_code``: holds possible warnings or error codes and messages. + + .. include:: _gen/nodes/services/rc_load_carrier_detect_load_carriers_response.txt + + +.. _expl-loadcarrier-srv-detect-filling-level: + +``detect_filling_level`` +^^^^^^^^^^^^^^^^^^^^^^^^ + + Triggers a load carrier filling level detection as described in + :ref:`sect-loadcarrier-detect-filling-level`:latex:`\:(Section \ref{loadcarrier:sect-loadcarrier-detect-filling-level})`. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_load_carrier/services/detect_filling_level + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_load_carrier/services/detect_filling_level + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/services/detect_filling_level + + .. tabs:: + + .. tab:: **Request** + + Required arguments: + + ``pose_frame``: see :ref:`sect-loadcarrier-hand-eye-dep`:latex:`\:(Section \ref{loadcarrier:sect-loadcarrier-hand-eye-dep})`. + + ``load_carrier_ids``: IDs of the load carriers which should be detected. Currently only one ID can be specified. + + Potentially required arguments: + + ``robot_pose``: see :ref:`sect-loadcarrier-hand-eye-dep`:latex:`\:(Section \ref{loadcarrier:sect-loadcarrier-hand-eye-dep})`. + + Optional arguments: + + ``filling_level_cell_count``: Number of cells in the filling level grid. + + ``region_of_interest_id``: ID of the 3D region of interest where to search for the load carriers. + + ``region_of_interest_2d_id``: ID of the 2D region of interest where to search for the load carriers. + + .. note:: Only one type of region of interest can be set. + + .. include:: _gen/nodes/services/rc_load_carrier_detect_filling_level_request.txt + + .. tab:: **Response** + + ``load_carriers``: list of detected load carriers and their filling levels. + + ``timestamp``: timestamp of the image set the detection ran on. + + ``return_code``: holds possible warnings or error codes and messages. + + .. include:: _gen/nodes/services/rc_load_carrier_detect_filling_level_response.txt + + +.. _expl-loadcarrier-srv-reset-defaults: + +``reset_defaults`` +^^^^^^^^^^^^^^^^^^ + Restores and applies the default values for this module's parameters + ("factory reset"). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_load_carrier/services/reset_defaults + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_load_carrier/services/reset_defaults + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/services/reset_defaults + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_load_carrier_reset_defaults_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_load_carrier_reset_defaults_response.txt + +.. only:: rc_cube + + .. _expl-loadcarrier-srv-trigger-dump: + + ``trigger_dump`` + ^^^^^^^^^^^^^^^^ + Triggers dumping of the detection that corresponds to the given timestamp, + or the latest detection, if no timestamp is given. The dumps are saved to the + connected USB drive. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_load_carrier/services/trigger_dump + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/services/trigger_dump + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_load_carrier_trigger_dump_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_load_carrier_trigger_dump_response.txt + +.. _expl-loadcarrier-srv-set-lc: + +``set_load_carrier`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Persistently stores a load carrier on the |rc_xxx|. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-loadcarrier-db-srv-set-lc`:latex:`\:(Section \ref{loadcarrier_db:expl-loadcarrier-db-srv-set-lc})` + in ``rc_load_carrier_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/services/set_load_carrier + + The definitions of the request and response are the same as described in + :ref:`expl-loadcarrier-db-srv-set-lc`:latex:`\:(Section \ref{loadcarrier_db:expl-loadcarrier-db-srv-set-lc})` + in ``rc_load_carrier_db``. + + +.. _expl-loadcarrier-srv-get-lc: + +``get_load_carriers`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns the configured load carriers with the requested ``load_carrier_ids``. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-loadcarrier-db-srv-get-lc`:latex:`\:(Section \ref{loadcarrier_db:expl-loadcarrier-db-srv-get-lc})` + in ``rc_load_carrier_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/services/get_load_carriers + + The definitions of the request and response are the same as described in + :ref:`expl-loadcarrier-db-srv-get-lc`:latex:`\:(Section \ref{loadcarrier_db:expl-loadcarrier-db-srv-get-lc})` + in ``rc_load_carrier_db``. + +.. _expl-loadcarrier-srv-delete-lc: + +``delete_load_carriers`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Deletes the configured load carriers with the requested ``load_carrier_ids``. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-loadcarrier-db-srv-delete-lc`:latex:`\:(Section \ref{loadcarrier_db:expl-loadcarrier-db-srv-delete-lc})` + in ``rc_load_carrier_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/services/delete_load_carriers + + The definitions of the request and response are the same as described in + :ref:`expl-loadcarrier-db-srv-delete-lc`:latex:`\:(Section \ref{loadcarrier_db:expl-loadcarrier-db-srv-delete-lc})` + in ``rc_load_carrier_db``. + +.. _expl-loadcarrier-srv-set-roi: + +``set_region_of_interest`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Persistently stores a 3D region of interest on the |rc_xxx|. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-roi-srv-set-roi`:latex:`\:(Section \ref{roi:expl-roi-srv-set-roi})` in ``rc_roi_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/services/set_region_of_interest + + The definitions of the request and response are the same as described in + :ref:`expl-roi-srv-set-roi`:latex:`\:(Section \ref{roi:expl-roi-srv-set-roi})` + in ``rc_roi_db``. + +.. _expl-loadcarrier-srv-get-rois: + +``get_regions_of_interest`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns the configured 3D regions of interest with the requested ``region_of_interest_ids``. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-roi-srv-get-roi`:latex:`\:(Section \ref{roi:expl-roi-srv-get-roi})` in ``rc_roi_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/services/get_regions_of_interest + + The definitions of the request and response are the same as described in + :ref:`expl-roi-srv-get-roi`:latex:`\:(Section \ref{roi:expl-roi-srv-get-roi})` + in ``rc_roi_db``. + +.. _expl-loadcarrier-srv-delete-rois: + +``delete_regions_of_interest`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Deletes the configured 3D regions of interest with the requested ``region_of_interest_ids``. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-roi-srv-delete-roi`:latex:`\:(Section \ref{roi:expl-roi-srv-delete-roi})` in ``rc_roi_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/services/delete_regions_of_interest + + The definitions of the request and response are the same as described in + :ref:`expl-roi-srv-delete-roi`:latex:`\:(Section \ref{roi:expl-roi-srv-delete-roi})` + in ``rc_roi_db``. + +.. _expl-loadcarrier-srv-set-roi-2d: + +``set_region_of_interest_2d`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Persistently stores a 2D region of interest on the |rc_xxx|. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-roi-srv-set-roi-2d`:latex:`\:(Section \ref{roi:expl-roi-srv-set-roi-2d})` in ``rc_roi_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/services/set_region_of_interest_2d + + The definitions of the request and response are the same as described in + :ref:`expl-roi-srv-set-roi-2d`:latex:`\:(Section \ref{roi:expl-roi-srv-set-roi-2d})` + in ``rc_roi_db``. + +.. _expl-loadcarrier-srv-get-rois-2d: + +``get_regions_of_interest_2d`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns the configured 2D regions of interest with the requested ``region_of_interest_2d_ids``. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-roi-srv-get-roi-2d`:latex:`\:(Section \ref{roi:expl-roi-srv-get-roi-2d})` in ``rc_roi_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/services/get_region_of_interest_2d + + The definitions of the request and response are the same as described in + :ref:`expl-roi-srv-get-roi-2d`:latex:`\:(Section \ref{roi:expl-roi-srv-get-roi-2d})` + in ``rc_roi_db``. + +.. _expl-loadcarrier-srv-delete-rois-2d: + +``delete_regions_of_interest_2d`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Deletes the configured 2D regions of interest with the requested ``region_of_interest_2d_ids``. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-roi-srv-delete-roi-2d`:latex:`\:(Section \ref{roi:expl-roi-srv-delete-roi-2d})` in ``rc_roi_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_load_carrier/services/delete_regions_of_interest_2d + + The definitions of the request and response are the same as described in + :ref:`expl-roi-srv-delete-roi-2d`:latex:`\:(Section \ref{roi:expl-roi-srv-delete-roi-2d})` + in ``rc_roi_db``. + +.. _sect-loadcarrier-return-codes: + +Return codes +------------ + +.. index:: + pair: LoadCarrier; return codes + +Each service response contains a ``return_code``, +which consists of a ``value`` plus an optional ``message``. +A successful service returns with a ``return_code`` value of ``0``. +Negative ``return_code`` values indicate that the service failed. +Positive ``return_code`` values indicate that the service succeeded with additional information. +The smaller value is selected in case a service has multiple ``return_code`` values, +but all messages are appended in the ``return_code`` message. + +The following table contains a list of common codes: + +.. tabularcolumns:: |c|L| +.. _tab-loadcarrier-return-codes: +.. csv-table:: Return codes of the LoadCarrier module's services + :header: Code, Description + + "0", "Success" + "-1", "An invalid argument was provided" + "-4", "Data acquisition took longer than allowed" + "-10", "New element could not be added as the maximum storage capacity of load carriers has been exceeded" + "-11", "Sensor not connected, not supported or not ready" + "-302", "More than one load carrier provided to the ``detect_load_carriers`` or ``detect_filling_level`` services, but only one is supported" + "3", "The detection timeout during load carrier detection has been reached. Consider reducing the model tolerance." + "10", "The maximum storage capacity of load carriers has been reached" + "11", "An existent persistent model was overwritten by the call to ``set_load_carrier``" + "100", "The requested load carriers were not detected in the scene" + "102", "The detected load carrier has no points inside" + "300", "A valid ``robot_pose`` was provided as argument but it is not required" + diff --git a/v24.04/en/_raw_sources/loadcarrier_db.rst.txt b/v24.04/en/_raw_sources/loadcarrier_db.rst.txt new file mode 100644 index 0000000..0f70b77 --- /dev/null +++ b/v24.04/en/_raw_sources/loadcarrier_db.rst.txt @@ -0,0 +1,366 @@ + +.. include:: global_rst.glb + +.. _sect-loadcarrier-db: + +LoadCarrierDB +============= + +.. index:: ! LoadCarrierDB + single: load carrier model + pair: BoxPick; load carrier + pair: ItemPick; load carrier + pair: SilhouetteMatch; load carrier + +.. only:: rc_cube + + .. index:: + single: CADMatch; load carrier + +Introduction +------------ + +The LoadCarrierDB module (Load carrier database module) allows the global definition of load carriers, +which can then be used in many detection modules. The specified load carriers are available for all +modules supporting load carriers on the |rc_xxx|. + +.. only:: rc_cube + + .. note:: + + This module is global on the |rc_cube|. Changes to its settings or parameters affect + every camera pipeline running on the |rc_cube|. + +The LoadCarrierDB module is a base module which is available on every |rc_xxx|. + +.. tabularcolumns:: |l|L| +.. _tab-lc-spec: +.. csv-table:: Specifications of the LoadCarrierDB module + + "Supported load carrier types", "4-sided or 3-sided" + "Supported rim types", "solid rim, stepped rim or ledged rim" + "Min. load carrier dimensions", "0.1 m x 0.1 m x 0.05 m" + "Max. load carrier dimensions", "2 m x 2 m x 2 m" + "Max. number of load carriers", "50" + "Load carriers available in", "|pick_modules| and |match_modules|" + "Supported pose types", "no pose, orientation prior, exact pose" + "Supported reference frames", "camera, external" + +.. _sect-loadcarrier-definition: + +Load carrier definition +----------------------- + +.. index:: + pair: load carrier; definition + pair: load carrier; rim + pair: load carrier; dimensions + pair: load carrier; inner volume + pair: load carrier; pose + pair: load carrier; orientation prior + +A load carrier (bin) is a container with four walls, a floor and a rectangular rim, +which can contain objects. It can be used to limit the volume in which to search +for objects or grasp points. + +A load carrier is defined by its ``outer_dimensions`` and ``inner_dimensions``. +The maximum ``outer_dimensions`` are 2.0 meters in every dimension. + +The origin of the load carrier reference frame is in the center of the load carrier's +*outer* box and its z axis is perpendicular to the load carrier's floor +pointing outwards (see :numref:`fig-loadcarrier-load-carrier`). + +.. _fig-loadcarrier-load-carrier: +.. figure:: images/itempick_load_carrier_reference.* + :width: 100% + :align: center + + Load carrier with reference frame and inner and outer dimensions + +.. Note:: + Typically, outer and inner dimensions of a load carrier are available in the + specifications of the load carrier manufacturer. + +The inner volume of the load carrier is defined by its inner dimensions, but includes a region +of 10 cm height above the load carrier, so that also items protruding from the load carrier +are considered for detection or grasp computation. Furthermore, an additional +``crop_distance`` is subtracted from the inner volume in every dimension, which acts as a safety margin and can +be configured as run-time parameter in the LoadCarrier module (see :ref:`sect-loadcarrier-parameters`:latex:`, Section +\ref{loadcarrier:sect-loadcarrier-parameters}`). +:numref:`fig-loadcarrier-inside-volume` visualizes the inner volume of a load carrier. Only +points which are inside this volume are considered for detections. + +.. _fig-loadcarrier-inside-volume: +.. figure:: images/load_carrier_inside_volume.* + :width: 50% + :align: center + + Visualization of the inner volume of a load carrier. Only + points which are inside this volume are considered for detections. + +Since the load carrier detection +is based on the detection of the load carrier's rim, the rim geometry must be specified if it +cannot be determined from the difference between outer and inner dimensions. A load carrier with a stepped rim can be defined by setting a ``rim_thickness``. The rim +thickness gives the thickness of the outer part of the rim in the x and y direction. +When a rim thickness is given, an optional ``rim_step_height`` can also be +specified, which gives the height of the step between the outer and the inner part of the rim. +When the step height is given, it will also be considered during collision checking +(see :doc:`collisioncheck`:latex:`, Section \ref{collisioncheck:sect-collision}`). Examples of load +carriers with stepped rims are shown in :numref:`fig-loadcarrier-load-carrier-rim-types` A, B. +In addition to the ``rim_thickness`` and ``rim_step_height`` the ``rim_ledge`` can be specified +for defining load carriers whose inner rim protrudes into the interior of the load carrier, such as pallet cages. +The ``rim_ledge`` gives the thickness of the inner part of the rim in the x and y direction. +An example of a load carrier with a ledged rim is shown in :numref:`fig-loadcarrier-load-carrier-rim-types` C. + +.. _fig-loadcarrier-load-carrier-rim-types: +.. figure:: images/rim_types.* + :width: 100% + :align: center + + Examples of load carriers with stepped rim (A, B) or ledged rim (C) + +The different rim types are applicable to both, standard 4-sided and 3-sided load carriers. For a +3-sided load carrier, the ``type`` must be ``THREE_SIDED``. If the type is set to ``STANDARD`` or +left empty, a 4-sided load carrier is specified. A 3-sided load carrier has one side that is lower +than the other three sides. This ``height_open_side`` is measured from the outer bottom of the load carrier. The open side is at the negative +y-axis of the load carrier's coordinate system. Examples of the two load carrier types are given +in :numref:`fig-loadcarrier-load-carrier-types`. The height of the lower side is only considered during +collision checking and not required for the detection of the load carrier. + +.. _fig-loadcarrier-load-carrier-types: +.. figure:: images/lc_types.* + :width: 100% + :align: center + + Examples of a standard 4-sided load carrier (A) and a 3-sided load carrier (B) + +A load carrier can be specified with a full 3D ``pose`` consisting of a ``position`` and +an ``orientation`` quaternion, given in a ``pose_frame``. Based on the given ``pose_type`` +this pose is either used as an orientation prior (``pose_type`` is ``ORIENTATION_PRIOR`` or empty), +or as the exact pose of the load carrier (``pose_type`` is ``EXACT_POSE``). + +In case the pose serves as orientation prior, the detected load carrier pose is guaranteed +to have the minimum rotation with respect to the load carrier's prior pose. This pose type +is useful for detecting tilted load carriers and for resolving the orientation ambiguity in +the x and y direction caused by the symmetry of the load carrier model. + +In case the pose type is set to ``EXACT_POSE``, no load carrier detection will be performed on the scene data, +but the given pose will be used in exactly the same way as if the load carrier is detected at +that pose. This pose type is especially useful in cases where load carriers do not change their positions +and/or are hard to detect (e.g. because their rim is too thin or the material is too shiny). + +The |rcxxx| can persistently store up to 50 different +load carrier models, each one identified by a different ``id``. +The configuration of a load carrier model is normally performed offline, +during the set up the desired application. +This can be done via the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` or in the |rcxxx| |webgui|. + +.. Note:: + The configured load carrier models + are persistent even over firmware updates and rollbacks. + + +.. _sect-loadcarrier-compartment: + +Load carrier compartments +------------------------- + +.. index:: + pair: load carrier; compartment + +Some detection modules can make use of a ``load_carrier_compartment`` to further limit the volume for the detection, +for example :ref:`ItemPick's compute_grasps service`:latex:`\:(see \ref{itempick:expl-itempick-srv-compute-grasps})`. +A load carrier compartment is a box whose ``pose`` is defined as the transformation from the load carrier reference frame to the compartment +reference frame, which is located in the center of the compartment box (see :numref:`fig-loadcarrier-compartment`). +The load carrier compartment is defined for each detection call separately and is not part of the load carrier definition in the +LoadCarrierDB module. + +.. _fig-loadcarrier-compartment: +.. figure:: images/itempick_load_carrier_compartment.* + :width: 100% + :align: center + + Sample compartment inside a load carrier. The coordinate frame shown in the image is the + reference frame of the compartment. + +The compartment volume is intersected with the load carrier inner volume to compute the volume for the detection. +If this intersection should also contain the 10 cm region above the load carrier, the height of the compartment box +must be increased accordingly. + +.. _sect-loadcarrier-db-dependencies: + +Interaction with other modules +------------------------------ + +Internally, the LoadCarrierDB module depends on, and interacts with other on-board +modules as listed below. + +.. _sect-loadcarrier-hand-eye-dep: + +Hand-eye calibration +^^^^^^^^^^^^^^^^^^^^ + +In case the camera has been calibrated to a robot, the load carrier's exact pose +or orientation prior can be provided in the robot coordinate frame by setting the corresponding +``pose_frame`` argument to ``external``. + +Two different ``pose_frame`` values can be chosen: + +1. **Camera frame** (``camera``). + The load carrier pose or orientation prior is provided in the camera frame, + and no prior knowledge about the pose of the camera in the environment is required. + This means that the configured load carriers move with the camera. + It is the user's responsibility to update the configured poses + if the camera frame moves (e.g. with a robot-mounted camera). + +2. **External frame** (``external``). + The load carrier pose or orientation prior is provided in the external frame, + configured by the user during the hand-eye calibration process. + The module relies on the on-board + :doc:`Hand-eye calibration module`:latex:`\:(Section \ref{handeye_calibration:sect-handeye-calibration})` + to retrieve the sensor mounting (static or robot mounted) and + the hand-eye transformation. + +.. Note:: + If no hand-eye calibration is available, all ``pose_frame`` values should be set to ``camera``. + +All ``pose_frame`` values that are not ``camera`` or ``external`` are rejected. + +.. _sect-loadcarrier-services: + +Services +-------- + +.. index:: + single: LoadCarrierDB; services + +The LoadCarrierDB module is called ``rc_load_carrier_db`` in the |rest-api| and is represented in the +:ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})` under +:menuselection:`Database --> Load Carriers`. +The user can explore and call the LoadCarrierDB module's services, +e.g. for development and testing, using the +:doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` or +the |webgui|. + +The LoadCarrierDB module offers the following services. + +.. _expl-loadcarrier-db-srv-set-lc: + +``set_load_carrier`` +^^^^^^^^^^^^^^^^^^^^ + + Persistently stores a load carrier on the |rc_xxx|. + All configured load carriers are persistent over firmware updates and rollbacks. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v2/nodes/rc_load_carrier_db/services/set_load_carrier + + .. tabs:: + + .. tab:: **Request** + + Details for the definition of the ``load_carrier`` type are given in + :ref:`sect-loadcarrier-definition`:latex:`\:(Section \ref{loadcarrier_db:sect-loadcarrier-definition})`. + + The field ``type`` is optional and accepts ``STANDARD`` and ``THREE_SIDED``. + + The field ``pose_type`` is optional and accepts ``NO_POSE``, ``EXACT_POSE`` and ``ORIENTATION_PRIOR``. + + .. include:: _gen/nodes/services/rc_load_carrier_set_load_carrier_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_load_carrier_set_load_carrier_response.txt + +.. _expl-loadcarrier-db-srv-get-lc: + +``get_load_carriers`` +^^^^^^^^^^^^^^^^^^^^^ + + Returns the configured load carriers with the requested ``load_carrier_ids``. + If no ``load_carrier_ids`` are provided, all configured load carriers are returned. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v2/nodes/rc_load_carrier_db/services/get_load_carriers + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_load_carrier_get_load_carriers_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_load_carrier_get_load_carriers_response.txt + + + +.. _expl-loadcarrier-db-srv-delete-lc: + +``delete_load_carriers`` +^^^^^^^^^^^^^^^^^^^^^^^^ + + Deletes the configured load carriers with the requested ``load_carrier_ids``. + All load carriers to be deleted must be explicitly stated in ``load_carrier_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v2/nodes/rc_load_carrier_db/services/delete_load_carriers + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_load_carrier_delete_load_carriers_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_load_carrier_delete_load_carriers_response.txt + + +.. _sect-loadcarrier-db-return-codes: + +Return codes +------------ + +.. index:: + pair: LoadCarrierDB; return codes + +Each service response contains a ``return_code``, +which consists of a ``value`` plus an optional ``message``. +A successful service returns with a ``return_code`` value of ``0``. +Negative ``return_code`` values indicate that the service failed. +Positive ``return_code`` values indicate that the service succeeded with additional information. +The smaller value is selected in case a service has multiple ``return_code`` values, +but all messages are appended in the ``return_code`` message. + +The following table contains a list of common codes: + +.. tabularcolumns:: |c|L| +.. _tab-loadcarrier-return-codes: +.. csv-table:: Return codes of the LoadCarrierDB module's services + :header: Code, Description + + "0", "Success" + "-1", "An invalid argument was provided" + "-10", "New element could not be added as the maximum storage capacity of load carriers has been exceeded" + "10", "The maximum storage capacity of load carriers has been reached" + "11", "An existent persistent model was overwritten by the call to ``set_load_carrier``" + diff --git a/v24.04/en/_raw_sources/maintenance.rst.txt b/v24.04/en/_raw_sources/maintenance.rst.txt new file mode 100644 index 0000000..74d649d --- /dev/null +++ b/v24.04/en/_raw_sources/maintenance.rst.txt @@ -0,0 +1,283 @@ +.. include:: global_rst.glb + +.. _sect-maintenance: + +Maintenance +=========== + +.. only:: rc_visard or rc_visard_ng + + .. Warning:: The customer does not need to open the |rc_xxx|'s housing to perform + maintenance. Unauthorized opening will void the warranty. + + .. _sect-lens-cleaning: + + Lens cleaning + ------------- + + Glass lenses with antireflective coating are used to reduce glare. Please take special + care when cleaning the lenses. To clean them, use a soft lens-cleaning brush to remove + dust or dirt particles. Then use a clean microfiber cloth that is designed to clean lenses, + and gently wipe the lens using a circular motion to avoid scratches that may compromise + the sensor's performance. For stubborn dirt, high purity isopropanol or a lens cleaning + solution formulated for coated lenses (such as the Uvex Clear family of products) may be used. + + .. _sect-maintenance-camera-calibration: + + Camera calibration + ------------------ + + The cameras are calibrated during production. Under normal operating conditions, the calibration + will be valid for the life time of the sensor. High impact, such as occurring when dropping + the |rc_xxx|, can change the camera's parameters slightly. In this case, calibration can + be verified and recalibration undertaken via the |webgui| + (see :doc:`camera_calibration`:latex:`, Section \ref{camera_calibration:sect-camera-calibration}`). + +.. _sect-backup-settings: + +Creating and restoring backups of settings +------------------------------------------ + +.. index:: + pair: settings; backup + pair: settings; download + pair: settings; upload + pair: settings; restore + single: Web GUI; backup + +The |rc_xxx| offers the possibility to download the current settings as backup or for +transferring them to a different |rc_visard| or |rc_cube|. + +The current settings of the |rc_xxx| can be downloaded on the +:ref:`Web GUI`'s :latex:`(Section \ref{webgui:sect-web-gui})` *System* page +in the |rc_xxx| *Settings* section. They can also be downloaded via the |rcxxx|'s +:ref:`sect-rest-api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` +using the :http:get:`/system/backup` request. + +For downloading a backup, the user can choose which settings to include: + +- ``nodes``: the settings of all modules (parameters, preferred orientations and sorting strategies) +- ``load_carriers``: the configured load carriers +- ``regions_of_interest``: the configured 2D and 3D regions of interest +- ``grippers``: the configured grippers (without the CAD elements) + +The returned backup should be stored as a .json file. + +.. only:: rc_visard or rc_visard_ng + + The templates of the SilhouetteMatch module are not included in the backup but can be + downloaded manually using the |restapi| or the |webgui| + (see :ref:`sect-silhouettematch-template-upload`:latex:`, Section \ref{silhouettematch:sect-silhouettematch-template-upload}`). + +.. only:: rc_cube + + The templates of the SilhouetteMatch and CADMatch modules are not included in the backup but can be + downloaded manually using the |restapi| or the |webgui| + (see :ref:`sect-silhouettematch-template-upload`:latex:`, Section \ref{silhouettematch:sect-silhouettematch-template-upload}` + and :ref:`sect-cadmatch-template-upload`:latex:`, Section \ref{cadmatch:sect-cadmatch-template-upload}`). + +A backup can be restored to the |rc_xxx| on the +:ref:`Web GUI`'s :latex:`(Section \ref{webgui:sect-web-gui})` *System* page +in the |rc_xxx| *Settings* section by uploading the backup .json file. +In the :ref:`Web GUI` the settings included in the backup are shown and can be chosen for restore. +The corresponding :ref:`sect-rest-api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` +call is :http:post:`/system/backup`. + +.. Warning:: When restoring load carriers, all existing load carriers on the |rc_xxx| + will get lost and will be replaced by the content of the backup. The same applies to + restoring grippers and regions of interest. + +When restoring a backup, only the settings which are applicable to the |rc_xxx| are restored. Parameters +for modules that do not exist on the device or do not have a valid license will be skipped. If a +backup can only be restored partially, the user will be notified by warnings. + +.. _sect-updating-the-firmware: + +Updating the firmware +--------------------- + +.. index:: + pair: firmware; version + pair: firmware; update + pair: firmware; mender + single: Web GUI; update + +Information about the current firmware image version can be found on the +:ref:`Web GUI`'s :latex:`(Section \ref{webgui:sect-web-gui})` :menuselection:`System --> Firmware & License` page. +It can also be accessed via the |rcxxx|'s +:ref:`sect-rest-api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` +using the :http:get:`/system` request. Users can use either the |webgui| or the |restapi| +to update the firmware. + +.. Warning:: When upgrading from a version prior to 21.07, all of the software modules' configured parameters + will be reset to their defaults after a firmware update. Only when upgrading from version 21.07 or higher, + the last saved parameters will be preserved. + Please make sure these settings are persisted on the application-side + or client PC (e.g., using the + :ref:`sect-rest-api`:latex:`, Section \ref{rest_api:sect-rest-api}`) + to request all parameters and store them prior to executing the update. + + The following settings are excluded from this and will be + persisted across a firmware update: + + - the |rcxxx|'s network configuration including an optional static IP address and the + user-specified device name, + - the latest result of the :doc:`handeye_calibration`:latex:`\:(Section \ref{handeye_calibration:sect-handeye-calibration})`, + i.e., recalibrating the |rcxxx| w.r.t. a robot is not required, unless camera mounting + has changed, and + + .. only:: rc_visard or rc_visard_ng + + - the latest result of the :doc:`camera_calibration`:latex:`\:(Section \ref{camera_calibration:sect-camera-calibration})`, + i.e., recalibration of the |rcvisard|'s stereo cameras is not required. + + +Step 1: Download the newest firmware version. + Firmware updates will be supplied from of a Mender artifact file + identified by its ``.mender`` suffix. + + .. only:: roboception or schunk or matrixvision + + If a new firmware update is available for your |rcxxx| device, the + respective file can be downloaded to a local computer from + https://www.roboception.com/download. + + +Step 2: Upload the update file. + To update with the |rcxxx|'s |restapi|, users + may refer to the :http:post:`/system/update` request. + + To update the firmware via the |webgui|, locate the :menuselection:`System --> Firmware & License` page + and press the "Upload |rc_xxx| Update" button. + Select the desired update image file (file extension ``.mender``) + from the local file system and open it to start the update. + + Depending on the network architecture and configuration, the + upload may take several minutes. During the update via the |webgui|, + a progress bar indicates the progress of the upload. + + .. Note:: Depending on the web browser, the update progress status shown in the progress bar + may indicate the completion of the update too early. Please wait until a notification + window opens, which indicates the end of the update process. + Expect an overall update time of at least five minutes. + + .. Warning:: Do not close the web browser tab which contains the |webgui| or press the renew + button on this tab, because it will abort the update procedure. In that case, + repeat the update procedure from the beginning. + +Step 3: Reboot the |rcxxx|. + To apply a firmware update to the |rcxxx| + device, a reboot is required after having uploaded the new image version. + + .. index:: + single: active partition + single: inactive partition + + .. Note:: The new image version is uploaded to the inactive partition of the |rcxxx|. Only after rebooting + will the inactive partition be activated, and the active partition will become inactive. + If the updated firmware image cannot be loaded, this partition of the |rcxxx| remains inactive and + the previously installed firmware version from the active partition will be used automatically. + + As for the |restapi|, the reboot can be performed by the + :http:put:`/system/reboot` request. + + After having uploaded the new firmware via the |webgui|, a notification window + is opened, which offers to reboot + the device immediately or to postpone the reboot. To reboot the |rcxxx| + at a later time, use the *Reboot* button on the |webgui|'s *System* page. + +Step 4: Confirm the firmware update. + After rebooting the |rcxxx|, please check the firmware image version + number of the currently active image to make sure that the updated image + was successfully loaded. You can do so either via the + |webgui|'s :menuselection:`System --> Firmware & License` page or via the |restapi|'s :http:get:`/system/update` request. + + Please contact |company| in case the firmware update could not be applied successfully. + +.. _sect-restoring-the-previous-firmware-version: + +Restoring the previous firmware version +--------------------------------------- + +.. index:: + pair: rollback; firmware + single: inactive partition + +After a successful firmware update, the previous firmware image is stored on +the inactive partition of the |rcxxx| and can be restored in case needed. +This procedure is called a *rollback*. + +.. note:: Using the latest firmware as provided + by |company| is strongly recommended. Hence, rollback functionality should only be + used in case of serious issues with the updated firmware version. + +Rollback functionality is only accessible via the |rcxxx|'s +:ref:`sect-rest-api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` +using the :http:put:`/system/rollback` request. It can be issued +using any HTTP-compatible client or using a web browser as described in +:ref:`sect-swagger-ui`:latex:`\:(Section \ref{rest_api_swagger_ui:sect-swagger-ui})`. +Like the update process, the rollback requires a subsequent device reboot +to activate the restored firmware version. + +.. _sect-rebooting: + +Rebooting the |rcxxx| +--------------------- + +.. index:: + single: reboot + +An |rcxxx| reboot is necessary after updating the firmware or +performing a software rollback. It can be issued either +programmatically, via the |rcxxx|'s +:ref:`sect-rest-api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` +using the :http:put:`/system/reboot` request, or manually on the +:ref:`Web GUI`'s :latex:`(Section \ref{webgui:sect-web-gui})` *System* page. + +.. only:: rc_visard or rc_visard_ng + + The reboot is finished when the LED turns green again. + + +.. _sect-updating-license: + +Updating the software license +----------------------------- + +Licenses that are purchased from |company| for enabling additional features can be installed +via the :ref:`Web GUI`'s :latex:`(Section \ref{webgui:sect-web-gui})` :menuselection:`System --> Firmware & License` page. +The |rcxxx| has to be rebooted to apply the licenses. + +.. only:: rc_cube + + .. note:: If a computer screen as well as mouse and keyboard are connected to the |rc_xxx|, + the software license can also be updated directly at the |rc_xxx| using the + |webgui| and a separate USB flash drive from which the new license file can be installed. + + +.. _sect-downloading-log-files: + +Downloading log files +--------------------- + +.. index:: + pair: log files; download + single: Web GUI; logs + +During operation, the |rcxxx| logs important information, warnings, and errors into files. If the |rcxxx| exhibits unexpected +or erroneous behavior, the log files can be used to trace its origin. +Log messages can be viewed and filtered using +the :ref:`Web GUI`'s :latex:`(Section \ref{webgui:sect-web-gui})` :menuselection:`System --> Logs` page. If contacting the +support (:ref:`sect-contact`:latex:`, Section \ref{contact:sect-contact}`), the log files +are very useful for tracking possible problems. To download them as a .tar.gz file, +click on :guilabel:`Download all logs` on the |webgui|'s :menuselection:`System --> Logs` page. + +Aside from the |webgui|, the logs are also accessible via the |rcxxx|'s +:ref:`sect-rest-api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` +using the :http:get:`/logs` and :http:get:`/logs/{log}` requests. + +.. only:: rc_cube + + .. note:: If a computer screen as well as mouse and keyboard are connected to the |rc_xxx|, + the log files can also be download directly from the |rc_xxx| using the + |webgui| and a separate USB flash drive on which the log files can be stored. diff --git a/v24.04/en/_raw_sources/modules.rst.txt b/v24.04/en/_raw_sources/modules.rst.txt new file mode 100644 index 0000000..b3f9bb9 --- /dev/null +++ b/v24.04/en/_raw_sources/modules.rst.txt @@ -0,0 +1,70 @@ +.. include:: global_rst.glb + +.. _sect-modules: + +Software modules +================ + +The |rc_xxx| comes with several on-board software modules, each of which +corresponds to a certain functionality and can be interfaced via its respective +*node* in the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`. + +.. only:: rc_cube + + .. index:: ! Camera pipelines + + The |rc_cube| offers the possibility to connect multiple 3D cameras such as the + |rc_visard|. The image data from each device is processed in a separate *camera pipeline*, + which consists of several different software modules. The modules inside each pipeline are pipeline specific, + which means that they can have different parameters for each pipeline. The modules running outside the + pipelines are global and provide data for all modules in all pipelines. An overview is given in + :numref:`fig-pipeline-modules`. + + .. _fig-pipeline-modules: + .. figure:: images/pipelines_diagram.* + :width: 100 % + :align: center + + Overview of the pipeline-specific and global software modules on the |rc_cube| + + The |rc_xxx|'s pipeline-specific software modules can be divided into + +.. only:: rc_visard or rc_visard_ng + + The |rc_xxx|'s software modules can be divided into + +- :doc:`camera_modules`:latex:`\:(Section \ref{camera_modules:sect-3d-camera-modules})` + which acquire image pairs and compute 3D depth information such as disparity, + error, and confidence images, and are also accessible via the |rc_xxx|'s + :doc:`GigE Vision/GenICam interface`, + +.. only:: rc_visard + + - :doc:`navigation_modules`:latex:`\:(Section \ref{navigation_modules:sect-navigation-modules})` + which provide estimates of |rc_visard|'s current pose, + velocity, and acceleration, + +- :doc:`detection_modules`:latex:`\:(Section \ref{detection_modules:sect-detection-modules})` + which provide a variety of detection functionalities, such as grasp point computation and object detection, + +- :doc:`configuration_modules`:latex:`\:(Section \ref{configuration_modules:sect-configuration-modules})` + which enable the user to perform calibrations and configure the |rc_xxx| for specific applications. + +.. only:: rc_cube + + The modules that are global for all camera pipelines running on the |rc_cube| are the + +- :doc:`database_modules`:latex:`\:(Section \ref{database_modules:sect-database-modules})` + which enable the user to configure global data available to all other modules, such as load carriers, regions + of interest and grippers. + +.. toctree-filt:: + :maxdepth: 2 + :hidden: + + camera_modules + :rc_visard_only:navigation_modules + detection_modules + configuration_modules + database_modules + diff --git a/v24.04/en/_raw_sources/navigation_modules.rst.txt b/v24.04/en/_raw_sources/navigation_modules.rst.txt new file mode 100644 index 0000000..3ef871b --- /dev/null +++ b/v24.04/en/_raw_sources/navigation_modules.rst.txt @@ -0,0 +1,41 @@ +.. include:: global_rst.glb + +.. _sect-navigation-modules: + +Navigation modules +================== + +The |rc_xxx|'s navigation modules contain: + +- :doc:`dynamics` (``rc_dynamics``:latex:`, Section \ref{dynamics:sect-dynamics}`) + provides estimates of |rc_visard|'s dynamic state such as its pose, + velocity, and acceleration. These states are transmitted + as continuous data streams via the :doc:`rc_dynamics interface`. + For this purpose, the dynamics module manages and fuses data from the following individual + subcomponents: + + + - :doc:`stereo_visodo` (``rc_stereovisodo``:latex:`, Section \ref{stereo_visodo:sect-visual-odometry}`) + estimates the motion of the |rc_visard| device based on the motion of characteristic + visual features in the left camera images. + + - :doc:`stereo_ins` (``rc_stereo_ins``:latex:`, Section \ref{stereo_ins:sect-stereo-ins}`) + combines visual odometry measurements with readings from the on-board + Inertial Measurement Unit (IMU) to provide + accurate and high-frequency state estimates in real time. + + - :doc:`slam` (``rc_slam``:latex:`, Section \ref{slam:sect-slam}`) + performs simultaneous localization and mapping for correcting + accumulated poses. The |rcvisard|'s covered trajectory is offered via the + :ref:`sect-rest-api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`. + + +.. toctree-filt:: + :maxdepth: 2 + :hidden: + + :rc_cube_exclude:dynamics + :rc_cube_exclude:stereo_visodo + :rc_cube_exclude:stereo_ins + :rc_cube_exclude:slam + diff --git a/v24.04/en/_raw_sources/opc_ua.rst.txt b/v24.04/en/_raw_sources/opc_ua.rst.txt new file mode 100644 index 0000000..9721546 --- /dev/null +++ b/v24.04/en/_raw_sources/opc_ua.rst.txt @@ -0,0 +1,19 @@ +.. include:: global_rst.glb + +.. _sect-opc-ua: + +OPC UA interface +================ + +.. index:: + single: OPC UA + +The |rc_xxx| also offers an optional OPC UA interface. +The OPC UA server can be activated via license update. + +The OPC UA server uses the ``DataTypeDefinition`` attribute (available in OPC UA version 1.04) for custom datatypes and also uses methods and variable length arrays. +Please check if your OPC UA client supports this. + +.. only:: roboception + + Please contact support@roboception.de if you are interested in using the OPC UA server. diff --git a/v24.04/en/_raw_sources/pipelines.rst.txt b/v24.04/en/_raw_sources/pipelines.rst.txt new file mode 100644 index 0000000..6deb498 --- /dev/null +++ b/v24.04/en/_raw_sources/pipelines.rst.txt @@ -0,0 +1,116 @@ +.. include:: global_rst.glb + +.. _sect-pipelines: + +.. index:: ! Camera pipelines + +Camera pipelines +================ + +The |rc_xxx| supports multiple cameras at the same time. For this, it offers up to four +*camera pipelines* that can be configured by the user. + +A camera pipeline contains several software modules which are responsible for +acquiring data of the camera connected to that pipeline, performing detections or +configuring modules used in this pipeline, e.g. by hand-eye calibration. + +.. only:: roboception or schunk or basler + + The |rc_xxx| supports cameras of type |rc_visard|, |rc_viscore| and |blaze|. + The type of the corresponding camera pipeline has to be configured to match + the connected device. + +.. only:: matrixvision + + The |rc_xxx| supports cameras of type |rc_visard| and |rc_viscore|. + The type of the corresponding camera pipeline has to be configured to match + the connected device. + +Configuration of camera pipelines +--------------------------------- + +The camera pipelines can be configured via the :doc:`webgui`:latex:`\:(Section \ref{webgui:sect-web-gui})` +under :menuselection:`System --> Camera Pipelines`. This page shows the running pipelines with their +types and the connected devices. + +.. _fig-pipelines-running: +.. figure:: images/webgui_pipelines.png + :width: 100 % + :align: center + + Example of the *Camera Pipelines* page on an |rc_cube| with two running pipelines of type ``rc_visard`` + +Clicking on :guilabel:`Configure Camera Pipelines` allows to configure the number and type of running pipelines +as shown in the next figure. + +.. note:: The *rc_cube I* provides four camera pipelines, the *rc_cube S* two. + +.. _fig-pipelines-configuration: +.. figure:: images/webgui_pipelines_configure.png + :width: 60 % + :align: center + + Configuring the camera pipelines + +The type of a running pipeline can be changed by selecting a different type in the drop down field. +A running pipeline can be removed by clicking :guilabel:`Remove Pipeline`. Only pipeline 0 can never be removed, because +this is the primary pipeline. +Clicking on :guilabel:`+ Add Pipeline` allows to choose the type for the new pipeline and creates a +new pipeline of the chosen type. +Once the pipelines are configured as desired, clicking :guilabel:`Apply Changes & Reboot` will apply the new configuration +and immediately reboot the |rc_cube|. + + +Configuration of connected cameras +---------------------------------- + +A pipeline of a certain type can only discover devices of the same type. That means, a pipeline of type ``rc_visard`` can only +connect to an |rcvisard|. In case multiple cameras of the same type are connected to the |rc_cube|, the user can set a *device +filter* to choose a specific camera for each pipeline. The current device filter value is displayed for each running pipeline +as shown in :numref:`fig-pipelines-running`. By default, the device filter is set to ``*``, which means that any device +matching the pipeline type will automatically be connected, but only if there is a unique match. Otherwise, no camera will be +connected to that pipeline and an error will be shown. + +To adjust the device filter and select the camera to be connected to a pipeline, +click on :guilabel:`Configure Camera Connection` on the *Camera Pipelines* page, +or select the corresponding pipeline in the menu, e.g. under :menuselection:`System --> Camera Pipelines --> Pipeline 1`. +This will show the current device filter value and more information about the connected +camera. + +.. _fig-pipeline-page: +.. figure:: images/webgui_pipeline.png + :width: 100 % + :align: center + + Configuring the camera connection of pipeline 1 + +Clicking :guilabel:`Choose Camera` opens a dialog to edit the device filter. + +.. _fig-pipeline-page: +.. figure:: images/webgui_choose_camera.png + :width: 60 % + :align: center + + Choosing the camera by setting a device filter + +This dialog also shows a list of all discovered devices matching the pipeline +type and highlights the ones that match the current value entered for the device filter. +It also indicates if the devices are already in use in a different pipeline. +Device filters can be selected by clicking on an *Interface*, *Name* or *Serial* +of the desired device in the list. The following table shows possible device filter values. + +.. tabularcolumns:: |l|L| +.. _tab-roi-spec: +.. csv-table:: Possible device filter values + :header: Device filter, Description + + "\*", "selects any device matching the pipeline type" + "sensor:*", "selects any device connected via the sensor interface that matches the pipeline type" + "", "selects the device by the user-defined name" + "", "selects the device by the full serial number" + "sensor:", "selects the device connected via the sensor interface with the given serial" + "sensor:", "selects the device connected via the sensor interface with the given user-defined name" + "", "if empty, no camera will be connected" + +By pressing :guilabel:`Save`, the entered device filter is applied and a camera matching the device filter is connected to +this pipeline, if possible. Changing the device filter does not require a reboot of the |rc_cube|. diff --git a/v24.04/en/_raw_sources/pose_format_abb.rst.txt b/v24.04/en/_raw_sources/pose_format_abb.rst.txt new file mode 100644 index 0000000..bf8385f --- /dev/null +++ b/v24.04/en/_raw_sources/pose_format_abb.rst.txt @@ -0,0 +1,9 @@ +.. include:: global_rst.glb + +.. _sect-abb-format: + +ABB pose format +--------------- + +ABB robots use a position and a quaternion for describing a pose, like |rc_xxx| +devices. There is no conversion of the orientation needed. diff --git a/v24.04/en/_raw_sources/pose_format_fanuc.rst.txt b/v24.04/en/_raw_sources/pose_format_fanuc.rst.txt new file mode 100644 index 0000000..a25d01f --- /dev/null +++ b/v24.04/en/_raw_sources/pose_format_fanuc.rst.txt @@ -0,0 +1,46 @@ +.. include:: global_rst.glb + +.. _sect-fanuc-format: + +FANUC XYZ-WPR format +-------------------- + +The pose format that is used by FANUC robots consists of a position :math:`XYZ` +in millimeters and an orientation :math:`WPR` that is given by three angles in +degrees, with :math:`W` rotating around :math:`x`-axis, :math:`P` rotating +around :math:`y`-axis and :math:`R` rotating around :math:`z`-axis. The +rotation order is :math:`x`-:math:`y`-:math:`z` and computed by :math:`r_z(R) +r_y(P) r_x(W)`. + +Conversion from FANUC-WPR to quaternion +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from the :math:`WPR` angles in degrees to a quaternion +:math:`q=(\begin{array}{cccc}x & y & z & w\end{array})` can be done by +first converting all angles to radians + +.. math:: + W_r = W \frac{\pi}{180} \text{,} \\ + P_r = P \frac{\pi}{180} \text{,} \\ + R_r = R \frac{\pi}{180} \text{,} \\ + +and then calculating the quaternion with + +.. math:: + x = \cos{(R_r/2)}\cos{(P_r/2)}\sin{(W_r/2)} - \sin{(R_r/2)}\sin{(P_r/2)}\cos{(W_r/2)} \text{,} \\ + y = \cos{(R_r/2)}\sin{(P_r/2)}\cos{(W_r/2)} + \sin{(R_r/2)}\cos{(P_r/2)}\sin{(W_r/2)} \text{,} \\ + z = \sin{(R_r/2)}\cos{(P_r/2)}\cos{(W_r/2)} - \cos{(R_r/2)}\sin{(P_r/2)}\sin{(W_r/2)} \text{,} \\ + w = \cos{(R_r/2)}\cos{(P_r/2)}\cos{(W_r/2)} + \sin{(R_r/2)}\sin{(P_r/2)}\sin{(W_r/2)} \text{.} + +Conversion from quaternion to FANUC-WPR +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from a quaternion :math:`q=(\begin{array}{cccc}x & y & z & +w\end{array})` with :math:`||q||=1` to the :math:`WPR` angles in degrees can +be done as follows. + +.. math:: + R &= \text{atan}_2{(2(wz + xy), 1 - 2(y^2 + z^2))} \frac{180}{\pi} \\ + P &= \text{asin}{(2(wy - zx))} \frac{180}{\pi} \\ + W &= \text{atan}_2{(2(wx + yz), 1 - 2(x^2 + y^2))} \frac{180}{\pi} + diff --git a/v24.04/en/_raw_sources/pose_format_franka_emika.rst.txt b/v24.04/en/_raw_sources/pose_format_franka_emika.rst.txt new file mode 100644 index 0000000..f4cf48e --- /dev/null +++ b/v24.04/en/_raw_sources/pose_format_franka_emika.rst.txt @@ -0,0 +1,105 @@ +.. include:: global_rst.glb + +.. _sect-franka-emika-format: + +Franka Emika Pose Format +------------------------ + +Franka Emika robots use a transformation matrix :math:`T` to define a pose. +A transformation matrix combines a rotation matrix :math:`R` and a translation vector +:math:`t=(\begin{array}{cccc}x & y & z\end{array})^T`. + +.. math:: + T = \left(\begin{array}{cccc} + r_{00} & r_{01} & r_{02} & x\\ + r_{10} & r_{11} & r_{12} & y\\ + r_{20} & r_{21} & r_{22} & z\\ + 0 & 0 & 0 & 1 + \end{array}\right) + +The pose given by Franka Emika's "Measure Pose" App consists of a translation :math:`x, y, z` +in millimeters and a rotation :math:`x, y, z` in degrees. The rotation convention is +:math:`z`-:math:`y'`-:math:`x''` (i.e. :math:`x`-:math:`y`-:math:`z`) and is +computed by :math:`r_z(z) r_y(y) r_x(x).` + +Conversion from transformation matrix to quaternion +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from a rotation matrix (with :math:`det(R)=1`) to a quaternion +:math:`q=(\begin{array}{cccc}q_x & q_y & q_z & q_w \end{array})` can be done as follows: + +.. math:: + q_x &= \text{sign}(r_{21}-r_{12}) \frac{1}{2}\sqrt{\text{max}(0, 1 + r_{00} - r_{11} - r_{22})} \\ + q_y &= \text{sign}(r_{02}-r_{20}) \frac{1}{2}\sqrt{\text{max}(0, 1 - r_{00} + r_{11} - r_{22})} \\ + q_z &= \text{sign}(r_{10}-r_{01}) \frac{1}{2}\sqrt{\text{max}(0, 1 - r_{00} - r_{11} + r_{22})} \\ + q_w &= \frac{1}{2}\sqrt{\text{max}(0, 1 + r_{00} + r_{11} + r_{22})} + +The :math:`\text{sign}` operator returns -1 if the argument is negative. +Otherwise, 1 is returned. It is used to recover the sign for the square root. +The :math:`\text{max}` function ensures that the argument of the square root +function is not negative, which can happen in practice due to round-off errors. + +Conversion from Rotation-XYZ to quaternion +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from the :math:`x, y, z` angles in degrees to a quaternion +:math:`q=(\begin{array}{cccc}q_x & q_y & q_z & q_w\end{array})` can be done by +first converting all angles to radians + +.. math:: + X_r = x \frac{\pi}{180} \text{,} \\ + Y_r = y \frac{\pi}{180} \text{,} \\ + Z_r = z \frac{\pi}{180} \text{,} \\ + +and then calculating the quaternion with + +.. math:: + q_x = \cos{(Z_r/2)}\cos{(Y_r/2)}\sin{(X_r/2)} - \sin{(Z_r/2)}\sin{(Y_r/2)}\cos{(X_r/2)} \text{,} \\ + q_y = \cos{(Z_r/2)}\sin{(Y_r/2)}\cos{(X_r/2)} + \sin{(Z_r/2)}\cos{(Y_r/2)}\sin{(X_r/2)} \text{,} \\ + q_z = \sin{(Z_r/2)}\cos{(Y_r/2)}\cos{(X_r/2)} - \cos{(Z_r/2)}\sin{(Y_r/2)}\sin{(X_r/2)} \text{,} \\ + q_w = \cos{(Z_r/2)}\cos{(Y_r/2)}\cos{(X_r/2)} + \sin{(Z_r/2)}\sin{(Y_r/2)}\sin{(X_r/2)} \text{.} + +Conversion from quaternion and translation to transformation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from a quaternion :math:`q=(\begin{array}{cccc}q_x & q_y & q_z & +q_w\end{array})` and a translation vector :math:`t=(\begin{array}{cccc}x & y & z\end{array})^T` +to a transformation matrix :math:`T` can be done as follows: + +.. math:: + T = \left(\begin{array}{cccc} + 1 - 2s(q_y^2+q_z^2) & 2s(q_x q_y-q_z q_w) & 2s(q_x q_z+q_y q_w) & x\\ + 2s(q_x q_y+q_z q_w) & 1 - 2s(q_x^2+q_z^2) & 2s(q_y q_z-q_x q_w) & y\\ + 2s(q_x q_z-q_y q_w) & 2s(q_y q_z+q_x q_w) & 1 - 2s(q_x^2+q_y^2) & z\\ + 0 & 0 & 0 & 1 + \end{array}\right) + +where :math:`s=||q||^{-2}=\frac{1}{q_x^2+q_y^2+q_z^2+q_w^2}` and :math:`s=1`` if +:math:`q` is a unit quaternion. + +Conversion from quaternion to Rotation-XYZ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from a quaternion :math:`q=(\begin{array}{cccc}q_x & q_y & q_z & +q_w\end{array})` with :math:`||q||=1` to the :math:`x, y, z` angles in degrees can +be done as follows. + +.. math:: + x &= \text{atan}_2{(2(q_w q_z + q_x q_y), 1 - 2(q_y^2 + q_z^2))} \frac{180}{\pi} \\ + y &= \text{asin}{(2(q_w q_y - q_z q_x))} \frac{180}{\pi} \\ + z &= \text{atan}_2{(2(q_w q_x + q_y q_z), 1 - 2(q_x^2 + q_y^2))} \frac{180}{\pi} + +Pose representation in RaceCom messages and state machines +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +In RaceCom messages and in state machines a pose is usually defined as +one-dimensional array of 16 float values, representing the transformation matrix +in column-major order. The indices of the matrix entries below correspond to the +array indices + +.. math:: + T = \left(\begin{array}{cccc} + a_0 & a_4 & a_8 & a_{12}\\ + a_1 & a_5 & a_9 & a_{13}\\ + a_2 & a_6 & a_{10} & a_{14}\\ + a_3 & a_7 & a_{11} & a_{15} + \end{array}\right) \ No newline at end of file diff --git a/v24.04/en/_raw_sources/pose_format_fruitcore_horst.rst.txt b/v24.04/en/_raw_sources/pose_format_fruitcore_horst.rst.txt new file mode 100644 index 0000000..16f0101 --- /dev/null +++ b/v24.04/en/_raw_sources/pose_format_fruitcore_horst.rst.txt @@ -0,0 +1,9 @@ +.. include:: global_rst.glb + +.. _sect-fruitcore-horst-format: + +Fruitcore HORST pose format +--------------------------- + +Fruitcore HORST robots use a position in meters and a quaternion with :math:`q_0 = w`, :math:`q_1 = x`, :math:`q_2 = y` and :math:`q_3 = z` for describing a pose, like |rc_xxx| +devices. There is no conversion needed. diff --git a/v24.04/en/_raw_sources/pose_format_kawasaki.rst.txt b/v24.04/en/_raw_sources/pose_format_kawasaki.rst.txt new file mode 100644 index 0000000..c8efe32 --- /dev/null +++ b/v24.04/en/_raw_sources/pose_format_kawasaki.rst.txt @@ -0,0 +1,62 @@ +.. include:: global_rst.glb + +.. _sect-kawasaki-format: + +Kawasaki XYZ-OAT format +----------------------- + +The pose format that is used by Kawasaki robots consists of a position +:math:`XYZ` in millimeters and an orientation :math:`OAT` that is given by three angles in +degrees, with :math:`O` rotating around :math:`z` axis, :math:`A` rotating +around the rotated :math:`y` axis and :math:`T` rotating around the rotated +:math:`z` axis. The rotation convention is :math:`z`-:math:`y'`-:math:`z''` +(i.e. :math:`z`-:math:`y`-:math:`z`) and computed by :math:`r_z(O) r_y(A) +r_z(T)`. + +Conversion from Kawasaki-OAT to quaternion +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from the :math:`OAT` angles in degrees to a quaternion +:math:`q=(\begin{array}{cccc}x & y & z & w\end{array})` can be done by first +converting all angles to radians + +.. math:: + O_r = O \frac{\pi}{180} \text{,} \\ + A_r = A \frac{\pi}{180} \text{,} \\ + T_r = T \frac{\pi}{180} \text{,} \\ + +and then calculating the quaternion with + +.. math:: + x = \cos{(O_r/2)}\sin{(A_r/2)}\sin{(T_r/2)} - \sin{(O_r/2)}\sin{(A_r/2)}\cos{(T_r/2)} \text{,} \\ + y = \cos{(O_r/2)}\sin{(A_r/2)}\cos{(T_r/2)} + \sin{(O_r/2)}\sin{(A_r/2)}\sin{(T_r/2)} \text{,} \\ + z = \sin{(O_r/2)}\cos{(A_r/2)}\cos{(T_r/2)} + \cos{(O_r/2)}\cos{(A_r/2)}\sin{(T_r/2)} \text{,} \\ + w = \cos{(O_r/2)}\cos{(A_r/2)}\cos{(T_r/2)} - \sin{(O_r/2)}\cos{(A_r/2)}\sin{(T_r/2)} \text{.} + +Conversion from quaternion to Kawasaki-OAT +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from a quaternion :math:`q=(\begin{array}{cccc}x & y & z & +w\end{array})` with :math:`||q||=1` to the :math:`OAT` angles in degrees can +be done as follows. + +If :math:`x = 0` **and** :math:`y = 0` the conversion is + +.. math:: + O &= \text{atan}_2{(2(z - w), 2(z + w))} \frac{180}{\pi} \\ + A &= \text{acos}{(w^2 + z^2)} \frac{180}{\pi} \\ + T &= \text{atan}_2{(2(z + w), 2(w - z))} \frac{180}{\pi} + +If :math:`z = 0` **and** :math:`w = 0` the conversion is + +.. math:: + O &= \text{atan}_2{(2(y - x), 2(x + y))} \frac{180}{\pi} \\ + A &= \text{acos}{(-1.0)} \frac{180}{\pi} \\ + T &= \text{atan}_2{(2(y + x), 2(y - x))} \frac{180}{\pi} + +In all other cases the conversion is + +.. math:: + O &= \text{atan}_2{(2(yz - wx), 2(xz + wy))} \frac{180}{\pi} \\ + A &= \text{acos}{(w^2 - x^2 - y^2 + z^2)} \frac{180}{\pi} \\ + T &= \text{atan}_2{(2(yz + wx), 2(wy - xz))} \frac{180}{\pi} diff --git a/v24.04/en/_raw_sources/pose_format_kuka.rst.txt b/v24.04/en/_raw_sources/pose_format_kuka.rst.txt new file mode 100644 index 0000000..d973db3 --- /dev/null +++ b/v24.04/en/_raw_sources/pose_format_kuka.rst.txt @@ -0,0 +1,46 @@ +.. include:: global_rst.glb + +.. _sect-xyzabc-format: + +KUKA XYZ-ABC format +------------------- + +KUKA robots use the so called XYZ-ABC format. :math:`XYZ` is the position in +millimeters. :math:`ABC` are angles in degrees, with :math:`A` rotating around +:math:`z` axis, :math:`B` rotating around :math:`y` axis and :math:`C` rotating +around :math:`x` axis. The rotation convention is +:math:`z`-:math:`y'`-:math:`x''` (i.e. :math:`x`-:math:`y`-:math:`z`) and +computed by :math:`r_z(A) r_y(B) r_x(C)`. + +Conversion from KUKA-ABC to quaternion +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from the :math:`ABC` angles in degrees to a quaternion +:math:`q=(\begin{array}{cccc}x & y & z & w\end{array})` can be done by first +converting all angles to radians + +.. math:: + A_r = A \frac{\pi}{180} \text{,} \\ + B_r = B \frac{\pi}{180} \text{,} \\ + C_r = C \frac{\pi}{180} \text{,} \\ + +and then calculating the quaternion with + +.. math:: + x = \cos{(A_r/2)}\cos{(B_r/2)}\sin{(C_r/2)} - \sin{(A_r/2)}\sin{(B_r/2)}\cos{(C_r/2)} \text{,} \\ + y = \cos{(A_r/2)}\sin{(B_r/2)}\cos{(C_r/2)} + \sin{(A_r/2)}\cos{(B_r/2)}\sin{(C_r/2)} \text{,} \\ + z = \sin{(A_r/2)}\cos{(B_r/2)}\cos{(C_r/2)} - \cos{(A_r/2)}\sin{(B_r/2)}\sin{(C_r/2)} \text{,} \\ + w = \cos{(A_r/2)}\cos{(B_r/2)}\cos{(C_r/2)} + \sin{(A_r/2)}\sin{(B_r/2)}\sin{(C_r/2)} \text{.} + +Conversion from quaternion to KUKA-ABC +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from a quaternion :math:`q=(\begin{array}{cccc}x & y & z & +w\end{array})` with :math:`||q||=1` to the :math:`ABC` angles in degrees can +be done as follows. + +.. math:: + A &= \text{atan}_2{(2(wz + xy), 1 - 2(y^2 + z^2))} \frac{180}{\pi} \\ + B &= \text{asin}{(2(wy - zx))} \frac{180}{\pi} \\ + C &= \text{atan}_2{(2(wx + yz), 1 - 2(x^2 + y^2))} \frac{180}{\pi} + diff --git a/v24.04/en/_raw_sources/pose_format_mitsubishi.rst.txt b/v24.04/en/_raw_sources/pose_format_mitsubishi.rst.txt new file mode 100644 index 0000000..dc8c664 --- /dev/null +++ b/v24.04/en/_raw_sources/pose_format_mitsubishi.rst.txt @@ -0,0 +1,44 @@ +.. include:: global_rst.glb + +.. _sect-mitsubishi-format: + +Mitsubishi XYZ-ABC format +------------------------- + +The pose format that is used by Mitsubishi robots is the same as that for KUKA robots +(see :ref:`sect-xyzabc-format`:latex:`, Section \ref{pose_format_kuka:sect-xyzabc-format}`), +except that :math:`A` is a rotation around :math:`x` axis and :math:`C` is a rotation +around :math:`z` axis. Thus, the rotation is computed by :math:`r_z(C) r_y(B) r_x(A)`. + +Conversion from Mitsubishi-ABC to quaternion +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from the :math:`ABC` angles in degrees to a quaternion +:math:`q=(\begin{array}{cccc}x & y & z & w\end{array})` can be done by first +converting all angles to radians + +.. math:: + A_r = A \frac{\pi}{180} \text{,} \\ + B_r = B \frac{\pi}{180} \text{,} \\ + C_r = C \frac{\pi}{180} \text{,} \\ + +and then calculating the quaternion with + +.. math:: + x = \cos{(C_r/2)}\cos{(B_r/2)}\sin{(A_r/2)} - \sin{(C_r/2)}\sin{(B_r/2)}\cos{(A_r/2)} \text{,} \\ + y = \cos{(C_r/2)}\sin{(B_r/2)}\cos{(A_r/2)} + \sin{(C_r/2)}\cos{(B_r/2)}\sin{(A_r/2)} \text{,} \\ + z = \sin{(C_r/2)}\cos{(B_r/2)}\cos{(A_r/2)} - \cos{(C_r/2)}\sin{(B_r/2)}\sin{(A_r/2)} \text{,} \\ + w = \cos{(C_r/2)}\cos{(B_r/2)}\cos{(A_r/2)} + \sin{(C_r/2)}\sin{(B_r/2)}\sin{(A_r/2)} \text{.} + +Conversion from quaternion to Mitsubishi-ABC +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from a quaternion :math:`q=(\begin{array}{cccc}x & y & z & +w\end{array})` with :math:`||q||=1` to the :math:`ABC` angles in degrees can +be done as follows. + +.. math:: + A &= \text{atan}_2{(2(wx + yz), 1 - 2(x^2 + y^2))} \frac{180}{\pi} \\ + B &= \text{asin}{(2(wy - zx))} \frac{180}{\pi} \\ + C &= \text{atan}_2{(2(wz + xy), 1 - 2(y^2 + z^2))} \frac{180}{\pi} + diff --git a/v24.04/en/_raw_sources/pose_format_rt.rst.txt b/v24.04/en/_raw_sources/pose_format_rt.rst.txt new file mode 100644 index 0000000..bc6f552 --- /dev/null +++ b/v24.04/en/_raw_sources/pose_format_rt.rst.txt @@ -0,0 +1,57 @@ +.. include:: global_rst.glb + +.. _sect-xyz-quaternion-format: + +Rotation matrix and translation vector +-------------------------------------- + +A pose can also be defined by a rotation matrix :math:`R` and a translation +vector :math:`T`. + +.. math:: + R = \left(\begin{array}{ccc} + r_{00} & r_{01} & r_{02} \\ + r_{10} & r_{11} & r_{12} \\ + r_{20} & r_{21} & r_{22} + \end{array}\right), \qquad + T = \left(\begin{array}{c} + X \\ + Y \\ + Z + \end{array}\right). + +The pose transformation can be applied to a point :math:`P` by + +.. math:: + P' = R P + T. + +Conversion from rotation matrix to quaternion +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from a rotation matrix (with :math:`det(R)=1`) to a quaternion +:math:`q=(\begin{array}{cccc}x & y & z & w\end{array})` can be done as follows. + +.. math:: + x &= \text{sign}(r_{21}-r_{12}) \frac{1}{2}\sqrt{\text{max}(0, 1 + r_{00} - r_{11} - r_{22})} \\ + y &= \text{sign}(r_{02}-r_{20}) \frac{1}{2}\sqrt{\text{max}(0, 1 - r_{00} + r_{11} - r_{22})} \\ + z &= \text{sign}(r_{10}-r_{01}) \frac{1}{2}\sqrt{\text{max}(0, 1 - r_{00} - r_{11} + r_{22})} \\ + w &= \frac{1}{2}\sqrt{\text{max}(0, 1 + r_{00} + r_{11} + r_{22})} + +The :math:`\text{sign}` operator returns -1 if the argument is negative. +Otherwise, 1 is returned. It is used to recover the sign for the square root. +The :math:`\text{max}` function ensures that the argument of the square root +function is not negative, which can happen in practice due to round-off errors. + +Conversion from quaternion to rotation matrix +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from a quaternion :math:`q=(\begin{array}{cccc}x & y & z & +w\end{array})` with :math:`||q||=1` to a rotation matrix can be done as +follows. + +.. math:: + R = 2 \left(\begin{array}{ccc} + \frac{1}{2} - y^2 - z^2 & x y - z w & x z + y w \\ + x y + z w & \frac{1}{2} - x^2 - z^2 & y z - x w \\ + x z - y w & y z + x w & \frac{1}{2} - x^2 - y^2 + \end{array}\right) diff --git a/v24.04/en/_raw_sources/pose_format_ur.rst.txt b/v24.04/en/_raw_sources/pose_format_ur.rst.txt new file mode 100644 index 0000000..502ff4c --- /dev/null +++ b/v24.04/en/_raw_sources/pose_format_ur.rst.txt @@ -0,0 +1,59 @@ +.. include:: global_rst.glb + +.. _sect-ur-format: + +Universal Robots pose format +---------------------------- + +The pose format that is used by Universal Robots consists of a position +:math:`XYZ` in millimeters and an orientation in angle-axis format +:math:`V=(\begin{array}{ccc}RX & RY & RZ\end{array})^T`. The rotation angle +:math:`\theta` in radians is the length of the rotation axis :math:`U`. + +.. math:: + V = \left(\begin{array}{c}RX \\ RY \\ RZ\end{array}\right) = \left(\begin{array}{c}\theta u_x \\ \theta u_y \\ \theta u_z\end{array}\right) + +:math:`V` is called a rotation vector. + +Conversion from angle-axis format to quaternion +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from a rotation vector :math:`V` to a quaternion +:math:`q=(\begin{array}{cccc}x & y & z & w\end{array})` can be done as +follows. + +We first recover the angle :math:`\theta` in radians from the rotation vector +:math:`V` by + +.. math:: + \theta = \sqrt{RX^2 + RY^2 + RZ^2}\text{.} + +If :math:`\theta = 0`, then the quaternion is :math:`q=(\begin{array}{cccc}0 & 0 & 0 & 1\end{array})`, +otherwise it is + +.. math:: + x = RX \frac{\sin(\theta/2)}{\theta}\text{,} \\ + y = RY \frac{\sin(\theta/2)}{\theta}\text{,} \\ + z = RZ \frac{\sin(\theta/2)}{\theta}\text{,} \\ + w = \cos(\theta/2)\text{.} + +Conversion from quaternion to angle-axis format +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from a quaternion :math:`q=(\begin{array}{cccc}x & y & z & +w\end{array})` with :math:`||q||=1` to a rotation vector in angle-axis form +can be done as follows. + +We first recover the angle :math:`\theta` in radians from the quaternion by + +.. math:: + \theta = 2\cdot\text{acos}(w)\text{.} + +If :math:`\theta = 0`, then the rotation vector is :math:`V=(\begin{array}{ccc}0 & 0 & 0\end{array})^T`, +otherwise it is + +.. math:: + RX = \theta \frac{x}{\sqrt{1-w^2}}\text{,} \\ + RY = \theta \frac{y}{\sqrt{1-w^2}}\text{,} \\ + RZ = \theta \frac{z}{\sqrt{1-w^2}}\text{.} + diff --git a/v24.04/en/_raw_sources/pose_format_yaskawa.rst.txt b/v24.04/en/_raw_sources/pose_format_yaskawa.rst.txt new file mode 100644 index 0000000..602965e --- /dev/null +++ b/v24.04/en/_raw_sources/pose_format_yaskawa.rst.txt @@ -0,0 +1,46 @@ +.. include:: global_rst.glb + +.. _sect-yaskawa-format: + +Yaskawa Pose Format +------------------- + +The pose format that is used by Yaskawa robots consists of a position :math:`XYZ` +in millimeters and an orientation that is given by three angles in +degrees, with :math:`Rx` rotating around :math:`x`-axis, :math:`Ry` rotating +around :math:`y`-axis and :math:`Rz` rotating around :math:`z`-axis. The +rotation order is :math:`x`-:math:`y`-:math:`z` and computed by :math:`r_z(Rz) +r_y(Ry) r_x(Rx)`. + +Conversion from Yaskawa Rx, Ry, Rz to quaternion +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from the :math:`Rx, Ry, Rz` angles in degrees to a quaternion +:math:`q=(\begin{array}{cccc}x & y & z & w\end{array})` can be done by +first converting all angles to radians + +.. math:: + X_r = Rx \frac{\pi}{180} \text{,} \\ + Y_r = Ry \frac{\pi}{180} \text{,} \\ + Z_r = Rz \frac{\pi}{180} \text{,} \\ + +and then calculating the quaternion with + +.. math:: + x = \cos{(Z_r/2)}\cos{(Y_r/2)}\sin{(X_r/2)} - \sin{(Z_r/2)}\sin{(Y_r/2)}\cos{(X_r/2)} \text{,} \\ + y = \cos{(Z_r/2)}\sin{(Y_r/2)}\cos{(X_r/2)} + \sin{(Z_r/2)}\cos{(Y_r/2)}\sin{(X_r/2)} \text{,} \\ + z = \sin{(Z_r/2)}\cos{(Y_r/2)}\cos{(X_r/2)} - \cos{(Z_r/2)}\sin{(Y_r/2)}\sin{(X_r/2)} \text{,} \\ + w = \cos{(Z_r/2)}\cos{(Y_r/2)}\cos{(X_r/2)} + \sin{(Z_r/2)}\sin{(Y_r/2)}\sin{(X_r/2)} \text{.} + +Conversion from quaternion to Yaskawa Rx, Ry, Rz +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The conversion from a quaternion :math:`q=(\begin{array}{cccc}x & y & z & +w\end{array})` with :math:`||q||=1` to the :math:`Rx, Ry, Rz` angles in degrees can +be done as follows. + +.. math:: + Rx &= \text{atan}_2{(2(wx + yz), 1 - 2(x^2 + y^2))} \frac{180}{\pi} \\ + Ry &= \text{asin}{(2(wy - zx))} \frac{180}{\pi} \\ + Rz &= \text{atan}_2{(2(wz + xy), 1 - 2(y^2 + z^2))} \frac{180}{\pi} + diff --git a/v24.04/en/_raw_sources/rest_api.rst.txt b/v24.04/en/_raw_sources/rest_api.rst.txt new file mode 100644 index 0000000..4e3f053 --- /dev/null +++ b/v24.04/en/_raw_sources/rest_api.rst.txt @@ -0,0 +1,39 @@ +.. include:: global_rst.glb + +.. _sect-rest-api: + +|rest-api| interface +-------------------- + +.. index:: + single: REST-API + +Aside from the :ref:`GenICam interface `:latex:`\ (Section +\ref{gigevision:sect-genicam})`, the |rc_xxx| offers a comprehensive RESTful web +interface (|rest-api|) which any HTTP client or library can access. +Whereas most of the provided parameters, services, and functionalities can also +be accessed via the user-friendly :ref:`Web GUI`:latex:`\ (Section +\ref{webgui:sect-web-gui})`, the |rest-api| serves rather as a +machine-to-machine interface to the |rc_xxx|, e.g., to programmatically + +* set and get run-time parameters of computation nodes, e.g., of cameras + or image processing modules; +* do service calls, e.g., to start and stop individual computational nodes, + or to use offered services such as the hand-eye calibration; +* read the current state of the system and individual computational nodes; or +* update the |rc_xxx|'s firmware or license. + + +.. NOTE:: In the |rc_xxx|'s |rest-api|, a *node* is a computational component + that bundles certain algorithmic functionality and offers a + holistic interface (parameters, services, current status). Examples + for such nodes are the stereo matching node or the hand-eye calibration node. + + +.. toctree-filt:: + :hidden: + :maxdepth: 2 + + rest_api_general + rest_api_datamodel + rest_api_swagger_ui diff --git a/v24.04/en/_raw_sources/rest_api_datamodel.rst.txt b/v24.04/en/_raw_sources/rest_api_datamodel.rst.txt new file mode 100644 index 0000000..2208e31 --- /dev/null +++ b/v24.04/en/_raw_sources/rest_api_datamodel.rst.txt @@ -0,0 +1,27 @@ +.. include:: global_rst.glb + +.. _sect-rest-datamodel: + +Data type definitions +^^^^^^^^^^^^^^^^^^^^^ + +.. index:: + pair: REST-API; data-type + pair: REST-API; data model + +The |restapi| defines the following data models, which are used to access +or modify :ref:`the available resources ` +:latex:`\:(Section \ref{rest_api_general:sect-rest-resources-and-methods})` either as +required attributes/parameters of the requests or as return types. + +.. only:: rc_visard + + .. include:: _gen/swagger/rc_visard/definitions.txt + +.. only:: rc_visard_ng + + .. include:: _gen/swagger/rc_visard_ng/definitions.txt + +.. only:: rc_cube + + .. include:: _gen/swagger/rc_cube/definitions.txt diff --git a/v24.04/en/_raw_sources/rest_api_general.rst.txt b/v24.04/en/_raw_sources/rest_api_general.rst.txt new file mode 100644 index 0000000..b35f90e --- /dev/null +++ b/v24.04/en/_raw_sources/rest_api_general.rst.txt @@ -0,0 +1,218 @@ +.. include:: global_rst.glb + + +General API structure +^^^^^^^^^^^^^^^^^^^^^ + +.. index:: + single: REST-API; entry point + pair: REST-API; version + +The general **entry point** to the |rc-xxx|'s API is ``http:///api/``, +where ```` is either the device's IP address or its :ref:`host name` as known +by the respective DHCP server, as explained in +:ref:`network configuration`:latex:`\ (Section +\ref{installation:sect-network-configuration})`. +Accessing this entry point with a web browser lets the user explore and test +the full API during run-time using the :ref:`sect-swagger-ui` +:latex:`\ (Section \ref{rest_api_swagger_ui:sect-swagger-ui})`. + +For actual HTTP requests, the **current API version is appended** to the entry point +of the API, i.e., ``http:///api/v2``. All data sent to and +received by the |rest-api| follows the JavaScript Object Notation (JSON). +The API is designed to let the user **create, retrieve, modify, and delete** +so-called **resources** as listed in :ref:`Available resources and requests`:latex:`\ (Section +\ref{rest_api_general:sect-rest-resources-and-methods})` using the HTTP requests below. + +.. tabularcolumns:: |p{40mm}|p{50mm}| + ++-------------------+---------------------------------------------------------------------+ +| Request type | Description | ++===================+=====================================================================+ +| GET | Access one or more resources and return the result as JSON. | ++-------------------+---------------------------------------------------------------------+ +| PUT | Modify a resource and return the modified resource as JSON. | ++-------------------+---------------------------------------------------------------------+ +| DELETE | Delete a resource. | ++-------------------+---------------------------------------------------------------------+ +| POST | Upload file (e.g., license or firmware image). | ++-------------------+---------------------------------------------------------------------+ + +Depending on the type and the specific request itself, **arguments** to HTTP +requests can be transmitted as part of the **path** (:term:`URI`) to the +resource, as +**query** string, as **form data**, or in the **body** of the request. The following +examples use the command line tool *curl*, which is available for various operating +systems. See https://curl.haxx.se. + +- Get a node's current status; its name is encoded in the path (URI) + + .. code-block:: bash + + curl -X GET 'http:///api/v2/pipelines/0/nodes/rc_stereomatching' + +- Get values of some of a node's parameters using a query string + + .. code-block:: bash + + curl -X GET 'http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters?name=minconf&name=maxdepth' + +.. only:: rc_visard + + - Configure a new datastream; the destination parameter is transmitted as form data + + .. code-block:: bash + + curl -X PUT --header 'Content-Type: application/x-www-form-urlencoded' -d 'destination=10.0.1.14%3A30000' 'http:///api/v2/datastreams/pose' + +- Set a node's parameter as JSON-encoded text in the body of the request + + .. code-block:: bash + + curl -X PUT --header 'Content-Type: application/json' -d '[{"name": "mindepth", "value": 0.1}]' 'http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters' + + +As for the responses to such requests, some common return codes for the +|rcxxx|'s API are: + +.. tabularcolumns:: |p{40mm}|p{50mm}| + ++--------------------------+--------------------------------------------------------------+ +| Status Code | Description | ++==========================+==============================================================+ +| ``200 OK`` | The request was successful; the resource is returned as JSON.| ++--------------------------+--------------------------------------------------------------+ +|``400 Bad Request`` | A required attribute or argument of the API request is | +| | missing or invalid. | ++--------------------------+--------------------------------------------------------------+ +| ``404 Not Found`` | A resource could not be accessed; e.g., an ID for a resource | +| | could not be found. | ++--------------------------+--------------------------------------------------------------+ +| ``403 Forbidden`` | Access is (temporarily) forbidden; e.g., some parameters are | +| | locked while a GigE Vision application is connected. | ++--------------------------+--------------------------------------------------------------+ +| ``429 Too many requests``| Rate limited due to excessive request frequency. | ++--------------------------+--------------------------------------------------------------+ + +The following listing shows a sample response to a successful request that accesses +information about the ``rc_stereomatching`` node's ``minconf`` parameter: + +.. code-block:: http + + HTTP/1.1 200 OK + Content-Type: application/json + Content-Length: 157 + + { + "name": "minconf", + "min": 0, + "default": 0, + "max": 1, + "value": 0, + "type": "float64", + "description": "Minimum confidence" + } + +.. NOTE:: The actual behavior, allowed requests, and specific return codes + depend heavily on the specific resource, context, and action. + Please refer to the |rcxxx|'s + :ref:`available resources `:latex:`\ + (Section \ref{rest_api_general:sect-rest-resources-and-methods})` and to + each :ref:`software module's `:latex:`\ + (Section \ref{modules:sect-modules})` + parameters and services. + +.. only:: rc_visard or rc_cube + + Migration from API version 1 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + API version 1 has become deprecated with the 22.01 firmware release of the |rc_xxx|. The following + changes were introduced in API version 2. + + .. only:: rc_cube + + * All 3D-camera, detection and configuration modules which were located under ``/nodes`` in API version 1 + are now under ``/pipelines//nodes`` to support multiple pipelines running on the |rc_cube|, e.g. + ``/pipelines/1/nodes/rc_camera``. + + .. only:: rc_visard or rc_visard_ng + + * All 3D-camera, :visardonly:`navigation,` detection and configuration modules which were located under ``/nodes`` in API version 1 + are now under ``/pipelines/0/nodes/``, e.g. ``/pipelines/0/nodes/rc_camera``. + + * Configuring load carriers, grippers and regions of interest is now only possible in the global database modules, which + are located under ``/nodes``, e.g. ``/nodes/rc_load_carrier_db``. The corresponding services in the detection modules + have been removed or deprecated. + + * Templates can now be accessed under ``/templates``, e.g. ``/templates/rc_silhouettematch``. + +Available resources and requests +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. _sect-rest-resources-and-methods: + +The available |restapi| resources are structured into the following parts: + +* ``/nodes`` + Access the |rcxxx|'s global + :doc:`database_modules` + :latex:`\:(Section \ref{database_modules:sect-database-modules})` + with their run-time status, parameters, and offered services, + for storing data used in :cubeonly:`all camera pipelines and` + multiple modules, such as load carriers, grippers and regions of interest. + +* ``/pipelines`` + Access to the status and configuration of the camera pipelines. + :visardsonly:`There is always only one camera pipeline with number 0.` + +.. only:: rc_visard or rc_visard_ng + + * ``/pipelines/0/nodes`` + Access the |rcxxx|'s 3D-camera, navigation, + detection and configuration + :ref:`software modules` + :latex:`\:(Section \ref{modules:sect-modules})` + with their run-time status, parameters, and offered services. + +.. only:: rc_cube + + * ``/pipelines//nodes`` + Access the |rcxxx|'s 3D-camera, detection and configuration + :ref:`software modules` + :latex:`\:(Section \ref{modules:sect-modules})` + of the camera pipeline with the specified number, + with their run-time status, parameters, and offered services. + +* ``/templates`` + Access the object templates on the |rcxxx|. + +.. only:: rc_visard + + * ``/datastreams`` + Access and manage data streams of the |rcxxx|'s + :ref:`rc_dynamics interface`:latex:`\ (Section \ref{rc_dynamics:sect-rc-dynamics-interface})`. + +* ``/system`` + Access the system state, set network configuration, + :cubeonly:`configure the camera pipeline types,` + and manage licenses as well as firmware updates. + +.. only:: rc_cube or rc_visard_ng + + * ``/userspace`` + Access the UserSpace on the |rcxxx|. + +* ``/logs`` + Access the log files on the |rcxxx|. + + +.. toctree-filt:: + :maxdepth: 2 + :hidden: + + rest_api_nodes + :rc_cube_only:rest_api_pipelines + :rc_cube_exclude:rest_api_datastreams + :rc_visard_exclude:rest_api_userspace + rest_api_syslogs diff --git a/v24.04/en/_raw_sources/rest_api_nodes.rst.txt b/v24.04/en/_raw_sources/rest_api_nodes.rst.txt new file mode 100644 index 0000000..400d872 --- /dev/null +++ b/v24.04/en/_raw_sources/rest_api_nodes.rst.txt @@ -0,0 +1,240 @@ +.. include:: global_rst.glb + +.. _sect-rest-api-nodes: + +Nodes, parameters, and services +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. index:: + pair: REST-API; node + +Nodes represent the |rcxxx|'s +:ref:`software modules ` +:latex:`\:(Section \ref{modules:sect-modules})`, each +bundling a certain algorithmic functionality. All available global |restapi| database nodes +can be listed with their service calls and parameters using + +.. code-block:: bash + + curl -X GET http:///api/v2/nodes + +Information about a specific node (e.g., ``rc_load_carrier_db``) can be retrieved using + +.. code-block:: bash + + curl -X GET http:///api/v2/nodes/rc_load_carrier_db + +.. only:: rc_cube + + All available 3D camera, detection and configuration |restapi| nodes + can be listed with their service calls and parameters using + + .. code-block:: bash + + curl -X GET http:///api/v2/pipelines//nodes + + Information about a specific node (e.g., ``rc_camera`` on camera pipeline 1) can be retrieved using + + .. code-block:: bash + + curl -X GET http:///api/v2/pipelines/1/nodes/rc_camera + +.. only:: rc_visard or rc_visard_ng + + All available 3D camera, :visardonly:`navigation,` detection and configuration |restapi| nodes + can be listed with their service calls and parameters using + + .. code-block:: bash + + curl -X GET http:///api/v2/pipelines/0/nodes + + Information about a specific node (e.g., ``rc_camera``) can be retrieved using + + .. code-block:: bash + + curl -X GET http:///api/v2/pipelines/0/nodes/rc_camera + +.. index:: + pair: REST-API; status value + +Status: + During run-time, each node offers information about its current status. + This includes not only the current **processing status** of the module + (e.g., ``running`` or ``stale``), but + most nodes also offer run-time statistics or read-only parameters, + so-called **status values**. As an example, the ``rc_camera`` values + can be retrieved using + + .. only:: rc_cube + + .. code-block:: bash + + curl -X GET http:///api/v2/pipelines//nodes/rc_camera/status + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + curl -X GET http:///api/v2/pipelines/0/nodes/rc_camera/status + + .. note:: The returned **status values** are specific to individual nodes and + are documented in the respective + :ref:`software module ` + :latex:`\:(Section \ref{modules:sect-modules})`. + + .. note:: The **status values** are only reported when the respective + node is in the ``running`` state. + +.. index:: + pair: REST-API; parameter + +Parameters: + Most nodes expose parameters via the |rcxxx|'s |restapi| to allow + their run-time behaviors to be changed according to application context or requirements. + The |restapi| permits to read and write a parameter's value, but also + provides further information such as minimum, maximum, and default + values. + + As an example, the ``rc_stereomatching`` parameters can be + retrieved using + + .. only:: rc_cube + + .. code-block:: bash + + curl -X GET http:///api/v2/pipelines//nodes/rc_stereomatching/parameters + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + curl -X GET http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters + + Its ``quality`` parameter could be set to ``Full`` using + + .. only:: rc_cube + + .. code-block:: bash + + curl -X PUT http:///api/v2/pipelines//nodes/rc_stereomatching/parameters?quality=Full + + or equivalently + + .. code-block:: bash + + curl -X PUT --header 'Content-Type: application/json' -d '{ "value": "Full" }' http:///api/v2/pipelines//nodes/rc_stereomatching/parameters/quality + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + curl -X PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters?quality=Full + + or equivalently + + .. code-block:: bash + + curl -X PUT --header 'Content-Type: application/json' -d '{ "value": "Full" }' http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/quality + + + .. note:: Run-time parameters are specific to individual nodes and + are documented in the respective + :ref:`software module ` + :latex:`\:(Section \ref{modules:sect-modules})`. + + .. note:: Most of the parameters that nodes offer via the |restapi| can be + explored and tested via the |rcxxx|'s user-friendly :ref:`Web GUI` + :latex:`\ (Section \ref{webgui:sect-web-gui})`. + + .. note:: Some parameters exposed via the |rcxxx|'s |restapi| are also + available from the + :ref:`sect-genicam` :latex:`\:(Section \ref{gigevision:sect-genicam})`. + Please note that setting those parameters via the |rest-api| or |webgui| is + prohibited if a GenICam client is connected. + + In addition, each node that offers run-time parameters also features + a service to restore the default values for all of its parameters. + +.. index:: + pair: REST-API; services + +Services: + Some nodes also offer services that can be called via |restapi|, e.g., to + restore parameters as discussed above, or to start and stop nodes. + As an example, the + :ref:`services of the hand-eye calibration module ` + :latex:`(Section \ref{handeye_calibration:sect-handeye-calibration-services})` + could be listed using + + .. only:: rc_cube + + .. code-block:: bash + + curl -X GET http:///api/v2/pipelines//nodes/rc_hand_eye_calibration/services + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + curl -X GET http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services + + A node's service is called by issuing a ``PUT`` request for the + respective resource and providing the service-specific arguments + (see the ``"args"`` field of the + :ref:`Service data model `:latex:`, Section \ref{rest_api_datamodel:sect-rest-datamodel-service}`). + As an example, the stereo matching module can be triggered to do an acquisition by: + + .. only:: rc_cube + + .. code-block:: bash + + curl -X PUT --header 'Content-Type: application/json' -d '{ "args": {} }' http:///api/v2/pipelines//nodes/rc_stereomatching/services/acquisition_trigger + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + curl -X PUT --header 'Content-Type: application/json' -d '{ "args": {} }' http:///api/v2/pipelines/0/nodes/rc_stereomatching/services/acquisition_trigger + + + .. note:: The services and corresponding argument data models are + specific to individual nodes and are documented in the respective + :ref:`software module ` + :latex:`\:(Section \ref{modules:sect-modules})`. + + +The following list includes all |restapi| requests regarding the global database nodes' status, +parameters, and services calls: + +.. only:: rc_visard + + .. include:: _gen/swagger/rc_visard/global_nodes.txt + +.. only:: rc_visard_ng + + .. include:: _gen/swagger/rc_visard_ng/global_nodes.txt + +.. only:: rc_cube + + .. include:: _gen/swagger/rc_cube/global_nodes.txt + +.. only:: rc_visard + + The following list includes all |restapi| requests regarding the 3D camera, navigation, detection and configuration nodes' status, + parameters, and services calls: + + .. include:: _gen/swagger/rc_visard/pipeline_nodes.txt + +.. only:: rc_visard_ng + + The following list includes all |restapi| requests regarding the 3D camera, detection and configuration nodes' status, + parameters, and services calls: + + .. include:: _gen/swagger/rc_visard_ng/pipeline_nodes.txt + +.. only:: rc_cube + + The following list includes all |restapi| requests regarding the pipeline-specific 3D camera, detection and configuration nodes' status, + parameters, and services calls: + + .. include:: _gen/swagger/rc_cube/pipeline_nodes.txt diff --git a/v24.04/en/_raw_sources/rest_api_pipelines.rst.txt b/v24.04/en/_raw_sources/rest_api_pipelines.rst.txt new file mode 100644 index 0000000..f2eccbe --- /dev/null +++ b/v24.04/en/_raw_sources/rest_api_pipelines.rst.txt @@ -0,0 +1,17 @@ +.. include:: global_rst.glb + +.. _sect-rest-api-pipelines: + +Pipelines +~~~~~~~~~ + +.. index:: + pair: REST-API; node + +Pipelines represent the |rcxxx|'s camera pipelines. + +The following list includes all |restapi| requests regarding the camera pipelines' configuration: + +.. only:: rc_cube + + .. include:: _gen/swagger/rc_cube/pipelines.txt diff --git a/v24.04/en/_raw_sources/rest_api_swagger_ui.rst.txt b/v24.04/en/_raw_sources/rest_api_swagger_ui.rst.txt new file mode 100644 index 0000000..45374b1 --- /dev/null +++ b/v24.04/en/_raw_sources/rest_api_swagger_ui.rst.txt @@ -0,0 +1,90 @@ +.. include:: global_rst.glb + +.. _sect-swagger-ui: + +Swagger UI +^^^^^^^^^^ + +.. index:: + single: Swagger UI + +The |rc-xxx|'s `Swagger UI `_ allows developers to easily +visualize and interact with the |rest-api|, e.g., for development and testing. Accessing +``http:///api/`` or ``http:///api/swagger`` +(the former will automatically be redirected to the latter) opens a visualization +of the |rc-xxx|'s general API structure including all +:ref:`available resources and requests ` +:latex:`\ (Section \ref{rest_api_general:sect-rest-resources-and-methods})` +and offers a simple user interface for exploring all of its features. + +.. note:: Users must be aware that, although the |rc_xxx|'s Swagger UI is + designed to explore and test the |rest-api|, it is a fully + functional interface. + That is, any issued requests are actually + processed and particularly ``PUT``, ``POST``, and ``DELETE`` + requests might change the overall status and/or behavior of the + device. + +.. only:: rc_cube + + .. figure:: images/swagger_ui_overview_cube.png + :width: 160mm + :align: center + + Initial view of the |rc_xxx|'s Swagger UI with its resources and requests + +.. only:: rc_visard + + .. figure:: images/swagger_ui_overview.png + :width: 160mm + :align: center + + Initial view of the |rc_xxx|'s Swagger UI with its resources and requests + +.. only:: rc_visard_ng + + .. figure:: images/swagger_ui_overview_ng.png + :width: 160mm + :align: center + + Initial view of the |rc_xxx|'s Swagger UI with its resources and requests + +Using this interface, available resources and requests can be explored by +clicking on them to uncollapse or recollapse them. +The following figure shows an example of how to get a node's current status +by filling in the necessary parameters +(``pipeline`` number and ``node`` name) and clicking *Execute*. This action results in the Swagger UI showing, +amongst others, the actual ``curl`` command that was executed when +issuing the request as well as the response body showing the current status +of the requested node in a JSON-formatted string. + +.. figure:: images/swagger_ui_example_simple_get.png + :width: 160mm + :align: center + + Result of requesting the ``rc_stereomatching`` node's status + +Some actions, such as setting parameters or calling services, require more +complex parameters to an HTTP request. The Swagger UI allows developers to +explore the attributes required for these actions during run-time, as shown in +the next example. In the figure below, the attributes required for the +the ``rc_hand_eye_calibration`` node's ``set_pose`` service are explored by +performing a ``GET`` request on this resource. The response features a full +description of the service offered, including all required arguments with +their names and types as a JSON-formatted string. + +.. figure:: images/swagger_ui_example_get_service_args.png + :width: 160mm + :align: center + + The result of the ``GET`` request on the ``set_pose`` service shows the + required arguments for this service call. + +Users can easily use this preformatted JSON string as a template for the service +arguments to actually call the service: + +.. figure:: images/swagger_ui_example_fill_service_args.png + :width: 160mm + :align: center + + Filling in the arguments of the ``set_pose`` service request diff --git a/v24.04/en/_raw_sources/rest_api_syslogs.rst.txt b/v24.04/en/_raw_sources/rest_api_syslogs.rst.txt new file mode 100644 index 0000000..5581bb8 --- /dev/null +++ b/v24.04/en/_raw_sources/rest_api_syslogs.rst.txt @@ -0,0 +1,35 @@ +.. include:: global_rst.glb + +.. _sect-rest-api-syslogs: + +System and logs +~~~~~~~~~~~~~~~ + +.. index:: + pair: REST-API; logs + pair: REST-API; system + +The following resources and requests expose the |rcxxx|'s system-level API. They +enable + + - access to log files (system-wide or module-specific) + - access to information about the device and run-time statistics such as + date, MAC address, clock-time synchronization status, and available + resources; + - management of installed software licenses; and + - the |rcxxx| to be updated with a new firmware image. + +.. only:: rc_visard + + .. include:: _gen/swagger/rc_visard/logs.txt + .. include:: _gen/swagger/rc_visard/system.txt + +.. only:: rc_visard_ng + + .. include:: _gen/swagger/rc_visard_ng/logs.txt + .. include:: _gen/swagger/rc_visard_ng/system.txt + +.. only:: rc_cube + + .. include:: _gen/swagger/rc_cube/logs.txt + .. include:: _gen/swagger/rc_cube/system.txt diff --git a/v24.04/en/_raw_sources/rest_api_userspace.rst.txt b/v24.04/en/_raw_sources/rest_api_userspace.rst.txt new file mode 100644 index 0000000..9b79251 --- /dev/null +++ b/v24.04/en/_raw_sources/rest_api_userspace.rst.txt @@ -0,0 +1,20 @@ +.. include:: global_rst.glb + +.. _sect-rest-api-userspace: + +UserSpace +~~~~~~~~~ + +.. index:: + pair: REST-API; UserSpace + +|userspace| information including running apps and their published ports can be queried via the userspace endpoint. +An app can be of ``type`` ``container`` or ``compose`` (compose stack with potentially multiple containers). + +.. only:: rc_cube + + .. include:: _gen/swagger/rc_cube/userspace.txt + +.. only:: rc_visard_ng + + .. include:: _gen/swagger/rc_visard_ng/userspace.txt diff --git a/v24.04/en/_raw_sources/revisions.rst.txt b/v24.04/en/_raw_sources/revisions.rst.txt new file mode 100644 index 0000000..284045f --- /dev/null +++ b/v24.04/en/_raw_sources/revisions.rst.txt @@ -0,0 +1,186 @@ +.. include:: global_rst.glb + +.. _sect-revision: + +.. raw:: latex + + \Large + +.. rubric:: Revisions + +.. raw:: latex + + \small + +.. only:: roboception + + .. raw:: latex + + \setstretch{1.25} + +This product may be modified without notice, when necessary, due to product +improvements, modifications, or changes in specifications. If such modification +is made, the manual will also be revised; see revision information. + +.. only:: schunk + + **Document number:** 1461933 + +.. only:: roboception + + .. raw:: latex + + \vspace{1cm} + + :latex:`\color{petrol}` **DOCUMENTATION REVISION** :latex:`\color{black}` |release| |today| + +.. only:: basler or matrixvision or schunk + + **Documentation Revision** |release| |today| + +Applicable to |rc_xxx| firmware |version|.x + +.. only:: schunk + + Dear Customer, + + thank you for trusting our products and our family-owned company, the leading + technology supplier of robots and production machines. + Our team is always available to answer any questions on this product and other solutions. + Ask us questions and challenge us. We will find a solution! + + Best regards, + + Your SCHUNK team + +.. only:: matrixvision or schunk + + | **Manufacturer:** + | + | Roboception GmbH + | Kaflerstrasse 2 + | D-81241 Munich + | + +.. only:: roboception + + | :latex:`\color{petrol}` **MANUFACTURER** :latex:`\color{black}` + | **Roboception GmbH** + | Kaflerstrasse 2 + | 81241 Munich + | Germany + | :latex:`\color{petrol}` **CUSTOMER SUPPORT**: :latex:`\color{black}` support@roboception.de | +49 89 889 50 79-0 (09:00-17:00 CET) + | + +.. only:: schunk + + | **Distributor:** + | SCHUNK GmbH & Co. KG + | Spann- und Greiftechnik + | Bahnhofstr. 106 - 134 + | D-74348 Lauffen/Neckar + | Tel. +49-7133-103-0 + | Fax +49-7133-103-2399 + | Customer Management + | Tel. +49-7133-103-2503 + | Fax +49-7133-103-2189 + | cmg@de.schunk.com + | + +.. only:: basler + + | **Distributor:** + | Basler AG + | An der Strusbek 60-62 + | D-22926 Ahrensburg + | Germany + | + | Web: http://www.baslerweb.com + | Email: info@baslerweb.com + | Phone: +49 4102 463 0 + | + +.. only:: matrixvision + + | **Distributor:** + | Balluff GmbH + | Schurwaldstrasse 9 + | D-73765 Neuhausen a.d.F. + | Germany + | + | Web: https://www.balluff.com + | Email: balluff@balluff.de + | Phone: +49 7158 173-0 + | + + +.. only:: schunk + + **Please read the operating manual in full and keep it close to the product.** + +.. raw:: latex + + \vfill + +.. only:: roboception + + .. raw:: latex + + \vspace{1cm} + + **Please read the operating manual in full and keep it with the product.** + +.. only:: roboception + + :latex:`\color{petrol}` **COPYRIGHT** :latex:`\color{black}` + +.. only:: matrixvision or schunk + + **Copyright** + +.. only:: matrixvision or schunk or roboception + + This manual and the product it describes are protected by copyright. Unless + permitted by German intellectual property and related rights legislation, any + use and circulation of this content requires the prior consent of |manufacturer| or + the individual owner of the rights. This manual and the product it describes + therefore, may not be reproduced in whole or in part, whether for sale or not, + without prior written consent from |manufacturer|. + + Information provided in this document is believed to be accurate and reliable. + However, |manufacturer| assumes no responsibility for its use. + + Differences may exist between the manual and the product if the product has + been modified after the manual's edition date. The information contained in + this document is subject to change without notice. + +.. raw:: latex + + \normalsize + \vspace{2cm} + \setstretch{1.0} + \setcounter{secnumdepth}{3} + \setcounter{tocdepth}{2} + \tableofcontents + +Introduction +============ + +.. rubric:: Indications in the manual + +To prevent damage to the equipment and ensure the user's safety, this manual indicates each precaution related to safety with *Warning*. Supplementary information is provided as a *Note*. + +.. Warning:: Warnings in this manual indicate procedures and actions that must be observed to avoid danger of injury to the operator/user, or damage to the equipment. Software-related warnings indicate procedures that must be observed to avoid malfunctions or unexpected behavior of the software. + +.. Note:: Notes are used in this manual to indicate supplementary relevant information. + +.. toctree-filt:: + :maxdepth: 2 + :hidden: + + general + warranty + standards + :rc_cube_exclude:disposal + glossary + diff --git a/v24.04/en/_raw_sources/roi.rst.txt b/v24.04/en/_raw_sources/roi.rst.txt new file mode 100644 index 0000000..262a1cd --- /dev/null +++ b/v24.04/en/_raw_sources/roi.rst.txt @@ -0,0 +1,363 @@ + +.. include:: global_rst.glb + +.. _sect-roi: + +RoiDB +===== + +.. index:: ! RoiDB + single: ROI + single: BoxPick; region of interest + single: ItemPick; region of interest + single: SilhouetteMatch; region of interest + +.. only:: rc_cube + + .. index:: + single: CADMatch; region of interest + + .. |3droimodules| replace:: |cadm_module|, |pick_modules| + +.. only:: rc_visard or rc_visard_ng + + .. |3droimodules| replace:: |pick_modules| + +Introduction +------------ + +The RoiDB module (region of interest database module) allows the global definition of 2D and 3D regions of interest, +which can then be used in many detection modules. The ROIs are available for all +modules supporting 2D or 3D ROIs on the |rc_xxx|. + +.. only:: rc_cube + + .. note:: + + This module is global on the |rc_cube|. Changes to its settings or parameters affect + every camera pipeline running on the |rc_cube|. + +The RoiDB module is a base module which is available on every |rc_xxx|. + +3D ROIs can be used in |3droimodules|. 2D ROIs can be used in :ref:`sect-silhouettematch`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch})`, +and :ref:`sect-loadcarrier`:latex:`\:(Section \ref{loadcarrier:sect-loadcarrier})`. + +.. tabularcolumns:: |l|L| +.. _tab-roi-spec: +.. csv-table:: Specifications of the RoiDB module + + "Supported ROI types", "2D, 3D" + "Supported ROI geometries", "2D ROI: rectangle, 3D ROI: box, sphere" + "Max. number of ROIs", "2D: 100, 3D: 100" + "ROIs available in", "2D: :ref:`sect-silhouettematch`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch})`, :ref:`sect-loadcarrier`:latex:`\:(Section \ref{loadcarrier:sect-loadcarrier})`, 3D: |3droimodules|" + "Supported reference frames", "camera, external" + +.. _sect-roi-definition: + +Region of interest +------------------ + +A region of interest (ROI) defines a volume in space (3D region of interest, ``region_of_interest``), +or a rectangular region in the left camera image (2D region of interest, ``region_of_interest_2d``) which is of interest for +a specific user-application. + +A ROI can narrow the volume where a load carrier is searched for, or select a volume +which only contains items to be detected and/or grasped. +Processing times can significantly decrease when using a ROI. + +3D regions of interest of the following types (``type``) are supported: + + - ``BOX``, with dimensions ``box.x``, ``box.y``, ``box.z``. + - ``SPHERE``, with radius ``sphere.radius``. + +The user can specify the 3D region of interest ``pose`` in the ``camera`` or the ``external`` coordinate system. +``External`` can only be chosen if a +:doc:`handeye_calibration`:latex:`\:(Section \ref{handeye_calibration:sect-handeye-calibration})` is available. +When the sensor is robot mounted, and the region of interest is defined in the external frame, the current +robot pose must be given to every detect service call that uses this region of interest. + +A 2D ROI is defined as a rectangular part of the left camera image, and can be set via the +:doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` +or the |rcxxx| :ref:`sect-web-gui`:latex:`\:(Section \ref{webgui:sect-web-gui})` on the page +*Regions of Interest* under *Database*. +The |webgui| offers an easy-to-use selection tool. +Each ROI must have a unique name to address a specific 2D ROI. + +In the |restapi|, a 2D ROI is defined by the following values: + +- ``id``: Unique name of the region of interest +- ``offset_x``, ``offset_y``: offset in pixels along the x-axis and y-axis from the top-left corner of the image, respectively +- ``width``, ``height``: width and height in pixels + +The |rcxxx| can persistently store up to 100 different 3D regions of interest and the same number of 2D regions of interest. +The configuration of regions of interest is normally performed offline, during +the set up of the desired application. +This can be done via the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` +of RoiDB module, or in +the |rcxxx| :ref:`sect-web-gui`:latex:`\:(Section \ref{webgui:sect-web-gui})` on the page +*Regions of Interest* under *Database*. + +.. Note:: + The configured regions of interest + are persistent even over firmware updates and rollbacks. + +.. _sect-loadcarrier-db-dependencies: + +Interaction with other modules +------------------------------ + +Internally, the RoiDB module depends on, and interacts with other on-board +modules as listed below. + +.. _sect-loadcarrier-hand-eye-dep: + +Hand-eye calibration +^^^^^^^^^^^^^^^^^^^^ + +In case the camera has been calibrated to a robot, the pose of a 3D ROI +can be provided in the robot coordinate frame by setting the corresponding +``pose_frame`` argument. + +Two different ``pose_frame`` values can be chosen: + +1. **Camera frame** (``camera``). + The ROI pose is provided in the camera frame, + and no prior knowledge about the pose of the camera in the environment is required. + This means that the configured load carriers move with the camera. + It is the user's responsibility to update the configured poses + if the camera frame moves (e.g. with a robot-mounted camera). + +2. **External frame** (``external``). + The ROI pose is provided in the external frame, + configured by the user during the hand-eye calibration process. + The module relies on the on-board + :doc:`Hand-eye calibration module`:latex:`\:(Section \ref{handeye_calibration:sect-handeye-calibration})` + to retrieve the sensor mounting (static or robot mounted) and + the hand-eye transformation. + +.. Note:: + If no hand-eye calibration is available, all ``pose_frame`` values should be set to ``camera``. + +All ``pose_frame`` values that are not ``camera`` or ``external`` are rejected. + +.. _sect-roi-services: + +Services +-------- + +.. index:: + single: RoiDB; services + +The RoiDB module is called ``rc_roi_db`` in the |rest-api| and is represented in the +:ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})` under +:menuselection:`Database --> Regions of Interest`. +The user can explore and call the RoiDB module's services, +e.g. for development and testing, using the +:doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` or +the |webgui|. + +The RoiDB module offers the following services. + +.. _expl-roi-srv-set-roi: + +``set_region_of_interest`` +^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Persistently stores a 3D region of interest on the |rc_xxx|. + All configured 3D regions of interest are persistent over firmware updates and rollbacks. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v2/nodes/rc_roi_db/services/set_region_of_interest + + .. tabs:: + + .. tab:: **Request** + + Details for the definition of the ``region_of_interest`` type are given in + :ref:`sect-roi-definition`:latex:`\:(Section \ref{roi:sect-roi-definition})`. + + .. include:: _gen/nodes/services/rc_load_carrier_set_region_of_interest_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_load_carrier_set_region_of_interest_response.txt + +.. _expl-roi-srv-set-roi-2d: + +``set_region_of_interest_2d`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Persistently stores a 2D region of interest on the |rc_xxx|. + All configured 2D regions of interest are persistent over firmware updates and rollbacks. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v2/nodes/rc_roi_db/services/set_region_of_interest_2d + + .. tabs:: + + .. tab:: **Request** + + Details for the definition of the ``region_of_interest_2d`` type are given in + :ref:`sect-roi-definition`:latex:`\:(Section \ref{roi:sect-roi-definition})`. + + .. include:: _gen/nodes/services/rc_load_carrier_set_region_of_interest_2d_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_load_carrier_set_region_of_interest_2d_response.txt + + +.. _expl-roi-srv-get-roi: + +``get_regions_of_interest`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns the configured 3D regions of interest with the requested ``region_of_interest_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v2/nodes/rc_roi_db/services/get_regions_of_interest + + .. tabs:: + + .. tab:: **Request** + + If no ``region_of_interest_ids`` are provided, all configured 3D regions of interest are returned. + + .. include:: _gen/nodes/services/rc_load_carrier_get_regions_of_interest_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_load_carrier_get_regions_of_interest_response.txt + +.. _expl-roi-srv-get-roi-2d: + +``get_regions_of_interest_2d`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns the configured 2D regions of interest with the requested ``region_of_interest_2d_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v2/nodes/rc_roi_db/services/get_regions_of_interest_2d + + .. tabs:: + + .. tab:: **Request** + + If no ``region_of_interest_2d_ids`` are provided, all configured 2D regions of interest are returned. + + .. include:: _gen/nodes/services/rc_load_carrier_get_regions_of_interest_2d_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_load_carrier_get_regions_of_interest_2d_response.txt + +.. _expl-roi-srv-delete-roi: + +``delete_regions_of_interest`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Deletes the configured 3D regions of interest with the requested ``region_of_interest_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v2/nodes/rc_roi_db/services/delete_regions_of_interest + + .. tabs:: + + .. tab:: **Request** + + All regions of interest to be deleted must be explicitly stated in ``region_of_interest_ids``. + + .. include:: _gen/nodes/services/rc_load_carrier_delete_regions_of_interest_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_load_carrier_delete_regions_of_interest_response.txt + +.. _expl-roi-srv-delete-roi-2d: + +``delete_regions_of_interest_2d`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Deletes the configured 2D regions of interest with the requested ``region_of_interest_2d_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. code-block:: bash + + PUT http:///api/v2/nodes/rc_roi_db/services/delete_regions_of_interest_2d + + .. tabs:: + + .. tab:: **Request** + + All 2D regions of interest to be deleted must be explicitly stated in ``region_of_interest_2d_ids``. + + .. include:: _gen/nodes/services/rc_load_carrier_delete_regions_of_interest_2d_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_load_carrier_delete_regions_of_interest_2d_response.txt + + +.. _sect-roi-return-codes: + +Return codes +------------ + +.. index:: + pair: RoiDB; return codes + + +Each service response contains a ``return_code``, +which consists of a ``value`` plus an optional ``message``. +A successful service returns with a ``return_code`` value of ``0``. +Negative ``return_code`` values indicate that the service failed. +Positive ``return_code`` values indicate that the service succeeded with additional information. +The smaller value is selected in case a service has multiple ``return_code`` values, +but all messages are appended in the ``return_code`` message. + +The following table contains a list of common codes: + +.. tabularcolumns:: |c|L| +.. _tab-roi-return-codes: +.. csv-table:: Return codes of the RoiDB module's services + :header: Code, Description + + "0", "Success" + "-1", "An invalid argument was provided" + "-10", "New element could not be added as the maximum storage capacity of regions of interest has been exceeded" + "10", "The maximum storage capacity of regions of interest has been reached" + "11", "An existent persistent model was overwritten by the call to ``set_region_of_interest`` or ``set_region_of_interest_2d``" diff --git a/v24.04/en/_raw_sources/safety.rst.txt b/v24.04/en/_raw_sources/safety.rst.txt new file mode 100644 index 0000000..a9a584d --- /dev/null +++ b/v24.04/en/_raw_sources/safety.rst.txt @@ -0,0 +1,98 @@ +.. include:: global_rst.glb + +.. _sect-safety: + +Safety +====== + +.. Warning:: The operator must have read and understood all of the instructions in this + manual before handling the |rc_xxx| product. + +.. only:: rc_cube + + .. Warning:: If operating the |rc_cube| with |rc_visard| product(s), + the operator must have read and understood all of the safety, installation, + and maintenance instructions given in the |rc_visard| manual. + +.. Note:: The term "operator" refers to anyone responsible for any of the following tasks + performed in conjunction with |rc_xxx|: + + * Installation + * Maintenance + * Inspection + * Calibration + * Programming + * Decommissioning + +This manual explains the |rc_xxx|'s various components and general operations regarding the +product's whole life-cycle, from installation through operation to decommissioning. + +The drawings and photos in this documentation are representative examples; differences may exist +between them and the delivered product. + +General warnings +---------------- + +.. Note:: Any use of the |rc_xxx| in noncompliance with these warnings is inappropriate and + may cause injury or damage as well as void the warranty. + +.. only:: rc_visard or rc_visard_ng + + .. Warning:: + * The |rc_xxx| needs to be properly mounted before use. + * All cable sets need to be secured to the |rc_xxx| and the mount. + * Cords must be at most 30 m long. + * An appropriate DC power source must supply power to the |rc_xxx|. + * Each |rc_xxx| must be connected to a separate power supply. + * The |rc_xxx|'s housing must be grounded. + * The |rc_xxx|'s and any related equipment's safety guidelines must always be satisfied. + * The |rc_xxx| does not fall under the purview of the machinery, low voltage, or medical directives. + +.. only:: rc_cube + + .. Warning:: + * The |rc_xxx|'s and any related equipment's safety guidelines must always be satisfied. + * The |rc_xxx| does not fall under the purview of the machinery or medical directives. + +.. only:: rc_visard or rc_visard_ng + + .. rubric:: Risk assessment and final application: + + The |rc_xxx| may be used on a robot. Robot, |rc_xxx|, and any other equipment used in the final + application must be evaluated with a risk assessment. The system integrator's duty is to + ensure respect for all local safety measures and regulations. Depending on the application, + there may be risks that need additional protection/safety measures. + +Intended use +------------ + +.. only:: rc_visard or rc_visard_ng + + The |rc_xxx| is intended for data acquisition (e.g., images, :visardonly:`egomotion and` disparity images) + in stationary and mobile robotic applications. The |rc_xxx| is intended for installation on a + robot, automated machinery, mobile platform, or stationary equipment. It can also be used for data + acquisition in other applications. + +.. only:: rc_cube + + The |rc_cube| is intended to be used in combination with a 3D camera for data + acquisition (e.g., stereo images). It is furthermore intended to process that data using + 3D-image processing algorithms to serve in applications such as object detection or robotic pick-and-place. + + .. Warning:: The |rc_cube| is only intended for stationary installation. + +.. Warning:: The |rc_xxx| is **NOT** intended for safety critical applications. + +The GigE Vision\ |reg| industry standard used by the |rc_xxx| does not support authentication and encryption. +All data from and to the device is transmitted without authentication and encryption and could be +monitored or manipulated by a third party. It is the operator's responsibility to connect the +|rc_xxx| only to a secured internal network. + +.. Warning:: The |rc_xxx| must be connected to secured internal networks. + +The |rc_xxx| may be used only within the scope of its technical specification. Any other use of the +product is deemed unintended use. |company| will not be liable for any damages resulting from any +improper or unintended use. + +.. Warning:: Always comply with local and/or national laws, regulations and directives on automation + safety and general machine safety. diff --git a/v24.04/en/_raw_sources/silhouettematch.rst.txt b/v24.04/en/_raw_sources/silhouettematch.rst.txt new file mode 100644 index 0000000..350fc7c --- /dev/null +++ b/v24.04/en/_raw_sources/silhouettematch.rst.txt @@ -0,0 +1,1973 @@ +.. include:: global_rst.glb + +.. _sect-silhouettematch: + +SilhouetteMatch +=============== + +.. index:: ! SilhouetteMatch + single: object detection + single: silhouette + +.. |silm| replace:: SilhouetteMatch + +Introduction +------------ + +The |silm| module is an optional on-board module of the |rc_xxx| and requires a separate |silm| :ref:`license` +:latex:`(Section \ref{maintenance:sect-updating-license})` to be purchased. + +.. only:: rc_cube and (roboception or schunk or basler) + + .. note:: This module is not available in camera pipelines of type ``blaze``. + +The module detects objects by matching a predefined silhouette (“template”) to edges in the image. + +The |silm| module can detect objects in two different scenarios: + + **With calibrated base plane**: The objects are placed on a common base plane, which must be calibrated before the detection, and the objects have + significant edges on a common plane that is parallel to the base plane. + + **With object plane detection**: The objects can be placed at different, previously unknown heights, if the objects have a planar surface and their outer + contours are well visible in the images (e.g. stacked flat objects). + +Templates for object detection can be created by uploading a DXF file and specifying the object height. +The correct scale and unit of the contours are extracted from the DXF file. If no units are +present in the DXF file, the user has to specify which units should be used. When the outer +contour of the object in the DXF file is closed, a 3D collision model is created automatically +by extruding the contour by the given object height. This model will then be used for collision checking +and in 3D visualizations. +Uploading a DXF file can be done in the |webgui| via the :guilabel:`+ Create a new Template` button in the +*SilhouetteMatch Templates and Grasps* section on the :menuselection:`Modules --> SilhouetteMatch` or +:menuselection:`Database --> Templates` pages. + +.. only:: roboception or matrixvision + + |manufacturer| also offers a template generation service on their + `website `_:latex:`\:(\url{https://roboception.com/en/template-request/})`, + where the user can upload CAD files or recorded data of the objects and request object templates for the |silm| module. + +.. only:: schunk + + |company| also also offers a template generation service via mechatronics@de.schunk.com, + where the user can send CAD files or recorded data of the objects and request object templates for the |silm| module. + +.. only:: basler + + |manufacturer| also offers a template generation service, + where the user can upload CAD files or recorded data of the objects and request object templates for the |silm| module. + + +The object templates consist of significant edges of each object. These template edges are matched to the +edges detected in the left and right camera images, considering the +actual size of the objects and their distance from the camera. The poses of the detected objects are +returned and can be used for grasping, for example. + +The |silm| module offers: + +- A dedicated page on the |rc_xxx| :ref:`sect-web-gui`:latex:`\:(Section \ref{webgui:sect-web-gui})` + for easy setup, configuration, testing, and application tuning. +- A :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` and a + :doc:`eki`:latex:`\:(Section \ref{eki:sect-eki})`. +- The definition of 2D regions of interest to select relevant parts of the camera image + (see :ref:`sect-silhouettematch-roi`:latex:`, Section \ref{silhouettematch:sect-silhouettematch-roi}`). +- A load carrier detection functionality for bin-picking applications + (see :ref:`sect-loadcarrier`:latex:`, Section \ref{loadcarrier:sect-loadcarrier}`), + to provide grasps for objects inside a bin only. +- Storing of up to 50 templates. +- The definition of up to 50 grasp points for each template via an interactive visualization in the |webgui|. +- Collision checking between the gripper and the load carrier, the calibrated base plane, other detected objects and/or the point cloud. +- Support for static and robot-mounted cameras and + optional integration with the :doc:`handeye_calibration` + :latex:`(Section \ref{handeye_calibration:sect-handeye-calibration})` module, + to provide grasps in the user-configured external reference frame. +- Selection of a sorting strategy to sort the detected objects and returned grasps. +- 3D visualization of the detection results with grasp points and gripper animations in the |webgui|. + +.. only:: rc_cube + + .. note:: + + This module is pipeline specific. Changes to its settings or parameters only affect + the respective camera pipeline and have no influence on other pipelines running on the |rc_cube|. + + However, the object templates and grasp points are stored globally. Setting, changing + or deleting an object template or its grasps affects all camera pipelines. + +Suitable objects +^^^^^^^^^^^^^^^^ + +The |silm| module is intended for objects which have significant edges on a common plane that is +parallel to the plane on which the objects are placed. This applies to flat, nontransparent +objects, such as routed, laser-cut or water-cut 2D parts and flat-machined parts. More complex +parts can also be detected if there are significant edges on a common plane, e.g. a special +pattern printed on a flat surface. +The detection works best for objects on a texture-free plane. The color of the base plane should +be chosen such that a clear contrast between the objects and the base plane appears in the intensity image. + +In case the objects are not placed on a common base plane or the base plane cannot be calibrated beforehand, +the objects need to have a planar surface and their outer contour must be well visible in the left and right images. +Furthermore, the template for these objects must have a closed outer contour. + +Suitable scene +^^^^^^^^^^^^^^ + +The scene must meet the following conditions to be suitable for the |silm| module: + +- The objects to be detected must be suitable for the |silm| module as described above. +- Only objects belonging to one specific template are visible at a time (unmixed scenario). In case other objects are visible as well, a proper region of interest (ROI) must be set. +- In case a calibrated base plane is used: The offset between the base plane normal and the camera's line of sight does not exceed 10 degrees. +- In case the object planes are detected automatically: The offset between the object's planar surface normal and the camera's line of sight does not exceed 25 degrees. +- The objects are not partially or fully occluded. +- All visible objects are right side up (no flipped objects). +- The object edges to be matched are visible in both, left and right camera images. + + +.. _sect-silhouettematch-base-plane-calib: + +Base-plane calibration +---------------------- + +.. index:: + pair: SilhouetteMatch; base-plane calibration + pair: SilhouetteMatch; base-plane + +In case all objects are placed on a common plane that is known beforehand, +a base-plane calibration should be performed before triggering a detection. +Thereby, the distance and angle of the plane on which the objects are +placed is measured and stored persistently on the |rc_xxx|. + +Separating the detection of the base plane from the actual object detection +renders scenarios possible in which the base plane is temporarily occluded. +Moreover, it increases performance of the object detection for scenarios where +the base plane is fixed for a certain time; thus, it is not necessary +to continuously re-detect the base plane. + +The base-plane calibration can be performed in three different ways, +which will be explained in more detail further down: + +- AprilTag based +- Stereo based +- Manual + +The base-plane calibration is successful if the normal vector of the estimated base plane is at most +10 degrees offset to the camera's line of sight. If the base-plane calibration +is successful, it will be stored persistently on the |rc_xxx| until it is removed or a new base-plane +calibration is performed. + +.. Note:: + + To avoid privacy issues, the image of the persistently stored base-plane calibration will + appear blurred after rebooting the |rc_xxx|. + +In scenarios where the base plane is not accessible for calibration, a plane parallel to the base plane can be calibrated. +Then an ``offset`` parameter can be used to shift the estimated plane onto the actual base plane where +the objects are placed. The ``offset`` parameter gives the distance in meters by which the estimated plane +is shifted towards the camera. + +In the |restapi|, a plane is defined by a ``normal`` and a ``distance``. +``normal`` is a normalized 3-vector, specifying the normal of the plane. +The normal points away from the camera. +``distance`` represents the distance of the plane from the camera along the normal. +Normal and distance can also be interpreted as :math:`a`, :math:`b`, :math:`c`, and :math:`d` components +of the plane equation, respectively: + +.. math:: + ax + by + cz + d = 0 + + +AprilTag based base-plane calibration +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +AprilTag detection (ref. :doc:`tagdetect`:latex:`, Section \ref{tagdetect:sect-tag-detection}`) +is used to find AprilTags +in the scene and fit a plane through them. At least three AprilTags must be placed on the base +plane so that they are visible in the left and right camera images. The tags should be placed +such that they are spanning a triangle that is as large as possible. The larger the triangle, +the more accurate is the resulting base-plane estimate. +Use this method if the base plane is untextured and no external random dot projector is available. +This calibration mode is available via the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` +and the |rcxxx| |webgui|. + +Stereo based base-plane calibration +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The 3D point cloud computed by the stereo matching module is used to fit a plane +through its 3D points. +Therefore, the region of interest (ROI) for this method must +be set such that only the relevant base plane is included. +The ``plane_preference`` parameter allows to select whether the plane closest to +or farthest from the camera should be used as base plane. +Selecting the closest plane can be used in scenarios where the base plane is +completely occluded by objects or not accessible for calibration. +Use this method if the base plane is well textured or you can +make use of a random dot projector to project texture on the base plane. +This calibration mode is available via the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` +and the |rcxxx| |webgui|. + +Manual base-plane calibration +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The base plane can be set manually if its parameters are known, e.g. from previous +calibrations. This calibration mode is only available via the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` +and not the |rcxxx| |webgui|. + +.. _sect-silhouettematch-roi: + +Setting a region of interest +---------------------------- + +.. index:: + single: SilhouetteMatch; region of interest + +If objects are to be detected only in part of the camera’s field of view, +a 2D region of interest (ROI) can be set accordingly as described in +:ref:`sect-roi-definition`:latex:`\:(Section \ref{roi:sect-roi-definition})`. + +.. _sect-silhouettematch-grasps: + +Setting of grasp points +----------------------- + +.. index:: + single: SilhouetteMatch; grasp points + single: SilhouetteMatch; object template + +To use |silm| directly in a robot application, up to 50 grasp points +can be defined for each template. A grasp point represents the desired position and orientation +of the robot's TCP (Tool Center Point) to grasp an object as shown in +:numref:`fig-silhouettematch-grasp-points`. + +.. _fig-silhouettematch-grasp-points: +.. figure:: images/grasp_points_silm.* + :width: 50% + :align: center + + Definition of grasp points with respect to the robot's TCP + +Each grasp consists of an ``id`` which must be +unique within all grasps for an object template, the ``template_id`` representing the template +to which the grasp should be attached, and the ``pose`` in the coordinate frame of the object template. +Grasp points can be set via the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`, +or by using the interactive visualization in the |webgui|. +Furthermore, a ``priority`` (spanning -2 for very low to 2 for very high) can be assigned to a grasp. +Priorities can facilitate robot applications and shorten response times when the run-time parameter +``only_highest_priority_grasps`` is set to true. In this case collision checking concludes when +grasps with the highest possible priority have been found. Finally, different grasps can be associated with +different grippers by specifying a ``gripper_id``. These individual grippers are then used for collision checking +of the corresponding grasps instead of the gripper defined in the ``detect_object`` request. If no ``gripper_id`` is given, the gripper +defined in the ``detect_object`` request will be used for collision checking. + +When a grasp is defined on a symmetric object, all grasps symmetric to the defined one +will automatically be considered in the |silm| module's ``detect_object`` service call. Symmetric grasps +for a given grasp point can be retrieved using the ``get_symmetric_grasps`` service call and visualized in the |webgui|. + +Users can also define replications of grasps around a custom axis. These replications spawn multiple grasps and free users +from setting too many grasps manually. The replication origin is defined as a coordinate frame in the object's coordinate +frame and the x axis of the replication origin frame corresponds to the replication axis. +The grasp is replicated by rotating it around this x axis +starting from its original pose. The replication is done in steps of size ``step_x_deg`` degrees. +The range is defined by the minimal and maximal boundaries ``min_x_deg`` and ``max_x_deg``. +The minimal (maximal) boundary must be a non-positive (non-negative) number up to (minus) 180 degrees. + +.. _sect-silhouettematch-grasps-webgui: + +Setting grasp points in the |webgui| +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The |rc_xxx| |webgui| provides an intuitive and interactive way of defining grasp points for object templates. +In a first step, the object template has to be uploaded to the |rc_xxx|. This can be done +in the |webgui| in any pipeline under :menuselection:`Modules --> SilhouetteMatch` +by clicking on :guilabel:`+ Add a new Template` in the +*Templates and Grasps* section, or in :menuselection:`Database --> Templates` in the +*SilhouetteMatch Templates and Grasps* section. Once the +template upload is complete, a dialog with a 3D visualization of the object template is shown +for adding or editing grasp +points. The same dialog appears when editing an existing template. If the template contains a collision model or a visualization model, +this 3D model is visualized as well. + +This dialog provides two ways for setting grasp points: + +1. **Adding grasps manually**: + By clicking on the :guilabel:`+` symbol, a new grasp is placed in the object origin. The + grasp can be given a unique name which corresponds to its ID. + The desired pose of the grasp can be entered in the fields for *Position* and *Roll/Pitch/Yaw* which are given + in the coordinate frame of the object template represented by the long x, y and z axes in the visualization. + The grasp point can be placed freely with respect to the object template - inside, outside or on the surface. + The grasp point and its orientation are visualized in 3D for verification. + +2. **Adding grasps interactively**: + Grasp points can be added interactively by first clicking on the :guilabel:`Add Grasp` button + in the upper right corner of the visualization and then clicking on the desired point on the object template visualization. + If the 3D model is displayed, the grasps will be attached to the surface of the 3D model. Otherwise, the + grasp is attached to the template surface. The grasp orientation is a right-handed coordinate system and + is chosen such that its z axis is perpendicular to the surface pointing inside the template at + the grasp position. The position and orientation in the object coordinate frame is displayed on the right. + The position and orientation of the grasp can also be changed interactively. + In case :guilabel:`Snap to surface` is disabled (default), the grasp can be translated and rotated freely in all three dimensions + by clicking on :guilabel:`Move Grasp` in the visualization menu and then dragging the grasp along the + appropriate axis to the desired position. The orientation of the grasp can also be changed by rotating the axis with the mouse. + In case :guilabel:`Snap to surface` is enabled in the visualization, the grasp can only be moved along the + model surface. + +Users can also specify a grasp priority by changing the :guilabel:`Priority` slider. A dedicated gripper can be selected +in the :guilabel:`Gripper` drop down field. + +By activating the :guilabel:`Replication` check box, users can replicate the +grasp around a custom axis. The replication axis and the resulting replicated grasps are visualized. +The position and orientation of the replication axis relative to the object coordinate frame can be adjusted +interactively by clicking on :guilabel:`Move Replication Axis` in the visualization menu and then dragging the axis +to the desired position and orientation. +The grasps are replicated within the specified rotation range at the selected rotation step size. Users can cycle through +a visualization of the replicated grasps by dragging the bar below :guilabel:`Cycle through n replicated grasps` in +the :guilabel:`View Options` section of the visualization menu. If a gripper is selected for the grasp or a gripper has +been chosen in the visualization menu, the gripper is also shown at the currently selected grasp. + +If the object template has symmetries, the grasps which are symmetric to the defined grasps can be displayed along with +their replications (if defined) by enabling :guilabel:`... symmetries` in the :guilabel:`View Options` section of the visualization menu. +The user can also cycle through a visualization of the symmetric grasps by dragging the +bar below :guilabel:`Cycle through n symmetric grasps`. + + +.. _sect-silhouettematch-grasps-rest-api: + +Setting grasp points via the |rest-api| +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grasp points can be set via the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` +using the ``set_grasp`` or ``set_all_grasps`` services +(see :ref:`sect-silhouettematch-internal-services`:latex:`, Section \ref{silhouettematch:sect-silhouettematch-internal-services}`). +A grasp consists of the ``template_id`` of the template +to which the grasp should be attached, an ``id`` uniquely identifying the grasp point and +the ``pose``. The pose is given in the coordinate frame of the object template and +consists of a ``position`` in meters and an ``orientation`` as quaternion. +A dedicated gripper can be specified through setting the ``gripper_id`` field. The +``priority`` is specified by an integer value, ranging from -2 for very low, to 2 for very high with a step size +of 1. The replication origin is defined as a transformation in the object's coordinate frame and the x axis +of the transformation corresponds to the replication axis. The +replication range is controlled by the ``min_x_deg`` and ``max_x_deg`` fields and the step size ``step_x_deg``. + +.. _sect-silhouettematch-set-preferred-orientation: + +Setting the preferred orientation of the TCP +-------------------------------------------- + +.. index:: + single: SilhouetteMatch; preferred orientation + +The |silm| module determines the reachability of grasp points based on the *preferred orientation* of the +gripper or TCP. The preferred orientation can be set via the ``set_preferred_orientation`` service or on +the *SilhouetteMatch* page in the |webgui|. +The resulting direction of the TCP's z axis is used to reject grasps which cannot be reached by the gripper. +Furthermore, the preferred orientation can be used to sort the reachable grasps by setting the corresponding +sorting strategy. + +The preferred orientation can be set in the camera coordinate frame or in the external coordinate frame, in case +a hand-eye calibration is available. If the preferred orientation is specified in the external coordinate frame +and the sensor is robot mounted, the current robot pose has to be given to each object detection call, so that the +preferred orientation can be used for filtering and, optionally, sorting the grasps on the detected objects. +If no preferred orientation is set, the orientation of the left camera is used as the preferred orientation of the TCP. + + +.. _sect-silhouettematch-set-sorting-strategies: + +Setting the sorting strategies +------------------------------ + +The objects and grasps returned by the ``detect_object`` service call are sorted according to a sorting strategy which can be +chosen by the user. The following sorting strategies are available and +can be set in the :ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})` +or using the ``set_sorting_strategies`` service call: + +- ``preferred_orientation``: objects and grasp points with minimal rotation difference between their orientation and the preferred orientation of the TCP are returned first, +- ``direction``: objects and grasp points with the shortest distance along a defined direction ``vector`` in a given ``pose_frame`` are returned first. + +If no sorting strategy is set or default sorting is chosen in the Web GUI, sorting is done based on a combination of +``preferred_orientation`` and the minimal distance from the camera along the z axis of the preferred orientation of the TCP. + +.. _sect-silhouettematch-detect: + +Detection of objects +-------------------- + +.. index:: + single: SilhouetteMatch; detection of objects + single: SilhouetteMatch; sorting + +For triggering the object detection, in general, the following information +must be provided to the |silm| module: + +- The template of the object to be detected in the scene. +- The coordinate frame in which the poses of the detected objects shall be returned + (ref. :ref:`sect-silhouettematch-hand-eye-calib`:latex:`, Section \ref{silhouettematch:sect-silhouettematch-hand-eye-calib}`). + +Optionally, further information can be given to the |silm| module: + +- A flag ``object_plane_detection`` determining whether the surface plane of the objects should be used for the detection instead of the calibrated base plane. +- An offset, in case the calibrated base plane should be used but the objects are not lying on this plane but on a plane parallel + to it. The offset is the distance between both planes + given in the direction towards the camera. If omitted, an offset of 0 is assumed. It must not be set if ``object_plane_detection`` is true. +- The ID of the load carrier which contains the objects to be detected. +- The ID of the region of interest where to search for the load carrier if a + load carrier is set. Otherwise, the ID of the region of interest where the objects should + be detected. If omitted, objects are matched in the whole image. +- The current robot pose in case the camera is mounted on the robot and + the chosen coordinate frame for the poses is ``external`` or the preferred orientation + is given in the external frame. +- Collision detection information: The ID of the gripper to enable collision checking and optionally + a pre-grasp offset to define a pre-grasp position. + Details on collision + checking are given below in + :ref:`sect-silhouettematch-collision-check-dep`:latex:`\:(Section + \ref{silhouettematch:sect-silhouettematch-collision-check-dep})`. + +In case the ``object_plane_detection`` flag is not true, +objects can only be detected after a successful base-plane calibration. +It must be ensured that the position and orientation of the base plane +does not change before the detection of objects. +Otherwise, the base-plane calibration must be renewed. + +When ``object_plane_detection`` is set to true, a base-plane calibration is not required and +an existing base-plane calibration will be ignored. During detection, the scene is clustered into +planar surfaces and template matching is performed on each plane whose tilt with respect to the +camera's line of sight is less than 25° and whose size is large enough to contain the selected template. +When a match is found, its position and orientation are refined using the image edges and the +point cloud inside the template's outer contour. For this, it is required that the outer contour of +the template is closed and that the object's surface is planar. + +On the |webgui| the detection can be tested in the *Try Out* section of the |silm| page. +Different image streams can be selected to show intermediate results and the final matches as shown +in :numref:`fig-silm-stream-images`. + + The **"Template"** image stream shows the template + to be matched in red with the defined grasp points in green + (see :ref:`sect-silhouettematch-grasps`:latex:`, Section \ref{silhouettematch:sect-silhouettematch-grasps}`). + The template is warped to the size and tilt matching + objects on the calibrated base plane or, in case ``object_plane_detection`` was used, + the highest segmented plane, would have. The corresponding plane is shown in dark blue. + + The **"Intermediate Result"** image stream shows the edges of the left image that were used to search for matches in light blue. + The chosen region of interest is shown as bold petrol rectangle. + A shaded blue area on the left visualizes the region of the left camera image which does not overlap with + the right image, and in which no objects can be detected. If ``object_plane_detection`` was used, this + image stream also shows the detected planar clusters in the scene. Clusters that were + not used for matching, because they were too small or too tilted, are visualized with a stripe pattern. + + The **"Intermediate Result Right"** image stream shows the edges of the right image that were used to search for matches in light blue. + The chosen region of interest is shown as bold petrol rectangle. + A shaded blue area on the right visualizes the region of the right camera image which does not overlap with + the left image, and in which no objects can be detected. + + The **"Result"** image shows the detection result. The image edges + that were used to refine the match poses are shown in light blue and the matches (``instances``) + with the template edges are shown in red. The blue circles are the origins of the detected + objects as defined in the template and the green circles are the + collision-free grasp points. Colliding grasp points are visualized as + red dots and grasp points that were not checked for collisions are drawn in yellow. + +.. _fig-silm-stream-images: +.. figure:: images/silhouetteMatchStreams.png + :width: 100 % + :align: center + + "Template", "Intermediate Result" and "Result" image streams of the |silm| module as shown in the |webgui| + for a detection with ``object_plane_detection`` set to true + +The poses of the object origins in the chosen +coordinate frame are returned as results in a list of ``instances``. +In case the calibrated base plane was used for the detection (``object_plane_detection`` not set or false), +the orientations of the detected objects are aligned with the normal of the base plane. +Otherwise, the orientations of the detected objects are aligned with the normal of a plane fitted to the +object points in the 3D point cloud. + +If the chosen template also has grasp points attached, +a list of ``grasps`` for all objects is returned in addition to the list of detected objects. +The grasp poses are given in the desired coordinate frame and +the grasps are sorted according to the selected sorting strategy +(see :ref:`sect-silhouettematch-set-sorting-strategies`:latex:`, Section \ref{silhouettematch:sect-silhouettematch-set-sorting-strategies}`). +There are references between the detected object instances and the grasps via their ``uuids``. + +In case the templates have a continuous rotational symmetry (e.g. cylindrical objects), +all returned object poses will have the same orientation. Furthermore, all grasps symmetric +to each grasp point on an object are checked for reachability and collisions, and only the +best one according to the given sorting strategy is returned. + +For objects with a discrete symmetry (e.g. prismatic objects), all collision-free symmetries of +each grasp point which are reachable according to the given preferred +TCP orientation are returned, ordered by the given sorting strategy. + +The detection results and run times are affected by several run-time parameters which are listed +and explained further down. Improper parameters can lead to timeouts of the |silm| module's +detection process. + + +Interaction with other modules +------------------------------ + +Internally, the |silm| module depends on, and interacts with other on-board +modules as listed below. + +.. Note:: + All changes and configuration updates to these modules will affect + the performance of the |silm| module. + +.. _sect-silhouettematch-stereo-camera-matching: + +Stereo camera and stereo matching +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The |silm| module makes internally use of the rectified images from the +:doc:`stereo_camera` module (``rc_camera``:latex:`, Section \ref{stereo_camera:sect-stereo-camera}`). +Thus, the exposure time should be set properly to achieve the optimal performance of the module. + +For base-plane calibration in stereo mode, for load carrier detection, for automatic object plane detection and for collision checking +with the point cloud, the disparity images from the :doc:`stereo_matching` module +(``rc_stereomatching``:latex:`, Section \ref{stereo_matching:sect-stereo-matching}`) are used. + +For detecting objects with a calibrated base plane, without load carrier and without collision checking with the point cloud, +the stereo-matching module should not be run in parallel to the |silm| module, because the detection runtime increases. + +For best results it is recommended to enable +:ref:`smoothing` :latex:`(Section \ref{stereo_matching:expl-depth-smooth})` +for :doc:`stereo_matching`. + +.. _sect-silhouettematch-iocontrol: + +IO and Projector Control +^^^^^^^^^^^^^^^^^^^^^^^^ + +In case the |rc_xxx| is used in conjunction with an external random dot projector and +the :doc:`iocontrol` module (``rc_iocontrol``:latex:`, Section \ref{iocontrol:sect-iocontrol}`), +the projector should be used for the stereo-based base-plane calibration, for automatic object plane detection and for collision checking +with the point cloud. + +The projected pattern must not be visible in the left and right camera images during object detection +as it interferes with the matching process. +Therefore, it is recommended to connect the projector to GPIO Out 1 and set +the stereo-camera module's acquisition mode to ``SingleFrameOut1`` +(see :ref:`Stereo matching parameters`:latex:`, Section \ref{stereo_matching:sect-disp-image-parameters}`), so that +on each image acquisition trigger an image with and without projector pattern is acquired. + +Alternatively, the output mode for the GPIO output in use should be set to ``ExposureAlternateActive`` +(see :ref:`sect-iocontrol-params`:latex:`, Section \ref{iocontrol:sect-iocontrol-params}`). + +In either case, +the *Auto Exposure Mode* ``exp_auto_mode`` should be set to ``AdaptiveOut1`` to optimize the exposure +of both images (see :ref:`Stereo camera parameters`:latex:`, Section \ref{stereo_camera:sect-cam-params}`). + + +.. _sect-silhouettematch-hand-eye-calib: + +Hand-eye calibration +^^^^^^^^^^^^^^^^^^^^ + +In case the camera has been calibrated to a robot, the |silm| module can automatically provide +poses in the robot coordinate frame. +For the |silm| node's :ref:`sect-silhouettematch-services`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-services})`, the frame of the +input and output poses and plane coordinates can be controlled with the ``pose_frame`` +argument. + +Two different ``pose_frame`` values can be chosen: + +1. **Camera frame** (``camera``). + All poses and plane coordinates provided to and by the module are in the camera frame. + +2. **External frame** (``external``). + All poses and plane coordinates provided to and by the module are in the external frame, + configured by the user during the hand-eye calibration process. + The module relies on the on-board + :doc:`Hand-eye calibration module`:latex:`\:(Section \ref{handeye_calibration:sect-handeye-calibration})` + to retrieve the camera mounting (static or robot mounted) and + the hand-eye transformation. + If the sensor mounting is static, no further information is needed. + If the sensor is robot-mounted, the ``robot_pose`` is required + to transform poses to and from the ``external`` frame. + +All ``pose_frame`` values that are not ``camera`` or ``external`` are rejected. + +.. Note:: + If no hand-eye calibration is available, all ``pose_frame`` values should be set to ``camera``. + +.. Note:: + If the hand-eye calibration has changed after base-plane calibration, + the base-plane calibration will be marked as invalid and must be renewed. + +If the sensor is robot-mounted, the current ``robot_pose`` has to be provided depending on the value of ``pose_frame``, +the definition of the preferred TCP orientation and the sorting direction: + +- If ``pose_frame`` is set to ``external``, providing the robot pose is obligatory. +- If the preferred TCP orientation is defined in ``external``, providing the robot pose is obligatory. +- If the sorting direction is defined in ``external``, providing the robot pose is obligatory. +- In all other cases, providing the robot pose is optional. + +If the current robot pose is provided during calibration, it is stored persistently on the |rcxxx|. +If the updated robot pose is later provided during ``get_base_plane_calibration`` or ``detect_object`` +as well, the base-plane calibration will be transformed automatically to this new robot pose. +This enables the user to change the robot pose (and thus camera position) +between base-plane calibration and object detection. + +.. Note:: + Object detection can only be performed if the limit of 10 degrees angle offset between + the base plane normal and the camera's line of sight is not exceeded. + +.. _sect-silhouettematch-load-carrier-dep: + +LoadCarrier +^^^^^^^^^^^ + +The |silm| module uses the load carrier detection functionality provided by the +:doc:`loadcarrier` module (``rc_load_carrier``:latex:`, Section \ref{loadcarrier:sect-loadcarrier}`), +with the run-time parameters specified for this module. However, only one load carrier will be +returned and used in case multiple matching load carriers could be found in the scene. In case multiple +load carriers of the same type are visible, a region of interest should be set to ensure that always the +same load carrier is used for the |silm| module. + +.. _sect-silhouettematch-collision-check-dep: + +CollisionCheck +^^^^^^^^^^^^^^ + +.. index:: + single: SilhouetteMatch; collision check + +Collision checking can be easily enabled for +grasp computation of the |silm| module by passing a ``collision_detection`` argument to the +``detect_object`` service call. It contains the ID of the used gripper and +optionally a pre-grasp offset. The gripper has to be +defined in the GripperDB module +(see :ref:`sect-gripper-db-gripper`:latex:`, Section \ref{gripper_db:sect-gripper-db-gripper}`) +and details about collision checking are given in :ref:`sect-collision-check-other-modules`:latex:`\:(Section \ref{collisioncheck:sect-collision-check-other-modules})`. In addition to collision checking between the gripper and the detected load carrier, collisions +between the gripper and the calibrated base plane will be checked, if the run-time parameter ``check_collisions_with_base_plane`` is true. +If the selected |silm| template contains a collision model and the run-time parameter ``check_collisions_with_matches`` is true, +also collisions between the gripper and all other detected objects (not limited to ``max_number_of_detected_objects``) will be checked. The object +on which the grasp point to be checked is located, is excluded from the collision check. + +If the run-time parameter ``check_collisions_with_point_cloud`` is true, +also collisions between the gripper and a watertight version of the point cloud are checked. +If this feature is used with suctions grippers, it should be ensured that the TCP is defined +to be outside the gripper geometry, or that the grasp points are defined above the object surface. +Otherwise every grasp will result in a collision between the gripper and the point cloud. + +If collision checking is enabled, only grasps which are collision free will be returned. +However, the visualization images on the *SilhouetteMatch* +page of the |webgui| also show colliding grasp points in red. The objects which are considered in the collision check are +also visualized with their edges in red. + +The CollisionCheck module's run-time parameters affect the collision detection as described in +:ref:`CollisionCheck Parameters`:latex:`\:(Section \ref{collisioncheck:sect-collisioncheck-parameters})`. + +Parameters +---------- + +.. index:: + single: SilhouetteMatch; parameters + +The |silm| software module is called ``rc_silhouettematch`` in the |rest-api| and is represented in the +:ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})`:cubeonly:`in the desired pipeline` under +:menuselection:`Modules --> SilhouetteMatch`. +The user can explore and configure the ``rc_silhouettematch`` +module's run-time parameters, e.g. for development and testing, using the |webgui| or the +:doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`. + +Parameter overview +^^^^^^^^^^^^^^^^^^ + +.. include:: _gen/nodes/params/rc_silhouettematch.txt + +Description of run-time parameters +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Each run-time parameter is represented by a row on the |webgui|'s |silm| page. +The name in the |webgui| is given in brackets behind the parameter name and the parameters are +listed in the order they appear in the |webgui|: + +.. _expl-silhouettematch-max-objects: + +``max_number_of_detected_objects`` (*Maximum Object Number*) +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + This parameter gives the maximum number of objects to detect in the scene. If more than + the given number of objects can be detected in the scene, only the objects matching best to + the given sorting strategy are returned. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?max_number_of_detected_objects= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?max_number_of_detected_objects= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?max_number_of_detected_objects= + +.. _expl-silhouettematch-quality: + +``quality`` (*Quality*) +''''''''''''''''''''''' + Object detection can be performed on images with different resolutions: + ``High`` (full image resolution), ``Medium`` (half image resolution) and + ``Low`` (quarter image resolution). The lower + the resolution, the lower the detection time, but the fewer details of the objects + are visible. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?quality= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?quality= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?quality= + +.. _expl-silhouettematch-max-distance: + +``match_max_distance`` (*Maximum Matching Distance*) +'''''''''''''''''''''''''''''''''''''''''''''''''''' + This parameter gives the maximum allowed pixel distance of an image edge pixel from the object + edge pixel in the template to be still considered as matching. If the object is not perfectly + represented in the template, it might not be detected when this parameter is low. High values, + however, might lead to false detections in case of a cluttered scene or the presence of similar + objects, and also increase runtime. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?match_max_distance= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?match_max_distance= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?match_max_distance= + +.. _expl-silhouettematch-match-percentile: + +``match_percentile`` (*Matching Percentile*) +'''''''''''''''''''''''''''''''''''''''''''' + This parameter indicates how strict the matching process should be. The matching percentile is + the ratio of template pixels that must be within the Maximum Matching Distance to successfully match the template. + The higher this number, the more accurate the match must be to be considered as valid. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?match_percentile= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?match_percentile= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?match_percentile= + +.. _expl-silhouettematch-edge-sensitivity: + +``edge_sensitivity`` (*Edge Sensitivity*) +''''''''''''''''''''''''''''''''''''''''' + This parameter influences how many edges are detected in the left and right camera images. The higher this number, the + more edges are found in the intensity images. That means, for lower numbers, only the most significant edges + are considered for template matching. A large number of edges in the image might increase the detection time. + It must be ensured that the edges of the objects to be detected are detected in both, the left and the right camera images. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?edge_sensitivity= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?edge_sensitivity= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?edge_sensitivity= + +.. _expl-silhouettematch-only-highest-priority-grasps: + +``only_highest_priority_grasps`` (*Only Highest Priority Grasps*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + If set to true, only grasps with the highest priority will be returned. If collision checking is enabled, only the collision-free + grasps among the group of grasps with the highest priority are returned. + This can save computation time and reduce the number of grasps to be parsed on the application side. + + Without collision checking, only grasps of highest priority are returned. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?only_highest_priority_grasps= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?only_highest_priority_grasps= + + +.. _expl-silhouettematch-check-collisions-with-base-plane: + +``check_collisions_with_base_plane`` (*Check Collisions with Base Plane*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + If this parameter is set to true, and collision checking is enabled by passing a gripper to the ``detect_object`` service call, + all grasp points will be checked for collisions between the gripper and the + calibrated base plane, and only grasp points at which the gripper would not collide with the base plane will be + returned. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?check_collisions_with_base_plane= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?check_collisions_with_base_plane= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?check_collisions_with_base_plane= + +.. _expl-silhouettematch-check-collisions-with-matches: + +``check_collisions_with_matches`` (*Check Collisions with Matches*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + If this parameter is set to true, and collision checking is enabled by passing a gripper to the ``detect_object`` service call, + all grasp points will be checked for collisions between the gripper and all other detected objects (not limited to + ``max_number_of_detected_objects``), and only grasp points at which the gripper would not collide with any other detected object + will be returned. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?check_collisions_with_matches= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?check_collisions_with_matches= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?check_collisions_with_matches= + + +.. _expl-silhouettematch-check-collisions-with-point-cloud: + +``check_collisions_with_point_cloud`` (*Check Collisions with Point Cloud*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + If this parameter is set to true, and collision checking is enabled by passing a gripper to the ``detect_object`` service call, + all grasp points will be checked for collisions between the gripper a watertight version of the point cloud, and only grasp points + at which the gripper would not collide with this point cloud will be returned. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?check_collisions_with_point_cloud= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?check_collisions_with_point_cloud= + + +.. _expl-silhouettematch-point-cloud-enhancement: + +``point_cloud_enhancement`` (*Enhance with Base Plane*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''' + This parameter is only considered when ``check_collisions_with_point_cloud`` is true and the object detection was + triggered without ``object_plane_detection``. By default, ``point_cloud_enhancement`` is set to ``Off`` (*Off*). + If ``point_cloud_enhancement`` is set to ``ReplaceBright`` (*Replace Bright Image Pixels*), the calibrated base plane will + be used to enhance the point cloud that is used for collision checking. For this, the depth values of all bright image pixels inside the image or, + if set, the 2D region of interest will be set to the depth of the calibrated base plane. This parameter should be used when dark objects are placed on an + untextured bright background, e.g. on a light table. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?point_cloud_enhancement= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?point_cloud_enhancement= + +Status values +------------- + +.. index:: + single: SilhouetteMatch; status + +This module reports the following status values: + +.. tabularcolumns:: |l|L| +.. csv-table:: The ``rc_silhouettematch`` module's status values + :header: Name, Description + + "``data_acquisition_time``","Time in seconds required by the last active service to acquire images" + "``last_timestamp_processed``","The timestamp of the last processed dataset" + "``load_carrier_detection_time``","Processing time of the last load carrier detection in seconds" + "``processing_time``","Processing time of the last detection (including load carrier detection) in seconds" + +.. _sect-silhouettematch-services: + +Services +-------- + +.. index:: + single: SilhouetteMatch; services + +The user can explore and call the ``rc_silhouettematch`` module's services, +e.g. for development and testing, using the +:ref:`sect-rest-api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` or +the |rc_xxx| +:ref:`sect-web-gui`:latex:`\:(Section \ref{webgui:sect-web-gui})`. + +The |silm| module offers the following services. + + +.. _expl-silhouettematch-srv-detect-objects: + +``detect_object`` +^^^^^^^^^^^^^^^^^ + + Triggers an object detection as described in + :ref:`sect-silhouettematch-detect`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-detect})` + and returns the pose of all found object instances. + + .. toggle-header:: + :header: **Details** + + All images used by the service are guaranteed to be newer than the service trigger time. + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/detect_object + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/services/detect_object + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/detect_object + + .. tabs:: + + .. tab:: **Request** + + Required arguments: + + ``object_id`` in ``object_to_detect``: ID of the template which should be detected. + + ``pose_frame``: see :ref:`sect-silhouettematch-hand-eye-calib`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-hand-eye-calib})`. + + Potentially required arguments: + + ``robot_pose``: see :ref:`sect-silhouettematch-hand-eye-calib`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-hand-eye-calib})`. + + Optional arguments: + + ``object_plane_detection``: false if the objects are placed on a calibrated base plane, true if the objects' surfaces are planar and + the base plane is unknown or the objects are located on multiple different planes, e.g. stacks. + + ``offset``: offset in meters by which the base-plane calibration will be shifted towards the camera. + + ``load_carrier_id``: ID of the load carrier which contains the items to be detected. + + ``collision_detection``: see :ref:`sect-collision-check-other-modules`:latex:`\:(Section \ref{collisioncheck:sect-collision-check-other-modules})`. + + .. include:: _gen/nodes/services/rc_silhouettematch_detect_object_request.txt + + .. tab:: **Response** + + The maximum number of returned instances can be controlled with the ``max_number_of_detected_objects`` + parameter. + + ``object_id``: ID of the detected template. + + ``instances``: list of detected object instances, ordered according to the chosen sorting strategy. + + ``grasps``: list of grasps on the detected objects, ordered according to the chosen sorting strategy. + The ``instance_uuid`` gives the reference to the detected object in ``instances`` this grasp belongs to. + The list of returned grasps will be trimmed to the 100 best grasps if more reachable grasps are found. + Each grasp contains a flag ``collision_checked`` and a ``gripper_id`` + (see :ref:`sect-collision-check-other-modules`:latex:`, Section \ref{collisioncheck:sect-collision-check-other-modules}`). + + ``load_carriers``: list of detected load carriers. + + ``timestamp``: timestamp of the image set the detection ran on. + + ``return_code``: holds possible warnings or error codes and messages. + + .. include:: _gen/nodes/services/rc_silhouettematch_detect_object_response.txt + +.. _expl-silhouettematch-srv-calib: + +``calibrate_base_plane`` +^^^^^^^^^^^^^^^^^^^^^^^^ + + Triggers the calibration of the base plane, as described in + :ref:`sect-silhouettematch-base-plane-calib`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-base-plane-calib})`. + + .. toggle-header:: + :header: **Details** + + A successful base-plane calibration is stored persistently on the |rc_xxx| and returned by this service. + The base-plane calibration is persistent over firmware updates and rollbacks. + + All images used by the service are guaranteed to be newer than the service trigger time. + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/calibrate_base_plane + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/services/calibrate_base_plane + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/calibrate_base_plane + + .. tabs:: + + .. tab:: **Request** + + Required arguments: + + ``plane_estimation_method``: method to use for base-plane calibration. Valid values are ``STEREO``, ``APRILTAG``, ``MANUAL``. + + ``pose_frame``: see :ref:`sect-silhouettematch-hand-eye-calib`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-hand-eye-calib})`. + + Potentially required arguments: + + ``plane`` if ``plane_estimation_method`` is ``MANUAL``: plane that will be set as base-plane calibration. + + ``robot_pose``: see :ref:`sect-silhouettematch-hand-eye-calib`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-hand-eye-calib})`. + + ``region_of_interest_2d_id``: ID of the region of interest for base-plane calibration. + + Optional arguments: + + ``offset``: offset in meters by which the estimated plane will be shifted towards the camera. + + ``plane_preference`` in ``stereo``: whether the plane closest to or farthest from the camera should be used as base plane. + This option can be set only if ``plane_estimation_method`` is ``STEREO``. + Valid values are ``CLOSEST`` and ``FARTHEST``. If not set, the default is ``FARTHEST``. + + .. include:: _gen/nodes/services/rc_silhouettematch_calibrate_base_plane_request.txt + + .. tab:: **Response** + + ``plane``: calibrated base plane. + + ``timestamp``: timestamp of the image set the calibration ran on. + + ``return_code``: holds possible warnings or error codes and messages. + + .. include:: _gen/nodes/services/rc_silhouettematch_calibrate_base_plane_response.txt + + +.. _expl-silhouettematch-srv-get-calib: + +``get_base_plane_calibration`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns the configured base-plane calibration. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/get_base_plane_calibration + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/services/get_base_plane_calibration + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/get_base_plane_calibration + + .. tabs:: + + .. tab:: **Request** + + Required arguments: + + ``pose_frame``: see :ref:`sect-silhouettematch-hand-eye-calib`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-hand-eye-calib})`. + + Potentially required arguments: + + ``robot_pose``: see :ref:`sect-silhouettematch-hand-eye-calib`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-hand-eye-calib})`. + + .. include:: _gen/nodes/services/rc_silhouettematch_get_base_plane_calibration_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_silhouettematch_get_base_plane_calibration_response.txt + + +.. _expl-silhouettematch-srv-delete-calib: + +``delete_base_plane_calibration`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Deletes the configured base-plane calibration. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/delete_base_plane_calibration + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/services/delete_base_plane_calibration + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/delete_base_plane_calibration + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_silhouettematch_delete_base_plane_calibration_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_silhouettematch_delete_base_plane_calibration_response.txt + + +.. _expl-silhouettematch-srv-set-preferred-orientation: + +``set_preferred_orientation`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Persistently stores the preferred orientation of the gripper to compute the reachability of the grasps, + which is used for filtering and, optionally, sorting the grasps returned by the ``detect_object`` service + (see :ref:`sect-silhouettematch-set-preferred-orientation`:latex:`, Section \ref{silhouettematch:sect-silhouettematch-set-preferred-orientation}`). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/set_preferred_orientation + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/services/set_preferred_orientation + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/set_preferred_orientation + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_silhouettematch_set_preferred_orientation_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_silhouettematch_set_preferred_orientation_response.txt + +.. _expl-silhouettematch-srv-get-preferred-orientation: + +``get_preferred_orientation`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns the preferred orientation of the gripper to compute the reachability of the grasps, + which is used for filtering and, optionally, sorting the grasps returned by the ``detect_object`` service + (see :ref:`sect-silhouettematch-set-preferred-orientation`:latex:`, Section \ref{silhouettematch:sect-silhouettematch-set-preferred-orientation}`). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/get_preferred_orientation + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/services/get_preferred_orientation + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/get_preferred_orientation + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_silhouettematch_get_preferred_orientation_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_silhouettematch_get_preferred_orientation_response.txt + +.. _expl-silhouettematch-srv-set-sorting-strategies: + +``set_sorting_strategies`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Persistently stores the sorting strategy for sorting the grasps and detected objects returned by the ``detect_object`` service + (see :ref:`sect-silhouettematch-detect`:latex:`, Section \ref{silhouettematch:sect-silhouettematch-detect}`). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/set_sorting_strategies + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/services/set_sorting_strategies + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/set_sorting_strategies + + .. tabs:: + + .. tab:: **Request** + + Only one strategy may have a ``weight`` greater than 0. If all ``weight`` values are set to 0, the module will use the + default sorting strategy. + + If the weight for ``direction`` is set, the + ``vector`` must contain the direction vector and ``pose_frame`` must be either ``camera`` or ``external``. + + .. include:: _gen/nodes/services/rc_silhouettematch_set_sorting_strategies_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_silhouettematch_set_sorting_strategies_response.txt + +.. _expl-silhouettematch-srv-get-sorting-strategies: + +``get_sorting_strategies`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns the sorting strategy for sorting the grasps and detected objects returned by the ``detect_object`` service + (see :ref:`sect-silhouettematch-detect`:latex:`, Section \ref{silhouettematch:sect-silhouettematch-detect}`). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/get_sorting_strategies + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/services/get_sorting_strategies + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/get_sorting_strategies + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_silhouettematch_get_sorting_strategies_request.txt + + .. tab:: **Response** + + All ``weight`` values are 0 when the module uses the default sorting strategy. + + .. include:: _gen/nodes/services/rc_silhouettematch_get_sorting_strategies_response.txt + +.. only:: rc_cube + + .. _expl-silhouettematch-srv-trigger-dump: + + ``trigger_dump`` + ^^^^^^^^^^^^^^^^ + Triggers dumping of the detection that corresponds to the given timestamp, + or the latest detection, if no timestamp is given. The dumps are saved to the + connected USB drive. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/services/trigger_dump + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/trigger_dump + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_silhouettematch_trigger_dump_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_silhouettematch_trigger_dump_response.txt + +.. _expl-silhouettematch-srv-reset-params: + +``reset_defaults`` +^^^^^^^^^^^^^^^^^^ + + Resets all parameters of the module to its default values, + as listed in above table. + Also resets preferred orientation and sorting strategies. + The reset does not apply to templates and base-plane calibration. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/reset_defaults + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/services/reset_defaults + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/reset_defaults + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_silhouettematch_reset_defaults_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_silhouettematch_reset_defaults_response.txt + +.. _expl-silhouettematch-srv-set-roi: + +``set_region_of_interest_2d`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Persistently stores a 2D region of interest on the |rc_xxx|. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-roi-srv-set-roi-2d`:latex:`\:(Section \ref{roi:expl-roi-srv-set-roi-2d})` in ``rc_roi_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/set_region_of_interest_2d + +.. _expl-silhouettematch-srv-get-roi: + +``get_regions_of_interest_2d`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns the configured 2D regions of interest with the requested ``region_of_interest_2d_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-roi-srv-get-roi-2d`:latex:`\:(Section \ref{roi:expl-roi-srv-get-roi-2d})` in ``rc_roi_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/get_regions_of_interest_2d + +.. _expl-silhouettematch-srv-delete-roi: + +``delete_regions_of_interest_2d`` (deprecated) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Deletes the configured 2D regions of interest with the requested ``region_of_interest_2d_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + This service is not available in API version 2. + Use :ref:`expl-roi-srv-delete-roi-2d`:latex:`\:(Section \ref{roi:expl-roi-srv-delete-roi-2d})` in ``rc_roi_db`` instead. + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/delete_regions_of_interest_2d + +.. _sect-silhouettematch-internal-services: + +Internal services +----------------- + +The following services for configuring grasps can change in future without notice. +Setting, retrieving and deleting grasps is recommend to be done via the |webgui|. + +.. only:: rc_cube + + .. note:: + + Configuring grasps is global for all templates on the |rc_cube| and affects all + camera pipelines. + +.. _expl-silhouettematch-srv-set-grasp: + +``set_grasp`` +^^^^^^^^^^^^^ + + Persistently stores a grasp for the given object template on the |rc_xxx|. + All configured grasps are persistent over firmware updates and rollbacks. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/set_grasp + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/services/set_grasp + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/set_grasp + + .. tabs:: + + .. tab:: **Request** + + Details for the definition of the ``grasp`` type are given in + :ref:`sect-silhouettematch-grasps`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-grasps})`. + + .. include:: _gen/nodes/services/rc_silhouettematch_set_grasp_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_silhouettematch_set_grasp_response.txt + + +.. _expl-silhouettematch-srv-set-all-grasps: + +``set_all_grasps`` +^^^^^^^^^^^^^^^^^^ + + Replaces the list of grasps for the given object template on the |rc_xxx|. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/set_all_grasps + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/services/set_all_grasps + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/set_all_grasps + + .. tabs:: + + .. tab:: **Request** + + Details for the definition of the ``grasp`` type are given in + :ref:`sect-silhouettematch-grasps`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-grasps})`. + + .. include:: _gen/nodes/services/rc_silhouettematch_set_all_grasps_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_silhouettematch_set_all_grasps_response.txt + +.. _expl-silhouettematch-srv-get-grasps: + +``get_grasps`` +^^^^^^^^^^^^^^ + + Returns all configured grasps which have the requested ``grasp_ids`` and belong to the requested ``template_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/get_grasps + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/services/get_grasps + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/get_grasps + + .. tabs:: + + .. tab:: **Request** + + If no ``grasp_ids`` are provided, all grasps belonging to the requested ``template_ids`` are returned. + If no ``template_ids`` are provided, all grasps with the requested ``grasp_ids`` are returned. + If neither IDs are provided, all configured grasps are returned. + + .. include:: _gen/nodes/services/rc_silhouettematch_get_grasps_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_silhouettematch_get_grasps_response.txt + +.. _expl-silhouettematch-srv-delete-grasps: + +``delete_grasps`` +^^^^^^^^^^^^^^^^^ + + Deletes all grasps with the requested ``grasp_ids`` that belong to the requested ``template_ids``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/delete_grasps + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/services/delete_grasps + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/delete_grasps + + .. tabs:: + + .. tab:: **Request** + + If no ``grasp_ids`` are provided, all grasps belonging to the requested ``template_ids`` are deleted. + The ``template_ids`` list must not be empty. + + .. include:: _gen/nodes/services/rc_silhouettematch_delete_grasps_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_silhouettematch_delete_grasps_response.txt + +.. _expl-silhouettematch-srv-get-symmetric-grasps: + +``get_symmetric_grasps`` +^^^^^^^^^^^^^^^^^^^^^^^^ + + Returns all grasps that are symmetric to the given grasp. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/get_symmetric_grasps + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/services/get_symmetric_grasps + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_silhouettematch/services/get_symmetric_grasps + + .. tabs:: + + .. tab:: **Request** + + Details for the definition of the ``grasp`` type are given in + :ref:`sect-silhouettematch-grasps`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-grasps})`. + + .. include:: _gen/nodes/services/rc_silhouettematch_get_symmetric_grasps_request.txt + + .. tab:: **Response** + + The first grasp in the returned list is the one that was passed with the service call. + If the object template does not have an exact symmetry, only the grasp passed with the + service call will be returned. If the object template has a continuous symmetry (e.g. a + cylindrical object), only 12 equally spaced sample grasps will be returned. + + Details for the definition of the ``grasp`` type are given in + :ref:`sect-silhouettematch-grasps`:latex:`\:(Section \ref{silhouettematch:sect-silhouettematch-grasps})`. + + .. include:: _gen/nodes/services/rc_silhouettematch_get_symmetric_grasps_response.txt + +.. _sect-silhouettematch-return-codes: + +Return codes +------------ + +.. index:: + pair: SilhouetteMatch; return codes + +Each service response contains a ``return_code``, +which consists of a ``value`` plus an optional ``message``. +A successful service returns with a ``return_code`` value of ``0``. +Negative ``return_code`` values indicate that the service failed. +Positive ``return_code`` values indicate that the service succeeded with additional information. + +.. tabularcolumns:: |c|L| +.. _tab-silhouettematch-return-codes: +.. csv-table:: Return codes of the |silm| module services + :header: Code, Description + + "0", "Success" + "-1", "An invalid argument was provided" + "-3", "An internal timeout occurred, e.g. during object detection" + "-4", "Data acquisition took longer than allowed" + "-7", "Data could not be read or written to persistent storage" + "-8", "Module is not in a state in which this service can be called. E.g. ``detect_object`` cannot be called if there is no base-plane calibration." + "-10", "New element could not be added as the maximum storage capacity of regions of interest or templates has been exceeded" + "-100", "An internal error occurred" + "-101", "Detection of the base plane failed" + "-102", "The hand-eye calibration changed since the last base-plane calibration" + "-104", "Offset between the base plane normal and the camera's line of sight exceeds 10 degrees" + "10", "The maximum storage capacity of regions of interest or templates has been reached" + "11", "An existing element was overwritten" + "100", "The requested load carrier was not detected in the scene" + "101", "None of the detected grasps is reachable" + "102", "The detected load carrier is empty" + "103", "All detected grasps are in collision" + "107", "The base plane was not transformed to the current camera pose, e.g. because no robot pose was provided during base-plane calibration" + "108", "The template is deprecated." + "109", "The plane for object detection does not fit to the load carrier, e.g. objects are below the load carrier floor." + "111", "The detection result's pose could not be refined with the point cloud because the template's outer contour is not closed." + "151", "The object template has a continuous symmetry" + "999", "Additional hints for application development" + +.. _sect-silhouettematch-template-upload: + +Template API +------------ + +.. index:: + single: SilhouetteMatch; template api + single: SilhouetteMatch; template download + single: SilhouetteMatch; template upload + single: SilhouetteMatch; template deletion + +For template upload, download, listing and removal, special |rest-api| endpoints are provided. +Templates can also be uploaded, downloaded and removed via the |webgui|. +The templates include the grasp points, if grasp points have been configured. +Up to 50 templates can be stored persistently on the |rc_xxx|. + +.. only:: rc_visard + + .. include:: _gen/swagger/rc_visard/templates_rc_silhouettematch.txt + +.. only:: rc_visard_ng + + .. include:: _gen/swagger/rc_visard_ng/templates_rc_silhouettematch.txt + +.. only:: rc_cube + + .. include:: _gen/swagger/rc_cube/templates_rc_silhouettematch.txt diff --git a/v24.04/en/_raw_sources/standards.rst.txt b/v24.04/en/_raw_sources/standards.rst.txt new file mode 100644 index 0000000..ec03799 --- /dev/null +++ b/v24.04/en/_raw_sources/standards.rst.txt @@ -0,0 +1,85 @@ +.. include:: global_rst.glb + +.. raw:: latex + + \newpage + +.. |CE| image:: images/ce-mark_small.* + +.. |NRTL| image:: images/NRTL_small.* + +.. |FCC| image:: images/fcc_logo_small.* + + +Applicable standards +==================== + +.. only:: matrixvision + + The following approvals and certificates have been issued to Roboception GmbH. + +Interfaces +---------- + +The |rc_xxx| supports the following interface standards: + +|genicamlogo| + +The Generic Interface for Cameras standard is the basis for plug & play handling of cameras and devices. + +|gigelogo| + +GigE Vision\ |reg| is an interface standard for transmitting high-speed video and related control data over Ethernet networks. + +.. only:: rc_visard_ng + + Approvals + --------- + + The |rc_xxx| has received the following approvals: + + |CE| + EC Declaration of Conformity + +.. only:: rc_visard + + Approvals + --------- + + + The |rc_xxx| has received the following approvals: + + |CE| + EC Declaration of Conformity + + + |NRTL| + NRTL certification by TÜV Süd + + |FCC| + Changes or modifications not expressly approved by the manufacturer could void the user’s authority to operate the equipment. + This device complies with Part 15 of the FCC rules. Operation is subject to the following two conditions: + + 1. This device may not cause harmful interference, and + 2. this device must accept any interference received, including interference that may cause undesired operation. + + .. _sect-standards: + + Standards + --------- + + The |rc_visard| has been tested to be in compliance with the following standards: + + * AS/NZS CISPR32 : 2015 Information technology equipment, Radio disturbance characteristics, Limits and methods of measurement + * CISPR 32 : 2015 Electromagnetic compatibility of multimedia equipment - Emission requirements + * GB 9254 : 2008 This standard is out of the accreditation scope. Information technology equipment, Radio disturbance characteristics, Limits and methods of measurement + * EN 55032 : 2015 Electromagnetic compatibility of multimedia equipment - Emission requirements + * EN 55024 : 2010 +A1:2015 Information technology equipment, Immunity characteristics, Limits and methods of measurement + * CISPR 24 : 2015 +A1:2015 International special committee on radio interference, Information technology equipment-Immunity characteristics-Limits and methods of measurement + * EN 61000-6-2 : 2005 Electromagnetic compatibility (EMC) Part 6-2:Generic standards - Immunity for industrial environments + * EN 61000-6-3 : 2007+A1:2011 Electromagnetic compatibility (EMC) - Part 6-3: Generic standards - Emission standard for residential, commercial and light-industrial environments + * Registered FCC ID: 2AVMTRCV17 + * Certified for Canada according to CAN ICES-3(B)/NMB-3(B) + +.. + |TODO| Download link of certification of conformity diff --git a/v24.04/en/_raw_sources/stereo_camera.rst.txt b/v24.04/en/_raw_sources/stereo_camera.rst.txt new file mode 100644 index 0000000..166640f --- /dev/null +++ b/v24.04/en/_raw_sources/stereo_camera.rst.txt @@ -0,0 +1,893 @@ + +.. include:: global_rst.glb + +.. _sect-stereo-camera: + +Camera +====== + +The camera module is a base module which is available on every |rc_xxx| and +is responsible for image acquisition and rectification. It provides various +parameters, e.g. to control exposure and frame rate. + +.. _sect-stereo-camera-rectification: + +Rectification +------------- + +.. index:: + single: rectification + single: camera model + single: stereo camera + single: calibration; rectification + single: focal length + single: baseline + single: disparity + +To simplify image processing, the camera module rectifies all camera images +based on the camera calibration. This means that lens distortion is removed and +the principal point is located exactly in the middle of the image. + +The model of a rectified camera is described with just one value, which is the focal length. +The |rc_xxx| reports a focal length factor via its various interfaces. It +relates to the image width for supporting different image resolutions. The +focal length :math:`f` in pixels can be easily obtained by multiplying the +focal length factor by the image width in pixels. + +In case of a stereo camera, rectification also aligns images such that an +object point is always projected onto the same image row in both images. +The cameras' optical axes become exactly parallel. + +.. This means that points at infinite distance are projected onto the same image column in both images. +.. The closer an object point is, the larger is the difference between its image +.. columns in the right and left images. This difference is called disparity. + +.. only:: rc_cube and (roboception or schunk or basler) + + .. note:: If a |blaze| sensor is used instead of a stereo camera, only + one camera image is provided. However, the image is rectified, + i.e. lens distortion is removed and the principal point is in the + image center. + +.. _sect-cam-accessing-images: + +Viewing and downloading images +------------------------------ + +.. index:: + pair: images; download + +The |rc_xxx| provides the time-stamped, rectified images +over the GenICam interface (see :ref:`sect-provided-image-streams`:latex:`, +Section \ref{gigevision:sect-provided-image-streams}`). Live streams of the images are provided +with reduced quality in the :ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})`. + +The |webgui| also provides the possibility to download a snapshot of the current scene as a .tar.gz file +as described in :ref:`sect-webgui-camera-snapshot`:latex:`\:(Section \ref{webgui:sect-webgui-camera-snapshot})`. + + +.. _sect-cam-params: + +Parameters +---------- + +.. index:: + pair: parameters; camera + single: gain factor + single: exposure time + pair: camera; Web GUI + +The camera software module is called ``rc_camera`` and is represented by the +*Camera* page :cubeonly:`in the desired pipeline` in the :ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})`. +The user can change the camera parameters there, or directly via the |rest-api| +(:ref:`sect-rest-api`:latex:`, Section \ref{rest_api:sect-rest-api}`) or GigE Vision +(:ref:`sect-genicam`:latex:`, Section \ref{gigevision:sect-genicam}`). + +.. Note:: Camera parameters cannot be changed via the |webgui| or |rest-api| if |rc_xxx| + is used via GigE Vision. + +Parameter overview +^^^^^^^^^^^^^^^^^^ + +.. only:: rc_cube + + .. note:: The minimum, maximum and default values in the parameter table + below show the values of the |rc_visard|. The values will be + different for other sensors. + +.. only:: rc_cube or rc_visard + + .. include:: _gen/nodes/params/rc_camera.txt + +.. only:: rc_visard_ng + + .. include:: _gen/nodes/params/rc_camera_ng.txt + +Description of run-time parameters +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. figure:: images/webgui_camera.png + :width: 100 % + :align: center + + The |webgui|'s *Camera* page + + +.. only:: rc_visard_ng + + .. _expl-acquisition_mode: + + .. index:: + pair: parameters; camera + pair: camera; acquisition mode + + ``acquisition_mode`` (*Acquisition Mode*) + ''''''''''''''''''''''''''''''''''''''''' + This values determines the camera acquisition mode. In ``Continuous`` mode, the camera will + acquire images at the specified frame rate ``fps``. In ``Trigger`` mode, images are only + acquired when the camera receives a trigger signal. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?acquisition_mode= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/parameters?acquisition_mode= + + .. _expl-trigger_source: + + .. index:: + pair: camera; trigger source + + ``trigger_source`` (*Trigger Source*) + ''''''''''''''''''''''''''''''''''''' + This value is only used when ``acquisition_mode`` is set to ``Trigger`` and determines the + source for the trigger. In ``Software`` mode a trigger can be sent via the ``rc_camera/acquisition_trigger`` service. + When the ``acquisition_mode`` for the depth images is set to ``SingleFrame`` or ``SingleFrameOut1`` + (see :ref:`sect-disp-image-parameters`:latex:`, Section \ref{stereo_matching:sect-disp-image-parameters}`), + the camera software trigger is sent automatically whenever a depth image + acquisition is triggered. + The modes ``In1`` and ``In2`` are hardware trigger modes. + An image is acquired whenever a signal on the chosen input is received. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?trigger_source= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/parameters?trigger_source= + + .. _expl-trigger_activation: + + .. index:: + pair: camera; trigger activation + + ``trigger_activation`` (*Trigger Activation*) + ''''''''''''''''''''''''''''''''''''''''''''' + This value is only used when ``acquisition_mode`` is set to ``Trigger`` and ``trigger_source`` is set to + ``In1`` or ``In2``. It determines the signal edge that should be used to trigger an acquisition. Possible + values are ``RisingEdge``, ``FallingEdge`` or ``AnyEdge``. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?trigger_activation= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/parameters?trigger_activation= + +.. _expl-fps: + +.. index:: + pair: camera; frame rate + see: fps; frame rate + +``fps`` (*FPS*) +''''''''''''''' + This value is the cameras' frame rate (fps, frames per second), + which determines the upper frequency at which depth images + can be computed. This is also the frequency at which the |rc_xxx| + delivers images via GigE Vision. Reducing this frequency also + reduces the network bandwidth required to transmit the images. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?fps= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_camera/parameters?fps= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/parameters?fps= + + .. only:: rc_visard + + The camera always runs with |cam-rate| + to ensure proper working of internal modules such as visual + odometry that need a constant frame rate. + The user frame rate setting is implemented by excluding frames + for stereo matching and transmission via GigE Vision to reduce + bandwidth as shown in figure :numref:`fig-fps`. + + .. only:: rc_visard_ng + + The camera always runs with |cam-rate| when in ``Continuous`` acquisition + mode to ensure proper working of internal modules such as visual + odometry that need a constant frame rate. + The user frame rate setting is implemented by excluding frames + for stereo matching and transmission via GigE Vision to reduce + bandwidth as shown in figure :numref:`fig-fps`. + + .. _fig-fps: + .. figure:: images/fps.* + :width: 100 % + :align: center + + Images are internally always captured with |cam-rate|. The ``fps`` parameter + determines how many of them are sent as camera images via GigE Vision. + +.. _expl-gamma: + +.. index:: + pair: camera; gamma + +``gamma`` (*Gamma*) +''''''''''''''''''' + The gamma value determines the mapping of perceived light to the brightness of a pixel. + A gamma value of 1 corresponds to a linear relationship. Lower gamma values let dark image + parts appear brighter. A value around 0.5 corresponds to human vision. + + .. only:: rc_cube and (roboception or schunk or basler) + + Not available for blaze sensor. + + .. only:: rc_cube + + .. note:: For a pipeline of type ``rc_visard`` this value can only be changed + when the connected |rc_visard| has at least firmware version + 22.07. Otherwise the gamma value will always be 1.0. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?gamma= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_camera/parameters?gamma= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/parameters?gamma= + +.. _expl-exp-control: + +.. index:: + single: exposure; auto + single: exposure; manual + single: exposure; HDR + single: manual exposure + single: auto exposure + +``exp_control`` (Exposure *Auto*, *HDR* or *Manual*) +'''''''''''''''''''''''''''''''''''''''''''''''''''' + The exposure control mode can be set to `Auto`, `HDR` or `Manual`. + This replaces the deprecated `exp_auto` parameter. + + `Auto`: This is the default mode in which the exposure time and gain + factor is chosen automatically to correctly expose the image. + The last automatically determined exposure and gain values are set into + ``exp_value`` and ``gain_value`` when switching auto-exposure off. + + `HDR`: The HDR mode computes high-dynamic-range images by combining images + with different exposure times to avoid under-exposed and over-exposed areas. + This decreases the frame rate and is only suitable for static scenes. + + `Manual`: In the manual exposure mode the exposure time and gain are kept + fixed independent of the resulting image brightness. + + .. only:: rc_cube + + .. note:: For a pipeline of type ``rc_visard`` the `HDR` mode is only available + when the connected |rc_visard| has at least firmware version 23.01. + + .. only:: rc_cube and (roboception or schunk or basler) + + Not available for blaze sensor. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?exp_control= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_camera/parameters?exp_control= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/parameters?exp_control= + +.. _expl-exp-auto: + +.. index:: + single: exposure; auto + single: exposure; manual + single: manual exposure + single: auto exposure + +``exp_auto`` (deprecated) +''''''''''''''''''''''''' + **This parameter is deprecated and will be removed in a future release.** + Please use `exp_control`. + + This value can be set to `true` for auto-exposure mode, + or to `false` for manual exposure mode. In manual exposure mode, the + chosen exposure time is kept, even if the images are overexposed or + underexposed. In auto-exposure mode, the exposure time and gain factor + is chosen automatically to correctly expose the image. The last + automatically determined exposure and gain values are set into + ``exp_value`` and ``gain_value`` when switching auto-exposure off. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?exp_auto= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_camera/parameters?exp_auto= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/parameters?exp_auto= + +.. _expl-exp-auto-mode: + +.. index:: + pair: exposure; auto + single: auto exposure mode + pair: auto exposure mode; AdaptiveOut1 + pair: auto exposure mode; Out1High + pair: auto exposure mode; Normal + +``exp_auto_mode`` (*Auto Exposure Mode*) +'''''''''''''''''''''''''''''''''''''''' + The auto exposure mode can be set to `Normal`, `Out1High` or `AdaptiveOut1`. These modes are + relevant when the |rc_xxx| is used with an external light source or projector connected + to the |rc_visard|'s or |rc_viscore|'s GPIO Out1, + which can be controlled by the IOControl module + (:ref:`sect-iocontrol`:latex:`, Section \ref{iocontrol:sect-iocontrol}`). + + `Normal`: All images are considered for exposure control, except if the IOControl mode + for GPIO Out1 is `ExposureAlternateActive`: then only images where GPIO Out1 is HIGH will be + considered, since these images may be brighter in case GPIO Out1 is used to trigger an external light source. + + `Out1High`: This exposure mode adapts the exposure time using only images with GPIO Out1 HIGH. Images where GPIO Out1 is LOW are not + considered at all, which means, that the exposure time does not change when only images with Out1 LOW are acquired. + This mode is recommended for using the ``acquisition_mode`` ``SingleFrameOut1`` in the stereo matching module as described in + :ref:`Stereo Matching Parameters`:latex:`\:(Section \ref{stereo_matching:sect-disp-image-parameters})` + and having an external projector connected to GPIO Out1, when changes in the brightness of the scene should only be considered when Out1 is HIGH. + This is the case, for example, when a bright part of the robot moves through the field of view of the camera just before a detection is triggered, + which should not affect the exposure time. + + `AdaptiveOut1`: This exposure mode uses all camera images and tracks the exposure difference between images + with GPIO Out1 LOW and HIGH. While the IOControl mode for GPIO Out1 is LOW, the images are under-exposed by this exposure + difference to avoid over-exposure for when GPIO Out1 triggers an external projector. The resulting exposure difference + is given as *Out1 Reduction* below the live images. This mode is recommended for using the ``acquisition_mode`` + ``SingleFrameOut1`` in the stereo matching module as described in + :ref:`Stereo Matching Parameters`:latex:`\:(Section \ref{stereo_matching:sect-disp-image-parameters})` + and having an external projector connected to GPIO Out1, when changes in the brightness of the scene should be considered at all times. + This is the case, for example, in applications where the external lighting changes. + + .. only:: rc_cube and (roboception or schunk or basler) + + Not available for blaze sensor. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?exp_auto_mode= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_camera/parameters?exp_auto_mode= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/parameters?exp_auto_mode= + +.. _expl-exp-max: + +.. index:: + single: auto exposure + pair: maximum; exposure time + single: gain factor + single: motion blur + single: image noise + +``exp_max`` (*Max Exposure*) +'''''''''''''''''''''''''''' + This value is the maximal exposure time in auto-exposure + mode in seconds. The actual + exposure time is adjusted automatically so that the images are exposed + correctly. If the maximum exposure time is reached, but the images are still + underexposed, the |rc_xxx| stepwise increases the gain to increase the + images' brightness. Limiting the exposure time is useful for avoiding + or reducing motion blur during fast movements. However, higher gain + introduces noise into the image. The best trade-off depends on the application. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?exp_max= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_camera/parameters?exp_max= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/parameters?exp_max= + +.. _exp-auto-max-min-average: + +``exp_auto_average_max`` (*Max Brightness*) and ``exp_auto_average_min`` (*Min Brightness*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + The auto-exposure tries to set the exposure time and gain factor such that the + average intensity (i.e. brightness) in the image or exposure region is between a + maximum and a minimum. The maximum brightness will be used if there is no saturation, e.g. + no over-exposure due to bright surfaces or reflections. In case of saturation, + the exposure time and gain factor are reduced, but only down to the minimum + brightness. + + The maximum brightness has precedence over the minimum brightness parameter. + If the minimum brightness is larger than the maximum brightness, the auto-exposure + always tries to make the average intensity equal to the maximum brightness. + + The current brightness is always shown in the status bar below the images. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_camera/parameters?= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/parameters?= + +.. _expl-exp-region: + +.. index:: + single: exposure region + +``exp_offset_x``, ``exp_offset_y``, ``exp_width``, ``exp_height`` (*Exposure Region*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + These values define a rectangular region in the left rectified image for + limiting the area used for computing the auto exposure. The exposure time and + gain factor of both images are chosen to optimally expose the defined region. + This can lead to over- or underexposure of image parts outside the defined + region. If either the width or height is 0, then the whole left and right + images are considered by the auto exposure function. This is the default. + + The region is visualized in the |webgui| by a rectangle in the left + rectified image. It can be defined using the sliders or by selecting + it in the image after pressing the button ``Select Region in Image``. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_camera/parameters?= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/parameters?= + +.. _expl-exp-value: + +.. index:: + single: exposure time + single: manual exposure + +``exp_value`` (*Exposure*) +'''''''''''''''''''''''''' + This value is the exposure time in manual exposure mode in seconds. This exposure time is kept constant + even if the images are underexposed. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?exp_value= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_camera/parameters?exp_value= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/parameters?exp_value= + +.. _expl-gain-value: + +.. index:: + single: gain factor + +``gain_value`` (*Gain*) +''''''''''''''''''''''' + This value is the gain factor in decibel that can be set in manual exposure mode. Higher gain factors + reduce the required exposure time but introduce noise. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?gain_value= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_camera/parameters?gain_value= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/parameters?gain_value= + +.. _expl-wb-auto: + +.. index:: + single: white balance + +``wb_auto`` (*White Balance Auto* or *Manual*) +'''''''''''''''''''''''''''''''''''''''''''''' + This value can be set to `true` for automatic white balancing or `false` for manually + setting the ratio between the colors using ``wb_ratio_red`` and + ``wb_ratio_blue``. The last automatically determined ratios are set into + ``wb_ratio_red`` and ``wb_ratio_blue`` when switching automatic white balancing off. + White balancing is without function for monochrome + cameras and will not be displayed in the |webgui| in this case. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?wb_auto= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_camera/parameters?wb_auto= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/parameters?wb_auto= + +.. _expl-wb-ratio: + +.. index:: + single: white balance + +``wb_ratio_blue`` and ``wb_ratio_red`` (*Blue | Green* and *Red | Green*) +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + These values are used to set blue to green and red to green ratios + for manual white balance. White balancing is without function for monochrome + cameras and will not be displayed in the |webgui| in this case. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_camera/parameters?= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/parameters?= + +These parameters are also available over the GenICam interface with slightly different names and partly with different units +or data types (see :ref:`sect-genicam`:latex:`, Section \ref{gigevision:sect-genicam}`). + + +Status values +------------- + +This module reports the following status values: + +.. only:: rc_cube + + .. tabularcolumns:: |l|L| + .. csv-table:: The ``rc_camera`` module's status values + :header: Name, Description + + "``baseline``","Stereo baseline :math:`t` in meters" + "``brightness``",":mvexclude:`Not available for blaze sensor.` Current brightness of the image as value between 0 and 1" + "``color``","0 for monochrome cameras, 1 for color cameras" + "``exp``","Current exposure time in seconds. This value is shown below the image preview in the |webgui| as *Exposure (ms)*." + "``focal``","Focal length factor normalized to an image width of 1" + "``fps``","Current frame rate of the camera images in Hertz. This value is shown in the |webgui| below the image preview as *FPS (Hz)*." + "``gain``","Current gain factor in decibel. This value is shown in the |webgui| below the image preview as *Gain (dB)*." + "``gamma``","Current gamma value." + "``height``","Height of the camera image in pixels. This value is shown in the |webgui| below the image preview as the second part of *Resolution (px)*." + "``out1_reduction``",":mvexclude:`Not available for blaze sensor.` Fraction of reduction (0.0 - 1.0) of brightness for images with GPIO Out1=LOW in exp_auto_mode=AdaptiveOut1 or exp_auto_mode=Out1High. This value is shown in the |webgui| below the image preview as *Out1 Reduction (%)*." + "``params_override_active``","1 if parameters are temporarily overwritten by a running calibration process" + "``test``","0 for live images and 1 for test images" + "``width``","Width of the camera image in pixels. This value is shown in the |webgui| below the image preview as the first part of *Resolution (px)*." + +.. only:: rc_visard or rc_visard_ng + + .. tabularcolumns:: |l|L| + .. csv-table:: The ``rc_camera`` module's status values + :header: Name, Description + + "``baseline``","Stereo baseline :math:`t` in meters" + "``brightness``",":mvexclude:`Not available for blaze sensor.` Current brightness of the image as value between 0 and 1" + "``color``","0 for monochrome cameras, 1 for color cameras" + "``exp``","Current exposure time in seconds. This value is shown below the image preview in the |webgui| as *Exposure (ms)*." + "``focal``","Focal length factor normalized to an image width of 1" + "``fps``","Current frame rate of the camera images in Hertz. This value is shown in the |webgui| below the image preview as *FPS (Hz)*." + "``gain``","Current gain factor in decibel. This value is shown in the |webgui| below the image preview as *Gain (dB)*." + "``gamma``","Current gamma value." + "``height``","Height of the camera image in pixels. This value is shown in the |webgui| below the image preview as the second part of *Resolution (px)*." + "``out1_reduction``",":mvexclude:`Not available for blaze sensor.` Fraction of reduction (0.0 - 1.0) of brightness for images with GPIO Out1=LOW in exp_auto_mode=AdaptiveOut1 or exp_auto_mode=Out1High. This value is shown in the |webgui| below the image preview as *Out1 Reduction (%)*." + "``params_override_active``","1 if parameters are temporarily overwritten by a calibration process" + "``temp_left``","Temperature of the left camera sensor in degrees Celsius" + "``temp_right``","Temperature of the right camera sensor in degrees Celsius" + "``test``","0 for live images and 1 for test images" + "``time``","Processing time for image grabbing in seconds" + "``width``","Width of the camera image in pixels. This value is shown in the |webgui| below the image preview as the first part of *Resolution (px)*." + +.. _sect-cam-services: + +Services +-------- + +.. index:: + pair: parameters; services + +The camera module offers the following services. + +.. only:: rc_visard_ng + + ``acquisition_trigger`` + ^^^^^^^^^^^^^^^^^^^^^^^ + + Triggers an image acquisition when ``acquisition_mode`` is set to ``Trigger`` and ``trigger_source`` is set to ``Software``. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/acquisition_trigger + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/services/acquisition_trigger + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_camera_acquisition_trigger_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_camera_acquisition_trigger_response.txt + + +``reset_defaults`` +^^^^^^^^^^^^^^^^^^ + + Restores and applies the default values for this module's parameters + ("factory reset"). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/reset_defaults + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_camera/services/reset_defaults + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_camera/services/reset_defaults + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_camera_reset_defaults_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_camera_reset_defaults_response.txt diff --git a/v24.04/en/_raw_sources/stereo_matching.rst.txt b/v24.04/en/_raw_sources/stereo_matching.rst.txt new file mode 100644 index 0000000..29610a2 --- /dev/null +++ b/v24.04/en/_raw_sources/stereo_matching.rst.txt @@ -0,0 +1,995 @@ + +.. include:: global_rst.glb + +.. _sect-stereo-matching: + +Stereo matching +=============== + +.. index:: + single: disparity + single: disparity image + single: depth image + +The stereo matching module is a base module which is available on every |rc_xxx| +and uses the rectified stereo-image pair to compute +disparity, error, and confidence images. It also offers a service to measure depth in +a specified image region (see :ref:`sect-stereo-matching-services`:latex:`, Section \ref{stereo_matching:sect-stereo-matching-services}`). + +.. only:: rc_cube and (roboception or schunk or basler) + + .. note:: This module is not available in camera pipelines of type ``blaze``. + +To compute full resolution disparity, error and confidence images, an additional StereoPlus +:ref:`license` +:latex:`(Section \ref{maintenance:sect-updating-license})` is required. +This license is included in every |rc_xxx| purchased after +31.01.2019. + +.. _sect-disparity-images: + +Computing disparity images +-------------------------- + +After rectification, an object point is guaranteed to be projected onto the same +pixel row in both left and right image. That point's pixel +column in the right image is always lower than or equal +to the same point's pixel column in the left image. The term disparity +signifies the difference between the pixel columns in the right and left images +and expresses the depth or distance of the object point from the camera. The +disparity image stores the disparity values of all pixels in the left camera +image. + +The larger the disparity, the closer the object point. A disparity of 0 +means that the projections of the object point are in the same image column +and the object point is at infinite distance. Often, there are pixels for which disparity +cannot be determined. This is the case for occlusions that appear on the +left sides of objects, because these areas are not seen from the right camera. +Furthermore, disparity cannot be determined for textureless areas. Pixels +for which the disparity cannot be determined are marked as invalid with the +special disparity value of 0. To distinguish between invalid disparity +measurements and disparity measurements of 0 for objects that are infinitely +far away, the disparity value for the latter is set to the smallest possible +disparity value above 0. + +.. index:: ! SGM + see: Semi-Global Matching; SGM + +To compute disparity values, the stereo matching algorithm has to find +corresponding object points in the left and right camera images. These are points +that represent the same object point in the scene. For stereo matching, the |rc_xxx| uses +|sgm|, which offers quick run times and +great accuracy, especially at object borders, fine structures, and in weakly textured areas. + +.. index:: + single: texture + +A key requirement for any stereo matching method is the presence of texture in the +image, i.e., image-intensity changes due to patterns or surface +structure within the scene. In completely untextured regions such as a flat white +wall without any structure, disparity values can either not be computed or the +results are erroneous or have low confidence (see +:ref:`sect-confidence-error`:latex:`, Section \ref{stereo_matching:sect-confidence-error}`). The texture in the scene should not be an +artificial, repetitive pattern, since those structures may lead to ambiguities and hence to wrong disparity measurements. + +When working with poorly textured objects or in +untextured environments, a static artificial texture can be projected +onto the scene using an external pattern projector. This pattern should be random-like +and not contain repetitive structures. The |rc_xxx| provides the IOControl module +(see :ref:`sect-iocontrol`:latex:`, Section \ref{iocontrol:sect-iocontrol}`) as +optional software module which can control a pattern projector connected to the sensor. + +.. _sect-point-clouds: + +Computing depth images and point clouds +--------------------------------------- + +.. index:: ! depth image + single: depth image + pair: 3D coordinates; disparity image + +The following equations show how to compute an object point's actual 3D coordinates :math:`P_x, P_y, P_z` in the +camera coordinate frame +from the disparity image's pixel coordinates :math:`p_{x}, p_{y}` +and the disparity value :math:`d` in pixels: + +.. math:: + :label: reconstruction + + P_x&=\frac{p_x \cdot t}{d}\\ + P_y&=\frac{p_y \cdot t}{d}\\ + P_z&=\frac{f \cdot t}{d}, + +where :math:`f` is the focal length after rectification in pixels and :math:`t` +is the stereo baseline in meters, which was determined during calibration. These values +are also transferred over the GenICam interface (see +:ref:`sect-custom-genicam-params`:latex:`, \:Section \ref{gigevision:sect-custom-genicam-params}`). + +.. only:: rc_visard or rc_visard_ng + + .. note:: The |rc_xxx|'s camera coordinate frame is defined as shown in + :ref:`sect-coordinate-frames`:latex:`\:(Section \ref{hardware_spec:sect-coordinate-frames})`. + +.. note:: The |rc_xxx| reports a focal length factor via its various + interfaces. It relates to the image width + for supporting different image resolutions. The focal length :math:`f` + in pixels can be easily obtained by multiplying the focal length factor + by the image width in pixels. + +Please note that equations :eq:`reconstruction` assume that the coordinate +frame is centered in the principal point that is typically in the center of the image, +and :math:`p_{x}, p_{y}` refer to the middle of the pixel, i.e. by adding 0.5 to the +integer pixel coordinates. The following figure shows the definition of the image coordinate +frame. + +.. figure:: images/image_coordinates.png + :width: 30 % + :align: center + + The image coordinate frame's origin is defined to be at the image center + -- :math:`w` is the image width and :math:`h` is the image height. + +The same equations, but with the corresponding GenICam parameters are given in +:ref:`sect-image-stream-conversions`:latex:`\:(Section \ref{gigevision:sect-image-stream-conversions})`. + +.. index:: + single: 3D modeling + single: point cloud + single: 3D coordinates + +The set of all object points computed from the disparity image gives the point +cloud, which can be used for 3D modeling applications. The disparity image is +converted into a depth image by replacing +the disparity value in each pixel with the value of :math:`P_z`. + +.. only:: roboception or schunk or matrixvision + + .. Note:: |manufacturer| provides software and examples for receiving disparity images from + the |rc_xxx| via GigE Vision and computing depth images and point clouds. See + http://www.roboception.com/download. + +.. _sect-confidence-error: + +Confidence and error images +--------------------------- + +.. index:: ! confidence, !error + single: disparity error + +For each disparity image, additionally an error image and a confidence image are provided, +which give uncertainty measures for each disparity value. These images +have the same resolution and the same frame rate as the disparity image. The +error image contains the disparity error :math:`d_{eps}` in pixels corresponding +to the disparity value at the same image coordinates in the disparity image. +The confidence image contains the corresponding confidence value :math:`c` +between 0 and 1. The confidence is defined as the probability of the true +disparity value being within the interval of three times the error around the +measured disparity :math:`d`, i.e., :math:`[d-3d_{eps}, d+3d_{eps}]`. +Thus, the disparity image with error and confidence values can be used in +applications requiring probabilistic inference. The confidence and error values +corresponding to an invalid disparity measurement will be 0. + +The disparity error :math:`d_{eps}` (in pixels) can be converted to a depth error :math:`z_{eps}` +(in meters) using the focal length :math:`f` (in pixels), the baseline :math:`t` (in meters), and the disparity +value :math:`d` (in pixels) of the same pixel in the disparity image: + +.. math:: + z_{eps}=\frac{d_{eps}\cdot f\cdot t}{d^2}. + :label: eq-deptherror + +Combining equations :eq:`reconstruction` and :eq:`eq-deptherror` allows the +depth error to be related to the depth: + +.. math:: + z_{eps}=\frac{d_{eps}\cdot{P_z}^2}{f\cdot t}. + +With the focal lengths and baselines of the different camera models and the typical combined +calibration and stereo matching error :math:`d_{eps}` of 0.25 pixels, the depth accuracy +can be visualized as shown below. + +.. figure:: _plot/reconstruction_error.png + :width: 60 % + :align: center + + +.. _sect-disp-accessing-images: + +Viewing and downloading images and point clouds +----------------------------------------------- + +.. index:: + pair: timestamp; image + pair: point cloud; download + +The |rc_xxx| provides time-stamped disparity, error, and confidence images over the +GenICam interface (see :ref:`sect-provided-image-streams`:latex:`, \:Section \ref{gigevision:sect-provided-image-streams}`). +Live streams of the images are provided with reduced quality on the *Depth Image* page :cubeonly:`in the desired pipeline` of the +:ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})`. + +The |webgui| also provides the possibility to download a snapshot of the current scene containing the depth, error and confidence +images, as well as a point cloud in ply format as described in +:ref:`sect-webgui-depth-snapshot`:latex:`\:(Section \ref{webgui:sect-webgui-depth-snapshot})`. + +.. _sect-disp-image-parameters: + +Parameters +---------- + +.. index:: + pair: parameters; disparity image + pair: disparity image; Web GUI + pair: depth image; Web GUI + +The stereo matching module is called ``rc_stereomatching`` in the |rest-api| and it is represented by the +*Depth Image* page :cubeonly:`in the desired pipeline` in the :ref:`Web GUI`:latex:`\:(Section \ref{webgui:sect-web-gui})`. +The user can change the stereo matching parameters there, or use the |rest-api| +(:ref:`sect-rest-api`:latex:`, Section \ref{rest_api:sect-rest-api}`) or GigE Vision +(:ref:`sect-genicam`:latex:`, Section \ref{gigevision:sect-genicam}`). + +Parameter overview +^^^^^^^^^^^^^^^^^^ + +.. include:: _gen/nodes/params/rc_stereomatching.txt + +Description of run-time parameters +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Each run-time parameter is represented by a row on the |webgui|'s *Depth Image* page. The name in the +|webgui| is given in brackets behind the parameter name and the parameters are listed in the order +they appear in the |webgui|: + +.. figure:: images/webgui_depth_image.png + :width: 100 % + :align: center + + The |webgui|'s *Depth Image* page + + +.. _expl-depth-acquisition-mode: + +.. index:: + pair: disparity image; acquisition mode + +``acquisition_mode`` (*Acquisition Mode*) +''''''''''''''''''''''''''''''''''''''''' + The acquisition mode can be set to ``Continuous``, ``SingleFrame`` (*Single*) or ``SingleFrameOut1`` (*Single + Out1*). + The first one is the default, which performs stereo matching continuously according to the + user defined frame rate and the available computation resources. The two other modes + perform stereo matching upon each click of the :guilabel:`Acquire` button. The `Single + Out1` + mode additionally controls an external projector that is connected to GPIO Out1 + (:ref:`sect-iocontrol`:latex:`, Section \ref{iocontrol:sect-iocontrol}`). In this mode, + ``out1_mode`` of the IOControl module is automatically set to ``ExposureAlternateActive`` upon each trigger call + and reset to ``Low`` after receiving images for stereo matching. + + .. NOTE:: The ``Single + Out1`` mode can only change the ``out1_mode`` if the IOControl + license is available on the |rc_xxx|. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?acquisition_mode= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_stereomatching/parameters?acquisition_mode= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?acquisition_mode= + +.. _expl-depth-exposure-adapt-timeout: + +.. index:: + pair: disparity image; exposure adaptation timeout + +``exposure_adapt_timeout`` (*Exposure Adaptation Timeout*) +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + The exposure adaptation timeout gives the maximum time in seconds that the system will wait after triggering + an image acquisition until auto exposure has found the optimal exposure time. This timeout is only used + in ``SingleFrame`` (*Single*) or ``SingleFrameOut1`` (*Single + Out1*) + acquisition mode with auto exposure active. This value should be increased in applications + with changing lighting conditions, when images are under- oder overexposed and the resulting + disparity images are too sparse. In these cases multiple images are acquired until the auto-exposure + mode has adjusted or the timeout is reached, and only then the actual image acquisition is triggered. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?exposure_adapt_timeout= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_stereomatching/parameters?exposure_adapt_timeout= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?exposure_adapt_timeout= + +.. index:: + pair: quality; disparity image + +.. _expl-depth-quality: + +``quality`` (*Quality*) +''''''''''''''''''''''' + Disparity images can be computed in different resolutions: + ``Full`` (full image resolution), ``High`` (half of the full image resolution), + ``Medium`` (quarter of the full image resolution) + and ``Low`` (sixth of the full image resolution). Full resolution matching (``Full``) + is only possible with a valid StereoPlus license. The lower + the resolution, the higher the frame rate of the disparity image. Please note that the frame + rate of the disparity, confidence, and error images will always be less than or + equal to the camera frame rate. In case the projector is in ``ExposureAlternateActive`` mode, + the frame rate of the images can be at most half of the camera frame rate. + + .. only:: rc_visard + + A 25 Hz frame rate can be achieved only at the lowest resolution. + + .. only:: rc_visard_ng + + A 25 Hz frame rate can be achieved only at medium and low resolution. + + If full resolution is selected, the depth range is internally limited due to + limited on-board memory resources. It is recommended to adjust ``mindepth`` + and ``maxdepth`` to the depth range that is required by the application. + + .. only:: rc_visard + + .. tabularcolumns:: |l|L|L|L|L| + .. _tab-stereo-quality-spec: + .. csv-table:: Depth image resolutions depending on the chosen quality + + "Quality", "**Full**", "**High**", "**Medium**", "**Low**" + "Resolution (pixel)", "1280 x 960", "640 x 480", "320 x 240", "214 x 160" + + .. only:: rc_visard_ng + + .. tabularcolumns:: |l|L|L|L|L| + .. _tab-stereo-quality-spec: + .. csv-table:: Depth image resolutions depending on the chosen quality + + "Quality", "**Full**", "**High**", "**Medium**", "**Low**" + "Resolution (pixel)", "1440 x 1080", "720 x 540", "360 x 270", "240 x 180" + + .. only:: rc_cube + + .. tabularcolumns:: |l|L|L|L|L| + .. _tab-stereo-quality-spec: + .. csv-table:: Depth image resolutions (pixel) depending on the chosen quality + :header: Connected Camera, Full Quality, High Quality, Medium Quality, Low Quality + + "rc_visard", "1280 x 960", "640 x 480", "320 x 240", "214 x 160" + "rc_visard_ng", "1440 x 1080", "720 x 540", "360 x 270", "240 x 180" + "rc_viscore", "4112 x 3008", "2056 x 1504", "1028 x 752", "686 x 502" + + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?quality= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_stereomatching/parameters?quality= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?quality= + +.. index:: + pair: double_shot; disparity image + +.. _expl-depth-double-shot: + +``double_shot`` (*Double-Shot*) +''''''''''''''''''''''''''''''' + Enabling this option will lead to denser disparity images, but will increase processing time. + + For scenes recorded with a projector in ``Single + Out1`` acquisition + mode, or in continuous acquisition mode with the projector in ``ExposureAlternateActive`` mode, + holes caused by reflections of the projector are filled with depth information computed from + the images without projector pattern. In this case, the ``double_shot`` parameter must only be + enabled if the scene does not change during the acquisition of the images. + + For all other scenes, holes are filled with depth information computed from a downscaled version of the same image. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?double_shot= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_stereomatching/parameters?double_shot= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?double_shot= + +.. index:: + pair: static_scene; disparity image + +.. _expl-depth-static: + +``static_scene`` (*Static*) +''''''''''''''''''''''''''' + This option averages 8 consecutive camera images before matching. This reduces + noise, which improves the stereo matching result. However, the latency increases significantly. + The timestamp of the first + image is taken as timestamp of the disparity image. This option only affects + matching in full or high quality. It must only be enabled if the scene does not + change during the acquisition of the 8 images. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?static_scene= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_stereomatching/parameters?static_scene= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?static_scene= + +.. _expl-depth-min-depth: + +.. index:: + single: minimum distance + +``mindepth`` (*Minimum Distance*) +''''''''''''''''''''''''''''''''' + The minimum distance is the smallest distance from the camera + at which measurements should be possible. Larger values implicitly reduce the + disparity range, which also reduces the computation time. The minimum distance + is given in meters. + + Depending on the capabilities of the sensor, the actual minimum distance + can be higher than the user setting. The actual minimum distance will be + reported in the status values. + + .. only:: rc_visard or rc_visard_ng + + In ``quality`` mode ``Full``, the actual minimum distance can also be higher + than the user-defined minimum distance due to memory limitations. In this + case, lowering the maximum distance helps to reduce the actual minimum distance. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?mindepth= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_stereomatching/parameters?mindepth= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?mindepth= + +.. _expl-depth-max-depth: + +.. index:: + single: maximum distance + +``maxdepth`` (*Maximum Distance*) +''''''''''''''''''''''''''''''''' + The maximum distance is the largest distance from the camera + at which measurements should be possible. Pixels with larger distance values are + set to invalid in the disparity image. Setting this value to its maximum permits + values up to infinity. The maximum distance is given in meters. + + + .. only:: rc_visard or rc_visard_ng + + In ``quality`` mode ``Full``, the actual minimum distance can be higher + than the user-defined minimum distance due to memory limitations. In this + case, lowering the maximum distance helps to reduce the actual minimum distance. + + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?maxdepth= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_stereomatching/parameters?maxdepth= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?maxdepth= + +.. _expl-depth-smooth: + +.. index:: + pair: smooth; disparity image + +``smooth`` (*Smoothing*) +'''''''''''''''''''''''' + This option activates advanced smoothing of disparity values. It is only + available with a valid StereoPlus license. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?smooth= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_stereomatching/parameters?smooth= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?smooth= + +.. _expl-depth-fill: + +.. index:: + single: fill-in + +``fill`` (*Fill-in*) +'''''''''''''''''''' + This option is used to fill holes in the disparity image by interpolation. + The fill-in value is the maximum allowed disparity step on the border of the + hole. Larger fill-in values can decrease the number of holes, but the interpolated + values can have larger errors. At most 5% of pixels are interpolated. Interpolation + of small holes is preferred over interpolation of larger holes. The confidence for + the interpolated pixels is set to a low value of 0.5. A fill-in value of 0 + switches hole filling off. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?fill= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_stereomatching/parameters?fill= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?fill= + +.. _expl-depth-seg: + +.. index:: + single: segmentation + +``seg`` (*Segmentation*) +'''''''''''''''''''''''' + The segmentation parameter is used to set the minimum number of + pixels that a connected disparity region in the disparity image must fill. + Isolated regions that are smaller are set to invalid in the disparity image. + The value is related to the high quality disparity image with half resolution + and does not have to be scaled when a different quality + is chosen. Segmentation is useful for removing erroneous disparities. However, + larger values may also remove real objects. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?seg= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_stereomatching/parameters?seg= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?seg= + +.. _expl-depth-min-conf: + +.. index:: + single: minimum confidence + pair: confidence; minimum + +``minconf`` (*Minimum Confidence*) +'''''''''''''''''''''''''''''''''' + The minimum confidence can be set to filter potentially false disparity measurements. + All pixels with less confidence than the chosen value are set to invalid + in the disparity image. + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?minconf= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_stereomatching/parameters?minconf= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?minconf= + +.. _expl-depth-max-depth-err: + +.. index:: + single: maximum depth error + pair: depth error; maximum + +``maxdeptherr`` (*Maximum Depth Error*) +''''''''''''''''''''''''''''''''''''''' + The maximum depth error is used to filter measurements + that are too inaccurate. All pixels with a larger depth error than the chosen + value are set to invalid in the disparity image. The maximum + depth error is given in meters. The depth error generally grows quadratically + with an object's distance from the camera (see :ref:`sect-confidence-error`:latex:`, Section \ref{stereo_matching:sect-confidence-error}`). + + Via the |restapi|, this parameter can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?maxdeptherr= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_stereomatching/parameters?maxdeptherr= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?maxdeptherr= + +The same parameters are also available over the GenICam interface with slightly different names and partly with different data types +(see :ref:`sect-genicam`:latex:`, Section \ref{gigevision:sect-genicam}`). + +Status values +------------- + +This module reports the following status values: + +.. tabularcolumns:: |l|L| +.. csv-table:: The ``rc_stereomatching`` module's status values + :header: Name, Description + + "``fps``","Actual frame rate of the disparity, error, and confidence images. This value is shown in the |webgui| below the image preview as *FPS (Hz)*." + "``latency``","Time in seconds between image acquisition and publishing of disparity image" + "``width``","Current width of the disparity, error, and confidence images in pixels" + "``height``","Current height of the disparity, error, and confidence images in pixels" + "``mindepth``","Actual minimum working distance in meters" + "``maxdepth``","Actual maximum working distance in meters" + "``time_matching``","Time in seconds for performing stereo matching using |sgm-short| on the GPU" + "``time_postprocessing``","Time in seconds for postprocessing the matching result on the CPU" + "``reduced_depth_range``","Indicates whether the depth range is reduced due to computation resources" + +.. _sect-stereo-matching-services: + +Services +-------- + +The stereo matching module offers the following services. + +``acquisition_trigger`` +^^^^^^^^^^^^^^^^^^^^^^^ + + Signals the module to perform stereo matching of the next available + images, if the parameter ``acquisition_mode`` is set to ``SingleFrame`` or + ``SingleFrameOut1``. + + .. toggle-header:: + :header: **Details** + + An error is returned if the ``acquisition_mode`` is set to ``Continuous``. + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/services/acquisition_trigger + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_stereomatching/services/acquisition_trigger + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_stereomatching/services/acquisition_trigger + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_stereomatching_acquisition_trigger_request.txt + + .. tab:: **Response** + + Possible return codes are shown below. + + .. tabularcolumns:: |c|L| + .. _tab-stereo-acquisition-trigger-return-codes: + .. csv-table:: Possible return codes of the ``acquisition_trigger`` service call. + :header: Code, Description + + "0", "Success" + "-8", "Triggering is only possible in SingleFrame acquisition mode" + "101", "Trigger is ignored, because there is a trigger call pending" + "102", "Trigger is ignored, because there are no subscribers" + + .. include:: _gen/nodes/services/rc_stereomatching_acquisition_trigger_response.txt + + +``measure_depth`` +^^^^^^^^^^^^^^^^^ + + Computes the average, minimum and maximum depth in a given region of interest, which can optionally be subdivided into cells. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/services/measure_depth + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_stereomatching/services/measure_depth + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_stereomatching/services/measure_depth + + .. tabs:: + + .. tab:: **Request** + + Optional arguments: + + ``region_of_interest_2d_id`` is the ID of the 2D region of interest (see :ref:`sect-roi`:latex:`, Section \ref{roi:sect-roi}`) + that will be used for the depth measurements. + + ``region_of_interest_2d`` is an alternative on-the-fly definition of the region of interest for the depth measurements. + This region of interest will be ignored if a ``region_of_interest_2d_id`` is given. The region of interest is always defined + on the camera image with full resolution, where ``offset_x`` and ``offset_y`` are the pixel coordinates of the upper left corner + of the rectangular region of interest, and ``width`` and ``height`` are the width and height of it in pixels. + Default is a region of interest covering the whole image. + + ``cell_count`` is the number of cells in x and y direction into which the region of interest is divided. + If not given, a cell count of 0, 0 is assumed and only the overall values will be computed. The total cell count + computed as product of the x and y values must not exceed 100. + + ``data_acquisition_mode``: if set to ``CAPTURE_NEW`` (default), a new image dataset will be used for the measurement. + If set to ``USE_LAST``, the previous dataset will be used for the measurement. + + ``pose_frame`` controls whether the coordinates of the depth measurement are + returned in the ``camera`` or ``external`` frame, if a hand-eye calibration is available (see + :ref:`sect-handeye-calibration`:latex:`, Section \ref{handeye_calibration:sect-handeye-calibration}`). + The default is ``camera``. + + + Potentially required arguments: + + ``robot_pose`` is the pose of the robot at the time of the depth measurement. It is required when the external + pose frame is used and the camera is robot mounted. + + + .. include:: _gen/nodes/services/rc_stereomatching_measure_depth_request.txt + + .. tab:: **Response** + + .. tabularcolumns:: |c|L| + .. csv-table:: ``return_code`` values of the ``measure_depth`` service call + :header: "``value``", "Description" + + "0", "measurement successful" + "-1", "an invalid argument was given" + + ``cells`` contains the depth measurements of all requested cells. The cells are always ordered from left to right and top + to bottom in image coordinates. + + ``overall`` contains the depth measurements of the full region of interest. + + ``coverage`` is a number between 0 and 1 which reflects the fraction of valid depth measurements inside the respective cell. + A coverage of 0 means that the cell is invalid. + + ``min_z`` and ``max_z`` return the 3D coordinate of the point in the cell with the minimum and maximum depth value, respectively. + The depth value is the z coordinate in the camera coordinate system. + + For ``mean_z``, the x and y coordinates define the point in the middle of the cell and the z coordinate is determined by the + average of all depth value measurements in the cell. + + ``region_of_interest_2d`` returns the definition of the requested region of interest for the depth measurement. + + If ``pose_frame`` is ``external``, then the x, y and z coordinates are returned in the robot coordinate system. + + .. include:: _gen/nodes/services/rc_stereomatching_measure_depth_response.txt + +``reset_defaults`` +^^^^^^^^^^^^^^^^^^ + + Restores and applies the default values for this module's parameters + ("factory reset"). + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/services/reset_defaults + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_stereomatching/services/reset_defaults + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes/rc_stereomatching/services/reset_defaults + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_stereomatching_reset_defaults_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_stereomatching_reset_defaults_response.txt + diff --git a/v24.04/en/_raw_sources/tagdetect.rst.txt b/v24.04/en/_raw_sources/tagdetect.rst.txt new file mode 100644 index 0000000..6fac6d2 --- /dev/null +++ b/v24.04/en/_raw_sources/tagdetect.rst.txt @@ -0,0 +1,988 @@ +.. include:: global_rst.glb + +.. _sect-tag-detection: + +TagDetect +========= + +.. index:: ! tag detection + single: detection; tag + +Introduction +------------ + +The TagDetect modules are optional on-board modules of the |rc_xxx| and require +separate :ref:`licenses` +:latex:`(Section \ref{maintenance:sect-updating-license})` to be purchased. The licenses +are included in every |rc_xxx| purchased after 01.07.2020. + +The TagDetect modules run on board the |rc_xxx| and allow the detection of 2D matrix codes and tags. +Currently, there are TagDetect modules for `QR codes` and `AprilTags`. +The modules, furthermore, compute the position and orientation of each tag +in the 3D camera coordinate system, making it simple to manipulate a tag +with a robot or to localize the camera with respect to a tag. + +.. only:: rc_cube and (roboception or schunk or basler) + + .. note:: These modules are not available in ``blaze`` camera pipelines. + +.. only:: rc_cube + + .. note:: + + These modules are pipeline specific. Changes to their settings or parameters only affect + the respective camera pipeline and have no influence on other pipelines running on the |rc_cube|. + +Tag detection is made up of three steps: + +1. Tag reading on the 2D image pair (see :ref:`sect-tag-reading`:latex:`, Section \ref{tagdetect:sect-tag-reading}`). +2. Estimation of the pose of each tag (see :ref:`sect-tag-pose-estimation`:latex:`, Section \ref{tagdetect:sect-tag-pose-estimation}`). +3. Re-identification of previously seen tags (see :ref:`sect-tag-re-identification`:latex:`, Section \ref{tagdetect:sect-tag-re-identification}`). + +In the following, the two supported tag types are described, followed +by a comparison. + +QR code +^^^^^^^ + +.. index:: ! QR code + +.. figure:: images/example_qr_code.png + :width: 200 px + :align: center + + Sample QR code + +QR codes are two-dimensional matrix codes that contain arbitrary user-defined data. +There is wide support for decoding of QR codes on commodity hardware +such as smartphones. +Also, many online and offline tools are available for the generation of such codes. + +The "pixels" of a QR code are called `modules`. +Appearance and resolution of QR codes change with the amount +of data they contain. +While the special patterns in the three corners are always 7 modules +wide, the number of modules between them increases the +more data is stored. +The lowest-resolution QR code is of size 21x21 modules and can contain +up to 152 bits. + +Even though many QR code generation tools support generation of +specially designed QR codes (e.g., containing a logo, having round +corners, or having dots as modules), a reliable detection of these tags by +the |rc_xxx|'s TagDetect module is not guaranteed. +The same holds for QR codes which contain characters that are not part +of regular ASCII. + +.. _sect-apriltag: + +AprilTag +^^^^^^^^ + +.. index:: ! AprilTag + single: tag detection; families + +.. _fig-april-tag-example: +.. figure:: images/apriltag_dim_vis.png + :width: 100% + :align: center + + A 16h5 tag (left), a 36h11 tag (center) and a 41h12 tag (right). + AprilTags consist of a mandatory white (a) and black (b) border and + a variable amount of data bits (c). + +AprilTags are similar to QR codes. +However, they are specifically designed for robust identification at +large distances. +As for QR codes, we will call the tag pixels `modules`. +:numref:`fig-april-tag-example` shows how AprilTags are structured. +They have a mandatory white and black border, each one module +wide. The tag families 16h5, 25h9, 36h10 and 36h11 are surrounded by +this border and carry a variable amount of data modules in the center. +For tag family 41h12, the black and white border is shifted towards +the inside and the data modules are in the center and also at the border of the tags. +Other than QR codes, AprilTags do not contain any user-defined information but +are identified by a predefined *family* and *ID*. +The tags in +:numref:`fig-april-tag-example` +for example are of family 16h5, 36h11 and 41h12 have id 0, 11 and 0, respectively. +All supported families are shown in +:numref:`tab-tag-families`. + +.. tabularcolumns:: |l|l|l| + +.. _tab-tag-families: + +.. table:: AprilTag families + + ====== ================= =========== + Family Number of tag IDs Recommended + ====== ================= =========== + 16h5 30 \- + 25h9 35 o + 36h10 2320 o + 36h11 587 \+ + 41h12 2115 \+ + ====== ================= =========== + +For each family, the number before the "h" states the number of data +modules contained in the tag: +While a 16h5 tag contains 16 (4x4) data modules +((c) in :numref:`fig-april-tag-example`), +a 36h11 tag contains 36 (6x6) modules and a 41h12 tag contains 41 (3x3 inner + 4x8 outer) modules. +The number behind the "h" refers to the Hamming distance between two tags of +the same family. +The higher, the more robust is the detection, but the fewer individual tag +IDs are available for the same number of data modules (see +:numref:`tab-tag-families`). + +The advantage of fewer modules (as for 16h5 compared to 36h11) is +the lower resolution of the tag. +Hence, each tag module is larger and the tag therefore can be detected +from a larger distance. +This, however, comes at a price: +Firstly, fewer data modules lead to fewer individual tag IDs. +Secondly, and more importantly, detection robustness is significantly +reduced due to a higher false positive rate; i.e, tags are mixed up +or nonexistent tags are detected in random image texture or noise. +The 41h12 family has its border shifted towards the inside, which gives +it more data modules at a lower number of total modules compared to the +36h11 family. + +For these reasons we recommend using the 41h12 and 36h11 families and highly +discourage the use of the 16h5 family. +The latter family should only be used if a large detection distance +really is necessary for an application. +However, the maximum detection distance increases only by approximately 25% +when using a 16h5 tag instead of a 36h11 tag. + +Pre-generated AprilTags can be downloaded at the +AprilTag project website (https://april.eecs.umich.edu/software/apriltag.html). +There, each family consists of multiple PNGs containing single +tags. +Each pixel in the PNGs corresponds to one AprilTag module. +When printing the tags of the families 36h11, 36h10, 25h9 and 16h5 special care must be taken to also include the +white border around the tag that is contained in the PNG (see (a) in :numref:`fig-april-tag-example`). +Moreover, all tags should be scaled to the desired printing size +without any interpolation, so that the sharp edges are preserved. + +Comparison +^^^^^^^^^^ + +Both QR codes and AprilTags have their up and down sides. +While QR codes allow arbitrary user-defined data to be stored, +AprilTags have a pre-defined and limited set of tags. +On the other hand, AprilTags have a lower resolution and can therefore +be detected at larger distances. +Moreover, the continuous white to black border in AprilTags allow for +more precise pose estimation. + +.. Note:: + + If user-defined data is not required, AprilTags should be preferred over QR codes. + +.. _sect-tag-reading: + +Tag reading +----------- + +The first step in the tag detection pipeline is reading the tags on the +2D image pair. +This step takes most of the processing time and its precision is crucial +for the precision of the resulting tag pose. +To control the speed of this step, the ``quality`` parameter +can be set by the user. +It results in a downscaling of the image pair before reading the tags. +``High`` yields the largest maximum detection distance and highest +precision, but also the highest processing time. +``Low`` results in the smallest maximum detection distance and +lowest precision, but processing requires less than half of the time. +``Medium`` lies in between. +Please note that this quality parameter has no relation to the quality +parameter of +:ref:`sect-stereo-matching`:latex:`\:(Section \ref{stereo_matching:sect-stereo-matching})`. + +.. _fig-tag-sizes: +.. figure:: images/tag_sizes_vis.png + :width: 100% + :align: center + + Visualization of module size :math:`s`, size of a tag in + modules :math:`r`, and size of a tag in meters :math:`t` + for AprilTags (left and center) and QR codes (right) + +The maximum detection distance :math:`z` at quality ``High`` can be +approximated by using the following formulae, + +.. math:: + z = \frac{f s}{p}, + +.. math:: + s = \frac{t}{r}, + +where :math:`f` is the +:ref:`focal length`:latex:`\:(Section \ref{stereo_camera:sect-stereo-camera-rectification})` +in pixels and :math:`s` is the size +of a module in meters. +:math:`s` can easily be calculated by the latter formula, where :math:`t` +is the size of the tag in meters and :math:`r` is the width of the +code in modules (for AprilTags without the white border). +:numref:`fig-tag-sizes` visualizes these variables. +:math:`p` denotes the number of image pixels per module required +for detection. +It is different for QR codes and AprilTags. +Moreover, it varies with the tag's angle to the camera and illumination. +Approximate values for robust detection are: + +* AprilTag: :math:`p=5` pixels/module +* QR code: :math:`p=6` pixels/module + +The following tables give sample maximum distances for +different situations, assuming a focal length of +1075 pixels and the parameter ``quality`` to be set to ``High``. + +.. tabularcolumns:: |l|l|l|l| + +.. _tab-tag-max-dist-april: + +.. table:: Maximum detection distance examples for AprilTags with a width + of :math:`t=4` cm + + =================== ================= ================ + AprilTag family Tag width Maximum distance + =================== ================= ================ + 36h11 (recommended) 8 modules 1.1 m + 16h5 6 modules 1.4 m + 41h12 (recommended) 5 modules 1.7 m + =================== ================= ================ + +.. tabularcolumns:: |l|l|l|l| + +.. _tab-tag-max-dist-qr: + +.. table:: Maximum detection distance examples for QR codes with a width + of :math:`t=8` cm + + ================= ================ + Tag width Maximum distance + ================= ================ + 29 modules 0.49 m + 21 modules 0.70 m + ================= ================ + +.. _sect-tag-pose-estimation: + +Pose estimation +--------------- + +.. index:: + single: tag detection; pose estimation + pair: AprilTag; pose estimation + pair: QR code; pose estimation + +For each detected tag, the pose of this tag in the camera coordinate +frame is estimated. +A requirement for pose estimation is that a tag is fully visible in +the left and right camera image. +The coordinate frame of the tag is aligned as shown below. + +.. _fig-tag-coord-frames: +.. figure:: images/tag_coord_frames.png + :width: 100% + :align: center + + Coordinate frames of AprilTags (left and center) and QR codes (right) + +The z-axis is pointing "into" the tag. +Please note that for AprilTags, although having the white border included +in their definition, the coordinate system's origin is placed exactly at the +transition from the white to the black border. +Since AprilTags do not have an obvious orientation, the origin is +defined as the upper left corner in the orientation they are pre-generated in. + +During pose estimation, the tag's size is also estimated, while +assuming the tag to be square. +For QR codes, the size covers the full tag. +For AprilTags, the size covers only the part inside the border defined by the +transition from the black to the white border modules, +hence ignoring the outermost white border for the tag families 16h5, 25h9, 36h10 and 36h11. + +The user can also specify the approximate size (:math:`\pm 10\%`) of tags. +All tags not matching this size constraint are automatically filtered out. +This information is further used to resolve ambiguities in pose estimation +that may arise if multiple tags with the same ID are visible in the left +and right image and these tags are aligned in parallel to the image rows. + + +.. Note:: + + For best pose estimation results one should make sure to accurately print + the tag and to attach it to a rigid and as planar as possible surface. + Any distortion of the tag or bump in the surface will degrade the + estimated pose. + +.. Note:: + + It is highly recommended to set the approximate size of a tag. + Otherwise, if multiple tags with the same ID are visible in the left or right + image, pose estimation may compute a wrong pose if these tags have the + same orientation and are approximately aligned in parallel to the image + rows. + However, even if the approximate size is not given, the TagDetect modules + try to detect such situations and filter out affected tags. + +Below tables give approximate precisions of the estimated poses of AprilTags. +We distinguish between lateral precision (i.e., in x and y direction) and +precision in z direction. +It is assumed that ``quality`` is set to ``High``, that the camera's +viewing direction is parallel to the tag's normal and that the images are well exposed +and do not suffer from motion blur. +The size of a tag does not have a significant effect on the lateral or z +precision; however, in general, larger tags improve precision. +With respect to precision of the orientation especially around the x and y +axes, larger tags clearly outperform smaller ones. + +.. only:: rc_visard or rc_cube + + .. tabularcolumns:: |l|l|l|l|l| + + .. _tab-tag-precision-april: + + .. table:: Approximate position precision for AprilTag detections with ``High`` quality in an ideal scenario for different base lines + + ======== ======================== ================== ========================= =================== + Distance |rc_visard| 65 - lateral |rc_visard| 65 - z |rc_visard| 160 - lateral |rc_visard| 160 - z + ======== ======================== ================== ========================= =================== + 0.5 m 0.05 mm 0.5 mm 0.05 mm 0.3 mm + 1.0 m 0.15 mm 1.8 mm 0.15 mm 1.4 mm + 2.0 m 1.5 mm 14.5 mm 0.5 mm 3.7 mm + ======== ======================== ================== ========================= =================== + +.. only:: rc_visard_ng + + .. tabularcolumns:: |l|l|l|l|l| + + .. _tab-tag-precision-april: + + .. table:: Approximate position precision for AprilTag detections with ``High`` quality in an ideal scenario + + ======== ========================= =================== + Distance |rc_xxx| 160 - lateral |rc_xxx| 160 - z + ======== ========================= =================== + 0.5 m 0.05 mm 0.3 mm + 1.0 m 0.15 mm 1.4 mm + 2.0 m 0.5 mm 3.7 mm + ======== ========================= =================== + + +.. tabularcolumns:: |l|l|l|l|l| + +.. _tab-tag-precision-rotation-april: + +.. table:: Approximate orientation precision for AprilTag detections with ``High`` quality in an ideal scenario for different tag sizes + + ======== ======================== ================== + Distance 60 x 60 mm 120 x 120 mm + ======== ======================== ================== + 0.5 m 0.2° -- + 1.0 m 0.8° 0.3° + 2.0 m 2.0° 0.8° + 3.0 m -- 1.8° + ======== ======================== ================== + +.. .. tabularcolumns:: |l|l|l|l|l| + +.. .. _tab-tag-precision-qr: + +.. .. table:: Approximate pose precision for QR codes + +.. ======== ======================== ================== ========================= =================== +.. Distance |rc_visard| 65 - lateral |rc_visard| 65 - z |rc_visard| 160 - lateral |rc_visard| 160 - z +.. ======== ======================== ================== ========================= =================== +.. 0.3 m 0.6 mm 2.0 mm 0.6 mm 1.3 mm +.. 1.0 m 2.6 mm 15 mm 2.6 mm 7.9 mm +.. ======== ======================== ================== ========================= =================== + +.. _sect-tag-re-identification: + +Tag re-identification +--------------------- + +.. index:: + single: tag detection; re-identification + pair: AprilTag; re-identification + pair: QR code; re-identification + +Each tag has an ID; for AprilTags it is the *family* plus *tag ID*, for +QR codes it is the contained data. +However, these IDs are not unique, since the same tag may appear multiple times +in a scene. + +For distinction of these tags, the TagDetect modules also assign +each detected tag a unique identifier. +To help the user identifying an identical tag over multiple detections, +tag detection tries to re-identify tags; +if successful, a tag is assigned the same unique identifier again. + +.. only:: rc_visard + + Tag re-identification compares the positions of the + corners of the tags in a static coordinate frame to find identical tags. + Tags are assumed identical if they did not or only slightly move in + that static coordinate frame. + For that static coordinate frame to be available, :ref:`dynamic-state estimation`:latex:`\:(Section \ref{dynamics:sect-dynamics})` + must be switched on. + If it is not, the sensor is assumed to be static; tag re-identification + will then not work across sensor movements. + +.. only:: rc_cube or rc_visard_ng + + Tag re-identification compares the positions of the + corners of the tags in the camera coordinate frame to find identical tags. + Tags are assumed identical if they did not or only slightly move in + that frame. + +By setting the ``max_corner_distance`` +threshold, the user can specify how much a tag is allowed move in the static +coordinate frame between two detections to be considered identical. +This parameter defines the maximum distance between the corners of +two tags, which is shown in +:numref:`fig-tag-re-identification`. +The Euclidean distances of all four corresponding tag corners are computed in 3D. +If none of these distances exceeds the threshold, the tags are +considered identical. + +.. _fig-tag-re-identification: +.. figure:: images/tag-re-identification.png + :width: 70% + :align: center + + Simplified visualization of tag re-identification. + Euclidean distances between associated tag corners in 3D are compared + (red arrows). + +After a number of tag detection runs, previously detected tag instances +will be discarded if they are not detected in the meantime. +This can be configured by the parameter ``forget_after_n_detections``. + +.. _sect-tag-hand-eye-calib: + +Hand-eye calibration +-------------------- + +In case the camera has been calibrated to a robot, the TagDetect module +can automatically provide poses in the robot coordinate frame. +For the TagDetect node's :ref:`sect-tag-services`:latex:`\:(Section \ref{tagdetect:sect-tag-services})`, the frame of the +output poses can be controlled with the ``pose_frame`` argument. + +Two different ``pose_frame`` values can be chosen: + +1. **Camera frame** (``camera``). + All poses provided by the module are in the camera frame. + +2. **External frame** (``external``). + All poses provided by the module are in the external frame, + configured by the user during the hand-eye calibration process. + The module relies on the on-board + :doc:`Hand-eye calibration module`:latex:`\:(Section \ref{handeye_calibration:sect-handeye-calibration})` + to retrieve the sensor mounting (static or robot mounted) and + the hand-eye transformation. + If the sensor mounting is static, no further information is needed. + If the sensor is robot-mounted, the ``robot_pose`` is required + to transform poses to and from the ``external`` frame. + +All ``pose_frame`` values that are not ``camera`` or ``external`` are rejected. + +.. _sect-tag-parameters: + +Parameters +---------- + +There are two separate modules available for tag detection, +one for detecting AprilTags and one for QR codes, named +``rc_april_tag_detect`` and ``rc_qr_code_detect``, respectively. +Apart from the module names they share the same interface definition. + +In addition to the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`, the TagDetect modules provide pages +on the |webgui| :cubeonly:`in the desired pipeline` under +:menuselection:`Modules --> AprilTag` and :menuselection:`Modules --> QR Code`, +on which they can be tried out and configured manually. + +In the following, the parameters are listed based on the +example of ``rc_qr_code_detect``. They are the same for +``rc_april_tag_detect``. + +.. include:: _gen/nodes/params/rc_qr_code_detect.txt + +Via the |restapi|, these parameters can be set as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes//parameters/parameters?= + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//parameters?= + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//parameters?= + +.. _sect-tag-status-values: + +Status values +------------- + +The TagDetect modules reports the following status values: + +.. tabularcolumns:: |l|L| +.. csv-table:: The ``rc_qr_code_detect`` and ``rc_april_tag_detect`` module's status values + :header: Name, Description + + "``data_acquisition_time``","Time in seconds required to acquire image pair" + "``last_timestamp_processed``","The timestamp of the last processed image pair" + "``processing_time``","Processing time of the last detection in seconds" + "``state``","The current state of the node" + +The reported ``state`` can take one of the following values. + +.. tabularcolumns:: |l|l| +.. _tab-rc-tag-detection-states: +.. csv-table:: Possible states of the TagDetect modules + :header: State name, Description + + "IDLE", "The module is idle." + "RUNNING", "The module is running and ready for tag detection." + "FATAL", "A fatal error has occurred." + +.. _sect-tag-services: + +Services +-------- + +.. index:: + pair: tag detection; services + pair: AprilTag; services + pair: QR code; services + +The TagDetect modules implement a state machine for starting and stopping. +The actual tag detection can be triggered via ``detect``. + +The user can explore and call the ``rc_qr_code_detect`` and ``rc_april_tag_detect`` modules' services, +e.g. for development and testing, using the +:doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})` or +the |rc_xxx| +:ref:`sect-web-gui`:latex:`\:(Section \ref{webgui:sect-web-gui})`. + +.. _expl-tag-srv-detect: + +``detect`` +^^^^^^^^^^ + + Triggers a tag detection. + + .. toggle-header:: + :header: **Details** + + Depending on the ``use_cached_images`` parameter, the module will use + the latest received image pair (if set to true) or wait for a new pair + that is captured after the service call was triggered (if set to false, + this is the default). + Even if set to true, tag detection will never use one image pair twice. + + It is recommended to call ``detect`` in state ``RUNNING`` only. + It is also possible to be called in state ``IDLE``, resulting in an + auto-start and stop of the module. + This, however, has some drawbacks: + First, the call will take considerably longer; + second, tag re-identification will not work. + It is therefore highly recommended to manually start the module + before calling ``detect``. + + Tags might be omitted from the ``detect`` response due to several + reasons, e.g., if a tag is visible in only one of the cameras or if + pose estimation did not succeed. + These filtered-out tags are noted in the log, which can be accessed as + described in + :ref:`sect-downloading-log-files`:latex:`\:(Section \ref{maintenance:sect-downloading-log-files})`. + + A visualization of the latest detection is shown on the |webgui| tabs + of the TagDetect modules. Please note that this visualization + will only be shown after calling the detection service at least once. + On the |webgui|, one can also manually try the detection by clicking the + :guilabel:`Detect` button. + + Due to changes in system time on the |rc_xxx| there might occur jumps + of timestamps, forward as well as backward (see :ref:`sect-time-sync`:latex:`, Section \ref{time_sync:sect-time-sync}`). + Forward jumps do not have an effect on the TagDetect module. + Backward jumps, however, invalidate already received images. + Therefore, in case a backwards time jump is detected, an error of + value -102 will be issued on the next ``detect`` call, also to inform + the user that the timestamps included in the response will jump back. + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes//services/detect + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//services/detect + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//services/detect + + .. tabs:: + + .. tab:: **Request** + + Optional arguments: + + ``tags`` is the list of tag IDs that the TagDetect module should detect. + For QR codes, the ID is the contained data. + For AprilTags, it is `"_"`, so, e.g., for a tag of + family 36h11 and ID 5, it is `"36h11_5"`. + Naturally, the AprilTag module can only be triggered for AprilTags, and + the QR code module only for QR codes. + + The ``tags`` list can also be left empty. + In that case, all detected tags will be returned. + This feature should be used only during development and debugging + of an application. + Whenever possible, the concrete tag IDs should be listed, on the one + hand avoiding some false positives, on the other hand speeding up tag + detection by filtering tags not of interest. + + For AprilTags, the user can not only specify concrete tags but also + a complete family by setting the ID to "", so, e.g., "36h11". + All tags of this family will then be detected. It is further possible + to specify multiple complete tag families or a combination of + concrete tags and complete tag families; for instance, triggering for + "36h11", "25h9_3", and "36h10" at the same time. + + In addition to the ID, the approximate size (:math:`\pm 10\%`) of a tag + can be set with the ``size`` parameter. + As described in + :ref:`sect-tag-pose-estimation`:latex:`\:(Section \ref{tagdetect:sect-tag-pose-estimation})`, + this information helps to resolve ambiguities in pose estimation that may + arise in certain situations and can be used to filter out tags not fulfilling + the given size constraint. + + The ``tags`` list is OR-connected. All tags will be returned that + match any of ``id``-``size`` pair elements in the ``tags`` list. + + ``pose_frame`` controls whether the poses of the detected tags are + returned in the camera or external frame, + as detailed in + :ref:`sect-tag-hand-eye-calib`:latex:`\:(Section \ref{tagdetect:sect-tag-hand-eye-calib})`. + The default is ``camera``. + + .. include:: _gen/nodes/services/rc_qr_code_detect_detect_request.txt + + .. tab:: **Response** + + ``timestamp`` is set to the timestamp of the image pair the tag + detection ran on. + + ``tags`` contains all detected tags. + + ``id`` is the ID of the tag, similar to ``id`` in the request. + + ``instance_id`` is the random unique identifier of the tag + assigned by tag re-identification. + + ``pose`` contains ``position`` and ``orientation``. + The orientation is in quaternion format. + + ``pose_frame`` is set to the coordinate frame above pose refers to. + It will either be "camera" or "external". + + ``size`` will be set to the estimated tag size in meters. + + ``return_code`` holds possible warnings or error codes. + + .. include:: _gen/nodes/services/rc_qr_code_detect_detect_response.txt + +.. _expl-tag-srv-start: + +``start`` +^^^^^^^^^ + + Starts the module by transitioning from ``IDLE`` to ``RUNNING``. + + .. toggle-header:: + :header: **Details** + + When running, the module receives images from the stereo camera and is + ready to perform tag detections. + To save computing resources, the + module should only be running when necessary. + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes//services/start + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//services/start + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//services/start + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_qr_code_detect_start_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_qr_code_detect_start_response.txt + +.. _expl-tag-srv-stop: + +``stop`` +^^^^^^^^ + + Stops the module by transitioning to ``IDLE``. + + .. toggle-header:: + :header: **Details** + + This transition can be performed from state ``RUNNING`` and ``FATAL``. + All tag re-identification information is cleared during stopping. + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes//services/stop + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//services/stop + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//services/stop + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_qr_code_detect_stop_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_qr_code_detect_stop_response.txt + +.. _expl-tag-srv-restart: + +``restart`` +^^^^^^^^^^^ + + Restarts the module. + + .. toggle-header:: + :header: **Details** + + If in ``RUNNING`` or ``FATAL``, the module will be stopped and then started. + If in ``IDLE``, the module will be started. + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes//services/restart + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//services/restart + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//services/restart + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_qr_code_detect_restart_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_qr_code_detect_restart_response.txt + +.. only:: rc_cube + + + ``trigger_dump`` + ^^^^^^^^^^^^^^^^ + Triggers dumping of the detection that corresponds to the given timestamp, + or the latest detection, if no timestamp is given. The dumps are saved to the + connected USB drive. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//services/trigger_dump + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//services/trigger_dump + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_april_tag_detect_trigger_dump_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_april_tag_detect_trigger_dump_response.txt + +.. _expl-tag-srv-reset-params: + +``reset_defaults`` +^^^^^^^^^^^^^^^^^^ + + Resets all parameters of the module to its default values, + as listed in above table. + + .. toggle-header:: + :header: **Details** + + This service can be called as follows. + + .. tabs:: + + .. tab:: **API version 2** + + .. only:: rc_visard or rc_visard_ng + + .. code-block:: bash + + PUT http:///api/v2/pipelines/0/nodes//services/reset_defaults + + .. only:: rc_cube + + .. code-block:: bash + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes//services/reset_defaults + + .. tab:: **API version 1 (deprecated)** + + .. code-block:: bash + + PUT http:///api/v1/nodes//services/reset_defaults + + .. tabs:: + + .. tab:: **Request** + + .. include:: _gen/nodes/services/rc_qr_code_detect_reset_defaults_request.txt + + .. tab:: **Response** + + .. include:: _gen/nodes/services/rc_qr_code_detect_reset_defaults_response.txt + + +.. _sect-tag-return-codes: + +Return codes +------------ + +.. index:: + pair: AprilTag; return codes + pair: QR Code; return codes + + +Each service response contains a ``return_code``, +which consists of a ``value`` plus an optional ``message``. +A successful service returns with a ``return_code`` value of ``0``. +Negative ``return_code`` values indicate that the service failed. +Positive ``return_code`` values indicate that the service succeeded with additional information. +The smaller value is selected in case a service has multiple ``return_code`` values, +but all messages are appended in the ``return_code`` message. + +The following table contains a list of common return codes: + + ==== =========== + Code Description + ==== =========== + 0 Success + -1 An invalid argument was provided + -4 A timeout occurred while waiting for the image pair + -9 The license is not valid + -11 Sensor not connected, not supported or not ready + -101 Internal error during tag detection + -102 There was a backwards jump of system time + -103 Internal error during tag pose estimation + -200 A fatal internal error occurred + 200 Multiple warnings occurred; see list in ``message`` + 201 The module was not in state ``RUNNING`` + ==== =========== diff --git a/v24.04/en/_raw_sources/time_sync.rst.txt b/v24.04/en/_raw_sources/time_sync.rst.txt new file mode 100644 index 0000000..93f9bd5 --- /dev/null +++ b/v24.04/en/_raw_sources/time_sync.rst.txt @@ -0,0 +1,93 @@ +.. include:: global_rst.glb + +.. _sect-time-sync: + +Time synchronization +==================== + +.. index:: + pair: time; synchronization + +The |rc_xxx| provides timestamps with all images and messages. +To compare these with the time on the application host, the time needs to be properly synchronized. + +.. only:: rc_visard or rc_visard_ng + + This can be done either via the Network Time Protocol (NTP), which is the default, or the Precision Time + Protocol (PTP). + + .. only:: rc_visard + + .. Note:: The |rc_visard| does not have a backup battery for its real time clock and hence does not retain time across power cycles. + The system time starts at the last saved time (saved on reboot and every 15 minutes) at power up and is then automatically set via + NTP if a server can be found. + +.. only:: rc_cube + + The time synchronization between the |rc_xxx| and the application host can be done via the + Network Time Protocol (NTP), which is activated by default. + + Internal time synchronization between the |rc_xxx| and the connected camera is automatically done via + the Precision Time Protocol (PTP). + +The current system time as well as time synchronization status can be queried via +:doc:`REST-API`:latex:`\:(Section \ref{rest_api:sect-rest-api})` and seen on the +:ref:`Web GUI`'s :latex:`(Section \ref{webgui:sect-web-gui})` *System* page. + +.. Note:: Depending on the reachability of NTP servers or PTP masters it might take up to several minutes until the time is synchronized. + +.. _sect-ntp: + +NTP +--- + +.. index:: + pair: NTP; synchronization + +The Network Time Protocol (NTP) is a TCP/IP protocol for synchronizing time over a network. +A client periodically requests the current time from a server, and uses it to set and correct +its own clock. + +By default the |rc_xxx| tries to reach NTP servers from the NTP Pool Project, +which will work if the |rc_xxx| has access to the internet. + +If the |rc_xxx| is configured for :ref:`DHCP`:latex:`\ (Section \ref{installation:sect-auto-network-configuration})` +(which is the default setting), it will also request NTP servers from the DHCP server and try to +use those. + +.. _sect-ptp: + +PTP +--- + +.. index:: + pair: PTP; synchronization + +The Precision Time Protocol (PTP, also known as IEEE1588) is a protocol which offers more precise and robust clock synchronization than with NTP. + +.. only:: rc_visard or rc_visard_ng + + The |rc_visard| can be configured to act as a PTP slave via the standard :doc:`GigE Vision 2.0/GenICam interface`:latex:`\:(Section \ref{gigevision:sect-genicam})` using the ``GevIEEE1588`` parameter. + + At least one PTP master providing time has to be running in the network. + On Linux the respective command for starting a PTP master on ethernet port ``eth0`` is, e.g., ``sudo ptpd --masteronly --foreground -i eth0``. + + While the |rc_visard| is synchronized with a PTP master (|rc_visard| in PTP status SLAVE), the NTP synchronization is paused. + +.. only:: rc_cube + + .. Note:: Currently, time synchronization between the application host and the |rc_xxx| is not implemented. + Please use NTP instead. + +.. _sect-ptp: + +Setting time manually +--------------------- + +.. index:: + pair: time; set + +The |rc_xxx| allows to set the current date and time manually using the |restapi|'s **/system/time** endpoint, +if no time synchronization is active (see :doc:`rest_api_syslogs`:latex:`, Section \ref{rest_api_syslogs:sect-rest-api-syslogs}`). +A more convenient way is setting the system time on the :ref:`Web GUI`'s :latex:`(Section \ref{webgui:sect-web-gui})` *System* page. + diff --git a/v24.04/en/_raw_sources/troubleshooting.rst.txt b/v24.04/en/_raw_sources/troubleshooting.rst.txt new file mode 100644 index 0000000..4f40246 --- /dev/null +++ b/v24.04/en/_raw_sources/troubleshooting.rst.txt @@ -0,0 +1,343 @@ +.. include:: global_rst.glb + + +.. _sect-troubleshooting: + +Troubleshooting +=============== + + +.. only:: rc_visard or rc_visard_ng + + .. _sect-led-colors: + + LED colors + ---------- + + .. index:: + single: LED; colors + + During the boot process, the LED will change color several times to indicate stages in the boot process: + + .. only:: rc_visard + + .. _tab-led-color: + + .. table:: LED color codes + + +----------+----------------------------------+ + |LED color | Boot stage | + +==========+==================================+ + | white | power supply OK | + +----------+----------------------------------+ + | yellow | | + +----------+ + + | purple | normal boot process in progress | + +----------+ + + | blue | | + +----------+----------------------------------+ + | green | boot complete, |rc_xxx| ready | + +----------+----------------------------------+ + + The LED will signal some warning or error states to support the user during troubleshooting. + + .. _tab-led-error: + + .. table:: LED color trouble codes + + ============================================== =================================================== + LED color Warning or error state + ============================================== =================================================== + off no power to the sensor + brief red flash every 5 seconds no network connectivity + red while sensor appears to function normally high-temperature warning (case has exceeded 60 °C) + red while case is below 60 °C Some process has terminated and failed to restart. + ============================================== =================================================== + + .. only:: rc_visard_ng + + .. _tab-led-color: + + .. table:: LED color codes + + +----------+----------------------------------+ + |LED color | Boot stage | + +==========+==================================+ + | white | power supply OK | + +----------+----------------------------------+ + | blue | normal boot process in progress | + +----------+----------------------------------+ + | green | boot complete, |rc_xxx| ready | + +----------+----------------------------------+ + + + The LED will signal some warning or error states to support the user during troubleshooting. + + .. _tab-led-error: + + .. table:: LED color trouble codes + + ============================================== =================================================== + LED color Warning or error state + ============================================== =================================================== + off no power to the sensor + brief red flash every 5 seconds no network connectivity + red Some process has terminated and failed to restart. + yellow high-temperature warning (case has exceeded 60 °C) + ============================================== =================================================== + + Hardware issues + --------------- + + **LED does not illuminate** + + The |rc_xxx| does not start up. + + - Ensure that cables are connected and secured properly. + - Ensure that adequate DC voltage (18 V to 30 V) with correct polarity is applied to the + power connector at the pins labeled as **Power** and **Ground** as described in + the device's :ref:`pin assignment specification`:latex:`\:(Section \ref{hardware_spec:tab-power-pin-assignments})`. + Connecting the sensor to voltage outside of the specified range, to alternating current, + with reversed polarity, or to a supply with voltage spikes will lead to permanent hardware damage. + + .. only:: rc_visard + + **LED turns red while the sensor appears to function normally** + + .. only:: rc_visard_ng + + **LED turns yellow while the sensor appears to function normally** + + This may indicate a high housing temperature. The sensor might be mounted in a position that + obstructs free airflow around the cooling fins. + + - Clean cooling fins and housing. + - Ensure a minimum of 10 cm free space in all directions around cooling fins to provide adequate convective cooling. + - Ensure that ambient temperature is within specified range. + + The sensor may slow down processing when cooling is insufficient or the ambient temperature exceeds the specified range. + + **Reliability issues and/or mechanical damage** + + This may be an indication of ambient conditions (vibration, shock, resonance, and temperature) being outside + of specified range. Please refer to the :ref:`specification of environmental conditions`:latex:`\ (Section \ref{hardware_spec:tab-hardware-environment})`. + + - Operating the |rc_xxx| outside of specified ambient conditions might lead to damage and will void the warranty. + + **Electrical shock when touching the sensor** + + This indicates an electrical fault in sensor, cabling, or power supply or adjacent system. + + - Immediately turn off power to the system, disconnect cables, and have a qualified electrician check the setup. + - Ensure that the sensor housing is properly grounded; check for large ground loops. + + + Connectivity issues + ------------------- + + **LED briefly flashes red every 5 seconds** + + If the LED briefly flashes red every 5 seconds, then the |rc_xxx| is not able to detect a network + link. + + - Check that the network cable is properly connected to the |rc_xxx| and the network. + - If no problem is visible, then replace the Ethernet cable. + + **A GigE Vision client or rcdiscover-gui cannot detect the camera** + + - Check whether the |rc_xxx|'s LED flashes briefly every 5 seconds (check the cable if it does). + - Ensure that the |rc_xxx| is connected to the same subnet (the discovery mechanism uses broadcasts that + will not work across different subnets). + + **The Web GUI is inaccessible** + + - Ensure that the |rc_xxx| is turned on and connected to the same subnet as the host computer. + - Check whether the |rc_xxx|'s LED flashes briefly every 5 seconds (check the cable if it does). + - Check whether ``rcdiscover-gui`` detects the sensor. If it reports the |rc_xxx| as unreachable, + then the |rc_xxx|'s + :ref:`network configuration`:latex:`\:(Section \ref{installation:sect-network-configuration})` is wrong. + - If the |rc_xxx| is reported as reachable, try double clicking the entry to open the |webgui| in a browser. + - If this does not work, try entering the |rc_xxx|'s reported IP address directly in the browser + as target address. + + **Too many Web GUIs are open at the same time** + + The |webgui| consumes the |rc_xxx|'s processing resources to compress images to be transmitted + and for statistical output that is regularly polled by the browser. Leaving several instances of + the |webgui| open on the same or different computers can significantly diminish the |rc_xxx|'s + performance. The |webgui| is meant for configuration and validation, not to permanently monitor + the |rc_xxx|. + +.. _sect-camera-issues: + +Camera-image issues +------------------- + +**The camera image is too bright** + +- If the camera is in manual exposure mode, decrease the exposure time (see :ref:`sect-cam-params`:latex:`, Section \ref{stereo_camera:sect-cam-params}`), or +- switch to auto-exposure mode (see :ref:`sect-cam-params`:latex:`, Section \ref{stereo_camera:sect-cam-params}`). + +**The camera image is too dark** + +- If the camera is in manual exposure mode, increase the exposure time (see :ref:`sect-cam-params`:latex:`, Section \ref{stereo_camera:sect-cam-params}`), or +- switch to auto-exposure mode (see :ref:`sect-cam-params`:latex:`, Section \ref{stereo_camera:sect-cam-params}`). + +**The camera image is too noisy** + +Large gain factors cause high-amplitude image noise. To decrease the image noise, + +- use an additional light source to increase the scene's light intensity, or +- choose a greater maximal auto-exposure time (see :ref:`sect-cam-params`:latex:`, Section \ref{stereo_camera:sect-cam-params}`). + +**The camera image is out of focus** + +- Check whether the object is too close to the lens and increase the distance between the object and the lens if it is. +- Check whether the camera lenses are dirty and clean them if they are. +- If none of the above applies, a severe hardware problem might exist. + Please :ref:`contact support`:latex:`\:(Section \ref{contact:sect-contact})`. + +**The camera image is blurred** + +Fast motions in combination with long exposure times can cause blur. To reduce motion blur, + +- decrease the motion speed of the camera, +- decrease the motion speed of objects in the field of view of the camera, or +- decrease the exposure time of the camera (see :ref:`sect-cam-params`:latex:`, Section \ref{stereo_camera:sect-cam-params}`). + +.. only:: rc_visard or rc_visard_ng + + **The camera image is fuzzy** + + - Check whether the lenses are dirty and clean them if so (see :ref:`sect-lens-cleaning`:latex:`, Section \ref{maintenance:sect-lens-cleaning}`). + - If none of the above applies, a severe hardware problem might exist. + Please :ref:`contact support`:latex:`\:(Section \ref{contact:sect-contact})`. + +**The camera image frame rate is too low** + +- Increase the image frame rate as described in :ref:`sect-cam-params`:latex:`\:(Section \ref{stereo_camera:sect-cam-params})`. +- The maximal frame rate of the cameras is 25 Hz. + +.. _sect-disparity-issues: + +Depth/Disparity, error, and confidence image issues +--------------------------------------------------- +All these guidelines also apply to error and confidence images, because they correspond directly to the disparity image. + +**The disparity image is too sparse or empty** + +- Check whether the camera images are well exposed and sharp. Follow the instructions in + :ref:`sect-camera-issues`:latex:`\:(Section \ref{troubleshooting:sect-camera-issues})` if applicable. +- Check whether the scene has enough texture (see :ref:`sect-stereo-matching`:latex:`, Section + \ref{stereo_matching:sect-stereo-matching}`) and install an external pattern projector if required. +- Decrease the :ref:`Minimum Distance + `:latex:`\:(Section \ref{stereo_matching:sect-disp-image-parameters})`. +- Increase the :ref:`Maximum Distance `:latex:`\:(Section + \ref{stereo_matching:sect-disp-image-parameters})`. +- Check whether the object is too close to the cameras. Consider the different depth ranges of the camera variants. +- Decrease the :ref:`Minimum Confidence `:latex:`\:(Section + \ref{stereo_matching:sect-disp-image-parameters})`. +- Increase the :ref:`Maximum Depth Error `:latex:`\:(Section + \ref{stereo_matching:sect-disp-image-parameters})`. +- Choose a lesser :ref:`Disparity Image Quality `:latex:`\:(Section + \ref{stereo_matching:sect-disp-image-parameters})`. Lower resolution disparity images are generally less sparse. + +.. only:: rc_visard or rc_visard_ng + + - Check the cameras' calibration and recalibrate if required (see :ref:`sect-camera-calibration`:latex:`, Section + \ref{camera_calibration:sect-camera-calibration}`). + +**The disparity images' frame rate is too low** + +- Check and increase the frame rate of the camera images (see :ref:`sect-cam-params`:latex:`, Section \ref{stereo_camera:sect-cam-params}`). + The frame rate of the disparity image cannot be greater than the frame rate of the camera images. +- Choose a lesser :ref:`Disparity Image Quality `:latex:`\:(Section + \ref{stereo_matching:sect-disp-image-parameters})`. +- Increase the :ref:`Minimum Distance + `:latex:`\:(Section \ref{stereo_matching:sect-disp-image-parameters})` + as much as possible for the application. + +**The disparity image does not show close objects** + +- Check whether the object is too close to the cameras. Consider the depth ranges of the camera variants. +- Decrease the :ref:`Minimum Distance `:latex:`\:(Section + \ref{stereo_matching:sect-disp-image-parameters})`. + +**The disparity image does not show distant objects** + +- Increase the :ref:`Maximum Distance `:latex:`\:(Section + \ref{stereo_matching:sect-disp-image-parameters})`. +- Increase the :ref:`Maximum Depth Error `:latex:`\:(Section + \ref{stereo_matching:sect-disp-image-parameters})`. +- Decrease the :ref:`Minimum Confidence `:latex:`\:(Section + \ref{stereo_matching:sect-disp-image-parameters})`. + +**The disparity image is too noisy** + +- Increase the :ref:`Segmentation value `:latex:`\:(Section + \ref{stereo_matching:sect-disp-image-parameters})`. +- Increase the :ref:`Fill-In value `:latex:`\:(Section + \ref{stereo_matching:sect-disp-image-parameters})`. + +**The disparity values or the resulting depth values are too inaccurate** + +- Decrease the distance between the camera and the scene. Depth-measurement error grows quadratically with the distance from the cameras. +- Check whether the scene contains repetitive patterns and remove them if it does. They could cause wrong disparity measurements. + +**The disparity image is too smooth** + +- Decrease the :ref:`Fill-In value `:latex:`\:(Section + \ref{stereo_matching:sect-disp-image-parameters})`. + +**The disparity image does not show small structures** + +- Decrease the :ref:`Segmentation value `:latex:`\:(Section + \ref{stereo_matching:sect-disp-image-parameters})`. +- Decrease the :ref:`Fill-In value `:latex:`\:(Section + \ref{stereo_matching:sect-disp-image-parameters})`. + + +.. only:: rc_visard + + .. _sect-pose-issues: + + Dynamics issues + --------------- + + **State estimates are unavailable** + + - Check in the |webgui| that pose estimation has been switched on + (see :ref:`sect-vo-parameters`:latex:`, Section \ref{stereo_visodo:sect-vo-parameters}`). + - Check in the |webgui| that the update rate is about |imu-rate|. + - Check the *Logs* in the |webgui| for errors. + + **The state estimates are too noisy** + + - Adapt the parameters for visual odometry as described in :ref:`sect-vo-parameters`:latex:`\:(Section + \ref{stereo_visodo:sect-vo-parameters})`. + - Check whether the *camera pose stream* has enough accuracy. + + **Pose estimation has jumps** + + - Has the SLAM module been turned on? SLAM can cause jumps when reducing errors due to a + loop closure. + - Adapt the parameters for visual odometry as described in :ref:`sect-vo-parameters`:latex:`\:(Section + \ref{stereo_visodo:sect-vo-parameters})`. + + **Pose frequency is too low** + + - Use the real-time pose stream with a |imu-rate| update rate. See + :ref:`sect-stereo-ins`:latex:`\:(Section \ref{stereo_ins:sect-stereo-ins})`. + + **Delay/Latency of pose is too great** + + - Use the real-time pose stream. See + :ref:`sect-stereo-ins`:latex:`\:(Section \ref{stereo_ins:sect-stereo-ins})`. + +GigE Vision/GenICam issues +-------------------------- + +**No images** + +- Check that the modules are enabled. See ``ComponentSelector`` and ``ComponentEnable`` in + :ref:`sect-genicam-params`:latex:`\:(Section \ref{gigevision:sect-genicam-params})`. \ No newline at end of file diff --git a/v24.04/en/_raw_sources/userspace.rst.txt b/v24.04/en/_raw_sources/userspace.rst.txt new file mode 100644 index 0000000..cc6ae99 --- /dev/null +++ b/v24.04/en/_raw_sources/userspace.rst.txt @@ -0,0 +1,145 @@ +.. include:: global_rst.glb +.. _sect-userspace: + +|userspace| +=========== + +.. index:: !UserSpace + single: container + single: Docker + single: portainer + +The |userspace| enables users to deploy and manage containers running on the +|rc_xxx|. Standalone containers and docker-compose stacks are supported. + +.. Note:: Familiarity with Docker containers is required. + +If available and enabled, the |userspace| can be accessed in the +:ref:`Web GUI`:latex:`\ (Section \ref{webgui:sect-web-gui})` +in the menu under *UserSpace*. This page shows the running apps and containers +with their current state and health, in case a health-check is available. Each +container lists the published ports. If their protocol is http or https, these +containers can be accessed directly in the |webgui|. + +Configuration +------------- + +.. index:: + single: UserSpace; security + single: UserSpace; installation + +.. only:: rc_visard_ng + + If the |userspace| is enabled for the first time, a user for the portainer UI + needs to be created: In the :ref:`Web GUI`:latex:`\ (Section \ref{webgui:sect-web-gui})` + navigate to *UserSpace* and click on *Manage UserSpace Apps*. + Then, register a user account for the administrator. + It is required to complete this step within + five minutes after booting the |rc_xxx|. + +.. only:: rc_cube + + .. Note:: The |userspace| is not enabled by default and can only be + enabled/disabled or reset via a locally connected screen for security reasons. + + Please connect a monitor, keyboard, and mouse to the |rc-cube| and then boot + the |rc-cube|. + + Enable |userspace| + ^^^^^^^^^^^^^^^^^^ + The |userspace| can be enabled in two steps: + + 1. Navigate to the pane *UserSpace configuration* and click :guilabel:`enable UserSpace`. + + 2. If the |userspace| is enabled for the first time, a user for the portainer UI + needs to be created: Click on the *portainer* pane, and register a user + account for the administrator. It is required to complete this step within + five minutes after clicking :guilabel:`enable UserSpace`. + + Disable |userspace| + ^^^^^^^^^^^^^^^^^^^ + + The |userspace| can also be disabled. To disable the |userspace|, navigate to + the pane *UserSpace configuration* and click :guilabel:`disable UserSpace`. Disabling + will stop all running containers and the portainer UI, but not delete existing + container images and their configurations. The |userspace| can be enabled again + at any time. + + Reset |userspace| + ^^^^^^^^^^^^^^^^^ + + The |userspace| can also be reset. To reset the |userspace|, navigate to the + pane *UserSpace configuration* click :guilabel:`Reset UserSpace` and answer the + security question. Resetting will delete all containers, volumes, and the + portainer configuration, including secrets and users. + +Network access to UserSpace applications +---------------------------------------- + +To access containers via network, the container ports need to be published to host ports. + +|userspace| information including running apps and their published ports can be queried via +:ref:`REST-API userspace endpoint`:latex:`, (Section \ref{rest_api_userspace:sect-rest-api-userspace})` +or viewed in the :ref:`Web GUI`:latex:`\ (Section \ref{webgui:sect-web-gui})` +in the menu under *UserSpace*. + +All ports that are published to the host are listed with their protocol (UDP or TCP). +To explicitly specify a protocol (e.g. http or https) for app ports use container labels: + +- ``com.roboception.app.http``: all exposed TCP ports use http +- ``com.roboception.app.https.port=1234,5678``: comma separated list with https ports + + +.. only:: rc_cube + + Examples + -------- + + .. index:: + single: |userspace|; examples + + Two examples can be found under *App Templates* inside the |userspace| pane: + + - **hello_rc_cube**: Single container exposing a web page with some information about itself. + See also https://github.com/roboception/hello_rc_cube. + + - **rc_cube_monitoring**: Compose stack with Prometheus and Grafana to monitor the |rc_cube|. + See also https://github.com/roboception/rc_cube_monitoring. + + Clicking :guilabel:`Deploy the container/stack` under *Actions* will pull the Docker images and start the app. + The running app containers can then be seen under *Containers*. + The web page address is a combination of the |rc_cube|'s IP address and the port listed under *Published Ports*. + +Interfaces +---------- + +.. index:: + single: UserSpace; gRPC + single: UserSpace; REST-API + +Docker containers managed in the |userspace| can use the public interfaces of +the |rc_xxx|. In particular, Docker containers can access synchronized image +sets via :doc:`gRPC`:latex:`\:(Section \ref{grpc:sect-grpc})` and can +call the :doc:`rest_api`:latex:`\:(Section \ref{rest_api:sect-rest-api})`. The +|rc_xxx| (the host) can be accessed under the Docker bridge IP (in default +Docker bridge network `172.17.0.1`). + +Restrictions +------------ + +.. index:: + single: UserSpace; restrictions + single: UserSpace; Docker network + single: UserSpace; security + +Some restrictions for containers apply: + +- Containers cannot be privileged. +- No access to the host network (a Docker bridge network is used instead). +- Only paths inside cloned git repositories with a docker-compose stack can be mounted, all other host paths cannot be mounted. +- Host devices cannot be accessed. This includes e.g. USB and GPU devices. +- Well known and internally used ports on the host cannot be bound. + This includes ports below 1024, ports from 4200 to 4299 and the ports + 2342, 2343, 2344, 2345, 3956, 4840, 5353, 6379, + 7000, 7001, 7002, 7003, 9100, 9118, 9256, 9445, 9446, 11311, 22350, 22352, + 50010, 50051, 50052, 50053 and 50054. diff --git a/v24.04/en/_raw_sources/warranty.rst.txt b/v24.04/en/_raw_sources/warranty.rst.txt new file mode 100644 index 0000000..89ed808 --- /dev/null +++ b/v24.04/en/_raw_sources/warranty.rst.txt @@ -0,0 +1,20 @@ +.. include:: global_rst.glb + +.. raw:: latex + + \newpage + +.. _sect-warranty: + +Warranty +======== + +Any changes or modifications to the hard- and software not expressly approved by |company| could void the user's warranty and guarantee rights. + +.. Warning:: The |rc_xxx| utilizes complex hardware and software technology that may behave in a way not intended by the user. The purchaser must design its application to ensure that any failure or the |rc_xxx| does not cause personal injury, property damage, or other losses. + +.. Warning:: Do not attempt to take apart, open, service, or modify the |rc_xxx|. Doing so could present the risk of electric shock or other hazard. Any evidence of any attempt to open and/or modify the device, including any peeling, puncturing, or removal of any of the labels, will void the Limited Warranty. + +.. Warning:: CAUTION: to comply with the European CE requirement, all cables used to connect this device must be shielded and grounded. Operation with incorrect cables may result in interference with other devices or undesired effects of the product. + +.. Note:: This product may not be treated as household waste. By ensuring this product is disposed of correctly, you will help to protect the environment. For more detailed information about the recycling of this product, please contact your local authority, your household waste disposal service provider, or the product's supplier. diff --git a/v24.04/en/_raw_sources/webgui.rst.txt b/v24.04/en/_raw_sources/webgui.rst.txt new file mode 100644 index 0000000..5ab87d8 --- /dev/null +++ b/v24.04/en/_raw_sources/webgui.rst.txt @@ -0,0 +1,204 @@ +.. include:: global_rst.glb + +.. _sect-web-gui: + +Web GUI +======= + +.. index:: ! Web GUI + +The |rc_xxx|'s |webgui| can be used to test, calibrate, and configure the device. + +Accessing the Web GUI +--------------------- + +The |webgui| can be accessed from any web browser, such as Firefox, Google Chrome, or Microsoft Edge, via +the |rc_xxx|'s IP address. The easiest way to access the |webgui| is to simply double click on the +desired device using the ``rcdiscover-gui`` tool as explained in :ref:`sect-discovery-of-rcvisard-devices`:latex:`\:(Section \ref{installation:sect-discovery-of-rcvisard-devices})`. + +Alternatively, some network environments automatically configure the unique host name of +the |rc_xxx| in their Domain Name Server (:term:`DNS`). In this case, the |webgui| can also be +accessed directly using the :term:`URL` ``http://`` by +replacing ```` with the device's host name. + +For Linux and Mac operating systems, this even works without DNS via the multicast +Domain Name System (:term:`mDNS`), which is automatically used if ``.local`` is appended to the +host name. Thus, the URL simply becomes ``http://.local``. + +.. only:: rc_cube + + Access to the |rc_visard| |webgui| + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + For troubleshooting, users can + also directly access the |webgui| of the |rc_visard| device that + is connected to the |rc_xxx|. + It is available for the |rc_visard| on camera pipeline 0 + at port ``2342`` of the |rc_xxx|, and hence at + the :term:`URL` ``http://:2342`` + where ```` is the IP address or host + name of the |rc_xxx| that the |rc_visard| is connected to. + For camera pipelines 1, 2 or 3 it can be accessed at ``http://:2343``, + ``http://:2344``, and ``http://:2345``, respectively. + + By this means, users have access to the |rc_visard|'s device information + or log files. + + .. note:: If a computer screen is directly connected to the |rc_xxx|, + it shows the |webgui| with a small additional menu from which + the |rc_visard|'s |webgui| can be accessed as well. + + +Exploring the Web GUI +--------------------- + +.. only:: rc_visard or rc_visard_ng + + The |webgui|'s dashboard page gives the most important information about the device + and the software modules. + +.. only:: rc_cube + + The |webgui|'s dashboard page gives the most important information about the device + and the running camera pipelines. + +.. figure:: images/webgui_dashboard.png + :align: center + + Dashboard page of the |rc_xxx|'s |webgui| + +The page's side menu permits access to the individual pages of the |rc_xxx|'s |webgui|: + +.. only:: rc_cube + + *Pipeline* + gives access to the respective camera pipeline and its camera, detection and configuration modules. + Each camera pipeline provides an overview page with the most important information about the + camera connection and the software modules running in the pipeline. + + .. figure:: images/webgui_pipeline_overview.png + :align: center + + Pipeline overview page of the |rc_xxx|'s |webgui| + + Each pipeline provides a sub-menu with the individual pages for the modules running in the pipeline: + +*Camera* + shows a live stream of the rectified camera images. + The frame rate can be reduced to save bandwidth when streaming to a + GigE Vision\ |reg| client. Furthermore, exposure can be set manually or automatically. + See :ref:`sect-cam-params`:latex:`\:(Section \ref{stereo_camera:sect-cam-params})` for more information. + +*Depth Image* + shows a live stream of the left rectified, disparity, and + confidence images. The page contains various settings for depth-image + computation and filtering. See :ref:`sect-disp-image-parameters`:latex:`\:(Section \ref{stereo_matching:sect-disp-image-parameters})` for more information. + +.. only:: rc_visard + + *Dynamics* + shows the location and movement of image features that are + used to compute the |rcvisard|'s egomotion. Settings include the number of corners + and features that should be used. See :ref:`sect-vo-parameters`:latex:`\:(Section \ref{stereo_visodo:sect-vo-parameters})` for more information. + +*Modules* + gives access to the detection modules of the |rcxxx| + (see :doc:`detection_modules`:latex:`, Section \ref{detection_modules:sect-detection-modules}`). + +*Configuration* + gives access to the configuration modules of the |rcxxx| + (see :doc:`configuration_modules`:latex:`, Section \ref{configuration_modules:sect-configuration-modules}`). + +.. only:: rc_cube + + The following modules running outside the pipelines can be accessed in the side menu: + +*Database* + gives access to the database modules of the |rcxxx| + (see :doc:`database_modules`:latex:`, Section \ref{database_modules:sect-database-modules}`). + +*System* + gives access to general settings, device information and to the log files, + and permits the firmware or the license file to be updated. + +.. only:: rc_cube + + *UserSpace* + gives access to the |rc_cube|'s UserSpace + (see :doc:`userspace`:latex:`, Section \ref{userspace:sect-userspace}`). + +.. Note:: Further information on all parameters in the |webgui| can be obtained by pressing the *Info* + button next to each parameter. + +.. _sect-webgui-ui-lock: + +Web GUI access control +---------------------- + +The |webgui| has a simple mechanism to lock the UI against casual and accidental changes. + +When enabling |webgui| access control via the *System* page, you will be asked to set a password. +Now the |webgui| is in a locked mode indicated by the lock symbol in the top bar. +All pages, camera streams, parameters and detections can be inspected as usual, but changes are not possible. + +To temporarily unlock the |webgui| and make changes, click the lock symbol and enter the password. +While enabling or disabling |webgui| access control affects anyone accessing this |rc_xxx|, +the unlocked state is only valid for the browser where it was unlocked and indicated by the open lock symbol. +It is automatically locked again after 10 minutes of inactivity. + +|webgui| access control can also be disabled again on the *System* page after providing the current password. + +.. Warning:: This is not a security feature! It only locks the |webgui| and not the |rest-api|. + It is meant to prevent accidental and casual changes e.g. via a connected screen. + +.. Note:: In case the password is lost, this can be disabled via the |rest-api| + :ref:`delete ui_lock`:latex:`\:(Section \ref{rest_api_syslogs:sect-rest-delete-system-ui-lock})`. + +.. _sect-webgui-camera-snapshot: + +Downloading camera images +------------------------- + +The |webgui| +provides an easy way to download a snapshot of the current scene as a .tar.gz file +by clicking on the camera icon below the image live streams on the *Camera* page. This snapshot contains: + +- the rectified camera images in full resolution as .png files, +- a camera parameter file containing the camera matrix, image dimensions, exposure time, + gain value and the stereo baseline, +- the current IMU readings as imu.csv file, :cubeonly:`if available,` +- a pipeline_status.json file containing information about all :cubeonly:`modules running inside the pipelines`:visardsonly:`3D-camera, detection and configuration nodes running` on the |rc_xxx|, +- a backup.json file containing the settings of the |rc_xxx| including grippers, load carriers and regions of interest, +- a system_info.json file containing system information about the |rc_xxx|. + + +The filenames contain the timestamps. + +.. _sect-webgui-depth-snapshot: + +Downloading depth images and point clouds +----------------------------------------- + +The |webgui| provides an easy way to download the depth data of the current scene as a .tar.gz file +by clicking on the camera icon below the image live streams on the *Depth Image* page. This snapshot contains: + +- the rectified left and right camera images in full resolution as .png files, +- an image parameter file corresponding to the left image containing the camera matrix, image dimensions, exposure time, + gain value and the stereo baseline, +- the disparity, error and confidence images in the resolution corresponding to the currently chosen quality as .png files, +- a disparity parameter file corresponding to the disparity image containing the camera matrix, image dimensions, exposure time, + gain value and the stereo baseline, and information about the disparity values (i.e. invalid values, scale, offset), +- the current IMU readings as imu.csv file, :cubeonly:`if available,` +- a pipeline_status.json file containing information about all :cubeonly:`modules running inside the pipelines`:visardsonly:`3D-camera, detection and configuration nodes running` on the |rc_xxx|, +- a backup.json file containing the settings of the |rc_xxx| including grippers, load carriers and regions of interest, +- a system_info.json file containing system information about the |rc_xxx|. + +The filenames contain the timestamps. + +When clicking on the mesh icon below the image live streams on the *Depth Image* page, a snapshot is downloaded +which additionally includes a mesh of the point cloud in the current depth quality (resolution) as .ply file. + +.. note:: + Downloading a depth snapshot will trigger an acquisition in the same way as clicking on the "Acquire" button on the + *Depth Image* page of the Web GUI, and, thus, might affect running applications. + diff --git a/v24.04/en/_sources/.doctrees/accessories.doctree b/v24.04/en/_sources/.doctrees/accessories.doctree new file mode 100644 index 0000000..4e9ef8f Binary files /dev/null and b/v24.04/en/_sources/.doctrees/accessories.doctree differ diff --git a/v24.04/en/_sources/.doctrees/appendix.doctree b/v24.04/en/_sources/.doctrees/appendix.doctree new file mode 100644 index 0000000..33e85ce Binary files /dev/null and b/v24.04/en/_sources/.doctrees/appendix.doctree differ diff --git a/v24.04/en/_sources/.doctrees/blaze.doctree b/v24.04/en/_sources/.doctrees/blaze.doctree new file mode 100644 index 0000000..3e9c689 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/blaze.doctree differ diff --git a/v24.04/en/_sources/.doctrees/cadmatch.doctree b/v24.04/en/_sources/.doctrees/cadmatch.doctree new file mode 100644 index 0000000..fe1a4e0 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/cadmatch.doctree differ diff --git a/v24.04/en/_sources/.doctrees/camera_calibration.doctree b/v24.04/en/_sources/.doctrees/camera_calibration.doctree new file mode 100644 index 0000000..3291ccf Binary files /dev/null and b/v24.04/en/_sources/.doctrees/camera_calibration.doctree differ diff --git a/v24.04/en/_sources/.doctrees/camera_modules.doctree b/v24.04/en/_sources/.doctrees/camera_modules.doctree new file mode 100644 index 0000000..46316b9 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/camera_modules.doctree differ diff --git a/v24.04/en/_sources/.doctrees/collisioncheck.doctree b/v24.04/en/_sources/.doctrees/collisioncheck.doctree new file mode 100644 index 0000000..ba33c99 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/collisioncheck.doctree differ diff --git a/v24.04/en/_sources/.doctrees/concept_stereo.doctree b/v24.04/en/_sources/.doctrees/concept_stereo.doctree new file mode 100644 index 0000000..3e25fbb Binary files /dev/null and b/v24.04/en/_sources/.doctrees/concept_stereo.doctree differ diff --git a/v24.04/en/_sources/.doctrees/concepts.doctree b/v24.04/en/_sources/.doctrees/concepts.doctree new file mode 100644 index 0000000..d1ddc56 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/concepts.doctree differ diff --git a/v24.04/en/_sources/.doctrees/configuration_modules.doctree b/v24.04/en/_sources/.doctrees/configuration_modules.doctree new file mode 100644 index 0000000..8697a58 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/configuration_modules.doctree differ diff --git a/v24.04/en/_sources/.doctrees/contact.doctree b/v24.04/en/_sources/.doctrees/contact.doctree new file mode 100644 index 0000000..7c03f9b Binary files /dev/null and b/v24.04/en/_sources/.doctrees/contact.doctree differ diff --git a/v24.04/en/_sources/.doctrees/database_modules.doctree b/v24.04/en/_sources/.doctrees/database_modules.doctree new file mode 100644 index 0000000..19d8c7d Binary files /dev/null and b/v24.04/en/_sources/.doctrees/database_modules.doctree differ diff --git a/v24.04/en/_sources/.doctrees/detection_modules.doctree b/v24.04/en/_sources/.doctrees/detection_modules.doctree new file mode 100644 index 0000000..0acbf03 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/detection_modules.doctree differ diff --git a/v24.04/en/_sources/.doctrees/disposal.doctree b/v24.04/en/_sources/.doctrees/disposal.doctree new file mode 100644 index 0000000..d1aaa91 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/disposal.doctree differ diff --git a/v24.04/en/_sources/.doctrees/eki.doctree b/v24.04/en/_sources/.doctrees/eki.doctree new file mode 100644 index 0000000..16728df Binary files /dev/null and b/v24.04/en/_sources/.doctrees/eki.doctree differ diff --git a/v24.04/en/_sources/.doctrees/environment.pickle b/v24.04/en/_sources/.doctrees/environment.pickle new file mode 100644 index 0000000..e2215ec Binary files /dev/null and b/v24.04/en/_sources/.doctrees/environment.pickle differ diff --git a/v24.04/en/_sources/.doctrees/general.doctree b/v24.04/en/_sources/.doctrees/general.doctree new file mode 100644 index 0000000..623fd7a Binary files /dev/null and b/v24.04/en/_sources/.doctrees/general.doctree differ diff --git a/v24.04/en/_sources/.doctrees/gigevision.doctree b/v24.04/en/_sources/.doctrees/gigevision.doctree new file mode 100644 index 0000000..689b2b8 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/gigevision.doctree differ diff --git a/v24.04/en/_sources/.doctrees/glossary.doctree b/v24.04/en/_sources/.doctrees/glossary.doctree new file mode 100644 index 0000000..2d2b8c0 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/glossary.doctree differ diff --git a/v24.04/en/_sources/.doctrees/gripper_db.doctree b/v24.04/en/_sources/.doctrees/gripper_db.doctree new file mode 100644 index 0000000..b54b67e Binary files /dev/null and b/v24.04/en/_sources/.doctrees/gripper_db.doctree differ diff --git a/v24.04/en/_sources/.doctrees/grpc.doctree b/v24.04/en/_sources/.doctrees/grpc.doctree new file mode 100644 index 0000000..5c2a615 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/grpc.doctree differ diff --git a/v24.04/en/_sources/.doctrees/handeye_calibration.doctree b/v24.04/en/_sources/.doctrees/handeye_calibration.doctree new file mode 100644 index 0000000..cfa8ee8 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/handeye_calibration.doctree differ diff --git a/v24.04/en/_sources/.doctrees/hardware_spec.doctree b/v24.04/en/_sources/.doctrees/hardware_spec.doctree new file mode 100644 index 0000000..4607d3f Binary files /dev/null and b/v24.04/en/_sources/.doctrees/hardware_spec.doctree differ diff --git a/v24.04/en/_sources/.doctrees/index.doctree b/v24.04/en/_sources/.doctrees/index.doctree new file mode 100644 index 0000000..800210d Binary files /dev/null and b/v24.04/en/_sources/.doctrees/index.doctree differ diff --git a/v24.04/en/_sources/.doctrees/installation.doctree b/v24.04/en/_sources/.doctrees/installation.doctree new file mode 100644 index 0000000..7990f93 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/installation.doctree differ diff --git a/v24.04/en/_sources/.doctrees/interfaces.doctree b/v24.04/en/_sources/.doctrees/interfaces.doctree new file mode 100644 index 0000000..2bcb8ca Binary files /dev/null and b/v24.04/en/_sources/.doctrees/interfaces.doctree differ diff --git a/v24.04/en/_sources/.doctrees/iocontrol.doctree b/v24.04/en/_sources/.doctrees/iocontrol.doctree new file mode 100644 index 0000000..95e9b1d Binary files /dev/null and b/v24.04/en/_sources/.doctrees/iocontrol.doctree differ diff --git a/v24.04/en/_sources/.doctrees/itempick.doctree b/v24.04/en/_sources/.doctrees/itempick.doctree new file mode 100644 index 0000000..14e20a1 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/itempick.doctree differ diff --git a/v24.04/en/_sources/.doctrees/loadcarrier.doctree b/v24.04/en/_sources/.doctrees/loadcarrier.doctree new file mode 100644 index 0000000..062f81f Binary files /dev/null and b/v24.04/en/_sources/.doctrees/loadcarrier.doctree differ diff --git a/v24.04/en/_sources/.doctrees/loadcarrier_db.doctree b/v24.04/en/_sources/.doctrees/loadcarrier_db.doctree new file mode 100644 index 0000000..2463d5c Binary files /dev/null and b/v24.04/en/_sources/.doctrees/loadcarrier_db.doctree differ diff --git a/v24.04/en/_sources/.doctrees/maintenance.doctree b/v24.04/en/_sources/.doctrees/maintenance.doctree new file mode 100644 index 0000000..9461e8c Binary files /dev/null and b/v24.04/en/_sources/.doctrees/maintenance.doctree differ diff --git a/v24.04/en/_sources/.doctrees/modules.doctree b/v24.04/en/_sources/.doctrees/modules.doctree new file mode 100644 index 0000000..9c0ac69 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/modules.doctree differ diff --git a/v24.04/en/_sources/.doctrees/navigation_modules.doctree b/v24.04/en/_sources/.doctrees/navigation_modules.doctree new file mode 100644 index 0000000..1469f1b Binary files /dev/null and b/v24.04/en/_sources/.doctrees/navigation_modules.doctree differ diff --git a/v24.04/en/_sources/.doctrees/opc_ua.doctree b/v24.04/en/_sources/.doctrees/opc_ua.doctree new file mode 100644 index 0000000..7e9a45c Binary files /dev/null and b/v24.04/en/_sources/.doctrees/opc_ua.doctree differ diff --git a/v24.04/en/_sources/.doctrees/pipelines.doctree b/v24.04/en/_sources/.doctrees/pipelines.doctree new file mode 100644 index 0000000..853da9e Binary files /dev/null and b/v24.04/en/_sources/.doctrees/pipelines.doctree differ diff --git a/v24.04/en/_sources/.doctrees/pose_format_abb.doctree b/v24.04/en/_sources/.doctrees/pose_format_abb.doctree new file mode 100644 index 0000000..9077eea Binary files /dev/null and b/v24.04/en/_sources/.doctrees/pose_format_abb.doctree differ diff --git a/v24.04/en/_sources/.doctrees/pose_format_fanuc.doctree b/v24.04/en/_sources/.doctrees/pose_format_fanuc.doctree new file mode 100644 index 0000000..db8c336 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/pose_format_fanuc.doctree differ diff --git a/v24.04/en/_sources/.doctrees/pose_format_franka_emika.doctree b/v24.04/en/_sources/.doctrees/pose_format_franka_emika.doctree new file mode 100644 index 0000000..012b312 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/pose_format_franka_emika.doctree differ diff --git a/v24.04/en/_sources/.doctrees/pose_format_fruitcore_horst.doctree b/v24.04/en/_sources/.doctrees/pose_format_fruitcore_horst.doctree new file mode 100644 index 0000000..ee31480 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/pose_format_fruitcore_horst.doctree differ diff --git a/v24.04/en/_sources/.doctrees/pose_format_kawasaki.doctree b/v24.04/en/_sources/.doctrees/pose_format_kawasaki.doctree new file mode 100644 index 0000000..86abd3d Binary files /dev/null and b/v24.04/en/_sources/.doctrees/pose_format_kawasaki.doctree differ diff --git a/v24.04/en/_sources/.doctrees/pose_format_kuka.doctree b/v24.04/en/_sources/.doctrees/pose_format_kuka.doctree new file mode 100644 index 0000000..dc9077c Binary files /dev/null and b/v24.04/en/_sources/.doctrees/pose_format_kuka.doctree differ diff --git a/v24.04/en/_sources/.doctrees/pose_format_mitsubishi.doctree b/v24.04/en/_sources/.doctrees/pose_format_mitsubishi.doctree new file mode 100644 index 0000000..afa2630 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/pose_format_mitsubishi.doctree differ diff --git a/v24.04/en/_sources/.doctrees/pose_format_rt.doctree b/v24.04/en/_sources/.doctrees/pose_format_rt.doctree new file mode 100644 index 0000000..bae1559 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/pose_format_rt.doctree differ diff --git a/v24.04/en/_sources/.doctrees/pose_format_ur.doctree b/v24.04/en/_sources/.doctrees/pose_format_ur.doctree new file mode 100644 index 0000000..2245b4c Binary files /dev/null and b/v24.04/en/_sources/.doctrees/pose_format_ur.doctree differ diff --git a/v24.04/en/_sources/.doctrees/pose_format_yaskawa.doctree b/v24.04/en/_sources/.doctrees/pose_format_yaskawa.doctree new file mode 100644 index 0000000..164dadc Binary files /dev/null and b/v24.04/en/_sources/.doctrees/pose_format_yaskawa.doctree differ diff --git a/v24.04/en/_sources/.doctrees/rest_api.doctree b/v24.04/en/_sources/.doctrees/rest_api.doctree new file mode 100644 index 0000000..50e137e Binary files /dev/null and b/v24.04/en/_sources/.doctrees/rest_api.doctree differ diff --git a/v24.04/en/_sources/.doctrees/rest_api_datamodel.doctree b/v24.04/en/_sources/.doctrees/rest_api_datamodel.doctree new file mode 100644 index 0000000..d4be874 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/rest_api_datamodel.doctree differ diff --git a/v24.04/en/_sources/.doctrees/rest_api_general.doctree b/v24.04/en/_sources/.doctrees/rest_api_general.doctree new file mode 100644 index 0000000..8037fbe Binary files /dev/null and b/v24.04/en/_sources/.doctrees/rest_api_general.doctree differ diff --git a/v24.04/en/_sources/.doctrees/rest_api_nodes.doctree b/v24.04/en/_sources/.doctrees/rest_api_nodes.doctree new file mode 100644 index 0000000..ef90497 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/rest_api_nodes.doctree differ diff --git a/v24.04/en/_sources/.doctrees/rest_api_pipelines.doctree b/v24.04/en/_sources/.doctrees/rest_api_pipelines.doctree new file mode 100644 index 0000000..c51c9ab Binary files /dev/null and b/v24.04/en/_sources/.doctrees/rest_api_pipelines.doctree differ diff --git a/v24.04/en/_sources/.doctrees/rest_api_swagger_ui.doctree b/v24.04/en/_sources/.doctrees/rest_api_swagger_ui.doctree new file mode 100644 index 0000000..cfbc649 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/rest_api_swagger_ui.doctree differ diff --git a/v24.04/en/_sources/.doctrees/rest_api_syslogs.doctree b/v24.04/en/_sources/.doctrees/rest_api_syslogs.doctree new file mode 100644 index 0000000..e630d0b Binary files /dev/null and b/v24.04/en/_sources/.doctrees/rest_api_syslogs.doctree differ diff --git a/v24.04/en/_sources/.doctrees/rest_api_userspace.doctree b/v24.04/en/_sources/.doctrees/rest_api_userspace.doctree new file mode 100644 index 0000000..19626d1 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/rest_api_userspace.doctree differ diff --git a/v24.04/en/_sources/.doctrees/revisions.doctree b/v24.04/en/_sources/.doctrees/revisions.doctree new file mode 100644 index 0000000..54acbe4 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/revisions.doctree differ diff --git a/v24.04/en/_sources/.doctrees/roi.doctree b/v24.04/en/_sources/.doctrees/roi.doctree new file mode 100644 index 0000000..a33e65c Binary files /dev/null and b/v24.04/en/_sources/.doctrees/roi.doctree differ diff --git a/v24.04/en/_sources/.doctrees/safety.doctree b/v24.04/en/_sources/.doctrees/safety.doctree new file mode 100644 index 0000000..2ea6979 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/safety.doctree differ diff --git a/v24.04/en/_sources/.doctrees/silhouettematch.doctree b/v24.04/en/_sources/.doctrees/silhouettematch.doctree new file mode 100644 index 0000000..861ebdf Binary files /dev/null and b/v24.04/en/_sources/.doctrees/silhouettematch.doctree differ diff --git a/v24.04/en/_sources/.doctrees/standards.doctree b/v24.04/en/_sources/.doctrees/standards.doctree new file mode 100644 index 0000000..906d62f Binary files /dev/null and b/v24.04/en/_sources/.doctrees/standards.doctree differ diff --git a/v24.04/en/_sources/.doctrees/stereo_camera.doctree b/v24.04/en/_sources/.doctrees/stereo_camera.doctree new file mode 100644 index 0000000..90f6661 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/stereo_camera.doctree differ diff --git a/v24.04/en/_sources/.doctrees/stereo_matching.doctree b/v24.04/en/_sources/.doctrees/stereo_matching.doctree new file mode 100644 index 0000000..c381c10 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/stereo_matching.doctree differ diff --git a/v24.04/en/_sources/.doctrees/tagdetect.doctree b/v24.04/en/_sources/.doctrees/tagdetect.doctree new file mode 100644 index 0000000..515ed69 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/tagdetect.doctree differ diff --git a/v24.04/en/_sources/.doctrees/time_sync.doctree b/v24.04/en/_sources/.doctrees/time_sync.doctree new file mode 100644 index 0000000..2910811 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/time_sync.doctree differ diff --git a/v24.04/en/_sources/.doctrees/troubleshooting.doctree b/v24.04/en/_sources/.doctrees/troubleshooting.doctree new file mode 100644 index 0000000..599b7cb Binary files /dev/null and b/v24.04/en/_sources/.doctrees/troubleshooting.doctree differ diff --git a/v24.04/en/_sources/.doctrees/userspace.doctree b/v24.04/en/_sources/.doctrees/userspace.doctree new file mode 100644 index 0000000..d25f1d9 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/userspace.doctree differ diff --git a/v24.04/en/_sources/.doctrees/warranty.doctree b/v24.04/en/_sources/.doctrees/warranty.doctree new file mode 100644 index 0000000..69ee319 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/warranty.doctree differ diff --git a/v24.04/en/_sources/.doctrees/webgui.doctree b/v24.04/en/_sources/.doctrees/webgui.doctree new file mode 100644 index 0000000..b51edb0 Binary files /dev/null and b/v24.04/en/_sources/.doctrees/webgui.doctree differ diff --git a/v24.04/en/_sources/accessories.rst.txt b/v24.04/en/_sources/accessories.rst.txt new file mode 100644 index 0000000..40235a4 --- /dev/null +++ b/v24.04/en/_sources/accessories.rst.txt @@ -0,0 +1,132 @@ +Accessories + +Connectivity kit + +Roboception offers an optional connectivity kit to aid customers with +setting up the + +rc_visard NG + +. For permanent installation, the customer is responsible for +providing a suitable power supply. The connectivity kit consists of a: + +network cable with straight M12 plug to straight RJ45 connector in +either 2 m, 5 m, or 10 m length, + +power adapter cable with straight M12 socket to DC barrel connector in +30 cm length, + +24 V, 30 W wall power supply, or a 24 V, 60 W desktop power supply. + +Connecting the + +rc_visard NG + + to residential or office grid power requires a power supply that +meets EN 55011 Class B emission standards. The E2CFS 30W 24V by EGSTON +System Electronics Eggenburg GmbH ( + +http://www.egston.com + +) contained in the connectivity kit is certified accordingly. However, +it does not meet immunity standards for industrial environments under +EN 61000-6-2. + + +Wiring + +Cables are by default not provided with the + +rc_visard NG + +. It is the customer's responsibility to obtain appropriate parts. The +following sections provide an overview of suggested components. + +Ethernet connections + +The + +rc_visard NG + + provides an industrial 8-pin A-coded M12 socket connector for +Ethernet connectivity. Various cabling solutions can be obtained +directly from third party vendors. + +CAT5 (1 Gbps) M12 plug to RJ45 + +Straight M12 plug to straight RJ45 connector, 10 m length: Phoenix +Contact NBC-MS/ 10,0-94B/R4AC SCO, Art.-Nr.: 1407417 + +Straight M12 plug to straight RJ45 connector, 10 m length: MURR +Electronics Art.-Nr.: 7700-48521-S4W1000 + +Angled M12 plug to straight RJ45 connector, 10 m length: MURR +Electronics Art.-Nr.: 7700-48551-S4W1000 + +Power connections + +An 8-pin A-coded M12 plug connector is provided for power and GPIO +connectivity. Various cabling solutions can be obtained from third +party vendors. A selection of M12 to open ended cables is provided +below. Customers are required to provide power and GPIO connections to +the cables according to the pinouts described in + +Wiring + +. The + +rc_visard NG + +'s housing must be connected to ground. + +Sensor/Actor cable M12 socket to open end + +Straight M12 socket connector to open end, shielded, 10m length: +Phoenix Contact SAC-8P-10,0-PUR/M12FS SH, Art.Nr.: 1522891 + +Angled M12 socket connector to open end, shielded 10m length: Phoenix +Contact SAC-8P-10,0-PUR/M12FR SH, Art.Nr.: 1522943 + +Sensor/Actor M12 socket for field termination + +Phoenix Contact SACC-M12FS-8CON-PG9-M, Art.Nr.:1513347 + +TE Connectivity T4110011081-000 (metal housing) + +TE Connectivity T4110001081-000 (plastic housing) + +Power supplies + +The + +rc_visard NG + + is classified as an EN-55011 Class B device and immune to light +industrial and industrial environments. For connecting the sensor to +residential grid power, a power supply under EN 55011/55022 Class B +has to be used. + +It is the customer's responsibility to obtain and install a suitable +power supply satisfying EN 61000-6-2 for permanent installation in +industrial environments. One example that satisfies both EN 61000-6-2 +and EN 55011/55022 Class B is the DIN-Rail mounted PULS MiniLine +ML60.241 24V/DC 2.5 A by PULS GmbH ( + +http://www.pulspower.com + +). A certified electrician must perform installation. + +Only one + +rc_visard NG + + shall be connected to a power supply at any time, and the total +length of cables must be less than 30 m. + +Spare parts + +No user-serviceable spare parts are currently available for + +rc_visard NG + + devices. diff --git a/v24.04/en/_sources/appendix.rst.txt b/v24.04/en/_sources/appendix.rst.txt new file mode 100644 index 0000000..d8c3f8a --- /dev/null +++ b/v24.04/en/_sources/appendix.rst.txt @@ -0,0 +1,75 @@ +Appendix + +Pose formats + +A pose consists of a translation and rotation. The translation defines +the shift along the x, y and z axes. The rotation can be defined in +many different ways. The + +rc_visard NG + + uses quaternions to define rotations and translations are given in +meters. This is called the XYZ+quaternion format. This chapter +explains the conversion between different common conventions and the +XYZ+quaternion format. + +It is quite common to define rotations in 3D by three angles that +define rotations around the three coordinate axes. Unfortunately, +there are many different ways to do that. The most common conventions +are Euler and Cardan angles (also called Tait-Bryan angles). In both +conventions, the rotations can be applied to the previously rotated +axis (intrinsic rotation) or to the axis of a fixed coordinate system +(extrinsic rotation). + +We use x, y and z to denote the three coordinate axes. x', y' and z' +refer to the axes that have been rotated one time. Similarly, x'', y'' +and z'' are the axes after two rotations. + +In the (original) Euler angle convention, the first and the third axis +are always the same. The rotation order z-x'-z'' means rotating around +the z-axis, then around the already rotated x-axis and finally around +the (two times) rotated z-axis. In the Cardan angle convention, three +different rotation axes are used, e.g. z-y'-x''. Cardan angles are +often also just called Euler angles. + +For each intrinsic rotation order, there is an equivalent extrinsic +rotation order, which is inverted, e.g. the intrinsic rotation order +z-y'-x'' is equivalent to the extrinsic rotation order x-y-z. + +Rotations around the x, y and z axes can be defined by quaternions as + + \begin{align*} r_x(\alpha) &= + \left(\begin{array}{c}\sin\frac{\alpha}{2} \\ 0 \\ 0 \\ + \cos\frac{\alpha}{2}\end{array}\right)\text{,} & r_y(\beta) &= + \left(\begin{array}{c}0 \\ \sin\frac{\beta}{2} \\ 0 \\ + \cos\frac{\beta}{2}\end{array}\right)\text{,} & r_z(\gamma) &= + \left(\begin{array}{c}0 \\ 0 \\ \sin\frac{\gamma}{2} \\ + \cos\frac{\gamma}{2}\end{array}\right)\text{,} \end{align*} + +or by rotation matrices as + + r_x(\alpha) &= \left(\begin{array}{ccc} 1 & 0 & + 0 \\ 0 & \cos\alpha & -\sin\alpha \\ 0 & \sin\alpha & + \cos\alpha \end{array}\right)\text{,} \\ r_y(\beta) &= + \left(\begin{array}{ccc} \cos\beta & 0 & \sin\beta \\ + 0 & 1 & 0 \\ -\sin\beta & 0 & \cos\beta + \end{array}\right)\text{,} \\ r_z(\gamma) &= + \left(\begin{array}{ccc} \cos\gamma & -\sin\gamma & 0 \\ + \sin\gamma & \cos\gamma & 0 \\ 0 & 0 & 1 + \end{array}\right)\text{.} + +The extrinsic rotation order x-y-z can be computed by multiplying the +individual rotations in inverse order, i.e. r_z(\gamma) r_y(\beta) +r_x(\alpha). + +Based on these definitions, the following sections explain the +conversion between common conventions and the XYZ+quaternion format. + +Note: Please be aware of units for positions and orientations. + + rc_visard NG + + devices always specify positions in meters, while most robot + manufacturers use millimeters or inches. Angles are typically + specified in degrees, but may sometimes also be given in radians. + diff --git a/v24.04/en/_sources/blaze.rst.txt b/v24.04/en/_sources/blaze.rst.txt new file mode 100644 index 0000000..8a00396 --- /dev/null +++ b/v24.04/en/_sources/blaze.rst.txt @@ -0,0 +1,508 @@ +Blaze + +The blaze module is a base module which is available on every + +rc_visard NG + + and provides disparity, confidence and error images of a connected +Basler + +blaze + + camera in an RGB-D setup, i.e. the blaze Time-of-Flight (ToF) camera +in combination with the Basler aceA1300 color camera. + +After connecting the Basler blaze sensor to the + +rc_cube + +, it can take up to about one minute until it is found. Upon first +connection of the sensor to the + +rc_cube + +, the sensor must be calibrated before it can be used. Calibration can +be done through the Web GUI on the page + +Camera calibration + + under + +Configuration + + in the respective pipeline. After storing the calibration, it will +persistently reside on the + +rc_cube + + and automatically be used whenever the sensor is connected to the + +rc_cube + + again, regardless of the port or pipeline. + +The blaze module only runs in camera pipelines of type "blaze". + +Viewing and downloading images and point clouds + +The + +rc_visard NG + + provides time-stamped disparity, error, and confidence images over +the GenICam interface (see + +Provided image streams + +). Live streams of the images are provided with reduced quality on the + +Depth Image + + page in the desired pipeline of the + +Web GUI + +. + +The Web GUI also provides the possibility to download a snapshot of +the current scene containing the depth, error and confidence images, +as well as a point cloud in ply format as described in + +Downloading depth images and point clouds + +. + +Parameters + +The blaze module is called "rc_blaze" in the REST-API and it is +represented by the + +Depth Image + + page in the desired pipeline in the + +Web GUI + +, when a Basler + +blaze + + camera is connected and running in the corresponding pipeline. The +user can change the + +blaze + + parameters there, or use the REST-API ( + +REST-API interface + +). + +Parameter overview + +This module offers the following run-time parameters: + +The rc_blaze module's run-time parameters Name Type Min +Max Default Description acquisition_mode string - - Continuous +Acquisition mode: [Continuous, SingleFrame] ambiguity_filter bool +false true true Ambiguity filter ambiguity_filter_threshold int32 +0 255 204 Ambiguity filter threshold exp_value float64 0.0001 +0.001 0.001 Exposure time of ToF camera fill int32 0 4 3 +Tolerance for hole filling in pixels gamma_correction bool false +true true Gamma correction maxdepth float64 0.01 10.0 10.0 +Maximum depth in meters minconf float64 0.0 1.0 0.00488 Minimum +confidence mindepth float64 0.1 10.0 0.1 Minimum depth in meters +outlier_removal bool false true true Outlier removal +outlier_removal_threshold int32 0 8 5 Outlier removal threshold +seg int32 0 4000 200 Minimum size of valid segments in pixels +spatial_filter bool false true true Spatial filter +temporal_filter bool false true true Temporal filter +temporal_filter_strength int32 50 255 200 Temporal filter +strength thermal_drift_correction bool false true true Thermal +drift correction + +Description of run-time parameters + +Each run-time parameter is represented by a row on the Web GUI's + +Depth Image + + page. The name in the Web GUI is given in brackets behind the +parameter name and the parameters are listed in the order they appear +in the Web GUI: + +exp_value (Exposure Time) + + This parameter is the exposure time of the + + blaze + + camera in seconds. It controls for how long the photosensitive + cells are exposed to light. If the operating mode is changed, + the exposure time is set to the recommended default value. + Reducing the exposure time may reduce measurement accuracy and + is only recommended when the image is overexposed. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?exp_value= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_blaze/parameters?exp_value= + +acquisition_mode (Acquisition Mode) + + The acquisition mode can be set to "Continuous" ( + + Continuous + + ) or "SingleFrame" ( + + Single + + ). The first one is the default and continuously provides depth + images. In single frame mode, images are only captured when the + Acquire button is clicked. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?acquisition_mode= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_blaze/parameters?acquisition_mode= + +mindepth (Minimum Distance) + + The minimum distance is the smallest distance from the camera at + which measurements should be possible. The minimum distance is + given in meters. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?mindepth= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_blaze/parameters?mindepth= + +maxdepth (Maximum Distance) + + The maximum distance is the largest distance from the camera at + which measurements should be possible. Pixels with larger distance + values are set to invalid in the disparity image. The maximum + distance is given in meters. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?maxdepth= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_blaze/parameters?maxdepth= + +fill (Fill-in) + + This option is used to fill holes in the disparity image by + interpolation. The fill-in value is the maximum allowed disparity + step on the border of the hole. Larger fill-in values can decrease + the number of holes, but the interpolated values can have larger + errors. At most 5% of pixels are interpolated. Interpolation of + small holes is preferred over interpolation of larger holes. The + confidence for the interpolated pixels is set to a low value of + 0.5. A fill-in value of 0 switches hole filling off. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?fill= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_blaze/parameters?fill= + +seg (Segmentation) + + The segmentation parameter is used to set the minimum number of + pixels that a connected disparity region in the disparity image + must fill. Isolated regions that are smaller are set to invalid in + the disparity image. Segmentation is useful for removing erroneous + disparities. However, larger values may also remove real objects. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?seg= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_blaze/parameters?seg= + +minconf (Minimum Confidence) + + The minimum confidence can be set to filter potentially false + disparity measurements. All pixels with less confidence than the + chosen value are set to invalid in the disparity image. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?minconf= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_blaze/parameters?minconf= + +spatial_filter (Spatial Filter) + + This parameter enables the spatial noise filter. The spatial noise + filter uses the values of neighboring pixels to filter out noise in + an image. It is based on the raw data of the image. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?spatial_filter= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_blaze/parameters?spatial_filter= + +temporal_filter (Temporal Filter) + + This parameter enables the temporal noise filter. The temporal + noise filter uses the values of the same pixel at different points + in time to filter out noise in an image. It is based on the depth + data of the image. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?temporal_filter= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_blaze/parameters?temporal_filter= + +temporal_filter_strength (Strength) + + This parameter represents the strength of the temporal filter. The + higher the value, the stronger the filter. High values may cause + motion artifacts, while low values reduce the efficacy of the + filter. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?temporal_filter_strength= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_blaze/parameters?temporal_filter_strength= + +outlier_removal (Outlier Removal) + + This parameter enables the outlier removal filter. It removes + pixels that differ significantly from their local environment. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?outlier_removal= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_blaze/parameters?outlier_removal= + +outlier_removal_threshold (Threshold) + + This parameter determines the strength of the outlier removal + filter. The higher the value, the more outliers will be removed. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?outlier_removal_threshold= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_blaze/parameters?outlier_removal_threshold= + +ambiguity_filter (Ambiguity Filter) + + This parameter enables the ambiguity filter. The ambiguity filter + removes pixels whose depth data is ambiguous. In certain demanding + scenes, e.g., because of stray light or multi-path effects, + detection may fail. In this case, the filter should be disabled. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?ambiguity_filter= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_blaze/parameters?ambiguity_filter= + +ambiguity_filter_threshold (Threshold) + + This parameter determines the strength of the ambiguity filter. The + higher the value, the stronger the filter. Higher values increase + the reliability of the filter. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?ambiguity_filter_threshold= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_blaze/parameters?ambiguity_filter_threshold= + +gamma_correction (Gamma Correction) + + This parameter enables gamma correction on the intensity image, + which is a nonlinear operation to lighten the dark regions of the + image. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?gamma_correction= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_blaze/parameters?gamma_correction= + +thermal_drift_correction (Thermal Drift Correction) + + This parameter activates the correction of the thermal drift. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?thermal_drift_correction= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_blaze/parameters?thermal_drift_correction= + +Status values + +This module reports the following status values: + +The rc_blaze module's status values Name Description fps +Actual frame rate of the disparity, error, and confidence images. This +value is shown in the Web GUI below the image preview as FPS (Hz). +latency Time in seconds between image acquisition and publishing of +disparity image width Current width of the disparity, error, and +confidence images in pixels height Current height of the disparity, +error, and confidence images in pixels mindepth Actual minimum +working distance in meters maxdepth Actual maximum working distance +in meters + +Services + +The Blaze module offers the following services. + +acquisition_trigger + + Signals the module to acquire a depth image, if the parameter + "acquisition_mode" is set to "SingleFrame". + + Details + + An error is returned if the "acquisition_mode" is set to + "Continuous". + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/services/acquisition_trigger + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_blaze/services/acquisition_trigger + + Request + + This service has no arguments. + + Response + + Possible return codes are shown below. + + Possible return codes of the acquisition_trigger service call. + Code Description 0 Success -8 Triggering is only possible in + SingleFrame acquisition mode 101 Trigger is ignored, because + there is a trigger call pending 102 Trigger is ignored, because + there are no subscribers + + The definition for the response with corresponding datatypes is: + + { + "name": "acquisition_trigger", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +reset_defaults + + Restores and applies the default values for this module's + parameters ("factory reset"). + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/services/reset_defaults + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_blaze/services/reset_defaults + + Request + + This service has no arguments. + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "reset_defaults", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } diff --git a/v24.04/en/_sources/cadmatch.rst.txt b/v24.04/en/_sources/cadmatch.rst.txt new file mode 100644 index 0000000..5b8eb2c --- /dev/null +++ b/v24.04/en/_sources/cadmatch.rst.txt @@ -0,0 +1,2279 @@ +CADMatch + +Introduction + +The CADMatch module is an optional module of the + +rc_visard NG + + and requires a separate CADMatch + +license + + to be purchased. + +This module provides an out-of-the-box perception solution for 3D +object detection and grasping. CADMatch targets the detection of 3D +objects based on a CAD template for picking with a general gripper. +The objects can be located in a bin or placed arbitrarily in the field +of view of the camera. + +For the CADMatch module to work, special object templates are required +for each type of object to be detected. Please get in touch with the +Roboception support ( + +Contact + +) to order a template for your CAD file. + +The CADMatch module offers: + +A dedicated page on the rc_visard NG Web GUI\:(Section \ref{webgui +:sect-web-gui}) for easy setup, configuration, testing, and +application tuning. + +A REST-API interface\:(Section \ref{rest_api:sect-rest-api}) and a +KUKA Ethernet KRL Interface\:(Section \ref{eki:sect-eki}). + +The definition of regions of interest to select relevant volumes in +the scene (see RoiDB, Section \ref{roi:sect-roi}). + +A load carrier detection functionality for bin-picking applications +(see LoadCarrier, Section \ref{loadcarrier:sect-loadcarrier}), to +provide grasps for objects inside a bin only. + +The definition of compartments inside a load carrier to provide grasps +for specific volumes of the bin only. + +The option to use user-defined object pose priors. + +Storing of up to 50 templates. + +The definition of up to 100 grasp points for each template via an +interactive visualization in the Web GUI. + +Collision checking between the gripper and the load carrier, other +detected objects and/or the point cloud. + +Collision checking between the object in the gripper and the load +carrier walls during retraction. + +Support for static and robot-mounted cameras and optional integration +with the Hand-eye calibration (Section \ref{handeye_calibration:sect- +handeye-calibration}) module, to provide grasps in the user-configured +external reference frame. + +Selection of a sorting strategy to sort the detected objects and +returned grasps. + +3D visualization of the detection results with grasp points and +gripper animations in the Web GUI. + +Setting of grasp points + +The CADMatch module detects 3D objects in a scene based on a CAD +template and returns the poses of the object origins. To use CADMatch +directly in a robot application, up to 100 grasp points can be defined +for each template. A grasp point represents the desired position and +orientation of the robot's TCP (Tool Center Point) to grasp an object. + +Please consult + +Setting of grasp points + + for further details. + +Setting grasp points in the Web GUI + +The + +rc_visard NG + + Web GUI provides an intuitive and interactive way of defining grasp +points for object templates. In a first step, the object template has +to be uploaded to the + +rc_visard NG + +. This can be done in the Web GUI in any pipeline under Modules ‣ +CADMatch by clicking on + Add a new Template in the + +Templates, Grasps and Pose Priors + + section, or in Database ‣ Templates in the + +CADMatch Templates, Grasps and Pose Priors + + section. Once the template upload is complete, a dialog with a 3D +visualization of the object template is shown for adding or editing +grasp points. The same dialog appears when editing an existing +template. + +More details are given in + +Setting grasp points in the Web GUI + +. + +Setting grasp points via the REST-API + +Grasp points can be set via the + +REST-API interface + + using the "set_grasp" or "set_all_grasps" services (see + +Internal services + +). + +More details are given in + +Setting grasp points via the REST-API + +. + +Setting of pose priors + +The CADMatch module offers the possibility to define prior poses of +the objects to be detected. If a pose prior is given, the object +detection will use this pose prior and only refine the given pose. +This speeds up the detection significantly. A pose prior represents +the approximate position and orientation of the object to be detected. +The pose can be defined in the camera or the external coordinate +frame, if a hand-eye calibration is available. + +Each pose prior consists of an "id" which must be unique within all +pose priors for an object template, the "template_id" representing the +template the pose prior applies to, the "pose" and the "pose_frame" of +the prior. Pose priors can be set via the + +REST-API interface + +, or by using the interactive visualization in the Web GUI. The Web +GUI allows to interactively position the object in the current point +cloud. This can be done in the "Pose Priors" tab during editing a +template. + +Pose priors should be used in applications where the approximate +object poses are known beforehand. The + +rc_visard NG + + can store up to 50 pose priors per template. + +Setting the preferred orientation of the TCP + +The CADMatch module determines the reachability of grasp points based +on the + +preferred orientation + + of the gripper or TCP. The preferred orientation can be set via the +"set_preferred_orientation" service call or on the + +CADMatch + + page in the Web GUI. The resulting direction of the TCP's z axis is +used to reject grasps which cannot be reached by the gripper. +Furthermore, the preferred orientation can be used to sort the +reachable grasps by setting the corresponding sorting strategy. + +The preferred orientation can be set in the camera coordinate frame or +in the external coordinate frame, in case a hand-eye calibration is +available. If the preferred orientation is specified in the external +coordinate frame and the sensor is robot mounted, the current robot +pose has to be given to each object detection call, so that the +preferred orientation can be used for filtering and, optionally, +sorting the grasps on the detected objects. If no preferred +orientation is set, the orientation of the left camera is used as the +preferred orientation of the TCP. + +Setting the sorting strategies + +The objects and grasps returned by the "detect_object" service call +are sorted according to a sorting strategy which can be chosen by the +user. The following sorting strategies are available and can be set in +the + +Web GUI + + or using the "set_sorting_strategies" service call: + +gravity: highest matches and grasp points along the gravity direction +are returned first, + +match_score: matches with the highest match score and grasp points on +objects with the highest match score are returned first, + +preferred_orientation: matches and grasp points with minimal rotation +difference between their orientation and the preferred orientation of +the TCP are returned first, + +direction: matches and grasp points with the shortest distance along a +defined direction vector in a given pose_frame are returned first. + +If no sorting strategy is set or default sorting is chosen in the Web +GUI, sorting is done based on a combination of "match_score" and the +minimal distance from the camera along the z axis of the preferred +orientation of the TCP. + +Detection of objects + +The CADMatch module requires an object template for object detection. +This template contains information about the 3D shape of the object +and prominent edges that can be visible in the camera images. CADMatch +also supports partial object templates, which contain only a specific +part of the object that can be detected well, e.g., in case of +occlusions. Furthermore, templates can require a pose prior for the +detection which is then only refined using the image data. + +The object detection is a two-stage process consisting of a prior +estimation step and a pose refinement step. First, a pose prior is +computed based on the appearance of the object in the camera images. +Second, the pose is refined by using the 3D point cloud and edges in +the camera image. For this to work, the objects to detect must be +visible in both left and right camera images. If pose priors are +given, only the pose refinement step is performed based, which +decreases runtime significantly. + +For triggering the object detection, in general, the following +information must be provided to the CADMatch module: + +The template ID of the object to be detected in the scene. + +The coordinate frame in which the poses of the detected objects and +the grasp points shall be returned (ref. Hand-eye calibration, Section +\ref{cadmatch:sect-cadmatch-hand-eye-dep}). + +Optionally, further information can be given to the CADMatch module: + +The IDs of the pose priors which approximately match the poses of the +objects to be detected. In case a template is used that requires a +pose prior, one or more pose prior IDs have to be provided. + +The ID of the load carrier which contains the items to be detected. + +A compartment inside the load carrier where to detect objects (see +Load carrier compartments, Section \ref{loadcarrier_db:sect- +loadcarrier-compartment}). + +The ID of the 3D region of interest where to search for the load +carriers if a load carrier is set. Otherwise, the ID of the 3D region +of interest where to search for the objects. + +The current robot pose in case the camera is mounted on the robot and +the chosen coordinate frame for the poses is external, or the +preferred orientation is given in the external frame, or the chosen +region of interest is defined in the external frame. + +Collision detection information: The ID of the gripper to enable +collision checking and optionally a pre-grasp offset to define a pre- +grasp position. Details on collision checking are given below in +CollisionCheck\:(Section \ref{cadmatch:sect-cadmatch-collision-check- +dep}). + +Data acquisition mode: The user can choose if a new image dataset is +acquired for the detection (default), or if the detection should be +performed on the previously used image dataset. This saves data +acquisition time, e.g. in case several detections with different +templates have to be run on the same image. + +On the Web GUI the detection can be tested in the + +Try Out + + section of the CADMatch module's page. + +The detected objects are returned in a list of "matches", sorted +according to the selected sorting strategy (see + +Setting the sorting strategies + +). Each detected object includes a "uuid" (Universally Unique +Identifier) and the "timestamp" of the oldest image that was used to +detect it. The "pose" of a detected object corresponds to the pose of +the origin of the object template used for detection. Furthermore, the +matching "score" is given to indicate the quality of the detection. + +If the chosen template also has grasp points attached (see + +Setting of grasp points + +), a list of "grasps" for all objects is returned in addition to the +list of detected objects. The grasps are sorted according to the +selected sorting strategy (see + +Setting the sorting strategies + +). The grasp poses are given in the desired coordinate frame. There +are references between the detected objects and the grasps via their +"uuids". + +For objects with a discrete symmetry (e.g. prismatic objects), all +collision-free symmetries of each grasp point which are reachable +according to the given preferred TCP orientation are returned, ordered +by the given sorting strategy. + +For objects with a continuous symmetry (e.g. cylindrical objects), all +grasps symmetric to each grasp point on an object are checked for +reachability and collisions, and only the best one according to the +given sorting strategy is returned. + +Note: The first detection call with a new object template takes + longer than the following detection calls, because the object + template has to be loaded into the CADMatch module first. To avoid + this, the "warmup_template" service can be used to load a template + so that it is ready when the first detection is triggered. + +Interaction with other modules + +Internally, the CADMatch module depends on, and interacts with other +on-board modules as listed below. + +Note: All changes and configuration updates to these modules will + affect the performance of the CADMatch modules. + +Stereo camera and Stereo matching + +The CADMatch module makes internally use of the following data: + +Rectified images from the Camera module (rc_camera, Section +\ref{stereo_camera:sect-stereo-camera}); + +Disparity, error, and confidence images from the Stereo matching +module (rc_stereomatching, Section \ref{stereo_matching:sect-stereo- +matching}). + +The "quality" parameter of the stereo matching module must be set to +"Medium" or higher (see + +Parameters + +). We recommend "Full" or "High" quality for using CADMatch. + +All processed images are guaranteed to be captured after the module +trigger time. + +IO and Projector Control + +In case the + +rc_visard NG + + is used in conjunction with an external random dot projector and the + +IO and Projector Control + + module ("rc_iocontrol"), it is recommended to connect the projector +to GPIO Out 1 and set the stereo-camera module's acquisition mode to +"SingleFrameOut1" (see + +Stereo matching parameters + +), so that on each image acquisition trigger an image with and without +projector pattern is acquired. + +Alternatively, the output mode for the GPIO output in use should be +set to "ExposureAlternateActive" (see + +Description of run-time parameters + +). + +In either case, the + +Auto Exposure Mode + + "exp_auto_mode" should be set to "AdaptiveOut1" to optimize the +exposure of both images (see + +Stereo camera parameters + +). + +Hand-eye calibration + +In case the camera has been calibrated to a robot, the CADMatch module +can automatically provide poses in the robot coordinate frame. For the +CADMatch node's + +Services + +, the frame of the output poses can be controlled with the +"pose_frame" argument. + +Two different "pose_frame" values can be chosen: + +Camera frame (camera). All poses provided by the modules are in the +camera frame, and no prior knowledge about the pose of the camera in +the environment is required. This means that the configured regions of +interest and load carriers move with the camera. It is the user's +responsibility to update the configured poses if the camera frame +moves (e.g. with a robot-mounted camera). + +External frame (external). All poses provided by the modules are in +the external frame, configured by the user during the hand-eye +calibration process. The module relies on the on-board Hand-eye +calibration module\:(Section \ref{handeye_calibration:sect-handeye- +calibration}) to retrieve the sensor mounting (static or robot +mounted) and the hand-eye transformation. If the mounting is static, +no further information is needed. If the sensor is robot-mounted, the +robot_pose is required to transform poses to and from the external +frame. + +Note: If no hand-eye calibration is available, all "pose_frame" + values should be set to "camera". + +All "pose_frame" values that are not "camera" or "external" are +rejected. + +If the sensor is robot-mounted, the current "robot_pose" has to be +provided depending on the value of "pose_frame", the definition of the +preferred TCP orientation and the sorting direction: + +If pose_frame is set to external, providing the robot pose is +obligatory. + +If the preferred TCP orientation is defined in external, providing the +robot pose is obligatory. + +If the sorting direction is defined in external, providing the robot +pose is obligatory. + +In all other cases, providing the robot pose is optional. + +LoadCarrier + +The CADMatch module uses the load carrier detection functionality +provided by the + +LoadCarrier + + module ("rc_load_carrier"), with the run-time parameters specified +for this module. However, only one load carrier will be returned and +used in case multiple matching load carriers could be found in the +scene. In case multiple load carriers of the same type are visible, a +region of interest should be set to ensure that always the same load +carrier is used for the CADMatch module. + +CollisionCheck + +Collision checking can be easily enabled for grasp computation of the +CADMatch module by passing a "collision_detection" argument to the +"detect_object" service call. It contains the ID of the used gripper +and optionally a pre-grasp offset. The gripper has to be defined in +the GripperDB module (see + +Setting a gripper + +) and details about collision checking are given in + +Collision checking within other modules + +. + +Alternatively, grasp points can be assigned individual gripper IDs, +and collision checking can be enabled for all grasp points with +gripper IDs by enabling the run-time parameter "check_collisions". + +If the selected CADMatch template contains a collision geometry and +the run-time parameter "check_collisions_with_matches" is true, also +collisions between the gripper and all other detected objects (not +limited to "max_matches") will be checked. The object on which the +grasp point to be checked is located, is excluded from the collision +check. + +If the run-time parameter "check_collisions_with_point_cloud" is true, +also collisions between the gripper and a watertight version of the +point cloud are checked. If this feature is used with suctions +grippers, it should be ensured that the TCP is defined to be outside +the gripper geometry, or that the grasp points are defined above the +object surface. Otherwise every grasp will result in a collision +between the gripper and the point cloud. + +If the run-time parameter "check_collisions_during_retraction" is true +and a load carrier and a pre-grasp offset are given, each grasp point +will be checked for collisions between the object in the gripper and +the load carrier walls during retraction. This collision check is +performed along the full linear trajectory from the grasp point back +to the pre-grasp position. + +If collision checking is enabled, only grasps which are collision free +or could not be checked for collisions (e.g. because no gripper was +given) will be returned. The result image on top of the + +CADMatch + + page of the Web GUI also shows collision-free grasps in green, +unchecked grasps in yellow and colliding grasp points in red. The +detected objects which are considered in the collision check are also +visualized with their edges in red. + +The CollisionCheck module's run-time parameters affect the collision +detection as described in + +CollisionCheck Parameters + +. + +Parameters + +The CADMatch module is called "rc_cadmatch" in the REST-API and is +represented in the + +Web GUI + + under Modules ‣ CADMatch. The user can explore and configure the +"rc_cadmatch" module's run-time parameters, e.g. for development and +testing, using the Web GUI or the + +REST-API interface + +. + +Parameter overview + +This module offers the following run-time parameters: + +The rc_cadmatch module's run-time parameters Name Type +Min Max Default Description check_collisions bool false true +false Whether to check for collisions when a gripper is defined for a +grasp check_collisions_-during_retraction bool false true false +Whether to check for collisions between the object in the gripper and +the load carrier during retraction check_collisions_with_matches +bool false true true Whether to check for collisions between +gripper and detected matches check_collisions_-with_point_cloud bool +false true false Whether to check for collisions between gripper +and point cloud edge_max_distance float64 0.5 5.0 2.0 Maximum +allowed distance in pixels between the template edges and the detected +edges in the image edge_sensitivity float64 0.05 1.0 0.5 +Sensitivity of the edge detector grasp_filter_-orientation_threshold +float64 0.0 180.0 45.0 Maximum allowed orientation change between +grasp and preferred orientation in degrees max_matches int32 1 30 +10 Maximum number of matches min_score float64 0.05 1.0 0.3 +Minimum score for matches only_highest_priority_grasps bool false +true false Whether to return only the highest priority level grasps + +Description of run-time parameters + +Each run-time parameter is represented by a row on the Web GUI's + +CADMatch + + page. The name in the Web GUI is given in brackets behind the +parameter name and the parameters are listed in the order they appear +in the Web GUI: + +max_matches (Maximum Matches) + + is the maximum number of objects to detect. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?max_matches= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?max_matches= + +min_score (Minimum Score) + + is the minimum detection score after refinement. The higher this + value, the better 2D edges and 3D point cloud must match the + given template. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?min_score= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?min_score= + +edge_sensitivity (Edge Sensitivity) + + is the sensitivity of the edge detector. The higher the value of + this parameter, the more edges will be used for pose refinement. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?edge_sensitivity= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?edge_sensitivity= + +edge_max_distance (Maximum Edge Distance) + + is the maximum allowed distance in pixels between the template + edges and the detected edges in the image during the refinement + step. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?edge_max_distance= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?edge_max_distance= + +grasp_filter_orientation_threshold (Grasp Orientation Threshold) + + is the maximum deviation of the TCP's z axis at the grasp point + from the z axis of the TCP's preferred orientation in degrees. + Only grasp points which are within this threshold are returned. + When set to zero, any deviations are valid. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?grasp_filter_orientation_threshold= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?grasp_filter_orientation_threshold= + +only_highest_priority_grasps (Only Highest Priority Grasps) + + If set to true, only grasps with the highest priority will be + returned. If collision checking is enabled, only the collision-free + grasps among the group of grasps with the highest priority are + returned. This can save computation time and reduce the number of + grasps to be parsed on the application side. + + Without collision checking, only grasps of highest priority are + returned. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?only_highest_priority_grasps= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?only_highest_priority_grasps= + +check_collisions (Check Collisions) + + If this parameter is enabled, collision checking will be + performed for all grasps which have a gripper ID assigned, even + when no default gripper is given in the "detect_object" service + call. If a load carrier is used, the collision check will always + be performed between the gripper and the load carrier. Collision + checking with the point cloud and other matches is only + performed when the corresponding runtime parameters are enabled. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?check_collisions= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?check_collisions= + +check_collisions_with_matches (Check Collisions with Matches) + + This parameter is only used when collision checking is enabled + by passing a gripper to the "detect_object" service call or by + enabling the "check_collisions" runtime parameter. If + "check_collisions_with_matches" is set to true, all grasp points + will be checked for collisions between the gripper and all other + detected objects (not limited to "max_matches"), and only grasp + points at which the gripper would not collide with any other + detected object will be returned. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?check_collisions_with_matches= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?check_collisions_with_matches= + +check_collisions_with_point_cloud (Check Collisions with Point Cloud) + + This parameter is only used when collision checking is enabled + by passing a gripper to the "detect_object" service call or by + enabling the "check_collisions" runtime parameter. If + "check_collisions_with_point_cloud" is set to true, all grasp + points will be checked for collisions between the gripper a + watertight version of the point cloud, and only grasp points at + which the gripper would not collide with this point cloud will + be returned. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?check_collisions_with_point_cloud= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?check_collisions_with_point_cloud= + +check_collisions_during_retraction (Check Collisions during +Retraction) + + This parameter is only used when collision checking is enabled + by passing a gripper to the "detect_object" service call or by + enabling the "check_collisions" runtime parameter. When + "check_collisions_during_retraction" is enabled and a load + carrier and a pre-grasp offset are given, each grasp point will + be checked for collisions between the object in the gripper and + the load carrier walls during retraction. This collision + checking is performed along the full linear trajectory from the + grasp point back to the pre-grasp position. Only collision-free + grasp points will be returned. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?check_collisions_during_retraction= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/parameters?check_collisions_during_retraction= + +Status values + +The "rc_cadmatch" module reports the following status values: + +The rc_cadmatch module's status values Name Description +data_acquisition_time Time in seconds required by the last active +service to acquire images last_timestamp_processed The timestamp of +the last processed dataset last_request_timestamp The timestamp of +the last detection request load_carrier_detection_time Processing +time of the last load carrier detection in seconds +object_detection_time Processing time of the last last object +detection in seconds processing_time Processing time of the last +detection (including load carrier detection) in seconds state The +current state of the rc_cadmatch node + +The reported "state" can take one of the following values. + +Possible states of the CADMatch module State name Description +IDLE The module is idle. RUNNING The module is running and ready +for load carrier detection and object detection. FATAL A fatal error +has occurred. + +Services + +The user can explore and call the "rc_cadmatch" module's services, +e.g. for development and testing, using the + +REST-API interface + + or the + +rc_visard NG + + +Web GUI + +. + +The CADMatch modules offer the following services. + +detect_object + + Triggers the detection of objects as described in + + Detection of objects + + based on an object template. + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/detect_object + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/services/detect_object + + Request + + Required arguments: + + "pose_frame": see + + Hand-eye calibration + + . + + "template_id": the ID of the template to be detected. + + Potentially required arguments: + + "robot_pose": see + + Hand-eye calibration + + . + + "pose_prior_ids": IDs of the pose priors for the items to be + detected. In case the chosen template requires a pose prior + for the detection, this argument must be provided. + + Optional arguments: + + "load_carrier_id": ID of the load carrier which contains the + items to be detected. + + "load_carrier_compartment": compartment inside the load carrier + where to detect items (see + + Load carrier compartments + + ). + + "region_of_interest_id": if "load_carrier_id" is set, ID of the + 3D region of interest where to search for the load carriers. + Otherwise, ID of the 3D region of interest where to search for + the objects. + + "collision_detection": see + + Collision checking within other modules + + . + + "data_acquisition_mode": if set to "CAPTURE_NEW" (default), a + new image dataset will be used for the detection. If set to + "USE_LAST" the previous dataset will be used for the detection. + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "collision_detection": { + "gripper_id": "string", + "pre_grasp_offset": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "data_acquisition_mode": "string", + "load_carrier_compartment": { + "box": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + } + }, + "load_carrier_id": "string", + "pose_frame": "string", + "pose_prior_ids": [ + "string" + ], + "region_of_interest_id": "string", + "robot_pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "template_id": "string" + } + } + + Response + + "grasps": list of grasps on the detected objects, ordered according + to the chosen sorting strategy. The "match_uuid" gives the + reference to the detected object in "matches" this grasp belongs + to. The list of returned grasps will be trimmed to the 100 best + grasps if more reachable grasps are found. Each grasp contains a + flag "collision_checked" and a "gripper_id" (see + + Collision checking within other modules + + ). + + "load_carriers": list of detected load carriers. + + "matches": list of detected objects matching the template. The + matches are ordered according to the chosen sorting strategy. The + "score" indicates how well the object matches the template. The + "grasp_uuids" refer to the grasps in "grasps" which are reachable + on this object. + + "timestamp": timestamp of the image set the detection ran on. + + "return_code": holds possible warnings or error codes and messages. + + The definition for the response with corresponding datatypes is: + + { + "name": "detect_object", + "response": { + "grasps": [ + { + "collision_checked": "bool", + "gripper_id": "string", + "id": "string", + "match_uuid": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "priority": "int8", + "timestamp": { + "nsec": "int32", + "sec": "int32" + }, + "uuid": "string" + } + ], + "load_carriers": [ + { + "height_open_side": "float64", + "id": "string", + "inner_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "outer_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "overfilled": "bool", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "rim_ledge": { + "x": "float64", + "y": "float64" + }, + "rim_step_height": "float64", + "rim_thickness": { + "x": "float64", + "y": "float64" + }, + "type": "string" + } + ], + "matches": [ + { + "grasp_uuids": [ + "string" + ], + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "score": "float32", + "template_id": "string", + "timestamp": { + "nsec": "int32", + "sec": "int32" + }, + "uuid": "string" + } + ], + "return_code": { + "message": "string", + "value": "int16" + }, + "timestamp": { + "nsec": "int32", + "sec": "int32" + } + } + } + +set_preferred_orientation + + Persistently stores the preferred orientation of the gripper to + compute the reachability of the grasps, which is used for filtering + and, optionally, sorting the grasps returned by the "detect_object" + service (see + + Setting the preferred orientation of the TCP + + ). + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/set_preferred_orientation + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/services/set_preferred_orientation + + Request + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "pose_frame": "string" + } + } + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "set_preferred_orientation", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +get_preferred_orientation + + Returns the preferred orientation of the gripper to compute the + reachability of the grasps, which is used for filtering and, + optionally, sorting the grasps returned by the "detect_object" + service (see + + Setting the preferred orientation of the TCP + + ). + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/get_preferred_orientation + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/services/get_preferred_orientation + + Request + + This service has no arguments. + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "get_preferred_orientation", + "response": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "pose_frame": "string", + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +set_sorting_strategies + + Persistently stores the sorting strategy for sorting the grasps and + matches returned by the "detect_object" service (see + + Detection of objects + + ). + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/set_sorting_strategies + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/services/set_sorting_strategies + + Request + + Only one strategy may have a "weight" greater than 0. If all + "weight" values are set to 0, the module will use the default + sorting strategy. + + If the weight for "direction" is set, the "vector" must contain the + direction vector and "pose_frame" must be either "camera" or + "external". + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "direction": { + "pose_frame": "string", + "vector": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "weight": "float64" + }, + "gravity": { + "weight": "float64" + }, + "match_score": { + "weight": "float64" + }, + "preferred_orientation": { + "weight": "float64" + } + } + } + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "set_sorting_strategies", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +get_sorting_strategies + + Returns the sorting strategy for sorting the grasps and matches + returned by the "detect_object" service (see + + Detection of objects + + ). + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/get_sorting_strategies + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/services/get_sorting_strategies + + Request + + This service has no arguments. + + Response + + All "weight" values are 0 when the module uses the default sorting + strategy. + + The definition for the response with corresponding datatypes is: + + { + "name": "get_sorting_strategies", + "response": { + "direction": { + "pose_frame": "string", + "vector": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "weight": "float64" + }, + "gravity": { + "weight": "float64" + }, + "match_score": { + "weight": "float64" + }, + "preferred_orientation": { + "weight": "float64" + }, + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +warmup_template + + Loads a template so that it is ready when the first detection with + this template is triggered. Without using this service, the first + detection with a new template takes longer than the following ones, + because the template is then loaded at the first detection. + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/warmup_template + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/services/warmup_template + + Request + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "template_id": "string" + } + } + + The "template_id" is the ID of the template to be loaded into the + CADMatch module. + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "warmup_template", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +start + + Starts the module. If the command is accepted, the module moves to + state "RUNNING". + + Details + + The "current_state" value in the service response may differ from + "RUNNING" if the state transition is still in process when the + service returns. + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/start + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/services/start + + Request + + This service has no arguments. + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "start", + "response": { + "accepted": "bool", + "current_state": "string" + } + } + +stop + + Stops the module. If the command is accepted, the module moves to + state "IDLE". + + Details + + The "current_state" value in the service response may differ from + "IDLE" if the state transition is still in process when the service + returns. + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/stop + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/services/stop + + Request + + This service has no arguments. + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "stop", + "response": { + "accepted": "bool", + "current_state": "string" + } + } + +reset_defaults + + Resets all parameters of the module to its default values, as + listed in above table. Also resets preferred orientation and + sorting strategies. The reset does not apply to templates. + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/reset_defaults + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/services/reset_defaults + + Request + + This service has no arguments. + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "reset_defaults", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +set_region_of_interest (deprecated) + + Persistently stores a 3D region of interest on the + + rc_visard NG + + . + + Details + + This service can be called as follows. + + API version 2 + + This service is not available in API version 2. Use + + set_region_of_interest + + in "rc_roi_db" instead. + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/services/set_region_of_interest + +get_regions_of_interest (deprecated) + + Returns the configured 3D regions of interest with the requested + "region_of_interest_ids". + + Details + + This service can be called as follows. + + API version 2 + + This service is not available in API version 2. Use + + get_regions_of_interest + + in "rc_roi_db" instead. + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/services/get_regions_of_interest + +delete_regions_of_interest (deprecated) + + Deletes the configured 3D regions of interest with the requested + "region_of_interest_ids". + + Details + + This service can be called as follows. + + API version 2 + + This service is not available in API version 2. Use + + delete_regions_of_interest + + in "rc_roi_db" instead. + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/services/delete_regions_of_interest + +Internal services + +The following services for configuring grasps and pose priors can +change in future without notice. Setting, retrieving and deleting +grasps and pose priors is recommended to be done via the Web GUI. + +set_grasp + + Persistently stores a grasp for the given object template on the + + rc_visard NG + + . All configured grasps are persistent over firmware updates and + rollbacks. + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/set_grasp + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/services/set_grasp + + Request + + Details for the definition of the "grasp" type are given in + + Setting of grasp points + + . + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "grasp": { + "gripper_id": "string", + "id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "priority": "int8", + "replication": { + "max_x_deg": "float64", + "min_x_deg": "float64", + "origin": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "step_x_deg": "float64" + }, + "template_id": "string" + } + } + } + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "set_grasp", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +set_all_grasps + + Replaces the list of grasps for the given object template on the + + rc_visard NG + + . + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/set_all_grasps + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/services/set_all_grasps + + Request + + Details for the definition of the "grasp" type are given in + + Setting of grasp points + + . + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "grasps": [ + { + "gripper_id": "string", + "id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "priority": "int8", + "replication": { + "max_x_deg": "float64", + "min_x_deg": "float64", + "origin": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "step_x_deg": "float64" + }, + "template_id": "string" + } + ], + "template_id": "string" + } + } + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "set_all_grasps", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +get_grasps + + Returns all configured grasps which have the requested "grasp_ids" + and belong to the requested "template_ids". + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/get_grasps + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/services/get_grasps + + Request + + If no "grasp_ids" are provided, all grasps belonging to the + requested "template_ids" are returned. If no "template_ids" are + provided, all grasps with the requested "grasp_ids" are returned. + If neither IDs are provided, all configured grasps are returned. + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "grasp_ids": [ + "string" + ], + "template_ids": [ + "string" + ] + } + } + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "get_grasps", + "response": { + "grasps": [ + { + "gripper_id": "string", + "id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "priority": "int8", + "replication": { + "max_x_deg": "float64", + "min_x_deg": "float64", + "origin": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "step_x_deg": "float64" + }, + "template_id": "string" + } + ], + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +delete_grasps + + Deletes all grasps with the requested "grasp_ids" that belong to + the requested "template_ids". + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/delete_grasps + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/services/delete_grasps + + Request + + If no "grasp_ids" are provided, all grasps belonging to the + requested "template_ids" are deleted. The "template_ids" list must + not be empty. + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "grasp_ids": [ + "string" + ], + "template_ids": [ + "string" + ] + } + } + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "delete_grasps", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +get_symmetric_grasps + + Returns all grasps that are symmetric to the given grasp. + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/get_symmetric_grasps + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/services/get_symmetric_grasps + + Request + + Details for the definition of the "grasp" type are given in + + Setting of grasp points + + . + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "grasp": { + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "replication": { + "max_x_deg": "float64", + "min_x_deg": "float64", + "origin": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "step_x_deg": "float64" + }, + "template_id": "string" + } + } + } + + Response + + The first grasp in the returned list is the one that was passed + with the service call. If the object template does not have an + exact symmetry, only the grasp passed with the service call will be + returned. If the object template has a continuous symmetry (e.g. a + cylindrical object), only 12 equally spaced sample grasps will be + returned. + + Details for the definition of the "grasp" type are given in + + Setting of grasp points + + . + + The definition for the response with corresponding datatypes is: + + { + "name": "get_symmetric_grasps", + "response": { + "grasps": [ + { + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "replication": { + "max_x_deg": "float64", + "min_x_deg": "float64", + "origin": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "step_x_deg": "float64" + }, + "template_id": "string" + } + ], + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +set_pose_prior + + Persistently stores a pose prior for the given object template on + the + + rc_visard NG + + . All configured pose priors are persistent over firmware updates + and rollbacks. + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/set_pose_prior + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/services/set_pose_prior + + Request + + Details for the definition of the "pose_prior" type are given in + + Setting of pose priors + + . + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "pose_prior": { + "id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "template_id": "string" + } + } + } + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "set_pose_prior", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +set_all_pose_priors + + Replaces the list of pose priors for the given object template on + the + + rc_visard NG + + . + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/set_all_pose_priors + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/services/set_all_pose_priors + + Request + + Details for the definition of the "pose_prior" type are given in + + Setting of pose priors + + . + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "pose_priors": [ + { + "id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "template_id": "string" + } + ], + "template_id": "string" + } + } + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "set_all_pose_priors", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +get_pose_priors + + Returns all configured pose priors which have the requested + "pose_prior_ids" and belong to the requested "template_ids". + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/get_pose_priors + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/services/get_pose_priors + + Request + + If no "pose_prior_ids" are provided, all pose priors belonging to + the requested "template_ids" are returned. If no "template_ids" are + provided, all pose priors with the requested "pose_prior_ids" are + returned. If neither IDs are provided, all configured pose priors + are returned. + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "pose_prior_ids": [ + "string" + ], + "template_ids": [ + "string" + ] + } + } + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "get_pose_priors", + "response": { + "pose_priors": [ + { + "id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "template_id": "string" + } + ], + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +delete_pose_priors + + Deletes all pose priors with the requested "pose_prior_ids" that + belong to the requested "template_ids". + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_cadmatch/services/delete_pose_priors + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_cadmatch/services/delete_pose_priors + + Request + + If no "pose_prior_ids" are provided, all pose priors belonging to + the requested "template_ids" are deleted. The "template_ids" list + must not be empty. + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "pose_prior_ids": [ + "string" + ], + "template_ids": [ + "string" + ] + } + } + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "delete_pose_priors", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +Return codes + +Each service response contains a "return_code", which consists of a +"value" plus an optional "message". A successful service returns with +a "return_code" value of "0". Negative "return_code" values indicate +that the service failed. Positive "return_code" values indicate that +the service succeeded with additional information. The smaller value +is selected in case a service has multiple "return_code" values, but +all messages are appended in the "return_code" message. + +The following table contains a list of common codes: + +Return codes of the CADMatch services Code Description 0 +Success -1 An invalid argument was provided. -2 An internal error +occurred. -3 An internal timeout occurred. -4 Data acquisition +took longer than allowed. -8 Not applicable, stereo quality must be +at least Medium. -9 No valid license for the module. -10 New +element could not be added as the maximum storage capacity of load +carriers or regions of interest has been exceeded. -11 Sensor not +connected, not supported or not ready. 10 The maximum storage +capacity of load carriers or regions of interest has been reached. 11 +Existing data was overwritten. 100 The requested load carrier was +not detected in the scene. 101 None of the detected grasps is +reachable. 102 The detected load carrier is empty. 103 All +detected grasps are in collision. 106 The list of returned grasps +has been trimmed to the 100 best grasps. 110 Hints for setting up +the application, e.g. reducing the distance from the camera, setting a +region of interest. 114 No gripper was found for collision checking. +115 Collision checking during retraction was skipped, e.g. because no +load carrier or no pre-grasp offset were given. 151 The object +template has a continuous symmetry. 152 The objects are outside the +given region of interest, outside the load carrier or outside the +image. 153 No edges could be detected in the camera image. Check the +Edge Sensitivity. 999 Additional hints for application development + +Template API + +For template upload, download, listing and removal, special REST-API +endpoints are provided. Templates can also be uploaded, downloaded and +removed via the Web GUI. The templates include the grasp points and +pose priors, if grasp points or pose priors have been configured. Up +to 50 templates can be stored persistently on the + +rc_visard NG + +. diff --git a/v24.04/en/_sources/camera_calibration.rst.txt b/v24.04/en/_sources/camera_calibration.rst.txt new file mode 100644 index 0000000..81fd4c5 --- /dev/null +++ b/v24.04/en/_sources/camera_calibration.rst.txt @@ -0,0 +1,337 @@ +Camera calibration + +The camera calibration module is a base module which is available on +every + +rc_visard NG + +. + +To use the camera as measuring instrument, camera parameters such as +focal length, lens distortion, and the relationship of the cameras to +each other must be exactly known. The parameters are determined by +calibration and used for image rectification (see + +Rectification + +), which is the basis for all other image processing modules. + +The + +rc_visard NG + + is calibrated at production time. Nevertheless, checking calibration +and recalibration might be necessary if the + +rc_visard NG + + was exposed to strong mechanical impact. + +The camera calibration module is responsible for checking calibration +and calibrating. + +Self-calibration + +The camera calibration module automatically runs in self-calibration +mode at a low frequency in the background. In this mode, the + +rc_visard NG + + observes the alignment of image rows of both rectified images. A +mechanical impact, such as one caused by dropping the + +rc_visard NG + +, might result in a misalignment. If a significant misalignment is +detected, then it is automatically corrected. After each reboot and +after each correction, the current self-calibration offset is reported +in the camera module's log file (see + +Downloading log files + +) as: + + "rc_stereocalib: Current self-calibration offset is 0.00, update + counter is 0" + +The update counter is incremented after each automatic correction. It +is reset to 0 after manual recalibration of the + +rc_visard NG + +. + +Under normal conditions, such as the absence of mechanical impact on +the + +rc_visard NG + +, self-calibration should never occur. Self-calibration allows the + +rc_visard NG + + to work normally even after misalignment is detected, since it is +automatically corrected. Nevertheless, checking camera calibration +manually is recommended if the update counter is not 0. + +Calibration process + +Manual calibration can be done through the + +Web GUI + + under Configuration ‣ Camera Calibration. This page provides a +wizard to guide the user through the calibration process. + +Note: Camera calibration is normally unnecessary for the + + rc_visard NG + + since it is calibrated at production time. Therefore, calibration + is only required after strong mechanical impacts, such as occur when + dropping the + + rc_visard NG + + . + +During calibration, the calibration grid must be detected in different +poses. When holding the calibration grid, make sure that all black +squares of the grid are completely visible and not occluded in both +camera images. A green check mark overlays each correctly detected +square. The correct detection of the grid is only possible if all of +the black squares are detected. Some of the squares not being +detected, or being detected only briefly might indicate bad lighting +conditions, or a damaged grid. Squares in overexposed parts of the +calibration grid are highlighted in red. In this case, the lighting +conditions or exposure setting must be adjusted. A thick green border +around the calibration grid indicates that it was detected correctly +in both camera images. + +Calibration settings + +The quality of camera calibration heavily depends on the quality of +the calibration grid. Calibration grids can be obtained from +Roboception. + + +In the first step, the calibration grid must be specified. The + +Next + + button proceeds to the next step. + +Verify calibration + +In the next step, the current calibration can be verified. To perform +the verification, the grid must be held such that it is simultaneously +visible in both cameras. When the grid is detected, the calibration +error is automatically computed and the result is displayed on the +screen. + + +Note: To compute a meaningful calibration error, the grid should be + held as close as possible to the cameras. If the grid only covers a + small section of the camera images, the calibration error will + always be less than when the grid covers the full image. For this + reason, the minimal and maximal calibration error during + verification are shown in addition to the calibration error at the + current grid position. + +The typical calibration error is below 0.2 pixels. If the error is in +this range, then the calibration procedure can be skipped. If the +calibration error is greater, the calibration procedure should be +performed to guarantee full sensor performance. The button + +Next + + starts the procedure. + +Warning: A large error during verification can be due to + miscalibrated cameras, an inaccurate calibration grid, or wrong grid + width or height. In case you use a custom calibration grid, please + make sure that the grid is accurate and the entered grid width and + height are correct. Otherwise, manual calibration will actually + decalibrate the cameras! + +Calibrate + +The camera's exposure time should be set appropriately before starting +the calibration. To achieve good calibration results, the images +should be well-exposed and motion blur should be avoided. Thus, the +maximum auto-exposure time should be as short as possible, but still +allow a good exposure. The current exposure time is displayed below +the camera images as shown in + +Fig. 44 + +. + +Full calibration consists of calibrating each camera individually +(monocalibration) and then performing a stereo calibration to +determine the relationship between them. In most cases, the intrinsic +calibration of each camera does not get corrupted. For this reason, +monocalibration is skipped by default during a recalibration, but can +be performed by clicking Perform Monocalibration in the + +Calibrate + + tab. This should only be done if the result of the stereo calibration +is not satisfactory. + +Stereo calibration + +During stereo calibration, both cameras are calibrated to each other +to find their relative rotation and translation. + +The camera images can also be displayed mirrored to simplify the +correct positioning of the calibration grid. + +First, the grid should be held as close as possible to the camera and +very still. It must be fully visible in both images and the cameras +should look perpendicularly onto the grid. If the grid is not +perpendicular to the line of sight of the cameras, this will be +indicated by small green arrows pointing to the expected positions of +the grid corners (see + +Fig. 43 + +). + + +The grid must be kept very still for detection. If motion blur occurs, +the grid will not be detected. All grid cells that are drawn onto the +image have to be covered by the calibration grid. This is visualized +by filling the covered cells in green (see + +Fig. 44 + +). + +For the + +rc_visard NG + + all cells can be covered at once by holding the grid close enough. + + +Note: If the check marks on the calibration grid all vanish, then + either the camera does not look perpendicularly onto the grid, or + the grid is too far away from the camera. + +Once all grid cells are covered, they disappear and a single far cell +is visualized. Now, the grid should be held as far as possible from +the cameras, so that the small cell is covered. Arrows will indicate +if the grid is still too close to the camera. When the grid is +successfully detected at the far pose, the cell is filled in green and +the result can be computed (see + +Fig. 45 + +). + + +If stereo calibration yields an unsatisfactory calibration error, then +calibration should be repeated with monocalibration (see next Section + +Monocalibration + +). + +Monocalibration + +Monocalibration is the intrinsic calibration of each camera +individually. Since the intrinsic calibration normally does not get +corrupted, the monocalibration should only be performed if the result +of stereo calibration is not satisfactory. + +Click Perform Monocalibration in the + +Calibrate + + tab to start monocalibration. + +For monocalibration, the grid has to be held in certain poses. The +arrows from the grid corners to the green areas indicate that all grid +corners should be placed inside the green areas. The green areas are +called sensitive areas. The + +Size of Sensitive Area + + slider can control their size to ease calibration. However, please be +aware that increasing their size too much may result in slightly lower +calibration accuracy. + +Holding the grid upside down is a common mistake made during +calibration. Spotting this in this case is easy because the green +lines from the grid corners into the green areas will cross each other +as shown in + +Fig. 46 + +. + + +Note: Calibration might appear cumbersome as it involves holding the + grid in certain predefined poses. However, these poses are required + to ensure an unbiased, high-quality calibration result. + +The monocalibration process involves five poses for each camera as +shown in + +Fig. 47 + +. + + +After the corners or sides of the grid are placed on top of the +sensitive areas, the process automatically shows the next pose +required. When the process is finished for the left camera, the same +procedure is repeated for the right one. + +Continue with the guidelines given in the previous Section + +Stereo calibration + +. + +Storing the calibration result + +Clicking the Compute Calibration button finishes the process and +displays the final result. The indicated result is the mean +reprojection error of all calibration points. It is given in pixels +and typically has a value below 0.2. + +Pressing Save Calibration applies the calibration and saves it to the +device. + +Note: The given result is the minimum error left after calibration. + The real error is definitely not less than this, but could in theory + be larger. This is true for every camera-calibration algorithm and + the reason why we enforce holding the grid in very specific poses. + Doing so ensures that the real calibration error cannot + significantly exceed the reported error. + +Warning: If a hand-eye calibration was stored on the + + rc_visard NG + + before camera calibration, the hand-eye calibration values could + have become invalid. Please repeat the hand-eye calibration + procedure. + +Parameters + +The module is called "rc_stereocalib" in the REST-API. + +Note: The camera calibration module's available parameters and + status values are for internal use only and may change in the future + without further notice. Calibration should only be performed through + the Web GUI as described above. + +Services + +Note: The camera calibration module's available service calls are + for internal use only and may change in the future without further + notice. Calibration should only be performed through the Web GUI as + described above. diff --git a/v24.04/en/_sources/camera_modules.rst.txt b/v24.04/en/_sources/camera_modules.rst.txt new file mode 100644 index 0000000..26f9e3d --- /dev/null +++ b/v24.04/en/_sources/camera_modules.rst.txt @@ -0,0 +1,39 @@ +3D camera modules + +The + +rc_visard NG + +'s 3D camera software consists of the following modules: + +Camera (rc_camera, Section \ref{stereo_camera:sect-stereo-camera}) +acquires image pairs and performs planar rectification for using the +camera as a measurement device. Images are provided both for further +internal processing by other modules and for external use as GenICam +image streams. + +Stereo matching (rc_stereomatching, Section \ref{stereo_matching:sect- +stereo-matching}) uses the rectified stereo image pairs to compute 3D +depth information such as disparity, error, and confidence images. +These are provided as GenICam streams, too. + +The + +Camera + + and the + +Stereo matching + + modules, which acquire image pairs and compute 3D depth information +such as disparity, error, and confidence images, are also accessible +via the + +rc_visard NG + +'s + +GigE Vision/GenICam interface + +. + diff --git a/v24.04/en/_sources/collisioncheck.rst.txt b/v24.04/en/_sources/collisioncheck.rst.txt new file mode 100644 index 0000000..399b792 --- /dev/null +++ b/v24.04/en/_sources/collisioncheck.rst.txt @@ -0,0 +1,625 @@ +CollisionCheck + +Introduction + +The CollisionCheck module is an optional on-board module of the + +rc_visard NG + + and is licensed with any of the modules + +ItemPick and BoxPick + + or + +SilhouetteMatch + +. Otherwise it requires a separate CollisionCheck + +license + + to be purchased. + +The module provides an easy way to check if a gripper is in collision +with a load carrier, or other detected objects (only in combination +with + +SilhouetteMatch + +). It is integrated with the + +ItemPick and BoxPick + + and + +SilhouetteMatch + + modules, but can be used as standalone product. The models of the +grippers for collision checking have to be defined in the + +GripperDB + + module. + +Warning: Collisions are checked only between the load carrier and + the gripper, not the robot itself, the flange, other objects or the + item located in the robot gripper. Only in combination with + + SilhouetteMatch + + , and only in case the selected template contains a collision + geometry and "check_collisions_with_matches" is enabled in the + respective detection module, also collisions between the gripper and + other + + detected + + objects will be checked. Collisions with objects that cannot be + detected will not be checked. Only in combination with + + SilhouetteMatch + + and only if "check_collisions_with_point_cloud" is enabled in the + respective detection module, collisions between the gripper and a + watertight version of the point cloud will be checked. + +Specifications of the CollisionCheck module Collision checking +with detected load carrier, detected objects (only +SilhouetteMatch\:(Section \ref{silhouettematch:sect- +silhouettematch})), baseplane (only SilhouetteMatch, Section +\ref{silhouettematch:sect-silhouettematch}) Collision checking +available in ItemPick and BoxPick\:(Section \ref{itempick:sect- +itempick}), SilhouetteMatch\:(Section \ref{silhouettematch:sect- +silhouettematch}) + +Collision checking + +Stand-alone collision checking + +The "check_collisions" service call triggers collision checking +between the chosen gripper and the provided load carriers for each of +the provided grasps. Checking collisions with other objects is not +possible with the stand-alone "check_collisions" service. The +CollisionCheck module checks if the chosen gripper is in collision +with at least one of the load carriers, when the TCP of the gripper is +positioned in the grasp position. It is possible to check the +collision with multiple load carriers simultaneously. The grasps which +are in collision with any of the defined load carriers will be +returned as colliding. + +The "pre_grasp_offset" can be used for additional collision checking. +The pre-grasp offset P_{off} is the offset between the grasp point +P_{grasp} and the pre-grasp position P_{pre} in the grasp's coordinate +frame (see + +Fig. 40 + +). If the pre-grasp offset is defined, the grasp will be detected as +colliding if the gripper is in collision at any point during motion +from the pre-grasp position to the grasp position (assuming a linear +movement). + + +Collision checking within other modules + +Collision checking is integrated in the following modules' services: + +ItemPick and BoxPick\:(Section \ref{itempick:sect-itempick}): +compute_grasps (see compute_grasps for ItemPick, Section \ref{itempick +:expl-itempick-srv-compute-grasps} and compute_grasps for BoxPick, +Section \ref{itempick:expl-itempick-srv-compute-grasps-boxpick}) + +SilhouetteMatch\:(Section \ref{silhouettematch:sect-silhouettematch}): +detect_object (see detect_object, Section \ref{silhouettematch:expl- +silhouettematch-srv-detect-objects}) + +Each of these services can take a "collision_detection" argument +consisting of the "gripper_id" of the default gripper and the +"pre_grasp_offset" as described in the previous section + +Stand-alone collision checking + +. The default gripper given by the "gripper_id" argument is only used +for grasp points which do not have an individual gripper ID assigned. +When the "collision_detection" argument is given, these services only +return the grasps at which the gripper is not in collision or which +could not be checked for collisions. When a load carrier ID is +provided to these services, collision checking will always be +performed between the gripper and the load carrier. Additional +collision check features can be enabled depending on the module. + +Only for + +SilhouetteMatch + +, and only in case the selected template contains a collision geometry +and "check_collisions_with_matches" is enabled in the respective +detection module, grasp points at which the gripper would be in +collision with other + +detected + + objects are also rejected. The object on which the grasp point to be +checked is located, is excluded from the collision check. + +When a gripper is defined for a grasp point in the object template for + +SilhouetteMatch + +, then this gripper will be used for collision checking at that +specific grasp point instead of the default gripper defined in the +"collision_detection" argument of the "detect_object" service (see + +Setting of grasp points + +). The grasps returned by the "detect_object" service contain a flag +"collision_checked", indicating whether the grasp was checked for +collisions, and the field "gripper_id". If "collision_checked" is +true, the returned "gripper_id" contains the ID of the gripper that +was used for the collision check. That is the ID of the gripper +defined for that specific grasp, or, if empty, the gripper that was +given in the "collision_detection" argument of the request. If +"collision_checked" is false, the returned "gripper_id" is the gripper +ID that was defined for that grasp. + +In + +SilhouetteMatch + +, collisions between the gripper and the base plane can be checked, if +"check_collisions_with_base_plane" is enabled in SilhouetteMatch. + +Collisions between the gripper and a watertight version of the point +cloud can be checked in + +SilhouetteMatch + + if "check_collisions_with_point_cloud" is enabled in the respective +module. + +Warning: Collisions are checked only between the load carrier and + the gripper, not the robot itself, the flange or other objects. Only + in combination with + + SilhouetteMatch + + , and only in case the selected template contains a collision + geometry and "check_collisions_with_matches" is enabled in the + respective detection module, also collisions between the gripper and + other + + detected + + objects are checked. Collisions with objects that cannot be + detected will not be checked. Only in combination with + + SilhouetteMatch + + , and only if "check_collisions_with_point_cloud" is enabled, + collisions between the gripper and a watertight version of the point + cloud are checked. + +The collision-check results are affected by run-time parameters, which +are listed and explained further below. + +Parameters + +The CollisionCheck module is called "rc_collision_check" in the REST- +API and is represented in the + +Web GUI + + under Configuration ‣ CollisionCheck. The user can explore and +configure the "rc_collision_check" module's run-time parameters, e.g. +for development and testing, using the Web GUI or the + +REST-API interface + +. + +Parameter overview + +This module offers the following run-time parameters: + +The rc_collision_check module's run-time parameters Name +Type Min Max Default Description check_bottom bool false true +true Whether to enable collision checking with the bottom of the load +carrier check_flange bool false true true Whether all grasps +with the flange inside the load carrier should be marked as colliding +collision_dist float64 0.0 0.1 0.01 Minimum distance in meters +between any element of the gripper and the load carrier or the base +plane (only SilhouetteMatch) for a collision-free grasp + +Description of run-time parameters + +Each run-time parameter is represented by a row in the Web GUI's + +Settings + + section under Configuration ‣ CollisionCheck. The name in the Web +GUI is given in brackets behind the parameter name: + +collision_dist (Collision Distance) + + Minimal distance in meters between any part of the gripper and the + load carrier and/or the base plane (only SilhouetteMatch) for a + grasp to be considered collision free. + + Note: The collision distance is not applied when checking + collisions between the gripper and other detected objects. It is + not applied when checking if the flange is inside the load + carrier ("check_flange"), either. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_collision_check/parameters?collision_dist= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_collision_check/parameters?collision_dist= + +check_flange (Check Flange) + + Performs an additional safety check as described in + + Robot flange radius + + . If this parameter is set, all grasps in which any part of the + robot's flange is inside the load carrier are marked as colliding. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_collision_check/parameters?check_flange= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_collision_check/parameters?check_flange= + +check_bottom (Check Bottom) + + When this check is enabled the collisions will be checked not only + with the side walls of the load carrier but also with its bottom. + It might be necessary to disable this check if the TCP is inside + the collision geometry (e.g. is defined inside a suction cup). + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_collision_check/parameters?check_bottom= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_collision_check/parameters?check_bottom= + +Status values + +The "rc_collision_check" module reports the following status values: + +The rc_collision_check module status values Name Description +last_evaluated_grasps Number of evaluated grasps +last_collision_free_grasps Number of collision-free grasps +collision_check_time Collision checking runtime + +Services + +The user can explore and call the "rc_collision_check" module's +services, e.g. for development and testing, using + +REST-API interface + + or the + +rc_visard NG + + +Web GUI + +. + +The CollisionCheck module offers the following services. + +reset_defaults + + Resets all parameters of the module to its default values, as + listed in above table. + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_collision_check/services/reset_defaults + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_collision_check/services/reset_defaults + + Request + + This service has no arguments. + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "reset_defaults", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +check_collisions (deprecated) + + Triggers a collision check between a gripper and a load carrier. + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_collision_check/services/check_collisions + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_collision_check/services/check_collisions + + Request + + Required arguments: + + "grasps": list of grasps that should be checked. + + "load_carriers": list of load carriers against which the + collision should be checked. The fields of the load carrier + definition are described in + + Detection of load carriers + + . The position frame of the grasps and load carriers has to be + the same. + + "gripper_id": the id of the gripper that is used to check the + collisions. The gripper has to be configured beforehand. + + Optional arguments: + + "pre_grasp_offset": the offset in meters from the grasp position + to the pre-grasp position in the grasp frame. If this argument + is set, the collisions will not only be checked in the grasp + point, but also on the path from the pre-grasp position to the + grasp position (assuming a linear movement). + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "grasps": [ + { + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "uuid": "string" + } + ], + "gripper_id": "string", + "load_carriers": [ + { + "id": "string", + "inner_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "outer_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "rim_thickness": { + "x": "float64", + "y": "float64" + } + } + ], + "pre_grasp_offset": { + "x": "float64", + "y": "float64", + "z": "float64" + } + } + } + + Response + + "colliding_grasps": list of grasps in collision with one or more + load carriers. + + "collision_free_grasps": list of collision-free grasps. + + "return_code": holds possible warnings or error codes and messages. + + The definition for the response with corresponding datatypes is: + + { + "name": "check_collisions", + "response": { + "colliding_grasps": [ + { + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "uuid": "string" + } + ], + "collision_free_grasps": [ + { + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "uuid": "string" + } + ], + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +set_gripper (deprecated) + + Persistently stores a gripper on the + + rc_visard NG + + . + + API version 2 + + This service is not available in API version 2. Use + + set_gripper + + in "rc_gripper_db" instead. + + API version 1 (deprecated) + + This service can be called as follows. + + PUT http:///api/v1/nodes/rc_collision_check/services/set_gripper + + The definitions of the request and response are the same as + described in + + set_gripper + + in "rc_gripper_db". + +get_grippers (deprecated) + + Returns the configured grippers with the requested "gripper_ids". + + API version 2 + + This service is not available in API version 2. Use + + get_grippers + + in "rc_gripper_db" instead. + + API version 1 (deprecated) + + This service can be called as follows. + + PUT http:///api/v1/nodes/rc_collision_check/services/get_grippers + + The definitions of the request and response are the same as + described in + + get_grippers + + in "rc_gripper_db". + +delete_grippers (deprecated) + + Deletes the configured grippers with the requested "gripper_ids". + + API version 2 + + This service is not available in API version 2. Use + + delete_grippers + + in "rc_gripper_db" instead. + + API version 1 (deprecated) + + This service can be called as follows. + + PUT http:///api/v1/nodes/rc_collision_check/services/delete_grippers + + The definitions of the request and response are the same as + described in + + delete_grippers + + in "rc_gripper_db". + +Return codes + +Each service response contains a "return_code", which consists of a +"value" plus an optional "message". A successful service returns with +a "return_code" value of "0". Negative "return_code" values indicate +that the service failed. Positive "return_code" values indicate that +the service succeeded with additional information. The smaller value +is selected in case a service has multiple "return_code" values, but +all messages are appended in the "return_code" message. + +The following table contains a list of common codes: + +Return codes of the CollisionCheck services Code Description 0 +Success -1 An invalid argument was provided -7 Data could not be +read or written to persistent storage -9 No valid license for the +module -10 New gripper could not be added as the maximum storage +capacity of grippers has been exceeded 10 The maximum storage +capacity of grippers has been reached 11 Existing gripper was +overwritten diff --git a/v24.04/en/_sources/concept_stereo.rst.txt b/v24.04/en/_sources/concept_stereo.rst.txt new file mode 100644 index 0000000..50855ad --- /dev/null +++ b/v24.04/en/_sources/concept_stereo.rst.txt @@ -0,0 +1,78 @@ +Stereo vision + +In + +stereo vision + +, 3D information about a scene can be extracted by comparing two +images taken from different viewpoints. The main idea behind using a +camera pair for measuring depth is the fact that object points appear +at different positions in the two camera images depending on their +distance from the camera pair. Very distant object points appear at +approximately the same position in both images, whereas very close +object points occupy different positions in the left and right camera +image. The object points' displacement in the two images is called + +disparity + +. The larger the disparity, the closer the object is to the camera. +The principle is illustrated in + +Fig. 14 + +. + + +Stereo vision is a form of passive sensing, meaning that it emits +neither light nor other signals to measure distances, but uses only +light that the environment emits or reflects. Thus, the Roboception +products utilizing this sensing principle can work indoors and +outdoors and multiple devices can work together without interferences. + +To compute the 3D information, the stereo matching algorithm must be +able to find corresponding object points in the left and right camera +images. For this, the algorithm requires texture, meaning changes in +image intensity values due to patterns or the objects' surface +structure, in the images. Stereo matching is not possible for +completely untextured regions, such as a flat white wall without any +visible surface structure. The stereo matching method used by the + +rc_visard NG + + is + +SGM + + ( + +Semi-Global Matching + +), which provides the best trade-off between runtime and accuracy, +even for fine structures. + +The following software modules are required to compute 3D information: + +Camera: This module is responsible for capturing synchronized image +pairs and transforming them into images approaching those taken by an +ideal camera (rectification). + +Stereo matching: This module computes disparities for the rectified +stereo image pair using SGM\:(Section \ref{stereo_matching:sect- +stereo-matching}). + +For stereo matching, the position and orientation of the left and +right cameras relative to each other has to be known with very high +accuracy. This is achieved by calibration. The + +rc_visard NG + +'s cameras are pre-calibrated during production. However, if the + +rc_visard NG + + has been decalibrated, during transport for example, then the user +has to recalibrate the stereo camera: + +Camera calibration: This module enables the user to recalibrate the +rc_visard NG's stereo camera\:(Section \ref{camera_calibration:sect- +camera-calibration}). diff --git a/v24.04/en/_sources/concepts.rst.txt b/v24.04/en/_sources/concepts.rst.txt new file mode 100644 index 0000000..713d9b2 --- /dev/null +++ b/v24.04/en/_sources/concepts.rst.txt @@ -0,0 +1,17 @@ +Measurement principles + +The + +rc_visard NG + + is a self-registering 3D camera. It provides rectified camera, +disparity, confidence, and error images, which enable the viewed +scene's depth values along with their uncertainties to be computed. +Furthermore, the motion of visual features in the images is combined +with acceleration and turn-rate measurements at a high rate, which +enables the sensor to provide real-time estimates of its current pose, +velocity, and acceleration. + +In the following, the underlying measurement principles are explained +in more detail. + diff --git a/v24.04/en/_sources/configuration_modules.rst.txt b/v24.04/en/_sources/configuration_modules.rst.txt new file mode 100644 index 0000000..8b14598 --- /dev/null +++ b/v24.04/en/_sources/configuration_modules.rst.txt @@ -0,0 +1,34 @@ +Configuration modules + +The + +rc_visard NG + + provides several configuration modules which enable the user to +configure the + +rc_visard NG + + for specific applications. + +The configuration modules are: + +Hand-eye calibration (rc_hand_eye_calibration, Section +\ref{handeye_calibration:sect-handeye-calibration}) enables the user +to calibrate the camera with respect to a robot, either via the Web +GUI or the REST-API. + +CollisionCheck (rc_collision_check, Section \ref{collisioncheck:sect- +collision}) provides an easy way to check if a gripper is in +collision. + +Camera calibration (rc_stereocalib, Section \ref{camera_calibration +:sect-camera-calibration}) enables the user to check and perform +camera calibration via the WEB GUI\:(Section \ref{webgui:sect-web- +gui}). + +IO and Projector Control (rc_iocontrol, Section \ref{iocontrol:sect- +iocontrol}) provides control over the sensor's general purpose inputs +and outputs with special modes for controlling an external random dot +projector. + diff --git a/v24.04/en/_sources/contact.rst.txt b/v24.04/en/_sources/contact.rst.txt new file mode 100644 index 0000000..8b9f5b7 --- /dev/null +++ b/v24.04/en/_sources/contact.rst.txt @@ -0,0 +1,39 @@ +Contact + +Support + +For support issues, please see + +http://www.roboception.com/support + + or contact + +support@roboception.de + +. + +Downloads + +Software SDKs, etc. can be downloaded from + +http://www.roboception.com/download + +. + +Address + + Roboception GmbH + Kaflerstrasse 2 + 81241 Munich + Germany + + Web: + http://www.roboception.com + + + Email: + info@roboception.de + + + Phone: +49 89 889 50 79-0 + diff --git a/v24.04/en/_sources/database_modules.rst.txt b/v24.04/en/_sources/database_modules.rst.txt new file mode 100644 index 0000000..4a68a96 --- /dev/null +++ b/v24.04/en/_sources/database_modules.rst.txt @@ -0,0 +1,27 @@ +Database modules + +The + +rc_visard NG + + provides several database modules which enable the user to configure +global data which is used in many detection modules, such as load +carriers and regions of interest. Via the + +REST-API interface + + the database modules are only available in API version 2. + +The database modules are: + +LoadCarrierDB (rc_load_carrier_db, Section \ref{loadcarrier_db:sect- +loadcarrier-db}) allows setting, retrieving and deleting load +carriers. + +RoiDB (rc_roi_db\:, Section \ref{roi:sect-roi}) allows setting, +retrieving and deleting 2D and 3D regions of interest. + +GripperDB (rc_gripper_db, Section \ref{gripper_db:sect-gripper-db}) +allows setting, retrieving and deleting grippers for collision +checking. + diff --git a/v24.04/en/_sources/detection_modules.rst.txt b/v24.04/en/_sources/detection_modules.rst.txt new file mode 100644 index 0000000..6a0c045 --- /dev/null +++ b/v24.04/en/_sources/detection_modules.rst.txt @@ -0,0 +1,32 @@ +Detection modules + +The + +rc_visard NG + + offers software modules for different detection applications: + +LoadCarrier (rc_load_carrier, Section \ref{loadcarrier:sect- +loadcarrier}) allows detecting load carriers and their filling +levels. + +TagDetect (rc_april_tag_detect and rc_qr_code_detect, Section +\ref{tagdetect:sect-tag-detection}) allows the detection of AprilTags +and QR codes, as well as the estimation of their poses. + +ItemPick and BoxPick (rc_itempick and rc_boxpick, Section +\ref{itempick:sect-itempick}) provides an out-of-the-box perception +solution for robotic pick-and-place applications of unknown objects or +boxes. + +SilhouetteMatch (rc_silhouettematch, Section \ref{silhouettematch +:sect-silhouettematch}) provides an object detection solution for +objects placed on a plane or stacked planar objects. + +These modules are optional and can be activated by purchasing a +separate + +license + +. + diff --git a/v24.04/en/_sources/disposal.rst.txt b/v24.04/en/_sources/disposal.rst.txt new file mode 100644 index 0000000..7dee399 --- /dev/null +++ b/v24.04/en/_sources/disposal.rst.txt @@ -0,0 +1,43 @@ +Information on disposal + + +Disposal of Waste Electrical & Electronic Equipment This symbol on +the product(s) and / or accompanying documents means that used +electrical and electronic products should not be mixed with general +household waste. For proper treatment, recovery and recycling, please +contact your supplier or the manufacturer. Disposing of this product +correctly will help save valuable resources and prevent any potential +negative effects on human health and the environment, which could +otherwise arise from inappropriate waste handling. + +Removal of batteries If the products contain batteries and +accumulators that can be removed from the product without destruction, +these must be removed before disposal and disposed of separately as +batteries. The following batteries or accumulators are contained in +the rc_visard: None + +Options for returning old equipment Owners of old devices can return +them to the manufacturer to ensure proper disposal. Please contact +support\:(Section \ref{contact:sect-contact}) about returning the +device for disposal. + +Data protection End users of Electrical & Electronic Equipment are +responsible for deleting personal data on the waste equipment to be +disposed of. + +WEEE registration number Roboception is registered under the +registration number DE 33323989 at the stiftung elektro-altgeräte +register, Nordostpark 72, 90411 Nuremberg, Germany, as a producer of +electrical and/or electronic equipment. + +Collection and recovery quotas According to the WEEE Directive, EU +member states are obliged to collect data on waste electrical and +electronic equipment and to transmit this data to the European +Commission. Further information can be found on the German Ministry +for the Environment website. + +Information on Disposal outside the European Union + +This symbol is valid only in the European Union. If you wish to +discard this product please contact your local authorities or dealer +and ask for the correct method of disposal. diff --git a/v24.04/en/_sources/eki.rst.txt b/v24.04/en/_sources/eki.rst.txt new file mode 100644 index 0000000..a87ab02 --- /dev/null +++ b/v24.04/en/_sources/eki.rst.txt @@ -0,0 +1,546 @@ +KUKA Ethernet KRL Interface + +The + +rc_visard NG + + provides an Ethernet KRL Interface (EKI Bridge), which allows +communicating with the + +rc_visard NG + + from KUKA KRL via KUKA.EthernetKRL XML. + +Note: The component is optional and requires a separate + Roboception's EKIBridge + + license + + to be purchased. + +Note: The KUKA.EthernetKRL add-on software package version 2.2 or + newer must be activated on the robot controller to use this + component. + +The EKI Bridge can be used to programmatically + +do service calls, e.g. to start and stop individual computational +nodes, or to use offered services such as the hand-eye calibration or +the computation of grasp poses; + +set and get run-time parameters of computation nodes, e.g. of the +camera, or disparity calculation. + +Note: A known limitation of the EKI Bridge is that strings + representing valid numbers will be converted to int/float. Hence + user-defined names (like ROI IDs, etc.) should always contain at + least one letter so they can be used in service call arguments. + +Ethernet connection configuration + +The EKI Bridge listens on port 7000 for EKI XML messages and +transparently bridges the + +rc_visard NG + +'s + +REST-API v2 + +. The received EKI messages are transformed to JSON and forwarded to +the + +rc_visard NG + +'s REST-API. The response from the REST-API is transformed back to EKI +XML. + +The EKI Bridge gives access to run-time parameters and offered +services of all computational nodes described in + +Software modules + +. + +Each node offering run-time parameters has an XML configuration file +for setting and getting its parameters. These are named following the +scheme "-parameters.xml". Each node's service has its own +XML configuration file. These are named following the scheme +"-.xml". + +The IP of the + +rc_visard NG + + in the network needs to be filled in the XML file. + +These files must be stored in the directory +"C:\KRC\ROBOTER\Config\User\Common\EthernetKRL" of the robot +controller and they are read in when a connection is initialized. + +As an example, an Ethernet connection to configure the +"rc_stereomatching" parameters is established with the following KRL +code. + + DECL EKI_Status RET + RET = EKI_INIT("rc_stereomatching-parameters") + RET = EKI_Open("rc_stereomatching-parameters") + + ; ----------- Desired operation ----------- + + RET = EKI_Close("rc_stereomatching-parameters") + +Note: The EKI Bridge automatically terminates the connection to the + client if the received XML telegram is invalid. + +Generic XML structure + +For data transmission, the EKI Bridge uses "" as root XML element +(short for request). + +The root tag always includes the following elements. + +. This includes a child XML element used by the EKI Bridge to +identify the target node. The node name is already included in the XML +configuration file. + +. End of request flag that triggers the request. + +The following listing shows the generic XML structure for data +transmission. + + + + + + + + +For data reception, the EKI Bridge uses "" as root XML element +(short for response). The root tag always includes a "" +child element. + + + + + + + + + +Note: By default the XML configuration files uses 998 as flag to + notify KRL that the response data record has been received. If this + value is already in use, it should be changed in the corresponding + XML configuration file. + +Return code + +The "" element consists of a "value" and a "message" +attribute. + +As for all other components, a successful request returns with a +"res/return_code/@value" of 0. Negative values indicate that the +request failed. The error message is contained in +"res/return_code/@message". Positive values indicate that the request +succeeded with additional information, contained in +"res/return_code/@message" as well. + +The following codes can be issued by the EKI Bridge component. + +Return codes of the EKI Bridge component Code Description 0 +Success -1 Parsing error in the conversion from XML to JSON -2 +Internal error -5 Connection error from the REST-API -9 Missing or +invalid license for EKI Bridge component + +Note: The EKI Bridge can also return return code values specific to + individual nodes. They are documented in the respective + + software module + + . + +Note: Due to limitations in KRL, the maximum length of a string + returned by the EKI Bridge is 512 characters. All messages larger + than this value are truncated. + +Services + +For the nodes' services, the XML schema is generated from the +service's arguments and response in JavaScript Object Notation (JSON) +described in + +Software modules + +. The conversion is done transparently, except for the conversion +rules described below. + +Conversions of poses: + + A pose is a JSON object that includes "position" and "orientation" + keys. + + { + "pose": { + "position": { + "x": "float64", + "y": "float64", + "z": "float64", + }, + "orientation": { + "x": "float64", + "y": "float64", + "z": "float64", + "w": "float64", + } + } + } + + This JSON object is converted to a KRL "FRAME" in the XML message. + + + + Positions are converted from meters to millimeters and orientations + are converted from quaternions to KUKA ABC (in degrees). + + Note: No other unit conversions are included in the EKI Bridge. + All dimensions and 3D coordinates that don't belong to a pose are + expected and returned in meters. + +Arrays: + + Arrays are identified by adding the child element "" (short for + list element) to the list name. As an example, the JSON object + + { + "rectangles": [ + { + "x": "float64", + "y": "float64" + } + ] + } + + is converted to the XML fragment + + + + ... + ... + + + +Use of XML attributes: + + All JSON keys whose values are a primitive data type and don't + belong to an array are stored in attributes. As an example, the + JSON object + + { + "item": { + "uuid": "string", + "confidence": "float64", + "rectangle": { + "x": "float64", + "y": "float64" + } + } + } + + is converted to the XML fragment + + + + + + +Request XML structure + +The "" element in the XML configuration file for a generic +service follows the specification below. + + + + + + + + + + +The "" element includes a child XML element that is used by +the EKI Bridge to identify the target service from the XML telegram. +The service name is already included in the configuration file. + +The "" element includes the service arguments and should be +configured with "EKI_Set" KRL instructions. + +As an example, the "" element of the "rc_load_carrier_db"'s +"get_load_carriers" service (see + +LoadCarrierDB + +) is: + + + + + + + + + + +The "" element allows to have arrays in the request. +For configuring an array, the request is split into as many packages +as the size of the array. The last telegram contains all tags, +including the "" flag, while all other telegrams +contain one array element each. + +As an example, for requesting two load carrier models to the +"rc_load_carrier_db"'s "get_load_carriers" service, the user needs to +send two XML messages. The first XML telegram is: + + + + + load_carrier1 + + + + +This telegram can be sent from KRL with the "EKI_Send" command, by +specifying the list element as path: + + DECL EKI_STATUS RET + RET = EKI_SetString("rc_load_carrier_db-get_load_carriers", "req/args/load_carrier_ids/le", "load_carrier1") + RET = EKI_Send("rc_load_carrier_db-get_load_carriers", "req/args/load_carrier_ids/le") + +The second telegram includes all tags and triggers the request to the +"rc_load_carrier_db" node: + + + + + + + + + + + load_carrier2 + + + + + +This telegram can be sent from KRL by specifying "req" as path for +"EKI_Send": + + DECL EKI_STATUS RET + RET = EKI_SetString("rc_load_carrier_db-get_load_carriers", "req/args/load_carrier_ids/le", "load_carrier2") + RET = EKI_Send("rc_load_carrier_db-get_load_carriers", "req") + +Response XML structure + +The "" element in the XML configuration file for a generic +service follows the specification below: + + + + + + + + + + +As an example, the "" element of the "rc_april_tag_detect"'s +"detect" service (see + +TagDetect + +) is: + + + + + + + + + + + + + + + + + + + + + + + +For arrays, the response includes multiple instances of the same XML +element. Each element is written into a separate buffer within EKI and +can be read from the buffer with KRL instructions. The number of +instances can be requested with "EKI_CheckBuffer" and each instance +can then be read by calling "EKI_Get". + +As an example, the tag poses received after a call to the +"rc_april_tag_detect"'s "detect" service can be read in KRL using the +following code: + + DECL EKI_STATUS RET + DECL INT i + DECL INT num_instances + DECL FRAME poses[32] + + DECL FRAME pose = {X 0.0, Y 0.0, Z 0.0, A 0.0, B 0.0, C 0.0} + + RET = EKI_CheckBuffer("rc_april_tag_detect-detect", "res/tags/le/pose") + num_instances = RET.Buff + for i=1 to num_instances + RET = EKI_GetFrame("rc_april_tag_detect-detect", "res/tags/le/pose", pose) + poses[i] = pose + endfor + RET = EKI_ClearBuffer("rc_april_tag_detect-detect", "res") + +Note: Before each request from EKI to the + + rc_visard NG + + , all buffers should be cleared in order to store only the current + response in the EKI buffers. + +Parameters + +All nodes' parameters can be set and queried from the EKI Bridge. The +XML configuration file for a generic node follows the specification +below: + + + + + + + + + + + + + + + + + + + + + + + + + +The request is interpreted as a + +get + + request if all parameter's "value" attributes are empty. If any +"value" attribute is non-empty, it is interpreted as + +set + + request of the non-empty parameters. + +As an example, the current value of all parameters of +"rc_stereomatching" can be queried using the XML telegram: + + + + + + + + + +This XML telegram can be sent out with Ethernet KRL using: + + DECL EKI_STATUS RET + RET = EKI_Send("rc_stereomatching-parameters", "req") + +The response from the EKI Bridge contains all parameters: + + + + + + + + + + + + + + + + + +The "quality" parameter of "rc_stereomatching" can be set to "Low" by +the XML telegram: + + + + + + + + + + + +This XML telegram can be sent out with Ethernet KRL using: + + DECL EKI_STATUS RET + RET = EKI_SetString("rc_stereomatching-parameters", "req/parameters/quality/@value", "Low") + RET = EKI_Send("rc_stereomatching-parameters", "req") + +In this case, only the applied value of "quality" is returned by the +EKI Bridge: + + + + + + + + +Example applications + +More detailed robot application examples can be found at + +https://github.com/roboception/eki_examples + +. + +Troubleshooting + +SmartPad error message: Limit of element memory reached + +This error may occur if the number of matches exceeds the memory +limit. + +Increase BUFFERING and set BUFFSIZE in EKI config files. Adapt these +settings to your particular KRC. + +Decrease the 'Maximum Matches' parameter in the detection module + +Even if the total memory limit (BUFFSIZE) of a message is not reached, +the KRC might not be able to parse the number of child elements in the +XML tree if the BUFFERING limit is too small. For example, if your +application proposes 50 different grasps, the BUFFERING limit needs to +be 50 too. diff --git a/v24.04/en/_sources/general.rst.txt b/v24.04/en/_sources/general.rst.txt new file mode 100644 index 0000000..417bcbb --- /dev/null +++ b/v24.04/en/_sources/general.rst.txt @@ -0,0 +1,48 @@ +Overview + +The 3D sensor + +rc_visard NG + + is an IP54-protected stereo-camera with on-board computing +capabilities. + +The + +rc_visard NG + + provides real-time camera images and depth images, which can be used +to compute 3D point clouds. Additionally, it provides confidence and +error images as quality measures for each image acquisition. It offers +an intuitive web UI (user interface) and a standardized GenICam +interface, making it compatible with all major image processing +libraries. + +With optionally available software modules the + +rc_visard NG + + provides out-of-the-box solutions for object detection and robotic +pick-and-place applications. + +The + +rc_visard NG + +'s intuitive calibration, configuration, and use enable 3D vision for +everyone. + + +The terms "sensor" and " + +rc_visard NG + +" used throughout the manual all refer to the Roboception + +rc_visard NG + +. + +Note: This manual uses the metric system and mostly uses the units + meter and millimeter. Unless otherwise specified, all dimensions in + technical drawings are in millimeters. diff --git a/v24.04/en/_sources/gigevision.rst.txt b/v24.04/en/_sources/gigevision.rst.txt new file mode 100644 index 0000000..a4f52fe --- /dev/null +++ b/v24.04/en/_sources/gigevision.rst.txt @@ -0,0 +1,800 @@ +GigE Vision 2.0/GenICam image interface + +Gigabit Ethernet for Machine Vision ("GigE Vision®" for short) is an +industrial camera interface standard based on UDP/IP (see + +http://www.gigevision.com + +). The + +rc_visard NG + + is a GigE Vision® version 2.0 device and is hence compatible with all +GigE Vision® 2.0 compliant frameworks and libraries. + +GigE Vision® uses GenICam to describe the camera/device features. For +more information about this + +Generic Interface for Cameras + + see + +http://www.genicam.org/ + +. + +Via this interface the + +rc_visard NG + + provides features such as + +discovery, + +IP configuration, + +configuration of camera related parameters, + +image grabbing, and + +time synchronization via IEEE 1588-2008 PrecisionTimeProtocol (PTPv2). + +Note: The + + rc_visard NG + + supports jumbo frames of up to 9000 bytes. Setting an MTU of 9000 + on your GigE Vision client side is recommended for best performance. + +Note: Roboception provides tools and a C++ API with examples for + discovery, configuration, and image streaming via the GigE + Vision/GenICam interface. See + + http://www.roboception.com/download + + . + +GigE Vision ports + +GigE Vision is a UDP based protocol. On the + +rc_visard NG + + the UDP ports are fixed and known: + +UDP port 3956: GigE Vision Control Protocol (GVCP). Used for +discovery, control and configuration. + +UDP port 50010: Stream channel source port for GigE Vision Stream +Protocol (GVSP) used for image streaming. + +Important GenICam parameters + +The following list gives an overview of the relevant GenICam features +of the + +rc_visard NG + + that can be read and/or changed via the GenICam interface. In +addition to the standard parameters, which are defined in the Standard +Feature Naming Convention (SFNC, see + +http://www.emva.org/standards-technology/genicam/genicam-downloads/ + +), + +rc_visard NG + + devices also offer custom parameters that account for special +features of the + +Camera + + and the + +Stereo matching + + module. + +Important standard GenICam features + +Category: ImageFormatControl + +"ComponentSelector" + type: Enumeration, one of Intensity, IntensityCombined, Disparity, + Confidence, or Error + + default: - + + description: Allows the user to select one of the five image + streams for configuration (see Provided image streams, \:Section + \ref{gigevision:sect-provided-image-streams}). + +"ComponentIDValue" (read-only) + type: Integer + + description: The ID of the image stream selected by the + ComponentSelector. + +"ComponentEnable" + type: Boolean + + default: - + + description: If set to true, it enables the image stream selected + by ComponentSelector; otherwise, it disables the stream. Using + ComponentSelector and ComponentEnable, individual image streams can + be switched on and off. + +"Width" (read-only) + type: Integer + + description: Image width in pixel of image stream that is currently + selected by ComponentSelector. + +"Height" (read-only) + type: Integer + + description: Image height in pixel of image stream that is + currently selected by ComponentSelector. + +"WidthMax" (read-only) + type: Integer + + description: Maximum width of an image. + +"HeightMax" (read-only) + type: Integer + + description: Maximum height of an image in the streams. This is + always 1920 pixels due to the stacked left and right images in the + IntensityCombined stream (see Provided image streams, Section + \ref{gigevision:sect-provided-image-streams}). + +"PixelFormat" + type: Enumeration, one of Mono8, YCbCr411_8 (color cameras only), + Coord3D_C16, Confidence8 and Error8 + + description: Pixel format of the selected component. The + enumeration only permits to choose the format among the possibly + formats for the selected component. For a color camera, Mono8 or + YCbCr411_8 can be chosen for the Intensity and IntensityCombined + component. + +Category: AcquisitionControl + +"AcquisitionFrameRate" + type: Float, ranges from 1 Hz to 25 Hz + + default: 25 Hz + + description: Frame rate of the camera (FPS, Section + \ref{stereo_camera:sect-cam-params}). + +"ExposureAuto" + type: Enumeration, one of Continuous, Out1High, AdaptiveOut1, HDR + or Off + + default: Continuous + + description: Combines exp_control (exposure control, Section + \ref{stereo_camera:expl-exp-control}) and exp_auto_mode (auto + exposure mode, Section \ref{stereo_camera:expl-exp-auto-mode}). Off + maps to Manual exposure control. Continuous, Out1High or + AdaptiveOut1 enable Auto exposure control with the respective auto + exposure mode where Continuous maps to the Normal exp_auto_mode. + HDR enables high-dynamic-range exposure control. + +"ExposureTime" + type: Float, ranges from 66 µs to 18000 µs + + default: 5000 µs + + description: The cameras' exposure time in microseconds for the + manual exposure mode (Exposure, Section \ref{stereo_camera:expl- + exp-value}). + +Category: AnalogControl + +"GainSelector" (read-only) + type: Enumeration, is always All + + default: All + + description: The rc_visard NG currently supports only one overall + gain setting. + +"Gain" + type: Float, ranges from 0 dB to 18 dB + + default: 0 dB + + description: The cameras' gain value in decibel that is used in + manual exposure mode (Gain, Section \ref{stereo_camera:expl-gain- + value}). + +"BalanceWhiteAuto" (color cameras only) + type: Enumeration, one of Continuous or Off + + default: Continuous + + description: Can be set to Off for manual white balancing mode or + to Continuous for auto white balancing. This feature is only + available on color cameras (wb_auto, Section \ref{stereo_camera + :expl-wb-auto}). + +"BalanceRatioSelector" (color cameras only) + type: Enumeration, one of Red or Blue + + default: Red + + description: Selects ratio to be modified by BalanceRatio. Red + means red to green ratio and Blue means blue to green ratio. This + feature is only available on color cameras. + +"BalanceRatio" (color cameras only) + type: Float, ranges from 0.125 to 8 + + default: 1.2 if Red and 2.4 if Blue is selected in + BalanceRatioSelector + + description: Weighting of red or blue to green color channel. This + feature is only available on color cameras (wb_ratio, Section + \ref{stereo_camera:expl-wb-ratio}). + +Category: DigitalIOControl + +"LineSelector" + type: Enumeration, one of Out1, Out2, In1 or In2 + + default: Out1 + + description: Selects the input or output line for getting the + current status or setting the source. + +"LineStatus" (read-only) + type: Boolean + + description: Current status of the line selected by LineSelector. + +"LineStatusAll" (read-only) + type: Integer + + description: Current status of GPIO inputs and outputs represented + in the lowest four bits. + + Meaning of bits of LineStatusAll field. Bit 4 3 2 1 + GPIO In 2 In 1 Out 2 Out 1 + +"LineSource" + type: Enumeration, one of ExposureActive, ExposureAlternateActive, + Low or High + + default: Low + + description: Mode for output line selected by LineSelector as + described in the IOControl module (out1_mode and out2_mode, Section + \ref{iocontrol:sect-iocontrol-params}). See also parameter + AcquisitionAlternateFilter for filtering images in + ExposureAlternateActive mode. + +Category: TransportLayerControl / PtpControl + +"PtpEnable" + type: Boolean + + default: false + + description: Switches PTP synchronization on and off. + +Category: Scan3dControl + +"Scan3dDistanceUnit" (read-only) + type: Enumeration, is always Pixel + + description: Unit for the disparity measurements, which is always + Pixel. + +"Scan3dOutputMode" (read-only) + type: Enumeration, is always DisparityC + + description: Mode for the depth measurements, which is always + DisparityC. + +"Scan3dFocalLength" (read-only) + type: Float + + description: Focal length in pixel of image stream selected by + ComponentSelector. In case of the component Disparity, Confidence + and Error, the value also depends on the resolution that is + implicitly selected by DepthQuality. + +"Scan3dBaseline" (read-only) + type: Float + + description: Baseline of the stereo camera in meters. + +"Scan3dPrinciplePointU" (read-only) + type: Float + + description: Horizontal location of the principle point in pixel of + image stream selected by ComponentSelector. In case of the + component Disparity, Confidence and Error, the value also depends + on the resolution that is implicitly selected by DepthQuality. + +"Scan3dPrinciplePointV" (read-only) + type: Float + + description: Vertical location of the principle point in pixel of + image stream selected by ComponentSelector. In case of the + component Disparity, Confidence and Error, the value also depends + on the resolution that is implicitly selected by DepthQuality. + +"Scan3dCoordinateScale" (read-only) + type: Float + + description: The scale factor that has to be multiplied with the + disparity values in the disparity image stream to get the actual + disparity measurements. This value is always 0.0625. + +"Scan3dCoordinateOffset" (read-only) + type: Float + + description: The offset that has to be added to the disparity + values in the disparity image stream to get the actual disparity + measurements. For the rc_visard NG, this value is always 0 and can + therefore be disregarded. + +"Scan3dInvalidDataFlag" (read-only) + type: Boolean + + description: Is always true, which means that invalid data in the + disparity image is marked by a specific value defined by the + Scan3dInvalidDataValue parameter. + +"Scan3dInvalidDataValue" (read-only) + type: Float + + description: Is the value which stands for invalid disparity. This + value is always 0, which means that disparity values of 0 + correspond to invalid measurements. To distinguish between invalid + disparity measurements and disparity measurements of 0 for objects + which are infinitely far away, the rc_visard NG sets the disparity + value for the latter to the smallest possible disparity value of + 0.0625. This still corresponds to an object distance of several + hundred meters. + +Category: ChunkDataControl + +"ChunkModeActive" + type: Boolean + + default: False + + description: Enables chunk data that is delivered with every image. + +Custom GenICam features of the rc_visard NG + +Category: DeviceControl + +"RcSystemReady" (read-only) + type: Boolean + + description: Returns whether the device's boot process has + completed and all modules are running. + +"RcParamLockDisable" + type: Boolean + + default: False + + description: If set to true, the camera and depth image parameters + are not locked when a GigE Vision client is connected to the + device. Please note that depending on the connected GigE Vision + client, parameter changes by other applications (e.g. the Web GUI) + might not be noticed by the GigE Vision client, which could lead to + unwanted results. + +Category: AcquisitionControl + +"AcquisitionAlternateFilter" + type: Enumeration, one of Off, OnlyHigh or OnlyLow + + default: Off + + description: If this parameter is set to OnlyHigh (or OnlyLow) and + the LineSource is set to ExposureAlternateActive for any output, + then only camera images are delivered that are captured while the + output is high, i.e. a potentially connected projector is on (or + low, i.e. a potentially connected projector is off). This parameter + is a simple means for only getting images without projected + pattern. The minimal time difference between camera and disparity + images will be about 40 ms in this case (see IOControl, Section + \ref{iocontrol:sect-iocontrol-params}). + +"AcquisitionMultiPartMode" + type: Enumeration, one of SingleComponent or SynchronizedComponents + + default: SingleComponent + + description: Only effective in MultiPart mode. If this parameter is + set to SingleComponent the images are sent immediately as a single + component per frame/buffer when they become available. This is the + same behavior as when MultiPart is not supported by the client. If + set to SynchronizedComponents all enabled components are time + synchronized on the rc_visard NG and only sent (in one + frame/buffer) when they are all available for that timestamp. + +"ExposureTimeAutoMax" + type: Float, ranges from 66 µs to 18000 µs + + default: 18000 µs + + description: Maximal exposure time in auto exposure mode (Max + Exposure, Section \ref{stereo_camera:expl-exp-max}). + +"ExposureRegionOffsetX" + type: Integer in the range of 0 to the maximum image width + + default: 0 + + description: Horizontal offset of exposure region\:(Section + \ref{stereo_camera:expl-exp-region}) in pixel. + +"ExposureRegionOffsetY" + type: Integer in the range of 0 to the maximum image height + + default: 0 + + description: Vertical offset of exposure region\:(Section + \ref{stereo_camera:expl-exp-region}) in pixel. + +"ExposureRegionWidth" + type: Integer in the range of 0 to the maximum image width + + default: 0 + + description: Width of exposure region\:(Section \ref{stereo_camera + :expl-exp-region}) in pixel. + +"ExposureRegionHeight" + type: Integer in the range of 0 to the maximum image height + + default: 0 + + description: Height of exposure region\:(Section \ref{stereo_camera + :expl-exp-region}) in pixel. + +"RcExposureAutoAverageMax" + type: Float in the range of 0 to 1 + + default: 0.75 + + description: Maximum brightness for the auto exposure + function\:(Section \ref{stereo_camera:exp-auto-max-min-average}) as + value between 0 (dark) and 1 (bright). + +"RcExposureAutoAverageMin" + type: Float in the range of 0 to 1 + + default: 0.25 + + description: Minimum brightness for the auto exposure + function\:(Section \ref{stereo_camera:exp-auto-max-min-average}) as + value between 0 (dark) and 1 (bright). + +Category: Scan3dControl + +"FocalLengthFactor" (read-only) + type: Float + + description: The focal length scaled to an image width of 1 pixel. + To get the focal length in pixels for a certain image, this value + must be multiplied by the width of the received image. See also + parameter Scan3dFocalLength. + +"Baseline" (read-only) + type: Float + + description: This parameter is deprecated. The parameter + Scan3dBaseline should be used instead. + +Category: DepthControl + +"DepthAcquisitionMode" + type: Enumeration, one of SingleFrame, SingleFrameOut1 or + Continuous + + default: Continuous + + description: In single frame mode, stereo matching is performed + upon each call of DepthAcquisitionTrigger. The SingleFrameOut1 mode + can be used to control an external projector. It sets the line + source of Out1 to ExposureAlternateActive upon each trigger and + resets it to Low as soon as the images for stereo matching are + grabbed. In continuous mode, stereo matching is performed + continuously. + +"DepthAcquisitionTrigger" + type: Command + + description: This command triggers stereo matching of the next + available stereo image pair, if DepthAcquisitionMode is set to + SingleFrame or SingleFrameOut1. + +"DepthQuality" + type: Enumeration, one of Low, Medium, High, or Full (only with + StereoPlus license) + + default: High + + description: Quality of disparity images. Lower quality results in + disparity images with lower resolution (Quality, Section + \ref{stereo_matching:expl-depth-quality}). + +"DepthDoubleShot" + type: Boolean + + default: False + + description: True for improving the stereo matching result of a + scene recorded with a projector by filling holes with depth + information computed from images without projector pattern. + (Double-Shot, Section \ref{stereo_matching:expl-depth-double- + shot}). + +"DepthStaticScene" + type: Boolean + + default: False + + description: True for averaging 8 consecutive camera images for + improving the stereo matching result. (Static, Section + \ref{stereo_matching:expl-depth-static}). + +"DepthSmooth" (read-only if StereoPlus license is not available) + type: Boolean + + default: False + + description: True for advanced smoothing of disparity values. + (Smoothing, Section \ref{stereo_matching:expl-depth-smooth}). + +"DepthFill" + type: Integer, ranges from 0 pixel to 4 pixels + + default: 3 pixels + + description: Value in pixels for Fill-In\:(Section + \ref{stereo_matching:expl-depth-fill}). + +"DepthSeg" + type: Integer, ranges from 0 pixel to 4000 pixels + + default: 200 pixels + + description: Value in pixels for Segmentation\:(Section + \ref{stereo_matching:expl-depth-seg}). + +"DepthMinConf" + type: Float, ranges from 0.0 to 1.0 + + default: 0.0 + + description: Value for Minimum Confidence filtering\:(Section + \ref{stereo_matching:expl-depth-min-conf}). + +"DepthMinDepth" + type: Float, ranges from 0.1 m to 100.0 m + + default: 0.1 m + + description: Value in meters for Minimum Distance + filtering\:(Section \ref{stereo_matching:expl-depth-min-depth}). + +"DepthMaxDepth" + type: Float, ranges from 0.1m to 100.0 m + + default: 100.0 m + + description: Value in meters for Maximum Distance + filtering\:(Section \ref{stereo_matching:expl-depth-max-depth}). + +"DepthMaxDepthErr" + type: Float, ranges from 0.01 m to 100.0 m + + default: 100.0 m + + description: Value in meters for Maximum Depth Error + filtering\:(Section \ref{stereo_matching:expl-depth-max-depth- + err}). + +Chunk data + +The + +rc_visard NG + + supports chunk parameters that are transmitted with every image. +Chunk parameters all have the prefix "Chunk". Their meaning equals +their non-chunk counterparts, except that they belong to the +corresponding image, e.g. "Scan3dFocalLength" depends on +"ComponentSelector" and "DepthQuality" as both can change the image +resolution. The parameter "ChunkScan3dFocalLength" that is delivered +with an image fits to the resolution of the corresponding image. + +Particularly useful chunk parameters are: + +ChunkComponentSelector selects for which component to extract the +chunk data in MultiPart mode. + +ChunkComponentID and ChunkComponentIDValue provide the relation of the +image to its component (e.g. camera image or disparity image) without +guessing from the image format or size. + +ChunkLineStatusAll provides the status of all GPIOs at the time of +image acquisition. See LineStatusAll above for a description of bits. + +ChunkScan3d... parameters are useful for 3D reconstruction as +described in Section Image stream conversions\:(Section +\ref{gigevision:sect-image-stream-conversions}). + +ChunkPartIndex provides the index of the image part in this MultiPart +block for the selected component (ChunkComponentSelector). + +ChunkRcOut1Reduction gives a ratio of how much the brightness of the +images with GPIO Out1 LOW is lower than the brightness of the images +with GPIO Out1 HIGH. For example, a value of 0.2 means that the images +with GPIO Out1 LOW have 20% less brightness than the images with GPIO +Out1 HIGH. This value is only available if exp_auto_mode of the stereo +camera is set to AdaptiveOut1 or Out1High (auto exposure mode, Section +\ref{stereo_camera:expl-exp-auto-mode}). + +Chunk data is enabled by setting the GenICam parameter +"ChunkModeActive" to "True". + +Provided image streams + +The + +rc_visard NG + + provides the following five different image streams via the GenICam +interface: + + Component name PixelFormat Description Intensity Mono8 +(monochrome cameras) YCbCr411_8 (color cameras) Left rectified +camera image IntensityCombined Mono8 (monochrome cameras) +YCbCr411_8 (color cameras) Left rectified camera image stacked on +right rectified camera image Disparity Coord3D_C16 Disparity image +in desired resolution, i.e., DepthQuality of Full, High, Medium or Low +Confidence Confidence8 Confidence image Error Error8 (custom: +0x81080001) Disparity error image + +Each image comes with a buffer timestamp and the + +PixelFormat + + given in the above table. This PixelFormat should be used to +distinguish between the different image types. Images belonging to the +same acquisition timestamp can be found by comparing the GenICam +buffer timestamps. + +Image stream conversions + +The disparity image contains 16 bit unsigned integer values. These +values must be multiplied by the scale value given in the GenICam +feature + +Scan3dCoordinateScale + + to get the disparity values d in pixels. To compute the 3D object +coordinates from the disparity values, the focal length and the +baseline as well as the principle point are required. These parameters +are transmitted as GenICam features + +Scan3dFocalLength + +, + +Scan3dBaseline + +, + +Scan3dPrincipalPointU + + and + +Scan3dPrincipalPointV + +. The focal length and principal point depend on the image resolution +of the selected component. Knowing these values, the pixel coordinates +and the disparities can be transformed into 3D object coordinates in +the camera coordinate frame using the equations described in + +Computing depth images and point clouds + +. + +Note: The + + rc_visard NG + + 's camera coordinate frame is defined as shown in + + sensor coordinate frame + + . + +Assuming that d16_{ik} is the 16 bit disparity value at column i and +row k of a disparity image, the float disparity in pixels d_{ik} is +given by + + d_{ik}=d16_{ik} \cdot \mathrm{Scan3dCoordinateScale} + +The 3D reconstruction in meters can be written with the GenICam +parameters as: + + P_x&=\left(i+0.5-\mathrm{Scan3dPrincipalPointU}\right) + \frac{\mathrm{Scan3dBaseline}}{d_{ik}},\\ + P_y&=\left(k+0.5-\mathrm{Scan3dPrincipalPointV}\right) + \frac{\mathrm{Scan3dBaseline}}{d_{ik}},\\ + P_z&=\mathrm{Scan3dFocalLength} + \frac{\mathrm{Scan3dBaseline}}{d_{ik}}. + +The confidence image contains 8 bit unsigned integer values. These +values have to be divided by 255 to get the confidence as value +between 0 an 1. + +The error image contains 8 bit unsigned integer values. The error +e_{ik} must be multiplied by the scale value given in the GenICam +feature + +Scan3dCoordinateScale + + to get the disparity-error values d_{eps} in pixels. According to the +description in + +Confidence and error images + +, the depth error z_{eps} in meters can be computed with GenICam +parameters as + + d_{ik}&=d16_{ik} \cdot \mathrm{Scan3dCoordinateScale},\\ + z_{eps}&=\frac{e_{ik} \cdot \mathrm{Scan3dCoordinateScale} \cdot + \mathrm{Scan3dFocalLength} \cdot + \mathrm{Scan3dBaseline}} {(d_{ik})^2}. + +Note: It is preferable to enable chunk data with the parameter + + ChunkModeActive + + and to use the chunk parameters + + ChunkScan3dCoordinateScale + + , + + ChunkScan3dFocalLength + + , + + ChunkScan3dBaseline + + , + + ChunkScan3dPrincipalPointU + + and + + ChunkScan3dPrincipalPointV + + that are delivered with every image, because their values already + fit to the image resolution of the corresponding image. + +For more information about disparity, error, and confidence images, +please refer to + +Stereo matching + +. diff --git a/v24.04/en/_sources/glossary.rst.txt b/v24.04/en/_sources/glossary.rst.txt new file mode 100644 index 0000000..5709398 --- /dev/null +++ b/v24.04/en/_sources/glossary.rst.txt @@ -0,0 +1,169 @@ +Glossary + +DHCP + The Dynamic Host Configuration Protocol (DHCP) is used to + automatically assign an + + IP + + address to a network device. Some DHCP servers only accept known + devices. In this case, an administrator needs to configure the DHCP + server with the fixed + + MAC address + + of a device. + +DNS +mDNS + The Domain Name Server (DNS) manages the host names and + + IP + + addresses of all network devices. It is responsible for resolving + the host name into the IP address for communication with a device. + A DNS can be configured to get this information automatically when + a device appears on a network or manually by an administrator. In + contrast, + + multicast DNS + + (mDNS) works without a central server by querying all devices on a + local network each time a host name needs to be resolved. mDNS is + available by default on Linux and Mac operating systems and is used + when '.local' is appended to a host name. + +DOF + The Degrees Of Freedom (DOF) are the number of independent + parameters for translation and rotation. In 3D space, 6 DOF (i.e. + three for translation and three rotation) are sufficient to + describe an arbitrary position and orientation. + +GenICam + GenICam is a generic standard interface for cameras. It serves as a + unified interface around other standards such as + + GigE Vision + + , Camera Link, USB, etc. See + + http://genicam.org + + for more information. + +GigE + Gigabit Ethernet (GigE) is a networking technology for transmitting + data at one gigabit per second. + +GigE Vision + GigE Vision® is a standard for configuring cameras and transmitting + images over a + + GigE + + network link. See + + http://gigevision.com + + for more information. + +IP +IP address + The Internet Protocol (IP) is a standard for sending data between + devices in a computer network. Every device requires an IP address, + which must be unique in the network. The IP address can be + configured by + + DHCP + + , + + Link-Local + + , or manually. + +Link-Local + Link-Local is a technology where network devices associate + themselves with an + + IP address + + from the 169.254.0.0/16 IP range and check if it is unique in the + local network. Link-Local can be used if + + DHCP + + is unavailable and manual IP configuration is not or cannot be + done. Link-Local is especially useful for connecting a network + device directly to a host computer. By default, Windows 10 reverts + automatically to Link-Local if DHCP is unavailable. Under Linux, + Link-Local must be enabled manually in the network manager. + +MAC address + The Media Access Control (MAC) address is a unique, persistent + address for networking devices. It is also known as the hardware + address of a device. In contrast to the + + IP address + + , the MAC address is (normally) permanently given to a device and + does not change. + +NTP + The Network Time Protocol (NTP) is a TCP/IP protocol for + synchronizing time over a network. Basically a client requests the + current time from a server, and uses it to set its own clock. + +SDK + A Software Development Kit (SDK) is a collection of software + development tools or a collection of software components. + +SGM + SGM stands for Semi-Global Matching and is a state-of-the-art + stereo matching algorithm which offers short run times and a great + accuracy, especially at object borders, fine structures, and in + weakly textured areas. + +TCP + The Tool Center Point (TCP) is the position of the tool at the end + effector of a robot. The position and orientation of the TCP + determines the position and orientation of the tool in 3D space. + +URI +URL + A Uniform Resource Identifier (URI) is a string of characters + identifying resources of the + + rc_visard NG + + 's REST-API. An example of such a URI is + "/nodes/rc_camera/parameters/fps", which points to the "fps" run- + time parameter of the stereo camera module. + + A Uniform Resource Locator (URL) additionally specifies the full + network location and protocol, i.e., an exemplary URL to locate the + above resource would be + "https:///api/v1/nodes/rc_camera/parameters/fps" where "" + refers to the + + rc_visard NG + + 's + + IP address + + . + +XYZ+quaternion + Format to represent a pose. See + + Rotation matrix and translation vector + + for its definition. + +XYZABC + Format to represent a pose. See + + KUKA XYZ-ABC format + + for its definition. diff --git a/v24.04/en/_sources/gripper_db.rst.txt b/v24.04/en/_sources/gripper_db.rst.txt new file mode 100644 index 0000000..885626f --- /dev/null +++ b/v24.04/en/_sources/gripper_db.rst.txt @@ -0,0 +1,692 @@ +GripperDB + +Introduction + +The GripperDB module (gripper database module) is an optional on-board +module of the + +rc_visard NG + + and is licensed with any of the modules + +ItemPick and BoxPick + + or + +SilhouetteMatch + +. Otherwise it requires a separate CollisionCheck + +license + + to be purchased. + +The module provides services to set, retrieve and delete grippers +which can then be used for checking collisions with a load carrier or +other detected objects (only in combination with + +SilhouetteMatch + +). The specified grippers are available for all modules supporting +collision checking on the + +rc_visard NG + +. + +Specifications of the GripperDB module Max. number of grippers +50 Supported gripper element geometries Box, Cylinder, CAD Element +Max. number of elements per gripper 15 Collision checking available +in ItemPick and BoxPick\:(Section \ref{itempick:sect-itempick}), +SilhouetteMatch\:(Section \ref{silhouettematch:sect-silhouettematch}) + +Setting a gripper + +The gripper is a collision geometry used to determine whether the +grasp is in collision with the load carrier. The gripper consists of +up to 15 elements connected to each other. + +At this point, the gripper can be built of elements of the following +types: + + BOX, with dimensions box.x, box.y, box.z. + + CYLINDER, with radius cylinder.radius and height cylinder.height. + + CAD, with the id cad.id of the chosen CAD element. + +Additionally, for each gripper the flange radius, and information +about the Tool Center Point (TCP) have to be defined. + +The configuration of the gripper is normally performed offline during +the setup of the desired application. This can be done via the + +REST-API interface + + or the + +rc_visard NG + + +Web GUI + +. + +Robot flange radius + +Collisions are checked only with the gripper, the robot body is not +considered. As a safety feature, to prevent collisions between the +load carrier and the robot, all grasps having any part of the robot's +flange inside the load carrier can be designated as colliding (see + +Fig. 55 + +). This check is based on the defined gripper geometry and the flange +radius value. It is optional to use this functionality, and it can be +turned on and off with the CollisionCheck module's run-time parameter +"check_flange" as described in + +Parameter overview + +. + + +Uploading gripper CAD elements + +A gripper can consist of boxes, cylinders and CAD elements. While +boxes and cylinders can be parameterized when the gripper is created, +the CAD elements must be uploaded beforehand to be available during +gripper creation. A CAD element can be uploaded via the + +REST-API interface + + as described in Section + +CAD element API + + or via the + +rc_visard NG + + +Web GUI + +. Supported file formats are STEP (*.stp, *.step), STL (*.stl), OBJ +(*.obj) and PLY (*.ply). The maximum file size to be uploaded is +limited to 30 MB. The files are internally converted to PLY and, if +necessary, simplified. The CAD elements can be referenced during +gripper creation by their ID. + +Creating a gripper via the REST-API or the Web GUI + +When creating a gripper via the + +REST-API interface + + or the + +Web GUI + +, each element of the gripper has a *parent* element, which defines +how they are connected. The gripper is always built in the direction +from the robot flange to the TCP, and at least one element must have +'flange' as parent. The elements' IDs must be unique and must not be +'tcp' or 'flange'. The pose of the child element has to be given in +the coordinate frame of the parent element. The coordinate frame of an +element is always in its geometric center. Accordingly, for a child +element to be exactly below the parent element, the position of the +child element must be computed from the heights of both parent and +child element (see + +Fig. 56 + +). + + +In case a CAD element is used, the element's origin is defined in the +CAD data and is not necessarily located in the center of the element's +bounding box. + +It is recommended to create a gripper via the Web GUI, because it +provides a 3D visualization of the gripper geometry and also allows to +automatically attach the child element to the bottom of its parent +element, when the corresponding option for this element is activated. +In this case, the elements also stay attached when any of their sizes +change. Automatic attachment of CAD elements uses the element's +bounding box as reference. Automatic attachment is only possible when +the child element is not rotated around the x or y axis with respect +to its parent. + +The reference frame for the first element for the gripper creation is +always the center of the robot's flange with the z axis pointing +outwards. It is possible to create a gripper with a tree structure, +corresponding to multiple elements having the same parent element, as +long as they are all connected. + +Calculated TCP position + +After gripper creation via the "set_gripper" service call, the TCP +position in the flange coordinate system is calculated and returned as +"tcp_pose_flange". It is important to check if this value is the same +as the robot's true TCP position. When creating a gripper in the Web +GUI the current TCP position is always displayed in the 3D gripper +visualization. + +Creating rotationally asymmetric grippers + +For grippers which are not rotationally symmetric around the z axis, +it is crucial to ensure that the gripper is properly mounted, so that +the representation stored in the GripperDB module corresponds to +reality. + +Services + +The GripperDB module is called "rc_gripper_db" in the REST-API and is +represented in the + +Web GUI + + under Database ‣ Grippers. The user can explore and call the +GripperDB module's services, e.g. for development and testing, using +the + +REST-API interface + + or the Web GUI. + +The GripperDB module offers the following services. + +set_gripper + + Persistently stores a gripper on the + + rc_visard NG + + . All configured grippers are persistent over firmware updates and + rollbacks. + + Details + + This service can be called as follows. + + PUT http:///api/v2/nodes/rc_gripper_db/services/set_gripper + + Request + + Required arguments: + + "elements": list of geometric elements for the gripper. Each + element must be of "type" 'CYLINDER' or 'BOX' with the + corresponding dimensions in the "cylinder" or "box" field, or of + type 'CAD' with the corresponding "id" in the "cad" field. The + pose of each element must be given in the coordinate frame of + the parent element (see + + Setting a gripper + + for an explanation of the coordinate frames). The element's + "id" must be unique and must not be 'tcp' or 'flange'. The + "parent_id" is the ID of the parent element. It can either be + 'flange' or it must correspond to another element in list. + + "flange_radius": radius of the flange used in case the + "check_flange" run-time parameter is active. + + "id": unique name of the gripper + + "tcp_parent_id": ID of the element on which the TCP is defined + + "tcp_pose_parent": The pose of the TCP with respect to the + coordinate frame of the element specified in "tcp_parent_id". + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "elements": [ + { + "box": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "cad": { + "id": "string" + }, + "cylinder": { + "height": "float64", + "radius": "float64" + }, + "id": "string", + "parent_id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "type": "string" + } + ], + "flange_radius": "float64", + "id": "string", + "tcp_parent_id": "string", + "tcp_pose_parent": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + } + } + } + + Response + + "gripper": returns the gripper as defined in the request with an + additional field "tcp_pose_flange". This gives the coordinates of + the TCP in the flange coordinate frame for comparison with the true + settings of the robot's TCP. + + "return_code": holds possible warnings or error codes and messages. + + The definition for the response with corresponding datatypes is: + + { + "name": "set_gripper", + "response": { + "gripper": { + "elements": [ + { + "box": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "cad": { + "id": "string" + }, + "cylinder": { + "height": "float64", + "radius": "float64" + }, + "id": "string", + "parent_id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "type": "string" + } + ], + "flange_radius": "float64", + "id": "string", + "tcp_parent_id": "string", + "tcp_pose_flange": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "tcp_pose_parent": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "type": "string" + }, + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +get_grippers + + Returns the configured grippers with the requested "gripper_ids". + + Details + + This service can be called as follows. + + PUT http:///api/v2/nodes/rc_gripper_db/services/get_grippers + + Request + + If no "gripper_ids" are provided, all configured grippers are + returned. + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "gripper_ids": [ + "string" + ] + } + } + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "get_grippers", + "response": { + "grippers": [ + { + "elements": [ + { + "box": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "cad": { + "id": "string" + }, + "cylinder": { + "height": "float64", + "radius": "float64" + }, + "id": "string", + "parent_id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "type": "string" + } + ], + "flange_radius": "float64", + "id": "string", + "tcp_parent_id": "string", + "tcp_pose_flange": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "tcp_pose_parent": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "type": "string" + } + ], + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +delete_grippers + + Deletes the configured grippers with the requested "gripper_ids". + + Details + + This service can be called as follows. + + PUT http:///api/v2/nodes/rc_gripper_db/services/delete_grippers + + Request + + All grippers to be deleted must be explicitly stated in + "gripper_ids". + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "gripper_ids": [ + "string" + ] + } + } + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "delete_grippers", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +Return codes + +Each service response contains a "return_code", which consists of a +"value" plus an optional "message". A successful service returns with +a "return_code" value of "0". Negative "return_code" values indicate +that the service failed. Positive "return_code" values indicate that +the service succeeded with additional information. The smaller value +is selected in case a service has multiple "return_code" values, but +all messages are appended in the "return_code" message. + +The following table contains a list of common codes: + +Return codes of the GripperDB services Code Description 0 +Success -1 An invalid argument was provided -7 Data could not be +read or written to persistent storage -9 No valid license for the +module -10 New gripper could not be added as the maximum storage +capacity of grippers has been exceeded 10 The maximum storage +capacity of grippers has been reached 11 Existing gripper was +overwritten + +CAD element API + +For gripper CAD element upload, download, listing and removal, special +REST-API endpoints are provided. CAD elements can also be uploaded, +downloaded and removed via the Web GUI. Up to 50 CAD elements can be +stored persistently on the + +rc_visard NG + +. + +The maximum file size to be uploaded is limited to MB. + +GET /cad/gripper_elements + + Get list of all CAD gripper elements. + + Template request + + GET /api/v2/cad/gripper_elements HTTP/1.1 + + Template response + + HTTP/1.1 200 OK + Content-Type: application/json + + [ + { + "id": "string" + } + ] + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns array of GripperElement) + + 404 Not Found -- element not found + + Referenced Data Models: + GripperElement\:(Section \ref{rest_api_datamodel:sect-rest- + datamodel-gripperelement}) + +GET /cad/gripper_elements/{id} + + Get a CAD gripper element. If the requested content-type is + application/octet-stream, the gripper element is returned as file. + + Template request + + GET /api/v2/cad/gripper_elements/ HTTP/1.1 + + Template response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "id": "string" + } + + Parameters: + id (string) -- id of the element (required) + + Response Headers: + Content-Type -- application/json application/ubjson application + /octet-stream + + Status Codes: + 200 OK -- successful operation (returns GripperElement) + + 404 Not Found -- element not found + + Referenced Data Models: + GripperElement\:(Section \ref{rest_api_datamodel:sect-rest- + datamodel-gripperelement}) + +PUT /cad/gripper_elements/{id} + + Create or update a CAD gripper element. + + Template request + + PUT /api/v2/cad/gripper_elements/ HTTP/1.1 + Accept: multipart/form-data application/json + + Template response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "id": "string" + } + + Parameters: + id (string) -- id of the element (required) + + Form Parameters: + file -- CAD file (required) + + Request Headers: + Accept -- multipart/form-data application/json + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns GripperElement) + + 400 Bad Request -- CAD is not valid or max number of elements + reached + + 404 Not Found -- element not found + + 413 Request Entity Too Large -- File too large + + Referenced Data Models: + GripperElement\:(Section \ref{rest_api_datamodel:sect-rest- + datamodel-gripperelement}) + +DELETE /cad/gripper_elements/{id} + + Remove a CAD gripper element. + + Template request + + DELETE /api/v2/cad/gripper_elements/ HTTP/1.1 + Accept: application/json application/ubjson + + Parameters: + id (string) -- id of the element (required) + + Request Headers: + Accept -- application/json application/ubjson + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation + + 404 Not Found -- element not found diff --git a/v24.04/en/_sources/grpc.rst.txt b/v24.04/en/_sources/grpc.rst.txt new file mode 100644 index 0000000..07e6315 --- /dev/null +++ b/v24.04/en/_sources/grpc.rst.txt @@ -0,0 +1,190 @@ +gRPC image stream interface + +The gRPC image streaming interface can be used as an alternative to +the + +GigE Vision / GenICam interface + + for getting camera images and synchronized sets of images (e.g. left +camera image and corresponding disparity image). + +gRPC + + is a remote procedure call system that also supports streaming. It +uses + +Protocol Buffers + + (see + +https://developers.google.com/protocol-buffers/ + +) as interface description language and data serialization. For a gRPC +introduction and more details please see the official website ( + +https://grpc.io/ + +). + +The advantages of the gRPC interface in comparison to GigE Vision are: + + It is simpler to use in own programs than GigE Vision. + + There is gRPC support for a lot of programming languages (see + https://grpc.io/). + + The communication is based on TCP instead of UDP and therefore it + also works over less stable networks, e.g. WLAN. + +The disadvantages of the gRPC interface in comparison to GigE Vision +are: + + It does not support changing parameters, but the REST-API + interface\:(Section \ref{rest_api:sect-rest-api}) can be used for + changing parameters. + + It is not a standard vision interface like GigE Vision. + +The + +rc_visard NG + + provides synchronized image sets via gRPC server side streams on port +50051. + +The communication is started by sending an "ImageSetRequest" message +to the server. The message contains the information about requested +images, i.e. left, right, disparity, confidence and disparity_error +images can be enabled separately. + +After getting the request, the server starts continuously sending +"ImageSet" messages that contain all requested images with all +parameters necessary for interpreting the images. The images that are +contained in an "ImageSet" message are synchronized, i.e. they are all +captured at the same time. The only exception to this rule is if the + +out1_mode + + is set to "AlternateExposureActive". In this case, the camera and +disparity images are taken 40 ms apart, so that the GPIO Out1 is LOW +when the left and right images are taken, and HIGH for the disparity, +confidence and error images. This mode is useful when a random dot +projector is used, because the projector would be off for capturing +the left and right image, and on for the disparity image, which +results in undisturbed camera images and a much denser and more +accurate disparity image. + +Streaming of images is done until the client closes the connection. + +gRPC service definition + + syntax = "proto3"; + + message Time + { + int32 sec = 1; ///< Seconds + int32 nsec = 2; ///< Nanoseconds + } + + message Gpios + { + uint32 inputs = 1; ///< bitmask of available inputs + uint32 outputs = 2; ///< bitmask of available outputs + uint32 values = 3; ///< bitmask of GPIO values + } + + message Image + { + Time timestamp = 1; ///< Acquisition timestamp of the image + uint32 height = 2; ///< image height (number of rows) + uint32 width = 3; ///< image width (number of columns) + float focal_length = 4; ///< focal length in pixels + float principal_point_u = 5; ///< horizontal position of the principal point + float principal_point_v = 6; ///< vertical position of the principal point + string encoding = 7; ///< Encoding of pixels ["mono8", "mono16", "rgb8"] + bool is_bigendian = 8; ///< is data bigendian, (in our case false) + uint32 step = 9; ///< full row length in bytes + bytes data = 10; ///< actual matrix data, size is (step * height) + Gpios gpios = 11; ///< GPIOs as of acquisition timestamp + float exposure_time = 12; ///< exposure time in seconds + float gain = 13; ///< gain factor in decibel + float noise = 14; ///< noise + float out1_reduction = 16; ///< Fraction of reduction (0.0 - 1.0) of exposure time for images with GPIO Out1=Low in exp_auto_mode=AdaptiveOut1 + float brightness = 17; ///< Current brightness of the image as value between 0 and 1 + } + + message DisparityImage + { + Time timestamp = 1; ///< Acquisition timestamp of the image + float scale = 2; ///< scale factor + float offset = 3; ///< offset in pixels (in our case 0) + float invalid_data_value = 4; ///< value used to mark pixels as invalid (in our case 0) + float baseline = 5; ///< baseline in meters + float delta_d = 6; ///< Smallest allowed disparity increment. The smallest achievable depth range resolution is delta_Z = (Z^2/image.focal_length*baseline)*delta_d. + Image image = 7; ///< disparity image + } + + message Mesh + { + Time timestamp = 1; ///< Acquisition timestamp of disparity image from which the mesh is computed + string format = 2; ///< currently only "ply" is supported + bytes data = 3; ///< actual mesh data + } + + message ImageSet + { + Time timestamp = 1; + Image left = 2; + Image right = 3; + DisparityImage disparity = 4; + Image disparity_error = 5; + Image confidence = 6; + Mesh mesh = 7; + } + + message MeshOptions + { + uint32 max_points = 1; ///< limit maximum number of points, zero means default (up to 3.1MP), minimum is 1000 + enum BinningMethod { + AVERAGE = 0; ///< average over all points in bin + MIN_DEPTH = 1; ///< use point with minimum depth (i.e. closest to camera) in bin + } + BinningMethod binning_method = 2; ///< method used for binning if limited by max_points + bool watertight = 3; ///< connect all edges and fill all holes, e.g. for collision checking + bool textured = 4; ///< add texture information to mesh + } + + message ImageSetRequest + { + bool left_enabled = 1; + bool right_enabled = 2; + bool disparity_enabled = 3; + bool disparity_error_enabled = 4; + bool confidence_enabled = 5; + bool mesh_enabled = 6; + MeshOptions mesh_options = 7; + bool color = 8; ///< send left/right image as color (rgb8) images + } + + service ImageInterface + { + // A server-to-client streaming RPC. + rpc StreamImageSets(ImageSetRequest) returns (stream ImageSet) {} + } + +Image stream conversions + +The conversion of disparity images into a point cloud can be done as +described in the + +GigE Vision / GenICam interface + +. + +Example client + +A simple example C++ client can be found at + +https://github.com/roboception/grpc_image_client_example + +. diff --git a/v24.04/en/_sources/handeye_calibration.rst.txt b/v24.04/en/_sources/handeye_calibration.rst.txt new file mode 100644 index 0000000..dc7918e --- /dev/null +++ b/v24.04/en/_sources/handeye_calibration.rst.txt @@ -0,0 +1,1211 @@ +Hand-eye calibration + +For applications, in which the camera is integrated into one or more +robot systems, it needs to be calibrated w.r.t. some robot reference +frames. For this purpose, the + +rc_visard NG + + is shipped with an on-board calibration routine called the + +hand-eye calibration + + module. It is a base module which is available on every + +rc_visard NG + +. + +Note: The implemented calibration routine is completely agnostic + about the user-defined robot frame to which the camera is + calibrated. It might be a robot's end-effector (e.g., flange or tool + center point) or any point on the robot structure. The method's only + requirement is that the pose (i.e., translation and rotation) of + this robot frame w.r.t. a user-defined external reference frame + (e.g., world or robot mounting point) is exactly observable by the + robot controller and can be reported to the calibration module. + +The + +Calibration routine + + itself is an easy-to-use multi-step procedure using a calibration +grid which can be obtained from Roboception. + +Calibration interfaces + +The following two interfaces are offered to conduct hand-eye +calibration: + +All services and parameters of this module required to conduct the +hand-eye calibration programmatically are exposed by the rc_visard +NG's REST-API interface\:(Section \ref{rest_api:sect-rest-api}). The +respective node name of this module is rc_hand_eye_calibration and the +respective service calls are documented Services\:(Section +\ref{handeye_calibration:sect-handeye-calibration-services}). The +described approach requires a network connection between the rc_visard +NG and the robot controller to pass robot poses from the controller to +the rc_visard NG's calibration module. + +For use cases where robot poses cannot be passed programmatically to +the rc_visard NG's hand-eye calibration module, the Web GUI's Hand-Eye +Calibration page under Configuration offers a guided process to +conduct the calibration routine manually. During the process, the +described approach requires the user to manually enter into the Web +GUI robot poses, which need to be accessed from the respective robot- +teaching or handheld device. + +Camera mounting + +As illustrated in + +Fig. 30 + + and + +Fig. 32 + +, two different use cases w.r.t. to the mounting of the camera +generally have to be considered: + +The camera is mounted on the robot, i.e., it is mechanically fixed to +a robot link (e.g., at its flange or a flange-mounted tool), and hence +moves with the robot. + +The camera is not mounted on the robot but is fixed to a table or +other place in the robot's vicinity and remains at a static position +w.r.t. the robot. + +While the general + +Calibration routine + + is very similar in both use cases, the calibration process's output, +i.e., the resulting calibration transform, will be semantically +different, and the fixture of the calibration grid will also differ. + +Calibration with a robot-mounted camera + When calibrating a robot-mounted camera with the robot, the + calibration grid has to be secured in a static position w.r.t. the + robot, e.g., on a table or some other fixed-base coordinate system + as sketched in + + Fig. 30 + + . + + Warning: It is extremely important that the calibration grid does + not move during step 2 of the + + Calibration routine + + . Securely fixing its position to prevent unintended movements + such as those caused by vibrations, moving cables, or the like is + therefore strongly recommended. + + The result of the calibration (step 3 of the + + Calibration routine + + ) is a pose \mathbf{T}^{\text{robot}}_{\text{camera}} describing + the (previously unknown) relative positional and rotational + transformation from the + + camera + + frame into the user-selected + + robot + + frame such that + + \mathbf{p}_{\text{robot}} = + \mathbf{R}^{\text{robot}}_{\text{camera}} \cdot + \mathbf{p}_{\text{camera}} + + \mathbf{t}^{\text{robot}}_{\text{camera}} \:, + + where \mathbf{p}_{\text{robot}} = (x,y,z)^T is a 3D point with its + coordinates expressed in the + + robot + + frame, \mathbf{p}_{\text{camera}} is the same point represented in + the + + camera + + coordinate frame, and \mathbf{R}^{\text{robot}}_{\text{camera}} as + well as \mathbf{t}^{\text{robot}}_{\text{camera}} are the + corresponding 3\times 3 rotation matrix and 3\times 1 translation + vector of the pose \mathbf{T}^{\text{robot}}_{\text{camera}}, + respectively. In practice, in the calibration result and in the + provided robot poses, the rotation is defined by Euler angles or as + quaternion instead of a rotation matrix (see + + Pose formats + + ). + + + Additional user input is required if the movement of the robot is + constrained and the robot can rotate the Tool Center Point (TCP) + only around one axis. This is typically the case for robots with + four Degrees Of Freedom (4DOF) that are often used for palletizing + tasks. In this case, the user must specify which axis of the + + robot + + frame is the rotation axis of the TCP. Further, the signed offset + from the TCP to the + + camera + + coordinate system along the TCP rotation axis has to be provided. + + Fig. 31 + + illustrates the situation. + + For the + + rc_visard NG + + , the camera coordinate system is located in the optical center of + the left camera. The approximate location is given in section + + Coordinate frames + + . + + +Calibration with a statically-mounted camera + In use cases where the camera is positioned statically w.r.t. the + robot, the calibration grid needs to be mounted to the robot as + shown for example in + + Fig. 32 + + and + + Fig. 33 + + . + + Note: The hand-eye calibration module is completely agnostic + about the exact mounting and positioning of the calibration grid + w.r.t. the user-defined + + robot + + frame. That means, the relative positioning of the calibration + grid to that frame neither needs to be known, nor it is relevant + for the calibration routine, as shown in + + Fig. 33 + + . + + Warning: It is extremely important that the calibration grid is + attached securely to the robot such that it does not change its + relative position w.r.t. the user-defined + + robot + + frame during step 2 of the + + Calibration routine + + . + + In this use case, the result of the calibration (step 3 of the + + Calibration routine + + ) is the pose \mathbf{T}^{\text{ext}}_{\text{camera}} describing + the (previously unknown) relative positional and rotational + transformation between the + + camera + + frame and the user-selected external reference frame + + ext + + such that + + \mathbf{p}_{\text{ext}} = + \mathbf{R}^{\text{ext}}_{\text{camera}} \cdot + \mathbf{p}_{\text{camera}} + + \mathbf{t}^{\text{ext}}_{\text{camera}} \:, + + where \mathbf{p}_{\text{ext}} = (x,y,z)^T is a 3D point with its + coordinates expressed in the external reference frame + + ext + + , \mathbf{p}_{\text{camera}} is the same point represented in the + + camera + + coordinate frame, and \mathbf{R}^{\text{ext}}_{\text{camera}} as + well as \mathbf{t}^{\text{ext}}_{\text{camera}} are the + corresponding 3\times 3 rotation matrix and 3\times 1 translation + vector of the pose \mathbf{T}^{\text{ext}}_{\text{camera}}, + respectively. In practice, in the calibration result and in the + provided robot poses, the rotation is defined by Euler angles or as + quaternion instead of a rotation matrix (see + + Pose formats + + ). + + + Additional user input is required if the movement of the robot is + constrained and the robot can rotate the Tool Center Point (TCP) + only around one axis. This is typically the case for robots with + four Degrees Of Freedom (4DOF) that are often used for palletizing + tasks. In this case, the user must specify which axis of the + + robot + + frame is the rotation axis of the TCP. Further, the signed offset + from the TCP to the visible surface of the calibration grid along + the TCP rotation axis has to be provided. The grid must be mounted + such that the TCP rotation axis is orthogonal to the grid. + + Fig. 34 + + illustrates the situation. + + +Calibration routine + +The hand-eye calibration can be performed manually using the + +Web GUI + + or programmatically via the + +REST-API interface + +. The general calibration routine will be described by following the +steps of the hand-eye calibration wizard provided on the Web GUI. This +wizard can be found in the + +rc_visard NG + +'s Web GUI under Configuration ‣ Hand-Eye Calibration. References to +the corresponding REST-API calls are provided at the appropriate +places. + +Step 1: Hand-Eye Calibration Status + +The starting page of the hand-eye calibration wizard shows the current +status of the hand-eye calibration. If a hand-eye calibration is saved +on the + +rc_visard NG + +, the calibration transformation is displayed here (see + +Fig. 35 + +). + + +To query the hand-eye calibration status programmatically, the +module's REST-API offers the "get_calibration" service call (see + +Services + +). An existing hand-eye calibration can be removed by pressing Remove +Calibration or using "remove_calibration" in the REST-API (see + +Services + +). + +To start a new hand-eye calibration, click on Perform Hand-Eye +Calibration or Next. + +Step 2: Checking Grid Detection + +To achieve good calibration results, the images should be well exposed +so that the calibration grid can be detected accurately and reliably. +In this step, the grid detection can be checked and the camera +settings can be adjusted if necessary. In case parts of the +calibration grid are overexposed, the respective squares of the +calibration grid will be highlighted in red. A successful grid +detection is visualized by green check marks on every square of the +calibration grid and a thick green border around the grid as shown in + +Fig. 36 + +. + + +Step 3: Record Poses + +In this step, the user records images of the calibration grid at +several different robot poses. These poses must each ensure that the +calibration grid is completely visible in the left camera image. +Furthermore, the robot poses need to be selected properly to achieve a +variety of different perspectives for the camera to perceive the +calibration grid. + +Fig. 37 + + shows a schematic recommendation of four different grid positions +which should be recorded from a close and a far point of view, +resulting in eight images for the calibration. + + +Warning: Calibration quality, i.e., the accuracy of the calculated + calibration result, depends on the calibration-grid views provided. + The more diverse the perspectives are, the better is the + calibration. Choosing very similar views, i.e., varying the robot + pose only slightly before recording a new calibration pose, may lead + to inaccurate estimation of the desired calibration transformation. + +After the robot reaches each calibration pose, the corresponding pose +\mathbf{T}^{\text{ext}}_{\text{robot}} of the user-defined + +robot + + frame in the user-defined external reference frame + +ext + + needs to be reported to the hand-eye calibration module. For this +purpose, the module offers different + +slots + + to store the reported poses and the corresponding left camera images. +All filled slots will then be used to calculate the desired +calibration transformation between the + +camera + + frame and either the user-defined + +robot + + frame (robot-mounted camera) or the user-defined external reference +frame + +ext + + (static camera). + +In the Web GUI, the user can choose between many different pose +formats for providing the calibration poses (see + +Pose formats + +). When calibrating using the REST-API, the poses are always given in + +XYZ+quaternion + +. The Web GUI offers eight slots ( + +Close View 1 + +, + +Close View 2 + +, etc.) for the user to fill manually with robot poses. Next to each +slot, a figure suggests a respective dedicated viewpoint on the grid. +For each slot, the robot should be operated to achieve the suggested +view. + + +To record a calibration pose, click on Set Pose for the respective +slot and enter the + +robot + + frame's pose into the respective text fields. The pose is then stored +with the corresponding camera image by clicking the Take Picture to +Proceed button. This will save the calibration pose in the respective +slot. + +To transmit the poses programmatically, the module's REST-API offers +the "set_pose" service call (see + +Services + +). + +Note: The user's acquisition of robot pose data depends on the robot + model and manufacturer -- it might be read from a teaching or + handheld device, which is shipped with the robot. + +Warning: Please be careful to correctly and accurately enter the + values; even small variations or typos may lead to calibration- + process failure. + +The Web GUI displays the currently saved poses (only with slot numbers +from 0 to 7) with their camera images and also allows to delete them +by clicking + +Delete Pose + + to remove a single pose, or clicking Clear all Poses to remove all +poses. In the REST-API the currently stored poses can be retrieved via +"get_poses" and removed via "delete_poses" for single poses or +"reset_calibration" for removing all poses (see + +Services + +). + +When at least four poses are set, the user can continue to the +computation of the calibration result by pressing Next. + +Note: To successfully calculate the hand-eye calibration + transformation, at least four different robot calibration poses need + to be reported and stored in slots. However, to prevent errors + induced by possible inaccurate measurements, at least + + eight calibration poses are recommended + + . + +Step 4: Compute Calibration + +Before computing the calibration result, the user has to provide the +correct calibration parameters. These include the exact calibration +grid dimensions and the sensor mounting type. The Web GUI also offers +settings for calibrating 4DOF robots. In this case, the rotation axis, +as well as the offset from the TCP to the camera coordinate system +(robot-mounted camera) or grid surface (statically mounted camera) +must be given. For the REST-API, the respective parameters are listed +in + +Parameters + +. + + +When the parameters are correct, the desired calibration +transformation can be computed from the collected poses and camera +images by clicking Compute Calibration. The REST-API offers this +functionality via the "calibrate" service call (see + +Services + +). + +Depending on the way the camera is mounted, the calibration result +contains the transformation (i.e., the pose) between the + +camera + + frame and either the user-defined + +robot + + frame (robot-mounted camera) or the user-defined external reference +frame + +ext + + (statically mounted camera); see + +Camera mounting + +. + +To enable users to judge the quality of the resulting calibration +transformation, the translational and rotational calibration errors +are reported, which are computed from the variance of the calibration +result. + +If the calibration error is not acceptable, the user can change the +calibration parameters and recompute the result, or return to step 3 +of the calibration procedure and add more poses or update poses. + +To save the calibration result, press Save Calibration or use the +REST-API "save_calibration" service call (see + +Services + +). + +Parameters + +The hand-eye calibration module is called "rc_hand_eye_calibration" in +the REST-API and is represented in the + +Web GUI + + under Configuration ‣ Hand-Eye Calibration. The user can change the +calibration parameters there or use the + +REST-API interface + +. + +Parameter overview + +This module offers the following run-time parameters: + +The rc_hand_eye_calibration module's run-time parameters +Name Type Min Max Default Description grid_height float64 0.0 +10.0 0.0 The height of the calibration pattern in meters grid_width +float64 0.0 10.0 0.0 The width of the calibration pattern in +meters robot_mounted bool false true true Whether the camera is +mounted on the robot tcp_offset float64 -10.0 10.0 0.0 Offset +from TCP along tcp_rotation_axis tcp_rotation_axis int32 -1 2 -1 +-1 for off, 0 for x, 1 for y, 2 for z + +Description of run-time parameters + +The parameter descriptions are given with the corresponding Web GUI +names in brackets. + +grid_width (Width) + + Width of the calibration grid in meters. The width should be given + with a very high accuracy, preferably with sub-millimeter accuracy. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/parameters?grid_width= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/parameters?grid_width= + +grid_height (Height) + + Height of the calibration grid in meters. The height should be + given with a very high accuracy, preferably with sub-millimeter + accuracy. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/parameters?grid_height= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/parameters?grid_height= + +robot_mounted (Sensor Mounting) + + If set to *true*, the camera is mounted on the robot. If set to + *false*, the camera is mounted statically and the calibration grid + is mounted on the robot. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/parameters?robot_mounted= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/parameters?robot_mounted= + +tcp_offset (TCP Offset) + + The signed offset from the TCP to the camera coordinate system + (robot-mounted sensor) or the visible surface of the calibration + grid (statically mounted sensor) along the TCP rotation axis in + meters. This is required if the robot's movement is constrained and + it can rotate its TCP only around one axis (e.g., 4DOF robot). + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/parameters?tcp_offset= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/parameters?tcp_offset= + +tcp_rotation_axis (TCP Rotation Axis) + + The axis of the + + robot + + frame around which the robot can rotate its TCP. 0 is used for X, + 1 for Y and 2 for the Z axis. This is required if the robot's + movement is constrained and it can rotate its TCP only around one + axis (e.g., 4DOF robot). -1 means that the robot can rotate its TCP + around two independent rotation axes. "tcp_offset" is ignored in + this case. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/parameters?tcp_rotation_axis= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/parameters?tcp_rotation_axis= + +Services + +The REST-API service calls offered to programmatically conduct the +hand-eye calibration and to restore this module's parameters are +explained below. + +get_calibration + + returns the hand-eye calibration currently stored on the + + rc_visard NG + + . + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/get_calibration + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/get_calibration + + Request + + This service has no arguments. + + Response + + The field "error" gives the calibration error in pixels which is + computed from the translational error "translation_error_meter" and + the rotational error "rotation_error_degree". This value is only + given for compatibility with older versions. The translational and + rotational errors should be preferred. + + Return codes of the get_calibration service call status + success Description 0 true returned valid calibration pose 2 + false calibration result is not available + + The definition for the response with corresponding datatypes is: + + { + "name": "get_calibration", + "response": { + "error": "float64", + "message": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "robot_mounted": "bool", + "rotation_error_degree": "float64", + "status": "int32", + "success": "bool", + "translation_error_meter": "float64" + } + } + +remove_calibration + + removes the persistent hand-eye calibration on the + + rc_visard NG + + . After this call the "get_calibration" service reports again that + no hand-eye calibration is available. This service call will also + delete all the stored calibration poses and corresponding camera + images in the "slots". + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/remove_calibration + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/remove_calibration + + Request + + This service has no arguments. + + Response + + Return codes of the get_calibration service call status + success Description 0 true removed persistent calibration, + device reports as uncalibrated 1 true no persistent calibration + found, device reports as uncalibrated 2 false could not remove + persistent calibration + + The definition for the response with corresponding datatypes is: + + { + "name": "remove_calibration", + "response": { + "message": "string", + "status": "int32", + "success": "bool" + } + } + +set_pose + + allows to provide a robot pose as calibration pose to the hand-eye + calibration routine and records the current image of the + calibration grid. + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/set_pose + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/set_pose + + Request + + The "slot" argument is used to assign unique numbers to the + different calibration poses. The range for "slot" is from 0 to 15. + At each instant when "set_pose" is called, an image is recorded. + This service call fails if the grid was undetectable in the current + image. + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "slot": "uint32" + } + } + + Response + + Return codes of the set_pose service call status success + Description 1 true pose stored successfully 3 true pose + stored successfully; collected enough poses for calibration, i.e., + ready to calibrate 4 false calibration grid was not detected, + e.g., not fully visible in camera image 8 false no image data + available 12 false given orientation values are invalid 13 + false invalid slot number + + The field "overexposed" indicates if parts of the calibration grid + were overexposed in this image. + + The definition for the response with corresponding datatypes is: + + { + "name": "set_pose", + "response": { + "message": "string", + "overexposed": "bool", + "status": "int32", + "success": "bool" + } + } + +get_poses + + returns the robot poses that are currently stored for the hand-eye + calibration routine. + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/get_poses + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/get_poses + + Request + + This service has no arguments. + + Response + + Return codes of the get_poses service call status success + Description 0 true stored poses are returned 1 true no + calibration pose available + + The field "overexposed" indicates if parts of the calibration grid + were overexposed in this image. + + The definition for the response with corresponding datatypes is: + + { + "name": "get_poses", + "response": { + "message": "string", + "poses": [ + { + "overexposed": "bool", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "slot": "uint32" + } + ], + "status": "int32", + "success": "bool" + } + } + +delete_poses + + deletes the calibration poses and corresponding images with the + specified "slots". + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/delete_poses + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/delete_poses + + Request + + The "slots" argument specifies which calibration poses should be + deleted. If no slots are provided, nothing will be deleted. + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "slots": [ + "uint32" + ] + } + } + + Response + + Return codes of the delete_poses service call status + success Description 0 true poses successfully deleted 1 true + no slots given + + The definition for the response with corresponding datatypes is: + + { + "name": "delete_poses", + "response": { + "message": "string", + "status": "int32", + "success": "bool" + } + } + +reset_calibration + + deletes all previously provided poses and corresponding images. The + last saved calibration result is reloaded. This service might be + used to (re-)start the hand-eye calibration from scratch. + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/reset_calibration + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/reset_calibration + + Request + + This service has no arguments. + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "reset_calibration", + "response": { + "message": "string", + "status": "int32", + "success": "bool" + } + } + +calibrate + + calculates and returns the hand-eye calibration transformation with + the robot poses configured by the "set_pose" service. + + Details + + "save_calibration" must be called to make the calibration available + for other modules via the "get_calibration" service call and to + store it persistently. + + Note: For calculating the hand-eye calibration transformation at + least four robot calibration poses are required (see "set_pose" + service). However, eight calibration poses are recommended. + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/calibrate + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/calibrate + + Request + + This service has no arguments. + + Response + + The field "error" gives the calibration error in pixels which is + computed from the translational error "translation_error_meter" and + the rotational error "rotation_error_degree". This value is only + given for compatibility with older versions. The translational and + rotational errors should be preferred. + + Return codes of the calibrate service call status success + Description 0 true calibration successful, returned calibration + result 1 false not enough poses to perform calibration 2 false + calibration result is invalid, please verify the input data 3 + false given calibration grid dimensions are not valid 4 false + insufficient rotation, tcp_offset and tcp_rotation_axis must be + specified 5 false sufficient rotation available, + tcp_rotation_axis must be set to -1 6 false poses are not + distinct enough from each other + + The definition for the response with corresponding datatypes is: + + { + "name": "calibrate", + "response": { + "error": "float64", + "message": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "robot_mounted": "bool", + "rotation_error_degree": "float64", + "status": "int32", + "success": "bool", + "translation_error_meter": "float64" + } + } + +save_calibration + + persistently saves the result of hand-eye calibration to the + + rc_visard NG + + and overwrites the existing one. The stored result can be + retrieved any time by the "get_calibration" service. This service + call will also delete all the stored calibration poses and + corresponding camera images in the "slots". + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/save_calibration + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/save_calibration + + Request + + This service has no arguments. + + Response + + Return codes of the save_calibration service call status + success Description 0 true calibration saved successfully 1 + false could not save calibration file 2 false calibration + result is not available + + The definition for the response with corresponding datatypes is: + + { + "name": "save_calibration", + "response": { + "message": "string", + "status": "int32", + "success": "bool" + } + } + +set_calibration + + sets the hand-eye calibration transformation with arguments of this + call. + + Details + + The calibration transformation is expected in the same format as + returned by the "calibrate" and "get_calibration" calls. The given + calibration information is also stored persistently on the sensor + by internally calling "save_calibration". + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/set_calibration + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/set_calibration + + Request + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "robot_mounted": "bool" + } + } + + Response + + Return codes of the set_calibration service call status + success Description 0 true setting the calibration + transformation was successful 12 false given orientation values + are invalid + + The definition for the response with corresponding datatypes is: + + { + "name": "set_calibration", + "response": { + "message": "string", + "status": "int32", + "success": "bool" + } + } + +reset_defaults + + restores and applies the default values for this module's + parameters ("factory reset"). Does not affect the calibration + result itself or any of the "slots" saved during calibration. Only + parameters such as the grid dimensions and the mount type will be + reset. + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/reset_defaults + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_hand_eye_calibration/services/reset_defaults + + Request + + This service has no arguments. + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "reset_defaults", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } diff --git a/v24.04/en/_sources/hardware_spec.rst.txt b/v24.04/en/_sources/hardware_spec.rst.txt new file mode 100644 index 0000000..52541b5 --- /dev/null +++ b/v24.04/en/_sources/hardware_spec.rst.txt @@ -0,0 +1,384 @@ +Hardware specification + +Note: The following hardware specifications are provided here as a + general reference; differences with the product may exist. + +Scope of delivery + +Standard delivery for an + +rc_visard NG + + includes the + +rc_visard NG + + sensor and a quickstart guide only. The full manual is available in +digital form and is always installed on the sensor, accessible through +the + +Web GUI + +, and available at + +http://www.roboception.com/documentation + +. + +Note: The following items are not included in the delivery unless + otherwise specified: + + Couplings, adapters, mounts + + Power supply unit, cabling, and fuses + + Network cabling + + Please refer to + + Accessories + + for suggested third-party cable vendors. + +A connectivity kit can be purchased for the + +rc_visard NG + +. It contains an M12 to RJ45 network cable, 24 V power supply, and a +DC plug to M12 power adapter. Please refer to + +Accessories + + for details. + +Note: The connectivity kit is intended only for initial setup, not + for permanent installation in industrial environment. + +The following picture shows the important parts of the + +rc_visard NG + + which are referenced later in the documentation. + + +Technical specification + +The technical specifications for the + +rc_visard NG + + are given in + +Table 1 + +. The frame rate for computing the depth image in High resolution (720 +x 540 pixel) is significantly higher when increasing the minimum +distance to 1.2 meters. + +Technical specifications for the rc_visard NG rc_visard NG +160-6 Image resolution 1440 x 1080 pixel, monochrome Field of view +6 mm lens: Horizontal: 43°, Vertical: 33° IR Cutoff 650 nm Depth +image (with Minimum Distance of 0.5 m) 1440 x 1080 pixel (Full) @ 3 +Hz 720 x 540 pixel (High) @ 7 Hz 360 x 270 pixel (Medium) @ 25 Hz +240 x 180 pixel (Low) @ 25 Hz Depth image (with Minimum Distance of +1.2 m) 1440 x 1080 pixel (Full) @ 3 Hz 720 x 540 pixel (High) @ 16 +Hz 360 x 270 pixel (Medium) @ 25 Hz 240 x 180 pixel (Low) @ 25 Hz +Computing unit Orin Nano 8GB Power supply 18 V to 30 V Cooling +Passive Baseline 160 mm Depth range 0.5 m to infinity Size (W x H +x L) 230 mm x 75 mm x 84 mm Mass 0.965 kg + +The resolutions and accuracies at different distances are given in the +following table. + +Resolution and accuracy of the rc_visard NG in millimeters with full +resolution stereo matching and random dot projection on non-reflective +and non-transparent objects. distance (mm) rc_visard NG +160-6 lateral resolution (mm) 500 1000 2000 3000 0.3 0.6 1.1 +1.7 depth resolution (mm) 500 1000 2000 3000 0.05 0.2 0.9 2.0 +Average depth accuracy (mm) 500 1000 2000 3000 0.2 0.9 3.5 7.8 + +The + +rc_visard NG + + can be equipped with on-board software modules for additional +features. These software modules can be ordered from the Roboception +and require a license update. + + +CAD models of the + +rc_visard NG + + can be downloaded from + +http://www.roboception.com/download + +. The CAD models are provided as-is, with no guarantee of correctness. +When a material property of aluminum is assigned (density of +2.76\mathrm{g\over{cm}^3}), the mass properties of the CAD model are +within 5% of the actual product with respect to weight and center of +mass, and within 10% with respect to moment of inertia. + +Environmental and operating conditions + +The + +rc_visard NG + + is designed for industrial applications. Always respect the storage, +transport, and operating environmental conditions outlined in + +Table 3 + +. + +Environmental conditions rc_visard NG Storage/Transport +temperature -25 °C to 70 °C Operating temperature 0 °C to 50 °C +Relative humidity (non condensing) 20 % to 80 % Vibration 5 g +Shock 50 g Protection class IP54 Others Free from corrosive +liquids or gases Free from explosive liquids or gases Free from +powerful electromagnetic interference + +The + +rc_visard NG + + is designed for an operating temperature (surrounding environment) of +0 °C to 50 °C and relies on convective (passive) cooling. Unobstructed +airflow, especially around the cooling fins, needs to be ensured +during use. The + +rc_visard NG + + should only be mounted using the provided mechanical mounting +interface, and all parts of the housing must remain uncovered. A free +space of at least 10 cm extending in all directions from the housing, +and sufficient air exchange with the environment is required to ensure +adequate cooling. Cooling fins must be free of dirt and other +contamination. + +The housing temperature depends on the processing load, sensor +orientation, and surrounding environmental temperatures. When the +sensor's exposed housing surfaces exceed 60°C, the LED at the front +will turn from green to red. + +Warning: For hand-guided applications, a heat-insulated handle + should be attached to the sensor to reduce the risk of burn injuries + due to skin exposure to surface temperatures exceeding 60°C. + +Power-supply specifications + +The + +rc_visard NG + + needs to be supplied by a DC voltage source. The + +rc_visard NG + +'s standard package doesn't include a DC power supply. The power +supply contained in the connectivity kit may be used for initial +setup. For permanent installation, it is the customer's responsibility +to provide suitable DC power. Each + +rc_visard NG + + must be connected to a separate power supply. Connection to domestic +grid power is only allowed through a power supply certified as EN55011 +Class B. + +Absolute maximum ratings for power supply Min Nominal Max +Supply voltage 18.0 V 24 V 30.0 V Max power consumption 25 W +Overcurrent protection Supply must be fuse-protected to a maximum of +2 A + +Warning: Exceeding maximum power rating values may lead to damage of + the + + rc_visard NG + + , power supply, and connected equipment. + +Warning: A separate power supply must power each + + rc_visard NG + + . + +Warning: Connection to domestic grid power is allowed through a + power supply certified as EN55011 Class B only. + +Wiring + +Cables are not provided with the + +rc_visard NG + + standard package. It is the customer's responsibility to obtain the +proper cabling. + +Accessories + + provides an overview of suggested components. + +Warning: Proper cable management is mandatory. Cabling must always + be secured to the + + rc_visard NG + + mount with a strain-relief clamp so that no forces due to cable + movements are exerted on the + + rc_visard NG + + 's M12 connectors. Enough slack needs to be provided to allow for + full range of movement of the + + rc_visard NG + + without straining the cable. The cable's minimum bend radius needs + to be observed. + +The + +rc_visard NG + + provides an industrial 8-pin A-coded M12 socket connector for +Ethernet connectivity and an 8-pin A-coded M12 plug connector for +power and GPIO connectivity. Both connectors are located at the back. +The location of both connectors on the + +rc_visard NG + + is shown in + +Fig. 4 + +. + + +Connectors are rotated so that standard 90° angled connectors will +exit horizontally, away from the camera (away from the cooling fins). + + +Pin assignments for the Ethernet connector are given in + +Fig. 6 + +. + + +Pin assignments for the power connector are given in + +Table 5 + +. + +Pin assignments for the power connector Pin Assignment 1 GPIO +In 2 2 Power 3 GPIO In 1 4 GPIO Gnd 5 GPIO Vcc 6 GPIO Out 1 +(image exposure) 7 Gnd 8 GPIO Out 2 + +GPIOs are decoupled by photocoupler. + +GPIO Out 1 + + by default provides an exposure sync signal with a logic high level +for the duration of the image exposure. All GPIOs can be controlled +via the IOControl module ( + +IO and Projector Control + +). Pins of unsused GPIOs should be left floating. + +Warning: It is especially important that during the boot phase + + GPIO In 1 + + is left floating or remains low. The + + rc_visard NG + + will not boot if the pin is high during boot time. + +GPIO circuitry and specifications are shown in + +Fig. 7 + +. The maximum rated voltage for + +GPIO In + + and + +GPIO Vcc + + is 30 V. + + +Warning: Do not connect signals with voltages higher than 30 V to + the + + rc_visard NG + + . + +Mechanical interface + +The + +rc_visard NG + + offers a mounting-point at the bottom. + + +For troubleshooting and static applications, the sensor may be mounted +using the standardized tripod thread (UNC 1/4"-20) indicated at the +coordinate-frame origin. For dynamic applications such as mounting on +a robotic arm, the sensor must be mounted with three M4 (metric +standard) 8.8 machine screws tightened to 2.5 Nm and secured with a +medium-strength threadlocking adhesive such as Loctite 243. Maximum +thread depth is 6 mm. The two 4 mm diameter holes may be used for +positioning pins (ISO 2338 4 m6) to ensure precise repositioning of +the sensor. + +Warning: For dynamic applications, the + + rc_visard NG + + must be mounted with three M4 8.8 machine screws tightened to 2.5 + Nm torque and secured with threadlocking adhesive. Do not use high- + strength bolts. The engaged thread depth must be at least 5 mm. + +Coordinate frames + +The + +rc_visard NG + +'s coordinate-frame origin is defined as the exit pupil of the left +camera lens. This frame is called sensor coordinate frame or camera +coordinate frame. An approximate location for the + +rc_visard NG + + is shown in the next image. + +The mounting-point frame for the + +rc_visard NG + + is defined to be at the bottom, centered in the tripod thread, with +orientation identical to that of the sensor's coordinate frame. + +Fig. 9 + + shows approximate offsets. + + +Note: The correct offset between the sensor/camera frame and a robot + coordinate frame can be calibrated through the + + hand-eye-calibration procedure + + . diff --git a/v24.04/en/_sources/index.rst.txt b/v24.04/en/_sources/index.rst.txt new file mode 100644 index 0000000..0f18efc --- /dev/null +++ b/v24.04/en/_sources/index.rst.txt @@ -0,0 +1,2 @@ +Roboception rc_visard NG User Manual + diff --git a/v24.04/en/_sources/installation.rst.txt b/v24.04/en/_sources/installation.rst.txt new file mode 100644 index 0000000..4408b8f --- /dev/null +++ b/v24.04/en/_sources/installation.rst.txt @@ -0,0 +1,355 @@ +Installation + +Warning: The instructions on + + Safety + + related to the + + rc_visard NG + + must be read and understood prior to installation. + +The + +rc_visard NG + + offers a Gigabit Ethernet interface for connecting the device to a +computer network. All communications to and from the device are +performed via this interface. The + +rc_visard NG + + has an on-board computing resource that requires booting time after +powering up the device. + +Software license + +Every + +rc_visard NG + + device ships with a pre-installed license file for licensing and +protection of the installed software packages. The license is bound to +that specific + +rc_visard NG + + device and cannot be used or transferred to other devices. + +The functionality of the + +rc_visard NG + + can be enhanced anytime by + +upgrading the license + +, e.g., for optionally available software modules. + +Note: The + + rc_visard NG + + requires to be rebooted whenever the installed licenses have + changed. + +Note: The license status can be retrieved via the + + rc_visard NG + + 's various interfaces such as the System ‣ Firmware & License page + of the + + Web GUI + + . + +Power up + +Note: Always fully connect and tighten the M12 power connector on + the + + rc_visard NG + + + before + + turning on the power supply. + +After connecting the + +rc_visard NG + + to the power, the LED on the front of the device should immediately +illuminate. During the device's boot process, the LED will change +color and will eventually turn green. This signals that all processes +are up and running. + +If the network is not plugged in or the network is not properly +configured, then the LED will flash red every 5 seconds. In this case, +the device's network configuration should be verified. See + +LED colors + + for more information on the LED color codes. + +Discovery of rc_visard NG devices + +Roboception + +rc_visard NG + + devices that are powered up and connected to the local network or +directly to a computer can be found using the standard GigE Vision® +discovery mechanism. + +Roboception offers the open-source tool "rcdiscover-gui", which can be +downloaded free of charge from + +https://github.com/roboception/rcdiscover/releases + + for Windows and Linux. The tool's Windows version consists of a +single executable for Windows 7, 10 and 11, which can be executed +without installation. For Linux an installation package is available +for Ubuntu. + +At startup, all available GigE Vision® devices -- including + +rc_visard NG + + devices -- are listed with their names, serial numbers, current IP +addresses, and unique MAC addresses. The discovery tool finds all +devices reachable by global broadcasts. Misconfigured devices that are +located in different subnets than the application host may also be +listed. A tickmark in the discovery tool indicates whether devices are +actually reachable via a web browser. + + +After successful discovery, a double click on the device row opens the + +Web GUI + + of the device in the operating system's default web browser. Google +Chrome or Mozilla Firefox are recommended as web browser. + +Resetting configuration + +A misconfigured device can be reset by using the + +Reset rc_visard + + button in the discovery tool. The reset mechanism is only available +for two minutes after device startup. Thus, the + +rc_visard NG + + may require rebooting before being able to reset the device. + + +If the discovery tool still successfully detects the the misconfigured + +rc_visard NG + +, then the latter can be selected from the + +rc-visard + + drop-down menu. Otherwise, the + +rc_visard NG + +'s MAC address, which is printed on the device label, can be entered +manually into the designated fields. + +One of four options can be chosen after entering the MAC address: + +Reset Parameters: Reset all rc_visard NG parameters, such as frame +rate, that are configurable via Web GUI\ (Section \ref{webgui:sect- +web-gui}). + +Reset Network: Reset network settings and user-defined name. + +Reset All: Reset the rc_visard NG parameters as well as network +settings and user-defined name. + +Switch Partitions: Allows a rollback to be performed as described in +Restoring the previous firmware version\:(Section \ref{maintenance +:sect-restoring-the-previous-firmware-version}). + +A white status LED followed by a device reboot indicates a successful +reset. If no reaction is noticeable, the two minutes time slot may +have elapsed, requiring another reboot. + +Note: The reset mechanism is only available for the first two + minutes after startup. + +Network configuration + +The + +rc_visard NG + + requires an Internet Protocol ( + +IP + +) address for communication with other network devices. The IP address +must be unique in the local network, and can be set either manually +via a user-configurable persistent IP address, or automatically via + +DHCP + +. If none of these IP configuration methods apply, the + +rc_visard NG + + falls back to a + +Link-Local + + IP address. + +Following the + +GigE Vision + +® standard, the priority of IP configuration methods on the + +rc_visard NG + + is + + Persistent IP (if enabled) + + DHCP (if enabled) + + Link-Local + + +Options for changing the + +rc_visard NG + +'s network settings and IP configuration are: + + the System ‣ Network page of the rc_visard NG's Web GUI -- if it is + reachable in the local network already, see Web GUI\:(Section + \ref{webgui:sect-web-gui}) + + any configuration tool compatible with GigE Vision® 2.0, or + Roboception's command-line tool gc_config. Typically, these tools + scan for all available GigE Vision® devices on the network. All + rc_visard NG devices can be uniquely identified by their serial + number and MAC address, which are both printed on the device. + + temporarily changing or completely resetting the rc_visard NG's + network configuration via Roboception's rcdiscover-gui tool, see + Discovery of rc_visard NG devices\:(Section \ref{installation:sect- + discovery-of-rcvisard-devices}) + +Note: The command-line tool "gc_config" is part of Roboception's + open- source convenience layer "rc_genicam_api", which can be + downloaded free of charge for Windows and Linux from + + http://www.roboception.com/download + + . + +Host name + +The + +rc_visard NG + +'s host name is based on its serial number, which is printed on the +device, and is defined as "rc-visard-ng-". + +Automatic configuration (factory default) + +The Dynamic Host Configuration Protocol ( + +DHCP + +) is preferred for setting an IP address. If DHCP is active on the + +rc_visard NG + +, which is the factory default, the device tries to contact a DHCP +server at startup and every time the network cable is being plugged +in. If a DHCP server is available on the network, the IP address is +automatically configured. + +In some networks, the DHCP server is configured so that it only +accepts known devices. In this case, the Media Access Control address +( + +MAC address + +), which is printed on the device label, needs to be configured in the +DHCP server. At the same time, the + +rc_visard NG + +'s host name can also be set in the Domain Name Server ( + +DNS + +). Both MAC address and host name should be sent to the network +administrator for configuration. + +If the + +rc_visard NG + + cannot contact a DHCP server within about 15 seconds after startup, +or after plugging in the network cable, it assigns itself a unique IP +address. This process is called + +Link-Local + +. This option is especially useful for connecting the + +rc_visard NG + + directly to a computer. The computer must be configured for Link- +Local as well. Link-Local might already be configured as a standard +fallback option, as it is under Windows 10. Other operating systems +such as Linux require Link-Local to be explicitly configured in their +network managers. + +Manual configuration + +Specifying a persistent, i.e. static IP address manually might be +useful in some cases. This address is stored on the + +rc_visard NG + + to be used on device startup or network reconnection. Please make +sure the selected IP address, subnet mask and gateway will not cause +any conflicts on the network. + +Warning: The IP address must be unique within the local network and + within the local network's range of valid addresses. Furthermore, + the subnet mask must match the local network; otherwise, the + + rc_visard NG + + may become inaccessible. This can be avoided by using automatic + configuration as explained in + + Automatic configuration (factory default) + + . + +If this IP address cannot be assigned, e.g. because it is already used +by another device in the network, IP configuration will fall back to +automatic configuration via + +DHCP + + (if enabled) or a + +Link-Local + + address. diff --git a/v24.04/en/_sources/interfaces.rst.txt b/v24.04/en/_sources/interfaces.rst.txt new file mode 100644 index 0000000..258320e --- /dev/null +++ b/v24.04/en/_sources/interfaces.rst.txt @@ -0,0 +1,28 @@ +Interfaces + +The following interfaces are provided for configuring and obtaining +data from the + +rc_visard NG + +: + +Web GUI\:(Section \ref{webgui:sect-web-gui}) Easy-to-use graphical +interface to configure the rc_visard NG, do calibrations, view live +images, do service calls, visualize results, etc. + +GigE Vision 2.0/GenICam\:(Section \ref{gigevision:sect-genicam}) +Images and camera related configuration. + +REST API\:(Section \ref{rest_api:sect-rest-api}) API to configure the +rc_visard NG, query status information, do service calls, etc. + +Ethernet KRL Interface (EKI)\:(Section \ref{eki:sect-eki}) API to +configure the rc_visard NG and do service calls from KUKA KSS robots. + +gRPC image stream\:(Section \ref{grpc:sect-grpc}) Stream synchronized +image sets via gRPC. + +Time synchronization\:(Section \ref{time_sync:sect-time-sync}) Time +synchronization between the rc_visard NG and the application host. + diff --git a/v24.04/en/_sources/iocontrol.rst.txt b/v24.04/en/_sources/iocontrol.rst.txt new file mode 100644 index 0000000..9e01b4e --- /dev/null +++ b/v24.04/en/_sources/iocontrol.rst.txt @@ -0,0 +1,253 @@ +IO and Projector Control + +The IOControl module is an on-board module of the + +rc_visard + +. + +The IOControl module allows reading the status of the general purpose +digital inputs and controlling the digital general purpose outputs +(GPIOs) of the + +rc_visard + +. The outputs can be set to LOW or HIGH, or configured to be HIGH for +the exposure time of every image or every second image. + +The purpose of the IOControl module is the control of an external +light source or a projector, which is connected to one of the + +rc_visard + +'s GPIOs to be synchronized by the image acquisition trigger. In case +a pattern projector is used to improve stereo matching, the intensity +images also show the projected pattern, which might be a disadvantage +for image processing tasks that are based on the intensity image (e.g. +edge detection). For this reason, the IOControl module allows setting +GPIO outputs to HIGH for the exposure time of every second image, so +that intensity images without the projected pattern are also +available. + +Note: For more details on the + + rc_visard NG + + 's GPIOs please refer to + + Wiring + + . + +Parameters + +The IOControl module is called "rc_iocontrol" in the REST-API and is +represented in the + +Web GUI + + under Configuration ‣ IOControl. The user can change the parameters +via the Web GUI, the + +REST-API interface + +, or via GigE Vision using the DigitalIOControl parameters +"LineSelector" and "LineSource" ( + +Category: DigitalIOControl + +). + +Parameter overview + +This module offers the following run-time parameters: + +The rc_iocontrol module's run-time parameters Name Type +Min Max Default Description out1_mode string - - Low Out1 +mode: [Low, High, ExposureActive, ExposureAlternateActive] out2_mode +string - - Low Out2 mode: [Low, High, ExposureActive, +ExposureAlternateActive] + +Description of run-time parameters + +out1_mode and out2_mode (Out1 and Out2) + + The output modes for GPIO Out 1 and Out 2 can be set + individually: + + "Low" sets the output permanently to LOW. This is the factory + default. + + "High" sets the output permanently to HIGH. + + "ExposureActive" sets the output to HIGH for the exposure time + of every image. + + "ExposureAlternateActive" sets the output to HIGH for the + exposure time of every second image. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_iocontrol/parameters/parameters?= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_iocontrol/parameters?= + +Fig. 48 + + shows which images are used for stereo matching and transmission via +GigE Vision in "ExposureActive" mode with a user-defined frame rate of +8 Hz. + + +The mode "ExposureAlternateActive" is meant to be used when an +external random dot projector is connected to the + +rc_visard + +'s GPIO Out 1. When setting Out 1 to "ExposureAlternateActive", the + +stereo matching + + module only uses images with GPIO Out 1 being HIGH, i.e. projector is +on. The maximum frame rate that is used for stereo matching is +therefore half of the frame rate configured by the user (see + +FPS + +). All modules which make use of the intensity image, like + +TagDetect + + and + +ItemPick + +, use the intensity images with GPIO Out 1 being LOW, i.e. projector +is off. + +Fig. 49 + + shows an example. + + +Note: In "ExposureAlternateActive" mode, an intensity image with + GPIO Out 1 being HIGH (i.e. with projection) is always 40 ms away + from an intensity image with Out 1 being LOW (i.e. without + projection), regardless of the user-defined frame rate. This needs + to be considered when synchronizing disparity images and camera + images without projection in this special mode. + +The functionality can also be controlled by the DigitalIOControl +parameters of the GenICam interface ( + +Category: DigitalIOControl + +). + +Services + +Each service response contains a "return_code", which consists of a +"value" plus an optional "message". A successful service returns with +a "return_code" value of "0". Negative "return_code" values indicate +that the service failed. Positive "return_code" values indicate that +the service succeeded with additional information. + +The IOControl module offers the following services. + +get_io_values + + Retrieves the current state of the + + rc_visard + + 's general purpose inputs and outputs (GPIOs). + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_iocontrol/services/get_io_values + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_iocontrol/services/get_io_values + + Request + + This service has no arguments. + + Response + + The returned "timestamp" is the time of measurement. + + "input_mask" and "output_mask" are bit masks defining which bits + are used for input and output values, respectively. + + "values" holds the values of the bits corresponding to input and + output as given by the "input_mask" and "output_mask". + + "return_code" holds possible warnings or error codes and messages. + Possible "return_code" values are shown below. + + Code Description 0 Success -2 Internal error -9 License + for IOControl is not available + + The definition for the response with corresponding datatypes is: + + { + "name": "get_io_values", + "response": { + "input_mask": "uint32", + "output_mask": "uint32", + "return_code": { + "message": "string", + "value": "int16" + }, + "timestamp": { + "nsec": "int32", + "sec": "int32" + }, + "values": "uint32" + } + } + +reset_defaults + + Restores and applies the default values for this module's + parameters ("factory reset"). + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_iocontrol/services/reset_defaults + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_iocontrol/services/reset_defaults + + Request + + This service has no arguments. + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "reset_defaults", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } diff --git a/v24.04/en/_sources/itempick.rst.txt b/v24.04/en/_sources/itempick.rst.txt new file mode 100644 index 0000000..eece828 --- /dev/null +++ b/v24.04/en/_sources/itempick.rst.txt @@ -0,0 +1,1993 @@ +ItemPick and BoxPick + +Introduction + +The ItemPick and BoxPick modules provide out-of-the-box perception +solutions for robotic pick-and-place applications. ItemPick targets +the detection of flat surfaces of unknown objects for picking with a +suction gripper. BoxPick detects rectangular surfaces and determines +their position, orientation and size for grasping. With the +Match +extension, BoxPick can be used to detect textured rectangles with +consistent orientations. The interface of both modules is very +similar. Therefore both modules are described together in this +chapter. + +In addition, both modules offer: + +A dedicated page on the rc_visard NG Web GUI\:(Section \ref{webgui +:sect-web-gui}) for easy setup, configuration, testing, and +application tuning. + +The definition of regions of interest to select relevant volumes in +the scene (see RoiDB, Section \ref{roi:sect-roi}). + +A load carrier detection functionality for bin-picking applications +(see LoadCarrier, Section \ref{loadcarrier:sect-loadcarrier}), to +provide grasps for items inside a bin only. + +The definition of compartments inside a load carrier to provide grasps +for specific volumes of the bin only. + +Support for static and robot-mounted cameras and optional integration +with the Hand-eye calibration (Section \ref{handeye_calibration:sect- +handeye-calibration}) module, to provide grasps in the user-configured +external reference frame. + +A quality value associated to each suggested grasp and related to the +flatness of the grasping surface. + +Selection of a sorting strategy to sort the returned grasps. + +3D visualization of the detection results with grasp points and +gripper animations in the Web GUI. + +Note: In this chapter, cluster and surface are used as synonyms and + identify a set of points (or pixels) with defined geometrical + properties. + +The modules are optional on-board modules of the + +rc_visard NG + + and require separate ItemPick or BoxPick + +licenses + + to be purchased. The +Match extension of BoxPick requires an extra +license. + +Detection of items (BoxPick) + +There are two different types of models for the rectangles to be +detected by the BoxPick module. + +Per default, BoxPick only supports "item_models" of "type" +"RECTANGLE". With the +Match extension, also item models of "type" +"TEXTURED_BOX" can be detected. The detection of the different item +model types is described below. + +Optionally, further information can be given to the BoxPick module: + +The ID of the load carrier which contains the items to be detected. + +A compartment inside the load carrier where to detect items. + +The ID of the region of interest where to search for the load carriers +if a load carrier is set. Otherwise, the ID of the region of interest +where to search for the items. + +The current robot pose in case the camera is mounted on the robot and +the chosen coordinate frame for the poses is external or the chosen +region of interest is defined in the external frame. + +The returned "pose" of a detected "item" is the pose of the center of +the detected rectangle in the desired reference frame ("pose_frame"), +with its z axis pointing towards the camera and the x axis aligned +with the long side of the item. This pose has a 180° rotation +ambiguity around the z axis, which can be resolved by using the +Match +extension with a "TEXTURED_BOX" item model. Each detected item +includes a "uuid" (Universally Unique Identifier) and the "timestamp" +of the oldest image that was used to detect it. + +Detection of items of type RECTANGLE (BoxPick) + +BoxPick supports multiple "item_models" of "type" "RECTANGLE". Each +item model is defined by its minimum and maximum size, with the +minimum dimensions strictly smaller than the maximum dimensions. The +dimensions should be given fairly accurately to avoid misdetections, +while still considering a certain tolerance to account for possible +production variations and measurement inaccuracies. + +The detection of the rectangles runs in several steps. First, the +point cloud is segmented into preferably plane clusters. Then, +straight line segments are detected in the 2D images and projected +onto the corresponding clusters. The clusters and the detected lines +are visualized in the "Intermediate Result" visualization on the Web +GUI's + +BoxPick + + page. Finally, for each cluster, the set of rectangles best fitting +to the detected line segments is extracted. + +Detection of items of type TEXTURED_BOX (BoxPick+Match) + +With the +Match extension, BoxPick additionally supports "item_models" +of "type" "TEXTURED_BOX". When this item model type is used, only one +item model can be given for each request. + +The "TEXTURED_BOX" item model type should be used to detect multiple +rectangles that have the same texture, i.e. the same look or print, +such as printed product packaging, labels, brochures or books. It is +required that for all objects the texture is at the same position with +respect to the object geometry. Furthermore, the texture should not be +repetitive. + +A "TEXTURED_BOX" item is defined by the item's exact "dimensions" "x", +"y" and "z" (currently "z" must always be 0) with a tolerance +"dimensions_tolerance_m" that indicates, how much the detected +dimensions are allowed to deviate from the given dimensions. By +default, a tolerance of 0.01 m is assumed. Furthermore, a +"template_id" must be given, which will be used to refer to the +specified dimensions and the textures of the detected rectangles. +Additionally, the maximum possible deformation of the items +"max_deformation_m" can be given in meters (default 0.004 m), to +account for rigid or more flexible objects. + +If a "template_id" is used for the first time, BoxPick will run the +detection of rectangles as for the item model type "RECTANGLE", and +use the given dimensions tolerance to specify the dimensions range. +From the detected rectangles, so-called + +views + + are created, which contain the shape and the image intensity values +of the rectangles, and are stored in a newly created template with the +given "template_id". The views are created iteratively: Starting from +the detected rectangle with the highest score, a view is created and +then used to detect more rectangles with the same texture. Then, all +remaining clusters are used to detect further rectangles by the given +dimensions range and again a view is created from the best rectangle +and used for further detections. Each template can store up to 10 +different views, for example corresponding to different types of the +same product packaging. Each view will be assigned a unique ID +("view_uuid") and all rectangle items with a matching texture will be +assigned the same "view_uuid". That also means that all items with the +same "view_uuid" will have consistent orientations, because the +orientation of each item is aligned with its texture. The views can be +displayed, deleted and the orientation of each view can be set via the + +Web GUI + + by clicking on the template or its edit symbol in the template list. +Each detected item contains a field "view_pose_set" indicating whether +the orientation of the item's view was explicitly set or is still +unset at its original random state, which has a 180° ambiguity. The +"type" of a returned item with a "view_uuid" will be +"TEXTURED_RECTANGLE". + +If the template with the given "template_id" already exists, the +existing views will be used to detect rectangles based on their +texture. If additional rectangles are found with matching dimensions, +but different texture, new views will be generated and added to the +template. When the maximum number of views is reached, views that are +matched only rarely will be deleted so that newly generated views can +be added to the template and the template is kept up-to-date. To +prevent a template from being updated, automatic updating can be +disabled and enabled for each template in the Web GUI by clicking on +the template or the edit symbol in the template list. The dimension +tolerance and the maximum deformation can also be changed there for +each template. The maximum deformation determines the tolerance for +the texture matching, representing possible shifts within the texture, +e.g. caused by deformations of the object surface. For rigid objects +the "max_deformation_m" should be set to a low value in meters to +ensure accurate matching. + +The template's "dimensions" can only be specified when creating a new +template. Once the template is generated, the dimensions cannot be +changed and do not need to be given in the detect request. If the +dimensions are still given in the request, they must match the +existing dimensions in the template. However, the +"dimensions_tolerance_m" and "max_deformation_m" can be set +differently in every detect request and their values will also be +updated in the stored template. + +Computation of grasps + +The ItemPick and BoxPick modules offer a service for computing grasps +for suction grippers. The gripper is defined by its suction surface +length and width. + +The ItemPick module identifies flat surfaces in the scene and supports +flexible and/or deformable items. The "type" of these "item_models" is +called "UNKNOWN" since they don't need to have a standard geometrical +shape. Optionally, the user can also specify the minimum and maximum +size of the item. + +For BoxPick, the grasps are computed on the detected rectangular +"items" (see + +Detection of items (BoxPick) + +). + +Optionally, further information can be given to the modules in a grasp +computation request: + +The ID of the load carrier which contains the items to be grasped. + +A compartment inside the load carrier where to compute grasps (see +Load carrier compartments, Section \ref{loadcarrier_db:sect- +loadcarrier-compartment}). + +The ID of the 3D region of interest where to search for the load +carriers if a load carrier is set. Otherwise, the ID of the 3D region +of interest where to compute grasps. + +Collision detection information: The ID of the gripper to enable +collision checking and optionally a pre-grasp offset to define a pre- +grasp position. Details on collision checking are given below in +CollisionCheck\:(Section \ref{itempick:sect-itempick-collision-check- +dep}). + +A grasp provided by the ItemPick and BoxPick modules represents the +recommended pose of the TCP (Tool Center Point) of the suction +gripper. The grasp "type" is always set to "SUCTION". The computed +grasp pose is the center of the biggest ellipse that can be inscribed +in each surface. The grasp orientation is a right-handed coordinate +system and is defined such that its z axis is normal to the surface +pointing inside the object at the grasp position and its x axis is +directed along the maximum elongation of the ellipse. + + +Each grasp includes the dimensions of the maximum suction surface +available, modelled as an ellipse of axes "max_suction_surface_length" +and "max_suction_surface_width". The user is enabled to filter grasps +by specifying the minimum suction surface required by the suction +device in use. + +In the BoxPick module, the grasp position corresponds to the center of +the detected rectangle and the dimensions of the maximum suction +surface available matches the estimated rectangle dimensions. Detected +rectangles with missing data or occlusions by other objects for more +than 15% of their surface do not get an associated grasp. + +Each grasp also includes a "quality" value, which gives an indication +of the flatness of the grasping surface. The "quality" value varies +between 0 and 1, where higher numbers correspond to a flatter +reconstructed surface. + +The grasp definition is complemented by a "uuid" (Universally Unique +Identifier) and the "timestamp" of the oldest image that was used to +compute the grasp. + +Grasp sorting is performed based on the selected sorting strategy. The +following sorting strategies are available and can be set in the + +Web GUI + + or using the "set_sorting_strategies" service call: + +gravity: highest grasp points along the gravity direction are returned +first, + +surface_area: grasp points with the largest surface area are returned +first, + +direction: grasp points with the shortest distance along a defined +direction vector in a given pose_frame are returned first. + +If no sorting strategy is set or default sorting is chosen in the Web +GUI, sorting is done based on a combination of "gravity" and +"surface_area". + +Interaction with other modules + +Internally, the ItemPick and BoxPick modules depend on, and interact +with other on-board modules as listed below. + +Note: All changes and configuration updates to these modules will + affect the performance of the ItemPick and BoxPick modules. + +Stereo camera and Stereo matching + +The ItemPick and BoxPick modules make internally use of the following +data: + +Rectified images from the Camera module (rc_camera, Section +\ref{stereo_camera:sect-stereo-camera}); + +Disparity, error, and confidence images from the Stereo matching +module (rc_stereomatching, Section \ref{stereo_matching:sect-stereo- +matching}). + +All processed images are guaranteed to be captured after the module +trigger time. + +IO and Projector Control + +In case the + +rc_visard NG + + is used in conjunction with an external random dot projector and the + +IO and Projector Control + + module ("rc_iocontrol"), it is recommended to connect the projector +to GPIO Out 1 and set the stereo-camera module's acquisition mode to +"SingleFrameOut1" (see + +Stereo matching parameters + +), so that on each image acquisition trigger an image with and without +projector pattern is acquired. + +Alternatively, the output mode for the GPIO output in use should be +set to "ExposureAlternateActive" (see + +Description of run-time parameters + +). + +In either case, the + +Auto Exposure Mode + + "exp_auto_mode" should be set to "AdaptiveOut1" to optimize the +exposure of both images (see + +Stereo camera parameters + +). + +Hand-eye calibration + +In case the camera has been calibrated to a robot, the ItemPick and +BoxPick modules can automatically provide poses in the robot +coordinate frame. For the ItemPick and BoxPick nodes' + +Services + +, the frame of the output poses can be controlled with the +"pose_frame" argument. + +Two different "pose_frame" values can be chosen: + +Camera frame (camera). All poses provided by the modules are in the +camera frame, and no prior knowledge about the pose of the camera in +the environment is required. This means that the configured regions of +interest and load carriers move with the camera. It is the user's +responsibility to update the configured poses if the camera frame +moves (e.g. with a robot-mounted camera). + +External frame (external). All poses provided by the modules are in +the external frame, configured by the user during the hand-eye +calibration process. The module relies on the on-board Hand-eye +calibration module\:(Section \ref{handeye_calibration:sect-handeye- +calibration}) to retrieve the sensor mounting (static or robot +mounted) and the hand-eye transformation. If the mounting is static, +no further information is needed. If the sensor is robot-mounted, the +robot_pose is required to transform poses to and from the external +frame. + +Note: If no hand-eye calibration is available, all "pose_frame" + values should be set to "camera". + +All "pose_frame" values that are not "camera" or "external" are +rejected. + +If the sensor is robot-mounted, the current "robot_pose" has to be +provided depending on the value of "pose_frame" and the definition of +the sorting direction: + +If pose_frame is set to external, providing the robot pose is +obligatory. + +If the sorting direction is defined in external, providing the robot +pose is obligatory. + +In all other cases, providing the robot pose is optional. + +LoadCarrier + +The ItemPick and BoxPick modules use the load carrier detection +functionality provided by the + +LoadCarrier + + module ("rc_load_carrier"), with the run-time parameters specified +for this module. However, only one load carrier will be returned and +used in case multiple matching load carriers could be found in the +scene. In case multiple load carriers of the same type are visible, a +3D region of interest should be set to ensure that always the same +load carrier is used for the ItemPick and BoxPick modules. + +CollisionCheck + +Collision checking can be easily enabled for grasp computation of the +ItemPick and BoxPick modules by passing the ID of the used gripper and +optionally a pre-grasp offset to the "compute_grasps" service call. +The gripper has to be defined in the GripperDB module (see + +Setting a gripper + +) and details about collision checking are given in + +Collision checking within other modules + +. + +If collision checking is enabled, only grasps which are collision free +will be returned. However, the visualization images on the + +ItemPick + + or + +BoxPick + + page of the Web GUI also show colliding grasp points as black +ellipses. + +The CollisionCheck module's run-time parameters affect the collision +detection as described in + +CollisionCheck Parameters + +. + +Parameters + +The ItemPick and BoxPick modules are called "rc_itempick" and +"rc_boxpick" in the REST-API and are represented in the + +Web GUI + + under Modules ‣ ItemPick and Modules ‣ BoxPick. The user can explore +and configure the "rc_itempick" and "rc_boxpick" module's run-time +parameters, e.g. for development and testing, using the Web GUI or the + +REST-API interface + +. + +Parameter overview + +These modules offer the following run-time parameters: + +The rc_itempick and rc_boxpick modules' application parameters +Name Type Min Max Default Description max_grasps int32 1 20 +5 Maximum number of provided grasps + +The rc_itempick and rc_boxpick modules' surface clustering parameters +Name Type Min Max Default Description cluster_max_dimension +float64 0.05 0.8 0.3 Only for rc_itempick. Maximum allowed +diameter for a cluster in meters. Clusters with a diameter larger than +this value are not used for grasp computation. cluster_max_curvature +float64 0.005 0.5 0.11 Maximum curvature allowed within one +cluster. The smaller this value, the more clusters will be split +apart. clustering_patch_size int32 3 10 4 Only for rc_itempick. +Size in pixels of the square patches the depth map is subdivided into +during the first clustering step clustering_max_surface_rmse float64 +0.0005 0.01 0.004 Maximum root-mean-square error (RMSE) in meters +of points belonging to a surface clustering_discontinuity_factor +float64 0.1 5.0 1.0 Factor used to discriminate depth +discontinuities within a patch. The smaller this value, the more +clusters will be split apart. + +The rc_boxpick module's rectangle detection parameters +Name Type Min Max Default Description mode string - - +Unconstrained Mode of the rectangle detection: [Unconstrained, +PackedGridLayout, PackedLayers] manual_line_sensitivity bool false +true false Indicates whether the user-defined line sensitivity +should be used or the automatic one line_sensitivity float64 0.1 +1.0 0.1 Sensitivity of the line detector prefer_splits bool false +true false Indicates whether rectangles are split into smaller ones +when possible min_cluster_coverage float64 0.0 0.99 0.0 Gives +the minimal ratio of points per cluster that must be covered with +detected items. + +Description of run-time parameters + +Each run-time parameter is represented by a row on the Web GUI's + +ItemPick + + or + +BoxPick + + page. The name in the Web GUI is given in brackets behind the +parameter name and the parameters are listed in the order they appear +in the Web GUI: + +max_grasps (Maximum Grasps) + + sets the maximum number of provided grasps. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes//parameters/parameters?max_grasps= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes//parameters?max_grasps= + +cluster_max_dimension (Only for ItemPick, Cluster Maximum Dimension) + + is the maximum allowed diameter for a cluster in meters. + Clusters with a diameter larger than this value are not used for + grasp computation. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_itempick/parameters/parameters?cluster_max_dimension= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_itempick/parameters?cluster_max_dimension= + +cluster_max_curvature (Cluster Maximum Curvature) + + is the maximum curvature allowed within one cluster. The smaller + this value, the more clusters will be split apart. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes//parameters/parameters?cluster_max_curvature= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes//parameters?cluster_max_curvature= + +clustering_patch_size (Only for ItemPick, Patch Size) + + is the size of the square patches the depth map is subdivided + into during the first clustering step in pixels. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_itempick/parameters/parameters?clustering_patch_size= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_itempick/parameters?clustering_patch_size= + +clustering_discontinuity_factor (Discontinuity Factor) + + is the factor used to discriminate depth discontinuities within + a patch. The smaller this value, the more clusters will be split + apart. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes//parameters/parameters?clustering_discontinuity_factor= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes//parameters?clustering_discontinuity_factor= + +clustering_max_surface_rmse (Maximum Surface RMSE) + + is the maximum root-mean-square error (RMSE) in meters of points + belonging to a surface. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes//parameters/parameters?clustering_max_surface_rmse= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes//parameters?clustering_max_surface_rmse= + +mode (Only for BoxPick, Mode) + + determines the mode of the rectangle detection. Possible values + are "Unconstrained", "PackedGridLayout" and "PackedLayers". In + "PackedGridLayout" mode, rectangles of a cluster are detected in + a dense grid pattern. In "PackedLayers" mode, boxes are assumed + to form layers and box detection will start searching for items + at the cluster corners. Use this mode in de-palletizing + applications. In "Unconstrained" mode (default), rectangles are + detected without posing any constraints on their relative + locations or their positions in the segmented cluster. + + Fig. 27 + + illustrates the modes for different scenarios. + + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_boxpick/parameters/parameters?mode= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_boxpick/parameters?mode= + +manual_line_sensitivity (Only for BoxPick, Manual Line Sensitivity) + + determines whether the user-defined line sensitivity should be + used to extract the lines for rectangle detection. If this + parameter is set to true, the user-defined "line_sensitivity" + value will be used. If this parameter is set to false, automatic + line sensitivity will be used. This parameter should be set to + true when automatic line sensitivity does not give enough lines + at the box boundaries so that boxes cannot be detected. The + detected line segments are visualized in the "Intermediate + Result" visualization on the Web GUI's + + BoxPick + + page. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_boxpick/parameters/parameters?manual_line_sensitivity= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_boxpick/parameters?manual_line_sensitivity= + +line_sensitivity (Only for BoxPick, Line Sensitivity) + + determines the line sensitivity for extracting the lines for + rectangle detection, if the parameter "manual_line_sensitivity" + is set to true. Otherwise, the value of this parameter has no + effect on the rectangle detection. Higher values give more line + segments, but also increase the runtime of the box detection. + This parameter should be increased when boxes cannot be detected + because their boundary edges are not detected. The detected line + segments are visualized in the "Intermediate Result" + visualization on the Web GUI's + + BoxPick + + page. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_boxpick/parameters/parameters?line_sensitivity= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_boxpick/parameters?line_sensitivity= + +prefer_splits (Only for BoxPick, Prefer Splits) + + determines whether rectangles should be split into smaller ones + if the smaller ones also match the given item models. This + parameter should be set to true for packed box layouts in which + the given item models would also match a rectangle of the size + of two adjoining boxes. If this parameter is set to false, the + larger rectangles will be preferred in these cases. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_boxpick/parameters/parameters?prefer_splits= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_boxpick/parameters?prefer_splits= + +min_cluster_coverage (Only for BoxPick, Minimum Cluster Coverage) + + determines which ratio of each segmented cluster must be covered + with rectangle detections to consider the detections to be + valid. If the minimum cluster coverage is not reached for a + cluster, no rectangle detections will be returned for this + cluster and a warning will be given. This parameter should be + used to verify that all items on a layer in a de-palletizing + scenario are detected. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_boxpick/parameters/parameters?min_cluster_coverage= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_boxpick/parameters?min_cluster_coverage= + +Status values + +The "rc_itempick" and "rc_boxpick" modules report the following status +values: + +The rc_itempick and rc_boxpick modules status values Name +Description data_acquisition_time Time in seconds required by the +last active service to acquire images grasp_computation_time +Processing time of the last grasp computation in seconds +last_timestamp_processed The timestamp of the last processed dataset +load_carrier_detection_time Processing time of the last load carrier +detection in seconds processing_time Processing time of the last +detection (including load carrier detection) in seconds state The +current state of the rc_itempick and rc_boxpick node + +The reported "state" can take one of the following values. + +Possible states of the ItemPick and BoxPick modules State name +Description IDLE The module is idle. RUNNING The module is running +and ready for load carrier detection and grasp computation. FATAL A +fatal error has occurred. + +Services + +The user can explore and call the "rc_itempick" and "rc_boxpick" +module's services, e.g. for development and testing, using the + +REST-API interface + + or the + +rc_visard NG + + +Web GUI + +. + +The ItemPick and BoxPick modules offer the following services. + +detect_items (BoxPick only) + + Triggers the detection of rectangles as described in + + Detection of items (BoxPick) + + . + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_boxpick/services/detect_items + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_boxpick/services/detect_items + + Request + + Required arguments: + + "pose_frame": see + + Hand-eye calibration + + . + + "item_models": list of item models to be detected. The type of + the item model must be "RECTANGLE" or "TEXTURED_BOX". For type + "RECTANGLE", "rectangle" must be filled, while for + "TEXTURED_BOX", "textured_box" must be filled. See + + Detection of items (BoxPick) + + for a detailed description of the item model types. + + Potentially required arguments: + + "robot_pose": see + + Hand-eye calibration + + . + + Optional arguments: + + "load_carrier_id": ID of the load carrier which contains the + items to be detected. + + "load_carrier_compartment": compartment inside the load carrier + where to detect items (see + + Load carrier compartments + + ). + + "region_of_interest_id": if "load_carrier_id" is set, ID of the + 3D region of interest where to search for the load carriers. + Otherwise, ID of the 3D region of interest where to search for + the items. + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "item_models": [ + { + "rectangle": { + "max_dimensions": { + "x": "float64", + "y": "float64" + }, + "min_dimensions": { + "x": "float64", + "y": "float64" + } + }, + "textured_box": { + "dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "dimensions_tolerance_m": "float64", + "max_deformation_m": "float64", + "template_id": "string" + }, + "type": "string" + } + ], + "load_carrier_compartment": { + "box": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + } + }, + "load_carrier_id": "string", + "pose_frame": "string", + "region_of_interest_id": "string", + "robot_pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + } + } + } + + Response + + "load_carriers": list of detected load carriers. + + "items": list of detected rectangles. + + "timestamp": timestamp of the image set the detection ran on. + + "return_code": holds possible warnings or error codes and messages. + + The definition for the response with corresponding datatypes is: + + { + "name": "detect_items", + "response": { + "items": [ + { + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "rectangle": { + "x": "float64", + "y": "float64" + }, + "template_id": "string", + "timestamp": { + "nsec": "int32", + "sec": "int32" + }, + "type": "string", + "uuid": "string", + "view_pose_set": "bool", + "view_uuid": "string" + } + ], + "load_carriers": [ + { + "height_open_side": "float64", + "id": "string", + "inner_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "outer_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "overfilled": "bool", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "rim_ledge": { + "x": "float64", + "y": "float64" + }, + "rim_step_height": "float64", + "rim_thickness": { + "x": "float64", + "y": "float64" + }, + "type": "string" + } + ], + "return_code": { + "message": "string", + "value": "int16" + }, + "timestamp": { + "nsec": "int32", + "sec": "int32" + } + } + } + +compute_grasps (for ItemPick) + + Triggers the computation of grasping poses for a suction device as + described in + + Computation of grasps + + . + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_itempick/services/compute_grasps + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_itempick/services/compute_grasps + + Request + + Required arguments: + + "pose_frame": see + + Hand-eye calibration + + . + + "suction_surface_length": length of the suction device grasping + surface. + + "suction_surface_width": width of the suction device grasping + surface. + + Potentially required arguments: + + "robot_pose": see + + Hand-eye calibration + + . + + Optional arguments: + + "load_carrier_id": ID of the load carrier which contains the + items to be grasped. + + "load_carrier_compartment": compartment inside the load carrier + where to compute grasps (see + + Load carrier compartments + + ). + + "region_of_interest_id": if "load_carrier_id" is set, ID of the + 3D region of interest where to search for the load carriers. + Otherwise, ID of the 3D region of interest where to compute + grasps. + + "item_models": list of unknown items with minimum and maximum + dimensions, with the minimum dimensions strictly smaller than + the maximum dimensions. Only one "item_model" of type "UNKNOWN" + is currently supported. + + "collision_detection": see + + Collision checking within other modules + + . + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "collision_detection": { + "gripper_id": "string", + "pre_grasp_offset": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "item_models": [ + { + "type": "string", + "unknown": { + "max_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "min_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + } + } + } + ], + "load_carrier_compartment": { + "box": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + } + }, + "load_carrier_id": "string", + "pose_frame": "string", + "region_of_interest_id": "string", + "robot_pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "suction_surface_length": "float64", + "suction_surface_width": "float64" + } + } + + Response + + "load_carriers": list of detected load carriers. + + "grasps": sorted list of suction grasps. + + "timestamp": timestamp of the image set the detection ran on. + + "return_code": holds possible warnings or error codes and messages. + + The definition for the response with corresponding datatypes is: + + { + "name": "compute_grasps", + "response": { + "grasps": [ + { + "item_uuid": "string", + "max_suction_surface_length": "float64", + "max_suction_surface_width": "float64", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "quality": "float64", + "timestamp": { + "nsec": "int32", + "sec": "int32" + }, + "type": "string", + "uuid": "string" + } + ], + "load_carriers": [ + { + "height_open_side": "float64", + "id": "string", + "inner_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "outer_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "overfilled": "bool", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "rim_ledge": { + "x": "float64", + "y": "float64" + }, + "rim_step_height": "float64", + "rim_thickness": { + "x": "float64", + "y": "float64" + }, + "type": "string" + } + ], + "return_code": { + "message": "string", + "value": "int16" + }, + "timestamp": { + "nsec": "int32", + "sec": "int32" + } + } + } + +compute_grasps (for BoxPick) + + Triggers the detection of rectangles and the computation of + grasping poses for the detected rectangles as described in + + Computation of grasps + + . + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_boxpick/services/compute_grasps + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_boxpick/services/compute_grasps + + Request + + Required arguments: + + "pose_frame": see + + Hand-eye calibration + + . + + "item_models": list of item models to be detected. The type of + the item model must be "RECTANGLE" or "TEXTURED_BOX". For type + "RECTANGLE", "rectangle" must be filled, while for + "TEXTURED_BOX", "textured_box" must be filled. See + + Detection of items (BoxPick) + + for a detailed description of the item model types. + + "suction_surface_length": length of the suction device grasping + surface. + + "suction_surface_width": width of the suction device grasping + surface. + + Potentially required arguments: + + "robot_pose": see + + Hand-eye calibration + + . + + Optional arguments: + + "load_carrier_id": ID of the load carrier which contains the + items to be grasped. + + "load_carrier_compartment": compartment inside the load carrier + where to compute grasps (see + + Load carrier compartments + + ). + + "region_of_interest_id": if "load_carrier_id" is set, ID of the + 3D region of interest where to search for the load carriers. + Otherwise, ID of the 3D region of interest where to compute + grasps. + + "collision_detection": see + + Collision checking within other modules + + . + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "collision_detection": { + "gripper_id": "string", + "pre_grasp_offset": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "item_models": [ + { + "rectangle": { + "max_dimensions": { + "x": "float64", + "y": "float64" + }, + "min_dimensions": { + "x": "float64", + "y": "float64" + } + }, + "textured_box": { + "dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "dimensions_tolerance_m": "float64", + "max_deformation_m": "float64", + "template_id": "string" + }, + "type": "string" + } + ], + "load_carrier_compartment": { + "box": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + } + }, + "load_carrier_id": "string", + "pose_frame": "string", + "region_of_interest_id": "string", + "robot_pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "suction_surface_length": "float64", + "suction_surface_width": "float64" + } + } + + Response + + "load_carriers": list of detected load carriers. + + "items": list of detected rectangles. + + "grasps": sorted list of suction grasps. + + "timestamp": timestamp of the image set the detection ran on. + + "return_code": holds possible warnings or error codes and messages. + + The definition for the response with corresponding datatypes is: + + { + "name": "compute_grasps", + "response": { + "grasps": [ + { + "item_uuid": "string", + "max_suction_surface_length": "float64", + "max_suction_surface_width": "float64", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "quality": "float64", + "timestamp": { + "nsec": "int32", + "sec": "int32" + }, + "type": "string", + "uuid": "string" + } + ], + "items": [ + { + "grasp_uuids": [ + "string" + ], + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "rectangle": { + "x": "float64", + "y": "float64" + }, + "template_id": "string", + "timestamp": { + "nsec": "int32", + "sec": "int32" + }, + "type": "string", + "uuid": "string", + "view_pose_set": "bool", + "view_uuid": "string" + } + ], + "load_carriers": [ + { + "height_open_side": "float64", + "id": "string", + "inner_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "outer_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "overfilled": "bool", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "rim_ledge": { + "x": "float64", + "y": "float64" + }, + "rim_step_height": "float64", + "rim_thickness": { + "x": "float64", + "y": "float64" + }, + "type": "string" + } + ], + "return_code": { + "message": "string", + "value": "int16" + }, + "timestamp": { + "nsec": "int32", + "sec": "int32" + } + } + } + +set_sorting_strategies + + Persistently stores the sorting strategy for sorting the grasps + returned by the "compute_grasps" service (see + + Computation of grasps + + ). + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes//services/set_sorting_strategies + + API version 1 (deprecated) + + PUT http:///api/v1/nodes//services/set_sorting_strategies + + Request + + Only one strategy may have a "weight" greater than 0. If all + "weight" values are set to 0, the module will use the default + sorting strategy. + + If the weight for "direction" is set, the "vector" must contain the + direction vector and "pose_frame" must be either "camera" or + "external". + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "direction": { + "pose_frame": "string", + "vector": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "weight": "float64" + }, + "gravity": { + "weight": "float64" + }, + "surface_area": { + "weight": "float64" + } + } + } + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "set_sorting_strategies", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +get_sorting_strategies + + Returns the sorting strategy for sorting the grasps returned by the + "compute-grasps" service (see + + Computation of grasps + + ). + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes//services/get_sorting_strategies + + API version 1 (deprecated) + + PUT http:///api/v1/nodes//services/get_sorting_strategies + + Request + + This service has no arguments. + + Response + + All "weight" values are 0 when the module uses the default sorting + strategy. + + The definition for the response with corresponding datatypes is: + + { + "name": "get_sorting_strategies", + "response": { + "direction": { + "pose_frame": "string", + "vector": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "weight": "float64" + }, + "gravity": { + "weight": "float64" + }, + "return_code": { + "message": "string", + "value": "int16" + }, + "surface_area": { + "weight": "float64" + } + } + } + +start + + Starts the module. If the command is accepted, the module moves to + state "RUNNING". + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes//services/start + + API version 1 (deprecated) + + PUT http:///api/v1/nodes//services/start + + Request + + This service has no arguments. + + Response + + The "current_state" value in the service response may differ from + "RUNNING" if the state transition is still in process when the + service returns. + + The definition for the response with corresponding datatypes is: + + { + "name": "start", + "response": { + "accepted": "bool", + "current_state": "string" + } + } + +stop + + Stops the module. If the command is accepted, the module moves to + state "IDLE". + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes//services/stop + + API version 1 (deprecated) + + PUT http:///api/v1/nodes//services/stop + + Request + + This service has no arguments. + + Response + + The "current_state" value in the service response may differ from + "IDLE" if the state transition is still in process when the service + returns. + + The definition for the response with corresponding datatypes is: + + { + "name": "stop", + "response": { + "accepted": "bool", + "current_state": "string" + } + } + +reset_defaults + + Resets all parameters of the module to its default values, as + listed in above table. Also resets sorting strategies. + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes//services/reset_defaults + + API version 1 (deprecated) + + PUT http:///api/v1/nodes//services/reset_defaults + + Request + + This service has no arguments. + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "reset_defaults", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +set_region_of_interest (deprecated) + + Persistently stores a 3D region of interest on the + + rc_visard NG + + . + + Details + + This service can be called as follows. + + API version 2 + + This service is not available in API version 2. Use + + set_region_of_interest + + in "rc_roi_db" instead. + + API version 1 (deprecated) + + PUT http:///api/v1/nodes//services/set_region_of_interest + +get_regions_of_interest (deprecated) + + Returns the configured 3D regions of interest with the requested + "region_of_interest_ids". + + Details + + This service can be called as follows. + + API version 2 + + This service is not available in API version 2. Use + + get_regions_of_interest + + in "rc_roi_db" instead. + + API version 1 (deprecated) + + PUT http:///api/v1/nodes//services/get_regions_of_interest + +delete_regions_of_interest (deprecated) + + Deletes the configured 3D regions of interest with the requested + "region_of_interest_ids". + + Details + + This service can be called as follows. + + API version 2 + + This service is not available in API version 2. Use + + delete_regions_of_interest + + in "rc_roi_db" instead. + + API version 1 (deprecated) + + PUT http:///api/v1/nodes//services/delete_regions_of_interest + +Return codes + +Each service response contains a "return_code", which consists of a +"value" plus an optional "message". A successful service returns with +a "return_code" value of "0". Negative "return_code" values indicate +that the service failed. Positive "return_code" values indicate that +the service succeeded with additional information. The smaller value +is selected in case a service has multiple "return_code" values, but +all messages are appended in the "return_code" message. + +The following table contains a list of common codes: + +Return codes of the ItemPick and BoxPick services Code +Description 0 Success -1 An invalid argument was provided -3 An +internal timeout occurred, e.g. during box detection if the given +dimension range is too large -4 Data acquisition took longer than +allowed -8 The template has been deleted during detection. -10 New +element could not be added as the maximum storage capacity of load +carriers, regions of interest or template has been exceeded -11 +Sensor not connected, not supported or not ready -200 Fatal internal +error -301 More than one item model of type UNKNOWN provided to the +compute_grasps service 10 The maximum storage capacity of load +carriers, regions of interest or templates has been reached 11 An +existent persistent model was overwritten by the call to +set_load_carrier or set_region_of_interest 100 The requested load +carriers were not detected in the scene 101 No valid surfaces or +grasps were found in the scene 102 The detected load carrier is +empty 103 All computed grasps are in collision with the load carrier +112 Rejected detections of one or more clusters, because +min_cluster_coverage was not reached. 300 A valid robot_pose was +provided as argument but it is not required 999 Additional hints for +application development + +BoxPick Template API + +BoxPick templates are only available with the +Match extension of +BoxPick. For template upload, download, listing and removal, special +REST-API endpoints are provided. Templates can also be uploaded, +downloaded and removed via the Web GUI. The templates include the +dimensions, the views and their poses, if set. Up to 50 templates can +be stored persistently on the + +rc_visard NG + +. + +GET /templates/rc_boxpick + + Get list of all rc_boxpick templates. + + Template request + + GET /api/v2/templates/rc_boxpick HTTP/1.1 + + Template response + + HTTP/1.1 200 OK + Content-Type: application/json + + [ + { + "id": "string" + } + ] + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns array of Template) + + 404 Not Found -- node not found + + Referenced Data Models: + Template\:(Section \ref{rest_api_datamodel:sect-rest-datamodel- + template}) + +GET /templates/rc_boxpick/{id} + + Get a rc_boxpick template. If the requested content-type is + application/octet-stream, the template is returned as file. + + Template request + + GET /api/v2/templates/rc_boxpick/ HTTP/1.1 + + Template response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "id": "string" + } + + Parameters: + id (string) -- id of the template (required) + + Response Headers: + Content-Type -- application/json application/ubjson application + /octet-stream + + Status Codes: + 200 OK -- successful operation (returns Template) + + 404 Not Found -- node or template not found + + Referenced Data Models: + Template\:(Section \ref{rest_api_datamodel:sect-rest-datamodel- + template}) + +PUT /templates/rc_boxpick/{id} + + Create or update a rc_boxpick template. + + Template request + + PUT /api/v2/templates/rc_boxpick/ HTTP/1.1 + Accept: multipart/form-data application/json + + Template response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "id": "string" + } + + Parameters: + id (string) -- id of the template (required) + + Form Parameters: + file -- template file (required) + + Request Headers: + Accept -- multipart/form-data application/json + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns Template) + + 400 Bad Request -- Template is not valid or max number of + templates reached + + 403 Forbidden -- forbidden, e.g. because there is no valid + license for this module. + + 404 Not Found -- node or template not found + + 413 Request Entity Too Large -- Template too large + + Referenced Data Models: + Template\:(Section \ref{rest_api_datamodel:sect-rest-datamodel- + template}) + +DELETE /templates/rc_boxpick/{id} + + Remove a rc_boxpick template. + + Template request + + DELETE /api/v2/templates/rc_boxpick/ HTTP/1.1 + Accept: application/json application/ubjson + + Parameters: + id (string) -- id of the template (required) + + Request Headers: + Accept -- application/json application/ubjson + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation + + 403 Forbidden -- forbidden, e.g. because there is no valid + license for this module. + + 404 Not Found -- node or template not found diff --git a/v24.04/en/_sources/loadcarrier.rst.txt b/v24.04/en/_sources/loadcarrier.rst.txt new file mode 100644 index 0000000..ec69d19 --- /dev/null +++ b/v24.04/en/_sources/loadcarrier.rst.txt @@ -0,0 +1,1013 @@ +LoadCarrier + +Introduction + +The LoadCarrier module allows the detection of load carriers, which is +usually the first step when objects or grasp points inside a bin +should be found. The models of the load carriers to be detected have +to be defined in the + +LoadCarrierDB + + module. + +The LoadCarrier module is an optional on-board module of the + +rc_visard NG + + and is licensed with any of the modules + +ItemPick and BoxPick + + or + +SilhouetteMatch + +. Otherwise it requires a separate LoadCarrier + +license + + to be purchased. + +Detection of load carriers + +The load carrier detection algorithm detects load carriers that match +a specific load carrier model, which must be defined in the + +LoadCarrierDB + + module. The load carrier model is referenced by its ID, which is +passed to the load carrier detection. The detection of a load carrier +is based on the detection of its rectangular rim. For this, it uses +lines detected in the left camera image and the depth values of the +load carrier rim. Thus, the rim should form a contrast to the +background and the disparity image must be dense on the rim. + +If multiple load carriers of the specified load carrier ID are visible +in the scene, all of them will be detected and returned by the load +carrier detection. + +By default, when "assume_gravity_aligned" is true and gravity +measurements are available, the algorithm searches for load carriers +whose rim planes are perpendicular to the measured gravity vector. To +detect tilted load carriers, "assume_gravity_aligned" must be set to +false or the load carrier's approximate orientation must be specified +as "pose" and the "pose_type" should be set to "ORIENTATION_PRIOR". + +Load carriers can be detected at a distance of up to 3 meters from the +camera. + +When a 3D region of interest (see + +RoiDB + +) is used to limit the volume in which load carriers should be +detected, only the load carriers' rims must be fully included in the +region of interest. + +The detection algorithm returns the poses of the load carriers' +origins (see + +Load carrier definition + +) in the desired pose frame. + +The detection functionality also determines if the detected load +carriers are "overfilled", which means, that objects protrude from the +plane defined by the load carrier's outer part of the rim. + + +Detection of filling level + +The LoadCarrier module offers the "detect_filling_level" service to +compute the filling level of all detected load carriers. + +The load carriers are subdivided into a configurable number of cells +in a 2D grid. The maximum number of cells is 10x10. For each cell, the +following values are reported: + +level_in_percent: minimum, maximum and mean cell filling level in +percent from the load carrier floor. These values can be larger than +100% if the cell is overfilled. + +level_free_in_meters: minimum, maximum and mean cell free level in +meters from the load carrier rim. These values can be negative if the +cell is overfilled. + +cell_size: dimensions of the 2D cell in meters. + +cell_position: position of the cell center in meters (either in camera +or external frame, see Hand-eye calibration, Section \ref{loadcarrier +:sect-loadcarrier-hand-eye-dep}). The z-coordinate is on the level of +the load carrier rim. + +coverage: represents the proportion of valid pixels in this cell. It +varies between 0 and 1 with steps of 0.1. A low coverage indicates +that the cell contains several missing data (i.e. only a few points +were actually measured in this cell). + +These values are also calculated for the whole load carrier itself. If +no cell subdivision is specified, only the overall filling level is +computed. + + +Interaction with other modules + +Internally, the LoadCarrier module depends on, and interacts with +other on-board modules as listed below. + +Note: All changes and configuration updates to these modules will + affect the performance of the LoadCarrier module. + +Stereo camera and Stereo matching + +The LoadCarrier module makes internally use of the following data: + +Rectified images from the Camera module (rc_camera, Section +\ref{stereo_camera:sect-stereo-camera}); + +Disparity, error, and confidence images from the Stereo matching +module (rc_stereomatching, Section \ref{stereo_matching:sect-stereo- +matching}). + +All processed images are guaranteed to be captured after the module +trigger time. + +IO and Projector Control + +In case the + +rc_visard NG + + is used in conjunction with an external random dot projector and the + +IO and Projector Control + + module ("rc_iocontrol"), it is recommended to connect the projector +to GPIO Out 1 and set the stereo-camera module's acquisition mode to +"SingleFrameOut1" (see + +Stereo matching parameters + +, so that on each image acquisition trigger an image with and without +projector pattern is acquired. + +Alternatively, the output mode for the GPIO output in use should be +set to "ExposureAlternateActive" (see + +Description of run-time parameters + +). + +In either case, the + +Auto Exposure Mode + + "exp_auto_mode" should be set to "AdaptiveOut1" to optimize the +exposure of both images (see + +Stereo camera parameters + +. + +No additional changes are required to use the LoadCarrier module in +combination with a random dot projector. + +Hand-eye calibration + +In case the camera has been calibrated to a robot, the loadcarrier +module can automatically provide poses in the robot coordinate frame. +For the loadcarrier nodes' + +Services + +, the frame of the output poses can be controlled with the +"pose_frame" argument. + +Two different "pose_frame" values can be chosen: + +Camera frame (camera). All poses provided by the modules are in the +camera frame, and no prior knowledge about the pose of the camera in +the environment is required. This means that the configured load +carriers move with the camera. It is the user's responsibility to +update the configured poses if the camera frame moves (e.g. with a +robot-mounted camera). + +External frame (external). All poses provided by the modules are in +the external frame, configured by the user during the hand-eye +calibration process. The module relies on the on-board Hand-eye +calibration module\:(Section \ref{handeye_calibration:sect-handeye- +calibration}) to retrieve the sensor mounting (static or robot +mounted) and the hand-eye transformation. If the mounting is static, +no further information is needed. If the sensor is robot-mounted, the +robot_pose is required to transform poses to and from the external +frame. + +Note: If no hand-eye calibration is available, all "pose_frame" + values should be set to "camera". + +All "pose_frame" values that are not "camera" or "external" are +rejected. + +Parameters + +The LoadCarrier module is called "rc_load_carrier" in the REST-API and +is represented in the + +Web GUI + + under Modules ‣ LoadCarrier. The user can explore and configure the +LoadCarrier module's run-time parameters, e.g. for development and +testing, using the Web GUI or the + +REST-API interface + +. + +Parameter overview + +This module offers the following run-time parameters: + +The rc_load_carrier module's run-time parameters Name +Type Min Max Default Description assume_gravity_aligned bool +false true true When true, only gravity-aligned load carriers are +detected, if gravity measurement is available. crop_distance float64 +0.0 0.05 0.005 Safety margin in meters by which the load carrier +inner dimensions are reduced to define the region of interest for +detection min_plausibility float64 0.0 0.99 0.8 Indicates how +much of the plane surrounding the load carrier rim must be free to +count as valid detection model_tolerance float64 0.003 0.025 +0.008 Indicates how much the estimated load carrier dimensions are +allowed to differ from the load carrier model dimensions in meters + +Description of run-time parameters + +Each run-time parameter is represented by a row on the + +LoadCarrier Settings + + section of the Web GUI's + +LoadCarrier + + page under + +Modules + +. The name in the Web GUI is given in brackets behind the parameter +name and the parameters are listed in the order they appear in the Web +GUI. The parameters are prefixed with "load_carrier_" when they are +used outside the "rc_load_carrier" module from another detection +module using the + +REST-API interface + +. + +assume_gravity_aligned (Assume Gravity Aligned) + + If this parameter is set to true, then only load carriers without + tilt will be detected. This can speed up the detection. If this + parameter is set to false, tilted load carriers will also be + detected. + + This parameter is ignored for load carriers with an orientation + prior. + +model_tolerance (Model Tolerance) + + indicates how much the estimated load carrier dimensions are + allowed to differ from the load carrier model dimensions in meters. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_load_carrier/parameters?model_tolerance= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_load_carrier/parameters?model_tolerance= + +crop_distance (Crop Distance) + + sets the safety margin in meters by which the load carrier's inner + dimensions are reduced to define the region of interest for + detection (ref. + + Fig. 51 + + ). + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_load_carrier/parameters?crop_distance= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_load_carrier/parameters?crop_distance= + +min_plausibility (Minimum Plausibility): + + The minimum plausibility defines how much of the plane around the + load carrier rim must at least be free to count as valid detection. + Increase the minimal plausibility to reject false positive + detections and decrease the value in case a clearly visible load + carrier cannot be detected. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_load_carrier/parameters?min_plausibility= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_load_carrier/parameters?min_plausibility= + +Status values + +The LoadCarrier module reports the following status values: + +The rc_load_carrier module's status values Name Description +data_acquisition_time Time in seconds required to acquire image pair +last_timestamp_processed The timestamp of the last processed image +pair load_carrier_detection_time Processing time of the last +detection in seconds + +Services + +The user can explore and call the LoadCarrier module's services, e.g. +for development and testing, using the + +REST-API interface + + or the + +rc_visard NG + + +Web GUI + + on the + +LoadCarrier + + page under + +Modules + +. + +The LoadCarrier module offers the following services. + +detect_load_carriers + + Triggers a load carrier detection as described in + + Detection of load carriers + + . + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_load_carrier/services/detect_load_carriers + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_load_carrier/services/detect_load_carriers + + Request + + Required arguments: + + "pose_frame": see + + Hand-eye calibration + + . + + "load_carrier_ids": IDs of the load carriers which should be + detected. Currently only one ID can be specified. + + Potentially required arguments: + + "robot_pose": see + + Hand-eye calibration + + . + + Optional arguments: + + "region_of_interest_id": ID of the 3D region of interest where + to search for the load carriers. + + "region_of_interest_2d_id": ID of the 2D region of interest + where to search for the load carriers. + + Note: Only one type of region of interest can be set. + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "load_carrier_ids": [ + "string" + ], + "pose_frame": "string", + "region_of_interest_2d_id": "string", + "region_of_interest_id": "string", + "robot_pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + } + } + } + + Response + + "load_carriers": list of detected load carriers. + + "timestamp": timestamp of the image set the detection ran on. + + "return_code": holds possible warnings or error codes and messages. + + The definition for the response with corresponding datatypes is: + + { + "name": "detect_load_carriers", + "response": { + "load_carriers": [ + { + "height_open_side": "float64", + "id": "string", + "inner_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "outer_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "overfilled": "bool", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "rim_ledge": { + "x": "float64", + "y": "float64" + }, + "rim_step_height": "float64", + "rim_thickness": { + "x": "float64", + "y": "float64" + }, + "type": "string" + } + ], + "return_code": { + "message": "string", + "value": "int16" + }, + "timestamp": { + "nsec": "int32", + "sec": "int32" + } + } + } + +detect_filling_level + + Triggers a load carrier filling level detection as described in + + Detection of filling level + + . + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_load_carrier/services/detect_filling_level + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_load_carrier/services/detect_filling_level + + Request + + Required arguments: + + "pose_frame": see + + Hand-eye calibration + + . + + "load_carrier_ids": IDs of the load carriers which should be + detected. Currently only one ID can be specified. + + Potentially required arguments: + + "robot_pose": see + + Hand-eye calibration + + . + + Optional arguments: + + "filling_level_cell_count": Number of cells in the filling level + grid. + + "region_of_interest_id": ID of the 3D region of interest where + to search for the load carriers. + + "region_of_interest_2d_id": ID of the 2D region of interest + where to search for the load carriers. + + Note: Only one type of region of interest can be set. + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "filling_level_cell_count": { + "x": "uint32", + "y": "uint32" + }, + "load_carrier_ids": [ + "string" + ], + "pose_frame": "string", + "region_of_interest_2d_id": "string", + "region_of_interest_id": "string", + "robot_pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + } + } + } + + Response + + "load_carriers": list of detected load carriers and their filling + levels. + + "timestamp": timestamp of the image set the detection ran on. + + "return_code": holds possible warnings or error codes and messages. + + The definition for the response with corresponding datatypes is: + + { + "name": "detect_filling_level", + "response": { + "load_carriers": [ + { + "cells_filling_levels": [ + { + "cell_position": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "cell_size": { + "x": "float64", + "y": "float64" + }, + "coverage": "float64", + "level_free_in_meters": { + "max": "float64", + "mean": "float64", + "min": "float64" + }, + "level_in_percent": { + "max": "float64", + "mean": "float64", + "min": "float64" + } + } + ], + "filling_level_cell_count": { + "x": "uint32", + "y": "uint32" + }, + "height_open_side": "float64", + "id": "string", + "inner_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "outer_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "overall_filling_level": { + "cell_position": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "cell_size": { + "x": "float64", + "y": "float64" + }, + "coverage": "float64", + "level_free_in_meters": { + "max": "float64", + "mean": "float64", + "min": "float64" + }, + "level_in_percent": { + "max": "float64", + "mean": "float64", + "min": "float64" + } + }, + "overfilled": "bool", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "rim_ledge": { + "x": "float64", + "y": "float64" + }, + "rim_step_height": "float64", + "rim_thickness": { + "x": "float64", + "y": "float64" + }, + "type": "string" + } + ], + "return_code": { + "message": "string", + "value": "int16" + }, + "timestamp": { + "nsec": "int32", + "sec": "int32" + } + } + } + +reset_defaults + + Restores and applies the default values for this module's + parameters ("factory reset"). + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_load_carrier/services/reset_defaults + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_load_carrier/services/reset_defaults + + Request + + This service has no arguments. + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "reset_defaults", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +set_load_carrier (deprecated) + + Persistently stores a load carrier on the + + rc_visard NG + + . + + API version 2 + + This service is not available in API version 2. Use + + set_load_carrier + + in "rc_load_carrier_db" instead. + + API version 1 (deprecated) + + This service can be called as follows. + + PUT http:///api/v1/nodes/rc_load_carrier/services/set_load_carrier + + The definitions of the request and response are the same as + described in + + set_load_carrier + + in "rc_load_carrier_db". + +get_load_carriers (deprecated) + + Returns the configured load carriers with the requested + "load_carrier_ids". + + API version 2 + + This service is not available in API version 2. Use + + get_load_carriers + + in "rc_load_carrier_db" instead. + + API version 1 (deprecated) + + This service can be called as follows. + + PUT http:///api/v1/nodes/rc_load_carrier/services/get_load_carriers + + The definitions of the request and response are the same as + described in + + get_load_carriers + + in "rc_load_carrier_db". + +delete_load_carriers (deprecated) + + Deletes the configured load carriers with the requested + "load_carrier_ids". + + API version 2 + + This service is not available in API version 2. Use + + delete_load_carriers + + in "rc_load_carrier_db" instead. + + API version 1 (deprecated) + + This service can be called as follows. + + PUT http:///api/v1/nodes/rc_load_carrier/services/delete_load_carriers + + The definitions of the request and response are the same as + described in + + delete_load_carriers + + in "rc_load_carrier_db". + +set_region_of_interest (deprecated) + + Persistently stores a 3D region of interest on the + + rc_visard NG + + . + + API version 2 + + This service is not available in API version 2. Use + + set_region_of_interest + + in "rc_roi_db" instead. + + API version 1 (deprecated) + + This service can be called as follows. + + PUT http:///api/v1/nodes/rc_load_carrier/services/set_region_of_interest + + The definitions of the request and response are the same as + described in + + set_region_of_interest + + in "rc_roi_db". + +get_regions_of_interest (deprecated) + + Returns the configured 3D regions of interest with the requested + "region_of_interest_ids". + + API version 2 + + This service is not available in API version 2. Use + + get_regions_of_interest + + in "rc_roi_db" instead. + + API version 1 (deprecated) + + This service can be called as follows. + + PUT http:///api/v1/nodes/rc_load_carrier/services/get_regions_of_interest + + The definitions of the request and response are the same as + described in + + get_regions_of_interest + + in "rc_roi_db". + +delete_regions_of_interest (deprecated) + + Deletes the configured 3D regions of interest with the requested + "region_of_interest_ids". + + API version 2 + + This service is not available in API version 2. Use + + delete_regions_of_interest + + in "rc_roi_db" instead. + + API version 1 (deprecated) + + This service can be called as follows. + + PUT http:///api/v1/nodes/rc_load_carrier/services/delete_regions_of_interest + + The definitions of the request and response are the same as + described in + + delete_regions_of_interest + + in "rc_roi_db". + +set_region_of_interest_2d (deprecated) + + Persistently stores a 2D region of interest on the + + rc_visard NG + + . + + API version 2 + + This service is not available in API version 2. Use + + set_region_of_interest_2d + + in "rc_roi_db" instead. + + API version 1 (deprecated) + + This service can be called as follows. + + PUT http:///api/v1/nodes/rc_load_carrier/services/set_region_of_interest_2d + + The definitions of the request and response are the same as + described in + + set_region_of_interest_2d + + in "rc_roi_db". + +get_regions_of_interest_2d (deprecated) + + Returns the configured 2D regions of interest with the requested + "region_of_interest_2d_ids". + + API version 2 + + This service is not available in API version 2. Use + + get_regions_of_interest_2d + + in "rc_roi_db" instead. + + API version 1 (deprecated) + + This service can be called as follows. + + PUT http:///api/v1/nodes/rc_load_carrier/services/get_region_of_interest_2d + + The definitions of the request and response are the same as + described in + + get_regions_of_interest_2d + + in "rc_roi_db". + +delete_regions_of_interest_2d (deprecated) + + Deletes the configured 2D regions of interest with the requested + "region_of_interest_2d_ids". + + API version 2 + + This service is not available in API version 2. Use + + delete_regions_of_interest_2d + + in "rc_roi_db" instead. + + API version 1 (deprecated) + + This service can be called as follows. + + PUT http:///api/v1/nodes/rc_load_carrier/services/delete_regions_of_interest_2d + + The definitions of the request and response are the same as + described in + + delete_regions_of_interest_2d + + in "rc_roi_db". + +Return codes + +Each service response contains a "return_code", which consists of a +"value" plus an optional "message". A successful service returns with +a "return_code" value of "0". Negative "return_code" values indicate +that the service failed. Positive "return_code" values indicate that +the service succeeded with additional information. The smaller value +is selected in case a service has multiple "return_code" values, but +all messages are appended in the "return_code" message. + +The following table contains a list of common codes: + +Return codes of the LoadCarrier module's services Code +Description 0 Success -1 An invalid argument was provided -4 +Data acquisition took longer than allowed -10 New element could not +be added as the maximum storage capacity of load carriers has been +exceeded -11 Sensor not connected, not supported or not ready -302 +More than one load carrier provided to the detect_load_carriers or +detect_filling_level services, but only one is supported 3 The +detection timeout during load carrier detection has been reached. +Consider reducing the model tolerance. 10 The maximum storage +capacity of load carriers has been reached 11 An existent persistent +model was overwritten by the call to set_load_carrier 100 The +requested load carriers were not detected in the scene 102 The +detected load carrier has no points inside 300 A valid robot_pose +was provided as argument but it is not required diff --git a/v24.04/en/_sources/loadcarrier_db.rst.txt b/v24.04/en/_sources/loadcarrier_db.rst.txt new file mode 100644 index 0000000..64b0922 --- /dev/null +++ b/v24.04/en/_sources/loadcarrier_db.rst.txt @@ -0,0 +1,459 @@ +LoadCarrierDB + +Introduction + +The LoadCarrierDB module (Load carrier database module) allows the +global definition of load carriers, which can then be used in many +detection modules. The specified load carriers are available for all +modules supporting load carriers on the + +rc_visard NG + +. + +The LoadCarrierDB module is a base module which is available on every + +rc_visard NG + +. + +Specifications of the LoadCarrierDB module Supported load carrier +types 4-sided or 3-sided Supported rim types solid rim, stepped rim +or ledged rim Min. load carrier dimensions 0.1 m x 0.1 m x 0.05 m +Max. load carrier dimensions 2 m x 2 m x 2 m Max. number of load +carriers 50 Load carriers available in ItemPick and +BoxPick\:(Section \ref{itempick:sect-itempick}) and +SilhouetteMatch\:(Section \ref{silhouettematch:sect-silhouettematch}) +Supported pose types no pose, orientation prior, exact pose +Supported reference frames camera, external + +Load carrier definition + +A load carrier (bin) is a container with four walls, a floor and a +rectangular rim, which can contain objects. It can be used to limit +the volume in which to search for objects or grasp points. + +A load carrier is defined by its "outer_dimensions" and +"inner_dimensions". The maximum "outer_dimensions" are 2.0 meters in +every dimension. + +The origin of the load carrier reference frame is in the center of the +load carrier's + +outer + + box and its z axis is perpendicular to the load carrier's floor +pointing outwards (see + +Fig. 50 + +). + + +Note: Typically, outer and inner dimensions of a load carrier are + available in the specifications of the load carrier manufacturer. + +The inner volume of the load carrier is defined by its inner +dimensions, but includes a region of 10 cm height above the load +carrier, so that also items protruding from the load carrier are +considered for detection or grasp computation. Furthermore, an +additional "crop_distance" is subtracted from the inner volume in +every dimension, which acts as a safety margin and can be configured +as run-time parameter in the LoadCarrier module (see + +Parameters + +). + +Fig. 51 + + visualizes the inner volume of a load carrier. Only points which are +inside this volume are considered for detections. + + +Since the load carrier detection is based on the detection of the load +carrier's rim, the rim geometry must be specified if it cannot be +determined from the difference between outer and inner dimensions. A +load carrier with a stepped rim can be defined by setting a +"rim_thickness". The rim thickness gives the thickness of the outer +part of the rim in the x and y direction. When a rim thickness is +given, an optional "rim_step_height" can also be specified, which +gives the height of the step between the outer and the inner part of +the rim. When the step height is given, it will also be considered +during collision checking (see + +CollisionCheck + +). Examples of load carriers with stepped rims are shown in + +Fig. 52 + + A, B. In addition to the "rim_thickness" and "rim_step_height" the +"rim_ledge" can be specified for defining load carriers whose inner +rim protrudes into the interior of the load carrier, such as pallet +cages. The "rim_ledge" gives the thickness of the inner part of the +rim in the x and y direction. An example of a load carrier with a +ledged rim is shown in + +Fig. 52 + + C. + + +The different rim types are applicable to both, standard 4-sided and +3-sided load carriers. For a 3-sided load carrier, the "type" must be +"THREE_SIDED". If the type is set to "STANDARD" or left empty, a +4-sided load carrier is specified. A 3-sided load carrier has one side +that is lower than the other three sides. This "height_open_side" is +measured from the outer bottom of the load carrier. The open side is +at the negative y-axis of the load carrier's coordinate system. +Examples of the two load carrier types are given in + +Fig. 53 + +. The height of the lower side is only considered during collision +checking and not required for the detection of the load carrier. + + +A load carrier can be specified with a full 3D "pose" consisting of a +"position" and an "orientation" quaternion, given in a "pose_frame". +Based on the given "pose_type" this pose is either used as an +orientation prior ("pose_type" is "ORIENTATION_PRIOR" or empty), or as +the exact pose of the load carrier ("pose_type" is "EXACT_POSE"). + +In case the pose serves as orientation prior, the detected load +carrier pose is guaranteed to have the minimum rotation with respect +to the load carrier's prior pose. This pose type is useful for +detecting tilted load carriers and for resolving the orientation +ambiguity in the x and y direction caused by the symmetry of the load +carrier model. + +In case the pose type is set to "EXACT_POSE", no load carrier +detection will be performed on the scene data, but the given pose will +be used in exactly the same way as if the load carrier is detected at +that pose. This pose type is especially useful in cases where load +carriers do not change their positions and/or are hard to detect (e.g. +because their rim is too thin or the material is too shiny). + +The + +rc_visard NG + + can persistently store up to 50 different load carrier models, each +one identified by a different "id". The configuration of a load +carrier model is normally performed offline, during the set up the +desired application. This can be done via the + +REST-API interface + + or in the + +rc_visard NG + + Web GUI. + +Note: The configured load carrier models are persistent even over + firmware updates and rollbacks. + +Load carrier compartments + +Some detection modules can make use of a "load_carrier_compartment" to +further limit the volume for the detection, for example + +ItemPick's compute_grasps service + +. A load carrier compartment is a box whose "pose" is defined as the +transformation from the load carrier reference frame to the +compartment reference frame, which is located in the center of the +compartment box (see + +Fig. 54 + +). The load carrier compartment is defined for each detection call +separately and is not part of the load carrier definition in the +LoadCarrierDB module. + + +The compartment volume is intersected with the load carrier inner +volume to compute the volume for the detection. If this intersection +should also contain the 10 cm region above the load carrier, the +height of the compartment box must be increased accordingly. + +Interaction with other modules + +Internally, the LoadCarrierDB module depends on, and interacts with +other on-board modules as listed below. + +Hand-eye calibration + +In case the camera has been calibrated to a robot, the load carrier's +exact pose or orientation prior can be provided in the robot +coordinate frame by setting the corresponding "pose_frame" argument to +"external". + +Two different "pose_frame" values can be chosen: + +Camera frame (camera). The load carrier pose or orientation prior is +provided in the camera frame, and no prior knowledge about the pose of +the camera in the environment is required. This means that the +configured load carriers move with the camera. It is the user's +responsibility to update the configured poses if the camera frame +moves (e.g. with a robot-mounted camera). + +External frame (external). The load carrier pose or orientation prior +is provided in the external frame, configured by the user during the +hand-eye calibration process. The module relies on the on-board Hand- +eye calibration module\:(Section \ref{handeye_calibration:sect- +handeye-calibration}) to retrieve the sensor mounting (static or robot +mounted) and the hand-eye transformation. + +Note: If no hand-eye calibration is available, all "pose_frame" + values should be set to "camera". + +All "pose_frame" values that are not "camera" or "external" are +rejected. + +Services + +The LoadCarrierDB module is called "rc_load_carrier_db" in the REST- +API and is represented in the + +Web GUI + + under Database ‣ Load Carriers. The user can explore and call the +LoadCarrierDB module's services, e.g. for development and testing, +using the + +REST-API interface + + or the Web GUI. + +The LoadCarrierDB module offers the following services. + +set_load_carrier + + Persistently stores a load carrier on the + + rc_visard NG + + . All configured load carriers are persistent over firmware updates + and rollbacks. + + Details + + This service can be called as follows. + + PUT http:///api/v2/nodes/rc_load_carrier_db/services/set_load_carrier + + Request + + Details for the definition of the "load_carrier" type are given in + + Load carrier definition + + . + + The field "type" is optional and accepts "STANDARD" and + "THREE_SIDED". + + The field "pose_type" is optional and accepts "NO_POSE", + "EXACT_POSE" and "ORIENTATION_PRIOR". + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "load_carrier": { + "height_open_side": "float64", + "id": "string", + "inner_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "outer_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "pose_type": "string", + "rim_ledge": { + "x": "float64", + "y": "float64" + }, + "rim_step_height": "float64", + "rim_thickness": { + "x": "float64", + "y": "float64" + }, + "type": "string" + } + } + } + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "set_load_carrier", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +get_load_carriers + + Returns the configured load carriers with the requested + "load_carrier_ids". If no "load_carrier_ids" are provided, all + configured load carriers are returned. + + Details + + This service can be called as follows. + + PUT http:///api/v2/nodes/rc_load_carrier_db/services/get_load_carriers + + Request + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "load_carrier_ids": [ + "string" + ] + } + } + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "get_load_carriers", + "response": { + "load_carriers": [ + { + "height_open_side": "float64", + "id": "string", + "inner_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "outer_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "pose_type": "string", + "rim_ledge": { + "x": "float64", + "y": "float64" + }, + "rim_step_height": "float64", + "rim_thickness": { + "x": "float64", + "y": "float64" + }, + "type": "string" + } + ], + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +delete_load_carriers + + Deletes the configured load carriers with the requested + "load_carrier_ids". All load carriers to be deleted must be + explicitly stated in "load_carrier_ids". + + Details + + This service can be called as follows. + + PUT http:///api/v2/nodes/rc_load_carrier_db/services/delete_load_carriers + + Request + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "load_carrier_ids": [ + "string" + ] + } + } + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "delete_load_carriers", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +Return codes + +Each service response contains a "return_code", which consists of a +"value" plus an optional "message". A successful service returns with +a "return_code" value of "0". Negative "return_code" values indicate +that the service failed. Positive "return_code" values indicate that +the service succeeded with additional information. The smaller value +is selected in case a service has multiple "return_code" values, but +all messages are appended in the "return_code" message. + +The following table contains a list of common codes: + +Return codes of the LoadCarrierDB module's services Code +Description 0 Success -1 An invalid argument was provided -10 +New element could not be added as the maximum storage capacity of load +carriers has been exceeded 10 The maximum storage capacity of load +carriers has been reached 11 An existent persistent model was +overwritten by the call to set_load_carrier diff --git a/v24.04/en/_sources/maintenance.rst.txt b/v24.04/en/_sources/maintenance.rst.txt new file mode 100644 index 0000000..1bffc10 --- /dev/null +++ b/v24.04/en/_sources/maintenance.rst.txt @@ -0,0 +1,440 @@ +Maintenance + +Warning: The customer does not need to open the + + rc_visard NG + + 's housing to perform maintenance. Unauthorized opening will void + the warranty. + +Lens cleaning + +Glass lenses with antireflective coating are used to reduce glare. +Please take special care when cleaning the lenses. To clean them, use +a soft lens-cleaning brush to remove dust or dirt particles. Then use +a clean microfiber cloth that is designed to clean lenses, and gently +wipe the lens using a circular motion to avoid scratches that may +compromise the sensor's performance. For stubborn dirt, high purity +isopropanol or a lens cleaning solution formulated for coated lenses +(such as the Uvex Clear family of products) may be used. + +Camera calibration + +The cameras are calibrated during production. Under normal operating +conditions, the calibration will be valid for the life time of the +sensor. High impact, such as occurring when dropping the + +rc_visard NG + +, can change the camera's parameters slightly. In this case, +calibration can be verified and recalibration undertaken via the Web +GUI (see + +Camera calibration + +). + +Creating and restoring backups of settings + +The + +rc_visard NG + + offers the possibility to download the current settings as backup or +for transferring them to a different + +rc_visard + + or + +rc_cube + +. + +The current settings of the + +rc_visard NG + + can be downloaded on the + +Web GUI + +'s + +System + + page in the + +rc_visard NG + + +Settings + + section. They can also be downloaded via the + +rc_visard NG + +'s + +REST-API interface + + using the + +GET /system/backup + + request. + +For downloading a backup, the user can choose which settings to +include: + +nodes: the settings of all modules (parameters, preferred orientations +and sorting strategies) + +load_carriers: the configured load carriers + +regions_of_interest: the configured 2D and 3D regions of interest + +grippers: the configured grippers (without the CAD elements) + +The returned backup should be stored as a .json file. + +The templates of the SilhouetteMatch module are not included in the +backup but can be downloaded manually using the REST-API or the Web +GUI (see + +Template API + +). + +A backup can be restored to the + +rc_visard NG + + on the + +Web GUI + +'s + +System + + page in the + +rc_visard NG + + +Settings + + section by uploading the backup .json file. In the + +Web GUI + + the settings included in the backup are shown and can be chosen for +restore. The corresponding + +REST-API interface + + call is + +POST /system/backup + +. + +Warning: When restoring load carriers, all existing load carriers on + the + + rc_visard NG + + will get lost and will be replaced by the content of the backup. + The same applies to restoring grippers and regions of interest. + +When restoring a backup, only the settings which are applicable to the + +rc_visard NG + + are restored. Parameters for modules that do not exist on the device +or do not have a valid license will be skipped. If a backup can only +be restored partially, the user will be notified by warnings. + +Updating the firmware + +Information about the current firmware image version can be found on +the + +Web GUI + +'s System ‣ Firmware & License page. It can also be accessed via the + +rc_visard NG + +'s + +REST-API interface + + using the + +GET /system + + request. Users can use either the Web GUI or the REST-API to update +the firmware. + +Warning: When upgrading from a version prior to 21.07, all of the + software modules' configured parameters will be reset to their + defaults after a firmware update. Only when upgrading from version + 21.07 or higher, the last saved parameters will be preserved. Please + make sure these settings are persisted on the application-side or + client PC (e.g., using the + + REST-API interface + + ) to request all parameters and store them prior to executing the + update.The following settings are excluded from this and will be + persisted across a firmware update: + + the rc_visard NG's network configuration including an optional + static IP address and the user-specified device name, + + the latest result of the Hand-eye calibration\:(Section + \ref{handeye_calibration:sect-handeye-calibration}), i.e., + recalibrating the rc_visard NG w.r.t. a robot is not required, + unless camera mounting has changed, and + + the latest result of the Camera calibration\:(Section + \ref{camera_calibration:sect-camera-calibration}), i.e., + recalibration of the rc_visard's stereo cameras is not required. + +Step 1: Download the newest firmware version. + Firmware updates will be supplied from of a Mender artifact file + identified by its ".mender" suffix. + + If a new firmware update is available for your + + rc_visard NG + + device, the respective file can be downloaded to a local computer + from + + https://www.roboception.com/download + + . + +Step 2: Upload the update file. + To update with the + + rc_visard NG + + 's REST-API, users may refer to the + + POST /system/update + + request. + + To update the firmware via the Web GUI, locate the System ‣ + Firmware & License page and press the "Upload + + rc_visard NG + + Update" button. Select the desired update image file (file + extension ".mender") from the local file system and open it to + start the update. + + Depending on the network architecture and configuration, the upload + may take several minutes. During the update via the Web GUI, a + progress bar indicates the progress of the upload. + + Note: Depending on the web browser, the update progress status + shown in the progress bar may indicate the completion of the + update too early. Please wait until a notification window opens, + which indicates the end of the update process. Expect an overall + update time of at least five minutes. + + Warning: Do not close the web browser tab which contains the Web + GUI or press the renew button on this tab, because it will abort + the update procedure. In that case, repeat the update procedure + from the beginning. + +Step 3: Reboot the +rc_visard NG + +. + To apply a firmware update to the + + rc_visard NG + + device, a reboot is required after having uploaded the new image + version. + + Note: The new image version is uploaded to the inactive partition + of the + + rc_visard NG + + . Only after rebooting will the inactive partition be activated, + and the active partition will become inactive. If the updated + firmware image cannot be loaded, this partition of the + + rc_visard NG + + remains inactive and the previously installed firmware version + from the active partition will be used automatically. + + As for the REST-API, the reboot can be performed by the + + PUT /system/reboot + + request. + + After having uploaded the new firmware via the Web GUI, a + notification window is opened, which offers to reboot the device + immediately or to postpone the reboot. To reboot the + + rc_visard NG + + at a later time, use the + + Reboot + + button on the Web GUI's + + System + + page. + +Step 4: Confirm the firmware update. + After rebooting the + + rc_visard NG + + , please check the firmware image version number of the currently + active image to make sure that the updated image was successfully + loaded. You can do so either via the Web GUI's System ‣ Firmware & + License page or via the REST-API's + + GET /system/update + + request. + + Please contact Roboception in case the firmware update could not be + applied successfully. + +Restoring the previous firmware version + +After a successful firmware update, the previous firmware image is +stored on the inactive partition of the + +rc_visard NG + + and can be restored in case needed. This procedure is called a + +rollback + +. + +Note: Using the latest firmware as provided by Roboception is + strongly recommended. Hence, rollback functionality should only be + used in case of serious issues with the updated firmware version. + +Rollback functionality is only accessible via the + +rc_visard NG + +'s + +REST-API interface + + using the + +PUT /system/rollback + + request. It can be issued using any HTTP-compatible client or using a +web browser as described in + +Swagger UI + +. Like the update process, the rollback requires a subsequent device +reboot to activate the restored firmware version. + +Rebooting the rc_visard NG + +An + +rc_visard NG + + reboot is necessary after updating the firmware or performing a +software rollback. It can be issued either programmatically, via the + +rc_visard NG + +'s + +REST-API interface + + using the + +PUT /system/reboot + + request, or manually on the + +Web GUI + +'s + +System + + page. + +The reboot is finished when the LED turns green again. + +Updating the software license + +Licenses that are purchased from Roboception for enabling additional +features can be installed via the + +Web GUI + +'s System ‣ Firmware & License page. The + +rc_visard NG + + has to be rebooted to apply the licenses. + +Downloading log files + +During operation, the + +rc_visard NG + + logs important information, warnings, and errors into files. If the + +rc_visard NG + + exhibits unexpected or erroneous behavior, the log files can be used +to trace its origin. Log messages can be viewed and filtered using the + +Web GUI + +'s System ‣ Logs page. If contacting the support ( + +Contact + +), the log files are very useful for tracking possible problems. To +download them as a .tar.gz file, click on Download all logs on the Web +GUI's System ‣ Logs page. + +Aside from the Web GUI, the logs are also accessible via the + +rc_visard NG + +'s + +REST-API interface + + using the + +GET /logs + + and + +GET /logs/{log} + + requests. diff --git a/v24.04/en/_sources/modules.rst.txt b/v24.04/en/_sources/modules.rst.txt new file mode 100644 index 0000000..b093e96 --- /dev/null +++ b/v24.04/en/_sources/modules.rst.txt @@ -0,0 +1,42 @@ +Software modules + +The + +rc_visard NG + + comes with several on-board software modules, each of which +corresponds to a certain functionality and can be interfaced via its +respective + +node + + in the + +REST-API interface + +. + +The + +rc_visard NG + +'s software modules can be divided into + +3D camera modules\:(Section \ref{camera_modules:sect-3d-camera- +modules}) which acquire image pairs and compute 3D depth information +such as disparity, error, and confidence images, and are also +accessible via the rc_visard NG's GigE Vision/GenICam interface, + +Detection modules\:(Section \ref{detection_modules:sect-detection- +modules}) which provide a variety of detection functionalities, such +as grasp point computation and object detection, + +Configuration modules\:(Section \ref{configuration_modules:sect- +configuration-modules}) which enable the user to perform calibrations +and configure the rc_visard NG for specific applications. + +Database modules\:(Section \ref{database_modules:sect-database- +modules}) which enable the user to configure global data available to +all other modules, such as load carriers, regions of interest and +grippers. + diff --git a/v24.04/en/_sources/navigation_modules.rst.txt b/v24.04/en/_sources/navigation_modules.rst.txt new file mode 100644 index 0000000..57f920f --- /dev/null +++ b/v24.04/en/_sources/navigation_modules.rst.txt @@ -0,0 +1,25 @@ +Navigation modules + +The + +rc_visard NG + +'s navigation modules contain: + +dynamics (rc_dynamics, Section \ref{dynamics:sect-dynamics}) provides +estimates of rc_visard's dynamic state such as its pose, velocity, and +acceleration. These states are transmitted as continuous data streams +via the rc_dynamics interface. For this purpose, the dynamics module +manages and fuses data from the following individual subcomponents: +stereo_visodo (rc_stereovisodo, Section \ref{stereo_visodo:sect- +visual-odometry}) estimates the motion of the rc_visard device based +on the motion of characteristic visual features in the left camera +images. stereo_ins (rc_stereo_ins, Section \ref{stereo_ins:sect- +stereo-ins}) combines visual odometry measurements with readings from +the on-board Inertial Measurement Unit (IMU) to provide accurate and +high-frequency state estimates in real time. slam (rc_slam, Section +\ref{slam:sect-slam}) performs simultaneous localization and mapping +for correcting accumulated poses. The rc_visard's covered trajectory +is offered via the REST-API interface\:(Section \ref{rest_api:sect- +rest-api}). + diff --git a/v24.04/en/_sources/opc_ua.rst.txt b/v24.04/en/_sources/opc_ua.rst.txt new file mode 100644 index 0000000..9648d2f --- /dev/null +++ b/v24.04/en/_sources/opc_ua.rst.txt @@ -0,0 +1,19 @@ +OPC UA interface + +The + +rc_visard NG + + also offers an optional OPC UA interface. The OPC UA server can be +activated via license update. + +The OPC UA server uses the "DataTypeDefinition" attribute (available +in OPC UA version 1.04) for custom datatypes and also uses methods and +variable length arrays. Please check if your OPC UA client supports +this. + +Please contact + +support@roboception.de + + if you are interested in using the OPC UA server. diff --git a/v24.04/en/_sources/pipelines.rst.txt b/v24.04/en/_sources/pipelines.rst.txt new file mode 100644 index 0000000..136563d --- /dev/null +++ b/v24.04/en/_sources/pipelines.rst.txt @@ -0,0 +1,146 @@ +Camera pipelines + +The + +rc_visard NG + + supports multiple cameras at the same time. For this, it offers up to +four + +camera pipelines + + that can be configured by the user. + +A camera pipeline contains several software modules which are +responsible for acquiring data of the camera connected to that +pipeline, performing detections or configuring modules used in this +pipeline, e.g. by hand-eye calibration. + +The + +rc_visard NG + + supports cameras of type + +rc_visard + +, + +rc_viscore + + and + +blaze + +. The type of the corresponding camera pipeline has to be configured +to match the connected device. + +Configuration of camera pipelines + +The camera pipelines can be configured via the + +Web GUI + + under System ‣ Camera Pipelines. This page shows the running +pipelines with their types and the connected devices. + + +Clicking on Configure Camera Pipelines allows to configure the number +and type of running pipelines as shown in the next figure. + +Note: The + + rc_cube I + + provides four camera pipelines, the + + rc_cube S + + two. + + +The type of a running pipeline can be changed by selecting a different +type in the drop down field. A running pipeline can be removed by +clicking Remove Pipeline. Only pipeline 0 can never be removed, +because this is the primary pipeline. Clicking on + Add Pipeline +allows to choose the type for the new pipeline and creates a new +pipeline of the chosen type. Once the pipelines are configured as +desired, clicking Apply Changes & Reboot will apply the new +configuration and immediately reboot the + +rc_cube + +. + +Configuration of connected cameras + +A pipeline of a certain type can only discover devices of the same +type. That means, a pipeline of type "rc_visard" can only connect to +an + +rc_visard + +. In case multiple cameras of the same type are connected to the + +rc_cube + +, the user can set a + +device filter + + to choose a specific camera for each pipeline. The current device +filter value is displayed for each running pipeline as shown in "fig- +pipelines-running". By default, the device filter is set to "*", which +means that any device matching the pipeline type will automatically be +connected, but only if there is a unique match. Otherwise, no camera +will be connected to that pipeline and an error will be shown. + +To adjust the device filter and select the camera to be connected to a +pipeline, click on Configure Camera Connection on the + +Camera Pipelines + + page, or select the corresponding pipeline in the menu, e.g. under +System ‣ Camera Pipelines ‣ Pipeline 1. This will show the current +device filter value and more information about the connected camera. + + +Clicking Choose Camera opens a dialog to edit the device filter. + + +This dialog also shows a list of all discovered devices matching the +pipeline type and highlights the ones that match the current value +entered for the device filter. It also indicates if the devices are +already in use in a different pipeline. Device filters can be selected +by clicking on an + +Interface + +, + +Name + + or + +Serial + + of the desired device in the list. The following table shows possible +device filter values. + +Possible device filter values Device filter Description * +selects any device matching the pipeline type sensor:* selects +any device connected via the sensor interface that matches the +pipeline type selects the device by the user-defined name + selects the device by the full serial number +sensor: selects the device connected via the sensor +interface with the given serial sensor: selects the device +connected via the sensor interface with the given user-defined name +if empty, no camera will be connected + +By pressing Save, the entered device filter is applied and a camera +matching the device filter is connected to this pipeline, if possible. +Changing the device filter does not require a reboot of the + +rc_cube + +. diff --git a/v24.04/en/_sources/pose_format_abb.rst.txt b/v24.04/en/_sources/pose_format_abb.rst.txt new file mode 100644 index 0000000..ec1f9b8 --- /dev/null +++ b/v24.04/en/_sources/pose_format_abb.rst.txt @@ -0,0 +1,7 @@ +ABB pose format + +ABB robots use a position and a quaternion for describing a pose, like + +rc_visard NG + + devices. There is no conversion of the orientation needed. diff --git a/v24.04/en/_sources/pose_format_fanuc.rst.txt b/v24.04/en/_sources/pose_format_fanuc.rst.txt new file mode 100644 index 0000000..3313f15 --- /dev/null +++ b/v24.04/en/_sources/pose_format_fanuc.rst.txt @@ -0,0 +1,37 @@ +FANUC XYZ-WPR format + +The pose format that is used by FANUC robots consists of a position +XYZ in millimeters and an orientation WPR that is given by three +angles in degrees, with W rotating around x-axis, P rotating around +y-axis and R rotating around z-axis. The rotation order is x-y-z and +computed by r_z(R) r_y(P) r_x(W). + +Conversion from FANUC-WPR to quaternion + +The conversion from the WPR angles in degrees to a quaternion +q=(\begin{array}{cccc}x & y & z & w\end{array}) can be done by first +converting all angles to radians + + W_r = W \frac{\pi}{180} \text{,} \\ P_r = P \frac{\pi}{180} + \text{,} \\ R_r = R \frac{\pi}{180} \text{,} \\ + +and then calculating the quaternion with + + x = \cos{(R_r/2)}\cos{(P_r/2)}\sin{(W_r/2)} - + \sin{(R_r/2)}\sin{(P_r/2)}\cos{(W_r/2)} \text{,} \\ y = + \cos{(R_r/2)}\sin{(P_r/2)}\cos{(W_r/2)} + + \sin{(R_r/2)}\cos{(P_r/2)}\sin{(W_r/2)} \text{,} \\ z = + \sin{(R_r/2)}\cos{(P_r/2)}\cos{(W_r/2)} - + \cos{(R_r/2)}\sin{(P_r/2)}\sin{(W_r/2)} \text{,} \\ w = + \cos{(R_r/2)}\cos{(P_r/2)}\cos{(W_r/2)} + + \sin{(R_r/2)}\sin{(P_r/2)}\sin{(W_r/2)} \text{.} + +Conversion from quaternion to FANUC-WPR + +The conversion from a quaternion q=(\begin{array}{cccc}x & y & z & +w\end{array}) with ||q||=1 to the WPR angles in degrees can be done as +follows. + + R &= \text{atan}_2{(2(wz + xy), 1 - 2(y^2 + z^2))} \frac{180}{\pi} + \\ P &= \text{asin}{(2(wy - zx))} \frac{180}{\pi} \\ W &= + \text{atan}_2{(2(wx + yz), 1 - 2(x^2 + y^2))} \frac{180}{\pi} diff --git a/v24.04/en/_sources/pose_format_franka_emika.rst.txt b/v24.04/en/_sources/pose_format_franka_emika.rst.txt new file mode 100644 index 0000000..035adf9 --- /dev/null +++ b/v24.04/en/_sources/pose_format_franka_emika.rst.txt @@ -0,0 +1,90 @@ +Franka Emika Pose Format + +Franka Emika robots use a transformation matrix T to define a pose. A +transformation matrix combines a rotation matrix R and a translation +vector t=(\begin{array}{cccc}x & y & z\end{array})^T. + + T = \left(\begin{array}{cccc} r_{00} & r_{01} & r_{02} & x\\ + r_{10} & r_{11} & r_{12} & y\\ r_{20} & r_{21} & r_{22} & z\\ 0 + & 0 & 0 & 1 \end{array}\right) + +The pose given by Franka Emika's "Measure Pose" App consists of a +translation x, y, z in millimeters and a rotation x, y, z in degrees. +The rotation convention is z-y'-x'' (i.e. x-y-z) and is computed by +r_z(z) r_y(y) r_x(x). + +Conversion from transformation matrix to quaternion + +The conversion from a rotation matrix (with det(R)=1) to a quaternion +q=(\begin{array}{cccc}q_x & q_y & q_z & q_w \end{array}) can be done +as follows: + + q_x &= \text{sign}(r_{21}-r_{12}) \frac{1}{2}\sqrt{\text{max}(0, 1 + + r_{00} - r_{11} - r_{22})} \\ q_y &= \text{sign}(r_{02}-r_{20}) + \frac{1}{2}\sqrt{\text{max}(0, 1 - r_{00} + r_{11} - r_{22})} \\ + q_z &= \text{sign}(r_{10}-r_{01}) \frac{1}{2}\sqrt{\text{max}(0, 1 + - r_{00} - r_{11} + r_{22})} \\ q_w &= + \frac{1}{2}\sqrt{\text{max}(0, 1 + r_{00} + r_{11} + r_{22})} + +The \text{sign} operator returns -1 if the argument is negative. +Otherwise, 1 is returned. It is used to recover the sign for the +square root. The \text{max} function ensures that the argument of the +square root function is not negative, which can happen in practice due +to round-off errors. + +Conversion from Rotation-XYZ to quaternion + +The conversion from the x, y, z angles in degrees to a quaternion +q=(\begin{array}{cccc}q_x & q_y & q_z & q_w\end{array}) can be done by +first converting all angles to radians + + X_r = x \frac{\pi}{180} \text{,} \\ Y_r = y \frac{\pi}{180} + \text{,} \\ Z_r = z \frac{\pi}{180} \text{,} \\ + +and then calculating the quaternion with + + q_x = \cos{(Z_r/2)}\cos{(Y_r/2)}\sin{(X_r/2)} - + \sin{(Z_r/2)}\sin{(Y_r/2)}\cos{(X_r/2)} \text{,} \\ q_y = + \cos{(Z_r/2)}\sin{(Y_r/2)}\cos{(X_r/2)} + + \sin{(Z_r/2)}\cos{(Y_r/2)}\sin{(X_r/2)} \text{,} \\ q_z = + \sin{(Z_r/2)}\cos{(Y_r/2)}\cos{(X_r/2)} - + \cos{(Z_r/2)}\sin{(Y_r/2)}\sin{(X_r/2)} \text{,} \\ q_w = + \cos{(Z_r/2)}\cos{(Y_r/2)}\cos{(X_r/2)} + + \sin{(Z_r/2)}\sin{(Y_r/2)}\sin{(X_r/2)} \text{.} + +Conversion from quaternion and translation to transformation + +The conversion from a quaternion q=(\begin{array}{cccc}q_x & q_y & q_z +& q_w\end{array}) and a translation vector t=(\begin{array}{cccc}x & y +& z\end{array})^T to a transformation matrix T can be done as follows: + + T = \left(\begin{array}{cccc} 1 - 2s(q_y^2+q_z^2) & 2s(q_x q_y- + q_z q_w) & 2s(q_x q_z+q_y q_w) & x\\ 2s(q_x q_y+q_z q_w) & 1 - + 2s(q_x^2+q_z^2) & 2s(q_y q_z-q_x q_w) & y\\ 2s(q_x q_z-q_y q_w) + & 2s(q_y q_z+q_x q_w) & 1 - 2s(q_x^2+q_y^2) & z\\ 0 & + 0 & 0 & 1 \end{array}\right) + +where s=||q||^{-2}=\frac{1}{q_x^2+q_y^2+q_z^2+q_w^2} and s=1 if q is a +unit quaternion. + +Conversion from quaternion to Rotation-XYZ + +The conversion from a quaternion q=(\begin{array}{cccc}q_x & q_y & q_z +& q_w\end{array}) with ||q||=1 to the x, y, z angles in degrees can be +done as follows. + + x &= \text{atan}_2{(2(q_w q_z + q_x q_y), 1 - 2(q_y^2 + q_z^2))} + \frac{180}{\pi} \\ y &= \text{asin}{(2(q_w q_y - q_z q_x))} + \frac{180}{\pi} \\ z &= \text{atan}_2{(2(q_w q_x + q_y q_z), 1 - + 2(q_x^2 + q_y^2))} \frac{180}{\pi} + +Pose representation in RaceCom messages and state machines + +In RaceCom messages and in state machines a pose is usually defined as +one-dimensional array of 16 float values, representing the +transformation matrix in column-major order. The indices of the matrix +entries below correspond to the array indices + + T = \left(\begin{array}{cccc} a_0 & a_4 & a_8 & a_{12}\\ a_1 + & a_5 & a_9 & a_{13}\\ a_2 & a_6 & a_{10} & a_{14}\\ a_3 & + a_7 & a_{11} & a_{15} \end{array}\right) diff --git a/v24.04/en/_sources/pose_format_fruitcore_horst.rst.txt b/v24.04/en/_sources/pose_format_fruitcore_horst.rst.txt new file mode 100644 index 0000000..b376155 --- /dev/null +++ b/v24.04/en/_sources/pose_format_fruitcore_horst.rst.txt @@ -0,0 +1,8 @@ +Fruitcore HORST pose format + +Fruitcore HORST robots use a position in meters and a quaternion with +q_0 = w, q_1 = x, q_2 = y and q_3 = z for describing a pose, like + +rc_visard NG + + devices. There is no conversion needed. diff --git a/v24.04/en/_sources/pose_format_kawasaki.rst.txt b/v24.04/en/_sources/pose_format_kawasaki.rst.txt new file mode 100644 index 0000000..a95f18c --- /dev/null +++ b/v24.04/en/_sources/pose_format_kawasaki.rst.txt @@ -0,0 +1,60 @@ +Kawasaki XYZ-OAT format + +The pose format that is used by Kawasaki robots consists of a position +XYZ in millimeters and an orientation OAT that is given by three +angles in degrees, with O rotating around z axis, A rotating around +the rotated y axis and T rotating around the rotated z axis. The +rotation convention is z-y'-z'' (i.e. z-y-z) and computed by r_z(O) +r_y(A) r_z(T). + +Conversion from Kawasaki-OAT to quaternion + +The conversion from the OAT angles in degrees to a quaternion +q=(\begin{array}{cccc}x & y & z & w\end{array}) can be done by first +converting all angles to radians + + O_r = O \frac{\pi}{180} \text{,} \\ A_r = A \frac{\pi}{180} + \text{,} \\ T_r = T \frac{\pi}{180} \text{,} \\ + +and then calculating the quaternion with + + x = \cos{(O_r/2)}\sin{(A_r/2)}\sin{(T_r/2)} - + \sin{(O_r/2)}\sin{(A_r/2)}\cos{(T_r/2)} \text{,} \\ y = + \cos{(O_r/2)}\sin{(A_r/2)}\cos{(T_r/2)} + + \sin{(O_r/2)}\sin{(A_r/2)}\sin{(T_r/2)} \text{,} \\ z = + \sin{(O_r/2)}\cos{(A_r/2)}\cos{(T_r/2)} + + \cos{(O_r/2)}\cos{(A_r/2)}\sin{(T_r/2)} \text{,} \\ w = + \cos{(O_r/2)}\cos{(A_r/2)}\cos{(T_r/2)} - + \sin{(O_r/2)}\cos{(A_r/2)}\sin{(T_r/2)} \text{.} + +Conversion from quaternion to Kawasaki-OAT + +The conversion from a quaternion q=(\begin{array}{cccc}x & y & z & +w\end{array}) with ||q||=1 to the OAT angles in degrees can be done as +follows. + +If x = 0 + +and + + y = 0 the conversion is + + O &= \text{atan}_2{(2(z - w), 2(z + w))} \frac{180}{\pi} \\ A &= + \text{acos}{(w^2 + z^2)} \frac{180}{\pi} \\ T &= \text{atan}_2{(2(z + + w), 2(w - z))} \frac{180}{\pi} + +If z = 0 + +and + + w = 0 the conversion is + + O &= \text{atan}_2{(2(y - x), 2(x + y))} \frac{180}{\pi} \\ A &= + \text{acos}{(-1.0)} \frac{180}{\pi} \\ T &= \text{atan}_2{(2(y + + x), 2(y - x))} \frac{180}{\pi} + +In all other cases the conversion is + + O &= \text{atan}_2{(2(yz - wx), 2(xz + wy))} \frac{180}{\pi} \\ A + &= \text{acos}{(w^2 - x^2 - y^2 + z^2)} \frac{180}{\pi} \\ T &= + \text{atan}_2{(2(yz + wx), 2(wy - xz))} \frac{180}{\pi} diff --git a/v24.04/en/_sources/pose_format_kuka.rst.txt b/v24.04/en/_sources/pose_format_kuka.rst.txt new file mode 100644 index 0000000..278387a --- /dev/null +++ b/v24.04/en/_sources/pose_format_kuka.rst.txt @@ -0,0 +1,37 @@ +KUKA XYZ-ABC format + +KUKA robots use the so called XYZ-ABC format. XYZ is the position in +millimeters. ABC are angles in degrees, with A rotating around z axis, +B rotating around y axis and C rotating around x axis. The rotation +convention is z-y'-x'' (i.e. x-y-z) and computed by r_z(A) r_y(B) +r_x(C). + +Conversion from KUKA-ABC to quaternion + +The conversion from the ABC angles in degrees to a quaternion +q=(\begin{array}{cccc}x & y & z & w\end{array}) can be done by first +converting all angles to radians + + A_r = A \frac{\pi}{180} \text{,} \\ B_r = B \frac{\pi}{180} + \text{,} \\ C_r = C \frac{\pi}{180} \text{,} \\ + +and then calculating the quaternion with + + x = \cos{(A_r/2)}\cos{(B_r/2)}\sin{(C_r/2)} - + \sin{(A_r/2)}\sin{(B_r/2)}\cos{(C_r/2)} \text{,} \\ y = + \cos{(A_r/2)}\sin{(B_r/2)}\cos{(C_r/2)} + + \sin{(A_r/2)}\cos{(B_r/2)}\sin{(C_r/2)} \text{,} \\ z = + \sin{(A_r/2)}\cos{(B_r/2)}\cos{(C_r/2)} - + \cos{(A_r/2)}\sin{(B_r/2)}\sin{(C_r/2)} \text{,} \\ w = + \cos{(A_r/2)}\cos{(B_r/2)}\cos{(C_r/2)} + + \sin{(A_r/2)}\sin{(B_r/2)}\sin{(C_r/2)} \text{.} + +Conversion from quaternion to KUKA-ABC + +The conversion from a quaternion q=(\begin{array}{cccc}x & y & z & +w\end{array}) with ||q||=1 to the ABC angles in degrees can be done as +follows. + + A &= \text{atan}_2{(2(wz + xy), 1 - 2(y^2 + z^2))} \frac{180}{\pi} + \\ B &= \text{asin}{(2(wy - zx))} \frac{180}{\pi} \\ C &= + \text{atan}_2{(2(wx + yz), 1 - 2(x^2 + y^2))} \frac{180}{\pi} diff --git a/v24.04/en/_sources/pose_format_mitsubishi.rst.txt b/v24.04/en/_sources/pose_format_mitsubishi.rst.txt new file mode 100644 index 0000000..7fc68f7 --- /dev/null +++ b/v24.04/en/_sources/pose_format_mitsubishi.rst.txt @@ -0,0 +1,39 @@ +Mitsubishi XYZ-ABC format + +The pose format that is used by Mitsubishi robots is the same as that +for KUKA robots (see + +KUKA XYZ-ABC format + +), except that A is a rotation around x axis and C is a rotation +around z axis. Thus, the rotation is computed by r_z(C) r_y(B) r_x(A). + +Conversion from Mitsubishi-ABC to quaternion + +The conversion from the ABC angles in degrees to a quaternion +q=(\begin{array}{cccc}x & y & z & w\end{array}) can be done by first +converting all angles to radians + + A_r = A \frac{\pi}{180} \text{,} \\ B_r = B \frac{\pi}{180} + \text{,} \\ C_r = C \frac{\pi}{180} \text{,} \\ + +and then calculating the quaternion with + + x = \cos{(C_r/2)}\cos{(B_r/2)}\sin{(A_r/2)} - + \sin{(C_r/2)}\sin{(B_r/2)}\cos{(A_r/2)} \text{,} \\ y = + \cos{(C_r/2)}\sin{(B_r/2)}\cos{(A_r/2)} + + \sin{(C_r/2)}\cos{(B_r/2)}\sin{(A_r/2)} \text{,} \\ z = + \sin{(C_r/2)}\cos{(B_r/2)}\cos{(A_r/2)} - + \cos{(C_r/2)}\sin{(B_r/2)}\sin{(A_r/2)} \text{,} \\ w = + \cos{(C_r/2)}\cos{(B_r/2)}\cos{(A_r/2)} + + \sin{(C_r/2)}\sin{(B_r/2)}\sin{(A_r/2)} \text{.} + +Conversion from quaternion to Mitsubishi-ABC + +The conversion from a quaternion q=(\begin{array}{cccc}x & y & z & +w\end{array}) with ||q||=1 to the ABC angles in degrees can be done as +follows. + + A &= \text{atan}_2{(2(wx + yz), 1 - 2(x^2 + y^2))} \frac{180}{\pi} + \\ B &= \text{asin}{(2(wy - zx))} \frac{180}{\pi} \\ C &= + \text{atan}_2{(2(wz + xy), 1 - 2(y^2 + z^2))} \frac{180}{\pi} diff --git a/v24.04/en/_sources/pose_format_rt.rst.txt b/v24.04/en/_sources/pose_format_rt.rst.txt new file mode 100644 index 0000000..494d6ef --- /dev/null +++ b/v24.04/en/_sources/pose_format_rt.rst.txt @@ -0,0 +1,43 @@ +Rotation matrix and translation vector + +A pose can also be defined by a rotation matrix R and a translation +vector T. + + R = \left(\begin{array}{ccc} r_{00} & r_{01} & r_{02} \\ r_{10} + & r_{11} & r_{12} \\ r_{20} & r_{21} & r_{22} \end{array}\right), + \qquad T = \left(\begin{array}{c} X \\ Y \\ Z + \end{array}\right). + +The pose transformation can be applied to a point P by + + P' = R P + T. + +Conversion from rotation matrix to quaternion + +The conversion from a rotation matrix (with det(R)=1) to a quaternion +q=(\begin{array}{cccc}x & y & z & w\end{array}) can be done as +follows. + + x &= \text{sign}(r_{21}-r_{12}) \frac{1}{2}\sqrt{\text{max}(0, 1 + + r_{00} - r_{11} - r_{22})} \\ y &= \text{sign}(r_{02}-r_{20}) + \frac{1}{2}\sqrt{\text{max}(0, 1 - r_{00} + r_{11} - r_{22})} \\ z + &= \text{sign}(r_{10}-r_{01}) \frac{1}{2}\sqrt{\text{max}(0, 1 - + r_{00} - r_{11} + r_{22})} \\ w &= \frac{1}{2}\sqrt{\text{max}(0, 1 + + r_{00} + r_{11} + r_{22})} + +The \text{sign} operator returns -1 if the argument is negative. +Otherwise, 1 is returned. It is used to recover the sign for the +square root. The \text{max} function ensures that the argument of the +square root function is not negative, which can happen in practice due +to round-off errors. + +Conversion from quaternion to rotation matrix + +The conversion from a quaternion q=(\begin{array}{cccc}x & y & z & +w\end{array}) with ||q||=1 to a rotation matrix can be done as +follows. + + R = 2 \left(\begin{array}{ccc} \frac{1}{2} - y^2 - z^2 & x y - z + w & x z + y w \\ x y + z w & \frac{1}{2} - x^2 - z^2 & y z - x w + \\ x z - y w & y z + x w & \frac{1}{2} - x^2 - y^2 + \end{array}\right) diff --git a/v24.04/en/_sources/pose_format_ur.rst.txt b/v24.04/en/_sources/pose_format_ur.rst.txt new file mode 100644 index 0000000..5e3e642 --- /dev/null +++ b/v24.04/en/_sources/pose_format_ur.rst.txt @@ -0,0 +1,47 @@ +Universal Robots pose format + +The pose format that is used by Universal Robots consists of a +position XYZ in millimeters and an orientation in angle-axis format +V=(\begin{array}{ccc}RX & RY & RZ\end{array})^T. The rotation angle +\theta in radians is the length of the rotation axis U. + + V = \left(\begin{array}{c}RX \\ RY \\ RZ\end{array}\right) = + \left(\begin{array}{c}\theta u_x \\ \theta u_y \\ \theta + u_z\end{array}\right) + +V is called a rotation vector. + +Conversion from angle-axis format to quaternion + +The conversion from a rotation vector V to a quaternion +q=(\begin{array}{cccc}x & y & z & w\end{array}) can be done as +follows. + +We first recover the angle \theta in radians from the rotation vector +V by + + \theta = \sqrt{RX^2 + RY^2 + RZ^2}\text{.} + +If \theta = 0, then the quaternion is q=(\begin{array}{cccc}0 & 0 & 0 +& 1\end{array}), otherwise it is + + x = RX \frac{\sin(\theta/2)}{\theta}\text{,} \\ y = RY + \frac{\sin(\theta/2)}{\theta}\text{,} \\ z = RZ + \frac{\sin(\theta/2)}{\theta}\text{,} \\ w = \cos(\theta/2)\text{.} + +Conversion from quaternion to angle-axis format + +The conversion from a quaternion q=(\begin{array}{cccc}x & y & z & +w\end{array}) with ||q||=1 to a rotation vector in angle-axis form can +be done as follows. + +We first recover the angle \theta in radians from the quaternion by + + \theta = 2\cdot\text{acos}(w)\text{.} + +If \theta = 0, then the rotation vector is V=(\begin{array}{ccc}0 & 0 +& 0\end{array})^T, otherwise it is + + RX = \theta \frac{x}{\sqrt{1-w^2}}\text{,} \\ RY = \theta + \frac{y}{\sqrt{1-w^2}}\text{,} \\ RZ = \theta + \frac{z}{\sqrt{1-w^2}}\text{.} diff --git a/v24.04/en/_sources/pose_format_yaskawa.rst.txt b/v24.04/en/_sources/pose_format_yaskawa.rst.txt new file mode 100644 index 0000000..07b90b5 --- /dev/null +++ b/v24.04/en/_sources/pose_format_yaskawa.rst.txt @@ -0,0 +1,37 @@ +Yaskawa Pose Format + +The pose format that is used by Yaskawa robots consists of a position +XYZ in millimeters and an orientation that is given by three angles in +degrees, with Rx rotating around x-axis, Ry rotating around y-axis and +Rz rotating around z-axis. The rotation order is x-y-z and computed by +r_z(Rz) r_y(Ry) r_x(Rx). + +Conversion from Yaskawa Rx, Ry, Rz to quaternion + +The conversion from the Rx, Ry, Rz angles in degrees to a quaternion +q=(\begin{array}{cccc}x & y & z & w\end{array}) can be done by first +converting all angles to radians + + X_r = Rx \frac{\pi}{180} \text{,} \\ Y_r = Ry \frac{\pi}{180} + \text{,} \\ Z_r = Rz \frac{\pi}{180} \text{,} \\ + +and then calculating the quaternion with + + x = \cos{(Z_r/2)}\cos{(Y_r/2)}\sin{(X_r/2)} - + \sin{(Z_r/2)}\sin{(Y_r/2)}\cos{(X_r/2)} \text{,} \\ y = + \cos{(Z_r/2)}\sin{(Y_r/2)}\cos{(X_r/2)} + + \sin{(Z_r/2)}\cos{(Y_r/2)}\sin{(X_r/2)} \text{,} \\ z = + \sin{(Z_r/2)}\cos{(Y_r/2)}\cos{(X_r/2)} - + \cos{(Z_r/2)}\sin{(Y_r/2)}\sin{(X_r/2)} \text{,} \\ w = + \cos{(Z_r/2)}\cos{(Y_r/2)}\cos{(X_r/2)} + + \sin{(Z_r/2)}\sin{(Y_r/2)}\sin{(X_r/2)} \text{.} + +Conversion from quaternion to Yaskawa Rx, Ry, Rz + +The conversion from a quaternion q=(\begin{array}{cccc}x & y & z & +w\end{array}) with ||q||=1 to the Rx, Ry, Rz angles in degrees can be +done as follows. + + Rx &= \text{atan}_2{(2(wx + yz), 1 - 2(x^2 + y^2))} \frac{180}{\pi} + \\ Ry &= \text{asin}{(2(wy - zx))} \frac{180}{\pi} \\ Rz &= + \text{atan}_2{(2(wz + xy), 1 - 2(y^2 + z^2))} \frac{180}{\pi} diff --git a/v24.04/en/_sources/rest_api.rst.txt b/v24.04/en/_sources/rest_api.rst.txt new file mode 100644 index 0000000..e1c7c81 --- /dev/null +++ b/v24.04/en/_sources/rest_api.rst.txt @@ -0,0 +1,47 @@ +REST-API interface + +Aside from the + +GenICam interface + +, the + +rc_visard NG + + offers a comprehensive RESTful web interface (REST-API) which any +HTTP client or library can access. Whereas most of the provided +parameters, services, and functionalities can also be accessed via the +user-friendly + +Web GUI + +, the REST-API serves rather as a machine-to-machine interface to the + +rc_visard NG + +, e.g., to programmatically + +set and get run-time parameters of computation nodes, e.g., of cameras +or image processing modules; + +do service calls, e.g., to start and stop individual computational +nodes, or to use offered services such as the hand-eye calibration; + +read the current state of the system and individual computational +nodes; or + +update the rc_visard NG's firmware or license. + +Note: In the + + rc_visard NG + + 's REST-API, a + + node + + is a computational component that bundles certain algorithmic + functionality and offers a holistic interface (parameters, services, + current status). Examples for such nodes are the stereo matching + node or the hand-eye calibration node. + diff --git a/v24.04/en/_sources/rest_api_datamodel.rst.txt b/v24.04/en/_sources/rest_api_datamodel.rst.txt new file mode 100644 index 0000000..72ecdda --- /dev/null +++ b/v24.04/en/_sources/rest_api_datamodel.rst.txt @@ -0,0 +1,1088 @@ +Data type definitions + +The REST-API defines the following data models, which are used to +access or modify + +the available resources + + either as required attributes/parameters of the requests or as +return types. + +DNS: + DNS settings. + + An object of type DNS has the following properties: + + dns_servers (array of string) + + manual_dns_servers (array of string) + + Template object + + { + "dns_servers": [ + "string", + "string" + ], + "manual_dns_servers": [ + "string", + "string" + ] + } + + DNS objects are nested in + + SysInfo + + , and are used in the following requests: + + GET /system/dns + + PUT /system/dns + +FirmwareInfo: + Information about currently active and inactive firmware images, + and what image is/will be booted. + + An object of type FirmwareInfo has the following properties: + + active_image (ImageInfo) - see description of ImageInfo + + fallback_booted (boolean) - true if desired image could not be + booted and fallback boot to the previous image occurred + + inactive_image (ImageInfo) - see description of ImageInfo + + next_boot_image (string) - firmware image that will be booted next + time (one of active_image, inactive_image) + + Template object + + { + "active_image": { + "image_version": "string" + }, + "fallback_booted": false, + "inactive_image": { + "image_version": "string" + }, + "next_boot_image": "string" + } + + FirmwareInfo objects are nested in + + SysInfo + + , and are used in the following requests: + + GET /system/rollback + + GET /system/update + +GripperElement: + CAD gripper element + + An object of type GripperElement has the following properties: + + id (string) - Unique identifier of the element + + Template object + + { + "id": "string" + } + + GripperElement objects are used in the following requests: + + GET /cad/gripper_elements + + GET /cad/gripper_elements/{id} + + PUT /cad/gripper_elements/{id} + +HostPort: + Port exposed on host + + An object of type HostPort has the following properties: + + port (integer) + + protocol (string) + + Template object + + { + "port": 0, + "protocol": "string" + } + + HostPort objects are nested in + + UserSpaceContainer + + . + +ImageInfo: + Information about specific firmware image. + + An object of type ImageInfo has the following properties: + + image_version (string) - image version + + Template object + + { + "image_version": "string" + } + + ImageInfo objects are nested in + + FirmwareInfo + + . + +LicenseComponentConstraint: + Constraints on the module version. + + An object of type LicenseComponentConstraint has the following + properties: + + max_version (string) - optional maximum supported version + (exclusive) + + min_version (string) - optional minimum supported version + (inclusive) + + Template object + + { + "max_version": "string", + "min_version": "string" + } + + LicenseComponentConstraint objects are nested in + + LicenseConstraints + + . + +LicenseComponents: + List of the licensing status of the individual software modules. + The respective flag is true if the module is unlocked with the + currently applied software license. + + An object of type LicenseComponents has the following properties: + + hand_eye_calibration (boolean) - hand-eye calibration module + + rectification (boolean) - image rectification module + + stereo (boolean) - stereo matching module + + Template object + + { + "hand_eye_calibration": false, + "rectification": false, + "stereo": false + } + + LicenseComponents objects are nested in + + LicenseInfo + + . + +LicenseConstraints: + Version constrains for modules. + + An object of type LicenseConstraints has the following properties: + + image_version (LicenseComponentConstraint) - see description of + LicenseComponentConstraint + + Template object + + { + "image_version": { + "max_version": "string", + "min_version": "string" + } + } + + LicenseConstraints objects are nested in + + LicenseInfo + + . + +LicenseInfo: + Information about the currently applied software license on the + device. + + An object of type LicenseInfo has the following properties: + + components (LicenseComponents) - see description of + LicenseComponents + + components_constraints (LicenseConstraints) - see description of + LicenseConstraints + + valid (boolean) - indicates whether the license is valid or not + + Template object + + { + "components": { + "hand_eye_calibration": false, + "rectification": false, + "stereo": false + }, + "components_constraints": { + "image_version": { + "max_version": "string", + "min_version": "string" + } + }, + "valid": false + } + + LicenseInfo objects are used in the following requests: + + GET /system/license + +Log: + Content of a specific log file represented in JSON format. + + An object of type Log has the following properties: + + date (float) - UNIX time when log was last modified + + log (array of LogEntry) - the actual log entries + + name (string) - name of log file + + size (integer) - size of log file in bytes + + Template object + + { + "date": 0, + "log": [ + { + "component": "string", + "level": "string", + "message": "string", + "timestamp": 0 + }, + { + "component": "string", + "level": "string", + "message": "string", + "timestamp": 0 + } + ], + "name": "string", + "size": 0 + } + + Log objects are used in the following requests: + + GET /logs/{log} + +LogEntry: + Representation of a single log entry in a log file. + + An object of type LogEntry has the following properties: + + component (string) - module name that created this entry + + level (string) - log level (one of DEBUG, INFO, WARN, ERROR, FATAL) + + message (string) - actual log message + + timestamp (float) - Unix time of log entry + + Template object + + { + "component": "string", + "level": "string", + "message": "string", + "timestamp": 0 + } + + LogEntry objects are nested in + + Log + + . + +LogInfo: + Information about a specific log file. + + An object of type LogInfo has the following properties: + + date (float) - UNIX time when log was last modified + + name (string) - name of log file + + size (integer) - size of log file in bytes + + Template object + + { + "date": 0, + "name": "string", + "size": 0 + } + + LogInfo objects are used in the following requests: + + GET /logs + +ManualDNSServers: + List of manual DNS servers. + + An object of type ManualDNSServers has the following properties: + + manual_dns_servers (array of string) + + Template object + + { + "manual_dns_servers": [ + "string", + "string" + ] + } + + ManualDNSServers objects are used in the following requests: + + PUT /system/dns + +NetworkInfo: + Current network configuration. + + An object of type NetworkInfo has the following properties: + + current_method (string) - method by which current settings were + applied (one of INIT, LinkLocal, DHCP, PersistentIP, TemporaryIP) + + default_gateway (string) - current default gateway + + ip_address (string) - current IP address + + settings (NetworkSettings) - see description of NetworkSettings + + subnet_mask (string) - current subnet mask + + Template object + + { + "current_method": "string", + "default_gateway": "string", + "ip_address": "string", + "settings": { + "dhcp_enabled": false, + "persistent_default_gateway": "string", + "persistent_ip_address": "string", + "persistent_ip_enabled": false, + "persistent_subnet_mask": "string" + }, + "subnet_mask": "string" + } + + NetworkInfo objects are nested in + + SysInfo + + , and are used in the following requests: + + GET /system/network + +NetworkSettings: + Current network settings. + + An object of type NetworkSettings has the following properties: + + dhcp_enabled (boolean) - DHCP enabled + + persistent_default_gateway (string) - Persistent default gateway + + persistent_ip_address (string) - Persistent IP address + + persistent_ip_enabled (boolean) - Persistent IP enabled + + persistent_subnet_mask (string) - Persistent subnet mask + + Template object + + { + "dhcp_enabled": false, + "persistent_default_gateway": "string", + "persistent_ip_address": "string", + "persistent_ip_enabled": false, + "persistent_subnet_mask": "string" + } + + NetworkSettings objects are nested in + + NetworkInfo + + , and are used in the following requests: + + GET /system/network/settings + + PUT /system/network/settings + +NodeInfo: + Description of a computational node running on device. + + An object of type NodeInfo has the following properties: + + name (string) - name of the node + + parameters (array of string) - list of the node's run-time + parameters + + services (array of string) - list of the services this node offers + + status (string) - status of the node (one of unknown, down, idle, + running) + + Template object + + { + "name": "string", + "parameters": [ + "string", + "string" + ], + "services": [ + "string", + "string" + ], + "status": "string" + } + + NodeInfo objects are used in the following requests: + + GET /nodes + + GET /nodes/{node} + + GET /pipelines/{pipeline}/nodes + + GET /pipelines/{pipeline}/nodes/{node} + +NodeStatus: + Detailed current status of the node including run-time statistics. + + An object of type NodeStatus has the following properties: + + status (string) - status of the node (one of unknown, down, idle, + running) + + timestamp (float) - Unix time when values were last updated + + values (object) - dictionary with current status/statistics of the + node + + Template object + + { + "status": "string", + "timestamp": 0, + "values": {} + } + + NodeStatus objects are used in the following requests: + + GET /nodes/{node}/status + + GET /pipelines/{pipeline}/nodes/{node}/status + +NtpStatus: + Status of the NTP time sync. + + An object of type NtpStatus has the following properties: + + accuracy (string) - time sync accuracy reported by NTP + + synchronized (boolean) - synchronized with NTP server + + Template object + + { + "accuracy": "string", + "synchronized": false + } + + NtpStatus objects are nested in + + SysInfo + + . + +Parameter: + Representation of a node's run-time parameter. The parameter's + 'value' type (and hence the types of the 'min', 'max' and 'default' + fields) can be inferred from the 'type' field and might be one of + the built-in primitive data types. + + An object of type Parameter has the following properties: + + default (type not defined) - the parameter's default value + + description (string) - description of the parameter + + max (type not defined) - maximum value this parameter can be + assigned to + + min (type not defined) - minimum value this parameter can be + assigned to + + name (string) - name of the parameter + + type (string) - the parameter's primitive type represented as + string (one of bool, int8, uint8, int16, uint16, int32, uint32, + int64, uint64, float32, float64, string) + + value (type not defined) - the parameter's current value + + Template object + + { + "default": {}, + "description": "string", + "max": {}, + "min": {}, + "name": "string", + "type": "string", + "value": {} + } + + Parameter objects are used in the following requests: + + GET /pipelines/{pipeline}/nodes/{node}/parameters + + PUT /pipelines/{pipeline}/nodes/{node}/parameters + + GET /pipelines/{pipeline}/nodes/{node}/parameters/{param} + + PUT /pipelines/{pipeline}/nodes/{node}/parameters/{param} + +ParameterNameValue: + Parameter name and value. The parameter's 'value' type (and hence + the types of the 'min', 'max' and 'default' fields) can be inferred + from the 'type' field and might be one of the built-in primitive + data types. + + An object of type ParameterNameValue has the following properties: + + name (string) - name of the parameter + + value (type not defined) - the parameter's current value + + Template object + + { + "name": "string", + "value": {} + } + + ParameterNameValue objects are used in the following requests: + + PUT /pipelines/{pipeline}/nodes/{node}/parameters + +ParameterValue: + Parameter value. The parameter's 'value' type (and hence the types + of the 'min', 'max' and 'default' fields) can be inferred from the + 'type' field and might be one of the built-in primitive data types. + + An object of type ParameterValue has the following properties: + + value (type not defined) - the parameter's current value + + Template object + + { + "value": {} + } + + ParameterValue objects are used in the following requests: + + PUT /pipelines/{pipeline}/nodes/{node}/parameters/{param} + +PtpStatus: + Status of the IEEE1588 (PTP) time sync. + + An object of type PtpStatus has the following properties: + + master_ip (string) - IP of the master clock + + offset (float) - time offset in seconds to the master + + offset_dev (float) - standard deviation of time offset in seconds + to the master + + offset_mean (float) - mean time offset in seconds to the master + + state (string) - state of PTP (one of off, unknown, INITIALIZING, + FAULTY, DISABLED, LISTENING, PASSIVE, UNCALIBRATED, SLAVE) + + Template object + + { + "master_ip": "string", + "offset": 0, + "offset_dev": 0, + "offset_mean": 0, + "state": "string" + } + + PtpStatus objects are nested in + + SysInfo + + . + +Service: + Representation of a service that a node offers. + + An object of type Service has the following properties: + + args (ServiceArgs) - see description of ServiceArgs + + description (string) - short description of this service + + name (string) - name of the service + + response (ServiceResponse) - see description of ServiceResponse + + Template object + + { + "args": {}, + "description": "string", + "name": "string", + "response": {} + } + + Service objects are used in the following requests: + + GET /nodes/{node}/services + + GET /nodes/{node}/services/{service} + + PUT /nodes/{node}/services/{service} + + GET /pipelines/{pipeline}/nodes/{node}/services + + GET /pipelines/{pipeline}/nodes/{node}/services/{service} + + PUT /pipelines/{pipeline}/nodes/{node}/services/{service} + +ServiceArgs: + Arguments required to call a service with. The general + representation of these arguments is a (nested) dictionary. The + specific content of this dictionary depends on the respective node + and service call. + + ServiceArgs objects are nested in + + Service + + . + +ServiceResponse: + The response returned by the service call. The general + representation of this response is a (nested) dictionary. The + specific content of this dictionary depends on the respective node + and service call. + + ServiceResponse objects are nested in + + Service + + . + +SysInfo: + System information about the device. + + An object of type SysInfo has the following properties: + + dns (DNS) - see description of DNS + + firmware (FirmwareInfo) - see description of FirmwareInfo + + hostname (string) - Hostname + + link_speed (integer) - Ethernet link speed in Mbps + + mac (string) - MAC address + + network (NetworkInfo) - see description of NetworkInfo + + ntp_status (NtpStatus) - see description of NtpStatus + + ptp_status (PtpStatus) - see description of PtpStatus + + ready (boolean) - system is fully booted and ready + + serial (string) - device serial number + + time (float) - system time as Unix timestamp + + ui_lock (UILock) - see description of UILock + + uptime (float) - system uptime in seconds + + Template object + + { + "dns": { + "dns_servers": [ + "string", + "string" + ], + "manual_dns_servers": [ + "string", + "string" + ] + }, + "firmware": { + "active_image": { + "image_version": "string" + }, + "fallback_booted": false, + "inactive_image": { + "image_version": "string" + }, + "next_boot_image": "string" + }, + "hostname": "string", + "link_speed": 0, + "mac": "string", + "network": { + "current_method": "string", + "default_gateway": "string", + "ip_address": "string", + "settings": { + "dhcp_enabled": false, + "persistent_default_gateway": "string", + "persistent_ip_address": "string", + "persistent_ip_enabled": false, + "persistent_subnet_mask": "string" + }, + "subnet_mask": "string" + }, + "ntp_status": { + "accuracy": "string", + "synchronized": false + }, + "ptp_status": { + "master_ip": "string", + "offset": 0, + "offset_dev": 0, + "offset_mean": 0, + "state": "string" + }, + "ready": false, + "serial": "string", + "time": 0, + "ui_lock": { + "enabled": false + }, + "uptime": 0 + } + + SysInfo objects are used in the following requests: + + GET /system + +Template: + Detection template + + An object of type Template has the following properties: + + id (string) - Unique identifier of the template + + Template object + + { + "id": "string" + } + + Template objects are used in the following requests: + + GET /templates/rc_boxpick + + GET /templates/rc_boxpick/{id} + + PUT /templates/rc_boxpick/{id} + + GET /templates/rc_silhouettematch + + GET /templates/rc_silhouettematch/{id} + + PUT /templates/rc_silhouettematch/{id} + +UILock: + UI lock status. + + An object of type UILock has the following properties: + + enabled (boolean) + + Template object + + { + "enabled": false + } + + UILock objects are nested in + + SysInfo + + , and are used in the following requests: + + GET /system/ui_lock + +UserSpace: + UserSpace information + + An object of type UserSpace has the following properties: + + apps (array of UserSpaceApp) - UserSpace apps + + available (boolean) - UserSpace available + + enabled (boolean) - UserSpace enabled + + Template object + + { + "apps": [ + { + "containers": [ + { + "description": "string", + "health": "string", + "host_ports": [ + { + "port": 0, + "protocol": "string" + }, + { + "port": 0, + "protocol": "string" + } + ], + "name": "string", + "status": "string", + "title": "string", + "url": "string", + "vendor": "string", + "version": "string" + }, + { + "description": "string", + "health": "string", + "host_ports": [ + { + "port": 0, + "protocol": "string" + }, + { + "port": 0, + "protocol": "string" + } + ], + "name": "string", + "status": "string", + "title": "string", + "url": "string", + "vendor": "string", + "version": "string" + } + ], + "name": "string", + "type": "string" + }, + { + "containers": [ + { + "description": "string", + "health": "string", + "host_ports": [ + { + "port": 0, + "protocol": "string" + }, + { + "port": 0, + "protocol": "string" + } + ], + "name": "string", + "status": "string", + "title": "string", + "url": "string", + "vendor": "string", + "version": "string" + }, + { + "description": "string", + "health": "string", + "host_ports": [ + { + "port": 0, + "protocol": "string" + }, + { + "port": 0, + "protocol": "string" + } + ], + "name": "string", + "status": "string", + "title": "string", + "url": "string", + "vendor": "string", + "version": "string" + } + ], + "name": "string", + "type": "string" + } + ], + "available": false, + "enabled": false + } + + UserSpace objects are used in the following requests: + + GET /userspace + +UserSpaceApp: + UserSpace app + + An object of type UserSpaceApp has the following properties: + + containers (array of UserSpaceContainer) - containers in this app + + name (string) - name of the app + + type (string) - type of the app (one of container, compose) + + Template object + + { + "containers": [ + { + "description": "string", + "health": "string", + "host_ports": [ + { + "port": 0, + "protocol": "string" + }, + { + "port": 0, + "protocol": "string" + } + ], + "name": "string", + "status": "string", + "title": "string", + "url": "string", + "vendor": "string", + "version": "string" + }, + { + "description": "string", + "health": "string", + "host_ports": [ + { + "port": 0, + "protocol": "string" + }, + { + "port": 0, + "protocol": "string" + } + ], + "name": "string", + "status": "string", + "title": "string", + "url": "string", + "vendor": "string", + "version": "string" + } + ], + "name": "string", + "type": "string" + } + + UserSpaceApp objects are nested in + + UserSpace + + . + +UserSpaceContainer: + container + + An object of type UserSpaceContainer has the following properties: + + description (string) - value of label + org.opencontainers.image.description + + health (string) - health of the container (if container has + healthcheck) (one of starting, healthy, unhealthy) + + host_ports (array of HostPort) - Ports exposed on host + + name (string) - name of the container + + status (string) - status of the container (one of restarting, + running, paused, exited) + + title (string) - value of label org.opencontainers.image.title + + url (string) - value of label org.opencontainers.image.url + + vendor (string) - value of label org.opencontainers.image.vendor + + version (string) - value of label org.opencontainers.image.version + + Template object + + { + "description": "string", + "health": "string", + "host_ports": [ + { + "port": 0, + "protocol": "string" + }, + { + "port": 0, + "protocol": "string" + } + ], + "name": "string", + "status": "string", + "title": "string", + "url": "string", + "vendor": "string", + "version": "string" + } + + UserSpaceContainer objects are nested in + + UserSpaceApp + + . diff --git a/v24.04/en/_sources/rest_api_general.rst.txt b/v24.04/en/_sources/rest_api_general.rst.txt new file mode 100644 index 0000000..dc596b1 --- /dev/null +++ b/v24.04/en/_sources/rest_api_general.rst.txt @@ -0,0 +1,175 @@ +General API structure + +The general + +entry point + + to the + +rc_visard NG + +'s API is "http:///api/", where "" is either the device's +IP address or its + +host name + + as known by the respective DHCP server, as explained in + +network configuration + +. Accessing this entry point with a web browser lets the user explore +and test the full API during run-time using the + +Swagger UI + + . + +For actual HTTP requests, the + +current API version is appended + + to the entry point of the API, i.e., "http:///api/v2". All data +sent to and received by the REST-API follows the JavaScript Object +Notation (JSON). The API is designed to let the user + +create, retrieve, modify, and delete + + so-called + +resources + + as listed in + +Available resources and requests + + using the HTTP requests below. + + Request type Description GET Access one or more resources and +return the result as JSON. PUT Modify a resource and return the +modified resource as JSON. DELETE Delete a resource. POST Upload +file (e.g., license or firmware image). + +Depending on the type and the specific request itself, + +arguments + + to HTTP requests can be transmitted as part of the + +path + + ( + +URI + +) to the resource, as + +query + + string, as + +form data + +, or in the + +body + + of the request. The following examples use the command line tool + +curl + +, which is available for various operating systems. See + +https://curl.haxx.se + +. + +Get a node's current status; its name is encoded in the path (URI) +curl -X GET 'http:///api/v2/pipelines/0/nodes/rc_stereomatching' + +Get values of some of a node's parameters using a query string curl +-X GET 'http:///api/v2/pipelines/0/nodes/rc_stereomatching/para +meters?name=minconf&name=maxdepth' + +Set a node's parameter as JSON-encoded text in the body of the request +curl -X PUT --header 'Content-Type: application/json' -d '[{"name": +"mindepth", "value": 0.1}]' +'http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters' + +As for the responses to such requests, some common return codes for +the + +rc_visard NG + +'s API are: + + Status Code Description 200 OK The request was successful; the +resource is returned as JSON. 400 Bad Request A required attribute +or argument of the API request is missing or invalid. 404 Not Found +A resource could not be accessed; e.g., an ID for a resource could not +be found. 403 Forbidden Access is (temporarily) forbidden; e.g., +some parameters are locked while a GigE Vision application is +connected. 429 Too many requests Rate limited due to excessive +request frequency. + +The following listing shows a sample response to a successful request +that accesses information about the "rc_stereomatching" node's +"minconf" parameter: + + HTTP/1.1 200 OK + Content-Type: application/json + Content-Length: 157 + + { + "name": "minconf", + "min": 0, + "default": 0, + "max": 1, + "value": 0, + "type": "float64", + "description": "Minimum confidence" + } + +Note: The actual behavior, allowed requests, and specific return + codes depend heavily on the specific resource, context, and action. + Please refer to the + + rc_visard NG + + 's + + available resources + + and to each + + software module's + + parameters and services. + +Available resources and requests + +The available REST-API resources are structured into the following +parts: + +/nodes Access the rc_visard NG's global Database modules \:(Section +\ref{database_modules:sect-database-modules}) with their run-time +status, parameters, and offered services, for storing data used in +multiple modules, such as load carriers, grippers and regions of +interest. + +/pipelines Access to the status and configuration of the camera +pipelines. There is always only one camera pipeline with number 0. + +/pipelines/0/nodes Access the rc_visard NG's 3D-camera, navigation, +detection and configuration software modules \:(Section \ref{modules +:sect-modules}) with their run-time status, parameters, and offered +services. + +/templates Access the object templates on the rc_visard NG. + +/system Access the system state, set network configuration, and +manage licenses as well as firmware updates. + +/userspace Access the UserSpace on the rc_visard NG. + +/logs Access the log files on the rc_visard NG. + diff --git a/v24.04/en/_sources/rest_api_nodes.rst.txt b/v24.04/en/_sources/rest_api_nodes.rst.txt new file mode 100644 index 0000000..f107df9 --- /dev/null +++ b/v24.04/en/_sources/rest_api_nodes.rst.txt @@ -0,0 +1,1005 @@ +Nodes, parameters, and services + +Nodes represent the + +rc_visard NG + +'s + +software modules + + , each bundling a certain algorithmic functionality. All available +global REST-API database nodes can be listed with their service calls +and parameters using + + curl -X GET http:///api/v2/nodes + +Information about a specific node (e.g., "rc_load_carrier_db") can be +retrieved using + + curl -X GET http:///api/v2/nodes/rc_load_carrier_db + +All available 3D camera, detection and configuration REST-API nodes +can be listed with their service calls and parameters using + + curl -X GET http:///api/v2/pipelines/0/nodes + +Information about a specific node (e.g., "rc_camera") can be retrieved +using + + curl -X GET http:///api/v2/pipelines/0/nodes/rc_camera + +Status: + During run-time, each node offers information about its current + status. This includes not only the current + + processing status + + of the module (e.g., "running" or "stale"), but most nodes also + offer run-time statistics or read-only parameters, so-called + + status values + + . As an example, the "rc_camera" values can be retrieved using + + curl -X GET http:///api/v2/pipelines/0/nodes/rc_camera/status + + Note: The returned + + status values + + are specific to individual nodes and are documented in the + respective + + software module + + . + + Note: The + + status values + + are only reported when the respective node is in the "running" + state. + +Parameters: + Most nodes expose parameters via the + + rc_visard NG + + 's REST-API to allow their run-time behaviors to be changed + according to application context or requirements. The REST-API + permits to read and write a parameter's value, but also provides + further information such as minimum, maximum, and default values. + + As an example, the "rc_stereomatching" parameters can be retrieved + using + + curl -X GET http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters + + Its "quality" parameter could be set to "Full" using + + curl -X PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters?quality=Full + + or equivalently + + curl -X PUT --header 'Content-Type: application/json' -d '{ "value": "Full" }' http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/quality + + Note: Run-time parameters are specific to individual nodes and + are documented in the respective + + software module + + . + + Note: Most of the parameters that nodes offer via the REST-API + can be explored and tested via the + + rc_visard NG + + 's user-friendly + + Web GUI + + . + + Note: Some parameters exposed via the + + rc_visard NG + + 's REST-API are also available from the + + GigE Vision 2.0/GenICam image interface + + . Please note that setting those parameters via the REST-API or + Web GUI is prohibited if a GenICam client is connected. + + In addition, each node that offers run-time parameters also + features a service to restore the default values for all of its + parameters. + +Services: + Some nodes also offer services that can be called via REST-API, + e.g., to restore parameters as discussed above, or to start and + stop nodes. As an example, the + + services of the hand-eye calibration module + + could be listed using + + curl -X GET http:///api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services + + A node's service is called by issuing a "PUT" request for the + respective resource and providing the service-specific arguments + (see the ""args"" field of the + + Service data model + + ). As an example, the stereo matching module can be triggered to do + an acquisition by: + + curl -X PUT --header 'Content-Type: application/json' -d '{ "args": {} }' http:///api/v2/pipelines/0/nodes/rc_stereomatching/services/acquisition_trigger + + Note: The services and corresponding argument data models are + specific to individual nodes and are documented in the respective + + software module + + . + +The following list includes all REST-API requests regarding the global +database nodes' status, parameters, and services calls: + +GET /nodes + + Get list of all available global nodes. + + Template request + + GET /api/v2/nodes HTTP/1.1 + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + [ + { + "name": "rc_roi_db", + "parameters": [], + "services": [ + "set_region_of_interest", + "get_regions_of_interest", + "delete_regions_of_interest", + "set_region_of_interest_2d", + "get_regions_of_interest_2d", + "delete_regions_of_interest_2d" + ], + "status": "running" + }, + { + "name": "rc_load_carrier_db", + "parameters": [], + "services": [ + "set_load_carrier", + "get_load_carriers", + "delete_load_carriers" + ], + "status": "running" + }, + { + "name": "rc_gripper_db", + "parameters": [], + "services": [ + "set_gripper", + "get_grippers", + "delete_grippers" + ], + "status": "running" + } + ] + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns array of NodeInfo) + + Referenced Data Models: + NodeInfo\:(Section \ref{rest_api_datamodel:sect-rest-datamodel- + nodeinfo}) + +GET /nodes/{node} + + Get info on a single global node. + + Template request + + GET /api/v2/nodes/ HTTP/1.1 + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "name": "rc_roi_db", + "parameters": [], + "services": [ + "set_region_of_interest", + "get_regions_of_interest", + "delete_regions_of_interest", + "set_region_of_interest_2d", + "get_regions_of_interest_2d", + "delete_regions_of_interest_2d" + ], + "status": "running" + } + + Parameters: + node (string) -- name of the node (required) + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns NodeInfo) + + 404 Not Found -- node not found + + Referenced Data Models: + NodeInfo\:(Section \ref{rest_api_datamodel:sect-rest-datamodel- + nodeinfo}) + +GET /nodes/{node}/services + + Get descriptions of all services a global node offers. + + Template request + + GET /api/v2/nodes//services HTTP/1.1 + + Template response + + HTTP/1.1 200 OK + Content-Type: application/json + + [ + { + "args": {}, + "description": "string", + "name": "string", + "response": {} + } + ] + + Parameters: + node (string) -- name of the node (required) + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns array of Service) + + 404 Not Found -- node not found + + Referenced Data Models: + Service\:(Section \ref{rest_api_datamodel:sect-rest-datamodel- + service}) + +GET /nodes/{node}/services/{service} + + Get description of a global node's specific service. + + Template request + + GET /api/v2/nodes//services/ HTTP/1.1 + + Template response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "args": {}, + "description": "string", + "name": "string", + "response": {} + } + + Parameters: + node (string) -- name of the node (required) + + service (string) -- name of the service (required) + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns Service) + + 404 Not Found -- node or service not found + + Referenced Data Models: + Service\:(Section \ref{rest_api_datamodel:sect-rest-datamodel- + service}) + +PUT /nodes/{node}/services/{service} + + Call a service of a node. The required args and resulting response + depend on the specific node and service. + + Template request + + PUT /api/v2/nodes//services/ HTTP/1.1 + Accept: application/json application/ubjson + + {} + + Template response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "args": {}, + "description": "string", + "name": "string", + "response": {} + } + + Parameters: + node (string) -- name of the node (required) + + service (string) -- name of the service (required) + + Request JSON Object: + service args (object) -- example args (required) + + Request Headers: + Accept -- application/json application/ubjson + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- Service call completed (returns Service) + + 403 Forbidden -- Service call forbidden, e.g. because there is + no valid license for this module. + + 404 Not Found -- node or service not found + + Referenced Data Models: + Service\:(Section \ref{rest_api_datamodel:sect-rest-datamodel- + service}) + +GET /nodes/{node}/status + + Get status of a global node. + + Template request + + GET /api/v2/nodes//status HTTP/1.1 + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "status": "running", + "timestamp": 1503075030.2335997, + "values": [] + } + + Parameters: + node (string) -- name of the node (required) + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns NodeStatus) + + 404 Not Found -- node not found + + Referenced Data Models: + NodeStatus\:(Section \ref{rest_api_datamodel:sect-rest- + datamodel-nodestatus}) + +The following list includes all REST-API requests regarding the 3D +camera, detection and configuration nodes' status, parameters, and +services calls: + +GET /pipelines/{pipeline}/nodes + + Get list of all available nodes. + + Template request + + GET /api/v2/pipelines//nodes HTTP/1.1 + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + [ + { + "name": "rc_camera", + "parameters": [ + "fps", + "exp_auto", + "exp_value", + "exp_max" + ], + "services": [ + "reset_defaults" + ], + "status": "running" + }, + { + "name": "rc_hand_eye_calibration", + "parameters": [ + "grid_width", + "grid_height", + "robot_mounted" + ], + "services": [ + "reset_defaults", + "set_pose", + "reset", + "save", + "calibrate", + "get_calibration" + ], + "status": "idle" + }, + { + "name": "rc_stereomatching", + "parameters": [ + "quality", + "seg", + "fill", + "minconf", + "mindepth", + "maxdepth", + "maxdeptherr" + ], + "services": [ + "reset_defaults" + ], + "status": "running" + } + ] + + Parameters: + pipeline (string) -- name of the pipeline (one of 0) (required) + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns array of NodeInfo) + + Referenced Data Models: + NodeInfo\:(Section \ref{rest_api_datamodel:sect-rest-datamodel- + nodeinfo}) + +GET /pipelines/{pipeline}/nodes/{node} + + Get info on a single node. + + Template request + + GET /api/v2/pipelines//nodes/ HTTP/1.1 + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "name": "rc_camera", + "parameters": [ + "fps", + "exp_auto", + "exp_value", + "exp_max" + ], + "services": [ + "reset_defaults" + ], + "status": "running" + } + + Parameters: + pipeline (string) -- name of the pipeline (one of 0) (required) + + node (string) -- name of the node (required) + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns NodeInfo) + + 404 Not Found -- node not found + + Referenced Data Models: + NodeInfo\:(Section \ref{rest_api_datamodel:sect-rest-datamodel- + nodeinfo}) + +GET /pipelines/{pipeline}/nodes/{node}/parameters + + Get parameters of a node. + + Template request + + GET /api/v2/pipelines//nodes//parameters?name= HTTP/1.1 + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + [ + { + "default": 25, + "description": "Frames per second in Hz", + "max": 25, + "min": 1, + "name": "fps", + "type": "float64", + "value": 25 + }, + { + "default": true, + "description": "Switching between auto and manual exposure", + "max": true, + "min": false, + "name": "exp_auto", + "type": "bool", + "value": true + }, + { + "default": 0.007, + "description": "Maximum exposure time in s if exp_auto is true", + "max": 0.018, + "min": 6.6e-05, + "name": "exp_max", + "type": "float64", + "value": 0.007 + } + ] + + Parameters: + pipeline (string) -- name of the pipeline (one of 0) (required) + + node (string) -- name of the node (required) + + Query Parameters: + name (string) -- limit result to parameters with name (optional) + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns array of Parameter) + + 404 Not Found -- node not found + + Referenced Data Models: + Parameter\:(Section \ref{rest_api_datamodel:sect-rest-datamodel- + parameter}) + +PUT /pipelines/{pipeline}/nodes/{node}/parameters + + Update multiple parameters. + + Template request + + PUT /api/v2/pipelines//nodes//parameters HTTP/1.1 + Accept: application/json application/ubjson + + [ + { + "name": "string", + "value": {} + } + ] + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + [ + { + "default": 25, + "description": "Frames per second in Hz", + "max": 25, + "min": 1, + "name": "fps", + "type": "float64", + "value": 10 + }, + { + "default": true, + "description": "Switching between auto and manual exposure", + "max": true, + "min": false, + "name": "exp_auto", + "type": "bool", + "value": false + }, + { + "default": 0.005, + "description": "Manual exposure time in s if exp_auto is false", + "max": 0.018, + "min": 6.6e-05, + "name": "exp_value", + "type": "float64", + "value": 0.005 + } + ] + + Parameters: + pipeline (string) -- name of the pipeline (one of 0) (required) + + node (string) -- name of the node (required) + + Request JSON Array of Objects: + parameters (ParameterNameValue) -- array of parameters + (required) + + Request Headers: + Accept -- application/json application/ubjson + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns array of Parameter) + + 400 Bad Request -- invalid parameter value + + 403 Forbidden -- Parameter update forbidden, e.g. because they + are locked by a running GigE Vision application or there is no + valid license for this module. + + 404 Not Found -- node not found + + Referenced Data Models: + ParameterNameValue\:(Section \ref{rest_api_datamodel:sect-rest- + datamodel-parameternamevalue}) + + Parameter\:(Section \ref{rest_api_datamodel:sect-rest-datamodel- + parameter}) + +GET /pipelines/{pipeline}/nodes/{node}/parameters/{param} + + Get a specific parameter of a node. + + Template request + + GET /api/v2/pipelines//nodes//parameters/ HTTP/1.1 + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "default": 25, + "description": "Frames per second in Hertz", + "max": 25, + "min": 1, + "name": "fps", + "type": "float64", + "value": 10 + } + + Parameters: + pipeline (string) -- name of the pipeline (one of 0) (required) + + node (string) -- name of the node (required) + + param (string) -- name of the parameter (required) + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns Parameter) + + 404 Not Found -- node or parameter not found + + Referenced Data Models: + Parameter\:(Section \ref{rest_api_datamodel:sect-rest-datamodel- + parameter}) + +PUT /pipelines/{pipeline}/nodes/{node}/parameters/{param} + + Update a specific parameter of a node. + + Template request + + PUT /api/v2/pipelines//nodes//parameters/ HTTP/1.1 + Accept: application/json application/ubjson + + { + "value": {} + } + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "default": 25, + "description": "Frames per second in Hertz", + "max": 25, + "min": 1, + "name": "fps", + "type": "float64", + "value": 10 + } + + Parameters: + pipeline (string) -- name of the pipeline (one of 0) (required) + + node (string) -- name of the node (required) + + param (string) -- name of the parameter (required) + + Request JSON Object: + parameter (ParameterValue) -- parameter to be updated as JSON + object (required) + + Request Headers: + Accept -- application/json application/ubjson + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns Parameter) + + 400 Bad Request -- invalid parameter value + + 403 Forbidden -- Parameter update forbidden, e.g. because they + are locked by a running GigE Vision application or there is no + valid license for this module. + + 404 Not Found -- node or parameter not found + + Referenced Data Models: + ParameterValue\:(Section \ref{rest_api_datamodel:sect-rest- + datamodel-parametervalue}) + + Parameter\:(Section \ref{rest_api_datamodel:sect-rest-datamodel- + parameter}) + +GET /pipelines/{pipeline}/nodes/{node}/services + + Get descriptions of all services a node offers. + + Template request + + GET /api/v2/pipelines//nodes//services HTTP/1.1 + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + [ + { + "args": {}, + "description": "Restarts the module.", + "name": "restart", + "response": { + "accepted": "bool", + "current_state": "string" + } + }, + { + "args": {}, + "description": "Starts the module.", + "name": "start", + "response": { + "accepted": "bool", + "current_state": "string" + } + }, + { + "args": {}, + "description": "Stops the module.", + "name": "stop", + "response": { + "accepted": "bool", + "current_state": "string" + } + } + ] + + Parameters: + pipeline (string) -- name of the pipeline (one of 0) (required) + + node (string) -- name of the node (required) + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns array of Service) + + 404 Not Found -- node not found + + Referenced Data Models: + Service\:(Section \ref{rest_api_datamodel:sect-rest-datamodel- + service}) + +GET /pipelines/{pipeline}/nodes/{node}/services/{service} + + Get description of a node's specific service. + + Template request + + GET /api/v2/pipelines//nodes//services/ HTTP/1.1 + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "args": { + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "slot": "int32" + }, + "description": "Save a pose (grid or gripper) for later calibration.", + "name": "set_pose", + "response": { + "message": "string", + "status": "int32", + "success": "bool" + } + } + + Parameters: + pipeline (string) -- name of the pipeline (one of 0) (required) + + node (string) -- name of the node (required) + + service (string) -- name of the service (required) + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns Service) + + 404 Not Found -- node or service not found + + Referenced Data Models: + Service\:(Section \ref{rest_api_datamodel:sect-rest-datamodel- + service}) + +PUT /pipelines/{pipeline}/nodes/{node}/services/{service} + + Call a service of a node. The required args and resulting response + depend on the specific node and service. + + Template request + + PUT /api/v2/pipelines//nodes//services/ HTTP/1.1 + Accept: application/json application/ubjson + + {} + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "name": "set_pose", + "response": { + "message": "Grid detected, pose stored.", + "status": 1, + "success": true + } + } + + Parameters: + pipeline (string) -- name of the pipeline (one of 0) (required) + + node (string) -- name of the node (required) + + service (string) -- name of the service (required) + + Request JSON Object: + service args (object) -- example args (required) + + Request Headers: + Accept -- application/json application/ubjson + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- Service call completed (returns Service) + + 403 Forbidden -- Service call forbidden, e.g. because there is + no valid license for this module. + + 404 Not Found -- node or service not found + + Referenced Data Models: + Service\:(Section \ref{rest_api_datamodel:sect-rest-datamodel- + service}) + +GET /pipelines/{pipeline}/nodes/{node}/status + + Get status of a node. + + Template request + + GET /api/v2/pipelines//nodes//status HTTP/1.1 + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "status": "running", + "timestamp": 1503075030.2335997, + "values": { + "baseline": "0.0650542", + "color": "0", + "exp": "0.00426667", + "focal": "0.844893", + "fps": "25.1352", + "gain": "12.0412", + "height": "960", + "temp_left": "39.6", + "temp_right": "38.2", + "time": "0.00406513", + "width": "1280" + } + } + + Parameters: + pipeline (string) -- name of the pipeline (one of 0) (required) + + node (string) -- name of the node (required) + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns NodeStatus) + + 404 Not Found -- node not found + + Referenced Data Models: + NodeStatus\:(Section \ref{rest_api_datamodel:sect-rest- + datamodel-nodestatus}) diff --git a/v24.04/en/_sources/rest_api_pipelines.rst.txt b/v24.04/en/_sources/rest_api_pipelines.rst.txt new file mode 100644 index 0000000..a2b39c8 --- /dev/null +++ b/v24.04/en/_sources/rest_api_pipelines.rst.txt @@ -0,0 +1,10 @@ +Pipelines + +Pipelines represent the + +rc_visard NG + +'s camera pipelines. + +The following list includes all REST-API requests regarding the camera +pipelines' configuration: diff --git a/v24.04/en/_sources/rest_api_swagger_ui.rst.txt b/v24.04/en/_sources/rest_api_swagger_ui.rst.txt new file mode 100644 index 0000000..a7ea990 --- /dev/null +++ b/v24.04/en/_sources/rest_api_swagger_ui.rst.txt @@ -0,0 +1,63 @@ +Swagger UI + +The + +rc_visard NG + +'s + +Swagger UI + + allows developers to easily visualize and interact with the REST-API, +e.g., for development and testing. Accessing "http:///api/" or +"http:///api/swagger" (the former will automatically be +redirected to the latter) opens a visualization of the + +rc_visard NG + +'s general API structure including all + +available resources and requests + + and offers a simple user interface for exploring all of its +features. + +Note: Users must be aware that, although the + + rc_visard NG + + 's Swagger UI is designed to explore and test the REST-API, it is a + fully functional interface. That is, any issued requests are + actually processed and particularly "PUT", "POST", and "DELETE" + requests might change the overall status and/or behavior of the + device. + + +Using this interface, available resources and requests can be explored +by clicking on them to uncollapse or recollapse them. The following +figure shows an example of how to get a node's current status by +filling in the necessary parameters ("pipeline" number and "node" +name) and clicking + +Execute + +. This action results in the Swagger UI showing, amongst others, the +actual "curl" command that was executed when issuing the request as +well as the response body showing the current status of the requested +node in a JSON-formatted string. + + +Some actions, such as setting parameters or calling services, require +more complex parameters to an HTTP request. The Swagger UI allows +developers to explore the attributes required for these actions during +run-time, as shown in the next example. In the figure below, the +attributes required for the the "rc_hand_eye_calibration" node's +"set_pose" service are explored by performing a "GET" request on this +resource. The response features a full description of the service +offered, including all required arguments with their names and types +as a JSON-formatted string. + + +Users can easily use this preformatted JSON string as a template for +the service arguments to actually call the service: + diff --git a/v24.04/en/_sources/rest_api_syslogs.rst.txt b/v24.04/en/_sources/rest_api_syslogs.rst.txt new file mode 100644 index 0000000..dd1e0f2 --- /dev/null +++ b/v24.04/en/_sources/rest_api_syslogs.rst.txt @@ -0,0 +1,754 @@ +System and logs + +The following resources and requests expose the + +rc_visard NG + +'s system-level API. They enable + + access to log files (system-wide or module-specific) + + access to information about the device and run-time statistics such + as date, MAC address, clock-time synchronization status, and + available resources; + + management of installed software licenses; and + + the rc_visard NG to be updated with a new firmware image. + +GET /logs + + Get list of available log files. + + Template request + + GET /api/v2/logs HTTP/1.1 + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + [ + { + "date": 1503060035.0625782, + "name": "rcsense-api.log", + "size": 730 + }, + { + "date": 1503060035.741574, + "name": "stereo.log", + "size": 39024 + }, + { + "date": 1503060044.0475223, + "name": "camera.log", + "size": 1091 + } + ] + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns array of LogInfo) + + Referenced Data Models: + LogInfo\:(Section \ref{rest_api_datamodel:sect-rest-datamodel- + loginfo}) + +GET /logs/{log} + + Get a log file. Content type of response depends on parameter + 'format'. + + Template request + + GET /api/v2/logs/?format=&limit= HTTP/1.1 + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "date": 1581609251.8168414, + "log": [ + { + "component": "rc_gev_server", + "level": "INFO", + "message": "Application from IP 10.0.1.7 registered with control access.", + "timestamp": 1581609249.61 + }, + { + "component": "rc_gev_server", + "level": "INFO", + "message": "Application from IP 10.0.1.7 deregistered.", + "timestamp": 1581609249.739 + }, + { + "component": "rc_gev_server", + "level": "INFO", + "message": "Application from IP 10.0.1.7 registered with control access.", + "timestamp": 1581609250.94 + }, + { + "component": "rc_gev_server", + "level": "INFO", + "message": "Application from IP 10.0.1.7 deregistered.", + "timestamp": 1581609251.819 + } + ], + "name": "gev.log", + "size": 42112 + } + + Parameters: + log (string) -- name of the log file (required) + + Query Parameters: + format (string) -- return log as JSON or raw (one of json, raw; + default: json) (optional) + + limit (integer) -- limit to last x lines in JSON format + (default: 100) (optional) + + Response Headers: + Content-Type -- text/plain application/json + + Status Codes: + 200 OK -- successful operation (returns Log) + + 404 Not Found -- log not found + + Referenced Data Models: + Log\:(Section \ref{rest_api_datamodel:sect-rest-datamodel-log}) + +GET /system + + Get system information on sensor. + + Template request + + GET /api/v2/system HTTP/1.1 + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "dns": { + "dns_servers": [ + "10.0.0.1", + "1.1.1.1" + ], + "manual_dns_servers": [ + "1.1.1.1" + ] + }, + "firmware": { + "active_image": { + "image_version": "rc_visard_v1.1.0" + }, + "fallback_booted": true, + "inactive_image": { + "image_version": "rc_visard_v1.0.0" + }, + "next_boot_image": "active_image" + }, + "hostname": "rc-visard-ng-1421823000987", + "link_speed": 1000, + "mac": "00:14:2D:2B:D8:AB", + "ntp_status": { + "accuracy": "48 ms", + "synchronized": true + }, + "ptp_status": { + "master_ip": "", + "offset": 0, + "offset_dev": 0, + "offset_mean": 0, + "state": "off" + }, + "ready": true, + "serial": "1421823000987", + "time": 1504080462.641875, + "uptime": 65457.42 + } + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns SysInfo) + + Referenced Data Models: + SysInfo\:(Section \ref{rest_api_datamodel:sect-rest-datamodel- + sysinfo}) + +GET /system/backup + + Get backup. + + Template request + + GET /api/v2/system/backup?pipelines=&load_carriers=®ions_of_interest=&grippers= HTTP/1.1 + + Query Parameters: + pipelines (boolean) -- backup pipelines with node settings, i.e. + parameters and preferred_orientation (default: True) (optional) + + load_carriers (boolean) -- backup load_carriers (default: True) + (optional) + + regions_of_interest (boolean) -- backup regions_of_interest + (default: True) (optional) + + grippers (boolean) -- backup grippers (default: True) (optional) + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation + +POST /system/backup + + Restore backup. + + Template request + + POST /api/v2/system/backup HTTP/1.1 + Accept: application/json application/ubjson + + {} + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "return_code": { + "message": "backup restored", + "value": 0 + }, + "warnings": [] + } + + Request JSON Object: + backup (object) -- backup data as json object (required) + + Request Headers: + Accept -- application/json application/ubjson + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation + +GET /system/dns + + Get DNS settings. + + Template request + + GET /api/v2/system/dns HTTP/1.1 + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "dns": { + "dns_servers": [ + "10.0.0.1", + "1.1.1.1" + ], + "manual_dns_servers": [ + "1.1.1.1" + ] + } + } + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns DNS) + + Referenced Data Models: + DNS\:(Section \ref{rest_api_datamodel:sect-rest-datamodel-dns}) + +PUT /system/dns + + Set manual DNS servers. + + Template request + + PUT /api/v2/system/dns HTTP/1.1 + Accept: application/json application/ubjson + + {} + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "dns": { + "dns_servers": [ + "10.0.0.1", + "1.1.1.1" + ], + "manual_dns_servers": [ + "1.1.1.1" + ] + } + } + + Request JSON Object: + manual_dns_servers (ManualDNSServers) -- Manual DNS servers + (required) + + Request Headers: + Accept -- application/json application/ubjson + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns DNS) + + 400 Bad Request -- invalid/missing arguments + + Referenced Data Models: + ManualDNSServers\:(Section \ref{rest_api_datamodel:sect-rest- + datamodel-manualdnsservers}) + + DNS\:(Section \ref{rest_api_datamodel:sect-rest-datamodel-dns}) + +GET /system/license + + Get information about licenses installed on sensor. + + Template request + + GET /api/v2/system/license HTTP/1.1 + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "components": { + "calibration": true, + "hand_eye_calibration": true, + "rectification": true, + "self_calibration": true, + "stereo": true + }, + "valid": true + } + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns LicenseInfo) + + Referenced Data Models: + LicenseInfo\:(Section \ref{rest_api_datamodel:sect-rest- + datamodel-licenseinfo}) + +POST /system/license + + Update license on sensor with a license file. + + Template request + + POST /api/v2/system/license HTTP/1.1 + Accept: multipart/form-data + + Form Parameters: + file -- license file (required) + + Request Headers: + Accept -- multipart/form-data + + Status Codes: + 200 OK -- successful operation + + 400 Bad Request -- not a valid license + +GET /system/network + + Get current network configuration. + + Template request + + GET /api/v2/system/network HTTP/1.1 + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "current_method": "DHCP", + "default_gateway": "10.0.3.254", + "ip_address": "10.0.1.41", + "settings": { + "dhcp_enabled": true, + "persistent_default_gateway": "", + "persistent_ip_address": "192.168.0.10", + "persistent_ip_enabled": false, + "persistent_subnet_mask": "255.255.255.0" + }, + "subnet_mask": "255.255.252.0" + } + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns NetworkInfo) + + Referenced Data Models: + NetworkInfo\:(Section \ref{rest_api_datamodel:sect-rest- + datamodel-networkinfo}) + +GET /system/network/settings + + Get current network settings. + + Template request + + GET /api/v2/system/network/settings HTTP/1.1 + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "dhcp_enabled": true, + "persistent_default_gateway": "", + "persistent_ip_address": "192.168.0.10", + "persistent_ip_enabled": false, + "persistent_subnet_mask": "255.255.255.0" + } + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns NetworkSettings) + + Referenced Data Models: + NetworkSettings\:(Section \ref{rest_api_datamodel:sect-rest- + datamodel-networksettings}) + +PUT /system/network/settings + + Set current network settings. + + Template request + + PUT /api/v2/system/network/settings HTTP/1.1 + Accept: application/json application/ubjson + + {} + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "dhcp_enabled": true, + "persistent_default_gateway": "", + "persistent_ip_address": "192.168.0.10", + "persistent_ip_enabled": false, + "persistent_subnet_mask": "255.255.255.0" + } + + Request JSON Object: + settings (NetworkSettings) -- network settings to apply + (required) + + Request Headers: + Accept -- application/json application/ubjson + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns NetworkSettings) + + 400 Bad Request -- invalid/missing arguments + + 403 Forbidden -- Changing network settings forbidden because + this is locked by a running GigE Vision application. + + Referenced Data Models: + NetworkSettings\:(Section \ref{rest_api_datamodel:sect-rest- + datamodel-networksettings}) + +PUT /system/reboot + + Reboot the device. + + Template request + + PUT /api/v2/system/reboot HTTP/1.1 + + Status Codes: + 200 OK -- successful operation + +GET /system/rollback + + Get information about currently active and inactive firmware/system + images on device. + + Template request + + GET /api/v2/system/rollback HTTP/1.1 + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "active_image": { + "image_version": "rc_visard_ng_v22.10.0" + }, + "fallback_booted": false, + "inactive_image": { + "image_version": "rc_visard_ng_v22.10.0" + }, + "next_boot_image": "active_image" + } + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns FirmwareInfo) + + Referenced Data Models: + FirmwareInfo\:(Section \ref{rest_api_datamodel:sect-rest- + datamodel-firmwareinfo}) + +PUT /system/rollback + + Rollback to previous firmware version (inactive system image). + + Template request + + PUT /api/v2/system/rollback HTTP/1.1 + + Status Codes: + 200 OK -- successful operation + + 400 Bad Request -- already set to use inactive partition on next + boot + + 500 Internal Server Error -- internal error + +GET /system/time + + Get system time in UTC as string with format "YYYY-MM-DD hh:mm:ss" + + Template request + + GET /api/v2/system/time HTTP/1.1 + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "utc": "2023-10-05 08:35:26" + } + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation + +PUT /system/time + + Set system time in UTC as string with format "YYYY-MM-DD hh:mm:ss" + + Template request + + PUT /api/v2/system/time?utc= HTTP/1.1 + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "utc": "2023-10-05 08:35:26" + } + + Query Parameters: + utc (string) -- Time in UTC as string with format "YYYY-MM-DD + hh:mm:ss" (required) + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation + + 400 Bad Request -- invalid/missing arguments + + 403 Forbidden -- Changing time forbidden because time is + synchronized via NTP or PTP. + +GET /system/ui_lock + + Get UI lock status. + + Template request + + GET /api/v2/system/ui_lock HTTP/1.1 + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "enabled": false + } + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns UILock) + + Referenced Data Models: + UILock\:(Section \ref{rest_api_datamodel:sect-rest-datamodel- + uilock}) + +DELETE /system/ui_lock + + Remove UI lock. + + Template request + + DELETE /api/v2/system/ui_lock HTTP/1.1 + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "enabled": false, + "valid": false + } + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation + +POST /system/ui_lock + + Verify or set UI lock. + + Template request + + POST /api/v2/system/ui_lock?hash=&set= HTTP/1.1 + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "enabled": true, + "valid": true + } + + Query Parameters: + hash (string) -- hash of the UI lock password (required) + + set (boolean) -- set new hash instead of veryfing (optional) + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation + +GET /system/update + + Get information about currently active and inactive firmware/system + images on device. + + Template request + + GET /api/v2/system/update HTTP/1.1 + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "active_image": { + "image_version": "rc_visard_ng_v22.10.0" + }, + "fallback_booted": false, + "inactive_image": { + "image_version": "rc_visard_ng_v22.10.0" + }, + "next_boot_image": "active_image" + } + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns FirmwareInfo) + + Referenced Data Models: + FirmwareInfo\:(Section \ref{rest_api_datamodel:sect-rest- + datamodel-firmwareinfo}) + +POST /system/update + + Update firmware/system image with a mender artifact. Reboot is + required afterwards in order to activate updated firmware version. + + Template request + + POST /api/v2/system/update HTTP/1.1 + Accept: multipart/form-data + + Form Parameters: + file -- mender artifact file (required) + + Request Headers: + Accept -- multipart/form-data + + Status Codes: + 200 OK -- successful operation + + 400 Bad Request -- client error, e.g. no valid mender artifact diff --git a/v24.04/en/_sources/rest_api_userspace.rst.txt b/v24.04/en/_sources/rest_api_userspace.rst.txt new file mode 100644 index 0000000..e93dd97 --- /dev/null +++ b/v24.04/en/_sources/rest_api_userspace.rst.txt @@ -0,0 +1,78 @@ +UserSpace + +UserSpace information including running apps and their published ports +can be queried via the userspace endpoint. An app can be of "type" +"container" or "compose" (compose stack with potentially multiple +containers). + +GET /userspace + + Get UserSpace information. + + Template request + + GET /api/v2/userspace HTTP/1.1 + + Sample response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "apps": [ + { + "containers": [ + { + "host_ports": [ + { + "port": 8888, + "protocol": "http" + } + ], + "name": "hello_rc_visard_ng", + "status": "running" + } + ], + "name": "hello_rc_visard_ng", + "type": "container" + }, + { + "containers": [ + { + "host_ports": [ + { + "port": 8080, + "protocol": "http" + } + ], + "name": "grafana", + "status": "running" + }, + { + "host_ports": [ + { + "port": 9090, + "protocol": "http" + } + ], + "name": "prometheus", + "status": "running" + } + ], + "name": "rc_visard_monitoring", + "type": "compose" + } + ], + "available": true, + "enabled": true + } + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns UserSpace) + + Referenced Data Models: + UserSpace\:(Section \ref{rest_api_datamodel:sect-rest-datamodel- + userspace}) diff --git a/v24.04/en/_sources/revisions.rst.txt b/v24.04/en/_sources/revisions.rst.txt new file mode 100644 index 0000000..e36ae73 --- /dev/null +++ b/v24.04/en/_sources/revisions.rst.txt @@ -0,0 +1,83 @@ +-[ Revisions ]- + +This product may be modified without notice, when necessary, due to +product improvements, modifications, or changes in specifications. If +such modification is made, the manual will also be revised; see +revision information. + + +DOCUMENTATION REVISION + + 24.04.1 Apr 24, 2024 + +Applicable to + +rc_visard NG + + firmware 24.04.x + + + MANUFACTURER + + + Roboception GmbH + + + Kaflerstrasse 2 + 81241 Munich + Germany + + CUSTOMER SUPPORT + + : + support@roboception.de + + | +49 89 889 50 79-0 (09:00-17:00 CET) + + +Please read the operating manual in full and keep it with the product. + + +COPYRIGHT + + +This manual and the product it describes are protected by copyright. +Unless permitted by German intellectual property and related rights +legislation, any use and circulation of this content requires the +prior consent of Roboception or the individual owner of the rights. +This manual and the product it describes therefore, may not be +reproduced in whole or in part, whether for sale or not, without prior +written consent from Roboception. + +Information provided in this document is believed to be accurate and +reliable. However, Roboception assumes no responsibility for its use. + +Differences may exist between the manual and the product if the +product has been modified after the manual's edition date. The +information contained in this document is subject to change without +notice. + +Introduction + +-[ Indications in the manual ]- + +To prevent damage to the equipment and ensure the user's safety, this +manual indicates each precaution related to safety with + +Warning + +. Supplementary information is provided as a + +Note + +. + +Warning: Warnings in this manual indicate procedures and actions + that must be observed to avoid danger of injury to the + operator/user, or damage to the equipment. Software-related warnings + indicate procedures that must be observed to avoid malfunctions or + unexpected behavior of the software. + +Note: Notes are used in this manual to indicate supplementary + relevant information. + diff --git a/v24.04/en/_sources/roi.rst.txt b/v24.04/en/_sources/roi.rst.txt new file mode 100644 index 0000000..97eb09e --- /dev/null +++ b/v24.04/en/_sources/roi.rst.txt @@ -0,0 +1,526 @@ +RoiDB + +Introduction + +The RoiDB module (region of interest database module) allows the +global definition of 2D and 3D regions of interest, which can then be +used in many detection modules. The ROIs are available for all modules +supporting 2D or 3D ROIs on the + +rc_visard NG + +. + +The RoiDB module is a base module which is available on every + +rc_visard NG + +. + +3D ROIs can be used in + +ItemPick and BoxPick + +. 2D ROIs can be used in + +SilhouetteMatch + +, and + +LoadCarrier + +. + +Specifications of the RoiDB module Supported ROI types 2D, 3D +Supported ROI geometries 2D ROI: rectangle, 3D ROI: box, sphere Max. +number of ROIs 2D: 100, 3D: 100 ROIs available in 2D: +SilhouetteMatch\:(Section \ref{silhouettematch:sect-silhouettematch}), +LoadCarrier\:(Section \ref{loadcarrier:sect-loadcarrier}), 3D: +ItemPick and BoxPick\:(Section \ref{itempick:sect-itempick}) +Supported reference frames camera, external + +Region of interest + +A region of interest (ROI) defines a volume in space (3D region of +interest, "region_of_interest"), or a rectangular region in the left +camera image (2D region of interest, "region_of_interest_2d") which is +of interest for a specific user-application. + +A ROI can narrow the volume where a load carrier is searched for, or +select a volume which only contains items to be detected and/or +grasped. Processing times can significantly decrease when using a ROI. + +3D regions of interest of the following types ("type") are supported: + + BOX, with dimensions box.x, box.y, box.z. + + SPHERE, with radius sphere.radius. + +The user can specify the 3D region of interest "pose" in the "camera" +or the "external" coordinate system. "External" can only be chosen if +a + +Hand-eye calibration + + is available. When the sensor is robot mounted, and the region of +interest is defined in the external frame, the current robot pose must +be given to every detect service call that uses this region of +interest. + +A 2D ROI is defined as a rectangular part of the left camera image, +and can be set via the + +REST-API interface + + or the + +rc_visard NG + + +Web GUI + + on the page + +Regions of Interest + + under + +Database + +. The Web GUI offers an easy-to-use selection tool. Each ROI must have +a unique name to address a specific 2D ROI. + +In the REST-API, a 2D ROI is defined by the following values: + +id: Unique name of the region of interest + +offset_x, offset_y: offset in pixels along the x-axis and y-axis from +the top-left corner of the image, respectively + +width, height: width and height in pixels + +The + +rc_visard NG + + can persistently store up to 100 different 3D regions of interest and +the same number of 2D regions of interest. The configuration of +regions of interest is normally performed offline, during the set up +of the desired application. This can be done via the + +REST-API interface + + of RoiDB module, or in the + +rc_visard NG + + +Web GUI + + on the page + +Regions of Interest + + under + +Database + +. + +Note: The configured regions of interest are persistent even over + firmware updates and rollbacks. + +Interaction with other modules + +Internally, the RoiDB module depends on, and interacts with other on- +board modules as listed below. + +Hand-eye calibration + +In case the camera has been calibrated to a robot, the pose of a 3D +ROI can be provided in the robot coordinate frame by setting the +corresponding "pose_frame" argument. + +Two different "pose_frame" values can be chosen: + +Camera frame (camera). The ROI pose is provided in the camera frame, +and no prior knowledge about the pose of the camera in the environment +is required. This means that the configured load carriers move with +the camera. It is the user's responsibility to update the configured +poses if the camera frame moves (e.g. with a robot-mounted camera). + +External frame (external). The ROI pose is provided in the external +frame, configured by the user during the hand-eye calibration process. +The module relies on the on-board Hand-eye calibration +module\:(Section \ref{handeye_calibration:sect-handeye-calibration}) +to retrieve the sensor mounting (static or robot mounted) and the +hand-eye transformation. + +Note: If no hand-eye calibration is available, all "pose_frame" + values should be set to "camera". + +All "pose_frame" values that are not "camera" or "external" are +rejected. + +Services + +The RoiDB module is called "rc_roi_db" in the REST-API and is +represented in the + +Web GUI + + under Database ‣ Regions of Interest. The user can explore and call +the RoiDB module's services, e.g. for development and testing, using +the + +REST-API interface + + or the Web GUI. + +The RoiDB module offers the following services. + +set_region_of_interest + + Persistently stores a 3D region of interest on the + + rc_visard NG + + . All configured 3D regions of interest are persistent over + firmware updates and rollbacks. + + Details + + This service can be called as follows. + + PUT http:///api/v2/nodes/rc_roi_db/services/set_region_of_interest + + Request + + Details for the definition of the "region_of_interest" type are + given in + + Region of interest + + . + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "region_of_interest": { + "box": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "sphere": { + "radius": "float64" + }, + "type": "string" + } + } + } + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "set_region_of_interest", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +set_region_of_interest_2d + + Persistently stores a 2D region of interest on the + + rc_visard NG + + . All configured 2D regions of interest are persistent over + firmware updates and rollbacks. + + Details + + This service can be called as follows. + + PUT http:///api/v2/nodes/rc_roi_db/services/set_region_of_interest_2d + + Request + + Details for the definition of the "region_of_interest_2d" type are + given in + + Region of interest + + . + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "region_of_interest_2d": { + "height": "uint32", + "id": "string", + "offset_x": "uint32", + "offset_y": "uint32", + "width": "uint32" + } + } + } + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "set_region_of_interest_2d", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +get_regions_of_interest + + Returns the configured 3D regions of interest with the requested + "region_of_interest_ids". + + Details + + This service can be called as follows. + + PUT http:///api/v2/nodes/rc_roi_db/services/get_regions_of_interest + + Request + + If no "region_of_interest_ids" are provided, all configured 3D + regions of interest are returned. + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "region_of_interest_ids": [ + "string" + ] + } + } + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "get_regions_of_interest", + "response": { + "regions_of_interest": [ + { + "box": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "sphere": { + "radius": "float64" + }, + "type": "string" + } + ], + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +get_regions_of_interest_2d + + Returns the configured 2D regions of interest with the requested + "region_of_interest_2d_ids". + + Details + + This service can be called as follows. + + PUT http:///api/v2/nodes/rc_roi_db/services/get_regions_of_interest_2d + + Request + + If no "region_of_interest_2d_ids" are provided, all configured 2D + regions of interest are returned. + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "region_of_interest_2d_ids": [ + "string" + ] + } + } + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "get_regions_of_interest_2d", + "response": { + "regions_of_interest": [ + { + "height": "uint32", + "id": "string", + "offset_x": "uint32", + "offset_y": "uint32", + "width": "uint32" + } + ], + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +delete_regions_of_interest + + Deletes the configured 3D regions of interest with the requested + "region_of_interest_ids". + + Details + + This service can be called as follows. + + PUT http:///api/v2/nodes/rc_roi_db/services/delete_regions_of_interest + + Request + + All regions of interest to be deleted must be explicitly stated in + "region_of_interest_ids". + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "region_of_interest_ids": [ + "string" + ] + } + } + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "delete_regions_of_interest", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +delete_regions_of_interest_2d + + Deletes the configured 2D regions of interest with the requested + "region_of_interest_2d_ids". + + Details + + This service can be called as follows. + + PUT http:///api/v2/nodes/rc_roi_db/services/delete_regions_of_interest_2d + + Request + + All 2D regions of interest to be deleted must be explicitly stated + in "region_of_interest_2d_ids". + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "region_of_interest_2d_ids": [ + "string" + ] + } + } + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "delete_regions_of_interest_2d", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +Return codes + +Each service response contains a "return_code", which consists of a +"value" plus an optional "message". A successful service returns with +a "return_code" value of "0". Negative "return_code" values indicate +that the service failed. Positive "return_code" values indicate that +the service succeeded with additional information. The smaller value +is selected in case a service has multiple "return_code" values, but +all messages are appended in the "return_code" message. + +The following table contains a list of common codes: + +Return codes of the RoiDB module's services Code Description 0 +Success -1 An invalid argument was provided -10 New element could +not be added as the maximum storage capacity of regions of interest +has been exceeded 10 The maximum storage capacity of regions of +interest has been reached 11 An existent persistent model was +overwritten by the call to set_region_of_interest or +set_region_of_interest_2d diff --git a/v24.04/en/_sources/safety.rst.txt b/v24.04/en/_sources/safety.rst.txt new file mode 100644 index 0000000..b23961f --- /dev/null +++ b/v24.04/en/_sources/safety.rst.txt @@ -0,0 +1,141 @@ +Safety + +Warning: The operator must have read and understood all of the + instructions in this manual before handling the + + rc_visard NG + + product. + +Note: The term "operator" refers to anyone responsible for any of + the following tasks performed in conjunction with + + rc_visard NG + + : + + Installation + + Maintenance + + Inspection + + Calibration + + Programming + + Decommissioning + +This manual explains the + +rc_visard NG + +'s various components and general operations regarding the product's +whole life-cycle, from installation through operation to +decommissioning. + +The drawings and photos in this documentation are representative +examples; differences may exist between them and the delivered +product. + +General warnings + +Note: Any use of the + + rc_visard NG + + in noncompliance with these warnings is inappropriate and may cause + injury or damage as well as void the warranty. + +Warning: + + The rc_visard NG needs to be properly mounted before use. + + All cable sets need to be secured to the rc_visard NG and the mount. + + Cords must be at most 30 m long. + + An appropriate DC power source must supply power to the rc_visard + NG. + + Each rc_visard NG must be connected to a separate power supply. + + The rc_visard NG's housing must be grounded. + + The rc_visard NG's and any related equipment's safety guidelines + must always be satisfied. + + The rc_visard NG does not fall under the purview of the machinery, + low voltage, or medical directives. + +-[ Risk assessment and final application: ]- + +The + +rc_visard NG + + may be used on a robot. Robot, + +rc_visard NG + +, and any other equipment used in the final application must be +evaluated with a risk assessment. The system integrator's duty is to +ensure respect for all local safety measures and regulations. +Depending on the application, there may be risks that need additional +protection/safety measures. + +Intended use + +The + +rc_visard NG + + is intended for data acquisition (e.g., images, disparity images) in +stationary and mobile robotic applications. The + +rc_visard NG + + is intended for installation on a robot, automated machinery, mobile +platform, or stationary equipment. It can also be used for data +acquisition in other applications. + +Warning: The + + rc_visard NG + + is + + NOT + + intended for safety critical applications. + +The GigE Vision® industry standard used by the + +rc_visard NG + + does not support authentication and encryption. All data from and to +the device is transmitted without authentication and encryption and +could be monitored or manipulated by a third party. It is the +operator's responsibility to connect the + +rc_visard NG + + only to a secured internal network. + +Warning: The + + rc_visard NG + + must be connected to secured internal networks. + +The + +rc_visard NG + + may be used only within the scope of its technical specification. Any +other use of the product is deemed unintended use. Roboception will +not be liable for any damages resulting from any improper or +unintended use. + +Warning: Always comply with local and/or national laws, regulations + and directives on automation safety and general machine safety. diff --git a/v24.04/en/_sources/silhouettematch.rst.txt b/v24.04/en/_sources/silhouettematch.rst.txt new file mode 100644 index 0000000..0149db8 --- /dev/null +++ b/v24.04/en/_sources/silhouettematch.rst.txt @@ -0,0 +1,2584 @@ +SilhouetteMatch + +Introduction + +The SilhouetteMatch module is an optional on-board module of the + +rc_visard NG + + and requires a separate SilhouetteMatch + +license + + to be purchased. + +The module detects objects by matching a predefined silhouette +(“template”) to edges in the image. + +The SilhouetteMatch module can detect objects in two different +scenarios: + + With calibrated base plane + + : The objects are placed on a common base plane, which must be + calibrated before the detection, and the objects have significant + edges on a common plane that is parallel to the base plane. + + With object plane detection + + : The objects can be placed at different, previously unknown + heights, if the objects have a planar surface and their outer + contours are well visible in the images (e.g. stacked flat + objects). + +Templates for object detection can be created by uploading a DXF file +and specifying the object height. The correct scale and unit of the +contours are extracted from the DXF file. If no units are present in +the DXF file, the user has to specify which units should be used. When +the outer contour of the object in the DXF file is closed, a 3D +collision model is created automatically by extruding the contour by +the given object height. This model will then be used for collision +checking and in 3D visualizations. Uploading a DXF file can be done in +the Web GUI via the + Create a new Template button in the + +SilhouetteMatch Templates and Grasps + + section on the Modules ‣ SilhouetteMatch or Database ‣ Templates +pages. + +Roboception also offers a template generation service on their + +website + +, where the user can upload CAD files or recorded data of the objects +and request object templates for the SilhouetteMatch module. + +The object templates consist of significant edges of each object. +These template edges are matched to the edges detected in the left and +right camera images, considering the actual size of the objects and +their distance from the camera. The poses of the detected objects are +returned and can be used for grasping, for example. + +The SilhouetteMatch module offers: + +A dedicated page on the rc_visard NG Web GUI\:(Section \ref{webgui +:sect-web-gui}) for easy setup, configuration, testing, and +application tuning. + +A REST-API interface\:(Section \ref{rest_api:sect-rest-api}) and a +KUKA Ethernet KRL Interface\:(Section \ref{eki:sect-eki}). + +The definition of 2D regions of interest to select relevant parts of +the camera image (see Setting a region of interest, Section +\ref{silhouettematch:sect-silhouettematch-roi}). + +A load carrier detection functionality for bin-picking applications +(see LoadCarrier, Section \ref{loadcarrier:sect-loadcarrier}), to +provide grasps for objects inside a bin only. + +Storing of up to 50 templates. + +The definition of up to 50 grasp points for each template via an +interactive visualization in the Web GUI. + +Collision checking between the gripper and the load carrier, the +calibrated base plane, other detected objects and/or the point cloud. + +Support for static and robot-mounted cameras and optional integration +with the Hand-eye calibration (Section \ref{handeye_calibration:sect- +handeye-calibration}) module, to provide grasps in the user-configured +external reference frame. + +Selection of a sorting strategy to sort the detected objects and +returned grasps. + +3D visualization of the detection results with grasp points and +gripper animations in the Web GUI. + +Suitable objects + +The SilhouetteMatch module is intended for objects which have +significant edges on a common plane that is parallel to the plane on +which the objects are placed. This applies to flat, nontransparent +objects, such as routed, laser-cut or water-cut 2D parts and flat- +machined parts. More complex parts can also be detected if there are +significant edges on a common plane, e.g. a special pattern printed on +a flat surface. The detection works best for objects on a texture-free +plane. The color of the base plane should be chosen such that a clear +contrast between the objects and the base plane appears in the +intensity image. + +In case the objects are not placed on a common base plane or the base +plane cannot be calibrated beforehand, the objects need to have a +planar surface and their outer contour must be well visible in the +left and right images. Furthermore, the template for these objects +must have a closed outer contour. + +Suitable scene + +The scene must meet the following conditions to be suitable for the +SilhouetteMatch module: + +The objects to be detected must be suitable for the SilhouetteMatch +module as described above. + +Only objects belonging to one specific template are visible at a time +(unmixed scenario). In case other objects are visible as well, a +proper region of interest (ROI) must be set. + +In case a calibrated base plane is used: The offset between the base +plane normal and the camera's line of sight does not exceed 10 +degrees. + +In case the object planes are detected automatically: The offset +between the object's planar surface normal and the camera's line of +sight does not exceed 25 degrees. + +The objects are not partially or fully occluded. + +All visible objects are right side up (no flipped objects). + +The object edges to be matched are visible in both, left and right +camera images. + +Base-plane calibration + +In case all objects are placed on a common plane that is known +beforehand, a base-plane calibration should be performed before +triggering a detection. Thereby, the distance and angle of the plane +on which the objects are placed is measured and stored persistently on +the + +rc_visard NG + +. + +Separating the detection of the base plane from the actual object +detection renders scenarios possible in which the base plane is +temporarily occluded. Moreover, it increases performance of the object +detection for scenarios where the base plane is fixed for a certain +time; thus, it is not necessary to continuously re-detect the base +plane. + +The base-plane calibration can be performed in three different ways, +which will be explained in more detail further down: + +AprilTag based + +Stereo based + +Manual + +The base-plane calibration is successful if the normal vector of the +estimated base plane is at most 10 degrees offset to the camera's line +of sight. If the base-plane calibration is successful, it will be +stored persistently on the + +rc_visard NG + + until it is removed or a new base-plane calibration is performed. + +Note: To avoid privacy issues, the image of the persistently stored + base- plane calibration will appear blurred after rebooting the + + rc_visard NG + + . + +In scenarios where the base plane is not accessible for calibration, a +plane parallel to the base plane can be calibrated. Then an "offset" +parameter can be used to shift the estimated plane onto the actual +base plane where the objects are placed. The "offset" parameter gives +the distance in meters by which the estimated plane is shifted towards +the camera. + +In the REST-API, a plane is defined by a "normal" and a "distance". +"normal" is a normalized 3-vector, specifying the normal of the plane. +The normal points away from the camera. "distance" represents the +distance of the plane from the camera along the normal. Normal and +distance can also be interpreted as a, b, c, and d components of the +plane equation, respectively: + + ax + by + cz + d = 0 + +AprilTag based base-plane calibration + +AprilTag detection (ref. + +TagDetect + +) is used to find AprilTags in the scene and fit a plane through them. +At least three AprilTags must be placed on the base plane so that they +are visible in the left and right camera images. The tags should be +placed such that they are spanning a triangle that is as large as +possible. The larger the triangle, the more accurate is the resulting +base-plane estimate. Use this method if the base plane is untextured +and no external random dot projector is available. This calibration +mode is available via the + +REST-API interface + + and the + +rc_visard NG + + Web GUI. + +Stereo based base-plane calibration + +The 3D point cloud computed by the stereo matching module is used to +fit a plane through its 3D points. Therefore, the region of interest +(ROI) for this method must be set such that only the relevant base +plane is included. The "plane_preference" parameter allows to select +whether the plane closest to or farthest from the camera should be +used as base plane. Selecting the closest plane can be used in +scenarios where the base plane is completely occluded by objects or +not accessible for calibration. Use this method if the base plane is +well textured or you can make use of a random dot projector to project +texture on the base plane. This calibration mode is available via the + +REST-API interface + + and the + +rc_visard NG + + Web GUI. + +Manual base-plane calibration + +The base plane can be set manually if its parameters are known, e.g. +from previous calibrations. This calibration mode is only available +via the + +REST-API interface + + and not the + +rc_visard NG + + Web GUI. + +Setting a region of interest + +If objects are to be detected only in part of the camera’s field of +view, a 2D region of interest (ROI) can be set accordingly as +described in + +Region of interest + +. + +Setting of grasp points + +To use SilhouetteMatch directly in a robot application, up to 50 grasp +points can be defined for each template. A grasp point represents the +desired position and orientation of the robot's TCP (Tool Center +Point) to grasp an object as shown in + +Fig. 28 + +. + + +Each grasp consists of an "id" which must be unique within all grasps +for an object template, the "template_id" representing the template to +which the grasp should be attached, and the "pose" in the coordinate +frame of the object template. Grasp points can be set via the + +REST-API interface + +, or by using the interactive visualization in the Web GUI. +Furthermore, a "priority" (spanning -2 for very low to 2 for very +high) can be assigned to a grasp. Priorities can facilitate robot +applications and shorten response times when the run-time parameter +"only_highest_priority_grasps" is set to true. In this case collision +checking concludes when grasps with the highest possible priority have +been found. Finally, different grasps can be associated with different +grippers by specifying a "gripper_id". These individual grippers are +then used for collision checking of the corresponding grasps instead +of the gripper defined in the "detect_object" request. If no +"gripper_id" is given, the gripper defined in the "detect_object" +request will be used for collision checking. + +When a grasp is defined on a symmetric object, all grasps symmetric to +the defined one will automatically be considered in the +SilhouetteMatch module's "detect_object" service call. Symmetric +grasps for a given grasp point can be retrieved using the +"get_symmetric_grasps" service call and visualized in the Web GUI. + +Users can also define replications of grasps around a custom axis. +These replications spawn multiple grasps and free users from setting +too many grasps manually. The replication origin is defined as a +coordinate frame in the object's coordinate frame and the x axis of +the replication origin frame corresponds to the replication axis. The +grasp is replicated by rotating it around this x axis starting from +its original pose. The replication is done in steps of size +"step_x_deg" degrees. The range is defined by the minimal and maximal +boundaries "min_x_deg" and "max_x_deg". The minimal (maximal) boundary +must be a non-positive (non-negative) number up to (minus) 180 +degrees. + +Setting grasp points in the Web GUI + +The + +rc_visard NG + + Web GUI provides an intuitive and interactive way of defining grasp +points for object templates. In a first step, the object template has +to be uploaded to the + +rc_visard NG + +. This can be done in the Web GUI in any pipeline under Modules ‣ +SilhouetteMatch by clicking on + Add a new Template in the + +Templates and Grasps + + section, or in Database ‣ Templates in the + +SilhouetteMatch Templates and Grasps + + section. Once the template upload is complete, a dialog with a 3D +visualization of the object template is shown for adding or editing +grasp points. The same dialog appears when editing an existing +template. If the template contains a collision model or a +visualization model, this 3D model is visualized as well. + +This dialog provides two ways for setting grasp points: + +Adding grasps manually: By clicking on the + symbol, a new grasp is +placed in the object origin. The grasp can be given a unique name +which corresponds to its ID. The desired pose of the grasp can be +entered in the fields for Position and Roll/Pitch/Yaw which are given +in the coordinate frame of the object template represented by the long +x, y and z axes in the visualization. The grasp point can be placed +freely with respect to the object template - inside, outside or on the +surface. The grasp point and its orientation are visualized in 3D for +verification. + +Adding grasps interactively: Grasp points can be added interactively +by first clicking on the Add Grasp button in the upper right corner of +the visualization and then clicking on the desired point on the object +template visualization. If the 3D model is displayed, the grasps will +be attached to the surface of the 3D model. Otherwise, the grasp is +attached to the template surface. The grasp orientation is a right- +handed coordinate system and is chosen such that its z axis is +perpendicular to the surface pointing inside the template at the grasp +position. The position and orientation in the object coordinate frame +is displayed on the right. The position and orientation of the grasp +can also be changed interactively. In case Snap to surface is disabled +(default), the grasp can be translated and rotated freely in all three +dimensions by clicking on Move Grasp in the visualization menu and +then dragging the grasp along the appropriate axis to the desired +position. The orientation of the grasp can also be changed by rotating +the axis with the mouse. In case Snap to surface is enabled in the +visualization, the grasp can only be moved along the model surface. + +Users can also specify a grasp priority by changing the Priority +slider. A dedicated gripper can be selected in the Gripper drop down +field. + +By activating the Replication check box, users can replicate the grasp +around a custom axis. The replication axis and the resulting +replicated grasps are visualized. The position and orientation of the +replication axis relative to the object coordinate frame can be +adjusted interactively by clicking on Move Replication Axis in the +visualization menu and then dragging the axis to the desired position +and orientation. The grasps are replicated within the specified +rotation range at the selected rotation step size. Users can cycle +through a visualization of the replicated grasps by dragging the bar +below Cycle through n replicated grasps in the View Options section of +the visualization menu. If a gripper is selected for the grasp or a +gripper has been chosen in the visualization menu, the gripper is also +shown at the currently selected grasp. + +If the object template has symmetries, the grasps which are symmetric +to the defined grasps can be displayed along with their replications +(if defined) by enabling ... symmetries in the View Options section of +the visualization menu. The user can also cycle through a +visualization of the symmetric grasps by dragging the bar below Cycle +through n symmetric grasps. + +Setting grasp points via the REST-API + +Grasp points can be set via the + +REST-API interface + + using the "set_grasp" or "set_all_grasps" services (see + +Internal services + +). A grasp consists of the "template_id" of the template to which the +grasp should be attached, an "id" uniquely identifying the grasp point +and the "pose". The pose is given in the coordinate frame of the +object template and consists of a "position" in meters and an +"orientation" as quaternion. A dedicated gripper can be specified +through setting the "gripper_id" field. The "priority" is specified by +an integer value, ranging from -2 for very low, to 2 for very high +with a step size of 1. The replication origin is defined as a +transformation in the object's coordinate frame and the x axis of the +transformation corresponds to the replication axis. The replication +range is controlled by the "min_x_deg" and "max_x_deg" fields and the +step size "step_x_deg". + +Setting the preferred orientation of the TCP + +The SilhouetteMatch module determines the reachability of grasp points +based on the + +preferred orientation + + of the gripper or TCP. The preferred orientation can be set via the +"set_preferred_orientation" service or on the + +SilhouetteMatch + + page in the Web GUI. The resulting direction of the TCP's z axis is +used to reject grasps which cannot be reached by the gripper. +Furthermore, the preferred orientation can be used to sort the +reachable grasps by setting the corresponding sorting strategy. + +The preferred orientation can be set in the camera coordinate frame or +in the external coordinate frame, in case a hand-eye calibration is +available. If the preferred orientation is specified in the external +coordinate frame and the sensor is robot mounted, the current robot +pose has to be given to each object detection call, so that the +preferred orientation can be used for filtering and, optionally, +sorting the grasps on the detected objects. If no preferred +orientation is set, the orientation of the left camera is used as the +preferred orientation of the TCP. + +Setting the sorting strategies + +The objects and grasps returned by the "detect_object" service call +are sorted according to a sorting strategy which can be chosen by the +user. The following sorting strategies are available and can be set in +the + +Web GUI + + or using the "set_sorting_strategies" service call: + +preferred_orientation: objects and grasp points with minimal rotation +difference between their orientation and the preferred orientation of +the TCP are returned first, + +direction: objects and grasp points with the shortest distance along a +defined direction vector in a given pose_frame are returned first. + +If no sorting strategy is set or default sorting is chosen in the Web +GUI, sorting is done based on a combination of "preferred_orientation" +and the minimal distance from the camera along the z axis of the +preferred orientation of the TCP. + +Detection of objects + +For triggering the object detection, in general, the following +information must be provided to the SilhouetteMatch module: + +The template of the object to be detected in the scene. + +The coordinate frame in which the poses of the detected objects shall +be returned (ref. Hand-eye calibration, Section \ref{silhouettematch +:sect-silhouettematch-hand-eye-calib}). + +Optionally, further information can be given to the SilhouetteMatch +module: + +A flag object_plane_detection determining whether the surface plane of +the objects should be used for the detection instead of the calibrated +base plane. + +An offset, in case the calibrated base plane should be used but the +objects are not lying on this plane but on a plane parallel to it. The +offset is the distance between both planes given in the direction +towards the camera. If omitted, an offset of 0 is assumed. It must not +be set if object_plane_detection is true. + +The ID of the load carrier which contains the objects to be detected. + +The ID of the region of interest where to search for the load carrier +if a load carrier is set. Otherwise, the ID of the region of interest +where the objects should be detected. If omitted, objects are matched +in the whole image. + +The current robot pose in case the camera is mounted on the robot and +the chosen coordinate frame for the poses is external or the preferred +orientation is given in the external frame. + +Collision detection information: The ID of the gripper to enable +collision checking and optionally a pre-grasp offset to define a pre- +grasp position. Details on collision checking are given below in +CollisionCheck\:(Section \ref{silhouettematch:sect-silhouettematch- +collision-check-dep}). + +In case the "object_plane_detection" flag is not true, objects can +only be detected after a successful base-plane calibration. It must be +ensured that the position and orientation of the base plane does not +change before the detection of objects. Otherwise, the base-plane +calibration must be renewed. + +When "object_plane_detection" is set to true, a base-plane calibration +is not required and an existing base-plane calibration will be +ignored. During detection, the scene is clustered into planar surfaces +and template matching is performed on each plane whose tilt with +respect to the camera's line of sight is less than 25° and whose size +is large enough to contain the selected template. When a match is +found, its position and orientation are refined using the image edges +and the point cloud inside the template's outer contour. For this, it +is required that the outer contour of the template is closed and that +the object's surface is planar. + +On the Web GUI the detection can be tested in the + +Try Out + + section of the SilhouetteMatch page. Different image streams can be +selected to show intermediate results and the final matches as shown +in + +Fig. 29 + +. + + The + + "Template" + + image stream shows the template to be matched in red with the + defined grasp points in green (see + + Setting of grasp points + + ). The template is warped to the size and tilt matching objects on + the calibrated base plane or, in case "object_plane_detection" was + used, the highest segmented plane, would have. The corresponding + plane is shown in dark blue. + + The + + "Intermediate Result" + + image stream shows the edges of the left image that were used to + search for matches in light blue. The chosen region of interest is + shown as bold petrol rectangle. A shaded blue area on the left + visualizes the region of the left camera image which does not + overlap with the right image, and in which no objects can be + detected. If "object_plane_detection" was used, this image stream + also shows the detected planar clusters in the scene. Clusters that + were not used for matching, because they were too small or too + tilted, are visualized with a stripe pattern. + + The + + "Intermediate Result Right" + + image stream shows the edges of the right image that were used to + search for matches in light blue. The chosen region of interest is + shown as bold petrol rectangle. A shaded blue area on the right + visualizes the region of the right camera image which does not + overlap with the left image, and in which no objects can be + detected. + + The + + "Result" + + image shows the detection result. The image edges that were used + to refine the match poses are shown in light blue and the matches + ("instances") with the template edges are shown in red. The blue + circles are the origins of the detected objects as defined in the + template and the green circles are the collision-free grasp points. + Colliding grasp points are visualized as red dots and grasp points + that were not checked for collisions are drawn in yellow. + + +The poses of the object origins in the chosen coordinate frame are +returned as results in a list of "instances". In case the calibrated +base plane was used for the detection ("object_plane_detection" not +set or false), the orientations of the detected objects are aligned +with the normal of the base plane. Otherwise, the orientations of the +detected objects are aligned with the normal of a plane fitted to the +object points in the 3D point cloud. + +If the chosen template also has grasp points attached, a list of +"grasps" for all objects is returned in addition to the list of +detected objects. The grasp poses are given in the desired coordinate +frame and the grasps are sorted according to the selected sorting +strategy (see + +Setting the sorting strategies + +). There are references between the detected object instances and the +grasps via their "uuids". + +In case the templates have a continuous rotational symmetry (e.g. +cylindrical objects), all returned object poses will have the same +orientation. Furthermore, all grasps symmetric to each grasp point on +an object are checked for reachability and collisions, and only the +best one according to the given sorting strategy is returned. + +For objects with a discrete symmetry (e.g. prismatic objects), all +collision-free symmetries of each grasp point which are reachable +according to the given preferred TCP orientation are returned, ordered +by the given sorting strategy. + +The detection results and run times are affected by several run-time +parameters which are listed and explained further down. Improper +parameters can lead to timeouts of the SilhouetteMatch module's +detection process. + +Interaction with other modules + +Internally, the SilhouetteMatch module depends on, and interacts with +other on-board modules as listed below. + +Note: All changes and configuration updates to these modules will + affect the performance of the SilhouetteMatch module. + +Stereo camera and stereo matching + +The SilhouetteMatch module makes internally use of the rectified +images from the + +Camera + + module ("rc_camera"). Thus, the exposure time should be set properly +to achieve the optimal performance of the module. + +For base-plane calibration in stereo mode, for load carrier detection, +for automatic object plane detection and for collision checking with +the point cloud, the disparity images from the + +Stereo matching + + module ("rc_stereomatching") are used. + +For detecting objects with a calibrated base plane, without load +carrier and without collision checking with the point cloud, the +stereo-matching module should not be run in parallel to the +SilhouetteMatch module, because the detection runtime increases. + +For best results it is recommended to enable + +smoothing + + for + +Stereo matching + +. + +IO and Projector Control + +In case the + +rc_visard NG + + is used in conjunction with an external random dot projector and the + +IO and Projector Control + + module ("rc_iocontrol"), the projector should be used for the stereo- +based base-plane calibration, for automatic object plane detection and +for collision checking with the point cloud. + +The projected pattern must not be visible in the left and right camera +images during object detection as it interferes with the matching +process. Therefore, it is recommended to connect the projector to GPIO +Out 1 and set the stereo-camera module's acquisition mode to +"SingleFrameOut1" (see + +Stereo matching parameters + +), so that on each image acquisition trigger an image with and without +projector pattern is acquired. + +Alternatively, the output mode for the GPIO output in use should be +set to "ExposureAlternateActive" (see + +Description of run-time parameters + +). + +In either case, the + +Auto Exposure Mode + + "exp_auto_mode" should be set to "AdaptiveOut1" to optimize the +exposure of both images (see + +Stereo camera parameters + +). + +Hand-eye calibration + +In case the camera has been calibrated to a robot, the SilhouetteMatch +module can automatically provide poses in the robot coordinate frame. +For the SilhouetteMatch node's + +Services + +, the frame of the input and output poses and plane coordinates can be +controlled with the "pose_frame" argument. + +Two different "pose_frame" values can be chosen: + +Camera frame (camera). All poses and plane coordinates provided to and +by the module are in the camera frame. + +External frame (external). All poses and plane coordinates provided to +and by the module are in the external frame, configured by the user +during the hand-eye calibration process. The module relies on the on- +board Hand-eye calibration module\:(Section \ref{handeye_calibration +:sect-handeye-calibration}) to retrieve the camera mounting (static or +robot mounted) and the hand-eye transformation. If the sensor mounting +is static, no further information is needed. If the sensor is robot- +mounted, the robot_pose is required to transform poses to and from the +external frame. + +All "pose_frame" values that are not "camera" or "external" are +rejected. + +Note: If no hand-eye calibration is available, all "pose_frame" + values should be set to "camera". + +Note: If the hand-eye calibration has changed after base-plane + calibration, the base-plane calibration will be marked as invalid + and must be renewed. + +If the sensor is robot-mounted, the current "robot_pose" has to be +provided depending on the value of "pose_frame", the definition of the +preferred TCP orientation and the sorting direction: + +If pose_frame is set to external, providing the robot pose is +obligatory. + +If the preferred TCP orientation is defined in external, providing the +robot pose is obligatory. + +If the sorting direction is defined in external, providing the robot +pose is obligatory. + +In all other cases, providing the robot pose is optional. + +If the current robot pose is provided during calibration, it is stored +persistently on the + +rc_visard NG + +. If the updated robot pose is later provided during +"get_base_plane_calibration" or "detect_object" as well, the base- +plane calibration will be transformed automatically to this new robot +pose. This enables the user to change the robot pose (and thus camera +position) between base-plane calibration and object detection. + +Note: Object detection can only be performed if the limit of 10 + degrees angle offset between the base plane normal and the camera's + line of sight is not exceeded. + +LoadCarrier + +The SilhouetteMatch module uses the load carrier detection +functionality provided by the + +LoadCarrier + + module ("rc_load_carrier"), with the run-time parameters specified +for this module. However, only one load carrier will be returned and +used in case multiple matching load carriers could be found in the +scene. In case multiple load carriers of the same type are visible, a +region of interest should be set to ensure that always the same load +carrier is used for the SilhouetteMatch module. + +CollisionCheck + +Collision checking can be easily enabled for grasp computation of the +SilhouetteMatch module by passing a "collision_detection" argument to +the "detect_object" service call. It contains the ID of the used +gripper and optionally a pre-grasp offset. The gripper has to be +defined in the GripperDB module (see + +Setting a gripper + +) and details about collision checking are given in + +Collision checking within other modules + +. In addition to collision checking between the gripper and the +detected load carrier, collisions between the gripper and the +calibrated base plane will be checked, if the run-time parameter +"check_collisions_with_base_plane" is true. If the selected +SilhouetteMatch template contains a collision model and the run-time +parameter "check_collisions_with_matches" is true, also collisions +between the gripper and all other detected objects (not limited to +"max_number_of_detected_objects") will be checked. The object on which +the grasp point to be checked is located, is excluded from the +collision check. + +If the run-time parameter "check_collisions_with_point_cloud" is true, +also collisions between the gripper and a watertight version of the +point cloud are checked. If this feature is used with suctions +grippers, it should be ensured that the TCP is defined to be outside +the gripper geometry, or that the grasp points are defined above the +object surface. Otherwise every grasp will result in a collision +between the gripper and the point cloud. + +If collision checking is enabled, only grasps which are collision free +will be returned. However, the visualization images on the + +SilhouetteMatch + + page of the Web GUI also show colliding grasp points in red. The +objects which are considered in the collision check are also +visualized with their edges in red. + +The CollisionCheck module's run-time parameters affect the collision +detection as described in + +CollisionCheck Parameters + +. + +Parameters + +The SilhouetteMatch software module is called "rc_silhouettematch" in +the REST-API and is represented in the + +Web GUI + + under Modules ‣ SilhouetteMatch. The user can explore and configure +the "rc_silhouettematch" module's run-time parameters, e.g. for +development and testing, using the Web GUI or the + +REST-API interface + +. + +Parameter overview + +This module offers the following run-time parameters: + +The rc_silhouettematch module's run-time parameters Name +Type Min Max Default Description +check_collisions_with_-base_plane bool false true true Whether to +check for collisions between gripper and base plane +check_collisions_with_matches bool false true true Whether to +check for collisions between gripper and detected matches +check_collisions_with_-point_cloud bool false true false Whether +to check for collisions between gripper and the point cloud +edge_sensitivity float64 0.1 1.0 0.7 Sensitivity of the edge +detector match_max_distance float64 0.1 10.0 3.0 Maximum allowed +distance in pixels between the template and the detected edges in the +image match_percentile float64 0.7 1.0 0.8 Percentage of +template pixels that must be within the maximum distance to +successfully match the template max_number_of_detected_objects int32 +1 20 10 Maximum number of detected objects +only_highest_priority_grasps bool false true false Whether to +return only the highest priority level grasps point_cloud_enhancement +string - - Off Type of enhancement of the point cloud using the +base plane: [Off, ReplaceBright] quality string - - High +Quality: [Low, Medium, High] + +Description of run-time parameters + +Each run-time parameter is represented by a row on the Web GUI's +SilhouetteMatch page. The name in the Web GUI is given in brackets +behind the parameter name and the parameters are listed in the order +they appear in the Web GUI: + +max_number_of_detected_objects (Maximum Object Number) + + This parameter gives the maximum number of objects to detect in + the scene. If more than the given number of objects can be + detected in the scene, only the objects matching best to the + given sorting strategy are returned. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?max_number_of_detected_objects= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?max_number_of_detected_objects= + +quality (Quality) + + Object detection can be performed on images with different + resolutions: "High" (full image resolution), "Medium" (half + image resolution) and "Low" (quarter image resolution). The + lower the resolution, the lower the detection time, but the + fewer details of the objects are visible. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?quality= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?quality= + +match_max_distance (Maximum Matching Distance) + + This parameter gives the maximum allowed pixel distance of an + image edge pixel from the object edge pixel in the template to + be still considered as matching. If the object is not perfectly + represented in the template, it might not be detected when this + parameter is low. High values, however, might lead to false + detections in case of a cluttered scene or the presence of + similar objects, and also increase runtime. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?match_max_distance= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?match_max_distance= + +match_percentile (Matching Percentile) + + This parameter indicates how strict the matching process should + be. The matching percentile is the ratio of template pixels that + must be within the Maximum Matching Distance to successfully + match the template. The higher this number, the more accurate + the match must be to be considered as valid. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?match_percentile= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?match_percentile= + +edge_sensitivity (Edge Sensitivity) + + This parameter influences how many edges are detected in the + left and right camera images. The higher this number, the more + edges are found in the intensity images. That means, for lower + numbers, only the most significant edges are considered for + template matching. A large number of edges in the image might + increase the detection time. It must be ensured that the edges + of the objects to be detected are detected in both, the left and + the right camera images. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?edge_sensitivity= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?edge_sensitivity= + +only_highest_priority_grasps (Only Highest Priority Grasps) + + If set to true, only grasps with the highest priority will be + returned. If collision checking is enabled, only the collision-free + grasps among the group of grasps with the highest priority are + returned. This can save computation time and reduce the number of + grasps to be parsed on the application side. + + Without collision checking, only grasps of highest priority are + returned. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?only_highest_priority_grasps= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?only_highest_priority_grasps= + +check_collisions_with_base_plane (Check Collisions with Base Plane) + + If this parameter is set to true, and collision checking is + enabled by passing a gripper to the "detect_object" service + call, all grasp points will be checked for collisions between + the gripper and the calibrated base plane, and only grasp points + at which the gripper would not collide with the base plane will + be returned. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?check_collisions_with_base_plane= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?check_collisions_with_base_plane= + +check_collisions_with_matches (Check Collisions with Matches) + + If this parameter is set to true, and collision checking is + enabled by passing a gripper to the "detect_object" service + call, all grasp points will be checked for collisions between + the gripper and all other detected objects (not limited to + "max_number_of_detected_objects"), and only grasp points at + which the gripper would not collide with any other detected + object will be returned. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?check_collisions_with_matches= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?check_collisions_with_matches= + +check_collisions_with_point_cloud (Check Collisions with Point Cloud) + + If this parameter is set to true, and collision checking is + enabled by passing a gripper to the "detect_object" service + call, all grasp points will be checked for collisions between + the gripper a watertight version of the point cloud, and only + grasp points at which the gripper would not collide with this + point cloud will be returned. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?check_collisions_with_point_cloud= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?check_collisions_with_point_cloud= + +point_cloud_enhancement (Enhance with Base Plane) + + This parameter is only considered when + "check_collisions_with_point_cloud" is true and the object + detection was triggered without "object_plane_detection". By + default, "point_cloud_enhancement" is set to "Off" ( + + Off + + ). If "point_cloud_enhancement" is set to "ReplaceBright" ( + + Replace Bright Image Pixels + + ), the calibrated base plane will be used to enhance the point + cloud that is used for collision checking. For this, the depth + values of all bright image pixels inside the image or, if set, + the 2D region of interest will be set to the depth of the + calibrated base plane. This parameter should be used when dark + objects are placed on an untextured bright background, e.g. on a + light table. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?point_cloud_enhancement= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_silhouettematch/parameters?point_cloud_enhancement= + +Status values + +This module reports the following status values: + +The rc_silhouettematch module's status values Name Description +data_acquisition_time Time in seconds required by the last active +service to acquire images last_timestamp_processed The timestamp of +the last processed dataset load_carrier_detection_time Processing +time of the last load carrier detection in seconds processing_time +Processing time of the last detection (including load carrier +detection) in seconds + +Services + +The user can explore and call the "rc_silhouettematch" module's +services, e.g. for development and testing, using the + +REST-API interface + + or the + +rc_visard NG + + +Web GUI + +. + +The SilhouetteMatch module offers the following services. + +detect_object + + Triggers an object detection as described in + + Detection of objects + + and returns the pose of all found object instances. + + Details + + All images used by the service are guaranteed to be newer than the + service trigger time. + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/detect_object + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/detect_object + + Request + + Required arguments: + + "object_id" in "object_to_detect": ID of the template which + should be detected. + + "pose_frame": see + + Hand-eye calibration + + . + + Potentially required arguments: + + "robot_pose": see + + Hand-eye calibration + + . + + Optional arguments: + + "object_plane_detection": false if the objects are placed on a + calibrated base plane, true if the objects' surfaces are planar + and the base plane is unknown or the objects are located on + multiple different planes, e.g. stacks. + + "offset": offset in meters by which the base-plane calibration + will be shifted towards the camera. + + "load_carrier_id": ID of the load carrier which contains the + items to be detected. + + "collision_detection": see + + Collision checking within other modules + + . + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "collision_detection": { + "gripper_id": "string", + "pre_grasp_offset": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "load_carrier_id": "string", + "object_plane_detection": "bool", + "object_to_detect": { + "object_id": "string", + "region_of_interest_2d_id": "string" + }, + "offset": "float64", + "pose_frame": "string", + "robot_pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + } + } + } + + Response + + The maximum number of returned instances can be controlled with the + "max_number_of_detected_objects" parameter. + + "object_id": ID of the detected template. + + "instances": list of detected object instances, ordered according + to the chosen sorting strategy. + + "grasps": list of grasps on the detected objects, ordered according + to the chosen sorting strategy. The "instance_uuid" gives the + reference to the detected object in "instances" this grasp belongs + to. The list of returned grasps will be trimmed to the 100 best + grasps if more reachable grasps are found. Each grasp contains a + flag "collision_checked" and a "gripper_id" (see + + Collision checking within other modules + + ). + + "load_carriers": list of detected load carriers. + + "timestamp": timestamp of the image set the detection ran on. + + "return_code": holds possible warnings or error codes and messages. + + The definition for the response with corresponding datatypes is: + + { + "name": "detect_object", + "response": { + "grasps": [ + { + "collision_checked": "bool", + "gripper_id": "string", + "id": "string", + "instance_uuid": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "priority": "int8", + "timestamp": { + "nsec": "int32", + "sec": "int32" + }, + "uuid": "string" + } + ], + "instances": [ + { + "grasp_uuids": [ + "string" + ], + "id": "string", + "object_id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "timestamp": { + "nsec": "int32", + "sec": "int32" + }, + "uuid": "string" + } + ], + "load_carriers": [ + { + "height_open_side": "float64", + "id": "string", + "inner_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "outer_dimensions": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "overfilled": "bool", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "rim_ledge": { + "x": "float64", + "y": "float64" + }, + "rim_step_height": "float64", + "rim_thickness": { + "x": "float64", + "y": "float64" + }, + "type": "string" + } + ], + "object_id": "string", + "return_code": { + "message": "string", + "value": "int16" + }, + "timestamp": { + "nsec": "int32", + "sec": "int32" + } + } + } + +calibrate_base_plane + + Triggers the calibration of the base plane, as described in + + Base-plane calibration + + . + + Details + + A successful base-plane calibration is stored persistently on the + + rc_visard NG + + and returned by this service. The base-plane calibration is + persistent over firmware updates and rollbacks. + + All images used by the service are guaranteed to be newer than the + service trigger time. + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/calibrate_base_plane + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/calibrate_base_plane + + Request + + Required arguments: + + "plane_estimation_method": method to use for base-plane + calibration. Valid values are "STEREO", "APRILTAG", "MANUAL". + + "pose_frame": see + + Hand-eye calibration + + . + + Potentially required arguments: + + "plane" if "plane_estimation_method" is "MANUAL": plane that + will be set as base-plane calibration. + + "robot_pose": see + + Hand-eye calibration + + . + + "region_of_interest_2d_id": ID of the region of interest for + base-plane calibration. + + Optional arguments: + + "offset": offset in meters by which the estimated plane will be + shifted towards the camera. + + "plane_preference" in "stereo": whether the plane closest to or + farthest from the camera should be used as base plane. This + option can be set only if "plane_estimation_method" is "STEREO". + Valid values are "CLOSEST" and "FARTHEST". If not set, the + default is "FARTHEST". + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "offset": "float64", + "plane": { + "distance": "float64", + "normal": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "plane_estimation_method": "string", + "pose_frame": "string", + "region_of_interest_2d_id": "string", + "robot_pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "stereo": { + "plane_preference": "string" + } + } + } + + Response + + "plane": calibrated base plane. + + "timestamp": timestamp of the image set the calibration ran on. + + "return_code": holds possible warnings or error codes and messages. + + The definition for the response with corresponding datatypes is: + + { + "name": "calibrate_base_plane", + "response": { + "plane": { + "distance": "float64", + "normal": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "pose_frame": "string" + }, + "return_code": { + "message": "string", + "value": "int16" + }, + "timestamp": { + "nsec": "int32", + "sec": "int32" + } + } + } + +get_base_plane_calibration + + Returns the configured base-plane calibration. + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/get_base_plane_calibration + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/get_base_plane_calibration + + Request + + Required arguments: + + "pose_frame": see + + Hand-eye calibration + + . + + Potentially required arguments: + + "robot_pose": see + + Hand-eye calibration + + . + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "pose_frame": "string", + "robot_pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + } + } + } + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "get_base_plane_calibration", + "response": { + "plane": { + "distance": "float64", + "normal": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "pose_frame": "string" + }, + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +delete_base_plane_calibration + + Deletes the configured base-plane calibration. + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/delete_base_plane_calibration + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/delete_base_plane_calibration + + Request + + This service has no arguments. + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "delete_base_plane_calibration", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +set_preferred_orientation + + Persistently stores the preferred orientation of the gripper to + compute the reachability of the grasps, which is used for filtering + and, optionally, sorting the grasps returned by the "detect_object" + service (see + + Setting the preferred orientation of the TCP + + ). + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/set_preferred_orientation + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/set_preferred_orientation + + Request + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "pose_frame": "string" + } + } + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "set_preferred_orientation", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +get_preferred_orientation + + Returns the preferred orientation of the gripper to compute the + reachability of the grasps, which is used for filtering and, + optionally, sorting the grasps returned by the "detect_object" + service (see + + Setting the preferred orientation of the TCP + + ). + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/get_preferred_orientation + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/get_preferred_orientation + + Request + + This service has no arguments. + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "get_preferred_orientation", + "response": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "pose_frame": "string", + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +set_sorting_strategies + + Persistently stores the sorting strategy for sorting the grasps and + detected objects returned by the "detect_object" service (see + + Detection of objects + + ). + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/set_sorting_strategies + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/set_sorting_strategies + + Request + + Only one strategy may have a "weight" greater than 0. If all + "weight" values are set to 0, the module will use the default + sorting strategy. + + If the weight for "direction" is set, the "vector" must contain the + direction vector and "pose_frame" must be either "camera" or + "external". + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "direction": { + "pose_frame": "string", + "vector": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "weight": "float64" + }, + "preferred_orientation": { + "weight": "float64" + } + } + } + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "set_sorting_strategies", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +get_sorting_strategies + + Returns the sorting strategy for sorting the grasps and detected + objects returned by the "detect_object" service (see + + Detection of objects + + ). + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/get_sorting_strategies + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/get_sorting_strategies + + Request + + This service has no arguments. + + Response + + All "weight" values are 0 when the module uses the default sorting + strategy. + + The definition for the response with corresponding datatypes is: + + { + "name": "get_sorting_strategies", + "response": { + "direction": { + "pose_frame": "string", + "vector": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "weight": "float64" + }, + "preferred_orientation": { + "weight": "float64" + }, + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +reset_defaults + + Resets all parameters of the module to its default values, as + listed in above table. Also resets preferred orientation and + sorting strategies. The reset does not apply to templates and base- + plane calibration. + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/reset_defaults + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/reset_defaults + + Request + + This service has no arguments. + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "reset_defaults", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +set_region_of_interest_2d (deprecated) + + Persistently stores a 2D region of interest on the + + rc_visard NG + + . + + Details + + This service can be called as follows. + + API version 2 + + This service is not available in API version 2. Use + + set_region_of_interest_2d + + in "rc_roi_db" instead. + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/set_region_of_interest_2d + +get_regions_of_interest_2d (deprecated) + + Returns the configured 2D regions of interest with the requested + "region_of_interest_2d_ids". + + Details + + This service can be called as follows. + + API version 2 + + This service is not available in API version 2. Use + + get_regions_of_interest_2d + + in "rc_roi_db" instead. + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/get_regions_of_interest_2d + +delete_regions_of_interest_2d (deprecated) + + Deletes the configured 2D regions of interest with the requested + "region_of_interest_2d_ids". + + Details + + This service can be called as follows. + + API version 2 + + This service is not available in API version 2. Use + + delete_regions_of_interest_2d + + in "rc_roi_db" instead. + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/delete_regions_of_interest_2d + +Internal services + +The following services for configuring grasps can change in future +without notice. Setting, retrieving and deleting grasps is recommend +to be done via the Web GUI. + +set_grasp + + Persistently stores a grasp for the given object template on the + + rc_visard NG + + . All configured grasps are persistent over firmware updates and + rollbacks. + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/set_grasp + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/set_grasp + + Request + + Details for the definition of the "grasp" type are given in + + Setting of grasp points + + . + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "grasp": { + "gripper_id": "string", + "id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "priority": "int8", + "replication": { + "max_x_deg": "float64", + "min_x_deg": "float64", + "origin": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "step_x_deg": "float64" + }, + "template_id": "string" + } + } + } + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "set_grasp", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +set_all_grasps + + Replaces the list of grasps for the given object template on the + + rc_visard NG + + . + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/set_all_grasps + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/set_all_grasps + + Request + + Details for the definition of the "grasp" type are given in + + Setting of grasp points + + . + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "grasps": [ + { + "gripper_id": "string", + "id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "priority": "int8", + "replication": { + "max_x_deg": "float64", + "min_x_deg": "float64", + "origin": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "step_x_deg": "float64" + }, + "template_id": "string" + } + ], + "template_id": "string" + } + } + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "set_all_grasps", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +get_grasps + + Returns all configured grasps which have the requested "grasp_ids" + and belong to the requested "template_ids". + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/get_grasps + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/get_grasps + + Request + + If no "grasp_ids" are provided, all grasps belonging to the + requested "template_ids" are returned. If no "template_ids" are + provided, all grasps with the requested "grasp_ids" are returned. + If neither IDs are provided, all configured grasps are returned. + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "grasp_ids": [ + "string" + ], + "template_ids": [ + "string" + ] + } + } + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "get_grasps", + "response": { + "grasps": [ + { + "gripper_id": "string", + "id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "priority": "int8", + "replication": { + "max_x_deg": "float64", + "min_x_deg": "float64", + "origin": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "step_x_deg": "float64" + }, + "template_id": "string" + } + ], + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +delete_grasps + + Deletes all grasps with the requested "grasp_ids" that belong to + the requested "template_ids". + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/delete_grasps + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/delete_grasps + + Request + + If no "grasp_ids" are provided, all grasps belonging to the + requested "template_ids" are deleted. The "template_ids" list must + not be empty. + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "grasp_ids": [ + "string" + ], + "template_ids": [ + "string" + ] + } + } + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "delete_grasps", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +get_symmetric_grasps + + Returns all grasps that are symmetric to the given grasp. + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_silhouettematch/services/get_symmetric_grasps + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_silhouettematch/services/get_symmetric_grasps + + Request + + Details for the definition of the "grasp" type are given in + + Setting of grasp points + + . + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "grasp": { + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "replication": { + "max_x_deg": "float64", + "min_x_deg": "float64", + "origin": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "step_x_deg": "float64" + }, + "template_id": "string" + } + } + } + + Response + + The first grasp in the returned list is the one that was passed + with the service call. If the object template does not have an + exact symmetry, only the grasp passed with the service call will be + returned. If the object template has a continuous symmetry (e.g. a + cylindrical object), only 12 equally spaced sample grasps will be + returned. + + Details for the definition of the "grasp" type are given in + + Setting of grasp points + + . + + The definition for the response with corresponding datatypes is: + + { + "name": "get_symmetric_grasps", + "response": { + "grasps": [ + { + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "replication": { + "max_x_deg": "float64", + "min_x_deg": "float64", + "origin": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "step_x_deg": "float64" + }, + "template_id": "string" + } + ], + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +Return codes + +Each service response contains a "return_code", which consists of a +"value" plus an optional "message". A successful service returns with +a "return_code" value of "0". Negative "return_code" values indicate +that the service failed. Positive "return_code" values indicate that +the service succeeded with additional information. + +Return codes of the SilhouetteMatch module services Code +Description 0 Success -1 An invalid argument was provided -3 An +internal timeout occurred, e.g. during object detection -4 Data +acquisition took longer than allowed -7 Data could not be read or +written to persistent storage -8 Module is not in a state in which +this service can be called. E.g. detect_object cannot be called if +there is no base-plane calibration. -10 New element could not be +added as the maximum storage capacity of regions of interest or +templates has been exceeded -100 An internal error occurred -101 +Detection of the base plane failed -102 The hand-eye calibration +changed since the last base-plane calibration -104 Offset between +the base plane normal and the camera's line of sight exceeds 10 +degrees 10 The maximum storage capacity of regions of interest or +templates has been reached 11 An existing element was overwritten +100 The requested load carrier was not detected in the scene 101 +None of the detected grasps is reachable 102 The detected load +carrier is empty 103 All detected grasps are in collision 107 The +base plane was not transformed to the current camera pose, e.g. +because no robot pose was provided during base-plane calibration 108 +The template is deprecated. 109 The plane for object detection does +not fit to the load carrier, e.g. objects are below the load carrier +floor. 111 The detection result's pose could not be refined with the +point cloud because the template's outer contour is not closed. 151 +The object template has a continuous symmetry 999 Additional hints +for application development + +Template API + +For template upload, download, listing and removal, special REST-API +endpoints are provided. Templates can also be uploaded, downloaded and +removed via the Web GUI. The templates include the grasp points, if +grasp points have been configured. Up to 50 templates can be stored +persistently on the + +rc_visard NG + +. + +GET /templates/rc_silhouettematch + + Get list of all rc_silhouettematch templates. + + Template request + + GET /api/v2/templates/rc_silhouettematch HTTP/1.1 + + Template response + + HTTP/1.1 200 OK + Content-Type: application/json + + [ + { + "id": "string" + } + ] + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns array of Template) + + 404 Not Found -- node not found + + Referenced Data Models: + Template\:(Section \ref{rest_api_datamodel:sect-rest-datamodel- + template}) + +GET /templates/rc_silhouettematch/{id} + + Get a rc_silhouettematch template. If the requested content-type is + application/octet-stream, the template is returned as file. + + Template request + + GET /api/v2/templates/rc_silhouettematch/ HTTP/1.1 + + Template response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "id": "string" + } + + Parameters: + id (string) -- id of the template (required) + + Response Headers: + Content-Type -- application/json application/ubjson application + /octet-stream + + Status Codes: + 200 OK -- successful operation (returns Template) + + 404 Not Found -- node or template not found + + Referenced Data Models: + Template\:(Section \ref{rest_api_datamodel:sect-rest-datamodel- + template}) + +PUT /templates/rc_silhouettematch/{id} + + Create or update a rc_silhouettematch template. + + Template request + + PUT /api/v2/templates/rc_silhouettematch/ HTTP/1.1 + Accept: multipart/form-data application/json + + Template response + + HTTP/1.1 200 OK + Content-Type: application/json + + { + "id": "string" + } + + Parameters: + id (string) -- id of the template (required) + + Form Parameters: + file -- template or dxf file (required) + + object_height -- object height in meters, required when + uploading dxf (optional) + + units -- Units for dxf file if not embedded in dxf (one of mm, + cm, m, in, ft) (optional) + + Request Headers: + Accept -- multipart/form-data application/json + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation (returns Template) + + 400 Bad Request -- Template is not valid or max number of + templates reached + + 403 Forbidden -- forbidden, e.g. because there is no valid + license for this module. + + 404 Not Found -- node or template not found + + 413 Request Entity Too Large -- Template too large + + Referenced Data Models: + Template\:(Section \ref{rest_api_datamodel:sect-rest-datamodel- + template}) + +DELETE /templates/rc_silhouettematch/{id} + + Remove a rc_silhouettematch template. + + Template request + + DELETE /api/v2/templates/rc_silhouettematch/ HTTP/1.1 + Accept: application/json application/ubjson + + Parameters: + id (string) -- id of the template (required) + + Request Headers: + Accept -- application/json application/ubjson + + Response Headers: + Content-Type -- application/json application/ubjson + + Status Codes: + 200 OK -- successful operation + + 403 Forbidden -- forbidden, e.g. because there is no valid + license for this module. + + 404 Not Found -- node or template not found diff --git a/v24.04/en/_sources/standards.rst.txt b/v24.04/en/_sources/standards.rst.txt new file mode 100644 index 0000000..5f6e618 --- /dev/null +++ b/v24.04/en/_sources/standards.rst.txt @@ -0,0 +1,29 @@ +Applicable standards + +Interfaces + +The + +rc_visard NG + + supports the following interface standards: + +genicamlogo + +The Generic Interface for Cameras standard is the basis for plug & +play handling of cameras and devices. + +gigelogo + +GigE Vision® is an interface standard for transmitting high-speed +video and related control data over Ethernet networks. + +Approvals + + The + + rc_visard NG + + has received the following approvals: + + EC Declaration of Conformity diff --git a/v24.04/en/_sources/stereo_camera.rst.txt b/v24.04/en/_sources/stereo_camera.rst.txt new file mode 100644 index 0000000..afd724a --- /dev/null +++ b/v24.04/en/_sources/stereo_camera.rst.txt @@ -0,0 +1,611 @@ +Camera + +The camera module is a base module which is available on every + +rc_visard NG + + and is responsible for image acquisition and rectification. It +provides various parameters, e.g. to control exposure and frame rate. + +Rectification + +To simplify image processing, the camera module rectifies all camera +images based on the camera calibration. This means that lens +distortion is removed and the principal point is located exactly in +the middle of the image. + +The model of a rectified camera is described with just one value, +which is the focal length. The + +rc_visard NG + + reports a focal length factor via its various interfaces. It relates +to the image width for supporting different image resolutions. The +focal length f in pixels can be easily obtained by multiplying the +focal length factor by the image width in pixels. + +In case of a stereo camera, rectification also aligns images such that +an object point is always projected onto the same image row in both +images. The cameras' optical axes become exactly parallel. + +Viewing and downloading images + +The + +rc_visard NG + + provides the time-stamped, rectified images over the GenICam +interface (see + +Provided image streams + +). Live streams of the images are provided with reduced quality in the + +Web GUI + +. + +The Web GUI also provides the possibility to download a snapshot of +the current scene as a .tar.gz file as described in + +Downloading camera images + +. + +Parameters + +The camera software module is called "rc_camera" and is represented by +the + +Camera + + page in the + +Web GUI + +. The user can change the camera parameters there, or directly via the +REST-API ( + +REST-API interface + +) or GigE Vision ( + +GigE Vision 2.0/GenICam image interface + +). + +Note: Camera parameters cannot be changed via the Web GUI or REST- + API if + + rc_visard NG + + is used via GigE Vision. + +Parameter overview + +This module offers the following run-time parameters: + +The rc_camera module's run-time parameters Name Type +Min Max Default Description acquisition_mode string - - +Continuous Acquisition mode: [Continuous, Trigger] exp_auto bool +false true true Switching between auto and manual exposure +(deprecated, please use exp_control instead) exp_auto_average_max +float64 0.0 1.0 0.75 Maximum average intensity in Auto exposure +mode exp_auto_average_min float64 0.0 1.0 0.25 Minimum average +intensity in Auto exposure mode exp_auto_mode string - - Normal +Auto-exposure mode: [Normal, Out1High, AdaptiveOut1] exp_control +string - - Auto Exposure control mode: [Manual, Auto, HDR] +exp_height int32 0 1079 0 Height of auto exposure region. 0 for +whole image. exp_max float64 1e-06 0.023449 0.018 Maximum +exposure time in seconds in Auto exposure mode exp_offset_x int32 0 +1439 0 First column of auto exposure region exp_offset_y int32 0 +1079 0 First row of auto exposure region exp_value float64 1e-06 +0.023449 0.005 Exposure time in seconds in Manual exposure mode +exp_width int32 0 1439 0 Width of auto exposure region. 0 for +whole image. fps float64 1.0 25.0 25.0 Frames per second in +Hertz gain_value float64 0.0 48.0 0.0 Gain value in decibel if +not in Auto exposure mode gamma float64 0.1 10.0 0.7 Gamma +factor trigger_activation string - - RisingEdge Trigger +activation: [RisingEdge, FallingEdge, AnyEdge] trigger_source string +- - Software Trigger source: [Software, In1, In2] wb_auto bool +false true true Switching white balance on and off (only for color +camera) wb_ratio_blue float64 1.0 1.0 1.0 Blue to green balance +ratio if wb_auto is false (only for color camera) wb_ratio_red +float64 1.0 1.0 1.0 Red to green balance ratio if wb_auto is false +(only for color camera) + +Description of run-time parameters + + +acquisition_mode (Acquisition Mode) + + This values determines the camera acquisition mode. In "Continuous" + mode, the camera will acquire images at the specified frame rate + "fps". In "Trigger" mode, images are only acquired when the camera + receives a trigger signal. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?acquisition_mode= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_camera/parameters?acquisition_mode= + +trigger_source (Trigger Source) + + This value is only used when "acquisition_mode" is set to "Trigger" + and determines the source for the trigger. In "Software" mode a + trigger can be sent via the "rc_camera/acquisition_trigger" + service. When the "acquisition_mode" for the depth images is set to + "SingleFrame" or "SingleFrameOut1" (see + + Parameters + + ), the camera software trigger is sent automatically whenever a + depth image acquisition is triggered. The modes "In1" and "In2" are + hardware trigger modes. An image is acquired whenever a signal on + the chosen input is received. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?trigger_source= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_camera/parameters?trigger_source= + +trigger_activation (Trigger Activation) + + This value is only used when "acquisition_mode" is set to "Trigger" + and "trigger_source" is set to "In1" or "In2". It determines the + signal edge that should be used to trigger an acquisition. Possible + values are "RisingEdge", "FallingEdge" or "AnyEdge". + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?trigger_activation= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_camera/parameters?trigger_activation= + +fps (FPS) + + This value is the cameras' frame rate (fps, frames per second), + which determines the upper frequency at which depth images can be + computed. This is also the frequency at which the + + rc_visard NG + + delivers images via GigE Vision. Reducing this frequency also + reduces the network bandwidth required to transmit the images. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?fps= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_camera/parameters?fps= + + The camera always runs with 25 Hz when in "Continuous" acquisition + mode to ensure proper working of internal modules such as visual + odometry that need a constant frame rate. The user frame rate + setting is implemented by excluding frames for stereo matching and + transmission via GigE Vision to reduce bandwidth as shown in figure + + Fig. 16 + + . + + +gamma (Gamma) + + The gamma value determines the mapping of perceived light to the + brightness of a pixel. A gamma value of 1 corresponds to a linear + relationship. Lower gamma values let dark image parts appear + brighter. A value around 0.5 corresponds to human vision. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?gamma= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_camera/parameters?gamma= + +exp_control (Exposure Auto, HDR or Manual) + + The exposure control mode can be set to *Auto*, *HDR* or *Manual*. + This replaces the deprecated *exp_auto* parameter. + + *Auto*: This is the default mode in which the exposure time and + gain factor is chosen automatically to correctly expose the image. + The last automatically determined exposure and gain values are set + into "exp_value" and "gain_value" when switching auto-exposure off. + + *HDR*: The HDR mode computes high-dynamic-range images by combining + images with different exposure times to avoid under-exposed and + over-exposed areas. This decreases the frame rate and is only + suitable for static scenes. + + *Manual*: In the manual exposure mode the exposure time and gain + are kept fixed independent of the resulting image brightness. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?exp_control= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_camera/parameters?exp_control= + +exp_auto (deprecated) + + This parameter is deprecated and will be removed in a future + release. + + Please use *exp_control*. + + This value can be set to *true* for auto-exposure mode, or to + *false* for manual exposure mode. In manual exposure mode, the + chosen exposure time is kept, even if the images are overexposed or + underexposed. In auto-exposure mode, the exposure time and gain + factor is chosen automatically to correctly expose the image. The + last automatically determined exposure and gain values are set into + "exp_value" and "gain_value" when switching auto-exposure off. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?exp_auto= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_camera/parameters?exp_auto= + +exp_auto_mode (Auto Exposure Mode) + + The auto exposure mode can be set to *Normal*, *Out1High* or + *AdaptiveOut1*. These modes are relevant when the + + rc_visard NG + + is used with an external light source or projector connected to + the + + rc_visard + + 's or + + rc_viscore + + 's GPIO Out1, which can be controlled by the IOControl module ( + + IO and Projector Control + + ). + + *Normal*: All images are considered for exposure control, except if + the IOControl mode for GPIO Out1 is *ExposureAlternateActive*: then + only images where GPIO Out1 is HIGH will be considered, since these + images may be brighter in case GPIO Out1 is used to trigger an + external light source. + + *Out1High*: This exposure mode adapts the exposure time using only + images with GPIO Out1 HIGH. Images where GPIO Out1 is LOW are not + considered at all, which means, that the exposure time does not + change when only images with Out1 LOW are acquired. This mode is + recommended for using the "acquisition_mode" "SingleFrameOut1" in + the stereo matching module as described in + + Stereo Matching Parameters + + and having an external projector connected to GPIO Out1, when + changes in the brightness of the scene should only be considered + when Out1 is HIGH. This is the case, for example, when a bright + part of the robot moves through the field of view of the camera + just before a detection is triggered, which should not affect the + exposure time. + + *AdaptiveOut1*: This exposure mode uses all camera images and + tracks the exposure difference between images with GPIO Out1 LOW + and HIGH. While the IOControl mode for GPIO Out1 is LOW, the images + are under-exposed by this exposure difference to avoid over- + exposure for when GPIO Out1 triggers an external projector. The + resulting exposure difference is given as + + Out1 Reduction + + below the live images. This mode is recommended for using the + "acquisition_mode" "SingleFrameOut1" in the stereo matching module + as described in + + Stereo Matching Parameters + + and having an external projector connected to GPIO Out1, when + changes in the brightness of the scene should be considered at all + times. This is the case, for example, in applications where the + external lighting changes. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?exp_auto_mode= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_camera/parameters?exp_auto_mode= + +exp_max (Max Exposure) + + This value is the maximal exposure time in auto-exposure mode in + seconds. The actual exposure time is adjusted automatically so that + the images are exposed correctly. If the maximum exposure time is + reached, but the images are still underexposed, the + + rc_visard NG + + stepwise increases the gain to increase the images' brightness. + Limiting the exposure time is useful for avoiding or reducing + motion blur during fast movements. However, higher gain introduces + noise into the image. The best trade-off depends on the + application. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?exp_max= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_camera/parameters?exp_max= + +exp_auto_average_max (Max Brightness) and exp_auto_average_min (Min +Brightness) + + The auto-exposure tries to set the exposure time and gain factor + such that the average intensity (i.e. brightness) in the image or + exposure region is between a maximum and a minimum. The maximum + brightness will be used if there is no saturation, e.g. no over- + exposure due to bright surfaces or reflections. In case of + saturation, the exposure time and gain factor are reduced, but only + down to the minimum brightness. + + The maximum brightness has precedence over the minimum brightness + parameter. If the minimum brightness is larger than the maximum + brightness, the auto-exposure always tries to make the average + intensity equal to the maximum brightness. + + The current brightness is always shown in the status bar below the + images. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_camera/parameters?= + +exp_offset_x, exp_offset_y, exp_width, exp_height (Exposure Region) + + These values define a rectangular region in the left rectified + image for limiting the area used for computing the auto exposure. + The exposure time and gain factor of both images are chosen to + optimally expose the defined region. This can lead to over- or + underexposure of image parts outside the defined region. If either + the width or height is 0, then the whole left and right images are + considered by the auto exposure function. This is the default. + + The region is visualized in the Web GUI by a rectangle in the left + rectified image. It can be defined using the sliders or by + selecting it in the image after pressing the button "Select Region + in Image". + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_camera/parameters?= + +exp_value (Exposure) + + This value is the exposure time in manual exposure mode in + seconds. This exposure time is kept constant even if the images + are underexposed. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?exp_value= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_camera/parameters?exp_value= + +gain_value (Gain) + + This value is the gain factor in decibel that can be set in manual + exposure mode. Higher gain factors reduce the required exposure + time but introduce noise. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?gain_value= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_camera/parameters?gain_value= + +wb_auto (White Balance Auto or Manual) + + This value can be set to *true* for automatic white balancing or + *false* for manually setting the ratio between the colors using + "wb_ratio_red" and "wb_ratio_blue". The last automatically + determined ratios are set into "wb_ratio_red" and "wb_ratio_blue" + when switching automatic white balancing off. White balancing is + without function for monochrome cameras and will not be displayed + in the Web GUI in this case. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?wb_auto= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_camera/parameters?wb_auto= + +wb_ratio_blue and wb_ratio_red (Blue | Green and Red | Green) + + These values are used to set blue to green and red to green ratios + for manual white balance. White balancing is without function for + monochrome cameras and will not be displayed in the Web GUI in this + case. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/parameters?= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_camera/parameters?= + +These parameters are also available over the GenICam interface with +slightly different names and partly with different units or data types +(see + +GigE Vision 2.0/GenICam image interface + +). + +Status values + +This module reports the following status values: + +The rc_camera module's status values Name Description baseline +Stereo baseline t in meters brightness Current brightness of the +image as value between 0 and 1 color 0 for monochrome cameras, 1 for +color cameras exp Current exposure time in seconds. This value is +shown below the image preview in the Web GUI as Exposure (ms). focal +Focal length factor normalized to an image width of 1 fps Current +frame rate of the camera images in Hertz. This value is shown in the +Web GUI below the image preview as FPS (Hz). gain Current gain +factor in decibel. This value is shown in the Web GUI below the image +preview as Gain (dB). gamma Current gamma value. height Height of +the camera image in pixels. This value is shown in the Web GUI below +the image preview as the second part of Resolution (px). +out1_reduction Fraction of reduction (0.0 - 1.0) of brightness for +images with GPIO Out1=LOW in exp_auto_mode=AdaptiveOut1 or +exp_auto_mode=Out1High. This value is shown in the Web GUI below the +image preview as Out1 Reduction (%). params_override_active 1 if +parameters are temporarily overwritten by a calibration process +temp_left Temperature of the left camera sensor in degrees Celsius +temp_right Temperature of the right camera sensor in degrees Celsius +test 0 for live images and 1 for test images time Processing time +for image grabbing in seconds width Width of the camera image in +pixels. This value is shown in the Web GUI below the image preview as +the first part of Resolution (px). + +Services + +The camera module offers the following services. + +acquisition_trigger + + Triggers an image acquisition when "acquisition_mode" is set to + "Trigger" and "trigger_source" is set to "Software". + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/acquisition_trigger + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_camera/services/acquisition_trigger + + Request + + This service has no arguments. + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "acquisition_trigger", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +reset_defaults + + Restores and applies the default values for this module's + parameters ("factory reset"). + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_camera/services/reset_defaults + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_camera/services/reset_defaults + + Request + + This service has no arguments. + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "reset_defaults", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } diff --git a/v24.04/en/_sources/stereo_matching.rst.txt b/v24.04/en/_sources/stereo_matching.rst.txt new file mode 100644 index 0000000..80456a1 --- /dev/null +++ b/v24.04/en/_sources/stereo_matching.rst.txt @@ -0,0 +1,892 @@ +Stereo matching + +The stereo matching module is a base module which is available on +every + +rc_visard NG + + and uses the rectified stereo-image pair to compute disparity, error, +and confidence images. It also offers a service to measure depth in a +specified image region (see + +Services + +). + +To compute full resolution disparity, error and confidence images, an +additional StereoPlus + +license + + is required. This license is included in every + +rc_visard NG + + purchased after 31.01.2019. + +Computing disparity images + +After rectification, an object point is guaranteed to be projected +onto the same pixel row in both left and right image. That point's +pixel column in the right image is always lower than or equal to the +same point's pixel column in the left image. The term disparity +signifies the difference between the pixel columns in the right and +left images and expresses the depth or distance of the object point +from the camera. The disparity image stores the disparity values of +all pixels in the left camera image. + +The larger the disparity, the closer the object point. A disparity of +0 means that the projections of the object point are in the same image +column and the object point is at infinite distance. Often, there are +pixels for which disparity cannot be determined. This is the case for +occlusions that appear on the left sides of objects, because these +areas are not seen from the right camera. Furthermore, disparity +cannot be determined for textureless areas. Pixels for which the +disparity cannot be determined are marked as invalid with the special +disparity value of 0. To distinguish between invalid disparity +measurements and disparity measurements of 0 for objects that are +infinitely far away, the disparity value for the latter is set to the +smallest possible disparity value above 0. + +To compute disparity values, the stereo matching algorithm has to find +corresponding object points in the left and right camera images. These +are points that represent the same object point in the scene. For +stereo matching, the + +rc_visard NG + + uses + +SGM + + ( + +Semi-Global Matching + +), which offers quick run times and great accuracy, especially at +object borders, fine structures, and in weakly textured areas. + +A key requirement for any stereo matching method is the presence of +texture in the image, i.e., image-intensity changes due to patterns or +surface structure within the scene. In completely untextured regions +such as a flat white wall without any structure, disparity values can +either not be computed or the results are erroneous or have low +confidence (see + +Confidence and error images + +). The texture in the scene should not be an artificial, repetitive +pattern, since those structures may lead to ambiguities and hence to +wrong disparity measurements. + +When working with poorly textured objects or in untextured +environments, a static artificial texture can be projected onto the +scene using an external pattern projector. This pattern should be +random-like and not contain repetitive structures. The + +rc_visard NG + + provides the IOControl module (see + +IO and Projector Control + +) as optional software module which can control a pattern projector +connected to the sensor. + +Computing depth images and point clouds + +The following equations show how to compute an object point's actual +3D coordinates P_x, P_y, P_z in the camera coordinate frame from the +disparity image's pixel coordinates p_{x}, p_{y} and the disparity +value d in pixels: + + P_x&=\frac{p_x \cdot t}{d}\\ P_y&=\frac{p_y \cdot t}{d}\\ + P_z&=\frac{f \cdot t}{d}, + +where f is the focal length after rectification in pixels and t is the +stereo baseline in meters, which was determined during calibration. +These values are also transferred over the GenICam interface (see + +Custom GenICam features of the rc_visard NG + +). + +Note: The + + rc_visard NG + + 's camera coordinate frame is defined as shown in + + Coordinate frames + + . + +Note: The + + rc_visard NG + + reports a focal length factor via its various interfaces. It + relates to the image width for supporting different image + resolutions. The focal length f in pixels can be easily obtained by + multiplying the focal length factor by the image width in pixels. + +Please note that equations + +(1) + + assume that the coordinate frame is centered in the principal point +that is typically in the center of the image, and p_{x}, p_{y} refer +to the middle of the pixel, i.e. by adding 0.5 to the integer pixel +coordinates. The following figure shows the definition of the image +coordinate frame. + + +The same equations, but with the corresponding GenICam parameters are +given in + +Image stream conversions + +. + +The set of all object points computed from the disparity image gives +the point cloud, which can be used for 3D modeling applications. The +disparity image is converted into a depth image by replacing the +disparity value in each pixel with the value of P_z. + +Note: Roboception provides software and examples for receiving + disparity images from the + + rc_visard NG + + via GigE Vision and computing depth images and point clouds. See + + http://www.roboception.com/download + + . + +Confidence and error images + +For each disparity image, additionally an error image and a confidence +image are provided, which give uncertainty measures for each disparity +value. These images have the same resolution and the same frame rate +as the disparity image. The error image contains the disparity error +d_{eps} in pixels corresponding to the disparity value at the same +image coordinates in the disparity image. The confidence image +contains the corresponding confidence value c between 0 and 1. The +confidence is defined as the probability of the true disparity value +being within the interval of three times the error around the measured +disparity d, i.e., [d-3d_{eps}, d+3d_{eps}]. Thus, the disparity image +with error and confidence values can be used in applications requiring +probabilistic inference. The confidence and error values corresponding +to an invalid disparity measurement will be 0. + +The disparity error d_{eps} (in pixels) can be converted to a depth +error z_{eps} (in meters) using the focal length f (in pixels), the +baseline t (in meters), and the disparity value d (in pixels) of the +same pixel in the disparity image: + + z_{eps}=\frac{d_{eps}\cdot f\cdot t}{d^2}. + +Combining equations + +(1) + + and + +(2) + + allows the depth error to be related to the depth: + + z_{eps}=\frac{d_{eps}\cdot{P_z}^2}{f\cdot t}. + +With the focal lengths and baselines of the different camera models +and the typical combined calibration and stereo matching error d_{eps} +of 0.25 pixels, the depth accuracy can be visualized as shown below. + + +Viewing and downloading images and point clouds + +The + +rc_visard NG + + provides time-stamped disparity, error, and confidence images over +the GenICam interface (see + +Provided image streams + +). Live streams of the images are provided with reduced quality on the + +Depth Image + + page of the + +Web GUI + +. + +The Web GUI also provides the possibility to download a snapshot of +the current scene containing the depth, error and confidence images, +as well as a point cloud in ply format as described in + +Downloading depth images and point clouds + +. + +Parameters + +The stereo matching module is called "rc_stereomatching" in the REST- +API and it is represented by the + +Depth Image + + page in the + +Web GUI + +. The user can change the stereo matching parameters there, or use the +REST-API ( + +REST-API interface + +) or GigE Vision ( + +GigE Vision 2.0/GenICam image interface + +). + +Parameter overview + +This module offers the following run-time parameters: + +The rc_stereomatching module's run-time parameters Name +Type Min Max Default Description acquisition_mode string - - +Continuous Acquisition mode: [Continuous, SingleFrame, +SingleFrameOut1] double_shot bool false true false Combination +of disparity images from two subsequent stereo image pairs +exposure_adapt_timeout float64 0.0 2.0 0.0 Maximum time in +seconds to wait after triggering in SingleFrame modes until auto +exposure has finished adjustments fill int32 0 4 3 Disparity +tolerance for hole filling in pixels maxdepth float64 0.1 100.0 +100.0 Maximum depth in meters maxdeptherr float64 0.01 100.0 +100.0 Maximum depth error in meters minconf float64 0.5 1.0 0.5 +Minimum confidence mindepth float64 0.1 100.0 0.1 Minimum depth +in meters quality string - - High Quality: [Low, Medium, High, +Full]. Full requires 'stereo_plus' license. seg int32 0 4000 200 +Minimum size of valid disparity segments in pixels smooth bool +false true true Smoothing of disparity image (requires +'stereo_plus' license) static_scene bool false true false +Accumulation of images in static scenes to reduce noise + +Description of run-time parameters + +Each run-time parameter is represented by a row on the Web GUI's + +Depth Image + + page. The name in the Web GUI is given in brackets behind the +parameter name and the parameters are listed in the order they appear +in the Web GUI: + + +acquisition_mode (Acquisition Mode) + + The acquisition mode can be set to "Continuous", "SingleFrame" ( + + Single + + ) or "SingleFrameOut1" ( + + Single + Out1 + + ). The first one is the default, which performs stereo matching + continuously according to the user defined frame rate and the + available computation resources. The two other modes perform + stereo matching upon each click of the Acquire button. The + *Single + Out1* mode additionally controls an external projector + that is connected to GPIO Out1 ( + + IO and Projector Control + + ). In this mode, "out1_mode" of the IOControl module is + automatically set to "ExposureAlternateActive" upon each trigger + call and reset to "Low" after receiving images for stereo + matching. + + Note: The "Single + Out1" mode can only change the "out1_mode" + if the IOControl license is available on the + + rc_visard NG + + . + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?acquisition_mode= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?acquisition_mode= + +exposure_adapt_timeout (Exposure Adaptation Timeout) + + The exposure adaptation timeout gives the maximum time in + seconds that the system will wait after triggering an image + acquisition until auto exposure has found the optimal exposure + time. This timeout is only used in "SingleFrame" ( + + Single + + ) or "SingleFrameOut1" ( + + Single + Out1 + + ) acquisition mode with auto exposure active. This value should + be increased in applications with changing lighting conditions, + when images are under- oder overexposed and the resulting + disparity images are too sparse. In these cases multiple images + are acquired until the auto-exposure mode has adjusted or the + timeout is reached, and only then the actual image acquisition + is triggered. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?exposure_adapt_timeout= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?exposure_adapt_timeout= + +quality (Quality) + + Disparity images can be computed in different resolutions: + "Full" (full image resolution), "High" (half of the full image + resolution), "Medium" (quarter of the full image resolution) and + "Low" (sixth of the full image resolution). Full resolution + matching ("Full") is only possible with a valid StereoPlus + license. The lower the resolution, the higher the frame rate of + the disparity image. Please note that the frame rate of the + disparity, confidence, and error images will always be less than + or equal to the camera frame rate. In case the projector is in + "ExposureAlternateActive" mode, the frame rate of the images can + be at most half of the camera frame rate. + + A 25 Hz frame rate can be achieved only at medium and low + resolution. + + If full resolution is selected, the depth range is internally + limited due to limited on-board memory resources. It is + recommended to adjust "mindepth" and "maxdepth" to the depth + range that is required by the application. + + Depth image resolutions depending on the chosen quality + Quality Full High Medium Low Resolution (pixel) 1440 x + 1080 720 x 540 360 x 270 240 x 180 + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?quality= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?quality= + +double_shot (Double-Shot) + + Enabling this option will lead to denser disparity images, but will + increase processing time. + + For scenes recorded with a projector in "Single + Out1" acquisition + mode, or in continuous acquisition mode with the projector in + "ExposureAlternateActive" mode, holes caused by reflections of the + projector are filled with depth information computed from the + images without projector pattern. In this case, the "double_shot" + parameter must only be enabled if the scene does not change during + the acquisition of the images. + + For all other scenes, holes are filled with depth information + computed from a downscaled version of the same image. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?double_shot= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?double_shot= + +static_scene (Static) + + This option averages 8 consecutive camera images before matching. + This reduces noise, which improves the stereo matching result. + However, the latency increases significantly. The timestamp of the + first image is taken as timestamp of the disparity image. This + option only affects matching in full or high quality. It must only + be enabled if the scene does not change during the acquisition of + the 8 images. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?static_scene= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?static_scene= + +mindepth (Minimum Distance) + + The minimum distance is the smallest distance from the camera at + which measurements should be possible. Larger values implicitly + reduce the disparity range, which also reduces the computation + time. The minimum distance is given in meters. + + Depending on the capabilities of the sensor, the actual minimum + distance can be higher than the user setting. The actual minimum + distance will be reported in the status values. + + In "quality" mode "Full", the actual minimum distance can also be + higher than the user-defined minimum distance due to memory + limitations. In this case, lowering the maximum distance helps to + reduce the actual minimum distance. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?mindepth= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?mindepth= + +maxdepth (Maximum Distance) + + The maximum distance is the largest distance from the camera at + which measurements should be possible. Pixels with larger distance + values are set to invalid in the disparity image. Setting this + value to its maximum permits values up to infinity. The maximum + distance is given in meters. + + In "quality" mode "Full", the actual minimum distance can be higher + than the user-defined minimum distance due to memory limitations. + In this case, lowering the maximum distance helps to reduce the + actual minimum distance. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?maxdepth= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?maxdepth= + +smooth (Smoothing) + + This option activates advanced smoothing of disparity values. It is + only available with a valid StereoPlus license. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?smooth= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?smooth= + +fill (Fill-in) + + This option is used to fill holes in the disparity image by + interpolation. The fill-in value is the maximum allowed disparity + step on the border of the hole. Larger fill-in values can decrease + the number of holes, but the interpolated values can have larger + errors. At most 5% of pixels are interpolated. Interpolation of + small holes is preferred over interpolation of larger holes. The + confidence for the interpolated pixels is set to a low value of + 0.5. A fill-in value of 0 switches hole filling off. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?fill= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?fill= + +seg (Segmentation) + + The segmentation parameter is used to set the minimum number of + pixels that a connected disparity region in the disparity image + must fill. Isolated regions that are smaller are set to invalid in + the disparity image. The value is related to the high quality + disparity image with half resolution and does not have to be scaled + when a different quality is chosen. Segmentation is useful for + removing erroneous disparities. However, larger values may also + remove real objects. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?seg= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?seg= + +minconf (Minimum Confidence) + + The minimum confidence can be set to filter potentially false + disparity measurements. All pixels with less confidence than the + chosen value are set to invalid in the disparity image. + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?minconf= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?minconf= + +maxdeptherr (Maximum Depth Error) + + The maximum depth error is used to filter measurements that are too + inaccurate. All pixels with a larger depth error than the chosen + value are set to invalid in the disparity image. The maximum depth + error is given in meters. The depth error generally grows + quadratically with an object's distance from the camera (see + + Confidence and error images + + ). + + Via the REST-API, this parameter can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?maxdeptherr= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_stereomatching/parameters?maxdeptherr= + +The same parameters are also available over the GenICam interface with +slightly different names and partly with different data types (see + +GigE Vision 2.0/GenICam image interface + +). + +Status values + +This module reports the following status values: + +The rc_stereomatching module's status values Name Description +fps Actual frame rate of the disparity, error, and confidence images. +This value is shown in the Web GUI below the image preview as FPS +(Hz). latency Time in seconds between image acquisition and +publishing of disparity image width Current width of the disparity, +error, and confidence images in pixels height Current height of the +disparity, error, and confidence images in pixels mindepth Actual +minimum working distance in meters maxdepth Actual maximum working +distance in meters time_matching Time in seconds for performing +stereo matching using SGM on the GPU time_postprocessing Time in +seconds for postprocessing the matching result on the CPU +reduced_depth_range Indicates whether the depth range is reduced due +to computation resources + +Services + +The stereo matching module offers the following services. + +acquisition_trigger + + Signals the module to perform stereo matching of the next available + images, if the parameter "acquisition_mode" is set to "SingleFrame" + or "SingleFrameOut1". + + Details + + An error is returned if the "acquisition_mode" is set to + "Continuous". + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/services/acquisition_trigger + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_stereomatching/services/acquisition_trigger + + Request + + This service has no arguments. + + Response + + Possible return codes are shown below. + + Possible return codes of the acquisition_trigger service call. + Code Description 0 Success -8 Triggering is only possible in + SingleFrame acquisition mode 101 Trigger is ignored, because + there is a trigger call pending 102 Trigger is ignored, because + there are no subscribers + + The definition for the response with corresponding datatypes is: + + { + "name": "acquisition_trigger", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +measure_depth + + Computes the average, minimum and maximum depth in a given region + of interest, which can optionally be subdivided into cells. + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/services/measure_depth + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_stereomatching/services/measure_depth + + Request + + Optional arguments: + + "region_of_interest_2d_id" is the ID of the 2D region of + interest (see + + RoiDB + + ) that will be used for the depth measurements. + + "region_of_interest_2d" is an alternative on-the-fly definition + of the region of interest for the depth measurements. This + region of interest will be ignored if a + "region_of_interest_2d_id" is given. The region of interest is + always defined on the camera image with full resolution, where + "offset_x" and "offset_y" are the pixel coordinates of the upper + left corner of the rectangular region of interest, and "width" + and "height" are the width and height of it in pixels. Default + is a region of interest covering the whole image. + + "cell_count" is the number of cells in x and y direction into + which the region of interest is divided. If not given, a cell + count of 0, 0 is assumed and only the overall values will be + computed. The total cell count computed as product of the x and + y values must not exceed 100. + + "data_acquisition_mode": if set to "CAPTURE_NEW" (default), a + new image dataset will be used for the measurement. If set to + "USE_LAST", the previous dataset will be used for the + measurement. + + "pose_frame" controls whether the coordinates of the depth + measurement are returned in the "camera" or "external" frame, if + a hand-eye calibration is available (see + + Hand-eye calibration + + ). The default is "camera". + + Potentially required arguments: + + "robot_pose" is the pose of the robot at the time of the depth + measurement. It is required when the external pose frame is used + and the camera is robot mounted. + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "cell_count": { + "x": "uint32", + "y": "uint32" + }, + "data_acquisition_mode": "string", + "pose_frame": "string", + "region_of_interest_2d": { + "height": "uint32", + "offset_x": "uint32", + "offset_y": "uint32", + "width": "uint32" + }, + "region_of_interest_2d_id": "string", + "robot_pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + } + } + } + + Response + + return_code values of the measure_depth service call value + Description 0 measurement successful -1 an invalid argument was + given + + "cells" contains the depth measurements of all requested cells. The + cells are always ordered from left to right and top to bottom in + image coordinates. + + "overall" contains the depth measurements of the full region of + interest. + + "coverage" is a number between 0 and 1 which reflects the fraction + of valid depth measurements inside the respective cell. A coverage + of 0 means that the cell is invalid. + + "min_z" and "max_z" return the 3D coordinate of the point in the + cell with the minimum and maximum depth value, respectively. The + depth value is the z coordinate in the camera coordinate system. + + For "mean_z", the x and y coordinates define the point in the + middle of the cell and the z coordinate is determined by the + average of all depth value measurements in the cell. + + "region_of_interest_2d" returns the definition of the requested + region of interest for the depth measurement. + + If "pose_frame" is "external", then the x, y and z coordinates are + returned in the robot coordinate system. + + The definition for the response with corresponding datatypes is: + + { + "name": "measure_depth", + "response": { + "cell_count": { + "x": "uint32", + "y": "uint32" + }, + "cells": [ + { + "coverage": "float64", + "max_z": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "mean_z": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "min_z": { + "x": "float64", + "y": "float64", + "z": "float64" + } + } + ], + "overall": { + "coverage": "float64", + "max_z": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "mean_z": { + "x": "float64", + "y": "float64", + "z": "float64" + }, + "min_z": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "region_of_interest_2d": { + "height": "uint32", + "offset_x": "uint32", + "offset_y": "uint32", + "width": "uint32" + }, + "return_code": { + "message": "string", + "value": "int16" + }, + "timestamp": { + "nsec": "int32", + "sec": "int32" + } + } + } + +reset_defaults + + Restores and applies the default values for this module's + parameters ("factory reset"). + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes/rc_stereomatching/services/reset_defaults + + API version 1 (deprecated) + + PUT http:///api/v1/nodes/rc_stereomatching/services/reset_defaults + + Request + + This service has no arguments. + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "reset_defaults", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } diff --git a/v24.04/en/_sources/tagdetect.rst.txt b/v24.04/en/_sources/tagdetect.rst.txt new file mode 100644 index 0000000..a6af9ff --- /dev/null +++ b/v24.04/en/_sources/tagdetect.rst.txt @@ -0,0 +1,791 @@ +TagDetect + +Introduction + +The TagDetect modules are optional on-board modules of the + +rc_visard NG + + and require separate + +licenses + + to be purchased. The licenses are included in every + +rc_visard NG + + purchased after 01.07.2020. + +The TagDetect modules run on board the + +rc_visard NG + + and allow the detection of 2D matrix codes and tags. Currently, there +are TagDetect modules for *QR codes* and *AprilTags*. The modules, +furthermore, compute the position and orientation of each tag in the +3D camera coordinate system, making it simple to manipulate a tag with +a robot or to localize the camera with respect to a tag. + +Tag detection is made up of three steps: + +Tag reading on the 2D image pair (see Tag reading, Section +\ref{tagdetect:sect-tag-reading}). + +Estimation of the pose of each tag (see Pose estimation, Section +\ref{tagdetect:sect-tag-pose-estimation}). + +Re-identification of previously seen tags (see Tag re-identification, +Section \ref{tagdetect:sect-tag-re-identification}). + +In the following, the two supported tag types are described, followed +by a comparison. + +QR code + + +QR codes are two-dimensional matrix codes that contain arbitrary user- +defined data. There is wide support for decoding of QR codes on +commodity hardware such as smartphones. Also, many online and offline +tools are available for the generation of such codes. + +The "pixels" of a QR code are called *modules*. Appearance and +resolution of QR codes change with the amount of data they contain. +While the special patterns in the three corners are always 7 modules +wide, the number of modules between them increases the more data is +stored. The lowest-resolution QR code is of size 21x21 modules and can +contain up to 152 bits. + +Even though many QR code generation tools support generation of +specially designed QR codes (e.g., containing a logo, having round +corners, or having dots as modules), a reliable detection of these +tags by the + +rc_visard NG + +'s TagDetect module is not guaranteed. The same holds for QR codes +which contain characters that are not part of regular ASCII. + +AprilTag + + +AprilTags are similar to QR codes. However, they are specifically +designed for robust identification at large distances. As for QR +codes, we will call the tag pixels *modules*. + +Fig. 22 + + shows how AprilTags are structured. They have a mandatory white and +black border, each one module wide. The tag families 16h5, 25h9, 36h10 +and 36h11 are surrounded by this border and carry a variable amount of +data modules in the center. For tag family 41h12, the black and white +border is shifted towards the inside and the data modules are in the +center and also at the border of the tags. Other than QR codes, +AprilTags do not contain any user-defined information but are +identified by a predefined + +family + + and + +ID + +. The tags in + +Fig. 22 + + for example are of family 16h5, 36h11 and 41h12 have id 0, 11 and 0, +respectively. All supported families are shown in + +Table 16 + +. + +AprilTag families Family Number of tag IDs Recommended 16h5 +30 - 25h9 35 o 36h10 2320 o 36h11 587 + 41h12 2115 + + +For each family, the number before the "h" states the number of data +modules contained in the tag: While a 16h5 tag contains 16 (4x4) data +modules ((c) in + +Fig. 22 + +), a 36h11 tag contains 36 (6x6) modules and a 41h12 tag contains 41 +(3x3 inner + 4x8 outer) modules. The number behind the "h" refers to +the Hamming distance between two tags of the same family. The higher, +the more robust is the detection, but the fewer individual tag IDs are +available for the same number of data modules (see + +Table 16 + +). + +The advantage of fewer modules (as for 16h5 compared to 36h11) is the +lower resolution of the tag. Hence, each tag module is larger and the +tag therefore can be detected from a larger distance. This, however, +comes at a price: Firstly, fewer data modules lead to fewer individual +tag IDs. Secondly, and more importantly, detection robustness is +significantly reduced due to a higher false positive rate; i.e, tags +are mixed up or nonexistent tags are detected in random image texture +or noise. The 41h12 family has its border shifted towards the inside, +which gives it more data modules at a lower number of total modules +compared to the 36h11 family. + +For these reasons we recommend using the 41h12 and 36h11 families and +highly discourage the use of the 16h5 family. The latter family should +only be used if a large detection distance really is necessary for an +application. However, the maximum detection distance increases only by +approximately 25% when using a 16h5 tag instead of a 36h11 tag. + +Pre-generated AprilTags can be downloaded at the AprilTag project +website ( + +https://april.eecs.umich.edu/software/apriltag.html + +). There, each family consists of multiple PNGs containing single +tags. Each pixel in the PNGs corresponds to one AprilTag module. When +printing the tags of the families 36h11, 36h10, 25h9 and 16h5 special +care must be taken to also include the white border around the tag +that is contained in the PNG (see (a) in + +Fig. 22 + +). Moreover, all tags should be scaled to the desired printing size +without any interpolation, so that the sharp edges are preserved. + +Comparison + +Both QR codes and AprilTags have their up and down sides. While QR +codes allow arbitrary user-defined data to be stored, AprilTags have a +pre-defined and limited set of tags. On the other hand, AprilTags have +a lower resolution and can therefore be detected at larger distances. +Moreover, the continuous white to black border in AprilTags allow for +more precise pose estimation. + +Note: If user-defined data is not required, AprilTags should be + preferred over QR codes. + +Tag reading + +The first step in the tag detection pipeline is reading the tags on +the 2D image pair. This step takes most of the processing time and its +precision is crucial for the precision of the resulting tag pose. To +control the speed of this step, the "quality" parameter can be set by +the user. It results in a downscaling of the image pair before reading +the tags. "High" yields the largest maximum detection distance and +highest precision, but also the highest processing time. "Low" results +in the smallest maximum detection distance and lowest precision, but +processing requires less than half of the time. "Medium" lies in +between. Please note that this quality parameter has no relation to +the quality parameter of + +Stereo matching + +. + + +The maximum detection distance z at quality "High" can be approximated +by using the following formulae, + + z = \frac{f s}{p}, + + s = \frac{t}{r}, + +where f is the + +focal length + + in pixels and s is the size of a module in meters. s can easily be +calculated by the latter formula, where t is the size of the tag in +meters and r is the width of the code in modules (for AprilTags +without the white border). + +Fig. 23 + + visualizes these variables. p denotes the number of image pixels per +module required for detection. It is different for QR codes and +AprilTags. Moreover, it varies with the tag's angle to the camera and +illumination. Approximate values for robust detection are: + +AprilTag: p=5 pixels/module + +QR code: p=6 pixels/module + +The following tables give sample maximum distances for different +situations, assuming a focal length of 1075 pixels and the parameter +"quality" to be set to "High". + +Maximum detection distance examples for AprilTags with a width +of t=4 cm AprilTag family Tag width Maximum distance 36h11 +(recommended) 8 modules 1.1 m 16h5 6 modules 1.4 m 41h12 +(recommended) 5 modules 1.7 m + +Maximum detection distance examples for QR codes with a width +of t=8 cm Tag width Maximum distance 29 modules 0.49 m 21 +modules 0.70 m + +Pose estimation + +For each detected tag, the pose of this tag in the camera coordinate +frame is estimated. A requirement for pose estimation is that a tag is +fully visible in the left and right camera image. The coordinate frame +of the tag is aligned as shown below. + + +The z-axis is pointing "into" the tag. Please note that for AprilTags, +although having the white border included in their definition, the +coordinate system's origin is placed exactly at the transition from +the white to the black border. Since AprilTags do not have an obvious +orientation, the origin is defined as the upper left corner in the +orientation they are pre-generated in. + +During pose estimation, the tag's size is also estimated, while +assuming the tag to be square. For QR codes, the size covers the full +tag. For AprilTags, the size covers only the part inside the border +defined by the transition from the black to the white border modules, +hence ignoring the outermost white border for the tag families 16h5, +25h9, 36h10 and 36h11. + +The user can also specify the approximate size (\pm 10\%) of tags. All +tags not matching this size constraint are automatically filtered out. +This information is further used to resolve ambiguities in pose +estimation that may arise if multiple tags with the same ID are +visible in the left and right image and these tags are aligned in +parallel to the image rows. + +Note: For best pose estimation results one should make sure to + accurately print the tag and to attach it to a rigid and as planar + as possible surface. Any distortion of the tag or bump in the + surface will degrade the estimated pose. + +Note: It is highly recommended to set the approximate size of a tag. + Otherwise, if multiple tags with the same ID are visible in the left + or right image, pose estimation may compute a wrong pose if these + tags have the same orientation and are approximately aligned in + parallel to the image rows. However, even if the approximate size is + not given, the TagDetect modules try to detect such situations and + filter out affected tags. + +Below tables give approximate precisions of the estimated poses of +AprilTags. We distinguish between lateral precision (i.e., in x and y +direction) and precision in z direction. It is assumed that "quality" +is set to "High", that the camera's viewing direction is parallel to +the tag's normal and that the images are well exposed and do not +suffer from motion blur. The size of a tag does not have a significant +effect on the lateral or z precision; however, in general, larger tags +improve precision. With respect to precision of the orientation +especially around the x and y axes, larger tags clearly outperform +smaller ones. + +Approximate position precision for AprilTag detections with High +quality in an ideal scenario Distance rc_visard NG 160 - +lateral rc_visard NG 160 - z 0.5 m 0.05 mm 0.3 mm 1.0 m 0.15 mm +1.4 mm 2.0 m 0.5 mm 3.7 mm + +Approximate orientation precision for AprilTag detections with High +quality in an ideal scenario for different tag sizes Distance +60 x 60 mm 120 x 120 mm 0.5 m 0.2° -- 1.0 m 0.8° 0.3° 2.0 m +2.0° 0.8° 3.0 m -- 1.8° + +Tag re-identification + +Each tag has an ID; for AprilTags it is the + +family + + plus + +tag ID + +, for QR codes it is the contained data. However, these IDs are not +unique, since the same tag may appear multiple times in a scene. + +For distinction of these tags, the TagDetect modules also assign each +detected tag a unique identifier. To help the user identifying an +identical tag over multiple detections, tag detection tries to re- +identify tags; if successful, a tag is assigned the same unique +identifier again. + +Tag re-identification compares the positions of the corners of the +tags in the camera coordinate frame to find identical tags. Tags are +assumed identical if they did not or only slightly move in that frame. + +By setting the "max_corner_distance" threshold, the user can specify +how much a tag is allowed move in the static coordinate frame between +two detections to be considered identical. This parameter defines the +maximum distance between the corners of two tags, which is shown in + +Fig. 25 + +. The Euclidean distances of all four corresponding tag corners are +computed in 3D. If none of these distances exceeds the threshold, the +tags are considered identical. + + +After a number of tag detection runs, previously detected tag +instances will be discarded if they are not detected in the meantime. +This can be configured by the parameter "forget_after_n_detections". + +Hand-eye calibration + +In case the camera has been calibrated to a robot, the TagDetect +module can automatically provide poses in the robot coordinate frame. +For the TagDetect node's + +Services + +, the frame of the output poses can be controlled with the +"pose_frame" argument. + +Two different "pose_frame" values can be chosen: + +Camera frame (camera). All poses provided by the module are in the +camera frame. + +External frame (external). All poses provided by the module are in the +external frame, configured by the user during the hand-eye calibration +process. The module relies on the on-board Hand-eye calibration +module\:(Section \ref{handeye_calibration:sect-handeye-calibration}) +to retrieve the sensor mounting (static or robot mounted) and the +hand-eye transformation. If the sensor mounting is static, no further +information is needed. If the sensor is robot-mounted, the robot_pose +is required to transform poses to and from the external frame. + +All "pose_frame" values that are not "camera" or "external" are +rejected. + +Parameters + +There are two separate modules available for tag detection, one for +detecting AprilTags and one for QR codes, named "rc_april_tag_detect" +and "rc_qr_code_detect", respectively. Apart from the module names +they share the same interface definition. + +In addition to the + +REST-API interface + +, the TagDetect modules provide pages on the Web GUI under Modules ‣ +AprilTag and Modules ‣ QR Code, on which they can be tried out and +configured manually. + +In the following, the parameters are listed based on the example of +"rc_qr_code_detect". They are the same for "rc_april_tag_detect". + +This module offers the following run-time parameters: + +The rc_qr_code_detect module's run-time parameters Name +Type Min Max Default Description detect_inverted_tags bool +false true false Detect tags with black and white exchanged +forget_after_n_detections int32 1 1000 30 Number of detection +runs after which to forget about a previous tag during tag re- +identification max_corner_distance float64 0.001 0.01 0.005 +Maximum distance of corresponding tag corners in meters during tag re- +identification quality string - - High Quality of tag detection: +[Low, Medium, High] use_cached_images bool false true false Use +most recently received image pair instead of waiting for a new pair + +Via the REST-API, these parameters can be set as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes//parameters/parameters?= + + API version 1 (deprecated) + + PUT http:///api/v1/nodes//parameters?= + +Status values + +The TagDetect modules reports the following status values: + +The rc_qr_code_detect and rc_april_tag_detect module's status values +Name Description data_acquisition_time Time in seconds required to +acquire image pair last_timestamp_processed The timestamp of the +last processed image pair processing_time Processing time of the +last detection in seconds state The current state of the node + +The reported "state" can take one of the following values. + +Possible states of the TagDetect modules State name Description +IDLE The module is idle. RUNNING The module is running and ready +for tag detection. FATAL A fatal error has occurred. + +Services + +The TagDetect modules implement a state machine for starting and +stopping. The actual tag detection can be triggered via "detect". + +The user can explore and call the "rc_qr_code_detect" and +"rc_april_tag_detect" modules' services, e.g. for development and +testing, using the + +REST-API interface + + or the + +rc_visard NG + + +Web GUI + +. + +detect + + Triggers a tag detection. + + Details + + Depending on the "use_cached_images" parameter, the module will + use the latest received image pair (if set to true) or wait for + a new pair that is captured after the service call was triggered + (if set to false, this is the default). Even if set to true, tag + detection will never use one image pair twice. + + It is recommended to call "detect" in state "RUNNING" only. It + is also possible to be called in state "IDLE", resulting in an + auto-start and stop of the module. This, however, has some + drawbacks: First, the call will take considerably longer; + second, tag re-identification will not work. It is therefore + highly recommended to manually start the module before calling + "detect". + + Tags might be omitted from the "detect" response due to several + reasons, e.g., if a tag is visible in only one of the cameras or + if pose estimation did not succeed. These filtered-out tags are + noted in the log, which can be accessed as described in + + Downloading log files + + . + + A visualization of the latest detection is shown on the Web GUI + tabs of the TagDetect modules. Please note that this + visualization will only be shown after calling the detection + service at least once. On the Web GUI, one can also manually try + the detection by clicking the Detect button. + + Due to changes in system time on the + + rc_visard NG + + there might occur jumps of timestamps, forward as well as + backward (see + + Time synchronization + + ). Forward jumps do not have an effect on the TagDetect module. + Backward jumps, however, invalidate already received images. + Therefore, in case a backwards time jump is detected, an error + of value -102 will be issued on the next "detect" call, also to + inform the user that the timestamps included in the response + will jump back. This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes//services/detect + + API version 1 (deprecated) + + PUT http:///api/v1/nodes//services/detect + + Request + + Optional arguments: + + "tags" is the list of tag IDs that the TagDetect module + should detect. For QR codes, the ID is the contained data. + For AprilTags, it is *"_"*, so, e.g., for a tag + of family 36h11 and ID 5, it is *"36h11_5"*. Naturally, the + AprilTag module can only be triggered for AprilTags, and the + QR code module only for QR codes. + + The "tags" list can also be left empty. In that case, all + detected tags will be returned. This feature should be used + only during development and debugging of an application. + Whenever possible, the concrete tag IDs should be listed, on + the one hand avoiding some false positives, on the other hand + speeding up tag detection by filtering tags not of interest. + + For AprilTags, the user can not only specify concrete tags + but also a complete family by setting the ID to "", + so, e.g., "36h11". All tags of this family will then be + detected. It is further possible to specify multiple complete + tag families or a combination of concrete tags and complete + tag families; for instance, triggering for "36h11", "25h9_3", + and "36h10" at the same time. + + In addition to the ID, the approximate size (\pm 10\%) of a + tag can be set with the "size" parameter. As described in + + Pose estimation + + , this information helps to resolve ambiguities in pose + estimation that may arise in certain situations and can be + used to filter out tags not fulfilling the given size + constraint. + + The "tags" list is OR-connected. All tags will be returned + that match any of "id"-"size" pair elements in the "tags" + list. + + "pose_frame" controls whether the poses of the detected tags + are returned in the camera or external frame, as detailed in + + Hand-eye calibration + + . The default is "camera". + + The definition for the request arguments with corresponding + datatypes is: + + { + "args": { + "pose_frame": "string", + "robot_pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "tags": [ + { + "id": "string", + "size": "float64" + } + ] + } + } + + Response + + "timestamp" is set to the timestamp of the image pair the tag + detection ran on. + + "tags" contains all detected tags. + + "id" is the ID of the tag, similar to "id" in the request. + + "instance_id" is the random unique identifier of the tag + assigned by tag re-identification. + + "pose" contains "position" and "orientation". The orientation is + in quaternion format. + + "pose_frame" is set to the coordinate frame above pose refers + to. It will either be "camera" or "external". + + "size" will be set to the estimated tag size in meters. + + "return_code" holds possible warnings or error codes. + + The definition for the response with corresponding datatypes is: + + { + "name": "detect", + "response": { + "return_code": { + "message": "string", + "value": "int16" + }, + "tags": [ + { + "id": "string", + "instance_id": "string", + "pose": { + "orientation": { + "w": "float64", + "x": "float64", + "y": "float64", + "z": "float64" + }, + "position": { + "x": "float64", + "y": "float64", + "z": "float64" + } + }, + "pose_frame": "string", + "size": "float64", + "timestamp": { + "nsec": "int32", + "sec": "int32" + } + } + ], + "timestamp": { + "nsec": "int32", + "sec": "int32" + } + } + } + +start + + Starts the module by transitioning from "IDLE" to "RUNNING". + + Details + + When running, the module receives images from the stereo camera and + is ready to perform tag detections. To save computing resources, + the module should only be running when necessary. + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes//services/start + + API version 1 (deprecated) + + PUT http:///api/v1/nodes//services/start + + Request + + This service has no arguments. + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "start", + "response": { + "accepted": "bool", + "current_state": "string" + } + } + +stop + + Stops the module by transitioning to "IDLE". + + Details + + This transition can be performed from state "RUNNING" and + "FATAL". All tag re-identification information is cleared during + stopping. + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes//services/stop + + API version 1 (deprecated) + + PUT http:///api/v1/nodes//services/stop + + Request + + This service has no arguments. + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "stop", + "response": { + "accepted": "bool", + "current_state": "string" + } + } + +restart + + Restarts the module. + + Details + + If in "RUNNING" or "FATAL", the module will be stopped and then + started. If in "IDLE", the module will be started. + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes//services/restart + + API version 1 (deprecated) + + PUT http:///api/v1/nodes//services/restart + + Request + + This service has no arguments. + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "restart", + "response": { + "accepted": "bool", + "current_state": "string" + } + } + +reset_defaults + + Resets all parameters of the module to its default values, as + listed in above table. + + Details + + This service can be called as follows. + + API version 2 + + PUT http:///api/v2/pipelines/0/nodes//services/reset_defaults + + API version 1 (deprecated) + + PUT http:///api/v1/nodes//services/reset_defaults + + Request + + This service has no arguments. + + Response + + The definition for the response with corresponding datatypes is: + + { + "name": "reset_defaults", + "response": { + "return_code": { + "message": "string", + "value": "int16" + } + } + } + +Return codes + +Each service response contains a "return_code", which consists of a +"value" plus an optional "message". A successful service returns with +a "return_code" value of "0". Negative "return_code" values indicate +that the service failed. Positive "return_code" values indicate that +the service succeeded with additional information. The smaller value +is selected in case a service has multiple "return_code" values, but +all messages are appended in the "return_code" message. + +The following table contains a list of common return codes: + + Code Description 0 Success -1 An invalid argument was + provided -4 A timeout occurred while waiting for the image pair + -9 The license is not valid -11 Sensor not connected, not + supported or not ready -101 Internal error during tag detection + -102 There was a backwards jump of system time -103 Internal + error during tag pose estimation -200 A fatal internal error + occurred 200 Multiple warnings occurred; see list in message 201 + The module was not in state RUNNING diff --git a/v24.04/en/_sources/time_sync.rst.txt b/v24.04/en/_sources/time_sync.rst.txt new file mode 100644 index 0000000..d9a3e77 --- /dev/null +++ b/v24.04/en/_sources/time_sync.rst.txt @@ -0,0 +1,113 @@ +Time synchronization + +The + +rc_visard NG + + provides timestamps with all images and messages. To compare these +with the time on the application host, the time needs to be properly +synchronized. + + This can be done either via the Network Time Protocol (NTP), which + is the default, or the Precision Time Protocol (PTP). + +The current system time as well as time synchronization status can be +queried via + +REST-API + + and seen on the + +Web GUI + +'s + +System + + page. + +Note: Depending on the reachability of NTP servers or PTP masters it + might take up to several minutes until the time is synchronized. + +NTP + +The Network Time Protocol (NTP) is a TCP/IP protocol for synchronizing +time over a network. A client periodically requests the current time +from a server, and uses it to set and correct its own clock. + +By default the + +rc_visard NG + + tries to reach NTP servers from the NTP Pool Project, which will work +if the + +rc_visard NG + + has access to the internet. + +If the + +rc_visard NG + + is configured for + +DHCP + + (which is the default setting), it will also request NTP servers from +the DHCP server and try to use those. + +PTP + +The Precision Time Protocol (PTP, also known as IEEE1588) is a +protocol which offers more precise and robust clock synchronization +than with NTP. + +The + +rc_visard + + can be configured to act as a PTP slave via the standard + +GigE Vision 2.0/GenICam interface + + using the "GevIEEE1588" parameter. + +At least one PTP master providing time has to be running in the +network. On Linux the respective command for starting a PTP master on +ethernet port "eth0" is, e.g., "sudo ptpd --masteronly --foreground -i +eth0". + +While the + +rc_visard + + is synchronized with a PTP master ( + +rc_visard + + in PTP status SLAVE), the NTP synchronization is paused. + +Setting time manually + +The + +rc_visard NG + + allows to set the current date and time manually using the REST-API's + +/system/time + + endpoint, if no time synchronization is active (see + +System and logs + +). A more convenient way is setting the system time on the + +Web GUI + +'s + +System + + page. diff --git a/v24.04/en/_sources/troubleshooting.rst.txt b/v24.04/en/_sources/troubleshooting.rst.txt new file mode 100644 index 0000000..2f1c5f3 --- /dev/null +++ b/v24.04/en/_sources/troubleshooting.rst.txt @@ -0,0 +1,316 @@ +Troubleshooting + +LED colors + +During the boot process, the LED will change color several times to +indicate stages in the boot process: + +LED color codes LED color Boot stage white power supply OK +blue normal boot process in progress green boot complete, rc_visard +NG ready + +The LED will signal some warning or error states to support the user +during troubleshooting. + +LED color trouble codes LED color Warning or error state off +no power to the sensor brief red flash every 5 seconds no network +connectivity red Some process has terminated and failed to restart. +yellow high-temperature warning (case has exceeded 60 °C) + +Hardware issues + +LED does not illuminate + +The + +rc_visard NG + + does not start up. + +Ensure that cables are connected and secured properly. + +Ensure that adequate DC voltage (18 V to 30 V) with correct polarity +is applied to the power connector at the pins labeled as Power and +Ground as described in the device's pin assignment +specification\:(Section \ref{hardware_spec:tab-power-pin- +assignments}). Connecting the sensor to voltage outside of the +specified range, to alternating current, with reversed polarity, or to +a supply with voltage spikes will lead to permanent hardware damage. + +LED turns yellow while the sensor appears to function normally + +This may indicate a high housing temperature. The sensor might be +mounted in a position that obstructs free airflow around the cooling +fins. + +Clean cooling fins and housing. + +Ensure a minimum of 10 cm free space in all directions around cooling +fins to provide adequate convective cooling. + +Ensure that ambient temperature is within specified range. + +The sensor may slow down processing when cooling is insufficient or +the ambient temperature exceeds the specified range. + +Reliability issues and/or mechanical damage + +This may be an indication of ambient conditions (vibration, shock, +resonance, and temperature) being outside of specified range. Please +refer to the + +specification of environmental conditions + +. + +Operating the rc_visard NG outside of specified ambient conditions +might lead to damage and will void the warranty. + +Electrical shock when touching the sensor + +This indicates an electrical fault in sensor, cabling, or power supply +or adjacent system. + +Immediately turn off power to the system, disconnect cables, and have +a qualified electrician check the setup. + +Ensure that the sensor housing is properly grounded; check for large +ground loops. + +Connectivity issues + +LED briefly flashes red every 5 seconds + +If the LED briefly flashes red every 5 seconds, then the + +rc_visard NG + + is not able to detect a network link. + +Check that the network cable is properly connected to the rc_visard NG +and the network. + +If no problem is visible, then replace the Ethernet cable. + +A GigE Vision client or rcdiscover-gui cannot detect the camera + +Check whether the rc_visard NG's LED flashes briefly every 5 seconds +(check the cable if it does). + +Ensure that the rc_visard NG is connected to the same subnet (the +discovery mechanism uses broadcasts that will not work across +different subnets). + +The Web GUI is inaccessible + +Ensure that the rc_visard NG is turned on and connected to the same +subnet as the host computer. + +Check whether the rc_visard NG's LED flashes briefly every 5 seconds +(check the cable if it does). + +Check whether rcdiscover-gui detects the sensor. If it reports the +rc_visard NG as unreachable, then the rc_visard NG's network +configuration\:(Section \ref{installation:sect-network-configuration}) +is wrong. + +If the rc_visard NG is reported as reachable, try double clicking the +entry to open the Web GUI in a browser. + +If this does not work, try entering the rc_visard NG's reported IP +address directly in the browser as target address. + +Too many Web GUIs are open at the same time + +The Web GUI consumes the + +rc_visard NG + +'s processing resources to compress images to be transmitted and for +statistical output that is regularly polled by the browser. Leaving +several instances of the Web GUI open on the same or different +computers can significantly diminish the + +rc_visard NG + +'s performance. The Web GUI is meant for configuration and validation, +not to permanently monitor the + +rc_visard NG + +. + +Camera-image issues + +The camera image is too bright + +If the camera is in manual exposure mode, decrease the exposure time +(see Parameters, Section \ref{stereo_camera:sect-cam-params}), or + +switch to auto-exposure mode (see Parameters, Section +\ref{stereo_camera:sect-cam-params}). + +The camera image is too dark + +If the camera is in manual exposure mode, increase the exposure time +(see Parameters, Section \ref{stereo_camera:sect-cam-params}), or + +switch to auto-exposure mode (see Parameters, Section +\ref{stereo_camera:sect-cam-params}). + +The camera image is too noisy + +Large gain factors cause high-amplitude image noise. To decrease the +image noise, + +use an additional light source to increase the scene's light +intensity, or + +choose a greater maximal auto-exposure time (see Parameters, Section +\ref{stereo_camera:sect-cam-params}). + +The camera image is out of focus + +Check whether the object is too close to the lens and increase the +distance between the object and the lens if it is. + +Check whether the camera lenses are dirty and clean them if they are. + +If none of the above applies, a severe hardware problem might exist. +Please contact support\:(Section \ref{contact:sect-contact}). + +The camera image is blurred + +Fast motions in combination with long exposure times can cause blur. +To reduce motion blur, + +decrease the motion speed of the camera, + +decrease the motion speed of objects in the field of view of the +camera, or + +decrease the exposure time of the camera (see Parameters, Section +\ref{stereo_camera:sect-cam-params}). + +The camera image is fuzzy + +Check whether the lenses are dirty and clean them if so (see Lens +cleaning, Section \ref{maintenance:sect-lens-cleaning}). + +If none of the above applies, a severe hardware problem might exist. +Please contact support\:(Section \ref{contact:sect-contact}). + +The camera image frame rate is too low + +Increase the image frame rate as described in Parameters\:(Section +\ref{stereo_camera:sect-cam-params}). + +The maximal frame rate of the cameras is 25 Hz. + +Depth/Disparity, error, and confidence image issues + +All these guidelines also apply to error and confidence images, +because they correspond directly to the disparity image. + +The disparity image is too sparse or empty + +Check whether the camera images are well exposed and sharp. Follow the +instructions in Camera-image issues\:(Section \ref{troubleshooting +:sect-camera-issues}) if applicable. + +Check whether the scene has enough texture (see Stereo matching, +Section \ref{stereo_matching:sect-stereo-matching}) and install an +external pattern projector if required. + +Decrease the Minimum Distance\:(Section \ref{stereo_matching:sect- +disp-image-parameters}). + +Increase the Maximum Distance\:(Section \ref{stereo_matching:sect- +disp-image-parameters}). + +Check whether the object is too close to the cameras. Consider the +different depth ranges of the camera variants. + +Decrease the Minimum Confidence\:(Section \ref{stereo_matching:sect- +disp-image-parameters}). + +Increase the Maximum Depth Error\:(Section \ref{stereo_matching:sect- +disp-image-parameters}). + +Choose a lesser Disparity Image Quality\:(Section \ref{stereo_matching +:sect-disp-image-parameters}). Lower resolution disparity images are +generally less sparse. + +Check the cameras' calibration and recalibrate if required (see Camera +calibration, Section \ref{camera_calibration:sect-camera- +calibration}). + +The disparity images' frame rate is too low + +Check and increase the frame rate of the camera images (see +Parameters, Section \ref{stereo_camera:sect-cam-params}). The frame +rate of the disparity image cannot be greater than the frame rate of +the camera images. + +Choose a lesser Disparity Image Quality\:(Section \ref{stereo_matching +:sect-disp-image-parameters}). + +Increase the Minimum Distance\:(Section \ref{stereo_matching:sect- +disp-image-parameters}) as much as possible for the application. + +The disparity image does not show close objects + +Check whether the object is too close to the cameras. Consider the +depth ranges of the camera variants. + +Decrease the Minimum Distance\:(Section \ref{stereo_matching:sect- +disp-image-parameters}). + +The disparity image does not show distant objects + +Increase the Maximum Distance\:(Section \ref{stereo_matching:sect- +disp-image-parameters}). + +Increase the Maximum Depth Error\:(Section \ref{stereo_matching:sect- +disp-image-parameters}). + +Decrease the Minimum Confidence\:(Section \ref{stereo_matching:sect- +disp-image-parameters}). + +The disparity image is too noisy + +Increase the Segmentation value\:(Section \ref{stereo_matching:sect- +disp-image-parameters}). + +Increase the Fill-In value\:(Section \ref{stereo_matching:sect-disp- +image-parameters}). + +The disparity values or the resulting depth values are too inaccurate + +Decrease the distance between the camera and the scene. Depth- +measurement error grows quadratically with the distance from the +cameras. + +Check whether the scene contains repetitive patterns and remove them +if it does. They could cause wrong disparity measurements. + +The disparity image is too smooth + +Decrease the Fill-In value\:(Section \ref{stereo_matching:sect-disp- +image-parameters}). + +The disparity image does not show small structures + +Decrease the Segmentation value\:(Section \ref{stereo_matching:sect- +disp-image-parameters}). + +Decrease the Fill-In value\:(Section \ref{stereo_matching:sect-disp- +image-parameters}). + +GigE Vision/GenICam issues + +No images + +Check that the modules are enabled. See ComponentSelector and +ComponentEnable in Important GenICam parameters\:(Section +\ref{gigevision:sect-genicam-params}). diff --git a/v24.04/en/_sources/userspace.rst.txt b/v24.04/en/_sources/userspace.rst.txt new file mode 100644 index 0000000..35de4d2 --- /dev/null +++ b/v24.04/en/_sources/userspace.rst.txt @@ -0,0 +1,118 @@ +UserSpace + +The UserSpace enables users to deploy and manage containers running on +the + +rc_visard NG + +. Standalone containers and docker-compose stacks are supported. + +Note: Familiarity with Docker containers is required. + +If available and enabled, the UserSpace can be accessed in the + +Web GUI + + in the menu under + +UserSpace + +. This page shows the running apps and containers with their current +state and health, in case a health-check is available. Each container +lists the published ports. If their protocol is http or https, these +containers can be accessed directly in the Web GUI. + +Configuration + +If the UserSpace is enabled for the first time, a user for the +portainer UI needs to be created: In the + +Web GUI + + navigate to + +UserSpace + + and click on + +Manage UserSpace Apps + +. Then, register a user account for the administrator. It is required +to complete this step within five minutes after booting the + +rc_visard NG + +. + +Network access to UserSpace applications + +To access containers via network, the container ports need to be +published to host ports. + +UserSpace information including running apps and their published ports +can be queried via + +REST-API userspace endpoint + + or viewed in the + +Web GUI + + in the menu under + +UserSpace + +. + +All ports that are published to the host are listed with their +protocol (UDP or TCP). To explicitly specify a protocol (e.g. http or +https) for app ports use container labels: + +com.roboception.app.http: all exposed TCP ports use http + +com.roboception.app.https.port=1234,5678: comma separated list with +https ports + +Interfaces + +Docker containers managed in the UserSpace can use the public +interfaces of the + +rc_visard NG + +. In particular, Docker containers can access synchronized image sets +via + +gRPC + + and can call the + +REST-API interface + +. The + +rc_visard NG + + (the host) can be accessed under the Docker bridge IP (in default +Docker bridge network *172.17.0.1*). + +Restrictions + +Some restrictions for containers apply: + +Containers cannot be privileged. + +No access to the host network (a Docker bridge network is used +instead). + +Only paths inside cloned git repositories with a docker-compose stack +can be mounted, all other host paths cannot be mounted. + +Host devices cannot be accessed. This includes e.g. USB and GPU +devices. + +Well known and internally used ports on the host cannot be bound. This +includes ports below 1024, ports from 4200 to 4299 and the ports 2342, +2343, 2344, 2345, 3956, 4840, 5353, 6379, 7000, 7001, 7002, 7003, +9100, 9118, 9256, 9445, 9446, 11311, 22350, 22352, 50010, 50051, +50052, 50053 and 50054. diff --git a/v24.04/en/_sources/warranty.rst.txt b/v24.04/en/_sources/warranty.rst.txt new file mode 100644 index 0000000..ef4981c --- /dev/null +++ b/v24.04/en/_sources/warranty.rst.txt @@ -0,0 +1,38 @@ +Warranty + +Any changes or modifications to the hard- and software not expressly +approved by Roboception could void the user's warranty and guarantee +rights. + +Warning: The + + rc_visard NG + + utilizes complex hardware and software technology that may behave + in a way not intended by the user. The purchaser must design its + application to ensure that any failure or the + + rc_visard NG + + does not cause personal injury, property damage, or other losses. + +Warning: Do not attempt to take apart, open, service, or modify the + + rc_visard NG + + . Doing so could present the risk of electric shock or other hazard. + Any evidence of any attempt to open and/or modify the device, + including any peeling, puncturing, or removal of any of the labels, + will void the Limited Warranty. + +Warning: CAUTION: to comply with the European CE requirement, all + cables used to connect this device must be shielded and grounded. + Operation with incorrect cables may result in interference with + other devices or undesired effects of the product. + +Note: This product may not be treated as household waste. By + ensuring this product is disposed of correctly, you will help to + protect the environment. For more detailed information about the + recycling of this product, please contact your local authority, your + household waste disposal service provider, or the product's + supplier. diff --git a/v24.04/en/_sources/webgui.rst.txt b/v24.04/en/_sources/webgui.rst.txt new file mode 100644 index 0000000..9f4bb81 --- /dev/null +++ b/v24.04/en/_sources/webgui.rst.txt @@ -0,0 +1,249 @@ +Web GUI + +The + +rc_visard NG + +'s Web GUI can be used to test, calibrate, and configure the device. + +Accessing the Web GUI + +The Web GUI can be accessed from any web browser, such as Firefox, +Google Chrome, or Microsoft Edge, via the + +rc_visard NG + +'s IP address. The easiest way to access the Web GUI is to simply +double click on the desired device using the "rcdiscover-gui" tool as +explained in + +Discovery of rc_visard NG devices + +. + +Alternatively, some network environments automatically configure the +unique host name of the + +rc_visard NG + + in their Domain Name Server ( + +DNS + +). In this case, the Web GUI can also be accessed directly using the + +URL + + "http://" by replacing "" with the device's +host name. + +For Linux and Mac operating systems, this even works without DNS via +the multicast Domain Name System ( + +mDNS + +), which is automatically used if ".local" is appended to the host +name. Thus, the URL simply becomes "http://.local". + +Exploring the Web GUI + +The Web GUI's dashboard page gives the most important information +about the device and the software modules. + + +The page's side menu permits access to the individual pages of the + +rc_visard NG + +'s Web GUI: + +Camera + + shows a live stream of the rectified camera images. The frame rate + can be reduced to save bandwidth when streaming to a GigE Vision® + client. Furthermore, exposure can be set manually or automatically. + See + + Parameters + + for more information. + +Depth Image + + shows a live stream of the left rectified, disparity, and + confidence images. The page contains various settings for depth- + image computation and filtering. See + + Parameters + + for more information. + +Modules + + gives access to the detection modules of the + + rc_visard NG + + (see + + Detection modules + + ). + +Configuration + + gives access to the configuration modules of the + + rc_visard NG + + (see + + Configuration modules + + ). + +Database + + gives access to the database modules of the + + rc_visard NG + + (see + + Database modules + + ). + +System + + gives access to general settings, device information and to the log + files, and permits the firmware or the license file to be updated. + +Note: Further information on all parameters in the Web GUI can be + obtained by pressing the + + Info + + button next to each parameter. + +Web GUI access control + +The Web GUI has a simple mechanism to lock the UI against casual and +accidental changes. + +When enabling Web GUI access control via the + +System + + page, you will be asked to set a password. Now the Web GUI is in a +locked mode indicated by the lock symbol in the top bar. All pages, +camera streams, parameters and detections can be inspected as usual, +but changes are not possible. + +To temporarily unlock the Web GUI and make changes, click the lock +symbol and enter the password. While enabling or disabling Web GUI +access control affects anyone accessing this + +rc_visard NG + +, the unlocked state is only valid for the browser where it was +unlocked and indicated by the open lock symbol. It is automatically +locked again after 10 minutes of inactivity. + +Web GUI access control can also be disabled again on the + +System + + page after providing the current password. + +Warning: This is not a security feature! It only locks the Web GUI + and not the REST-API. It is meant to prevent accidental and casual + changes e.g. via a connected screen. + +Note: In case the password is lost, this can be disabled via the + REST-API + + delete ui_lock + + . + +Downloading camera images + +The Web GUI provides an easy way to download a snapshot of the current +scene as a .tar.gz file by clicking on the camera icon below the image +live streams on the + +Camera + + page. This snapshot contains: + +the rectified camera images in full resolution as .png files, + +a camera parameter file containing the camera matrix, image +dimensions, exposure time, gain value and the stereo baseline, + +the current IMU readings as imu.csv file, + +a pipeline_status.json file containing information about all 3D- +camera, detection and configuration nodes running on the rc_visard NG, + +a backup.json file containing the settings of the rc_visard NG +including grippers, load carriers and regions of interest, + +a system_info.json file containing system information about the +rc_visard NG. + +The filenames contain the timestamps. + +Downloading depth images and point clouds + +The Web GUI provides an easy way to download the depth data of the +current scene as a .tar.gz file by clicking on the camera icon below +the image live streams on the + +Depth Image + + page. This snapshot contains: + +the rectified left and right camera images in full resolution as .png +files, + +an image parameter file corresponding to the left image containing the +camera matrix, image dimensions, exposure time, gain value and the +stereo baseline, + +the disparity, error and confidence images in the resolution +corresponding to the currently chosen quality as .png files, + +a disparity parameter file corresponding to the disparity image +containing the camera matrix, image dimensions, exposure time, gain +value and the stereo baseline, and information about the disparity +values (i.e. invalid values, scale, offset), + +the current IMU readings as imu.csv file, + +a pipeline_status.json file containing information about all 3D- +camera, detection and configuration nodes running on the rc_visard NG, + +a backup.json file containing the settings of the rc_visard NG +including grippers, load carriers and regions of interest, + +a system_info.json file containing system information about the +rc_visard NG. + +The filenames contain the timestamps. + +When clicking on the mesh icon below the image live streams on the + +Depth Image + + page, a snapshot is downloaded which additionally includes a mesh of +the point cloud in the current depth quality (resolution) as .ply +file. + +Note: Downloading a depth snapshot will trigger an acquisition in + the same way as clicking on the "Acquire" button on the + + Depth Image + + page of the Web GUI, and, thus, might affect running applications. diff --git a/v24.04/en/_static/ajax-loader.gif b/v24.04/en/_static/ajax-loader.gif new file mode 100644 index 0000000..61faf8c Binary files /dev/null and b/v24.04/en/_static/ajax-loader.gif differ diff --git a/v24.04/en/_static/basic.css b/v24.04/en/_static/basic.css new file mode 100644 index 0000000..0807176 --- /dev/null +++ b/v24.04/en/_static/basic.css @@ -0,0 +1,676 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li div.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 450px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px 7px 0 7px; + background-color: #ffe; + width: 40%; + float: right; +} + +p.sidebar-title { + font-weight: bold; +} + +/* -- topics ---------------------------------------------------------------- */ + +div.topic { + border: 1px solid #ccc; + padding: 7px 7px 0 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +div.admonition dl { + margin-bottom: 0; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist td { + vertical-align: top; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +dl { + margin-bottom: 15px; +} + +dd p { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; +} + +td.linenos pre { + padding: 5px 0px; + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + margin-left: 0.5em; +} + +table.highlighttable td { + padding: 0 0.5em 0 0.5em; +} + +div.code-block-caption { + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +div.code-block-caption + div > div.highlight > pre { + margin-top: 0; +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + padding: 1em 1em 0; +} + +div.literal-block-wrapper div.highlight { + margin: 0; +} + +code.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; +} + +code.descclassname { + background-color: transparent; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: relative; + left: 0px; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/v24.04/en/_static/comment-bright.png b/v24.04/en/_static/comment-bright.png new file mode 100644 index 0000000..15e27ed Binary files /dev/null and b/v24.04/en/_static/comment-bright.png differ diff --git a/v24.04/en/_static/comment-close.png b/v24.04/en/_static/comment-close.png new file mode 100644 index 0000000..4d91bcf Binary files /dev/null and b/v24.04/en/_static/comment-close.png differ diff --git a/v24.04/en/_static/comment.png b/v24.04/en/_static/comment.png new file mode 100644 index 0000000..dfbc0cb Binary files /dev/null and b/v24.04/en/_static/comment.png differ diff --git a/v24.04/en/_static/contentui.css b/v24.04/en/_static/contentui.css new file mode 100644 index 0000000..326d3da --- /dev/null +++ b/v24.04/en/_static/contentui.css @@ -0,0 +1,132 @@ +/* + * right column for sphinx_rtd_theme + */ +.clear { + clear: both; +} + +@media screen and (min-width: 1300px) { + .wy-nav-content { + max-width: none; + } + + .with-columns .wy-nav-content { + background: linear-gradient(90deg, #fcfcfc 52%, #eeeeee 52%); + } + + .with-columns .wy-nav-content .wy-breadcrumbs , + .with-columns .section > h1, + .with-columns .section > h2, + .with-columns .section > h3, + .with-columns footer { + width: 50%; + } + + .with-columns .section { + clear: both; + } + + .left-col.container { + float: left; + width: 50%; + margin-right: 4%; + } + + .right-col.container { + float: left; + width: 45%; + } + + /* + * tab selector fixed in top + */ + .with-columns .contenttab-selector.in-right-col { + display: block; + position: fixed; + top: 0; + right: 0; + width: calc(48% - 144px); + background: #444; + padding: 5px 10px; + } + +} + +/** + * + */ +.toggle-tab { + margin-bottom: 40px; +} + +.toggle-header { + display: block; + clear: both; + cursor: pointer; +} +.toggle-header strong {color: #2980b9 } + +.toggle-header:after { + content: " ▼"; +} + +.toggle-header.open:after { + content: " ▲"; +} + +.toggle-content { + display: none; + margin-bottom: 20px; +} + +/* + * tab menu + */ +ul.contenttab-selector { + display:block; + list-style-type: none; + margin: 0 0 10px; + padding: 0; + line-height: normal; + overflow: auto; +} +ul.contenttab-selector li { + display: block; + cursor: pointer; + font-weight: bold; + margin: 0 5px 0 0; + padding: 5px 10px; + float: left; + background-color: #999; + color: #fff; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; + -khtml-border-radius: 5px; +} +.rst-content .section ul.contenttab-selector, +.rst-content .toctree-wrapper ul.contenttab-selector, +article ul.contenttab-selector{ + line-height: normal; + margin: 0 0 10px; +} +.rst-content .section ul.contenttab-selector li, +.rst-content .toctree-wrapper ul.contenttab-selector li, +article ul.contenttab-selector li{ + margin-left: 0; +} +ul.contenttab-selector li:hover { + background-color: #777; +} +ul.contenttab-selector li.selected { + background-color: #2980b9; +} +ul.contenttab-selector li.selected:hover { + background-color: #333; +} +.content-tabs { + margin: 10px 0 20px 0; +} +.tab-content { + clear: both; +} diff --git a/v24.04/en/_static/contentui.js b/v24.04/en/_static/contentui.js new file mode 100644 index 0000000..6ecdb2f --- /dev/null +++ b/v24.04/en/_static/contentui.js @@ -0,0 +1,74 @@ + +$(function() { + /* + * Right column logic + */ + if ($(".right-col").length) { + $(".right-col").after('
    '); + $(".right-col").parents('body').addClass('with-columns'); + } + + /** + * Toggle logic + */ + $('.toggle-content').hide() + $('.toggle-header').click(function () { + $(this).toggleClass("open"); + $(this).next('.toggle-content').toggle('400'); + }) + + /** + * Dynamic multiple content block. + */ + var top_sel = {} + + $('div.content-tabs').each(function() { + var contenttab_sel = $('
      ', { class: "contenttab-selector" }); + var i = 0; + + if ($(this).hasClass('right-col')){ + contenttab_sel.addClass('in-right-col'); + } + + $('.tab-content', this).each(function() { + var sel_item = $('
    • ', { + class: $(this).attr('id'), + text: $(this).find('.tab-title').text() + }); + $(this).find('.tab-title').remove(); + if (i++) { + $(this).hide(); + } else { + sel_item.addClass('selected'); + } + contenttab_sel.append(sel_item); + $(this).addClass('contenttab'); + }); + + $('.tab-content', this).eq(0).before(contenttab_sel); + contenttab_sel = null; + i = null; + }); + + + $('.contenttab-selector li').click(function(evt) { + evt.preventDefault(); + + if ($(this).parents('.in-right-col').length){ + var tabsblock = $('.right-col'); + }else{ + var tabsblock = $(this).parents('.content-tabs'); + } + + var sel_class = $(this).attr('class'); + $('div.contenttab',tabsblock).hide(); + $('div#' + sel_class,tabsblock).show(); + + $('ul.contenttab-selector li', tabsblock).removeClass('selected'); + $('ul.contenttab-selector li.' + sel_class, tabsblock).addClass('selected'); + + sel_class = null; + }); + +}); + diff --git a/v24.04/en/_static/css/badge_only.css b/v24.04/en/_static/css/badge_only.css new file mode 100644 index 0000000..cb09245 --- /dev/null +++ b/v24.04/en/_static/css/badge_only.css @@ -0,0 +1,221 @@ +@charset "UTF-8"; +.fa:before { + -webkit-font-smoothing: antialiased; +} + +.clearfix { + *zoom: 1; +} +.clearfix:before, .clearfix:after { + display: table; + content: ""; +} +.clearfix:after { + clear: both; +} + +@font-face { + font-family: FontAwesome; + font-weight: normal; + font-style: normal; + src: url("../fonts/fontawesome-webfont.eot"); + src: url("../fonts/fontawesome-webfont.eot?#iefix") format("embedded-opentype"), url("../fonts/fontawesome-webfont.woff") format("woff"), url("../fonts/fontawesome-webfont.ttf") format("truetype"), url("../fonts/fontawesome-webfont.svg#FontAwesome") format("svg"); +} +.fa:before { + display: inline-block; + font-family: FontAwesome; + font-style: normal; + font-weight: normal; + line-height: 1; + text-decoration: inherit; +} + +a .fa { + display: inline-block; + text-decoration: inherit; +} + +li .fa { + display: inline-block; +} +li .fa-large:before, +li .fa-large:before { + /* 1.5 increased font size for fa-large * 1.25 width */ + width: 1.875em; +} + +ul.fas { + list-style-type: none; + margin-left: 2em; + text-indent: -0.8em; +} +ul.fas li .fa { + width: 0.8em; +} +ul.fas li .fa-large:before, +ul.fas li .fa-large:before { + /* 1.5 increased font size for fa-large * 1.25 width */ + vertical-align: baseline; +} + +.fa-book:before { + content: ""; +} + +.icon-book:before { + content: ""; +} + +.fa-caret-down:before { + content: ""; +} + +.icon-caret-down:before { + content: ""; +} + +.fa-caret-up:before { + content: ""; +} + +.icon-caret-up:before { + content: ""; +} + +.fa-caret-left:before { + content: ""; +} + +.icon-caret-left:before { + content: ""; +} + +.fa-caret-right:before { + content: ""; +} + +.icon-caret-right:before { + content: ""; +} + +.rst-versions { + position: fixed; + bottom: 0; + left: 0; + width: 300px; + color: #fcfcfc; + background: #1f1d1d; + border-top: solid 10px #343131; + font-family: "Lato", "proxima-nova", "Helvetica Neue", Arial, sans-serif; + z-index: 400; +} +.rst-versions a { + color: #2980B9; + text-decoration: none; +} +.rst-versions .rst-badge-small { + display: none; +} +.rst-versions .rst-current-version { + padding: 12px; + background-color: #272525; + display: block; + text-align: right; + font-size: 90%; + cursor: pointer; + color: #27AE60; + *zoom: 1; +} +.rst-versions .rst-current-version:before, .rst-versions .rst-current-version:after { + display: table; + content: ""; +} +.rst-versions .rst-current-version:after { + clear: both; +} +.rst-versions .rst-current-version .fa { + color: #fcfcfc; +} +.rst-versions .rst-current-version .fa-book { + float: left; +} +.rst-versions .rst-current-version .icon-book { + float: left; +} +.rst-versions .rst-current-version.rst-out-of-date { + background-color: #E74C3C; + color: #fff; +} +.rst-versions .rst-current-version.rst-active-old-version { + background-color: #F1C40F; + color: #000; +} +.rst-versions.shift-up .rst-other-versions { + display: block; +} +.rst-versions .rst-other-versions { + font-size: 90%; + padding: 12px; + color: gray; + display: none; +} +.rst-versions .rst-other-versions hr { + display: block; + height: 1px; + border: 0; + margin: 20px 0; + padding: 0; + border-top: solid 1px #413d3d; +} +.rst-versions .rst-other-versions dd { + display: inline-block; + margin: 0; +} +.rst-versions .rst-other-versions dd a { + display: inline-block; + padding: 6px; + color: #fcfcfc; +} +.rst-versions.rst-badge { + width: auto; + bottom: 20px; + right: 20px; + left: auto; + border: none; + max-width: 300px; +} +.rst-versions.rst-badge .icon-book { + float: none; +} +.rst-versions.rst-badge .fa-book { + float: none; +} +.rst-versions.rst-badge.shift-up .rst-current-version { + text-align: right; +} +.rst-versions.rst-badge.shift-up .rst-current-version .fa-book { + float: left; +} +.rst-versions.rst-badge.shift-up .rst-current-version .icon-book { + float: left; +} +.rst-versions.rst-badge .rst-current-version { + width: auto; + height: 30px; + line-height: 30px; + padding: 0 6px; + display: block; + text-align: center; +} + +@media screen and (max-width: 768px) { + .rst-versions { + width: 85%; + display: none; + } + .rst-versions.shift { + display: block; + } +} + +/*# sourceMappingURL=badge_only.css.map */ diff --git a/v24.04/en/_static/css/badge_only.css.map b/v24.04/en/_static/css/badge_only.css.map new file mode 100644 index 0000000..05bb674 --- /dev/null +++ b/v24.04/en/_static/css/badge_only.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": ";AAyDA,UAAY;EACV,sBAAsB,EAAE,WAAW;;;AAqDrC,SAAS;EARP,KAAK,EAAE,CAAC;;AACR,iCAAS;EAEP,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,EAAE;;AACb,eAAO;EACL,KAAK,EAAE,IAAI;;;AC1Gb,UAkBC;EAjBC,WAAW,ECFJ,WAAW;EDGlB,WAAW,EAHqC,MAAM;EAItD,UAAU,EAJsD,MAAM;EAapE,GAAG,EAAE,uCAAwB;EAC7B,GAAG,EAAE,kQAG2D;;ACftE,UAAU;EACR,OAAO,EAAE,YAAY;EACrB,WAAW,EAAE,WAAW;EACxB,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,MAAM;EACnB,WAAW,EAAE,CAAC;EACd,eAAe,EAAE,OAAO;;;AAG1B,KAAK;EACH,OAAO,EAAE,YAAY;EACrB,eAAe,EAAE,OAAO;;;AAIxB,MAAG;EACD,OAAO,EAAE,YAAY;;AACvB;mBAAiB;;EAGf,KAAK,EAAE,OAAY;;;AAEvB,MAAM;EACJ,eAAe,EAAE,IAAI;EACrB,WAAW,EAAE,GAAG;EAChB,WAAW,EAAE,MAAM;;AAEjB,aAAG;EACD,KAAK,EAAE,KAAI;;AACb;0BAAiB;;EAGf,cAAc,EAAE,QAAQ;;;AAG9B,eAAe;EACb,OAAO,EAAE,GAAO;;;AAElB,iBAAiB;EACf,OAAO,EAAE,GAAO;;;AAElB,qBAAqB;EACnB,OAAO,EAAE,GAAO;;;AAElB,uBAAuB;EACrB,OAAO,EAAE,GAAO;;;AAElB,mBAAmB;EACjB,OAAO,EAAE,GAAO;;;AAElB,qBAAqB;EACnB,OAAO,EAAE,GAAO;;;AAElB,qBAAqB;EACnB,OAAO,EAAE,GAAO;;;AAElB,uBAAuB;EACrB,OAAO,EAAE,GAAO;;;AAElB,sBAAsB;EACpB,OAAO,EAAE,GAAO;;;AAElB,wBAAwB;EACtB,OAAO,EAAE,GAAO;;;ACnElB,aAAa;EACX,QAAQ,EAAE,KAAK;EACf,MAAM,EAAE,CAAC;EACT,IAAI,EAAE,CAAC;EACP,KAAK,EC6E+B,KAAK;ED5EzC,KAAK,EEuC+B,OAAyB;EFtC7D,UAAU,EAAE,OAAkC;EAC9C,UAAU,EAAE,kBAAiC;EAC7C,WAAW,EEkDyB,2DAA2D;EFjD/F,OAAO,EC+E6B,GAAG;;AD9EvC,eAAC;EACC,KAAK,EEkC6B,OAAK;EFjCvC,eAAe,EAAE,IAAI;;AACvB,8BAAgB;EACd,OAAO,EAAE,IAAI;;AACf,kCAAoB;EAClB,OAAO,EAAE,IAAqB;EAC9B,gBAAgB,EAAE,OAAkC;EACpD,OAAO,EAAE,KAAK;EACd,UAAU,EAAE,KAAK;EACjB,SAAS,EAAE,GAAG;EACd,MAAM,EAAE,OAAO;EACf,KAAK,EEX6B,OAAM;EL4F1C,KAAK,EAAE,CAAC;;AACR,mFAAS;EAEP,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,EAAE;;AACb,wCAAO;EACL,KAAK,EAAE,IAAI;;AGrFX,sCAAG;EACD,KAAK,EEmB2B,OAAyB;;AFlB3D,2CAAQ;EACN,KAAK,EAAE,IAAI;;AACb,6CAAU;EACR,KAAK,EAAE,IAAI;;AACb,kDAAiB;EACf,gBAAgB,ECQgB,OAAI;EDPpC,KAAK,EEO2B,IAAM;;AFNxC,yDAAwB;EACtB,gBAAgB,EEsBgB,OAAO;EFrBvC,KAAK,ECzB2B,IAAI;;AD0BxC,0CAA8B;EAC5B,OAAO,EAAE,KAAK;;AAChB,iCAAmB;EACjB,SAAS,EAAE,GAAG;EACd,OAAO,EAAE,IAAqB;EAC9B,KAAK,EEJ6B,IAAY;EFK9C,OAAO,EAAE,IAAI;;AACb,oCAAE;EACA,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,GAAG;EACX,MAAM,EAAE,CAAC;EACT,MAAM,EAAE,MAAM;EACd,OAAO,EAAE,CAAC;EACV,UAAU,EAAE,iBAA6C;;AAC3D,oCAAE;EACA,OAAO,EAAE,YAAY;EACrB,MAAM,EAAE,CAAC;;AACT,sCAAC;EACC,OAAO,EAAE,YAAY;EACrB,OAAO,EAAE,GAAqB;EAC9B,KAAK,EEZyB,OAAyB;;AFa7D,uBAAW;EACT,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,KAAK,EAAE,IAAI;EACX,IAAI,EAAE,IAAI;EACV,MAAM,EAAE,IAAI;EACZ,SAAS,ECkByB,KAAK;;ADjBvC,kCAAU;EACR,KAAK,EAAE,IAAI;;AACb,gCAAQ;EACN,KAAK,EAAE,IAAI;;AACb,qDAA+B;EAC7B,UAAU,EAAE,KAAK;;AACjB,8DAAQ;EACN,KAAK,EAAE,IAAI;;AACb,gEAAU;EACR,KAAK,EAAE,IAAI;;AACf,4CAAoB;EAClB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,KAAuB;EAChC,OAAO,EAAE,KAAK;EACd,UAAU,EAAE,MAAM;;;AGhDpB,oCAAsB;EHmDxB,aAAa;IACX,KAAK,EAAE,GAAG;IACV,OAAO,EAAE,IAAI;;EACb,mBAAO;IACL,OAAO,EAAE,KAAK", +"sources": ["../../../bower_components/wyrm/sass/wyrm_core/_mixin.sass","../../../bower_components/bourbon/dist/css3/_font-face.scss","../../../sass/_theme_badge_fa.sass","../../../sass/_theme_badge.sass","../../../bower_components/wyrm/sass/wyrm_core/_wy_variables.sass","../../../sass/_theme_variables.sass","../../../bower_components/neat/app/assets/stylesheets/grid/_media.scss"], +"names": [], +"file": "badge_only.css" +} diff --git a/v24.04/en/_static/css/basler.css b/v24.04/en/_static/css/basler.css new file mode 100644 index 0000000..749ab2d --- /dev/null +++ b/v24.04/en/_static/css/basler.css @@ -0,0 +1,330 @@ +@import url("https://fonts.googleapis.com/css2?family=Roboto&display=swap"); +body, h1, h2, h3, h4, h5, h6, a, ul, li, p, span { + font-family: "Roboto", sans-serif; } + +.menuselection { + font-weight: 600; } + +.wy-nav-content { + background-color: #ffffff; + max-width: 900px; } + +.wy-nav-content-wrap { + background-color: #eaecee; } + +.codeblock, pre.literal-block, .rst-content .literal-block, .rst-content pre.literal-block, div[class^='highlight'] { + background-color: #f8f9f9; } + +body { + color: #000000; } + +b, strong { + vertical-align: top; } + +p, dd { + font-size: 16px; + color: #000000; + line-height: 1.5em; } + +p.first { + margin-bottom: 0 !important; } + +h1, h2, .rst-content .toctree-wrapper p.caption, h3, h4, h5, h6, legend { + font-weight: 100; + font-size: 25px; + color: #66696d; + font-weight: 100; + margin-bottom: 0px; + line-height: 28px; + text-overflow: ellipsis; + display: block; + white-space: nowrap; } + +h1, h2, h3, h4, h5, h6 { + margin-bottom: 20px; } + +h1 { + font-size: 25px; } + +h2 { + font-size: 22px; } + +h3 { + font-size: 18px; + font-weight: 500; } + +h4 { + font-size: 16px; + font-weight: 600; } + +a { + color: #15487f; } + a:active { + color: #15487f; } + a:visited { + color: #15487f; } + a:hover { + color: #1c61ab; + text-decoration: underline; } + +.wy-nav-top { + background-color: #15487f; } + @media (max-width: 768px) { + .wy-nav-top a { + color: #FFF; } + .wy-nav-top a:hover { + color: #FFF; } + .wy-nav-top a:visited { + color: #FFF; } } + .wy-nav-top i { + color: #FFF; } + +.wy-nav-side { + background-color: #15487f; + border-right: 1px solid rgba(255, 255, 255, 0.2); } + +.wy-side-nav-search { + background-color: #15487f; } + +.wy-side-nav-search input[type=text] { + border: none; + font-size: 14px; + font-weight: 400; + color: #000000; + text-align: left; + border: 1px solid #dbdbdb; + background-color: #ffffff; + height: 36px; + border-radius: 2px; + margin-top: 2px; + margin-bottom: 2px; + padding-left: 10px; + padding-right: 10px; } + +.wy-side-nav-search > a { + line-height: 20px; + color: #fff; } + .wy-side-nav-search > a:hover { + color: #fff; + text-decoration: none; + background-color: transparent; } + .wy-side-nav-search > a:before { + content: ""; + width: 180px; + height: 50px; + background: url(../img/logo_basler.svg) no-repeat 20px center; + display: block; + margin: 0 auto; + margin-bottom: 20px; } + +.wy-menu-vertical header, .wy-menu-vertical p.caption, .wy-menu-vertical a { + color: #ffffff; } + +.wy-menu-vertical a:hover { + background-color: #113c69; } + +.wy-menu-vertical li.current { + background-color: #15487f; } + +.wy-menu-vertical li.current a:hover { + background-color: #113c69; } + +.wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a, .wy-menu-vertical li.toctree-l3.current > a, .wy-menu-vertical li.toctree-l2.current > a, .wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a, .wy-menu-vertical li.toctree-l4 li.toctree-l5.current > a { + background-color: #15487f; } + .wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a:hover, .wy-menu-vertical li.toctree-l3.current > a:hover, .wy-menu-vertical li.toctree-l2.current > a:hover, .wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a:hover, .wy-menu-vertical li.toctree-l4 li.toctree-l5.current > a:hover { + background-color: #113c69; } + +.wy-menu-vertical li.current a { + color: #FFF; } + +.wy-menu-vertical li a, .wy-menu-vertical li.on a span.toctree-expand, .wy-menu-vertical li.current > a span.toctree-expand, .wy-menu-vertical li.toctree-l3 span.toctree-expand, .wy-menu-vertical li.toctree-l2 span.toctree-expand { + line-height: 26px; } + +.wy-menu-vertical li.current a { + border-color: transparent; } + +.wy-menu-vertical li.on a, .wy-menu-vertical li.current > a { + background-color: rgba(0, 0, 0, 0.2); + border: none; + border-bottom: 2px solid #f99c34; } + .wy-menu-vertical li.on a:hover, .wy-menu-vertical li.current > a:hover { + background-color: rgba(0, 0, 0, 0.2); } + +.wy-menu-vertical li a:hover { + background-color: rgba(0, 0, 0, 0.2) !important; + color: rgba(255, 255, 255, 0.9); } + +.wy-menu-vertical a { + padding-left: 1.618em; } + +.wy-menu-vertical li.current a { + padding-left: 1.618em; } + +.wy-menu-vertical li.toctree-l2.current > a { + padding-left: 3em; + background-color: rgba(0, 0, 0, 0.2); } + +.wy-menu-vertical li.toctree-l2 > a { + padding-left: 3em; } + +.wy-menu-vertical li.toctree-l3.current > a { + padding-left: 4.5em; + background-color: rgba(0, 0, 0, 0.2) !important; } + +.wy-menu-vertical li.toctree-l3 > a { + padding-left: 4.5em; } + +.wy-menu-vertical li.toctree-l4.current > a { + padding-left: 5.5em; + background-color: rgba(0, 0, 0, 0.2) !important; } + +.wy-menu-vertical li.toctree-l4 > a { + padding-left: 5.5em; } + +.wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a { + padding-left: 4.5em; } + +.wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a { + padding-left: 5.5em; } + +.wy-menu-vertical li.on a span.toctree-expand, .wy-menu-vertical li.current > a span.toctree-expand { + color: #FFF; } + .wy-menu-vertical li.on a span.toctree-expand:hover, .wy-menu-vertical li.current > a span.toctree-expand:hover { + opacity: 0.9; } + +.wy-menu-vertical li span.toctree-expand { + color: rgba(255, 255, 255, 0); } + +.btn { + padding-top: 0px; + padding-bottom: 0px; + line-height: 34px; + height: 36px; + border-radius: 2px; + margin: 0px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin-top: 2px; + margin-bottom: 2px; + box-shadow: none; } + .btn:hover { + color: #333; + background-color: #e6e6e6 !important; + border-color: #adadad; + text-decoration: none; } + +.btn-neutral { + font-size: 14px; + font-weight: 600; + color: #66696d; + text-align: center; + border: 1px solid #dbdbdb; + border-radius: 2px; + overflow: hidden; + background: #f4f4f4; + /* Old browsers */ + background: -moz-linear-gradient(top, #ffffff 0%, #f5f5f5 100%); + /* FF3.6-15 */ + background: -webkit-linear-gradient(top, #ffffff 0%, #f5f5f5 100%); + /* Chrome10-25,Safari5.1-6 */ + background: linear-gradient(to bottom, #ffffff 0%, #f5f5f5 100%); + /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#f5f5f5',GradientType=0 ); + /* IE6-9 */ } + +.rst-content .sidebar .sidebar-title { + background-color: #dcdfe3; + font-family: "Roboto", sans-serif; } + +.rst-content .sidebar { + background-color: #f8f9f9; + border: 1px solid #e1e4e5; } + +.rst-content .admonition .admonition-title { + background-color: #f99c34; } +.rst-content .admonition.attention { + background-color: #fde4c9; } + .rst-content .admonition.attention .admonition-title { + background-color: #f99c34; } +.rst-content .admonition.caution { + background-color: #fde4c9; } + .rst-content .admonition.caution .admonition-title { + background-color: #f99c34; } +.rst-content .admonition.danger { + background-color: #fec9c2; } + .rst-content .admonition.danger .admonition-title { + background-color: #f22002; } +.rst-content .admonition.error { + background-color: #fec9c2; } + .rst-content .admonition.error .admonition-title { + background-color: #f22002; } +.rst-content .admonition.hint { + background-color: #ABF0AB; } + .rst-content .admonition.hint .admonition-title { + background-color: #00b000; } +.rst-content .admonition.important { + background-color: #ABF0AB; } + .rst-content .admonition.important .admonition-title { + background-color: #00b000; } +.rst-content .admonition.note { + background-color: rgba(20, 72, 126, 0.25); } + .rst-content .admonition.note .admonition-title { + background-color: rgba(20, 72, 126, 0.5); + margin: -12px; } + .rst-content .admonition.note p, .rst-content .admonition.note ul { + margin-top: 0.5em; } +.rst-content .admonition.tip { + background-color: #ABF0AB; } + .rst-content .admonition.tip .admonition-title { + background-color: #00b000; } +.rst-content .admonition.warning { + background-color: #fde4c9; } + .rst-content .admonition.warning .admonition-title { + background-color: #f99c34; + margin: -12px; } + .rst-content .admonition.warning p, .rst-content .admonition.warning ul { + margin-top: 0.5em; } + +.wy-table thead th, .rst-content table.docutils thead th, .rst-content table.field-list thead th { + border: solid 1px #e1e4e5; + border-bottom: solid 2px #e1e4e5; } + +table .first.last.line-block { + margin-left: 0; } +table .headerlink { + display: none; } +table col { + width: auto !important; } + +.math { + position: relative; } + .math .eqno { + position: absolute; + right: 0; + top: 0; } + .math .eqno .headerlink { + display: none; } + +.wy-table-responsive table td, .wy-table-responsive table th { + white-space: normal; } + +.rst-versions { + box-shadow: -2px -3px 6px rgba(0, 0, 0, 0.4); + border-top: none; + color: #FFF; + background-color: #15487f; + font-family: "Kuka Bulo", "Calibri", Helvetica, sans-serif; } + .rst-versions .rst-other-versions dd a { + color: #f99c34; + padding-left: 0; } + .rst-versions .rst-current-version { + background-color: #0e2f53; + color: #FFFFFF; } + .rst-versions .rst-other-versions { + color: #FFF; } + +.rst-current-version .fa.fa-cog { + float: left; } + +/*# sourceMappingURL=basler.css.map */ diff --git a/v24.04/en/_static/css/basler.css.map b/v24.04/en/_static/css/basler.css.map new file mode 100644 index 0000000..23f259a --- /dev/null +++ b/v24.04/en/_static/css/basler.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "AACQ,2EAAmE;AAiC3E,gDAAiD;EAC/C,WAAW,EAhCa,oBAAoB;;AAmC9C,cAAe;EACb,WAAW,EAAE,GAAG;;AAGlB,eAAgB;EACd,gBAAgB,EA9BQ,OAAO;EA+B/B,SAAS,EAAE,KAAK;;AAGlB,oBAAqB;EACnB,gBAAgB,EAvCQ,OAAO;;AA0CjC,mHAAoH;EAClH,gBAAgB,EAAE,OAAkB;;AAKtC,IAAK;EACH,KAAK,EAtDmB,OAAO;;AAyDjC,SAAU;EACR,cAAc,EAAE,GAAG;;AAGrB,KAAM;EACJ,SAAS,EAAE,IAAI;EACf,KAAK,EA/DmB,OAAO;EAgE/B,WAAW,EAAE,KAAK;;AAGpB,OAAQ;EACN,aAAa,EAAE,YAAY;;AAG7B,uEAAwE;EACtE,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,IAAI;EACf,KAAK,EApEmB,OAAO;EAqE/B,WAAW,EArDa,GAAG;EAsD3B,aAAa,EAAE,GAAG;EAClB,WAAW,EAAE,IAAI;EACjB,aAAa,EAAE,QAAQ;EACvB,OAAO,EAAE,KAAK;EACd,WAAW,EAAE,MAAM;;AAGrB,sBAAkB;EAChB,aAAa,EAAE,IAAI;;AAGrB,EAAG;EACD,SAAS,EAAE,IAAI;;AAEjB,EAAG;EACD,SAAS,EAAE,IAAI;;AAEjB,EAAE;EACA,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;;AAElB,EAAE;EACA,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;;AAGlB,CAAE;EACA,KAAK,EAzFmB,OAAO;EA0F/B,QAAS;IACP,KAAK,EA3FiB,OAAO;EA6F/B,SAAU;IACR,KAAK,EA9FiB,OAAO;EAgG/B,OAAQ;IACN,KAAK,EAAE,OAAkB;IACzB,eAAe,EAAE,SAAS;;AAK9B,WAAY;EACV,gBAAgB,EAnHQ,OAAO;EAqH7B,yBAA0B;IAD5B,aAAE;MAEE,KAAK,EAAE,IAAI;MACX,mBAAQ;QACN,KAAK,EAAE,IAAI;MAEb,qBAAU;QACR,KAAK,EAAE,IAAI;EAIjB,aAAE;IACA,KAAK,EAAE,IAAI;;AAGf,YAAa;EACX,gBAAgB,EApIQ,OAAO;EAqI/B,YAAY,EAAE,kCAAkC;;AAGlD,mBAAoB;EAClB,gBAAgB,EAzIQ,OAAO;;AA4IjC,oCAAqC;EACnC,MAAM,EAAE,IAAI;EACZ,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,KAAK,EAnJmB,OAAO;EAoJ/B,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,iBAAiB;EACzB,gBAAgB,EAAE,OAAO;EACzB,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG;EAClB,UAAU,EAAE,GAAG;EACf,aAAa,EAAE,GAAG;EAClB,YAAY,EAAE,IAAI;EAClB,aAAa,EAAE,IAAI;;AAIrB,uBAAwB;EACtB,WAAW,EAAE,IAAI;EACjB,KAAK,EAAE,IAAI;EACX,6BAAQ;IACN,KAAK,EAAE,IAAI;IACX,eAAe,EAAE,IAAI;IACrB,gBAAgB,EAAE,WAAW;EAE/B,8BAAS;IACP,OAAO,EAAE,EAAE;IACX,KAAK,EAAE,KAAK;IACZ,MAAM,EAAE,IAAI;IACZ,UAAU,EAAE,iDAAiD;IAC7D,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,MAAM;IACd,aAAa,EAAE,IAAI;;AAKvB,0EAA2E;EACzE,KAAK,EA5KmB,OAAO;;AA+KjC,yBAA0B;EACxB,gBAAgB,EAAE,OAAuB;;AAG3C,4BAA6B;EAC3B,gBAAgB,EA1LQ,OAAO;;AA4LjC,oCAAqC;EACnC,gBAAgB,EAAE,OAAuB;;AAG3C,yQAA0Q;EACxQ,gBAAgB,EAjMQ,OAAO;EAkM/B,uSAAQ;IACN,gBAAgB,EAAE,OAAuB;;AAI7C,8BAA+B;EAC7B,KAAK,EAAE,IAAI;;AAGb,qOAAoO;EAClO,WAAW,EAAE,IAAI;;AAGnB,8BAA+B;EAC7B,YAAY,EAAE,WAAW;;AAG3B,2DAA4D;EAC1D,gBAAgB,EAAE,kBAAkB;EACpC,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,iBAAqB;EAEpC,uEAAQ;IACN,gBAAgB,EAAE,kBAAkB;;AAGxC,4BAA6B;EAC3B,gBAAgB,EAAE,6BAA6B;EAC/C,KAAK,EAAE,wBACT;;AAEA,mBAAoB;EAClB,YAAY,EAAE,OAAO;;AAEvB,8BAA+B;EAC7B,YAAY,EAAE,OAAO;;AAEvB,2CAA4C;EAC1C,YAAY,EAAE,GAAG;EACjB,gBAAgB,EAAE,kBAAkB;;AAEtC,mCAAoC;EAClC,YAAY,EAAE,GAAG;;AAEnB,2CAA4C;EAC1C,YAAY,EAAE,KAAK;EACnB,gBAAgB,EAAE,6BAA6B;;AAEjD,mCAAmC;EACjC,YAAY,EAAE,KAAK;;AAErB,2CAA4C;EAC1C,YAAY,EAAE,KAAK;EACnB,gBAAgB,EAAE,6BAA6B;;AAEjD,mCAAoC;EAClC,YAAY,EAAE,KAAK;;AAErB,yDAA0D;EACxD,YAAY,EAAE,KAAK;;AAErB,yDAA0D;EACxD,YAAY,EAAE,KAAK;;AAGrB,mGAAoG;EAClG,KAAK,EAAE,IAAI;EACX,+GAAQ;IACN,OAAO,EAAE,GAAG;;AAIhB,wCAAyC;EACvC,KAAK,EAAE,sBACT;;AAIA,IAAI;EACA,WAAW,EAAE,GAAG;EAChB,cAAc,EAAC,GAAG;EAClB,WAAW,EAAE,IAAI;EACjB,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG;EAClB,MAAM,EAAE,GAAG;EACX,WAAW,EAAC,MAAM;EAClB,QAAQ,EAAC,MAAM;EACf,aAAa,EAAC,QAAQ;EACtB,UAAU,EAAE,GAAG;EACf,aAAa,EAAE,GAAG;EAClB,UAAU,EAAE,IAAI;EAChB,UAAQ;IACN,KAAK,EAAE,IAAI;IACX,gBAAgB,EAAE,kBAAkB;IACpC,YAAY,EAAE,OAAO;IACrB,eAAe,EAAE,IAAI;;AAI3B,YAAY;EACR,SAAS,EA/Qa,IAAI;EAgR1B,WAAW,EAtRW,GAAG;EAuRzB,KAAK,EArSiB,OAAO;EAsS7B,UAAU,EAAE,MAAM;EAClB,MAAM,EAAE,iBAA4B;EACpC,aAAa,EAAE,GAAG;EAClB,QAAQ,EAAE,MAAM;EAChB,UAAU,EAzSY,OAAO;EAyST,kBAAkB;EACtC,UAAU,EAAE,mDAAoD;EAAE,cAAc;EAChF,UAAU,EAAE,sDAAsD;EAAE,6BAA6B;EACjG,UAAU,EAAE,oDAAoD;EAAE,sDAAsD;EACxH,MAAM,EAAE,2GAA2G;EAAE,WAAW;;AAKpI,oCAAqC;EACnC,gBAAgB,EAAE,OAAiB;EACnC,WAAW,EA5Ta,oBAAoB;;AA8T9C,qBAAsB;EACpB,gBAAgB,EAAE,OAAkB;EACpC,MAAM,EAAE,iBAAiB;;AAQvB,0CAAkB;EAChB,gBAAgB,EAtUI,OAAO;AAwU7B,kCAAY;EACV,gBAAgB,EAAE,OAAoB;EACtC,oDAAkB;IAChB,gBAAgB,EAhUE,OAAO;AAmU7B,gCAAU;EACR,gBAAgB,EAAE,OAAoB;EACtC,kDAAkB;IAChB,gBAAgB,EAtUE,OAAO;AAyU7B,+BAAS;EACP,gBAAgB,EAAE,OAAiB;EACnC,iDAAkB;IAChB,gBAAgB,EA9UE,OAAO;AAiV7B,8BAAQ;EACN,gBAAgB,EAAE,OAAiB;EACnC,gDAAkB;IAChB,gBAAgB,EApVE,OAAO;AAuV7B,6BAAO;EACL,gBAAgB,EAAE,OAAO;EACzB,+CAAkB;IAChB,gBAAgB,EAzVE,OAAO;AA4V7B,kCAAY;EACV,gBAAgB,EAAE,OAAO;EACzB,oDAAkB;IAChB,gBAAgB,EA/VE,OAAO;AAkW7B,6BAAO;EACL,gBAAgB,EAAE,uBAAoB;EACtC,+CAAkB;IAChB,gBAAgB,EAAE,sBAAmB;IACrC,MAAM,EAAE,KAAK;EAEf,iEAAM;IACJ,UAAU,EAAE,KAAK;AAGrB,4BAAM;EACJ,gBAAgB,EAAE,OAAO;EACzB,8CAAkB;IAChB,gBAAgB,EA/WE,OAAO;AAkX7B,gCAAU;EACR,gBAAgB,EAAE,OAAoB;EACtC,kDAAkB;IAChB,gBAAgB,EApXE,OAAO;IAqXzB,MAAM,EAAE,KAAK;EAEf,uEAAM;IACJ,UAAU,EAAE,KAAK;;AAOzB,gGAAiG;EAC/F,MAAM,EAAE,iBAAiB;EACzB,aAAa,EAAE,iBACjB;;AAGE,4BAAuB;EACrB,WAAW,EAAE,CAAC;AAEhB,iBAAY;EACV,OAAO,EAAE,IAAI;AAEf,SAAI;EACF,KAAK,EAAE,eAAe;;AAM1B,KAAM;EACJ,QAAQ,EAAE,QAAQ;EAClB,WAAM;IACJ,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,CAAC;IACR,GAAG,EAAE,CAAC;IACN,uBAAY;MACV,OAAO,EAAE,IAAI;;AAKnB,4DAA6D;EAC3D,WAAW,EAAE,MAAM;;AAGrB,aAAc;EACZ,UAAU,EAAE,gCAA6B;EACzC,UAAU,EAAE,IAAI;EAChB,KAAK,EAAE,IAAI;EACX,gBAAgB,EAhbQ,OAAO;EAib/B,WAAW,EAAE,6CAA6C;EAC1D,sCAAyB;IACvB,KAAK,EApbiB,OAAO;IAqb7B,YAAY,EAAE,CAAC;EAEjB,kCAAqB;IACnB,gBAAgB,EAAE,OAAwB;IAC1C,KAAK,EAAE,OAAO;EAGhB,iCAAoB;IAClB,KAAK,EAAE,IAAI;;AAGf,+BAAgC;EAC9B,KAAK,EAAE,IAAI", +"sources": ["../../../sass/basler_overrides.scss"], +"names": [], +"file": "basler.css" +} diff --git a/v24.04/en/_static/css/default.css b/v24.04/en/_static/css/default.css new file mode 100644 index 0000000..0ad6e95 --- /dev/null +++ b/v24.04/en/_static/css/default.css @@ -0,0 +1,537 @@ +@import url("https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700"); +body, h1, h2, h3, h4, h5, h6, a, ul, li, p, span { + font-family: "Open Sans", Helvetica, sans-serif; } + +.reference { + white-space: pre; } + +.menuselection { + font-weight: 600; } + +.wy-nav-content { + background-color: #ffffff; + max-width: 900px; } + +.wy-nav-content-wrap { + background-color: #E2E6E9; } + +.codeblock, pre.literal-block, .rst-content .literal-block, .rst-content pre.literal-block, div[class^='highlight'] { + background-color: #f1f3f4; } + +body { + color: #647382; } + +b, strong { + vertical-align: top; } + +p, dd { + font-size: 16px; + color: #647382; + line-height: 1.5em; } + +p.first { + margin-bottom: 0 !important; } + +h1, h2, .rst-content .toctree-wrapper p.caption, h3, h4, h5, h6, legend { + font-weight: 100; + font-size: 25px; + color: #647382; + font-weight: 100; + margin-bottom: 0px; + line-height: 28px; + text-overflow: ellipsis; + display: block; + white-space: nowrap; } + +h1, h2, h3, h4, h5, h6 { + margin-bottom: 20px; } + +h1 { + font-size: 25px; } + +h2 { + font-size: 22px; } + +h3 { + font-size: 18px; + font-weight: 500; } + +h4 { + font-size: 16px; + font-weight: 600; } + +a { + color: #266782; } + a:active { + color: #266782; } + a:visited { + color: #266782; } + a:hover { + color: #3286a9; + text-decoration: underline; } + +@media (min-width: 768px) { + .wy-nav-content { + margin: 0; + padding: 0; + left: 300px; + max-width: 900px; } } + +@media (min-width: 768px) { + .document { + padding-top: 1.618em; + padding-left: 3.236em; + padding-right: 3.236em; } + .document div.section > h1, + .document div.section > h2, + .document div.section > h3, + .document div.section > h4, + .document div.section > h5, + .document div.section > h6, + .document div.section > dl > dt { + padding-top: 70px; + margin-top: -70px; + background: 0; } } + +@media (min-width: 768px) { + .wy-breadcrumbs { + background-color: #46505A; + height: 56px; + color: #FFF; + font-size: 14px; + padding-left: 10px; + position: fixed; + width: 900px; + z-index: 100; } + .wy-breadcrumbs + hr { + display: none; } + .wy-breadcrumbs li { + margin-top: 13px; } + .wy-breadcrumbs li:nth-last-child(2) { + opacity: 0.8; } + .wy-breadcrumbs li a { + color: #FFF; + text-decoration: none; + opacity: 0.8; } + .wy-breadcrumbs li a:hover { + opacity: 1.0; } } + +@media (min-width: 768px) { + .rst-content > footer { + padding-bottom: 1.618em; + padding-top: 0; + padding-left: 3.236em; + padding-right: 3.236em; } } + +@media (min-width: 768px) { + .rst-content > div:first-child { + height: 56px; } } + +.wy-nav-top { + background-color: #46505A; } + @media (max-width: 768px) { + .wy-nav-top a { + color: #FFF; + font-weight: 500; + font-size: 18px; } + .wy-nav-top a:hover { + color: #FFF; } + .wy-nav-top a:visited { + color: #FFF; } } + .wy-nav-top i { + color: #FFF; } + +.wy-nav-side { + background-color: #46505A; } + +.wy-side-nav-search { + background-color: #46505A; + text-align: left; + padding-top: 1px; + padding-left: 14px; } + +.wy-side-nav-search input[type=text] { + border: none; + font-size: 14px; + font-weight: 500; + color: #647382; + text-align: left; + border: 1px solid #dbdbdb; + background-color: #ffffff; + height: 36px; + border-radius: 2px; + margin-top: 2px; + margin-bottom: 2px; + padding-left: 10px; + padding-right: 10px; + margin-left: 5px; + width: 260px; } + +.wy-side-nav-search > div.version { + margin-left: 5px; } + +.wy-side-nav-search > a { + line-height: 1.3; + color: #fff; + font-weight: 500; + font-size: 18px; } + .wy-side-nav-search > a:hover { + color: #fff; + text-decoration: none; + background-color: transparent; } + .wy-side-nav-search > a:before { + content: ""; + width: 300px; + height: 45px; + background: url(../img/logo_roboception.svg) no-repeat; + display: block; + margin: auto auto 10px; } + +.wy-menu-vertical li a em { + display: contents; + font-style: normal; } + +.wy-menu-vertical header, .wy-menu-vertical p.caption, .wy-menu-vertical a { + color: #ffffff; } + +.wy-menu-vertical li { + border-top: 1px solid rgba(255, 255, 255, 0.25); } + +.wy-menu-vertical li a { + border-bottom: 4px solid transparent; + border-top: 4px solid transparent; } + +.wy-menu-vertical li.current { + background-color: #46505A; } + +.wy-menu-vertical li.toctree-l1.current { + background-color: #3a424b; } + +.wy-menu-vertical li.toctree-l1.current ul { + background-color: #3a424b; } + +.wy-menu-vertical li.toctree-l2.current ul { + background-color: #2c333a; } + +.wy-menu-vertical li.toctree-l3.current ul { + background-color: #1f2428; } + +.wy-menu-vertical li.current a { + color: #FFF; } + +.wy-menu-vertical li a { + line-height: 1.3; + height: 42px; + opacity: 0.8; + font-size: 14px; + font-weight: 500; + display: flex; + align-items: center; } + .wy-menu-vertical li a:hover { + opacity: 1.0; } + +.wy-menu-vertical li.current a { + border-color: transparent; } + +.wy-menu-vertical li.on a, .wy-menu-vertical li.current > a { + border-bottom: 4px solid #2D7a99; + border-top: 4px solid transparent; } + +.wy-menu-vertical li.toctree-l1 > a:hover { + background-color: #3a424b; } + .wy-menu-vertical li.toctree-l1 > a:hover span.toctree-expand { + opacity: 1; + color: #FFF; } + +.wy-menu-vertical li.toctree-l2 > a:hover { + background-color: #2c333a; } + .wy-menu-vertical li.toctree-l2 > a:hover span.toctree-expand { + opacity: 1; + color: #FFF; } + +.wy-menu-vertical li.current a { + font-weight: 500; } + .wy-menu-vertical li.current a:hover span.toctree-expand { + color: #FFF; + opacity: 1; } + +.wy-menu-vertical li.toctree-l1.current > a { + background-color: #3a424b; + padding-left: 1.618em; + opacity: 1; } + .wy-menu-vertical li.toctree-l1.current > a:hover { + background-color: #3a424b; } + +.wy-menu-vertical li.toctree-l2.current > a { + background-color: #2c333a; + padding-left: 2.5em; + opacity: 1; } + .wy-menu-vertical li.toctree-l2.current > a:hover { + background-color: #2c333a; } + +.wy-menu-vertical li.toctree-l4.current > a { + background-color: #121417; + padding-left: 4.5em; + opacity: 1; } + .wy-menu-vertical li.toctree-l4.current > a:hover { + background-color: #121417; } + +.wy-menu-vertical li.toctree-l2 > a { + padding-left: 2.5em; } + +.wy-menu-vertical li.toctree-l3 > a { + background-color: #121417; + padding-left: 3.5em; } + +.wy-menu-vertical li.toctree-l4 > a { + background-color: #121417; + padding-left: 4.5em; } + +.wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a { + background-color: #1f2428; + padding-left: 3.5em; + padding-right: 10px; + display: flex; + align-items: center; } + .wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a:hover { + background-color: #121417; } + +.wy-menu-vertical li.toctree-l2.current li.toctree-l3.current > a { + background-color: #121417; + opacity: 1; } + +.wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a { + background-color: #121417; + padding-left: 4.5em; + padding-right: 10px; + display: flex; + align-items: center; } + +.wy-menu-vertical li.toctree-l3 li.toctree-l4.current > a { + border-bottom: 4px solid #2D7a99; + border-top: 4px solid transparent; } + +.wy-menu-vertical li.on a:hover span.toctree-expand, .wy-menu-vertical li.current > a:hover span.toctree-expand, .wy-menu-vertical li > a:hover span.toctree-expand { + opacity: 1.0; } + +.wy-menu-vertical li.current > a span.toctree-expand { + color: #FFF; + line-height: 34px; + padding-right: 5px; + opacity: 1.0; + font-size: 14px; } + .wy-menu-vertical li.current > a span.toctree-expand + em { + display: contents; + font-style: normal; } + +.wy-menu-vertical li.on a span.toctree-expand, +.wy-menu-vertical li > a span.toctree-expand { + color: #FFF; + line-height: 34px; + padding-right: 5px; + opacity: 0; } + .wy-menu-vertical li.on a span.toctree-expand + em, + .wy-menu-vertical li > a span.toctree-expand + em { + display: contents; + font-style: normal; } + +.wy-menu-vertical li span.toctree-expand { + color: #FFF; + opacity: 0; + font-size: 14px; } + +.btn { + padding-top: 0px; + padding-bottom: 0px; + line-height: 34px; + height: 36px; + border-radius: 2px; + margin: 0px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin-top: 2px; + margin-bottom: 2px; + box-shadow: none; } + .btn:hover { + color: #333; + background-color: #e6e6e6 !important; + border-color: #adadad; + text-decoration: none; } + +.btn-neutral { + font-size: 14px; + font-weight: 600; + color: #647382; + text-align: center; + border: 1px solid #dae1e7; + border-radius: 2px; + overflow: hidden; + background: #F9FAFB; + /* Old browsers */ + background: -moz-linear-gradient(top, #ffffff 0%, #f5f5f5 100%); + /* FF3.6-15 */ + background: -webkit-linear-gradient(top, #ffffff 0%, #f5f5f5 100%); + /* Chrome10-25,Safari5.1-6 */ + background: linear-gradient(to bottom, #ffffff 0%, #f5f5f5 100%); + /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#f5f5f5',GradientType=0 ); + /* IE6-9 */ } + +.rst-content dl:not(.docutils) dt { + border-top: 0; + border-bottom: solid 3px #45a2c9; } + +.rst-content dl:not(.docutils) dt:first-child { + margin-top: -70px; } + +.rst-content .sidebar .sidebar-title { + background-color: #d4dade; + font-family: "Open Sans", Helvetica, sans-serif; } + +.rst-content .sidebar { + background-color: #f1f3f4; + border: 1px solid #e1e4e5; } + +.rst-content .admonition .admonition-title { + background-color: #266782; } +.rst-content .admonition.attention { + background-color: #ffeb99; } + .rst-content .admonition.attention .admonition-title { + background-color: #ffcc00; } +.rst-content .admonition.caution { + background-color: #ffeb99; } + .rst-content .admonition.caution .admonition-title { + background-color: #ffcc00; } +.rst-content .admonition.danger { + background-color: #ffeeed; } + .rst-content .admonition.danger .admonition-title { + background-color: #FF2D21; } +.rst-content .admonition.error { + background-color: #ffeeed; } + .rst-content .admonition.error .admonition-title { + background-color: #FF2D21; } +.rst-content .admonition.hint { + background-color: #ABF0AB; } + .rst-content .admonition.hint .admonition-title { + background-color: #07A50F; } +.rst-content .admonition.important { + background-color: #ABF0AB; } + .rst-content .admonition.important .admonition-title { + background-color: #07A50F; } +.rst-content .admonition.note { + background-color: #E2E6E9; } + .rst-content .admonition.note .admonition-title { + background-color: #266782; + margin: -12px; } + .rst-content .admonition.note p, .rst-content .admonition.note ul { + margin-top: 0.5em; } +.rst-content .admonition.tip { + background-color: #ABF0AB; } + .rst-content .admonition.tip .admonition-title { + background-color: #07A50F; } +.rst-content .admonition.warning { + background-color: #fff; + border: 1px solid #FF2D21; } + .rst-content .admonition.warning .admonition-title { + background-color: #FF2D21; + margin: -12px; } + .rst-content .admonition.warning p, .rst-content .admonition.warning ul { + margin-top: 0.5em; } + +.wy-table thead th, .rst-content table.docutils thead th, .rst-content table.field-list thead th { + border: solid 1px #e1e4e5; + border-bottom: solid 2px #e1e4e5; } + +table .first.last.line-block { + margin-left: 0; } +table .headerlink { + display: none; } +table col { + width: auto !important; } + +.math { + position: relative; } + .math .eqno { + position: absolute; + right: 0; + top: 0; } + .math .eqno .headerlink { + display: none; } + +.wy-table-responsive table td, .wy-table-responsive table th { + white-space: normal; } + +@media (min-width: 1200px) { + .rst-versions { + position: fixed; + bottom: unset; + top: 0; + right: 0; + left: 1000px; + width: 200px; + min-height: 56px; + background-color: #3a424b; + height: fit-content; + border-top: 0; + border-left: 1px solid rgba(255, 255, 255, 0.25); } + .rst-versions .rst-current-version { + background-color: #46505A; + color: #FFFFFF; + font-size: 14px; + font-family: "Open Sans", Helvetica, sans-serif; + line-height: 34px; + padding: 11px; + opacity: 0.8; } + .rst-versions .rst-current-version:before { + line-height: 34px; } + .rst-versions .rst-current-version:hover { + opacity: 1; } + .rst-versions .rst-current-version .fa.fa-cog { + line-height: 34px; } + .rst-versions .rst-other-versions dl:last-child dt { + border-top: 1px solid rgba(255, 255, 255, 0.25); + padding-top: 5px; } + .rst-versions .rst-other-versions dt, + .rst-versions .rst-other-versions dd { + color: #FFFFFF; + font-size: 14px; + font-family: "Open Sans", Helvetica, sans-serif; } + .rst-versions .rst-other-versions dt a, + .rst-versions .rst-other-versions dd a { + opacity: 0.8; + text-decoration: none; } + .rst-versions .rst-other-versions dt a:hover, + .rst-versions .rst-other-versions dd a:hover { + opacity: 1.0; } } + +@media (max-width: 1200px) { + .rst-versions { + border-top: 1px solid rgba(255, 255, 255, 0.25); + color: #FFF; + background-color: #46505A; + font-family: "Open Sans", Helvetica, sans-serif; } + .rst-versions .rst-other-versions dd a { + color: #FFF; + padding-left: 0; } + .rst-versions .rst-current-version { + background-color: #3a424b; + color: #FFFFFF; + font-size: 14px; + font-family: "Open Sans", Helvetica, sans-serif; } + .rst-versions .rst-other-versions dt, + .rst-versions .rst-other-versions dd { + color: #FFFFFF; + font-size: 14px; + font-family: "Open Sans", Helvetica, sans-serif; } + .rst-versions .rst-other-versions dt a, + .rst-versions .rst-other-versions dd a { + opacity: 0.8; + text-decoration: none; } + .rst-versions .rst-other-versions dt a:hover, + .rst-versions .rst-other-versions dd a:hover { + opacity: 1.0; } } +.rst-versions .rst-current-version .fa.fa-cog { + float: left; } + +/*# sourceMappingURL=default.css.map */ diff --git a/v24.04/en/_static/css/default.css.map b/v24.04/en/_static/css/default.css.map new file mode 100644 index 0000000..9eaa03c --- /dev/null +++ b/v24.04/en/_static/css/default.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "AACQ,gFAAwE;AAsChF,gDAAiD;EAC/C,WAAW,EArCa,kCAAkC;;AAwC5D,UAAW;EACT,WAAW,EAAE,GAAG;;AAGlB,cAAe;EACb,WAAW,EAAE,GAAG;;AAGlB,eAAgB;EACd,gBAAgB,EAnCQ,OAAO;EAoC/B,SAAS,EAAE,KAAK;;AAGlB,oBAAqB;EACnB,gBAAgB,EA5CQ,OAAO;;AA+CjC,mHAAoH;EAClH,gBAAgB,EAAE,OAAkB;;AAKtC,IAAK;EACH,KAAK,EA/DmB,OAAO;;AAkEjC,SAAU;EACR,cAAc,EAAE,GAAG;;AAGrB,KAAM;EACJ,SAAS,EAAE,IAAI;EACf,KAAK,EAxEmB,OAAO;EAyE/B,WAAW,EAAE,KAAK;;AAGpB,OAAQ;EACN,aAAa,EAAE,YAAY;;AAG7B,uEAAwE;EACtE,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,IAAI;EACf,KAAK,EAzEmB,OAAO;EA0E/B,WAAW,EAzDa,GAAG;EA0D3B,aAAa,EAAE,GAAG;EAClB,WAAW,EAAE,IAAI;EACjB,aAAa,EAAE,QAAQ;EACvB,OAAO,EAAE,KAAK;EACd,WAAW,EAAE,MAAM;;AAGrB,sBAAkB;EAChB,aAAa,EAAE,IAAI;;AAGrB,EAAG;EACD,SAAS,EAAE,IAAI;;AAEjB,EAAG;EACD,SAAS,EAAE,IAAI;;AAEjB,EAAE;EACA,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;;AAElB,EAAE;EACA,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;;AAGlB,CAAE;EACA,KAAK,EA9GmB,OAAO;EA+G/B,QAAS;IACP,KAAK,EAhHiB,OAAO;EAkH/B,SAAU;IACR,KAAK,EAnHiB,OAAO;EAqH/B,OAAQ;IACN,KAAK,EAAE,OAAwB;IAC/B,eAAe,EAAE,SAAS;;AAM5B,yBAA0B;EAD5B,eAAgB;IAEZ,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,KAAK;IACX,SAAS,EAAE,KAAK;;AAKlB,yBAA0B;EAD5B,SAAU;IAEN,WAAW,EAAE,OAAO;IACpB,YAAY,EAAE,OAAO;IACrB,aAAa,EAAE,OAAO;IAEtB;;;;;;mCAMsB;MACpB,WAAW,EAAE,IAAI;MACjB,UAAU,EAAE,KAAK;MACjB,UAAU,EAAE,CAAC;;AAMjB,yBAA0B;EAD5B,eAAgB;IAEZ,gBAAgB,EA1JM,OAAO;IA2J7B,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,IAAI;IACX,SAAS,EAAE,IAAI;IACf,YAAY,EAAE,IAAI;IAClB,QAAQ,EAAE,KAAK;IACf,KAAK,EAAE,KAAK;IACZ,OAAO,EAAE,GAAG;IAEZ,oBAAK;MACH,OAAO,EAAE,IAAI;IAGf,kBAAG;MACD,UAAU,EAAE,IAAI;IAGlB,oCAAqB;MACnB,OAAO,EAAE,GAAG;IAGd,oBAAK;MACH,KAAK,EAAE,IAAI;MACX,eAAe,EAAE,IAAI;MACrB,OAAO,EAAE,GAAG;MAEZ,0BAAQ;QACN,OAAO,EAAE,GAAG;;AAOlB,yBAA0B;EAD5B,qBAAsB;IAElB,cAAc,EAAE,OAAO;IACvB,WAAW,EAAE,CAAC;IACd,YAAY,EAAE,OAAO;IACrB,aAAa,EAAE,OAAO;;AAKxB,yBAA0B;EAD5B,8BAA+B;IAE3B,MAAM,EAAE,IAAI;;AAMhB,WAAY;EACV,gBAAgB,EA7MQ,OAAO;EA+M7B,yBAA0B;IAD5B,aAAE;MAEE,KAAK,EAAE,IAAI;MACX,WAAW,EAAE,GAAG;MAChB,SAAS,EAAE,IAAI;MACf,mBAAQ;QACN,KAAK,EAAE,IAAI;MAEb,qBAAU;QACR,KAAK,EAAE,IAAI;EAIjB,aAAE;IACA,KAAK,EAAE,IAAI;;AAIf,YAAa;EACX,gBAAgB,EAjOQ,OAAO;;AAqOjC,mBAAoB;EAClB,gBAAgB,EAtOQ,OAAO;EAuO/B,UAAU,EAAE,IAAI;EAChB,WAAW,EAAE,GAAG;EAChB,YAAY,EAAE,IAAI;;AAGpB,oCAAqC;EACnC,MAAM,EAAE,IAAI;EACZ,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,KAAK,EAnPmB,OAAO;EAoP/B,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,iBAAiB;EACzB,gBAAgB,EAAE,OAAO;EACzB,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG;EAClB,UAAU,EAAE,GAAG;EACf,aAAa,EAAE,GAAG;EAClB,YAAY,EAAE,IAAI;EAClB,aAAa,EAAE,IAAI;EACnB,WAAW,EAAE,GAAG;EAChB,KAAK,EAAE,KAAK;;AAGd,iCAAkC;EAChC,WAAW,EAAE,GAAG;;AAGlB,uBAAwB;EACtB,WAAW,EAAE,GAAG;EAChB,KAAK,EAAE,IAAI;EACX,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,IAAI;EAEf,6BAAQ;IACN,KAAK,EAAE,IAAI;IACX,eAAe,EAAE,IAAI;IACrB,gBAAgB,EAAE,WAAW;EAE/B,8BAAS;IACP,OAAO,EAAE,EAAE;IACX,KAAK,EAAE,KAAK;IACZ,MAAM,EAAE,IAAI;IACZ,UAAU,EAAE,0CAA0C;IACtD,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,cAAc;;AAI1B,yBAA0B;EACxB,OAAO,EAAE,QAAQ;EACjB,UAAU,EAAE,MAAM;;AAGpB,0EAA2E;EACzE,KAAK,EAnRmB,OAAO;;AAsRjC,oBAAqB;EACnB,UAAU,EAAE,mCAAmC;;AAGjD,sBAAuB;EACrB,aAAa,EAAE,qBAAqB;EACpC,UAAU,EAAE,qBAAqB;;AAGnC,4BAA6B;EAC3B,gBAAgB,EA1SQ,OAAO;;AA6SjC,uCAAwC;EACtC,gBAAgB,EA7SQ,OAAO;;AAgTjC,0CAA2C;EACzC,gBAAgB,EAjTQ,OAAO;;AAoTjC,0CAA2C;EACzC,gBAAgB,EApTQ,OAAO;;AAuTjC,0CAA2C;EACzC,gBAAgB,EAvTQ,OAAO;;AA0TjC,8BAA+B;EAC7B,KAAK,EAAE,IAAI;;AAGb,sBAAuB;EACrB,WAAW,EAAE,GAAG;EAChB,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;EAEnB,4BAAQ;IACN,OAAO,EAAE,GAAG;;AAIhB,8BAA+B;EAC7B,YAAY,EAAE,WAAW;;AAG3B,2DAA4D;EAC1D,aAAa,EAAE,iBAAkB;EACjC,UAAU,EAAE,qBAAqB;;AAGnC,yCAA0C;EACxC,gBAAgB,EAxVQ,OAAO;EAyV/B,6DAAoB;IAClB,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,IAAI;;AAIf,yCAA0C;EACxC,gBAAgB,EA/VQ,OAAO;EAgW/B,6DAAoB;IAClB,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,IAAI;;AAIf,8BAA+B;EAC7B,WAAW,EAAE,GAAG;EAEd,wDAAoB;IAClB,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,CAAC;;AAKhB,2CAA4C;EAC1C,gBAAgB,EAlXQ,OAAO;EAmX/B,YAAY,EAAE,OAAO;EACrB,OAAO,EAAE,CAAC;EACV,iDAAQ;IACN,gBAAgB,EAtXM,OAAO;;AA0XjC,2CAA4C;EAC1C,gBAAgB,EA1XQ,OAAO;EA2X/B,YAAY,EAAE,KAAK;EACnB,OAAO,EAAE,CAAC;EACV,iDAAQ;IACN,gBAAgB,EA9XM,OAAO;;AAkYjC,2CAA4C;EAC1C,gBAAgB,EAjYQ,OAAO;EAkY/B,YAAY,EAAE,KAAK;EACnB,OAAO,EAAE,CAAC;EACV,iDAAQ;IACN,gBAAgB,EArYM,OAAO;;AAyYjC,mCAAoC;EAClC,YAAY,EAAE,KAAK;;AAGrB,mCAAoC;EAClC,gBAAgB,EA9YQ,OAAO;EA+Y/B,YAAY,EAAE,KAAK;;AAGrB,mCAAoC;EAClC,gBAAgB,EAnZQ,OAAO;EAoZ/B,YAAY,EAAE,KAAK;;AAGrB,yDAA0D;EACxD,gBAAgB,EAzZQ,OAAO;EA0Z/B,YAAY,EAAE,KAAK;EACnB,aAAa,EAAE,IAAI;EACnB,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;EACnB,+DAAQ;IACN,gBAAgB,EA9ZM,OAAO;;AAkajC,iEAAkE;EAChE,gBAAgB,EAnaQ,OAAO;EAoa/B,OAAO,EAAE,CAAC;;AAGZ,yDAA0D;EACxD,gBAAgB,EAxaQ,OAAO;EAya/B,YAAY,EAAE,KAAK;EACnB,aAAa,EAAE,IAAI;EACnB,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;;AAGrB,yDAA0D;EACxD,aAAa,EAAE,iBAAkB;EACjC,UAAU,EAAE,qBAAqB;;AAKjC,mKAA4B;EAC1B,OAAO,EAAE,GAAG;;AAIhB,oDAAqD;EACnD,KAAK,EAAE,IAAI;EACX,WAAW,EAAE,IAAI;EACjB,aAAa,EAAE,GAAG;EAClB,OAAO,EAAE,GAAG;EACZ,SAAS,EAAE,IAAI;EAEf,yDAAK;IACH,OAAO,EAAE,QAAQ;IACjB,UAAU,EAAE,MAAM;;AAItB;4CAC6C;EAC3C,KAAK,EAAE,IAAI;EACX,WAAW,EAAE,IAAI;EACjB,aAAa,EAAE,GAAG;EAClB,OAAO,EAAE,CAAC;EAEV;mDAAK;IACH,OAAO,EAAE,QAAQ;IACjB,UAAU,EAAE,MAAM;;AAItB,wCAAyC;EACvC,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,CAAC;EACV,SAAS,EAAE,IAAI;;AAKjB,IAAI;EACA,WAAW,EAAE,GAAG;EAChB,cAAc,EAAC,GAAG;EAClB,WAAW,EAAE,IAAI;EACjB,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG;EAClB,MAAM,EAAE,GAAG;EACX,WAAW,EAAC,MAAM;EAClB,QAAQ,EAAC,MAAM;EACf,aAAa,EAAC,QAAQ;EACtB,UAAU,EAAE,GAAG;EACf,aAAa,EAAE,GAAG;EAClB,UAAU,EAAE,IAAI;EAChB,UAAQ;IACN,KAAK,EAAE,IAAI;IACX,gBAAgB,EAAE,kBAAkB;IACpC,YAAY,EAAE,OAAO;IACrB,eAAe,EAAE,IAAI;;AAI3B,YAAY;EACR,SAAS,EA3da,IAAI;EA4d1B,WAAW,EAleW,GAAG;EAmezB,KAAK,EAlfiB,OAAO;EAmf7B,UAAU,EAAE,MAAM;EAClB,MAAM,EAAE,iBAA4B;EACpC,aAAa,EAAE,GAAG;EAClB,QAAQ,EAAE,MAAM;EAChB,UAAU,EAtfY,OAAO;EAsfT,kBAAkB;EACtC,UAAU,EAAE,mDAAoD;EAAE,cAAc;EAChF,UAAU,EAAE,sDAAsD;EAAE,6BAA6B;EACjG,UAAU,EAAE,oDAAoD;EAAE,sDAAsD;EACxH,MAAM,EAAE,2GAA2G;EAAE,WAAW;;AAKpI,iCAAkC;EAChC,UAAU,EAAE,CAAC;EACb,aAAa,EAAE,iBAAmC;;AAGpD,6CAA8C;EAC5C,UAAU,EAAE,KAAK;;AAInB,oCAAqC;EACnC,gBAAgB,EAAE,OAAiB;EACnC,WAAW,EAvhBa,kCAAkC;;AAyhB5D,qBAAsB;EACpB,gBAAgB,EAAE,OAAkB;EACpC,MAAM,EAAE,iBAAiB;;AAQvB,0CAAkB;EAChB,gBAAgB,EAjhBI,OAAO;AAmhB7B,kCAAY;EACV,gBAAgB,EAAE,OAAoB;EACtC,oDAAkB;IAChB,gBAAgB,EAvhBE,OAAO;AA0hB7B,gCAAU;EACR,gBAAgB,EAAE,OAAoB;EACtC,kDAAkB;IAChB,gBAAgB,EA7hBE,OAAO;AAgiB7B,+BAAS;EACP,gBAAgB,EAAE,OAAiB;EACnC,iDAAkB;IAChB,gBAAgB,EAriBE,OAAO;AAwiB7B,8BAAQ;EACN,gBAAgB,EAAE,OAAiB;EACnC,gDAAkB;IAChB,gBAAgB,EA3iBE,OAAO;AA8iB7B,6BAAO;EACL,gBAAgB,EAAE,OAAO;EACzB,+CAAkB;IAChB,gBAAgB,EAhjBE,OAAO;AAmjB7B,kCAAY;EACV,gBAAgB,EAAE,OAAO;EACzB,oDAAkB;IAChB,gBAAgB,EAtjBE,OAAO;AAyjB7B,6BAAO;EACL,gBAAgB,EAAE,OAAO;EACzB,+CAAkB;IAChB,gBAAgB,EA1jBE,OAAO;IA2jBzB,MAAM,EAAE,KAAK;EAEf,iEAAM;IACJ,UAAU,EAAE,KAAK;AAGrB,4BAAM;EACJ,gBAAgB,EAAE,OAAO;EACzB,8CAAkB;IAChB,gBAAgB,EAtkBE,OAAO;AAykB7B,gCAAU;EACR,gBAAgB,EAAE,IAAI;EACtB,MAAM,EAAE,iBAAc;EACtB,kDAAkB;IAChB,gBAAgB,EA9kBE,OAAO;IA+kBzB,MAAM,EAAE,KAAK;EAEf,uEAAM;IACJ,UAAU,EAAE,KAAK;;AAOzB,gGAAiG;EAC/F,MAAM,EAAE,iBAAiB;EACzB,aAAa,EAAE,iBACjB;;AAGE,4BAAuB;EACrB,WAAW,EAAE,CAAC;AAEhB,iBAAY;EACV,OAAO,EAAE,IAAI;AAEf,SAAI;EACF,KAAK,EAAE,eAAe;;AAM1B,KAAM;EACJ,QAAQ,EAAE,QAAQ;EAClB,WAAM;IACJ,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,CAAC;IACR,GAAG,EAAE,CAAC;IACN,uBAAY;MACV,OAAO,EAAE,IAAI;;AAKnB,4DAA6D;EAC3D,WAAW,EAAE,MAAM;;AAMnB,0BAA2B;EAD7B,aAAc;IAEV,QAAQ,EAAE,KAAK;IACf,MAAM,EAAE,KAAK;IACb,GAAG,EAAE,CAAC;IACN,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,KAAK;IACZ,UAAU,EAAE,IAAI;IAChB,gBAAgB,EAlpBM,OAAO;IAmpB7B,MAAM,EAAE,WAAW;IACnB,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,mCAAmC;IAEhD,kCAAqB;MACnB,gBAAgB,EAzpBI,OAAO;MA0pB3B,KAAK,EAAE,OAAO;MACd,SAAS,EAAE,IAAI;MACf,WAAW,EAhqBS,kCAAkC;MAiqBtD,WAAW,EAAE,IAAI;MACjB,OAAO,EAAE,IAAI;MACb,OAAO,EAAE,GAAG;MAEZ,yCAAS;QACP,WAAW,EAAE,IAAI;MAGnB,wCAAQ;QACN,OAAO,EAAE,CAAC;MAGZ,6CAAW;QACT,WAAW,EAAE,IAAI;IAKrB,kDAAqC;MACnC,UAAU,EAAE,mCAAmC;MAC/C,WAAW,EAAE,GAAG;IAGlB;wCACuB;MACrB,KAAK,EAAE,OAAO;MACd,SAAS,EAAE,IAAI;MACf,WAAW,EA5rBS,kCAAkC;MA8rBtD;4CAAE;QACA,OAAO,EAAE,GAAG;QACZ,eAAe,EAAE,IAAI;MAGvB;kDAAQ;QACN,OAAO,EAAE,GAAG;;AAOlB,0BAA2B;EAD7B,aAAc;IAGV,UAAU,EAAE,mCAAmC;IAC/C,KAAK,EAAE,IAAI;IACX,gBAAgB,EA3sBM,OAAO;IA4sB7B,WAAW,EAhtBW,kCAAkC;IAitBxD,sCAAyB;MACvB,KAAK,EAAE,IAAI;MACX,YAAY,EAAE,CAAC;IAEjB,kCAAqB;MACnB,gBAAgB,EAjtBI,OAAO;MAktB3B,KAAK,EAAE,OAAO;MACd,SAAS,EAAE,IAAI;MACf,WAAW,EAztBS,kCAAkC;IA4tBxD;wCACuB;MACrB,KAAK,EAAE,OAAO;MACd,SAAS,EAAE,IAAI;MACf,WAAW,EAhuBS,kCAAkC;MAkuBtD;4CAAE;QACA,OAAO,EAAE,GAAG;QACZ,eAAe,EAAE,IAAI;MAGvB;kDAAQ;QACN,OAAO,EAAE,GAAG;AAIlB,6CAAgC;EAC9B,KAAK,EAAE,IAAI", +"sources": ["../../../sass/default_overrides.scss"], +"names": [], +"file": "default.css" +} diff --git a/v24.04/en/_static/css/kuka.css b/v24.04/en/_static/css/kuka.css new file mode 100644 index 0000000..69d766d --- /dev/null +++ b/v24.04/en/_static/css/kuka.css @@ -0,0 +1,377 @@ +/* BEGIN Regular */ +@font-face { + font-family: 'Kuka Bulo'; + src: url("../fonts/KUKA-Bulo-WEB.eot"); + src: url("../fonts/KUKA-Bulo-WEB.eot") format("embedded-opentype"), url("../fonts/KUKA-Bulo-WEB.woff2") format("woff2"), url("../fonts/KUKA-Bulo-WEB.woff") format("woff"), url("../fonts/KUKA-Bulo-WEB.ttf") format("truetype"), url("../fonts/KUKA-Bulo-WEB.svg") format("svg"); + font-style: normal; + font-weight: normal; } +/* END Regular */ +/* BEGIN Bold */ +@font-face { + font-family: 'Kuka Bulo Bold'; + src: url("../fonts/KUKA-Bulo-Bold-WEB.eot"); + src: url("../fonts/KUKA-Bulo-Bold-WEB.eot") format("embedded-opentype"), url("../fonts/KUKA-Bulo-Bold-WEB.woff2") format("woff2"), url("../fonts/KUKA-Bulo-Bold-WEB.woff") format("woff"), url("../fonts/KUKA-Bulo-Bold-WEB.ttf") format("truetype"), url("../fonts/KUKA-Bulo-Bold-WEB.svg") format("svg"); + font-style: normal; + font-weight: bold; } +/* END Bold */ +body, h1, h2, h3, h4, h5, h6, a, ul, li, p, span { + font-family: "Kuka Bulo", "Calibri", Helvetica, sans-serif; } + +.wy-nav-content { + background-color: #ffffff; } + +.wy-nav-content-wrap { + background-color: #ECEDEE; } + +.codeblock, pre.literal-block, .rst-content .literal-block, .rst-content pre.literal-block, div[class^='highlight'] { + background-color: #f9fafa; } + +body { + color: #676C71; } + +b, strong { + vertical-align: top; } + +p { + font-size: 16px; + color: #676C71; } + +p.first { + margin-bottom: 0 !important; } + +h1, h2, .rst-content .toctree-wrapper p.caption, h3, h4, h5, h6, legend { + font-weight: 100; + font-size: 25px; + color: #66696d; + font-weight: normal; + margin-bottom: 0px; + line-height: 28px; + text-overflow: ellipsis; + display: block; + white-space: nowrap; } + +h1, h2, h3, h4, h5, h6 { + margin-bottom: 20px; } + +h1 { + font-size: 25px; } + +h2 { + font-size: 22px; } + +h3 { + font-size: 18px; + font-weight: 500; } + +h4 { + font-size: 16px; + font-weight: 600; } + +a { + color: #FF5800; } + a:active { + color: #FF5800; } + a:visited { + color: #FF5800; } + a:hover { + color: #ff7933; + text-decoration: underline; } + +.wy-nav-top { + background-color: transparent; } + @media (max-width: 768px) { + .wy-nav-top a { + color: #676C71; } + .wy-nav-top a:hover { + color: #676C71; } + .wy-nav-top a:visited { + color: #676C71; } } + .wy-nav-top i { + color: #676C71; } + +.wy-nav-side { + background-color: #676C71; + background-image: linear-gradient(to bottom, #fff 0%, #dbdcdd 100%); } + +.wy-side-nav-search { + background-color: transparent; } + .wy-side-nav-search a { + width: 100%; + text-align: left; + padding-left: 10px; } + +.wy-side-nav-search > div.version { + color: #676C71; + text-align: left; + padding-left: 10px; } + +.wy-side-nav-search input[type=text] { + border: none; + font-size: 14px; + font-weight: 400; + color: #676C71; + text-align: left; + border: none; + border-bottom: 2px solid #595d61; + background-color: transparent; + height: 36px; + border-radius: 2px; + margin-top: 2px; + margin-bottom: 2px; + padding-left: 10px; + padding-right: 10px; + box-shadow: none; } + +.wy-side-nav-search > a { + line-height: 20px; + color: #595d61; } + .wy-side-nav-search > a:hover { + color: #595d61; + text-decoration: none; + background-color: transparent; } + .wy-side-nav-search > a:before { + content: ""; + width: 92px; + height: 35px; + background: url(../img/logo_kuka.svg) no-repeat center; + display: block; + margin-bottom: 20px; + margin-left: 0px; + background-size: 120px; + background-position: -14px 0px; } + +.wy-menu-vertical header, .wy-menu-vertical p.caption, .wy-menu-vertical a { + color: #595d61; } + +.wy-menu-vertical a:hover { + background-color: #5b5f64; } + +.wy-menu-vertical li.current { + background-color: transparent; } + +.wy-menu-vertical li.current a:hover { + background-color: #5b5f64; } + +.wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a, .wy-menu-vertical li.toctree-l3.current > a, .wy-menu-vertical li.toctree-l2.current > a, .wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a, .wy-menu-vertical li.toctree-l4 li.toctree-l5.current > a { + background-color: transparent; } + .wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a:hover, .wy-menu-vertical li.toctree-l3.current > a:hover, .wy-menu-vertical li.toctree-l2.current > a:hover, .wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a:hover, .wy-menu-vertical li.toctree-l4 li.toctree-l5.current > a:hover { + background-color: #5b5f64; } + +.wy-menu-vertical li.current a { + color: #595d61; } + .wy-menu-vertical li.current a:hover { + color: #595d61; } + +.wy-menu-vertical li a { + color: #595d61; } + .wy-menu-vertical li a:hover { + color: #595d61; } + +.wy-menu-vertical li a, .wy-menu-vertical li.on a span.toctree-expand, .wy-menu-vertical li.current > a span.toctree-expand, .wy-menu-vertical li.toctree-l3 span.toctree-expand, .wy-menu-vertical li.toctree-l2 span.toctree-expand { + line-height: 26px; } + +.wy-menu-vertical li.current a { + border-color: transparent; } + +.wy-menu-vertical li.on a, .wy-menu-vertical li.current > a { + color: #FF5800; + border-bottom: none !important; + background-color: transparent; + border: none; + border-bottom: 2px solid #FF5800; } + .wy-menu-vertical li.on a:hover, .wy-menu-vertical li.current > a:hover { + color: #FF5800; + border-bottom: none !important; + background-color: transparent; } + +.wy-menu-vertical li a:hover { + color: #595d61; + border-bottom: none !important; + background-color: transparent !important; } + +.wy-menu-vertical a { + padding-left: 1.618em; } + +.wy-menu-vertical li.current a { + padding-left: 1.618em; } + +.wy-menu-vertical li.toctree-l2.current > a { + padding-left: 3em; + color: #FF5800; + border-bottom: none !important; + background-color: transparent; } + +.wy-menu-vertical li.toctree-l2 > a { + padding-left: 3em; } + +.wy-menu-vertical li.toctree-l3.current > a { + padding-left: 4.5em; + color: #FF5800; + border-bottom: none !important; + background-color: transparent !important; } + +.wy-menu-vertical li.toctree-l3 > a { + padding-left: 4.5em; } + +.wy-menu-vertical li.toctree-l4.current > a { + padding-left: 5.5em; + color: #FF5800; + border-bottom: none !important; + background-color: transparent !important; } + +.wy-menu-vertical li.toctree-l4 > a { + padding-left: 5.5em; } + +.wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a { + padding-left: 4.5em; } + +.wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a { + padding-left: 5.5em; } + +.wy-menu-vertical li.on a span.toctree-expand, .wy-menu-vertical li.current > a span.toctree-expand { + color: #595d61; } + +.btn { + line-height: 34px; + height: 45px; + padding: 5px 20px; + border-radius: 0px; + margin: 0px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin-top: 2px; + margin-bottom: 2px; + box-shadow: none; + border: none; } + .btn:hover { + color: #FFF; + background-color: #5A5A5A !important; + border-color: #adadad; + text-decoration: none; } + +.btn-neutral { + font-size: 16px; + font-weight: bold; + color: #FFF !important; + text-align: center; + border: 1px solid #d6d6d8; + border-radius: 0px; + overflow: hidden; + background: #F0F0F1; + /* Old browsers */ + background: -moz-linear-gradient(top, #737B82 0%, #5A5A5A 100%); + /* FF3.6-15 */ + background: -webkit-linear-gradient(top, #737B82 0%, #5A5A5A 100%); + /* Chrome10-25,Safari5.1-6 */ + background: linear-gradient(to bottom, #737B82 0%, #5A5A5A 100%); + /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#737B82', endColorstr='#5A5A5A',GradientType=0 ); + /* IE6-9 */ + border: none !important; } + .btn-neutral:hover { + color: #FFF; + background-color: #5A5A5A !important; + border: none; + text-decoration: none; } + .btn-neutral:visited { + color: #FFF !important; } + .btn-neutral:active { + color: #FFF !important; } + +.rst-content .sidebar .sidebar-title { + background-color: #dfe0e2; + font-family: "Kuka Bulo", "Calibri", Helvetica, sans-serif; } + +.rst-content .sidebar { + background-color: #f9fafa; + border: 1px solid #e1e4e5; } + +.rst-content .admonition .admonition-title { + background-color: #006FA0; } +.rst-content .admonition.attention { + background-color: #ffeb99; } + .rst-content .admonition.attention .admonition-title { + background-color: #FFCD00; } +.rst-content .admonition.caution { + background-color: #ffeb99; } + .rst-content .admonition.caution .admonition-title { + background-color: #FFCD00; } +.rst-content .admonition.danger { + background-color: #ff8181; } + .rst-content .admonition.danger .admonition-title { + background-color: #B40000; } +.rst-content .admonition.error { + background-color: #ff8181; } + .rst-content .admonition.error .admonition-title { + background-color: #B40000; } +.rst-content .admonition.hint { + background-color: #ABF0AB; } + .rst-content .admonition.hint .admonition-title { + background-color: #00780A; } +.rst-content .admonition.important { + background-color: #ABF0AB; } + .rst-content .admonition.important .admonition-title { + background-color: #00780A; } +.rst-content .admonition.note { + background-color: #A6D1E4; } + .rst-content .admonition.note .admonition-title { + background-color: #006FA0; } +.rst-content .admonition.tip { + background-color: #ABF0AB; } + .rst-content .admonition.tip .admonition-title { + background-color: #00780A; } +.rst-content .admonition.warning { + background-color: #ffeb99; } + .rst-content .admonition.warning .admonition-title { + background-color: #FFCD00; } + +.wy-plain-list-disc li li, .rst-content .section ul li li, .rst-content .toctree-wrapper ul li li, article ul li li { + list-style-type: none; } + .wy-plain-list-disc li li:before, .rst-content .section ul li li:before, .rst-content .toctree-wrapper ul li li:before, article ul li li:before { + content: "\2013"; + position: relative; + left: -10px; } + +.wy-table thead th, .rst-content table.docutils thead th, .rst-content table.field-list thead th { + border: solid 1px #e1e4e5; + border-bottom: solid 2px #e1e4e5; } + +table .first.last.line-block { + margin-left: 0; } +table .headerlink { + display: none; } +table col { + width: auto !important; } + +.math { + position: relative; } + .math .eqno { + position: absolute; + right: 0; + top: 0; } + .math .eqno .headerlink { + display: none; } + +.wy-table-responsive table td, .wy-table-responsive table th { + white-space: normal; } + +.rst-versions { + background-image: linear-gradient(to bottom, #fff 0%, #dbdcdd 100%); + box-shadow: -2px -3px 6px rgba(0, 0, 0, 0.4); + border-top: none; + color: #676C71; + font-family: "Kuka Bulo", "Calibri", Helvetica, sans-serif; } + .rst-versions .rst-other-versions dd a { + color: #FF5800; + padding-left: 0; } + .rst-versions .rst-current-version { + background-color: #66696d; + color: #FFFFFF; } + .rst-versions .rst-other-versions { + color: #676C71; } + +.rst-current-version .fa.fa-cog { + float: left; } + +/*# sourceMappingURL=kuka.css.map */ diff --git a/v24.04/en/_static/css/kuka.css.map b/v24.04/en/_static/css/kuka.css.map new file mode 100644 index 0000000..af3277a --- /dev/null +++ b/v24.04/en/_static/css/kuka.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "AAGA,mBAAmB;AACnB,UAUC;EATC,WAAW,EAAE,WAAW;EACxB,GAAG,EAAG,iCAAoC;EAC1C,GAAG,EAAG,4QAIkD;EACtD,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,MAAM;AAEvB,iBAAiB;AAGjB,gBAAgB;AAChB,UAUC;EATC,WAAW,EAAE,gBAAgB;EAC7B,GAAG,EAAG,sCAAyC;EAC/C,GAAG,EAAG,qSAIuD;EAC3D,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,IAAI;AAErB,cAAc;AAkCd,gDAAiD;EAC/C,WAAW,EAjCa,6CAA6C;;AAoCvE,eAAgB;EACd,gBAAgB,EA3BQ,OAAO;;AA8BjC,oBAAqB;EACnB,gBAAgB,EAnCQ,OAAO;;AAsCjC,mHAAoH;EAClH,gBAAgB,EAAE,OAAkB;;AAKtC,IAAK;EACH,KAAK,EAlDmB,OAAO;;AAqDjC,SAAU;EACR,cAAc,EAAE,GAAG;;AAGrB,CAAC;EACG,SAAS,EAAE,IAAI;EACf,KAAK,EA3DiB,OAAO;;AA8DjC,OAAQ;EACN,aAAa,EAAE,YAAY;;AAG7B,uEAAwE;EACtE,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,IAAI;EACf,KAAK,EA/DmB,OAAO;EAgE/B,WAAW,EAhDa,MAAM;EAiD9B,aAAa,EAAE,GAAG;EAClB,WAAW,EAAE,IAAI;EACjB,aAAa,EAAE,QAAQ;EACvB,OAAO,EAAE,KAAK;EACd,WAAW,EAAE,MAAM;;AAGrB,sBAAkB;EAChB,aAAa,EAAE,IAAI;;AAGrB,EAAG;EACD,SAAS,EAAE,IAAI;;AAEjB,EAAG;EACD,SAAS,EAAE,IAAI;;AAEjB,EAAE;EACA,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;;AAElB,EAAE;EACA,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;;AAGlB,CAAE;EACA,KAAK,EAhGmB,OAAO;EAiG/B,QAAS;IACP,KAAK,EAlGiB,OAAO;EAoG/B,SAAU;IACR,KAAK,EArGiB,OAAO;EAuG/B,OAAQ;IACN,KAAK,EAAE,OAAwB;IAC/B,eAAe,EAAE,SAAS;;AAK9B,WAAY;EACV,gBAAgB,EAAE,WAAW;EAE3B,yBAA0B;IAD5B,aAAE;MAEE,KAAK,EApHe,OAAO;MAqH3B,mBAAQ;QACN,KAAK,EAtHa,OAAO;MAwH3B,qBAAU;QACR,KAAK,EAzHa,OAAO;EA6H/B,aAAE;IACA,KAAK,EA9HiB,OAAO;;AAiIjC,YAAa;EACX,gBAAgB,EA/HQ,OAAO;EAgI/B,gBAAgB,EAAE,iDAA+C;;AAInE,mBAAoB;EAClB,gBAAgB,EAAE,WAAW;EAC7B,qBAAE;IACA,KAAK,EAAE,IAAI;IACX,UAAU,EAAE,IAAI;IAChB,YAAY,EAAE,IAAI;;AAItB,iCAAkC;EAChC,KAAK,EAjJmB,OAAO;EAkJ/B,UAAU,EAAE,IAAI;EAChB,YAAY,EAAE,IAAI;;AAGpB,oCAAqC;EACnC,MAAM,EAAE,IAAI;EACZ,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,KAAK,EA1JmB,OAAO;EA2J/B,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,iBAAiB;EAChC,gBAAgB,EAAE,WAAW;EAC7B,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG;EAClB,UAAU,EAAE,GAAG;EACf,aAAa,EAAE,GAAG;EAClB,YAAY,EAAE,IAAI;EAClB,aAAa,EAAE,IAAI;EACnB,UAAU,EAAE,IAAI;;AAIlB,uBAAwB;EACtB,WAAW,EAAE,IAAI;EACjB,KAAK,EAAE,OAAO;EACd,6BAAQ;IACN,KAAK,EAAE,OAAO;IACd,eAAe,EAAE,IAAI;IACrB,gBAAgB,EAAE,WAAW;EAE/B,8BAAS;IACP,OAAO,EAAE,EAAE;IACX,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;IACZ,UAAU,EAAE,0CAA0C;IACtD,OAAO,EAAE,KAAK;IACd,aAAa,EAAE,IAAI;IACnB,WAAW,EAAE,GAAG;IAChB,eAAe,EAAE,KAAK;IACtB,mBAAmB,EAAE,SAAS;;AAIlC,0EAA2E;EACzE,KAAK,EAAE,OAAO;;AAGhB,yBAA0B;EACxB,gBAAgB,EAAE,OAAuB;;AAG3C,4BAA6B;EAC3B,gBAAgB,EAAE,WAAW;;AAE/B,oCAAqC;EACnC,gBAAgB,EAAE,OAAuB;;AAG3C,yQAA0Q;EACxQ,gBAAgB,EAAE,WAAW;EAC7B,uSAAQ;IACN,gBAAgB,EAAE,OAAuB;;AAI7C,8BAA+B;EAC7B,KAAK,EAAE,OAAO;EACd,oCAAQ;IACN,KAAK,EAAE,OAAO;;AAGlB,sBAAuB;EACrB,KAAK,EAAE,OAAO;EACd,4BAAQ;IACN,KAAK,EAAE,OAAO;;AAIlB,qOAAoO;EAClO,WAAW,EAAE,IAAI;;AAGnB,8BAA+B;EAC7B,YAAY,EAAE,WAAW;;AAG3B,2DAA4D;EAC1D,KAAK,EAxOmB,OAAO;EAyO/B,aAAa,EAAE,eAAe;EAC9B,gBAAgB,EAAE,WAAW;EAC7B,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,iBAAqB;EAEpC,uEAAQ;IACR,KAAK,EA/OmB,OAAO;IAgP/B,aAAa,EAAE,eAAe;IAC5B,gBAAgB,EAAE,WAAW;;AAGjC,4BAA6B;EAC3B,KAAK,EAAE,OAAO;EACd,aAAa,EAAE,eAAe;EAC9B,gBAAgB,EAAE,sBAAsB;;AAG1C,mBAAoB;EAClB,YAAY,EAAE,OAAO;;AAEvB,8BAA+B;EAC7B,YAAY,EAAE,OAAO;;AAEvB,2CAA4C;EAC1C,YAAY,EAAE,GAAG;EACjB,KAAK,EAlQmB,OAAO;EAmQ/B,aAAa,EAAE,eAAe;EAC9B,gBAAgB,EAAE,WAAW;;AAE/B,mCAAoC;EAClC,YAAY,EAAE,GAAG;;AAEnB,2CAA4C;EAC1C,YAAY,EAAE,KAAK;EACnB,KAAK,EA3QmB,OAAO;EA4Q/B,aAAa,EAAE,eAAe;EAC9B,gBAAgB,EAAE,sBAAsB;;AAE1C,mCAAmC;EACjC,YAAY,EAAE,KAAK;;AAErB,2CAA4C;EAC1C,YAAY,EAAE,KAAK;EACnB,KAAK,EApRmB,OAAO;EAqR/B,aAAa,EAAE,eAAe;EAC9B,gBAAgB,EAAE,sBAAsB;;AAE1C,mCAAoC;EAClC,YAAY,EAAE,KAAK;;AAErB,yDAA0D;EACxD,YAAY,EAAE,KAAK;;AAErB,yDAA0D;EACxD,YAAY,EAAE,KAAK;;AAGrB,mGAAoG;EAClG,KAAK,EAAE,OAAO;;AAKhB,IAAI;EACA,WAAW,EAAE,IAAI;EACjB,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,QAAQ;EACjB,aAAa,EAAE,GAAG;EAClB,MAAM,EAAE,GAAG;EACX,WAAW,EAAC,MAAM;EAClB,QAAQ,EAAC,MAAM;EACf,aAAa,EAAC,QAAQ;EACtB,UAAU,EAAE,GAAG;EACf,aAAa,EAAE,GAAG;EAClB,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,IAAI;EACZ,UAAQ;IACN,KAAK,EAAE,IAAI;IACX,gBAAgB,EAAE,kBAAkB;IACpC,YAAY,EAAE,OAAO;IACrB,eAAe,EAAE,IAAI;;AAI3B,YAAY;EACR,SAAS,EAtSa,IAAI;EAuS1B,WAAW,EA7SW,IAAI;EA8S1B,KAAK,EAAE,eAAe;EACtB,UAAU,EAAE,MAAM;EAClB,MAAM,EAAE,iBAA4B;EACpC,aAAa,EAAE,GAAG;EAClB,QAAQ,EAAE,MAAM;EAChB,UAAU,EAhUY,OAAO;EAgUT,kBAAkB;EACtC,UAAU,EAAE,mDAAoD;EAAE,cAAc;EAChF,UAAU,EAAE,sDAAsD;EAAE,6BAA6B;EACjG,UAAU,EAAE,oDAAoD;EAAE,sDAAsD;EACxH,MAAM,EAAE,2GAA2G;EAAE,WAAW;EAChI,MAAM,EAAE,eAAe;EACvB,kBAAQ;IACN,KAAK,EAAE,IAAI;IACX,gBAAgB,EAAE,kBAAkB;IACpC,MAAM,EAAE,IAAI;IACZ,eAAe,EAAE,IAAI;EAEvB,oBAAU;IACN,KAAK,EAAE,eAAe;EAE1B,mBAAS;IACL,KAAK,EAAE,eAAe;;AAK9B,oCAAqC;EACnC,gBAAgB,EAAE,OAAiB;EACnC,WAAW,EA/Va,6CAA6C;;AAiWvE,qBAAsB;EACpB,gBAAgB,EAAE,OAAkB;EACpC,MAAM,EAAE,iBAAiB;;AAQvB,0CAAkB;EAChB,gBAAgB,EA7VI,OAAO;AA+V7B,kCAAY;EACV,gBAAgB,EAAE,OAAoB;EACtC,oDAAkB;IAChB,gBAAgB,EAnWE,OAAO;AAsW7B,gCAAU;EACR,gBAAgB,EAAE,OAAoB;EACtC,kDAAkB;IAChB,gBAAgB,EAzWE,OAAO;AA4W7B,+BAAS;EACP,gBAAgB,EAAE,OAAiB;EACnC,iDAAkB;IAChB,gBAAgB,EAjXE,OAAO;AAoX7B,8BAAQ;EACN,gBAAgB,EAAE,OAAiB;EACnC,gDAAkB;IAChB,gBAAgB,EAvXE,OAAO;AA0X7B,6BAAO;EACL,gBAAgB,EAAE,OAAO;EACzB,+CAAkB;IAChB,gBAAgB,EA5XE,OAAO;AA+X7B,kCAAY;EACV,gBAAgB,EAAE,OAAO;EACzB,oDAAkB;IAChB,gBAAgB,EAlYE,OAAO;AAqY7B,6BAAO;EACL,gBAAgB,EAAE,OAAO;EACzB,+CAAkB;IAChB,gBAAgB,EAtYE,OAAO;AAyY7B,4BAAM;EACJ,gBAAgB,EAAE,OAAO;EACzB,8CAAkB;IAChB,gBAAgB,EA9YE,OAAO;AAiZ7B,gCAAU;EACR,gBAAgB,EAAE,OAAoB;EACtC,kDAAkB;IAChB,gBAAgB,EAnZE,OAAO;;AA2ZjC,mHAAoH;EAClH,eAAe,EAAE,IAAI;EACrB,+IAAS;IACP,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE,QAAQ;IAClB,IAAI,EAAE,KAAK;;AAKf,gGAAiG;EAC/F,MAAM,EAAE,iBAAiB;EACzB,aAAa,EAAE,iBACjB;;AAGE,4BAAuB;EACrB,WAAW,EAAE,CAAC;AAEhB,iBAAY;EACV,OAAO,EAAE,IAAI;AAEf,SAAI;EACF,KAAK,EAAE,eAAe;;AAM1B,KAAM;EACJ,QAAQ,EAAE,QAAQ;EAClB,WAAM;IACJ,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,CAAC;IACR,GAAG,EAAE,CAAC;IACN,uBAAY;MACV,OAAO,EAAE,IAAI;;AAKnB,4DAA6D;EAC3D,WAAW,EAAE,MAAM;;AAGrB,aAAc;EACZ,gBAAgB,EAAE,iDAAiD;EACnE,UAAU,EAAE,gCAA6B;EACzC,UAAU,EAAE,IAAI;EAChB,KAAK,EAzdmB,OAAO;EA0d/B,WAAW,EAAE,6CAA6C;EAC1D,sCAAyB;IACvB,KAAK,EA1diB,OAAO;IA2d7B,YAAY,EAAE,CAAC;EAEjB,kCAAqB;IACnB,gBAAgB,EA1dM,OAAO;IA2d7B,KAAK,EAAE,OAAO;EAEhB,iCAAoB;IAClB,KAAK,EApeiB,OAAO;;AAuejC,+BAAgC;EAC9B,KAAK,EAAE,IAAI", +"sources": ["../../../sass/kuka_overrides.scss"], +"names": [], +"file": "kuka.css" +} \ No newline at end of file diff --git a/v24.04/en/_static/css/matrixvision.css b/v24.04/en/_static/css/matrixvision.css new file mode 100644 index 0000000..130b6dc --- /dev/null +++ b/v24.04/en/_static/css/matrixvision.css @@ -0,0 +1,540 @@ +@import url("https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700"); +body, h1, h2, h3, h4, h5, h6, a, ul, li, p, span { + font-family: "Roboto", sans-serif; } + +.menuselection { + font-weight: 600; } + +.wy-nav-content { + background-color: #ffffff; + max-width: 900px; } + +.wy-nav-content-wrap { + background-color: #eaedf0; } + +.codeblock, pre.literal-block, .rst-content .literal-block, .rst-content pre.literal-block, div[class^='highlight'] { + background-color: #f9fafb; } + +body { + color: #222222; } + +b, strong { + vertical-align: top; } + +p, dd { + font-size: 16px; + color: #222222; + line-height: 1.5em; } + +p.first { + margin-bottom: 0 !important; } + +h1, h2, .rst-content .toctree-wrapper p.caption, h3, h4, h5, h6, legend { + font-weight: 400; + font-size: 25px; + color: #222222; + font-weight: 100; + margin-bottom: 0px; + line-height: 28px; + text-overflow: ellipsis; + display: block; + white-space: nowrap; } + +h1, h2, h3, h4, h5, h6 { + margin-bottom: 20px; } + +h1 { + font-size: 25px; } + +h2 { + font-size: 22px; } + +h3 { + font-size: 18px; + font-weight: 400; } + +h4 { + font-size: 16px; + font-weight: 600; } + +a { + color: #3f83a3; } + a:active { + color: #3f83a3; } + a:visited { + color: #3f83a3; } + a:hover { + color: #579dbe; + text-decoration: underline; } + +@media (min-width: 768px) { + .wy-nav-content { + margin: 0; + padding: 0; + left: 300px; + max-width: 900px; } } + +@media (min-width: 768px) { + .document { + padding-top: 1.618em; + padding-left: 3.236em; + padding-right: 3.236em; } + .document div.section > h1, + .document div.section > h2, + .document div.section > h3, + .document div.section > h4, + .document div.section > h5, + .document div.section > h6, + .document div.section > dl > dt { + padding-top: 70px; + margin-top: -70px; + font-weight: 400; + background: 0; } } + +@media (min-width: 768px) { + .wy-breadcrumbs { + background-color: #565C63; + height: 56px; + color: #FFF; + font-size: 14px; + padding-left: 10px; + position: fixed; + width: 900px; + z-index: 100; } + .wy-breadcrumbs + hr { + display: none; } + .wy-breadcrumbs li { + margin-top: 13px; } + .wy-breadcrumbs li:nth-last-child(2) { + opacity: 0.8; } + .wy-breadcrumbs li a { + color: #FFF; + text-decoration: none; + opacity: 0.8; } + .wy-breadcrumbs li a:hover { + opacity: 1.0; } } + +@media (min-width: 768px) { + .rst-content > footer { + padding-bottom: 1.618em; + padding-top: 0; + padding-left: 3.236em; + padding-right: 3.236em; } } + +@media (min-width: 768px) { + .rst-content > div:first-child { + height: 56px; } } + +.wy-nav-top { + background-color: #565C63; } + @media (max-width: 768px) { + .wy-nav-top a { + color: #FFF; } + .wy-nav-top a:hover { + color: #FFF; } + .wy-nav-top a:visited { + color: #FFF; } } + .wy-nav-top i { + color: #FFF; } + +.wy-nav-side { + background-color: #565C63; } + +.wy-side-nav-search { + background-color: #565C63; + text-align: left; + padding-top: 1px; + padding-left: 14px; } + +.wy-side-nav-search input[type=text] { + border: none; + font-size: 14px; + font-weight: 400; + color: #222222; + text-align: left; + border: 1px solid #dbdbdb; + background-color: #ffffff; + height: 36px; + border-radius: 2px; + margin-top: 2px; + margin-bottom: 2px; + padding-left: 10px; + padding-right: 10px; + margin-left: 5px; + width: 260px; } + +.wy-side-nav-search > div.version { + margin-left: 5px; } + +.wy-side-nav-search > a { + line-height: 1.3; + color: #fff; + font-weight: 400; + font-size: 18px; } + .wy-side-nav-search > a:hover { + color: #fff; + text-decoration: none; + background-color: transparent; } + .wy-side-nav-search > a:before { + content: ""; + width: 300px; + height: 45px; + background: url(../img/logo_balluff.svg) no-repeat; + display: block; + margin: auto auto 10px; } + +.wy-menu-vertical li a em { + display: contents; + font-style: normal; } + +.wy-menu-vertical header, .wy-menu-vertical p.caption, .wy-menu-vertical a { + color: #ffffff; } + +.wy-menu-vertical li { + border-top: 0; } + +.wy-menu-vertical li a { + border-bottom: 4px solid transparent; + border-top: 4px solid transparent; } + +.wy-menu-vertical li.current { + background-color: #565C63; } + +.wy-menu-vertical li.toctree-l1.current { + background-color: #67707A; } + +.wy-menu-vertical li.toctree-l1.current ul { + background-color: #67707A; } + +.wy-menu-vertical li.toctree-l2.current ul { + background-color: #747F8B; } + +.wy-menu-vertical li.toctree-l3.current ul { + background-color: #7F8893; } + +.wy-menu-vertical li.current a { + color: #FFF; } + +.wy-menu-vertical li a { + line-height: 1.3; + height: 42px; + opacity: 0.8; + font-size: 14px; + font-weight: 400; + display: flex; + align-items: center; } + .wy-menu-vertical li a:hover { + opacity: 1.0; } + +.wy-menu-vertical li.current a { + border-color: transparent; } + +.wy-menu-vertical li.on a, .wy-menu-vertical li.current > a { + border-bottom: 4px solid rgba(0, 0, 0, 0); + border-top: 4px solid transparent; } + +.wy-menu-vertical li.toctree-l1 > a:hover { + background-color: #67707A; } + .wy-menu-vertical li.toctree-l1 > a:hover span.toctree-expand { + opacity: 1; + color: #FFF; } + +.wy-menu-vertical li.toctree-l2 > a:hover { + background-color: #747F8B; } + .wy-menu-vertical li.toctree-l2 > a:hover span.toctree-expand { + opacity: 1; + color: #FFF; } + +.wy-menu-vertical li.current a { + font-weight: 400; } + .wy-menu-vertical li.current a:hover span.toctree-expand { + color: #FFF; + opacity: 1; } + +.wy-menu-vertical li.toctree-l1.current > a { + background-color: #67707A; + padding-left: 1.618em; + opacity: 1; } + .wy-menu-vertical li.toctree-l1.current > a:hover { + background-color: #67707A; } + +.wy-menu-vertical li.toctree-l2.current > a { + background-color: #747F8B; + padding-left: 2.5em; + opacity: 1; } + .wy-menu-vertical li.toctree-l2.current > a:hover { + background-color: #747F8B; } + +.wy-menu-vertical li.toctree-l4.current > a { + background-color: #8A929B; + padding-left: 4.5em; + opacity: 1; } + .wy-menu-vertical li.toctree-l4.current > a:hover { + background-color: #8A929B; } + +.wy-menu-vertical li.toctree-l2 > a { + padding-left: 2.5em; } + +.wy-menu-vertical li.toctree-l3 > a { + background-color: #8A929B; + padding-left: 3.5em; } + +.wy-menu-vertical li.toctree-l4 > a { + background-color: #8A929B; + padding-left: 4.5em; } + +.wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a { + background-color: #7F8893; + padding-left: 3.5em; + padding-right: 10px; + display: flex; + align-items: center; } + .wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a:hover { + background-color: #8A929B; } + +.wy-menu-vertical li.toctree-l2.current li.toctree-l3.current > a { + background-color: #8A929B; + opacity: 1; } + +.wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a { + background-color: #8A929B; + padding-left: 4.5em; + padding-right: 10px; + display: flex; + align-items: center; } + +.wy-menu-vertical li.toctree-l3 li.toctree-l4.current > a { + border-bottom: 4px solid rgba(0, 0, 0, 0); + border-top: 4px solid transparent; } + +.wy-menu-vertical li.on a:hover span.toctree-expand, .wy-menu-vertical li.current > a:hover span.toctree-expand, .wy-menu-vertical li > a:hover span.toctree-expand { + opacity: 1.0; } + +.wy-menu-vertical li.current > a span.toctree-expand { + color: #FFF; + line-height: 34px; + padding-right: 5px; + opacity: 1.0; + font-size: 14px; } + .wy-menu-vertical li.current > a span.toctree-expand + em { + display: contents; + font-style: normal; } + +.wy-menu-vertical li.on a span.toctree-expand, +.wy-menu-vertical li > a span.toctree-expand { + color: #FFF; + line-height: 34px; + padding-right: 5px; + opacity: 0; } + .wy-menu-vertical li.on a span.toctree-expand + em, + .wy-menu-vertical li > a span.toctree-expand + em { + display: contents; + font-style: normal; } + +.wy-menu-vertical li span.toctree-expand { + color: #FFF; + opacity: 0; + font-size: 14px; } + +.btn { + padding-top: 0px; + padding-bottom: 0px; + line-height: 34px; + height: 36px; + border-radius: 2px; + margin: 0px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin-top: 2px; + margin-bottom: 2px; + box-shadow: none; } + .btn:hover { + color: #333; + background-color: #e6e6e6 !important; + border-color: #adadad; + text-decoration: none; } + +.btn-neutral { + font-size: 14px; + font-weight: 600; + color: #222222; + text-align: center; + border: 1px solid #dbdbdb; + border-radius: 2px; + overflow: hidden; + background: #f4f4f4; + /* Old browsers */ + background: -moz-linear-gradient(top, #ffffff 0%, #f5f5f5 100%); + /* FF3.6-15 */ + background: -webkit-linear-gradient(top, #ffffff 0%, #f5f5f5 100%); + /* Chrome10-25,Safari5.1-6 */ + background: linear-gradient(to bottom, #ffffff 0%, #f5f5f5 100%); + /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#f5f5f5',GradientType=0 ); + /* IE6-9 */ } + +.rst-content dl:not(.docutils) dt { + border-top: 0; + border-bottom: solid 3px #7cb2cc; } + +.rst-content dl:not(.docutils) dt:first-child { + margin-top: -70px; } + +.rst-content .sidebar .sidebar-title { + background-color: #dbe0e5; + font-family: "Roboto", sans-serif; } + +.rst-content .sidebar { + background-color: #f9fafb; + border: 1px solid #e1e4e5; } + +.rst-content .admonition .admonition-title { + background-color: #3f83a3; } +.rst-content .admonition.attention { + background-color: white; } + .rst-content .admonition.attention .admonition-title { + background-color: #ffe0b2; } +.rst-content .admonition.caution { + background-color: white; } + .rst-content .admonition.caution .admonition-title { + background-color: #ffe0b2; } +.rst-content .admonition.danger { + background-color: white; } + .rst-content .admonition.danger .admonition-title { + background-color: #ffcdd2; } +.rst-content .admonition.error { + background-color: white; } + .rst-content .admonition.error .admonition-title { + background-color: #ffcdd2; } +.rst-content .admonition.hint { + background-color: #ABF0AB; } + .rst-content .admonition.hint .admonition-title { + background-color: #c8e6c9; } +.rst-content .admonition.important { + background-color: #ABF0AB; } + .rst-content .admonition.important .admonition-title { + background-color: #c8e6c9; } +.rst-content .admonition.note { + background-color: #BBDEFB; + border: 1px #1565C0 solid; + border-radius: 8px; } + .rst-content .admonition.note .admonition-title { + background-color: #BBDEFB; + margin: -12px; + border-radius: 8px; + color: #222222; } + .rst-content .admonition.note p, .rst-content .admonition.note ul { + margin-top: 0.5em; } +.rst-content .admonition.tip { + background-color: #ABF0AB; } + .rst-content .admonition.tip .admonition-title { + background-color: #c8e6c9; } +.rst-content .admonition.warning { + background-color: #ffe0b2; + border: 1px solid #F9A825; + border-radius: 8px; } + .rst-content .admonition.warning .admonition-title { + background-color: #ffe0b2; + margin: -12px; + border-radius: 8px; + color: #222222; } + .rst-content .admonition.warning p, .rst-content .admonition.warning ul { + margin-top: 0.5em; } + +.wy-table thead th, .rst-content table.docutils thead th, .rst-content table.field-list thead th { + border: solid 1px #e1e4e5; + border-bottom: solid 2px #e1e4e5; } + +table .first.last.line-block { + margin-left: 0; } +table .headerlink { + display: none; } +table col { + width: auto !important; } + +.math { + position: relative; } + .math .eqno { + position: absolute; + right: 0; + top: 0; } + .math .eqno .headerlink { + display: none; } + +.wy-table-responsive table td, .wy-table-responsive table th { + white-space: normal; } + +@media (min-width: 1200px) { + .rst-versions { + position: fixed; + bottom: unset; + top: 0; + right: 0; + left: 1000px; + width: 200px; + min-height: 56px; + background-color: #67707A; + height: fit-content; + border-top: 0; + border-left: 1px solid rgba(255, 255, 255, 0.25); } + .rst-versions .rst-current-version { + background-color: #565C63; + color: #FFFFFF; + font-size: 14px; + font-family: "Roboto", sans-serif; + line-height: 34px; + padding: 11px; + opacity: 0.8; } + .rst-versions .rst-current-version:before { + line-height: 34px; } + .rst-versions .rst-current-version:hover { + opacity: 1; } + .rst-versions .rst-current-version .fa.fa-cog { + line-height: 34px; } + .rst-versions .rst-other-versions dl:last-child dt { + border-top: 1px solid rgba(255, 255, 255, 0.25); + padding-top: 5px; } + .rst-versions .rst-other-versions dt, + .rst-versions .rst-other-versions dd { + color: #FFFFFF; + font-size: 14px; + font-family: "Roboto", sans-serif; } + .rst-versions .rst-other-versions dt a, + .rst-versions .rst-other-versions dd a { + opacity: 0.8; + text-decoration: none; } + .rst-versions .rst-other-versions dt a:hover, + .rst-versions .rst-other-versions dd a:hover { + opacity: 1.0; } } + +@media (max-width: 1200px) { + .rst-versions { + border-top: 1px solid rgba(255, 255, 255, 0.25); + color: #FFF; + background-color: #565C63; + font-family: "Roboto", sans-serif; } + .rst-versions .rst-other-versions dd a { + color: #FFF; + padding-left: 0; } + .rst-versions .rst-current-version { + background-color: #67707A; + color: #FFFFFF; + font-size: 14px; + font-family: "Roboto", sans-serif; } + .rst-versions .rst-other-versions dt, + .rst-versions .rst-other-versions dd { + color: #FFFFFF; + font-size: 14px; + font-family: "Roboto", sans-serif; } + .rst-versions .rst-other-versions dt a, + .rst-versions .rst-other-versions dd a { + opacity: 0.8; + text-decoration: none; } + .rst-versions .rst-other-versions dt a:hover, + .rst-versions .rst-other-versions dd a:hover { + opacity: 1.0; } } +.rst-versions .rst-current-version .fa.fa-cog { + float: left; } + +/*# sourceMappingURL=matrixvision.css.map */ diff --git a/v24.04/en/_static/css/matrixvision.css.map b/v24.04/en/_static/css/matrixvision.css.map new file mode 100644 index 0000000..629ce1d --- /dev/null +++ b/v24.04/en/_static/css/matrixvision.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "AACQ,gFAAwE;AAsChF,gDAAiD;EAC/C,WAAW,EArCa,oBAAoB;;AAwC9C,cAAe;EACb,WAAW,EAAE,GAAG;;AAGlB,eAAgB;EACd,gBAAgB,EA/BQ,OAAO;EAgC/B,SAAS,EAAE,KAAK;;AAGlB,oBAAqB;EACnB,gBAAgB,EAxCQ,OAAO;;AA2CjC,mHAAoH;EAClH,gBAAgB,EAAE,OAAkB;;AAKtC,IAAK;EACH,KAAK,EA3DmB,OAAO;;AA8DjC,SAAU;EACR,cAAc,EAAE,GAAG;;AAGrB,KAAM;EACJ,SAAS,EAAE,IAAI;EACf,KAAK,EApEmB,OAAO;EAqE/B,WAAW,EAAE,KAAK;;AAGpB,OAAQ;EACN,aAAa,EAAE,YAAY;;AAG7B,uEAAwE;EACtE,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,IAAI;EACf,KAAK,EArEmB,OAAO;EAsE/B,WAAW,EArDa,GAAG;EAsD3B,aAAa,EAAE,GAAG;EAClB,WAAW,EAAE,IAAI;EACjB,aAAa,EAAE,QAAQ;EACvB,OAAO,EAAE,KAAK;EACd,WAAW,EAAE,MAAM;;AAGrB,sBAAkB;EAChB,aAAa,EAAE,IAAI;;AAGrB,EAAG;EACD,SAAS,EAAE,IAAI;;AAEjB,EAAG;EACD,SAAS,EAAE,IAAI;;AAEjB,EAAE;EACA,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;;AAElB,EAAE;EACA,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;;AAGlB,CAAE;EACA,KAAK,EA1GmB,OAAO;EA2G/B,QAAS;IACP,KAAK,EA5GiB,OAAO;EA8G/B,SAAU;IACR,KAAK,EA/GiB,OAAO;EAiH/B,OAAQ;IACN,KAAK,EAAE,OAAwB;IAC/B,eAAe,EAAE,SAAS;;AAM5B,yBAA0B;EAD5B,eAAgB;IAEZ,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,KAAK;IACX,SAAS,EAAE,KAAK;;AAMlB,yBAA0B;EAD5B,SAAU;IAEN,WAAW,EAAE,OAAO;IACpB,YAAY,EAAE,OAAO;IACrB,aAAa,EAAE,OAAO;IAEtB;;;;;;mCAMsB;MACpB,WAAW,EAAE,IAAI;MACjB,UAAU,EAAE,KAAK;MACjB,WAAW,EAAE,GAAG;MAChB,UAAU,EAAE,CAAC;;AAMjB,yBAA0B;EAD5B,eAAgB;IAEZ,gBAAgB,EAxJM,OAAO;IAyJ7B,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,IAAI;IACX,SAAS,EAAE,IAAI;IACf,YAAY,EAAE,IAAI;IAClB,QAAQ,EAAE,KAAK;IACf,KAAK,EAAE,KAAK;IACZ,OAAO,EAAE,GAAG;IAEZ,oBAAK;MACH,OAAO,EAAE,IAAI;IAGf,kBAAG;MACD,UAAU,EAAE,IAAI;IAGlB,oCAAqB;MACnB,OAAO,EAAE,GAAG;IAGd,oBAAK;MACH,KAAK,EAAE,IAAI;MACX,eAAe,EAAE,IAAI;MACrB,OAAO,EAAE,GAAG;MAEZ,0BAAQ;QACN,OAAO,EAAE,GAAG;;AAOlB,yBAA0B;EAD5B,qBAAsB;IAElB,cAAc,EAAE,OAAO;IACvB,WAAW,EAAE,CAAC;IACd,YAAY,EAAE,OAAO;IACrB,aAAa,EAAE,OAAO;;AAKxB,yBAA0B;EAD5B,8BAA+B;IAE3B,MAAM,EAAE,IAAI;;AAKhB,WAAY;EACV,gBAAgB,EA1MQ,OAAO;EA4M7B,yBAA0B;IAD5B,aAAE;MAEE,KAAK,EAAE,IAAI;MACX,mBAAQ;QACN,KAAK,EAAE,IAAI;MAEb,qBAAU;QACR,KAAK,EAAE,IAAI;EAIjB,aAAE;IACA,KAAK,EAAE,IAAI;;AAGf,YAAa;EACX,gBAAgB,EA3NQ,OAAO;;AA+NjC,mBAAoB;EAClB,gBAAgB,EAhOQ,OAAO;EAiO/B,UAAU,EAAE,IAAI;EAChB,WAAW,EAAE,GAAG;EAChB,YAAY,EAAE,IAAI;;AAGpB,oCAAqC;EACnC,MAAM,EAAE,IAAI;EACZ,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,KAAK,EA7OmB,OAAO;EA8O/B,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,iBAAiB;EACzB,gBAAgB,EAAE,OAAO;EACzB,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG;EAClB,UAAU,EAAE,GAAG;EACf,aAAa,EAAE,GAAG;EAClB,YAAY,EAAE,IAAI;EAClB,aAAa,EAAE,IAAI;EACnB,WAAW,EAAE,GAAG;EAChB,KAAK,EAAE,KAAK;;AAGd,iCAAkC;EAChC,WAAW,EAAE,GAAG;;AAGlB,uBAAwB;EACtB,WAAW,EAAE,GAAG;EAChB,KAAK,EAAE,IAAI;EACX,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,IAAI;EAEf,6BAAQ;IACN,KAAK,EAAE,IAAI;IACX,eAAe,EAAE,IAAI;IACrB,gBAAgB,EAAE,WAAW;EAE/B,8BAAS;IACP,OAAO,EAAE,EAAE;IACX,KAAK,EAAE,KAAK;IACZ,MAAM,EAAE,IAAI;IACZ,UAAU,EAAE,sCAAsC;IAClD,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,cAAc;;AAI1B,yBAA0B;EACxB,OAAO,EAAE,QAAQ;EACjB,UAAU,EAAE,MAAM;;AAGpB,0EAA2E;EACzE,KAAK,EA7QmB,OAAO;;AAgRjC,oBAAqB;EACnB,UAAU,EAAE,CAAC;;AAGf,sBAAuB;EACrB,aAAa,EAAE,qBAAqB;EACpC,UAAU,EAAE,qBAAqB;;AAGnC,4BAA6B;EAC3B,gBAAgB,EApSQ,OAAO;;AAwSjC,uCAAwC;EACtC,gBAAgB,EAxSQ,OAAO;;AA2SjC,0CAA2C;EACzC,gBAAgB,EA5SQ,OAAO;;AA+SjC,0CAA2C;EACzC,gBAAgB,EA/SQ,OAAO;;AAkTjC,0CAA2C;EACzC,gBAAgB,EAlTQ,OAAO;;AAqTjC,8BAA+B;EAC7B,KAAK,EAAE,IAAI;;AAGb,sBAAuB;EACrB,WAAW,EAAE,GAAG;EAChB,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;EAEnB,4BAAQ;IACN,OAAO,EAAE,GAAG;;AAIhB,8BAA+B;EAC7B,YAAY,EAAE,WAAW;;AAG3B,2DAA4D;EAC1D,aAAa,EAAE,0BAAkB;EACjC,UAAU,EAAE,qBAAqB;;AAGnC,yCAA0C;EACxC,gBAAgB,EAnVQ,OAAO;EAoV/B,6DAAoB;IAClB,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,IAAI;;AAIf,yCAA0C;EACxC,gBAAgB,EA1VQ,OAAO;EA2V/B,6DAAoB;IAClB,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,IAAI;;AAIf,8BAA+B;EAC7B,WAAW,EAAE,GAAG;EAEd,wDAAoB;IAClB,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,CAAC;;AAKhB,2CAA4C;EAC1C,gBAAgB,EA7WQ,OAAO;EA8W/B,YAAY,EAAE,OAAO;EACrB,OAAO,EAAE,CAAC;EACV,iDAAQ;IACN,gBAAgB,EAjXM,OAAO;;AAqXjC,2CAA4C;EAC1C,gBAAgB,EArXQ,OAAO;EAsX/B,YAAY,EAAE,KAAK;EACnB,OAAO,EAAE,CAAC;EACV,iDAAQ;IACN,gBAAgB,EAzXM,OAAO;;AA6XjC,2CAA4C;EAC1C,gBAAgB,EA5XQ,OAAO;EA6X/B,YAAY,EAAE,KAAK;EACnB,OAAO,EAAE,CAAC;EACV,iDAAQ;IACN,gBAAgB,EAhYM,OAAO;;AAoYjC,mCAAoC;EAClC,YAAY,EAAE,KAAK;;AAGrB,mCAAoC;EAClC,gBAAgB,EAzYQ,OAAO;EA0Y/B,YAAY,EAAE,KAAK;;AAGrB,mCAAoC;EAClC,gBAAgB,EA9YQ,OAAO;EA+Y/B,YAAY,EAAE,KAAK;;AAGrB,yDAA0D;EACxD,gBAAgB,EApZQ,OAAO;EAqZ/B,YAAY,EAAE,KAAK;EACnB,aAAa,EAAE,IAAI;EACnB,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;EACnB,+DAAQ;IACN,gBAAgB,EAzZM,OAAO;;AA6ZjC,iEAAkE;EAChE,gBAAgB,EA9ZQ,OAAO;EA+Z/B,OAAO,EAAE,CAAC;;AAGZ,yDAA0D;EACxD,gBAAgB,EAnaQ,OAAO;EAoa/B,YAAY,EAAE,KAAK;EACnB,aAAa,EAAE,IAAI;EACnB,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;;AAGrB,yDAA0D;EACxD,aAAa,EAAE,0BAAkB;EACjC,UAAU,EAAE,qBAAqB;;AAKjC,mKAA4B;EAC1B,OAAO,EAAE,GAAG;;AAIhB,oDAAqD;EACnD,KAAK,EAAE,IAAI;EACX,WAAW,EAAE,IAAI;EACjB,aAAa,EAAE,GAAG;EAClB,OAAO,EAAE,GAAG;EACZ,SAAS,EAAE,IAAI;EAEf,yDAAK;IACH,OAAO,EAAE,QAAQ;IACjB,UAAU,EAAE,MAAM;;AAItB;4CAC6C;EAC3C,KAAK,EAAE,IAAI;EACX,WAAW,EAAE,IAAI;EACjB,aAAa,EAAE,GAAG;EAClB,OAAO,EAAE,CAAC;EAEV;mDAAK;IACH,OAAO,EAAE,QAAQ;IACjB,UAAU,EAAE,MAAM;;AAItB,wCAAyC;EACvC,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,CAAC;EACV,SAAS,EAAE,IAAI;;AAKjB,IAAI;EACA,WAAW,EAAE,GAAG;EAChB,cAAc,EAAC,GAAG;EAClB,WAAW,EAAE,IAAI;EACjB,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG;EAClB,MAAM,EAAE,GAAG;EACX,WAAW,EAAC,MAAM;EAClB,QAAQ,EAAC,MAAM;EACf,aAAa,EAAC,QAAQ;EACtB,UAAU,EAAE,GAAG;EACf,aAAa,EAAE,GAAG;EAClB,UAAU,EAAE,IAAI;EAChB,UAAQ;IACN,KAAK,EAAE,IAAI;IACX,gBAAgB,EAAE,kBAAkB;IACpC,YAAY,EAAE,OAAO;IACrB,eAAe,EAAE,IAAI;;AAI3B,YAAY;EACR,SAAS,EAtda,IAAI;EAud1B,WAAW,EA7dW,GAAG;EA8dzB,KAAK,EA7eiB,OAAO;EA8e7B,UAAU,EAAE,MAAM;EAClB,MAAM,EAAE,iBAA4B;EACpC,aAAa,EAAE,GAAG;EAClB,QAAQ,EAAE,MAAM;EAChB,UAAU,EAjfY,OAAO;EAifT,kBAAkB;EACtC,UAAU,EAAE,mDAAoD;EAAE,cAAc;EAChF,UAAU,EAAE,sDAAsD;EAAE,6BAA6B;EACjG,UAAU,EAAE,oDAAoD;EAAE,sDAAsD;EACxH,MAAM,EAAE,2GAA2G;EAAE,WAAW;;AAKpI,iCAAkC;EAChC,UAAU,EAAE,CAAC;EACb,aAAa,EAAE,iBAAmC;;AAGpD,6CAA8C;EAC5C,UAAU,EAAE,KAAK;;AAInB,oCAAqC;EACnC,gBAAgB,EAAE,OAAiB;EACnC,WAAW,EAlhBa,oBAAoB;;AAohB9C,qBAAsB;EACpB,gBAAgB,EAAE,OAAkB;EACpC,MAAM,EAAE,iBAAiB;;AAQvB,0CAAkB;EAChB,gBAAgB,EA5gBI,OAAO;AA8gB7B,kCAAY;EACV,gBAAgB,EAAE,KAAoB;EACtC,oDAAkB;IAChB,gBAAgB,EAlhBE,OAAO;AAqhB7B,gCAAU;EACR,gBAAgB,EAAE,KAAoB;EACtC,kDAAkB;IAChB,gBAAgB,EAxhBE,OAAO;AA2hB7B,+BAAS;EACP,gBAAgB,EAAE,KAAiB;EACnC,iDAAkB;IAChB,gBAAgB,EAhiBE,OAAO;AAmiB7B,8BAAQ;EACN,gBAAgB,EAAE,KAAiB;EACnC,gDAAkB;IAChB,gBAAgB,EAtiBE,OAAO;AAyiB7B,6BAAO;EACL,gBAAgB,EAAE,OAAO;EACzB,+CAAkB;IAChB,gBAAgB,EA3iBE,OAAO;AA8iB7B,kCAAY;EACV,gBAAgB,EAAE,OAAO;EACzB,oDAAkB;IAChB,gBAAgB,EAjjBE,OAAO;AAojB7B,6BAAO;EACL,gBAAgB,EAAE,OAAO;EACzB,MAAM,EAAE,iBAAiB;EACzB,aAAa,EAAE,GAAG;EAClB,+CAAkB;IAChB,gBAAgB,EAAE,OAAO;IACzB,MAAM,EAAE,KAAK;IACb,aAAa,EAAE,GAAG;IAClB,KAAK,EA5kBa,OAAO;EA8kB3B,iEAAM;IACJ,UAAU,EAAE,KAAK;AAGrB,4BAAM;EACJ,gBAAgB,EAAE,OAAO;EACzB,8CAAkB;IAChB,gBAAgB,EArkBE,OAAO;AAwkB7B,gCAAU;EACR,gBAAgB,EAxkBI,OAAO;EAykB3B,MAAM,EAAE,iBAAiB;EACzB,aAAa,EAAE,GAAG;EAClB,kDAAkB;IAChB,gBAAgB,EA5kBE,OAAO;IA6kBzB,MAAM,EAAE,KAAK;IACb,aAAa,EAAE,GAAG;IAClB,KAAK,EAhmBa,OAAO;EAkmB3B,uEAAM;IACJ,UAAU,EAAE,KAAK;;AAOzB,gGAAiG;EAC/F,MAAM,EAAE,iBAAiB;EACzB,aAAa,EAAE,iBACjB;;AAGE,4BAAuB;EACrB,WAAW,EAAE,CAAC;AAEhB,iBAAY;EACV,OAAO,EAAE,IAAI;AAEf,SAAI;EACF,KAAK,EAAE,eAAe;;AAM1B,KAAM;EACJ,QAAQ,EAAE,QAAQ;EAClB,WAAM;IACJ,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,CAAC;IACR,GAAG,EAAE,CAAC;IACN,uBAAY;MACV,OAAO,EAAE,IAAI;;AAKnB,4DAA6D;EAC3D,WAAW,EAAE,MAAM;;AAMnB,0BAA2B;EAD7B,aAAc;IAEV,QAAQ,EAAE,KAAK;IACf,MAAM,EAAE,KAAK;IACb,GAAG,EAAE,CAAC;IACN,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,KAAK;IACZ,UAAU,EAAE,IAAI;IAChB,gBAAgB,EAppBM,OAAO;IAqpB7B,MAAM,EAAE,WAAW;IACnB,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,mCAAmC;IAEhD,kCAAqB;MACnB,gBAAgB,EA3pBI,OAAO;MA4pB3B,KAAK,EAAE,OAAO;MACd,SAAS,EAAE,IAAI;MACf,WAAW,EAlqBS,oBAAoB;MAmqBxC,WAAW,EAAE,IAAI;MACjB,OAAO,EAAE,IAAI;MACb,OAAO,EAAE,GAAG;MAEZ,yCAAS;QACP,WAAW,EAAE,IAAI;MAGnB,wCAAQ;QACN,OAAO,EAAE,CAAC;MAGZ,6CAAW;QACT,WAAW,EAAE,IAAI;IAKrB,kDAAqC;MACnC,UAAU,EAAE,mCAAmC;MAC/C,WAAW,EAAE,GAAG;IAGlB;wCACuB;MACrB,KAAK,EAAE,OAAO;MACd,SAAS,EAAE,IAAI;MACf,WAAW,EA9rBS,oBAAoB;MAgsBxC;4CAAE;QACA,OAAO,EAAE,GAAG;QACZ,eAAe,EAAE,IAAI;MAGvB;kDAAQ;QACN,OAAO,EAAE,GAAG;;AAOlB,0BAA2B;EAD7B,aAAc;IAGV,UAAU,EAAE,mCAAmC;IAC/C,KAAK,EAAE,IAAI;IACX,gBAAgB,EA7sBM,OAAO;IA8sB7B,WAAW,EAltBW,oBAAoB;IAmtB1C,sCAAyB;MACvB,KAAK,EAAE,IAAI;MACX,YAAY,EAAE,CAAC;IAEjB,kCAAqB;MACnB,gBAAgB,EAntBI,OAAO;MAotB3B,KAAK,EAAE,OAAO;MACd,SAAS,EAAE,IAAI;MACf,WAAW,EA3tBS,oBAAoB;IA8tB1C;wCACuB;MACrB,KAAK,EAAE,OAAO;MACd,SAAS,EAAE,IAAI;MACf,WAAW,EAluBS,oBAAoB;MAouBxC;4CAAE;QACA,OAAO,EAAE,GAAG;QACZ,eAAe,EAAE,IAAI;MAGvB;kDAAQ;QACN,OAAO,EAAE,GAAG;AAIlB,6CAAgC;EAC9B,KAAK,EAAE,IAAI", +"sources": ["../../../sass/matrixvision_overrides.scss"], +"names": [], +"file": "matrixvision.css" +} diff --git a/v24.04/en/_static/css/schunk.css b/v24.04/en/_static/css/schunk.css new file mode 100644 index 0000000..1ba29dd --- /dev/null +++ b/v24.04/en/_static/css/schunk.css @@ -0,0 +1,330 @@ +@import url("https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700"); +body, h1, h2, h3, h4, h5, h6, a, ul, li, p, span { + font-family: "Open Sans", Helvetica, sans-serif; } + +.menuselection { + font-weight: 600; } + +.wy-nav-content { + background-color: #ffffff; + max-width: 900px; } + +.wy-nav-content-wrap { + background-color: #eaecee; } + +.codeblock, pre.literal-block, .rst-content .literal-block, .rst-content pre.literal-block, div[class^='highlight'] { + background-color: #f8f9f9; } + +body { + color: #66696d; } + +b, strong { + vertical-align: top; } + +p, dd { + font-size: 16px; + color: #66696d; + line-height: 1.5em; } + +p.first { + margin-bottom: 0 !important; } + +h1, h2, .rst-content .toctree-wrapper p.caption, h3, h4, h5, h6, legend { + font-weight: 100; + font-size: 25px; + color: #66696d; + font-weight: 100; + margin-bottom: 0px; + line-height: 28px; + text-overflow: ellipsis; + display: block; + white-space: nowrap; } + +h1, h2, h3, h4, h5, h6 { + margin-bottom: 20px; } + +h1 { + font-size: 25px; } + +h2 { + font-size: 22px; } + +h3 { + font-size: 18px; + font-weight: 500; } + +h4 { + font-size: 16px; + font-weight: 600; } + +a { + color: #003d6a; } + a:active { + color: #003d6a; } + a:visited { + color: #003d6a; } + a:hover { + color: #005a9d; + text-decoration: underline; } + +.wy-nav-top { + background-color: #003d6a; } + @media (max-width: 768px) { + .wy-nav-top a { + color: #FFF; } + .wy-nav-top a:hover { + color: #FFF; } + .wy-nav-top a:visited { + color: #FFF; } } + .wy-nav-top i { + color: #FFF; } + +.wy-nav-side { + background-color: #003d6a; + border-right: 1px solid rgba(255, 255, 255, 0.2); } + +.wy-side-nav-search { + background-color: #003d6a; } + +.wy-side-nav-search input[type=text] { + border: none; + font-size: 14px; + font-weight: 400; + color: #66696d; + text-align: left; + border: 1px solid #dbdbdb; + background-color: #ffffff; + height: 36px; + border-radius: 2px; + margin-top: 2px; + margin-bottom: 2px; + padding-left: 10px; + padding-right: 10px; } + +.wy-side-nav-search > a { + line-height: 20px; + color: #fff; } + .wy-side-nav-search > a:hover { + color: #fff; + text-decoration: none; + background-color: transparent; } + .wy-side-nav-search > a:before { + content: ""; + width: 180px; + height: 50px; + background: url(../img/logo_schunk.svg) no-repeat 20px center; + display: block; + margin: 0 auto; + margin-bottom: 20px; } + +.wy-menu-vertical header, .wy-menu-vertical p.caption, .wy-menu-vertical a { + color: #ffffff; } + +.wy-menu-vertical a:hover { + background-color: #002e51; } + +.wy-menu-vertical li.current { + background-color: #003d6a; } + +.wy-menu-vertical li.current a:hover { + background-color: #002e51; } + +.wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a, .wy-menu-vertical li.toctree-l3.current > a, .wy-menu-vertical li.toctree-l2.current > a, .wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a, .wy-menu-vertical li.toctree-l4 li.toctree-l5.current > a { + background-color: #003d6a; } + .wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a:hover, .wy-menu-vertical li.toctree-l3.current > a:hover, .wy-menu-vertical li.toctree-l2.current > a:hover, .wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a:hover, .wy-menu-vertical li.toctree-l4 li.toctree-l5.current > a:hover { + background-color: #002e51; } + +.wy-menu-vertical li.current a { + color: #FFF; } + +.wy-menu-vertical li a, .wy-menu-vertical li.on a span.toctree-expand, .wy-menu-vertical li.current > a span.toctree-expand, .wy-menu-vertical li.toctree-l3 span.toctree-expand, .wy-menu-vertical li.toctree-l2 span.toctree-expand { + line-height: 26px; } + +.wy-menu-vertical li.current a { + border-color: transparent; } + +.wy-menu-vertical li.on a, .wy-menu-vertical li.current > a { + background-color: rgba(0, 0, 0, 0.2); + border: none; + border-bottom: 2px solid #009ee0; } + .wy-menu-vertical li.on a:hover, .wy-menu-vertical li.current > a:hover { + background-color: rgba(0, 0, 0, 0.2); } + +.wy-menu-vertical li a:hover { + background-color: rgba(0, 0, 0, 0.2) !important; + color: rgba(255, 255, 255, 0.9); } + +.wy-menu-vertical a { + padding-left: 1.618em; } + +.wy-menu-vertical li.current a { + padding-left: 1.618em; } + +.wy-menu-vertical li.toctree-l2.current > a { + padding-left: 3em; + background-color: rgba(0, 0, 0, 0.2); } + +.wy-menu-vertical li.toctree-l2 > a { + padding-left: 3em; } + +.wy-menu-vertical li.toctree-l3.current > a { + padding-left: 4.5em; + background-color: rgba(0, 0, 0, 0.2) !important; } + +.wy-menu-vertical li.toctree-l3 > a { + padding-left: 4.5em; } + +.wy-menu-vertical li.toctree-l4.current > a { + padding-left: 5.5em; + background-color: rgba(0, 0, 0, 0.2) !important; } + +.wy-menu-vertical li.toctree-l4 > a { + padding-left: 5.5em; } + +.wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a { + padding-left: 4.5em; } + +.wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a { + padding-left: 5.5em; } + +.wy-menu-vertical li.on a span.toctree-expand, .wy-menu-vertical li.current > a span.toctree-expand { + color: #FFF; } + .wy-menu-vertical li.on a span.toctree-expand:hover, .wy-menu-vertical li.current > a span.toctree-expand:hover { + opacity: 0.9; } + +.wy-menu-vertical li span.toctree-expand { + color: rgba(255, 255, 255, 0); } + +.btn { + padding-top: 0px; + padding-bottom: 0px; + line-height: 34px; + height: 36px; + border-radius: 2px; + margin: 0px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin-top: 2px; + margin-bottom: 2px; + box-shadow: none; } + .btn:hover { + color: #333; + background-color: #e6e6e6 !important; + border-color: #adadad; + text-decoration: none; } + +.btn-neutral { + font-size: 14px; + font-weight: 600; + color: #66696d; + text-align: center; + border: 1px solid #dbdbdb; + border-radius: 2px; + overflow: hidden; + background: #f4f4f4; + /* Old browsers */ + background: -moz-linear-gradient(top, #ffffff 0%, #f5f5f5 100%); + /* FF3.6-15 */ + background: -webkit-linear-gradient(top, #ffffff 0%, #f5f5f5 100%); + /* Chrome10-25,Safari5.1-6 */ + background: linear-gradient(to bottom, #ffffff 0%, #f5f5f5 100%); + /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#f5f5f5',GradientType=0 ); + /* IE6-9 */ } + +.rst-content .sidebar .sidebar-title { + background-color: #dcdfe3; + font-family: "Open Sans", Helvetica, sans-serif; } + +.rst-content .sidebar { + background-color: #f8f9f9; + border: 1px solid #e1e4e5; } + +.rst-content .admonition .admonition-title { + background-color: #009ee0; } +.rst-content .admonition.attention { + background-color: #ffd799; } + .rst-content .admonition.attention .admonition-title { + background-color: #ff9a00; } +.rst-content .admonition.caution { + background-color: #ffd799; } + .rst-content .admonition.caution .admonition-title { + background-color: #ff9a00; } +.rst-content .admonition.danger { + background-color: #fec9c2; } + .rst-content .admonition.danger .admonition-title { + background-color: #f22002; } +.rst-content .admonition.error { + background-color: #fec9c2; } + .rst-content .admonition.error .admonition-title { + background-color: #f22002; } +.rst-content .admonition.hint { + background-color: #ABF0AB; } + .rst-content .admonition.hint .admonition-title { + background-color: #00b000; } +.rst-content .admonition.important { + background-color: #ABF0AB; } + .rst-content .admonition.important .admonition-title { + background-color: #00b000; } +.rst-content .admonition.note { + background-color: #84d0f0; } + .rst-content .admonition.note .admonition-title { + background-color: #009ee0; + margin: -12px; } + .rst-content .admonition.note p, .rst-content .admonition.note ul { + margin-top: 0.5em; } +.rst-content .admonition.tip { + background-color: #ABF0AB; } + .rst-content .admonition.tip .admonition-title { + background-color: #00b000; } +.rst-content .admonition.warning { + background-color: #ffd799; } + .rst-content .admonition.warning .admonition-title { + background-color: #ff9a00; + margin: -12px; } + .rst-content .admonition.warning p, .rst-content .admonition.warning ul { + margin-top: 0.5em; } + +.wy-table thead th, .rst-content table.docutils thead th, .rst-content table.field-list thead th { + border: solid 1px #e1e4e5; + border-bottom: solid 2px #e1e4e5; } + +table .first.last.line-block { + margin-left: 0; } +table .headerlink { + display: none; } +table col { + width: auto !important; } + +.math { + position: relative; } + .math .eqno { + position: absolute; + right: 0; + top: 0; } + .math .eqno .headerlink { + display: none; } + +.wy-table-responsive table td, .wy-table-responsive table th { + white-space: normal; } + +.rst-versions { + box-shadow: -2px -3px 6px rgba(0, 0, 0, 0.4); + border-top: none; + color: #FFF; + background-color: #003d6a; + font-family: "Kuka Bulo", "Calibri", Helvetica, sans-serif; } + .rst-versions .rst-other-versions dd a { + color: #009ee0; + padding-left: 0; } + .rst-versions .rst-current-version { + background-color: #002037; + color: #FFFFFF; } + .rst-versions .rst-other-versions { + color: #FFF; } + +.rst-current-version .fa.fa-cog { + float: left; } + +/*# sourceMappingURL=schunk.css.map */ diff --git a/v24.04/en/_static/css/schunk.css.map b/v24.04/en/_static/css/schunk.css.map new file mode 100644 index 0000000..b80a8a8 --- /dev/null +++ b/v24.04/en/_static/css/schunk.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "AACQ,gFAAwE;AAiChF,gDAAiD;EAC/C,WAAW,EAhCa,kCAAkC;;AAmC5D,cAAe;EACb,WAAW,EAAE,GAAG;;AAGlB,eAAgB;EACd,gBAAgB,EA9BQ,OAAO;EA+B/B,SAAS,EAAE,KAAK;;AAGlB,oBAAqB;EACnB,gBAAgB,EAvCQ,OAAO;;AA0CjC,mHAAoH;EAClH,gBAAgB,EAAE,OAAkB;;AAKtC,IAAK;EACH,KAAK,EAtDmB,OAAO;;AAyDjC,SAAU;EACR,cAAc,EAAE,GAAG;;AAGrB,KAAM;EACJ,SAAS,EAAE,IAAI;EACf,KAAK,EA/DmB,OAAO;EAgE/B,WAAW,EAAE,KAAK;;AAGpB,OAAQ;EACN,aAAa,EAAE,YAAY;;AAG7B,uEAAwE;EACtE,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,IAAI;EACf,KAAK,EApEmB,OAAO;EAqE/B,WAAW,EArDa,GAAG;EAsD3B,aAAa,EAAE,GAAG;EAClB,WAAW,EAAE,IAAI;EACjB,aAAa,EAAE,QAAQ;EACvB,OAAO,EAAE,KAAK;EACd,WAAW,EAAE,MAAM;;AAGrB,sBAAkB;EAChB,aAAa,EAAE,IAAI;;AAGrB,EAAG;EACD,SAAS,EAAE,IAAI;;AAEjB,EAAG;EACD,SAAS,EAAE,IAAI;;AAEjB,EAAE;EACA,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;;AAElB,EAAE;EACA,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;;AAGlB,CAAE;EACA,KAAK,EAzFmB,OAAO;EA0F/B,QAAS;IACP,KAAK,EA3FiB,OAAO;EA6F/B,SAAU;IACR,KAAK,EA9FiB,OAAO;EAgG/B,OAAQ;IACN,KAAK,EAAE,OAAkB;IACzB,eAAe,EAAE,SAAS;;AAK9B,WAAY;EACV,gBAAgB,EAnHQ,OAAO;EAqH7B,yBAA0B;IAD5B,aAAE;MAEE,KAAK,EAAE,IAAI;MACX,mBAAQ;QACN,KAAK,EAAE,IAAI;MAEb,qBAAU;QACR,KAAK,EAAE,IAAI;EAIjB,aAAE;IACA,KAAK,EAAE,IAAI;;AAGf,YAAa;EACX,gBAAgB,EApIQ,OAAO;EAqI/B,YAAY,EAAE,kCAAkC;;AAGlD,mBAAoB;EAClB,gBAAgB,EAzIQ,OAAO;;AA4IjC,oCAAqC;EACnC,MAAM,EAAE,IAAI;EACZ,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,KAAK,EAnJmB,OAAO;EAoJ/B,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,iBAAiB;EACzB,gBAAgB,EAAE,OAAO;EACzB,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG;EAClB,UAAU,EAAE,GAAG;EACf,aAAa,EAAE,GAAG;EAClB,YAAY,EAAE,IAAI;EAClB,aAAa,EAAE,IAAI;;AAIrB,uBAAwB;EACtB,WAAW,EAAE,IAAI;EACjB,KAAK,EAAE,IAAI;EACX,6BAAQ;IACN,KAAK,EAAE,IAAI;IACX,eAAe,EAAE,IAAI;IACrB,gBAAgB,EAAE,WAAW;EAE/B,8BAAS;IACP,OAAO,EAAE,EAAE;IACX,KAAK,EAAE,KAAK;IACZ,MAAM,EAAE,IAAI;IACZ,UAAU,EAAE,iDAAiD;IAC7D,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,MAAM;IACd,aAAa,EAAE,IAAI;;AAKvB,0EAA2E;EACzE,KAAK,EA5KmB,OAAO;;AA+KjC,yBAA0B;EACxB,gBAAgB,EAAE,OAAuB;;AAG3C,4BAA6B;EAC3B,gBAAgB,EA1LQ,OAAO;;AA4LjC,oCAAqC;EACnC,gBAAgB,EAAE,OAAuB;;AAG3C,yQAA0Q;EACxQ,gBAAgB,EAjMQ,OAAO;EAkM/B,uSAAQ;IACN,gBAAgB,EAAE,OAAuB;;AAI7C,8BAA+B;EAC7B,KAAK,EAAE,IAAI;;AAGb,qOAAoO;EAClO,WAAW,EAAE,IAAI;;AAGnB,8BAA+B;EAC7B,YAAY,EAAE,WAAW;;AAG3B,2DAA4D;EAC1D,gBAAgB,EAAE,kBAAkB;EACpC,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,iBAAqB;EAEpC,uEAAQ;IACN,gBAAgB,EAAE,kBAAkB;;AAGxC,4BAA6B;EAC3B,gBAAgB,EAAE,6BAA6B;EAC/C,KAAK,EAAE,wBACT;;AAEA,mBAAoB;EAClB,YAAY,EAAE,OAAO;;AAEvB,8BAA+B;EAC7B,YAAY,EAAE,OAAO;;AAEvB,2CAA4C;EAC1C,YAAY,EAAE,GAAG;EACjB,gBAAgB,EAAE,kBAAkB;;AAEtC,mCAAoC;EAClC,YAAY,EAAE,GAAG;;AAEnB,2CAA4C;EAC1C,YAAY,EAAE,KAAK;EACnB,gBAAgB,EAAE,6BAA6B;;AAEjD,mCAAmC;EACjC,YAAY,EAAE,KAAK;;AAErB,2CAA4C;EAC1C,YAAY,EAAE,KAAK;EACnB,gBAAgB,EAAE,6BAA6B;;AAEjD,mCAAoC;EAClC,YAAY,EAAE,KAAK;;AAErB,yDAA0D;EACxD,YAAY,EAAE,KAAK;;AAErB,yDAA0D;EACxD,YAAY,EAAE,KAAK;;AAGrB,mGAAoG;EAClG,KAAK,EAAE,IAAI;EACX,+GAAQ;IACN,OAAO,EAAE,GAAG;;AAIhB,wCAAyC;EACvC,KAAK,EAAE,sBACT;;AAIA,IAAI;EACA,WAAW,EAAE,GAAG;EAChB,cAAc,EAAC,GAAG;EAClB,WAAW,EAAE,IAAI;EACjB,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG;EAClB,MAAM,EAAE,GAAG;EACX,WAAW,EAAC,MAAM;EAClB,QAAQ,EAAC,MAAM;EACf,aAAa,EAAC,QAAQ;EACtB,UAAU,EAAE,GAAG;EACf,aAAa,EAAE,GAAG;EAClB,UAAU,EAAE,IAAI;EAChB,UAAQ;IACN,KAAK,EAAE,IAAI;IACX,gBAAgB,EAAE,kBAAkB;IACpC,YAAY,EAAE,OAAO;IACrB,eAAe,EAAE,IAAI;;AAI3B,YAAY;EACR,SAAS,EA/Qa,IAAI;EAgR1B,WAAW,EAtRW,GAAG;EAuRzB,KAAK,EArSiB,OAAO;EAsS7B,UAAU,EAAE,MAAM;EAClB,MAAM,EAAE,iBAA4B;EACpC,aAAa,EAAE,GAAG;EAClB,QAAQ,EAAE,MAAM;EAChB,UAAU,EAzSY,OAAO;EAyST,kBAAkB;EACtC,UAAU,EAAE,mDAAoD;EAAE,cAAc;EAChF,UAAU,EAAE,sDAAsD;EAAE,6BAA6B;EACjG,UAAU,EAAE,oDAAoD;EAAE,sDAAsD;EACxH,MAAM,EAAE,2GAA2G;EAAE,WAAW;;AAKpI,oCAAqC;EACnC,gBAAgB,EAAE,OAAiB;EACnC,WAAW,EA5Ta,kCAAkC;;AA8T5D,qBAAsB;EACpB,gBAAgB,EAAE,OAAkB;EACpC,MAAM,EAAE,iBAAiB;;AAQvB,0CAAkB;EAChB,gBAAgB,EAtUI,OAAO;AAwU7B,kCAAY;EACV,gBAAgB,EAAE,OAAoB;EACtC,oDAAkB;IAChB,gBAAgB,EAhUE,OAAO;AAmU7B,gCAAU;EACR,gBAAgB,EAAE,OAAoB;EACtC,kDAAkB;IAChB,gBAAgB,EAtUE,OAAO;AAyU7B,+BAAS;EACP,gBAAgB,EAAE,OAAiB;EACnC,iDAAkB;IAChB,gBAAgB,EA9UE,OAAO;AAiV7B,8BAAQ;EACN,gBAAgB,EAAE,OAAiB;EACnC,gDAAkB;IAChB,gBAAgB,EApVE,OAAO;AAuV7B,6BAAO;EACL,gBAAgB,EAAE,OAAO;EACzB,+CAAkB;IAChB,gBAAgB,EAzVE,OAAO;AA4V7B,kCAAY;EACV,gBAAgB,EAAE,OAAO;EACzB,oDAAkB;IAChB,gBAAgB,EA/VE,OAAO;AAkW7B,6BAAO;EACL,gBAAgB,EAAE,OAAO;EACzB,+CAAkB;IAChB,gBAAgB,EA/WE,OAAO;IAgXzB,MAAM,EAAE,KAAK;EAEf,iEAAM;IACJ,UAAU,EAAE,KAAK;AAGrB,4BAAM;EACJ,gBAAgB,EAAE,OAAO;EACzB,8CAAkB;IAChB,gBAAgB,EA/WE,OAAO;AAkX7B,gCAAU;EACR,gBAAgB,EAAE,OAAoB;EACtC,kDAAkB;IAChB,gBAAgB,EApXE,OAAO;IAqXzB,MAAM,EAAE,KAAK;EAEf,uEAAM;IACJ,UAAU,EAAE,KAAK;;AAOzB,gGAAiG;EAC/F,MAAM,EAAE,iBAAiB;EACzB,aAAa,EAAE,iBACjB;;AAGE,4BAAuB;EACrB,WAAW,EAAE,CAAC;AAEhB,iBAAY;EACV,OAAO,EAAE,IAAI;AAEf,SAAI;EACF,KAAK,EAAE,eAAe;;AAM1B,KAAM;EACJ,QAAQ,EAAE,QAAQ;EAClB,WAAM;IACJ,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,CAAC;IACR,GAAG,EAAE,CAAC;IACN,uBAAY;MACV,OAAO,EAAE,IAAI;;AAKnB,4DAA6D;EAC3D,WAAW,EAAE,MAAM;;AAGrB,aAAc;EACZ,UAAU,EAAE,gCAA6B;EACzC,UAAU,EAAE,IAAI;EAChB,KAAK,EAAE,IAAI;EACX,gBAAgB,EAhbQ,OAAO;EAib/B,WAAW,EAAE,6CAA6C;EAC1D,sCAAyB;IACvB,KAAK,EApbiB,OAAO;IAqb7B,YAAY,EAAE,CAAC;EAEjB,kCAAqB;IACnB,gBAAgB,EAAE,OAAwB;IAC1C,KAAK,EAAE,OAAO;EAGhB,iCAAoB;IAClB,KAAK,EAAE,IAAI;;AAGf,+BAAgC;EAC9B,KAAK,EAAE,IAAI", +"sources": ["../../../sass/schunk_overrides.scss"], +"names": [], +"file": "schunk.css" +} diff --git a/v24.04/en/_static/css/theme.css b/v24.04/en/_static/css/theme.css new file mode 100644 index 0000000..8fce59f --- /dev/null +++ b/v24.04/en/_static/css/theme.css @@ -0,0 +1,6043 @@ +@charset "UTF-8"; +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +article, aside, details, figcaption, figure, footer, header, hgroup, nav, section { + display: block; +} + +audio, canvas, video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +audio:not([controls]) { + display: none; +} + +[hidden] { + display: none; +} + +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +body { + margin: 0; +} + +a:hover, a:active { + outline: 0; +} + +abbr[title] { + border-bottom: 1px dotted; +} + +b, strong { + font-weight: bold; +} + +blockquote { + margin: 0; +} + +dfn { + font-style: italic; +} + +ins { + background: #ff9; + color: #000; + text-decoration: none; +} + +mark { + background: #ff0; + color: #000; + font-style: italic; + font-weight: bold; +} + +pre, code, .rst-content tt, .rst-content code, kbd, samp { + font-family: monospace, serif; + _font-family: "courier new", monospace; + font-size: 1em; +} + +pre { + white-space: pre; +} + +q { + quotes: none; +} + +q:before, q:after { + content: ""; + content: none; +} + +small { + font-size: 85%; +} + +sub, sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +ul, ol, dl { + margin: 0; + padding: 0; + list-style: none; + list-style-image: none; +} + +li { + list-style: none; +} + +dd { + margin: 0; +} + +img { + border: 0; + -ms-interpolation-mode: bicubic; + vertical-align: middle; + max-width: 100%; +} + +svg:not(:root) { + overflow: hidden; +} + +figure { + margin: 0; +} + +form { + margin: 0; +} + +fieldset { + border: 0; + margin: 0; + padding: 0; +} + +label { + cursor: pointer; +} + +legend { + border: 0; + *margin-left: -7px; + padding: 0; + white-space: normal; +} + +button, input, select, textarea { + font-size: 100%; + margin: 0; + vertical-align: baseline; + *vertical-align: middle; +} + +button, input { + line-height: normal; +} + +button, input[type="button"], input[type="reset"], input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; + *overflow: visible; +} + +button[disabled], input[disabled] { + cursor: default; +} + +input[type="checkbox"], input[type="radio"] { + box-sizing: border-box; + padding: 0; + *width: 13px; + *height: 13px; +} + +input[type="search"] { + -webkit-appearance: textfield; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} + +input[type="search"]::-webkit-search-decoration, input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +button::-moz-focus-inner, input::-moz-focus-inner { + border: 0; + padding: 0; +} + +textarea { + overflow: auto; + vertical-align: top; + resize: vertical; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td { + vertical-align: top; +} + +.chromeframe { + margin: 0.2em 0; + background: #ccc; + color: black; + padding: 0.2em 0; +} + +.ir { + display: block; + border: 0; + text-indent: -999em; + overflow: hidden; + background-color: transparent; + background-repeat: no-repeat; + text-align: left; + direction: ltr; + *line-height: 0; +} + +.ir br { + display: none; +} + +.hidden { + display: none !important; + visibility: hidden; +} + +.visuallyhidden { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} + +.visuallyhidden.focusable:active, .visuallyhidden.focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} + +.invisible { + visibility: hidden; +} + +.relative { + position: relative; +} + +big, small { + font-size: 100%; +} + +@media print { + html, body, section { + background: none !important; + } + + * { + box-shadow: none !important; + text-shadow: none !important; + filter: none !important; + -ms-filter: none !important; + } + + a, a:visited { + text-decoration: underline; + } + + .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { + content: ""; + } + + pre, blockquote { + page-break-inside: avoid; + } + + thead { + display: table-header-group; + } + + tr, img { + page-break-inside: avoid; + } + + img { + max-width: 100% !important; + } + + @page { + margin: 0.5cm; + } + p, h2, .rst-content .toctree-wrapper p.caption, h3 { + orphans: 3; + widows: 3; + } + + h2, .rst-content .toctree-wrapper p.caption, h3 { + page-break-after: avoid; + } +} +.fa:before, .wy-menu-vertical li span.toctree-expand:before, .wy-menu-vertical li.on a span.toctree-expand:before, .wy-menu-vertical li.current > a span.toctree-expand:before, .rst-content .admonition-title:before, .rst-content h1 .headerlink:before, .rst-content h2 .headerlink:before, .rst-content h3 .headerlink:before, .rst-content h4 .headerlink:before, .rst-content h5 .headerlink:before, .rst-content h6 .headerlink:before, .rst-content dl dt .headerlink:before, .rst-content p.caption .headerlink:before, .rst-content tt.download span:first-child:before, .rst-content code.download span:first-child:before, .icon:before, .wy-dropdown .caret:before, .wy-inline-validate.wy-inline-validate-success .wy-input-context:before, .wy-inline-validate.wy-inline-validate-danger .wy-input-context:before, .wy-inline-validate.wy-inline-validate-warning .wy-input-context:before, .wy-inline-validate.wy-inline-validate-info .wy-input-context:before, .wy-alert, .rst-content .note, .rst-content .attention, .rst-content .caution, .rst-content .danger, .rst-content .error, .rst-content .hint, .rst-content .important, .rst-content .tip, .rst-content .warning, .rst-content .seealso, .rst-content .admonition-todo, .rst-content .admonition, .btn, input[type="text"], input[type="password"], input[type="email"], input[type="url"], input[type="date"], input[type="month"], input[type="time"], input[type="datetime"], input[type="datetime-local"], input[type="week"], input[type="number"], input[type="search"], input[type="tel"], input[type="color"], select, textarea, .wy-menu-vertical li.on a, .wy-menu-vertical li.current > a, .wy-side-nav-search > a, .wy-side-nav-search .wy-dropdown > a, .wy-nav-top a { + -webkit-font-smoothing: antialiased; +} + +.clearfix { + *zoom: 1; +} +.clearfix:before, .clearfix:after { + display: table; + content: ""; +} +.clearfix:after { + clear: both; +} + +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url("../fonts/fontawesome-webfont.eot?v=4.7.0"); + src: url("../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0") format("embedded-opentype"), url("../fonts/fontawesome-webfont.woff2?v=4.7.0") format("woff2"), url("../fonts/fontawesome-webfont.woff?v=4.7.0") format("woff"), url("../fonts/fontawesome-webfont.ttf?v=4.7.0") format("truetype"), url("../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular") format("svg"); + font-weight: normal; + font-style: normal; +} +.fa, .wy-menu-vertical li span.toctree-expand, .wy-menu-vertical li.on a span.toctree-expand, .wy-menu-vertical li.current > a span.toctree-expand, .rst-content .admonition-title, .rst-content h1 .headerlink, .rst-content h2 .headerlink, .rst-content h3 .headerlink, .rst-content h4 .headerlink, .rst-content h5 .headerlink, .rst-content h6 .headerlink, .rst-content dl dt .headerlink, .rst-content p.caption .headerlink, .rst-content tt.download span:first-child, .rst-content code.download span:first-child, .icon { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.3333333333em; + line-height: 0.75em; + vertical-align: -15%; +} + +.fa-2x { + font-size: 2em; +} + +.fa-3x { + font-size: 3em; +} + +.fa-4x { + font-size: 4em; +} + +.fa-5x { + font-size: 5em; +} + +.fa-fw { + width: 1.2857142857em; + text-align: center; +} + +.fa-ul { + padding-left: 0; + margin-left: 2.1428571429em; + list-style-type: none; +} +.fa-ul > li { + position: relative; +} + +.fa-li { + position: absolute; + left: -2.1428571429em; + width: 2.1428571429em; + top: 0.1428571429em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.8571428571em; +} + +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eee; + border-radius: .1em; +} + +.fa-pull-left { + float: left; +} + +.fa-pull-right { + float: right; +} + +.fa.fa-pull-left, .wy-menu-vertical li span.fa-pull-left.toctree-expand, .wy-menu-vertical li.on a span.fa-pull-left.toctree-expand, .wy-menu-vertical li.current > a span.fa-pull-left.toctree-expand, .rst-content .fa-pull-left.admonition-title, .rst-content h1 .fa-pull-left.headerlink, .rst-content h2 .fa-pull-left.headerlink, .rst-content h3 .fa-pull-left.headerlink, .rst-content h4 .fa-pull-left.headerlink, .rst-content h5 .fa-pull-left.headerlink, .rst-content h6 .fa-pull-left.headerlink, .rst-content dl dt .fa-pull-left.headerlink, .rst-content p.caption .fa-pull-left.headerlink, .rst-content tt.download span.fa-pull-left:first-child, .rst-content code.download span.fa-pull-left:first-child, .fa-pull-left.icon { + margin-right: .3em; +} +.fa.fa-pull-right, .wy-menu-vertical li span.fa-pull-right.toctree-expand, .wy-menu-vertical li.on a span.fa-pull-right.toctree-expand, .wy-menu-vertical li.current > a span.fa-pull-right.toctree-expand, .rst-content .fa-pull-right.admonition-title, .rst-content h1 .fa-pull-right.headerlink, .rst-content h2 .fa-pull-right.headerlink, .rst-content h3 .fa-pull-right.headerlink, .rst-content h4 .fa-pull-right.headerlink, .rst-content h5 .fa-pull-right.headerlink, .rst-content h6 .fa-pull-right.headerlink, .rst-content dl dt .fa-pull-right.headerlink, .rst-content p.caption .fa-pull-right.headerlink, .rst-content tt.download span.fa-pull-right:first-child, .rst-content code.download span.fa-pull-right:first-child, .fa-pull-right.icon { + margin-left: .3em; +} + +/* Deprecated as of 4.4.0 */ +.pull-right { + float: right; +} + +.pull-left { + float: left; +} + +.fa.pull-left, .wy-menu-vertical li span.pull-left.toctree-expand, .wy-menu-vertical li.on a span.pull-left.toctree-expand, .wy-menu-vertical li.current > a span.pull-left.toctree-expand, .rst-content .pull-left.admonition-title, .rst-content h1 .pull-left.headerlink, .rst-content h2 .pull-left.headerlink, .rst-content h3 .pull-left.headerlink, .rst-content h4 .pull-left.headerlink, .rst-content h5 .pull-left.headerlink, .rst-content h6 .pull-left.headerlink, .rst-content dl dt .pull-left.headerlink, .rst-content p.caption .pull-left.headerlink, .rst-content tt.download span.pull-left:first-child, .rst-content code.download span.pull-left:first-child, .pull-left.icon { + margin-right: .3em; +} +.fa.pull-right, .wy-menu-vertical li span.pull-right.toctree-expand, .wy-menu-vertical li.on a span.pull-right.toctree-expand, .wy-menu-vertical li.current > a span.pull-right.toctree-expand, .rst-content .pull-right.admonition-title, .rst-content h1 .pull-right.headerlink, .rst-content h2 .pull-right.headerlink, .rst-content h3 .pull-right.headerlink, .rst-content h4 .pull-right.headerlink, .rst-content h5 .pull-right.headerlink, .rst-content h6 .pull-right.headerlink, .rst-content dl dt .pull-right.headerlink, .rst-content p.caption .pull-right.headerlink, .rst-content tt.download span.pull-right:first-child, .rst-content code.download span.pull-right:first-child, .pull-right.icon { + margin-left: .3em; +} + +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} + +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} + +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} + +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} + +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); +} + +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); +} + +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + filter: none; +} + +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} + +.fa-stack-1x, .fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} + +.fa-stack-1x { + line-height: inherit; +} + +.fa-stack-2x { + font-size: 2em; +} + +.fa-inverse { + color: #fff; +} + +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: ""; +} + +.fa-music:before { + content: ""; +} + +.fa-search:before, .icon-search:before { + content: ""; +} + +.fa-envelope-o:before { + content: ""; +} + +.fa-heart:before { + content: ""; +} + +.fa-star:before { + content: ""; +} + +.fa-star-o:before { + content: ""; +} + +.fa-user:before { + content: ""; +} + +.fa-film:before { + content: ""; +} + +.fa-th-large:before { + content: ""; +} + +.fa-th:before { + content: ""; +} + +.fa-th-list:before { + content: ""; +} + +.fa-check:before { + content: ""; +} + +.fa-remove:before, +.fa-close:before, +.fa-times:before { + content: ""; +} + +.fa-search-plus:before { + content: ""; +} + +.fa-search-minus:before { + content: ""; +} + +.fa-power-off:before { + content: ""; +} + +.fa-signal:before { + content: ""; +} + +.fa-gear:before, +.fa-cog:before { + content: ""; +} + +.fa-trash-o:before { + content: ""; +} + +.fa-home:before, .icon-home:before { + content: ""; +} + +.fa-file-o:before { + content: ""; +} + +.fa-clock-o:before { + content: ""; +} + +.fa-road:before { + content: ""; +} + +.fa-download:before, .rst-content tt.download span:first-child:before, .rst-content code.download span:first-child:before { + content: ""; +} + +.fa-arrow-circle-o-down:before { + content: ""; +} + +.fa-arrow-circle-o-up:before { + content: ""; +} + +.fa-inbox:before { + content: ""; +} + +.fa-play-circle-o:before { + content: ""; +} + +.fa-rotate-right:before, +.fa-repeat:before { + content: ""; +} + +.fa-refresh:before { + content: ""; +} + +.fa-list-alt:before { + content: ""; +} + +.fa-lock:before { + content: ""; +} + +.fa-flag:before { + content: ""; +} + +.fa-headphones:before { + content: ""; +} + +.fa-volume-off:before { + content: ""; +} + +.fa-volume-down:before { + content: ""; +} + +.fa-volume-up:before { + content: ""; +} + +.fa-qrcode:before { + content: ""; +} + +.fa-barcode:before { + content: ""; +} + +.fa-tag:before { + content: ""; +} + +.fa-tags:before { + content: ""; +} + +.fa-book:before, .icon-book:before { + content: ""; +} + +.fa-bookmark:before { + content: ""; +} + +.fa-print:before { + content: ""; +} + +.fa-camera:before { + content: ""; +} + +.fa-font:before { + content: ""; +} + +.fa-bold:before { + content: ""; +} + +.fa-italic:before { + content: ""; +} + +.fa-text-height:before { + content: ""; +} + +.fa-text-width:before { + content: ""; +} + +.fa-align-left:before { + content: ""; +} + +.fa-align-center:before { + content: ""; +} + +.fa-align-right:before { + content: ""; +} + +.fa-align-justify:before { + content: ""; +} + +.fa-list:before { + content: ""; +} + +.fa-dedent:before, +.fa-outdent:before { + content: ""; +} + +.fa-indent:before { + content: ""; +} + +.fa-video-camera:before { + content: ""; +} + +.fa-photo:before, +.fa-image:before, +.fa-picture-o:before { + content: ""; +} + +.fa-pencil:before { + content: ""; +} + +.fa-map-marker:before { + content: ""; +} + +.fa-adjust:before { + content: ""; +} + +.fa-tint:before { + content: ""; +} + +.fa-edit:before, +.fa-pencil-square-o:before { + content: ""; +} + +.fa-share-square-o:before { + content: ""; +} + +.fa-check-square-o:before { + content: ""; +} + +.fa-arrows:before { + content: ""; +} + +.fa-step-backward:before { + content: ""; +} + +.fa-fast-backward:before { + content: ""; +} + +.fa-backward:before { + content: ""; +} + +.fa-play:before { + content: ""; +} + +.fa-pause:before { + content: ""; +} + +.fa-stop:before { + content: ""; +} + +.fa-forward:before { + content: ""; +} + +.fa-fast-forward:before { + content: ""; +} + +.fa-step-forward:before { + content: ""; +} + +.fa-eject:before { + content: ""; +} + +.fa-chevron-left:before { + content: ""; +} + +.fa-chevron-right:before { + content: ""; +} + +.fa-plus-circle:before { + content: ""; +} + +.fa-minus-circle:before { + content: ""; +} + +.fa-times-circle:before, .wy-inline-validate.wy-inline-validate-danger .wy-input-context:before { + content: ""; +} + +.fa-check-circle:before, .wy-inline-validate.wy-inline-validate-success .wy-input-context:before { + content: ""; +} + +.fa-question-circle:before { + content: ""; +} + +.fa-info-circle:before { + content: ""; +} + +.fa-crosshairs:before { + content: ""; +} + +.fa-times-circle-o:before { + content: ""; +} + +.fa-check-circle-o:before { + content: ""; +} + +.fa-ban:before { + content: ""; +} + +.fa-arrow-left:before { + content: ""; +} + +.fa-arrow-right:before { + content: ""; +} + +.fa-arrow-up:before { + content: ""; +} + +.fa-arrow-down:before { + content: ""; +} + +.fa-mail-forward:before, +.fa-share:before { + content: ""; +} + +.fa-expand:before { + content: ""; +} + +.fa-compress:before { + content: ""; +} + +.fa-plus:before { + content: ""; +} + +.fa-minus:before { + content: ""; +} + +.fa-asterisk:before { + content: ""; +} + +.fa-exclamation-circle:before, .wy-inline-validate.wy-inline-validate-warning .wy-input-context:before, .wy-inline-validate.wy-inline-validate-info .wy-input-context:before, .rst-content .admonition-title:before { + content: ""; +} + +.fa-gift:before { + content: ""; +} + +.fa-leaf:before { + content: ""; +} + +.fa-fire:before, .icon-fire:before { + content: ""; +} + +.fa-eye:before { + content: ""; +} + +.fa-eye-slash:before { + content: ""; +} + +.fa-warning:before, +.fa-exclamation-triangle:before { + content: ""; +} + +.fa-plane:before { + content: ""; +} + +.fa-calendar:before { + content: ""; +} + +.fa-random:before { + content: ""; +} + +.fa-comment:before { + content: ""; +} + +.fa-magnet:before { + content: ""; +} + +.fa-chevron-up:before { + content: ""; +} + +.fa-chevron-down:before { + content: ""; +} + +.fa-retweet:before { + content: ""; +} + +.fa-shopping-cart:before { + content: ""; +} + +.fa-folder:before { + content: ""; +} + +.fa-folder-open:before { + content: ""; +} + +.fa-arrows-v:before { + content: ""; +} + +.fa-arrows-h:before { + content: ""; +} + +.fa-bar-chart-o:before, +.fa-bar-chart:before { + content: ""; +} + +.fa-twitter-square:before { + content: ""; +} + +.fa-facebook-square:before { + content: ""; +} + +.fa-camera-retro:before { + content: ""; +} + +.fa-key:before { + content: ""; +} + +.fa-gears:before, +.fa-cogs:before { + content: ""; +} + +.fa-comments:before { + content: ""; +} + +.fa-thumbs-o-up:before { + content: ""; +} + +.fa-thumbs-o-down:before { + content: ""; +} + +.fa-star-half:before { + content: ""; +} + +.fa-heart-o:before { + content: ""; +} + +.fa-sign-out:before { + content: ""; +} + +.fa-linkedin-square:before { + content: ""; +} + +.fa-thumb-tack:before { + content: ""; +} + +.fa-external-link:before { + content: ""; +} + +.fa-sign-in:before { + content: ""; +} + +.fa-trophy:before { + content: ""; +} + +.fa-github-square:before { + content: ""; +} + +.fa-upload:before { + content: ""; +} + +.fa-lemon-o:before { + content: ""; +} + +.fa-phone:before { + content: ""; +} + +.fa-square-o:before { + content: ""; +} + +.fa-bookmark-o:before { + content: ""; +} + +.fa-phone-square:before { + content: ""; +} + +.fa-twitter:before { + content: ""; +} + +.fa-facebook-f:before, +.fa-facebook:before { + content: ""; +} + +.fa-github:before, .icon-github:before { + content: ""; +} + +.fa-unlock:before { + content: ""; +} + +.fa-credit-card:before { + content: ""; +} + +.fa-feed:before, +.fa-rss:before { + content: ""; +} + +.fa-hdd-o:before { + content: ""; +} + +.fa-bullhorn:before { + content: ""; +} + +.fa-bell:before { + content: ""; +} + +.fa-certificate:before { + content: ""; +} + +.fa-hand-o-right:before { + content: ""; +} + +.fa-hand-o-left:before { + content: ""; +} + +.fa-hand-o-up:before { + content: ""; +} + +.fa-hand-o-down:before { + content: ""; +} + +.fa-arrow-circle-left:before, .icon-circle-arrow-left:before { + content: ""; +} + +.fa-arrow-circle-right:before, .icon-circle-arrow-right:before { + content: ""; +} + +.fa-arrow-circle-up:before { + content: ""; +} + +.fa-arrow-circle-down:before { + content: ""; +} + +.fa-globe:before { + content: ""; +} + +.fa-wrench:before { + content: ""; +} + +.fa-tasks:before { + content: ""; +} + +.fa-filter:before { + content: ""; +} + +.fa-briefcase:before { + content: ""; +} + +.fa-arrows-alt:before { + content: ""; +} + +.fa-group:before, +.fa-users:before { + content: ""; +} + +.fa-chain:before, +.fa-link:before, +.icon-link:before { + content: ""; +} + +.fa-cloud:before { + content: ""; +} + +.fa-flask:before { + content: ""; +} + +.fa-cut:before, +.fa-scissors:before { + content: ""; +} + +.fa-copy:before, +.fa-files-o:before { + content: ""; +} + +.fa-paperclip:before { + content: ""; +} + +.fa-save:before, +.fa-floppy-o:before { + content: ""; +} + +.fa-square:before { + content: ""; +} + +.fa-navicon:before, +.fa-reorder:before, +.fa-bars:before { + content: ""; +} + +.fa-list-ul:before { + content: ""; +} + +.fa-list-ol:before { + content: ""; +} + +.fa-strikethrough:before { + content: ""; +} + +.fa-underline:before { + content: ""; +} + +.fa-table:before { + content: ""; +} + +.fa-magic:before { + content: ""; +} + +.fa-truck:before { + content: ""; +} + +.fa-pinterest:before { + content: ""; +} + +.fa-pinterest-square:before { + content: ""; +} + +.fa-google-plus-square:before { + content: ""; +} + +.fa-google-plus:before { + content: ""; +} + +.fa-money:before { + content: ""; +} + +.fa-caret-down:before, .wy-dropdown .caret:before, .icon-caret-down:before { + content: ""; +} + +.fa-caret-up:before { + content: ""; +} + +.fa-caret-left:before { + content: ""; +} + +.fa-caret-right:before { + content: ""; +} + +.fa-columns:before { + content: ""; +} + +.fa-unsorted:before, +.fa-sort:before { + content: ""; +} + +.fa-sort-down:before, +.fa-sort-desc:before { + content: ""; +} + +.fa-sort-up:before, +.fa-sort-asc:before { + content: ""; +} + +.fa-envelope:before { + content: ""; +} + +.fa-linkedin:before { + content: ""; +} + +.fa-rotate-left:before, +.fa-undo:before { + content: ""; +} + +.fa-legal:before, +.fa-gavel:before { + content: ""; +} + +.fa-dashboard:before, +.fa-tachometer:before { + content: ""; +} + +.fa-comment-o:before { + content: ""; +} + +.fa-comments-o:before { + content: ""; +} + +.fa-flash:before, +.fa-bolt:before { + content: ""; +} + +.fa-sitemap:before { + content: ""; +} + +.fa-umbrella:before { + content: ""; +} + +.fa-paste:before, +.fa-clipboard:before { + content: ""; +} + +.fa-lightbulb-o:before { + content: ""; +} + +.fa-exchange:before { + content: ""; +} + +.fa-cloud-download:before { + content: ""; +} + +.fa-cloud-upload:before { + content: ""; +} + +.fa-user-md:before { + content: ""; +} + +.fa-stethoscope:before { + content: ""; +} + +.fa-suitcase:before { + content: ""; +} + +.fa-bell-o:before { + content: ""; +} + +.fa-coffee:before { + content: ""; +} + +.fa-cutlery:before { + content: ""; +} + +.fa-file-text-o:before { + content: ""; +} + +.fa-building-o:before { + content: ""; +} + +.fa-hospital-o:before { + content: ""; +} + +.fa-ambulance:before { + content: ""; +} + +.fa-medkit:before { + content: ""; +} + +.fa-fighter-jet:before { + content: ""; +} + +.fa-beer:before { + content: ""; +} + +.fa-h-square:before { + content: ""; +} + +.fa-plus-square:before { + content: ""; +} + +.fa-angle-double-left:before { + content: ""; +} + +.fa-angle-double-right:before { + content: ""; +} + +.fa-angle-double-up:before { + content: ""; +} + +.fa-angle-double-down:before { + content: ""; +} + +.fa-angle-left:before { + content: ""; +} + +.fa-angle-right:before { + content: ""; +} + +.fa-angle-up:before { + content: ""; +} + +.fa-angle-down:before { + content: ""; +} + +.fa-desktop:before { + content: ""; +} + +.fa-laptop:before { + content: ""; +} + +.fa-tablet:before { + content: ""; +} + +.fa-mobile-phone:before, +.fa-mobile:before { + content: ""; +} + +.fa-circle-o:before { + content: ""; +} + +.fa-quote-left:before { + content: ""; +} + +.fa-quote-right:before { + content: ""; +} + +.fa-spinner:before { + content: ""; +} + +.fa-circle:before { + content: ""; +} + +.fa-mail-reply:before, +.fa-reply:before { + content: ""; +} + +.fa-github-alt:before { + content: ""; +} + +.fa-folder-o:before { + content: ""; +} + +.fa-folder-open-o:before { + content: ""; +} + +.fa-smile-o:before { + content: ""; +} + +.fa-frown-o:before { + content: ""; +} + +.fa-meh-o:before { + content: ""; +} + +.fa-gamepad:before { + content: ""; +} + +.fa-keyboard-o:before { + content: ""; +} + +.fa-flag-o:before { + content: ""; +} + +.fa-flag-checkered:before { + content: ""; +} + +.fa-terminal:before { + content: ""; +} + +.fa-code:before { + content: ""; +} + +.fa-mail-reply-all:before, +.fa-reply-all:before { + content: ""; +} + +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: ""; +} + +.fa-location-arrow:before { + content: ""; +} + +.fa-crop:before { + content: ""; +} + +.fa-code-fork:before { + content: ""; +} + +.fa-unlink:before, +.fa-chain-broken:before { + content: ""; +} + +.fa-question:before { + content: ""; +} + +.fa-info:before { + content: ""; +} + +.fa-exclamation:before { + content: ""; +} + +.fa-superscript:before { + content: ""; +} + +.fa-subscript:before { + content: ""; +} + +.fa-eraser:before { + content: ""; +} + +.fa-puzzle-piece:before { + content: ""; +} + +.fa-microphone:before { + content: ""; +} + +.fa-microphone-slash:before { + content: ""; +} + +.fa-shield:before { + content: ""; +} + +.fa-calendar-o:before { + content: ""; +} + +.fa-fire-extinguisher:before { + content: ""; +} + +.fa-rocket:before { + content: ""; +} + +.fa-maxcdn:before { + content: ""; +} + +.fa-chevron-circle-left:before { + content: ""; +} + +.fa-chevron-circle-right:before { + content: ""; +} + +.fa-chevron-circle-up:before { + content: ""; +} + +.fa-chevron-circle-down:before { + content: ""; +} + +.fa-html5:before { + content: ""; +} + +.fa-css3:before { + content: ""; +} + +.fa-anchor:before { + content: ""; +} + +.fa-unlock-alt:before { + content: ""; +} + +.fa-bullseye:before { + content: ""; +} + +.fa-ellipsis-h:before { + content: ""; +} + +.fa-ellipsis-v:before { + content: ""; +} + +.fa-rss-square:before { + content: ""; +} + +.fa-play-circle:before { + content: ""; +} + +.fa-ticket:before { + content: ""; +} + +.fa-minus-square:before { + content: ""; +} + +.fa-minus-square-o:before, .wy-menu-vertical li.on a span.toctree-expand:before, .wy-menu-vertical li.current > a span.toctree-expand:before { + content: ""; +} + +.fa-level-up:before { + content: ""; +} + +.fa-level-down:before { + content: ""; +} + +.fa-check-square:before { + content: ""; +} + +.fa-pencil-square:before { + content: ""; +} + +.fa-external-link-square:before { + content: ""; +} + +.fa-share-square:before { + content: ""; +} + +.fa-compass:before { + content: ""; +} + +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: ""; +} + +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: ""; +} + +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: ""; +} + +.fa-euro:before, +.fa-eur:before { + content: ""; +} + +.fa-gbp:before { + content: ""; +} + +.fa-dollar:before, +.fa-usd:before { + content: ""; +} + +.fa-rupee:before, +.fa-inr:before { + content: ""; +} + +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: ""; +} + +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: ""; +} + +.fa-won:before, +.fa-krw:before { + content: ""; +} + +.fa-bitcoin:before, +.fa-btc:before { + content: ""; +} + +.fa-file:before { + content: ""; +} + +.fa-file-text:before { + content: ""; +} + +.fa-sort-alpha-asc:before { + content: ""; +} + +.fa-sort-alpha-desc:before { + content: ""; +} + +.fa-sort-amount-asc:before { + content: ""; +} + +.fa-sort-amount-desc:before { + content: ""; +} + +.fa-sort-numeric-asc:before { + content: ""; +} + +.fa-sort-numeric-desc:before { + content: ""; +} + +.fa-thumbs-up:before { + content: ""; +} + +.fa-thumbs-down:before { + content: ""; +} + +.fa-youtube-square:before { + content: ""; +} + +.fa-youtube:before { + content: ""; +} + +.fa-xing:before { + content: ""; +} + +.fa-xing-square:before { + content: ""; +} + +.fa-youtube-play:before { + content: ""; +} + +.fa-dropbox:before { + content: ""; +} + +.fa-stack-overflow:before { + content: ""; +} + +.fa-instagram:before { + content: ""; +} + +.fa-flickr:before { + content: ""; +} + +.fa-adn:before { + content: ""; +} + +.fa-bitbucket:before, .icon-bitbucket:before { + content: ""; +} + +.fa-bitbucket-square:before { + content: ""; +} + +.fa-tumblr:before { + content: ""; +} + +.fa-tumblr-square:before { + content: ""; +} + +.fa-long-arrow-down:before { + content: ""; +} + +.fa-long-arrow-up:before { + content: ""; +} + +.fa-long-arrow-left:before { + content: ""; +} + +.fa-long-arrow-right:before { + content: ""; +} + +.fa-apple:before { + content: ""; +} + +.fa-windows:before { + content: ""; +} + +.fa-android:before { + content: ""; +} + +.fa-linux:before { + content: ""; +} + +.fa-dribbble:before { + content: ""; +} + +.fa-skype:before { + content: ""; +} + +.fa-foursquare:before { + content: ""; +} + +.fa-trello:before { + content: ""; +} + +.fa-female:before { + content: ""; +} + +.fa-male:before { + content: ""; +} + +.fa-gittip:before, +.fa-gratipay:before { + content: ""; +} + +.fa-sun-o:before { + content: ""; +} + +.fa-moon-o:before { + content: ""; +} + +.fa-archive:before { + content: ""; +} + +.fa-bug:before { + content: ""; +} + +.fa-vk:before { + content: ""; +} + +.fa-weibo:before { + content: ""; +} + +.fa-renren:before { + content: ""; +} + +.fa-pagelines:before { + content: ""; +} + +.fa-stack-exchange:before { + content: ""; +} + +.fa-arrow-circle-o-right:before { + content: ""; +} + +.fa-arrow-circle-o-left:before { + content: ""; +} + +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: ""; +} + +.fa-dot-circle-o:before { + content: ""; +} + +.fa-wheelchair:before { + content: ""; +} + +.fa-vimeo-square:before { + content: ""; +} + +.fa-turkish-lira:before, +.fa-try:before { + content: ""; +} + +.fa-plus-square-o:before, .wy-menu-vertical li span.toctree-expand:before { + content: ""; +} + +.fa-space-shuttle:before { + content: ""; +} + +.fa-slack:before { + content: ""; +} + +.fa-envelope-square:before { + content: ""; +} + +.fa-wordpress:before { + content: ""; +} + +.fa-openid:before { + content: ""; +} + +.fa-institution:before, +.fa-bank:before, +.fa-university:before { + content: ""; +} + +.fa-mortar-board:before, +.fa-graduation-cap:before { + content: ""; +} + +.fa-yahoo:before { + content: ""; +} + +.fa-google:before { + content: ""; +} + +.fa-reddit:before { + content: ""; +} + +.fa-reddit-square:before { + content: ""; +} + +.fa-stumbleupon-circle:before { + content: ""; +} + +.fa-stumbleupon:before { + content: ""; +} + +.fa-delicious:before { + content: ""; +} + +.fa-digg:before { + content: ""; +} + +.fa-pied-piper-pp:before { + content: ""; +} + +.fa-pied-piper-alt:before { + content: ""; +} + +.fa-drupal:before { + content: ""; +} + +.fa-joomla:before { + content: ""; +} + +.fa-language:before { + content: ""; +} + +.fa-fax:before { + content: ""; +} + +.fa-building:before { + content: ""; +} + +.fa-child:before { + content: ""; +} + +.fa-paw:before { + content: ""; +} + +.fa-spoon:before { + content: ""; +} + +.fa-cube:before { + content: ""; +} + +.fa-cubes:before { + content: ""; +} + +.fa-behance:before { + content: ""; +} + +.fa-behance-square:before { + content: ""; +} + +.fa-steam:before { + content: ""; +} + +.fa-steam-square:before { + content: ""; +} + +.fa-recycle:before { + content: ""; +} + +.fa-automobile:before, +.fa-car:before { + content: ""; +} + +.fa-cab:before, +.fa-taxi:before { + content: ""; +} + +.fa-tree:before { + content: ""; +} + +.fa-spotify:before { + content: ""; +} + +.fa-deviantart:before { + content: ""; +} + +.fa-soundcloud:before { + content: ""; +} + +.fa-database:before { + content: ""; +} + +.fa-file-pdf-o:before { + content: ""; +} + +.fa-file-word-o:before { + content: ""; +} + +.fa-file-excel-o:before { + content: ""; +} + +.fa-file-powerpoint-o:before { + content: ""; +} + +.fa-file-photo-o:before, +.fa-file-picture-o:before, +.fa-file-image-o:before { + content: ""; +} + +.fa-file-zip-o:before, +.fa-file-archive-o:before { + content: ""; +} + +.fa-file-sound-o:before, +.fa-file-audio-o:before { + content: ""; +} + +.fa-file-movie-o:before, +.fa-file-video-o:before { + content: ""; +} + +.fa-file-code-o:before { + content: ""; +} + +.fa-vine:before { + content: ""; +} + +.fa-codepen:before { + content: ""; +} + +.fa-jsfiddle:before { + content: ""; +} + +.fa-life-bouy:before, +.fa-life-buoy:before, +.fa-life-saver:before, +.fa-support:before, +.fa-life-ring:before { + content: ""; +} + +.fa-circle-o-notch:before { + content: ""; +} + +.fa-ra:before, +.fa-resistance:before, +.fa-rebel:before { + content: ""; +} + +.fa-ge:before, +.fa-empire:before { + content: ""; +} + +.fa-git-square:before { + content: ""; +} + +.fa-git:before { + content: ""; +} + +.fa-y-combinator-square:before, +.fa-yc-square:before, +.fa-hacker-news:before { + content: ""; +} + +.fa-tencent-weibo:before { + content: ""; +} + +.fa-qq:before { + content: ""; +} + +.fa-wechat:before, +.fa-weixin:before { + content: ""; +} + +.fa-send:before, +.fa-paper-plane:before { + content: ""; +} + +.fa-send-o:before, +.fa-paper-plane-o:before { + content: ""; +} + +.fa-history:before { + content: ""; +} + +.fa-circle-thin:before { + content: ""; +} + +.fa-header:before { + content: ""; +} + +.fa-paragraph:before { + content: ""; +} + +.fa-sliders:before { + content: ""; +} + +.fa-share-alt:before { + content: ""; +} + +.fa-share-alt-square:before { + content: ""; +} + +.fa-bomb:before { + content: ""; +} + +.fa-soccer-ball-o:before, +.fa-futbol-o:before { + content: ""; +} + +.fa-tty:before { + content: ""; +} + +.fa-binoculars:before { + content: ""; +} + +.fa-plug:before { + content: ""; +} + +.fa-slideshare:before { + content: ""; +} + +.fa-twitch:before { + content: ""; +} + +.fa-yelp:before { + content: ""; +} + +.fa-newspaper-o:before { + content: ""; +} + +.fa-wifi:before { + content: ""; +} + +.fa-calculator:before { + content: ""; +} + +.fa-paypal:before { + content: ""; +} + +.fa-google-wallet:before { + content: ""; +} + +.fa-cc-visa:before { + content: ""; +} + +.fa-cc-mastercard:before { + content: ""; +} + +.fa-cc-discover:before { + content: ""; +} + +.fa-cc-amex:before { + content: ""; +} + +.fa-cc-paypal:before { + content: ""; +} + +.fa-cc-stripe:before { + content: ""; +} + +.fa-bell-slash:before { + content: ""; +} + +.fa-bell-slash-o:before { + content: ""; +} + +.fa-trash:before { + content: ""; +} + +.fa-copyright:before { + content: ""; +} + +.fa-at:before { + content: ""; +} + +.fa-eyedropper:before { + content: ""; +} + +.fa-paint-brush:before { + content: ""; +} + +.fa-birthday-cake:before { + content: ""; +} + +.fa-area-chart:before { + content: ""; +} + +.fa-pie-chart:before { + content: ""; +} + +.fa-line-chart:before { + content: ""; +} + +.fa-lastfm:before { + content: ""; +} + +.fa-lastfm-square:before { + content: ""; +} + +.fa-toggle-off:before { + content: ""; +} + +.fa-toggle-on:before { + content: ""; +} + +.fa-bicycle:before { + content: ""; +} + +.fa-bus:before { + content: ""; +} + +.fa-ioxhost:before { + content: ""; +} + +.fa-angellist:before { + content: ""; +} + +.fa-cc:before { + content: ""; +} + +.fa-shekel:before, +.fa-sheqel:before, +.fa-ils:before { + content: ""; +} + +.fa-meanpath:before { + content: ""; +} + +.fa-buysellads:before { + content: ""; +} + +.fa-connectdevelop:before { + content: ""; +} + +.fa-dashcube:before { + content: ""; +} + +.fa-forumbee:before { + content: ""; +} + +.fa-leanpub:before { + content: ""; +} + +.fa-sellsy:before { + content: ""; +} + +.fa-shirtsinbulk:before { + content: ""; +} + +.fa-simplybuilt:before { + content: ""; +} + +.fa-skyatlas:before { + content: ""; +} + +.fa-cart-plus:before { + content: ""; +} + +.fa-cart-arrow-down:before { + content: ""; +} + +.fa-diamond:before { + content: ""; +} + +.fa-ship:before { + content: ""; +} + +.fa-user-secret:before { + content: ""; +} + +.fa-motorcycle:before { + content: ""; +} + +.fa-street-view:before { + content: ""; +} + +.fa-heartbeat:before { + content: ""; +} + +.fa-venus:before { + content: ""; +} + +.fa-mars:before { + content: ""; +} + +.fa-mercury:before { + content: ""; +} + +.fa-intersex:before, +.fa-transgender:before { + content: ""; +} + +.fa-transgender-alt:before { + content: ""; +} + +.fa-venus-double:before { + content: ""; +} + +.fa-mars-double:before { + content: ""; +} + +.fa-venus-mars:before { + content: ""; +} + +.fa-mars-stroke:before { + content: ""; +} + +.fa-mars-stroke-v:before { + content: ""; +} + +.fa-mars-stroke-h:before { + content: ""; +} + +.fa-neuter:before { + content: ""; +} + +.fa-genderless:before { + content: ""; +} + +.fa-facebook-official:before { + content: ""; +} + +.fa-pinterest-p:before { + content: ""; +} + +.fa-whatsapp:before { + content: ""; +} + +.fa-server:before { + content: ""; +} + +.fa-user-plus:before { + content: ""; +} + +.fa-user-times:before { + content: ""; +} + +.fa-hotel:before, +.fa-bed:before { + content: ""; +} + +.fa-viacoin:before { + content: ""; +} + +.fa-train:before { + content: ""; +} + +.fa-subway:before { + content: ""; +} + +.fa-medium:before { + content: ""; +} + +.fa-yc:before, +.fa-y-combinator:before { + content: ""; +} + +.fa-optin-monster:before { + content: ""; +} + +.fa-opencart:before { + content: ""; +} + +.fa-expeditedssl:before { + content: ""; +} + +.fa-battery-4:before, +.fa-battery:before, +.fa-battery-full:before { + content: ""; +} + +.fa-battery-3:before, +.fa-battery-three-quarters:before { + content: ""; +} + +.fa-battery-2:before, +.fa-battery-half:before { + content: ""; +} + +.fa-battery-1:before, +.fa-battery-quarter:before { + content: ""; +} + +.fa-battery-0:before, +.fa-battery-empty:before { + content: ""; +} + +.fa-mouse-pointer:before { + content: ""; +} + +.fa-i-cursor:before { + content: ""; +} + +.fa-object-group:before { + content: ""; +} + +.fa-object-ungroup:before { + content: ""; +} + +.fa-sticky-note:before { + content: ""; +} + +.fa-sticky-note-o:before { + content: ""; +} + +.fa-cc-jcb:before { + content: ""; +} + +.fa-cc-diners-club:before { + content: ""; +} + +.fa-clone:before { + content: ""; +} + +.fa-balance-scale:before { + content: ""; +} + +.fa-hourglass-o:before { + content: ""; +} + +.fa-hourglass-1:before, +.fa-hourglass-start:before { + content: ""; +} + +.fa-hourglass-2:before, +.fa-hourglass-half:before { + content: ""; +} + +.fa-hourglass-3:before, +.fa-hourglass-end:before { + content: ""; +} + +.fa-hourglass:before { + content: ""; +} + +.fa-hand-grab-o:before, +.fa-hand-rock-o:before { + content: ""; +} + +.fa-hand-stop-o:before, +.fa-hand-paper-o:before { + content: ""; +} + +.fa-hand-scissors-o:before { + content: ""; +} + +.fa-hand-lizard-o:before { + content: ""; +} + +.fa-hand-spock-o:before { + content: ""; +} + +.fa-hand-pointer-o:before { + content: ""; +} + +.fa-hand-peace-o:before { + content: ""; +} + +.fa-trademark:before { + content: ""; +} + +.fa-registered:before { + content: ""; +} + +.fa-creative-commons:before { + content: ""; +} + +.fa-gg:before { + content: ""; +} + +.fa-gg-circle:before { + content: ""; +} + +.fa-tripadvisor:before { + content: ""; +} + +.fa-odnoklassniki:before { + content: ""; +} + +.fa-odnoklassniki-square:before { + content: ""; +} + +.fa-get-pocket:before { + content: ""; +} + +.fa-wikipedia-w:before { + content: ""; +} + +.fa-safari:before { + content: ""; +} + +.fa-chrome:before { + content: ""; +} + +.fa-firefox:before { + content: ""; +} + +.fa-opera:before { + content: ""; +} + +.fa-internet-explorer:before { + content: ""; +} + +.fa-tv:before, +.fa-television:before { + content: ""; +} + +.fa-contao:before { + content: ""; +} + +.fa-500px:before { + content: ""; +} + +.fa-amazon:before { + content: ""; +} + +.fa-calendar-plus-o:before { + content: ""; +} + +.fa-calendar-minus-o:before { + content: ""; +} + +.fa-calendar-times-o:before { + content: ""; +} + +.fa-calendar-check-o:before { + content: ""; +} + +.fa-industry:before { + content: ""; +} + +.fa-map-pin:before { + content: ""; +} + +.fa-map-signs:before { + content: ""; +} + +.fa-map-o:before { + content: ""; +} + +.fa-map:before { + content: ""; +} + +.fa-commenting:before { + content: ""; +} + +.fa-commenting-o:before { + content: ""; +} + +.fa-houzz:before { + content: ""; +} + +.fa-vimeo:before { + content: ""; +} + +.fa-black-tie:before { + content: ""; +} + +.fa-fonticons:before { + content: ""; +} + +.fa-reddit-alien:before { + content: ""; +} + +.fa-edge:before { + content: ""; +} + +.fa-credit-card-alt:before { + content: ""; +} + +.fa-codiepie:before { + content: ""; +} + +.fa-modx:before { + content: ""; +} + +.fa-fort-awesome:before { + content: ""; +} + +.fa-usb:before { + content: ""; +} + +.fa-product-hunt:before { + content: ""; +} + +.fa-mixcloud:before { + content: ""; +} + +.fa-scribd:before { + content: ""; +} + +.fa-pause-circle:before { + content: ""; +} + +.fa-pause-circle-o:before { + content: ""; +} + +.fa-stop-circle:before { + content: ""; +} + +.fa-stop-circle-o:before { + content: ""; +} + +.fa-shopping-bag:before { + content: ""; +} + +.fa-shopping-basket:before { + content: ""; +} + +.fa-hashtag:before { + content: ""; +} + +.fa-bluetooth:before { + content: ""; +} + +.fa-bluetooth-b:before { + content: ""; +} + +.fa-percent:before { + content: ""; +} + +.fa-gitlab:before, .icon-gitlab:before { + content: ""; +} + +.fa-wpbeginner:before { + content: ""; +} + +.fa-wpforms:before { + content: ""; +} + +.fa-envira:before { + content: ""; +} + +.fa-universal-access:before { + content: ""; +} + +.fa-wheelchair-alt:before { + content: ""; +} + +.fa-question-circle-o:before { + content: ""; +} + +.fa-blind:before { + content: ""; +} + +.fa-audio-description:before { + content: ""; +} + +.fa-volume-control-phone:before { + content: ""; +} + +.fa-braille:before { + content: ""; +} + +.fa-assistive-listening-systems:before { + content: ""; +} + +.fa-asl-interpreting:before, +.fa-american-sign-language-interpreting:before { + content: ""; +} + +.fa-deafness:before, +.fa-hard-of-hearing:before, +.fa-deaf:before { + content: ""; +} + +.fa-glide:before { + content: ""; +} + +.fa-glide-g:before { + content: ""; +} + +.fa-signing:before, +.fa-sign-language:before { + content: ""; +} + +.fa-low-vision:before { + content: ""; +} + +.fa-viadeo:before { + content: ""; +} + +.fa-viadeo-square:before { + content: ""; +} + +.fa-snapchat:before { + content: ""; +} + +.fa-snapchat-ghost:before { + content: ""; +} + +.fa-snapchat-square:before { + content: ""; +} + +.fa-pied-piper:before { + content: ""; +} + +.fa-first-order:before { + content: ""; +} + +.fa-yoast:before { + content: ""; +} + +.fa-themeisle:before { + content: ""; +} + +.fa-google-plus-circle:before, +.fa-google-plus-official:before { + content: ""; +} + +.fa-fa:before, +.fa-font-awesome:before { + content: ""; +} + +.fa-handshake-o:before { + content: ""; +} + +.fa-envelope-open:before { + content: ""; +} + +.fa-envelope-open-o:before { + content: ""; +} + +.fa-linode:before { + content: ""; +} + +.fa-address-book:before { + content: ""; +} + +.fa-address-book-o:before { + content: ""; +} + +.fa-vcard:before, +.fa-address-card:before { + content: ""; +} + +.fa-vcard-o:before, +.fa-address-card-o:before { + content: ""; +} + +.fa-user-circle:before { + content: ""; +} + +.fa-user-circle-o:before { + content: ""; +} + +.fa-user-o:before { + content: ""; +} + +.fa-id-badge:before { + content: ""; +} + +.fa-drivers-license:before, +.fa-id-card:before { + content: ""; +} + +.fa-drivers-license-o:before, +.fa-id-card-o:before { + content: ""; +} + +.fa-quora:before { + content: ""; +} + +.fa-free-code-camp:before { + content: ""; +} + +.fa-telegram:before { + content: ""; +} + +.fa-thermometer-4:before, +.fa-thermometer:before, +.fa-thermometer-full:before { + content: ""; +} + +.fa-thermometer-3:before, +.fa-thermometer-three-quarters:before { + content: ""; +} + +.fa-thermometer-2:before, +.fa-thermometer-half:before { + content: ""; +} + +.fa-thermometer-1:before, +.fa-thermometer-quarter:before { + content: ""; +} + +.fa-thermometer-0:before, +.fa-thermometer-empty:before { + content: ""; +} + +.fa-shower:before { + content: ""; +} + +.fa-bathtub:before, +.fa-s15:before, +.fa-bath:before { + content: ""; +} + +.fa-podcast:before { + content: ""; +} + +.fa-window-maximize:before { + content: ""; +} + +.fa-window-minimize:before { + content: ""; +} + +.fa-window-restore:before { + content: ""; +} + +.fa-times-rectangle:before, +.fa-window-close:before { + content: ""; +} + +.fa-times-rectangle-o:before, +.fa-window-close-o:before { + content: ""; +} + +.fa-bandcamp:before { + content: ""; +} + +.fa-grav:before { + content: ""; +} + +.fa-etsy:before { + content: ""; +} + +.fa-imdb:before { + content: ""; +} + +.fa-ravelry:before { + content: ""; +} + +.fa-eercast:before { + content: ""; +} + +.fa-microchip:before { + content: ""; +} + +.fa-snowflake-o:before { + content: ""; +} + +.fa-superpowers:before { + content: ""; +} + +.fa-wpexplorer:before { + content: ""; +} + +.fa-meetup:before { + content: ""; +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} + +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} + +.fa, .wy-menu-vertical li span.toctree-expand, .wy-menu-vertical li.on a span.toctree-expand, .wy-menu-vertical li.current > a span.toctree-expand, .rst-content .admonition-title, .rst-content h1 .headerlink, .rst-content h2 .headerlink, .rst-content h3 .headerlink, .rst-content h4 .headerlink, .rst-content h5 .headerlink, .rst-content h6 .headerlink, .rst-content dl dt .headerlink, .rst-content p.caption .headerlink, .rst-content tt.download span:first-child, .rst-content code.download span:first-child, .icon, .wy-dropdown .caret, .wy-inline-validate.wy-inline-validate-success .wy-input-context, .wy-inline-validate.wy-inline-validate-danger .wy-input-context, .wy-inline-validate.wy-inline-validate-warning .wy-input-context, .wy-inline-validate.wy-inline-validate-info .wy-input-context { + font-family: inherit; +} +.fa:before, .wy-menu-vertical li span.toctree-expand:before, .wy-menu-vertical li.on a span.toctree-expand:before, .wy-menu-vertical li.current > a span.toctree-expand:before, .rst-content .admonition-title:before, .rst-content h1 .headerlink:before, .rst-content h2 .headerlink:before, .rst-content h3 .headerlink:before, .rst-content h4 .headerlink:before, .rst-content h5 .headerlink:before, .rst-content h6 .headerlink:before, .rst-content dl dt .headerlink:before, .rst-content p.caption .headerlink:before, .rst-content tt.download span:first-child:before, .rst-content code.download span:first-child:before, .icon:before, .wy-dropdown .caret:before, .wy-inline-validate.wy-inline-validate-success .wy-input-context:before, .wy-inline-validate.wy-inline-validate-danger .wy-input-context:before, .wy-inline-validate.wy-inline-validate-warning .wy-input-context:before, .wy-inline-validate.wy-inline-validate-info .wy-input-context:before { + font-family: "FontAwesome"; + display: inline-block; + font-style: normal; + font-weight: normal; + line-height: 1; + text-decoration: inherit; +} + +a .fa, a .wy-menu-vertical li span.toctree-expand, .wy-menu-vertical li a span.toctree-expand, .wy-menu-vertical li.on a span.toctree-expand, .wy-menu-vertical li.current > a span.toctree-expand, a .rst-content .admonition-title, .rst-content a .admonition-title, a .rst-content h1 .headerlink, .rst-content h1 a .headerlink, a .rst-content h2 .headerlink, .rst-content h2 a .headerlink, a .rst-content h3 .headerlink, .rst-content h3 a .headerlink, a .rst-content h4 .headerlink, .rst-content h4 a .headerlink, a .rst-content h5 .headerlink, .rst-content h5 a .headerlink, a .rst-content h6 .headerlink, .rst-content h6 a .headerlink, a .rst-content dl dt .headerlink, .rst-content dl dt a .headerlink, a .rst-content p.caption .headerlink, .rst-content p.caption a .headerlink, a .rst-content tt.download span:first-child, .rst-content tt.download a span:first-child, a .rst-content code.download span:first-child, .rst-content code.download a span:first-child, a .icon { + display: inline-block; + text-decoration: inherit; +} + +.btn .fa, .btn .wy-menu-vertical li span.toctree-expand, .wy-menu-vertical li .btn span.toctree-expand, .btn .wy-menu-vertical li.on a span.toctree-expand, .wy-menu-vertical li.on a .btn span.toctree-expand, .btn .wy-menu-vertical li.current > a span.toctree-expand, .wy-menu-vertical li.current > a .btn span.toctree-expand, .btn .rst-content .admonition-title, .rst-content .btn .admonition-title, .btn .rst-content h1 .headerlink, .rst-content h1 .btn .headerlink, .btn .rst-content h2 .headerlink, .rst-content h2 .btn .headerlink, .btn .rst-content h3 .headerlink, .rst-content h3 .btn .headerlink, .btn .rst-content h4 .headerlink, .rst-content h4 .btn .headerlink, .btn .rst-content h5 .headerlink, .rst-content h5 .btn .headerlink, .btn .rst-content h6 .headerlink, .rst-content h6 .btn .headerlink, .btn .rst-content dl dt .headerlink, .rst-content dl dt .btn .headerlink, .btn .rst-content p.caption .headerlink, .rst-content p.caption .btn .headerlink, .btn .rst-content tt.download span:first-child, .rst-content tt.download .btn span:first-child, .btn .rst-content code.download span:first-child, .rst-content code.download .btn span:first-child, .btn .icon, .nav .fa, .nav .wy-menu-vertical li span.toctree-expand, .wy-menu-vertical li .nav span.toctree-expand, .nav .wy-menu-vertical li.on a span.toctree-expand, .wy-menu-vertical li.on a .nav span.toctree-expand, .nav .wy-menu-vertical li.current > a span.toctree-expand, .wy-menu-vertical li.current > a .nav span.toctree-expand, .nav .rst-content .admonition-title, .rst-content .nav .admonition-title, .nav .rst-content h1 .headerlink, .rst-content h1 .nav .headerlink, .nav .rst-content h2 .headerlink, .rst-content h2 .nav .headerlink, .nav .rst-content h3 .headerlink, .rst-content h3 .nav .headerlink, .nav .rst-content h4 .headerlink, .rst-content h4 .nav .headerlink, .nav .rst-content h5 .headerlink, .rst-content h5 .nav .headerlink, .nav .rst-content h6 .headerlink, .rst-content h6 .nav .headerlink, .nav .rst-content dl dt .headerlink, .rst-content dl dt .nav .headerlink, .nav .rst-content p.caption .headerlink, .rst-content p.caption .nav .headerlink, .nav .rst-content tt.download span:first-child, .rst-content tt.download .nav span:first-child, .nav .rst-content code.download span:first-child, .rst-content code.download .nav span:first-child, .nav .icon { + display: inline; +} +.btn .fa.fa-large, .btn .wy-menu-vertical li span.fa-large.toctree-expand, .wy-menu-vertical li .btn span.fa-large.toctree-expand, .btn .rst-content .fa-large.admonition-title, .rst-content .btn .fa-large.admonition-title, .btn .rst-content h1 .fa-large.headerlink, .rst-content h1 .btn .fa-large.headerlink, .btn .rst-content h2 .fa-large.headerlink, .rst-content h2 .btn .fa-large.headerlink, .btn .rst-content h3 .fa-large.headerlink, .rst-content h3 .btn .fa-large.headerlink, .btn .rst-content h4 .fa-large.headerlink, .rst-content h4 .btn .fa-large.headerlink, .btn .rst-content h5 .fa-large.headerlink, .rst-content h5 .btn .fa-large.headerlink, .btn .rst-content h6 .fa-large.headerlink, .rst-content h6 .btn .fa-large.headerlink, .btn .rst-content dl dt .fa-large.headerlink, .rst-content dl dt .btn .fa-large.headerlink, .btn .rst-content p.caption .fa-large.headerlink, .rst-content p.caption .btn .fa-large.headerlink, .btn .rst-content tt.download span.fa-large:first-child, .rst-content tt.download .btn span.fa-large:first-child, .btn .rst-content code.download span.fa-large:first-child, .rst-content code.download .btn span.fa-large:first-child, .btn .fa-large.icon, .nav .fa.fa-large, .nav .wy-menu-vertical li span.fa-large.toctree-expand, .wy-menu-vertical li .nav span.fa-large.toctree-expand, .nav .rst-content .fa-large.admonition-title, .rst-content .nav .fa-large.admonition-title, .nav .rst-content h1 .fa-large.headerlink, .rst-content h1 .nav .fa-large.headerlink, .nav .rst-content h2 .fa-large.headerlink, .rst-content h2 .nav .fa-large.headerlink, .nav .rst-content h3 .fa-large.headerlink, .rst-content h3 .nav .fa-large.headerlink, .nav .rst-content h4 .fa-large.headerlink, .rst-content h4 .nav .fa-large.headerlink, .nav .rst-content h5 .fa-large.headerlink, .rst-content h5 .nav .fa-large.headerlink, .nav .rst-content h6 .fa-large.headerlink, .rst-content h6 .nav .fa-large.headerlink, .nav .rst-content dl dt .fa-large.headerlink, .rst-content dl dt .nav .fa-large.headerlink, .nav .rst-content p.caption .fa-large.headerlink, .rst-content p.caption .nav .fa-large.headerlink, .nav .rst-content tt.download span.fa-large:first-child, .rst-content tt.download .nav span.fa-large:first-child, .nav .rst-content code.download span.fa-large:first-child, .rst-content code.download .nav span.fa-large:first-child, .nav .fa-large.icon { + line-height: 0.9em; +} +.btn .fa.fa-spin, .btn .wy-menu-vertical li span.fa-spin.toctree-expand, .wy-menu-vertical li .btn span.fa-spin.toctree-expand, .btn .rst-content .fa-spin.admonition-title, .rst-content .btn .fa-spin.admonition-title, .btn .rst-content h1 .fa-spin.headerlink, .rst-content h1 .btn .fa-spin.headerlink, .btn .rst-content h2 .fa-spin.headerlink, .rst-content h2 .btn .fa-spin.headerlink, .btn .rst-content h3 .fa-spin.headerlink, .rst-content h3 .btn .fa-spin.headerlink, .btn .rst-content h4 .fa-spin.headerlink, .rst-content h4 .btn .fa-spin.headerlink, .btn .rst-content h5 .fa-spin.headerlink, .rst-content h5 .btn .fa-spin.headerlink, .btn .rst-content h6 .fa-spin.headerlink, .rst-content h6 .btn .fa-spin.headerlink, .btn .rst-content dl dt .fa-spin.headerlink, .rst-content dl dt .btn .fa-spin.headerlink, .btn .rst-content p.caption .fa-spin.headerlink, .rst-content p.caption .btn .fa-spin.headerlink, .btn .rst-content tt.download span.fa-spin:first-child, .rst-content tt.download .btn span.fa-spin:first-child, .btn .rst-content code.download span.fa-spin:first-child, .rst-content code.download .btn span.fa-spin:first-child, .btn .fa-spin.icon, .nav .fa.fa-spin, .nav .wy-menu-vertical li span.fa-spin.toctree-expand, .wy-menu-vertical li .nav span.fa-spin.toctree-expand, .nav .rst-content .fa-spin.admonition-title, .rst-content .nav .fa-spin.admonition-title, .nav .rst-content h1 .fa-spin.headerlink, .rst-content h1 .nav .fa-spin.headerlink, .nav .rst-content h2 .fa-spin.headerlink, .rst-content h2 .nav .fa-spin.headerlink, .nav .rst-content h3 .fa-spin.headerlink, .rst-content h3 .nav .fa-spin.headerlink, .nav .rst-content h4 .fa-spin.headerlink, .rst-content h4 .nav .fa-spin.headerlink, .nav .rst-content h5 .fa-spin.headerlink, .rst-content h5 .nav .fa-spin.headerlink, .nav .rst-content h6 .fa-spin.headerlink, .rst-content h6 .nav .fa-spin.headerlink, .nav .rst-content dl dt .fa-spin.headerlink, .rst-content dl dt .nav .fa-spin.headerlink, .nav .rst-content p.caption .fa-spin.headerlink, .rst-content p.caption .nav .fa-spin.headerlink, .nav .rst-content tt.download span.fa-spin:first-child, .rst-content tt.download .nav span.fa-spin:first-child, .nav .rst-content code.download span.fa-spin:first-child, .rst-content code.download .nav span.fa-spin:first-child, .nav .fa-spin.icon { + display: inline-block; +} + +.btn.fa:before, .wy-menu-vertical li span.btn.toctree-expand:before, .rst-content .btn.admonition-title:before, .rst-content h1 .btn.headerlink:before, .rst-content h2 .btn.headerlink:before, .rst-content h3 .btn.headerlink:before, .rst-content h4 .btn.headerlink:before, .rst-content h5 .btn.headerlink:before, .rst-content h6 .btn.headerlink:before, .rst-content dl dt .btn.headerlink:before, .rst-content p.caption .btn.headerlink:before, .rst-content tt.download span.btn:first-child:before, .rst-content code.download span.btn:first-child:before, .btn.icon:before { + opacity: 0.5; + -webkit-transition: opacity 0.05s ease-in; + -moz-transition: opacity 0.05s ease-in; + transition: opacity 0.05s ease-in; +} + +.btn.fa:hover:before, .wy-menu-vertical li span.btn.toctree-expand:hover:before, .rst-content .btn.admonition-title:hover:before, .rst-content h1 .btn.headerlink:hover:before, .rst-content h2 .btn.headerlink:hover:before, .rst-content h3 .btn.headerlink:hover:before, .rst-content h4 .btn.headerlink:hover:before, .rst-content h5 .btn.headerlink:hover:before, .rst-content h6 .btn.headerlink:hover:before, .rst-content dl dt .btn.headerlink:hover:before, .rst-content p.caption .btn.headerlink:hover:before, .rst-content tt.download span.btn:first-child:hover:before, .rst-content code.download span.btn:first-child:hover:before, .btn.icon:hover:before { + opacity: 1; +} + +.btn-mini .fa:before, .btn-mini .wy-menu-vertical li span.toctree-expand:before, .wy-menu-vertical li .btn-mini span.toctree-expand:before, .btn-mini .rst-content .admonition-title:before, .rst-content .btn-mini .admonition-title:before, .btn-mini .rst-content h1 .headerlink:before, .rst-content h1 .btn-mini .headerlink:before, .btn-mini .rst-content h2 .headerlink:before, .rst-content h2 .btn-mini .headerlink:before, .btn-mini .rst-content h3 .headerlink:before, .rst-content h3 .btn-mini .headerlink:before, .btn-mini .rst-content h4 .headerlink:before, .rst-content h4 .btn-mini .headerlink:before, .btn-mini .rst-content h5 .headerlink:before, .rst-content h5 .btn-mini .headerlink:before, .btn-mini .rst-content h6 .headerlink:before, .rst-content h6 .btn-mini .headerlink:before, .btn-mini .rst-content dl dt .headerlink:before, .rst-content dl dt .btn-mini .headerlink:before, .btn-mini .rst-content p.caption .headerlink:before, .rst-content p.caption .btn-mini .headerlink:before, .btn-mini .rst-content tt.download span:first-child:before, .rst-content tt.download .btn-mini span:first-child:before, .btn-mini .rst-content code.download span:first-child:before, .rst-content code.download .btn-mini span:first-child:before, .btn-mini .icon:before { + font-size: 14px; + vertical-align: -15%; +} + +.wy-alert, .rst-content .note, .rst-content .attention, .rst-content .caution, .rst-content .danger, .rst-content .error, .rst-content .hint, .rst-content .important, .rst-content .tip, .rst-content .warning, .rst-content .seealso, .rst-content .admonition-todo, .rst-content .admonition { + padding: 12px; + line-height: 24px; + margin-bottom: 24px; + background: #e7f2fa; +} + +.wy-alert-title, .rst-content .admonition-title { + color: #fff; + font-weight: bold; + display: block; + color: #fff; + background: #6ab0de; + margin: -12px; + padding: 6px 12px; + margin-bottom: 12px; +} + +.wy-alert.wy-alert-danger, .rst-content .wy-alert-danger.note, .rst-content .wy-alert-danger.attention, .rst-content .wy-alert-danger.caution, .rst-content .danger, .rst-content .error, .rst-content .wy-alert-danger.hint, .rst-content .wy-alert-danger.important, .rst-content .wy-alert-danger.tip, .rst-content .wy-alert-danger.warning, .rst-content .wy-alert-danger.seealso, .rst-content .wy-alert-danger.admonition-todo, .rst-content .wy-alert-danger.admonition { + background: #fdf3f2; +} +.wy-alert.wy-alert-danger .wy-alert-title, .rst-content .wy-alert-danger.note .wy-alert-title, .rst-content .wy-alert-danger.attention .wy-alert-title, .rst-content .wy-alert-danger.caution .wy-alert-title, .rst-content .danger .wy-alert-title, .rst-content .error .wy-alert-title, .rst-content .wy-alert-danger.hint .wy-alert-title, .rst-content .wy-alert-danger.important .wy-alert-title, .rst-content .wy-alert-danger.tip .wy-alert-title, .rst-content .wy-alert-danger.warning .wy-alert-title, .rst-content .wy-alert-danger.seealso .wy-alert-title, .rst-content .wy-alert-danger.admonition-todo .wy-alert-title, .rst-content .wy-alert-danger.admonition .wy-alert-title, .wy-alert.wy-alert-danger .rst-content .admonition-title, .rst-content .wy-alert.wy-alert-danger .admonition-title, .rst-content .wy-alert-danger.note .admonition-title, .rst-content .wy-alert-danger.attention .admonition-title, .rst-content .wy-alert-danger.caution .admonition-title, .rst-content .danger .admonition-title, .rst-content .error .admonition-title, .rst-content .wy-alert-danger.hint .admonition-title, .rst-content .wy-alert-danger.important .admonition-title, .rst-content .wy-alert-danger.tip .admonition-title, .rst-content .wy-alert-danger.warning .admonition-title, .rst-content .wy-alert-danger.seealso .admonition-title, .rst-content .wy-alert-danger.admonition-todo .admonition-title, .rst-content .wy-alert-danger.admonition .admonition-title { + background: #f29f97; +} + +.wy-alert.wy-alert-warning, .rst-content .wy-alert-warning.note, .rst-content .attention, .rst-content .caution, .rst-content .wy-alert-warning.danger, .rst-content .wy-alert-warning.error, .rst-content .wy-alert-warning.hint, .rst-content .wy-alert-warning.important, .rst-content .wy-alert-warning.tip, .rst-content .warning, .rst-content .wy-alert-warning.seealso, .rst-content .admonition-todo, .rst-content .wy-alert-warning.admonition { + background: #ffedcc; +} +.wy-alert.wy-alert-warning .wy-alert-title, .rst-content .wy-alert-warning.note .wy-alert-title, .rst-content .attention .wy-alert-title, .rst-content .caution .wy-alert-title, .rst-content .wy-alert-warning.danger .wy-alert-title, .rst-content .wy-alert-warning.error .wy-alert-title, .rst-content .wy-alert-warning.hint .wy-alert-title, .rst-content .wy-alert-warning.important .wy-alert-title, .rst-content .wy-alert-warning.tip .wy-alert-title, .rst-content .warning .wy-alert-title, .rst-content .wy-alert-warning.seealso .wy-alert-title, .rst-content .admonition-todo .wy-alert-title, .rst-content .wy-alert-warning.admonition .wy-alert-title, .wy-alert.wy-alert-warning .rst-content .admonition-title, .rst-content .wy-alert.wy-alert-warning .admonition-title, .rst-content .wy-alert-warning.note .admonition-title, .rst-content .attention .admonition-title, .rst-content .caution .admonition-title, .rst-content .wy-alert-warning.danger .admonition-title, .rst-content .wy-alert-warning.error .admonition-title, .rst-content .wy-alert-warning.hint .admonition-title, .rst-content .wy-alert-warning.important .admonition-title, .rst-content .wy-alert-warning.tip .admonition-title, .rst-content .warning .admonition-title, .rst-content .wy-alert-warning.seealso .admonition-title, .rst-content .admonition-todo .admonition-title, .rst-content .wy-alert-warning.admonition .admonition-title { + background: #f0b37e; +} + +.wy-alert.wy-alert-info, .rst-content .note, .rst-content .wy-alert-info.attention, .rst-content .wy-alert-info.caution, .rst-content .wy-alert-info.danger, .rst-content .wy-alert-info.error, .rst-content .wy-alert-info.hint, .rst-content .wy-alert-info.important, .rst-content .wy-alert-info.tip, .rst-content .wy-alert-info.warning, .rst-content .seealso, .rst-content .wy-alert-info.admonition-todo, .rst-content .wy-alert-info.admonition { + background: #e7f2fa; +} +.wy-alert.wy-alert-info .wy-alert-title, .rst-content .note .wy-alert-title, .rst-content .wy-alert-info.attention .wy-alert-title, .rst-content .wy-alert-info.caution .wy-alert-title, .rst-content .wy-alert-info.danger .wy-alert-title, .rst-content .wy-alert-info.error .wy-alert-title, .rst-content .wy-alert-info.hint .wy-alert-title, .rst-content .wy-alert-info.important .wy-alert-title, .rst-content .wy-alert-info.tip .wy-alert-title, .rst-content .wy-alert-info.warning .wy-alert-title, .rst-content .seealso .wy-alert-title, .rst-content .wy-alert-info.admonition-todo .wy-alert-title, .rst-content .wy-alert-info.admonition .wy-alert-title, .wy-alert.wy-alert-info .rst-content .admonition-title, .rst-content .wy-alert.wy-alert-info .admonition-title, .rst-content .note .admonition-title, .rst-content .wy-alert-info.attention .admonition-title, .rst-content .wy-alert-info.caution .admonition-title, .rst-content .wy-alert-info.danger .admonition-title, .rst-content .wy-alert-info.error .admonition-title, .rst-content .wy-alert-info.hint .admonition-title, .rst-content .wy-alert-info.important .admonition-title, .rst-content .wy-alert-info.tip .admonition-title, .rst-content .wy-alert-info.warning .admonition-title, .rst-content .seealso .admonition-title, .rst-content .wy-alert-info.admonition-todo .admonition-title, .rst-content .wy-alert-info.admonition .admonition-title { + background: #6ab0de; +} + +.wy-alert.wy-alert-success, .rst-content .wy-alert-success.note, .rst-content .wy-alert-success.attention, .rst-content .wy-alert-success.caution, .rst-content .wy-alert-success.danger, .rst-content .wy-alert-success.error, .rst-content .hint, .rst-content .important, .rst-content .tip, .rst-content .wy-alert-success.warning, .rst-content .wy-alert-success.seealso, .rst-content .wy-alert-success.admonition-todo, .rst-content .wy-alert-success.admonition { + background: #dbfaf4; +} +.wy-alert.wy-alert-success .wy-alert-title, .rst-content .wy-alert-success.note .wy-alert-title, .rst-content .wy-alert-success.attention .wy-alert-title, .rst-content .wy-alert-success.caution .wy-alert-title, .rst-content .wy-alert-success.danger .wy-alert-title, .rst-content .wy-alert-success.error .wy-alert-title, .rst-content .hint .wy-alert-title, .rst-content .important .wy-alert-title, .rst-content .tip .wy-alert-title, .rst-content .wy-alert-success.warning .wy-alert-title, .rst-content .wy-alert-success.seealso .wy-alert-title, .rst-content .wy-alert-success.admonition-todo .wy-alert-title, .rst-content .wy-alert-success.admonition .wy-alert-title, .wy-alert.wy-alert-success .rst-content .admonition-title, .rst-content .wy-alert.wy-alert-success .admonition-title, .rst-content .wy-alert-success.note .admonition-title, .rst-content .wy-alert-success.attention .admonition-title, .rst-content .wy-alert-success.caution .admonition-title, .rst-content .wy-alert-success.danger .admonition-title, .rst-content .wy-alert-success.error .admonition-title, .rst-content .hint .admonition-title, .rst-content .important .admonition-title, .rst-content .tip .admonition-title, .rst-content .wy-alert-success.warning .admonition-title, .rst-content .wy-alert-success.seealso .admonition-title, .rst-content .wy-alert-success.admonition-todo .admonition-title, .rst-content .wy-alert-success.admonition .admonition-title { + background: #1abc9c; +} + +.wy-alert.wy-alert-neutral, .rst-content .wy-alert-neutral.note, .rst-content .wy-alert-neutral.attention, .rst-content .wy-alert-neutral.caution, .rst-content .wy-alert-neutral.danger, .rst-content .wy-alert-neutral.error, .rst-content .wy-alert-neutral.hint, .rst-content .wy-alert-neutral.important, .rst-content .wy-alert-neutral.tip, .rst-content .wy-alert-neutral.warning, .rst-content .wy-alert-neutral.seealso, .rst-content .wy-alert-neutral.admonition-todo, .rst-content .wy-alert-neutral.admonition { + background: #f3f6f6; +} +.wy-alert.wy-alert-neutral .wy-alert-title, .rst-content .wy-alert-neutral.note .wy-alert-title, .rst-content .wy-alert-neutral.attention .wy-alert-title, .rst-content .wy-alert-neutral.caution .wy-alert-title, .rst-content .wy-alert-neutral.danger .wy-alert-title, .rst-content .wy-alert-neutral.error .wy-alert-title, .rst-content .wy-alert-neutral.hint .wy-alert-title, .rst-content .wy-alert-neutral.important .wy-alert-title, .rst-content .wy-alert-neutral.tip .wy-alert-title, .rst-content .wy-alert-neutral.warning .wy-alert-title, .rst-content .wy-alert-neutral.seealso .wy-alert-title, .rst-content .wy-alert-neutral.admonition-todo .wy-alert-title, .rst-content .wy-alert-neutral.admonition .wy-alert-title, .wy-alert.wy-alert-neutral .rst-content .admonition-title, .rst-content .wy-alert.wy-alert-neutral .admonition-title, .rst-content .wy-alert-neutral.note .admonition-title, .rst-content .wy-alert-neutral.attention .admonition-title, .rst-content .wy-alert-neutral.caution .admonition-title, .rst-content .wy-alert-neutral.danger .admonition-title, .rst-content .wy-alert-neutral.error .admonition-title, .rst-content .wy-alert-neutral.hint .admonition-title, .rst-content .wy-alert-neutral.important .admonition-title, .rst-content .wy-alert-neutral.tip .admonition-title, .rst-content .wy-alert-neutral.warning .admonition-title, .rst-content .wy-alert-neutral.seealso .admonition-title, .rst-content .wy-alert-neutral.admonition-todo .admonition-title, .rst-content .wy-alert-neutral.admonition .admonition-title { + color: #404040; + background: #e1e4e5; +} +.wy-alert.wy-alert-neutral a, .rst-content .wy-alert-neutral.note a, .rst-content .wy-alert-neutral.attention a, .rst-content .wy-alert-neutral.caution a, .rst-content .wy-alert-neutral.danger a, .rst-content .wy-alert-neutral.error a, .rst-content .wy-alert-neutral.hint a, .rst-content .wy-alert-neutral.important a, .rst-content .wy-alert-neutral.tip a, .rst-content .wy-alert-neutral.warning a, .rst-content .wy-alert-neutral.seealso a, .rst-content .wy-alert-neutral.admonition-todo a, .rst-content .wy-alert-neutral.admonition a { + color: #2980B9; +} + +.wy-alert p:last-child, .rst-content .note p:last-child, .rst-content .attention p:last-child, .rst-content .caution p:last-child, .rst-content .danger p:last-child, .rst-content .error p:last-child, .rst-content .hint p:last-child, .rst-content .important p:last-child, .rst-content .tip p:last-child, .rst-content .warning p:last-child, .rst-content .seealso p:last-child, .rst-content .admonition-todo p:last-child, .rst-content .admonition p:last-child { + margin-bottom: 0; +} + +.wy-tray-container { + position: fixed; + bottom: 0px; + left: 0; + z-index: 600; +} +.wy-tray-container li { + display: block; + width: 300px; + background: transparent; + color: #fff; + text-align: center; + box-shadow: 0 5px 5px 0 rgba(0, 0, 0, 0.1); + padding: 0 24px; + min-width: 20%; + opacity: 0; + height: 0; + line-height: 56px; + overflow: hidden; + -webkit-transition: all 0.3s ease-in; + -moz-transition: all 0.3s ease-in; + transition: all 0.3s ease-in; +} +.wy-tray-container li.wy-tray-item-success { + background: #27AE60; +} +.wy-tray-container li.wy-tray-item-info { + background: #2980B9; +} +.wy-tray-container li.wy-tray-item-warning { + background: #E67E22; +} +.wy-tray-container li.wy-tray-item-danger { + background: #E74C3C; +} +.wy-tray-container li.on { + opacity: 1; + height: 56px; +} + +@media screen and (max-width: 768px) { + .wy-tray-container { + bottom: auto; + top: 0; + width: 100%; + } + .wy-tray-container li { + width: 100%; + } +} +button { + font-size: 100%; + margin: 0; + vertical-align: baseline; + *vertical-align: middle; + cursor: pointer; + line-height: normal; + -webkit-appearance: button; + *overflow: visible; +} + +button::-moz-focus-inner, input::-moz-focus-inner { + border: 0; + padding: 0; +} + +button[disabled] { + cursor: default; +} + +.btn { + /* Structure */ + display: inline-block; + border-radius: 2px; + line-height: normal; + white-space: nowrap; + text-align: center; + cursor: pointer; + font-size: 100%; + padding: 6px 12px 8px 12px; + color: #fff; + border: 1px solid rgba(0, 0, 0, 0.1); + background-color: #27AE60; + text-decoration: none; + font-weight: normal; + font-family: "Lato", "proxima-nova", "Helvetica Neue", Arial, sans-serif; + box-shadow: 0px 1px 2px -1px rgba(255, 255, 255, 0.5) inset, 0px -2px 0px 0px rgba(0, 0, 0, 0.1) inset; + outline-none: false; + vertical-align: middle; + *display: inline; + zoom: 1; + -webkit-user-drag: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-transition: all 0.1s linear; + -moz-transition: all 0.1s linear; + transition: all 0.1s linear; +} + +.btn-hover { + background: #2e8ece; + color: #fff; +} + +.btn:hover { + background: #2cc36b; + color: #fff; +} +.btn:focus { + background: #2cc36b; + outline: 0; +} +.btn:active { + box-shadow: 0px -1px 0px 0px rgba(0, 0, 0, 0.05) inset, 0px 2px 0px 0px rgba(0, 0, 0, 0.1) inset; + padding: 8px 12px 6px 12px; +} +.btn:visited { + color: #fff; +} +.btn:disabled { + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + filter: alpha(opacity=40); + opacity: 0.4; + cursor: not-allowed; + box-shadow: none; +} + +.btn-disabled { + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + filter: alpha(opacity=40); + opacity: 0.4; + cursor: not-allowed; + box-shadow: none; +} +.btn-disabled:hover, .btn-disabled:focus, .btn-disabled:active { + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + filter: alpha(opacity=40); + opacity: 0.4; + cursor: not-allowed; + box-shadow: none; +} + +.btn::-moz-focus-inner { + padding: 0; + border: 0; +} + +.btn-small { + font-size: 80%; +} + +.btn-info { + background-color: #2980B9 !important; +} +.btn-info:hover { + background-color: #2e8ece !important; +} + +.btn-neutral { + background-color: #f3f6f6 !important; + color: #404040 !important; +} +.btn-neutral:hover { + background-color: #e5ebeb !important; + color: #404040; +} +.btn-neutral:visited { + color: #404040 !important; +} + +.btn-success { + background-color: #27AE60 !important; +} +.btn-success:hover { + background-color: #229955 !important; +} + +.btn-danger { + background-color: #E74C3C !important; +} +.btn-danger:hover { + background-color: #ea6153 !important; +} + +.btn-warning { + background-color: #E67E22 !important; +} +.btn-warning:hover { + background-color: #e98b39 !important; +} + +.btn-invert { + background-color: #222; +} +.btn-invert:hover { + background-color: #2f2f2f !important; +} + +.btn-link { + background-color: transparent !important; + color: #2980B9; + box-shadow: none; + border-color: transparent !important; +} +.btn-link:hover { + background-color: transparent !important; + color: #409ad5 !important; + box-shadow: none; +} +.btn-link:active { + background-color: transparent !important; + color: #409ad5 !important; + box-shadow: none; +} +.btn-link:visited { + color: #9B59B6; +} + +.wy-btn-group .btn, .wy-control .btn { + vertical-align: middle; +} + +.wy-btn-group { + margin-bottom: 24px; + *zoom: 1; +} +.wy-btn-group:before, .wy-btn-group:after { + display: table; + content: ""; +} +.wy-btn-group:after { + clear: both; +} + +.wy-dropdown { + position: relative; + display: inline-block; +} + +.wy-dropdown-active .wy-dropdown-menu { + display: block; +} + +.wy-dropdown-menu { + position: absolute; + left: 0; + display: none; + float: left; + top: 100%; + min-width: 100%; + background: #fcfcfc; + z-index: 100; + border: solid 1px #cfd7dd; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.1); + padding: 12px; +} +.wy-dropdown-menu > dd > a { + display: block; + clear: both; + color: #404040; + white-space: nowrap; + font-size: 90%; + padding: 0 12px; + cursor: pointer; +} +.wy-dropdown-menu > dd > a:hover { + background: #2980B9; + color: #fff; +} +.wy-dropdown-menu > dd.divider { + border-top: solid 1px #cfd7dd; + margin: 6px 0; +} +.wy-dropdown-menu > dd.search { + padding-bottom: 12px; +} +.wy-dropdown-menu > dd.search input[type="search"] { + width: 100%; +} +.wy-dropdown-menu > dd.call-to-action { + background: #e3e3e3; + text-transform: uppercase; + font-weight: 500; + font-size: 80%; +} +.wy-dropdown-menu > dd.call-to-action:hover { + background: #e3e3e3; +} +.wy-dropdown-menu > dd.call-to-action .btn { + color: #fff; +} + +.wy-dropdown.wy-dropdown-up .wy-dropdown-menu { + bottom: 100%; + top: auto; + left: auto; + right: 0; +} + +.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu { + background: #fcfcfc; + margin-top: 2px; +} +.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a { + padding: 6px 12px; +} +.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover { + background: #2980B9; + color: #fff; +} + +.wy-dropdown.wy-dropdown-left .wy-dropdown-menu { + right: 0; + left: auto; + text-align: right; +} + +.wy-dropdown-arrow:before { + content: " "; + border-bottom: 5px solid whitesmoke; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + position: absolute; + display: block; + top: -4px; + left: 50%; + margin-left: -3px; +} +.wy-dropdown-arrow.wy-dropdown-arrow-left:before { + left: 11px; +} + +.wy-form-stacked select { + display: block; +} + +.wy-form-aligned input, .wy-form-aligned textarea, .wy-form-aligned select, .wy-form-aligned .wy-help-inline, .wy-form-aligned label { + display: inline-block; + *display: inline; + *zoom: 1; + vertical-align: middle; +} + +.wy-form-aligned .wy-control-group > label { + display: inline-block; + vertical-align: middle; + width: 10em; + margin: 6px 12px 0 0; + float: left; +} +.wy-form-aligned .wy-control { + float: left; +} +.wy-form-aligned .wy-control label { + display: block; +} +.wy-form-aligned .wy-control select { + margin-top: 6px; +} + +fieldset { + border: 0; + margin: 0; + padding: 0; +} + +legend { + display: block; + width: 100%; + border: 0; + padding: 0; + white-space: normal; + margin-bottom: 24px; + font-size: 150%; + *margin-left: -7px; +} + +label { + display: block; + margin: 0 0 0.3125em 0; + color: #333; + font-size: 90%; +} + +input, select, textarea { + font-size: 100%; + margin: 0; + vertical-align: baseline; + *vertical-align: middle; +} + +.wy-control-group { + margin-bottom: 24px; + *zoom: 1; + max-width: 68em; + margin-left: auto; + margin-right: auto; + *zoom: 1; +} +.wy-control-group:before, .wy-control-group:after { + display: table; + content: ""; +} +.wy-control-group:after { + clear: both; +} +.wy-control-group:before, .wy-control-group:after { + display: table; + content: ""; +} +.wy-control-group:after { + clear: both; +} + +.wy-control-group.wy-control-group-required > label:after { + content: " *"; + color: #E74C3C; +} + +.wy-control-group .wy-form-full, .wy-control-group .wy-form-halves, .wy-control-group .wy-form-thirds { + padding-bottom: 12px; +} +.wy-control-group .wy-form-full select, .wy-control-group .wy-form-halves select, .wy-control-group .wy-form-thirds select { + width: 100%; +} +.wy-control-group .wy-form-full input[type="text"], .wy-control-group .wy-form-full input[type="password"], .wy-control-group .wy-form-full input[type="email"], .wy-control-group .wy-form-full input[type="url"], .wy-control-group .wy-form-full input[type="date"], .wy-control-group .wy-form-full input[type="month"], .wy-control-group .wy-form-full input[type="time"], .wy-control-group .wy-form-full input[type="datetime"], .wy-control-group .wy-form-full input[type="datetime-local"], .wy-control-group .wy-form-full input[type="week"], .wy-control-group .wy-form-full input[type="number"], .wy-control-group .wy-form-full input[type="search"], .wy-control-group .wy-form-full input[type="tel"], .wy-control-group .wy-form-full input[type="color"], .wy-control-group .wy-form-halves input[type="text"], .wy-control-group .wy-form-halves input[type="password"], .wy-control-group .wy-form-halves input[type="email"], .wy-control-group .wy-form-halves input[type="url"], .wy-control-group .wy-form-halves input[type="date"], .wy-control-group .wy-form-halves input[type="month"], .wy-control-group .wy-form-halves input[type="time"], .wy-control-group .wy-form-halves input[type="datetime"], .wy-control-group .wy-form-halves input[type="datetime-local"], .wy-control-group .wy-form-halves input[type="week"], .wy-control-group .wy-form-halves input[type="number"], .wy-control-group .wy-form-halves input[type="search"], .wy-control-group .wy-form-halves input[type="tel"], .wy-control-group .wy-form-halves input[type="color"], .wy-control-group .wy-form-thirds input[type="text"], .wy-control-group .wy-form-thirds input[type="password"], .wy-control-group .wy-form-thirds input[type="email"], .wy-control-group .wy-form-thirds input[type="url"], .wy-control-group .wy-form-thirds input[type="date"], .wy-control-group .wy-form-thirds input[type="month"], .wy-control-group .wy-form-thirds input[type="time"], .wy-control-group .wy-form-thirds input[type="datetime"], .wy-control-group .wy-form-thirds input[type="datetime-local"], .wy-control-group .wy-form-thirds input[type="week"], .wy-control-group .wy-form-thirds input[type="number"], .wy-control-group .wy-form-thirds input[type="search"], .wy-control-group .wy-form-thirds input[type="tel"], .wy-control-group .wy-form-thirds input[type="color"] { + width: 100%; +} + +.wy-control-group .wy-form-full { + float: left; + display: block; + margin-right: 2.3576515979%; + width: 100%; + margin-right: 0; +} +.wy-control-group .wy-form-full:last-child { + margin-right: 0; +} + +.wy-control-group .wy-form-halves { + float: left; + display: block; + margin-right: 2.3576515979%; + width: 48.821174201%; +} +.wy-control-group .wy-form-halves:last-child { + margin-right: 0; +} +.wy-control-group .wy-form-halves:nth-of-type(2n) { + margin-right: 0; +} +.wy-control-group .wy-form-halves:nth-of-type(2n+1) { + clear: left; +} + +.wy-control-group .wy-form-thirds { + float: left; + display: block; + margin-right: 2.3576515979%; + width: 31.7615656014%; +} +.wy-control-group .wy-form-thirds:last-child { + margin-right: 0; +} +.wy-control-group .wy-form-thirds:nth-of-type(3n) { + margin-right: 0; +} +.wy-control-group .wy-form-thirds:nth-of-type(3n+1) { + clear: left; +} + +.wy-control-group.wy-control-group-no-input .wy-control { + margin: 6px 0 0 0; + font-size: 90%; +} + +.wy-control-no-input { + display: inline-block; + margin: 6px 0 0 0; + font-size: 90%; +} + +.wy-control-group.fluid-input input[type="text"], .wy-control-group.fluid-input input[type="password"], .wy-control-group.fluid-input input[type="email"], .wy-control-group.fluid-input input[type="url"], .wy-control-group.fluid-input input[type="date"], .wy-control-group.fluid-input input[type="month"], .wy-control-group.fluid-input input[type="time"], .wy-control-group.fluid-input input[type="datetime"], .wy-control-group.fluid-input input[type="datetime-local"], .wy-control-group.fluid-input input[type="week"], .wy-control-group.fluid-input input[type="number"], .wy-control-group.fluid-input input[type="search"], .wy-control-group.fluid-input input[type="tel"], .wy-control-group.fluid-input input[type="color"] { + width: 100%; +} + +.wy-form-message-inline { + display: inline-block; + padding-left: 0.3em; + color: #666; + vertical-align: middle; + font-size: 90%; +} + +.wy-form-message { + display: block; + color: #999; + font-size: 70%; + margin-top: 0.3125em; + font-style: italic; +} +.wy-form-message p { + font-size: inherit; + font-style: italic; + margin-bottom: 6px; +} +.wy-form-message p:last-child { + margin-bottom: 0; +} + +input { + line-height: normal; +} + +input[type="button"], input[type="reset"], input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; + font-family: "Lato", "proxima-nova", "Helvetica Neue", Arial, sans-serif; + *overflow: visible; +} +input[type="text"], input[type="password"], input[type="email"], input[type="url"], input[type="date"], input[type="month"], input[type="time"], input[type="datetime"], input[type="datetime-local"], input[type="week"], input[type="number"], input[type="search"], input[type="tel"], input[type="color"] { + -webkit-appearance: none; + padding: 6px; + display: inline-block; + border: 1px solid #ccc; + font-size: 80%; + font-family: "Lato", "proxima-nova", "Helvetica Neue", Arial, sans-serif; + box-shadow: inset 0 1px 3px #ddd; + border-radius: 0; + -webkit-transition: border 0.3s linear; + -moz-transition: border 0.3s linear; + transition: border 0.3s linear; +} +input[type="datetime-local"] { + padding: 0.34375em 0.625em; +} +input[disabled] { + cursor: default; +} +input[type="checkbox"], input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; + margin-right: 0.3125em; + *height: 13px; + *width: 13px; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +input[type="text"]:focus, input[type="password"]:focus, input[type="email"]:focus, input[type="url"]:focus, input[type="date"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="week"]:focus, input[type="number"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="color"]:focus { + outline: 0; + outline: thin dotted \9 ; + border-color: #333; +} +input.no-focus:focus { + border-color: #ccc !important; +} +input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 1px auto #129FEA; +} +input[type="text"][disabled], input[type="password"][disabled], input[type="email"][disabled], input[type="url"][disabled], input[type="date"][disabled], input[type="month"][disabled], input[type="time"][disabled], input[type="datetime"][disabled], input[type="datetime-local"][disabled], input[type="week"][disabled], input[type="number"][disabled], input[type="search"][disabled], input[type="tel"][disabled], input[type="color"][disabled] { + cursor: not-allowed; + background-color: #fafafa; +} + +input:focus:invalid, textarea:focus:invalid, select:focus:invalid { + color: #E74C3C; + border: 1px solid #E74C3C; +} + +input:focus:invalid:focus, textarea:focus:invalid:focus, select:focus:invalid:focus { + border-color: #E74C3C; +} + +input[type="file"]:focus:invalid:focus, input[type="radio"]:focus:invalid:focus, input[type="checkbox"]:focus:invalid:focus { + outline-color: #E74C3C; +} + +input.wy-input-large { + padding: 12px; + font-size: 100%; +} + +textarea { + overflow: auto; + vertical-align: top; + width: 100%; + font-family: "Lato", "proxima-nova", "Helvetica Neue", Arial, sans-serif; +} + +select, textarea { + padding: 0.5em 0.625em; + display: inline-block; + border: 1px solid #ccc; + font-size: 80%; + box-shadow: inset 0 1px 3px #ddd; + -webkit-transition: border 0.3s linear; + -moz-transition: border 0.3s linear; + transition: border 0.3s linear; +} + +select { + border: 1px solid #ccc; + background-color: #fff; +} +select[multiple] { + height: auto; +} + +select:focus, textarea:focus { + outline: 0; +} + +select[disabled], textarea[disabled], input[readonly], select[readonly], textarea[readonly] { + cursor: not-allowed; + background-color: #fafafa; +} + +input[type="radio"][disabled], input[type="checkbox"][disabled] { + cursor: not-allowed; +} + +.wy-checkbox, .wy-radio { + margin: 6px 0; + color: #404040; + display: block; +} +.wy-checkbox input, .wy-radio input { + vertical-align: baseline; +} + +.wy-form-message-inline { + display: inline-block; + *display: inline; + *zoom: 1; + vertical-align: middle; +} + +.wy-input-prefix, .wy-input-suffix { + white-space: nowrap; + padding: 6px; +} +.wy-input-prefix .wy-input-context, .wy-input-suffix .wy-input-context { + line-height: 27px; + padding: 0 8px; + display: inline-block; + font-size: 80%; + background-color: #f3f6f6; + border: solid 1px #ccc; + color: #999; +} + +.wy-input-suffix .wy-input-context { + border-left: 0; +} + +.wy-input-prefix .wy-input-context { + border-right: 0; +} + +.wy-switch { + position: relative; + display: block; + height: 24px; + margin-top: 12px; + cursor: pointer; +} +.wy-switch:before { + position: absolute; + content: ""; + display: block; + left: 0; + top: 0; + width: 36px; + height: 12px; + border-radius: 4px; + background: #ccc; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +.wy-switch:after { + position: absolute; + content: ""; + display: block; + width: 18px; + height: 18px; + border-radius: 4px; + background: #999; + left: -3px; + top: -3px; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +.wy-switch span { + position: absolute; + left: 48px; + display: block; + font-size: 12px; + color: #ccc; + line-height: 1; +} + +.wy-switch.active:before { + background: #1e8449; +} +.wy-switch.active:after { + left: 24px; + background: #27AE60; +} + +.wy-switch.disabled { + cursor: not-allowed; + opacity: 0.8; +} + +.wy-control-group.wy-control-group-error .wy-form-message, .wy-control-group.wy-control-group-error > label { + color: #E74C3C; +} +.wy-control-group.wy-control-group-error input[type="text"], .wy-control-group.wy-control-group-error input[type="password"], .wy-control-group.wy-control-group-error input[type="email"], .wy-control-group.wy-control-group-error input[type="url"], .wy-control-group.wy-control-group-error input[type="date"], .wy-control-group.wy-control-group-error input[type="month"], .wy-control-group.wy-control-group-error input[type="time"], .wy-control-group.wy-control-group-error input[type="datetime"], .wy-control-group.wy-control-group-error input[type="datetime-local"], .wy-control-group.wy-control-group-error input[type="week"], .wy-control-group.wy-control-group-error input[type="number"], .wy-control-group.wy-control-group-error input[type="search"], .wy-control-group.wy-control-group-error input[type="tel"], .wy-control-group.wy-control-group-error input[type="color"] { + border: solid 1px #E74C3C; +} +.wy-control-group.wy-control-group-error textarea { + border: solid 1px #E74C3C; +} + +.wy-inline-validate { + white-space: nowrap; +} +.wy-inline-validate .wy-input-context { + padding: 0.5em 0.625em; + display: inline-block; + font-size: 80%; +} + +.wy-inline-validate.wy-inline-validate-success .wy-input-context { + color: #27AE60; +} + +.wy-inline-validate.wy-inline-validate-danger .wy-input-context { + color: #E74C3C; +} + +.wy-inline-validate.wy-inline-validate-warning .wy-input-context { + color: #E67E22; +} + +.wy-inline-validate.wy-inline-validate-info .wy-input-context { + color: #2980B9; +} + +.rotate-90 { + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -ms-transform: rotate(90deg); + -o-transform: rotate(90deg); + transform: rotate(90deg); +} + +.rotate-180 { + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -ms-transform: rotate(180deg); + -o-transform: rotate(180deg); + transform: rotate(180deg); +} + +.rotate-270 { + -webkit-transform: rotate(270deg); + -moz-transform: rotate(270deg); + -ms-transform: rotate(270deg); + -o-transform: rotate(270deg); + transform: rotate(270deg); +} + +.mirror { + -webkit-transform: scaleX(-1); + -moz-transform: scaleX(-1); + -ms-transform: scaleX(-1); + -o-transform: scaleX(-1); + transform: scaleX(-1); +} +.mirror.rotate-90 { + -webkit-transform: scaleX(-1) rotate(90deg); + -moz-transform: scaleX(-1) rotate(90deg); + -ms-transform: scaleX(-1) rotate(90deg); + -o-transform: scaleX(-1) rotate(90deg); + transform: scaleX(-1) rotate(90deg); +} +.mirror.rotate-180 { + -webkit-transform: scaleX(-1) rotate(180deg); + -moz-transform: scaleX(-1) rotate(180deg); + -ms-transform: scaleX(-1) rotate(180deg); + -o-transform: scaleX(-1) rotate(180deg); + transform: scaleX(-1) rotate(180deg); +} +.mirror.rotate-270 { + -webkit-transform: scaleX(-1) rotate(270deg); + -moz-transform: scaleX(-1) rotate(270deg); + -ms-transform: scaleX(-1) rotate(270deg); + -o-transform: scaleX(-1) rotate(270deg); + transform: scaleX(-1) rotate(270deg); +} + +@media only screen and (max-width: 480px) { + .wy-form button[type="submit"] { + margin: 0.7em 0 0; + } + .wy-form input[type="text"], .wy-form input[type="password"], .wy-form input[type="email"], .wy-form input[type="url"], .wy-form input[type="date"], .wy-form input[type="month"], .wy-form input[type="time"], .wy-form input[type="datetime"], .wy-form input[type="datetime-local"], .wy-form input[type="week"], .wy-form input[type="number"], .wy-form input[type="search"], .wy-form input[type="tel"], .wy-form input[type="color"] { + margin-bottom: 0.3em; + display: block; + } + .wy-form label { + margin-bottom: 0.3em; + display: block; + } + + .wy-form input[type="password"], .wy-form input[type="email"], .wy-form input[type="url"], .wy-form input[type="date"], .wy-form input[type="month"], .wy-form input[type="time"], .wy-form input[type="datetime"], .wy-form input[type="datetime-local"], .wy-form input[type="week"], .wy-form input[type="number"], .wy-form input[type="search"], .wy-form input[type="tel"], .wy-form input[type="color"] { + margin-bottom: 0; + } + + .wy-form-aligned .wy-control-group label { + margin-bottom: 0.3em; + text-align: left; + display: block; + width: 100%; + } + .wy-form-aligned .wy-control { + margin: 1.5em 0 0 0; + } + + .wy-form .wy-help-inline, .wy-form-message-inline, .wy-form-message { + display: block; + font-size: 80%; + padding: 6px 0; + } +} +@media screen and (max-width: 768px) { + .tablet-hide { + display: none; + } +} + +@media screen and (max-width: 480px) { + .mobile-hide { + display: none; + } +} + +.float-left { + float: left; +} + +.float-right { + float: right; +} + +.full-width { + width: 100%; +} + +.wy-table, .rst-content table.docutils, .rst-content table.field-list { + border-collapse: collapse; + border-spacing: 0; + empty-cells: show; + margin-bottom: 24px; +} +.wy-table caption, .rst-content table.docutils caption, .rst-content table.field-list caption { + color: #000; + font: italic 85%/1 arial, sans-serif; + padding: 1em 0; + text-align: center; +} +.wy-table td, .rst-content table.docutils td, .rst-content table.field-list td, .wy-table th, .rst-content table.docutils th, .rst-content table.field-list th { + font-size: 90%; + margin: 0; + overflow: visible; + padding: 8px 16px; +} +.wy-table td:first-child, .rst-content table.docutils td:first-child, .rst-content table.field-list td:first-child, .wy-table th:first-child, .rst-content table.docutils th:first-child, .rst-content table.field-list th:first-child { + border-left-width: 0; +} +.wy-table thead, .rst-content table.docutils thead, .rst-content table.field-list thead { + color: #000; + text-align: left; + vertical-align: bottom; + white-space: nowrap; +} +.wy-table thead th, .rst-content table.docutils thead th, .rst-content table.field-list thead th { + font-weight: bold; + border-bottom: solid 2px #e1e4e5; +} +.wy-table td, .rst-content table.docutils td, .rst-content table.field-list td { + background-color: transparent; + vertical-align: middle; +} + +.wy-table td p, .rst-content table.docutils td p, .rst-content table.field-list td p { + line-height: 18px; +} +.wy-table td p:last-child, .rst-content table.docutils td p:last-child, .rst-content table.field-list td p:last-child { + margin-bottom: 0; +} + +.wy-table .wy-table-cell-min, .rst-content table.docutils .wy-table-cell-min, .rst-content table.field-list .wy-table-cell-min { + width: 1%; + padding-right: 0; +} +.wy-table .wy-table-cell-min input[type=checkbox], .rst-content table.docutils .wy-table-cell-min input[type=checkbox], .rst-content table.field-list .wy-table-cell-min input[type=checkbox], .wy-table .wy-table-cell-min input[type=checkbox], .rst-content table.docutils .wy-table-cell-min input[type=checkbox], .rst-content table.field-list .wy-table-cell-min input[type=checkbox] { + margin: 0; +} + +.wy-table-secondary { + color: gray; + font-size: 90%; +} + +.wy-table-tertiary { + color: gray; + font-size: 80%; +} + +.wy-table-odd td, .wy-table-striped tr:nth-child(2n-1) td, .rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td { + background-color: #f3f6f6; +} + +.wy-table-backed { + background-color: #f3f6f6; +} + +/* BORDERED TABLES */ +.wy-table-bordered-all, .rst-content table.docutils { + border: 1px solid #e1e4e5; +} +.wy-table-bordered-all td, .rst-content table.docutils td { + border-bottom: 1px solid #e1e4e5; + border-left: 1px solid #e1e4e5; +} +.wy-table-bordered-all tbody > tr:last-child td, .rst-content table.docutils tbody > tr:last-child td { + border-bottom-width: 0; +} + +.wy-table-bordered { + border: 1px solid #e1e4e5; +} + +.wy-table-bordered-rows td { + border-bottom: 1px solid #e1e4e5; +} +.wy-table-bordered-rows tbody > tr:last-child td { + border-bottom-width: 0; +} + +.wy-table-horizontal tbody > tr:last-child td { + border-bottom-width: 0; +} +.wy-table-horizontal td, .wy-table-horizontal th { + border-width: 0 0 1px 0; + border-bottom: 1px solid #e1e4e5; +} +.wy-table-horizontal tbody > tr:last-child td { + border-bottom-width: 0; +} + +/* RESPONSIVE TABLES */ +.wy-table-responsive { + margin-bottom: 24px; + max-width: 100%; + overflow: auto; +} +.wy-table-responsive table { + margin-bottom: 0 !important; +} +.wy-table-responsive table td, .wy-table-responsive table th { + white-space: nowrap; +} + +a { + color: #2980B9; + text-decoration: none; + cursor: pointer; +} +a:hover { + color: #3091d1; +} +a:visited { + color: #9B59B6; +} + +html { + height: 100%; + overflow-x: hidden; +} + +body { + font-family: "Lato", "proxima-nova", "Helvetica Neue", Arial, sans-serif; + font-weight: normal; + color: #404040; + min-height: 100%; + overflow-x: hidden; + background: #edf0f2; +} + +.wy-text-left { + text-align: left; +} + +.wy-text-center { + text-align: center; +} + +.wy-text-right { + text-align: right; +} + +.wy-text-large { + font-size: 120%; +} + +.wy-text-normal { + font-size: 100%; +} + +.wy-text-small, small { + font-size: 80%; +} + +.wy-text-strike { + text-decoration: line-through; +} + +.wy-text-warning { + color: #E67E22 !important; +} + +a.wy-text-warning:hover { + color: #eb9950 !important; +} + +.wy-text-info { + color: #2980B9 !important; +} + +a.wy-text-info:hover { + color: #409ad5 !important; +} + +.wy-text-success { + color: #27AE60 !important; +} + +a.wy-text-success:hover { + color: #36d278 !important; +} + +.wy-text-danger { + color: #E74C3C !important; +} + +a.wy-text-danger:hover { + color: #ed7669 !important; +} + +.wy-text-neutral { + color: #404040 !important; +} + +a.wy-text-neutral:hover { + color: #595959 !important; +} + +h1, h2, .rst-content .toctree-wrapper p.caption, h3, h4, h5, h6, legend { + margin-top: 0; + font-weight: 700; + font-family: "Roboto Slab", "ff-tisa-web-pro", "Georgia", Arial, sans-serif; +} + +p { + line-height: 24px; + margin: 0; + font-size: 16px; + margin-bottom: 24px; +} + +h1 { + font-size: 175%; +} + +h2, .rst-content .toctree-wrapper p.caption { + font-size: 150%; +} + +h3 { + font-size: 125%; +} + +h4 { + font-size: 115%; +} + +h5 { + font-size: 110%; +} + +h6 { + font-size: 100%; +} + +hr { + display: block; + height: 1px; + border: 0; + border-top: 1px solid #e1e4e5; + margin: 24px 0; + padding: 0; +} + +code, .rst-content tt, .rst-content code { + white-space: nowrap; + max-width: 100%; + background: #fff; + border: solid 1px #e1e4e5; + font-size: 75%; + padding: 0 5px; + font-family: Consolas, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", Monaco, "Courier New", Courier, monospace; + color: #E74C3C; + overflow-x: auto; +} +code.code-large, .rst-content tt.code-large { + font-size: 90%; +} + +.wy-plain-list-disc, .rst-content .section ul, .rst-content .toctree-wrapper ul, article ul { + list-style: disc; + line-height: 24px; + margin-bottom: 24px; +} +.wy-plain-list-disc li, .rst-content .section ul li, .rst-content .toctree-wrapper ul li, article ul li { + list-style: disc; + margin-left: 24px; +} +.wy-plain-list-disc li p:last-child, .rst-content .section ul li p:last-child, .rst-content .toctree-wrapper ul li p:last-child, article ul li p:last-child { + margin-bottom: 0; +} +.wy-plain-list-disc li ul, .rst-content .section ul li ul, .rst-content .toctree-wrapper ul li ul, article ul li ul { + margin-bottom: 0; +} +.wy-plain-list-disc li li, .rst-content .section ul li li, .rst-content .toctree-wrapper ul li li, article ul li li { + list-style: circle; +} +.wy-plain-list-disc li li li, .rst-content .section ul li li li, .rst-content .toctree-wrapper ul li li li, article ul li li li { + list-style: square; +} +.wy-plain-list-disc li ol li, .rst-content .section ul li ol li, .rst-content .toctree-wrapper ul li ol li, article ul li ol li { + list-style: decimal; +} + +.wy-plain-list-decimal, .rst-content .section ol, .rst-content ol.arabic, article ol { + list-style: decimal; + line-height: 24px; + margin-bottom: 24px; +} +.wy-plain-list-decimal li, .rst-content .section ol li, .rst-content ol.arabic li, article ol li { + list-style: decimal; + margin-left: 24px; +} +.wy-plain-list-decimal li p:last-child, .rst-content .section ol li p:last-child, .rst-content ol.arabic li p:last-child, article ol li p:last-child { + margin-bottom: 0; +} +.wy-plain-list-decimal li ul, .rst-content .section ol li ul, .rst-content ol.arabic li ul, article ol li ul { + margin-bottom: 0; +} +.wy-plain-list-decimal li ul li, .rst-content .section ol li ul li, .rst-content ol.arabic li ul li, article ol li ul li { + list-style: disc; +} + +.codeblock-example { + border: 1px solid #e1e4e5; + border-bottom: none; + padding: 24px; + padding-top: 48px; + font-weight: 500; + background: #fff; + position: relative; +} +.codeblock-example:after { + content: "Example"; + position: absolute; + top: 0px; + left: 0px; + background: #9B59B6; + color: white; + padding: 6px 12px; +} +.codeblock-example.prettyprint-example-only { + border: 1px solid #e1e4e5; + margin-bottom: 24px; +} + +.codeblock, pre.literal-block, .rst-content .literal-block, .rst-content pre.literal-block, div[class^='highlight'] { + border: 1px solid #e1e4e5; + padding: 0px; + overflow-x: auto; + background: #fff; + margin: 1px 0 24px 0; +} +.codeblock div[class^='highlight'], pre.literal-block div[class^='highlight'], .rst-content .literal-block div[class^='highlight'], div[class^='highlight'] div[class^='highlight'] { + border: none; + background: none; + margin: 0; +} + +div[class^='highlight'] td.code { + width: 100%; +} + +.linenodiv pre { + border-right: solid 1px #e6e9ea; + margin: 0; + padding: 12px 12px; + font-family: Consolas, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", Monaco, "Courier New", Courier, monospace; + font-size: 12px; + line-height: 1.5; + color: #d9d9d9; +} + +div[class^='highlight'] pre { + white-space: pre; + margin: 0; + padding: 12px 12px; + font-family: Consolas, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", Monaco, "Courier New", Courier, monospace; + font-size: 12px; + line-height: 1.5; + display: block; + overflow: auto; + color: #404040; +} + +@media print { + .codeblock, pre.literal-block, .rst-content .literal-block, .rst-content pre.literal-block, div[class^='highlight'], div[class^='highlight'] pre { + white-space: pre-wrap; + } +} +.hll { + background-color: #ffffcc; + margin: 0 -12px; + padding: 0 12px; + display: block; +} + +.c { + color: #999988; + font-style: italic; +} + +.err { + color: #a61717; + background-color: #e3d2d2; +} + +.k { + font-weight: bold; +} + +.o { + font-weight: bold; +} + +.cm { + color: #999988; + font-style: italic; +} + +.cp { + color: #999999; + font-weight: bold; +} + +.c1 { + color: #999988; + font-style: italic; +} + +.cs { + color: #999999; + font-weight: bold; + font-style: italic; +} + +.gd { + color: #000000; + background-color: #ffdddd; +} + +.gd .x { + color: #000000; + background-color: #ffaaaa; +} + +.ge { + font-style: italic; +} + +.gr { + color: #aa0000; +} + +.gh { + color: #999999; +} + +.gi { + color: #000000; + background-color: #ddffdd; +} + +.gi .x { + color: #000000; + background-color: #aaffaa; +} + +.go { + color: #888888; +} + +.gp { + color: #555555; +} + +.gs { + font-weight: bold; +} + +.gu { + color: #800080; + font-weight: bold; +} + +.gt { + color: #aa0000; +} + +.kc { + font-weight: bold; +} + +.kd { + font-weight: bold; +} + +.kn { + font-weight: bold; +} + +.kp { + font-weight: bold; +} + +.kr { + font-weight: bold; +} + +.kt { + color: #445588; + font-weight: bold; +} + +.m { + color: #009999; +} + +.s { + color: #dd1144; +} + +.n { + color: #333333; +} + +.na { + color: teal; +} + +.nb { + color: #0086b3; +} + +.nc { + color: #445588; + font-weight: bold; +} + +.no { + color: teal; +} + +.ni { + color: purple; +} + +.ne { + color: #990000; + font-weight: bold; +} + +.nf { + color: #990000; + font-weight: bold; +} + +.nn { + color: #555555; +} + +.nt { + color: navy; +} + +.nv { + color: teal; +} + +.ow { + font-weight: bold; +} + +.w { + color: #bbbbbb; +} + +.mf { + color: #009999; +} + +.mh { + color: #009999; +} + +.mi { + color: #009999; +} + +.mo { + color: #009999; +} + +.sb { + color: #dd1144; +} + +.sc { + color: #dd1144; +} + +.sd { + color: #dd1144; +} + +.s2 { + color: #dd1144; +} + +.se { + color: #dd1144; +} + +.sh { + color: #dd1144; +} + +.si { + color: #dd1144; +} + +.sx { + color: #dd1144; +} + +.sr { + color: #009926; +} + +.s1 { + color: #dd1144; +} + +.ss { + color: #990073; +} + +.bp { + color: #999999; +} + +.vc { + color: teal; +} + +.vg { + color: teal; +} + +.vi { + color: teal; +} + +.il { + color: #009999; +} + +.gc { + color: #999; + background-color: #EAF2F5; +} + +.wy-breadcrumbs li { + display: inline-block; +} +.wy-breadcrumbs li.wy-breadcrumbs-aside { + float: right; +} +.wy-breadcrumbs li a { + display: inline-block; + padding: 5px; +} +.wy-breadcrumbs li a:first-child { + padding-left: 0; +} +.wy-breadcrumbs li code, .wy-breadcrumbs li .rst-content tt, .rst-content .wy-breadcrumbs li tt { + padding: 5px; + border: none; + background: none; +} +.wy-breadcrumbs li code.literal, .wy-breadcrumbs li .rst-content tt.literal, .rst-content .wy-breadcrumbs li tt.literal { + color: #404040; +} + +.wy-breadcrumbs-extra { + margin-bottom: 0; + color: #b3b3b3; + font-size: 80%; + display: inline-block; +} + +@media screen and (max-width: 480px) { + .wy-breadcrumbs-extra { + display: none; + } + + .wy-breadcrumbs li.wy-breadcrumbs-aside { + display: none; + } +} +@media print { + .wy-breadcrumbs li.wy-breadcrumbs-aside { + display: none; + } +} +.wy-affix { + position: fixed; + top: 1.618em; +} + +.wy-menu a:hover { + text-decoration: none; +} + +.wy-menu-horiz { + *zoom: 1; +} +.wy-menu-horiz:before, .wy-menu-horiz:after { + display: table; + content: ""; +} +.wy-menu-horiz:after { + clear: both; +} +.wy-menu-horiz ul, .wy-menu-horiz li { + display: inline-block; +} +.wy-menu-horiz li:hover { + background: rgba(255, 255, 255, 0.1); +} +.wy-menu-horiz li.divide-left { + border-left: solid 1px #404040; +} +.wy-menu-horiz li.divide-right { + border-right: solid 1px #404040; +} +.wy-menu-horiz a { + height: 32px; + display: inline-block; + line-height: 32px; + padding: 0 16px; +} + +.wy-menu-vertical { + width: 300px; +} +.wy-menu-vertical header, .wy-menu-vertical p.caption { + height: 32px; + display: inline-block; + line-height: 32px; + padding: 0 1.618em; + margin-bottom: 0; + display: block; + font-weight: bold; + text-transform: uppercase; + font-size: 80%; + color: #6f6f6f; + white-space: nowrap; +} +.wy-menu-vertical ul { + margin-bottom: 0; +} +.wy-menu-vertical li.divide-top { + border-top: solid 1px #404040; +} +.wy-menu-vertical li.divide-bottom { + border-bottom: solid 1px #404040; +} +.wy-menu-vertical li.current { + background: #e3e3e3; +} +.wy-menu-vertical li.current a { + color: gray; + border-right: solid 1px #c9c9c9; + padding: 0.4045em 2.427em; +} +.wy-menu-vertical li.current a:hover { + background: #d6d6d6; +} +.wy-menu-vertical li code, .wy-menu-vertical li .rst-content tt, .rst-content .wy-menu-vertical li tt { + border: none; + background: inherit; + color: inherit; + padding-left: 0; + padding-right: 0; +} +.wy-menu-vertical li span.toctree-expand { + display: block; + float: left; + margin-left: -1.2em; + font-size: 0.8em; + line-height: 1.6em; + color: #4d4d4d; +} +.wy-menu-vertical li.on a, .wy-menu-vertical li.current > a { + color: #404040; + padding: 0.4045em 1.618em; + font-weight: bold; + position: relative; + background: #fcfcfc; + border: none; + border-bottom: solid 1px #c9c9c9; + border-top: solid 1px #c9c9c9; + padding-left: 1.618em -4px; +} +.wy-menu-vertical li.on a:hover, .wy-menu-vertical li.current > a:hover { + background: #fcfcfc; +} +.wy-menu-vertical li.on a:hover span.toctree-expand, .wy-menu-vertical li.current > a:hover span.toctree-expand { + color: gray; +} +.wy-menu-vertical li.on a span.toctree-expand, .wy-menu-vertical li.current > a span.toctree-expand { + display: block; + font-size: 0.8em; + line-height: 1.6em; + color: #333333; +} +.wy-menu-vertical li.toctree-l1.current li.toctree-l2 > ul, .wy-menu-vertical li.toctree-l2.current li.toctree-l3 > ul { + display: none; +} +.wy-menu-vertical li.toctree-l1.current li.toctree-l2.current > ul, .wy-menu-vertical li.toctree-l2.current li.toctree-l3.current > ul { + display: block; +} +.wy-menu-vertical li.toctree-l2.current > a { + background: #c9c9c9; + padding: 0.4045em 2.427em; +} +.wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a { + display: block; + background: #c9c9c9; + padding: 0.4045em 4.045em; +} +.wy-menu-vertical li.toctree-l2 a:hover span.toctree-expand { + color: gray; +} +.wy-menu-vertical li.toctree-l2 span.toctree-expand { + color: #a3a3a3; +} +.wy-menu-vertical li.toctree-l3 { + font-size: 0.9em; +} +.wy-menu-vertical li.toctree-l3.current > a { + background: #bdbdbd; + padding: 0.4045em 4.045em; +} +.wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a { + display: block; + background: #bdbdbd; + padding: 0.4045em 5.663em; + border-top: none; + border-bottom: none; +} +.wy-menu-vertical li.toctree-l3 a:hover span.toctree-expand { + color: gray; +} +.wy-menu-vertical li.toctree-l3 span.toctree-expand { + color: #969696; +} +.wy-menu-vertical li.toctree-l4 { + font-size: 0.9em; +} +.wy-menu-vertical li.current ul { + display: block; +} +.wy-menu-vertical li ul { + margin-bottom: 0; + display: none; +} +.wy-menu-vertical .local-toc li ul { + display: block; +} +.wy-menu-vertical li ul li a { + margin-bottom: 0; + color: #b3b3b3; + font-weight: normal; +} +.wy-menu-vertical a { + display: inline-block; + line-height: 18px; + padding: 0.4045em 1.618em; + display: block; + position: relative; + font-size: 90%; + color: #b3b3b3; +} +.wy-menu-vertical a:hover { + background-color: #4e4a4a; + cursor: pointer; +} +.wy-menu-vertical a:hover span.toctree-expand { + color: #b3b3b3; +} +.wy-menu-vertical a:active { + background-color: #2980B9; + cursor: pointer; + color: #fff; +} +.wy-menu-vertical a:active span.toctree-expand { + color: #fff; +} + +.wy-side-nav-search { + display: block; + width: 300px; + padding: 0.809em; + margin-bottom: 0.809em; + z-index: 200; + background-color: #2980B9; + text-align: center; + padding: 0.809em; + display: block; + color: #fcfcfc; + margin-bottom: 0.809em; +} +.wy-side-nav-search input[type=text] { + width: 100%; + border-radius: 50px; + padding: 6px 12px; + border-color: #2472a4; +} +.wy-side-nav-search img { + display: block; + margin: auto auto 0.809em auto; + height: 45px; + width: 45px; + background-color: #2980B9; + padding: 5px; + border-radius: 100%; +} +.wy-side-nav-search > a, .wy-side-nav-search .wy-dropdown > a { + color: #fcfcfc; + font-size: 100%; + font-weight: bold; + display: inline-block; + padding: 4px 6px; + margin-bottom: 0.809em; +} +.wy-side-nav-search > a:hover, .wy-side-nav-search .wy-dropdown > a:hover { + background: rgba(255, 255, 255, 0.1); +} +.wy-side-nav-search > a img.logo, .wy-side-nav-search .wy-dropdown > a img.logo { + display: block; + margin: 0 auto; + height: auto; + width: auto; + border-radius: 0; + max-width: 100%; + background: rgba(0, 0, 0, 0); +} +.wy-side-nav-search > a.icon img.logo, .wy-side-nav-search .wy-dropdown > a.icon img.logo { + margin-top: 0.85em; +} +.wy-side-nav-search > div.version { + margin-top: -0.4045em; + margin-bottom: 0.809em; + font-weight: normal; + color: rgba(255, 255, 255, 0.3); +} + +.wy-nav .wy-menu-vertical header { + color: #2980B9; +} +.wy-nav .wy-menu-vertical a { + color: #b3b3b3; +} +.wy-nav .wy-menu-vertical a:hover { + background-color: #2980B9; + color: #fff; +} + +[data-menu-wrap] { + -webkit-transition: all 0.2s ease-in; + -moz-transition: all 0.2s ease-in; + transition: all 0.2s ease-in; + position: absolute; + opacity: 1; + width: 100%; + opacity: 0; +} +[data-menu-wrap].move-center { + left: 0; + right: auto; + opacity: 1; +} +[data-menu-wrap].move-left { + right: auto; + left: -100%; + opacity: 0; +} +[data-menu-wrap].move-right { + right: -100%; + left: auto; + opacity: 0; +} + +.wy-body-for-nav { + background: left repeat-y #fcfcfc; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoxOERBMTRGRDBFMUUxMUUzODUwMkJCOThDMEVFNURFMCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxOERBMTRGRTBFMUUxMUUzODUwMkJCOThDMEVFNURFMCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjE4REExNEZCMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjE4REExNEZDMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+EwrlwAAAAA5JREFUeNpiMDU0BAgwAAE2AJgB9BnaAAAAAElFTkSuQmCC); + background-size: 300px 1px; +} + +.wy-grid-for-nav { + position: absolute; + width: 100%; + height: 100%; +} + +.wy-nav-side { + position: fixed; + top: 0; + bottom: 0; + left: 0; + padding-bottom: 2em; + width: 300px; + overflow-x: hidden; + overflow-y: hidden; + min-height: 100%; + background: #343131; + z-index: 200; +} + +.wy-side-scroll { + width: 320px; + position: relative; + overflow-x: hidden; + overflow-y: scroll; + height: 100%; +} + +.wy-nav-top { + display: none; + background: #2980B9; + color: #fff; + padding: 0.4045em 0.809em; + position: relative; + line-height: 50px; + text-align: center; + font-size: 100%; + *zoom: 1; +} +.wy-nav-top:before, .wy-nav-top:after { + display: table; + content: ""; +} +.wy-nav-top:after { + clear: both; +} +.wy-nav-top a { + color: #fff; + font-weight: bold; +} +.wy-nav-top img { + margin-right: 12px; + height: 45px; + width: 45px; + background-color: #2980B9; + padding: 5px; + border-radius: 100%; +} +.wy-nav-top i { + font-size: 30px; + float: left; + cursor: pointer; + padding-top: inherit; +} + +.wy-nav-content-wrap { + margin-left: 300px; + background: #fcfcfc; + min-height: 100%; +} + +.wy-nav-content { + padding: 1.618em 3.236em; + height: 100%; + max-width: 800px; + margin: auto; +} + +.wy-body-mask { + position: fixed; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.2); + display: none; + z-index: 499; +} +.wy-body-mask.on { + display: block; +} + +footer { + color: gray; +} +footer p { + margin-bottom: 12px; +} +footer span.commit code, footer span.commit .rst-content tt, .rst-content footer span.commit tt { + padding: 0px; + font-family: Consolas, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", Monaco, "Courier New", Courier, monospace; + font-size: 1em; + background: none; + border: none; + color: gray; +} + +.rst-footer-buttons { + *zoom: 1; +} +.rst-footer-buttons:before, .rst-footer-buttons:after { + width: 100%; +} +.rst-footer-buttons:before, .rst-footer-buttons:after { + display: table; + content: ""; +} +.rst-footer-buttons:after { + clear: both; +} + +.rst-breadcrumbs-buttons { + margin-top: 12px; + *zoom: 1; +} +.rst-breadcrumbs-buttons:before, .rst-breadcrumbs-buttons:after { + display: table; + content: ""; +} +.rst-breadcrumbs-buttons:after { + clear: both; +} + +#search-results .search li { + margin-bottom: 24px; + border-bottom: solid 1px #e1e4e5; + padding-bottom: 24px; +} +#search-results .search li:first-child { + border-top: solid 1px #e1e4e5; + padding-top: 24px; +} +#search-results .search li a { + font-size: 120%; + margin-bottom: 12px; + display: inline-block; +} +#search-results .context { + color: gray; + font-size: 90%; +} + +@media screen and (max-width: 768px) { + .wy-body-for-nav { + background: #fcfcfc; + } + + .wy-nav-top { + display: block; + } + + .wy-nav-side { + left: -300px; + } + .wy-nav-side.shift { + width: 85%; + left: 0; + } + + .wy-side-scroll { + width: auto; + } + + .wy-side-nav-search { + width: auto; + } + + .wy-menu.wy-menu-vertical { + width: auto; + } + + .wy-nav-content-wrap { + margin-left: 0; + } + .wy-nav-content-wrap .wy-nav-content { + padding: 1.618em; + } + .wy-nav-content-wrap.shift { + position: fixed; + min-width: 100%; + left: 85%; + top: 0; + height: 100%; + overflow: hidden; + } +} +@media screen and (min-width: 1400px) { + .wy-nav-content-wrap { + background: rgba(0, 0, 0, 0.05); + } + + .wy-nav-content { + margin: 0; + background: #fcfcfc; + } +} +@media print { + .rst-versions, footer, .wy-nav-side { + display: none; + } + + .wy-nav-content-wrap { + margin-left: 0; + } +} +.rst-versions { + position: fixed; + bottom: 0; + left: 0; + width: 300px; + color: #fcfcfc; + background: #1f1d1d; + border-top: solid 10px #343131; + font-family: "Lato", "proxima-nova", "Helvetica Neue", Arial, sans-serif; + z-index: 400; +} +.rst-versions a { + color: #2980B9; + text-decoration: none; +} +.rst-versions .rst-badge-small { + display: none; +} +.rst-versions .rst-current-version { + padding: 12px; + background-color: #272525; + display: block; + text-align: right; + font-size: 90%; + cursor: pointer; + color: #27AE60; + *zoom: 1; +} +.rst-versions .rst-current-version:before, .rst-versions .rst-current-version:after { + display: table; + content: ""; +} +.rst-versions .rst-current-version:after { + clear: both; +} +.rst-versions .rst-current-version .fa, .rst-versions .rst-current-version .wy-menu-vertical li span.toctree-expand, .wy-menu-vertical li .rst-versions .rst-current-version span.toctree-expand, .rst-versions .rst-current-version .rst-content .admonition-title, .rst-content .rst-versions .rst-current-version .admonition-title, .rst-versions .rst-current-version .rst-content h1 .headerlink, .rst-content h1 .rst-versions .rst-current-version .headerlink, .rst-versions .rst-current-version .rst-content h2 .headerlink, .rst-content h2 .rst-versions .rst-current-version .headerlink, .rst-versions .rst-current-version .rst-content h3 .headerlink, .rst-content h3 .rst-versions .rst-current-version .headerlink, .rst-versions .rst-current-version .rst-content h4 .headerlink, .rst-content h4 .rst-versions .rst-current-version .headerlink, .rst-versions .rst-current-version .rst-content h5 .headerlink, .rst-content h5 .rst-versions .rst-current-version .headerlink, .rst-versions .rst-current-version .rst-content h6 .headerlink, .rst-content h6 .rst-versions .rst-current-version .headerlink, .rst-versions .rst-current-version .rst-content dl dt .headerlink, .rst-content dl dt .rst-versions .rst-current-version .headerlink, .rst-versions .rst-current-version .rst-content p.caption .headerlink, .rst-content p.caption .rst-versions .rst-current-version .headerlink, .rst-versions .rst-current-version .rst-content tt.download span:first-child, .rst-content tt.download .rst-versions .rst-current-version span:first-child, .rst-versions .rst-current-version .rst-content code.download span:first-child, .rst-content code.download .rst-versions .rst-current-version span:first-child, .rst-versions .rst-current-version .icon { + color: #fcfcfc; +} +.rst-versions .rst-current-version .fa-book, .rst-versions .rst-current-version .icon-book { + float: left; +} +.rst-versions .rst-current-version .icon-book { + float: left; +} +.rst-versions .rst-current-version.rst-out-of-date { + background-color: #E74C3C; + color: #fff; +} +.rst-versions .rst-current-version.rst-active-old-version { + background-color: #F1C40F; + color: #000; +} +.rst-versions.shift-up .rst-other-versions { + display: block; +} +.rst-versions .rst-other-versions { + font-size: 90%; + padding: 12px; + color: gray; + display: none; +} +.rst-versions .rst-other-versions hr { + display: block; + height: 1px; + border: 0; + margin: 20px 0; + padding: 0; + border-top: solid 1px #413d3d; +} +.rst-versions .rst-other-versions dd { + display: inline-block; + margin: 0; +} +.rst-versions .rst-other-versions dd a { + display: inline-block; + padding: 6px; + color: #fcfcfc; +} +.rst-versions.rst-badge { + width: auto; + bottom: 20px; + right: 20px; + left: auto; + border: none; + max-width: 300px; +} +.rst-versions.rst-badge .icon-book { + float: none; +} +.rst-versions.rst-badge .fa-book, .rst-versions.rst-badge .icon-book { + float: none; +} +.rst-versions.rst-badge.shift-up .rst-current-version { + text-align: right; +} +.rst-versions.rst-badge.shift-up .rst-current-version .fa-book, .rst-versions.rst-badge.shift-up .rst-current-version .icon-book { + float: left; +} +.rst-versions.rst-badge.shift-up .rst-current-version .icon-book { + float: left; +} +.rst-versions.rst-badge .rst-current-version { + width: auto; + height: 30px; + line-height: 30px; + padding: 0 6px; + display: block; + text-align: center; +} + +@media screen and (max-width: 768px) { + .rst-versions { + width: 85%; + display: none; + } + .rst-versions.shift { + display: block; + } +} +.rst-content img { + max-width: 100%; + height: auto !important; +} +.rst-content .highlight > pre, .rst-content .linenodiv > pre { + line-height: normal; +} +.rst-content div.figure { + margin-bottom: 24px; +} +.rst-content div.figure p.caption { + font-style: italic; +} +.rst-content div.figure.align-center { + text-align: center; +} +.rst-content .section > img, .rst-content .section > a > img { + margin-bottom: 24px; +} +.rst-content blockquote { + margin-left: 24px; + line-height: 24px; + margin-bottom: 24px; +} +.rst-content .note .last, .rst-content .attention .last, .rst-content .caution .last, .rst-content .danger .last, .rst-content .error .last, .rst-content .hint .last, .rst-content .important .last, .rst-content .tip .last, .rst-content .warning .last, .rst-content .seealso .last, .rst-content .admonition-todo .last, .rst-content .admonition .last { + margin-bottom: 0; +} +.rst-content .admonition-title:before { + margin-right: 4px; +} +.rst-content .admonition table { + border-color: rgba(0, 0, 0, 0.1); +} +.rst-content .admonition table td, .rst-content .admonition table th { + background: transparent !important; + border-color: rgba(0, 0, 0, 0.1) !important; +} +.rst-content .section ol.loweralpha, .rst-content .section ol.loweralpha li { + list-style: lower-alpha; +} +.rst-content .section ol.upperalpha, .rst-content .section ol.upperalpha li { + list-style: upper-alpha; +} +.rst-content .section ol p, .rst-content .section ul p { + margin-bottom: 12px; +} +.rst-content .line-block { + margin-left: 24px; +} +.rst-content .topic-title { + font-weight: bold; + margin-bottom: 12px; +} +.rst-content .toc-backref { + color: #404040; +} +.rst-content .align-right { + float: right; + margin: 0px 0px 24px 24px; +} +.rst-content .align-left { + float: left; + margin: 0px 24px 24px 0px; +} +.rst-content .align-center { + margin: auto; + display: block; +} +.rst-content h1 .headerlink, .rst-content h2 .headerlink, .rst-content .toctree-wrapper p.caption .headerlink, .rst-content h3 .headerlink, .rst-content h4 .headerlink, .rst-content h5 .headerlink, .rst-content h6 .headerlink, .rst-content dl dt .headerlink, .rst-content p.caption .headerlink { + display: none; + visibility: hidden; + font-size: 14px; +} +.rst-content h1 .headerlink:after, .rst-content h2 .headerlink:after, .rst-content .toctree-wrapper p.caption .headerlink:after, .rst-content h3 .headerlink:after, .rst-content h4 .headerlink:after, .rst-content h5 .headerlink:after, .rst-content h6 .headerlink:after, .rst-content dl dt .headerlink:after, .rst-content p.caption .headerlink:after { + visibility: visible; + content: ""; + font-family: FontAwesome; + display: inline-block; +} +.rst-content h1:hover .headerlink, .rst-content h2:hover .headerlink, .rst-content .toctree-wrapper p.caption:hover .headerlink, .rst-content h3:hover .headerlink, .rst-content h4:hover .headerlink, .rst-content h5:hover .headerlink, .rst-content h6:hover .headerlink, .rst-content dl dt:hover .headerlink, .rst-content p.caption:hover .headerlink { + display: inline-block; +} +.rst-content .centered { + text-align: center; +} +.rst-content .sidebar { + float: right; + width: 40%; + display: block; + margin: 0 0 24px 24px; + padding: 24px; + background: #f3f6f6; + border: solid 1px #e1e4e5; +} +.rst-content .sidebar p, .rst-content .sidebar ul, .rst-content .sidebar dl { + font-size: 90%; +} +.rst-content .sidebar .last { + margin-bottom: 0; +} +.rst-content .sidebar .sidebar-title { + display: block; + font-family: "Roboto Slab", "ff-tisa-web-pro", "Georgia", Arial, sans-serif; + font-weight: bold; + background: #e1e4e5; + padding: 6px 12px; + margin: -24px; + margin-bottom: 24px; + font-size: 100%; +} +.rst-content .highlighted { + background: #F1C40F; + display: inline-block; + font-weight: bold; + padding: 0 6px; +} +.rst-content .footnote-reference, .rst-content .citation-reference { + vertical-align: super; + font-size: 90%; +} +.rst-content table.docutils.citation, .rst-content table.docutils.footnote { + background: none; + border: none; + color: gray; +} +.rst-content table.docutils.citation td, .rst-content table.docutils.citation tr, .rst-content table.docutils.footnote td, .rst-content table.docutils.footnote tr { + border: none; + background-color: transparent !important; + white-space: normal; +} +.rst-content table.docutils.citation td.label, .rst-content table.docutils.footnote td.label { + padding-left: 0; + padding-right: 0; + vertical-align: top; +} +.rst-content table.docutils.citation tt, .rst-content table.docutils.citation code, .rst-content table.docutils.footnote tt, .rst-content table.docutils.footnote code { + color: #555; +} +.rst-content table.field-list { + border: none; +} +.rst-content table.field-list td { + border: none; +} +.rst-content table.field-list td > strong { + display: inline-block; +} +.rst-content table.field-list .field-name { + padding-right: 10px; + text-align: left; + white-space: nowrap; +} +.rst-content table.field-list .field-body { + text-align: left; +} +.rst-content tt, .rst-content tt, .rst-content code { + color: #000; + padding: 2px 5px; +} +.rst-content tt big, .rst-content tt em, .rst-content tt big, .rst-content code big, .rst-content tt em, .rst-content code em { + font-size: 100% !important; + line-height: normal; +} +.rst-content tt.literal, .rst-content tt.literal, .rst-content code.literal { + color: #E74C3C; +} +.rst-content tt.xref, a .rst-content tt, .rst-content tt.xref, .rst-content code.xref, a .rst-content tt, a .rst-content code { + font-weight: bold; + color: #404040; +} +.rst-content a tt, .rst-content a tt, .rst-content a code { + color: #2980B9; +} +.rst-content dl { + margin-bottom: 24px; +} +.rst-content dl dt { + font-weight: bold; +} +.rst-content dl p, .rst-content dl table, .rst-content dl ul, .rst-content dl ol { + margin-bottom: 12px !important; +} +.rst-content dl dd { + margin: 0 0 12px 24px; +} +.rst-content dl:not(.docutils) { + margin-bottom: 24px; +} +.rst-content dl:not(.docutils) dt { + display: table; + margin: 6px 0; + font-size: 90%; + line-height: normal; + background: #e7f2fa; + color: #2980B9; + border-top: solid 3px #6ab0de; + padding: 6px; + position: relative; +} +.rst-content dl:not(.docutils) dt:before { + color: #6ab0de; +} +.rst-content dl:not(.docutils) dt .headerlink { + color: #404040; + font-size: 100% !important; +} +.rst-content dl:not(.docutils) dl dt { + margin-bottom: 6px; + border: none; + border-left: solid 3px #cccccc; + background: #f0f0f0; + color: #555; +} +.rst-content dl:not(.docutils) dl dt .headerlink { + color: #404040; + font-size: 100% !important; +} +.rst-content dl:not(.docutils) dt:first-child { + margin-top: 0; +} +.rst-content dl:not(.docutils) tt, .rst-content dl:not(.docutils) tt, .rst-content dl:not(.docutils) code { + font-weight: bold; +} +.rst-content dl:not(.docutils) tt.descname, .rst-content dl:not(.docutils) tt.descclassname, .rst-content dl:not(.docutils) tt.descname, .rst-content dl:not(.docutils) code.descname, .rst-content dl:not(.docutils) tt.descclassname, .rst-content dl:not(.docutils) code.descclassname { + background-color: transparent; + border: none; + padding: 0; + font-size: 100% !important; +} +.rst-content dl:not(.docutils) tt.descname, .rst-content dl:not(.docutils) tt.descname, .rst-content dl:not(.docutils) code.descname { + font-weight: bold; +} +.rst-content dl:not(.docutils) .optional { + display: inline-block; + padding: 0 4px; + color: #000; + font-weight: bold; +} +.rst-content dl:not(.docutils) .property { + display: inline-block; + padding-right: 8px; +} +.rst-content .viewcode-link, .rst-content .viewcode-back { + display: inline-block; + color: #27AE60; + font-size: 80%; + padding-left: 24px; +} +.rst-content .viewcode-back { + display: block; + float: right; +} +.rst-content p.rubric { + margin-bottom: 12px; + font-weight: bold; +} +.rst-content tt.download, .rst-content code.download { + background: inherit; + padding: inherit; + font-weight: normal; + font-family: inherit; + font-size: inherit; + color: inherit; + border: inherit; + white-space: inherit; +} +.rst-content tt.download span:first-child, .rst-content code.download span:first-child { + -webkit-font-smoothing: subpixel-antialiased; +} +.rst-content tt.download span:first-child:before, .rst-content code.download span:first-child:before { + margin-right: 4px; +} +.rst-content .guilabel { + border: 1px solid #7fbbe3; + background: #e7f2fa; + font-size: 80%; + font-weight: 700; + border-radius: 4px; + padding: 2.4px 6px; + margin: auto 2px; +} +.rst-content .versionmodified { + font-style: italic; +} + +@media screen and (max-width: 480px) { + .rst-content .sidebar { + width: 100%; + } +} +span[id*='MathJax-Span'] { + color: #404040; +} + +.math { + text-align: center; +} + +@font-face { + font-family: "Inconsolata"; + font-style: normal; + font-weight: 400; + src: local("Inconsolata"), local("Inconsolata-Regular"), url(../fonts/Inconsolata-Regular.ttf) format("truetype"); +} +@font-face { + font-family: "Inconsolata"; + font-style: normal; + font-weight: 700; + src: local("Inconsolata Bold"), local("Inconsolata-Bold"), url(../fonts/Inconsolata-Bold.ttf) format("truetype"); +} +@font-face { + font-family: "Lato"; + font-style: normal; + font-weight: 400; + src: local("Lato Regular"), local("Lato-Regular"), url(../fonts/Lato-Regular.ttf) format("truetype"); +} +@font-face { + font-family: "Lato"; + font-style: normal; + font-weight: 700; + src: local("Lato Bold"), local("Lato-Bold"), url(../fonts/Lato-Bold.ttf) format("truetype"); +} +@font-face { + font-family: "Lato"; + font-style: italic; + font-weight: 400; + src: local("Lato Italic"), local("Lato-Italic"), url(../fonts/Lato-Italic.ttf) format("truetype"); +} +@font-face { + font-family: "Lato"; + font-style: italic; + font-weight: 700; + src: local("Lato Bold Italic"), local("Lato-BoldItalic"), url(../fonts/Lato-BoldItalic.ttf) format("truetype"); +} +@font-face { + font-family: "Roboto Slab"; + font-style: normal; + font-weight: 400; + src: local("Roboto Slab Regular"), local("RobotoSlab-Regular"), url(../fonts/RobotoSlab-Regular.ttf) format("truetype"); +} +@font-face { + font-family: "Roboto Slab"; + font-style: normal; + font-weight: 700; + src: local("Roboto Slab Bold"), local("RobotoSlab-Bold"), url(../fonts/RobotoSlab-Bold.ttf) format("truetype"); +} +.wy-side-nav-search { + background-color: red; +} + +/*# sourceMappingURL=theme.css.map */ diff --git a/v24.04/en/_static/css/theme.css.map b/v24.04/en/_static/css/theme.css.map new file mode 100644 index 0000000..cf17c0d --- /dev/null +++ b/v24.04/en/_static/css/theme.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": ";AACE,CAAE;ECQI,kBAAoB,EDPJ,UAAU;ECY1B,eAAiB,EDZD,UAAU;EC2B1B,UAAY,ED3BI,UAAU;;;AEFlC,iFAAiF;EAC/E,OAAO,EAAE,KAAK;;;AAEhB,oBAAoB;EAClB,OAAO,EAAE,YAAY;EACrB,QAAQ,EAAE,MAAM;EAChB,KAAK,EAAE,CAAC;;;AAEV,qBAAqB;EACnB,OAAO,EAAE,IAAI;;;AAEf,QAAQ;EACN,OAAO,EAAE,IAAI;;;AAEf,CAAC;EDLO,kBAAoB,ECMd,UAAU;EDDhB,eAAiB,ECCX,UAAU;EDchB,UAAY,ECdN,UAAU;;;AAExB,IAAI;EACF,SAAS,EAAE,IAAI;EACf,wBAAwB,EAAE,IAAI;EAC9B,oBAAoB,EAAE,IAAI;;;AAE5B,IAAI;EACF,MAAM,EAAE,CAAC;;;AAEX,iBAAiB;EACf,OAAO,EAAE,CAAC;;;AAEZ,WAAW;EACT,aAAa,EAAE,UAAU;;;AAE3B,SAAS;EACP,WAAW,EAAE,IAAI;;;AAEnB,UAAU;EACR,MAAM,EAAE,CAAC;;;AAEX,GAAG;EACD,UAAU,EAAE,MAAM;;;AAGpB,GAAG;EACD,UAAU,EAAE,IAAI;EAChB,KAAK,EAAE,IAAI;EACX,eAAe,EAAE,IAAI;;;AAEvB,IAAI;EACF,UAAU,EAAE,IAAI;EAChB,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,IAAI;;;AAEnB,wDAAoB;EAClB,WAAW,EAAE,gBAAgB;EAC7B,YAAY,EAAE,wBAAwB;EACtC,SAAS,EAAE,GAAG;;;AAEhB,GAAG;EACD,WAAW,EAAE,GAAG;;;AAElB,CAAC;EACC,MAAM,EAAE,IAAI;;;AAEd,iBAAiB;EACf,OAAO,EAAE,EAAE;EACX,OAAO,EAAE,IAAI;;;AAEf,KAAK;EACH,SAAS,EAAE,GAAG;;;AAEhB,QAAQ;EACN,SAAS,EAAE,GAAG;EACd,WAAW,EAAE,CAAC;EACd,QAAQ,EAAE,QAAQ;EAClB,cAAc,EAAE,QAAQ;;;AAE1B,GAAG;EACD,GAAG,EAAE,MAAM;;;AAEb,GAAG;EACD,MAAM,EAAE,OAAO;;;AAEjB,UAAU;EACR,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;EACV,UAAU,EAAE,IAAI;EAChB,gBAAgB,EAAE,IAAI;;;AAExB,EAAE;EACA,UAAU,EAAE,IAAI;;;AAElB,EAAE;EACA,MAAM,EAAE,CAAC;;;AAEX,GAAG;EACD,MAAM,EAAE,CAAC;EACT,sBAAsB,EAAE,OAAO;EAC/B,cAAc,EAAE,MAAM;EACtB,SAAS,EAAE,IAAI;;;AAEjB,cAAc;EACZ,QAAQ,EAAE,MAAM;;;AAElB,MAAM;EACJ,MAAM,EAAE,CAAC;;;AAEX,IAAI;EACF,MAAM,EAAE,CAAC;;;AAEX,QAAQ;EACN,MAAM,EAAE,CAAC;EACT,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;;;AAEZ,KAAK;EACH,MAAM,EAAE,OAAO;;;AAEjB,MAAM;EACJ,MAAM,EAAE,CAAC;EACT,YAAY,EAAE,IAAI;EAClB,OAAO,EAAE,CAAC;EACV,WAAW,EAAE,MAAM;;;AAErB,+BAA+B;EAC7B,SAAS,EAAE,IAAI;EACf,MAAM,EAAE,CAAC;EACT,cAAc,EAAE,QAAQ;EACxB,eAAe,EAAE,MAAM;;;AAEzB,aAAa;EACX,WAAW,EAAE,MAAM;;;AAErB,uEAAuE;EACrE,MAAM,EAAE,OAAO;EACf,kBAAkB,EAAE,MAAM;EAC1B,SAAS,EAAE,OAAO;;;AAEpB,iCAAiC;EAC/B,MAAM,EAAE,OAAO;;;AAEjB,2CAA2C;EACzC,UAAU,EAAE,UAAU;EACtB,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,IAAI;;;AAEf,oBAAoB;EAClB,kBAAkB,EAAE,SAAS;EAC7B,eAAe,EAAE,WAAW;EAC5B,kBAAkB,EAAE,WAAW;EAC/B,UAAU,EAAE,WAAW;;;AAEzB,mGAAmG;EACjG,kBAAkB,EAAE,IAAI;;;AAE1B,iDAAiD;EAC/C,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;;;AAEZ,QAAQ;EACN,QAAQ,EAAE,IAAI;EACd,cAAc,EAAE,GAAG;EACnB,MAAM,EAAE,QAAQ;;;AAElB,KAAK;EACH,eAAe,EAAE,QAAQ;EACzB,cAAc,EAAE,CAAC;;;AAEnB,EAAE;EACA,cAAc,EAAE,GAAG;;;AAErB,YAAY;EACV,MAAM,EAAE,OAAO;EACf,UAAU,EAAE,IAAI;EAChB,KAAK,EAAE,KAAK;EACZ,OAAO,EAAE,OAAO;;;AAElB,GAAG;EACD,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,CAAC;EACT,WAAW,EAAE,MAAM;EACnB,QAAQ,EAAE,MAAM;EAChB,gBAAgB,EAAE,WAAW;EAC7B,iBAAiB,EAAE,SAAS;EAC5B,UAAU,EAAE,IAAI;EAChB,SAAS,EAAE,GAAG;EACd,YAAY,EAAE,CAAC;;;AAEjB,MAAM;EACJ,OAAO,EAAE,IAAI;;;AAEf,OAAO;EACL,OAAO,EAAE,eAAe;EACxB,UAAU,EAAE,MAAM;;;AAEpB,eAAe;EACb,MAAM,EAAE,CAAC;EACT,IAAI,EAAE,aAAa;EACnB,MAAM,EAAE,GAAG;EACX,MAAM,EAAE,IAAI;EACZ,QAAQ,EAAE,MAAM;EAChB,OAAO,EAAE,CAAC;EACV,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,GAAG;;;AAEZ,iEAAiE;EAC/D,IAAI,EAAE,IAAI;EACV,MAAM,EAAE,IAAI;EACZ,MAAM,EAAE,CAAC;EACT,QAAQ,EAAE,OAAO;EACjB,QAAQ,EAAE,MAAM;EAChB,KAAK,EAAE,IAAI;;;AAEb,UAAU;EACR,UAAU,EAAE,MAAM;;;AAEpB,SAAS;EACP,QAAQ,EAAE,QAAQ;;;AAEpB,UAAU;EACR,SAAS,EAAE,IAAI;;;AAEjB,YAAY;EACV,mBAAmB;IACjB,UAAU,EAAE,eAAe;;;EAC7B,CAAC;IACC,UAAU,EAAE,eAAe;IAC3B,WAAW,EAAE,eAAe;IAC5B,MAAM,EAAE,eAAe;IACvB,UAAU,EAAE,eAAe;;;EAC7B,YAAY;IACV,eAAe,EAAE,SAAS;;;EAC5B,6DAA6D;IAC3D,OAAO,EAAE,EAAE;;;EACb,eAAe;IACb,iBAAiB,EAAE,KAAK;;;EAC1B,KAAK;IACH,OAAO,EAAE,kBAAkB;;;EAC7B,OAAO;IACL,iBAAiB,EAAE,KAAK;;;EAC1B,GAAG;IACD,SAAS,EAAE,eAAe;;;;IAE1B,MAAM,EAAE,KAAK;;EAEf,kDAAS;IACP,OAAO,EAAE,CAAC;IACV,MAAM,EAAE,CAAC;;;EACX,+CAAM;IACJ,gBAAgB,EAAE,KAAK;;;AChM3B,kqDAAY;EACV,sBAAsB,EAAE,WAAW;;;AAqDrC,SAAS;EARP,KAAK,EAAE,CAAC;;AACR,iCAAS;EAEP,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,EAAE;;AACb,eAAO;EACL,KAAK,EAAE,IAAI;;;AC7Gf;;;GAGG;ACHH;gCACgC;AAEhC,UAWC;EAVC,WAAW,EAAE,aAAa;EAC1B,GAAG,EAAE,+CAAgE;EACrE,GAAG,EAAE,4WAI8F;EAEnG,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,MAAM;;ACVpB,mgBAAmB;EACjB,OAAO,EAAE,YAAY;EACrB,IAAI,EAAE,uCAA8E;EACpF,SAAS,EAAE,OAAO;EAClB,cAAc,EAAE,IAAI;EACpB,sBAAsB,EAAE,WAAW;EACnC,uBAAuB,EAAE,SAAS;;;ACNpC,8DAA8D;AAC9D,MAAsB;EACpB,SAAS,EAAE,cAAS;EACpB,WAAW,EAAE,MAAS;EACtB,cAAc,EAAE,IAAI;;;AAEtB,MAAsB;EAAE,SAAS,EAAE,GAAG;;;AACtC,MAAsB;EAAE,SAAS,EAAE,GAAG;;;AACtC,MAAsB;EAAE,SAAS,EAAE,GAAG;;;AACtC,MAAsB;EAAE,SAAS,EAAE,GAAG;;;ACVtC,MAAsB;EACpB,KAAK,EAAE,cAAW;EAClB,UAAU,EAAE,MAAM;;;ACDpB,MAAsB;EACpB,YAAY,EAAE,CAAC;EACf,WAAW,ECMU,cAAS;EDL9B,eAAe,EAAE,IAAI;;AACrB,WAAK;EAAE,QAAQ,EAAE,QAAQ;;;AAE3B,MAAsB;EACpB,QAAQ,EAAE,QAAQ;EAClB,IAAI,EAAE,eAAa;EACnB,KAAK,ECDgB,cAAS;EDE9B,GAAG,EAAE,cAAU;EACf,UAAU,EAAE,MAAM;;AAClB,YAAuB;EACrB,IAAI,EAAE,eAA0B;;;AEbpC,UAA0B;EACxB,OAAO,EAAE,gBAAgB;EACzB,MAAM,EAAE,iBAA4B;EACpC,aAAa,EAAE,IAAI;;;AAGrB,aAA6B;EAAE,KAAK,EAAE,IAAI;;;AAC1C,cAA8B;EAAE,KAAK,EAAE,KAAK;;;AAG1C,mtBAA8B;EAAE,YAAY,EAAE,IAAI;;AAClD,muBAA+B;EAAE,WAAW,EAAE,IAAI;;;AAGpD,4BAA4B;AAC5B,WAAY;EAAE,KAAK,EAAE,KAAK;;;AAC1B,UAAW;EAAE,KAAK,EAAE,IAAI;;;AAGtB,mqBAAY;EAAE,YAAY,EAAE,IAAI;;AAChC,mrBAAa;EAAE,WAAW,EAAE,IAAI;;;ACpBlC,QAAwB;EACtB,iBAAiB,EAAE,0BAA0B;EACrC,SAAS,EAAE,0BAA0B;;;AAG/C,SAAyB;EACvB,iBAAiB,EAAE,4BAA4B;EACvC,SAAS,EAAE,4BAA4B;;;AAGjD,0BASC;EARC,EAAG;IACD,iBAAiB,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;;EAEjC,IAAK;IACH,iBAAiB,EAAE,cAAc;IACzB,SAAS,EAAE,cAAc;;;AAIrC,kBASC;EARC,EAAG;IACD,iBAAiB,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;;EAEjC,IAAK;IACH,iBAAiB,EAAE,cAAc;IACzB,SAAS,EAAE,cAAc;;;AC5BrC,aAA8B;ECW5B,UAAU,EAAE,0DAAqE;EACjF,iBAAiB,EAAE,aAAgB;EAC/B,aAAa,EAAE,aAAgB;EAC3B,SAAS,EAAE,aAAgB;;;ADbrC,cAA8B;ECU5B,UAAU,EAAE,0DAAqE;EACjF,iBAAiB,EAAE,cAAgB;EAC/B,aAAa,EAAE,cAAgB;EAC3B,SAAS,EAAE,cAAgB;;;ADZrC,cAA8B;ECS5B,UAAU,EAAE,0DAAqE;EACjF,iBAAiB,EAAE,cAAgB;EAC/B,aAAa,EAAE,cAAgB;EAC3B,SAAS,EAAE,cAAgB;;;ADVrC,mBAAmC;ECcjC,UAAU,EAAE,oEAA+E;EAC3F,iBAAiB,EAAE,YAAoB;EACnC,aAAa,EAAE,YAAoB;EAC/B,SAAS,EAAE,YAAoB;;;ADhBzC,iBAAmC;ECajC,UAAU,EAAE,oEAA+E;EAC3F,iBAAiB,EAAE,YAAoB;EACnC,aAAa,EAAE,YAAoB;EAC/B,SAAS,EAAE,YAAoB;;;ADXzC;;;;uBAIuC;EACrC,MAAM,EAAE,IAAI;;;AEfd,SAAyB;EACvB,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,GAAG;EACV,MAAM,EAAE,GAAG;EACX,WAAW,EAAE,GAAG;EAChB,cAAc,EAAE,MAAM;;;AAExB,0BAAyD;EACvD,QAAQ,EAAE,QAAQ;EAClB,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,MAAM;;;AAEpB,YAA4B;EAAE,WAAW,EAAE,OAAO;;;AAClD,YAA4B;EAAE,SAAS,EAAE,GAAG;;;AAC5C,WAA2B;EAAE,KAAK,ELTZ,IAAI;;;AMV1B;oEACoE;AAEpE,gBAAgC;EAAE,OAAO,ENwU1B,GAAO;;;AMvUtB,gBAAgC;EAAE,OAAO,EN2d1B,GAAO;;;AM1dtB,sCAAiC;EAAE,OAAO,EN0jB1B,GAAO;;;AMzjBvB,qBAAqC;EAAE,OAAO,ENsO1B,GAAO;;;AMrO3B,gBAAgC;EAAE,OAAO,ENuW1B,GAAO;;;AMtWtB,eAA+B;EAAE,OAAO,ENknB1B,GAAO;;;AMjnBrB,iBAAiC;EAAE,OAAO,ENsnB1B,GAAO;;;AMrnBvB,eAA+B;EAAE,OAAO,ENytB1B,GAAO;;;AMxtBrB,eAA+B;EAAE,OAAO,ENmR1B,GAAO;;;AMlRrB,mBAAmC;EAAE,OAAO,ENupB1B,GAAO;;;AMtpBzB,aAA6B;EAAE,OAAO,ENqpB1B,GAAO;;;AMppBnB,kBAAkC;EAAE,OAAO,ENspB1B,GAAO;;;AMrpBxB,gBAAgC;EAAE,OAAO,ENyI1B,GAAO;;;AMxItB;;gBAEgC;EAAE,OAAO,ENqqB1B,GAAO;;;AMpqBtB,sBAAsC;EAAE,OAAO,EN8iB1B,GAAO;;;AM7iB5B,uBAAuC;EAAE,OAAO,EN4iB1B,GAAO;;;AM3iB7B,oBAAoC;EAAE,OAAO,EN4f1B,GAAO;;;AM3f1B,iBAAiC;EAAE,OAAO,ENikB1B,GAAO;;;AMhkBvB;cAC8B;EAAE,OAAO,ENgK1B,GAAO;;;AM/JpB,kBAAkC;EAAE,OAAO,EN+qB1B,GAAO;;;AM9qBxB,kCAA+B;EAAE,OAAO,ENwV1B,GAAO;;;AMvVrB,iBAAiC;EAAE,OAAO,ENuP1B,GAAO;;;AMtPvB,kBAAkC;EAAE,OAAO,ENgJ1B,GAAO;;;AM/IxB,eAA+B;EAAE,OAAO,ENmhB1B,GAAO;;;AMlhBrB,yHAAmC;EAAE,OAAO,ENgM1B,GAAO;;;AM/LzB,8BAA8C;EAAE,OAAO,ENY1B,GAAO;;;AMXpC,4BAA4C;EAAE,OAAO,ENc1B,GAAO;;;AMblC,gBAAgC;EAAE,OAAO,ENqW1B,GAAO;;;AMpWtB,wBAAwC;EAAE,OAAO,ENwe1B,GAAO;;;AMve9B;iBACiC;EAAE,OAAO,ENsgB1B,GAAO;;;AMrgBvB,kBAAkC;EAAE,OAAO,ENggB1B,GAAO;;;AM/fxB,mBAAmC;EAAE,OAAO,ENwY1B,GAAO;;;AMvYzB,eAA+B;EAAE,OAAO,EN2Y1B,GAAO;;;AM1YrB,eAA+B;EAAE,OAAO,EN4P1B,GAAO;;;AM3PrB,qBAAqC;EAAE,OAAO,ENoU1B,GAAO;;;AMnU3B,qBAAqC;EAAE,OAAO,ENitB1B,GAAO;;;AMhtB3B,sBAAsC;EAAE,OAAO,EN+sB1B,GAAO;;;AM9sB5B,oBAAoC;EAAE,OAAO,ENgtB1B,GAAO;;;AM/sB1B,iBAAiC;EAAE,OAAO,ENye1B,GAAO;;;AMxevB,kBAAkC;EAAE,OAAO,ENwB1B,GAAO;;;AMvBxB,cAA8B;EAAE,OAAO,ENymB1B,GAAO;;;AMxmBpB,eAA+B;EAAE,OAAO,ENymB1B,GAAO;;;AMxmBrB,kCAA+B;EAAE,OAAO,ENyD1B,GAAO;;;AMxDrB,mBAAmC;EAAE,OAAO,ENyD1B,GAAO;;;AMxDzB,gBAAgC;EAAE,OAAO,EN+d1B,GAAO;;;AM9dtB,iBAAiC;EAAE,OAAO,EN2E1B,GAAO;;;AM1EvB,eAA+B;EAAE,OAAO,EN0P1B,GAAO;;;AMzPrB,eAA+B;EAAE,OAAO,ENiD1B,GAAO;;;AMhDrB,iBAAiC;EAAE,OAAO,EN0V1B,GAAO;;;AMzVvB,sBAAsC;EAAE,OAAO,ENwmB1B,GAAO;;;AMvmB5B,qBAAqC;EAAE,OAAO,ENwmB1B,GAAO;;;AMvmB3B,qBAAqC;EAAE,OAAO,ENpC1B,GAAO;;;AMqC3B,uBAAuC;EAAE,OAAO,ENvC1B,GAAO;;;AMwC7B,sBAAsC;EAAE,OAAO,ENrC1B,GAAO;;;AMsC5B,wBAAwC;EAAE,OAAO,ENxC1B,GAAO;;;AMyC9B,eAA+B;EAAE,OAAO,EN+W1B,GAAO;;;AM9WrB;kBACkC;EAAE,OAAO,EN2a1B,GAAO;;;AM1axB,iBAAiC;EAAE,OAAO,ENsU1B,GAAO;;;AMrUvB,uBAAuC;EAAE,OAAO,ENkrB1B,GAAO;;;AMjrB7B;;oBAEoC;EAAE,OAAO,EN0b1B,GAAO;;;AMzb1B,iBAAiC;EAAE,OAAO,ENkb1B,GAAO;;;AMjbvB,qBAAqC;EAAE,OAAO,ENwX1B,GAAO;;;AMvX3B,iBAAiC;EAAE,OAAO,ENtD1B,GAAO;;;AMuDvB,eAA+B;EAAE,OAAO,ENmnB1B,GAAO;;;AMlnBrB;0BAC0C;EAAE,OAAO,EN+a1B,GAAO;;;AM9ahC,yBAAyC;EAAE,OAAO,EN8f1B,GAAO;;;AM7f/B,yBAAyC;EAAE,OAAO,EN+E1B,GAAO;;;AM9E/B,iBAAiC;EAAE,OAAO,ENzB1B,GAAO;;;AM0BvB,wBAAwC;EAAE,OAAO,ENmjB1B,GAAO;;;AMljB9B,wBAAwC;EAAE,OAAO,ENqL1B,GAAO;;;AMpL9B,mBAAmC;EAAE,OAAO,ENlB1B,GAAO;;;AMmBzB,eAA+B;EAAE,OAAO,ENsb1B,GAAO;;;AMrbrB,gBAAgC;EAAE,OAAO,ENga1B,GAAO;;;AM/ZtB,eAA+B;EAAE,OAAO,ENmjB1B,GAAO;;;AMljBrB,kBAAkC;EAAE,OAAO,EN+N1B,GAAO;;;AM9NxB,uBAAuC;EAAE,OAAO,ENgL1B,GAAO;;;AM/K7B,uBAAuC;EAAE,OAAO,EN4iB1B,GAAO;;;AM3iB7B,gBAAgC;EAAE,OAAO,EN+I1B,GAAO;;;AM9ItB,uBAAuC;EAAE,OAAO,ENyE1B,GAAO;;;AMxE7B,wBAAwC;EAAE,OAAO,ENyE1B,GAAO;;;AMxE9B,sBAAsC;EAAE,OAAO,ENkb1B,GAAO;;;AMjb5B,uBAAuC;EAAE,OAAO,ENuX1B,GAAO;;;AMtX7B,+FAAuC;EAAE,OAAO,EN2lB1B,GAAO;;;AM1lB7B,gGAAuC;EAAE,OAAO,EN2D1B,GAAO;;;AM1D7B,0BAA0C;EAAE,OAAO,ENyb1B,GAAO;;;AMxbhC,sBAAsC;EAAE,OAAO,EN0S1B,GAAO;;;AMzS5B,qBAAqC;EAAE,OAAO,EN0G1B,GAAO;;;AMzG3B,yBAAyC;EAAE,OAAO,ENulB1B,GAAO;;;AMtlB/B,yBAAyC;EAAE,OAAO,ENuD1B,GAAO;;;AMtD/B,cAA8B;EAAE,OAAO,ENnC1B,GAAO;;;AMoCpB,qBAAqC;EAAE,OAAO,ENnD1B,GAAO;;;AMoD3B,sBAAsC;EAAE,OAAO,ENnD1B,GAAO;;;AMoD5B,mBAAmC;EAAE,OAAO,ENnD1B,GAAO;;;AMoDzB,qBAAqC;EAAE,OAAO,ENvD1B,GAAO;;;AMwD3B;gBACgC;EAAE,OAAO,EN4d1B,GAAO;;;AM3dtB,iBAAiC;EAAE,OAAO,EN8I1B,GAAO;;;AM7IvB,mBAAmC;EAAE,OAAO,ENsF1B,GAAO;;;AMrFzB,eAA+B;EAAE,OAAO,EN+Z1B,GAAO;;;AM9ZrB,gBAAgC;EAAE,OAAO,ENoW1B,GAAO;;;AMnWtB,mBAAmC;EAAE,OAAO,ENpD1B,GAAO;;;AMqDzB,mNAA6C;EAAE,OAAO,ENuI1B,GAAO;;;AMtInC,eAA+B;EAAE,OAAO,ENkN1B,GAAO;;;AMjNrB,eAA+B;EAAE,OAAO,EN0S1B,GAAO;;;AMzSrB,kCAA+B;EAAE,OAAO,EN6K1B,GAAO;;;AM5KrB,cAA8B;EAAE,OAAO,ENyI1B,GAAO;;;AMxIpB,oBAAoC;EAAE,OAAO,ENyI1B,GAAO;;;AMxI1B;+BAC+C;EAAE,OAAO,ENiI1B,GAAO;;;AMhIrC,gBAAgC;EAAE,OAAO,EN+Y1B,GAAO;;;AM9YtB,mBAAmC;EAAE,OAAO,ENA1B,GAAO;;;AMCzB,iBAAiC;EAAE,OAAO,ENoa1B,GAAO;;;AMnavB,kBAAkC;EAAE,OAAO,ENgE1B,GAAO;;;AM/DxB,iBAAiC;EAAE,OAAO,EN6T1B,GAAO;;;AM5TvB,qBAAqC;EAAE,OAAO,ENuC1B,GAAO;;;AMtC3B,uBAAuC;EAAE,OAAO,ENmC1B,GAAO;;;AMlC7B,kBAAkC;EAAE,OAAO,EN+a1B,GAAO;;;AM9axB,wBAAwC;EAAE,OAAO,ENkd1B,GAAO;;;AMjd9B,iBAAiC;EAAE,OAAO,EN0K1B,GAAO;;;AMzKvB,sBAAsC;EAAE,OAAO,EN2K1B,GAAO;;;AM1K5B,mBAAmC;EAAE,OAAO,EN3E1B,GAAO;;;AM4EzB,mBAAmC;EAAE,OAAO,EN7E1B,GAAO;;;AM8EzB;oBACoC;EAAE,OAAO,ENlE1B,GAAO;;;AMmE1B,yBAAyC;EAAE,OAAO,EN+kB1B,GAAO;;;AM9kB/B,0BAA0C;EAAE,OAAO,EN4H1B,GAAO;;;AM3HhC,uBAAuC;EAAE,OAAO,ENT1B,GAAO;;;AMU7B,cAA8B;EAAE,OAAO,EN2Q1B,GAAO;;;AM1QpB;eAC+B;EAAE,OAAO,EN6C1B,GAAO;;;AM5CrB,mBAAmC;EAAE,OAAO,ENkD1B,GAAO;;;AMjDzB,sBAAsC;EAAE,OAAO,ENsiB1B,GAAO;;;AMriB5B,wBAAwC;EAAE,OAAO,ENoiB1B,GAAO;;;AMniB9B,oBAAoC;EAAE,OAAO,EN2e1B,GAAO;;;AM1e1B,kBAAkC;EAAE,OAAO,EN8N1B,GAAO;;;AM7NxB,mBAAmC;EAAE,OAAO,ENoc1B,GAAO;;;AMnczB,0BAA0C;EAAE,OAAO,ENuR1B,GAAO;;;AMtRhC,qBAAqC;EAAE,OAAO,EN6hB1B,GAAO;;;AM5hB3B,wBAAwC;EAAE,OAAO,ENsG1B,GAAO;;;AMrG9B,kBAAkC;EAAE,OAAO,EN8b1B,GAAO;;;AM7bxB,iBAAiC;EAAE,OAAO,ENqjB1B,GAAO;;;AMpjBvB,wBAAwC;EAAE,OAAO,ENgL1B,GAAO;;;AM/K9B,iBAAiC;EAAE,OAAO,ENukB1B,GAAO;;;AMtkBvB,kBAAkC;EAAE,OAAO,ENqQ1B,GAAO;;;AMpQxB,gBAAgC;EAAE,OAAO,ENiW1B,GAAO;;;AMhWtB,mBAAmC;EAAE,OAAO,EN2d1B,GAAO;;;AM1dzB,qBAAqC;EAAE,OAAO,ENjD1B,GAAO;;;AMkD3B,uBAAuC;EAAE,OAAO,EN+V1B,GAAO;;;AM9V7B,kBAAkC;EAAE,OAAO,ENsjB1B,GAAO;;;AMrjBxB;mBACmC;EAAE,OAAO,ENgG1B,GAAO;;;AM/FzB,sCAAiC;EAAE,OAAO,ENoK1B,GAAO;;;AMnKvB,iBAAiC;EAAE,OAAO,EN0jB1B,GAAO;;;AMzjBvB,sBAAsC;EAAE,OAAO,ENoC1B,GAAO;;;AMnC5B;cAC8B;EAAE,OAAO,EN+Y1B,GAAO;;;AM9YpB,gBAAgC;EAAE,OAAO,ENoM1B,GAAO;;;AMnMtB,mBAAmC;EAAE,OAAO,ENrD1B,GAAO;;;AMsDzB,eAA+B;EAAE,OAAO,ENhF1B,GAAO;;;AMiFrB,sBAAsC;EAAE,OAAO,ENrB1B,GAAO;;;AMsB5B,uBAAuC;EAAE,OAAO,ENoL1B,GAAO;;;AMnL7B,sBAAsC;EAAE,OAAO,ENkL1B,GAAO;;;AMjL5B,oBAAoC;EAAE,OAAO,ENmL1B,GAAO;;;AMlL1B,sBAAsC;EAAE,OAAO,EN+K1B,GAAO;;;AM9K5B,4DAA4C;EAAE,OAAO,ENrI1B,GAAO;;;AMsIlC,8DAA6C;EAAE,OAAO,ENjI1B,GAAO;;;AMkInC,0BAA0C;EAAE,OAAO,ENjI1B,GAAO;;;AMkIhC,4BAA4C;EAAE,OAAO,ENzI1B,GAAO;;;AM0IlC,gBAAgC;EAAE,OAAO,EN2J1B,GAAO;;;AM1JtB,iBAAiC;EAAE,OAAO,EN6lB1B,GAAO;;;AM5lBvB,gBAAgC;EAAE,OAAO,ENqe1B,GAAO;;;AMpetB,iBAAiC;EAAE,OAAO,ENyG1B,GAAO;;;AMxGvB,oBAAoC;EAAE,OAAO,ENzE1B,GAAO;;;AM0E1B,qBAAqC;EAAE,OAAO,ENlI1B,GAAO;;;AMmI3B;gBACgC;EAAE,OAAO,ENijB1B,GAAO;;;AMhjBtB;;iBAC+B;EAAE,OAAO,EN4O1B,GAAO;;;AM3OrB,gBAAgC;EAAE,OAAO,ENd1B,GAAO;;;AMetB,gBAAgC;EAAE,OAAO,EN0G1B,GAAO;;;AMzGtB;mBACmC;EAAE,OAAO,EN6X1B,GAAO;;;AM5XzB;kBACkC;EAAE,OAAO,EN2F1B,GAAO;;;AM1FxB,oBAAoC;EAAE,OAAO,EN6S1B,GAAO;;;AM5S1B;mBACmC;EAAE,OAAO,ENqG1B,GAAO;;;AMpGzB,iBAAiC;EAAE,OAAO,ENgb1B,GAAO;;;AM/avB;;eAE+B;EAAE,OAAO,ENlI1B,GAAO;;;AMmIrB,kBAAkC;EAAE,OAAO,ENsO1B,GAAO;;;AMrOxB,kBAAkC;EAAE,OAAO,ENoO1B,GAAO;;;AMnOxB,wBAAwC;EAAE,OAAO,EN+b1B,GAAO;;;AM9b9B,oBAAoC;EAAE,OAAO,EN2gB1B,GAAO;;;AM1gB1B,gBAAgC;EAAE,OAAO,ENuc1B,GAAO;;;AMtctB,gBAAgC;EAAE,OAAO,ENyO1B,GAAO;;;AMxOtB,gBAAgC;EAAE,OAAO,EN6f1B,GAAO;;;AM5ftB,oBAAoC;EAAE,OAAO,ENmT1B,GAAO;;;AMlT1B,2BAA2C;EAAE,OAAO,ENoT1B,GAAO;;;AMnTjC,6BAA6C;EAAE,OAAO,ENgI1B,GAAO;;;AM/HnC,sBAAsC;EAAE,OAAO,EN4H1B,GAAO;;;AM3H5B,gBAAgC;EAAE,OAAO,ENqQ1B,GAAO;;;AMpQtB,0EAAqC;EAAE,OAAO,ENpF1B,GAAO;;;AMqF3B,mBAAmC;EAAE,OAAO,EN9E1B,GAAO;;;AM+EzB,qBAAqC;EAAE,OAAO,ENrF1B,GAAO;;;AMsF3B,sBAAsC;EAAE,OAAO,ENrF1B,GAAO;;;AMsF5B,kBAAkC;EAAE,OAAO,ENhC1B,GAAO;;;AMiCxB;eAC+B;EAAE,OAAO,EN0Y1B,GAAO;;;AMzYrB;oBACoC;EAAE,OAAO,EN8Y1B,GAAO;;;AM7Y1B;mBACmC;EAAE,OAAO,EN2Y1B,GAAO;;;AM1YzB,mBAAmC;EAAE,OAAO,ENU1B,GAAO;;;AMTzB,mBAAmC;EAAE,OAAO,ENuM1B,GAAO;;;AMtMzB;eAC+B;EAAE,OAAO,ENqf1B,GAAO;;;AMpfrB;gBACgC;EAAE,OAAO,ENoF1B,GAAO;;;AMnFtB;qBACqC;EAAE,OAAO,EN+a1B,GAAO;;;AM9a3B,oBAAoC;EAAE,OAAO,EN7C1B,GAAO;;;AM8C1B,qBAAqC;EAAE,OAAO,EN1C1B,GAAO;;;AM2C3B;eAC+B;EAAE,OAAO,ENpI1B,GAAO;;;AMqIrB,kBAAkC;EAAE,OAAO,EN6W1B,GAAO;;;AM5WxB,mBAAmC;EAAE,OAAO,ENye1B,GAAO;;;AMxezB;oBACoC;EAAE,OAAO,ENrE1B,GAAO;;;AMsE1B,sBAAsC;EAAE,OAAO,ENqL1B,GAAO;;;AMpL5B,mBAAmC;EAAE,OAAO,ENG1B,GAAO;;;AMFzB,yBAAyC;EAAE,OAAO,ENnE1B,GAAO;;;AMoE/B,uBAAuC;EAAE,OAAO,ENnE1B,GAAO;;;AMoE7B,kBAAkC;EAAE,OAAO,ENif1B,GAAO;;;AMhfxB,sBAAsC;EAAE,OAAO,EN8Y1B,GAAO;;;AM7Y5B,mBAAmC;EAAE,OAAO,ENyZ1B,GAAO;;;AMxZzB,iBAAiC;EAAE,OAAO,EN9J1B,GAAO;;;AM+JvB,iBAAiC;EAAE,OAAO,ENlE1B,GAAO;;;AMmEvB,kBAAkC;EAAE,OAAO,EN1C1B,GAAO;;;AM2CxB,sBAAsC;EAAE,OAAO,EN8B1B,GAAO;;;AM7B5B,qBAAqC;EAAE,OAAO,EN1I1B,GAAO;;;AM2I3B,qBAAqC;EAAE,OAAO,ENsH1B,GAAO;;;AMrH3B,oBAAoC;EAAE,OAAO,ENrO1B,GAAO;;;AMsO1B,iBAAiC;EAAE,OAAO,EN4M1B,GAAO;;;AM3MvB,sBAAsC;EAAE,OAAO,ENU1B,GAAO;;;AMT5B,eAA+B;EAAE,OAAO,EN3K1B,GAAO;;;AM4KrB,mBAAmC;EAAE,OAAO,ENuF1B,GAAO;;;AMtFzB,sBAAsC;EAAE,OAAO,EN2Q1B,GAAO;;;AM1Q5B,4BAA4C;EAAE,OAAO,ENrO1B,GAAO;;;AMsOlC,6BAA6C;EAAE,OAAO,ENrO1B,GAAO;;;AMsOnC,0BAA0C;EAAE,OAAO,ENrO1B,GAAO;;;AMsOhC,4BAA4C;EAAE,OAAO,ENzO1B,GAAO;;;AM0OlC,qBAAqC;EAAE,OAAO,ENrO1B,GAAO;;;AMsO3B,sBAAsC;EAAE,OAAO,ENrO1B,GAAO;;;AMsO5B,mBAAmC;EAAE,OAAO,ENrO1B,GAAO;;;AMsOzB,qBAAqC;EAAE,OAAO,ENzO1B,GAAO;;;AM0O3B,kBAAkC;EAAE,OAAO,ENpD1B,GAAO;;;AMqDxB,iBAAiC;EAAE,OAAO,EN4I1B,GAAO;;;AM3IvB,iBAAiC;EAAE,OAAO,ENwY1B,GAAO;;;AMvYvB;iBACiC;EAAE,OAAO,ENuM1B,GAAO;;;AMtMvB,mBAAmC;EAAE,OAAO,ENzG1B,GAAO;;;AM0GzB,qBAAqC;EAAE,OAAO,ENyQ1B,GAAO;;;AMxQ3B,sBAAsC;EAAE,OAAO,ENyQ1B,GAAO;;;AMxQ5B,kBAAkC;EAAE,OAAO,EN+V1B,GAAO;;;AM9VxB,iBAAiC;EAAE,OAAO,EN9G1B,GAAO;;;AM+GvB;gBACgC;EAAE,OAAO,ENoR1B,GAAO;;;AMnRtB,qBAAqC;EAAE,OAAO,EN+C1B,GAAO;;;AM9C3B,mBAAmC;EAAE,OAAO,ENmB1B,GAAO;;;AMlBzB,wBAAwC;EAAE,OAAO,ENoB1B,GAAO;;;AMnB9B,kBAAkC;EAAE,OAAO,ENqU1B,GAAO;;;AMpUxB,kBAAkC;EAAE,OAAO,EN2B1B,GAAO;;;AM1BxB,gBAAgC;EAAE,OAAO,ENgL1B,GAAO;;;AM/KtB,kBAAkC;EAAE,OAAO,EN2B1B,GAAO;;;AM1BxB,qBAAqC;EAAE,OAAO,ENuH1B,GAAO;;;AMtH3B,iBAAiC;EAAE,OAAO,ENM1B,GAAO;;;AMLvB,yBAAyC;EAAE,OAAO,ENI1B,GAAO;;;AMH/B,mBAAmC;EAAE,OAAO,EN6X1B,GAAO;;;AM5XzB,eAA+B;EAAE,OAAO,ENhH1B,GAAO;;;AMiHrB;oBACoC;EAAE,OAAO,ENuQ1B,GAAO;;;AMtQ1B;;sBAEsC;EAAE,OAAO,ENsV1B,GAAO;;;AMrV5B,yBAAyC;EAAE,OAAO,ENwI1B,GAAO;;;AMvI/B,eAA+B;EAAE,OAAO,ENhG1B,GAAO;;;AMiGrB,oBAAoC;EAAE,OAAO,ENvH1B,GAAO;;;AMwH1B;uBACuC;EAAE,OAAO,ENtJ1B,GAAO;;;AMuJ7B,mBAAmC;EAAE,OAAO,ENyO1B,GAAO;;;AMxOzB,eAA+B;EAAE,OAAO,EN0F1B,GAAO;;;AMzFrB,sBAAsC;EAAE,OAAO,EN1D1B,GAAO;;;AM2D5B,sBAAsC;EAAE,OAAO,ENkW1B,GAAO;;;AMjW5B,oBAAoC;EAAE,OAAO,EN4V1B,GAAO;;;AM3V1B,iBAAiC;EAAE,OAAO,ENlE1B,GAAO;;;AMmEvB,uBAAuC;EAAE,OAAO,ENgO1B,GAAO;;;AM/N7B,qBAAqC;EAAE,OAAO,EN2J1B,GAAO;;;AM1J3B,2BAA2C;EAAE,OAAO,EN2J1B,GAAO;;;AM1JjC,iBAAiC;EAAE,OAAO,ENsR1B,GAAO;;;AMrRvB,qBAAqC;EAAE,OAAO,EN5L1B,GAAO;;;AM6L3B,4BAA4C;EAAE,OAAO,ENxB1B,GAAO;;;AMyBlC,iBAAiC;EAAE,OAAO,ENuP1B,GAAO;;;AMtPvB,iBAAiC;EAAE,OAAO,EN6I1B,GAAO;;;AM5IvB,8BAA8C;EAAE,OAAO,EN9J1B,GAAO;;;AM+JpC,+BAA+C;EAAE,OAAO,EN9J1B,GAAO;;;AM+JrC,4BAA4C;EAAE,OAAO,EN9J1B,GAAO;;;AM+JlC,8BAA8C;EAAE,OAAO,ENlK1B,GAAO;;;AMmKpC,gBAAgC;EAAE,OAAO,EN8D1B,GAAO;;;AM7DtB,eAA+B;EAAE,OAAO,ENrH1B,GAAO;;;AMsHrB,iBAAiC;EAAE,OAAO,ENvS1B,GAAO;;;AMwSvB,qBAAqC;EAAE,OAAO,EN2Z1B,GAAO;;;AM1Z3B,mBAAmC;EAAE,OAAO,ENhN1B,GAAO;;;AMiNzB,qBAAqC;EAAE,OAAO,EN7F1B,GAAO;;;AM8F3B,qBAAqC;EAAE,OAAO,EN7F1B,GAAO;;;AM8F3B,qBAAqC;EAAE,OAAO,EN+O1B,GAAO;;;AM9O3B,sBAAsC;EAAE,OAAO,ENiM1B,GAAO;;;AMhM5B,iBAAiC;EAAE,OAAO,EN6W1B,GAAO;;;AM5WvB,uBAAuC;EAAE,OAAO,EN0I1B,GAAO;;;AMzI7B,4IAAyC;EAAE,OAAO,EN0I1B,GAAO;;;AMzI/B,mBAAmC;EAAE,OAAO,ENqF1B,GAAO;;;AMpFzB,qBAAqC;EAAE,OAAO,ENmF1B,GAAO;;;AMlF3B,uBAAuC;EAAE,OAAO,ENnL1B,GAAO;;;AMoL7B,wBAAwC;EAAE,OAAO,EN0K1B,GAAO;;;AMzK9B,+BAA+C;EAAE,OAAO,ENpF1B,GAAO;;;AMqFrC,uBAAuC;EAAE,OAAO,ENwP1B,GAAO;;;AMvP7B,kBAAkC;EAAE,OAAO,ENjJ1B,GAAO;;;AMkJxB;8BAC8C;EAAE,OAAO,EN/M1B,GAAO;;;AMgNpC;4BAC4C;EAAE,OAAO,EN9M1B,GAAO;;;AM+MlC;+BAC+C;EAAE,OAAO,ENjN1B,GAAO;;;AMkNrC;cAC8B;EAAE,OAAO,ENvG1B,GAAO;;;AMwGpB,cAA8B;EAAE,OAAO,ENhC1B,GAAO;;;AMiCpB;cAC8B;EAAE,OAAO,ENqY1B,GAAO;;;AMpYpB;cAC8B;EAAE,OAAO,EN4C1B,GAAO;;;AM3CpB;;;cAG8B;EAAE,OAAO,ENgD1B,GAAO;;;AM/CpB;;cAE8B;EAAE,OAAO,ENiN1B,GAAO;;;AMhNpB;cAC8B;EAAE,OAAO,EN+C1B,GAAO;;;AM9CpB;cAC8B;EAAE,OAAO,EN3P1B,GAAO;;;AM4PpB,eAA+B;EAAE,OAAO,ENhG1B,GAAO;;;AMiGrB,oBAAoC;EAAE,OAAO,ENpF1B,GAAO;;;AMqF1B,yBAAyC;EAAE,OAAO,EN0P1B,GAAO;;;AMzP/B,0BAA0C;EAAE,OAAO,EN0P1B,GAAO;;;AMzPhC,0BAA0C;EAAE,OAAO,EN0P1B,GAAO;;;AMzPhC,2BAA2C;EAAE,OAAO,EN0P1B,GAAO;;;AMzPjC,2BAA2C;EAAE,OAAO,EN6P1B,GAAO;;;AM5PjC,4BAA4C;EAAE,OAAO,EN6P1B,GAAO;;;AM5PlC,oBAAoC;EAAE,OAAO,ENkU1B,GAAO;;;AMjU1B,sBAAsC;EAAE,OAAO,EN8T1B,GAAO;;;AM7T5B,yBAAyC;EAAE,OAAO,ENya1B,GAAO;;;AMxa/B,kBAAkC;EAAE,OAAO,ENsa1B,GAAO;;;AMraxB,eAA+B;EAAE,OAAO,EN2Z1B,GAAO;;;AM1ZrB,sBAAsC;EAAE,OAAO,EN2Z1B,GAAO;;;AM1Z5B,uBAAuC;EAAE,OAAO,ENoa1B,GAAO;;;AMna7B,kBAAkC;EAAE,OAAO,ENxJ1B,GAAO;;;AMyJxB,yBAAyC;EAAE,OAAO,EN8P1B,GAAO;;;AM7P/B,oBAAoC;EAAE,OAAO,ENgB1B,GAAO;;;AMf1B,iBAAiC;EAAE,OAAO,ENpF1B,GAAO;;;AMqFvB,cAA8B;EAAE,OAAO,EN3W1B,GAAO;;;AM4WpB,4CAAoC;EAAE,OAAO,EN/R1B,GAAO;;;AMgS1B,2BAA2C;EAAE,OAAO,EN/R1B,GAAO;;;AMgSjC,iBAAiC;EAAE,OAAO,EN+U1B,GAAO;;;AM9UvB,wBAAwC;EAAE,OAAO,EN+U1B,GAAO;;;AM9U9B,0BAA0C;EAAE,OAAO,ENgD1B,GAAO;;;AM/ChC,wBAAwC;EAAE,OAAO,ENkD1B,GAAO;;;AMjD9B,0BAA0C;EAAE,OAAO,EN+C1B,GAAO;;;AM9ChC,2BAA2C;EAAE,OAAO,EN+C1B,GAAO;;;AM9CjC,gBAAgC;EAAE,OAAO,ENjW1B,GAAO;;;AMkWtB,kBAAkC;EAAE,OAAO,ENmY1B,GAAO;;;AMlYxB,kBAAkC;EAAE,OAAO,EN7W1B,GAAO;;;AM8WxB,gBAAgC;EAAE,OAAO,ENkC1B,GAAO;;;AMjCtB,mBAAmC;EAAE,OAAO,EN5K1B,GAAO;;;AM6KzB,gBAAgC;EAAE,OAAO,ENgN1B,GAAO;;;AM/MtB,qBAAqC;EAAE,OAAO,ENxF1B,GAAO;;;AMyF3B,iBAAiC;EAAE,OAAO,EN4T1B,GAAO;;;AM3TvB,iBAAiC;EAAE,OAAO,ENtI1B,GAAO;;;AMuIvB,eAA+B;EAAE,OAAO,EN6C1B,GAAO;;;AM5CrB;mBACmC;EAAE,OAAO,EN5D1B,GAAO;;;AM6DzB,gBAAgC;EAAE,OAAO,EN8P1B,GAAO;;;AM7PtB,iBAAiC;EAAE,OAAO,ENuE1B,GAAO;;;AMtEvB,kBAAkC;EAAE,OAAO,EN9W1B,GAAO;;;AM+WxB,cAA8B;EAAE,OAAO,ENtS1B,GAAO;;;AMuSpB,aAA6B;EAAE,OAAO,ENiW1B,GAAO;;;AMhWnB,gBAAgC;EAAE,OAAO,ENuW1B,GAAO;;;AMtWtB,iBAAiC;EAAE,OAAO,EN+I1B,GAAO;;;AM9IvB,oBAAoC;EAAE,OAAO,ENkF1B,GAAO;;;AMjF1B,yBAAyC;EAAE,OAAO,EN6N1B,GAAO;;;AM5N/B,+BAA+C;EAAE,OAAO,EN/W1B,GAAO;;;AMgXrC,8BAA8C;EAAE,OAAO,ENjX1B,GAAO;;;AMkXpC;8BAC8C;EAAE,OAAO,ENzR1B,GAAO;;;AM0RpC,uBAAuC;EAAE,OAAO,ENnM1B,GAAO;;;AMoM7B,qBAAqC;EAAE,OAAO,ENiW1B,GAAO;;;AMhW3B,uBAAuC;EAAE,OAAO,ENoV1B,GAAO;;;AMnV7B;cAC8B;EAAE,OAAO,EN0S1B,GAAO;;;AMzSpB,yEAAwC;EAAE,OAAO,EN0G1B,GAAO;;;AMzG9B,wBAAwC;EAAE,OAAO,EN4M1B,GAAO;;;AM3M9B,gBAAgC;EAAE,OAAO,ENsL1B,GAAO;;;AMrLtB,0BAA0C;EAAE,OAAO,ENzL1B,GAAO;;;AM0LhC,oBAAoC;EAAE,OAAO,ENoW1B,GAAO;;;AMnW1B,iBAAiC;EAAE,OAAO,EN8D1B,GAAO;;;AM7DvB;;qBAEqC;EAAE,OAAO,EN8S1B,GAAO;;;AM7S3B;yBACyC;EAAE,OAAO,EN1F1B,GAAO;;;AM2F/B,gBAAgC;EAAE,OAAO,ENsW1B,GAAO;;;AMrWtB,iBAAiC;EAAE,OAAO,ENlG1B,GAAO;;;AMmGvB,iBAAiC;EAAE,OAAO,ENgH1B,GAAO;;;AM/GvB,wBAAwC;EAAE,OAAO,ENiH1B,GAAO;;;AMhH9B,6BAA6C;EAAE,OAAO,ENyN1B,GAAO;;;AMxNnC,sBAAsC;EAAE,OAAO,ENuN1B,GAAO;;;AMtN5B,oBAAoC;EAAE,OAAO,EN/N1B,GAAO;;;AMgO1B,eAA+B;EAAE,OAAO,EN5N1B,GAAO;;;AM6NrB,wBAAwC;EAAE,OAAO,EN2E1B,GAAO;;;AM1E9B,yBAAyC;EAAE,OAAO,ENyE1B,GAAO;;;AMxE/B,iBAAiC;EAAE,OAAO,ENvN1B,GAAO;;;AMwNvB,iBAAiC;EAAE,OAAO,ENzC1B,GAAO;;;AM0CvB,mBAAmC;EAAE,OAAO,ENpC1B,GAAO;;;AMqCzB,cAA8B;EAAE,OAAO,ENtL1B,GAAO;;;AMuLpB,mBAAmC;EAAE,OAAO,EN7U1B,GAAO;;;AM8UzB,gBAAgC;EAAE,OAAO,EN1R1B,GAAO;;;AM2RtB,cAA8B;EAAE,OAAO,ENsD1B,GAAO;;;AMrDpB,gBAAgC;EAAE,OAAO,ENmL1B,GAAO;;;AMlLtB,eAA+B;EAAE,OAAO,ENrP1B,GAAO;;;AMsPrB,gBAAgC;EAAE,OAAO,ENrP1B,GAAO;;;AMsPtB,kBAAkC;EAAE,OAAO,EN7W1B,GAAO;;;AM8WxB,yBAAyC;EAAE,OAAO,EN7W1B,GAAO;;;AM8W/B,gBAAgC;EAAE,OAAO,EN0L1B,GAAO;;;AMzLtB,uBAAuC;EAAE,OAAO,EN0L1B,GAAO;;;AMzL7B,kBAAkC;EAAE,OAAO,ENyF1B,GAAO;;;AMxFxB;cAC8B;EAAE,OAAO,ENzU1B,GAAO;;;AM0UpB;eAC+B;EAAE,OAAO,EN+M1B,GAAO;;;AM9MrB,eAA+B;EAAE,OAAO,EN4P1B,GAAO;;;AM3PrB,kBAAkC;EAAE,OAAO,ENuK1B,GAAO;;;AMtKxB,qBAAqC;EAAE,OAAO,ENtP1B,GAAO;;;AMuP3B,qBAAqC;EAAE,OAAO,ENiK1B,GAAO;;;AMhK3B,mBAAmC;EAAE,OAAO,EN9P1B,GAAO;;;AM+PzB,qBAAqC;EAAE,OAAO,EN/L1B,GAAO;;;AMgM3B,sBAAsC;EAAE,OAAO,ENxL1B,GAAO;;;AMyL5B,uBAAuC;EAAE,OAAO,ENrM1B,GAAO;;;AMsM7B,4BAA4C;EAAE,OAAO,EN/L1B,GAAO;;;AMgMlC;;uBAEuC;EAAE,OAAO,ENxM1B,GAAO;;;AMyM7B;yBACyC;EAAE,OAAO,EN9M1B,GAAO;;;AM+M/B;uBACuC;EAAE,OAAO,EN/M1B,GAAO;;;AMgN7B;uBACuC;EAAE,OAAO,ENpM1B,GAAO;;;AMqM7B,sBAAsC;EAAE,OAAO,ENjN1B,GAAO;;;AMkN5B,eAA+B;EAAE,OAAO,ENuR1B,GAAO;;;AMtRrB,kBAAkC;EAAE,OAAO,EN5S1B,GAAO;;;AM6SxB,mBAAmC;EAAE,OAAO,EN9E1B,GAAO;;;AM+EzB;;;;oBAIoC;EAAE,OAAO,ENnE1B,GAAO;;;AMoE1B,yBAAyC;EAAE,OAAO,EN/T1B,GAAO;;;AMgU/B;;gBAEgC;EAAE,OAAO,ENqD1B,GAAO;;;AMpDtB;iBACiC;EAAE,OAAO,ENnQ1B,GAAO;;;AMoQvB,qBAAqC;EAAE,OAAO,ENzK1B,GAAO;;;AM0K3B,cAA8B;EAAE,OAAO,EN3K1B,GAAO;;;AM4KpB;;sBAEsC;EAAE,OAAO,ENxJ1B,GAAO;;;AMyJ5B,wBAAwC;EAAE,OAAO,EN2K1B,GAAO;;;AM1K9B,aAA6B;EAAE,OAAO,ENiC1B,GAAO;;;AMhCnB;iBACiC;EAAE,OAAO,EN0Q1B,GAAO;;;AMzQvB;sBACsC;EAAE,OAAO,ENV1B,GAAO;;;AMW5B;wBACwC;EAAE,OAAO,ENX1B,GAAO;;;AMY9B,kBAAkC;EAAE,OAAO,EN1I1B,GAAO;;;AM2IxB,sBAAsC;EAAE,OAAO,ENlV1B,GAAO;;;AMmV5B,iBAAiC;EAAE,OAAO,ENjJ1B,GAAO;;;AMkJvB,oBAAoC;EAAE,OAAO,ENb1B,GAAO;;;AMc1B,kBAAkC;EAAE,OAAO,EN+F1B,GAAO;;;AM9FxB,oBAAoC;EAAE,OAAO,ENuE1B,GAAO;;;AMtE1B,2BAA2C;EAAE,OAAO,ENuE1B,GAAO;;;AMtEjC,eAA+B;EAAE,OAAO,ENzZ1B,GAAO;;;AM0ZrB;mBACmC;EAAE,OAAO,EN5M1B,GAAO;;;AM6MzB,cAA8B;EAAE,OAAO,EN0M1B,GAAO;;;AMzMpB,qBAAqC;EAAE,OAAO,ENxa1B,GAAO;;;AMya3B,eAA+B;EAAE,OAAO,ENI1B,GAAO;;;AMHrB,qBAAqC;EAAE,OAAO,ENuF1B,GAAO;;;AMtF3B,iBAAiC;EAAE,OAAO,EN2M1B,GAAO;;;AM1MvB,eAA+B;EAAE,OAAO,EN+Q1B,GAAO;;;AM9QrB,sBAAsC;EAAE,OAAO,ENzC1B,GAAO;;;AM0C5B,eAA+B;EAAE,OAAO,ENwP1B,GAAO;;;AMvPrB,qBAAqC;EAAE,OAAO,ENrZ1B,GAAO;;;AMsZ3B,iBAAiC;EAAE,OAAO,ENvB1B,GAAO;;;AMwBvB,wBAAwC;EAAE,OAAO,EN3L1B,GAAO;;;AM4L9B,kBAAkC;EAAE,OAAO,EN5X1B,GAAO;;;AM6XxB,wBAAwC;EAAE,OAAO,ENhY1B,GAAO;;;AMiY9B,sBAAsC;EAAE,OAAO,ENnY1B,GAAO;;;AMoY5B,kBAAkC;EAAE,OAAO,ENtY1B,GAAO;;;AMuYxB,oBAAoC;EAAE,OAAO,ENlY1B,GAAO;;;AMmY1B,oBAAoC;EAAE,OAAO,ENlY1B,GAAO;;;AMmY1B,qBAAqC;EAAE,OAAO,EN3b1B,GAAO;;;AM4b3B,uBAAuC;EAAE,OAAO,EN3b1B,GAAO;;;AM4b7B,gBAAgC;EAAE,OAAO,EN+K1B,GAAO;;;AM9KtB,oBAAoC;EAAE,OAAO,ENnV1B,GAAO;;;AMoV1B,aAA6B;EAAE,OAAO,EN9d1B,GAAO;;;AM+dnB,qBAAqC;EAAE,OAAO,EN5R1B,GAAO;;;AM6R3B,sBAAsC;EAAE,OAAO,EN/C1B,GAAO;;;AMgD5B,wBAAwC;EAAE,OAAO,EN9b1B,GAAO;;;AM+b9B,qBAAqC;EAAE,OAAO,ENtf1B,GAAO;;;AMuf3B,oBAAoC;EAAE,OAAO,EN/B1B,GAAO;;;AMgC1B,qBAAqC;EAAE,OAAO,ENzH1B,GAAO;;;AM0H3B,iBAAiC;EAAE,OAAO,ENvI1B,GAAO;;;AMwIvB,wBAAwC;EAAE,OAAO,ENvI1B,GAAO;;;AMwI9B,qBAAqC;EAAE,OAAO,EN4J1B,GAAO;;;AM3J3B,oBAAoC;EAAE,OAAO,EN4J1B,GAAO;;;AM3J1B,kBAAkC;EAAE,OAAO,ENxc1B,GAAO;;;AMycxB,cAA8B;EAAE,OAAO,ENjb1B,GAAO;;;AMkbpB,kBAAkC;EAAE,OAAO,ENvJ1B,GAAO;;;AMwJxB,oBAAoC;EAAE,OAAO,EN3gB1B,GAAO;;;AM4gB1B,aAA6B;EAAE,OAAO,EN7Z1B,GAAO;;;AM8ZnB;;cAE8B;EAAE,OAAO,ENzK1B,GAAO;;;AM0KpB,mBAAmC;EAAE,OAAO,ENpG1B,GAAO;;;AMqGzB,qBAAqC;EAAE,OAAO,ENxb1B,GAAO;;;AMyb3B,yBAAyC;EAAE,OAAO,EN5W1B,GAAO;;;AM6W/B,mBAAmC;EAAE,OAAO,EN9V1B,GAAO;;;AM+VzB,mBAAmC;EAAE,OAAO,EN9P1B,GAAO;;;AM+PzB,kBAAkC;EAAE,OAAO,ENrJ1B,GAAO;;;AMsJxB,iBAAiC;EAAE,OAAO,ENe1B,GAAO;;;AMdvB,uBAAuC;EAAE,OAAO,EN2B1B,GAAO;;;AM1B7B,sBAAsC;EAAE,OAAO,ENoC1B,GAAO;;;AMnC5B,mBAAmC;EAAE,OAAO,ENqC1B,GAAO;;;AMpCzB,oBAAoC;EAAE,OAAO,EN5a1B,GAAO;;;AM6a1B,0BAA0C;EAAE,OAAO,EN9a1B,GAAO;;;AM+ahC,kBAAkC;EAAE,OAAO,EN/V1B,GAAO;;;AMgWxB,eAA+B;EAAE,OAAO,ENoB1B,GAAO;;;AMnBrB,sBAAsC;EAAE,OAAO,EN8K1B,GAAO;;;AM7K5B,qBAAqC;EAAE,OAAO,EN/F1B,GAAO;;;AMgG3B,sBAAsC;EAAE,OAAO,EN6E1B,GAAO;;;AM5E5B,oBAAoC;EAAE,OAAO,EN9M1B,GAAO;;;AM+M1B,gBAAgC;EAAE,OAAO,EN+K1B,GAAO;;;AM9KtB,eAA+B;EAAE,OAAO,EN7H1B,GAAO;;;AM8HrB,kBAAkC;EAAE,OAAO,ENnH1B,GAAO;;;AMoHxB;sBACsC;EAAE,OAAO,ENkI1B,GAAO;;;AMjI5B,0BAA0C;EAAE,OAAO,ENkI1B,GAAO;;;AMjIhC,uBAAuC;EAAE,OAAO,EN0K1B,GAAO;;;AMzK7B,sBAAsC;EAAE,OAAO,ENlI1B,GAAO;;;AMmI5B,qBAAqC;EAAE,OAAO,ENyK1B,GAAO;;;AMxK3B,sBAAsC;EAAE,OAAO,ENnI1B,GAAO;;;AMoI5B,wBAAwC;EAAE,OAAO,ENlI1B,GAAO;;;AMmI9B,wBAAwC;EAAE,OAAO,ENpI1B,GAAO;;;AMqI9B,iBAAiC;EAAE,OAAO,EN1G1B,GAAO;;;AM2GvB,qBAAqC;EAAE,OAAO,EN7Q1B,GAAO;;;AM8Q3B,4BAA4C;EAAE,OAAO,EN1U1B,GAAO;;;AM2UlC,sBAAsC;EAAE,OAAO,ENzE1B,GAAO;;;AM0E5B,mBAAmC;EAAE,OAAO,ENkL1B,GAAO;;;AMjLzB,iBAAiC;EAAE,OAAO,ENX1B,GAAO;;;AMYvB,oBAAoC;EAAE,OAAO,ENuJ1B,GAAO;;;AMtJ1B,qBAAqC;EAAE,OAAO,ENwJ1B,GAAO;;;AMvJ3B;cAC8B;EAAE,OAAO,EN/f1B,GAAO;;;AMggBpB,kBAAkC;EAAE,OAAO,EN4J1B,GAAO;;;AM3JxB,gBAAgC;EAAE,OAAO,EN8G1B,GAAO;;;AM7GtB,iBAAiC;EAAE,OAAO,ENwD1B,GAAO;;;AMvDvB,iBAAiC;EAAE,OAAO,EN9I1B,GAAO;;;AM+IvB;uBACuC;EAAE,OAAO,EN0L1B,GAAO;;;AMzL7B,wBAAwC;EAAE,OAAO,ENjH1B,GAAO;;;AMkH9B,mBAAmC;EAAE,OAAO,ENrH1B,GAAO;;;AMsHzB,uBAAuC;EAAE,OAAO,ENnW1B,GAAO;;;AMoW7B;;uBAEuC;EAAE,OAAO,EN/gB1B,GAAO;;;AMghB7B;iCACiD;EAAE,OAAO,EN9gB1B,GAAO;;;AM+gBvC;uBACuC;EAAE,OAAO,ENlhB1B,GAAO;;;AMmhB7B;0BAC0C;EAAE,OAAO,ENnhB1B,GAAO;;;AMohBhC;wBACwC;EAAE,OAAO,ENxhB1B,GAAO;;;AMyhB9B,wBAAwC;EAAE,OAAO,EN3I1B,GAAO;;;AM4I9B,mBAAmC;EAAE,OAAO,EN3O1B,GAAO;;;AM4OzB,uBAAuC;EAAE,OAAO,ENxI1B,GAAO;;;AMyI7B,yBAAyC;EAAE,OAAO,ENxI1B,GAAO;;;AMyI/B,sBAAsC;EAAE,OAAO,ENwB1B,GAAO;;;AMvB5B,wBAAwC;EAAE,OAAO,ENwB1B,GAAO;;;AMvB9B,iBAAiC;EAAE,OAAO,EN/d1B,GAAO;;;AMgevB,yBAAyC;EAAE,OAAO,ENle1B,GAAO;;;AMme/B,gBAAgC;EAAE,OAAO,ENpc1B,GAAO;;;AMqctB,wBAAwC;EAAE,OAAO,ENljB1B,GAAO;;;AMmjB9B,sBAAsC;EAAE,OAAO,ENxP1B,GAAO;;;AMyP5B;0BAC0C;EAAE,OAAO,ENzP1B,GAAO;;;AM0PhC;yBACyC;EAAE,OAAO,EN7P1B,GAAO;;;AM8P/B;wBACwC;EAAE,OAAO,ENhQ1B,GAAO;;;AMiQ9B,oBAAoC;EAAE,OAAO,ENrQ1B,GAAO;;;AMsQ1B;sBACsC;EAAE,OAAO,ENxR1B,GAAO;;;AMyR5B;uBACuC;EAAE,OAAO,EN7R1B,GAAO;;;AM8R7B,0BAA0C;EAAE,OAAO,EN1R1B,GAAO;;;AM2RhC,wBAAwC;EAAE,OAAO,ENpS1B,GAAO;;;AMqS9B,uBAAuC;EAAE,OAAO,EN3R1B,GAAO;;;AM4R7B,yBAAyC;EAAE,OAAO,EN/R1B,GAAO;;;AMgS/B,uBAAuC;EAAE,OAAO,ENjS1B,GAAO;;;AMkS7B,oBAAoC;EAAE,OAAO,EN+D1B,GAAO;;;AM9D1B,qBAAqC;EAAE,OAAO,EN/F1B,GAAO;;;AMgG3B,2BAA2C;EAAE,OAAO,EN/b1B,GAAO;;;AMgcjC,aAA6B;EAAE,OAAO,ENtU1B,GAAO;;;AMuUnB,oBAAoC;EAAE,OAAO,ENtU1B,GAAO;;;AMuU1B,sBAAsC;EAAE,OAAO,ENkE1B,GAAO;;;AMjE5B,wBAAwC;EAAE,OAAO,ENrK1B,GAAO;;;AMsK9B,+BAA+C;EAAE,OAAO,ENrK1B,GAAO;;;AMsKrC,qBAAqC;EAAE,OAAO,EN5U1B,GAAO;;;AM6U3B,sBAAsC;EAAE,OAAO,ENwH1B,GAAO;;;AMvH5B,iBAAiC;EAAE,OAAO,ENnF1B,GAAO;;;AMoFvB,iBAAiC;EAAE,OAAO,ENze1B,GAAO;;;AM0evB,kBAAkC;EAAE,OAAO,EN9W1B,GAAO;;;AM+WxB,gBAAgC;EAAE,OAAO,ENxK1B,GAAO;;;AMyKtB,4BAA4C;EAAE,OAAO,ENpQ1B,GAAO;;;AMqQlC;qBACqC;EAAE,OAAO,ENS1B,GAAO;;;AMR3B,iBAAiC;EAAE,OAAO,ENjd1B,GAAO;;;AMkdvB,gBAAgC;EAAE,OAAO,ENzoB1B,GAAO;;;AM0oBtB,iBAAiC;EAAE,OAAO,EN/nB1B,GAAO;;;AMgoBvB,0BAA0C;EAAE,OAAO,EN3hB1B,GAAO;;;AM4hBhC,2BAA2C;EAAE,OAAO,EN9hB1B,GAAO;;;AM+hBjC,2BAA2C;EAAE,OAAO,EN5hB1B,GAAO;;;AM6hBjC,2BAA2C;EAAE,OAAO,ENjiB1B,GAAO;;;AMkiBjC,mBAAmC;EAAE,OAAO,ENpR1B,GAAO;;;AMqRzB,kBAAkC;EAAE,OAAO,EN5N1B,GAAO;;;AM6NxB,oBAAoC;EAAE,OAAO,EN5N1B,GAAO;;;AM6N1B,gBAAgC;EAAE,OAAO,EN/N1B,GAAO;;;AMgOtB,cAA8B;EAAE,OAAO,ENlO1B,GAAO;;;AMmOpB,qBAAqC;EAAE,OAAO,ENpe1B,GAAO;;;AMqe3B,uBAAuC;EAAE,OAAO,ENpe1B,GAAO;;;AMqe7B,gBAAgC;EAAE,OAAO,ENtS1B,GAAO;;;AMuStB,gBAAgC;EAAE,OAAO,ENiF1B,GAAO;;;AMhFtB,oBAAoC;EAAE,OAAO,ENlkB1B,GAAO;;;AMmkB1B,oBAAoC;EAAE,OAAO,ENrX1B,GAAO;;;AMsX1B,uBAAuC;EAAE,OAAO,ENpI1B,GAAO;;;AMqI7B,eAA+B;EAAE,OAAO,ENpc1B,GAAO;;;AMqcrB,0BAA0C;EAAE,OAAO,ENhe1B,GAAO;;;AMiehC,mBAAmC;EAAE,OAAO,ENpf1B,GAAO;;;AMqfzB,eAA+B;EAAE,OAAO,ENlN1B,GAAO;;;AMmNrB,uBAAuC;EAAE,OAAO,EN1X1B,GAAO;;;AM2X7B,cAA8B;EAAE,OAAO,ENoD1B,GAAO;;;AMnDpB,uBAAuC;EAAE,OAAO,EN3J1B,GAAO;;;AM4J7B,mBAAmC;EAAE,OAAO,ENzN1B,GAAO;;;AM0NzB,iBAAiC;EAAE,OAAO,ENlH1B,GAAO;;;AMmHvB,uBAAuC;EAAE,OAAO,EN7L1B,GAAO;;;AM8L7B,yBAAyC;EAAE,OAAO,EN7L1B,GAAO;;;AM8L/B,sBAAsC;EAAE,OAAO,EN3C1B,GAAO;;;AM4C5B,wBAAwC;EAAE,OAAO,EN3C1B,GAAO;;;AM4C9B,uBAAuC;EAAE,OAAO,ENrG1B,GAAO;;;AMsG7B,0BAA0C;EAAE,OAAO,ENrG1B,GAAO;;;AMsGhC,kBAAkC;EAAE,OAAO,EN7U1B,GAAO;;;AM8UxB,oBAAoC;EAAE,OAAO,ENnlB1B,GAAO;;;AMolB1B,sBAAsC;EAAE,OAAO,ENnlB1B,GAAO;;;AMolB5B,kBAAkC;EAAE,OAAO,EN/L1B,GAAO;;;AMgMxB,sCAAiC;EAAE,OAAO,ENlX1B,GAAO;;;AMmXvB,qBAAqC;EAAE,OAAO,ENkF1B,GAAO;;;AMjF3B,kBAAkC;EAAE,OAAO,ENmF1B,GAAO;;;AMlFxB,iBAAiC;EAAE,OAAO,EN9c1B,GAAO;;;AM+cvB,2BAA2C;EAAE,OAAO,EN2B1B,GAAO;;;AM1BjC,yBAAyC;EAAE,OAAO,ENmE1B,GAAO;;;AMlE/B,4BAA4C;EAAE,OAAO,ENxK1B,GAAO;;;AMyKlC,gBAAgC;EAAE,OAAO,EN9lB1B,GAAO;;;AM+lBtB,4BAA4C;EAAE,OAAO,ENtoB1B,GAAO;;;AMuoBlC,+BAA+C;EAAE,OAAO,ENqD1B,GAAO;;;AMpDrC,kBAAkC;EAAE,OAAO,ENxlB1B,GAAO;;;AMylBxB,sCAAsD;EAAE,OAAO,EN5oB1B,GAAO;;;AM6oB5C;8CAC8D;EAAE,OAAO,EN9qB1B,GAAO;;;AM+qBpD;;eAE+B;EAAE,OAAO,ENvf1B,GAAO;;;AMwfrB,gBAAgC;EAAE,OAAO,ENhY1B,GAAO;;;AMiYtB,kBAAkC;EAAE,OAAO,ENhY1B,GAAO;;;AMiYxB;wBACwC;EAAE,OAAO,EN1H1B,GAAO;;;AM2H9B,qBAAqC;EAAE,OAAO,ENzR1B,GAAO;;;AM0R3B,iBAAiC;EAAE,OAAO,ENiC1B,GAAO;;;AMhCvB,wBAAwC;EAAE,OAAO,ENiC1B,GAAO;;;AMhC9B,mBAAmC;EAAE,OAAO,ENlH1B,GAAO;;;AMmHzB,yBAAyC;EAAE,OAAO,ENlH1B,GAAO;;;AMmH/B,0BAA0C;EAAE,OAAO,ENlH1B,GAAO;;;AMmHhC,qBAAqC;EAAE,OAAO,ENrN1B,GAAO;;;AMsN3B,sBAAsC;EAAE,OAAO,ENpb1B,GAAO;;;AMqb5B,gBAAgC;EAAE,OAAO,ENmE1B,GAAO;;;AMlEtB,oBAAoC;EAAE,OAAO,ENpD1B,GAAO;;;AMqD1B;+BAC+C;EAAE,OAAO,ENzY1B,GAAO;;;AM0YrC;uBACuC;EAAE,OAAO,EN7a1B,GAAO;;;AM8a7B,sBAAsC;EAAE,OAAO,ENtX1B,GAAO;;;AMuX5B,wBAAwC;EAAE,OAAO,ENlf1B,GAAO;;;AMmf9B,0BAA0C;EAAE,OAAO,ENlf1B,GAAO;;;AMmfhC,iBAAiC;EAAE,OAAO,ENtT1B,GAAO;;;AMuTvB,uBAAuC;EAAE,OAAO,ENptB1B,GAAO;;;AMqtB7B,yBAAyC;EAAE,OAAO,ENptB1B,GAAO;;;AMqtB/B;uBACuC;EAAE,OAAO,ENrtB1B,GAAO;;;AMstB7B;yBACyC;EAAE,OAAO,ENttB1B,GAAO;;;AMutB/B,sBAAsC;EAAE,OAAO,ENJ1B,GAAO;;;AMK5B,wBAAwC;EAAE,OAAO,ENJ1B,GAAO;;;AMK9B,iBAAiC;EAAE,OAAO,ENH1B,GAAO;;;AMIvB,mBAAmC;EAAE,OAAO,EN3W1B,GAAO;;;AM4WzB;kBACkC;EAAE,OAAO,EN5W1B,GAAO;;;AM6WxB;oBACoC;EAAE,OAAO,EN7W1B,GAAO;;;AM8W1B,gBAAgC;EAAE,OAAO,ENtN1B,GAAO;;;AMuNtB,yBAAyC;EAAE,OAAO,EN3b1B,GAAO;;;AM4b/B,mBAAmC;EAAE,OAAO,ENtF1B,GAAO;;;AMuFzB;;2BAE2C;EAAE,OAAO,ENxE1B,GAAO;;;AMyEjC;qCACqD;EAAE,OAAO,ENvE1B,GAAO;;;AMwE3C;2BAC2C;EAAE,OAAO,EN3E1B,GAAO;;;AM4EjC;8BAC8C;EAAE,OAAO,EN5E1B,GAAO;;;AM6EpC;4BAC4C;EAAE,OAAO,ENjF1B,GAAO;;;AMkFlC,iBAAiC;EAAE,OAAO,EN3K1B,GAAO;;;AM4KvB;;eAE+B;EAAE,OAAO,ENzrB1B,GAAO;;;AM0rBrB,kBAAkC;EAAE,OAAO,ENlP1B,GAAO;;;AMmPxB,0BAA0C;EAAE,OAAO,ENK1B,GAAO;;;AMJhC,0BAA0C;EAAE,OAAO,ENK1B,GAAO;;;AMJhC,yBAAyC;EAAE,OAAO,ENK1B,GAAO;;;AMJ/B;uBACuC;EAAE,OAAO,END1B,GAAO;;;AME7B;yBACyC;EAAE,OAAO,ENF1B,GAAO;;;AMG/B,mBAAmC;EAAE,OAAO,ENxsB1B,GAAO;;;AMysBzB,eAA+B;EAAE,OAAO,ENpb1B,GAAO;;;AMqbrB,eAA+B;EAAE,OAAO,EN1hB1B,GAAO;;;AM2hBrB,eAA+B;EAAE,OAAO,ENxY1B,GAAO;;;AMyYrB,kBAAkC;EAAE,OAAO,EN/O1B,GAAO;;;AMgPxB,kBAAkC;EAAE,OAAO,ENziB1B,GAAO;;;AM0iBxB,oBAAoC;EAAE,OAAO,ENjU1B,GAAO;;;AMkU1B,sBAAsC;EAAE,OAAO,EN7K1B,GAAO;;;AM8K5B,sBAAsC;EAAE,OAAO,ENhI1B,GAAO;;;AMiI5B,qBAAqC;EAAE,OAAO,ENJ1B,GAAO;;;AMK3B,iBAAiC;EAAE,OAAO,ENxU1B,GAAO;;;AOzcvB,QAAS;EH8BP,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,GAAG;EACV,MAAM,EAAE,GAAG;EACX,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,IAAI;EACZ,QAAQ,EAAE,MAAM;EAChB,IAAI,EAAE,gBAAa;EACnB,MAAM,EAAE,CAAC;;;AAUT,mDACQ;EACN,QAAQ,EAAE,MAAM;EAChB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,MAAM,EAAE,CAAC;EACT,QAAQ,EAAE,OAAO;EACjB,IAAI,EAAE,IAAI;;;AIvDd,4xBAAK;EACH,WAAW,EAAE,OAAO;;AACpB,+6BAAQ;EACN,WAAW,EC+BuB,aAAa;ED9B/C,OAAO,EAAE,YAAY;EACrB,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,MAAM;EACnB,WAAW,EAAE,CAAC;EACd,eAAe,EAAE,OAAO;;;AAM5B,28BAAkB;EAChB,OAAO,EAAE,YAAY;EACrB,eAAe,EAAE,OAAO;;;AAGxB,syEAAgB;EACd,OAAO,EAAE,MAAM;;AACf,8zEAAuB;EACrB,WAAW,EAAE,KAAI;;AACnB,0wEAAsB;EACpB,OAAO,EAAE,YAAY;;;AAE3B,wjBAA2B;EACzB,OAAO,EAAE,GAAE;EjBpBL,kBAAoB,EAAE,qBAAM;EAK5B,eAAiB,EAAE,qBAAM;EAezB,UAAY,EAAE,qBAAM;;;AiBE5B,4oBAAiC;EAC/B,OAAO,EAAE,CAAC;;;AAGV,4uCAAuB;EACrB,SAAS,EAAE,IAAI;EACf,cAAc,EAAE,IAAI;;;AEpBxB,+RAAS;EACP,OAAO,EAAE,IAAqB;EAC9B,WAAW,EDayB,IAAI;ECZxC,aAAa,EDYuB,IAAI;ECXxC,UAAU,EAAE,OAAmB;;;AAEjC,+CAAe;EACb,KAAK,ECe+B,IAAM;EDd1C,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,KAAK;EACd,KAAK,ECY+B,IAAM;EDX1C,UAAU,EAAE,OAAkB;EAC9B,MAAM,EAAE,KAAsB;EAC9B,OAAO,EAAE,QAA2C;EACpD,aAAa,EAAE,IAAqB;;;AAEtC,+cAAyB;EACvB,UAAU,EAAE,OAAkB;;AAC9B,i6CAAe;EACb,UAAU,EAAE,OAAiB;;;AACjC,wbAA0B;EACxB,UAAU,EAAE,OAAmB;;AAC/B,o3CAAe;EACb,UAAU,EAAE,OAAoB;;;AAEpC,ybAAuB;EACrB,UAAU,EAAE,OAAmB;;AAC/B,m3CAAe;EACb,UAAU,EAAE,OAAkB;;;AAElC,ycAA0B;EACxB,UAAU,EAAE,OAAuB;;AACnC,s5CAAe;EACb,UAAU,EAAE,OAAqB;;;AAErC,4fAA0B;EACxB,UAAU,ECF0B,OAAmB;;ADGvD,4/CAAe;EACb,KAAK,ECpB6B,OAAW;EDqB7C,UAAU,ECHwB,OAAmB;;ADIvD,shBAAC;EACC,KAAK,ECb6B,OAAK;;;ADe3C,wcAAsB;EACpB,aAAa,EAAE,CAAC;;;AAsBlB,kBAAkB;EAChB,QAAQ,EAAE,KAAK;EACf,MAAM,EAAE,GAAG;EACX,IAAI,EAAE,CAAC;EACP,OAAO,EDG6B,GAAG;;ACFvC,qBAAE;EACA,OAAO,EAAE,KAAK;EACd,KAAK,EDT6B,KAAK;ECUvC,UAAU,EAAE,WAAW;EACvB,KAAK,ECrD6B,IAAM;EDsDxC,UAAU,EAAE,MAAM;EAClB,UAAU,EAAE,8BAA0B;EACtC,OAAO,EAAE,MAAmB;EAC5B,SAAS,EAAE,GAAG;EACd,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,CAAC;EACT,WAAW,EAAE,IAAI;EACjB,QAAQ,EAAE,MAAM;EnB3FZ,kBAAoB,EAAE,gBAAM;EAK5B,eAAiB,EAAE,gBAAM;EAezB,UAAY,EAAE,gBAAM;;AmByExB,0CAAsB;EACpB,UAAU,EC5FsB,OAAM;;AD6FxC,uCAAmB;EACjB,UAAU,EC5DsB,OAAK;;AD6DvC,0CAAsB;EACpB,UAAU,EDnFsB,OAAO;;ACoFzC,yCAAqB;EACnB,UAAU,EDtEsB,OAAI;;ACuEtC,wBAAI;EACF,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,IAAI;;;AEhFd,oCAAsB;EFmFxB,kBAAkB;IAChB,MAAM,EAAE,IAAI;IACZ,GAAG,EAAE,CAAC;IACN,KAAK,EAAE,IAAI;;EACX,qBAAE;IACA,KAAK,EAAE,IAAI;;;AG3FjB,MAAM;EACJ,SAAS,EAAE,IAAI;EACf,MAAM,EAAE,CAAC;EACT,cAAc,EAAE,QAAQ;EACxB,eAAe,EAAE,MAAM;EACvB,MAAM,EAAE,OAAO;EACf,WAAW,EAAE,MAAM;EACnB,kBAAkB,EAAE,MAAM;EAC1B,SAAS,EAAE,OAAO;;;AACpB,iDAAiD;EAC/C,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;;;AACZ,gBAAgB;EACd,MAAM,EAAE,OAAO;;;AAEjB,IAAI;;EAEF,OAAO,EAAE,YAAY;EACrB,aAAa,EAAE,GAAG;EAClB,WAAW,EAAE,MAAM;EACnB,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,MAAM;EAClB,MAAM,EAAE,OAAO;EACf,SAAS,EAAE,IAAI;EACf,OAAO,EAAE,iBAA6F;EACtG,KAAK,EFf+B,IAAM;EEgB1C,MAAM,EAAE,4BAAyB;EACjC,gBAAgB,EF7CoB,OAAM;EE8C1C,eAAe,EAAE,IAAI;EACrB,WAAW,EAAE,MAAM;EACnB,WAAW,EFDyB,2DAA2D;EEE/F,UAAU,EAAE,0FAAqF;EACjG,YAAY,EAAE,KAAK;EACnB,cAAc,EAAE,MAAM;EACtB,QAAQ,EAAE,MAAM;EAChB,IAAI,EAAE,CAAC;EACP,iBAAiB,EAAE,IAAI;EtBxDjB,mBAAoB,EsByDb,IAAI;EtBpDX,gBAAiB,EsBoDV,IAAI;EtB/CX,eAAgB,EsB+CT,IAAI;EtBrCX,WAAY,EsBqCL,IAAI;EtBzDX,kBAAoB,EAAE,eAAM;EAK5B,eAAiB,EAAE,eAAM;EAezB,UAAY,EAAE,eAAM;;;AsByC5B,UAAU;EACR,UAAU,EAAE,OAAwB;EACpC,KAAK,EFjC+B,IAAM;;;AEoC1C,UAAO;EACL,UAAU,EAAE,OAAqC;EACjD,KAAK,EFtC6B,IAAM;;AEuC1C,UAAO;EACL,UAAU,EAAE,OAAqC;EACjD,OAAO,EAAE,CAAC;;AACZ,WAAQ;EACN,UAAU,EAAE,oFAA+E;EAC3F,OAAO,EAAE,iBAA6F;;AACxG,YAAS;EACP,KAAK,EF9C6B,IAAM;;AE+C1C,aAAU;EACR,gBAAgB,EAAE,IAAI;EACtB,MAAM,EAAE,2DAA2D;EACnE,MAAM,EAAE,iBAAmB;EAC3B,OAAO,EAAE,GAAG;EACZ,MAAM,EAAE,WAAW;EACnB,UAAU,EAAE,IAAI;;;AAEpB,aAAa;EACX,gBAAgB,EAAE,IAAI;EACtB,MAAM,EAAE,2DAA2D;EACnE,MAAM,EAAE,iBAAmB;EAC3B,OAAO,EAAE,GAAG;EACZ,MAAM,EAAE,WAAW;EACnB,UAAU,EAAE,IAAI;;AAChB,8DAA0B;EACxB,gBAAgB,EAAE,IAAI;EACtB,MAAM,EAAE,2DAA2D;EACnE,MAAM,EAAE,iBAAmB;EAC3B,OAAO,EAAE,GAAI;EACb,MAAM,EAAE,WAAW;EACnB,UAAU,EAAE,IAAI;;;AAGpB,sBAAsB;EACpB,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,CAAC;;;AAEX,UAAU;EACR,SAAS,EAAE,GAAG;;;AAEhB,SAAS;EACP,gBAAgB,EAAE,kBAAgB;;AAClC,eAAO;EACL,gBAAgB,EAAE,kBAA6B;;;AAEnD,YAAY;EACV,gBAAgB,EAAE,kBAA2C;EAC7D,KAAK,EAAE,kBAAsB;;AAC7B,kBAAO;EACL,gBAAgB,EAAE,kBAAuD;EACzE,KAAK,EF5F6B,OAAW;;AE6F/C,oBAAS;EACP,KAAK,EAAE,kBAAsB;;;AAEjC,YAAY;EACV,gBAAgB,EAAE,kBAAiB;;AACnC,kBAAO;EACL,gBAAgB,EAAE,kBAA6B;;;AAEnD,WAAW;EACT,gBAAgB,EAAE,kBAAe;;AACjC,iBAAO;EACL,gBAAgB,EAAE,kBAA4B;;;AAElD,YAAY;EACV,gBAAgB,EAAE,kBAAkB;;AACpC,kBAAO;EACL,gBAAgB,EAAE,kBAA+B;;;AACrD,WAAW;EACT,gBAAgB,EJvIoB,IAAI;;AIwIxC,iBAAO;EACL,gBAAgB,EAAE,kBAAoC;;;AAE1D,SAAS;EACP,gBAAgB,EAAE,sBAAsB;EACxC,KAAK,EF3G+B,OAAK;EE4GzC,UAAU,EAAE,IAAI;EAChB,YAAY,EAAE,sBAAsB;;AACpC,eAAO;EACL,gBAAgB,EAAE,sBAAsB;EACxC,KAAK,EAAE,kBAAoC;EAC3C,UAAU,EAAE,IAAI;;AAClB,gBAAQ;EACN,gBAAgB,EAAE,sBAAsB;EACxC,KAAK,EAAE,kBAAoC;EAC3C,UAAU,EAAE,IAAI;;AAClB,iBAAS;EACP,KAAK,EFtH6B,OAAO;;;AEwH7C,oCAAoC;EAClC,cAAc,EAAE,MAAM;;;AAExB,aAAa;EACX,aAAa,EJ1IuB,IAAI;EhBuExC,KAAK,EAAE,CAAC;;AACR,yCAAS;EAEP,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,EAAE;;AACb,mBAAO;EACL,KAAK,EAAE,IAAI;;;AqB3Ff,YAAY;EACV,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,YAAY;;;AAIvB,qCAAqC;EACnC,OAAO,EAAE,KAAK;;;AAChB,iBAAiB;EACf,QAAQ,EAAE,QAAQ;EAClB,IAAI,EAAE,CAAC;EACP,OAAO,EAAE,IAAI;EACb,KAAK,EAAE,IAAI;EACX,GAAG,EAAE,IAAI;EACT,SAAS,EAAE,IAAI;EACf,UAAU,EHW0B,OAAyB;EGV7D,OAAO,ELmD6B,GAAG;EKlDvC,MAAM,EAAE,iBAAgC;EACxC,UAAU,EAAE,8BAA0B;EACtC,OAAO,EAAE,IAAqB;;AAC9B,0BAAQ;EACN,OAAO,EAAE,KAAK;EACd,KAAK,EAAE,IAAI;EACX,KAAK,EHN6B,OAAW;EGO7C,WAAW,EAAE,MAAM;EACnB,SAAS,EAAE,GAAG;EACd,OAAO,EAAE,MAAuB;EAChC,MAAM,EAAE,OAAO;;AACf,gCAAO;EACL,UAAU,EHFsB,OAAK;EGGrC,KAAK,EHT2B,IAAM;;AGU1C,8BAAY;EACV,UAAU,EAAE,iBAAgC;EAC5C,MAAM,EAAE,KAAuB;;AACjC,6BAAW;EACT,cAAc,EAAE,IAAqB;;AACrC,kDAAoB;EAClB,KAAK,EAAE,IAAI;;AACf,qCAAmB;EACjB,UAAU,EAAE,OAA4B;EACxC,cAAc,EAAE,SAAS;EACzB,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,GAAG;;AACd,2CAAO;EACL,UAAU,EAAE,OAA4B;;AAC1C,0CAAI;EACF,KAAK,EHzB2B,IAAM;;;AG2B5C,6CAA6C;EAC3C,MAAM,EAAE,IAAI;EACZ,GAAG,EAAE,IAAI;EACT,IAAI,EAAE,IAAI;EACV,KAAK,EAAE,CAAC;;;AAGR,iDAAiB;EACf,UAAU,EH9BwB,OAAyB;EG+B3D,UAAU,EAAE,GAAG;;AACjB,mDAAmB;EACjB,OAAO,EAAE,QAA2C;;AACpD,yDAAO;EACL,UAAU,EHlCsB,OAAK;EGmCrC,KAAK,EHzC2B,IAAM;;;AG2C5C,+CAA+C;EAC7C,KAAK,EAAE,CAAC;EACR,IAAI,EAAE,IAAI;EACV,UAAU,EAAE,KAAK;;;AAGjB,yBAAQ;EACN,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,oBAA0B;EACzC,WAAW,EAAE,qBAAqB;EAClC,YAAY,EAAE,qBAAqB;EACnC,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,KAAK;EACd,GAAG,EAAE,IAAI;EACT,IAAI,EAAE,GAAG;EACT,WAAW,EAAE,IAAI;;AACnB,gDAA+B;EAC7B,IAAI,EAAE,IAAI;;;ACtEZ,uBAAM;EACJ,OAAO,EAAE,KAAK;;;AAEhB,oIAA+C;EAC7C,OAAO,EAAE,YAAY;EACrB,QAAQ,EAAE,MAAM;EAChB,KAAK,EAAE,CAAC;EACR,cAAc,EAAE,MAAM;;;AAItB,0CAAO;EACL,OAAO,EAAE,YAAY;EACrB,cAAc,EAAE,MAAM;EACtB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,YAA+C;EACvD,KAAK,EAAE,IAAI;;AACf,4BAAW;EACT,KAAK,EAAE,IAAI;;AACX,kCAAK;EACH,OAAO,EAAE,KAAK;;AAChB,mCAAM;EACJ,UAAU,EAAE,GAAqB;;;AAEvC,QAAQ;EACN,MAAM,EAAE,CAAC;EACT,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;;;AACZ,MAAM;EACJ,OAAO,EAAE,KAAK;EACd,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;EACV,WAAW,EAAE,MAAM;EACnB,aAAa,EN/BuB,IAAI;EMgCxC,SAAS,EAAE,IAAI;EACf,YAAY,EAAE,IAAI;;;AACpB,KAAK;EACH,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,cAAa;EACrB,KAAK,ENR+B,IAAU;EMS9C,SAAS,EAAE,GAAG;;;AAEhB,uBAAuB;EACrB,SAAS,EAAE,IAAI;EACf,MAAM,EAAE,CAAC;EACT,cAAc,EAAE,QAAQ;EACxB,eAAe,EAAE,MAAM;;;AAGzB,iBAAiB;EACf,aAAa,ENhDuB,IAAI;EhBuExC,KAAK,EAAE,CAAC;EuBrGR,SAAS,ECCC,IAAQ;EDChB,WAAI,EAAE,IAAI;EACV,YAAK,EAAE,IAAI;EvBkGb,KAAK,EAAE,CAAC;;AACR,iDAAS;EAEP,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,EAAE;;AACb,uBAAO;EACL,KAAK,EAAE,IAAI;;AALb,iDAAS;EAEP,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,EAAE;;AACb,uBAAO;EACL,KAAK,EAAE,IAAI;;;AsBzBf,yDAAyD;EACvD,OAAO,EAAE,IAAI;EACb,KAAK,EN/C+B,OAAI;;;AMoDxC,qGAA+C;EAC7C,cAAc,EAAE,IAAqB;;AACrC,0HAAM;EACJ,KAAK,EAAE,IAAI;;AAEX,mwEAAqP;EACnP,KAAK,EAAE,IAAI;;;AACnB,+BAA+B;EGlF3B,KAAK,EAAE,IAAsB;EAG3B,OAAO,EAAE,KAAK;EAed,YAAoB,EAAE,aAA+B;EACrD,KAAK,EAAE,IAAuC;ECnB5C,YAAoB,EAAE,CAAC;;ADqBzB,0CAAa;EACX,YAAoB,EAAE,CAAC;;;AHgE/B,iCAAiC;EGtF7B,KAAK,EAAE,IAAsB;EAG3B,OAAO,EAAE,KAAK;EAed,YAAoB,EAAE,aAA+B;EACrD,KAAK,EAAE,aAAuC;;AAE9C,4CAAa;EACX,YAAoB,EAAE,CAAC;;ACA7B,iDAAwB;EACtB,YAAoB,EAAE,CAAC;;AAEvB,mDAA0B;EACxB,KAAK,EALY,IAAkC;;;AJqEzD,iCAAiC;EG1F7B,KAAK,EAAE,IAAsB;EAG3B,OAAO,EAAE,KAAK;EAed,YAAoB,EAAE,aAA+B;EACrD,KAAK,EAAE,cAAuC;;AAE9C,4CAAa;EACX,YAAoB,EAAE,CAAC;;ACA7B,iDAAwB;EACtB,YAAoB,EAAE,CAAC;;AAEvB,mDAA0B;EACxB,KAAK,EALY,IAAkC;;;AJ0EzD,uDAAuD;EACrD,MAAM,EAAE,SAA2B;EACnC,SAAS,EAAE,GAAG;;;AAEhB,oBAAoB;EAClB,OAAO,EAAE,YAAY;EACrB,MAAM,EAAE,SAA2B;EACnC,SAAS,EAAE,GAAG;;;AAOZ,itBAAqP;EACnP,KAAK,EAAE,IAAI;;;AAIjB,uBAAuB;EACrB,OAAO,EAAE,YAAY;EACrB,YAAY,EAAE,KAAK;EACnB,KAAK,EAAE,IAAI;EACX,cAAc,EAAE,MAAM;EACtB,SAAS,EAAE,GAAG;;;AAEhB,gBAAgB;EACd,OAAO,EAAE,KAAK;EACd,KAAK,EN7H+B,IAAI;EM8HxC,SAAS,EAAE,GAAG;EACd,UAAU,EAAE,QAAO;EACnB,UAAU,EAAE,MAAM;;AAClB,kBAAC;EACC,SAAS,EAAE,OAAO;EAClB,UAAU,EAAE,MAAM;EAClB,aAAa,EAAE,GAAqB;;AACtC,6BAAY;EACV,aAAa,EAAE,CAAC;;;AA4DpB,KAAK;EACH,WAAW,EAAE,MAAM;;;AAGnB,+DAAmD;EACjD,kBAAkB,EAAE,MAAM;EAC1B,MAAM,EAAE,OAAO;EACf,WAAW,EJ7JuB,2DAA2D;EI8J7F,SAAS,EAAE,OAAO;;AACpB,6SAAqP;EACnP,kBAAkB,EAAE,IAAI;EACxB,OAAO,EAAE,GAAqB;EAC9B,OAAO,EAAE,YAAY;EACrB,MAAM,EAAE,cAA6B;EACrC,SAAS,EAAE,GAAG;EACd,WAAW,EJrKuB,2DAA2D;EIsK7F,UAAU,EAAE,oBAAmC;EAC/C,aAAa,EAAE,CAAC;ExBxNZ,kBAAoB,EAAE,kBAAM;EAK5B,eAAiB,EAAE,kBAAM;EAezB,UAAY,EAAE,kBAAM;;AwBuM1B,4BAAwB;EACtB,OAAO,EAAE,iBAAkB;;AAC7B,eAAW;EACT,MAAM,EAAE,OAAO;;AACjB,2CAAmC;ExB/N7B,kBAAoB,EwBgOZ,UAAU;ExB3NlB,eAAiB,EwB2NT,UAAU;ExB5MlB,UAAY,EwB4MJ,UAAU;EACtB,OAAO,EAAE,CAAC;EACV,YAAY,EAAE,QAAO;EACrB,OAAO,EAAE,IAAI;EACb,MAAM,EAAE,IAAI;;AACd,oBAAgB;ExBrOV,kBAAoB,EwBsOZ,UAAU;ExBjOlB,eAAiB,EwBiOT,UAAU;ExBlNlB,UAAY,EwBkNJ,UAAU;;AACtB,mGAA6D;EAC3D,kBAAkB,EAAE,IAAI;;AAC5B,iYAAyU;EACvU,OAAO,EAAE,CAAC;EACV,OAAO,EAAE,eAAc;EACvB,YAAY,ENxLsB,IAAU;;AMyL9C,oBAAgB;EACd,YAAY,EAAE,eAA8B;;AAC9C,iFAAqE;EACnE,OAAO,EAAE,gBAAsB;EAC/B,OAAO,EAAE,gBAAgB;;AAC3B,ybAAiY;EAC/X,MAAM,EAAE,WAAW;EACnB,gBAAgB,EAAE,OAAmC;;;AAEzD,iEAAiE;EAC/D,KAAK,ENzN+B,OAAI;EM0NxC,MAAM,EAAE,iBAAc;;;AACxB,mFAAmF;EACjF,YAAY,EN5NwB,OAAI;;;AM8NxC,2HAA+G;EAC7G,aAAa,EN/NqB,OAAI;;;AMiO1C,oBAAoB;EAClB,OAAO,EAAE,IAAqB;EAC9B,SAAS,EAAE,IAAI;;;AAKjB,QAAQ;EACN,QAAQ,EAAE,IAAI;EACd,cAAc,EAAE,GAAG;EACnB,KAAK,EAAE,IAAI;EACX,WAAW,EJzNyB,2DAA2D;;;AI0NjG,gBAAgB;EACd,OAAO,EAAE,aAAgB;EACzB,OAAO,EAAE,YAAY;EACrB,MAAM,EAAE,cAA6B;EACrC,SAAS,EAAE,GAAG;EACd,UAAU,EAAE,oBAAmC;ExBhRzC,kBAAoB,EAAE,kBAAM;EAK5B,eAAiB,EAAE,kBAAM;EAezB,UAAY,EAAE,kBAAM;;;AwB+P5B,MAAM;EACJ,MAAM,EAAE,cAA6B;EACrC,gBAAgB,EJvPoB,IAAM;;AIwP1C,gBAAW;EACT,MAAM,EAAE,IAAI;;;AAChB,4BAA4B;EAC1B,OAAO,EAAE,CAAC;;;AACZ,2FAA2F;EACzF,MAAM,EAAE,WAAW;EACnB,gBAAgB,EAAE,OAAmC;;;AAKrD,+DAAuD;EACrD,MAAM,EAAE,WAAW;;;AACvB,uBAAuB;EACrB,MAAM,EAAE,KAAuB;EAE/B,KAAK,EJ5Q+B,OAAW;EI6Q/C,OAAO,EAAE,KAAK;;AACd,mCAAK;EACH,cAAc,EAAE,QAAQ;;;AAI5B,uBAAuB;EACrB,OAAO,EAAE,YAAY;EACrB,QAAQ,EAAE,MAAM;EAChB,KAAK,EAAE,CAAC;EACR,cAAc,EAAE,MAAM;;;AAuBxB,kCAAkC;EAChC,WAAW,EAAE,MAAM;EACnB,OAAO,EAAE,GAAqB;;AAC9B,sEAAiB;EACf,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,YAAY;EACrB,SAAS,EAAE,GAAG;EACd,gBAAgB,EJtSkB,OAAmB;EIuSrD,MAAM,EAAE,cAA6B;EACrC,KAAK,EN7U6B,IAAI;;;AM+U1C,kCAAkC;EAChC,WAAW,EAAE,CAAC;;;AAChB,kCAAkC;EAChC,YAAY,EAAE,CAAC;;;AAcjB,UAAU;EACR,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,KAAK;EACd,MAAM,ENjV8B,IAAI;EMkVxC,UAAU,EAAE,IAAqB;EACjC,MAAM,EAAE,OAAO;;AACf,iBAAQ;EACN,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,EAAE;EACX,OAAO,EAAE,KAAK;EACd,IAAI,EAAE,CAAC;EACP,GAAG,EAAE,CAAC;EACN,KAAK,EAAE,IAAuB;EAC9B,MAAM,EAAE,IAAqB;EAC7B,aAAa,EAAE,GAAG;EAClB,UAAU,EN9WwB,IAAI;ElBNlC,kBAAoB,EAAE,oBAAM;EAK5B,eAAiB,EAAE,oBAAM;EAezB,UAAY,EAAE,oBAAM;;AwBkW1B,gBAAO;EACL,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,EAAE;EACX,OAAO,EAAE,KAAK;EACd,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG;EAClB,UAAU,ENxXwB,IAAI;EMyXtC,IAAI,EAAE,IAAI;EACV,GAAG,EAAE,IAAI;ExB/XL,kBAAoB,EAAE,oBAAM;EAK5B,eAAiB,EAAE,oBAAM;EAezB,UAAY,EAAE,oBAAM;;AwB6W1B,eAAI;EACF,QAAQ,EAAE,QAAQ;EAClB,IAAI,EAAE,IAAqB;EAC3B,OAAO,EAAE,KAAK;EACd,SAAS,EAAE,IAAI;EACf,KAAK,ENhY6B,IAAI;EMiYtC,WAAW,EAAE,CAAC;;;AAEhB,wBAAQ;EACN,UAAU,EAAE,OAAmB;;AACjC,uBAAO;EACL,IAAI,ENrX8B,IAAI;EMsXtC,UAAU,EJ3YwB,OAAM;;;AI6Y5C,mBAAmB;EACjB,MAAM,EAAE,WAAW;EACnB,OAAO,EAAE,GAAE;;;AAgDX,2GAAyB;EACvB,KAAK,ENpa6B,OAAI;;AMsatC,22BAAqP;EACnP,MAAM,EAAE,iBAAc;;AAC1B,iDAAQ;EACN,MAAM,EAAE,iBAAc;;;AAE1B,mBAAmB;EACjB,WAAW,EAAE,MAAM;;AACnB,qCAAiB;EACf,OAAO,EAAE,aAAgB;EACzB,OAAO,EAAE,YAAY;EACrB,SAAS,EAAE,GAAG;;;AAClB,gEAAgE;EAC9D,KAAK,EJ9c+B,OAAM;;;AIid5C,+DAA+D;EAC7D,KAAK,ENtb+B,OAAI;;;AMyb1C,gEAAgE;EAC9D,KAAK,ENzc+B,OAAO;;;AM4c7C,6DAA6D;EAC3D,KAAK,EJxb+B,OAAK;;;AI8b3C,UAAU;ExBleF,iBAAoB,EAAE,aAAM;EAK5B,cAAiB,EAAE,aAAM;EAKzB,aAAgB,EAAE,aAAM;EAKxB,YAAe,EAAE,aAAM;EAKvB,SAAY,EAAE,aAAM;;;AwBgd5B,WAAW;ExBpeH,iBAAoB,EAAE,cAAM;EAK5B,cAAiB,EAAE,cAAM;EAKzB,aAAgB,EAAE,cAAM;EAKxB,YAAe,EAAE,cAAM;EAKvB,SAAY,EAAE,cAAM;;;AwBkd5B,WAAW;ExBteH,iBAAoB,EAAE,cAAM;EAK5B,cAAiB,EAAE,cAAM;EAKzB,aAAgB,EAAE,cAAM;EAKxB,YAAe,EAAE,cAAM;EAKvB,SAAY,EAAE,cAAM;;;AwBod5B,OAAO;ExBxeC,iBAAoB,EAAE,UAAM;EAK5B,cAAiB,EAAE,UAAM;EAKzB,aAAgB,EAAE,UAAM;EAKxB,YAAe,EAAE,UAAM;EAKvB,SAAY,EAAE,UAAM;;AwBsd1B,iBAAW;ExB1eL,iBAAoB,EwB2eL,wBAAwB;ExBtevC,cAAiB,EwBseF,wBAAwB;ExBjevC,aAAgB,EwBieD,wBAAwB;ExB5dvC,YAAe,EwB4dA,wBAAwB;ExBvdvC,SAAY,EwBudG,wBAAwB;;AAC7C,kBAAY;ExB5eN,iBAAoB,EwB6eL,yBAAyB;ExBxexC,cAAiB,EwBweF,yBAAyB;ExBnexC,aAAgB,EwBmeD,yBAAyB;ExB9dxC,YAAe,EwB8dA,yBAAyB;ExBzdxC,SAAY,EwBydG,yBAAyB;;AAC9C,kBAAY;ExB9eN,iBAAoB,EwB+eL,yBAAyB;ExB1exC,cAAiB,EwB0eF,yBAAyB;ExBrexC,aAAgB,EwBqeD,yBAAyB;ExBhexC,YAAe,EwBgeA,yBAAyB;ExB3dxC,SAAY,EwB2dG,yBAAyB;;;AAEhD,yCAAyC;EAErC,8BAAqB;IACnB,MAAM,EAAE,SAAS;;EAEjB,2aAAqP;IACnP,aAAa,EAAE,KAAK;IACpB,OAAO,EAAE,KAAK;;EAClB,cAAK;IACH,aAAa,EAAE,KAAK;IACpB,OAAO,EAAE,KAAK;;;EAEhB,8YAAqO;IACnO,aAAa,EAAE,CAAC;;;EAElB,wCAAuB;IACrB,aAAa,EAAE,KAAK;IACpB,UAAU,EAAE,IAAI;IAChB,OAAO,EAAE,KAAK;IACd,KAAK,EAAE,IAAI;;EACb,4BAAW;IACT,MAAM,EAAE,WAAW;;;EACvB,mEAAmE;IACjE,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,GAAG;IACd,OAAO,EAAE,KAAuB;;;AHnfhC,oCAAsB;EQhC1B,YAAY;IAER,OAAO,EAAE,IAAI;;;;AR8Bb,oCAAsB;EQ5B1B,YAAY;IAER,OAAO,EAAE,IAAI;;;;AAEjB,WAAW;EACT,KAAK,EAAE,IAAI;;;AAEb,YAAY;EACV,KAAK,EAAE,KAAK;;;AAEd,WAAW;EACT,KAAK,EAAE,IAAI;;;AC4Cb,qEAAS;EACP,eAAe,EAAE,QAAQ;EACzB,cAAc,EAAE,CAAC;EACjB,WAAW,EAAE,IAAI;EACjB,aAAa,EZ/BuB,IAAI;;AYgCxC,6FAAO;EACL,KAAK,EAAE,IAAI;EACX,IAAI,EAAE,8BAA8B;EACpC,OAAO,EAAE,KAAK;EACd,UAAU,EAAE,MAAM;;AACpB,8JAAM;EACJ,SAAS,EZjByB,GAAG;EYkBrC,MAAM,EAAE,CAAC;EACT,QAAQ,EAAE,OAAO;EACjB,OAAO,EZnB2B,QAAmC;;AYoBvE,sOAA8B;EAC5B,iBAAiB,EAAE,CAAC;;AACtB,uFAAK;EACH,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,IAAI;EAChB,cAAc,EAAE,MAAM;EACtB,WAAW,EAAE,MAAM;;AACnB,gGAAE;EACA,WAAW,EZnDqB,IAAI;EYoDpC,aAAa,EAAE,iBAA6B;;AAChD,8EAAE;EACA,gBAAgB,EAAE,WAAW;EAC7B,cAAc,EAAE,MAAM;;;AAE1B,oFAAc;EACZ,WAAW,EAAE,IAAuB;;AACpC,qHAAY;EACV,aAAa,EAAE,CAAC;;;AACpB,8HAA4B;EAC1B,KAAK,EAAE,EAAE;EACT,aAAa,EAAE,CAAC;;AAChB,4XAA0C;EACxC,MAAM,EAAE,CAAC;;;AAEb,mBAAmB;EACjB,KAAK,EV9D+B,IAAY;EU+DhD,SAAS,EAAE,GAAG;;;AAChB,kBAAkB;EAChB,KAAK,EVjE+B,IAAY;EUkEhD,SAAS,EAAE,GAAG;;;AAIhB,6HAAyD;EACvD,gBAAgB,EVzDoB,OAAmB;;;AU2DzD,gBAAgB;EACd,gBAAgB,EV5DoB,OAAmB;;;;AUiEzD,mDAAsB;EACpB,MAAM,EAAE,iBAA6B;;AACrC,yDAAE;EACA,aAAa,EAAE,iBAA6B;EAC5C,WAAW,EAAE,iBAA6B;;AAC5C,qGAAwB;EACtB,mBAAmB,EAAE,CAAC;;;AAE1B,kBAAkB;EAChB,MAAM,EAAE,iBAA6B;;;AAGrC,0BAAE;EACA,aAAa,EAAE,iBAA6B;;AAC9C,gDAAwB;EACtB,mBAAmB,EAAE,CAAC;;;AAGxB,6CAAwB;EACtB,mBAAmB,EAAE,CAAC;;AACxB,gDAAM;EACJ,YAAY,EAAE,SAAS;EACvB,aAAa,EAAE,iBAA6B;;AAC9C,6CAAwB;EACtB,mBAAmB,EAAE,CAAC;;;;AAG1B,oBAAoB;EAClB,aAAa,EZhHuB,IAAI;EYiHxC,SAAS,EAAE,IAAI;EACf,QAAQ,EAAE,IAAI;;AACd,0BAAK;EACH,aAAa,EAAE,YAAY;;AAC3B,4DAAM;EACJ,WAAW,EAAE,MAAM;;;ACzIzB,CAAC;EACC,KAAK,EX+B+B,OAAK;EW9BzC,eAAe,EAAE,IAAI;EACrB,MAAM,EAAE,OAAO;;AACf,OAAO;EACL,KAAK,EbgD6B,OAAwB;;Aa/C5D,SAAS;EACP,KAAK,EX0B6B,OAAO;;;AWA7C,IAAI;EACF,MAAM,EAAE,IAAI;EACZ,UAAU,EAAE,MAAM;;;AAEpB,IAAI;EACF,WAAW,EXOyB,2DAA2D;EWN/F,WAAW,EAAE,MAAM;EACnB,KAAK,EXlB+B,OAAW;EWmB/C,UAAU,EAAE,IAAI;EAChB,UAAU,EAAE,MAAM;EAClB,UAAU,EbnD0B,OAAO;;;AaqD7C,aAAa;EACX,UAAU,EAAE,IAAI;;;AAElB,eAAe;EACb,UAAU,EAAE,MAAM;;;AAEpB,cAAc;EACZ,UAAU,EAAE,KAAK;;;AAEnB,cAAc;EACZ,SAAS,EAAE,IAAI;;;AAEjB,eAAe;EACb,SAAS,EAAE,IAAI;;;AAEjB,qBAAqB;EACnB,SAAS,EAAE,GAAG;;;AAEhB,eAAe;EACb,eAAe,EAAE,YAAY;;;AAE/B,gBAAgB;EACd,KAAK,EAAE,kBAAkB;;;AAC3B,uBAAuB;EACrB,KAAK,EAAE,kBAAgC;;;AACzC,aAAa;EACX,KAAK,EAAE,kBAAgB;;;AACzB,oBAAoB;EAClB,KAAK,EAAE,kBAA8B;;;AACvC,gBAAgB;EACd,KAAK,EAAE,kBAAiB;;;AAC1B,uBAAuB;EACrB,KAAK,EAAE,kBAA+B;;;AACxC,eAAe;EACb,KAAK,EAAE,kBAAe;;;AACxB,sBAAsB;EACpB,KAAK,EAAE,kBAA6B;;;AACtC,gBAAgB;EACd,KAAK,EAAE,kBAAsB;;;AAC/B,uBAAuB;EACrB,KAAK,EAAE,kBAAoC;;;AAkB7C,uEAAyB;EACvB,UAAU,EAAE,CAAC;EACb,WAAW,EAAE,GAAG;EAChB,WAAW,EX5DyB,8DAA8D;;;AW8DpG,CAAC;EACC,WAAW,Eb1FyB,IAAI;Ea2FxC,MAAM,EAAE,CAAC;EACT,SAAS,Eb/F2B,IAAI;EagGxC,aAAa,Eb7FuB,IAAI;;;Aa+F1C,EAAE;EACA,SAAS,EAAE,IAAI;;;AAEjB,2CAAE;EACA,SAAS,EAAE,IAAI;;;AAEjB,EAAE;EACA,SAAS,EAAE,IAAI;;;AAEjB,EAAE;EACA,SAAS,EAAE,IAAI;;;AAEjB,EAAE;EACA,SAAS,EAAE,IAAI;;;AAEjB,EAAE;EACA,SAAS,EAAE,IAAI;;;AAEjB,EAAE;EACA,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,GAAG;EACX,MAAM,EAAE,CAAC;EACT,UAAU,EAAE,iBAA6B;EACzC,MAAM,EAAE,MAAmB;EAC3B,OAAO,EAAE,CAAC;;;AAEZ,wCAAI;EACF,WAAW,EAAE,MAAM;EACnB,SAAS,EAAE,IAAI;EACf,UAAU,EXrH0B,IAAM;EWsH1C,MAAM,EAAE,iBAAiC;EACzC,SAAS,EAAE,GAAG;EACd,OAAO,EAAE,KAAK;EACd,WAAW,EXnGyB,oNAAoN;EWoGxP,KAAK,Eb1H+B,OAAI;Ea2HxC,UAAU,EAAE,IAAI;;AAChB,2CAAY;EACV,SAAS,EAAE,GAAG;;;AAmClB,2FAAmB;EACjB,UAAU,EAAE,IAAI;EAChB,WAAW,EbzKyB,IAAI;Ea0KxC,aAAa,Eb1KuB,IAAI;;Aa2KxC,uGAAE;EACA,UAAU,EAAE,IAAI;EAChB,WAAW,Eb7KuB,IAAI;;Aa8KtC,2JAAY;EACV,aAAa,EAAE,CAAC;;AAClB,mHAAE;EACA,aAAa,EAAE,CAAC;;AAClB,mHAAE;EACA,UAAU,EAAE,MAAM;;AAClB,+HAAE;EACA,UAAU,EAAE,MAAM;;AACtB,+HAAK;EACH,UAAU,EAAE,OAAO;;;AAEzB,oFAAsB;EACpB,UAAU,EAAE,OAAO;EACnB,WAAW,Eb3LyB,IAAI;Ea4LxC,aAAa,Eb5LuB,IAAI;;Aa6LxC,gGAAE;EACA,UAAU,EAAE,OAAO;EACnB,WAAW,Eb/LuB,IAAI;;AagMtC,oJAAY;EACV,aAAa,EAAE,CAAC;;AAClB,4GAAE;EACA,aAAa,EAAE,CAAC;;AAChB,wHAAE;EACA,UAAU,EAAE,IAAI;;;ACrOxB,kBAAkB;EAChB,MAAM,EAAE,iBAA6B;EACrC,aAAa,EAAE,IAAI;EACnB,OAAO,Ed6B6B,IAAI;Ec5BxC,WAAW,EAAE,IAAqB;EAClC,WAAW,EAAE,GAAG;EAChB,UAAU,EZiC0B,IAAM;EYhC1C,QAAQ,EAAE,QAAQ;;AAClB,wBAAO;EACL,OAAO,EAAE,SAAS;EAClB,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,GAAG;EACR,IAAI,EAAE,GAAG;EACT,UAAU,EZiCwB,OAAO;EYhCzC,KAAK,EAAE,KAAoB;EAC3B,OAAO,EAAE,QAA2C;;AACtD,2CAA0B;EACxB,MAAM,EAAE,iBAA6B;EACrC,aAAa,EdcqB,IAAI;;;AcZ1C,mHAAmC;EACjC,MAAM,EAAE,iBAA6B;EACrC,OAAO,EAAE,GAAG;EACZ,UAAU,EAAE,IAAI;EAChB,UAAU,EZe0B,IAAM;EYb1C,MAAM,EAAE,YAAyB;;AACjC,mLAAuB;EACrB,MAAM,EAAE,IAAI;EACZ,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,CAAC;;;AAEb,+BAA+B;EAC7B,KAAK,EAAE,IAAI;;;AACb,cAAc;EACZ,YAAY,EAAE,iBAA0C;EACxD,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,SAA2C;EACpD,WAAW,EZuByB,oNAAoN;EYtBxP,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,KAAK,EdI+B,OAAwB;;;AcH9D,2BAA2B;EACzB,WAAW,EAAE,GAAG;EAChB,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,SAA2C;EACpD,WAAW,EZeyB,oNAAoN;EYdxP,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,OAAO,EAAE,KAAK;EACd,QAAQ,EAAE,IAAI;EACd,KAAK,EZhB+B,OAAW;;;AYoBjD,YAAY;EACV,gJAAgE;IAC9D,WAAW,EAAE,QAAQ;;;ACzDzB,IAAI;EACF,gBAAgB,EAAE,OAAO;EACzB,MAAM,EAAE,OAAO;EACf,OAAO,EAAE,MAAM;EACf,OAAO,EAAE,KAAK;;;AAChB,EAAE;EACA,KAAK,EAAE,OAAO;EACd,UAAU,EAAE,MAAM;;;AACpB,IAAI;EACF,KAAK,EAAE,OAAO;EACd,gBAAgB,EAAE,OAAO;;;AAC3B,EAAE;EACA,WAAW,EAAE,IAAI;;;AACnB,EAAE;EACA,WAAW,EAAE,IAAI;;;AACnB,GAAG;EACD,KAAK,EAAE,OAAO;EACd,UAAU,EAAE,MAAM;;;AACpB,GAAG;EACD,KAAK,EAAE,OAAO;EACd,WAAW,EAAE,IAAI;;;AACnB,GAAG;EACD,KAAK,EAAE,OAAO;EACd,UAAU,EAAE,MAAM;;;AACpB,GAAG;EACD,KAAK,EAAE,OAAO;EACd,WAAW,EAAE,IAAI;EACjB,UAAU,EAAE,MAAM;;;AACpB,GAAG;EACD,KAAK,EAAE,OAAO;EACd,gBAAgB,EAAE,OAAO;;;AAC3B,MAAM;EACJ,KAAK,EAAE,OAAO;EACd,gBAAgB,EAAE,OAAO;;;AAC3B,GAAG;EACD,UAAU,EAAE,MAAM;;;AACpB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;EACd,gBAAgB,EAAE,OAAO;;;AAC3B,MAAM;EACJ,KAAK,EAAE,OAAO;EACd,gBAAgB,EAAE,OAAO;;;AAC3B,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,WAAW,EAAE,IAAI;;;AACnB,GAAG;EACD,KAAK,EAAE,OAAO;EACd,WAAW,EAAE,IAAI;;;AACnB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,WAAW,EAAE,IAAI;;;AACnB,GAAG;EACD,WAAW,EAAE,IAAI;;;AACnB,GAAG;EACD,WAAW,EAAE,IAAI;;;AACnB,GAAG;EACD,WAAW,EAAE,IAAI;;;AACnB,GAAG;EACD,WAAW,EAAE,IAAI;;;AACnB,GAAG;EACD,KAAK,EAAE,OAAO;EACd,WAAW,EAAE,IAAI;;;AACnB,EAAE;EACA,KAAK,EAAE,OAAO;;;AAChB,EAAE;EACA,KAAK,EAAE,OAAO;;;AAChB,EAAE;EACA,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,IAAI;;;AACb,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;EACd,WAAW,EAAE,IAAI;;;AACnB,GAAG;EACD,KAAK,EAAE,IAAI;;;AACb,GAAG;EACD,KAAK,EAAE,MAAM;;;AACf,GAAG;EACD,KAAK,EAAE,OAAO;EACd,WAAW,EAAE,IAAI;;;AACnB,GAAG;EACD,KAAK,EAAE,OAAO;EACd,WAAW,EAAE,IAAI;;;AACnB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,IAAI;;;AACb,GAAG;EACD,KAAK,EAAE,IAAI;;;AACb,GAAG;EACD,WAAW,EAAE,IAAI;;;AACnB,EAAE;EACA,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,IAAI;;;AACb,GAAG;EACD,KAAK,EAAE,IAAI;;;AACb,GAAG;EACD,KAAK,EAAE,IAAI;;;AACb,GAAG;EACD,KAAK,EAAE,OAAO;;;AAChB,GAAG;EACD,KAAK,EAAE,IAAI;EACX,gBAAgB,EAAE,OAAO;;;ACjJ3B,kBAAkB;EAChB,OAAO,EAAE,YAAY;;AACrB,uCAAsB;EACpB,KAAK,EAAE,KAAK;;AACd,oBAAC;EACC,OAAO,EAAE,YAAY;EACrB,OAAO,EAAE,GAAG;;AACZ,gCAAa;EACX,YAAY,EAAE,CAAC;;AACnB,+FAAI;EACF,OAAO,EAAE,GAAG;EACZ,MAAM,EAAE,IAAI;EACZ,UAAU,EAAE,IAAI;;AAChB,uHAAS;EACP,KAAK,EdqB2B,OAAW;;;AcpBjD,qBAAqB;EACnB,aAAa,EAAE,CAAC;EAChB,KAAK,EdqB+B,OAAW;EcpB/C,SAAS,EAAE,GAAG;EACd,OAAO,EAAE,YAAY;;;AbanB,oCAAsB;EaTxB,qBAAqB;IACnB,OAAO,EAAE,IAAI;;;EACf,uCAAuC;IACrC,OAAO,EAAE,IAAI;;;AAEjB,YAAY;EACV,uCAAuC;IACrC,OAAO,EAAE,IAAI;;;AC9BjB,SAAS;EACP,QAAQ,EAAE,KAAK;EACf,GAAG,ECAO,OAAO;;;ADGjB,gBAAO;EACL,eAAe,EAAE,IAAI;;;AAEzB,cAAc;EjC+FZ,KAAK,EAAE,CAAC;;AACR,2CAAS;EAEP,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,EAAE;;AACb,oBAAO;EACL,KAAK,EAAE,IAAI;;AiCnGb,oCAAM;EACJ,OAAO,EAAE,YAAY;;AACvB,uBAAQ;EACN,UAAU,EAAE,wBAAoB;;AAEhC,6BAAa;EACX,WAAW,EAAE,iBAAyB;;AACxC,8BAAc;EACZ,YAAY,EAAE,iBAAyB;;AAC3C,gBAAC;EACC,MAAM,EAAE,IAAmB;EAC3B,OAAO,EAAE,YAAY;EACrB,WAAW,EAAE,IAAmB;EAChC,OAAO,EAAE,MAAiB;;;AAE9B,iBAAiB;EACf,KAAK,EjBuD+B,KAAK;;AiBtDzC,qDAAiB;EACf,MAAM,EAAE,IAAmB;EAC3B,OAAO,EAAE,YAAY;EACrB,WAAW,EAAE,IAAmB;EAChC,OAAO,EAAE,SAAS;EAClB,aAAa,EAAE,CAAC;EAChB,OAAO,EAAE,KAAK;EACd,WAAW,EAAE,IAAI;EACjB,cAAc,EAAE,SAAS;EACzB,SAAS,EAAE,GAAG;EACd,KAAK,EfR6B,OAAwB;EeS1D,WAAW,EAAE,MAAM;;AAErB,oBAAE;EACA,aAAa,EAAE,CAAC;;AAEhB,+BAAY;EACV,UAAU,EAAE,iBAAyB;;AACvC,kCAAe;EACb,aAAa,EAAE,iBAAyB;;AAC1C,4BAAS;EACP,UAAU,EAAE,OAA4C;;AACxD,8BAAC;EACC,KAAK,EfbyB,IAAY;Eec1C,YAAY,EAAE,iBAAsD;EACpE,OAAO,EAAE,gBAAyB;;AAClC,oCAAO;EACL,UAAU,EAAE,OAA4C;;AAC9D,qGAAI;EACF,MAAM,EAAE,IAAI;EACZ,UAAU,EAAE,OAAO;EACnB,KAAK,EAAE,OAAO;EACd,YAAY,EAAE,CAAC;EACf,aAAa,EAAE,CAAC;;AAElB,wCAAmB;EACjB,OAAO,EAAE,KAAK;EACd,KAAK,EAAE,IAAI;EACX,WAAW,EAAE,MAAM;EAGnB,SAAS,EAAE,KAAI;EACf,WAAW,EAAE,KAAK;EAClB,KAAK,EAAE,OAA8B;;AAGzC,2DAAuB;EACrB,KAAK,EfvC6B,OAAW;EewC7C,OAAO,EAAE,gBAAmB;EAC5B,WAAW,EAAE,IAAI;EACjB,QAAQ,EAAE,QAAQ;EAClB,UAAU,EflCwB,OAAyB;EemC3D,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,iBAAsD;EACrE,UAAU,EAAE,iBAAsD;EAClE,YAAY,EAAE,YAAY;;AAE1B,uEAAO;EACL,UAAU,EfzCsB,OAAyB;;Ae0CzD,+GAAmB;EACjB,KAAK,EflDyB,IAAY;;AemD9C,mGAAmB;EAGjB,OAAO,EAAE,KAAK;EACd,SAAS,EAAE,KAAI;EACf,WAAW,EAAE,KAAK;EAClB,KAAK,EAAE,OAA8B;;AAIvC,sHAAI;EACF,OAAO,EAAE,IAAI;;AACf,sIAAc;EACZ,OAAO,EAAE,KAAK;;AAGd,2CAAG;EACD,UAAU,EAAE,OAA4C;EACxD,OAAO,EAAE,gBAAyB;;AACpC,yDAAiB;EACf,OAAO,EAAE,KAAK;EACd,UAAU,EAAE,OAA4C;EACxD,OAAO,EAAE,gBAAyB;;AACtC,2DAA2B;EACzB,KAAK,Ef3E2B,IAAY;;Ae4E9C,mDAAmB;EACjB,KAAK,EAAE,OAA4C;;AACvD,+BAAa;EACX,SAAS,EAAE,KAAI;;AAEb,2CAAG;EACD,UAAU,EAAE,OAA4C;EACxD,OAAO,EAAE,gBAAyB;;AACpC,yDAAiB;EACf,OAAO,EAAE,KAAK;EACd,UAAU,EAAE,OAA4C;EACxD,OAAO,EAAE,gBAAyB;EAClC,UAAU,EAAE,IAAI;EAChB,aAAa,EAAE,IAAI;;AACvB,2DAA2B;EACzB,KAAK,Ef3F2B,IAAY;;Ae4F9C,mDAAmB;EACjB,KAAK,EAAE,OAA4C;;AACvD,+BAAa;EACX,SAAS,EAAE,KAAI;;AAEjB,+BAAa;EACX,OAAO,EAAE,KAAK;;AAChB,uBAAK;EACH,aAAa,EAAE,CAAC;EAChB,OAAO,EAAE,IAAI;;AAEb,kCAAK;EACH,OAAO,EAAE,KAAK;;AAClB,4BAAU;EACR,aAAa,EAAE,CAAC;EAChB,KAAK,Ef1G6B,OAAW;Ee2G7C,WAAW,EAAE,MAAM;;AACrB,mBAAC;EACC,OAAO,EAAE,YAAY;EACrB,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,gBAAmB;EAC5B,OAAO,EAAE,KAAK;EACd,QAAQ,EAAE,QAAQ;EAClB,SAAS,EAAE,GAAG;EACd,KAAK,EfnH6B,OAAW;;AeoH7C,yBAAO;EACL,gBAAgB,EAAE,OAAoC;EACtD,MAAM,EAAE,OAAO;;AACf,6CAAmB;EACjB,KAAK,EfxHyB,OAAW;;AeyH7C,0BAAQ;EACN,gBAAgB,EfnHgB,OAAK;EeoHrC,MAAM,EAAE,OAAO;EACf,KAAK,Ef3H2B,IAAM;;Ae4HtC,8CAAmB;EACjB,KAAK,Ef7HyB,IAAM;;;Ae+H5C,mBAAmB;EACjB,OAAO,EAAE,KAAK;EACd,KAAK,EjBvF+B,KAAK;EiBwFzC,OAAO,EAAE,OAAW;EACpB,aAAa,EAAE,OAAW;EAC1B,OAAO,EjBrF6B,GAAG;EiBsFvC,gBAAgB,Ef/HoB,OAAK;EegIzC,UAAU,EAAE,MAAM;EAClB,OAAO,EAAE,OAAW;EACpB,OAAO,EAAE,KAAK;EACd,KAAK,EfpI+B,OAAyB;EeqI7D,aAAa,EAAE,OAAW;;AAC1B,oCAAgB;EACd,KAAK,EAAE,IAAI;EACX,aAAa,EAAE,IAAI;EACnB,OAAO,EAAE,QAAQ;EACjB,YAAY,EAAE,OAAuB;;AACvC,uBAAG;EACD,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,sBAA0B;EAClC,MAAM,EAAE,IAAI;EACZ,KAAK,EAAE,IAAI;EACX,gBAAgB,Ef/IkB,OAAK;EegJvC,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,IAAI;;AACrB,6DAAqB;EACnB,KAAK,EfpJ6B,OAAyB;EeqJ3D,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,YAAY;EACrB,OAAO,EAAE,OAA2C;EACpD,aAAa,EAAE,OAAW;;AAE1B,yEAAO;EACL,UAAU,EAAE,wBAAoB;;AAClC,+EAAQ;EACN,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,MAAM;EACd,MAAM,EAAE,IAAI;EACZ,KAAK,EAAE,IAAI;EACX,aAAa,EAAE,CAAC;EAChB,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,gBAAa;;AAEzB,yFAAQ;EACN,UAAU,EAAE,MAAM;;AACxB,iCAAa;EACX,UAAU,EAAE,SAAkB;EAC9B,aAAa,EAAE,OAAW;EAC1B,WAAW,EAAE,MAAM;EACnB,KAAK,EAAE,wBAAoB;;;AAI7B,gCAAM;EACJ,KAAK,EfhL6B,OAAK;;AeiLzC,2BAAC;EACC,KAAK,EfzL6B,OAAW;;Ae0L7C,iCAAO;EACL,gBAAgB,EfpLgB,OAAK;EeqLrC,KAAK,Ef3L2B,IAAM;;;Ae6L5C,gBAAgB;EnC3NR,kBAAoB,EAAE,gBAAM;EAK5B,eAAiB,EAAE,gBAAM;EAezB,UAAY,EAAE,gBAAM;EmCyM1B,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,CAAC;EACV,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,CAAC;;AACV,4BAAa;EACX,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,CAAC;;AACZ,0BAAW;EACT,KAAK,EAAE,IAAI;EACX,IAAI,EAAE,KAAK;EACX,OAAO,EAAE,CAAC;;AACZ,2BAAY;EACV,KAAK,EAAE,KAAK;EACZ,IAAI,EAAE,IAAI;EACV,OAAO,EAAE,CAAC;;;AAGd,gBAAgB;EACd,UAAU,EAAE,qBAAuC;EACnD,gBAAgB,EAAE,2uCAA2uC;EAC7vC,eAAe,EAAE,SAAsB;;;AAEzC,gBAAgB;EACd,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;;;AAEd,YAAY;EACV,QAAQ,EAAE,KAAK;EACf,GAAG,EAAE,CAAC;EACN,MAAM,EAAE,CAAC;EACT,IAAI,EAAE,CAAC;EACP,cAAc,EAAE,GAAG;EACnB,KAAK,EjBvL+B,KAAK;EiBwLzC,UAAU,EAAE,MAAM;EAClB,UAAU,EAAE,MAAM;EAClB,UAAU,EAAE,IAAI;EAChB,UAAU,EflO0B,OAAsB;EemO1D,OAAO,EjBvL6B,GAAG;;;AiByLzC,eAAe;EACb,KAAK,EAAE,KAAyB;EAChC,QAAQ,EAAE,QAAQ;EAClB,UAAU,EAAE,MAAM;EAClB,UAAU,EAAE,MAAM;EAClB,MAAM,EAAE,IAAI;;;AAEd,WAAW;EACT,OAAO,EAAE,IAAI;EACb,UAAU,Ef3O0B,OAAK;Ee4OzC,KAAK,EflP+B,IAAM;EemP1C,OAAO,EAAE,gBAAuB;EAChC,QAAQ,EAAE,QAAQ;EAClB,WAAW,EAAE,IAAI;EACjB,UAAU,EAAE,MAAM;EAClB,SAAS,EAAE,IAAI;EjCvLf,KAAK,EAAE,CAAC;;AACR,qCAAS;EAEP,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,EAAE;;AACb,iBAAO;EACL,KAAK,EAAE,IAAI;;AiCmLb,aAAC;EACC,KAAK,Ef1P6B,IAAM;Ee2PxC,WAAW,EAAE,IAAI;;AAEnB,eAAG;EACD,YAAY,EAAE,IAAqB;EACnC,MAAM,EAAE,IAAI;EACZ,KAAK,EAAE,IAAI;EACX,gBAAgB,Ef3PkB,OAAK;Ee4PvC,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,IAAI;;AACrB,aAAC;EACC,SAAS,EAAE,IAAI;EACf,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,OAAO;EACf,WAAW,EAAE,OAAO;;;AAExB,oBAAoB;EAClB,WAAW,EjBjOyB,KAAK;EiBkOzC,UAAU,EfvQ0B,OAAyB;EewQ7D,UAAU,EAAE,IAAI;;;AAElB,eAAe;EACb,OAAO,EAAE,eAAmB;EAC5B,MAAM,EAAE,IAAI;EACZ,SAAS,EAAE,KAAK;EAChB,MAAM,EAAE,IAAI;;;AAEd,aAAa;EACX,QAAQ,EAAE,KAAK;EACf,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,UAAU,EAAE,kBAAc;EAC1B,OAAO,EAAE,IAAI;EACb,OAAO,EAAE,GAAkB;;AAC3B,gBAAI;EACF,OAAO,EAAE,KAAK;;;AAClB,MAAM;EACJ,KAAK,EfjS+B,IAAY;;AekShD,QAAC;EACC,aAAa,EAAE,IAAqB;;AACtC,+FAAgB;EACd,OAAO,EAAE,GAAG;EACZ,WAAW,Ef9QuB,oNAAoN;Ee+QtP,SAAS,EAAE,GAAG;EACd,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,IAAI;EACZ,KAAK,Ef1S6B,IAAY;;;Ae4SlD,mBAAmB;EjC1OjB,KAAK,EAAE,CAAC;;AiC2OR,qDAAiB;EACf,KAAK,EAAE,IAAI;;AjC3Ob,qDAAS;EAEP,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,EAAE;;AACb,yBAAO;EACL,KAAK,EAAE,IAAI;;;AiCyOf,wBAAwB;EACtB,UAAU,EAAE,IAAI;EjChPhB,KAAK,EAAE,CAAC;;AACR,+DAAS;EAEP,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,EAAE;;AACb,8BAAO;EACL,KAAK,EAAE,IAAI;;;AiC8Ob,0BAAU;EACR,aAAa,EjB5TqB,IAAI;EiB6TtC,aAAa,EAAE,iBAA6B;EAC5C,cAAc,EjB9ToB,IAAI;;AiB+TxC,sCAAsB;EACpB,UAAU,EAAE,iBAA6B;EACzC,WAAW,EjBjUuB,IAAI;;AiBkUxC,4BAAY;EACV,SAAS,EAAE,IAAI;EACf,aAAa,EAAE,IAAqB;EACpC,OAAO,EAAE,YAAY;;AACvB,wBAAQ;EACN,KAAK,EflU6B,IAAY;EemU9C,SAAS,EAAE,GAAG;;;AdxUd,oCAAsB;Ec4UxB,gBAAgB;IACd,UAAU,EfjUwB,OAAyB;;;EekU7D,WAAW;IACT,OAAO,EAAE,KAAK;;;EAChB,YAAY;IAER,IAAI,EAAE,MAAmB;;EAG3B,kBAAO;IACL,KAAK,EAAE,GAAG;IACV,IAAI,EAAE,CAAC;;;EACX,eAAe;IACb,KAAK,EAAE,IAAI;;;EACb,mBAAmB;IACjB,KAAK,EAAE,IAAI;;;EACb,yBAAyB;IACvB,KAAK,EAAE,IAAI;;;EACb,oBAAoB;IAClB,WAAW,EAAE,CAAC;;EACd,oCAAe;IACb,OAAO,EC/XD,OAAO;;EDgYf,0BAAO;IACL,QAAQ,EAAE,KAAK;IACf,SAAS,EAAE,IAAI;IACf,IAAI,EAAE,GAAG;IACT,GAAG,EAAE,CAAC;IACN,MAAM,EAAE,IAAI;IACZ,QAAQ,EAAE,MAAM;;;AdxWlB,qCAAsB;Ec2WxB,oBAAoB;IAClB,UAAU,EAAE,mBAAe;;;EAC7B,eAAe;IACb,MAAM,EAAE,CAAC;IACT,UAAU,EfnWwB,OAAyB;;;AeqW/D,YAAY;EACV,mCAAmC;IACjC,OAAO,EAAE,IAAI;;;EACf,oBAAoB;IAClB,WAAW,EAAE,CAAC;;;AErZlB,aAAa;EACX,QAAQ,EAAE,KAAK;EACf,MAAM,EAAE,CAAC;EACT,IAAI,EAAE,CAAC;EACP,KAAK,EnB6E+B,KAAK;EmB5EzC,KAAK,EjBuC+B,OAAyB;EiBtC7D,UAAU,EAAE,OAAkC;EAC9C,UAAU,EAAE,kBAAiC;EAC7C,WAAW,EjBkDyB,2DAA2D;EiBjD/F,OAAO,EnB+E6B,GAAG;;AmB9EvC,eAAC;EACC,KAAK,EjBkC6B,OAAK;EiBjCvC,eAAe,EAAE,IAAI;;AACvB,8BAAgB;EACd,OAAO,EAAE,IAAI;;AACf,kCAAoB;EAClB,OAAO,EAAE,IAAqB;EAC9B,gBAAgB,EAAE,OAAkC;EACpD,OAAO,EAAE,KAAK;EACd,UAAU,EAAE,KAAK;EACjB,SAAS,EAAE,GAAG;EACd,MAAM,EAAE,OAAO;EACf,KAAK,EjBX6B,OAAM;ElB4F1C,KAAK,EAAE,CAAC;;AACR,mFAAS;EAEP,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,EAAE;;AACb,wCAAO;EACL,KAAK,EAAE,IAAI;;AmCrFX,gsDAAG;EACD,KAAK,EjBmB2B,OAAyB;;AiBlB3D,0FAAQ;EACN,KAAK,EAAE,IAAI;;AACb,6CAAU;EACR,KAAK,EAAE,IAAI;;AACb,kDAAiB;EACf,gBAAgB,EnBQgB,OAAI;EmBPpC,KAAK,EjBO2B,IAAM;;AiBNxC,yDAAwB;EACtB,gBAAgB,EjBsBgB,OAAO;EiBrBvC,KAAK,EnBzB2B,IAAI;;AmB0BxC,0CAA8B;EAC5B,OAAO,EAAE,KAAK;;AAChB,iCAAmB;EACjB,SAAS,EAAE,GAAG;EACd,OAAO,EAAE,IAAqB;EAC9B,KAAK,EjBJ6B,IAAY;EiBK9C,OAAO,EAAE,IAAI;;AACb,oCAAE;EACA,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,GAAG;EACX,MAAM,EAAE,CAAC;EACT,MAAM,EAAE,MAAM;EACd,OAAO,EAAE,CAAC;EACV,UAAU,EAAE,iBAA6C;;AAC3D,oCAAE;EACA,OAAO,EAAE,YAAY;EACrB,MAAM,EAAE,CAAC;;AACT,sCAAC;EACC,OAAO,EAAE,YAAY;EACrB,OAAO,EAAE,GAAqB;EAC9B,KAAK,EjBZyB,OAAyB;;AiBa7D,uBAAW;EACT,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,KAAK,EAAE,IAAI;EACX,IAAI,EAAE,IAAI;EACV,MAAM,EAAE,IAAI;EACZ,SAAS,EnBkByB,KAAK;;AmBjBvC,kCAAU;EACR,KAAK,EAAE,IAAI;;AACb,oEAAQ;EACN,KAAK,EAAE,IAAI;;AACb,qDAA+B;EAC7B,UAAU,EAAE,KAAK;;AACjB,gIAAQ;EACN,KAAK,EAAE,IAAI;;AACb,gEAAU;EACR,KAAK,EAAE,IAAI;;AACf,4CAAoB;EAClB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,KAAuB;EAChC,OAAO,EAAE,KAAK;EACd,UAAU,EAAE,MAAM;;;AhBhDpB,oCAAsB;EgBmDxB,aAAa;IACX,KAAK,EAAE,GAAG;IACV,OAAO,EAAE,IAAI;;EACb,mBAAO;IACL,OAAO,EAAE,KAAK;;;ACtElB,gBAAG;EACD,SAAS,EAAE,IAAI;EACf,MAAM,EAAE,eAAe;;AAEzB,4DAAkC;EAChC,WAAW,EAAE,MAAM;;AAErB,uBAAU;EACR,aAAa,EpBOqB,IAAI;;AoBNtC,iCAAS;EACP,UAAU,EAAE,MAAM;;AAEtB,oCAAuB;EACrB,UAAU,EAAE,MAAM;;AAGpB,4DAAoC;EAClC,aAAa,EpBFqB,IAAI;;AoBaxC,uBAAU;EACR,WAAW,EpBduB,IAAI;EoBetC,WAAW,EpBfuB,IAAI;EoBgBtC,aAAa,EpBhBqB,IAAI;;AoBsBtC,4VAAK;EACH,aAAa,EAAE,CAAC;;AAKlB,qCAAQ;EACN,YAAY,EAAE,GAAG;;AAUrB,8BAAiB;EACf,YAAY,EAAE,kBAAc;;AAC5B,oEAAM;EACJ,UAAU,EAAE,sBAAsB;EAClC,YAAY,EAAE,6BAAyB;;AAG3C,2EAAiD;EAC/C,UAAU,EAAE,WAAW;;AACzB,2EAAiD;EAC/C,UAAU,EAAE,WAAW;;AAGzB,sDAA4B;EAC1B,aAAa,EAAE,IAAqB;;AACtC,wBAAW;EACT,WAAW,EpBvDuB,IAAI;;AoB0DxC,yBAAY;EACV,WAAW,EAAE,IAAI;EACjB,aAAa,EAAE,IAAqB;;AACtC,yBAAY;EACV,KAAK,ElB3D6B,OAAW;;AkB4D/C,yBAAY;EACV,KAAK,EAAE,KAAK;EACZ,MAAM,EAAE,iBAA2C;;AACrD,wBAAW;EACT,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,iBAA2C;;AACrD,0BAAa;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,KAAK;;AAMd,qSAAW;EACT,OAAO,EAAE,IAAI;EACb,UAAU,EAAE,MAAM;EAClB,SAAS,EAAE,IAAI;;AAEf,2VAAO;EACL,UAAU,EAAE,OAAO;EACnB,OAAO,EAAE,GAAO;EAChB,WAAW,EAAE,WAAW;EACxB,OAAO,EAAE,YAAY;;AACzB,2VAAmB;EACjB,OAAO,EAAE,YAAY;;AAEzB,sBAAS;EACP,UAAU,EAAE,MAAM;;AAGpB,qBAAQ;EACN,KAAK,EAAE,KAAK;EACZ,KAAK,EAAE,GAAG;EACV,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,aAAuC;EAC/C,OAAO,EpBnG2B,IAAI;EoBoGtC,UAAU,ElBjFwB,OAAmB;EkBkFrD,MAAM,EAAE,iBAA+B;;AAEvC,2EAAS;EACP,SAAS,EAAE,GAAG;;AAChB,2BAAK;EACH,aAAa,EAAE,CAAC;;AAClB,oCAAc;EACZ,OAAO,EAAE,KAAK;EACd,WAAW,ElBlFqB,8DAA8D;EkBmF9F,WAAW,EAAE,IAAI;EACjB,UAAU,ElB1FsB,OAAmB;EkB2FnD,OAAO,EAAE,QAA2C;EACpD,MAAM,EAAE,KAAkB;EAC1B,aAAa,EpBlHmB,IAAI;EoBmHpC,SAAS,EAAE,IAAI;;AAEnB,yBAAY;EACV,UAAU,ElB9FwB,OAAO;EkB+FzC,OAAO,EAAE,YAAY;EACrB,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,KAAuB;;AAGlC,kEAAwC;EACtC,cAAc,EAAE,KAAK;EACrB,SAAS,EAAE,GAAG;;AAIhB,0EAAgD;EAC9C,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,IAAI;EACZ,KAAK,ElBhI6B,IAAY;;AkBiI9C,kKAAM;EACJ,MAAM,EAAE,IAAI;EACZ,gBAAgB,EAAE,sBAAsB;EACxC,WAAW,EAAE,MAAM;;AACrB,4FAAQ;EACN,YAAY,EAAE,CAAC;EACf,aAAa,EAAE,CAAC;EAChB,cAAc,EAAE,GAAG;;AACrB,sKAAI;EACF,KAAK,ElBnJ2B,IAAK;;AkB0JzC,6BAAgB;EAEd,MAAM,EAAE,IAAI;;AACZ,gCAAE;EACA,MAAM,EAAE,IAAI;;AACd,yCAAW;EACT,OAAO,EAAE,YAAY;;AACvB,yCAAW;EACT,aAAa,EAAE,IAAI;EACnB,UAAU,EAAE,IAAI;EAChB,WAAW,EAAE,MAAM;;AACrB,yCAAW;EACT,UAAU,EAAE,IAAI;;AAGpB,mDAAQ;EAEN,KAAK,EpB7L6B,IAAI;EoB8LtC,OAAO,EAAE,OAAO;;AAChB,6HAAO;EACL,SAAS,EAAE,eAAe;EAC1B,WAAW,EAAE,MAAM;;AAErB,2EAAS;EACP,KAAK,EpBvK2B,OAAI;;AoBwKtC,6HAAW;EACT,WAAW,EAAE,IAAI;EACjB,KAAK,ElB9K2B,OAAW;;AkBgL/C,yDAAY;EACV,KAAK,ElBvK6B,OAAK;;AkBwKzC,eAAE;EACA,aAAa,EpBtLqB,IAAI;;AoBuLtC,kBAAE;EACA,WAAW,EAAE,IAAI;;AAEnB,gFAAgB;EACd,aAAa,EAAE,eAAgC;;AAEjD,kBAAE;EACA,MAAM,EAAE,aAA4C;;AAMxD,8BAAiB;EACf,aAAa,EpBrMqB,IAAI;;AoBuMtC,iCAAE;EACA,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,KAAuB;EAC/B,SAAS,EAAE,GAAG;EACd,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,OAA0B;EACtC,KAAK,ElBhM2B,OAAK;EkBiMrC,UAAU,EAAE,iBAAoC;EAChD,OAAO,EAAE,GAAqB;EAC9B,QAAQ,EAAE,QAAQ;;AAClB,wCAAQ;EACN,KAAK,EAAE,OAA0B;;AACnC,6CAAW;EACT,KAAK,ElBjNyB,OAAW;EkBkNzC,SAAS,EAAE,eAAe;;AAE9B,oCAAK;EACH,aAAa,EAAE,GAAqB;EACpC,MAAM,EAAE,IAAI;EACZ,WAAW,EAAE,iBAAuB;EACpC,UAAU,EAAE,OAAa;EACzB,KAAK,ElBhO2B,IAAK;;AkBiOrC,gDAAW;EACT,KAAK,ElB3NyB,OAAW;EkB4NzC,SAAS,EAAE,eAAe;;AAC9B,6CAAc;EACZ,UAAU,EAAE,CAAC;;AAEf,yGAAQ;EACN,WAAW,EAAE,IAAI;;AACjB,yRAA2B;EACzB,gBAAgB,EAAE,WAAW;EAC7B,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,CAAC;EACV,SAAS,EAAE,eAAe;;AAC5B,oIAAU;EACR,WAAW,EAAE,IAAI;;AAErB,wCAAS;EACP,OAAO,EAAE,YAAY;EACrB,OAAO,EAAE,KAAK;EACd,KAAK,EpBtQ2B,IAAI;EoBuQpC,WAAW,EAAE,IAAI;;AACnB,wCAAS;EACP,OAAO,EAAE,YAAY;EACrB,aAAa,EAAE,GAAG;;AAEtB,wDAA8B;EAC5B,OAAO,EAAE,YAAY;EACrB,KAAK,ElB7Q6B,OAAM;EkB8QxC,SAAS,EAAE,GAAG;EACd,YAAY,EpB1PsB,IAAI;;AoB2PxC,2BAAc;EACZ,OAAO,EAAE,KAAK;EACd,KAAK,EAAE,KAAK;;AACd,qBAAQ;EACN,aAAa,EAAE,IAAI;EACnB,WAAW,EAAE,IAAI;;AAEnB,oDAAa;EACX,UAAU,EAAE,OAAO;EACnB,OAAO,EAAE,OAAO;EAChB,WAAW,EAAE,MAAM;EACnB,WAAW,EAAE,OAAO;EACpB,SAAS,EAAE,OAAO;EAClB,KAAK,EAAE,OAAO;EACd,MAAM,EAAE,OAAO;EACf,WAAW,EAAE,OAAO;;AACpB,sFAAgB;EACd,sBAAsB,EAAE,oBAAoB;;AAG5C,oGAAQ;EACN,YAAY,EAAE,GAAG;;AACvB,sBAAS;EACP,MAAM,EAAE,iBAAuC;EAC/C,UAAU,EAAE,OAA6B;EACzC,SAAS,EAAE,GAAG;EACd,WAAW,EAAE,GAAG;EAChB,aAAa,EAAE,GAAqB;EACpC,OAAO,EAAE,SAA4C;EACrD,MAAM,EAAE,QAA2B;;AACrC,6BAAgB;EACd,UAAU,EAAE,MAAM;;;AjB1RlB,oCAAsB;EiBgStB,qBAAQ;IACN,KAAK,EAAE,IAAI;;;ACjUjB,wBAAwB;EACtB,KAAK,EnBkC+B,OAAW;;;AmBhCjD,KAAK;EACH,UAAU,EAAE,MAAM;;;;ECHlB,WAAW,EAAE,aAAa;EAC1B,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,GAAG,EAAE,4GAA4G;;;EAGjH,WAAW,EAAE,aAAa;EAC1B,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,GAAG,EAAE,2GAA2G;;;EAGhH,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,GAAG,EAAE,+FAA+F;;;EAGpG,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,GAAG,EAAE,sFAAsF;;;EAG3F,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,GAAG,EAAE,4FAA4F;;;EAGjG,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,GAAG,EAAE,yGAAyG;;;EAG9G,WAAW,EAAE,aAAa;EAC1B,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,GAAG,EAAE,kHAAkH;;;EAGvH,WAAW,EAAE,aAAa;EAC1B,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,GAAG,EAAE,yGAAyG;;ACShH,mBAAmB;EACjB,gBAAgB,EAAE,GAAG", +"sources": ["../../../bower_components/neat/app/assets/stylesheets/grid/_grid.scss","../../../bower_components/bourbon/dist/addons/_prefixer.scss","../../../bower_components/wyrm/sass/wyrm_core/_reset.sass","../../../bower_components/wyrm/sass/wyrm_core/_mixin.sass","../../../bower_components/font-awesome/scss/font-awesome.scss","../../../bower_components/font-awesome/scss/_path.scss","../../../bower_components/font-awesome/scss/_core.scss","../../../bower_components/font-awesome/scss/_larger.scss","../../../bower_components/font-awesome/scss/_fixed-width.scss","../../../bower_components/font-awesome/scss/_list.scss","../../../bower_components/font-awesome/scss/_variables.scss","../../../bower_components/font-awesome/scss/_bordered-pulled.scss","../../../bower_components/font-awesome/scss/_animated.scss","../../../bower_components/font-awesome/scss/_rotated-flipped.scss","../../../bower_components/font-awesome/scss/_mixins.scss","../../../bower_components/font-awesome/scss/_stacked.scss","../../../bower_components/font-awesome/scss/_icons.scss","../../../bower_components/font-awesome/scss/_screen-reader.scss","../../../bower_components/wyrm/sass/wyrm_core/_font_icon_defaults.sass","../../../bower_components/wyrm/sass/wyrm_core/_wy_variables.sass","../../../bower_components/wyrm/sass/wyrm_core/_alert.sass","../../../sass/_theme_variables.sass","../../../bower_components/neat/app/assets/stylesheets/grid/_media.scss","../../../bower_components/wyrm/sass/wyrm_core/_button.sass","../../../bower_components/wyrm/sass/wyrm_core/_dropdown.sass","../../../bower_components/wyrm/sass/wyrm_core/_form.sass","../../../bower_components/neat/app/assets/stylesheets/grid/_outer-container.scss","../../../bower_components/neat/app/assets/stylesheets/settings/_grid.scss","../../../bower_components/neat/app/assets/stylesheets/grid/_span-columns.scss","../../../bower_components/wyrm/sass/wyrm_core/_neat_extra.sass","../../../bower_components/wyrm/sass/wyrm_core/_generic.sass","../../../bower_components/wyrm/sass/wyrm_core/_table.sass","../../../bower_components/wyrm/sass/wyrm_core/_type.sass","../../../bower_components/wyrm/sass/wyrm_addons/pygments/_pygments.sass","../../../bower_components/wyrm/sass/wyrm_addons/pygments/_pygments_light.sass","../../../sass/_theme_breadcrumbs.sass","../../../sass/_theme_layout.sass","../../../bower_components/neat/app/assets/stylesheets/grid/_private.scss","../../../sass/_theme_badge.sass","../../../sass/_theme_rst.sass","../../../sass/_theme_mathjax.sass","../../../sass/_theme_font_local.sass","../../../sass/theme.sass"], +"names": [], +"file": "theme.css" +} diff --git a/v24.04/en/_static/doctools.js b/v24.04/en/_static/doctools.js new file mode 100644 index 0000000..344db17 --- /dev/null +++ b/v24.04/en/_static/doctools.js @@ -0,0 +1,315 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for all documentation. + * + * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/** + * select a different prefix for underscore + */ +$u = _.noConflict(); + +/** + * make the code below compatible with browsers without + * an installed firebug like debugger +if (!window.console || !console.firebug) { + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", + "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", + "profile", "profileEnd"]; + window.console = {}; + for (var i = 0; i < names.length; ++i) + window.console[names[i]] = function() {}; +} + */ + +/** + * small helper function to urldecode strings + */ +jQuery.urldecode = function(x) { + return decodeURIComponent(x).replace(/\+/g, ' '); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var bbox = span.getBBox(); + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + var parentOfText = node.parentNode.parentNode; + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} + +/** + * Small JavaScript module for the documentation. + */ +var Documentation = { + + init : function() { + this.fixFirefoxAnchorBug(); + this.highlightSearchWords(); + this.initIndexTable(); + if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) { + this.initOnKeyListeners(); + } + }, + + /** + * i18n support + */ + TRANSLATIONS : {}, + PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, + LOCALE : 'unknown', + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext : function(string) { + var translated = Documentation.TRANSLATIONS[string]; + if (typeof translated === 'undefined') + return string; + return (typeof translated === 'string') ? translated : translated[0]; + }, + + ngettext : function(singular, plural, n) { + var translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated === 'undefined') + return (n == 1) ? singular : plural; + return translated[Documentation.PLURALEXPR(n)]; + }, + + addTranslations : function(catalog) { + for (var key in catalog.messages) + this.TRANSLATIONS[key] = catalog.messages[key]; + this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); + this.LOCALE = catalog.locale; + }, + + /** + * add context elements like header anchor links + */ + addContextElements : function() { + $('div[id] > :header:first').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this headline')). + appendTo(this); + }); + $('dt[id]').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this definition')). + appendTo(this); + }); + }, + + /** + * workaround a firefox stupidity + * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 + */ + fixFirefoxAnchorBug : function() { + if (document.location.hash && $.browser.mozilla) + window.setTimeout(function() { + document.location.href += ''; + }, 10); + }, + + /** + * highlight the search words provided in the url in the text + */ + highlightSearchWords : function() { + var params = $.getQueryParameters(); + var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; + if (terms.length) { + var body = $('div.body'); + if (!body.length) { + body = $('body'); + } + window.setTimeout(function() { + $.each(terms, function() { + body.highlightText(this.toLowerCase(), 'highlighted'); + }); + }, 10); + $('') + .appendTo($('#searchbox')); + } + }, + + /** + * init the domain index toggle buttons + */ + initIndexTable : function() { + var togglers = $('img.toggler').click(function() { + var src = $(this).attr('src'); + var idnum = $(this).attr('id').substr(7); + $('tr.cg-' + idnum).toggle(); + if (src.substr(-9) === 'minus.png') + $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); + else + $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); + }).css('display', ''); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { + togglers.click(); + } + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords : function() { + $('#searchbox .highlight-link').fadeOut(300); + $('span.highlighted').removeClass('highlighted'); + }, + + /** + * make the url absolute + */ + makeURL : function(relativeURL) { + return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; + }, + + /** + * get the current relative url + */ + getCurrentURL : function() { + var path = document.location.pathname; + var parts = path.split(/\//); + $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { + if (this === '..') + parts.pop(); + }); + var url = parts.join('/'); + return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + }, + + initOnKeyListeners: function() { + $(document).keyup(function(event) { + var activeElementType = document.activeElement.tagName; + // don't navigate when in search box or textarea + if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') { + switch (event.keyCode) { + case 37: // left + var prevHref = $('link[rel="prev"]').prop('href'); + if (prevHref) { + window.location.href = prevHref; + return false; + } + case 39: // right + var nextHref = $('link[rel="next"]').prop('href'); + if (nextHref) { + window.location.href = nextHref; + return false; + } + } + } + }); + } +}; + +// quick alias for translations +_ = Documentation.gettext; + +$(document).ready(function() { + Documentation.init(); +}); diff --git a/v24.04/en/_static/documentation_options.js b/v24.04/en/_static/documentation_options.js new file mode 100644 index 0000000..97c626c --- /dev/null +++ b/v24.04/en/_static/documentation_options.js @@ -0,0 +1,10 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '24.04.1', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + FILE_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, +}; \ No newline at end of file diff --git a/v24.04/en/_static/down-pressed.png b/v24.04/en/_static/down-pressed.png new file mode 100644 index 0000000..5756c8c Binary files /dev/null and b/v24.04/en/_static/down-pressed.png differ diff --git a/v24.04/en/_static/down.png b/v24.04/en/_static/down.png new file mode 100644 index 0000000..1b3bdad Binary files /dev/null and b/v24.04/en/_static/down.png differ diff --git a/v24.04/en/_static/favicon.ico b/v24.04/en/_static/favicon.ico new file mode 100644 index 0000000..2610018 Binary files /dev/null and b/v24.04/en/_static/favicon.ico differ diff --git a/v24.04/en/_static/favicon_KUKA.ico b/v24.04/en/_static/favicon_KUKA.ico new file mode 100644 index 0000000..e245004 Binary files /dev/null and b/v24.04/en/_static/favicon_KUKA.ico differ diff --git a/v24.04/en/_static/favicon_black.ico b/v24.04/en/_static/favicon_black.ico new file mode 100644 index 0000000..57643c7 Binary files /dev/null and b/v24.04/en/_static/favicon_black.ico differ diff --git a/v24.04/en/_static/file.png b/v24.04/en/_static/file.png new file mode 100644 index 0000000..a858a41 Binary files /dev/null and b/v24.04/en/_static/file.png differ diff --git a/v24.04/en/_static/fonts/FontAwesome.otf b/v24.04/en/_static/fonts/FontAwesome.otf new file mode 100644 index 0000000..d4de13e Binary files /dev/null and b/v24.04/en/_static/fonts/FontAwesome.otf differ diff --git a/v24.04/en/_static/fonts/Inconsolata-Bold.ttf b/v24.04/en/_static/fonts/Inconsolata-Bold.ttf new file mode 100644 index 0000000..809c1f5 Binary files /dev/null and b/v24.04/en/_static/fonts/Inconsolata-Bold.ttf differ diff --git a/v24.04/en/_static/fonts/Inconsolata-Regular.ttf b/v24.04/en/_static/fonts/Inconsolata-Regular.ttf new file mode 100644 index 0000000..fc981ce Binary files /dev/null and b/v24.04/en/_static/fonts/Inconsolata-Regular.ttf differ diff --git a/v24.04/en/_static/fonts/KUKA-Bulo-Bold-WEB.eot b/v24.04/en/_static/fonts/KUKA-Bulo-Bold-WEB.eot new file mode 100644 index 0000000..4957353 Binary files /dev/null and b/v24.04/en/_static/fonts/KUKA-Bulo-Bold-WEB.eot differ diff --git a/v24.04/en/_static/fonts/KUKA-Bulo-Bold-WEB.svg b/v24.04/en/_static/fonts/KUKA-Bulo-Bold-WEB.svg new file mode 100644 index 0000000..0c1eac2 --- /dev/null +++ b/v24.04/en/_static/fonts/KUKA-Bulo-Bold-WEB.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v24.04/en/_static/fonts/KUKA-Bulo-Bold-WEB.ttf b/v24.04/en/_static/fonts/KUKA-Bulo-Bold-WEB.ttf new file mode 100644 index 0000000..8faa7ca Binary files /dev/null and b/v24.04/en/_static/fonts/KUKA-Bulo-Bold-WEB.ttf differ diff --git a/v24.04/en/_static/fonts/KUKA-Bulo-Bold-WEB.woff b/v24.04/en/_static/fonts/KUKA-Bulo-Bold-WEB.woff new file mode 100644 index 0000000..876a710 Binary files /dev/null and b/v24.04/en/_static/fonts/KUKA-Bulo-Bold-WEB.woff differ diff --git a/v24.04/en/_static/fonts/KUKA-Bulo-Bold-WEB.woff2 b/v24.04/en/_static/fonts/KUKA-Bulo-Bold-WEB.woff2 new file mode 100644 index 0000000..ba1ba7b Binary files /dev/null and b/v24.04/en/_static/fonts/KUKA-Bulo-Bold-WEB.woff2 differ diff --git a/v24.04/en/_static/fonts/KUKA-Bulo-WEB.eot b/v24.04/en/_static/fonts/KUKA-Bulo-WEB.eot new file mode 100644 index 0000000..662660d Binary files /dev/null and b/v24.04/en/_static/fonts/KUKA-Bulo-WEB.eot differ diff --git a/v24.04/en/_static/fonts/KUKA-Bulo-WEB.svg b/v24.04/en/_static/fonts/KUKA-Bulo-WEB.svg new file mode 100644 index 0000000..c5c3b5d --- /dev/null +++ b/v24.04/en/_static/fonts/KUKA-Bulo-WEB.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v24.04/en/_static/fonts/KUKA-Bulo-WEB.ttf b/v24.04/en/_static/fonts/KUKA-Bulo-WEB.ttf new file mode 100644 index 0000000..654c0ec Binary files /dev/null and b/v24.04/en/_static/fonts/KUKA-Bulo-WEB.ttf differ diff --git a/v24.04/en/_static/fonts/KUKA-Bulo-WEB.woff b/v24.04/en/_static/fonts/KUKA-Bulo-WEB.woff new file mode 100644 index 0000000..87914c7 Binary files /dev/null and b/v24.04/en/_static/fonts/KUKA-Bulo-WEB.woff differ diff --git a/v24.04/en/_static/fonts/KUKA-Bulo-WEB.woff2 b/v24.04/en/_static/fonts/KUKA-Bulo-WEB.woff2 new file mode 100644 index 0000000..e6bc830 Binary files /dev/null and b/v24.04/en/_static/fonts/KUKA-Bulo-WEB.woff2 differ diff --git a/v24.04/en/_static/fonts/Lato-Bold.ttf b/v24.04/en/_static/fonts/Lato-Bold.ttf new file mode 100644 index 0000000..1d23c70 Binary files /dev/null and b/v24.04/en/_static/fonts/Lato-Bold.ttf differ diff --git a/v24.04/en/_static/fonts/Lato-Regular.ttf b/v24.04/en/_static/fonts/Lato-Regular.ttf new file mode 100644 index 0000000..0f3d0f8 Binary files /dev/null and b/v24.04/en/_static/fonts/Lato-Regular.ttf differ diff --git a/v24.04/en/_static/fonts/RobotoSlab-Bold.ttf b/v24.04/en/_static/fonts/RobotoSlab-Bold.ttf new file mode 100644 index 0000000..df5d1df Binary files /dev/null and b/v24.04/en/_static/fonts/RobotoSlab-Bold.ttf differ diff --git a/v24.04/en/_static/fonts/RobotoSlab-Regular.ttf b/v24.04/en/_static/fonts/RobotoSlab-Regular.ttf new file mode 100644 index 0000000..eb52a79 Binary files /dev/null and b/v24.04/en/_static/fonts/RobotoSlab-Regular.ttf differ diff --git a/v24.04/en/_static/fonts/fontawesome-webfont.eot b/v24.04/en/_static/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..c7b00d2 Binary files /dev/null and b/v24.04/en/_static/fonts/fontawesome-webfont.eot differ diff --git a/v24.04/en/_static/fonts/fontawesome-webfont.svg b/v24.04/en/_static/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..8b66187 --- /dev/null +++ b/v24.04/en/_static/fonts/fontawesome-webfont.svg @@ -0,0 +1,685 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/_static/fonts/fontawesome-webfont.ttf b/v24.04/en/_static/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..f221e50 Binary files /dev/null and b/v24.04/en/_static/fonts/fontawesome-webfont.ttf differ diff --git a/v24.04/en/_static/fonts/fontawesome-webfont.woff b/v24.04/en/_static/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..6e7483c Binary files /dev/null and b/v24.04/en/_static/fonts/fontawesome-webfont.woff differ diff --git a/v24.04/en/_static/fonts/fontawesome-webfont.woff2 b/v24.04/en/_static/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000..7eb74fd Binary files /dev/null and b/v24.04/en/_static/fonts/fontawesome-webfont.woff2 differ diff --git a/v24.04/en/_static/img/ic_settings.svg b/v24.04/en/_static/img/ic_settings.svg new file mode 100644 index 0000000..979632c --- /dev/null +++ b/v24.04/en/_static/img/ic_settings.svg @@ -0,0 +1,3 @@ + + + diff --git a/v24.04/en/_static/img/logo_balluff.svg b/v24.04/en/_static/img/logo_balluff.svg new file mode 100644 index 0000000..e759afc --- /dev/null +++ b/v24.04/en/_static/img/logo_balluff.svg @@ -0,0 +1,96 @@ + + + +image/svg+xml + + + \ No newline at end of file diff --git a/v24.04/en/_static/img/logo_basler.svg b/v24.04/en/_static/img/logo_basler.svg new file mode 100644 index 0000000..bb1153a --- /dev/null +++ b/v24.04/en/_static/img/logo_basler.svg @@ -0,0 +1,79 @@ + +image/svg+xml \ No newline at end of file diff --git a/v24.04/en/_static/img/logo_kuka.svg b/v24.04/en/_static/img/logo_kuka.svg new file mode 100644 index 0000000..8231fd2 --- /dev/null +++ b/v24.04/en/_static/img/logo_kuka.svg @@ -0,0 +1 @@ +KUKA-Logo-Orange-Gradient-RGB-37x216-RetinaSZ \ No newline at end of file diff --git a/v24.04/en/_static/img/logo_kuka_white.svg b/v24.04/en/_static/img/logo_kuka_white.svg new file mode 100644 index 0000000..6edb99c --- /dev/null +++ b/v24.04/en/_static/img/logo_kuka_white.svg @@ -0,0 +1 @@ +KUKA-Logo-White-RGB-L-Clear-@2x \ No newline at end of file diff --git a/v24.04/en/_static/img/logo_matrixvision.svg b/v24.04/en/_static/img/logo_matrixvision.svg new file mode 100644 index 0000000..cfdc9a1 --- /dev/null +++ b/v24.04/en/_static/img/logo_matrixvision.svg @@ -0,0 +1,252 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_static/img/logo_roboception.svg b/v24.04/en/_static/img/logo_roboception.svg new file mode 100644 index 0000000..9fbe202 --- /dev/null +++ b/v24.04/en/_static/img/logo_roboception.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/v24.04/en/_static/img/logo_schunk.svg b/v24.04/en/_static/img/logo_schunk.svg new file mode 100644 index 0000000..4f6d514 --- /dev/null +++ b/v24.04/en/_static/img/logo_schunk.svg @@ -0,0 +1,32 @@ + + + + +SCHUNK_Typenschildlogo_RGB + + + + + + + + + + + diff --git a/v24.04/en/_static/jquery-3.2.1.js b/v24.04/en/_static/jquery-3.2.1.js new file mode 100644 index 0000000..d2d8ca4 --- /dev/null +++ b/v24.04/en/_static/jquery-3.2.1.js @@ -0,0 +1,10253 @@ +/*! + * jQuery JavaScript Library v3.2.1 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2017-03-20T18:59Z + */ +( function( global, factory ) { + + "use strict"; + + if ( typeof module === "object" && typeof module.exports === "object" ) { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"use strict"; + +var arr = []; + +var document = window.document; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var concat = arr.concat; + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + + + + function DOMEval( code, doc ) { + doc = doc || document; + + var script = doc.createElement( "script" ); + + script.text = code; + doc.head.appendChild( script ).parentNode.removeChild( script ); + } +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.2.1", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android <=4.0 only + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && Array.isArray( src ) ? src : []; + + } else { + clone = src && jQuery.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isFunction: function( obj ) { + return jQuery.type( obj ) === "function"; + }, + + isWindow: function( obj ) { + return obj != null && obj === obj.window; + }, + + isNumeric: function( obj ) { + + // As of jQuery 3.0, isNumeric is limited to + // strings and numbers (primitives or objects) + // that can be coerced to finite numbers (gh-2662) + var type = jQuery.type( obj ); + return ( type === "number" || type === "string" ) && + + // parseFloat NaNs numeric-cast false positives ("") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + !isNaN( obj - parseFloat( obj ) ); + }, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + + /* eslint-disable no-unused-vars */ + // See https://github.com/eslint/eslint/issues/6125 + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + globalEval: function( code ) { + DOMEval( code ); + }, + + // Convert dashed to camelCase; used by the css and data modules + // Support: IE <=9 - 11, Edge 12 - 13 + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android <=4.0 only + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var tmp, args, proxy; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: Date.now, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.3 + * https://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-08-08 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + disabledAncestor = addCombinator( + function( elem ) { + return elem.disabled === true && ("form" in elem || "label" in elem); + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[i] = "#" + nid + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement("fieldset"); + + try { + return !!fn( el ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + disabledAncestor( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( preferredDoc !== document && + (subWindow = document.defaultView) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( el ) { + el.className = "i"; + return !el.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( el ) { + el.appendChild( document.createComment("") ); + return !el.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + }); + + // ID filter and find + if ( support.getById ) { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( (elem = elems[i++]) ) { + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( el ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll(":enabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll(":disabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( el ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + !compilerCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return (sel + "").replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( (oldCache = uniqueCache[ key ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context === document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context || document, xml) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( el ) { + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( el ) { + return el.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +}; +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Simple selector that can be filtered directly, removing non-Elements + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + // Complex selector, compare the two sets, removing non-Elements + qualifier = jQuery.filter( qualifier, elements ); + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1; + } ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( nodeName( elem, "iframe" ) ) { + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( jQuery.isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && jQuery.isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( jQuery.isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the master Deferred + master = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + master.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( master.state() === "pending" || + jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return master.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); + } + + return master.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ jQuery.camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ jQuery.camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( jQuery.camelCase ); + } else { + key = jQuery.camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + jQuery.contains( elem.ownerDocument, elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + +var swap = function( elem, options, callback, args ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.apply( elem, args || [] ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, + scale = 1, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + do { + + // If previous iteration zeroed out, double until we get *something*. + // Use string for doubling so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + initialInUnit = initialInUnit / scale; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Update scale, tolerating zero or NaN from tween.cur() + // Break the loop if scale is unchanged or perfect, or if we've just had enough. + } while ( + scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations + ); + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); + +var rscriptType = ( /^$|\/(?:java|ecma)script/i ); + + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // Support: IE <=9 only + option: [ 1, "" ], + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
      " ], + col: [ 2, "", "
      " ], + tr: [ 2, "", "
      " ], + td: [ 3, "", "
      " ], + + _default: [ 0, "", "" ] +}; + +// Support: IE <=9 only +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, contains, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; +} )(); +var documentElement = document.documentElement; + + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 only +// See #13393 for more info +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = {}; + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + // Make a writable jQuery.Event from the native event object + var event = jQuery.event.fix( nativeEvent ); + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: jQuery.isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + this.focus(); + return false; + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + + which: function( event ) { + var button = event.button; + + // Add which for key events + if ( event.which == null && rkeyEvent.test( event.type ) ) { + return event.charCode != null ? event.charCode : event.keyCode; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { + if ( button & 1 ) { + return 1; + } + + if ( button & 2 ) { + return 3; + } + + if ( button & 4 ) { + return 2; + } + + return 0; + } + + return event.which; + } +}, jQuery.event.addProp ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + /* eslint-disable max-len */ + + // See https://github.com/eslint/eslint/issues/3229 + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, + + /* eslint-enable */ + + // Support: IE <=10 - 11, Edge 12 - 13 + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( ">tbody", elem )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.access( src ); + pdataCur = dataPriv.set( dest, pdataOld ); + events = pdataOld.events; + + if ( events ) { + delete pdataCur.handle; + pdataCur.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1>" ); + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = jQuery.contains( elem.ownerDocument, elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rmargin = ( /^margin/ ); + +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + div.style.cssText = + "box-sizing:border-box;" + + "position:relative;display:block;" + + "margin:auto;border:1px;padding:1px;" + + "top:1%;width:50%"; + div.innerHTML = ""; + documentElement.appendChild( container ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = divStyle.marginLeft === "2px"; + boxSizingReliableVal = divStyle.width === "4px"; + + // Support: Android 4.0 - 4.3 only + // Some styles come back with percentage values, even though they shouldn't + div.style.marginRight = "50%"; + pixelMarginRightVal = divStyle.marginRight === "4px"; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + + "padding:0;margin-top:1px;position:absolute"; + container.appendChild( div ); + + jQuery.extend( support, { + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelMarginRight: function() { + computeStyleTests(); + return pixelMarginRightVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }, + + cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style; + +// Return a css property mapped to a potentially vendor prefixed property +function vendorPropName( name ) { + + // Shortcut for names that are not vendor prefixed + if ( name in emptyStyle ) { + return name; + } + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a property mapped along what jQuery.cssProps suggests or to +// a vendor prefixed property. +function finalPropName( name ) { + var ret = jQuery.cssProps[ name ]; + if ( !ret ) { + ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; + } + return ret; +} + +function setPositiveNumber( elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { + var i, + val = 0; + + // If we already have the right measurement, avoid augmentation + if ( extra === ( isBorderBox ? "border" : "content" ) ) { + i = 4; + + // Otherwise initialize for horizontal or vertical properties + } else { + i = name === "width" ? 1 : 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin, so add it if we want it + if ( extra === "margin" ) { + val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); + } + + if ( isBorderBox ) { + + // border-box includes padding, so remove it if we want content + if ( extra === "content" ) { + val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // At this point, extra isn't border nor margin, so remove border + if ( extra !== "margin" ) { + val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } else { + + // At this point, extra isn't content, so add padding + val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // At this point, extra isn't content nor padding, so add border + if ( extra !== "padding" ) { + val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + return val; +} + +function getWidthOrHeight( elem, name, extra ) { + + // Start with computed style + var valueIsBorderBox, + styles = getStyles( elem ), + val = curCSS( elem, name, styles ), + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Computed unit is not pixels. Stop here and return. + if ( rnumnonpx.test( val ) ) { + return val; + } + + // Check for style in case a browser which returns unreliable values + // for getComputedStyle silently falls back to the reliable elem.style + valueIsBorderBox = isBorderBox && + ( support.boxSizingReliable() || val === elem.style[ name ] ); + + // Fall back to offsetWidth/Height when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + if ( val === "auto" ) { + val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ]; + } + + // Normalize "", auto, and prepare for extra + val = parseFloat( val ) || 0; + + // Use the active box-sizing model to add/subtract irrelevant styles + return ( val + + augmentWidthOrHeight( + elem, + name, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: { + "float": "cssFloat" + }, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = jQuery.camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + if ( type === "number" ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = jQuery.camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( i, name ) { + jQuery.cssHooks[ name ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, name, extra ); + } ) : + getWidthOrHeight( elem, name, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = extra && getStyles( elem ), + subtract = extra && augmentWidthOrHeight( + elem, + name, + extra, + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + styles + ); + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ name ] = value; + value = jQuery.css( elem, name ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( !rmargin.test( prefix ) ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && + ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || + jQuery.cssHooks[ tween.prop ] ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = jQuery.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 13 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = jQuery.camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( jQuery.isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + jQuery.proxy( result.stop, result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( jQuery.isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( jQuery.isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + jQuery.isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( jQuery.isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue && type !== false ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = jQuery.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( jQuery.isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( typeof value === "string" && value ) { + classes = value.match( rnothtmlwhite ) || []; + + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( jQuery.isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + if ( typeof value === "string" && value ) { + classes = value.match( rnothtmlwhite ) || []; + + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value; + + if ( typeof stateVal === "boolean" && type === "string" ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( jQuery.isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( type === "string" ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = value.match( rnothtmlwhite ) || []; + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, isFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup contextmenu" ).split( " " ), + function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; +} ); + +jQuery.fn.extend( { + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +} ); + + + + +support.focusin = "onfocusin" in window; + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = jQuery.now(); + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) { + xml = undefined; + } + + if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && jQuery.type( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = jQuery.isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ) + .filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ) + .map( function( i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( jQuery.isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; + } + } + match = responseHeaders[ key.toLowerCase() ]; + } + return match == null ? null : match; + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 13 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available, append data to url + if ( s.data ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( jQuery.isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + + +jQuery._evalUrl = function( url ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + "throws": true + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( jQuery.isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var isFunction = jQuery.isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain requests + if ( s.crossDomain ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Accessories

      +
      +

      Connectivity kit

      +

      Roboception offers an optional connectivity kit to aid customers with setting up the rc_visard NG. +For permanent installation, the customer is responsible for providing a suitable power supply. +The connectivity kit consists of a:

      +
        +
      • network cable with straight M12 plug to straight RJ45 connector in either 2 m, 5 m, or 10 m length,
      • +
      • power adapter cable with straight M12 socket to DC barrel connector in 30 cm length,
      • +
      • 24 V, 30 W wall power supply, or a 24 V, 60 W desktop power supply.
      • +
      +

      Connecting the rc_visard NG to residential or office grid power requires a power supply that +meets EN 55011 Class B emission standards. The E2CFS 30W 24V by EGSTON System Electronics +Eggenburg GmbH (http://www.egston.com) contained in the connectivity kit is certified +accordingly. However, it does not meet immunity standards for industrial environments +under EN 61000-6-2.

      +
      +_images/rc_visard_connectivity_kit.png +

      Fig. 62 The optional connectivity kit’s components

      +
      +
      +
      +

      Wiring

      +

      Cables are by default not provided with the rc_visard NG. It is the customer’s responsibility +to obtain appropriate parts. The following sections provide an overview of suggested components.

      +
      +

      Ethernet connections

      +

      The rc_visard NG provides an industrial 8-pin A-coded M12 socket connector for Ethernet connectivity. +Various cabling solutions can be obtained directly from third party vendors.

      +

      CAT5 (1 Gbps) M12 plug to RJ45

      +
        +
      • Straight M12 plug to straight RJ45 connector, 10 m length: Phoenix Contact NBC-MS/ 10,0-94B/R4AC SCO, Art.-Nr.: 1407417
      • +
      • Straight M12 plug to straight RJ45 connector, 10 m length: MURR Electronics Art.-Nr.: 7700-48521-S4W1000
      • +
      • Angled M12 plug to straight RJ45 connector, 10 m length: MURR Electronics Art.-Nr.: 7700-48551-S4W1000
      • +
      +
      +
      +

      Power connections

      +

      An 8-pin A-coded M12 plug connector is provided for power and GPIO connectivity. +Various cabling solutions can be obtained from third party vendors. A selection of M12 +to open ended cables is provided below. Customers are required to provide power and GPIO +connections to the cables according to the pinouts described in +Wiring. +The rc_visard NG’s housing must be connected to ground.

      +

      Sensor/Actor cable M12 socket to open end

      +
        +
      • Straight M12 socket connector to open end, shielded, 10m length: Phoenix Contact SAC-8P-10,0-PUR/M12FS SH, Art.Nr.: 1522891
      • +
      • Angled M12 socket connector to open end, shielded 10m length: Phoenix Contact SAC-8P-10,0-PUR/M12FR SH, Art.Nr.: 1522943
      • +
      +

      Sensor/Actor M12 socket for field termination

      +
        +
      • Phoenix Contact SACC-M12FS-8CON-PG9-M, Art.Nr.:1513347
      • +
      • TE Connectivity T4110011081-000 (metal housing)
      • +
      • TE Connectivity T4110001081-000 (plastic housing)
      • +
      +
      +
      +

      Power supplies

      +

      The rc_visard NG is classified as an EN-55011 Class B device and immune to light +industrial and industrial environments. For connecting the sensor to residential +grid power, a power supply under EN 55011/55022 Class B has to be used.

      +

      It is the customer’s responsibility to obtain and install a suitable power supply +satisfying EN 61000-6-2 for permanent installation in industrial environments. One +example that satisfies both EN 61000-6-2 and EN 55011/55022 Class B is the DIN-Rail +mounted PULS MiniLine ML60.241 24V/DC 2.5 A by PULS GmbH (http://www.pulspower.com). +A certified electrician must perform installation.

      +

      Only one rc_visard NG shall be connected to a power supply at any time, and the total +length of cables must be less than 30 m.

      +
      +
      +
      +

      Spare parts

      +

      No user-serviceable spare parts are currently available for rc_visard NG +devices.

      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/appendix.html b/v24.04/en/appendix.html new file mode 100644 index 0000000..29a8d0c --- /dev/null +++ b/v24.04/en/appendix.html @@ -0,0 +1,740 @@ + + + + + + + + + + + Appendix — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Appendix

      +
      +

      Pose formats

      +

      A pose consists of a translation and rotation. The translation defines the +shift along the \(x\), \(y\) and \(z\) axes. +The rotation can be defined in many different ways. The +rc_visard NG uses quaternions to define rotations and translations are given in meters. +This is called the +XYZ+quaternion format. This chapter explains the conversion between different +common conventions and the XYZ+quaternion format.

      +

      It is quite common to define rotations in 3D by three angles that define +rotations around the three coordinate axes. Unfortunately, there are many +different ways to do that. The most common conventions are Euler and Cardan +angles (also called Tait-Bryan angles). In both conventions, the rotations can +be applied to the previously rotated axis (intrinsic rotation) or to the axis +of a fixed coordinate system (extrinsic rotation).

      +

      We use \(x\), \(y\) and \(z\) to denote the three coordinate axes. +\(x'\), \(y'\) and \(z'\) refer to the axes that have been rotated +one time. Similarly, \(x''\), \(y''\) and \(z''\) are the axes +after two rotations.

      +

      In the (original) Euler angle convention, the first and the third axis are +always the same. The rotation order \(z\)-\(x'\)-\(z''\) means +rotating around the \(z\)-axis, then around the already rotated +\(x\)-axis and finally around the (two times) rotated \(z\)-axis. In +the Cardan angle convention, three different rotation axes are used, e.g. +\(z\)-\(y'\)-\(x''\). Cardan angles are often also just called +Euler angles.

      +

      For each intrinsic rotation order, there is an equivalent extrinsic rotation +order, which is inverted, e.g. the intrinsic rotation order +\(z\)-\(y'\)-\(x''\) is equivalent to the extrinsic rotation order +\(x\)-\(y\)-\(z\).

      +

      Rotations around the \(x\), \(y\) and \(z\) axes can be defined +by quaternions as

      +
      +\[\begin{split}\begin{align*} +r_x(\alpha) &= \left(\begin{array}{c}\sin\frac{\alpha}{2} \\ 0 \\ 0 \\ \cos\frac{\alpha}{2}\end{array}\right)\text{,} & +r_y(\beta) &= \left(\begin{array}{c}0 \\ \sin\frac{\beta}{2} \\ 0 \\ \cos\frac{\beta}{2}\end{array}\right)\text{,} & +r_z(\gamma) &= \left(\begin{array}{c}0 \\ 0 \\ \sin\frac{\gamma}{2} \\ \cos\frac{\gamma}{2}\end{array}\right)\text{,} +\end{align*}\end{split}\]
      +

      or by rotation matrices as

      +
      +\[\begin{split}r_x(\alpha) &= +\left(\begin{array}{ccc} + 1 & 0 & 0 \\ + 0 & \cos\alpha & -\sin\alpha \\ + 0 & \sin\alpha & \cos\alpha +\end{array}\right)\text{,} \\ +r_y(\beta) &= +\left(\begin{array}{ccc} + \cos\beta & 0 & \sin\beta \\ + 0 & 1 & 0 \\ + -\sin\beta & 0 & \cos\beta +\end{array}\right)\text{,} \\ +r_z(\gamma) &= +\left(\begin{array}{ccc} + \cos\gamma & -\sin\gamma & 0 \\ + \sin\gamma & \cos\gamma & 0 \\ + 0 & 0 & 1 +\end{array}\right)\text{.}\end{split}\]
      +

      The extrinsic rotation order \(x\)-\(y\)-\(z\) can be computed by +multiplying the individual rotations in inverse order, i.e. \(r_z(\gamma) +r_y(\beta) r_x(\alpha)\).

      +

      Based on these definitions, the following sections explain the conversion +between common conventions and the XYZ+quaternion format.

      +
      +

      Note

      +

      Please be aware of units for positions and orientations. rc_visard NG +devices always specify positions in meters, while most robot manufacturers use +millimeters or inches. Angles are typically specified in degrees, but may +sometimes also be given in radians.

      +
      + +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/blaze.html b/v24.04/en/blaze.html new file mode 100644 index 0000000..d52a92d --- /dev/null +++ b/v24.04/en/blaze.html @@ -0,0 +1,1518 @@ + + + + + + + + + + + Blaze — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Blaze

      +

      The blaze module is a base module which is available on every rc_visard NG +and provides disparity, confidence and error images of a connected Basler blaze camera +in an RGB-D setup, i.e. the blaze +Time-of-Flight (ToF) camera in combination with the Basler aceA1300 color camera.

      +

      After connecting the Basler blaze sensor to the rc_cube, it can take up to about one minute until it is found. Upon first +connection of the sensor to the rc_cube, the sensor must be calibrated before it can be used. +Calibration can be done through the Web GUI on the page Camera calibration under Configuration in the respective pipeline. +After storing the calibration, it will persistently reside on the rc_cube and automatically be +used whenever the sensor is connected to the rc_cube again, regardless of the port or pipeline.

      +

      The blaze module only runs in camera pipelines of type blaze.

      +
      +

      Viewing and downloading images and point clouds

      +

      The rc_visard NG provides time-stamped disparity, error, and confidence images over the +GenICam interface (see Provided image streams). +Live streams of the images are provided with reduced quality on the Depth Image page in the desired pipeline of the +Web GUI.

      +

      The Web GUI also provides the possibility to download a snapshot of the current scene containing the depth, error and confidence +images, as well as a point cloud in ply format as described in +Downloading depth images and point clouds.

      +
      +
      +

      Parameters

      +

      The blaze module is called rc_blaze in the REST-API and it is represented by the +Depth Image page in the desired pipeline in the Web GUI, +when a Basler blaze camera is connected and running in the corresponding pipeline. +The user can change the blaze parameters there, or use the REST-API +(REST-API interface).

      +
      +

      Parameter overview

      +

      This module offers the following run-time parameters:

      + + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      The rc_blaze module’s run-time parameters
      NameTypeMinMaxDefaultDescription
      acquisition_modestring--ContinuousAcquisition mode: [Continuous, SingleFrame]
      ambiguity_filterboolfalsetruetrueAmbiguity filter
      ambiguity_filter_thresholdint320255204Ambiguity filter threshold
      exp_valuefloat640.00010.0010.001Exposure time of ToF camera
      fillint32043Tolerance for hole filling in pixels
      gamma_correctionboolfalsetruetrueGamma correction
      maxdepthfloat640.0110.010.0Maximum depth in meters
      minconffloat640.01.00.00488Minimum confidence
      mindepthfloat640.110.00.1Minimum depth in meters
      outlier_removalboolfalsetruetrueOutlier removal
      outlier_removal_thresholdint32085Outlier removal threshold
      segint3204000200Minimum size of valid segments in pixels
      spatial_filterboolfalsetruetrueSpatial filter
      temporal_filterboolfalsetruetrueTemporal filter
      temporal_filter_strengthint3250255200Temporal filter strength
      thermal_drift_correctionboolfalsetruetrueThermal drift correction
      +
      +
      +

      Description of run-time parameters

      +

      Each run-time parameter is represented by a row on the Web GUI’s Depth Image page. The name in the +Web GUI is given in brackets behind the parameter name and the parameters are listed in the order +they appear in the Web GUI:

      +
      +

      exp_value (Exposure Time)

      +
      +
      +

      This parameter is the exposure time of the blaze camera in seconds. It controls for how long the +photosensitive cells are exposed to light. If the operating mode is changed, the exposure +time is set to the recommended default value. Reducing the exposure time may reduce measurement +accuracy and is only recommended when the image is overexposed.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?exp_value=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_blaze/parameters?exp_value=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      acquisition_mode (Acquisition Mode)

      +
      +
      +

      The acquisition mode can be set to Continuous (Continuous) or SingleFrame (Single). +The first one is the default and continuously provides depth images. +In single frame mode, images are only captured when the Acquire button is clicked.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?acquisition_mode=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_blaze/parameters?acquisition_mode=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      mindepth (Minimum Distance)

      +
      +

      The minimum distance is the smallest distance from the camera +at which measurements should be possible. The minimum distance +is given in meters.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?mindepth=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_blaze/parameters?mindepth=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      maxdepth (Maximum Distance)

      +
      +

      The maximum distance is the largest distance from the camera +at which measurements should be possible. Pixels with larger distance values are +set to invalid in the disparity image. The maximum distance is given in meters.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?maxdepth=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_blaze/parameters?maxdepth=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      fill (Fill-in)

      +
      +

      This option is used to fill holes in the disparity image by interpolation. +The fill-in value is the maximum allowed disparity step on the border of the +hole. Larger fill-in values can decrease the number of holes, but the interpolated +values can have larger errors. At most 5% of pixels are interpolated. Interpolation +of small holes is preferred over interpolation of larger holes. The confidence for +the interpolated pixels is set to a low value of 0.5. A fill-in value of 0 +switches hole filling off.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?fill=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_blaze/parameters?fill=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      seg (Segmentation)

      +
      +

      The segmentation parameter is used to set the minimum number of +pixels that a connected disparity region in the disparity image must fill. +Isolated regions that are smaller are set to invalid in the disparity image. +Segmentation is useful for removing erroneous disparities. However, +larger values may also remove real objects.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?seg=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_blaze/parameters?seg=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      minconf (Minimum Confidence)

      +
      +

      The minimum confidence can be set to filter potentially false disparity measurements. +All pixels with less confidence than the chosen value are set to invalid +in the disparity image.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?minconf=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_blaze/parameters?minconf=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      spatial_filter (Spatial Filter)

      +
      +

      This parameter enables the spatial noise filter. The spatial noise filter uses the +values of neighboring pixels to filter out noise in an image. +It is based on the raw data of the image.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?spatial_filter=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_blaze/parameters?spatial_filter=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      temporal_filter (Temporal Filter)

      +
      +

      This parameter enables the temporal noise filter. The temporal noise filter +uses the values of the same pixel at different points in time to filter out +noise in an image. It is based on the depth data of the image.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?temporal_filter=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_blaze/parameters?temporal_filter=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      temporal_filter_strength (Strength)

      +
      +

      This parameter represents the strength of the temporal filter. +The higher the value, the stronger the filter. High values may +cause motion artifacts, while low values reduce the efficacy of the filter.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?temporal_filter_strength=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_blaze/parameters?temporal_filter_strength=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      outlier_removal (Outlier Removal)

      +
      +

      This parameter enables the outlier removal filter. +It removes pixels that differ significantly from their local environment.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?outlier_removal=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_blaze/parameters?outlier_removal=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      outlier_removal_threshold (Threshold)

      +
      +

      This parameter determines the strength of the outlier removal filter. +The higher the value, the more outliers will be removed.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?outlier_removal_threshold=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_blaze/parameters?outlier_removal_threshold=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      ambiguity_filter (Ambiguity Filter)

      +
      +

      This parameter enables the ambiguity filter. The ambiguity filter removes +pixels whose depth data is ambiguous. In certain demanding scenes, e.g., +because of stray light or multi-path effects, detection may fail. In this case, +the filter should be disabled.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?ambiguity_filter=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_blaze/parameters?ambiguity_filter=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      ambiguity_filter_threshold (Threshold)

      +
      +

      This parameter determines the strength of the ambiguity filter. +The higher the value, the stronger the filter. +Higher values increase the reliability of the filter.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?ambiguity_filter_threshold=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_blaze/parameters?ambiguity_filter_threshold=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      gamma_correction (Gamma Correction)

      +
      +

      This parameter enables gamma correction on the intensity image, which is +a nonlinear operation to lighten the dark regions of the image.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?gamma_correction=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_blaze/parameters?gamma_correction=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      thermal_drift_correction (Thermal Drift Correction)

      +
      +

      This parameter activates the correction of the thermal drift.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/parameters?thermal_drift_correction=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_blaze/parameters?thermal_drift_correction=<value>
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +

      Status values

      +

      This module reports the following status values:

      + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
      The rc_blaze module’s status values
      NameDescription
      fpsActual frame rate of the disparity, error, and confidence images. This value is shown in the Web GUI below the image preview as FPS (Hz).
      latencyTime in seconds between image acquisition and publishing of disparity image
      widthCurrent width of the disparity, error, and confidence images in pixels
      heightCurrent height of the disparity, error, and confidence images in pixels
      mindepthActual minimum working distance in meters
      maxdepthActual maximum working distance in meters
      +
      +
      +

      Services

      +

      The Blaze module offers the following services.

      +
      +

      acquisition_trigger

      +
      +

      Signals the module to acquire a depth image, if the parameter acquisition_mode is set to SingleFrame.

      +

      Details

      +
      +

      An error is returned if the acquisition_mode is set to Continuous.

      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/services/acquisition_trigger
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_blaze/services/acquisition_trigger
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      Possible return codes are shown below.

      + + ++++ + + + + + + + + + + + + + + + + + + + +
      Possible return codes of the acquisition_trigger service call.
      CodeDescription
      0Success
      -8Triggering is only possible in SingleFrame acquisition mode
      101Trigger is ignored, because there is a trigger call pending
      102Trigger is ignored, because there are no subscribers
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "acquisition_trigger",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      reset_defaults

      +
      +

      Restores and applies the default values for this module’s parameters +(“factory reset”).

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_blaze/services/reset_defaults
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_blaze/services/reset_defaults
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "reset_defaults",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + + +
      +
      + +
      +
      +
      + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/cadmatch.html b/v24.04/en/cadmatch.html new file mode 100644 index 0000000..ead0783 --- /dev/null +++ b/v24.04/en/cadmatch.html @@ -0,0 +1,3381 @@ + + + + + + + + + + + CADMatch — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      CADMatch

      +
      +

      Introduction

      +

      The CADMatch module is an optional module of the rc_visard NG and requires a separate CADMatch license + to be purchased.

      +

      This module provides an out-of-the-box perception solution for 3D object detection and grasping. +CADMatch targets the detection of 3D objects based on a CAD template for picking +with a general gripper. The objects can be located in a bin or placed arbitrarily in the +field of view of the camera.

      +

      For the CADMatch module to work, special object templates are required for each type of object to +be detected. Please get in touch with the Roboception support (Contact) to order a template for your CAD file.

      +

      The CADMatch module offers:

      +
        +
      • A dedicated page on the rc_visard NG Web GUI +for easy setup, configuration, testing, and application tuning.
      • +
      • A REST-API interface and a +KUKA Ethernet KRL Interface.
      • +
      • The definition of regions of interest to select relevant volumes in the scene +(see RoiDB).
      • +
      • A load carrier detection functionality for bin-picking applications +(see LoadCarrier), +to provide grasps for objects inside a bin only.
      • +
      • The definition of compartments inside a load carrier to provide grasps +for specific volumes of the bin only.
      • +
      • The option to use user-defined object pose priors.
      • +
      • Storing of up to 50 templates.
      • +
      • The definition of up to 100 grasp points for each template via an interactive visualization in the Web GUI.
      • +
      • Collision checking between the gripper and the load carrier, other detected objects and/or the point cloud.
      • +
      • Collision checking between the object in the gripper and the load carrier walls during retraction.
      • +
      • Support for static and robot-mounted cameras and +optional integration with the Hand-eye calibration + module, +to provide grasps in the user-configured external reference frame.
      • +
      • Selection of a sorting strategy to sort the detected objects and returned grasps.
      • +
      • 3D visualization of the detection results with grasp points and gripper animations in the Web GUI.
      • +
      +
      +
      +

      Setting of grasp points

      +

      The CADMatch module detects 3D objects in a scene based on a CAD template and returns the +poses of the object origins. To use CADMatch directly in a robot application, up to 100 grasp points +can be defined for each template. A grasp point represents the desired position and orientation +of the robot’s TCP (Tool Center Point) to grasp an object.

      +

      Please consult Setting of grasp points for further details.

      +
      +

      Setting grasp points in the Web GUI

      +

      The rc_visard NG Web GUI provides an intuitive and interactive way of defining grasp points for object templates. +In a first step, the object template has to be uploaded to the rc_visard NG. This can be done +in the Web GUI in any pipeline under Modules ‣ CADMatch +by clicking on + Add a new Template in the +Templates, Grasps and Pose Priors section, or in Database ‣ Templates in the +CADMatch Templates, Grasps and Pose Priors section. Once the +template upload is complete, a dialog with a 3D visualization of the object template is shown +for adding or editing grasp +points. The same dialog appears when editing an existing template.

      +

      More details are given in +Setting grasp points in the Web GUI.

      +
      +
      +

      Setting grasp points via the REST-API

      +

      Grasp points can be set via the REST-API interface +using the set_grasp or set_all_grasps services +(see Internal services).

      +

      More details are given in Setting grasp points via the REST-API.

      +
      +
      +
      +

      Setting of pose priors

      +

      The CADMatch module offers the possibility to define prior poses of the objects to be detected. +If a pose prior is given, the object detection will use this pose prior and only refine the +given pose. This speeds up the detection significantly. A pose prior represents the approximate +position and orientation of the object to be detected. The pose can be defined in the camera or +the external coordinate frame, if a hand-eye calibration is available.

      +

      Each pose prior consists of an id which must be +unique within all pose priors for an object template, the template_id representing the template the pose +prior applies to, the pose and the pose_frame of the prior. +Pose priors can be set via the REST-API interface, +or by using the interactive visualization in the Web GUI. The Web GUI allows to interactively position the object +in the current point cloud. This can be done in the “Pose Priors” tab during editing a template.

      +

      Pose priors should be used in applications where the approximate object poses are known beforehand. +The rc_visard NG can store up to 50 pose priors per template.

      +
      +
      +

      Setting the preferred orientation of the TCP

      +

      The CADMatch module determines the reachability of grasp points based on the preferred orientation of the +gripper or TCP. The preferred orientation can be set via the set_preferred_orientation service call or on +the CADMatch page in the Web GUI. +The resulting direction of the TCP’s z axis is used to reject grasps which cannot be reached by the gripper. +Furthermore, the preferred orientation can be used to sort the reachable grasps by setting the corresponding +sorting strategy.

      +

      The preferred orientation can be set in the camera coordinate frame or in the external coordinate frame, in case +a hand-eye calibration is available. If the preferred orientation is specified in the external coordinate frame +and the sensor is robot mounted, the current robot pose has to be given to each object detection call, so that the +preferred orientation can be used for filtering and, optionally, sorting the grasps on the detected objects. +If no preferred orientation is set, the orientation of the left camera is used as the preferred orientation of the TCP.

      +
      +
      +

      Setting the sorting strategies

      +

      The objects and grasps returned by the detect_object service call are sorted according to a sorting strategy which can be +chosen by the user. The following sorting strategies are available and +can be set in the Web GUI +or using the set_sorting_strategies service call:

      +
        +
      • gravity: highest matches and grasp points along the gravity direction are returned first,
      • +
      • match_score: matches with the highest match score and grasp points on objects with the highest match score are returned first,
      • +
      • preferred_orientation: matches and grasp points with minimal rotation difference between their orientation and the preferred orientation of the TCP are returned first,
      • +
      • direction: matches and grasp points with the shortest distance along a defined direction vector in a given pose_frame are returned first.
      • +
      +

      If no sorting strategy is set or default sorting is chosen in the Web GUI, sorting is done based on a combination of +match_score and the minimal distance from the camera along the z axis of the preferred orientation of the TCP.

      +
      +
      +

      Detection of objects

      +

      The CADMatch module requires an object template for object detection. This template contains +information about the 3D shape of the object and prominent edges that can be visible in the +camera images. CADMatch also supports partial object templates, which contain only a specific +part of the object that can be detected well, e.g., in case of occlusions. Furthermore, templates +can require a pose prior for the detection which is then only refined using the image data.

      +

      The object detection is a two-stage process consisting of a prior estimation step and a pose refinement step. +First, a pose prior is computed based on the appearance +of the object in the camera images. Second, the pose is refined by using the 3D point cloud and +edges in the camera image. For this to work, the objects to detect must be visible in both left and right camera images. +If pose priors are given, only the pose refinement step is performed based, which decreases runtime significantly.

      +

      For triggering the object detection, in general, the following information +must be provided to the CADMatch module:

      +
        +
      • The template ID of the object to be detected in the scene.
      • +
      • The coordinate frame in which the poses of the detected objects and the grasp points shall be returned +(ref. Hand-eye calibration).
      • +
      +

      Optionally, further information can be given to the CADMatch module:

      +
        +
      • The IDs of the pose priors which approximately match the poses of the objects to be detected. +In case a template is used that requires a pose prior, one or more pose prior IDs have to be provided.
      • +
      • The ID of the load carrier which contains the items to be detected.
      • +
      • A compartment inside the load carrier where to detect objects (see Load carrier compartments).
      • +
      • The ID of the 3D region of interest where to search for the load carriers if a +load carrier is set. +Otherwise, the ID of the 3D region of interest where to search for the objects.
      • +
      • The current robot pose in case the camera is mounted on the robot and +the chosen coordinate frame for the poses is external, or the preferred orientation +is given in the external frame, or the chosen region of interest is defined in the external frame.
      • +
      • Collision detection information: The ID of the gripper to enable collision checking and optionally +a pre-grasp offset to define a pre-grasp position. +Details on collision +checking are given below in CollisionCheck.
      • +
      • Data acquisition mode: The user can choose if a new image dataset is acquired for the detection (default), or if the detection should be +performed on the previously used image dataset. This saves data acquisition time, e.g. in case several detections with different +templates have to be run on the same image.
      • +
      +

      On the Web GUI the detection can be tested in the Try Out section of the CADMatch module’s page.

      +

      The detected objects are returned in a list of matches, sorted according to the selected sorting strategy +(see Setting the sorting strategies). +Each detected object +includes a uuid (Universally Unique Identifier) and the +timestamp of the oldest image that was used to detect it. +The pose of a detected object corresponds to the pose of the origin of the object template used for detection. +Furthermore, the matching score is given to indicate the quality of the detection.

      +

      If the chosen template also has grasp points attached +(see Setting of grasp points), +a list of grasps for all objects is returned in addition to the list of detected objects. +The grasps are sorted according to the selected sorting strategy +(see Setting the sorting strategies). +The grasp poses are given in the desired coordinate frame. There are references between the detected objects +and the grasps via their uuids.

      +

      For objects with a discrete symmetry (e.g. prismatic objects), all collision-free symmetries of +each grasp point which are reachable according to the given preferred +TCP orientation are returned, ordered by the given sorting strategy.

      +

      For objects with a continuous symmetry (e.g. cylindrical objects), all grasps symmetric +to each grasp point on an object are checked for reachability and collisions, and only the +best one according to the given sorting strategy is returned.

      +
      +

      Note

      +

      The first detection call with a new object template takes longer than the following detection calls, +because the object template has to be loaded into the CADMatch module first. To avoid this, the +warmup_template service can be used to load a template so that it is ready when the first detection +is triggered.

      +
      +
      +
      +

      Interaction with other modules

      +

      Internally, the CADMatch module depends on, and interacts with other on-board +modules as listed below.

      +
      +

      Note

      +

      All changes and configuration updates to these modules will affect +the performance of the CADMatch modules.

      +
      +
      +

      Stereo camera and Stereo matching

      +

      The CADMatch module makes internally use of the following data:

      +
        +
      • Rectified images from the Camera module +(rc_camera);
      • +
      • Disparity, error, and confidence images from the Stereo matching module +(rc_stereomatching).
      • +
      +

      The quality parameter of the stereo matching module must be set to Medium +or higher (see Parameters). We recommend Full or High quality for using CADMatch.

      +

      All processed images are guaranteed to be captured after the module trigger time.

      +
      +
      +

      IO and Projector Control

      +

      In case the rc_visard NG is used in conjunction with an external random dot projector and +the IO and Projector Control module (rc_iocontrol), +it is recommended to connect the projector to GPIO Out 1 and set +the stereo-camera module’s acquisition mode to SingleFrameOut1 +(see Stereo matching parameters), so that +on each image acquisition trigger an image with and without projector pattern is acquired.

      +

      Alternatively, the output mode for the GPIO output in use should be set to ExposureAlternateActive +(see Description of run-time parameters).

      +

      In either case, +the Auto Exposure Mode exp_auto_mode should be set to AdaptiveOut1 to optimize the exposure +of both images (see Stereo camera parameters).

      +
      +
      +

      Hand-eye calibration

      +

      In case the camera has been calibrated to a robot, the CADMatch module +can automatically provide poses in the robot coordinate frame. +For the CADMatch node’s Services, the frame of the +output poses can be controlled with the pose_frame argument.

      +

      Two different pose_frame values can be chosen:

      +
        +
      1. Camera frame (camera). +All poses provided by the modules are in the camera frame, +and no prior knowledge about the pose of the camera in the environment is required. +This means that the configured regions of interest and load carriers move with the camera. +It is the user’s responsibility to update the configured poses +if the camera frame moves (e.g. with a robot-mounted camera).
      2. +
      3. External frame (external). +All poses provided by the modules are in the external frame, +configured by the user during the hand-eye calibration process. +The module relies on the on-board +Hand-eye calibration module +to retrieve the sensor mounting (static or robot mounted) and +the hand-eye transformation. +If the mounting is static, no further information is needed. +If the sensor is robot-mounted, the robot_pose is required +to transform poses to and from the external frame.
      4. +
      +
      +

      Note

      +

      If no hand-eye calibration is available, all pose_frame values should be set to camera.

      +
      +

      All pose_frame values that are not camera or external are rejected.

      +

      If the sensor is robot-mounted, the current robot_pose has to be provided depending on the value of pose_frame, +the definition of the preferred TCP orientation and the sorting direction:

      +
        +
      • If pose_frame is set to external, providing the robot pose is obligatory.
      • +
      • If the preferred TCP orientation is defined in external, providing the robot pose is obligatory.
      • +
      • If the sorting direction is defined in external, providing the robot pose is obligatory.
      • +
      • In all other cases, providing the robot pose is optional.
      • +
      +
      +
      +

      LoadCarrier

      +

      The CADMatch module uses the load carrier detection functionality provided by the +LoadCarrier module (rc_load_carrier), +with the run-time parameters specified for this module. However, only one load carrier will be +returned and used in case multiple matching load carriers could be found in the scene. In case multiple +load carriers of the same type are visible, a region of interest should be set to ensure that always the +same load carrier is used for the CADMatch module.

      +
      +
      +

      CollisionCheck

      +

      Collision checking can be easily enabled for +grasp computation of the CADMatch module by passing a collision_detection argument to the +detect_object service call. It contains the ID of the used gripper and +optionally a pre-grasp offset. The gripper has to be +defined in the GripperDB module +(see Setting a gripper) +and details about collision checking are given in +Collision checking within other modules.

      +

      Alternatively, grasp points can be assigned individual gripper IDs, and collision checking can be enabled for all +grasp points with gripper IDs by enabling the run-time parameter check_collisions.

      +

      If the selected CADMatch template contains a collision geometry and the run-time parameter check_collisions_with_matches is true, +also collisions between the gripper and all other detected objects (not limited to max_matches) will be checked. The object +on which the grasp point to be checked is located, is excluded from the collision check.

      +

      If the run-time parameter check_collisions_with_point_cloud is true, +also collisions between the gripper and a watertight version of the point cloud are checked. +If this feature is used with suctions grippers, it should be ensured that the TCP is defined +to be outside the gripper geometry, or that the grasp points are defined above the object surface. +Otherwise every grasp will result in a collision between the gripper and the point cloud.

      +

      If the run-time parameter check_collisions_during_retraction is true and a load carrier and a pre-grasp offset are given, +each grasp point will be checked for collisions between the object in the gripper and the load carrier walls during retraction. +This collision check is performed along the full linear trajectory from the grasp point back to the pre-grasp position.

      +

      If collision checking is enabled, only grasps which are collision free or could not be checked for collisions +(e.g. because no gripper was given) will be returned. +The result image on top of the CADMatch +page of the Web GUI also shows collision-free grasps in green, unchecked grasps in yellow and colliding grasp points in red. +The detected objects which are considered in the collision check are also visualized with their edges in red.

      +

      The CollisionCheck module’s run-time parameters affect the collision detection as described in +CollisionCheck Parameters.

      +
      +
      +
      +

      Parameters

      +

      The CADMatch module is called rc_cadmatch +in the REST-API and is represented in the +Web GUI + under +Modules ‣ CADMatch. +The user can explore and configure the rc_cadmatch +module’s run-time parameters, e.g. for development and testing, using the Web GUI or the +REST-API interface.

      +
      +

      Parameter overview

      +

      This module offers the following run-time parameters:

      + + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      The rc_cadmatch module’s run-time parameters
      NameTypeMinMaxDefaultDescription
      check_collisionsboolfalsetruefalseWhether to check for collisions when a gripper is defined for a grasp
      check_collisions_-during_retractionboolfalsetruefalseWhether to check for collisions between the object in the gripper and the load carrier during retraction
      check_collisions_with_matchesboolfalsetruetrueWhether to check for collisions between gripper and detected matches
      check_collisions_-with_point_cloudboolfalsetruefalseWhether to check for collisions between gripper and point cloud
      edge_max_distancefloat640.55.02.0Maximum allowed distance in pixels between the template edges and the detected edges in the image
      edge_sensitivityfloat640.051.00.5Sensitivity of the edge detector
      grasp_filter_-orientation_thresholdfloat640.0180.045.0Maximum allowed orientation change between grasp and preferred orientation in degrees
      max_matchesint3213010Maximum number of matches
      min_scorefloat640.051.00.3Minimum score for matches
      only_highest_priority_graspsboolfalsetruefalseWhether to return only the highest priority level grasps
      +
      +
      +

      Description of run-time parameters

      +

      Each run-time parameter is represented by a row on the Web GUI’s CADMatch page. +The name in the Web GUI is given in brackets behind the parameter name and the parameters are +listed in the order they appear in the Web GUI:

      +
      +

      max_matches (Maximum Matches)

      +
      +
      +

      is the maximum number of objects to detect.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?max_matches=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/parameters?max_matches=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      min_score (Minimum Score)

      +
      +
      +

      is the minimum detection score after refinement. The higher this value, the better 2D edges and 3D point cloud must match the given template.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?min_score=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/parameters?min_score=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      edge_sensitivity (Edge Sensitivity)

      +
      +
      +

      is the sensitivity of the edge detector. The higher the value of this parameter, the more edges will be used for pose refinement.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?edge_sensitivity=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/parameters?edge_sensitivity=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      edge_max_distance (Maximum Edge Distance)

      +
      +
      +

      is the maximum allowed distance in pixels between the template edges and the detected edges in the image during the refinement step.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?edge_max_distance=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/parameters?edge_max_distance=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      grasp_filter_orientation_threshold (Grasp Orientation Threshold)

      +
      +
      +

      is the maximum deviation of the TCP’s z axis at the grasp point from the z axis of the TCP’s preferred orientation in degrees. +Only grasp points which are within this threshold are returned. When set +to zero, any deviations are valid.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?grasp_filter_orientation_threshold=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/parameters?grasp_filter_orientation_threshold=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      only_highest_priority_grasps (Only Highest Priority Grasps)

      +
      +

      If set to true, only grasps with the highest priority will be returned. If collision checking is enabled, only the collision-free +grasps among the group of grasps with the highest priority are returned. +This can save computation time and reduce the number of grasps to be parsed on the application side.

      +

      Without collision checking, only grasps of highest priority are returned.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?only_highest_priority_grasps=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/parameters?only_highest_priority_grasps=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      check_collisions (Check Collisions)

      +
      +
      +

      If this parameter is enabled, collision checking will be performed for all grasps which have a gripper ID assigned, +even when no default gripper is given in the detect_object service call. If a load carrier is used, the collision +check will always be performed between the gripper and the load carrier. +Collision checking with the point cloud and other matches is only performed when the corresponding runtime parameters are enabled.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?check_collisions=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/parameters?check_collisions=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      check_collisions_with_matches (Check Collisions with Matches)

      +
      +
      +

      This parameter is only used when collision checking is enabled by passing a gripper to the detect_object service call +or by enabling the check_collisions runtime parameter. +If check_collisions_with_matches is set to true, +all grasp points will be checked for collisions between the gripper and all other detected objects (not limited to +max_matches), and only grasp points at which the gripper would not collide with any other detected object +will be returned.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?check_collisions_with_matches=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/parameters?check_collisions_with_matches=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      check_collisions_with_point_cloud (Check Collisions with Point Cloud)

      +
      +
      +

      This parameter is only used when collision checking is enabled by passing a gripper to the detect_object service call +or by enabling the check_collisions runtime parameter. +If check_collisions_with_point_cloud is set to true, +all grasp points will be checked for collisions between the gripper a watertight version of the point cloud, and only grasp points +at which the gripper would not collide with this point cloud will be returned.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?check_collisions_with_point_cloud=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/parameters?check_collisions_with_point_cloud=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      check_collisions_during_retraction (Check Collisions during Retraction)

      +
      +
      +

      This parameter is only used when collision checking is enabled by passing a gripper to the detect_object service call +or by enabling the check_collisions runtime parameter. +When check_collisions_during_retraction is enabled and a load carrier and a pre-grasp offset are given, +each grasp point will be checked for collisions +between the object in the gripper and the load carrier walls during retraction. +This collision checking is performed along the full linear trajectory from the grasp point back to the pre-grasp position. +Only collision-free grasp points will be returned.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_cadmatch/parameters?check_collisions_during_retraction=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/parameters?check_collisions_during_retraction=<value>
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +

      Status values

      +

      The rc_cadmatch module reports the following status values:

      + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      The rc_cadmatch module’s status values
      NameDescription
      data_acquisition_timeTime in seconds required by the last active service to acquire images
      last_timestamp_processedThe timestamp of the last processed dataset
      last_request_timestampThe timestamp of the last detection request
      load_carrier_detection_timeProcessing time of the last load carrier detection in seconds
      object_detection_timeProcessing time of the last last object detection in seconds
      processing_timeProcessing time of the last detection (including load carrier detection) in seconds
      stateThe current state of the rc_cadmatch node
      +

      The reported state can take one of the following values.

      + + ++++ + + + + + + + + + + + + + + + + +
      Possible states of the CADMatch module
      State nameDescription
      IDLEThe module is idle.
      RUNNINGThe module is running and ready for load carrier detection and object detection.
      FATALA fatal error has occurred.
      +
      +
      +

      Services

      +

      The user can explore and call the rc_cadmatch module’s services, +e.g. for development and testing, using the +REST-API interface or +the rc_visard NG +Web GUI.

      +

      The CADMatch modules offer the following services.

      +
      +

      detect_object

      +
      +

      Triggers the detection of objects as described in +Detection of objects +based on an object template.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/detect_object
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/services/detect_object
      +
      +
      +
      +
      +
      + +
      +

      Required arguments:

      +
      +

      pose_frame: see Hand-eye calibration.

      +

      template_id: the ID of the template to be detected.

      +
      +

      Potentially required arguments:

      +
      +

      robot_pose: see Hand-eye calibration.

      +
      +
      pose_prior_ids: IDs of the pose priors for the items to be detected. In case the chosen template requires a pose prior for the detection, +this argument must be provided.
      +
      +

      Optional arguments:

      +
      +

      load_carrier_id: ID of the load carrier which contains the items to be detected.

      +

      load_carrier_compartment: compartment inside the load carrier where to detect items +(see Load carrier compartments).

      +

      region_of_interest_id: if load_carrier_id is set, +ID of the 3D region of interest where to search for the load carriers. +Otherwise, ID of the 3D region of interest where to search for the objects.

      +

      collision_detection: see Collision checking within other modules.

      +

      data_acquisition_mode: if set to CAPTURE_NEW (default), a new image dataset will be used for the detection. If set to USE_LAST the previous +dataset will be used for the detection.

      +
      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "collision_detection": {
      +      "gripper_id": "string",
      +      "pre_grasp_offset": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      }
      +    },
      +    "data_acquisition_mode": "string",
      +    "load_carrier_compartment": {
      +      "box": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "pose": {
      +        "orientation": {
      +          "w": "float64",
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "position": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        }
      +      }
      +    },
      +    "load_carrier_id": "string",
      +    "pose_frame": "string",
      +    "pose_prior_ids": [
      +      "string"
      +    ],
      +    "region_of_interest_id": "string",
      +    "robot_pose": {
      +      "orientation": {
      +        "w": "float64",
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "position": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      }
      +    },
      +    "template_id": "string"
      +  }
      +}
      +
      +
      +
      +
      +

      grasps: list of grasps on the detected objects, ordered according to the chosen sorting strategy. +The match_uuid gives the reference to the detected object in matches +this grasp belongs to. The list of returned grasps will be trimmed to the 100 best grasps if more reachable grasps are found. +Each grasp contains a flag collision_checked and a gripper_id +(see Collision checking within other modules).

      +

      load_carriers: list of detected load carriers.

      +

      matches: list of detected objects matching the template. The matches are ordered according to the chosen sorting strategy. The score indicates how well the object matches the template. The +grasp_uuids refer to the grasps in grasps which are reachable on this object.

      +

      timestamp: timestamp of the image set the detection ran on.

      +

      return_code: holds possible warnings or error codes and messages.

      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "detect_object",
      +  "response": {
      +    "grasps": [
      +      {
      +        "collision_checked": "bool",
      +        "gripper_id": "string",
      +        "id": "string",
      +        "match_uuid": "string",
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "pose_frame": "string",
      +        "priority": "int8",
      +        "timestamp": {
      +          "nsec": "int32",
      +          "sec": "int32"
      +        },
      +        "uuid": "string"
      +      }
      +    ],
      +    "load_carriers": [
      +      {
      +        "height_open_side": "float64",
      +        "id": "string",
      +        "inner_dimensions": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "outer_dimensions": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "overfilled": "bool",
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "pose_frame": "string",
      +        "rim_ledge": {
      +          "x": "float64",
      +          "y": "float64"
      +        },
      +        "rim_step_height": "float64",
      +        "rim_thickness": {
      +          "x": "float64",
      +          "y": "float64"
      +        },
      +        "type": "string"
      +      }
      +    ],
      +    "matches": [
      +      {
      +        "grasp_uuids": [
      +          "string"
      +        ],
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "pose_frame": "string",
      +        "score": "float32",
      +        "template_id": "string",
      +        "timestamp": {
      +          "nsec": "int32",
      +          "sec": "int32"
      +        },
      +        "uuid": "string"
      +      }
      +    ],
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    },
      +    "timestamp": {
      +      "nsec": "int32",
      +      "sec": "int32"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      set_preferred_orientation

      +
      +

      Persistently stores the preferred orientation of the gripper to compute the reachability of the grasps, +which is used for filtering and, optionally, sorting the grasps returned by the detect_object service +(see Setting the preferred orientation of the TCP).

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/set_preferred_orientation
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/services/set_preferred_orientation
      +
      +
      +
      +
      +
      + +
      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "orientation": {
      +      "w": "float64",
      +      "x": "float64",
      +      "y": "float64",
      +      "z": "float64"
      +    },
      +    "pose_frame": "string"
      +  }
      +}
      +
      +
      +
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "set_preferred_orientation",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      get_preferred_orientation

      +
      +

      Returns the preferred orientation of the gripper to compute the reachability of the grasps, +which is used for filtering and, optionally, sorting the grasps returned by the detect_object service +(see Setting the preferred orientation of the TCP).

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/get_preferred_orientation
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/services/get_preferred_orientation
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "get_preferred_orientation",
      +  "response": {
      +    "orientation": {
      +      "w": "float64",
      +      "x": "float64",
      +      "y": "float64",
      +      "z": "float64"
      +    },
      +    "pose_frame": "string",
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      set_sorting_strategies

      +
      +

      Persistently stores the sorting strategy for sorting the grasps and matches returned by the detect_object service +(see Detection of objects).

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/set_sorting_strategies
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/services/set_sorting_strategies
      +
      +
      +
      +
      +
      + +
      +

      Only one strategy may have a weight greater than 0. If all weight values are set to 0, the module will use the +default sorting strategy.

      +

      If the weight for direction is set, the +vector must contain the direction vector and pose_frame must be either camera or external.

      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "direction": {
      +      "pose_frame": "string",
      +      "vector": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "weight": "float64"
      +    },
      +    "gravity": {
      +      "weight": "float64"
      +    },
      +    "match_score": {
      +      "weight": "float64"
      +    },
      +    "preferred_orientation": {
      +      "weight": "float64"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "set_sorting_strategies",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      get_sorting_strategies

      +
      +

      Returns the sorting strategy for sorting the grasps and matches returned by the detect_object service +(see Detection of objects).

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/get_sorting_strategies
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/services/get_sorting_strategies
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      All weight values are 0 when the module uses the default sorting strategy.

      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "get_sorting_strategies",
      +  "response": {
      +    "direction": {
      +      "pose_frame": "string",
      +      "vector": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "weight": "float64"
      +    },
      +    "gravity": {
      +      "weight": "float64"
      +    },
      +    "match_score": {
      +      "weight": "float64"
      +    },
      +    "preferred_orientation": {
      +      "weight": "float64"
      +    },
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      warmup_template

      +
      +

      Loads a template so that it is ready when the first detection with this template is triggered. +Without using this service, the first detection with a new template takes longer than the following ones, +because the template is then loaded at the first detection.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/warmup_template
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/services/warmup_template
      +
      +
      +
      +
      +
      + +
      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "template_id": "string"
      +  }
      +}
      +
      +
      +

      The template_id is the ID of the template to be loaded into the CADMatch module.

      +
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "warmup_template",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      start

      +
      +

      Starts the module. If the command is accepted, the module moves to state RUNNING.

      +

      Details

      +
      +

      The current_state value in the service response may differ from RUNNING if +the state transition is still in process when the service returns.

      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/start
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/services/start
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "start",
      +  "response": {
      +    "accepted": "bool",
      +    "current_state": "string"
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      stop

      +
      +

      Stops the module. If the command is accepted, the module moves to state IDLE.

      +

      Details

      +
      +

      The current_state value in the service response may differ from IDLE if +the state transition is still in process when the service returns.

      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/stop
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/services/stop
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "stop",
      +  "response": {
      +    "accepted": "bool",
      +    "current_state": "string"
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      reset_defaults

      +
      +

      Resets all parameters of the module to its default values, +as listed in above table. +Also resets preferred orientation and sorting strategies. +The reset does not apply to templates.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/reset_defaults
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/services/reset_defaults
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "reset_defaults",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      set_region_of_interest (deprecated)

      +
      +

      Persistently stores a 3D region of interest on the rc_visard NG.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +This service is not available in API version 2. +Use set_region_of_interest in rc_roi_db instead.
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/services/set_region_of_interest
      +
      +
      +
      +
      +
      +
      +
      +
      +

      get_regions_of_interest (deprecated)

      +
      +

      Returns the configured 3D regions of interest with the requested region_of_interest_ids.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +This service is not available in API version 2. +Use get_regions_of_interest in rc_roi_db instead.
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/services/get_regions_of_interest
      +
      +
      +
      +
      +
      +
      +
      +
      +

      delete_regions_of_interest (deprecated)

      +
      +

      Deletes the configured 3D regions of interest with the requested region_of_interest_ids.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +This service is not available in API version 2. +Use delete_regions_of_interest in rc_roi_db instead.
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/services/delete_regions_of_interest
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +

      Internal services

      +

      The following services for configuring grasps and pose priors can change in future without notice. +Setting, retrieving and deleting grasps and pose priors is recommended to be done via the Web GUI.

      +
      +

      set_grasp

      +
      +

      Persistently stores a grasp for the given object template on the rc_visard NG. +All configured grasps are persistent over firmware updates and rollbacks.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/set_grasp
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/services/set_grasp
      +
      +
      +
      +
      +
      + +
      +

      Details for the definition of the grasp type are given in +Setting of grasp points.

      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "grasp": {
      +      "gripper_id": "string",
      +      "id": "string",
      +      "pose": {
      +        "orientation": {
      +          "w": "float64",
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "position": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        }
      +      },
      +      "priority": "int8",
      +      "replication": {
      +        "max_x_deg": "float64",
      +        "min_x_deg": "float64",
      +        "origin": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "step_x_deg": "float64"
      +      },
      +      "template_id": "string"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "set_grasp",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      set_all_grasps

      +
      +

      Replaces the list of grasps for the given object template on the rc_visard NG.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/set_all_grasps
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/services/set_all_grasps
      +
      +
      +
      +
      +
      + +
      +

      Details for the definition of the grasp type are given in +Setting of grasp points.

      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "grasps": [
      +      {
      +        "gripper_id": "string",
      +        "id": "string",
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "priority": "int8",
      +        "replication": {
      +          "max_x_deg": "float64",
      +          "min_x_deg": "float64",
      +          "origin": {
      +            "orientation": {
      +              "w": "float64",
      +              "x": "float64",
      +              "y": "float64",
      +              "z": "float64"
      +            },
      +            "position": {
      +              "x": "float64",
      +              "y": "float64",
      +              "z": "float64"
      +            }
      +          },
      +          "step_x_deg": "float64"
      +        },
      +        "template_id": "string"
      +      }
      +    ],
      +    "template_id": "string"
      +  }
      +}
      +
      +
      +
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "set_all_grasps",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      get_grasps

      +
      +

      Returns all configured grasps which have the requested grasp_ids and belong to the requested template_ids.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/get_grasps
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/services/get_grasps
      +
      +
      +
      +
      +
      + +
      +

      If no grasp_ids are provided, all grasps belonging to the requested template_ids are returned. +If no template_ids are provided, all grasps with the requested grasp_ids are returned. +If neither IDs are provided, all configured grasps are returned.

      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "grasp_ids": [
      +      "string"
      +    ],
      +    "template_ids": [
      +      "string"
      +    ]
      +  }
      +}
      +
      +
      +
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "get_grasps",
      +  "response": {
      +    "grasps": [
      +      {
      +        "gripper_id": "string",
      +        "id": "string",
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "priority": "int8",
      +        "replication": {
      +          "max_x_deg": "float64",
      +          "min_x_deg": "float64",
      +          "origin": {
      +            "orientation": {
      +              "w": "float64",
      +              "x": "float64",
      +              "y": "float64",
      +              "z": "float64"
      +            },
      +            "position": {
      +              "x": "float64",
      +              "y": "float64",
      +              "z": "float64"
      +            }
      +          },
      +          "step_x_deg": "float64"
      +        },
      +        "template_id": "string"
      +      }
      +    ],
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      delete_grasps

      +
      +

      Deletes all grasps with the requested grasp_ids that belong to the requested template_ids.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/delete_grasps
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/services/delete_grasps
      +
      +
      +
      +
      +
      + +
      +

      If no grasp_ids are provided, all grasps belonging to the requested template_ids are deleted. +The template_ids list must not be empty.

      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "grasp_ids": [
      +      "string"
      +    ],
      +    "template_ids": [
      +      "string"
      +    ]
      +  }
      +}
      +
      +
      +
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "delete_grasps",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      get_symmetric_grasps

      +
      +

      Returns all grasps that are symmetric to the given grasp.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/get_symmetric_grasps
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/services/get_symmetric_grasps
      +
      +
      +
      +
      +
      + +
      +

      Details for the definition of the grasp type are given in +Setting of grasp points.

      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "grasp": {
      +      "pose": {
      +        "orientation": {
      +          "w": "float64",
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "position": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        }
      +      },
      +      "replication": {
      +        "max_x_deg": "float64",
      +        "min_x_deg": "float64",
      +        "origin": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "step_x_deg": "float64"
      +      },
      +      "template_id": "string"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +

      The first grasp in the returned list is the one that was passed with the service call. +If the object template does not have an exact symmetry, only the grasp passed with the +service call will be returned. If the object template has a continuous symmetry (e.g. a +cylindrical object), only 12 equally spaced sample grasps will be returned.

      +

      Details for the definition of the grasp type are given in +Setting of grasp points.

      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "get_symmetric_grasps",
      +  "response": {
      +    "grasps": [
      +      {
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "replication": {
      +          "max_x_deg": "float64",
      +          "min_x_deg": "float64",
      +          "origin": {
      +            "orientation": {
      +              "w": "float64",
      +              "x": "float64",
      +              "y": "float64",
      +              "z": "float64"
      +            },
      +            "position": {
      +              "x": "float64",
      +              "y": "float64",
      +              "z": "float64"
      +            }
      +          },
      +          "step_x_deg": "float64"
      +        },
      +        "template_id": "string"
      +      }
      +    ],
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      set_pose_prior

      +
      +

      Persistently stores a pose prior for the given object template on the rc_visard NG. +All configured pose priors are persistent over firmware updates and rollbacks.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/set_pose_prior
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/services/set_pose_prior
      +
      +
      +
      +
      +
      + +
      +

      Details for the definition of the pose_prior type are given in +Setting of pose priors.

      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "pose_prior": {
      +      "id": "string",
      +      "pose": {
      +        "orientation": {
      +          "w": "float64",
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "position": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        }
      +      },
      +      "pose_frame": "string",
      +      "template_id": "string"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "set_pose_prior",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      set_all_pose_priors

      +
      +

      Replaces the list of pose priors for the given object template on the rc_visard NG.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/set_all_pose_priors
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/services/set_all_pose_priors
      +
      +
      +
      +
      +
      + +
      +

      Details for the definition of the pose_prior type are given in +Setting of pose priors.

      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "pose_priors": [
      +      {
      +        "id": "string",
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "pose_frame": "string",
      +        "template_id": "string"
      +      }
      +    ],
      +    "template_id": "string"
      +  }
      +}
      +
      +
      +
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "set_all_pose_priors",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      get_pose_priors

      +
      +

      Returns all configured pose priors which have the requested pose_prior_ids and belong to the requested template_ids.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/get_pose_priors
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/services/get_pose_priors
      +
      +
      +
      +
      +
      + +
      +

      If no pose_prior_ids are provided, all pose priors belonging to the requested template_ids are returned. +If no template_ids are provided, all pose priors with the requested pose_prior_ids are returned. +If neither IDs are provided, all configured pose priors are returned.

      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "pose_prior_ids": [
      +      "string"
      +    ],
      +    "template_ids": [
      +      "string"
      +    ]
      +  }
      +}
      +
      +
      +
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "get_pose_priors",
      +  "response": {
      +    "pose_priors": [
      +      {
      +        "id": "string",
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "pose_frame": "string",
      +        "template_id": "string"
      +      }
      +    ],
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      delete_pose_priors

      +
      +

      Deletes all pose priors with the requested pose_prior_ids that belong to the requested template_ids.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_cadmatch/services/delete_pose_priors
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_cadmatch/services/delete_pose_priors
      +
      +
      +
      +
      +
      + +
      +

      If no pose_prior_ids are provided, all pose priors belonging to the requested template_ids are deleted. +The template_ids list must not be empty.

      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "pose_prior_ids": [
      +      "string"
      +    ],
      +    "template_ids": [
      +      "string"
      +    ]
      +  }
      +}
      +
      +
      +
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "delete_pose_priors",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +

      Return codes

      +

      Each service response contains a return_code, +which consists of a value plus an optional message. +A successful service returns with a return_code value of 0. +Negative return_code values indicate that the service failed. +Positive return_code values indicate that the service succeeded with additional information. +The smaller value is selected in case a service has multiple return_code values, +but all messages are appended in the return_code message.

      +

      The following table contains a list of common codes:

      + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Return codes of the CADMatch services
      CodeDescription
      0Success
      -1An invalid argument was provided.
      -2An internal error occurred.
      -3An internal timeout occurred.
      -4Data acquisition took longer than allowed.
      -8Not applicable, stereo quality must be at least Medium.
      -9No valid license for the module.
      -10New element could not be added as the maximum storage capacity of load carriers or regions of interest has been exceeded.
      -11Sensor not connected, not supported or not ready.
      10The maximum storage capacity of load carriers or regions of interest has been reached.
      11Existing data was overwritten.
      100The requested load carrier was not detected in the scene.
      101None of the detected grasps is reachable.
      102The detected load carrier is empty.
      103All detected grasps are in collision.
      106The list of returned grasps has been trimmed to the 100 best grasps.
      110Hints for setting up the application, e.g. reducing the distance from the camera, setting a region of interest.
      114No gripper was found for collision checking.
      115Collision checking during retraction was skipped, e.g. because no load carrier or no pre-grasp offset were given.
      151The object template has a continuous symmetry.
      152The objects are outside the given region of interest, outside the load carrier or outside the image.
      153No edges could be detected in the camera image. Check the Edge Sensitivity.
      999Additional hints for application development
      +
      +
      +

      Template API

      +

      For template upload, download, listing and removal, special REST-API endpoints are provided. +Templates can also be uploaded, downloaded and removed via the Web GUI. +The templates include the grasp points and pose priors, if grasp points or pose priors have been configured. +Up to 50 templates can be stored persistently on the rc_visard NG.

      +
      +
      + + +
      +
      + +
      +
      +
      + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/camera_calibration.html b/v24.04/en/camera_calibration.html new file mode 100644 index 0000000..2ba9a80 --- /dev/null +++ b/v24.04/en/camera_calibration.html @@ -0,0 +1,880 @@ + + + + + + + + + + + Camera calibration — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Camera calibration

      +

      The camera calibration module is a base module which is available on every rc_visard NG.

      +

      To use the camera as measuring instrument, camera parameters such as focal length, +lens distortion, and the relationship of the cameras to each other must be exactly known. The +parameters are determined by calibration and used for image rectification +(see Rectification), +which is the basis for all other image processing modules.

      +

      The rc_visard NG is calibrated at +production time. Nevertheless, checking calibration and recalibration might be necessary +if the rc_visard NG was exposed to strong mechanical impact.

      +

      The camera calibration module is responsible for checking calibration and calibrating.

      +
      +

      Self-calibration

      +

      The camera calibration module automatically runs in self-calibration mode at a low +frequency in the background. In this mode, the rc_visard NG observes the alignment of image +rows of both rectified images. A mechanical impact, such as one caused by dropping the rc_visard NG, +might result in a misalignment. If a significant misalignment is detected, then it is +automatically corrected. After each reboot and after each correction, the current self-calibration +offset is reported in the camera module’s log file +(see Downloading log files) +as:

      +
      +
      “rc_stereocalib: Current self-calibration offset is 0.00, update counter is 0”
      +

      The update counter is incremented after each automatic correction. It is reset to 0 after manual +recalibration of the rc_visard NG.

      +

      Under normal conditions, such as the absence of mechanical impact on the rc_visard NG, self-calibration should never +occur. Self-calibration allows the rc_visard NG to work normally even after misalignment is detected, since it +is automatically corrected. Nevertheless, checking camera calibration manually is recommended +if the update counter is not 0.

      +
      +
      +

      Calibration process

      +

      Manual calibration can be done through the Web GUI + under Configuration ‣ Camera Calibration. +This page provides a wizard to guide the user through the calibration process.

      +
      +

      Note

      +

      Camera calibration is normally unnecessary for the rc_visard NG since it is calibrated at +production time. Therefore, calibration is only required after strong mechanical impacts, +such as occur when dropping the rc_visard NG.

      +
      +

      During calibration, the calibration grid must be detected in different poses. +When holding the calibration grid, make sure that all black squares +of the grid are completely visible and not occluded in both camera images. A green check mark overlays each correctly +detected square. The correct detection of the grid is only possible if all of the black +squares are detected. Some of the squares not being detected, or being detected only briefly might indicate bad +lighting conditions, or a damaged grid. Squares in overexposed parts of the calibration grid are highlighted in red. +In this case, the lighting conditions or exposure setting must be adjusted. +A thick green border around the calibration grid indicates that +it was detected correctly in both camera images.

      +
      +

      Calibration settings

      +

      The quality of camera calibration heavily depends on the quality of the calibration grid. +Calibration grids can be obtained from Roboception.

      +
      +_images/webgui_camera_calibration_1_ng_en.png +

      Fig. 41 Calibration settings

      +
      +

      In the first step, the calibration grid must be specified. The Next button proceeds to the next step.

      +
      +
      +

      Verify calibration

      +

      In the next step, the current calibration can be verified. To perform +the verification, the grid must be held such that it is simultaneously visible in both cameras. +When the grid is detected, the calibration error is automatically computed and the result is +displayed on the screen.

      +
      +_images/webgui_camera_calibration_3_ng_en.png +

      Fig. 42 Verification of calibration

      +
      +
      +

      Note

      +

      To compute a meaningful calibration error, the grid should be held as close as possible +to the cameras. If the grid only covers a small section of the camera images, the calibration +error will always be less than when the grid covers the full image. For this reason, the minimal +and maximal calibration error during verification are shown in addition to the calibration error +at the current grid position.

      +
      +

      The typical calibration error is below 0.2 pixels. If the error is in this range, +then the calibration procedure can be skipped. If the calibration error is greater, the +calibration procedure should be performed to guarantee full sensor performance. The button +Next starts the procedure.

      +
      +

      Warning

      +

      A large error during verification can be due to miscalibrated cameras, an inaccurate +calibration grid, or wrong grid width or height. In case you use a custom calibration grid, +please make sure that the grid is accurate and +the entered grid width and height are correct. Otherwise, manual calibration will actually +decalibrate the cameras!

      +
      +
      +
      +

      Calibrate

      +

      The camera’s exposure time should be set appropriately before starting the calibration. +To achieve good calibration results, the images should be well-exposed and motion blur should +be avoided. Thus, the maximum auto-exposure time should be as short as possible, but still allow a good exposure. +The current exposure time is displayed below the camera images as shown +in Fig. 44.

      +

      Full calibration consists of calibrating each camera individually (monocalibration) and then performing a stereo +calibration to determine the relationship between them. In most cases, +the intrinsic calibration of each camera does not get corrupted. For this reason, monocalibration is +skipped by default during a recalibration, but can be performed by clicking Perform Monocalibration +in the Calibrate tab. This should only be done if the result of the stereo calibration is +not satisfactory.

      +
      +
      +

      Stereo calibration

      +

      During stereo calibration, both cameras are calibrated to each other to find their +relative rotation and translation.

      +

      The camera images can also be displayed mirrored to simplify the correct positioning of the calibration grid.

      +

      First, the grid should be held as close as possible to the camera and very still. It must be fully visible +in both images and the cameras should look perpendicularly onto the grid. If the grid is +not perpendicular to the line of sight of the cameras, this will be indicated by small +green arrows pointing to the expected positions of the grid corners (see +Fig. 43).

      +
      +_images/webgui_camera_calibration_stereo_tilt.png +

      Fig. 43 Arrows indicating that the grid is not perpendicular to the camera’s line of sight during stereo calibration

      +
      +

      The grid must be kept very still for detection. If motion blur occurs, the grid will not be detected. +All grid cells that are drawn onto the image have to be covered +by the calibration grid. This is visualized by filling the covered cells in green (see +Fig. 44).

      +

      For the rc_visard NG all cells can be covered at once by holding the grid close enough.

      +
      +_images/webgui_camera_calibration_4_ng_en.png +

      Fig. 44 Stereo calibration: Hold the grid as close as possible to fill all visualized cells

      +
      +
      +

      Note

      +

      If the check marks on the calibration grid all vanish, then either the camera does not +look perpendicularly onto the grid, or the grid is too far away from the camera.

      +
      +

      Once all grid cells are covered, they disappear and a single far cell is visualized. +Now, the grid should be held as far as possible from the cameras, so that the small cell +is covered. Arrows will indicate if the grid is still too close to the camera. +When the grid is successfully detected at the far pose, the cell is filled +in green and the result can be computed (see Fig. 45).

      +
      +_images/webgui_camera_calibration_stereo_far.png +

      Fig. 45 Holding the grid far away during stereo calibration

      +
      +

      If stereo calibration yields an unsatisfactory calibration error, then calibration should be +repeated with monocalibration (see next Section Monocalibration).

      +
      +
      +

      Monocalibration

      +

      Monocalibration is the intrinsic calibration of each camera individually. Since the intrinsic calibration +normally does not get corrupted, the monocalibration should only be performed if the result of stereo +calibration is not satisfactory.

      +

      Click Perform Monocalibration in the Calibrate tab to start monocalibration.

      +

      For monocalibration, the grid has to be held in certain poses. The arrows from the grid +corners to the green areas indicate that all grid corners should be placed inside the +green areas. The green areas are called sensitive areas. The Size of Sensitive Area +slider can control their size to ease calibration. +However, please be aware that increasing their size too much may result in slightly +lower calibration accuracy.

      +

      Holding the grid upside down is a common mistake made during calibration. Spotting this in +this case is easy because the green lines from the grid corners into the green areas will +cross each other as shown in Fig. 46.

      +
      +_images/webgui_camera_calibration_wrong.png +

      Fig. 46 Wrongly holding the grid upside down leads to crossed green lines.

      +
      +
      +

      Note

      +

      Calibration might appear cumbersome as it involves holding the grid in certain +predefined poses. However, these poses are required to ensure an unbiased, high-quality calibration +result.

      +
      +

      The monocalibration process involves five poses for each camera as shown in Fig. 47.

      +
      +_images/calib-views.png +

      Fig. 47 Poses required for monocamera calibration

      +
      +

      After the corners or sides of the grid are placed on top of the sensitive areas, the process +automatically shows the next pose required. When the process is finished for the left camera, +the same procedure is repeated for the right one.

      +

      Continue with the guidelines given in the previous Section Stereo calibration.

      +
      +
      +

      Storing the calibration result

      +

      Clicking the Compute Calibration button finishes the process and displays the final result. +The indicated result is the mean reprojection error of all calibration points. It is given in +pixels and typically has a value below 0.2.

      +

      Pressing Save Calibration applies the calibration and saves it to the device.

      +
      +

      Note

      +

      The given result is the minimum error left after calibration. The real error +is definitely not less than this, but could in theory be larger. This is true for every +camera-calibration algorithm and the reason why we enforce holding the grid in very specific +poses. Doing so ensures that the real calibration error cannot significantly +exceed the reported error.

      +
      +
      +

      Warning

      +

      If a hand-eye calibration was stored on the rc_visard NG before camera calibration, +the hand-eye calibration values could have become invalid. Please repeat the hand-eye +calibration procedure.

      +
      +
      +
      +
      +

      Parameters

      +

      The module is called rc_stereocalib in the REST-API.

      +
      +

      Note

      +

      The camera calibration module’s available parameters and status values are +for internal use only and may change in the future without further notice. Calibration should +only be performed through the Web GUI as described above.

      +
      +
      +
      +

      Services

      +
      +

      Note

      +

      The camera calibration module’s available service calls are for internal +use only and may change in the future without further notice. Calibration should only be +performed through the Web GUI as described above.

      +
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/camera_modules.html b/v24.04/en/camera_modules.html new file mode 100644 index 0000000..7bf705f --- /dev/null +++ b/v24.04/en/camera_modules.html @@ -0,0 +1,684 @@ + + + + + + + + + + + 3D camera modules — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      3D camera modules

      +

      The rc_visard NG’s 3D camera software consists of the following modules:

      +
        +
      • +
        Camera (rc_camera)
        +
        acquires image pairs and performs planar rectification for using the +camera as a measurement device. +Images are provided both for further internal processing by other modules +and for external use as GenICam image streams.
        +
        +
      • +
      +
        +
      • +
        Stereo matching (rc_stereomatching)
        +
        uses the rectified stereo image pairs to compute 3D depth +information such as disparity, error, and confidence images. +These are provided as GenICam streams, too.
        +
        +
      • +
      +

      The Camera and the Stereo matching modules, which +acquire image pairs and compute 3D depth information such as disparity, +error, and confidence images, are also accessible via the rc_visard NG’s +GigE Vision/GenICam interface.

      +
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/collisioncheck.html b/v24.04/en/collisioncheck.html new file mode 100644 index 0000000..14fa1e4 --- /dev/null +++ b/v24.04/en/collisioncheck.html @@ -0,0 +1,1361 @@ + + + + + + + + + + + CollisionCheck — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      CollisionCheck

      +
      +

      Introduction

      +

      The CollisionCheck module is an optional on-board module of the rc_visard NG and is licensed with +any of the modules ItemPick and BoxPick or SilhouetteMatch. +Otherwise it requires a separate CollisionCheck license + to be purchased.

      +

      The module provides an easy way to check if a gripper is in collision with a load carrier, + +or other detected objects (only in combination with SilhouetteMatch). It is integrated +with the ItemPick and BoxPick and SilhouetteMatch modules, but can be used as standalone product. +The models of the grippers for collision checking have to be +defined in the GripperDB module.

      +
      +

      Warning

      +

      Collisions are checked only between the load carrier and the gripper, not the robot itself, the flange, other objects or +the item located in the robot gripper. Only in combination with SilhouetteMatch, +and only in case the selected template contains a collision +geometry and check_collisions_with_matches is enabled in the respective detection module, +also collisions between the gripper and other detected objects will be checked. +Collisions with objects that cannot be detected will not be checked. +Only in combination with SilhouetteMatch and +only if check_collisions_with_point_cloud is enabled in the respective detection module, +collisions between the gripper and a watertight version of the point cloud will be checked.

      +
      + + ++++ + + + + + + + + +
      Table 42 Specifications of the CollisionCheck module
      Collision checking withdetected load carrier, detected objects (only SilhouetteMatch), baseplane (only SilhouetteMatch)
      Collision checking available inItemPick and BoxPick, SilhouetteMatch
      +
      +
      +

      Collision checking

      +
      +

      Stand-alone collision checking

      +

      The check_collisions service call triggers collision checking between the chosen gripper and the provided load carriers +for each of the provided grasps. Checking collisions with other objects +is not possible with the stand-alone check_collisions service. +The CollisionCheck module checks if the chosen gripper is +in collision with at least one of the load carriers, when the TCP of the gripper is positioned in the +grasp position. It is possible to check the collision with multiple load carriers simultaneously. The grasps +which are in collision with any of the defined load carriers will be returned as colliding.

      +

      The pre_grasp_offset can be used for additional collision checking. +The pre-grasp offset \(P_{off}\) is the offset between the grasp point \(P_{grasp}\) and the pre-grasp position \(P_{pre}\) +in the grasp’s coordinate frame (see Fig. 40). +If the pre-grasp offset is defined, the grasp will be detected as colliding +if the gripper is in collision at any point +during motion from the pre-grasp position to the grasp position (assuming +a linear movement).

      +
      +_images/pre_grasp_offset.svg +

      Fig. 40 Illustration of the pre-grasp offset parameter for collision checking. In this case, the pre-grasp position as +well as the grasp position are collision free. However, the trajectory between these poses would have collisions. +Thus, this grasp pose would be marked as colliding.

      +
      +
      +
      +

      Collision checking within other modules

      +

      Collision checking is integrated in the following modules’ services:

      + +

      Each of these services can take a collision_detection argument consisting of the gripper_id of the default gripper +and the pre_grasp_offset as described in the previous section +Stand-alone collision checking. +The default gripper given by the gripper_id argument is only used for grasp points which do not have an individual gripper ID assigned. +When the collision_detection argument is given, these services only return the +grasps at which the gripper is not in collision or which could not be checked for collisions. +When a load carrier ID is provided to these services, +collision checking will always be performed between the gripper and the load carrier. +Additional collision check features can be enabled depending on the module.

      +

      Only for SilhouetteMatch, and only in case the selected template contains a collision +geometry and check_collisions_with_matches is enabled in the respective detection module, +grasp points at which the gripper would be in collision with other detected objects are also rejected. The object +on which the grasp point to be checked is located, is excluded from the collision check.

      +

      When a gripper is defined for a grasp point in the object template for SilhouetteMatch, then this gripper will be used +for collision checking at that specific grasp point instead of the default gripper defined in the collision_detection argument +of the detect_object service (see Setting of grasp points). +The grasps returned by the detect_object service contain a flag collision_checked, indicating whether the grasp was checked for collisions, +and the field gripper_id. If collision_checked is true, the returned gripper_id contains the ID of the gripper that was used for the collision check. +That is the ID of the gripper defined for that specific grasp, or, if empty, the gripper that was given in the +collision_detection argument of the request. If collision_checked is false, the returned gripper_id +is the gripper ID that was defined for that grasp.

      +

      In SilhouetteMatch, collisions between +the gripper and the base plane can be checked, if check_collisions_with_base_plane is enabled in SilhouetteMatch.

      +

      Collisions between the gripper and a watertight version of the point cloud can be checked in SilhouetteMatch +if check_collisions_with_point_cloud is enabled in the respective module.

      +
      +

      Warning

      +

      Collisions are checked only between the load carrier and the gripper, not the robot itself, the flange or other objects. +Only in combination with SilhouetteMatch, +and only in case the selected template contains a collision +geometry and check_collisions_with_matches is enabled in the respective detection module, +also collisions between the gripper and other detected objects are checked. +Collisions with objects that cannot be detected will not be checked. +Only in combination with SilhouetteMatch, and +only if check_collisions_with_point_cloud is enabled, collisions between the gripper and a watertight version of the point cloud are checked.

      +
      +

      The collision-check results are affected by run-time parameters, which are listed +and explained further below.

      +
      +
      +
      +

      Parameters

      +

      The CollisionCheck module is called rc_collision_check +in the REST-API and is represented in the +Web GUI + under Configuration ‣ CollisionCheck. +The user can explore and configure the rc_collision_check +module’s run-time parameters, e.g. for development and testing, using the Web GUI or the +REST-API interface.

      +
      +

      Parameter overview

      +

      This module offers the following run-time parameters:

      + + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table 43 The rc_collision_check module’s run-time parameters
      NameTypeMinMaxDefaultDescription
      check_bottomboolfalsetruetrueWhether to enable collision checking with the bottom of the load carrier
      check_flangeboolfalsetruetrueWhether all grasps with the flange inside the load carrier should be marked as colliding
      collision_distfloat640.00.10.01Minimum distance in meters between any element of the gripper and the load carrier or the base plane (only SilhouetteMatch) for a collision-free grasp
      +
      +
      +

      Description of run-time parameters

      +

      Each run-time parameter is represented by a row in the Web GUI’s +Settings section under +Configuration ‣ CollisionCheck. +The name in the Web GUI is given in brackets behind the parameter name:

      +
      +

      collision_dist (Collision Distance)

      +
      +

      Minimal distance in meters between any part of the gripper and the load carrier and/or the base plane (only SilhouetteMatch) +for a grasp to be considered collision free.

      +
      +

      Note

      +

      The collision distance is not applied when checking collisions between the gripper and other detected objects. It is not applied +when checking if the flange is inside the load carrier (check_flange), either.

      +
      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_collision_check/parameters?collision_dist=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_collision_check/parameters?collision_dist=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      check_flange (Check Flange)

      +
      +

      Performs an additional safety check as described in +Robot flange radius. +If this parameter is set, all grasps in which any part of the robot’s flange is inside the load carrier are marked as colliding.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_collision_check/parameters?check_flange=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_collision_check/parameters?check_flange=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      check_bottom (Check Bottom)

      +
      +

      When this check is enabled the collisions will be checked not only with the side walls of the load carrier but also with its bottom. +It might be necessary to disable this check if the TCP is inside the collision geometry (e.g. is defined inside a suction cup).

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_collision_check/parameters?check_bottom=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_collision_check/parameters?check_bottom=<value>
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +

      Status values

      +

      The rc_collision_check module reports the following status values:

      + + ++++ + + + + + + + + + + + + + + + + +
      Table 44 The rc_collision_check module status values
      NameDescription
      last_evaluated_graspsNumber of evaluated grasps
      last_collision_free_graspsNumber of collision-free grasps
      collision_check_timeCollision checking runtime
      +
      +
      +

      Services

      +

      The user can explore and call the rc_collision_check module’s services, +e.g. for development and testing, using +REST-API interface or +the rc_visard NG +Web GUI.

      +

      The CollisionCheck module offers the following services.

      +
      +

      reset_defaults

      +
      +

      Resets all parameters of the module to its default values, +as listed in above table.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_collision_check/services/reset_defaults
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_collision_check/services/reset_defaults
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "reset_defaults",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      check_collisions (deprecated)

      +
      +

      Triggers a collision check between a gripper and a load carrier.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_collision_check/services/check_collisions
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_collision_check/services/check_collisions
      +
      +
      +
      +
      +
      + +
      +

      Required arguments:

      +
      +

      grasps: list of grasps that should be checked.

      +

      load_carriers: list of load carriers against which the collision should be checked. +The fields of the load carrier definition are described in +Detection of load carriers. +The position frame of the grasps and load carriers has to be the same.

      +

      gripper_id: the id of the gripper that is used to check the collisions. The gripper has to be configured beforehand.

      +
      +

      Optional arguments:

      +
      +
      pre_grasp_offset: the offset in meters from the grasp position to the pre-grasp position in the grasp frame. +If this argument is set, the collisions will not only be checked in the grasp point, but also on the path from the +pre-grasp position to the grasp position (assuming a linear movement).
      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "grasps": [
      +      {
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "pose_frame": "string",
      +        "uuid": "string"
      +      }
      +    ],
      +    "gripper_id": "string",
      +    "load_carriers": [
      +      {
      +        "id": "string",
      +        "inner_dimensions": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "outer_dimensions": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "pose_frame": "string",
      +        "rim_thickness": {
      +          "x": "float64",
      +          "y": "float64"
      +        }
      +      }
      +    ],
      +    "pre_grasp_offset": {
      +      "x": "float64",
      +      "y": "float64",
      +      "z": "float64"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +

      colliding_grasps: list of grasps in collision with one or more load carriers.

      +

      collision_free_grasps: list of collision-free grasps.

      +

      return_code: holds possible warnings or error codes and messages.

      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "check_collisions",
      +  "response": {
      +    "colliding_grasps": [
      +      {
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "pose_frame": "string",
      +        "uuid": "string"
      +      }
      +    ],
      +    "collision_free_grasps": [
      +      {
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "pose_frame": "string",
      +        "uuid": "string"
      +      }
      +    ],
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      set_gripper (deprecated)

      +
      +

      Persistently stores a gripper on the rc_visard NG.

      +
      + +
      +This service is not available in API version 2. +Use set_gripper +in rc_gripper_db instead.
      +
      +

      This service can be called as follows.

      +
      PUT http://<host>/api/v1/nodes/rc_collision_check/services/set_gripper
      +
      +
      +

      The definitions of the request and response are the same as described in +set_gripper +in rc_gripper_db.

      +
      +
      +
      +
      +
      +

      get_grippers (deprecated)

      +
      +

      Returns the configured grippers with the requested gripper_ids.

      +
      + +
      +This service is not available in API version 2. +Use get_grippers +in rc_gripper_db instead.
      +
      +

      This service can be called as follows.

      +
      PUT http://<host>/api/v1/nodes/rc_collision_check/services/get_grippers
      +
      +
      +

      The definitions of the request and response are the same as described in +get_grippers +in rc_gripper_db.

      +
      +
      +
      +
      +
      +

      delete_grippers (deprecated)

      +
      +

      Deletes the configured grippers with the requested gripper_ids.

      +
      + +
      +This service is not available in API version 2. +Use delete_grippers +in rc_gripper_db instead.
      +
      +

      This service can be called as follows.

      +
      PUT http://<host>/api/v1/nodes/rc_collision_check/services/delete_grippers
      +
      +
      +

      The definitions of the request and response are the same as described in +delete_grippers +in rc_gripper_db.

      +
      +
      +
      +
      +
      +
      +

      Return codes

      +

      Each service response contains a return_code, +which consists of a value plus an optional message. +A successful service returns with a return_code value of 0. +Negative return_code values indicate that the service failed. +Positive return_code values indicate that the service succeeded with additional information. +The smaller value is selected in case a service has multiple return_code values, +but all messages are appended in the return_code message.

      +

      The following table contains a list of common codes:

      + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table 45 Return codes of the CollisionCheck services
      CodeDescription
      0Success
      -1An invalid argument was provided
      -7Data could not be read or written to persistent storage
      -9No valid license for the module
      -10New gripper could not be added as the maximum storage capacity of grippers has been exceeded
      10The maximum storage capacity of grippers has been reached
      11Existing gripper was overwritten
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/concept_stereo.html b/v24.04/en/concept_stereo.html new file mode 100644 index 0000000..bcc650f --- /dev/null +++ b/v24.04/en/concept_stereo.html @@ -0,0 +1,692 @@ + + + + + + + + + + + Stereo vision — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Stereo vision

      +

      In stereo vision, 3D information about a scene can be extracted by comparing two images taken from different +viewpoints. The main idea behind using a camera pair for measuring depth is the fact that object points appear at different +positions in the two camera images depending on their distance from the camera pair. Very distant object points +appear at approximately the same position in both images, whereas very close object points occupy different positions +in the left and right camera image. The object points’ displacement in the two images is called disparity. The +larger the disparity, the closer the object is to the camera. The principle is illustrated in Fig. 14.

      +
      +_images/stereo_sketch_v2.svg +

      Fig. 14 Sketch of the stereo-vision principle: The more distant object (black) exhibits a smaller disparity \(d_2\) +than that of the close object (gray), \(d_1\).

      +
      +

      Stereo vision is a form of passive sensing, meaning that it emits neither light nor other signals to measure distances, but +uses only light that the environment emits or reflects. Thus, the Roboception products utilizing this sensing principle +can work indoors and outdoors and multiple devices can work together without interferences.

      +

      To compute the 3D information, the +stereo matching algorithm must be able to find corresponding object points in the left and right camera images. +For this, the algorithm requires texture, meaning changes in image intensity values due to +patterns or the objects’ surface structure, in the images. Stereo matching is not possible for completely untextured regions, +such as a flat white wall without any visible surface structure. The stereo matching method used +by the rc_visard NG is SGM (Semi-Global Matching), which provides the best trade-off between runtime and accuracy, even for fine structures.

      +

      The following software modules are required to compute 3D information:

      +
        +
      • Camera: This module is responsible for capturing synchronized image pairs and transforming them +into images approaching those taken by an ideal camera (rectification).
      • +
      • Stereo matching: This module computes disparities for the rectified stereo image pair +using SGM.
      • +
      +

      For stereo matching, the position and orientation of the left and right cameras relative to each other has to be known with +very high accuracy. This is achieved by calibration. The rc_visard NG’s cameras are pre-calibrated during production. +However, if the rc_visard NG has been decalibrated, during transport for example, then the user has +to recalibrate the stereo camera:

      +
        +
      • Camera calibration: This module enables the user to recalibrate the rc_visard NG’s stereo camera.
      • +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/concepts.html b/v24.04/en/concepts.html new file mode 100644 index 0000000..5e08818 --- /dev/null +++ b/v24.04/en/concepts.html @@ -0,0 +1,666 @@ + + + + + + + + + + + Measurement principles — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + +
        + +
      • rc_visard NG >
      • + +
      • Measurement principles
      • + + +
      • + + + +
      • + +
      + + +
      +
      +
      +
      + +
      +

      Measurement principles

      +

      The rc_visard NG is a self-registering 3D camera. It provides rectified camera, +disparity, confidence, and error images, which enable the viewed scene’s depth values along +with their uncertainties to be computed. Furthermore, the motion of visual features in the +images is combined with acceleration and turn-rate measurements at a high rate, which +enables the sensor to provide real-time estimates of its current pose, velocity, and acceleration.

      +

      In the following, the underlying measurement principles are explained in more detail.

      + +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/configuration_modules.html b/v24.04/en/configuration_modules.html new file mode 100644 index 0000000..2b59eb5 --- /dev/null +++ b/v24.04/en/configuration_modules.html @@ -0,0 +1,688 @@ + + + + + + + + + + + Configuration modules — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Configuration modules

      +

      The rc_visard NG provides several configuration modules which enable the user to configure +the rc_visard NG for specific applications.

      +

      The configuration modules are:

      +
        +
      • +
        Hand-eye calibration (rc_hand_eye_calibration)
        +
        enables the user to calibrate the camera with respect to a robot, +either via the Web GUI or the REST-API.
        +
        +
      • +
      • +
        CollisionCheck (rc_collision_check)
        +
        provides an easy way to check if a gripper is in collision.
        +
        +
      • +
      • +
        Camera calibration (rc_stereocalib)
        +
        enables the user to check and perform camera calibration via the +WEB GUI.
        +
        +
      • +
      • +
        IO and Projector Control (rc_iocontrol)
        +
        provides control over the sensor’s general purpose inputs and outputs with special modes +for controlling an external random dot projector.
        +
        +
      • +
      +
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/contact.html b/v24.04/en/contact.html new file mode 100644 index 0000000..0a06ba7 --- /dev/null +++ b/v24.04/en/contact.html @@ -0,0 +1,677 @@ + + + + + + + + + + + Contact — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Contact

      +
      +

      Support

      +

      For support issues, please see http://www.roboception.com/support or contact support@roboception.de.

      +
      +
      +

      Downloads

      +

      Software SDKs, etc. can be downloaded from http://www.roboception.com/download.

      +
      +
      +

      Address

      +
      +
      Roboception GmbH
      +
      Kaflerstrasse 2
      +
      81241 Munich
      +
      Germany
      +

      + + +
      Phone: +49 89 889 50 79-0
      +

      +
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/database_modules.html b/v24.04/en/database_modules.html new file mode 100644 index 0000000..be43bfc --- /dev/null +++ b/v24.04/en/database_modules.html @@ -0,0 +1,682 @@ + + + + + + + + + + + Database modules — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Database modules

      +

      The rc_visard NG provides several database modules which enable the user to configure +global data which is used in many detection modules, such as load carriers and regions of interest. +Via the REST-API interface the database modules are +only available in API version 2.

      +

      The database modules are:

      +
        +
      • +
        LoadCarrierDB (rc_load_carrier_db)
        +
        allows setting, retrieving and deleting load carriers.
        +
        +
      • +
      • +
        RoiDB (rc_roi_db
        +
        allows setting, retrieving and deleting 2D and 3D regions of interest.
        +
        +
      • +
      • +
        GripperDB (rc_gripper_db)
        +
        allows setting, retrieving and deleting grippers for collision checking.
        +
        +
      • +
      +
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/detection_modules.html b/v24.04/en/detection_modules.html new file mode 100644 index 0000000..bab0d70 --- /dev/null +++ b/v24.04/en/detection_modules.html @@ -0,0 +1,687 @@ + + + + + + + + + + + Detection modules — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Detection modules

      +

      The rc_visard NG offers software modules for different detection applications:

      +
        +
      • +
        LoadCarrier (rc_load_carrier)
        +
        allows detecting load carriers and their filling levels.
        +
        +
      • +
      • +
        TagDetect (rc_april_tag_detect and rc_qr_code_detect)
        +
        allows the detection of AprilTags and QR codes, as well as the estimation of their poses.
        +
        +
      • +
      • +
        ItemPick and BoxPick (rc_itempick and rc_boxpick)
        +
        provides an out-of-the-box perception solution for robotic pick-and-place +applications of unknown objects or boxes.
        +
        +
      • +
      • +
        SilhouetteMatch (rc_silhouettematch)
        +
        provides an object detection solution for objects placed on a plane or stacked planar objects.
        +
        +
      • +
      +

      These modules are optional and can be activated by +purchasing a separate +license.

      +
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/disposal.html b/v24.04/en/disposal.html new file mode 100644 index 0000000..98bd6e0 --- /dev/null +++ b/v24.04/en/disposal.html @@ -0,0 +1,692 @@ + + + + + + + + + + + Information on disposal — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Information on disposal

      +_images/weee-mark_small.png +
        +
      1. Disposal of Waste Electrical & Electronic Equipment

        +

        This symbol on the product(s) and / or accompanying documents means that used electrical and electronic products +should not be mixed with general household waste. For proper treatment, recovery and recycling, please contact +your supplier or the manufacturer. Disposing of this product correctly will help save valuable resources and +prevent any potential negative effects on human health and the environment, which could otherwise arise from +inappropriate waste handling.

        +
      2. +
      3. Removal of batteries

        +

        If the products contain batteries and accumulators that can be removed from the product without destruction, +these must be removed before disposal and disposed of separately as batteries.

        +

        The following batteries or accumulators are contained in the rc_visard: None

        +
      4. +
      5. Options for returning old equipment

        +

        Owners of old devices can return them to the manufacturer to ensure proper disposal.

        +

        Please contact support about returning the device for disposal.

        +
      6. +
      7. Data protection

        +

        End users of Electrical & Electronic Equipment are responsible for deleting personal data on the waste equipment to be disposed of.

        +
      8. +
      9. WEEE registration number

        +

        Roboception is registered under the registration number DE 33323989 at the stiftung elektro-altgeräte register, +Nordostpark 72, 90411 Nuremberg, Germany, as a producer of electrical and/or electronic equipment.

        +
      10. +
      11. Collection and recovery quotas

        +

        According to the WEEE Directive, EU member states are obliged to collect data on waste electrical and electronic +equipment and to transmit this data to the European Commission. Further information can be found on the German +Ministry for the Environment website.

        +
      12. +
      +

      Information on Disposal outside the European Union

      +

      This symbol is valid only in the European Union. If you wish to discard this product please contact +your local authorities or dealer and ask for the correct method of disposal.

      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/eki.html b/v24.04/en/eki.html new file mode 100644 index 0000000..8e68159 --- /dev/null +++ b/v24.04/en/eki.html @@ -0,0 +1,1495 @@ + + + + + + + + + + + KUKA Ethernet KRL Interface — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      KUKA Ethernet KRL Interface

      +

      The rc_visard NG provides an Ethernet KRL Interface (EKI Bridge), +which allows communicating with the rc_visard NG from KUKA KRL via +KUKA.EthernetKRL XML.

      +
      +

      Note

      +

      The component is optional and requires a separate Roboception’s EKIBridge +license +to be purchased.

      +
      +
      +

      Note

      +

      The KUKA.EthernetKRL add-on software package version 2.2 or newer must be +activated on the robot controller to use this component.

      +
      +

      The EKI Bridge can be used to programmatically

      +
        +
      • do service calls, e.g. to start and stop individual computational nodes, +or to use offered services such as the hand-eye calibration or the +computation of grasp poses;
      • +
      • set and get run-time parameters of computation nodes, +e.g. of the camera, or disparity calculation.
      • +
      +
      +

      Note

      +

      A known limitation of the EKI Bridge is that strings representing valid numbers will be converted to int/float. +Hence user-defined names (like ROI IDs, etc.) should always contain at least one letter so they can be used in service call arguments.

      +
      +
      +

      Ethernet connection configuration

      +

      The EKI Bridge listens on port 7000 for EKI XML messages and transparently +bridges the rc_visard NG’s REST-API v2. +The received EKI messages are transformed to JSON and forwarded to the +rc_visard NG’s REST-API. +The response from the REST-API is transformed back to EKI XML.

      +

      The EKI Bridge gives access to run-time parameters and offered services +of all computational nodes described in +Software modules.

      +

      The Ethernet connection to the rc_visard NG on the robot controller is configured +using XML configuration files. +The EKI XML configuration files of all nodes running on the rc_visard NG are +listed at EKI XML configuration files.

      +

      Each node offering run-time parameters has an XML configuration file +for setting and getting its parameters. +These are named following the scheme <node_name>-parameters.xml. +Each node’s service has its own XML configuration file. +These are named following the scheme <node_name>-<service_name>.xml.

      +

      The IP of the rc_visard NG in the network needs to be filled in the XML file.

      +

      These files must be stored in the directory +C:\KRC\ROBOTER\Config\User\Common\EthernetKRL +of the robot controller and they are read in when a connection is initialized.

      +

      As an example, an Ethernet connection to configure the rc_stereomatching +parameters is established with the following KRL code.

      +
      +
      DECL EKI_Status RET
      +RET = EKI_INIT("rc_stereomatching-parameters")
      +RET = EKI_Open("rc_stereomatching-parameters")
      +
      +; ----------- Desired operation -----------
      +
      +RET = EKI_Close("rc_stereomatching-parameters")
      +
      +
      +
      +
      +

      Note

      +

      The EKI Bridge automatically terminates the connection to the client +if the received XML telegram is invalid.

      +
      +
      +
      +

      Generic XML structure

      +

      For data transmission, the EKI Bridge uses <req> as root XML element +(short for request).

      +

      The root tag always includes the following elements.

      +
        +
      • <node>. This includes a child XML element used by the EKI Bridge +to identify the target node. +The node name is already included in the XML configuration file.
      • +
      • <end_of_request>. End of request flag that triggers the request.
      • +
      +

      The following listing shows the generic XML structure for data transmission.

      +
      +
      <SEND>
      +  <XML>
      +    <ELEMENT Tag="req/node/<node_name>" Type="STRING"/>
      +    <ELEMENT Tag="req/end_of_request" Type="BOOL"/>
      +  </XML>
      +</SEND>
      +
      +
      +
      +

      For data reception, the EKI Bridge uses <res> as root XML element +(short for response). +The root tag always includes a <return_code> child element.

      +
      +
      <RECEIVE>
      +  <XML>
      +    <ELEMENT Tag="res/return_code/@value" Type="INT"/>
      +    <ELEMENT Tag="res/return_code/@message" Type="STRING"/>
      +    <ELEMENT Tag="res" Set_Flag="998"/>
      +  </XML>
      +</RECEIVE>
      +
      +
      +
      +
      +

      Note

      +

      By default the XML configuration files uses 998 as flag to notify KRL +that the response data record has been received. If this value is already +in use, it should be changed in the corresponding XML configuration file.

      +
      +
      +

      Return code

      +

      The <return_code> element consists of a value and a message attribute.

      +

      As for all other components, a successful request returns with a +res/return_code/@value of 0. +Negative values indicate that the request failed. +The error message is contained in res/return_code/@message. +Positive values indicate that the request succeeded with additional information, +contained in res/return_code/@message as well.

      +

      The following codes can be issued by the EKI Bridge component.

      + + ++++ + + + + + + + + + + + + + + + + + + + + + + +
      Table 54 Return codes of the EKI Bridge component
      CodeDescription
      0Success
      -1Parsing error in the conversion from XML to JSON
      -2Internal error
      -5Connection error from the REST-API
      -9Missing or invalid license for EKI Bridge component
      +
      +

      Note

      +

      The EKI Bridge can also return return code values specific +to individual nodes. They are documented in the respective +software module.

      +
      +
      +

      Note

      +

      Due to limitations in KRL, the maximum length of a string returned +by the EKI Bridge is 512 characters. All messages larger than this value +are truncated.

      +
      +
      +
      +
      +

      Services

      +

      For the nodes’ services, the XML schema is generated from the service’s +arguments and response in JavaScript Object Notation (JSON) described in +Software modules. +The conversion is done transparently, except for the conversion rules +described below.

      +

      Conversions of poses:

      +
      +

      A pose is a JSON object that includes position and orientation keys.

      +
      +
      {
      +  "pose": {
      +    "position": {
      +      "x": "float64",
      +      "y": "float64",
      +      "z": "float64",
      +    },
      +    "orientation": {
      +      "x": "float64",
      +      "y": "float64",
      +      "z": "float64",
      +      "w": "float64",
      +    }
      +  }
      +}
      +
      +
      +
      +

      This JSON object is converted to a KRL FRAME in the XML message.

      +
      +
      <pose X="..." Y="..." Z="..." A="..." B="..." C="..."></pose>
      +
      +
      +
      +

      Positions are converted from meters to millimeters and orientations are +converted from quaternions to KUKA ABC (in degrees).

      +
      +

      Note

      +

      No other unit conversions are included in the EKI Bridge. +All dimensions and 3D coordinates that don’t belong to a pose are +expected and returned in meters.

      +
      +
      +

      Arrays:

      +
      +

      Arrays are identified by adding the child element <le> +(short for list element) to the list name. As an example, the JSON object

      +
      +
      {
      +  "rectangles": [
      +    {
      +      "x": "float64",
      +      "y": "float64"
      +    }
      +  ]
      +}
      +
      +
      +
      +

      is converted to the XML fragment

      +
      +
      <rectangles>
      +  <le>
      +    <x>...</x>
      +    <y>...</y>
      +  </le>
      +</rectangles>
      +
      +
      +
      +
      +

      Use of XML attributes:

      +
      +

      All JSON keys whose values are a primitive data type and don’t belong to an +array are stored in attributes. As an example, the JSON object

      +
      +
      {
      +  "item": {
      +    "uuid": "string",
      +    "confidence": "float64",
      +    "rectangle": {
      +      "x": "float64",
      +      "y": "float64"
      +    }
      +  }
      +}
      +
      +
      +
      +

      is converted to the XML fragment

      +
      +
      <item uuid="..." confidence="...">
      +  <rectangle x="..." y="...">
      +  </rectangle>
      +</item>
      +
      +
      +
      +
      +
      +

      Request XML structure

      +

      The <SEND> element in the XML configuration file for a generic +service follows the specification below.

      +
      +
      <SEND>
      +  <XML>
      +    <ELEMENT Tag="req/node/<node_name>" Type="STRING"/>
      +    <ELEMENT Tag="req/service/<service_name>" Type="STRING"/>
      +    <ELEMENT Tag="req/args/<argX>" Type="<argX_type>"/>
      +    <ELEMENT Tag="req/end_of_request" Type="BOOL"/>
      +  </XML>
      +</SEND>
      +
      +
      +
      +

      The <service> element includes a child XML element that is used by the +EKI Bridge to identify the target service from the XML telegram. +The service name is already included in the configuration file.

      +

      The <args> element includes the service arguments and should be configured +with EKI_Set<Type> KRL instructions.

      +

      As an example, the <SEND> element of the rc_load_carrier_db’s +get_load_carriers service +(see LoadCarrierDB) is:

      +
      +
      <SEND>
      +  <XML>
      +    <ELEMENT Tag="req/node/rc_load_carrier_db" Type="STRING"/>
      +    <ELEMENT Tag="req/service/get_load_carriers" Type="STRING"/>
      +    <ELEMENT Tag="req/args/load_carrier_ids/le" Type="STRING"/>
      +    <ELEMENT Tag="req/end_of_request" Type="BOOL"/>
      +  </XML>
      +</SEND>
      +
      +
      +
      +

      The <end_of_request> element allows to have arrays in the request. +For configuring an array, the request is split into as many +packages as the size of the array. +The last telegram contains all tags, including the <end_of_request> +flag, while all other telegrams contain one array element each.

      +

      As an example, for requesting two load carrier models to the rc_load_carrier_db’s +get_load_carriers service, the user needs to send two XML messages. +The first XML telegram is:

      +
      +
      <req>
      +  <args>
      +    <load_carrier_ids>
      +      <le>load_carrier1</le>
      +    </load_carrier_ids>
      +  </args>
      +</req>
      +
      +
      +
      +

      This telegram can be sent from KRL with the EKI_Send command, +by specifying the list element as path:

      +
      +
      DECL EKI_STATUS RET
      +RET = EKI_SetString("rc_load_carrier_db-get_load_carriers", "req/args/load_carrier_ids/le", "load_carrier1")
      +RET = EKI_Send("rc_load_carrier_db-get_load_carriers", "req/args/load_carrier_ids/le")
      +
      +
      +
      +

      The second telegram includes all tags and triggers the request to the +rc_load_carrier_db node:

      +
      +
      <req>
      +  <node>
      +    <rc_load_carrier_db></rc_load_carrier_db>
      +  </node>
      +  <service>
      +    <get_load_carriers></get_load_carriers>
      +  </service>
      +  <args>
      +    <load_carrier_ids>
      +      <le>load_carrier2</le>
      +    </load_carrier_ids>
      +  </args>
      +  <end_of_request></end_of_request>
      +</req>
      +
      +
      +
      +

      This telegram can be sent from KRL by specifying req as path for EKI_Send:

      +
      +
      DECL EKI_STATUS RET
      +RET = EKI_SetString("rc_load_carrier_db-get_load_carriers", "req/args/load_carrier_ids/le", "load_carrier2")
      +RET = EKI_Send("rc_load_carrier_db-get_load_carriers", "req")
      +
      +
      +
      +
      +
      +

      Response XML structure

      +

      The <RECEIVE> element in the XML configuration file for a generic +service follows the specification below:

      +
      +
      <RECEIVE>
      +  <XML>
      +    <ELEMENT Tag="res/<resX>" Type="<resX_type>"/>
      +    <ELEMENT Tag="res/return_code/@value" Type="INT"/>
      +    <ELEMENT Tag="res/return_code/@message" Type="STRING"/>
      +    <ELEMENT Tag="res" Set_Flag="998"/>
      +  </XML>
      +</RECEIVE>
      +
      +
      +
      +

      As an example, the <RECEIVE> element of the rc_april_tag_detect’s +detect service +(see TagDetect) is:

      +
      +
      <RECEIVE>
      +  <XML>
      +    <ELEMENT Tag="res/timestamp/@sec" Type="INT"/>
      +    <ELEMENT Tag="res/timestamp/@nsec" Type="INT"/>
      +    <ELEMENT Tag="res/return_code/@message" Type="STRING"/>
      +    <ELEMENT Tag="res/return_code/@value" Type="INT"/>
      +    <ELEMENT Tag="res/tags/le/pose_frame" Type="STRING"/>
      +    <ELEMENT Tag="res/tags/le/timestamp/@sec" Type="INT"/>
      +    <ELEMENT Tag="res/tags/le/timestamp/@nsec" Type="INT"/>
      +    <ELEMENT Tag="res/tags/le/pose/@X" Type="REAL"/>
      +    <ELEMENT Tag="res/tags/le/pose/@Y" Type="REAL"/>
      +    <ELEMENT Tag="res/tags/le/pose/@Z" Type="REAL"/>
      +    <ELEMENT Tag="res/tags/le/pose/@A" Type="REAL"/>
      +    <ELEMENT Tag="res/tags/le/pose/@B" Type="REAL"/>
      +    <ELEMENT Tag="res/tags/le/pose/@C" Type="REAL"/>
      +    <ELEMENT Tag="res/tags/le/instance_id" Type="STRING"/>
      +    <ELEMENT Tag="res/tags/le/id" Type="STRING"/>
      +    <ELEMENT Tag="res/tags/le/size" Type="REAL"/>
      +    <ELEMENT Tag="res" Set_Flag="998"/>
      +  </XML>
      +</RECEIVE>
      +
      +
      +
      +

      For arrays, the response includes multiple instances of the same XML element. +Each element is written into a separate buffer within EKI and can be read +from the buffer with KRL instructions. +The number of instances can be requested with EKI_CheckBuffer and each +instance can then be read by calling EKI_Get<Type>.

      +

      As an example, the tag poses received after a call to the +rc_april_tag_detect’s detect service can be read in KRL using the +following code:

      +
      +
      DECL EKI_STATUS RET
      +DECL INT i
      +DECL INT num_instances
      +DECL FRAME poses[32]
      +
      +DECL FRAME pose = {X 0.0, Y 0.0, Z 0.0, A 0.0, B 0.0, C 0.0}
      +
      +RET = EKI_CheckBuffer("rc_april_tag_detect-detect", "res/tags/le/pose")
      +num_instances = RET.Buff
      +for i=1 to num_instances
      +  RET = EKI_GetFrame("rc_april_tag_detect-detect", "res/tags/le/pose", pose)
      +  poses[i] = pose
      +endfor
      +RET = EKI_ClearBuffer("rc_april_tag_detect-detect", "res")
      +
      +
      +
      +
      +

      Note

      +

      Before each request from EKI to the rc_visard NG, all buffers should +be cleared in order to store only the current response in the EKI buffers.

      +
      +
      +
      +
      +

      Parameters

      +

      All nodes’ parameters can be set and queried from the EKI Bridge. +The XML configuration file for a generic node follows the specification below:

      +
      +
      <SEND>
      +  <XML>
      +    <ELEMENT Tag="req/node/<node_name>" Type="STRING"/>
      +    <ELEMENT Tag="req/parameters/<parameter_x>/@value" Type="INT"/>
      +    <ELEMENT Tag="req/parameters/<parameter_y>/@value" Type="STRING"/>
      +    <ELEMENT Tag="req/end_of_request" Type="BOOL"/>
      +  </XML>
      +</SEND>
      +<RECEIVE>
      +  <XML>
      +    <ELEMENT Tag="res/parameters/<parameter_x>/@value" Type="INT"/>
      +    <ELEMENT Tag="res/parameters/<parameter_x>/@default" Type="INT"/>
      +    <ELEMENT Tag="res/parameters/<parameter_x>/@min" Type="INT"/>
      +    <ELEMENT Tag="res/parameters/<parameter_x>/@max" Type="INT"/>
      +    <ELEMENT Tag="res/parameters/<parameter_y>/@value" Type="REAL"/>
      +    <ELEMENT Tag="res/parameters/<parameter_y>/@default" Type="REAL"/>
      +    <ELEMENT Tag="res/parameters/<parameter_y>/@min" Type="REAL"/>
      +    <ELEMENT Tag="res/parameters/<parameter_y>/@max" Type="REAL"/>
      +    <ELEMENT Tag="res/return_code/@value" Type="INT"/>
      +    <ELEMENT Tag="res/return_code/@message" Type="STRING"/>
      +    <ELEMENT Tag="res" Set_Flag="998"/>
      +  </XML>
      +</RECEIVE>
      +
      +
      +
      +

      The request is interpreted as a get request if all parameter’s +value attributes are empty. +If any value attribute is non-empty, it is interpreted as set request +of the non-empty parameters.

      +

      As an example, the current value of all parameters of rc_stereomatching +can be queried using the XML telegram:

      +
      +
      <req>
      +  <node>
      +    <rc_stereomatching></rc_stereomatching>
      +  </node>
      +  <parameters></parameters>
      +  <end_of_request></end_of_request>
      +</req>
      +
      +
      +
      +

      This XML telegram can be sent out with Ethernet KRL using:

      +
      +
      DECL EKI_STATUS RET
      +RET = EKI_Send("rc_stereomatching-parameters", "req")
      +
      +
      +
      +

      The response from the EKI Bridge contains all parameters:

      +
      +
      <res>
      +  <parameters>
      +    <acquisition_mode default="Continuous" max="" min="" value="Continuous"/>
      +    <quality default="High" max="" min="" value="High"/>
      +    <static_scene default="0" max="1" min="0" value="0"/>
      +    <seg default="200" max="4000" min="0" value="200"/>
      +    <smooth default="1" max="1" min="0" value="1"/>
      +    <fill default="3" max="4" min="0" value="3"/>
      +    <minconf default="0.5" max="1.0" min="0.5" value="0.5"/>
      +    <mindepth default="0.1" max="100.0" min="0.1" value="0.1"/>
      +    <maxdepth default="100.0" max="100.0" min="0.1" value="100.0"/>
      +    <maxdeptherr default="100.0" max="100.0" min="0.01" value="100.0"/>
      +  </parameters>
      +  <return_code message="" value="0"/>
      +</res>
      +
      +
      +
      +

      The quality parameter of rc_stereomatching can be set to Low +by the XML telegram:

      +
      +
      <req>
      +    <node>
      +      <rc_stereomatching></rc_stereomatching>
      +    </node>
      +    <parameters>
      +      <quality value="Low"></quality>
      +    </parameters>
      +    <end_of_request></end_of_request>
      +</req>
      +
      +
      +
      +

      This XML telegram can be sent out with Ethernet KRL using:

      +
      +
      DECL EKI_STATUS RET
      +RET = EKI_SetString("rc_stereomatching-parameters", "req/parameters/quality/@value", "Low")
      +RET = EKI_Send("rc_stereomatching-parameters", "req")
      +
      +
      +
      +

      In this case, only the applied value of quality is returned by the +EKI Bridge:

      +
      +
      <res>
      +  <parameters>
      +    <quality default="High" max="" min="" value="Low"/>
      +  </parameters>
      +  <return_code message="" value="0"/>
      +</res>
      +
      +
      +
      +
      +
      +

      EKI XML configuration files

      +

      This section contains EKI XML configuration files for all +nodes running on the rc_visard NG. They are also available +for download in this +ZIP archive.

      +

      rc_april_tag_detect

      +
      +
      +
      +

      rc_boxpick

      +
      +
      +

      rc_camera

      +
      +
      +
      +

      rc_collision_check

      +
      +
      +

      rc_gripper_db

      +
      +
      +

      rc_hand_eye_calibration

      +
      +
      +

      rc_iocontrol

      +
      +
      +
      +

      rc_itempick

      +
      +
      +

      rc_load_carrier

      +
      +
      +

      rc_load_carrier_db

      +
      +
      +

      rc_qr_code_detect

      +
      +
      +
      +

      rc_roi_db

      +
      +
      +

      rc_silhouettematch

      +
      +
      +

      rc_stereocalib

      +
      +
      +
      +

      rc_stereomatching

      +
      +
      +
      +
      +

      Example applications

      +

      More detailed robot application examples can be found at https://github.com/roboception/eki_examples.

      +
      +
      +

      Troubleshooting

      +

      SmartPad error message: Limit of element memory reached

      +

      This error may occur if the number of matches exceeds the memory limit.

      +
        +
      • Increase BUFFERING and set BUFFSIZE in EKI config files. Adapt these settings to your particular KRC.
      • +
      • Decrease the ‘Maximum Matches’ parameter in the detection module
      • +
      • Even if the total memory limit (BUFFSIZE) of a message is not reached, the KRC might not +be able to parse the number of child elements in the XML tree if the +BUFFERING limit is too small. For example, if your application proposes 50 +different grasps, the BUFFERING limit needs to be 50 too.
      • +
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/general.html b/v24.04/en/general.html new file mode 100644 index 0000000..814c9ac --- /dev/null +++ b/v24.04/en/general.html @@ -0,0 +1,680 @@ + + + + + + + + + + + Overview — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Overview

      +

      The 3D sensor rc_visard NG is an IP54-protected stereo-camera +with on-board computing capabilities.

      +

      The rc_visard NG provides real-time camera images and depth images, which can +be used to compute 3D point clouds. Additionally, it provides +confidence and error images as quality measures for each image acquisition. +It offers an intuitive web UI (user interface) and a standardized +GenICam interface, making it compatible with all major image processing +libraries.

      +

      With optionally available software modules the rc_visard NG provides out-of-the-box solutions +for object detection and robotic pick-and-place applications.

      +

      The rc_visard NG’s intuitive calibration, configuration, and use enable 3D vision for everyone.

      +
      +_images/sensor_ng.png +

      Fig. 1 rc_visard NG 160

      +
      +

      The terms “sensor” and “rc_visard NG” used throughout the manual all refer to the Roboception rc_visard NG.

      +
      +

      Note

      +

      This manual uses the metric system and mostly uses the units meter and +millimeter. Unless otherwise specified, all dimensions in technical drawings are +in millimeters.

      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/genindex.html b/v24.04/en/genindex.html new file mode 100644 index 0000000..fbc2dc7 --- /dev/null +++ b/v24.04/en/genindex.html @@ -0,0 +1,2883 @@ + + + + + + + + + + + + Index — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + + +

      Index

      + +
      + Symbols + | A + | B + | C + | D + | E + | F + | G + | H + | I + | L + | M + | N + | O + | P + | Q + | R + | S + | T + | U + | V + | W + | X + +
      +

      Symbols

      + + + +
      + +

      A

      + + + +
      + +

      B

      + + + +
      + +

      C

      + + + +
      + +

      D

      + + + +
      + +

      E

      + + + +
        +
      • + ExposureAuto + +
      • +
      • + ExposureRegionHeight + +
      • +
      • + ExposureRegionOffsetX + +
      • +
      • + ExposureRegionOffsetY + +
      • +
      • + ExposureRegionWidth + +
      • +
      • + ExposureTime + +
      • +
      • + ExposureTimeAutoMax + +
      • +
      • + external reference frame + +
      • +
      + +

      F

      + + + +
      + +

      G

      + + + +
      + +

      H

      + + + +
      + +

      I

      + + + +
      + +

      L

      + + + +
      + +

      M

      + + + +
      + +

      N

      + + + +
      + +

      O

      + + + +
      + +

      P

      + + + +
      + +

      Q

      + + + +
      + +

      R

      + + + +
      + +

      S

      + + + +
      + +

      T

      + + + +
      + +

      U

      + + + +
      + +

      V

      + + +
      + +

      W

      + + + +
      + +

      X

      + + + +
      + + + +
      +
      + +
      +
      +
      + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/gigevision.html b/v24.04/en/gigevision.html new file mode 100644 index 0000000..3ab4d9b --- /dev/null +++ b/v24.04/en/gigevision.html @@ -0,0 +1,1457 @@ + + + + + + + + + + + GigE Vision 2.0/GenICam image interface — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      GigE Vision 2.0/GenICam image interface

      +

      Gigabit Ethernet for Machine Vision (“GigE Vision®” for short) is an industrial camera interface standard based on UDP/IP +(see http://www.gigevision.com). +The rc_visard NG is a GigE Vision® version 2.0 device and is hence compatible with all GigE Vision® 2.0 compliant frameworks and libraries.

      +

      GigE Vision® uses GenICam to describe the camera/device features. For more information about this Generic Interface for Cameras see http://www.genicam.org/.

      +

      Via this interface the rc_visard NG provides features such as

      +
        +
      • discovery,
      • +
      • IP configuration,
      • +
      • configuration of camera related parameters,
      • +
      • image grabbing, and
      • +
      • time synchronization via IEEE 1588-2008 PrecisionTimeProtocol (PTPv2).
      • +
      +
      +

      Note

      +

      The rc_visard NG supports jumbo frames of up to 9000 bytes. Setting an MTU of 9000 +on your GigE Vision client side is recommended for best performance.

      +
      +
      +

      Note

      +

      Roboception provides tools and a C++ API with examples for discovery, configuration, and image +streaming via the GigE Vision/GenICam interface. See http://www.roboception.com/download.

      +
      +
      +

      GigE Vision ports

      +

      GigE Vision is a UDP based protocol. On the rc_visard NG the UDP ports are fixed and known:

      +
        +
      • UDP port 3956: GigE Vision Control Protocol (GVCP). Used for discovery, control and configuration.
      • +
      • UDP port 50010: Stream channel source port for GigE Vision Stream Protocol (GVSP) used for image streaming.
      • +
      +
      +
      +

      Important GenICam parameters

      +

      The following list gives an overview of the relevant GenICam features of +the rc_visard NG that can be read and/or changed +via the GenICam interface. In addition to the standard parameters, which are defined in +the Standard Feature Naming Convention (SFNC, see +http://www.emva.org/standards-technology/genicam/genicam-downloads/), +rc_visard NG devices also offer custom parameters that account for special +features of the +Camera +and the +Stereo matching +module.

      +
      +
      +

      Important standard GenICam features

      +
      +

      Category: ImageFormatControl

      +
      +
      ComponentSelector
      +
        +
      • type: Enumeration, one of Intensity, IntensityCombined, Disparity, Confidence, or Error
      • +
      • default: -
      • +
      • description: Allows the user to select one of the five image streams for configuration (see Provided image streams).
      • +
      +
      +
      +
      +
      ComponentIDValue (read-only)
      +
        +
      • type: Integer
      • +
      • description: The ID of the image stream selected by the ComponentSelector.
      • +
      +
      +
      +
      +
      ComponentEnable
      +
        +
      • type: Boolean
      • +
      • default: -
      • +
      • description: If set to true, it enables the image stream selected by ComponentSelector; otherwise, it disables the stream. +Using ComponentSelector and ComponentEnable, individual image streams can be switched on and off.
      • +
      +
      +
      +
      +
      Width (read-only)
      +
        +
      • type: Integer
      • +
      • description: Image width in pixel of image stream that is currently selected by ComponentSelector.
      • +
      +
      +
      +
      +
      Height (read-only)
      +
        +
      • type: Integer
      • +
      • description: Image height in pixel of image stream that is currently selected by ComponentSelector.
      • +
      +
      +
      +
      +
      WidthMax (read-only)
      +
        +
      • type: Integer
      • +
      • description: Maximum width of an image.
      • +
      +
      +
      +
      +
      HeightMax (read-only)
      +
        +
      • type: Integer
      • +
      • description: Maximum height of an image in the streams. This is always 1920 pixels due to the +stacked left and right images in the IntensityCombined stream (see Provided image streams).
      • +
      +
      +
      +
      +
      PixelFormat
      +
        +
      • type: Enumeration, one of Mono8, YCbCr411_8 (color cameras only), Coord3D_C16, Confidence8 and Error8
      • +
      • description: Pixel format of the selected component. The enumeration only permits to choose the format +among the possibly formats for the selected component. For a color camera, Mono8 or YCbCr411_8 +can be chosen for the Intensity and IntensityCombined component.
      • +
      +
      +
      +
      +
      +

      Category: AcquisitionControl

      +
      +
      AcquisitionFrameRate
      +
        +
      • type: Float, ranges from 1 Hz to 25 Hz
      • +
      • default: 25 Hz
      • +
      • description: Frame rate of the camera +(FPS).
      • +
      +
      +
      +
      +
      ExposureAuto
      +
        +
      • type: Enumeration, one of Continuous, Out1High, AdaptiveOut1, HDR or Off
      • +
      • default: Continuous
      • +
      • description: Combines exp_control (exposure control) +and exp_auto_mode (auto exposure mode). +Off maps to Manual exposure control. +Continuous, Out1High or AdaptiveOut1 enable Auto exposure control +with the respective auto exposure mode where Continuous maps to the Normal exp_auto_mode. +HDR enables high-dynamic-range exposure control.
      • +
      +
      +
      +
      +
      ExposureTime
      +
        +
      • type: Float, ranges from 66 µs to 18000 µs
      • +
      • default: 5000 µs
      • +
      • description: The cameras’ exposure time in microseconds for the manual exposure mode +(Exposure).
      • +
      +
      +
      +
      +
      +

      Category: AnalogControl

      +
      +
      GainSelector (read-only)
      +
        +
      • type: Enumeration, is always All
      • +
      • default: All
      • +
      • description: The rc_visard NG currently supports only one overall gain setting.
      • +
      +
      +
      +
      +
      Gain
      +
        +
      • type: Float, ranges from 0 dB to 18 dB
      • +
      • default: 0 dB
      • +
      • description: The cameras’ gain value in decibel that is used in manual exposure mode +(Gain).
      • +
      +
      +
      +
      +
      BalanceWhiteAuto (color cameras only)
      +
        +
      • type: Enumeration, one of Continuous or Off
      • +
      • default: Continuous
      • +
      • description: Can be set to Off for manual white balancing mode or to Continuous +for auto white balancing. This feature is only available on color cameras +(wb_auto).
      • +
      +
      +
      +
      +
      BalanceRatioSelector (color cameras only)
      +
        +
      • type: Enumeration, one of Red or Blue
      • +
      • default: Red
      • +
      • description: Selects ratio to be modified by BalanceRatio. Red means red to green +ratio and Blue means blue to green ratio. This feature is only available on color cameras.
      • +
      +
      +
      +
      +
      BalanceRatio (color cameras only)
      +
        +
      • type: Float, ranges from 0.125 to 8
      • +
      • default: 1.2 if Red and 2.4 if Blue is selected in BalanceRatioSelector
      • +
      • description: Weighting of red or blue to green color channel. This feature is only available +on color cameras +(wb_ratio).
      • +
      +
      +
      +
      +
      +

      Category: DigitalIOControl

      +
      +
      LineSelector
      +
        +
      • type: Enumeration, one of Out1, Out2, In1 or In2
      • +
      • default: Out1
      • +
      • description: Selects the input or output line for getting the current status or setting +the source.
      • +
      +
      +
      +
      +
      LineStatus (read-only)
      +
        +
      • type: Boolean
      • +
      • description: Current status of the line selected by LineSelector.
      • +
      +
      +
      +
      +
      LineStatusAll (read-only)
      +
        +
      • type: Integer
      • +
      • description: Current status of GPIO inputs and outputs represented in the lowest four bits.
      • +
      + + +++++++ + + + + + + + + + + + + + + + + +
      Table 53 Meaning of bits of LineStatusAll field.
      Bit4321
      GPIOIn 2In 1Out 2Out 1
      +
      +
      +
      +
      LineSource
      +
        +
      • type: Enumeration, one of ExposureActive, ExposureAlternateActive, Low or High
      • +
      • default: Low
      • +
      • description: Mode for output line selected by LineSelector as described in the IOControl +module (out1_mode and out2_mode). See also parameter +AcquisitionAlternateFilter for filtering images in ExposureAlternateActive mode.
      • +
      +
      +
      +
      +
      +

      Category: TransportLayerControl / PtpControl

      +
      +
      PtpEnable
      +
        +
      • type: Boolean
      • +
      • default: false
      • +
      • description: Switches PTP synchronization on and off.
      • +
      +
      +
      +
      +
      +

      Category: Scan3dControl

      +
      +
      Scan3dDistanceUnit (read-only)
      +
        +
      • type: Enumeration, is always Pixel
      • +
      • description: Unit for the disparity measurements, which is always Pixel.
      • +
      +
      +
      +
      +
      Scan3dOutputMode (read-only)
      +
        +
      • type: Enumeration, is always DisparityC
      • +
      • description: Mode for the depth measurements, which is always DisparityC.
      • +
      +
      +
      +
      +
      Scan3dFocalLength (read-only)
      +
        +
      • type: Float
      • +
      • description: Focal length in pixel of image stream selected by ComponentSelector. In case of +the component Disparity, Confidence and Error, the value also depends on the +resolution that is implicitly selected by DepthQuality.
      • +
      +
      +
      +
      +
      Scan3dBaseline (read-only)
      +
        +
      • type: Float
      • +
      • description: Baseline of the stereo camera in meters.
      • +
      +
      +
      +
      +
      Scan3dPrinciplePointU (read-only)
      +
        +
      • type: Float
      • +
      • description: Horizontal location of the principle point in pixel of image stream selected by +ComponentSelector. In case of the component Disparity, Confidence and Error, +the value also depends on the resolution that is implicitly selected by DepthQuality.
      • +
      +
      +
      +
      +
      Scan3dPrinciplePointV (read-only)
      +
        +
      • type: Float
      • +
      • description: Vertical location of the principle point in pixel of image stream selected by +ComponentSelector. In case of the component Disparity, Confidence and Error, +the value also depends on the resolution that is implicitly selected by DepthQuality.
      • +
      +
      +
      +
      +
      Scan3dCoordinateScale (read-only)
      +
        +
      • type: Float
      • +
      • description: The scale factor that has to be multiplied with the disparity values in the disparity +image stream to get the actual disparity measurements. This value is always 0.0625.
      • +
      +
      +
      +
      +
      Scan3dCoordinateOffset (read-only)
      +
        +
      • type: Float
      • +
      • description: The offset that has to be added to the disparity values in the disparity +image stream to get the actual disparity measurements. For the rc_visard NG, this value +is always 0 and can therefore be disregarded.
      • +
      +
      +
      +
      +
      Scan3dInvalidDataFlag (read-only)
      +
        +
      • type: Boolean
      • +
      • description: Is always true, which means that invalid data in the +disparity image is marked by a specific value defined by the +Scan3dInvalidDataValue parameter.
      • +
      +
      +
      +
      +
      Scan3dInvalidDataValue (read-only)
      +
        +
      • type: Float
      • +
      • description: Is the value which stands for invalid disparity. This value is always 0, which means that +disparity values of 0 correspond to invalid measurements. To distinguish between invalid disparity measurements and +disparity measurements of 0 for objects which are infinitely far away, the rc_visard NG sets the disparity value for the latter +to the smallest possible disparity value of 0.0625. This still corresponds to an object distance of several hundred meters.
      • +
      +
      +
      +
      +
      +

      Category: ChunkDataControl

      +
      +
      ChunkModeActive
      +
        +
      • type: Boolean
      • +
      • default: False
      • +
      • description: Enables chunk data that is delivered with every image.
      • +
      +
      +
      +
      +
      +
      +

      Custom GenICam features of the rc_visard NG

      +
      +

      Category: DeviceControl

      +
      +
      RcSystemReady (read-only)
      +
        +
      • type: Boolean
      • +
      • description: Returns whether the device’s boot process has completed and all modules are running.
      • +
      +
      +
      +
      +
      RcParamLockDisable
      +
        +
      • type: Boolean
      • +
      • default: False
      • +
      • description: If set to true, the camera and depth image parameters are not locked when a GigE Vision +client is connected to the device. Please note that depending on the connected GigE Vision client, +parameter changes by other applications (e.g. the Web GUI) might not be noticed by the GigE Vision client, +which could lead to unwanted results.
      • +
      +
      +
      +
      +
      +

      Category: AcquisitionControl

      +
      +
      AcquisitionAlternateFilter
      +
        +
      • type: Enumeration, one of Off, OnlyHigh or OnlyLow
      • +
      • default: Off
      • +
      • description: If this parameter is set to OnlyHigh (or OnlyLow) and the LineSource +is set to ExposureAlternateActive for any output, then only camera images are delivered +that are captured while the output is high, i.e. a potentially connected projector is on (or +low, i.e. a potentially connected projector is off). This parameter is a simple means for only +getting images without projected pattern. The minimal time difference between camera and +disparity images will be about 40 ms in this case +(see IOControl).
      • +
      +
      +
      +
      +
      AcquisitionMultiPartMode
      +
        +
      • type: Enumeration, one of SingleComponent or SynchronizedComponents
      • +
      • default: SingleComponent
      • +
      • description: Only effective in MultiPart mode. If this parameter is set to SingleComponent +the images are sent immediately as a single component per frame/buffer when they become available. +This is the same behavior as when MultiPart is not supported by the client. +If set to SynchronizedComponents all enabled components are time synchronized on the rc_visard NG +and only sent (in one frame/buffer) when they are all available for that timestamp.
      • +
      +
      +
      +
      +
      ExposureTimeAutoMax
      +
        +
      • type: Float, ranges from 66 µs to 18000 µs
      • +
      • default: 18000 µs
      • +
      • description: Maximal exposure time in auto exposure mode +(Max Exposure).
      • +
      +
      +
      +
      +
      ExposureRegionOffsetX
      +
        +
      • type: Integer in the range of 0 to the maximum image width
      • +
      • default: 0
      • +
      • description: Horizontal offset of exposure region in pixel.
      • +
      +
      +
      +
      +
      ExposureRegionOffsetY
      +
        +
      • type: Integer in the range of 0 to the maximum image height
      • +
      • default: 0
      • +
      • description: Vertical offset of exposure region in pixel.
      • +
      +
      +
      +
      +
      ExposureRegionWidth
      +
        +
      • type: Integer in the range of 0 to the maximum image width
      • +
      • default: 0
      • +
      • description: Width of exposure region in pixel.
      • +
      +
      +
      +
      +
      ExposureRegionHeight
      +
        +
      • type: Integer in the range of 0 to the maximum image height
      • +
      • default: 0
      • +
      • description: Height of exposure region in pixel.
      • +
      +
      +
      +
      +
      RcExposureAutoAverageMax
      +
        +
      • type: Float in the range of 0 to 1
      • +
      • default: 0.75
      • +
      • description: Maximum brightness for the auto exposure function +as value between 0 (dark) and 1 (bright).
      • +
      +
      +
      +
      +
      RcExposureAutoAverageMin
      +
        +
      • type: Float in the range of 0 to 1
      • +
      • default: 0.25
      • +
      • description: Minimum brightness for the auto exposure function +as value between 0 (dark) and 1 (bright).
      • +
      +
      +
      +
      +
      +

      Category: Scan3dControl

      +
      +
      FocalLengthFactor (read-only)
      +
        +
      • type: Float
      • +
      • description: The focal length scaled to an image width of 1 pixel. To get the focal length in pixels for a +certain image, this value must be multiplied by the width of the received image. See also parameter +Scan3dFocalLength.
      • +
      +
      +
      +
      +
      Baseline (read-only)
      +
        +
      • type: Float
      • +
      • description: This parameter is deprecated. The parameter Scan3dBaseline should be used instead.
      • +
      +
      +
      +
      +
      +

      Category: DepthControl

      +
      +
      DepthAcquisitionMode
      +
        +
      • type: Enumeration, one of SingleFrame, SingleFrameOut1 or Continuous
      • +
      • default: Continuous
      • +
      • description: In single frame mode, stereo matching is performed upon each +call of DepthAcquisitionTrigger. The SingleFrameOut1 mode can be +used to control an external projector. It sets the line source of Out1 to +ExposureAlternateActive upon each trigger and resets it to Low as soon +as the images for stereo matching are grabbed. In continuous mode, +stereo matching is performed continuously.
      • +
      +
      +
      +
      +
      DepthAcquisitionTrigger
      +
        +
      • type: Command
      • +
      • description: This command triggers stereo matching of the next available +stereo image pair, if DepthAcquisitionMode is set to SingleFrame or SingleFrameOut1.
      • +
      +
      +
      +
      +
      DepthQuality
      +
        +
      • type: Enumeration, one of Low, Medium, High, or Full (only with StereoPlus license)
      • +
      • default: High
      • +
      • description: Quality of disparity images. Lower quality results in disparity +images with lower resolution +(Quality).
      • +
      +
      +
      +
      +
      DepthDoubleShot
      +
        +
      • type: Boolean
      • +
      • default: False
      • +
      • description: True for improving the stereo matching result of a scene recorded with a projector by filling holes with depth information computed from images without projector pattern. +(Double-Shot).
      • +
      +
      +
      +
      +
      DepthStaticScene
      +
        +
      • type: Boolean
      • +
      • default: False
      • +
      • description: True for averaging 8 consecutive camera images for improving the stereo matching result. +(Static).
      • +
      +
      +
      +
      +
      DepthSmooth (read-only if StereoPlus license is not available)
      +
        +
      • type: Boolean
      • +
      • default: False
      • +
      • description: True for advanced smoothing of disparity values. +(Smoothing).
      • +
      +
      +
      +
      +
      DepthFill
      +
        +
      • type: Integer, ranges from 0 pixel to 4 pixels
      • +
      • default: 3 pixels
      • +
      • description: Value in pixels for +Fill-In.
      • +
      +
      +
      +
      +
      DepthSeg
      +
        +
      • type: Integer, ranges from 0 pixel to 4000 pixels
      • +
      • default: 200 pixels
      • +
      • description: Value in pixels for +Segmentation.
      • +
      +
      +
      +
      +
      DepthMinConf
      +
        +
      • type: Float, ranges from 0.0 to 1.0
      • +
      • default: 0.0
      • +
      • description: Value for Minimum Confidence +filtering.
      • +
      +
      +
      +
      +
      DepthMinDepth
      +
        +
      • type: Float, ranges from 0.1 m to 100.0 m
      • +
      • default: 0.1 m
      • +
      • description: Value in meters for Minimum Distance +filtering.
      • +
      +
      +
      +
      +
      DepthMaxDepth
      +
        +
      • type: Float, ranges from 0.1m to 100.0 m
      • +
      • default: 100.0 m
      • +
      • description: Value in meters for Maximum Distance +filtering.
      • +
      +
      +
      +
      +
      DepthMaxDepthErr
      +
        +
      • type: Float, ranges from 0.01 m to 100.0 m
      • +
      • default: 100.0 m
      • +
      • description: Value in meters for Maximum Depth Error +filtering.
      • +
      +
      +
      +
      +
      +
      +

      Chunk data

      +

      The rc_visard NG supports chunk parameters that are transmitted with every +image. Chunk parameters all have the prefix Chunk. Their meaning equals +their non-chunk counterparts, except that they belong to the corresponding +image, e.g. Scan3dFocalLength depends on ComponentSelector and +DepthQuality as both can change the image resolution. The parameter +ChunkScan3dFocalLength that is delivered with an image fits to the +resolution of the corresponding image.

      +

      Particularly useful chunk parameters are:

      +
        +
      • ChunkComponentSelector selects for which component to extract the chunk +data in MultiPart mode.
      • +
      • ChunkComponentID and ChunkComponentIDValue provide the relation of +the image to its component (e.g. camera image or disparity image) without +guessing from the image format or size.
      • +
      • ChunkLineStatusAll provides the status of all GPIOs at the time of image +acquisition. See LineStatusAll above for a description of bits.
      • +
      • ChunkScan3d... parameters are useful for 3D reconstruction as described +in Section Image stream conversions.
      • +
      • ChunkPartIndex provides the index of the image part in this MultiPart +block for the selected component (ChunkComponentSelector).
      • +
      • ChunkRcOut1Reduction gives a ratio of how much the brightness of the images with GPIO Out1 LOW is +lower than the brightness of the images with GPIO Out1 HIGH. For example, a value of 0.2 means that the images with +GPIO Out1 LOW have 20% less brightness than the images with GPIO Out1 HIGH. This value is only available if +exp_auto_mode of the stereo camera is set to AdaptiveOut1 or Out1High (auto exposure mode).
      • +
      +

      Chunk data is enabled by setting the GenICam parameter ChunkModeActive to +True.

      +
      +
      +

      Provided image streams

      +

      The rc_visard NG provides the following five different image streams via the GenICam interface:

      + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Component namePixelFormatDescription
      Intensity
      +
      Mono8 (monochrome cameras)
      +
      YCbCr411_8 (color cameras)
      +
      +
      Left rectified camera image
      IntensityCombined
      +
      Mono8 (monochrome cameras)
      +
      YCbCr411_8 (color cameras)
      +
      +
      Left rectified camera image stacked on right rectified camera image
      DisparityCoord3D_C16Disparity image in desired resolution, i.e., DepthQuality of +Full, High, Medium or Low
      ConfidenceConfidence8Confidence image
      ErrorError8 (custom: 0x81080001)Disparity error image
      +

      Each image comes with a buffer timestamp and the PixelFormat given in the above table. This PixelFormat +should be used to distinguish between the different image types. Images belonging to the same acquisition +timestamp can be found by comparing the GenICam buffer timestamps.

      +
      +
      +

      Image stream conversions

      +

      The disparity image contains 16 bit unsigned integer values. These values must be multiplied by the scale value +given in the GenICam feature Scan3dCoordinateScale to get the disparity values \(d\) in pixels. To +compute the 3D object coordinates from the disparity values, the focal length and the baseline as well as the +principle point are required. +These parameters are transmitted as GenICam features Scan3dFocalLength, Scan3dBaseline, +Scan3dPrincipalPointU and Scan3dPrincipalPointV. The focal length and principal point depend on the image +resolution of the selected component. +Knowing these values, the pixel coordinates and the disparities can be transformed into 3D +object coordinates in the camera coordinate frame +using the equations described in Computing depth images and point clouds.

      +
      +

      Note

      +

      The rc_visard NG’s camera coordinate frame is defined as shown in +sensor coordinate frame.

      +
      +

      Assuming that \(d16_{ik}\) is the 16 bit disparity value at column \(i\) and row \(k\) +of a disparity image, the float disparity in pixels \(d_{ik}\) is given by

      +
      +\[d_{ik}=d16_{ik} \cdot \mathrm{Scan3dCoordinateScale}\]
      +

      The 3D reconstruction in meters can be written with the GenICam parameters as:

      +
      +\[\begin{split}P_x&=\left(i+0.5-\mathrm{Scan3dPrincipalPointU}\right) \frac{\mathrm{Scan3dBaseline}}{d_{ik}},\\ +P_y&=\left(k+0.5-\mathrm{Scan3dPrincipalPointV}\right) \frac{\mathrm{Scan3dBaseline}}{d_{ik}},\\ +P_z&=\mathrm{Scan3dFocalLength} \frac{\mathrm{Scan3dBaseline}}{d_{ik}}.\end{split}\]
      +

      The confidence image contains 8 bit unsigned integer values. These values have to be divided by 255 to +get the confidence as value between 0 an 1.

      +

      The error image contains 8 bit unsigned integer values. The error \(e_{ik}\) must be multiplied +by the scale value given in the GenICam feature Scan3dCoordinateScale to get the disparity-error +values \(d_{eps}\) in pixels. According to the description in +Confidence and error images, the +depth error \(z_{eps}\) in meters can be computed with GenICam parameters as

      +
      +\[\begin{split}d_{ik}&=d16_{ik} \cdot \mathrm{Scan3dCoordinateScale},\\ +z_{eps}&=\frac{e_{ik} \cdot \mathrm{Scan3dCoordinateScale} \cdot \mathrm{Scan3dFocalLength} + \cdot \mathrm{Scan3dBaseline}} + {(d_{ik})^2}.\end{split}\]
      +
      +

      Note

      +

      It is preferable to enable chunk data with the parameter ChunkModeActive and to use +the chunk parameters ChunkScan3dCoordinateScale, ChunkScan3dFocalLength, +ChunkScan3dBaseline, ChunkScan3dPrincipalPointU and ChunkScan3dPrincipalPointV +that are delivered with every image, because their values already fit to the image +resolution of the corresponding image.

      +
      +

      For more information about disparity, error, and confidence images, please refer to +Stereo matching.

      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/glossary.html b/v24.04/en/glossary.html new file mode 100644 index 0000000..72e608b --- /dev/null +++ b/v24.04/en/glossary.html @@ -0,0 +1,737 @@ + + + + + + + + + + + Glossary — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Glossary

      +
      +
      DHCP
      +
      The Dynamic Host Configuration Protocol (DHCP) is used to automatically assign an +IP address to a network device. Some DHCP servers only accept known devices. +In this case, an administrator needs to configure the DHCP server with the +fixed MAC address of a device.
      +
      DNS
      mDNS
      +
      The Domain Name Server (DNS) manages the host names and IP addresses of all +network devices. It is responsible for resolving the host name into the IP address for +communication with a device. A DNS can be configured to get this information +automatically when a device appears on a network or manually by an administrator. In +contrast, multicast DNS (mDNS) works without a central server by querying all devices +on a local network each time a host name needs to be resolved. mDNS is available by +default on Linux and Mac operating systems and is used when ‘.local’ is appended to a host +name.
      +
      DOF
      +
      The Degrees Of Freedom (DOF) are the number of independent parameters for translation +and rotation. In 3D space, 6 DOF (i.e. three for translation and three rotation) are +sufficient to describe an arbitrary position and orientation.
      +
      GenICam
      +
      GenICam is a generic standard interface for cameras. It serves as a unified interface +around other standards such as GigE Vision, Camera Link, USB, etc. See +http://genicam.org for more information.
      +
      GigE
      +
      Gigabit Ethernet (GigE) is a networking technology for transmitting data at +one gigabit per second.
      +
      GigE Vision
      +
      GigE Vision® is a standard for configuring cameras and transmitting images over a +GigE network link. See http://gigevision.com for more information.
      +
      IP
      IP address
      +
      The Internet Protocol (IP) is a standard for sending data between devices in a computer +network. Every device requires an IP address, which must be unique in the network. +The IP address can be configured by DHCP, Link-Local, or manually.
      + +
      Link-Local is a technology where network devices associate themselves with an IP address +from the 169.254.0.0/16 IP range and check if it is unique in the local network. +Link-Local can be used if +DHCP is unavailable and manual IP configuration is not or cannot be done. +Link-Local is especially useful for connecting a network device directly to a +host computer. By default, Windows 10 reverts automatically to Link-Local if +DHCP is unavailable. Under Linux, Link-Local must be enabled manually in the network +manager.
      +
      MAC address
      +
      The Media Access Control (MAC) address is a unique, persistent address for +networking devices. It is also known as the hardware address of a device. In contrast +to the IP address, the MAC address is (normally) permanently given to +a device and does not change.
      +
      NTP
      +
      The Network Time Protocol (NTP) is a TCP/IP protocol for synchronizing time over a network. +Basically a client requests the current time from a server, and uses it to set its own clock.
      +
      SDK
      +
      A Software Development Kit (SDK) is a collection of software development tools or +a collection of software components.
      +
      SGM
      +
      SGM stands for Semi-Global Matching and is a state-of-the-art stereo matching algorithm +which offers short run times and a great accuracy, especially at object borders, fine +structures, and in weakly textured areas.
      +
      TCP
      +
      The Tool Center Point (TCP) is the position of the tool at the end effector of +a robot. The position and orientation of the TCP determines the position and +orientation of the tool in 3D space.
      +
      URI
      URL
      +

      A Uniform Resource Identifier (URI) is a string of characters +identifying resources of the rc_visard NG’s REST-API. An example of such a +URI is /nodes/rc_camera/parameters/fps, which points +to the fps run-time parameter of the stereo camera module.

      +

      A Uniform Resource Locator (URL) additionally specifies the full +network location and protocol, i.e., an exemplary URL to locate the +above resource would be +https://<ip>/api/v1/nodes/rc_camera/parameters/fps +where <ip> refers to the rc_visard NG’s IP address.

      +
      +
      XYZ+quaternion
      +
      Format to represent a pose. See Rotation matrix and translation vector +for its definition.
      +
      XYZABC
      +
      Format to represent a pose. See KUKA XYZ-ABC format +for its definition.
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/gripper_db.html b/v24.04/en/gripper_db.html new file mode 100644 index 0000000..df64f1a --- /dev/null +++ b/v24.04/en/gripper_db.html @@ -0,0 +1,1395 @@ + + + + + + + + + + + GripperDB — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      GripperDB

      +
      +

      Introduction

      +

      The GripperDB module (gripper database module) is an optional on-board module of the rc_visard NG and is licensed with +any of the modules ItemPick and BoxPick or SilhouetteMatch. +Otherwise it requires a separate CollisionCheck license + to be purchased.

      +

      The module provides services to set, retrieve and delete grippers which can then be used +for checking collisions with a load carrier or other detected objects +(only in combination with SilhouetteMatch). The specified grippers are available for all +modules supporting collision checking on the rc_visard NG.

      + + ++++ + + + + + + + + + + + + + + +
      Table 51 Specifications of the GripperDB module
      Max. number of grippers50
      Supported gripper element geometriesBox, Cylinder, CAD Element
      Max. number of elements per gripper15
      Collision checking available inItemPick and BoxPick, SilhouetteMatch
      +
      +
      +

      Setting a gripper

      +

      The gripper is a collision geometry used to determine whether the grasp is in collision with the load carrier. +The gripper consists of up to 15 elements connected to each other.

      +

      At this point, the gripper can be built of elements of the following types:

      +
      +
        +
      • BOX, with dimensions box.x, box.y, box.z.
      • +
      • CYLINDER, with radius cylinder.radius and height cylinder.height.
      • +
      • CAD, with the id cad.id of the chosen CAD element.
      • +
      +
      +

      Additionally, for each gripper the flange radius, and information about the Tool Center Point (TCP) have to +be defined.

      +

      The configuration of the gripper is normally performed offline during the setup of the desired application. +This can be done via the REST-API interface or the rc_visard NG +Web GUI.

      +
      +

      Robot flange radius

      +

      Collisions are checked only with the gripper, the robot body is not considered. +As a safety feature, to prevent collisions between the load carrier and the robot, all grasps having any part of the +robot’s flange inside the load carrier can be designated as colliding (see Fig. 55). +This check is based on the defined gripper geometry and the flange radius value. It is optional to use +this functionality, and it can be turned on and off with the CollisionCheck module’s run-time parameter check_flange as described +in Parameter overview.

      +
      +_images/check_flange.svg +

      Fig. 55 Case A would be marked as collision only if check_flange is true, because the robot’s flange (red) is inside the +load carrier. Case B is collision free independent of check_flange.

      +
      +
      +
      +

      Uploading gripper CAD elements

      +

      A gripper can consist of boxes, cylinders and CAD elements. While boxes and cylinders can be parameterized when +the gripper is created, the CAD elements must be uploaded beforehand to be available during gripper creation. +A CAD element can be uploaded via the REST-API interface as described +in Section CAD element API +or via the rc_visard NG Web GUI. +Supported file formats are STEP (*.stp, *.step), STL (*.stl), OBJ (*.obj) and PLY (*.ply). +The maximum file size to be uploaded is limited to 30 MB. +The files are internally converted to PLY and, if necessary, simplified. +The CAD elements can be referenced during gripper creation by their ID.

      +
      +
      +

      Creating a gripper via the REST-API or the Web GUI

      +

      When creating a gripper via the REST-API interface or the +Web GUI, +each element of the gripper has a parent element, which defines how they are connected. +The gripper is always built in the direction from the robot flange to the TCP, and at least one element must +have ‘flange’ as parent. The elements’ IDs must be unique and must not be ‘tcp’ or ‘flange’. +The pose of the child element has to be given in the coordinate frame of the parent element. +The coordinate frame of an element is always in its +geometric center. Accordingly, for a child element to be exactly below the parent element, the position of +the child element must be computed from the heights of both parent and child element +(see Fig. 56).

      +
      +_images/gripper_frames_restapi.svg +

      Fig. 56 Reference frames for gripper creation via the REST-API and the Web GUI

      +
      +

      In case a CAD element is used, the element’s origin is defined in the CAD data and is not necessarily located +in the center of the element’s bounding box.

      +

      It is recommended to create a gripper via the Web GUI, because it provides a 3D visualization of the +gripper geometry and also allows to automatically attach the child element to the bottom of its parent element, when the +corresponding option for this element is activated. In this case, the elements also stay attached when +any of their sizes change. Automatic attachment of CAD elements uses the element’s bounding box as reference. +Automatic attachment is only possible when the child element is not rotated around the x or y axis with respect to its parent.

      +

      The reference frame for the first element for the gripper creation is always the center of the robot’s flange +with the z axis pointing outwards. It is possible to create a gripper with a tree structure, +corresponding to multiple elements having the same parent element, as long as they are all connected.

      +
      +
      +

      Calculated TCP position

      +

      After gripper creation via the set_gripper service call, the TCP position in the flange coordinate +system is calculated and returned as tcp_pose_flange. +It is important to check if this value is the same as the robot’s true TCP position. When creating a +gripper in the Web GUI the current TCP position is always displayed in the 3D gripper visualization.

      +
      +
      +

      Creating rotationally asymmetric grippers

      +

      For grippers which are not rotationally symmetric around the z axis, it is crucial to ensure that the gripper is properly mounted, +so that the representation stored in the GripperDB module corresponds to reality.

      +
      +
      +
      +

      Services

      +

      The GripperDB module is called rc_gripper_db in the REST-API and is represented in the +Web GUI under +Database ‣ Grippers. +The user can explore and call the GripperDB module’s services, +e.g. for development and testing, using the +REST-API interface or +the Web GUI.

      +

      The GripperDB module offers the following services.

      +
      +

      set_gripper

      +
      +

      Persistently stores a gripper on the rc_visard NG. +All configured grippers are persistent over firmware updates and rollbacks.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      PUT http://<host>/api/v2/nodes/rc_gripper_db/services/set_gripper
      +
      +
      +
      + +
      +

      Required arguments:

      +
      +

      elements: list of geometric elements for the gripper. +Each element must be of type ‘CYLINDER’ or ‘BOX’ with the corresponding dimensions in +the cylinder or box field, or of type ‘CAD’ with the corresponding id in the cad field. +The pose of each element must be given in the coordinate frame +of the parent element (see Setting a gripper +for an explanation of the coordinate frames). The element’s id must be unique and must not be +‘tcp’ or ‘flange’. The parent_id is the ID of the parent element. It can either be ‘flange’ +or it must correspond to another element in list.

      +

      flange_radius: radius of the flange used in case the check_flange run-time parameter is active.

      +

      id: unique name of the gripper

      +

      tcp_parent_id: ID of the element on which the TCP is defined

      +

      tcp_pose_parent: The pose of the TCP with respect to the coordinate frame of the element specified in tcp_parent_id.

      +
      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "elements": [
      +      {
      +        "box": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "cad": {
      +          "id": "string"
      +        },
      +        "cylinder": {
      +          "height": "float64",
      +          "radius": "float64"
      +        },
      +        "id": "string",
      +        "parent_id": "string",
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "type": "string"
      +      }
      +    ],
      +    "flange_radius": "float64",
      +    "id": "string",
      +    "tcp_parent_id": "string",
      +    "tcp_pose_parent": {
      +      "orientation": {
      +        "w": "float64",
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "position": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      }
      +    }
      +  }
      +}
      +
      +
      +
      +
      +

      gripper: returns the gripper as defined in the request with an additional field tcp_pose_flange. +This gives the coordinates of the TCP in the flange coordinate frame for comparison with the true +settings of the robot’s TCP.

      +

      return_code: holds possible warnings or error codes and messages.

      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "set_gripper",
      +  "response": {
      +    "gripper": {
      +      "elements": [
      +        {
      +          "box": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "cad": {
      +            "id": "string"
      +          },
      +          "cylinder": {
      +            "height": "float64",
      +            "radius": "float64"
      +          },
      +          "id": "string",
      +          "parent_id": "string",
      +          "pose": {
      +            "orientation": {
      +              "w": "float64",
      +              "x": "float64",
      +              "y": "float64",
      +              "z": "float64"
      +            },
      +            "position": {
      +              "x": "float64",
      +              "y": "float64",
      +              "z": "float64"
      +            }
      +          },
      +          "type": "string"
      +        }
      +      ],
      +      "flange_radius": "float64",
      +      "id": "string",
      +      "tcp_parent_id": "string",
      +      "tcp_pose_flange": {
      +        "orientation": {
      +          "w": "float64",
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "position": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        }
      +      },
      +      "tcp_pose_parent": {
      +        "orientation": {
      +          "w": "float64",
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "position": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        }
      +      },
      +      "type": "string"
      +    },
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      get_grippers

      +
      +

      Returns the configured grippers with the requested gripper_ids.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      PUT http://<host>/api/v2/nodes/rc_gripper_db/services/get_grippers
      +
      +
      +
      + +
      +

      If no gripper_ids are provided, all configured grippers are returned.

      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "gripper_ids": [
      +      "string"
      +    ]
      +  }
      +}
      +
      +
      +
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "get_grippers",
      +  "response": {
      +    "grippers": [
      +      {
      +        "elements": [
      +          {
      +            "box": {
      +              "x": "float64",
      +              "y": "float64",
      +              "z": "float64"
      +            },
      +            "cad": {
      +              "id": "string"
      +            },
      +            "cylinder": {
      +              "height": "float64",
      +              "radius": "float64"
      +            },
      +            "id": "string",
      +            "parent_id": "string",
      +            "pose": {
      +              "orientation": {
      +                "w": "float64",
      +                "x": "float64",
      +                "y": "float64",
      +                "z": "float64"
      +              },
      +              "position": {
      +                "x": "float64",
      +                "y": "float64",
      +                "z": "float64"
      +              }
      +            },
      +            "type": "string"
      +          }
      +        ],
      +        "flange_radius": "float64",
      +        "id": "string",
      +        "tcp_parent_id": "string",
      +        "tcp_pose_flange": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "tcp_pose_parent": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "type": "string"
      +      }
      +    ],
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      delete_grippers

      +
      +

      Deletes the configured grippers with the requested gripper_ids.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      PUT http://<host>/api/v2/nodes/rc_gripper_db/services/delete_grippers
      +
      +
      +
      + +
      +

      All grippers to be deleted must be explicitly stated in gripper_ids.

      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "gripper_ids": [
      +      "string"
      +    ]
      +  }
      +}
      +
      +
      +
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "delete_grippers",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +

      Return codes

      +

      Each service response contains a return_code, +which consists of a value plus an optional message. +A successful service returns with a return_code value of 0. +Negative return_code values indicate that the service failed. +Positive return_code values indicate that the service succeeded with additional information. +The smaller value is selected in case a service has multiple return_code values, +but all messages are appended in the return_code message.

      +

      The following table contains a list of common codes:

      + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table 52 Return codes of the GripperDB services
      CodeDescription
      0Success
      -1An invalid argument was provided
      -7Data could not be read or written to persistent storage
      -9No valid license for the module
      -10New gripper could not be added as the maximum storage capacity of grippers has been exceeded
      10The maximum storage capacity of grippers has been reached
      11Existing gripper was overwritten
      +
      +
      +

      CAD element API

      +

      For gripper CAD element upload, download, listing and removal, special REST-API endpoints are provided. +CAD elements can also be uploaded, downloaded and removed via the Web GUI. +Up to 50 CAD elements can be stored persistently on the rc_visard NG.

      +

      The maximum file size to be uploaded is limited to MB.

      +
      +
      +GET /cad/gripper_elements
      +

      Get list of all CAD gripper elements.

      +

      Template request

      +
      GET /api/v2/cad/gripper_elements HTTP/1.1
      +
      +
      +

      Template response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +[
      +  {
      +    "id": "string"
      +  }
      +]
      +
      +
      + +++ + + + + + + + + + +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation (returns array of GripperElement)
      • +
      • 404 Not Found – element not found
      • +
      +
      Referenced Data Models:
        +
      +
      + +
      +
      +GET /cad/gripper_elements/{id}
      +

      Get a CAD gripper element. If the requested content-type is application/octet-stream, the gripper element is returned as file.

      +

      Template request

      +
      GET /api/v2/cad/gripper_elements/<id> HTTP/1.1
      +
      +
      +

      Template response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "id": "string"
      +}
      +
      +
      + +++ + + + + + + + + + + + +
      Parameters:
        +
      • id (string) – id of the element (required)
      • +
      +
      Response Headers:
       
        +
      • Content-Type – application/json application/ubjson application/octet-stream
      • +
      +
      Status Codes:
        +
      • 200 OK – successful operation (returns GripperElement)
      • +
      • 404 Not Found – element not found
      • +
      +
      Referenced Data Models:
        +
      +
      + +
      +
      +PUT /cad/gripper_elements/{id}
      +

      Create or update a CAD gripper element.

      +

      Template request

      +
      PUT /api/v2/cad/gripper_elements/<id> HTTP/1.1
      +Accept: multipart/form-data application/json
      +
      +
      +

      Template response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "id": "string"
      +}
      +
      +
      + +++ + + + + + + + + + + + + + + + + + +
      Parameters:
        +
      • id (string) – id of the element (required)
      • +
      +
      Form Parameters:
       
        +
      • file – CAD file (required)
      • +
      +
      Request Headers:
       
        +
      • Accept – multipart/form-data application/json
      • +
      +
      Response Headers:
        +
      Status Codes: +
      Referenced Data Models:
        +
      +
      + +
      +
      +DELETE /cad/gripper_elements/{id}
      +

      Remove a CAD gripper element.

      +

      Template request

      +
      DELETE /api/v2/cad/gripper_elements/<id> HTTP/1.1
      +Accept: application/json application/ubjson
      +
      +
      + +++ + + + + + + + + + + + +
      Parameters:
        +
      • id (string) – id of the element (required)
      • +
      +
      Request Headers:
       
        +
      • Accept – application/json application/ubjson
      • +
      +
      Response Headers:
        +
      Status Codes: +
      +
      + +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/grpc.html b/v24.04/en/grpc.html new file mode 100644 index 0000000..6efa224 --- /dev/null +++ b/v24.04/en/grpc.html @@ -0,0 +1,809 @@ + + + + + + + + + + + gRPC image stream interface — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      gRPC image stream interface

      +

      The gRPC image streaming interface can be used as an alternative to the +GigE Vision / GenICam interface +for getting camera images and synchronized sets of images (e.g. left camera +image and corresponding disparity image). gRPC is a +remote procedure call system that also +supports streaming. It uses Protocol Buffers +(see https://developers.google.com/protocol-buffers/) +as interface description language and data serialization. For a gRPC +introduction and more details please see the official website (https://grpc.io/).

      +

      The advantages of the gRPC interface in comparison to GigE Vision are:

      +
      +
        +
      • It is simpler to use in own programs than GigE Vision.
      • +
      • There is gRPC support for a lot of programming languages (see https://grpc.io/).
      • +
      • The communication is based on TCP instead of UDP and therefore it also works over less stable networks, e.g. WLAN.
      • +
      +
      +

      The disadvantages of the gRPC interface in comparison to GigE Vision are:

      +
      +
        +
      • It does not support changing parameters, but the REST-API interface can be used for changing parameters.
      • +
      • It is not a standard vision interface like GigE Vision.
      • +
      +
      +

      The rc_visard NG provides synchronized image sets via gRPC server side streams on +port 50051.

      +

      The communication is started by sending an ImageSetRequest +message to the server. The message contains the information about requested +images, i.e. left, right, disparity, confidence and disparity_error images can +be enabled separately.

      +

      After getting the request, the server starts continuously sending ImageSet +messages that contain all requested images with all parameters necessary for +interpreting the images. The images that are contained in an ImageSet +message are synchronized, i.e. they are all captured at the same time. The only +exception to this rule is if the +out1_mode +is set to AlternateExposureActive. In this case, the camera and disparity +images are taken 40 ms apart, so that the GPIO Out1 is LOW when the +left and right images are taken, and HIGH for the disparity, confidence and +error images. This mode is useful when a random dot projector is used, +because the projector would be off for capturing the left and +right image, and on for the disparity image, which results in undisturbed camera +images and a much denser and more accurate disparity image.

      +

      Streaming of images is done until the client closes the connection.

      +
      +

      gRPC service definition

      +
      syntax = "proto3";
      +
      +message Time
      +{
      +  int32 sec = 1; ///< Seconds
      +  int32 nsec = 2; ///< Nanoseconds
      +}
      +
      +message Gpios
      +{
      +  uint32 inputs  = 1; ///< bitmask of available inputs
      +  uint32 outputs = 2; ///< bitmask of available outputs
      +  uint32 values  = 3; ///< bitmask of GPIO values
      +}
      +
      +message Image
      +{
      +  Time timestamp           = 1; ///< Acquisition timestamp of the image
      +  uint32 height            = 2; ///< image height (number of rows)
      +  uint32 width             = 3; ///< image width (number of columns)
      +  float focal_length       = 4; ///< focal length in pixels
      +  float principal_point_u  = 5; ///< horizontal position of the principal point
      +  float principal_point_v  = 6; ///< vertical position of the principal point
      +  string encoding          = 7; ///< Encoding of pixels ["mono8", "mono16", "rgb8"]
      +  bool is_bigendian        = 8; ///< is data bigendian, (in our case false)
      +  uint32 step              = 9; ///< full row length in bytes
      +  bytes data               = 10; ///< actual matrix data, size is (step * height)
      +  Gpios gpios              = 11; ///< GPIOs as of acquisition timestamp
      +  float exposure_time      = 12; ///< exposure time in seconds
      +  float gain               = 13; ///< gain factor in decibel
      +  float noise              = 14; ///< noise
      +  float out1_reduction     = 16; ///< Fraction of reduction (0.0 - 1.0) of exposure time for images with GPIO Out1=Low in exp_auto_mode=AdaptiveOut1
      +  float brightness         = 17; ///< Current brightness of the image as value between 0 and 1
      +}
      +
      +message DisparityImage
      +{
      +  Time timestamp           = 1; ///< Acquisition timestamp of the image
      +  float scale              = 2; ///< scale factor
      +  float offset             = 3; ///< offset in pixels (in our case 0)
      +  float invalid_data_value = 4; ///< value used to mark pixels as invalid (in our case 0)
      +  float baseline           = 5; ///< baseline in meters
      +  float delta_d            = 6; ///< Smallest allowed disparity increment. The smallest achievable depth range resolution is delta_Z = (Z^2/image.focal_length*baseline)*delta_d.
      +  Image image              = 7; ///< disparity image
      +}
      +
      +message Mesh
      +{
      +  Time timestamp           = 1; ///< Acquisition timestamp of disparity image from which the mesh is computed
      +  string format            = 2; ///< currently only "ply" is supported
      +  bytes data               = 3; ///< actual mesh data
      +}
      +
      +message ImageSet
      +{
      +  Time timestamp             = 1;
      +  Image left                 = 2;
      +  Image right                = 3;
      +  DisparityImage disparity   = 4;
      +  Image disparity_error      = 5;
      +  Image confidence           = 6;
      +  Mesh mesh                  = 7;
      +}
      +
      +message MeshOptions
      +{
      +  uint32 max_points            = 1; ///< limit maximum number of points, zero means default (up to 3.1MP), minimum is 1000
      +  enum BinningMethod {
      +    AVERAGE = 0;                    ///< average over all points in bin
      +    MIN_DEPTH = 1;                  ///< use point with minimum depth (i.e. closest to camera) in bin
      +  }
      +  BinningMethod binning_method = 2; ///< method used for binning if limited by max_points
      +  bool watertight              = 3; ///< connect all edges and fill all holes, e.g. for collision checking
      +  bool textured                = 4; ///< add texture information to mesh
      +}
      +
      +message ImageSetRequest
      +{
      +  bool left_enabled            = 1;
      +  bool right_enabled           = 2;
      +  bool disparity_enabled       = 3;
      +  bool disparity_error_enabled = 4;
      +  bool confidence_enabled      = 5;
      +  bool mesh_enabled            = 6;
      +  MeshOptions mesh_options     = 7;
      +  bool color                   = 8; ///< send left/right image as color (rgb8) images
      +}
      +
      +service ImageInterface
      +{
      +  // A server-to-client streaming RPC.
      +  rpc StreamImageSets(ImageSetRequest) returns (stream ImageSet) {}
      +}
      +
      +
      +
      +
      +

      Image stream conversions

      +

      The conversion of disparity images into a point cloud can be done as described in the +GigE Vision / GenICam interface.

      +
      +
      +

      Example client

      +

      A simple example C++ client can be found at https://github.com/roboception/grpc_image_client_example.

      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/handeye_calibration.html b/v24.04/en/handeye_calibration.html new file mode 100644 index 0000000..3df3311 --- /dev/null +++ b/v24.04/en/handeye_calibration.html @@ -0,0 +1,2282 @@ + + + + + + + + + + + Hand-eye calibration — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Hand-eye calibration

      +

      For applications, in which the camera is integrated into one or more +robot systems, it needs to be calibrated w.r.t. some robot +reference frames. For this purpose, the rc_visard NG is shipped with an on-board +calibration routine called the hand-eye calibration module. It is a base +module which is available on every rc_visard NG.

      +
      +

      Note

      +

      The implemented calibration routine is +completely agnostic about the user-defined robot frame to which the camera is +calibrated. It might be a robot’s end-effector (e.g., flange or tool +center point) or any point on the robot structure. +The method’s only requirement is that the pose (i.e., translation and +rotation) of this robot +frame w.r.t. a user-defined external reference frame (e.g., world or robot +mounting point) is exactly observable by the robot controller and can be +reported to the calibration module.

      +
      +

      The +Calibration routine + +itself is an easy-to-use multi-step procedure using +a calibration grid which can be obtained from Roboception.

      +
      +

      Calibration interfaces

      +

      The following two interfaces are offered to conduct hand-eye +calibration:

      +
        +
      1. All services and parameters of this module required to conduct the +hand-eye calibration programmatically are exposed by the rc_visard NG’s +REST-API interface. +The respective node name of this module is rc_hand_eye_calibration +and the respective service calls are documented +Services.

        +
        +

        Note

        +

        The described approach requires a network connection +between the rc_visard NG and the robot controller to +pass robot poses from the controller to the rc_visard NG’s +calibration module.

        +
        +
      2. +
      3. For use cases where robot poses cannot be passed programmatically to the +rc_visard NG’s hand-eye calibration module, the +Web GUI’s Hand-Eye Calibration page under Configuration + +offers a guided +process to conduct the calibration routine manually.

        +
        +

        Note

        +

        During the process, the described approach requires the user to +manually enter into the Web GUI robot poses, which need to be accessed +from the respective robot-teaching or handheld device.

        +
        +
      4. +
      +
      +
      +

      Camera mounting

      +

      As illustrated in Fig. 30 and +Fig. 32, two different use +cases w.r.t. to the mounting of the camera generally have to be considered:

      +
        +
      1. The camera is mounted on the robot, i.e., it is mechanically fixed +to a robot link (e.g., at its flange or a flange-mounted tool), and +hence moves with the robot.
      2. +
      3. The camera is not mounted on the robot but is fixed +to a table or other place in the robot’s vicinity and remains at a static position +w.r.t. the robot.
      4. +
      +

      While the general +Calibration routine is very similar +in both use cases, +the calibration process’s output, i.e., the resulting calibration transform, +will be semantically different, and the fixture of the calibration grid +will also differ.

      +
      +
      Calibration with a robot-mounted camera
      +

      When calibrating a robot-mounted camera with the robot, the calibration +grid has to be secured in a static position w.r.t. the robot, e.g., on a table +or some other fixed-base coordinate system as sketched in +Fig. 30.

      +
      +

      Warning

      +

      It is extremely important that the calibration grid does not move +during step 2 of the +Calibration routine. +Securely fixing its position +to prevent unintended movements such as those caused by +vibrations, moving cables, or the like is therefore strongly +recommended.

      +
      +

      The result of the calibration (step 3 of the +Calibration routine) is a pose +\(\mathbf{T}^{\text{robot}}_{\text{camera}}\) describing the +(previously unknown) relative positional and rotational transformation +from the camera frame into the user-selected robot frame such that

      +
      +(3)\[\mathbf{p}_{\text{robot}} = + \mathbf{R}^{\text{robot}}_{\text{camera}} + \cdot \mathbf{p}_{\text{camera}} + + \mathbf{t}^{\text{robot}}_{\text{camera}} + \:,\]
      +

      where \(\mathbf{p}_{\text{robot}} = (x,y,z)^T\) is a 3D point +with its coordinates expressed in the robot frame, +\(\mathbf{p}_{\text{camera}}\) is the same point represented in the +camera coordinate frame, and \(\mathbf{R}^{\text{robot}}_{\text{camera}}\) +as well as \(\mathbf{t}^{\text{robot}}_{\text{camera}}\) are the +corresponding \(3\times 3\) rotation matrix and \(3\times 1\) +translation vector of the pose \(\mathbf{T}^{\text{robot}}_{\text{camera}}\), +respectively. In practice, in the calibration result and in the provided robot +poses, the rotation is defined by Euler angles or as quaternion instead of +a rotation matrix (see Pose formats).

      +
      +_images/sketch_handeye_calib_robotmounted.svg +

      Fig. 30 Important frames and transformations for calibrating a camera that +is mounted on a general robot. The camera is mounted with a fixed relative +position to a user-defined robot frame (e.g., flange or TCP). It is +important that the pose \(\mathbf{T}^{\text{ext}}_{\text{robot}}\) of +this robot frame w.r.t. a user-defined external reference frame ext +is observable during the calibration routine. The result of the calibration +process is the desired calibration transformation +\(\mathbf{T}^{\text{robot}}_{\text{camera}}\), i.e., the pose of the +camera frame within the user-defined robot frame.

      +
      +

      Additional user input is required if the movement of the robot is constrained and +the robot can rotate the Tool Center Point (TCP) only +around one axis. This is typically the case for robots with four Degrees Of +Freedom (4DOF) that are often used for palletizing tasks. In this case, +the user must specify which axis of the robot frame is the rotation axis of the TCP. +Further, the signed offset from the TCP to the +camera coordinate system along the TCP rotation axis has to be provided. +Fig. 31 illustrates the situation.

      +

      For the rc_visard NG, the camera coordinate system is located in the optical +center of the left camera. The approximate location is given in section +Coordinate frames.

      +
      +_images/sketch_handeye_calib_robotmounted_4dof.svg +

      Fig. 31 In case of a 4DOF robot, the TCP rotation axis and the offset from the +TCP to the camera +coordinate system along the TCP rotation axis must be provided. +In the illustrated case, this offset is negative.

      +
      +
      +
      Calibration with a statically-mounted camera
      +

      In use cases where the camera is positioned statically w.r.t. the +robot, the calibration grid needs to be mounted to the robot as +shown for example in Fig. 32 and +Fig. 33.

      +
      +

      Note

      +

      The hand-eye calibration module is +completely agnostic about the exact mounting and positioning of the +calibration grid w.r.t. the user-defined robot frame. That means, +the relative positioning of the calibration grid to +that frame neither needs to +be known, nor it is relevant for the calibration routine, as shown in +Fig. 33.

      +
      +
      +

      Warning

      +

      It is extremely important that the calibration grid is attached +securely to the robot such that it does +not change its relative position w.r.t. the user-defined robot frame +during step 2 of the Calibration routine.

      +
      +

      In this use case, the result of the calibration (step 3 of the +Calibration routine) is the pose +\(\mathbf{T}^{\text{ext}}_{\text{camera}}\) +describing the +(previously unknown) relative positional and rotational transformation +between the camera frame and the user-selected external reference frame ext +such that

      +
      +(4)\[\mathbf{p}_{\text{ext}} = + \mathbf{R}^{\text{ext}}_{\text{camera}} + \cdot \mathbf{p}_{\text{camera}} + + \mathbf{t}^{\text{ext}}_{\text{camera}} + \:,\]
      +

      where \(\mathbf{p}_{\text{ext}} = (x,y,z)^T\) is a 3D point +with its coordinates expressed in the external reference frame ext, +\(\mathbf{p}_{\text{camera}}\) is the same point represented in the +camera coordinate frame, and \(\mathbf{R}^{\text{ext}}_{\text{camera}}\) +as well as \(\mathbf{t}^{\text{ext}}_{\text{camera}}\) are the +corresponding \(3\times 3\) rotation matrix and \(3\times 1\) +translation vector of the pose \(\mathbf{T}^{\text{ext}}_{\text{camera}}\), +respectively. In practice, in the calibration result and in the provided robot +poses, the rotation is defined by Euler angles or as quaternion instead of +a rotation matrix (see Pose formats).

      +
      +_images/sketch_handeye_calib_static.svg +

      Fig. 32 Important frames and transformations for calibrating a +statically mounted camera: The latter is mounted with a fixed +position relative to a user-defined external reference frame ext (e.g., +the world coordinate frame or the robot’s mounting point). It is +important that the pose \(\mathbf{T}^{\text{ext}}_{\text{robot}}\) of the +user-defined robot frame w.r.t. this frame +is observable during the calibration routine. The result of the calibration +process is the desired calibration transformation +\(\mathbf{T}^{\text{ext}}_{\text{camera}}\), i.e., the pose of the +camera frame in the user-defined external reference frame ext.

      +
      +
      +_images/sketch_handeye_calib_gridmount.svg +

      Fig. 33 Alternate mounting options for attaching the +calibration grid to the robot

      +
      +

      Additional user input is required if the movement of the robot is constrained and +the robot can rotate the Tool Center Point (TCP) only +around one axis. This is typically the case for robots with four Degrees Of +Freedom (4DOF) that are often used for palletizing tasks. In this case, +the user must specify which axis of the robot frame is the rotation axis of the TCP. +Further, the signed offset from the TCP to the +visible surface of the calibration grid along the TCP rotation axis has to be provided. +The grid must be mounted such that the TCP rotation axis is orthogonal to the grid. +Fig. 34 illustrates the situation.

      +
      +_images/sketch_handeye_calib_static_4dof.svg +

      Fig. 34 In case of a 4DOF robot, the TCP rotation axis and the offset from the +TCP to the visible surface of the grid along the TCP rotation axis must +be provided. In the illustrated case, this offset is negative.

      +
      +
      +
      +
      +
      +

      Calibration routine

      +

      The hand-eye calibration can be performed manually using the +Web GUI or programmatically +via the REST-API interface. +The general calibration routine will be described by following the steps of the +hand-eye calibration wizard provided on the Web GUI. +This wizard can be found in the rc_visard NG’s Web GUI +under Configuration ‣ Hand-Eye Calibration. References +to the corresponding REST-API calls are provided at the appropriate places.

      +
      +

      Step 1: Hand-Eye Calibration Status

      +

      The starting page of the hand-eye calibration wizard shows the current status +of the hand-eye calibration. +If a hand-eye calibration is saved on the rc_visard NG, the calibration transformation is displayed here +(see Fig. 35).

      +
      +
      +_images/webgui_hand_eye_calib1_calib_ng_en.png +

      Fig. 35 Current status of the hand-eye calibration in case a hand-eye calibration is saved

      +
      +
      +

      To query the hand-eye calibration status programmatically, the module’s REST-API +offers the get_calibration service call (see +Services). +An existing hand-eye calibration can be removed by pressing +Remove Calibration or using remove_calibration in the REST-API (see +Services).

      +

      To start a new hand-eye calibration, click on Perform Hand-Eye Calibration or Next.

      +
      +
      +

      Step 2: Checking Grid Detection

      +

      To achieve good calibration results, the images should be +well exposed so that the calibration +grid can be detected accurately and reliably. In this step, the +grid detection can be checked and the camera settings +can be adjusted if necessary. In case parts of the calibration grid +are overexposed, the respective squares of the calibration grid will be +highlighted in red. A successful grid detection is visualized +by green check marks on every square of the calibration grid and a thick green +border around the grid as shown in Fig. 36.

      +
      +
      +_images/webgui_hand_eye_calib2_ng_en.png +

      Fig. 36 Checking the calibration grid detection

      +
      +
      +
      +
      +

      Step 3: Record Poses

      +

      In this step, the user records images of the calibration grid at several +different robot poses. These poses must each ensure that the +calibration grid is completely visible in the left camera image. +Furthermore, the robot poses +need to be selected properly to achieve a variety of different +perspectives for the camera to perceive the calibration grid. +Fig. 37 shows a schematic recommendation of four +different grid positions which should be recorded from a close and a far +point of view, resulting in eight images for the calibration.

      +
      +_images/handeyecalib-alldraw.png +

      Fig. 37 Recommended views on the calibration grid during the calibration procedure. +In case of a 4DOF robot, other views have to be chosen, which should be as +different as possible.

      +
      +
      +

      Warning

      +

      Calibration quality, i.e., the accuracy of the +calculated calibration result, depends on the calibration-grid views provided. +The more diverse the perspectives are, the better +is the calibration. Choosing very similar views, i.e., varying +the robot pose only slightly before recording a new calibration pose, may lead to +inaccurate estimation of the desired calibration transformation.

      +
      +

      After the robot reaches each calibration pose, the +corresponding pose \(\mathbf{T}^{\text{ext}}_{\text{robot}}\) +of the user-defined robot frame in the user-defined +external reference frame ext needs to be reported +to the hand-eye calibration module. For this purpose, the module +offers different slots to store the reported poses and the +corresponding left camera images. +All filled slots will then be used to +calculate the desired calibration transformation between the +camera frame and either the user-defined robot frame +(robot-mounted camera) or the user-defined external reference frame ext +(static camera).

      +

      In the Web GUI, the user can choose between many different pose formats for providing the +calibration poses (see Pose formats). +When calibrating using the REST-API, the poses are always +given in XYZ+quaternion. +The Web GUI offers eight slots (Close View 1, +Close View 2, etc.) for the user to fill manually with robot poses. +Next to each slot, a figure suggests a respective dedicated viewpoint on the grid. +For each slot, the robot should be operated to achieve the suggested view.

      +
      +_images/webgui_hand_eye_calib3_ng_en.png +

      Fig. 38 Filling the first slot in the hand-eye calibration process for a +statically mounted camera

      +
      +

      To record a calibration pose, click on Set Pose for the respective slot +and enter the robot frame’s pose into the respective text fields. The pose is +then stored with the corresponding camera image +by clicking the Take Picture to Proceed button. This will save +the calibration pose in the respective slot.

      +

      To transmit the poses programmatically, the module’s REST-API +offers the set_pose service call (see +Services).

      +
      +

      Note

      +

      The user’s acquisition of robot pose data +depends on the robot model and manufacturer – it might be read from a +teaching or handheld device, which is shipped with the robot.

      +
      +
      +

      Warning

      +

      Please be careful to correctly and accurately enter the +values; even small variations or typos may lead to +calibration-process failure.

      +
      +

      The Web GUI displays the currently saved poses (only with slot numbers from 0 to 7) +with their camera images and also allows to delete them by clicking +Delete Pose to remove a single pose, or clicking Clear all Poses to remove all poses. +In the REST-API the currently stored poses can be retrieved via get_poses and removed +via delete_poses for single poses or reset_calibration for removing all poses +(see Services).

      +

      When at least four poses are set, the user can continue to the computation of the calibration result +by pressing Next.

      +
      +

      Note

      +

      To successfully calculate the hand-eye calibration +transformation, at least four different robot calibration +poses need to be reported and stored in slots. +However, to prevent errors induced by possible +inaccurate measurements, at least eight calibration poses are +recommended.

      +
      +
      +
      +

      Step 4: Compute Calibration

      +

      Before computing the calibration result, the user has to provide the correct calibration +parameters. These include the exact calibration grid dimensions and the sensor mounting type. +The Web GUI also offers settings for calibrating +4DOF robots. In this case, the rotation axis, as well as the offset from +the TCP to the camera coordinate system (robot-mounted camera) +or grid surface (statically mounted camera) must be given. +For the REST-API, the respective parameters are listed in +Parameters.

      +
      +_images/webgui_hand_eye_calib4_ng_en.png +

      Fig. 39 Defining hand-eye calibration parameters and computing the calibration result via the rc_visard NG’s Web GUI

      +
      +

      When the parameters are correct, the desired calibration transformation +can be computed from the collected poses and camera images by clicking +Compute Calibration. The REST-API offers this functionality via the +calibrate service call +(see Services).

      +

      Depending on the way the camera is mounted, the calibration result contains the +transformation (i.e., the pose) between the camera frame and +either the user-defined robot frame (robot-mounted camera) +or the user-defined external reference frame ext +(statically mounted camera); see +Camera mounting.

      +

      To enable users to judge the quality of the resulting calibration +transformation, the translational and rotational +calibration errors are reported, which are computed from the variance of the +calibration result.

      +

      If the calibration error is not acceptable, the user can change the calibration +parameters and recompute the result, or return to step 3 of the +calibration procedure and add more poses or update poses.

      +

      To save the calibration result, press Save Calibration or use the +REST-API save_calibration service call +(see Services).

      +
      +
      +
      +

      Parameters

      +

      The hand-eye calibration module is called rc_hand_eye_calibration in the REST-API and is +represented in the +Web GUI + under Configuration ‣ Hand-Eye Calibration. +The user can change the calibration parameters there or use the +REST-API interface.

      +
      +

      Parameter overview

      +

      This module offers the following run-time parameters:

      + + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table 33 The rc_hand_eye_calibration module’s run-time parameters
      NameTypeMinMaxDefaultDescription
      grid_heightfloat640.010.00.0The height of the calibration pattern in meters
      grid_widthfloat640.010.00.0The width of the calibration pattern in meters
      robot_mountedboolfalsetruetrueWhether the camera is mounted on the robot
      tcp_offsetfloat64-10.010.00.0Offset from TCP along tcp_rotation_axis
      tcp_rotation_axisint32-12-1-1 for off, 0 for x, 1 for y, 2 for z
      +
      +
      +

      Description of run-time parameters

      +

      The parameter descriptions are given with the corresponding Web GUI names in +brackets.

      +
      +

      grid_width (Width)

      +
      +

      Width of the calibration grid in meters. The width should be given with +a very high accuracy, preferably with sub-millimeter accuracy.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/parameters?grid_width=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_hand_eye_calibration/parameters?grid_width=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      grid_height (Height)

      +
      +

      Height of the calibration grid in meters. The height should be given +with a very high accuracy, preferably with sub-millimeter accuracy.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/parameters?grid_height=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_hand_eye_calibration/parameters?grid_height=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      robot_mounted (Sensor Mounting)

      +
      +

      If set to true, the camera is mounted on the robot. +If set to false, the camera is mounted statically and the calibration grid is mounted on the robot.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/parameters?robot_mounted=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_hand_eye_calibration/parameters?robot_mounted=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      tcp_offset (TCP Offset)

      +
      +

      The signed offset from the TCP to the camera coordinate system (robot-mounted sensor) +or the visible surface of the calibration grid (statically mounted sensor) along the +TCP rotation axis in meters. +This is required if the robot’s movement is constrained and it +can rotate its TCP only around one axis (e.g., 4DOF robot).

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/parameters?tcp_offset=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_hand_eye_calibration/parameters?tcp_offset=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      tcp_rotation_axis (TCP Rotation Axis)

      +
      +

      The axis of the robot frame around which the robot can rotate its TCP. +0 is used for X, 1 for Y and 2 +for the Z axis. This is required if the robot’s movement is constrained and it +can rotate its TCP only around one +axis (e.g., 4DOF robot). -1 means that the robot can rotate its TCP around two +independent rotation axes. tcp_offset is ignored in this case.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/parameters?tcp_rotation_axis=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_hand_eye_calibration/parameters?tcp_rotation_axis=<value>
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +

      Services

      +

      The REST-API service calls offered to programmatically conduct the +hand-eye calibration and to restore this module’s parameters are +explained below.

      +
      +

      get_calibration

      +
      +

      returns the hand-eye calibration currently stored on the rc_visard NG.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/get_calibration
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_hand_eye_calibration/services/get_calibration
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      The field error gives the calibration error in pixels which is computed from +the translational error translation_error_meter and the rotational error +rotation_error_degree. This value is only given for compatibility with older +versions. The translational and rotational errors should be preferred.

      + + +++++ + + + + + + + + + + + + + + + + +
      Table 34 Return codes of the get_calibration service call
      statussuccessDescription
      0truereturned valid calibration pose
      2falsecalibration result is not available
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "get_calibration",
      +  "response": {
      +    "error": "float64",
      +    "message": "string",
      +    "pose": {
      +      "orientation": {
      +        "w": "float64",
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "position": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      }
      +    },
      +    "robot_mounted": "bool",
      +    "rotation_error_degree": "float64",
      +    "status": "int32",
      +    "success": "bool",
      +    "translation_error_meter": "float64"
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      remove_calibration

      +
      +

      removes the persistent hand-eye calibration on the rc_visard NG. +After this call the get_calibration service reports again that no hand-eye calibration is available. +This service call will also delete all the stored calibration poses and +corresponding camera images in the slots.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/remove_calibration
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_hand_eye_calibration/services/remove_calibration
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      + + +++++ + + + + + + + + + + + + + + + + + + + + +
      Table 35 Return codes of the get_calibration service call
      statussuccessDescription
      0trueremoved persistent calibration, device reports as uncalibrated
      1trueno persistent calibration found, device reports as uncalibrated
      2falsecould not remove persistent calibration
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "remove_calibration",
      +  "response": {
      +    "message": "string",
      +    "status": "int32",
      +    "success": "bool"
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      set_pose

      +
      +

      allows to provide a robot pose as calibration pose to the hand-eye calibration +routine and records the current image of the calibration grid.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/set_pose
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_hand_eye_calibration/services/set_pose
      +
      +
      +
      +
      +
      + +
      +

      The slot argument is used to assign unique numbers to the different calibration +poses. The range for slot is from 0 to 15. At each instant when set_pose is called, an image is +recorded. This service call fails if the grid was undetectable in +the current image.

      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "pose": {
      +      "orientation": {
      +        "w": "float64",
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "position": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      }
      +    },
      +    "slot": "uint32"
      +  }
      +}
      +
      +
      +
      +
      + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table 36 Return codes of the set_pose service call
      statussuccessDescription
      1truepose stored successfully
      3truepose stored successfully; collected enough poses for calibration, i.e., ready to calibrate
      4falsecalibration grid was not detected, e.g., not fully visible in camera image
      8falseno image data available
      12falsegiven orientation values are invalid
      13falseinvalid slot number
      +

      The field overexposed indicates if parts of the calibration grid were overexposed in this image.

      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "set_pose",
      +  "response": {
      +    "message": "string",
      +    "overexposed": "bool",
      +    "status": "int32",
      +    "success": "bool"
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      get_poses

      +
      +

      returns the robot poses that are currently stored for the hand-eye calibration routine.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/get_poses
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_hand_eye_calibration/services/get_poses
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      + + +++++ + + + + + + + + + + + + + + + + +
      Table 37 Return codes of the get_poses service call
      statussuccessDescription
      0truestored poses are returned
      1trueno calibration pose available
      +

      The field overexposed indicates if parts of the calibration grid were overexposed in this image.

      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "get_poses",
      +  "response": {
      +    "message": "string",
      +    "poses": [
      +      {
      +        "overexposed": "bool",
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "slot": "uint32"
      +      }
      +    ],
      +    "status": "int32",
      +    "success": "bool"
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      delete_poses

      +
      +

      deletes the calibration poses and corresponding images with the specified slots.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/delete_poses
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_hand_eye_calibration/services/delete_poses
      +
      +
      +
      +
      +
      + +
      +

      The slots argument specifies which calibration poses should be deleted. +If no slots are provided, nothing will be deleted.

      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "slots": [
      +      "uint32"
      +    ]
      +  }
      +}
      +
      +
      +
      +
      + + +++++ + + + + + + + + + + + + + + + + +
      Table 38 Return codes of the delete_poses service call
      statussuccessDescription
      0trueposes successfully deleted
      1trueno slots given
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "delete_poses",
      +  "response": {
      +    "message": "string",
      +    "status": "int32",
      +    "success": "bool"
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      reset_calibration

      +
      +

      deletes all previously provided poses and corresponding images. +The last saved calibration result is reloaded. +This service might be used to (re-)start the hand-eye calibration from scratch.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/reset_calibration
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_hand_eye_calibration/services/reset_calibration
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "reset_calibration",
      +  "response": {
      +    "message": "string",
      +    "status": "int32",
      +    "success": "bool"
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      calibrate

      +
      +

      calculates and returns the hand-eye calibration transformation with the +robot poses configured by the set_pose service.

      +

      Details

      +
      +

      save_calibration +must be called to make the calibration available for other modules via +the get_calibration service call and to store it persistently.

      +
      +

      Note

      +

      For calculating the hand-eye calibration +transformation at least four robot calibration poses are +required (see set_pose service). However, eight +calibration poses are recommended.

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/calibrate
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_hand_eye_calibration/services/calibrate
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      The field error gives the calibration error in pixels which is computed from +the translational error translation_error_meter and the rotational error +rotation_error_degree. This value is only given for compatibility with older +versions. The translational and rotational errors should be preferred.

      + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table 39 Return codes of the calibrate service call
      statussuccessDescription
      0truecalibration successful, returned calibration result
      1falsenot enough poses to perform calibration
      2falsecalibration result is invalid, please verify the input data
      3falsegiven calibration grid dimensions are not valid
      4falseinsufficient rotation, tcp_offset and tcp_rotation_axis must be specified
      5falsesufficient rotation available, tcp_rotation_axis must be set to -1
      6falseposes are not distinct enough from each other
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "calibrate",
      +  "response": {
      +    "error": "float64",
      +    "message": "string",
      +    "pose": {
      +      "orientation": {
      +        "w": "float64",
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "position": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      }
      +    },
      +    "robot_mounted": "bool",
      +    "rotation_error_degree": "float64",
      +    "status": "int32",
      +    "success": "bool",
      +    "translation_error_meter": "float64"
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      save_calibration

      +
      +

      persistently saves the result of hand-eye calibration to the rc_visard NG and overwrites +the existing one. The stored result can be retrieved any time by the +get_calibration service. This service call will also delete all the stored calibration poses and +corresponding camera images in the slots.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/save_calibration
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_hand_eye_calibration/services/save_calibration
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      + + +++++ + + + + + + + + + + + + + + + + + + + + +
      Table 40 Return codes of the save_calibration service call
      statussuccessDescription
      0truecalibration saved successfully
      1falsecould not save calibration file
      2falsecalibration result is not available
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "save_calibration",
      +  "response": {
      +    "message": "string",
      +    "status": "int32",
      +    "success": "bool"
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      set_calibration

      +
      +

      sets the hand-eye calibration transformation with arguments of this call.

      +

      Details

      +
      +

      The calibration transformation is expected in the same format as returned by +the calibrate and get_calibration calls. The given calibration +information is also stored persistently on the sensor by internally calling +save_calibration.

      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/set_calibration
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_hand_eye_calibration/services/set_calibration
      +
      +
      +
      +
      +
      + +
      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "pose": {
      +      "orientation": {
      +        "w": "float64",
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "position": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      }
      +    },
      +    "robot_mounted": "bool"
      +  }
      +}
      +
      +
      +
      +
      + + +++++ + + + + + + + + + + + + + + + + +
      Table 41 Return codes of the set_calibration service call
      statussuccessDescription
      0truesetting the calibration transformation was successful
      12falsegiven orientation values are invalid
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "set_calibration",
      +  "response": {
      +    "message": "string",
      +    "status": "int32",
      +    "success": "bool"
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      reset_defaults

      +
      +

      restores and applies the default values for this module’s parameters +(“factory reset”). Does not affect the calibration result itself or any +of the slots saved during calibration. Only parameters such as the +grid dimensions and the mount type will be reset.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services/reset_defaults
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_hand_eye_calibration/services/reset_defaults
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "reset_defaults",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/hardware_spec.html b/v24.04/en/hardware_spec.html new file mode 100644 index 0000000..f6330a6 --- /dev/null +++ b/v24.04/en/hardware_spec.html @@ -0,0 +1,1085 @@ + + + + + + + + + + + Hardware specification — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + +
        + +
      • rc_visard NG >
      • + +
      • Hardware specification
      • + + +
      • + + + +
      • + +
      + + +
      +
      +
      +
      + +
      +

      Hardware specification

      +
      +

      Note

      +

      The following hardware specifications are provided here as a general reference; differences with the product may exist.

      +
      +
      +

      Scope of delivery

      +

      Standard delivery for an rc_visard NG includes the rc_visard NG sensor and a quickstart guide only. The full +manual is available in digital form and is always installed on the sensor, accessible through the +Web GUI, and available at +http://www.roboception.com/documentation.

      +
      +

      Note

      +

      The following items are not included in the delivery unless otherwise specified:

      +
        +
      • Couplings, adapters, mounts
      • +
      • Power supply unit, cabling, and fuses
      • +
      • Network cabling
      • +
      +

      Please refer to Accessories for suggested third-party cable vendors.

      +
      +

      A connectivity kit can be purchased for the rc_visard NG. It contains an M12 to RJ45 network cable, +24 V power supply, and a DC plug to M12 power adapter. Please refer to Accessories for details.

      +
      +

      Note

      +

      The connectivity kit is intended only for initial setup, not for permanent installation +in industrial environment.

      +
      +

      The following picture shows the important parts of the rc_visard NG which are referenced later in the documentation.

      +
      +_images/rc_visard_parts_ng_en.png +

      Fig. 2 Parts description

      +
      +
      +
      +

      Technical specification

      +

      The technical specifications for the rc_visard NG are given in Table 1. +The frame rate for computing the depth image in High resolution (720 x 540 pixel) is significantly +higher when increasing the minimum distance to 1.2 meters.

      + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table 1 Technical specifications for the rc_visard NG
       rc_visard NG 160-6
      Image resolution1440 x 1080 pixel, monochrome
      Field of view
      +
      6 mm lens: Horizontal: 43°, Vertical: 33°
      +
      +
      IR Cutoff650 nm

      Depth image +(with Minimum

      +
      +
      Distance of 0.5 m)
      +
      +
      1440 x 1080 pixel (Full) @ 3 Hz
      +
      720 x 540 pixel (High) @ 7 Hz
      +
      360 x 270 pixel (Medium) @ 25 Hz
      +
      240 x 180 pixel (Low) @ 25 Hz
      +
      +

      Depth image +(with Minimum

      +
      +
      Distance of 1.2 m)
      +
      +
      1440 x 1080 pixel (Full) @ 3 Hz
      +
      720 x 540 pixel (High) @ 16 Hz
      +
      360 x 270 pixel (Medium) @ 25 Hz
      +
      240 x 180 pixel (Low) @ 25 Hz
      +
      +
      Computing unitOrin Nano 8GB
      Power supply18 V to 30 V
      CoolingPassive
      Baseline160 mm
      Depth range0.5 m to infinity
      Size (W x H x L)230 mm x 75 mm x 84 mm
      Mass0.965 kg
      +

      The resolutions and accuracies at different distances are given in the following table.

      + + +++++ + + + + + + + + + + + + + + + + + + + + +
      Table 2 Resolution and accuracy of the rc_visard NG in millimeters with full +resolution stereo matching and random dot projection on non-reflective and +non-transparent objects.
       distance (mm)rc_visard NG 160-6
      lateral +resolution +(mm)
      +
      500
      +
      1000
      +
      2000
      +
      3000
      +
      +
      +
      0.3
      +
      0.6
      +
      1.1
      +
      1.7
      +
      +
      depth resolution +(mm)
      +
      500
      +
      1000
      +
      2000
      +
      3000
      +
      +
      +
      0.05
      +
      0.2
      +
      0.9
      +
      2.0
      +
      +
      Average depth +accuracy (mm)
      +
      500
      +
      1000
      +
      2000
      +
      3000
      +
      +
      +
      0.2
      +
      0.9
      +
      3.5
      +
      7.8
      +
      +
      +

      The rc_visard NG can be equipped with on-board software modules for additional +features. These software modules can be ordered from the Roboception and require a license update.

      +
      +_images/rc_visard_160_general.png +

      Fig. 3 Overall dimensions of the rc_visard NG 160

      +
      +

      CAD models of the rc_visard NG can be downloaded from http://www.roboception.com/download. The CAD models are provided as-is, +with no guarantee of correctness. When a material property of aluminum is assigned (density of \(2.76\mathrm{g\over{cm}^3}\)), +the mass properties of the CAD model are within 5% of the actual product with respect to weight and center of mass, +and within 10% with respect to moment of inertia.

      +
      +
      +

      Environmental and operating conditions

      +

      The rc_visard NG is designed for industrial applications. Always respect the storage, transport, and operating environmental +conditions outlined in Table 3.

      + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table 3 Environmental conditions
       rc_visard NG
      Storage/Transport temperature-25 °C to 70 °C
      Operating temperature0 °C to 50 °C
      Relative humidity (non condensing)20 % to 80 %
      Vibration5 g
      Shock50 g
      Protection classIP54
      Others
        +
      • Free from corrosive liquids or gases
      • +
      • Free from explosive liquids or gases
      • +
      • Free from powerful electromagnetic interference
      • +
      +
      +

      The rc_visard NG is designed for an operating temperature (surrounding environment) of 0 °C to 50 °C and +relies on convective (passive) cooling. Unobstructed airflow, especially around the cooling fins, +needs to be ensured during use. The rc_visard NG should only be mounted using the provided +mechanical mounting interface, and all parts of the housing must remain uncovered. A free space of at least 10 cm extending in +all directions from the housing, and sufficient air exchange with the environment is +required to ensure adequate cooling. Cooling fins must be free of dirt and other contamination.

      +

      The housing temperature depends on the processing load, sensor orientation, and surrounding +environmental temperatures. When the sensor’s exposed housing surfaces exceed 60°C, the LED at the front will turn from green to red.

      +
      +

      Warning

      +

      For hand-guided applications, a heat-insulated handle should be attached to the +sensor to reduce the risk of burn injuries due to skin exposure to surface temperatures exceeding 60°C.

      +
      +
      +
      +

      Power-supply specifications

      +

      The rc_visard NG needs to be supplied by a DC voltage source. The rc_visard NG’s standard package doesn’t include a DC power supply. +The power supply contained in the connectivity kit may be used for initial setup. +For permanent installation, it is the customer’s responsibility to provide suitable +DC power. Each rc_visard NG must be connected to a separate power supply. Connection to domestic +grid power is only allowed through a power supply certified as EN55011 Class B.

      + + ++++++ + + + + + + + + + + + + + + + + + + + + + + +
      Table 4 Absolute maximum ratings for power supply
       MinNominalMax
      Supply voltage18.0 V24 V30.0 V
      Max power consumption  25 W
      Overcurrent protectionSupply must be fuse-protected to a maximum of 2 A
      +
      +

      Warning

      +

      Exceeding maximum power rating values may lead to damage of the rc_visard NG, power +supply, and connected equipment.

      +
      +
      +

      Warning

      +

      A separate power supply must power each rc_visard NG.

      +
      +
      +

      Warning

      +

      Connection to domestic grid power is allowed through a power supply certified +as EN55011 Class B only.

      +
      +
      +
      +

      Wiring

      +

      Cables are not provided with the rc_visard NG standard package. It is the customer’s responsibility +to obtain the proper cabling. Accessories provides an overview of suggested components.

      +
      +

      Warning

      +

      Proper cable management is mandatory. Cabling must always be secured to the rc_visard NG +mount with a strain-relief clamp so that no forces due to cable movements are exerted on the rc_visard NG’s +M12 connectors. Enough slack needs to be provided to allow for full range of movement of the rc_visard NG +without straining the cable. The cable’s minimum bend radius needs to be observed.

      +
      +

      The rc_visard NG provides an industrial 8-pin A-coded M12 socket connector for Ethernet +connectivity and an 8-pin A-coded M12 plug connector for power and GPIO connectivity. +Both connectors are located at the back. The location of both connectors on the +rc_visard NG is shown in Fig. 4.

      +
      +_images/rc_visard_connect_ng_en.png +

      Fig. 4 Locations of the electrical connections for the rc_visard NG, with Ethernet on top and power on the bottom

      +
      +

      Connectors are rotated so that standard 90° angled connectors will exit horizontally, away from the camera (away from the cooling fins).

      +
      +_images/rc_visard_pinout_ng_en.png +

      Fig. 5 Pin positions for power and Ethernet connector

      +
      +

      Pin assignments for the Ethernet connector are given in Fig. 6.

      +
      +_images/ethernet_cable.png +

      Fig. 6 Pin assignments for M12 to Ethernet cabling

      +
      +

      Pin assignments for the power connector are given in Table 5.

      + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table 5 Pin assignments for the power connector
      PinAssignment
      1GPIO In 2
      2Power
      3GPIO In 1
      4GPIO Gnd
      5GPIO Vcc
      6GPIO Out 1 (image exposure)
      7Gnd
      8GPIO Out 2
      +

      GPIOs are decoupled by photocoupler. GPIO Out 1 by default provides an exposure sync signal with +a logic high level for the duration of the image exposure. All GPIOs can be controlled via the +IOControl module (IO and Projector Control). +Pins of unsused GPIOs should be left floating.

      +
      +

      Warning

      +

      It is especially important that during the boot phase GPIO In 1 +is left floating or remains low. The rc_visard NG will not boot if the pin is high during boot time.

      +
      +

      GPIO circuitry and specifications are shown in Fig. 7. The maximum rated voltage for +GPIO In and GPIO Vcc is 30 V.

      +
      +_images/rc_visard_gpio.png +

      Fig. 7 GPIO circuitry and specifications – do not connect signals higher than 30 V

      +
      +
      +

      Warning

      +

      Do not connect signals with voltages higher than 30 V to the rc_visard NG.

      +
      +
      +
      +

      Mechanical interface

      +

      The rc_visard NG offers a mounting-point at the bottom.

      +
      +_images/rc_visard_mounting_ng_en.png +

      Fig. 8 Mounting-point for connecting the rc_visard NG to robots or other mountings

      +
      +

      For troubleshooting and static applications, the sensor may be mounted using the standardized tripod +thread (UNC 1/4”-20) indicated at the coordinate-frame origin. For dynamic applications such +as mounting on a robotic arm, the sensor must be mounted with three M4 (metric standard) 8.8 machine +screws tightened to 2.5 Nm and secured with a medium-strength threadlocking adhesive such +as Loctite 243. Maximum thread depth is 6 mm. The two 4 mm diameter holes may be used for positioning +pins (ISO 2338 4 m6) to ensure precise repositioning of the sensor.

      +
      +

      Warning

      +

      For dynamic applications, the rc_visard NG must be mounted with three M4 8.8 machine screws +tightened to 2.5 Nm torque and secured with threadlocking adhesive. Do not use high-strength bolts. +The engaged thread depth must be at least 5 mm.

      +
      +
      +
      +

      Coordinate frames

      +

      The rc_visard NG’s coordinate-frame origin is defined as the exit pupil of the left camera lens. This frame is +called sensor coordinate frame or camera coordinate frame. An approximate location for the rc_visard NG is shown in the next image.

      +

      The mounting-point frame for the rc_visard NG is defined to be at the bottom, centered in the tripod thread, +with orientation identical to that of the sensor’s coordinate frame.

      +

      Fig. 9 shows approximate offsets.

      +
      +_images/rc_visard160_frames.png +

      Fig. 9 Approximate locations of sensor/camera coordinate frame (inside left lens) and mounting-point frame (at tripod thread) for the rc_visard NG 160

      +
      +
      +

      Note

      +

      The correct offset between the sensor/camera frame and a robot +coordinate frame can be calibrated through the hand-eye-calibration +procedure.

      +
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/http-routingtable.html b/v24.04/en/http-routingtable.html new file mode 100644 index 0000000..8e73d89 --- /dev/null +++ b/v24.04/en/http-routingtable.html @@ -0,0 +1,947 @@ + + + + + + + + + + + HTTP Routing Table — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + + +

      HTTP Routing Table

      + +
      + /cad | + /logs | + /nodes | + /pipelines | + /system | + /templates | + /userspace +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
       
      + /cad
      + GET /cad/gripper_elements +
      + GET /cad/gripper_elements/{id} +
      + PUT /cad/gripper_elements/{id} +
      + DELETE /cad/gripper_elements/{id} +
       
      + /logs
      + GET /logs +
      + GET /logs/{log} +
       
      + /nodes
      + GET /nodes +
      + GET /nodes/{node} +
      + GET /nodes/{node}/services +
      + GET /nodes/{node}/services/{service} +
      + GET /nodes/{node}/status +
      + PUT /nodes/{node}/services/{service} +
       
      + /pipelines
      + GET /pipelines/{pipeline}/nodes +
      + GET /pipelines/{pipeline}/nodes/{node} +
      + GET /pipelines/{pipeline}/nodes/{node}/parameters +
      + GET /pipelines/{pipeline}/nodes/{node}/parameters/{param} +
      + GET /pipelines/{pipeline}/nodes/{node}/services +
      + GET /pipelines/{pipeline}/nodes/{node}/services/{service} +
      + GET /pipelines/{pipeline}/nodes/{node}/status +
      + PUT /pipelines/{pipeline}/nodes/{node}/parameters +
      + PUT /pipelines/{pipeline}/nodes/{node}/parameters/{param} +
      + PUT /pipelines/{pipeline}/nodes/{node}/services/{service} +
       
      + /system
      + GET /system +
      + GET /system/backup +
      + GET /system/dns +
      + GET /system/license +
      + GET /system/network +
      + GET /system/network/settings +
      + GET /system/rollback +
      + GET /system/time +
      + GET /system/ui_lock +
      + GET /system/update +
      + POST /system/backup +
      + POST /system/license +
      + POST /system/ui_lock +
      + POST /system/update +
      + PUT /system/dns +
      + PUT /system/network/settings +
      + PUT /system/reboot +
      + PUT /system/rollback +
      + PUT /system/time +
      + DELETE /system/ui_lock +
       
      + /templates
      + GET /templates/rc_boxpick +
      + GET /templates/rc_boxpick/{id} +
      + GET /templates/rc_silhouettematch +
      + GET /templates/rc_silhouettematch/{id} +
      + PUT /templates/rc_boxpick/{id} +
      + PUT /templates/rc_silhouettematch/{id} +
      + DELETE /templates/rc_boxpick/{id} +
      + DELETE /templates/rc_silhouettematch/{id} +
       
      + /userspace
      + GET /userspace +
      + + +
      +
      + +
      +
      +
      + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/index.html b/v24.04/en/index.html new file mode 100644 index 0000000..c736afd --- /dev/null +++ b/v24.04/en/index.html @@ -0,0 +1,750 @@ + + + + + + + + + + + Roboception rc_visard NG User Manual — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + +
        + +
      • rc_visard NG >
      • + +
      • Roboception rc_visard NG User Manual
      • + + +
      • + + + +
      • + +
      + + +
      +
      + +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/installation.html b/v24.04/en/installation.html new file mode 100644 index 0000000..9f766c2 --- /dev/null +++ b/v24.04/en/installation.html @@ -0,0 +1,836 @@ + + + + + + + + + + + Installation — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Installation

      +
      +

      Warning

      +

      The instructions on Safety related to the rc_visard NG must be read and understood prior to installation.

      +
      +

      The rc_visard NG offers a Gigabit Ethernet interface for connecting the device to a computer +network. All communications to and from the device are performed via this interface. The +rc_visard NG has an on-board computing resource that requires booting time after powering +up the device.

      +
      +

      Software license

      +

      Every rc_visard NG device ships with a pre-installed license file for licensing +and protection of the installed software packages. The license +is bound to that specific rc_visard NG device and cannot be used or +transferred to other devices.

      +

      The functionality of the rc_visard NG can +be enhanced anytime by +upgrading the license, +e.g., for optionally available software modules.

      +
      +

      Note

      +

      The rc_visard NG requires to be rebooted whenever the installed +licenses have changed.

      +
      +
      +

      Note

      +

      The license status can be retrieved +via the rc_visard NG’s various interfaces +such as the System ‣ Firmware & License page of the +Web GUI.

      +
      +
      +
      +

      Power up

      +
      +

      Note

      +

      Always fully connect and tighten the M12 power connector on the rc_visard NG +before turning on the power supply.

      +
      +

      After connecting the rc_visard NG to the power, the LED on the front of the device should +immediately illuminate. During the device’s boot process, the LED will change +color and will eventually turn green. This signals that all processes are up and +running.

      +

      If the network is not plugged in or the network is not properly configured, then the LED +will flash red every 5 seconds. In this case, the device’s network configuration +should be verified. See LED colors +for more information on the LED color codes.

      +
      +
      +

      Discovery of rc_visard NG devices

      +

      Roboception rc_visard NG devices that are powered up and connected to the local network or directly to a +computer can be found using the standard GigE Vision® discovery mechanism.

      +

      Roboception offers the open-source tool rcdiscover-gui, which can be downloaded free of charge from +https://github.com/roboception/rcdiscover/releases for Windows and Linux. +The tool’s Windows version consists of a single executable for Windows 7, 10 and 11, which can be executed without installation. +For Linux an installation package is available for Ubuntu.

      +

      At startup, all available GigE Vision® devices – including rc_visard NG devices – are +listed with their names, serial numbers, current IP addresses, and unique MAC addresses. The +discovery tool finds all devices reachable by global broadcasts. Misconfigured devices +that are located in different subnets than the application host may also be listed. A tickmark in the +discovery tool indicates whether devices are actually reachable via a +web browser.

      +
      +_images/typelabel_ng_en.png +

      Fig. 10 Label on the rc_visard NG indicating model, serial number and MAC address

      +
      +
      +_images/rcdiscover_guiwin.png +

      Fig. 11 rcdiscover-gui tool for finding connected GigE Vision® devices

      +
      +

      After successful discovery, a double click on the device row opens the Web GUI of the device in the operating system’s default web browser. +Google Chrome or Mozilla Firefox are recommended as web browser.

      +
      +

      Resetting configuration

      +

      A misconfigured device can be reset by using the Reset rc_visard button in the +discovery tool. The reset mechanism is only available for two minutes +after device startup. Thus, the rc_visard NG may require rebooting before +being able to reset the device.

      +
      +_images/rcdiscover_reset.png +

      Fig. 12 Reset dialog of the rcdiscover-gui tool

      +
      +

      If the discovery tool still successfully detects the the misconfigured rc_visard NG, +then the latter can be selected from the rc-visard drop-down menu. Otherwise, +the rc_visard NG’s MAC address, which is printed on the device label, can be entered +manually into the designated fields.

      +

      One of four options can be chosen after entering the MAC address:

      +
        +
      • Reset Parameters: Reset all rc_visard NG parameters, such as frame rate, that are configurable via +Web GUI.
      • +
      • Reset Network: Reset network settings and user-defined name.
      • +
      • Reset All: Reset the rc_visard NG parameters as well as network settings and user-defined name.
      • +
      • Switch Partitions: Allows a rollback to be performed as described in +Restoring the previous firmware version.
      • +
      +

      A white status LED followed by a device reboot indicates a successful reset. +If no reaction is noticeable, the two minutes time slot may have elapsed, requiring +another reboot.

      +
      +

      Note

      +

      The reset mechanism is only available for the first two minutes after startup.

      +
      +
      +
      +
      +

      Network configuration

      +

      The rc_visard NG requires an Internet Protocol (IP) address for communication with other network +devices. The IP address must be unique in the local network, and can be set either manually via a +user-configurable persistent IP address, or automatically via DHCP. +If none of these IP configuration methods apply, the rc_visard NG falls back to a Link-Local IP address.

      +

      Following the GigE Vision® standard, the priority of IP configuration methods on the rc_visard NG is

      +
      +
        +
      1. Persistent IP (if enabled)
      2. +
      3. DHCP (if enabled)
      4. +
      5. Link-Local
      6. +
      +
      +
      +_images/ip_configuration_flowchart_ng_en.svg +

      Fig. 13 rc_visard NG’s IP configuration method selection flowchart

      +
      +

      Options for changing the rc_visard NG’s network settings and IP configuration are:

      +
      +
        +
      • the System ‣ Network page of the rc_visard NG’s Web GUI – if it is reachable in the local network already, +see Web GUI
      • +
      • any configuration tool compatible with GigE Vision® 2.0, +or Roboception’s command-line tool gc_config. Typically, these tools scan for all available GigE Vision® +devices on the network. All rc_visard NG devices can be uniquely identified by their serial number and MAC address, +which are both printed on the device.
      • +
      • temporarily changing or completely resetting the rc_visard NG’s network configuration via Roboception’s +rcdiscover-gui tool, see Discovery of rc_visard NG devices
      • +
      +
      +
      +

      Note

      +

      The command-line tool gc_config is part of Roboception’s open-source convenience layer rc_genicam_api, +which can be downloaded free of charge for Windows and Linux from http://www.roboception.com/download.

      +
      +
      +

      Host name

      +

      The rc_visard NG’s host name is based on its serial number, which is printed on the device, and +is defined as rc-visard-ng-<serial number>.

      +
      +
      +

      Automatic configuration (factory default)

      +

      The Dynamic Host Configuration Protocol (DHCP) is preferred for setting an IP +address. If DHCP is active on the rc_visard NG, which is the factory default, the +device tries to contact a DHCP server at startup and every time the network cable is being +plugged in. If a DHCP server is available on the network, the IP address +is automatically configured.

      +

      In some networks, the DHCP server is configured so that it only accepts known +devices. In this case, the Media Access Control address (MAC address), which is printed on +the device label, needs to be configured in the DHCP server. At the same time, the rc_visard NG’s host +name can also be set in the Domain Name Server (DNS). Both MAC address and host name should +be sent to the network administrator for configuration.

      +

      If the rc_visard NG cannot contact a DHCP server within about 15 seconds after startup, or +after plugging in the network cable, it assigns itself a unique +IP address. This process is called Link-Local. This option is especially useful for +connecting the rc_visard NG directly to a computer. The computer must be configured for Link-Local +as well. Link-Local might already be configured as a standard fallback option, +as it is under Windows 10. Other operating systems such as Linux require Link-Local +to be explicitly configured in their network managers.

      +
      +
      +

      Manual configuration

      +

      Specifying a persistent, i.e. static IP address manually might be useful in some cases. +This address is stored on the rc_visard NG to be used on device startup or network reconnection. +Please make sure the selected IP address, subnet mask and gateway will not cause any +conflicts on the network.

      +
      +

      Warning

      +

      The IP address must be unique within the local network and within the local network’s range of valid addresses. +Furthermore, the subnet mask must match the local network; otherwise, the rc_visard NG +may become inaccessible. This can be avoided by using +automatic configuration as explained in Automatic configuration (factory default).

      +
      +

      If this IP address cannot be assigned, e.g. because it is already used by another device in the network, +IP configuration will fall back to automatic configuration via DHCP (if enabled) or a Link-Local address.

      +
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/interfaces.html b/v24.04/en/interfaces.html new file mode 100644 index 0000000..1eeec6c --- /dev/null +++ b/v24.04/en/interfaces.html @@ -0,0 +1,693 @@ + + + + + + + + + + + Interfaces — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Interfaces

      +

      The following interfaces are provided for configuring and obtaining data from the rc_visard NG:

      +
        +
      • Web GUI

        +
        +

        Easy-to-use graphical interface to configure the rc_visard NG, do calibrations, view live images, +do service calls, visualize results, etc.

        +
        +
      • +
      • GigE Vision 2.0/GenICam

        +
        +

        Images and camera related configuration.

        +
        +
      • +
      • REST API

        +
        +

        API to configure the rc_visard NG, query status information, do service calls, etc.

        +
        +
      • +
      + +
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/iocontrol.html b/v24.04/en/iocontrol.html new file mode 100644 index 0000000..890d1e3 --- /dev/null +++ b/v24.04/en/iocontrol.html @@ -0,0 +1,990 @@ + + + + + + + + + + + IO and Projector Control — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      IO and Projector Control

      +

      The IOControl module is an on-board module of the rc_visard.

      +

      The IOControl module allows reading the status of the general purpose +digital inputs and controlling the digital general purpose outputs (GPIOs) +of the rc_visard. +The outputs can be set to LOW or HIGH, +or configured to be HIGH for the exposure time of every image or every second image.

      +

      The purpose of the IOControl module is the control of an external light source +or a projector, which is connected to one of the rc_visard’s GPIOs to be +synchronized by the image acquisition trigger. +In case a pattern projector is used to improve stereo matching, the intensity images +also show the projected pattern, which might be a disadvantage for image processing +tasks that are based on the intensity image (e.g. edge detection). For this reason, +the IOControl module allows setting GPIO outputs to HIGH for the exposure time of +every second image, so that intensity images without the projected pattern are also available.

      +
      +

      Note

      +

      For more details on the rc_visard NG’s GPIOs please refer to +Wiring.

      +
      +
      +

      Parameters

      +

      The IOControl module is called rc_iocontrol in the REST-API and is represented in the +Web GUI + under Configuration ‣ IOControl. +The user can change the parameters via the Web GUI, the +REST-API interface, or via GigE Vision +using the DigitalIOControl parameters LineSelector and LineSource +(Category: DigitalIOControl).

      +
      +

      Parameter overview

      +

      This module offers the following run-time parameters:

      + + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table 46 The rc_iocontrol module’s run-time parameters
      NameTypeMinMaxDefaultDescription
      out1_modestring--LowOut1 mode: [Low, High, ExposureActive, ExposureAlternateActive]
      out2_modestring--LowOut2 mode: [Low, High, ExposureActive, ExposureAlternateActive]
      +
      +
      +

      Description of run-time parameters

      +
      +

      out1_mode and out2_mode (Out1 and Out2)

      +
      +
      +

      The output modes for GPIO Out 1 and Out 2 can be set individually:

      +

      Low sets the output permanently to LOW. This is the factory default.

      +

      High sets the output permanently to HIGH.

      +

      ExposureActive sets the output to HIGH for the exposure time of every +image.

      +

      ExposureAlternateActive sets the output to HIGH for the exposure time +of every second image.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_iocontrol/parameters/parameters?<out1_mode|out2_mode>=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_iocontrol/parameters?<out1_mode|out2_mode>=<value>
      +
      +
      +
      +
      +
      +

      Fig. 48 shows which images are used for stereo +matching and transmission via GigE Vision in ExposureActive mode with a +user-defined frame rate of 8 Hz.

      +
      +_images/fps_exposure.png +

      Fig. 48 Example of using the ExposureActive mode for GPIO Out 1 with a user-defined +frame rate of 8 Hz. The internal image acquisition is always 25 Hz. +GPIO Out 1 is HIGH for the exposure time of every image. A disparity +image is computed for camera images that are sent out via GigE Vision according +to the user-defined frame rate.

      +
      +

      The mode ExposureAlternateActive is meant to be used when an external random +dot projector is connected to the rc_visard’s GPIO Out 1. +When setting Out 1 to ExposureAlternateActive, the +stereo matching +module only uses images with GPIO Out 1 being HIGH, i.e. projector is on. The maximum +frame rate that is used for stereo matching is therefore half of the frame rate +configured by the user +(see FPS). All +modules which make use of the intensity image, like +TagDetect and +ItemPick, +use the intensity images with GPIO Out 1 being LOW, i.e. projector is off. +Fig. 49 shows an example.

      +
      +_images/fps_alternate.png +

      Fig. 49 Example of using the ExposureAlternateActive mode for GPIO Out 1 with a +user-defined frame rate of 8 Hz. The internal image acquisition is always 25 Hz. +GPIO Out 1 is HIGH for the exposure time of every second image. A disparity +image is computed for images where Out 1 is HIGH and that are sent out via GigE +Vision according to the user-defined frame rate. In ExposureAlternateActive +mode, intensity images are always transmitted pairwise: one with GPIO Out 1 HIGH, for which a +disparity image might be available, and one with GPIO Out 1 LOW.

      +
      +
      +

      Note

      +

      In ExposureAlternateActive mode, an intensity image with GPIO Out 1 being HIGH (i.e. with +projection) is always 40 ms away from an intensity image with Out 1 being LOW (i.e. without +projection), regardless of the user-defined frame rate. This needs to be +considered when synchronizing disparity images and camera images without projection +in this special mode.

      +
      +

      The functionality can also be controlled by the DigitalIOControl parameters +of the GenICam interface (Category: DigitalIOControl).

      +
      +
      +
      +
      +

      Services

      +

      Each service response contains a return_code, +which consists of a value plus an optional message. +A successful service returns with a return_code value of 0. +Negative return_code values indicate that the service failed. +Positive return_code values indicate that the service succeeded with additional information.

      +

      The IOControl module offers the following services.

      +
      +

      get_io_values

      +
      +

      Retrieves the current state of the rc_visard’s general purpose inputs +and outputs (GPIOs).

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_iocontrol/services/get_io_values
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_iocontrol/services/get_io_values
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      The returned timestamp is the time of measurement.

      +

      input_mask and output_mask are bit masks defining which bits are used for input and +output values, respectively.

      +

      values holds the values of the bits corresponding to input and output as given by the +input_mask and output_mask.

      +

      return_code holds possible warnings or error codes and messages. +Possible return_code values are shown below.

      + ++++ + + + + + + + + + + + + + + + + +
      CodeDescription
      0Success
      -2Internal error
      -9License for IOControl is not available
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "get_io_values",
      +  "response": {
      +    "input_mask": "uint32",
      +    "output_mask": "uint32",
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    },
      +    "timestamp": {
      +      "nsec": "int32",
      +      "sec": "int32"
      +    },
      +    "values": "uint32"
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      reset_defaults

      +
      +

      Restores and applies the default values for this module’s parameters +(“factory reset”).

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_iocontrol/services/reset_defaults
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_iocontrol/services/reset_defaults
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "reset_defaults",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/itempick.html b/v24.04/en/itempick.html new file mode 100644 index 0000000..0f4d0dc --- /dev/null +++ b/v24.04/en/itempick.html @@ -0,0 +1,3006 @@ + + + + + + + + + + + ItemPick and BoxPick — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      ItemPick and BoxPick

      +
      +

      Introduction

      +

      The ItemPick and BoxPick modules provide out-of-the-box perception solutions for robotic pick-and-place +applications. ItemPick targets the detection of flat surfaces of unknown objects for picking +with a suction gripper. BoxPick detects rectangular surfaces and determines their position, +orientation and size for grasping. With the +Match extension, BoxPick can be used to +detect textured rectangles with consistent orientations. The interface of both modules is very similar. Therefore +both modules are described together in this chapter.

      +

      In addition, both modules offer:

      +
        +
      • A dedicated page on the rc_visard NG Web GUI +for easy setup, configuration, testing, and application tuning.
      • +
      • The definition of regions of interest to select relevant volumes in the scene +(see RoiDB).
      • +
      • A load carrier detection functionality for bin-picking applications +(see LoadCarrier), +to provide grasps for items inside a bin only.
      • +
      • The definition of compartments inside a load carrier to provide grasps +for specific volumes of the bin only.
      • +
      • Support for static and robot-mounted cameras and +optional integration with the Hand-eye calibration + module, +to provide grasps in the user-configured external reference frame.
      • +
      • A quality value associated to each suggested grasp and related to the flatness of the grasping surface.
      • +
      • Selection of a sorting strategy to sort the returned grasps.
      • +
      • 3D visualization of the detection results with grasp points and gripper animations in the Web GUI.
      • +
      +
      +

      Note

      +

      In this chapter, cluster and surface are used as synonyms and identify a set of +points (or pixels) with defined geometrical properties.

      +
      +

      The modules are optional on-board modules of the rc_visard NG +and require separate ItemPick or BoxPick licenses + to be purchased. +The +Match extension of BoxPick requires an extra license.

      +
      +
      +

      Detection of items (BoxPick)

      +

      There are two different types of models for the rectangles to be detected by the BoxPick module.

      +

      Per default, BoxPick only supports item_models of +type RECTANGLE. With the +Match extension, also item models +of type TEXTURED_BOX can be detected. The detection of the +different item model types is described below.

      +

      Optionally, further information can be given to the BoxPick module:

      +
        +
      • The ID of the load carrier which contains the items to be detected.
      • +
      • A compartment inside the load carrier where to detect items.
      • +
      • The ID of the region of interest where to search for the load carriers if a +load carrier is set. +Otherwise, the ID of the region of interest where to search for the items.
      • +
      • The current robot pose in case the camera is mounted on the robot and +the chosen coordinate frame for the poses is external or the chosen +region of interest is defined in the external frame.
      • +
      +

      The returned pose of a detected item is the pose of the center of the detected rectangle in the +desired reference frame (pose_frame), with its z axis pointing towards the camera and the x axis +aligned with the long side of the item. This pose has a 180° rotation ambiguity around the z axis, which can be resolved +by using the +Match extension with a TEXTURED_BOX item model. +Each detected item includes a uuid (Universally Unique Identifier) and the +timestamp of the oldest image that was used to detect it.

      +
      +

      Detection of items of type RECTANGLE (BoxPick)

      +

      BoxPick supports multiple item_models of type RECTANGLE. +Each item model is defined by its minimum and maximum size, with the +minimum dimensions strictly smaller than the maximum dimensions. +The dimensions should be given fairly accurately to avoid misdetections, +while still considering a certain tolerance to account for possible production variations +and measurement inaccuracies.

      +

      The detection of the rectangles runs in several steps. First, the point cloud is segmented into +preferably plane clusters. Then, straight line segments are detected in the 2D images +and projected onto the corresponding clusters. The clusters and the detected lines are +visualized in the “Intermediate Result” visualization +on the Web GUI’s BoxPick page. Finally, for each cluster, the set of +rectangles best fitting to the detected line segments is extracted.

      +
      +
      +

      Detection of items of type TEXTURED_BOX (BoxPick+Match)

      +

      With the +Match extension, BoxPick additionally supports item_models of type TEXTURED_BOX. +When this item model type is used, only one item model can be given for each request.

      +

      The TEXTURED_BOX item model type should be used to detect multiple rectangles that have the same texture, i.e. the same look or print, +such as printed product packaging, labels, brochures or books. It is required that for all objects the texture is at the same position with respect +to the object geometry. Furthermore, the texture should not be repetitive.

      +

      A TEXTURED_BOX item is defined by the item’s exact dimensions x, y and z (currently z +must always be 0) with a tolerance dimensions_tolerance_m that indicates, +how much the detected dimensions are allowed to deviate from the given dimensions. By default, a tolerance of 0.01 m is assumed. +Furthermore, a template_id must be given, which will be used to refer to the specified dimensions and the +textures of the detected rectangles. Additionally, the maximum possible deformation of the items max_deformation_m +can be given in meters (default 0.004 m), to account for rigid or more flexible objects.

      +

      If a template_id is used for the first time, BoxPick will run the detection of rectangles as for the item +model type RECTANGLE, and use the given dimensions tolerance to specify the dimensions range. From the detected +rectangles, so-called views are created, which contain the shape and the image intensity values of the rectangles, +and are stored in a newly created template with the given template_id. The views are created iteratively: Starting +from the detected rectangle with the highest score, a view is created and then used to detect more rectangles with the same +texture. Then, all remaining clusters are used to detect further rectangles by the given dimensions range and again a view is +created from the best rectangle and used for further detections. +Each template can store up to 10 different views, for example corresponding to different types of the same product packaging. +Each view will be assigned a unique ID (view_uuid) +and all rectangle items with a matching texture will be assigned the same view_uuid. That also means that all items +with the same view_uuid will have consistent orientations, because the orientation of each item is aligned with its texture. +The views can be displayed, deleted and the orientation of each view can be set via the +Web GUI by clicking on the template or its edit symbol in the template list. +Each detected item contains a field view_pose_set indicating whether the orientation of the item’s view was explicitly set or +is still unset at its original random state, which has a 180° ambiguity. The type of a returned item with a view_uuid will be +TEXTURED_RECTANGLE.

      +

      If the template with the given template_id already exists, the existing views will be used to detect rectangles based on their +texture. If additional rectangles are found with matching dimensions, but different texture, new views will be generated and added +to the template. When the maximum number of views is reached, views that are matched only rarely will be deleted so that newly generated +views can be added to the template and the template is kept up-to-date. To prevent a template from being updated, automatic updating can be disabled and enabled for +each template in the Web GUI by clicking on the template or the edit symbol in the template list. +The dimension tolerance and the maximum deformation can also be changed there for each template. The maximum deformation determines +the tolerance for the texture matching, representing possible shifts within the texture, e.g. caused by deformations of the object surface. +For rigid objects the max_deformation_m should be set to a low value in meters to ensure accurate matching.

      +

      The template’s dimensions can only be specified when creating a new template. Once the template is generated, the dimensions cannot be changed +and do not need to be given in the detect request. If the dimensions are still given in the request, they must match the existing dimensions +in the template. However, the dimensions_tolerance_m +and max_deformation_m can be set differently in every detect request and their values will also be updated in the stored template.

      +
      +
      +
      +

      Computation of grasps

      +

      The ItemPick and BoxPick modules offer a service for computing grasps for +suction grippers. The gripper is defined by its suction surface length and width.

      +

      The ItemPick module identifies flat surfaces in the scene and supports +flexible and/or deformable items. The type of these item_models is +called UNKNOWN since they don’t need to have a standard geometrical shape. +Optionally, the user can also specify the minimum and maximum size of the item.

      +

      For BoxPick, the grasps are computed on the detected rectangular items +(see Detection of items (BoxPick)).

      +

      Optionally, further information can be given to the modules in a grasp +computation request:

      +
        +
      • The ID of the load carrier which contains the items to be grasped.
      • +
      • A compartment inside the load carrier where to compute grasps +(see Load carrier compartments).
      • +
      • The ID of the 3D region of interest where to search for the load carriers if a +load carrier is set. +Otherwise, the ID of the 3D region of interest where to compute grasps.
      • +
      • Collision detection information: The ID of the gripper to enable collision checking and optionally +a pre-grasp offset to define a pre-grasp position. +Details on collision +checking are given below in CollisionCheck.
      • +
      +

      A grasp provided by the ItemPick and BoxPick modules represents the recommended +pose of the TCP (Tool Center Point) of the suction gripper. +The grasp type is always set to SUCTION. +The computed grasp pose is the center of the biggest ellipse that can be inscribed in +each surface. +The grasp orientation is a right-handed coordinate system and is defined such +that its z axis is normal to the surface pointing inside the object at the grasp position and +its x axis is directed along the maximum elongation of the ellipse.

      +
      +_images/itempick_grasp_surface.png +

      Fig. 26 Illustration of suction grasp with coordinate system and ellipse representing +the maximum suction surface.

      +
      +

      Each grasp includes the dimensions of the maximum suction surface available, +modelled as an ellipse of axes max_suction_surface_length and +max_suction_surface_width. The user is enabled to filter grasps by specifying +the minimum suction surface required by the suction device in use.

      +

      In the BoxPick module, the grasp position corresponds to the center of the detected +rectangle and the dimensions of the maximum suction surface available matches the estimated +rectangle dimensions. Detected rectangles with missing data or occlusions by other objects for more +than 15% of their surface do not get an associated grasp.

      +

      Each grasp also includes a quality value, which gives an +indication of the flatness of the grasping surface. +The quality value varies between 0 and 1, where higher numbers correspond to a +flatter reconstructed surface.

      +

      The grasp definition is complemented by a uuid (Universally Unique Identifier) +and the timestamp of the oldest image that was used to compute the grasp.

      +

      Grasp sorting is performed based on the selected sorting strategy. The following sorting strategies +are available and can be set in the Web GUI +or using the set_sorting_strategies service call:

      +
        +
      • gravity: highest grasp points along the gravity direction are returned first,
      • +
      • surface_area: grasp points with the largest surface area are returned first,
      • +
      • direction: grasp points with the shortest distance along a defined direction vector in a given pose_frame are returned first.
      • +
      +

      If no sorting strategy is set or default sorting is chosen in the Web GUI, sorting is done based on a combination of +gravity and surface_area.

      +
      +
      +

      Interaction with other modules

      +

      Internally, the ItemPick and BoxPick modules depend on, and interact with other on-board +modules as listed below.

      +
      +

      Note

      +

      All changes and configuration updates to these modules will affect +the performance of the ItemPick and BoxPick modules.

      +
      +
      +

      Stereo camera and Stereo matching

      +

      The ItemPick and BoxPick modules make internally use of the following data:

      +
        +
      • Rectified images from the Camera module +(rc_camera);
      • +
      • Disparity, error, and confidence images from the Stereo matching module +(rc_stereomatching).
      • +
      +

      All processed images are guaranteed to be captured after the module trigger time.

      +
      +
      +

      IO and Projector Control

      +

      In case the rc_visard NG is used in conjunction with an external random dot projector and +the IO and Projector Control module (rc_iocontrol), +it is recommended to connect the projector to GPIO Out 1 and set +the stereo-camera module’s acquisition mode to SingleFrameOut1 +(see Stereo matching parameters), so that +on each image acquisition trigger an image with and without projector pattern is acquired.

      +

      Alternatively, the output mode for the GPIO output in use should be set to ExposureAlternateActive +(see Description of run-time parameters).

      +

      In either case, +the Auto Exposure Mode exp_auto_mode should be set to AdaptiveOut1 to optimize the exposure +of both images (see Stereo camera parameters).

      +
      +
      +

      Hand-eye calibration

      +

      In case the camera has been calibrated to a robot, the ItemPick and BoxPick modules +can automatically provide poses in the robot coordinate frame. +For the ItemPick and BoxPick nodes’ Services, the frame of the +output poses can be controlled with the pose_frame argument.

      +

      Two different pose_frame values can be chosen:

      +
        +
      1. Camera frame (camera). +All poses provided by the modules are in the camera frame, +and no prior knowledge about the pose of the camera in the environment is required. +This means that the configured regions of interest and load carriers move with the camera. +It is the user’s responsibility to update the configured poses +if the camera frame moves (e.g. with a robot-mounted camera).
      2. +
      3. External frame (external). +All poses provided by the modules are in the external frame, +configured by the user during the hand-eye calibration process. +The module relies on the on-board +Hand-eye calibration module +to retrieve the sensor mounting (static or robot mounted) and +the hand-eye transformation. +If the mounting is static, no further information is needed. +If the sensor is robot-mounted, the robot_pose is required +to transform poses to and from the external frame.
      4. +
      +
      +

      Note

      +

      If no hand-eye calibration is available, all pose_frame values should be set to camera.

      +
      +

      All pose_frame values that are not camera or external are rejected.

      +

      If the sensor is robot-mounted, the current robot_pose has to be provided depending on the value of pose_frame +and the definition of the sorting direction:

      +
        +
      • If pose_frame is set to external, providing the robot pose is obligatory.
      • +
      • If the sorting direction is defined in external, providing the robot pose is obligatory.
      • +
      • In all other cases, providing the robot pose is optional.
      • +
      +
      +
      +

      LoadCarrier

      +

      The ItemPick and BoxPick modules use the load carrier detection functionality provided by the +LoadCarrier module (rc_load_carrier), +with the run-time parameters specified for this module. However, only one load carrier will be +returned and used in case multiple matching load carriers could be found in the scene. In case multiple +load carriers of the same type are visible, a 3D region of interest should be set to ensure that always the +same load carrier is used for the ItemPick and BoxPick modules.

      +
      +
      +

      CollisionCheck

      +

      Collision checking can be easily enabled for +grasp computation of the ItemPick and BoxPick modules by passing the ID of the used gripper and +optionally a pre-grasp offset to the +compute_grasps service call. The gripper has to be +defined in the GripperDB module +(see Setting a gripper) +and details about collision checking are given in Collision checking within other modules.

      +

      If collision checking is enabled, only grasps which are collision free will be returned. +However, the visualization images on the ItemPick or BoxPick +page of the Web GUI also show colliding grasp points as black ellipses.

      +

      The CollisionCheck module’s run-time parameters affect the collision detection as described in +CollisionCheck Parameters.

      +
      +
      +
      +

      Parameters

      +

      The ItemPick and BoxPick modules are called rc_itempick and rc_boxpick +in the REST-API and are represented in the Web GUI + under +Modules ‣ ItemPick and Modules ‣ BoxPick. +The user can explore and configure the rc_itempick and rc_boxpick +module’s run-time parameters, e.g. for development and testing, using the Web GUI or the +REST-API interface.

      +
      +

      Parameter overview

      +

      These modules offer the following run-time parameters:

      + + ++++++++ + + + + + + + + + + + + + + + + + + +
      Table 24 The rc_itempick and rc_boxpick modules’ application parameters
      NameTypeMinMaxDefaultDescription
      max_graspsint321205Maximum number of provided grasps
      + + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table 25 The rc_itempick and rc_boxpick modules’ surface clustering parameters
      NameTypeMinMaxDefaultDescription
      cluster_max_dimensionfloat640.050.80.3Only for rc_itempick. Maximum allowed diameter for a cluster in meters. Clusters with a diameter larger than this value are not used for grasp computation.
      cluster_max_curvaturefloat640.0050.50.11Maximum curvature allowed within one cluster. The smaller this value, the more clusters will be split apart.
      clustering_patch_sizeint323104Only for rc_itempick. Size in pixels of the square patches the depth map is subdivided into during the first clustering step
      clustering_max_surface_rmsefloat640.00050.010.004Maximum root-mean-square error (RMSE) in meters of points belonging to a surface
      clustering_discontinuity_factorfloat640.15.01.0Factor used to discriminate depth discontinuities within a patch. The smaller this value, the more clusters will be split apart.
      + + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table 26 The rc_boxpick module’s rectangle detection parameters
      NameTypeMinMaxDefaultDescription
      modestring--UnconstrainedMode of the rectangle detection: [Unconstrained, PackedGridLayout, PackedLayers]
      manual_line_sensitivityboolfalsetruefalseIndicates whether the user-defined line sensitivity should be used or the automatic one
      line_sensitivityfloat640.11.00.1Sensitivity of the line detector
      prefer_splitsboolfalsetruefalseIndicates whether rectangles are split into smaller ones when possible
      min_cluster_coveragefloat640.00.990.0Gives the minimal ratio of points per cluster that must be covered with detected items.
      +
      +
      +

      Description of run-time parameters

      +

      Each run-time parameter is represented by a row on the Web GUI’s ItemPick or BoxPick page. +The name in the Web GUI is given in brackets behind the parameter name and the parameters are +listed in the order they appear in the Web GUI:

      +
      +

      max_grasps (Maximum Grasps)

      +
      +
      +

      sets the maximum number of provided grasps.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/<rc_itempick|rc_boxpick>/parameters/parameters?max_grasps=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/<rc_itempick|rc_boxpick>/parameters?max_grasps=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      cluster_max_dimension (Only for ItemPick, Cluster Maximum Dimension)

      +
      +
      +

      is the maximum allowed diameter for a cluster in meters. Clusters with a diameter larger than this value are not used for grasp computation.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_itempick/parameters/parameters?cluster_max_dimension=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_itempick/parameters?cluster_max_dimension=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      cluster_max_curvature (Cluster Maximum Curvature)

      +
      +
      +

      is the maximum curvature allowed within one cluster. The smaller this value, the more clusters will be split apart.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/<rc_itempick|rc_boxpick>/parameters/parameters?cluster_max_curvature=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/<rc_itempick|rc_boxpick>/parameters?cluster_max_curvature=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      clustering_patch_size (Only for ItemPick, Patch Size)

      +
      +
      +

      is the size of the square patches the depth map is subdivided into during the first clustering step in pixels.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_itempick/parameters/parameters?clustering_patch_size=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_itempick/parameters?clustering_patch_size=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      clustering_discontinuity_factor (Discontinuity Factor)

      +
      +
      +

      is the factor used to discriminate depth discontinuities within a patch. The smaller this value, the more clusters will be split apart.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/<rc_itempick|rc_boxpick>/parameters/parameters?clustering_discontinuity_factor=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/<rc_itempick|rc_boxpick>/parameters?clustering_discontinuity_factor=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      clustering_max_surface_rmse (Maximum Surface RMSE)

      +
      +
      +

      is the maximum root-mean-square error (RMSE) in meters of points belonging to a surface.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/<rc_itempick|rc_boxpick>/parameters/parameters?clustering_max_surface_rmse=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/<rc_itempick|rc_boxpick>/parameters?clustering_max_surface_rmse=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      mode (Only for BoxPick, Mode)

      +
      +
      +

      determines the mode of the rectangle detection. Possible values are Unconstrained, PackedGridLayout and PackedLayers. +In PackedGridLayout mode, rectangles of a cluster are detected in a dense grid pattern. +In PackedLayers mode, boxes are assumed to form layers and box detection will start searching for items at the cluster corners. +Use this mode in de-palletizing applications. +In Unconstrained mode (default), rectangles are detected without posing any constraints on their relative locations or their +positions in the segmented cluster. Fig. 27 illustrates the modes for different scenarios.

      +
      +_images/boxpick_modes_new.svg +

      Fig. 27 Illustration of appropriate BoxPick modes for different scenes. Modes marked with yellow are applicable but not +recommended for the corresponding scene. The gray areas indicate the rectangles to be detected.

      +
      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_boxpick/parameters/parameters?mode=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_boxpick/parameters?mode=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      manual_line_sensitivity (Only for BoxPick, Manual Line Sensitivity)

      +
      +
      +

      determines whether the user-defined line sensitivity should be used +to extract the lines for rectangle detection. If this +parameter is set to true, the user-defined line_sensitivity value +will be used. If this parameter is set to false, automatic line sensitivity +will be used. This parameter should be set to true when automatic line sensitivity +does not give enough lines at the box boundaries so that boxes cannot be detected. +The detected line segments are visualized in the “Intermediate Result” visualization on the +Web GUI’s BoxPick page.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_boxpick/parameters/parameters?manual_line_sensitivity=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_boxpick/parameters?manual_line_sensitivity=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      line_sensitivity (Only for BoxPick, Line Sensitivity)

      +
      +
      +

      determines the line sensitivity for extracting the lines for rectangle detection, if the +parameter manual_line_sensitivity is set to true. Otherwise, the value of this parameter +has no effect on the rectangle detection. Higher values give more line segments, but also +increase the runtime of the box detection. This parameter should be increased when boxes +cannot be detected because their boundary edges are not detected. The detected line segments +are visualized in the “Intermediate Result” visualization on the Web GUI’s BoxPick page.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_boxpick/parameters/parameters?line_sensitivity=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_boxpick/parameters?line_sensitivity=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      prefer_splits (Only for BoxPick, Prefer Splits)

      +
      +
      +

      determines whether rectangles should be split into smaller ones if the smaller ones also match the given +item models. This parameter should be set to true for packed box layouts in which the given item models +would also match a rectangle of the size of two adjoining boxes. If this parameter is set to false, the larger +rectangles will be preferred in these cases.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_boxpick/parameters/parameters?prefer_splits=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_boxpick/parameters?prefer_splits=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      min_cluster_coverage (Only for BoxPick, Minimum Cluster Coverage)

      +
      +
      +

      determines which ratio of each segmented cluster must be covered with rectangle detections to +consider the detections to be valid. If the minimum cluster coverage is not reached for a cluster, +no rectangle detections will be returned for this cluster and a warning will be given. +This parameter should be used to verify that all items on a layer in a de-palletizing scenario are +detected.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_boxpick/parameters/parameters?min_cluster_coverage=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_boxpick/parameters?min_cluster_coverage=<value>
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +

      Status values

      +

      The rc_itempick and rc_boxpick modules report the following status values:

      + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table 27 The rc_itempick and rc_boxpick modules status values
      NameDescription
      data_acquisition_timeTime in seconds required by the last active service to acquire images
      grasp_computation_timeProcessing time of the last grasp computation in seconds
      last_timestamp_processedThe timestamp of the last processed dataset
      load_carrier_detection_timeProcessing time of the last load carrier detection in seconds
      processing_timeProcessing time of the last detection (including load carrier detection) in seconds
      stateThe current state of the rc_itempick and rc_boxpick node
      +

      The reported state can take one of the following values.

      + + ++++ + + + + + + + + + + + + + + + + +
      Table 28 Possible states of the ItemPick and BoxPick modules
      State nameDescription
      IDLEThe module is idle.
      RUNNINGThe module is running and ready for load carrier detection and grasp computation.
      FATALA fatal error has occurred.
      +
      +
      +

      Services

      +

      The user can explore and call the rc_itempick and rc_boxpick module’s services, +e.g. for development and testing, using the +REST-API interface or +the rc_visard NG +Web GUI.

      +

      The ItemPick and BoxPick modules offer the following services.

      +
      +

      detect_items (BoxPick only)

      +
      +

      Triggers the detection of rectangles as described in +Detection of items (BoxPick).

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_boxpick/services/detect_items
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_boxpick/services/detect_items
      +
      +
      +
      +
      +
      + +
      +

      Required arguments:

      +
      +

      pose_frame: see Hand-eye calibration.

      +

      item_models: list of item models to be detected. +The type of the item model must be RECTANGLE or TEXTURED_BOX. For type RECTANGLE, rectangle must be filled, +while for TEXTURED_BOX, textured_box must be filled. +See Detection of items (BoxPick) for a detailed description +of the item model types.

      +
      +

      Potentially required arguments:

      +
      +
      robot_pose: see Hand-eye calibration.
      +

      Optional arguments:

      +
      +

      load_carrier_id: ID of the load carrier which contains the items to be detected.

      +

      load_carrier_compartment: compartment inside the load carrier where to detect items +(see Load carrier compartments).

      +

      region_of_interest_id: if load_carrier_id is set, +ID of the 3D region of interest where to search for the load carriers. +Otherwise, ID of the 3D region of interest where to search for the items.

      +
      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "item_models": [
      +      {
      +        "rectangle": {
      +          "max_dimensions": {
      +            "x": "float64",
      +            "y": "float64"
      +          },
      +          "min_dimensions": {
      +            "x": "float64",
      +            "y": "float64"
      +          }
      +        },
      +        "textured_box": {
      +          "dimensions": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "dimensions_tolerance_m": "float64",
      +          "max_deformation_m": "float64",
      +          "template_id": "string"
      +        },
      +        "type": "string"
      +      }
      +    ],
      +    "load_carrier_compartment": {
      +      "box": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "pose": {
      +        "orientation": {
      +          "w": "float64",
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "position": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        }
      +      }
      +    },
      +    "load_carrier_id": "string",
      +    "pose_frame": "string",
      +    "region_of_interest_id": "string",
      +    "robot_pose": {
      +      "orientation": {
      +        "w": "float64",
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "position": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      }
      +    }
      +  }
      +}
      +
      +
      +
      +
      +

      load_carriers: list of detected load carriers.

      +

      items: list of detected rectangles.

      +

      timestamp: timestamp of the image set the detection ran on.

      +

      return_code: holds possible warnings or error codes and messages.

      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "detect_items",
      +  "response": {
      +    "items": [
      +      {
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "pose_frame": "string",
      +        "rectangle": {
      +          "x": "float64",
      +          "y": "float64"
      +        },
      +        "template_id": "string",
      +        "timestamp": {
      +          "nsec": "int32",
      +          "sec": "int32"
      +        },
      +        "type": "string",
      +        "uuid": "string",
      +        "view_pose_set": "bool",
      +        "view_uuid": "string"
      +      }
      +    ],
      +    "load_carriers": [
      +      {
      +        "height_open_side": "float64",
      +        "id": "string",
      +        "inner_dimensions": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "outer_dimensions": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "overfilled": "bool",
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "pose_frame": "string",
      +        "rim_ledge": {
      +          "x": "float64",
      +          "y": "float64"
      +        },
      +        "rim_step_height": "float64",
      +        "rim_thickness": {
      +          "x": "float64",
      +          "y": "float64"
      +        },
      +        "type": "string"
      +      }
      +    ],
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    },
      +    "timestamp": {
      +      "nsec": "int32",
      +      "sec": "int32"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      compute_grasps (for ItemPick)

      +
      +

      Triggers the computation of grasping poses for a suction device as described in +Computation of grasps.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_itempick/services/compute_grasps
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_itempick/services/compute_grasps
      +
      +
      +
      +
      +
      + +
      +

      Required arguments:

      +
      +

      pose_frame: see Hand-eye calibration.

      +

      suction_surface_length: length of the suction device grasping surface.

      +

      suction_surface_width: width of the suction device grasping surface.

      +
      +

      Potentially required arguments:

      +
      +
      robot_pose: see Hand-eye calibration.
      +

      Optional arguments:

      +
      +

      load_carrier_id: ID of the load carrier which contains the items to be grasped.

      +

      load_carrier_compartment: compartment inside the load carrier where to compute grasps +(see Load carrier compartments).

      +

      region_of_interest_id: if load_carrier_id is set, +ID of the 3D region of interest where to search for the load carriers. +Otherwise, ID of the 3D region of interest where to compute grasps.

      +

      item_models: list of unknown items with minimum and maximum dimensions, with the +minimum dimensions strictly smaller than the maximum dimensions. +Only one item_model of type UNKNOWN is currently supported.

      +

      collision_detection: see Collision checking within other modules.

      +
      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "collision_detection": {
      +      "gripper_id": "string",
      +      "pre_grasp_offset": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      }
      +    },
      +    "item_models": [
      +      {
      +        "type": "string",
      +        "unknown": {
      +          "max_dimensions": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "min_dimensions": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        }
      +      }
      +    ],
      +    "load_carrier_compartment": {
      +      "box": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "pose": {
      +        "orientation": {
      +          "w": "float64",
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "position": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        }
      +      }
      +    },
      +    "load_carrier_id": "string",
      +    "pose_frame": "string",
      +    "region_of_interest_id": "string",
      +    "robot_pose": {
      +      "orientation": {
      +        "w": "float64",
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "position": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      }
      +    },
      +    "suction_surface_length": "float64",
      +    "suction_surface_width": "float64"
      +  }
      +}
      +
      +
      +
      +
      +

      load_carriers: list of detected load carriers.

      +

      grasps: sorted list of suction grasps.

      +

      timestamp: timestamp of the image set the detection ran on.

      +

      return_code: holds possible warnings or error codes and messages.

      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "compute_grasps",
      +  "response": {
      +    "grasps": [
      +      {
      +        "item_uuid": "string",
      +        "max_suction_surface_length": "float64",
      +        "max_suction_surface_width": "float64",
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "pose_frame": "string",
      +        "quality": "float64",
      +        "timestamp": {
      +          "nsec": "int32",
      +          "sec": "int32"
      +        },
      +        "type": "string",
      +        "uuid": "string"
      +      }
      +    ],
      +    "load_carriers": [
      +      {
      +        "height_open_side": "float64",
      +        "id": "string",
      +        "inner_dimensions": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "outer_dimensions": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "overfilled": "bool",
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "pose_frame": "string",
      +        "rim_ledge": {
      +          "x": "float64",
      +          "y": "float64"
      +        },
      +        "rim_step_height": "float64",
      +        "rim_thickness": {
      +          "x": "float64",
      +          "y": "float64"
      +        },
      +        "type": "string"
      +      }
      +    ],
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    },
      +    "timestamp": {
      +      "nsec": "int32",
      +      "sec": "int32"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      compute_grasps (for BoxPick)

      +
      +

      Triggers the detection of rectangles and the computation of grasping poses +for the detected rectangles as described in +Computation of grasps.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_boxpick/services/compute_grasps
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_boxpick/services/compute_grasps
      +
      +
      +
      +
      +
      + +
      +

      Required arguments:

      +
      +

      pose_frame: see Hand-eye calibration.

      +

      item_models: list of item models to be detected. +The type of the item model must be RECTANGLE or TEXTURED_BOX. For type RECTANGLE, rectangle must be filled, +while for TEXTURED_BOX, textured_box must be filled. +See Detection of items (BoxPick) for a detailed description +of the item model types.

      +

      suction_surface_length: length of the suction device grasping surface.

      +

      suction_surface_width: width of the suction device grasping surface.

      +
      +

      Potentially required arguments:

      +
      +
      robot_pose: see Hand-eye calibration.
      +

      Optional arguments:

      +
      +

      load_carrier_id: ID of the load carrier which contains the items to be grasped.

      +

      load_carrier_compartment: compartment inside the load carrier where to compute grasps +(see Load carrier compartments).

      +

      region_of_interest_id: if load_carrier_id is set, +ID of the 3D region of interest where to search for the load carriers. +Otherwise, ID of the 3D region of interest where to compute grasps.

      +

      collision_detection: see Collision checking within other modules.

      +
      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "collision_detection": {
      +      "gripper_id": "string",
      +      "pre_grasp_offset": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      }
      +    },
      +    "item_models": [
      +      {
      +        "rectangle": {
      +          "max_dimensions": {
      +            "x": "float64",
      +            "y": "float64"
      +          },
      +          "min_dimensions": {
      +            "x": "float64",
      +            "y": "float64"
      +          }
      +        },
      +        "textured_box": {
      +          "dimensions": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "dimensions_tolerance_m": "float64",
      +          "max_deformation_m": "float64",
      +          "template_id": "string"
      +        },
      +        "type": "string"
      +      }
      +    ],
      +    "load_carrier_compartment": {
      +      "box": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "pose": {
      +        "orientation": {
      +          "w": "float64",
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "position": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        }
      +      }
      +    },
      +    "load_carrier_id": "string",
      +    "pose_frame": "string",
      +    "region_of_interest_id": "string",
      +    "robot_pose": {
      +      "orientation": {
      +        "w": "float64",
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "position": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      }
      +    },
      +    "suction_surface_length": "float64",
      +    "suction_surface_width": "float64"
      +  }
      +}
      +
      +
      +
      +
      +

      load_carriers: list of detected load carriers.

      +

      items: list of detected rectangles.

      +

      grasps: sorted list of suction grasps.

      +

      timestamp: timestamp of the image set the detection ran on.

      +

      return_code: holds possible warnings or error codes and messages.

      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "compute_grasps",
      +  "response": {
      +    "grasps": [
      +      {
      +        "item_uuid": "string",
      +        "max_suction_surface_length": "float64",
      +        "max_suction_surface_width": "float64",
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "pose_frame": "string",
      +        "quality": "float64",
      +        "timestamp": {
      +          "nsec": "int32",
      +          "sec": "int32"
      +        },
      +        "type": "string",
      +        "uuid": "string"
      +      }
      +    ],
      +    "items": [
      +      {
      +        "grasp_uuids": [
      +          "string"
      +        ],
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "pose_frame": "string",
      +        "rectangle": {
      +          "x": "float64",
      +          "y": "float64"
      +        },
      +        "template_id": "string",
      +        "timestamp": {
      +          "nsec": "int32",
      +          "sec": "int32"
      +        },
      +        "type": "string",
      +        "uuid": "string",
      +        "view_pose_set": "bool",
      +        "view_uuid": "string"
      +      }
      +    ],
      +    "load_carriers": [
      +      {
      +        "height_open_side": "float64",
      +        "id": "string",
      +        "inner_dimensions": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "outer_dimensions": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "overfilled": "bool",
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "pose_frame": "string",
      +        "rim_ledge": {
      +          "x": "float64",
      +          "y": "float64"
      +        },
      +        "rim_step_height": "float64",
      +        "rim_thickness": {
      +          "x": "float64",
      +          "y": "float64"
      +        },
      +        "type": "string"
      +      }
      +    ],
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    },
      +    "timestamp": {
      +      "nsec": "int32",
      +      "sec": "int32"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      set_sorting_strategies

      +
      +

      Persistently stores the sorting strategy for sorting the grasps returned by the compute_grasps service +(see Computation of grasps).

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/<rc_itempick|rc_boxpick>/services/set_sorting_strategies
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/<rc_itempick|rc_boxpick>/services/set_sorting_strategies
      +
      +
      +
      +
      +
      + +
      +

      Only one strategy may have a weight greater than 0. If all weight values are set to 0, the module will use the +default sorting strategy.

      +

      If the weight for direction is set, the +vector must contain the direction vector and pose_frame must be either camera or external.

      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "direction": {
      +      "pose_frame": "string",
      +      "vector": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "weight": "float64"
      +    },
      +    "gravity": {
      +      "weight": "float64"
      +    },
      +    "surface_area": {
      +      "weight": "float64"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "set_sorting_strategies",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      get_sorting_strategies

      +
      +

      Returns the sorting strategy for sorting the grasps returned by the compute-grasps service +(see Computation of grasps).

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/<rc_itempick|rc_boxpick>/services/get_sorting_strategies
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/<rc_itempick|rc_boxpick>/services/get_sorting_strategies
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      All weight values are 0 when the module uses the default sorting strategy.

      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "get_sorting_strategies",
      +  "response": {
      +    "direction": {
      +      "pose_frame": "string",
      +      "vector": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "weight": "float64"
      +    },
      +    "gravity": {
      +      "weight": "float64"
      +    },
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    },
      +    "surface_area": {
      +      "weight": "float64"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      start

      +
      +

      Starts the module. If the command is accepted, the module moves to state RUNNING.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/<rc_itempick|rc_boxpick>/services/start
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/<rc_itempick|rc_boxpick>/services/start
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      The current_state value in the service response may differ from RUNNING if +the state transition is still in process when the service returns.

      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "start",
      +  "response": {
      +    "accepted": "bool",
      +    "current_state": "string"
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      stop

      +
      +

      Stops the module. If the command is accepted, the module moves to state IDLE.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/<rc_itempick|rc_boxpick>/services/stop
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/<rc_itempick|rc_boxpick>/services/stop
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      The current_state value in the service response may differ from IDLE if +the state transition is still in process when the service returns.

      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "stop",
      +  "response": {
      +    "accepted": "bool",
      +    "current_state": "string"
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      reset_defaults

      +
      +

      Resets all parameters of the module to its default values, +as listed in above table. Also resets sorting strategies.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/<rc_itempick|rc_boxpick>/services/reset_defaults
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/<rc_itempick|rc_boxpick>/services/reset_defaults
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "reset_defaults",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      set_region_of_interest (deprecated)

      +
      +

      Persistently stores a 3D region of interest on the rc_visard NG.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +This service is not available in API version 2. +Use set_region_of_interest in rc_roi_db instead.
      +
      +
      PUT http://<host>/api/v1/nodes/<rc_itempick|rc_boxpick>/services/set_region_of_interest
      +
      +
      +
      +
      +
      +
      +
      +
      +

      get_regions_of_interest (deprecated)

      +
      +

      Returns the configured 3D regions of interest with the requested region_of_interest_ids.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +This service is not available in API version 2. +Use get_regions_of_interest in rc_roi_db instead.
      +
      +
      PUT http://<host>/api/v1/nodes/<rc_itempick|rc_boxpick>/services/get_regions_of_interest
      +
      +
      +
      +
      +
      +
      +
      +
      +

      delete_regions_of_interest (deprecated)

      +
      +

      Deletes the configured 3D regions of interest with the requested region_of_interest_ids.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +This service is not available in API version 2. +Use delete_regions_of_interest in rc_roi_db instead.
      +
      +
      PUT http://<host>/api/v1/nodes/<rc_itempick|rc_boxpick>/services/delete_regions_of_interest
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +

      Return codes

      +

      Each service response contains a return_code, +which consists of a value plus an optional message. +A successful service returns with a return_code value of 0. +Negative return_code values indicate that the service failed. +Positive return_code values indicate that the service succeeded with additional information. +The smaller value is selected in case a service has multiple return_code values, +but all messages are appended in the return_code message.

      +

      The following table contains a list of common codes:

      + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table 29 Return codes of the ItemPick and BoxPick services
      CodeDescription
      0Success
      -1An invalid argument was provided
      -3An internal timeout occurred, e.g. during box detection if the given dimension range is too large
      -4Data acquisition took longer than allowed
      -8The template has been deleted during detection.
      -10New element could not be added as the maximum storage capacity of load carriers, regions of interest or template has been exceeded
      -11Sensor not connected, not supported or not ready
      -200Fatal internal error
      -301More than one item model of type UNKNOWN provided to the compute_grasps service
      10The maximum storage capacity of load carriers, regions of interest or templates has been reached
      11An existent persistent model was overwritten by the call to set_load_carrier or set_region_of_interest
      100The requested load carriers were not detected in the scene
      101No valid surfaces or grasps were found in the scene
      102The detected load carrier is empty
      103All computed grasps are in collision with the load carrier
      112Rejected detections of one or more clusters, because min_cluster_coverage was not reached.
      300A valid robot_pose was provided as argument but it is not required
      999Additional hints for application development
      +
      +
      +

      BoxPick Template API

      +

      BoxPick templates are only available with the +Match extension of BoxPick. +For template upload, download, listing and removal, special REST-API endpoints are provided. +Templates can also be uploaded, downloaded and removed via the Web GUI. +The templates include the dimensions, the views and their poses, if set. +Up to 50 templates can be stored persistently on the rc_visard NG.

      +
      +
      +GET /templates/rc_boxpick
      +

      Get list of all rc_boxpick templates.

      +

      Template request

      +
      GET /api/v2/templates/rc_boxpick HTTP/1.1
      +
      +
      +

      Template response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +[
      +  {
      +    "id": "string"
      +  }
      +]
      +
      +
      + +++ + + + + + + + + + +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation (returns array of Template)
      • +
      • 404 Not Found – node not found
      • +
      +
      Referenced Data Models:
        +
      +
      + +
      +
      +GET /templates/rc_boxpick/{id}
      +

      Get a rc_boxpick template. If the requested content-type is application/octet-stream, the template is returned as file.

      +

      Template request

      +
      GET /api/v2/templates/rc_boxpick/<id> HTTP/1.1
      +
      +
      +

      Template response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "id": "string"
      +}
      +
      +
      + +++ + + + + + + + + + + + +
      Parameters:
        +
      • id (string) – id of the template (required)
      • +
      +
      Response Headers:
       
        +
      • Content-Type – application/json application/ubjson application/octet-stream
      • +
      +
      Status Codes:
        +
      • 200 OK – successful operation (returns Template)
      • +
      • 404 Not Found – node or template not found
      • +
      +
      Referenced Data Models:
        +
      +
      + +
      +
      +PUT /templates/rc_boxpick/{id}
      +

      Create or update a rc_boxpick template.

      +

      Template request

      +
      PUT /api/v2/templates/rc_boxpick/<id> HTTP/1.1
      +Accept: multipart/form-data application/json
      +
      +
      +

      Template response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "id": "string"
      +}
      +
      +
      + +++ + + + + + + + + + + + + + + + + + +
      Parameters:
        +
      • id (string) – id of the template (required)
      • +
      +
      Form Parameters:
       
        +
      • file – template file (required)
      • +
      +
      Request Headers:
       
        +
      • Accept – multipart/form-data application/json
      • +
      +
      Response Headers:
        +
      Status Codes: +
      Referenced Data Models:
        +
      +
      + +
      +
      +DELETE /templates/rc_boxpick/{id}
      +

      Remove a rc_boxpick template.

      +

      Template request

      +
      DELETE /api/v2/templates/rc_boxpick/<id> HTTP/1.1
      +Accept: application/json application/ubjson
      +
      +
      + +++ + + + + + + + + + + + +
      Parameters:
        +
      • id (string) – id of the template (required)
      • +
      +
      Request Headers:
       
        +
      • Accept – application/json application/ubjson
      • +
      +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation
      • +
      • 403 Forbidden – forbidden, e.g. because there is no valid license for this module.
      • +
      • 404 Not Found – node or template not found
      • +
      +
      +
      + +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/loadcarrier.html b/v24.04/en/loadcarrier.html new file mode 100644 index 0000000..191a554 --- /dev/null +++ b/v24.04/en/loadcarrier.html @@ -0,0 +1,1775 @@ + + + + + + + + + + + LoadCarrier — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      LoadCarrier

      +
      +

      Introduction

      +

      The LoadCarrier module allows the detection of load carriers, which is usually the first step +when objects or grasp points inside a bin should be found. The models of the load carriers +to be detected have to be defined in the LoadCarrierDB module.

      +

      The LoadCarrier module is an optional on-board module of the rc_visard NG and is licensed with +any of the modules ItemPick and BoxPick or SilhouetteMatch. Otherwise it requires a +separate LoadCarrier +license +to be purchased.

      +
      +
      +

      Detection of load carriers

      +

      The load carrier detection algorithm detects load carriers that match a specific load carrier +model, which must be defined in the LoadCarrierDB module. +The load carrier model is referenced by its ID, which is passed to the load carrier detection. +The detection of a load carrier is based on the detection of its +rectangular rim. For this, it uses lines detected in the left camera image and the +depth values of the load carrier rim. Thus, the rim should form a contrast to the +background and the disparity image must be dense on the rim.

      +

      If multiple load carriers of the specified load carrier ID are visible in the scene, +all of them will be detected and returned by the load carrier detection.

      +

      By default, when assume_gravity_aligned is true and gravity +measurements are available, the algorithm searches for load carriers whose rim planes +are perpendicular to the measured gravity vector. To detect tilted load carriers, +assume_gravity_aligned must be set to false or the load carrier’s approximate +orientation must be specified as pose and the pose_type should be set to +ORIENTATION_PRIOR.

      +

      Load carriers can be detected at a distance of up to 3 meters from the camera.

      +

      When a 3D region of interest (see RoiDB) +is used to limit the volume in which load carriers should be detected, +only the load carriers’ rims must be fully included in the region of interest.

      +

      The detection algorithm returns the poses of the load carriers’ origins +(see Load carrier definition) +in the desired pose frame.

      +

      The detection functionality also determines if the detected load carriers are overfilled, +which means, that objects protrude from the plane defined by the load carrier’s outer part of the rim.

      +
      +_images/itempick_load_carrier_reference_rim_sidebyside.svg +

      Fig. 19 Load carrier models and reference frames

      +
      +
      +
      +

      Detection of filling level

      +

      The LoadCarrier module offers the detect_filling_level +service to compute the filling level of all detected load carriers.

      +

      The load carriers are subdivided into a configurable number of cells in a 2D grid. +The maximum number of cells is 10x10. +For each cell, the following values are reported:

      +
        +
      • level_in_percent: minimum, maximum and mean cell filling level in percent +from the load carrier floor. +These values can be larger than 100% if the cell is overfilled.
      • +
      • level_free_in_meters: minimum, maximum and mean cell free level in meters +from the load carrier rim. These values can be negative if the cell is overfilled.
      • +
      • cell_size: dimensions of the 2D cell in meters.
      • +
      • cell_position: position of the cell center in meters +(either in camera or external frame, see Hand-eye calibration). +The z-coordinate is on the level of the load carrier rim.
      • +
      • coverage: represents the proportion of valid pixels in this cell. +It varies between 0 and 1 with steps of 0.1. +A low coverage indicates that the cell contains several missing data +(i.e. only a few points were actually measured in this cell).
      • +
      +

      These values are also calculated for the whole load carrier itself. +If no cell subdivision is specified, only the overall filling level is computed.

      +
      +_images/itempick_lc_filling_level.png +

      Fig. 20 Visualizations of the load carrier filling level: overall filling level without +grid (left), 4x3 grid (center), 8x8 grid (right). +The load carrier content is shown in a green gradient from white +(on the load carrier floor) to dark green. +The overfilled regions are visualized in red. Numbers indicate cell IDs.

      +
      +
      +
      +

      Interaction with other modules

      +

      Internally, the LoadCarrier module depends on, and interacts with other on-board +modules as listed below.

      +
      +

      Note

      +

      All changes and configuration updates to these modules will affect +the performance of the LoadCarrier module.

      +
      +
      +

      Stereo camera and Stereo matching

      +

      The LoadCarrier module makes internally use of the following data:

      +
        +
      • Rectified images from the Camera module +(rc_camera);
      • +
      • Disparity, error, and confidence images from the Stereo matching module +(rc_stereomatching).
      • +
      +

      All processed images are guaranteed to be captured after the module trigger time.

      +
      +
      +

      IO and Projector Control

      +

      In case the rc_visard NG is used in conjunction with an external random dot +projector and the IO and Projector Control module (rc_iocontrol), it is recommended to connect +the projector to GPIO Out 1 and set the stereo-camera module’s +acquisition mode to SingleFrameOut1 (see Stereo matching +parameters, so that on each +image acquisition trigger an image with and without projector pattern is +acquired.

      +

      Alternatively, the output mode for the GPIO output in use should be set +to ExposureAlternateActive (see Description of run-time parameters).

      +

      In either case, +the Auto Exposure Mode exp_auto_mode should be set to AdaptiveOut1 to optimize the exposure +of both images (see Stereo camera parameters.

      +

      No additional changes are required to use the LoadCarrier module +in combination with a random dot projector.

      +
      +
      +

      Hand-eye calibration

      +

      In case the camera has been calibrated to a robot, the loadcarrier module +can automatically provide poses in the robot coordinate frame. +For the loadcarrier nodes’ Services, the frame of the +output poses can be controlled with the pose_frame argument.

      +

      Two different pose_frame values can be chosen:

      +
        +
      1. Camera frame (camera). +All poses provided by the modules are in the camera frame, +and no prior knowledge about the pose of the camera in the environment is required. +This means that the configured load carriers move with the camera. +It is the user’s responsibility to update the configured poses +if the camera frame moves (e.g. with a robot-mounted camera).
      2. +
      3. External frame (external). +All poses provided by the modules are in the external frame, +configured by the user during the hand-eye calibration process. +The module relies on the on-board +Hand-eye calibration module +to retrieve the sensor mounting (static or robot mounted) and +the hand-eye transformation. +If the mounting is static, no further information is needed. +If the sensor is robot-mounted, the robot_pose is required +to transform poses to and from the external frame.
      4. +
      +
      +

      Note

      +

      If no hand-eye calibration is available, all pose_frame values should be set to camera.

      +
      +

      All pose_frame values that are not camera or external are rejected.

      +
      +
      +
      +

      Parameters

      +

      The LoadCarrier module is called rc_load_carrier +in the REST-API and is represented in the +Web GUI under +Modules ‣ LoadCarrier. +The user can explore and configure the LoadCarrier +module’s run-time parameters, e.g. for development and testing, using the +Web GUI or the REST-API interface.

      +
      +

      Parameter overview

      +

      This module offers the following run-time parameters:

      + + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table 13 The rc_load_carrier module’s run-time parameters
      NameTypeMinMaxDefaultDescription
      assume_gravity_alignedboolfalsetruetrueWhen true, only gravity-aligned load carriers are detected, if gravity measurement is available.
      crop_distancefloat640.00.050.005Safety margin in meters by which the load carrier inner dimensions are reduced to define the region of interest for detection
      min_plausibilityfloat640.00.990.8Indicates how much of the plane surrounding the load carrier rim must be free to count as valid detection
      model_tolerancefloat640.0030.0250.008Indicates how much the estimated load carrier dimensions are allowed to differ from the load carrier model dimensions in meters
      +
      +
      +

      Description of run-time parameters

      +

      Each run-time parameter is represented by a row on the LoadCarrier Settings section +of the Web GUI’s LoadCarrier page under Modules. +The name in the Web GUI is given in brackets behind the parameter name and the parameters are +listed in the order they appear in the Web GUI. The parameters are prefixed with load_carrier_ +when they are used outside the rc_load_carrier module from another detection module +using the REST-API interface.

      +
      +

      assume_gravity_aligned (Assume Gravity Aligned)

      +
      +

      If this parameter is set to true, then only load carriers without tilt will be detected. This can speed up the detection. +If this parameter is set to false, tilted load carriers will also be detected.

      +

      This parameter is ignored for load carriers with an orientation prior.

      +
      +
      +
      +

      model_tolerance (Model Tolerance)

      +
      +

      indicates how much the estimated load carrier dimensions are allowed to differ from the load carrier model dimensions in meters.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_load_carrier/parameters?model_tolerance=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_load_carrier/parameters?model_tolerance=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      crop_distance (Crop Distance)

      +
      +

      sets the safety margin in meters by which the load carrier’s inner dimensions are +reduced to define the region of interest for detection (ref. Fig. 51).

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_load_carrier/parameters?crop_distance=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_load_carrier/parameters?crop_distance=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      min_plausibility (Minimum Plausibility):

      +
      +

      The minimum plausibility defines how much of the plane around the load carrier rim must at least be free to count as valid detection. +Increase the minimal plausibility to reject false positive detections and decrease the value in case a clearly visible load carrier cannot be detected.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_load_carrier/parameters?min_plausibility=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_load_carrier/parameters?min_plausibility=<value>
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +

      Status values

      +

      The LoadCarrier module reports the following status values:

      + + ++++ + + + + + + + + + + + + + + + + +
      Table 14 The rc_load_carrier module’s status values
      NameDescription
      data_acquisition_timeTime in seconds required to acquire image pair
      last_timestamp_processedThe timestamp of the last processed image pair
      load_carrier_detection_timeProcessing time of the last detection in seconds
      +
      +
      +

      Services

      +

      The user can explore and call the LoadCarrier module’s services, +e.g. for development and testing, using the +REST-API interface or +the rc_visard NG +Web GUI on the +LoadCarrier page under Modules.

      +

      The LoadCarrier module offers the following services.

      +
      +

      detect_load_carriers

      +
      +

      Triggers a load carrier detection as described in +Detection of load carriers.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_load_carrier/services/detect_load_carriers
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_load_carrier/services/detect_load_carriers
      +
      +
      +
      +
      +
      + +
      +

      Required arguments:

      +
      +

      pose_frame: see Hand-eye calibration.

      +

      load_carrier_ids: IDs of the load carriers which should be detected. Currently only one ID can be specified.

      +
      +

      Potentially required arguments:

      +
      +
      robot_pose: see Hand-eye calibration.
      +

      Optional arguments:

      +
      +

      region_of_interest_id: ID of the 3D region of interest where to search for the load carriers.

      +

      region_of_interest_2d_id: ID of the 2D region of interest where to search for the load carriers.

      +
      +

      Note

      +

      Only one type of region of interest can be set.

      +
      +
      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "load_carrier_ids": [
      +      "string"
      +    ],
      +    "pose_frame": "string",
      +    "region_of_interest_2d_id": "string",
      +    "region_of_interest_id": "string",
      +    "robot_pose": {
      +      "orientation": {
      +        "w": "float64",
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "position": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      }
      +    }
      +  }
      +}
      +
      +
      +
      +
      +

      load_carriers: list of detected load carriers.

      +

      timestamp: timestamp of the image set the detection ran on.

      +

      return_code: holds possible warnings or error codes and messages.

      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "detect_load_carriers",
      +  "response": {
      +    "load_carriers": [
      +      {
      +        "height_open_side": "float64",
      +        "id": "string",
      +        "inner_dimensions": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "outer_dimensions": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "overfilled": "bool",
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "pose_frame": "string",
      +        "rim_ledge": {
      +          "x": "float64",
      +          "y": "float64"
      +        },
      +        "rim_step_height": "float64",
      +        "rim_thickness": {
      +          "x": "float64",
      +          "y": "float64"
      +        },
      +        "type": "string"
      +      }
      +    ],
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    },
      +    "timestamp": {
      +      "nsec": "int32",
      +      "sec": "int32"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      detect_filling_level

      +
      +

      Triggers a load carrier filling level detection as described in +Detection of filling level.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_load_carrier/services/detect_filling_level
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_load_carrier/services/detect_filling_level
      +
      +
      +
      +
      +
      + +
      +

      Required arguments:

      +
      +

      pose_frame: see Hand-eye calibration.

      +

      load_carrier_ids: IDs of the load carriers which should be detected. Currently only one ID can be specified.

      +
      +

      Potentially required arguments:

      +
      +
      robot_pose: see Hand-eye calibration.
      +

      Optional arguments:

      +
      +

      filling_level_cell_count: Number of cells in the filling level grid.

      +

      region_of_interest_id: ID of the 3D region of interest where to search for the load carriers.

      +

      region_of_interest_2d_id: ID of the 2D region of interest where to search for the load carriers.

      +
      +

      Note

      +

      Only one type of region of interest can be set.

      +
      +
      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "filling_level_cell_count": {
      +      "x": "uint32",
      +      "y": "uint32"
      +    },
      +    "load_carrier_ids": [
      +      "string"
      +    ],
      +    "pose_frame": "string",
      +    "region_of_interest_2d_id": "string",
      +    "region_of_interest_id": "string",
      +    "robot_pose": {
      +      "orientation": {
      +        "w": "float64",
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "position": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      }
      +    }
      +  }
      +}
      +
      +
      +
      +
      +

      load_carriers: list of detected load carriers and their filling levels.

      +

      timestamp: timestamp of the image set the detection ran on.

      +

      return_code: holds possible warnings or error codes and messages.

      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "detect_filling_level",
      +  "response": {
      +    "load_carriers": [
      +      {
      +        "cells_filling_levels": [
      +          {
      +            "cell_position": {
      +              "x": "float64",
      +              "y": "float64",
      +              "z": "float64"
      +            },
      +            "cell_size": {
      +              "x": "float64",
      +              "y": "float64"
      +            },
      +            "coverage": "float64",
      +            "level_free_in_meters": {
      +              "max": "float64",
      +              "mean": "float64",
      +              "min": "float64"
      +            },
      +            "level_in_percent": {
      +              "max": "float64",
      +              "mean": "float64",
      +              "min": "float64"
      +            }
      +          }
      +        ],
      +        "filling_level_cell_count": {
      +          "x": "uint32",
      +          "y": "uint32"
      +        },
      +        "height_open_side": "float64",
      +        "id": "string",
      +        "inner_dimensions": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "outer_dimensions": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "overall_filling_level": {
      +          "cell_position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "cell_size": {
      +            "x": "float64",
      +            "y": "float64"
      +          },
      +          "coverage": "float64",
      +          "level_free_in_meters": {
      +            "max": "float64",
      +            "mean": "float64",
      +            "min": "float64"
      +          },
      +          "level_in_percent": {
      +            "max": "float64",
      +            "mean": "float64",
      +            "min": "float64"
      +          }
      +        },
      +        "overfilled": "bool",
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "pose_frame": "string",
      +        "rim_ledge": {
      +          "x": "float64",
      +          "y": "float64"
      +        },
      +        "rim_step_height": "float64",
      +        "rim_thickness": {
      +          "x": "float64",
      +          "y": "float64"
      +        },
      +        "type": "string"
      +      }
      +    ],
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    },
      +    "timestamp": {
      +      "nsec": "int32",
      +      "sec": "int32"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      reset_defaults

      +
      +

      Restores and applies the default values for this module’s parameters +(“factory reset”).

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_load_carrier/services/reset_defaults
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_load_carrier/services/reset_defaults
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "reset_defaults",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      set_load_carrier (deprecated)

      +
      +

      Persistently stores a load carrier on the rc_visard NG.

      +
      + +
      +This service is not available in API version 2. +Use set_load_carrier +in rc_load_carrier_db instead.
      +
      +

      This service can be called as follows.

      +
      PUT http://<host>/api/v1/nodes/rc_load_carrier/services/set_load_carrier
      +
      +
      +

      The definitions of the request and response are the same as described in +set_load_carrier +in rc_load_carrier_db.

      +
      +
      +
      +
      +
      +

      get_load_carriers (deprecated)

      +
      +

      Returns the configured load carriers with the requested load_carrier_ids.

      +
      + +
      +This service is not available in API version 2. +Use get_load_carriers +in rc_load_carrier_db instead.
      +
      +

      This service can be called as follows.

      +
      PUT http://<host>/api/v1/nodes/rc_load_carrier/services/get_load_carriers
      +
      +
      +

      The definitions of the request and response are the same as described in +get_load_carriers +in rc_load_carrier_db.

      +
      +
      +
      +
      +
      +

      delete_load_carriers (deprecated)

      +
      +

      Deletes the configured load carriers with the requested load_carrier_ids.

      +
      + +
      +This service is not available in API version 2. +Use delete_load_carriers +in rc_load_carrier_db instead.
      +
      +

      This service can be called as follows.

      +
      PUT http://<host>/api/v1/nodes/rc_load_carrier/services/delete_load_carriers
      +
      +
      +

      The definitions of the request and response are the same as described in +delete_load_carriers +in rc_load_carrier_db.

      +
      +
      +
      +
      +
      +

      set_region_of_interest (deprecated)

      +
      +

      Persistently stores a 3D region of interest on the rc_visard NG.

      +
      + +
      +This service is not available in API version 2. +Use set_region_of_interest in rc_roi_db instead.
      +
      +

      This service can be called as follows.

      +
      PUT http://<host>/api/v1/nodes/rc_load_carrier/services/set_region_of_interest
      +
      +
      +

      The definitions of the request and response are the same as described in +set_region_of_interest +in rc_roi_db.

      +
      +
      +
      +
      +
      +

      get_regions_of_interest (deprecated)

      +
      +

      Returns the configured 3D regions of interest with the requested region_of_interest_ids.

      +
      + +
      +This service is not available in API version 2. +Use get_regions_of_interest in rc_roi_db instead.
      +
      +

      This service can be called as follows.

      +
      PUT http://<host>/api/v1/nodes/rc_load_carrier/services/get_regions_of_interest
      +
      +
      +

      The definitions of the request and response are the same as described in +get_regions_of_interest +in rc_roi_db.

      +
      +
      +
      +
      +
      +

      delete_regions_of_interest (deprecated)

      +
      +

      Deletes the configured 3D regions of interest with the requested region_of_interest_ids.

      +
      + +
      +This service is not available in API version 2. +Use delete_regions_of_interest in rc_roi_db instead.
      +
      +

      This service can be called as follows.

      +
      PUT http://<host>/api/v1/nodes/rc_load_carrier/services/delete_regions_of_interest
      +
      +
      +

      The definitions of the request and response are the same as described in +delete_regions_of_interest +in rc_roi_db.

      +
      +
      +
      +
      +
      +

      set_region_of_interest_2d (deprecated)

      +
      +

      Persistently stores a 2D region of interest on the rc_visard NG.

      +
      + +
      +This service is not available in API version 2. +Use set_region_of_interest_2d in rc_roi_db instead.
      +
      +

      This service can be called as follows.

      +
      PUT http://<host>/api/v1/nodes/rc_load_carrier/services/set_region_of_interest_2d
      +
      +
      +

      The definitions of the request and response are the same as described in +set_region_of_interest_2d +in rc_roi_db.

      +
      +
      +
      +
      +
      +

      get_regions_of_interest_2d (deprecated)

      +
      +

      Returns the configured 2D regions of interest with the requested region_of_interest_2d_ids.

      +
      + +
      +This service is not available in API version 2. +Use get_regions_of_interest_2d in rc_roi_db instead.
      +
      +

      This service can be called as follows.

      +
      PUT http://<host>/api/v1/nodes/rc_load_carrier/services/get_region_of_interest_2d
      +
      +
      +

      The definitions of the request and response are the same as described in +get_regions_of_interest_2d +in rc_roi_db.

      +
      +
      +
      +
      +
      +

      delete_regions_of_interest_2d (deprecated)

      +
      +

      Deletes the configured 2D regions of interest with the requested region_of_interest_2d_ids.

      +
      + +
      +This service is not available in API version 2. +Use delete_regions_of_interest_2d in rc_roi_db instead.
      +
      +

      This service can be called as follows.

      +
      PUT http://<host>/api/v1/nodes/rc_load_carrier/services/delete_regions_of_interest_2d
      +
      +
      +

      The definitions of the request and response are the same as described in +delete_regions_of_interest_2d +in rc_roi_db.

      +
      +
      +
      +
      +
      +
      +

      Return codes

      +

      Each service response contains a return_code, +which consists of a value plus an optional message. +A successful service returns with a return_code value of 0. +Negative return_code values indicate that the service failed. +Positive return_code values indicate that the service succeeded with additional information. +The smaller value is selected in case a service has multiple return_code values, +but all messages are appended in the return_code message.

      +

      The following table contains a list of common codes:

      + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table 15 Return codes of the LoadCarrier module’s services
      CodeDescription
      0Success
      -1An invalid argument was provided
      -4Data acquisition took longer than allowed
      -10New element could not be added as the maximum storage capacity of load carriers has been exceeded
      -11Sensor not connected, not supported or not ready
      -302More than one load carrier provided to the detect_load_carriers or detect_filling_level services, but only one is supported
      3The detection timeout during load carrier detection has been reached. Consider reducing the model tolerance.
      10The maximum storage capacity of load carriers has been reached
      11An existent persistent model was overwritten by the call to set_load_carrier
      100The requested load carriers were not detected in the scene
      102The detected load carrier has no points inside
      300A valid robot_pose was provided as argument but it is not required
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/loadcarrier_db.html b/v24.04/en/loadcarrier_db.html new file mode 100644 index 0000000..4a24a01 --- /dev/null +++ b/v24.04/en/loadcarrier_db.html @@ -0,0 +1,1129 @@ + + + + + + + + + + + LoadCarrierDB — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      LoadCarrierDB

      +
      +

      Introduction

      +

      The LoadCarrierDB module (Load carrier database module) allows the global definition of load carriers, +which can then be used in many detection modules. The specified load carriers are available for all +modules supporting load carriers on the rc_visard NG.

      +

      The LoadCarrierDB module is a base module which is available on every rc_visard NG.

      + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table 47 Specifications of the LoadCarrierDB module
      Supported load carrier types4-sided or 3-sided
      Supported rim typessolid rim, stepped rim or ledged rim
      Min. load carrier dimensions0.1 m x 0.1 m x 0.05 m
      Max. load carrier dimensions2 m x 2 m x 2 m
      Max. number of load carriers50
      Load carriers available inItemPick and BoxPick and SilhouetteMatch
      Supported pose typesno pose, orientation prior, exact pose
      Supported reference framescamera, external
      +
      +
      +

      Load carrier definition

      +

      A load carrier (bin) is a container with four walls, a floor and a rectangular rim, +which can contain objects. It can be used to limit the volume in which to search +for objects or grasp points.

      +

      A load carrier is defined by its outer_dimensions and inner_dimensions. +The maximum outer_dimensions are 2.0 meters in every dimension.

      +

      The origin of the load carrier reference frame is in the center of the load carrier’s +outer box and its z axis is perpendicular to the load carrier’s floor +pointing outwards (see Fig. 50).

      +
      +_images/itempick_load_carrier_reference.svg +

      Fig. 50 Load carrier with reference frame and inner and outer dimensions

      +
      +
      +

      Note

      +

      Typically, outer and inner dimensions of a load carrier are available in the +specifications of the load carrier manufacturer.

      +
      +

      The inner volume of the load carrier is defined by its inner dimensions, but includes a region +of 10 cm height above the load carrier, so that also items protruding from the load carrier +are considered for detection or grasp computation. Furthermore, an additional +crop_distance is subtracted from the inner volume in every dimension, which acts as a safety margin and can +be configured as run-time parameter in the LoadCarrier module (see Parameters). +Fig. 51 visualizes the inner volume of a load carrier. Only +points which are inside this volume are considered for detections.

      +
      +_images/load_carrier_inside_volume.svg +

      Fig. 51 Visualization of the inner volume of a load carrier. Only +points which are inside this volume are considered for detections.

      +
      +

      Since the load carrier detection +is based on the detection of the load carrier’s rim, the rim geometry must be specified if it +cannot be determined from the difference between outer and inner dimensions. A load carrier with a stepped rim can be defined by setting a rim_thickness. The rim +thickness gives the thickness of the outer part of the rim in the x and y direction. +When a rim thickness is given, an optional rim_step_height can also be +specified, which gives the height of the step between the outer and the inner part of the rim. +When the step height is given, it will also be considered during collision checking +(see CollisionCheck). Examples of load +carriers with stepped rims are shown in Fig. 52 A, B. +In addition to the rim_thickness and rim_step_height the rim_ledge can be specified +for defining load carriers whose inner rim protrudes into the interior of the load carrier, such as pallet cages. +The rim_ledge gives the thickness of the inner part of the rim in the x and y direction. +An example of a load carrier with a ledged rim is shown in Fig. 52 C.

      +
      +_images/rim_types.svg +

      Fig. 52 Examples of load carriers with stepped rim (A, B) or ledged rim (C)

      +
      +

      The different rim types are applicable to both, standard 4-sided and 3-sided load carriers. For a +3-sided load carrier, the type must be THREE_SIDED. If the type is set to STANDARD or +left empty, a 4-sided load carrier is specified. A 3-sided load carrier has one side that is lower +than the other three sides. This height_open_side is measured from the outer bottom of the load carrier. The open side is at the negative +y-axis of the load carrier’s coordinate system. Examples of the two load carrier types are given +in Fig. 53. The height of the lower side is only considered during +collision checking and not required for the detection of the load carrier.

      +
      +_images/lc_types.svg +

      Fig. 53 Examples of a standard 4-sided load carrier (A) and a 3-sided load carrier (B)

      +
      +

      A load carrier can be specified with a full 3D pose consisting of a position and +an orientation quaternion, given in a pose_frame. Based on the given pose_type +this pose is either used as an orientation prior (pose_type is ORIENTATION_PRIOR or empty), +or as the exact pose of the load carrier (pose_type is EXACT_POSE).

      +

      In case the pose serves as orientation prior, the detected load carrier pose is guaranteed +to have the minimum rotation with respect to the load carrier’s prior pose. This pose type +is useful for detecting tilted load carriers and for resolving the orientation ambiguity in +the x and y direction caused by the symmetry of the load carrier model.

      +

      In case the pose type is set to EXACT_POSE, no load carrier detection will be performed on the scene data, +but the given pose will be used in exactly the same way as if the load carrier is detected at +that pose. This pose type is especially useful in cases where load carriers do not change their positions +and/or are hard to detect (e.g. because their rim is too thin or the material is too shiny).

      +

      The rc_visard NG can persistently store up to 50 different +load carrier models, each one identified by a different id. +The configuration of a load carrier model is normally performed offline, +during the set up the desired application. +This can be done via the REST-API interface or in the rc_visard NG Web GUI.

      +
      +

      Note

      +

      The configured load carrier models +are persistent even over firmware updates and rollbacks.

      +
      +
      +
      +

      Load carrier compartments

      +

      Some detection modules can make use of a load_carrier_compartment to further limit the volume for the detection, +for example ItemPick’s compute_grasps service. +A load carrier compartment is a box whose pose is defined as the transformation from the load carrier reference frame to the compartment +reference frame, which is located in the center of the compartment box (see Fig. 54). +The load carrier compartment is defined for each detection call separately and is not part of the load carrier definition in the +LoadCarrierDB module.

      +
      +_images/itempick_load_carrier_compartment.svg +

      Fig. 54 Sample compartment inside a load carrier. The coordinate frame shown in the image is the +reference frame of the compartment.

      +
      +

      The compartment volume is intersected with the load carrier inner volume to compute the volume for the detection. +If this intersection should also contain the 10 cm region above the load carrier, the height of the compartment box +must be increased accordingly.

      +
      +
      +

      Interaction with other modules

      +

      Internally, the LoadCarrierDB module depends on, and interacts with other on-board +modules as listed below.

      +
      +

      Hand-eye calibration

      +

      In case the camera has been calibrated to a robot, the load carrier’s exact pose +or orientation prior can be provided in the robot coordinate frame by setting the corresponding +pose_frame argument to external.

      +

      Two different pose_frame values can be chosen:

      +
        +
      1. Camera frame (camera). +The load carrier pose or orientation prior is provided in the camera frame, +and no prior knowledge about the pose of the camera in the environment is required. +This means that the configured load carriers move with the camera. +It is the user’s responsibility to update the configured poses +if the camera frame moves (e.g. with a robot-mounted camera).
      2. +
      3. External frame (external). +The load carrier pose or orientation prior is provided in the external frame, +configured by the user during the hand-eye calibration process. +The module relies on the on-board +Hand-eye calibration module +to retrieve the sensor mounting (static or robot mounted) and +the hand-eye transformation.
      4. +
      +
      +

      Note

      +

      If no hand-eye calibration is available, all pose_frame values should be set to camera.

      +
      +

      All pose_frame values that are not camera or external are rejected.

      +
      +
      +
      +

      Services

      +

      The LoadCarrierDB module is called rc_load_carrier_db in the REST-API and is represented in the +Web GUI under +Database ‣ Load Carriers. +The user can explore and call the LoadCarrierDB module’s services, +e.g. for development and testing, using the +REST-API interface or +the Web GUI.

      +

      The LoadCarrierDB module offers the following services.

      +
      +

      set_load_carrier

      +
      +

      Persistently stores a load carrier on the rc_visard NG. +All configured load carriers are persistent over firmware updates and rollbacks.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      PUT http://<host>/api/v2/nodes/rc_load_carrier_db/services/set_load_carrier
      +
      +
      +
      + +
      +

      Details for the definition of the load_carrier type are given in +Load carrier definition.

      +

      The field type is optional and accepts STANDARD and THREE_SIDED.

      +

      The field pose_type is optional and accepts NO_POSE, EXACT_POSE and ORIENTATION_PRIOR.

      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "load_carrier": {
      +      "height_open_side": "float64",
      +      "id": "string",
      +      "inner_dimensions": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "outer_dimensions": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "pose": {
      +        "orientation": {
      +          "w": "float64",
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "position": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        }
      +      },
      +      "pose_frame": "string",
      +      "pose_type": "string",
      +      "rim_ledge": {
      +        "x": "float64",
      +        "y": "float64"
      +      },
      +      "rim_step_height": "float64",
      +      "rim_thickness": {
      +        "x": "float64",
      +        "y": "float64"
      +      },
      +      "type": "string"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "set_load_carrier",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      get_load_carriers

      +
      +

      Returns the configured load carriers with the requested load_carrier_ids. +If no load_carrier_ids are provided, all configured load carriers are returned.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      PUT http://<host>/api/v2/nodes/rc_load_carrier_db/services/get_load_carriers
      +
      +
      +
      + +
      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "load_carrier_ids": [
      +      "string"
      +    ]
      +  }
      +}
      +
      +
      +
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "get_load_carriers",
      +  "response": {
      +    "load_carriers": [
      +      {
      +        "height_open_side": "float64",
      +        "id": "string",
      +        "inner_dimensions": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "outer_dimensions": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "pose_frame": "string",
      +        "pose_type": "string",
      +        "rim_ledge": {
      +          "x": "float64",
      +          "y": "float64"
      +        },
      +        "rim_step_height": "float64",
      +        "rim_thickness": {
      +          "x": "float64",
      +          "y": "float64"
      +        },
      +        "type": "string"
      +      }
      +    ],
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      delete_load_carriers

      +
      +

      Deletes the configured load carriers with the requested load_carrier_ids. +All load carriers to be deleted must be explicitly stated in load_carrier_ids.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      PUT http://<host>/api/v2/nodes/rc_load_carrier_db/services/delete_load_carriers
      +
      +
      +
      + +
      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "load_carrier_ids": [
      +      "string"
      +    ]
      +  }
      +}
      +
      +
      +
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "delete_load_carriers",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +

      Return codes

      +

      Each service response contains a return_code, +which consists of a value plus an optional message. +A successful service returns with a return_code value of 0. +Negative return_code values indicate that the service failed. +Positive return_code values indicate that the service succeeded with additional information. +The smaller value is selected in case a service has multiple return_code values, +but all messages are appended in the return_code message.

      +

      The following table contains a list of common codes:

      + + ++++ + + + + + + + + + + + + + + + + + + + + + + +
      Table 48 Return codes of the LoadCarrierDB module’s services
      CodeDescription
      0Success
      -1An invalid argument was provided
      -10New element could not be added as the maximum storage capacity of load carriers has been exceeded
      10The maximum storage capacity of load carriers has been reached
      11An existent persistent model was overwritten by the call to set_load_carrier
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/maintenance.html b/v24.04/en/maintenance.html new file mode 100644 index 0000000..73cd17f --- /dev/null +++ b/v24.04/en/maintenance.html @@ -0,0 +1,850 @@ + + + + + + + + + + + Maintenance — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Maintenance

      +
      +

      Warning

      +

      The customer does not need to open the rc_visard NG’s housing to perform +maintenance. Unauthorized opening will void the warranty.

      +
      +
      +

      Lens cleaning

      +

      Glass lenses with antireflective coating are used to reduce glare. Please take special +care when cleaning the lenses. To clean them, use a soft lens-cleaning brush to remove +dust or dirt particles. Then use a clean microfiber cloth that is designed to clean lenses, +and gently wipe the lens using a circular motion to avoid scratches that may compromise +the sensor’s performance. For stubborn dirt, high purity isopropanol or a lens cleaning +solution formulated for coated lenses (such as the Uvex Clear family of products) may be used.

      +
      +
      +

      Camera calibration

      +

      The cameras are calibrated during production. Under normal operating conditions, the calibration +will be valid for the life time of the sensor. High impact, such as occurring when dropping +the rc_visard NG, can change the camera’s parameters slightly. In this case, calibration can +be verified and recalibration undertaken via the Web GUI +(see Camera calibration).

      +
      +
      +

      Creating and restoring backups of settings

      +

      The rc_visard NG offers the possibility to download the current settings as backup or for +transferring them to a different rc_visard or rc_cube.

      +

      The current settings of the rc_visard NG can be downloaded on the +Web GUI’s System page +in the rc_visard NG Settings section. They can also be downloaded via the rc_visard NG’s +REST-API interface +using the GET /system/backup request.

      +

      For downloading a backup, the user can choose which settings to include:

      +
        +
      • nodes: the settings of all modules (parameters, preferred orientations and sorting strategies)
      • +
      • load_carriers: the configured load carriers
      • +
      • regions_of_interest: the configured 2D and 3D regions of interest
      • +
      • grippers: the configured grippers (without the CAD elements)
      • +
      +

      The returned backup should be stored as a .json file.

      +

      The templates of the SilhouetteMatch module are not included in the backup but can be +downloaded manually using the REST-API or the Web GUI +(see Template API).

      +

      A backup can be restored to the rc_visard NG on the +Web GUI’s System page +in the rc_visard NG Settings section by uploading the backup .json file. +In the Web GUI the settings included in the backup are shown and can be chosen for restore. +The corresponding REST-API interface +call is POST /system/backup.

      +
      +

      Warning

      +

      When restoring load carriers, all existing load carriers on the rc_visard NG +will get lost and will be replaced by the content of the backup. The same applies to +restoring grippers and regions of interest.

      +
      +

      When restoring a backup, only the settings which are applicable to the rc_visard NG are restored. Parameters +for modules that do not exist on the device or do not have a valid license will be skipped. If a +backup can only be restored partially, the user will be notified by warnings.

      +
      +
      +

      Updating the firmware

      +

      Information about the current firmware image version can be found on the +Web GUI’s System ‣ Firmware & License page. +It can also be accessed via the rc_visard NG’s +REST-API interface +using the GET /system request. Users can use either the Web GUI or the REST-API +to update the firmware.

      +
      +

      Warning

      +

      When upgrading from a version prior to 21.07, all of the software modules’ configured parameters +will be reset to their defaults after a firmware update. Only when upgrading from version 21.07 or higher, +the last saved parameters will be preserved. +Please make sure these settings are persisted on the application-side +or client PC (e.g., using the +REST-API interface) +to request all parameters and store them prior to executing the update.

      +

      The following settings are excluded from this and will be +persisted across a firmware update:

      +
        +
      • the rc_visard NG’s network configuration including an optional static IP address and the +user-specified device name,
      • +
      • the latest result of the Hand-eye calibration, +i.e., recalibrating the rc_visard NG w.r.t. a robot is not required, unless camera mounting +has changed, and
      • +
      +
        +
      • the latest result of the Camera calibration, +i.e., recalibration of the rc_visard’s stereo cameras is not required.
      • +
      +
      +
      +
      Step 1: Download the newest firmware version.
      +

      Firmware updates will be supplied from of a Mender artifact file +identified by its .mender suffix.

      +

      If a new firmware update is available for your rc_visard NG device, the +respective file can be downloaded to a local computer from +https://www.roboception.com/download.

      +
      +
      Step 2: Upload the update file.
      +

      To update with the rc_visard NG’s REST-API, users +may refer to the POST /system/update request.

      +

      To update the firmware via the Web GUI, locate the System ‣ Firmware & License page +and press the “Upload rc_visard NG Update” button. +Select the desired update image file (file extension .mender) +from the local file system and open it to start the update.

      +

      Depending on the network architecture and configuration, the +upload may take several minutes. During the update via the Web GUI, +a progress bar indicates the progress of the upload.

      +
      +

      Note

      +

      Depending on the web browser, the update progress status shown in the progress bar +may indicate the completion of the update too early. Please wait until a notification +window opens, which indicates the end of the update process. +Expect an overall update time of at least five minutes.

      +
      +
      +

      Warning

      +

      Do not close the web browser tab which contains the Web GUI or press the renew +button on this tab, because it will abort the update procedure. In that case, +repeat the update procedure from the beginning.

      +
      +
      +
      Step 3: Reboot the rc_visard NG.
      +

      To apply a firmware update to the rc_visard NG +device, a reboot is required after having uploaded the new image version.

      +
      +

      Note

      +

      The new image version is uploaded to the inactive partition of the rc_visard NG. Only after rebooting +will the inactive partition be activated, and the active partition will become inactive. +If the updated firmware image cannot be loaded, this partition of the rc_visard NG remains inactive and +the previously installed firmware version from the active partition will be used automatically.

      +
      +

      As for the REST-API, the reboot can be performed by the +PUT /system/reboot request.

      +

      After having uploaded the new firmware via the Web GUI, a notification window +is opened, which offers to reboot +the device immediately or to postpone the reboot. To reboot the rc_visard NG +at a later time, use the Reboot button on the Web GUI’s System page.

      +
      +
      Step 4: Confirm the firmware update.
      +

      After rebooting the rc_visard NG, please check the firmware image version +number of the currently active image to make sure that the updated image +was successfully loaded. You can do so either via the +Web GUI’s System ‣ Firmware & License page or via the REST-API’s GET /system/update request.

      +

      Please contact Roboception in case the firmware update could not be applied successfully.

      +
      +
      +
      +
      +

      Restoring the previous firmware version

      +

      After a successful firmware update, the previous firmware image is stored on +the inactive partition of the rc_visard NG and can be restored in case needed. +This procedure is called a rollback.

      +
      +

      Note

      +

      Using the latest firmware as provided +by Roboception is strongly recommended. Hence, rollback functionality should only be +used in case of serious issues with the updated firmware version.

      +
      +

      Rollback functionality is only accessible via the rc_visard NG’s +REST-API interface +using the PUT /system/rollback request. It can be issued +using any HTTP-compatible client or using a web browser as described in +Swagger UI. +Like the update process, the rollback requires a subsequent device reboot +to activate the restored firmware version.

      +
      +
      +

      Rebooting the rc_visard NG

      +

      An rc_visard NG reboot is necessary after updating the firmware or +performing a software rollback. It can be issued either +programmatically, via the rc_visard NG’s +REST-API interface +using the PUT /system/reboot request, or manually on the +Web GUI’s System page.

      +

      The reboot is finished when the LED turns green again.

      +
      +
      +

      Updating the software license

      +

      Licenses that are purchased from Roboception for enabling additional features can be installed +via the Web GUI’s System ‣ Firmware & License page. +The rc_visard NG has to be rebooted to apply the licenses.

      +
      +
      +

      Downloading log files

      +

      During operation, the rc_visard NG logs important information, warnings, and errors into files. If the rc_visard NG exhibits unexpected +or erroneous behavior, the log files can be used to trace its origin. +Log messages can be viewed and filtered using +the Web GUI’s System ‣ Logs page. If contacting the +support (Contact), the log files +are very useful for tracking possible problems. To download them as a .tar.gz file, +click on Download all logs on the Web GUI’s System ‣ Logs page.

      +

      Aside from the Web GUI, the logs are also accessible via the rc_visard NG’s +REST-API interface +using the GET /logs and GET /logs/{log} requests.

      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/modules.html b/v24.04/en/modules.html new file mode 100644 index 0000000..caa5156 --- /dev/null +++ b/v24.04/en/modules.html @@ -0,0 +1,690 @@ + + + + + + + + + + + Software modules — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Software modules

      +

      The rc_visard NG comes with several on-board software modules, each of which +corresponds to a certain functionality and can be interfaced via its respective +node in the REST-API interface.

      +

      The rc_visard NG’s software modules can be divided into

      + +
        +
      • +
        Detection modules
        +
        which provide a variety of detection functionalities, such as grasp point computation and object detection,
        +
        +
      • +
      • +
        Configuration modules
        +
        which enable the user to perform calibrations and configure the rc_visard NG for specific applications.
        +
        +
      • +
      +
        +
      • +
        Database modules
        +
        which enable the user to configure global data available to all other modules, such as load carriers, regions +of interest and grippers.
        +
        +
      • +
      +
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/navigation_modules.html b/v24.04/en/navigation_modules.html new file mode 100644 index 0000000..8323850 --- /dev/null +++ b/v24.04/en/navigation_modules.html @@ -0,0 +1,680 @@ + + + + + + + + + + + Navigation modules — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + +
        + +
      • rc_visard NG >
      • + +
      • Navigation modules
      • + + +
      • + + + +
      • + +
      + + +
      +
      +
      +
      + + + + +
      +
      + +
      +
      +
      + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/objects.inv b/v24.04/en/objects.inv new file mode 100644 index 0000000..e8d15d9 Binary files /dev/null and b/v24.04/en/objects.inv differ diff --git a/v24.04/en/opc_ua.html b/v24.04/en/opc_ua.html new file mode 100644 index 0000000..714ff4d --- /dev/null +++ b/v24.04/en/opc_ua.html @@ -0,0 +1,663 @@ + + + + + + + + + + + OPC UA interface — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      OPC UA interface

      +

      The rc_visard NG also offers an optional OPC UA interface. +The OPC UA server can be activated via license update.

      +

      The OPC UA server uses the DataTypeDefinition attribute (available in OPC UA version 1.04) for custom datatypes and also uses methods and variable length arrays. +Please check if your OPC UA client supports this.

      +

      Please contact support@roboception.de if you are interested in using the OPC UA server.

      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/pipelines.html b/v24.04/en/pipelines.html new file mode 100644 index 0000000..da514aa --- /dev/null +++ b/v24.04/en/pipelines.html @@ -0,0 +1,744 @@ + + + + + + + + + + + Camera pipelines — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Camera pipelines

      +

      The rc_visard NG supports multiple cameras at the same time. For this, it offers up to four +camera pipelines that can be configured by the user.

      +

      A camera pipeline contains several software modules which are responsible for +acquiring data of the camera connected to that pipeline, performing detections or +configuring modules used in this pipeline, e.g. by hand-eye calibration.

      +

      The rc_visard NG supports cameras of type rc_visard, rc_viscore and blaze. +The type of the corresponding camera pipeline has to be configured to match +the connected device.

      +
      +

      Configuration of camera pipelines

      +

      The camera pipelines can be configured via the Web GUI +under System ‣ Camera Pipelines. This page shows the running pipelines with their +types and the connected devices.

      +
      +images/webgui_pipelines.png +

      Example of the Camera Pipelines page on an rc_cube with two running pipelines of type rc_visard

      +
      +

      Clicking on Configure Camera Pipelines allows to configure the number and type of running pipelines +as shown in the next figure.

      +
      +

      Note

      +

      The rc_cube I provides four camera pipelines, the rc_cube S two.

      +
      +
      +images/webgui_pipelines_configure.png +

      Configuring the camera pipelines

      +
      +

      The type of a running pipeline can be changed by selecting a different type in the drop down field. +A running pipeline can be removed by clicking Remove Pipeline. Only pipeline 0 can never be removed, because +this is the primary pipeline. +Clicking on + Add Pipeline allows to choose the type for the new pipeline and creates a +new pipeline of the chosen type. +Once the pipelines are configured as desired, clicking Apply Changes & Reboot will apply the new configuration +and immediately reboot the rc_cube.

      +
      +
      +

      Configuration of connected cameras

      +

      A pipeline of a certain type can only discover devices of the same type. That means, a pipeline of type rc_visard can only +connect to an rc_visard. In case multiple cameras of the same type are connected to the rc_cube, the user can set a device +filter to choose a specific camera for each pipeline. The current device filter value is displayed for each running pipeline +as shown in fig-pipelines-running. By default, the device filter is set to *, which means that any device +matching the pipeline type will automatically be connected, but only if there is a unique match. Otherwise, no camera will be +connected to that pipeline and an error will be shown.

      +

      To adjust the device filter and select the camera to be connected to a pipeline, +click on Configure Camera Connection on the Camera Pipelines page, +or select the corresponding pipeline in the menu, e.g. under System ‣ Camera Pipelines ‣ Pipeline 1. +This will show the current device filter value and more information about the connected +camera.

      +
      +images/webgui_pipeline.png +

      Configuring the camera connection of pipeline 1

      +
      +

      Clicking Choose Camera opens a dialog to edit the device filter.

      +
      +images/webgui_choose_camera.png +

      Choosing the camera by setting a device filter

      +
      +

      This dialog also shows a list of all discovered devices matching the pipeline +type and highlights the ones that match the current value entered for the device filter. +It also indicates if the devices are already in use in a different pipeline. +Device filters can be selected by clicking on an Interface, Name or Serial +of the desired device in the list. The following table shows possible device filter values.

      + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Possible device filter values
      Device filterDescription
      *selects any device matching the pipeline type
      sensor<n>:*selects any device connected via the sensor<n> interface that matches the pipeline type
      <name>selects the device by the user-defined name
      <serial>selects the device by the full serial number
      sensor<n>:<serial>selects the device connected via the sensor<n> interface with the given serial
      sensor<n>:<name>selects the device connected via the sensor<n> interface with the given user-defined name
       if empty, no camera will be connected
      +

      By pressing Save, the entered device filter is applied and a camera matching the device filter is connected to +this pipeline, if possible. Changing the device filter does not require a reboot of the rc_cube.

      +
      +
      + + +
      +
      + +
      +
      +
      + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/pose_format_abb.html b/v24.04/en/pose_format_abb.html new file mode 100644 index 0000000..d8dd2dd --- /dev/null +++ b/v24.04/en/pose_format_abb.html @@ -0,0 +1,660 @@ + + + + + + + + + + + ABB pose format — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      ABB pose format

      +

      ABB robots use a position and a quaternion for describing a pose, like rc_visard NG +devices. There is no conversion of the orientation needed.

      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/pose_format_fanuc.html b/v24.04/en/pose_format_fanuc.html new file mode 100644 index 0000000..cd97ade --- /dev/null +++ b/v24.04/en/pose_format_fanuc.html @@ -0,0 +1,690 @@ + + + + + + + + + + + FANUC XYZ-WPR format — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      FANUC XYZ-WPR format

      +

      The pose format that is used by FANUC robots consists of a position \(XYZ\) +in millimeters and an orientation \(WPR\) that is given by three angles in +degrees, with \(W\) rotating around \(x\)-axis, \(P\) rotating +around \(y\)-axis and \(R\) rotating around \(z\)-axis. The +rotation order is \(x\)-\(y\)-\(z\) and computed by \(r_z(R) +r_y(P) r_x(W)\).

      +
      +

      Conversion from FANUC-WPR to quaternion

      +

      The conversion from the \(WPR\) angles in degrees to a quaternion +\(q=(\begin{array}{cccc}x & y & z & w\end{array})\) can be done by +first converting all angles to radians

      +
      +\[\begin{split}W_r = W \frac{\pi}{180} \text{,} \\ +P_r = P \frac{\pi}{180} \text{,} \\ +R_r = R \frac{\pi}{180} \text{,} \\\end{split}\]
      +

      and then calculating the quaternion with

      +
      +\[\begin{split}x = \cos{(R_r/2)}\cos{(P_r/2)}\sin{(W_r/2)} - \sin{(R_r/2)}\sin{(P_r/2)}\cos{(W_r/2)} \text{,} \\ +y = \cos{(R_r/2)}\sin{(P_r/2)}\cos{(W_r/2)} + \sin{(R_r/2)}\cos{(P_r/2)}\sin{(W_r/2)} \text{,} \\ +z = \sin{(R_r/2)}\cos{(P_r/2)}\cos{(W_r/2)} - \cos{(R_r/2)}\sin{(P_r/2)}\sin{(W_r/2)} \text{,} \\ +w = \cos{(R_r/2)}\cos{(P_r/2)}\cos{(W_r/2)} + \sin{(R_r/2)}\sin{(P_r/2)}\sin{(W_r/2)} \text{.}\end{split}\]
      +
      +
      +

      Conversion from quaternion to FANUC-WPR

      +

      The conversion from a quaternion \(q=(\begin{array}{cccc}x & y & z & +w\end{array})\) with \(||q||=1\) to the \(WPR\) angles in degrees can +be done as follows.

      +
      +\[\begin{split}R &= \text{atan}_2{(2(wz + xy), 1 - 2(y^2 + z^2))} \frac{180}{\pi} \\ +P &= \text{asin}{(2(wy - zx))} \frac{180}{\pi} \\ +W &= \text{atan}_2{(2(wx + yz), 1 - 2(x^2 + y^2))} \frac{180}{\pi}\end{split}\]
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/pose_format_franka_emika.html b/v24.04/en/pose_format_franka_emika.html new file mode 100644 index 0000000..ed16529 --- /dev/null +++ b/v24.04/en/pose_format_franka_emika.html @@ -0,0 +1,741 @@ + + + + + + + + + + + Franka Emika Pose Format — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Franka Emika Pose Format

      +

      Franka Emika robots use a transformation matrix \(T\) to define a pose. +A transformation matrix combines a rotation matrix \(R\) and a translation vector +\(t=(\begin{array}{cccc}x & y & z\end{array})^T\).

      +
      +\[\begin{split}T = \left(\begin{array}{cccc} + r_{00} & r_{01} & r_{02} & x\\ + r_{10} & r_{11} & r_{12} & y\\ + r_{20} & r_{21} & r_{22} & z\\ + 0 & 0 & 0 & 1 +\end{array}\right)\end{split}\]
      +

      The pose given by Franka Emika’s “Measure Pose” App consists of a translation \(x, y, z\) +in millimeters and a rotation \(x, y, z\) in degrees. The rotation convention is +\(z\)-\(y'\)-\(x''\) (i.e. \(x\)-\(y\)-\(z\)) and is +computed by \(r_z(z) r_y(y) r_x(x).\)

      +
      +

      Conversion from transformation matrix to quaternion

      +

      The conversion from a rotation matrix (with \(det(R)=1\)) to a quaternion +\(q=(\begin{array}{cccc}q_x & q_y & q_z & q_w \end{array})\) can be done as follows:

      +
      +\[\begin{split}q_x &= \text{sign}(r_{21}-r_{12}) \frac{1}{2}\sqrt{\text{max}(0, 1 + r_{00} - r_{11} - r_{22})} \\ +q_y &= \text{sign}(r_{02}-r_{20}) \frac{1}{2}\sqrt{\text{max}(0, 1 - r_{00} + r_{11} - r_{22})} \\ +q_z &= \text{sign}(r_{10}-r_{01}) \frac{1}{2}\sqrt{\text{max}(0, 1 - r_{00} - r_{11} + r_{22})} \\ +q_w &= \frac{1}{2}\sqrt{\text{max}(0, 1 + r_{00} + r_{11} + r_{22})}\end{split}\]
      +

      The \(\text{sign}\) operator returns -1 if the argument is negative. +Otherwise, 1 is returned. It is used to recover the sign for the square root. +The \(\text{max}\) function ensures that the argument of the square root +function is not negative, which can happen in practice due to round-off errors.

      +
      +
      +

      Conversion from Rotation-XYZ to quaternion

      +

      The conversion from the \(x, y, z\) angles in degrees to a quaternion +\(q=(\begin{array}{cccc}q_x & q_y & q_z & q_w\end{array})\) can be done by +first converting all angles to radians

      +
      +\[\begin{split}X_r = x \frac{\pi}{180} \text{,} \\ +Y_r = y \frac{\pi}{180} \text{,} \\ +Z_r = z \frac{\pi}{180} \text{,} \\\end{split}\]
      +

      and then calculating the quaternion with

      +
      +\[\begin{split}q_x = \cos{(Z_r/2)}\cos{(Y_r/2)}\sin{(X_r/2)} - \sin{(Z_r/2)}\sin{(Y_r/2)}\cos{(X_r/2)} \text{,} \\ +q_y = \cos{(Z_r/2)}\sin{(Y_r/2)}\cos{(X_r/2)} + \sin{(Z_r/2)}\cos{(Y_r/2)}\sin{(X_r/2)} \text{,} \\ +q_z = \sin{(Z_r/2)}\cos{(Y_r/2)}\cos{(X_r/2)} - \cos{(Z_r/2)}\sin{(Y_r/2)}\sin{(X_r/2)} \text{,} \\ +q_w = \cos{(Z_r/2)}\cos{(Y_r/2)}\cos{(X_r/2)} + \sin{(Z_r/2)}\sin{(Y_r/2)}\sin{(X_r/2)} \text{.}\end{split}\]
      +
      +
      +

      Conversion from quaternion and translation to transformation

      +

      The conversion from a quaternion \(q=(\begin{array}{cccc}q_x & q_y & q_z & +q_w\end{array})\) and a translation vector \(t=(\begin{array}{cccc}x & y & z\end{array})^T\) +to a transformation matrix \(T\) can be done as follows:

      +
      +\[\begin{split}T = \left(\begin{array}{cccc} + 1 - 2s(q_y^2+q_z^2) & 2s(q_x q_y-q_z q_w) & 2s(q_x q_z+q_y q_w) & x\\ + 2s(q_x q_y+q_z q_w) & 1 - 2s(q_x^2+q_z^2) & 2s(q_y q_z-q_x q_w) & y\\ + 2s(q_x q_z-q_y q_w) & 2s(q_y q_z+q_x q_w) & 1 - 2s(q_x^2+q_y^2) & z\\ + 0 & 0 & 0 & 1 +\end{array}\right)\end{split}\]
      +

      where \(s=||q||^{-2}=\frac{1}{q_x^2+q_y^2+q_z^2+q_w^2}\) and \(s=1\) if +\(q\) is a unit quaternion.

      +
      +
      +

      Conversion from quaternion to Rotation-XYZ

      +

      The conversion from a quaternion \(q=(\begin{array}{cccc}q_x & q_y & q_z & +q_w\end{array})\) with \(||q||=1\) to the \(x, y, z\) angles in degrees can +be done as follows.

      +
      +\[\begin{split}x &= \text{atan}_2{(2(q_w q_z + q_x q_y), 1 - 2(q_y^2 + q_z^2))} \frac{180}{\pi} \\ +y &= \text{asin}{(2(q_w q_y - q_z q_x))} \frac{180}{\pi} \\ +z &= \text{atan}_2{(2(q_w q_x + q_y q_z), 1 - 2(q_x^2 + q_y^2))} \frac{180}{\pi}\end{split}\]
      +
      +
      +

      Pose representation in RaceCom messages and state machines

      +

      In RaceCom messages and in state machines a pose is usually defined as +one-dimensional array of 16 float values, representing the transformation matrix +in column-major order. The indices of the matrix entries below correspond to the +array indices

      +
      +\[\begin{split}T = \left(\begin{array}{cccc} + a_0 & a_4 & a_8 & a_{12}\\ + a_1 & a_5 & a_9 & a_{13}\\ + a_2 & a_6 & a_{10} & a_{14}\\ + a_3 & a_7 & a_{11} & a_{15} +\end{array}\right)\end{split}\]
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/pose_format_fruitcore_horst.html b/v24.04/en/pose_format_fruitcore_horst.html new file mode 100644 index 0000000..ac62221 --- /dev/null +++ b/v24.04/en/pose_format_fruitcore_horst.html @@ -0,0 +1,660 @@ + + + + + + + + + + + Fruitcore HORST pose format — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Fruitcore HORST pose format

      +

      Fruitcore HORST robots use a position in meters and a quaternion with \(q_0 = w\), \(q_1 = x\), \(q_2 = y\) and \(q_3 = z\) for describing a pose, like rc_visard NG +devices. There is no conversion needed.

      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/pose_format_kawasaki.html b/v24.04/en/pose_format_kawasaki.html new file mode 100644 index 0000000..f78a928 --- /dev/null +++ b/v24.04/en/pose_format_kawasaki.html @@ -0,0 +1,702 @@ + + + + + + + + + + + Kawasaki XYZ-OAT format — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Kawasaki XYZ-OAT format

      +

      The pose format that is used by Kawasaki robots consists of a position +\(XYZ\) in millimeters and an orientation \(OAT\) that is given by three angles in +degrees, with \(O\) rotating around \(z\) axis, \(A\) rotating +around the rotated \(y\) axis and \(T\) rotating around the rotated +\(z\) axis. The rotation convention is \(z\)-\(y'\)-\(z''\) +(i.e. \(z\)-\(y\)-\(z\)) and computed by \(r_z(O) r_y(A) +r_z(T)\).

      +
      +

      Conversion from Kawasaki-OAT to quaternion

      +

      The conversion from the \(OAT\) angles in degrees to a quaternion +\(q=(\begin{array}{cccc}x & y & z & w\end{array})\) can be done by first +converting all angles to radians

      +
      +\[\begin{split}O_r = O \frac{\pi}{180} \text{,} \\ +A_r = A \frac{\pi}{180} \text{,} \\ +T_r = T \frac{\pi}{180} \text{,} \\\end{split}\]
      +

      and then calculating the quaternion with

      +
      +\[\begin{split}x = \cos{(O_r/2)}\sin{(A_r/2)}\sin{(T_r/2)} - \sin{(O_r/2)}\sin{(A_r/2)}\cos{(T_r/2)} \text{,} \\ +y = \cos{(O_r/2)}\sin{(A_r/2)}\cos{(T_r/2)} + \sin{(O_r/2)}\sin{(A_r/2)}\sin{(T_r/2)} \text{,} \\ +z = \sin{(O_r/2)}\cos{(A_r/2)}\cos{(T_r/2)} + \cos{(O_r/2)}\cos{(A_r/2)}\sin{(T_r/2)} \text{,} \\ +w = \cos{(O_r/2)}\cos{(A_r/2)}\cos{(T_r/2)} - \sin{(O_r/2)}\cos{(A_r/2)}\sin{(T_r/2)} \text{.}\end{split}\]
      +
      +
      +

      Conversion from quaternion to Kawasaki-OAT

      +

      The conversion from a quaternion \(q=(\begin{array}{cccc}x & y & z & +w\end{array})\) with \(||q||=1\) to the \(OAT\) angles in degrees can +be done as follows.

      +

      If \(x = 0\) and \(y = 0\) the conversion is

      +
      +\[\begin{split}O &= \text{atan}_2{(2(z - w), 2(z + w))} \frac{180}{\pi} \\ +A &= \text{acos}{(w^2 + z^2)} \frac{180}{\pi} \\ +T &= \text{atan}_2{(2(z + w), 2(w - z))} \frac{180}{\pi}\end{split}\]
      +

      If \(z = 0\) and \(w = 0\) the conversion is

      +
      +\[\begin{split}O &= \text{atan}_2{(2(y - x), 2(x + y))} \frac{180}{\pi} \\ +A &= \text{acos}{(-1.0)} \frac{180}{\pi} \\ +T &= \text{atan}_2{(2(y + x), 2(y - x))} \frac{180}{\pi}\end{split}\]
      +

      In all other cases the conversion is

      +
      +\[\begin{split}O &= \text{atan}_2{(2(yz - wx), 2(xz + wy))} \frac{180}{\pi} \\ +A &= \text{acos}{(w^2 - x^2 - y^2 + z^2)} \frac{180}{\pi} \\ +T &= \text{atan}_2{(2(yz + wx), 2(wy - xz))} \frac{180}{\pi}\end{split}\]
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/pose_format_kuka.html b/v24.04/en/pose_format_kuka.html new file mode 100644 index 0000000..10a0cf6 --- /dev/null +++ b/v24.04/en/pose_format_kuka.html @@ -0,0 +1,690 @@ + + + + + + + + + + + KUKA XYZ-ABC format — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      KUKA XYZ-ABC format

      +

      KUKA robots use the so called XYZ-ABC format. \(XYZ\) is the position in +millimeters. \(ABC\) are angles in degrees, with \(A\) rotating around +\(z\) axis, \(B\) rotating around \(y\) axis and \(C\) rotating +around \(x\) axis. The rotation convention is +\(z\)-\(y'\)-\(x''\) (i.e. \(x\)-\(y\)-\(z\)) and +computed by \(r_z(A) r_y(B) r_x(C)\).

      +
      +

      Conversion from KUKA-ABC to quaternion

      +

      The conversion from the \(ABC\) angles in degrees to a quaternion +\(q=(\begin{array}{cccc}x & y & z & w\end{array})\) can be done by first +converting all angles to radians

      +
      +\[\begin{split}A_r = A \frac{\pi}{180} \text{,} \\ +B_r = B \frac{\pi}{180} \text{,} \\ +C_r = C \frac{\pi}{180} \text{,} \\\end{split}\]
      +

      and then calculating the quaternion with

      +
      +\[\begin{split}x = \cos{(A_r/2)}\cos{(B_r/2)}\sin{(C_r/2)} - \sin{(A_r/2)}\sin{(B_r/2)}\cos{(C_r/2)} \text{,} \\ +y = \cos{(A_r/2)}\sin{(B_r/2)}\cos{(C_r/2)} + \sin{(A_r/2)}\cos{(B_r/2)}\sin{(C_r/2)} \text{,} \\ +z = \sin{(A_r/2)}\cos{(B_r/2)}\cos{(C_r/2)} - \cos{(A_r/2)}\sin{(B_r/2)}\sin{(C_r/2)} \text{,} \\ +w = \cos{(A_r/2)}\cos{(B_r/2)}\cos{(C_r/2)} + \sin{(A_r/2)}\sin{(B_r/2)}\sin{(C_r/2)} \text{.}\end{split}\]
      +
      +
      +

      Conversion from quaternion to KUKA-ABC

      +

      The conversion from a quaternion \(q=(\begin{array}{cccc}x & y & z & +w\end{array})\) with \(||q||=1\) to the \(ABC\) angles in degrees can +be done as follows.

      +
      +\[\begin{split}A &= \text{atan}_2{(2(wz + xy), 1 - 2(y^2 + z^2))} \frac{180}{\pi} \\ +B &= \text{asin}{(2(wy - zx))} \frac{180}{\pi} \\ +C &= \text{atan}_2{(2(wx + yz), 1 - 2(x^2 + y^2))} \frac{180}{\pi}\end{split}\]
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/pose_format_mitsubishi.html b/v24.04/en/pose_format_mitsubishi.html new file mode 100644 index 0000000..39d249b --- /dev/null +++ b/v24.04/en/pose_format_mitsubishi.html @@ -0,0 +1,688 @@ + + + + + + + + + + + Mitsubishi XYZ-ABC format — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Mitsubishi XYZ-ABC format

      +

      The pose format that is used by Mitsubishi robots is the same as that for KUKA robots +(see KUKA XYZ-ABC format), +except that \(A\) is a rotation around \(x\) axis and \(C\) is a rotation +around \(z\) axis. Thus, the rotation is computed by \(r_z(C) r_y(B) r_x(A)\).

      +
      +

      Conversion from Mitsubishi-ABC to quaternion

      +

      The conversion from the \(ABC\) angles in degrees to a quaternion +\(q=(\begin{array}{cccc}x & y & z & w\end{array})\) can be done by first +converting all angles to radians

      +
      +\[\begin{split}A_r = A \frac{\pi}{180} \text{,} \\ +B_r = B \frac{\pi}{180} \text{,} \\ +C_r = C \frac{\pi}{180} \text{,} \\\end{split}\]
      +

      and then calculating the quaternion with

      +
      +\[\begin{split}x = \cos{(C_r/2)}\cos{(B_r/2)}\sin{(A_r/2)} - \sin{(C_r/2)}\sin{(B_r/2)}\cos{(A_r/2)} \text{,} \\ +y = \cos{(C_r/2)}\sin{(B_r/2)}\cos{(A_r/2)} + \sin{(C_r/2)}\cos{(B_r/2)}\sin{(A_r/2)} \text{,} \\ +z = \sin{(C_r/2)}\cos{(B_r/2)}\cos{(A_r/2)} - \cos{(C_r/2)}\sin{(B_r/2)}\sin{(A_r/2)} \text{,} \\ +w = \cos{(C_r/2)}\cos{(B_r/2)}\cos{(A_r/2)} + \sin{(C_r/2)}\sin{(B_r/2)}\sin{(A_r/2)} \text{.}\end{split}\]
      +
      +
      +

      Conversion from quaternion to Mitsubishi-ABC

      +

      The conversion from a quaternion \(q=(\begin{array}{cccc}x & y & z & +w\end{array})\) with \(||q||=1\) to the \(ABC\) angles in degrees can +be done as follows.

      +
      +\[\begin{split}A &= \text{atan}_2{(2(wx + yz), 1 - 2(x^2 + y^2))} \frac{180}{\pi} \\ +B &= \text{asin}{(2(wy - zx))} \frac{180}{\pi} \\ +C &= \text{atan}_2{(2(wz + xy), 1 - 2(y^2 + z^2))} \frac{180}{\pi}\end{split}\]
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/pose_format_rt.html b/v24.04/en/pose_format_rt.html new file mode 100644 index 0000000..c2ddfcc --- /dev/null +++ b/v24.04/en/pose_format_rt.html @@ -0,0 +1,700 @@ + + + + + + + + + + + Rotation matrix and translation vector — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Rotation matrix and translation vector

      +

      A pose can also be defined by a rotation matrix \(R\) and a translation +vector \(T\).

      +
      +\[\begin{split}R = \left(\begin{array}{ccc} + r_{00} & r_{01} & r_{02} \\ + r_{10} & r_{11} & r_{12} \\ + r_{20} & r_{21} & r_{22} +\end{array}\right), \qquad +T = \left(\begin{array}{c} + X \\ + Y \\ + Z +\end{array}\right).\end{split}\]
      +

      The pose transformation can be applied to a point \(P\) by

      +
      +\[P' = R P + T.\]
      +
      +

      Conversion from rotation matrix to quaternion

      +

      The conversion from a rotation matrix (with \(det(R)=1\)) to a quaternion +\(q=(\begin{array}{cccc}x & y & z & w\end{array})\) can be done as follows.

      +
      +\[\begin{split}x &= \text{sign}(r_{21}-r_{12}) \frac{1}{2}\sqrt{\text{max}(0, 1 + r_{00} - r_{11} - r_{22})} \\ +y &= \text{sign}(r_{02}-r_{20}) \frac{1}{2}\sqrt{\text{max}(0, 1 - r_{00} + r_{11} - r_{22})} \\ +z &= \text{sign}(r_{10}-r_{01}) \frac{1}{2}\sqrt{\text{max}(0, 1 - r_{00} - r_{11} + r_{22})} \\ +w &= \frac{1}{2}\sqrt{\text{max}(0, 1 + r_{00} + r_{11} + r_{22})}\end{split}\]
      +

      The \(\text{sign}\) operator returns -1 if the argument is negative. +Otherwise, 1 is returned. It is used to recover the sign for the square root. +The \(\text{max}\) function ensures that the argument of the square root +function is not negative, which can happen in practice due to round-off errors.

      +
      +
      +

      Conversion from quaternion to rotation matrix

      +

      The conversion from a quaternion \(q=(\begin{array}{cccc}x & y & z & +w\end{array})\) with \(||q||=1\) to a rotation matrix can be done as +follows.

      +
      +\[\begin{split}R = 2 \left(\begin{array}{ccc} + \frac{1}{2} - y^2 - z^2 & x y - z w & x z + y w \\ + x y + z w & \frac{1}{2} - x^2 - z^2 & y z - x w \\ + x z - y w & y z + x w & \frac{1}{2} - x^2 - y^2 +\end{array}\right)\end{split}\]
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/pose_format_ur.html b/v24.04/en/pose_format_ur.html new file mode 100644 index 0000000..3b45fa6 --- /dev/null +++ b/v24.04/en/pose_format_ur.html @@ -0,0 +1,697 @@ + + + + + + + + + + + Universal Robots pose format — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Universal Robots pose format

      +

      The pose format that is used by Universal Robots consists of a position +\(XYZ\) in millimeters and an orientation in angle-axis format +\(V=(\begin{array}{ccc}RX & RY & RZ\end{array})^T\). The rotation angle +\(\theta\) in radians is the length of the rotation axis \(U\).

      +
      +\[\begin{split}V = \left(\begin{array}{c}RX \\ RY \\ RZ\end{array}\right) = \left(\begin{array}{c}\theta u_x \\ \theta u_y \\ \theta u_z\end{array}\right)\end{split}\]
      +

      \(V\) is called a rotation vector.

      +
      +

      Conversion from angle-axis format to quaternion

      +

      The conversion from a rotation vector \(V\) to a quaternion +\(q=(\begin{array}{cccc}x & y & z & w\end{array})\) can be done as +follows.

      +

      We first recover the angle \(\theta\) in radians from the rotation vector +\(V\) by

      +
      +\[\theta = \sqrt{RX^2 + RY^2 + RZ^2}\text{.}\]
      +

      If \(\theta = 0\), then the quaternion is \(q=(\begin{array}{cccc}0 & 0 & 0 & 1\end{array})\), +otherwise it is

      +
      +\[\begin{split}x = RX \frac{\sin(\theta/2)}{\theta}\text{,} \\ +y = RY \frac{\sin(\theta/2)}{\theta}\text{,} \\ +z = RZ \frac{\sin(\theta/2)}{\theta}\text{,} \\ +w = \cos(\theta/2)\text{.}\end{split}\]
      +
      +
      +

      Conversion from quaternion to angle-axis format

      +

      The conversion from a quaternion \(q=(\begin{array}{cccc}x & y & z & +w\end{array})\) with \(||q||=1\) to a rotation vector in angle-axis form +can be done as follows.

      +

      We first recover the angle \(\theta\) in radians from the quaternion by

      +
      +\[\theta = 2\cdot\text{acos}(w)\text{.}\]
      +

      If \(\theta = 0\), then the rotation vector is \(V=(\begin{array}{ccc}0 & 0 & 0\end{array})^T\), +otherwise it is

      +
      +\[\begin{split}RX = \theta \frac{x}{\sqrt{1-w^2}}\text{,} \\ +RY = \theta \frac{y}{\sqrt{1-w^2}}\text{,} \\ +RZ = \theta \frac{z}{\sqrt{1-w^2}}\text{.}\end{split}\]
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/pose_format_yaskawa.html b/v24.04/en/pose_format_yaskawa.html new file mode 100644 index 0000000..4963028 --- /dev/null +++ b/v24.04/en/pose_format_yaskawa.html @@ -0,0 +1,687 @@ + + + + + + + + + + + Yaskawa Pose Format — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Yaskawa Pose Format

      +

      The pose format that is used by Yaskawa robots consists of a position \(XYZ\) +in millimeters and an orientation that is given by three angles in +degrees, with \(Rx\) rotating around \(x\)-axis, \(Ry\) rotating +around \(y\)-axis and \(Rz\) rotating around \(z\)-axis. The +rotation order is \(x\)-\(y\)-\(z\) and computed by \(r_z(Rz) +r_y(Ry) r_x(Rx)\).

      +
      +

      Conversion from Yaskawa Rx, Ry, Rz to quaternion

      +

      The conversion from the \(Rx, Ry, Rz\) angles in degrees to a quaternion +\(q=(\begin{array}{cccc}x & y & z & w\end{array})\) can be done by +first converting all angles to radians

      +
      +\[\begin{split}X_r = Rx \frac{\pi}{180} \text{,} \\ +Y_r = Ry \frac{\pi}{180} \text{,} \\ +Z_r = Rz \frac{\pi}{180} \text{,} \\\end{split}\]
      +

      and then calculating the quaternion with

      +
      +\[\begin{split}x = \cos{(Z_r/2)}\cos{(Y_r/2)}\sin{(X_r/2)} - \sin{(Z_r/2)}\sin{(Y_r/2)}\cos{(X_r/2)} \text{,} \\ +y = \cos{(Z_r/2)}\sin{(Y_r/2)}\cos{(X_r/2)} + \sin{(Z_r/2)}\cos{(Y_r/2)}\sin{(X_r/2)} \text{,} \\ +z = \sin{(Z_r/2)}\cos{(Y_r/2)}\cos{(X_r/2)} - \cos{(Z_r/2)}\sin{(Y_r/2)}\sin{(X_r/2)} \text{,} \\ +w = \cos{(Z_r/2)}\cos{(Y_r/2)}\cos{(X_r/2)} + \sin{(Z_r/2)}\sin{(Y_r/2)}\sin{(X_r/2)} \text{.}\end{split}\]
      +
      +
      +

      Conversion from quaternion to Yaskawa Rx, Ry, Rz

      +

      The conversion from a quaternion \(q=(\begin{array}{cccc}x & y & z & +w\end{array})\) with \(||q||=1\) to the \(Rx, Ry, Rz\) angles in degrees can +be done as follows.

      +
      +\[\begin{split}Rx &= \text{atan}_2{(2(wx + yz), 1 - 2(x^2 + y^2))} \frac{180}{\pi} \\ +Ry &= \text{asin}{(2(wy - zx))} \frac{180}{\pi} \\ +Rz &= \text{atan}_2{(2(wz + xy), 1 - 2(y^2 + z^2))} \frac{180}{\pi}\end{split}\]
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/rest_api.html b/v24.04/en/rest_api.html new file mode 100644 index 0000000..7d6443a --- /dev/null +++ b/v24.04/en/rest_api.html @@ -0,0 +1,680 @@ + + + + + + + + + + + REST-API interface — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      REST-API interface

      +

      Aside from the GenICam interface, the rc_visard NG offers a comprehensive RESTful web +interface (REST-API) which any HTTP client or library can access. +Whereas most of the provided parameters, services, and functionalities can also +be accessed via the user-friendly Web GUI, the REST-API serves rather as a +machine-to-machine interface to the rc_visard NG, e.g., to programmatically

      +
        +
      • set and get run-time parameters of computation nodes, e.g., of cameras +or image processing modules;
      • +
      • do service calls, e.g., to start and stop individual computational nodes, +or to use offered services such as the hand-eye calibration;
      • +
      • read the current state of the system and individual computational nodes; or
      • +
      • update the rc_visard NG’s firmware or license.
      • +
      +
      +

      Note

      +

      In the rc_visard NG’s REST-API, a node is a computational component +that bundles certain algorithmic functionality and offers a +holistic interface (parameters, services, current status). Examples +for such nodes are the stereo matching node or the hand-eye calibration node.

      +
      +
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/rest_api_datamodel.html b/v24.04/en/rest_api_datamodel.html new file mode 100644 index 0000000..677f709 --- /dev/null +++ b/v24.04/en/rest_api_datamodel.html @@ -0,0 +1,1631 @@ + + + + + + + + + + + Data type definitions — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Data type definitions

      +

      The REST-API defines the following data models, which are used to access +or modify the available resources + either as +required attributes/parameters of the requests or as return types.

      +
      +
      DNS:
      +

      DNS settings.

      +

      An object of type DNS has the following properties:

      +
        +
      • dns_servers (array of string)
      • +
      • manual_dns_servers (array of string)
      • +
      +

      Template object

      +
      {
      +  "dns_servers": [
      +    "string",
      +    "string"
      +  ],
      +  "manual_dns_servers": [
      +    "string",
      +    "string"
      +  ]
      +}
      +
      +
      +

      DNS objects are nested in SysInfo, and are used in the following requests:

      +
      +
      +
      +
      +
      +
      FirmwareInfo:
      +

      Information about currently active and inactive firmware images, and what image is/will be booted.

      +

      An object of type FirmwareInfo has the following properties:

      +
        +
      • active_image (ImageInfo) - see description of ImageInfo
      • +
      • fallback_booted (boolean) - true if desired image could not be booted and fallback boot to the previous image occurred
      • +
      • inactive_image (ImageInfo) - see description of ImageInfo
      • +
      • next_boot_image (string) - firmware image that will be booted next time (one of active_image, inactive_image)
      • +
      +

      Template object

      +
      {
      +  "active_image": {
      +    "image_version": "string"
      +  },
      +  "fallback_booted": false,
      +  "inactive_image": {
      +    "image_version": "string"
      +  },
      +  "next_boot_image": "string"
      +}
      +
      +
      +

      FirmwareInfo objects are nested in SysInfo, and are used in the following requests:

      +
      +
      +
      +
      +
      +
      GripperElement:
      +

      CAD gripper element

      +

      An object of type GripperElement has the following properties:

      +
        +
      • id (string) - Unique identifier of the element
      • +
      +

      Template object

      +
      {
      +  "id": "string"
      +}
      +
      +
      +

      GripperElement objects are used in the following requests:

      +
      +
      +
      +
      +
      +
      HostPort:
      +

      Port exposed on host

      +

      An object of type HostPort has the following properties:

      +
        +
      • port (integer)
      • +
      • protocol (string)
      • +
      +

      Template object

      +
      {
      +  "port": 0,
      +  "protocol": "string"
      +}
      +
      +
      +

      HostPort objects are nested in UserSpaceContainer.

      +
      +
      +
      +
      ImageInfo:
      +

      Information about specific firmware image.

      +

      An object of type ImageInfo has the following properties:

      +
        +
      • image_version (string) - image version
      • +
      +

      Template object

      +
      {
      +  "image_version": "string"
      +}
      +
      +
      +

      ImageInfo objects are nested in FirmwareInfo.

      +
      +
      +
      +
      LicenseComponentConstraint:
      +

      Constraints on the module version.

      +

      An object of type LicenseComponentConstraint has the following properties:

      +
        +
      • max_version (string) - optional maximum supported version (exclusive)
      • +
      • min_version (string) - optional minimum supported version (inclusive)
      • +
      +

      Template object

      +
      {
      +  "max_version": "string",
      +  "min_version": "string"
      +}
      +
      +
      +

      LicenseComponentConstraint objects are nested in LicenseConstraints.

      +
      +
      +
      +
      LicenseComponents:
      +

      List of the licensing status of the individual software modules. The respective flag is true if the module is unlocked with the currently applied software license.

      +

      An object of type LicenseComponents has the following properties:

      +
        +
      • hand_eye_calibration (boolean) - hand-eye calibration module
      • +
      • rectification (boolean) - image rectification module
      • +
      • stereo (boolean) - stereo matching module
      • +
      +

      Template object

      +
      {
      +  "hand_eye_calibration": false,
      +  "rectification": false,
      +  "stereo": false
      +}
      +
      +
      +

      LicenseComponents objects are nested in LicenseInfo.

      +
      +
      +
      +
      LicenseConstraints:
      +

      Version constrains for modules.

      +

      An object of type LicenseConstraints has the following properties:

      + +

      Template object

      +
      {
      +  "image_version": {
      +    "max_version": "string",
      +    "min_version": "string"
      +  }
      +}
      +
      +
      +

      LicenseConstraints objects are nested in LicenseInfo.

      +
      +
      +
      +
      LicenseInfo:
      +

      Information about the currently applied software license on the device.

      +

      An object of type LicenseInfo has the following properties:

      + +

      Template object

      +
      {
      +  "components": {
      +    "hand_eye_calibration": false,
      +    "rectification": false,
      +    "stereo": false
      +  },
      +  "components_constraints": {
      +    "image_version": {
      +      "max_version": "string",
      +      "min_version": "string"
      +    }
      +  },
      +  "valid": false
      +}
      +
      +
      +

      LicenseInfo objects are used in the following requests:

      +
      +
      +
      +
      +
      +
      Log:
      +

      Content of a specific log file represented in JSON format.

      +

      An object of type Log has the following properties:

      +
        +
      • date (float) - UNIX time when log was last modified
      • +
      • log (array of LogEntry) - the actual log entries
      • +
      • name (string) - name of log file
      • +
      • size (integer) - size of log file in bytes
      • +
      +

      Template object

      +
      {
      +  "date": 0,
      +  "log": [
      +    {
      +      "component": "string",
      +      "level": "string",
      +      "message": "string",
      +      "timestamp": 0
      +    },
      +    {
      +      "component": "string",
      +      "level": "string",
      +      "message": "string",
      +      "timestamp": 0
      +    }
      +  ],
      +  "name": "string",
      +  "size": 0
      +}
      +
      +
      +

      Log objects are used in the following requests:

      +
      +
      +
      +
      +
      +
      LogEntry:
      +

      Representation of a single log entry in a log file.

      +

      An object of type LogEntry has the following properties:

      +
        +
      • component (string) - module name that created this entry
      • +
      • level (string) - log level (one of DEBUG, INFO, WARN, ERROR, FATAL)
      • +
      • message (string) - actual log message
      • +
      • timestamp (float) - Unix time of log entry
      • +
      +

      Template object

      +
      {
      +  "component": "string",
      +  "level": "string",
      +  "message": "string",
      +  "timestamp": 0
      +}
      +
      +
      +

      LogEntry objects are nested in Log.

      +
      +
      +
      +
      LogInfo:
      +

      Information about a specific log file.

      +

      An object of type LogInfo has the following properties:

      +
        +
      • date (float) - UNIX time when log was last modified
      • +
      • name (string) - name of log file
      • +
      • size (integer) - size of log file in bytes
      • +
      +

      Template object

      +
      {
      +  "date": 0,
      +  "name": "string",
      +  "size": 0
      +}
      +
      +
      +

      LogInfo objects are used in the following requests:

      +
      +
      +
      +
      +
      +
      +
      ManualDNSServers:
      +

      List of manual DNS servers.

      +

      An object of type ManualDNSServers has the following properties:

      +
        +
      • manual_dns_servers (array of string)
      • +
      +

      Template object

      +
      {
      +  "manual_dns_servers": [
      +    "string",
      +    "string"
      +  ]
      +}
      +
      +
      +

      ManualDNSServers objects are used in the following requests:

      +
      +
      +
      +
      +
      +
      NetworkInfo:
      +

      Current network configuration.

      +

      An object of type NetworkInfo has the following properties:

      +
        +
      • current_method (string) - method by which current settings were applied (one of INIT, LinkLocal, DHCP, PersistentIP, TemporaryIP)
      • +
      • default_gateway (string) - current default gateway
      • +
      • ip_address (string) - current IP address
      • +
      • settings (NetworkSettings) - see description of NetworkSettings
      • +
      • subnet_mask (string) - current subnet mask
      • +
      +

      Template object

      +
      {
      +  "current_method": "string",
      +  "default_gateway": "string",
      +  "ip_address": "string",
      +  "settings": {
      +    "dhcp_enabled": false,
      +    "persistent_default_gateway": "string",
      +    "persistent_ip_address": "string",
      +    "persistent_ip_enabled": false,
      +    "persistent_subnet_mask": "string"
      +  },
      +  "subnet_mask": "string"
      +}
      +
      +
      +

      NetworkInfo objects are nested in SysInfo, and are used in the following requests:

      +
      +
      +
      +
      +
      +
      NetworkSettings:
      +

      Current network settings.

      +

      An object of type NetworkSettings has the following properties:

      +
        +
      • dhcp_enabled (boolean) - DHCP enabled
      • +
      • persistent_default_gateway (string) - Persistent default gateway
      • +
      • persistent_ip_address (string) - Persistent IP address
      • +
      • persistent_ip_enabled (boolean) - Persistent IP enabled
      • +
      • persistent_subnet_mask (string) - Persistent subnet mask
      • +
      +

      Template object

      +
      {
      +  "dhcp_enabled": false,
      +  "persistent_default_gateway": "string",
      +  "persistent_ip_address": "string",
      +  "persistent_ip_enabled": false,
      +  "persistent_subnet_mask": "string"
      +}
      +
      +
      +

      NetworkSettings objects are nested in NetworkInfo, and are used in the following requests:

      +
      +
      +
      +
      +
      +
      NodeInfo:
      +

      Description of a computational node running on device.

      +

      An object of type NodeInfo has the following properties:

      +
        +
      • name (string) - name of the node
      • +
      • parameters (array of string) - list of the node’s run-time parameters
      • +
      • services (array of string) - list of the services this node offers
      • +
      • status (string) - status of the node (one of unknown, down, idle, running)
      • +
      +

      Template object

      +
      {
      +  "name": "string",
      +  "parameters": [
      +    "string",
      +    "string"
      +  ],
      +  "services": [
      +    "string",
      +    "string"
      +  ],
      +  "status": "string"
      +}
      +
      +
      +

      NodeInfo objects are used in the following requests:

      +
      +
      +
      +
      +
      +
      NodeStatus:
      +

      Detailed current status of the node including run-time statistics.

      +

      An object of type NodeStatus has the following properties:

      +
        +
      • status (string) - status of the node (one of unknown, down, idle, running)
      • +
      • timestamp (float) - Unix time when values were last updated
      • +
      • values (object) - dictionary with current status/statistics of the node
      • +
      +

      Template object

      +
      {
      +  "status": "string",
      +  "timestamp": 0,
      +  "values": {}
      +}
      +
      +
      +

      NodeStatus objects are used in the following requests:

      +
      +
      +
      +
      +
      +
      NtpStatus:
      +

      Status of the NTP time sync.

      +

      An object of type NtpStatus has the following properties:

      +
        +
      • accuracy (string) - time sync accuracy reported by NTP
      • +
      • synchronized (boolean) - synchronized with NTP server
      • +
      +

      Template object

      +
      {
      +  "accuracy": "string",
      +  "synchronized": false
      +}
      +
      +
      +

      NtpStatus objects are nested in SysInfo.

      +
      +
      +
      +
      Parameter:
      +

      Representation of a node’s run-time parameter. The parameter’s ‘value’ type (and hence the types of the ‘min’, ‘max’ and ‘default’ fields) can be inferred from the ‘type’ field and might be one of the built-in primitive data types.

      +

      An object of type Parameter has the following properties:

      +
        +
      • default (type not defined) - the parameter’s default value
      • +
      • description (string) - description of the parameter
      • +
      • max (type not defined) - maximum value this parameter can be assigned to
      • +
      • min (type not defined) - minimum value this parameter can be assigned to
      • +
      • name (string) - name of the parameter
      • +
      • type (string) - the parameter’s primitive type represented as string (one of bool, int8, uint8, int16, uint16, int32, uint32, int64, uint64, float32, float64, string)
      • +
      • value (type not defined) - the parameter’s current value
      • +
      +

      Template object

      +
      {
      +  "default": {},
      +  "description": "string",
      +  "max": {},
      +  "min": {},
      +  "name": "string",
      +  "type": "string",
      +  "value": {}
      +}
      +
      +
      +

      Parameter objects are used in the following requests:

      +
      +
      +
      +
      +
      +
      ParameterNameValue:
      +

      Parameter name and value. The parameter’s ‘value’ type (and hence the types of the ‘min’, ‘max’ and ‘default’ fields) can be inferred from the ‘type’ field and might be one of the built-in primitive data types.

      +

      An object of type ParameterNameValue has the following properties:

      +
        +
      • name (string) - name of the parameter
      • +
      • value (type not defined) - the parameter’s current value
      • +
      +

      Template object

      +
      {
      +  "name": "string",
      +  "value": {}
      +}
      +
      +
      +

      ParameterNameValue objects are used in the following requests:

      +
      +
      +
      +
      +
      +
      ParameterValue:
      +

      Parameter value. The parameter’s ‘value’ type (and hence the types of the ‘min’, ‘max’ and ‘default’ fields) can be inferred from the ‘type’ field and might be one of the built-in primitive data types.

      +

      An object of type ParameterValue has the following properties:

      +
        +
      • value (type not defined) - the parameter’s current value
      • +
      +

      Template object

      +
      {
      +  "value": {}
      +}
      +
      +
      +

      ParameterValue objects are used in the following requests:

      +
      +
      +
      +
      +
      +
      PtpStatus:
      +

      Status of the IEEE1588 (PTP) time sync.

      +

      An object of type PtpStatus has the following properties:

      +
        +
      • master_ip (string) - IP of the master clock
      • +
      • offset (float) - time offset in seconds to the master
      • +
      • offset_dev (float) - standard deviation of time offset in seconds to the master
      • +
      • offset_mean (float) - mean time offset in seconds to the master
      • +
      • state (string) - state of PTP (one of off, unknown, INITIALIZING, FAULTY, DISABLED, LISTENING, PASSIVE, UNCALIBRATED, SLAVE)
      • +
      +

      Template object

      +
      {
      +  "master_ip": "string",
      +  "offset": 0,
      +  "offset_dev": 0,
      +  "offset_mean": 0,
      +  "state": "string"
      +}
      +
      +
      +

      PtpStatus objects are nested in SysInfo.

      +
      +
      +
      +
      Service:
      +

      Representation of a service that a node offers.

      +

      An object of type Service has the following properties:

      + +

      Template object

      +
      {
      +  "args": {},
      +  "description": "string",
      +  "name": "string",
      +  "response": {}
      +}
      +
      +
      +

      Service objects are used in the following requests:

      +
      +
      +
      +
      +
      +
      ServiceArgs:
      +

      Arguments required to call a service with. The general representation of these arguments is a (nested) dictionary. The specific content of this dictionary depends on the respective node and service call.

      +

      ServiceArgs objects are nested in Service.

      +
      +
      +
      +
      ServiceResponse:
      +

      The response returned by the service call. The general representation of this response is a (nested) dictionary. The specific content of this dictionary depends on the respective node and service call.

      +

      ServiceResponse objects are nested in Service.

      +
      +
      +
      +
      SysInfo:
      +

      System information about the device.

      +

      An object of type SysInfo has the following properties:

      +
        +
      • dns (DNS) - see description of DNS
      • +
      • firmware (FirmwareInfo) - see description of FirmwareInfo
      • +
      • hostname (string) - Hostname
      • +
      • link_speed (integer) - Ethernet link speed in Mbps
      • +
      • mac (string) - MAC address
      • +
      • network (NetworkInfo) - see description of NetworkInfo
      • +
      • ntp_status (NtpStatus) - see description of NtpStatus
      • +
      • ptp_status (PtpStatus) - see description of PtpStatus
      • +
      • ready (boolean) - system is fully booted and ready
      • +
      • serial (string) - device serial number
      • +
      • time (float) - system time as Unix timestamp
      • +
      • ui_lock (UILock) - see description of UILock
      • +
      • uptime (float) - system uptime in seconds
      • +
      +

      Template object

      +
      {
      +  "dns": {
      +    "dns_servers": [
      +      "string",
      +      "string"
      +    ],
      +    "manual_dns_servers": [
      +      "string",
      +      "string"
      +    ]
      +  },
      +  "firmware": {
      +    "active_image": {
      +      "image_version": "string"
      +    },
      +    "fallback_booted": false,
      +    "inactive_image": {
      +      "image_version": "string"
      +    },
      +    "next_boot_image": "string"
      +  },
      +  "hostname": "string",
      +  "link_speed": 0,
      +  "mac": "string",
      +  "network": {
      +    "current_method": "string",
      +    "default_gateway": "string",
      +    "ip_address": "string",
      +    "settings": {
      +      "dhcp_enabled": false,
      +      "persistent_default_gateway": "string",
      +      "persistent_ip_address": "string",
      +      "persistent_ip_enabled": false,
      +      "persistent_subnet_mask": "string"
      +    },
      +    "subnet_mask": "string"
      +  },
      +  "ntp_status": {
      +    "accuracy": "string",
      +    "synchronized": false
      +  },
      +  "ptp_status": {
      +    "master_ip": "string",
      +    "offset": 0,
      +    "offset_dev": 0,
      +    "offset_mean": 0,
      +    "state": "string"
      +  },
      +  "ready": false,
      +  "serial": "string",
      +  "time": 0,
      +  "ui_lock": {
      +    "enabled": false
      +  },
      +  "uptime": 0
      +}
      +
      +
      +

      SysInfo objects are used in the following requests:

      +
      +
      +
      +
      +
      +
      Template:
      +

      Detection template

      +

      An object of type Template has the following properties:

      +
        +
      • id (string) - Unique identifier of the template
      • +
      +

      Template object

      +
      {
      +  "id": "string"
      +}
      +
      +
      +

      Template objects are used in the following requests:

      +
      +
      +
      +
      +
      +
      UILock:
      +

      UI lock status.

      +

      An object of type UILock has the following properties:

      +
        +
      • enabled (boolean)
      • +
      +

      Template object

      +
      {
      +  "enabled": false
      +}
      +
      +
      +

      UILock objects are nested in SysInfo, and are used in the following requests:

      +
      +
      +
      +
      +
      +
      UserSpace:
      +

      UserSpace information

      +

      An object of type UserSpace has the following properties:

      +
        +
      • apps (array of UserSpaceApp) - UserSpace apps
      • +
      • available (boolean) - UserSpace available
      • +
      • enabled (boolean) - UserSpace enabled
      • +
      +

      Template object

      +
      {
      +  "apps": [
      +    {
      +      "containers": [
      +        {
      +          "description": "string",
      +          "health": "string",
      +          "host_ports": [
      +            {
      +              "port": 0,
      +              "protocol": "string"
      +            },
      +            {
      +              "port": 0,
      +              "protocol": "string"
      +            }
      +          ],
      +          "name": "string",
      +          "status": "string",
      +          "title": "string",
      +          "url": "string",
      +          "vendor": "string",
      +          "version": "string"
      +        },
      +        {
      +          "description": "string",
      +          "health": "string",
      +          "host_ports": [
      +            {
      +              "port": 0,
      +              "protocol": "string"
      +            },
      +            {
      +              "port": 0,
      +              "protocol": "string"
      +            }
      +          ],
      +          "name": "string",
      +          "status": "string",
      +          "title": "string",
      +          "url": "string",
      +          "vendor": "string",
      +          "version": "string"
      +        }
      +      ],
      +      "name": "string",
      +      "type": "string"
      +    },
      +    {
      +      "containers": [
      +        {
      +          "description": "string",
      +          "health": "string",
      +          "host_ports": [
      +            {
      +              "port": 0,
      +              "protocol": "string"
      +            },
      +            {
      +              "port": 0,
      +              "protocol": "string"
      +            }
      +          ],
      +          "name": "string",
      +          "status": "string",
      +          "title": "string",
      +          "url": "string",
      +          "vendor": "string",
      +          "version": "string"
      +        },
      +        {
      +          "description": "string",
      +          "health": "string",
      +          "host_ports": [
      +            {
      +              "port": 0,
      +              "protocol": "string"
      +            },
      +            {
      +              "port": 0,
      +              "protocol": "string"
      +            }
      +          ],
      +          "name": "string",
      +          "status": "string",
      +          "title": "string",
      +          "url": "string",
      +          "vendor": "string",
      +          "version": "string"
      +        }
      +      ],
      +      "name": "string",
      +      "type": "string"
      +    }
      +  ],
      +  "available": false,
      +  "enabled": false
      +}
      +
      +
      +

      UserSpace objects are used in the following requests:

      +
      +
      +
      +
      +
      +
      UserSpaceApp:
      +

      UserSpace app

      +

      An object of type UserSpaceApp has the following properties:

      +
        +
      • containers (array of UserSpaceContainer) - containers in this app
      • +
      • name (string) - name of the app
      • +
      • type (string) - type of the app (one of container, compose)
      • +
      +

      Template object

      +
      {
      +  "containers": [
      +    {
      +      "description": "string",
      +      "health": "string",
      +      "host_ports": [
      +        {
      +          "port": 0,
      +          "protocol": "string"
      +        },
      +        {
      +          "port": 0,
      +          "protocol": "string"
      +        }
      +      ],
      +      "name": "string",
      +      "status": "string",
      +      "title": "string",
      +      "url": "string",
      +      "vendor": "string",
      +      "version": "string"
      +    },
      +    {
      +      "description": "string",
      +      "health": "string",
      +      "host_ports": [
      +        {
      +          "port": 0,
      +          "protocol": "string"
      +        },
      +        {
      +          "port": 0,
      +          "protocol": "string"
      +        }
      +      ],
      +      "name": "string",
      +      "status": "string",
      +      "title": "string",
      +      "url": "string",
      +      "vendor": "string",
      +      "version": "string"
      +    }
      +  ],
      +  "name": "string",
      +  "type": "string"
      +}
      +
      +
      +

      UserSpaceApp objects are nested in UserSpace.

      +
      +
      +
      +
      UserSpaceContainer:
      +

      container

      +

      An object of type UserSpaceContainer has the following properties:

      +
        +
      • description (string) - value of label org.opencontainers.image.description
      • +
      • health (string) - health of the container (if container has healthcheck) (one of starting, healthy, unhealthy)
      • +
      • host_ports (array of HostPort) - Ports exposed on host
      • +
      • name (string) - name of the container
      • +
      • status (string) - status of the container (one of restarting, running, paused, exited)
      • +
      • title (string) - value of label org.opencontainers.image.title
      • +
      • url (string) - value of label org.opencontainers.image.url
      • +
      • vendor (string) - value of label org.opencontainers.image.vendor
      • +
      • version (string) - value of label org.opencontainers.image.version
      • +
      +

      Template object

      +
      {
      +  "description": "string",
      +  "health": "string",
      +  "host_ports": [
      +    {
      +      "port": 0,
      +      "protocol": "string"
      +    },
      +    {
      +      "port": 0,
      +      "protocol": "string"
      +    }
      +  ],
      +  "name": "string",
      +  "status": "string",
      +  "title": "string",
      +  "url": "string",
      +  "vendor": "string",
      +  "version": "string"
      +}
      +
      +
      +

      UserSpaceContainer objects are nested in UserSpaceApp.

      +
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/rest_api_general.html b/v24.04/en/rest_api_general.html new file mode 100644 index 0000000..f58e8dc --- /dev/null +++ b/v24.04/en/rest_api_general.html @@ -0,0 +1,846 @@ + + + + + + + + + + + General API structure — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      General API structure

      +

      The general entry point to the rc_visard NG’s API is http://<host>/api/, +where <host> is either the device’s IP address or its host name as known +by the respective DHCP server, as explained in +network configuration. +Accessing this entry point with a web browser lets the user explore and test +the full API during run-time using the Swagger UI +.

      +

      For actual HTTP requests, the current API version is appended to the entry point +of the API, i.e., http://<host>/api/v2. All data sent to and +received by the REST-API follows the JavaScript Object Notation (JSON). +The API is designed to let the user create, retrieve, modify, and delete +so-called resources as listed in Available resources and requests using the HTTP requests below.

      + ++++ + + + + + + + + + + + + + + + + + + + +
      Request typeDescription
      GETAccess one or more resources and return the result as JSON.
      PUTModify a resource and return the modified resource as JSON.
      DELETEDelete a resource.
      POSTUpload file (e.g., license or firmware image).
      +

      Depending on the type and the specific request itself, arguments to HTTP +requests can be transmitted as part of the path (URI) to the +resource, as +query string, as form data, or in the body of the request. The following +examples use the command line tool curl, which is available for various operating +systems. See https://curl.haxx.se.

      +
        +
      • Get a node’s current status; its name is encoded in the path (URI)

        +
        curl -X GET 'http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching'
        +
        +
        +
      • +
      • Get values of some of a node’s parameters using a query string

        +
        curl -X GET 'http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters?name=minconf&name=maxdepth'
        +
        +
        +
      • +
      +
        +
      • Set a node’s parameter as JSON-encoded text in the body of the request

        +
        curl -X PUT --header 'Content-Type: application/json' -d '[{"name": "mindepth", "value": 0.1}]' 'http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters'
        +
        +
        +
      • +
      +

      As for the responses to such requests, some common return codes for the +rc_visard NG’s API are:

      + ++++ + + + + + + + + + + + + + + + + + + + + + + +
      Status CodeDescription
      200 OKThe request was successful; the resource is returned as JSON.
      400 Bad RequestA required attribute or argument of the API request is +missing or invalid.
      404 Not FoundA resource could not be accessed; e.g., an ID for a resource +could not be found.
      403 ForbiddenAccess is (temporarily) forbidden; e.g., some parameters are +locked while a GigE Vision application is connected.
      429 Too many requestsRate limited due to excessive request frequency.
      +

      The following listing shows a sample response to a successful request that accesses +information about the rc_stereomatching node’s minconf parameter:

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +Content-Length: 157
      +
      +{
      +    "name": "minconf",
      +    "min": 0,
      +    "default": 0,
      +    "max": 1,
      +    "value": 0,
      +    "type": "float64",
      +    "description": "Minimum confidence"
      +}
      +
      +
      +
      +

      Note

      +

      The actual behavior, allowed requests, and specific return codes +depend heavily on the specific resource, context, and action. +Please refer to the rc_visard NG’s +available resources and to +each software module’s +parameters and services.

      +
      +
      +
      +

      Available resources and requests

      +

      The available REST-API resources are structured into the following parts:

      +
        +
      • +
        /nodes
        +
        Access the rc_visard NG’s global +Database modules + +with their run-time status, parameters, and offered services, +for storing data used in +multiple modules, such as load carriers, grippers and regions of interest.
        +
        +
      • +
      • +
        /pipelines
        +
        Access to the status and configuration of the camera pipelines. +There is always only one camera pipeline with number 0.
        +
        +
      • +
      +
        +
      • +
        /pipelines/0/nodes
        +
        Access the rc_visard NG’s 3D-camera, navigation, +detection and configuration +software modules + +with their run-time status, parameters, and offered services.
        +
        +
      • +
      +
        +
      • +
        /templates
        +
        Access the object templates on the rc_visard NG.
        +
        +
      • +
      +
        +
      • +
        /system
        +
        Access the system state, set network configuration, + +and manage licenses as well as firmware updates.
        +
        +
      • +
      +
        +
      • +
        /userspace
        +
        Access the UserSpace on the rc_visard NG.
        +
        +
      • +
      +
        +
      • +
        /logs
        +
        Access the log files on the rc_visard NG.
        +
        +
      • +
      +
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/rest_api_nodes.html b/v24.04/en/rest_api_nodes.html new file mode 100644 index 0000000..5b62a79 --- /dev/null +++ b/v24.04/en/rest_api_nodes.html @@ -0,0 +1,1883 @@ + + + + + + + + + + + Nodes, parameters, and services — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Nodes, parameters, and services

      +

      Nodes represent the rc_visard NG’s +software modules +, each +bundling a certain algorithmic functionality. All available global REST-API database nodes +can be listed with their service calls and parameters using

      +
      curl -X GET http://<host>/api/v2/nodes
      +
      +
      +

      Information about a specific node (e.g., rc_load_carrier_db) can be retrieved using

      +
      curl -X GET http://<host>/api/v2/nodes/rc_load_carrier_db
      +
      +
      +

      All available 3D camera, detection and configuration REST-API nodes +can be listed with their service calls and parameters using

      +
      curl -X GET http://<host>/api/v2/pipelines/0/nodes
      +
      +
      +

      Information about a specific node (e.g., rc_camera) can be retrieved using

      +
      curl -X GET http://<host>/api/v2/pipelines/0/nodes/rc_camera
      +
      +
      +
      +
      Status:
      +

      During run-time, each node offers information about its current status. +This includes not only the current processing status of the module +(e.g., running or stale), but +most nodes also offer run-time statistics or read-only parameters, +so-called status values. As an example, the rc_camera values +can be retrieved using

      +
      curl -X GET http://<host>/api/v2/pipelines/0/nodes/rc_camera/status
      +
      +
      +
      +

      Note

      +

      The returned status values are specific to individual nodes and +are documented in the respective +software module +.

      +
      +
      +

      Note

      +

      The status values are only reported when the respective +node is in the running state.

      +
      +
      +
      +
      +
      Parameters:
      +

      Most nodes expose parameters via the rc_visard NG’s REST-API to allow +their run-time behaviors to be changed according to application context or requirements. +The REST-API permits to read and write a parameter’s value, but also +provides further information such as minimum, maximum, and default +values.

      +

      As an example, the rc_stereomatching parameters can be +retrieved using

      +
      curl -X GET http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters
      +
      +
      +

      Its quality parameter could be set to Full using

      +
      curl -X PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters?quality=Full
      +
      +
      +

      or equivalently

      +
      curl -X PUT --header 'Content-Type: application/json' -d '{ "value": "Full" }' http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters/quality
      +
      +
      +
      +

      Note

      +

      Run-time parameters are specific to individual nodes and +are documented in the respective +software module +.

      +
      +
      +

      Note

      +

      Most of the parameters that nodes offer via the REST-API can be +explored and tested via the rc_visard NG’s user-friendly Web GUI +.

      +
      +
      +

      Note

      +

      Some parameters exposed via the rc_visard NG’s REST-API are also +available from the +GigE Vision 2.0/GenICam image interface . +Please note that setting those parameters via the REST-API or Web GUI is +prohibited if a GenICam client is connected.

      +
      +

      In addition, each node that offers run-time parameters also features +a service to restore the default values for all of its parameters.

      +
      +
      +
      +
      Services:
      +

      Some nodes also offer services that can be called via REST-API, e.g., to +restore parameters as discussed above, or to start and stop nodes. +As an example, the +services of the hand-eye calibration module + +could be listed using

      +
      curl -X GET http://<host>/api/v2/pipelines/0/nodes/rc_hand_eye_calibration/services
      +
      +
      +

      A node’s service is called by issuing a PUT request for the +respective resource and providing the service-specific arguments +(see the "args" field of the +Service data model). +As an example, the stereo matching module can be triggered to do an acquisition by:

      +
      curl -X PUT --header 'Content-Type: application/json' -d '{ "args": {} }' http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/services/acquisition_trigger
      +
      +
      +
      +

      Note

      +

      The services and corresponding argument data models are +specific to individual nodes and are documented in the respective +software module +.

      +
      +
      +
      +

      The following list includes all REST-API requests regarding the global database nodes’ status, +parameters, and services calls:

      +
      +
      +GET /nodes
      +

      Get list of all available global nodes.

      +

      Template request

      +
      GET /api/v2/nodes HTTP/1.1
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +[
      +  {
      +    "name": "rc_roi_db",
      +    "parameters": [],
      +    "services": [
      +      "set_region_of_interest",
      +      "get_regions_of_interest",
      +      "delete_regions_of_interest",
      +      "set_region_of_interest_2d",
      +      "get_regions_of_interest_2d",
      +      "delete_regions_of_interest_2d"
      +    ],
      +    "status": "running"
      +  },
      +  {
      +    "name": "rc_load_carrier_db",
      +    "parameters": [],
      +    "services": [
      +      "set_load_carrier",
      +      "get_load_carriers",
      +      "delete_load_carriers"
      +    ],
      +    "status": "running"
      +  },
      +  {
      +    "name": "rc_gripper_db",
      +    "parameters": [],
      +    "services": [
      +      "set_gripper",
      +      "get_grippers",
      +      "delete_grippers"
      +    ],
      +    "status": "running"
      +  }
      +]
      +
      +
      + +++ + + + + + + + + + +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation (returns array of NodeInfo)
      • +
      +
      Referenced Data Models:
        +
      +
      + +
      +
      +GET /nodes/{node}
      +

      Get info on a single global node.

      +

      Template request

      +
      GET /api/v2/nodes/<node> HTTP/1.1
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "name": "rc_roi_db",
      +  "parameters": [],
      +  "services": [
      +    "set_region_of_interest",
      +    "get_regions_of_interest",
      +    "delete_regions_of_interest",
      +    "set_region_of_interest_2d",
      +    "get_regions_of_interest_2d",
      +    "delete_regions_of_interest_2d"
      +  ],
      +  "status": "running"
      +}
      +
      +
      + +++ + + + + + + + + + + + +
      Parameters:
        +
      • node (string) – name of the node (required)
      • +
      +
      Response Headers:
        +
      Status Codes: +
      Referenced Data Models:
        +
      +
      + +
      +
      +GET /nodes/{node}/services
      +

      Get descriptions of all services a global node offers.

      +

      Template request

      +
      GET /api/v2/nodes/<node>/services HTTP/1.1
      +
      +
      +

      Template response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +[
      +  {
      +    "args": {},
      +    "description": "string",
      +    "name": "string",
      +    "response": {}
      +  }
      +]
      +
      +
      + +++ + + + + + + + + + + + +
      Parameters:
        +
      • node (string) – name of the node (required)
      • +
      +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation (returns array of Service)
      • +
      • 404 Not Found – node not found
      • +
      +
      Referenced Data Models:
        +
      +
      + +
      +
      +GET /nodes/{node}/services/{service}
      +

      Get description of a global node’s specific service.

      +

      Template request

      +
      GET /api/v2/nodes/<node>/services/<service> HTTP/1.1
      +
      +
      +

      Template response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "args": {},
      +  "description": "string",
      +  "name": "string",
      +  "response": {}
      +}
      +
      +
      + +++ + + + + + + + + + + + +
      Parameters:
        +
      • node (string) – name of the node (required)
      • +
      • service (string) – name of the service (required)
      • +
      +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation (returns Service)
      • +
      • 404 Not Found – node or service not found
      • +
      +
      Referenced Data Models:
        +
      +
      + +
      +
      +PUT /nodes/{node}/services/{service}
      +

      Call a service of a node. The required args and resulting response depend on the specific node and service.

      +

      Template request

      +
      PUT /api/v2/nodes/<node>/services/<service> HTTP/1.1
      +Accept: application/json application/ubjson
      +
      +{}
      +
      +
      +

      Template response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "args": {},
      +  "description": "string",
      +  "name": "string",
      +  "response": {}
      +}
      +
      +
      + +++ + + + + + + + + + + + + + + + + + +
      Parameters:
        +
      • node (string) – name of the node (required)
      • +
      • service (string) – name of the service (required)
      • +
      +
      Request JSON Object:
       
        +
      • service args (object) – example args (required)
      • +
      +
      Request Headers:
       
        +
      • Accept – application/json application/ubjson
      • +
      +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – Service call completed (returns Service)
      • +
      • 403 Forbidden – Service call forbidden, e.g. because there is no valid license for this module.
      • +
      • 404 Not Found – node or service not found
      • +
      +
      Referenced Data Models:
        +
      +
      + +
      +
      +GET /nodes/{node}/status
      +

      Get status of a global node.

      +

      Template request

      +
      GET /api/v2/nodes/<node>/status HTTP/1.1
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "status": "running",
      +  "timestamp": 1503075030.2335997,
      +  "values": []
      +}
      +
      +
      + +++ + + + + + + + + + + + +
      Parameters:
        +
      • node (string) – name of the node (required)
      • +
      +
      Response Headers:
        +
      Status Codes: +
      Referenced Data Models:
        +
      +
      + +

      The following list includes all REST-API requests regarding the 3D camera, detection and configuration nodes’ status, +parameters, and services calls:

      +
      +
      +GET /pipelines/{pipeline}/nodes
      +

      Get list of all available nodes.

      +

      Template request

      +
      GET /api/v2/pipelines/<pipeline>/nodes HTTP/1.1
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +[
      +  {
      +    "name": "rc_camera",
      +    "parameters": [
      +      "fps",
      +      "exp_auto",
      +      "exp_value",
      +      "exp_max"
      +    ],
      +    "services": [
      +      "reset_defaults"
      +    ],
      +    "status": "running"
      +  },
      +  {
      +    "name": "rc_hand_eye_calibration",
      +    "parameters": [
      +      "grid_width",
      +      "grid_height",
      +      "robot_mounted"
      +    ],
      +    "services": [
      +      "reset_defaults",
      +      "set_pose",
      +      "reset",
      +      "save",
      +      "calibrate",
      +      "get_calibration"
      +    ],
      +    "status": "idle"
      +  },
      +  {
      +    "name": "rc_stereomatching",
      +    "parameters": [
      +      "quality",
      +      "seg",
      +      "fill",
      +      "minconf",
      +      "mindepth",
      +      "maxdepth",
      +      "maxdeptherr"
      +    ],
      +    "services": [
      +      "reset_defaults"
      +    ],
      +    "status": "running"
      +  }
      +]
      +
      +
      + +++ + + + + + + + + + + + +
      Parameters:
        +
      • pipeline (string) – name of the pipeline (one of 0) (required)
      • +
      +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation (returns array of NodeInfo)
      • +
      +
      Referenced Data Models:
        +
      +
      + +
      +
      +GET /pipelines/{pipeline}/nodes/{node}
      +

      Get info on a single node.

      +

      Template request

      +
      GET /api/v2/pipelines/<pipeline>/nodes/<node> HTTP/1.1
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "name": "rc_camera",
      +  "parameters": [
      +    "fps",
      +    "exp_auto",
      +    "exp_value",
      +    "exp_max"
      +  ],
      +  "services": [
      +    "reset_defaults"
      +  ],
      +  "status": "running"
      +}
      +
      +
      + +++ + + + + + + + + + + + +
      Parameters:
        +
      • pipeline (string) – name of the pipeline (one of 0) (required)
      • +
      • node (string) – name of the node (required)
      • +
      +
      Response Headers:
        +
      Status Codes: +
      Referenced Data Models:
        +
      +
      + +
      +
      +GET /pipelines/{pipeline}/nodes/{node}/parameters
      +

      Get parameters of a node.

      +

      Template request

      +
      GET /api/v2/pipelines/<pipeline>/nodes/<node>/parameters?name=<name> HTTP/1.1
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +[
      +  {
      +    "default": 25,
      +    "description": "Frames per second in Hz",
      +    "max": 25,
      +    "min": 1,
      +    "name": "fps",
      +    "type": "float64",
      +    "value": 25
      +  },
      +  {
      +    "default": true,
      +    "description": "Switching between auto and manual exposure",
      +    "max": true,
      +    "min": false,
      +    "name": "exp_auto",
      +    "type": "bool",
      +    "value": true
      +  },
      +  {
      +    "default": 0.007,
      +    "description": "Maximum exposure time in s if exp_auto is true",
      +    "max": 0.018,
      +    "min": 6.6e-05,
      +    "name": "exp_max",
      +    "type": "float64",
      +    "value": 0.007
      +  }
      +]
      +
      +
      + +++ + + + + + + + + + + + + + + +
      Parameters:
        +
      • pipeline (string) – name of the pipeline (one of 0) (required)
      • +
      • node (string) – name of the node (required)
      • +
      +
      Query Parameters:
       
        +
      • name (string) – limit result to parameters with name (optional)
      • +
      +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation (returns array of Parameter)
      • +
      • 404 Not Found – node not found
      • +
      +
      Referenced Data Models:
        +
      +
      + +
      +
      +PUT /pipelines/{pipeline}/nodes/{node}/parameters
      +

      Update multiple parameters.

      +

      Template request

      +
      PUT /api/v2/pipelines/<pipeline>/nodes/<node>/parameters HTTP/1.1
      +Accept: application/json application/ubjson
      +
      +[
      +  {
      +    "name": "string",
      +    "value": {}
      +  }
      +]
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +[
      +  {
      +    "default": 25,
      +    "description": "Frames per second in Hz",
      +    "max": 25,
      +    "min": 1,
      +    "name": "fps",
      +    "type": "float64",
      +    "value": 10
      +  },
      +  {
      +    "default": true,
      +    "description": "Switching between auto and manual exposure",
      +    "max": true,
      +    "min": false,
      +    "name": "exp_auto",
      +    "type": "bool",
      +    "value": false
      +  },
      +  {
      +    "default": 0.005,
      +    "description": "Manual exposure time in s if exp_auto is false",
      +    "max": 0.018,
      +    "min": 6.6e-05,
      +    "name": "exp_value",
      +    "type": "float64",
      +    "value": 0.005
      +  }
      +]
      +
      +
      + +++ + + + + + + + + + + + + + + + + + +
      Parameters:
        +
      • pipeline (string) – name of the pipeline (one of 0) (required)
      • +
      • node (string) – name of the node (required)
      • +
      +
      Request JSON Array of Objects:
       
        +
      • parameters (ParameterNameValue) – array of parameters (required)
      • +
      +
      Request Headers:
       
        +
      • Accept – application/json application/ubjson
      • +
      +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation (returns array of Parameter)
      • +
      • 400 Bad Request – invalid parameter value
      • +
      • 403 Forbidden – Parameter update forbidden, e.g. because they are locked by a running GigE Vision application or there is no valid license for this module.
      • +
      • 404 Not Found – node not found
      • +
      +
      Referenced Data Models:
        +
      +
      + +
      +
      +GET /pipelines/{pipeline}/nodes/{node}/parameters/{param}
      +

      Get a specific parameter of a node.

      +

      Template request

      +
      GET /api/v2/pipelines/<pipeline>/nodes/<node>/parameters/<param> HTTP/1.1
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "default": 25,
      +  "description": "Frames per second in Hertz",
      +  "max": 25,
      +  "min": 1,
      +  "name": "fps",
      +  "type": "float64",
      +  "value": 10
      +}
      +
      +
      + +++ + + + + + + + + + + + +
      Parameters:
        +
      • pipeline (string) – name of the pipeline (one of 0) (required)
      • +
      • node (string) – name of the node (required)
      • +
      • param (string) – name of the parameter (required)
      • +
      +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation (returns Parameter)
      • +
      • 404 Not Found – node or parameter not found
      • +
      +
      Referenced Data Models:
        +
      +
      + +
      +
      +PUT /pipelines/{pipeline}/nodes/{node}/parameters/{param}
      +

      Update a specific parameter of a node.

      +

      Template request

      +
      PUT /api/v2/pipelines/<pipeline>/nodes/<node>/parameters/<param> HTTP/1.1
      +Accept: application/json application/ubjson
      +
      +{
      +  "value": {}
      +}
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "default": 25,
      +  "description": "Frames per second in Hertz",
      +  "max": 25,
      +  "min": 1,
      +  "name": "fps",
      +  "type": "float64",
      +  "value": 10
      +}
      +
      +
      + +++ + + + + + + + + + + + + + + + + + +
      Parameters:
        +
      • pipeline (string) – name of the pipeline (one of 0) (required)
      • +
      • node (string) – name of the node (required)
      • +
      • param (string) – name of the parameter (required)
      • +
      +
      Request JSON Object:
       
        +
      • parameter (ParameterValue) – parameter to be updated as JSON object (required)
      • +
      +
      Request Headers:
       
        +
      • Accept – application/json application/ubjson
      • +
      +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation (returns Parameter)
      • +
      • 400 Bad Request – invalid parameter value
      • +
      • 403 Forbidden – Parameter update forbidden, e.g. because they are locked by a running GigE Vision application or there is no valid license for this module.
      • +
      • 404 Not Found – node or parameter not found
      • +
      +
      Referenced Data Models:
        +
      +
      + +
      +
      +GET /pipelines/{pipeline}/nodes/{node}/services
      +

      Get descriptions of all services a node offers.

      +

      Template request

      +
      GET /api/v2/pipelines/<pipeline>/nodes/<node>/services HTTP/1.1
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +[
      +  {
      +    "args": {},
      +    "description": "Restarts the module.",
      +    "name": "restart",
      +    "response": {
      +      "accepted": "bool",
      +      "current_state": "string"
      +    }
      +  },
      +  {
      +    "args": {},
      +    "description": "Starts the module.",
      +    "name": "start",
      +    "response": {
      +      "accepted": "bool",
      +      "current_state": "string"
      +    }
      +  },
      +  {
      +    "args": {},
      +    "description": "Stops the module.",
      +    "name": "stop",
      +    "response": {
      +      "accepted": "bool",
      +      "current_state": "string"
      +    }
      +  }
      +]
      +
      +
      + +++ + + + + + + + + + + + +
      Parameters:
        +
      • pipeline (string) – name of the pipeline (one of 0) (required)
      • +
      • node (string) – name of the node (required)
      • +
      +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation (returns array of Service)
      • +
      • 404 Not Found – node not found
      • +
      +
      Referenced Data Models:
        +
      +
      + +
      +
      +GET /pipelines/{pipeline}/nodes/{node}/services/{service}
      +

      Get description of a node’s specific service.

      +

      Template request

      +
      GET /api/v2/pipelines/<pipeline>/nodes/<node>/services/<service> HTTP/1.1
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "args": {
      +    "pose": {
      +      "orientation": {
      +        "w": "float64",
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "position": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      }
      +    },
      +    "slot": "int32"
      +  },
      +  "description": "Save a pose (grid or gripper) for later calibration.",
      +  "name": "set_pose",
      +  "response": {
      +    "message": "string",
      +    "status": "int32",
      +    "success": "bool"
      +  }
      +}
      +
      +
      + +++ + + + + + + + + + + + +
      Parameters:
        +
      • pipeline (string) – name of the pipeline (one of 0) (required)
      • +
      • node (string) – name of the node (required)
      • +
      • service (string) – name of the service (required)
      • +
      +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation (returns Service)
      • +
      • 404 Not Found – node or service not found
      • +
      +
      Referenced Data Models:
        +
      +
      + +
      +
      +PUT /pipelines/{pipeline}/nodes/{node}/services/{service}
      +

      Call a service of a node. The required args and resulting response depend on the specific node and service.

      +

      Template request

      +
      PUT /api/v2/pipelines/<pipeline>/nodes/<node>/services/<service> HTTP/1.1
      +Accept: application/json application/ubjson
      +
      +{}
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "name": "set_pose",
      +  "response": {
      +    "message": "Grid detected, pose stored.",
      +    "status": 1,
      +    "success": true
      +  }
      +}
      +
      +
      + +++ + + + + + + + + + + + + + + + + + +
      Parameters:
        +
      • pipeline (string) – name of the pipeline (one of 0) (required)
      • +
      • node (string) – name of the node (required)
      • +
      • service (string) – name of the service (required)
      • +
      +
      Request JSON Object:
       
        +
      • service args (object) – example args (required)
      • +
      +
      Request Headers:
       
        +
      • Accept – application/json application/ubjson
      • +
      +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – Service call completed (returns Service)
      • +
      • 403 Forbidden – Service call forbidden, e.g. because there is no valid license for this module.
      • +
      • 404 Not Found – node or service not found
      • +
      +
      Referenced Data Models:
        +
      +
      + +
      +
      +GET /pipelines/{pipeline}/nodes/{node}/status
      +

      Get status of a node.

      +

      Template request

      +
      GET /api/v2/pipelines/<pipeline>/nodes/<node>/status HTTP/1.1
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "status": "running",
      +  "timestamp": 1503075030.2335997,
      +  "values": {
      +    "baseline": "0.0650542",
      +    "color": "0",
      +    "exp": "0.00426667",
      +    "focal": "0.844893",
      +    "fps": "25.1352",
      +    "gain": "12.0412",
      +    "height": "960",
      +    "temp_left": "39.6",
      +    "temp_right": "38.2",
      +    "time": "0.00406513",
      +    "width": "1280"
      +  }
      +}
      +
      +
      + +++ + + + + + + + + + + + +
      Parameters:
        +
      • pipeline (string) – name of the pipeline (one of 0) (required)
      • +
      • node (string) – name of the node (required)
      • +
      +
      Response Headers:
        +
      Status Codes: +
      Referenced Data Models:
        +
      +
      + +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/rest_api_pipelines.html b/v24.04/en/rest_api_pipelines.html new file mode 100644 index 0000000..bd68fd4 --- /dev/null +++ b/v24.04/en/rest_api_pipelines.html @@ -0,0 +1,646 @@ + + + + + + + + + + + Pipelines — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Pipelines

      +

      Pipelines represent the rc_visard NG’s camera pipelines.

      +

      The following list includes all REST-API requests regarding the camera pipelines’ configuration:

      +
      + + +
      +
      + +
      +
      +
      + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/rest_api_swagger_ui.html b/v24.04/en/rest_api_swagger_ui.html new file mode 100644 index 0000000..8ae95f7 --- /dev/null +++ b/v24.04/en/rest_api_swagger_ui.html @@ -0,0 +1,713 @@ + + + + + + + + + + + Swagger UI — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Swagger UI

      +

      The rc_visard NG’s Swagger UI allows developers to easily +visualize and interact with the REST-API, e.g., for development and testing. Accessing +http://<host>/api/ or http://<host>/api/swagger +(the former will automatically be redirected to the latter) opens a visualization +of the rc_visard NG’s general API structure including all +available resources and requests + +and offers a simple user interface for exploring all of its features.

      +
      +

      Note

      +

      Users must be aware that, although the rc_visard NG’s Swagger UI is +designed to explore and test the REST-API, it is a fully +functional interface. +That is, any issued requests are actually +processed and particularly PUT, POST, and DELETE +requests might change the overall status and/or behavior of the +device.

      +
      +
      +_images/swagger_ui_overview_ng.png +

      Fig. 58 Initial view of the rc_visard NG’s Swagger UI with its resources and requests

      +
      +

      Using this interface, available resources and requests can be explored by +clicking on them to uncollapse or recollapse them. +The following figure shows an example of how to get a node’s current status +by filling in the necessary parameters +(pipeline number and node name) and clicking Execute. This action results in the Swagger UI showing, +amongst others, the actual curl command that was executed when +issuing the request as well as the response body showing the current status +of the requested node in a JSON-formatted string.

      +
      +_images/swagger_ui_example_simple_get.png +

      Fig. 59 Result of requesting the rc_stereomatching node’s status

      +
      +

      Some actions, such as setting parameters or calling services, require more +complex parameters to an HTTP request. The Swagger UI allows developers to +explore the attributes required for these actions during run-time, as shown in +the next example. In the figure below, the attributes required for the +the rc_hand_eye_calibration node’s set_pose service are explored by +performing a GET request on this resource. The response features a full +description of the service offered, including all required arguments with +their names and types as a JSON-formatted string.

      +
      +_images/swagger_ui_example_get_service_args.png +

      Fig. 60 The result of the GET request on the set_pose service shows the +required arguments for this service call.

      +
      +

      Users can easily use this preformatted JSON string as a template for the service +arguments to actually call the service:

      +
      +_images/swagger_ui_example_fill_service_args.png +

      Fig. 61 Filling in the arguments of the set_pose service request

      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/rest_api_syslogs.html b/v24.04/en/rest_api_syslogs.html new file mode 100644 index 0000000..b73fd3e --- /dev/null +++ b/v24.04/en/rest_api_syslogs.html @@ -0,0 +1,1724 @@ + + + + + + + + + + + System and logs — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      System and logs

      +

      The following resources and requests expose the rc_visard NG’s system-level API. They +enable

      +
      +
        +
      • access to log files (system-wide or module-specific)
      • +
      • access to information about the device and run-time statistics such as +date, MAC address, clock-time synchronization status, and available +resources;
      • +
      • management of installed software licenses; and
      • +
      • the rc_visard NG to be updated with a new firmware image.
      • +
      +
      +
      +
      +GET /logs
      +

      Get list of available log files.

      +

      Template request

      +
      GET /api/v2/logs HTTP/1.1
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +[
      +  {
      +    "date": 1503060035.0625782,
      +    "name": "rcsense-api.log",
      +    "size": 730
      +  },
      +  {
      +    "date": 1503060035.741574,
      +    "name": "stereo.log",
      +    "size": 39024
      +  },
      +  {
      +    "date": 1503060044.0475223,
      +    "name": "camera.log",
      +    "size": 1091
      +  }
      +]
      +
      +
      + +++ + + + + + + + + + +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation (returns array of LogInfo)
      • +
      +
      Referenced Data Models:
        +
      +
      + +
      +
      +GET /logs/{log}
      +

      Get a log file. Content type of response depends on parameter ‘format’.

      +

      Template request

      +
      GET /api/v2/logs/<log>?format=<format>&limit=<limit> HTTP/1.1
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "date": 1581609251.8168414,
      +  "log": [
      +    {
      +      "component": "rc_gev_server",
      +      "level": "INFO",
      +      "message": "Application from IP 10.0.1.7 registered with control access.",
      +      "timestamp": 1581609249.61
      +    },
      +    {
      +      "component": "rc_gev_server",
      +      "level": "INFO",
      +      "message": "Application from IP 10.0.1.7 deregistered.",
      +      "timestamp": 1581609249.739
      +    },
      +    {
      +      "component": "rc_gev_server",
      +      "level": "INFO",
      +      "message": "Application from IP 10.0.1.7 registered with control access.",
      +      "timestamp": 1581609250.94
      +    },
      +    {
      +      "component": "rc_gev_server",
      +      "level": "INFO",
      +      "message": "Application from IP 10.0.1.7 deregistered.",
      +      "timestamp": 1581609251.819
      +    }
      +  ],
      +  "name": "gev.log",
      +  "size": 42112
      +}
      +
      +
      + +++ + + + + + + + + + + + + + + +
      Parameters:
        +
      • log (string) – name of the log file (required)
      • +
      +
      Query Parameters:
       
        +
      • format (string) – return log as JSON or raw (one of json, raw; default: json) (optional)
      • +
      • limit (integer) – limit to last x lines in JSON format (default: 100) (optional)
      • +
      +
      Response Headers:
        +
      Status Codes: +
      Referenced Data Models:
        +
      +
      + +
      +
      +GET /system
      +

      Get system information on sensor.

      +

      Template request

      +
      GET /api/v2/system HTTP/1.1
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "dns": {
      +    "dns_servers": [
      +      "10.0.0.1",
      +      "1.1.1.1"
      +    ],
      +    "manual_dns_servers": [
      +      "1.1.1.1"
      +    ]
      +  },
      +  "firmware": {
      +    "active_image": {
      +      "image_version": "rc_visard_v1.1.0"
      +    },
      +    "fallback_booted": true,
      +    "inactive_image": {
      +      "image_version": "rc_visard_v1.0.0"
      +    },
      +    "next_boot_image": "active_image"
      +  },
      +  "hostname": "rc-visard-ng-1421823000987",
      +  "link_speed": 1000,
      +  "mac": "00:14:2D:2B:D8:AB",
      +  "ntp_status": {
      +    "accuracy": "48 ms",
      +    "synchronized": true
      +  },
      +  "ptp_status": {
      +    "master_ip": "",
      +    "offset": 0,
      +    "offset_dev": 0,
      +    "offset_mean": 0,
      +    "state": "off"
      +  },
      +  "ready": true,
      +  "serial": "1421823000987",
      +  "time": 1504080462.641875,
      +  "uptime": 65457.42
      +}
      +
      +
      + +++ + + + + + + + + + +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation (returns SysInfo)
      • +
      +
      Referenced Data Models:
        +
      +
      + +
      +
      +GET /system/backup
      +

      Get backup.

      +

      Template request

      +
      GET /api/v2/system/backup?pipelines=<pipelines>&load_carriers=<load_carriers>&regions_of_interest=<regions_of_interest>&grippers=<grippers> HTTP/1.1
      +
      +
      + +++ + + + + + + + + + +
      Query Parameters:
       
        +
      • pipelines (boolean) – backup pipelines with node settings, i.e. parameters and preferred_orientation (default: True) (optional)
      • +
      • load_carriers (boolean) – backup load_carriers (default: True) (optional)
      • +
      • regions_of_interest (boolean) – backup regions_of_interest (default: True) (optional)
      • +
      • grippers (boolean) – backup grippers (default: True) (optional)
      • +
      +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation
      • +
      +
      +
      + +
      +
      +POST /system/backup
      +

      Restore backup.

      +

      Template request

      +
      POST /api/v2/system/backup HTTP/1.1
      +Accept: application/json application/ubjson
      +
      +{}
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "return_code": {
      +    "message": "backup restored",
      +    "value": 0
      +  },
      +  "warnings": []
      +}
      +
      +
      + +++ + + + + + + + + + + + + +
      Request JSON Object:
       
        +
      • backup (object) – backup data as json object (required)
      • +
      +
      Request Headers:
       
        +
      • Accept – application/json application/ubjson
      • +
      +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation
      • +
      +
      +
      + +
      +
      +GET /system/dns
      +

      Get DNS settings.

      +

      Template request

      +
      GET /api/v2/system/dns HTTP/1.1
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "dns": {
      +    "dns_servers": [
      +      "10.0.0.1",
      +      "1.1.1.1"
      +    ],
      +    "manual_dns_servers": [
      +      "1.1.1.1"
      +    ]
      +  }
      +}
      +
      +
      + +++ + + + + + + + + + +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation (returns DNS)
      • +
      +
      Referenced Data Models:
        +
      +
      + +
      +
      +PUT /system/dns
      +

      Set manual DNS servers.

      +

      Template request

      +
      PUT /api/v2/system/dns HTTP/1.1
      +Accept: application/json application/ubjson
      +
      +{}
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "dns": {
      +    "dns_servers": [
      +      "10.0.0.1",
      +      "1.1.1.1"
      +    ],
      +    "manual_dns_servers": [
      +      "1.1.1.1"
      +    ]
      +  }
      +}
      +
      +
      + +++ + + + + + + + + + + + + + + + +
      Request JSON Object:
       
        +
      • manual_dns_servers (ManualDNSServers) – Manual DNS servers (required)
      • +
      +
      Request Headers:
       
        +
      • Accept – application/json application/ubjson
      • +
      +
      Response Headers:
        +
      Status Codes: +
      Referenced Data Models:
        +
      +
      + +
      +
      +GET /system/license
      +

      Get information about licenses installed on sensor.

      +

      Template request

      +
      GET /api/v2/system/license HTTP/1.1
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "components": {
      +    "calibration": true,
      +    "hand_eye_calibration": true,
      +    "rectification": true,
      +    "self_calibration": true,
      +    "stereo": true
      +  },
      +  "valid": true
      +}
      +
      +
      + +++ + + + + + + + + + +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation (returns LicenseInfo)
      • +
      +
      Referenced Data Models:
        +
      +
      + +
      +
      +POST /system/license
      +

      Update license on sensor with a license file.

      +

      Template request

      +
      POST /api/v2/system/license HTTP/1.1
      +Accept: multipart/form-data
      +
      +
      + +++ + + + + + + + + + +
      Form Parameters:
       
        +
      • file – license file (required)
      • +
      +
      Request Headers:
       
        +
      • Accept – multipart/form-data
      • +
      +
      Status Codes: +
      +
      + +
      +
      +GET /system/network
      +

      Get current network configuration.

      +

      Template request

      +
      GET /api/v2/system/network HTTP/1.1
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "current_method": "DHCP",
      +  "default_gateway": "10.0.3.254",
      +  "ip_address": "10.0.1.41",
      +  "settings": {
      +    "dhcp_enabled": true,
      +    "persistent_default_gateway": "",
      +    "persistent_ip_address": "192.168.0.10",
      +    "persistent_ip_enabled": false,
      +    "persistent_subnet_mask": "255.255.255.0"
      +  },
      +  "subnet_mask": "255.255.252.0"
      +}
      +
      +
      + +++ + + + + + + + + + +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation (returns NetworkInfo)
      • +
      +
      Referenced Data Models:
        +
      +
      + +
      +
      +GET /system/network/settings
      +

      Get current network settings.

      +

      Template request

      +
      GET /api/v2/system/network/settings HTTP/1.1
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "dhcp_enabled": true,
      +  "persistent_default_gateway": "",
      +  "persistent_ip_address": "192.168.0.10",
      +  "persistent_ip_enabled": false,
      +  "persistent_subnet_mask": "255.255.255.0"
      +}
      +
      +
      + +++ + + + + + + + + + +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation (returns NetworkSettings)
      • +
      +
      Referenced Data Models:
        +
      +
      + +
      +
      +PUT /system/network/settings
      +

      Set current network settings.

      +

      Template request

      +
      PUT /api/v2/system/network/settings HTTP/1.1
      +Accept: application/json application/ubjson
      +
      +{}
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "dhcp_enabled": true,
      +  "persistent_default_gateway": "",
      +  "persistent_ip_address": "192.168.0.10",
      +  "persistent_ip_enabled": false,
      +  "persistent_subnet_mask": "255.255.255.0"
      +}
      +
      +
      + +++ + + + + + + + + + + + + + + + +
      Request JSON Object:
       
        +
      • settings (NetworkSettings) – network settings to apply (required)
      • +
      +
      Request Headers:
       
        +
      • Accept – application/json application/ubjson
      • +
      +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation (returns NetworkSettings)
      • +
      • 400 Bad Request – invalid/missing arguments
      • +
      • 403 Forbidden – Changing network settings forbidden because this is locked by a running GigE Vision application.
      • +
      +
      Referenced Data Models:
        +
      +
      + +
      +
      +PUT /system/reboot
      +

      Reboot the device.

      +

      Template request

      +
      PUT /api/v2/system/reboot HTTP/1.1
      +
      +
      + +++ + + + +
      Status Codes:
        +
      • 200 OK – successful operation
      • +
      +
      +
      + +
      +
      +GET /system/rollback
      +

      Get information about currently active and inactive firmware/system images on device.

      +

      Template request

      +
      GET /api/v2/system/rollback HTTP/1.1
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "active_image": {
      +    "image_version": "rc_visard_ng_v22.10.0"
      +  },
      +  "fallback_booted": false,
      +  "inactive_image": {
      +    "image_version": "rc_visard_ng_v22.10.0"
      +  },
      +  "next_boot_image": "active_image"
      +}
      +
      +
      + +++ + + + + + + + + + +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation (returns FirmwareInfo)
      • +
      +
      Referenced Data Models:
        +
      +
      + +
      +
      +PUT /system/rollback
      +

      Rollback to previous firmware version (inactive system image).

      +

      Template request

      +
      PUT /api/v2/system/rollback HTTP/1.1
      +
      +
      + +++ + + + +
      Status Codes: +
      +
      + +
      +
      +GET /system/time
      +

      Get system time in UTC as string with format “YYYY-MM-DD hh:mm:ss”

      +

      Template request

      +
      GET /api/v2/system/time HTTP/1.1
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "utc": "2023-10-05 08:35:26"
      +}
      +
      +
      + +++ + + + + + + +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation
      • +
      +
      +
      + +
      +
      +PUT /system/time
      +

      Set system time in UTC as string with format “YYYY-MM-DD hh:mm:ss”

      +

      Template request

      +
      PUT /api/v2/system/time?utc=<utc> HTTP/1.1
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "utc": "2023-10-05 08:35:26"
      +}
      +
      +
      + +++ + + + + + + + + + +
      Query Parameters:
       
        +
      • utc (string) – Time in UTC as string with format “YYYY-MM-DD hh:mm:ss” (required)
      • +
      +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation
      • +
      • 400 Bad Request – invalid/missing arguments
      • +
      • 403 Forbidden – Changing time forbidden because time is synchronized via NTP or PTP.
      • +
      +
      +
      + +
      +
      +GET /system/ui_lock
      +

      Get UI lock status.

      +

      Template request

      +
      GET /api/v2/system/ui_lock HTTP/1.1
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "enabled": false
      +}
      +
      +
      + +++ + + + + + + + + + +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation (returns UILock)
      • +
      +
      Referenced Data Models:
        +
      +
      + +
      +
      +DELETE /system/ui_lock
      +

      Remove UI lock.

      +

      Template request

      +
      DELETE /api/v2/system/ui_lock HTTP/1.1
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "enabled": false,
      +  "valid": false
      +}
      +
      +
      + +++ + + + + + + +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation
      • +
      +
      +
      + +
      +
      +POST /system/ui_lock
      +

      Verify or set UI lock.

      +

      Template request

      +
      POST /api/v2/system/ui_lock?hash=<hash>&set=<set> HTTP/1.1
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "enabled": true,
      +  "valid": true
      +}
      +
      +
      + +++ + + + + + + + + + +
      Query Parameters:
       
        +
      • hash (string) – hash of the UI lock password (required)
      • +
      • set (boolean) – set new hash instead of veryfing (optional)
      • +
      +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation
      • +
      +
      +
      + +
      +
      +GET /system/update
      +

      Get information about currently active and inactive firmware/system images on device.

      +

      Template request

      +
      GET /api/v2/system/update HTTP/1.1
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "active_image": {
      +    "image_version": "rc_visard_ng_v22.10.0"
      +  },
      +  "fallback_booted": false,
      +  "inactive_image": {
      +    "image_version": "rc_visard_ng_v22.10.0"
      +  },
      +  "next_boot_image": "active_image"
      +}
      +
      +
      + +++ + + + + + + + + + +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation (returns FirmwareInfo)
      • +
      +
      Referenced Data Models:
        +
      +
      + +
      +
      +POST /system/update
      +

      Update firmware/system image with a mender artifact. Reboot is required afterwards in order to activate updated firmware version.

      +

      Template request

      +
      POST /api/v2/system/update HTTP/1.1
      +Accept: multipart/form-data
      +
      +
      + +++ + + + + + + + + + +
      Form Parameters:
       
        +
      • file – mender artifact file (required)
      • +
      +
      Request Headers:
       
        +
      • Accept – multipart/form-data
      • +
      +
      Status Codes: +
      +
      + +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/rest_api_userspace.html b/v24.04/en/rest_api_userspace.html new file mode 100644 index 0000000..e832cf6 --- /dev/null +++ b/v24.04/en/rest_api_userspace.html @@ -0,0 +1,751 @@ + + + + + + + + + + + UserSpace — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      UserSpace

      +

      UserSpace information including running apps and their published ports can be queried via the userspace endpoint. +An app can be of type container or compose (compose stack with potentially multiple containers).

      +
      +
      +GET /userspace
      +

      Get UserSpace information.

      +

      Template request

      +
      GET /api/v2/userspace HTTP/1.1
      +
      +
      +

      Sample response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "apps": [
      +    {
      +      "containers": [
      +        {
      +          "host_ports": [
      +            {
      +              "port": 8888,
      +              "protocol": "http"
      +            }
      +          ],
      +          "name": "hello_rc_visard_ng",
      +          "status": "running"
      +        }
      +      ],
      +      "name": "hello_rc_visard_ng",
      +      "type": "container"
      +    },
      +    {
      +      "containers": [
      +        {
      +          "host_ports": [
      +            {
      +              "port": 8080,
      +              "protocol": "http"
      +            }
      +          ],
      +          "name": "grafana",
      +          "status": "running"
      +        },
      +        {
      +          "host_ports": [
      +            {
      +              "port": 9090,
      +              "protocol": "http"
      +            }
      +          ],
      +          "name": "prometheus",
      +          "status": "running"
      +        }
      +      ],
      +      "name": "rc_visard_monitoring",
      +      "type": "compose"
      +    }
      +  ],
      +  "available": true,
      +  "enabled": true
      +}
      +
      +
      + +++ + + + + + + + + + +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation (returns UserSpace)
      • +
      +
      Referenced Data Models:
        +
      +
      + +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/revisions.html b/v24.04/en/revisions.html new file mode 100644 index 0000000..b0764aa --- /dev/null +++ b/v24.04/en/revisions.html @@ -0,0 +1,696 @@ + + + + + + + + + + + Introduction — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +

      Revisions

      +

      This product may be modified without notice, when necessary, due to product +improvements, modifications, or changes in specifications. If such modification +is made, the manual will also be revised; see revision information.

      +

      DOCUMENTATION REVISION 24.04.1 + Apr 24, 2024

      +

      Applicable to rc_visard NG firmware 24.04.x

      +
      +
      MANUFACTURER
      +
      Roboception GmbH
      +
      Kaflerstrasse 2
      +
      81241 Munich
      +
      Germany
      +
      CUSTOMER SUPPORT: support@roboception.de | +49 89 889 50 79-0 (09:00-17:00 CET)
      +

      +
      +

      Please read the operating manual in full and keep it with the product.

      +

      COPYRIGHT

      +

      This manual and the product it describes are protected by copyright. Unless +permitted by German intellectual property and related rights legislation, any +use and circulation of this content requires the prior consent of Roboception or +the individual owner of the rights. This manual and the product it describes +therefore, may not be reproduced in whole or in part, whether for sale or not, +without prior written consent from Roboception.

      +

      Information provided in this document is believed to be accurate and reliable. +However, Roboception assumes no responsibility for its use.

      +

      Differences may exist between the manual and the product if the product has +been modified after the manual’s edition date. The information contained in +this document is subject to change without notice.

      +
      +

      Introduction

      +

      Indications in the manual

      +

      To prevent damage to the equipment and ensure the user’s safety, this manual indicates each precaution related to safety with Warning. Supplementary information is provided as a Note.

      +
      +

      Warning

      +

      Warnings in this manual indicate procedures and actions that must be observed to avoid danger of injury to the operator/user, or damage to the equipment. Software-related warnings indicate procedures that must be observed to avoid malfunctions or unexpected behavior of the software.

      +
      +
      +

      Note

      +

      Notes are used in this manual to indicate supplementary relevant information.

      +
      +
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/roi.html b/v24.04/en/roi.html new file mode 100644 index 0000000..1a167df --- /dev/null +++ b/v24.04/en/roi.html @@ -0,0 +1,1211 @@ + + + + + + + + + + + RoiDB — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      RoiDB

      +
      +

      Introduction

      +

      The RoiDB module (region of interest database module) allows the global definition of 2D and 3D regions of interest, +which can then be used in many detection modules. The ROIs are available for all +modules supporting 2D or 3D ROIs on the rc_visard NG.

      +

      The RoiDB module is a base module which is available on every rc_visard NG.

      +

      3D ROIs can be used in ItemPick and BoxPick. 2D ROIs can be used in SilhouetteMatch, +and LoadCarrier.

      + + ++++ + + + + + + + + + + + + + + + + + +
      Table 49 Specifications of the RoiDB module
      Supported ROI types2D, 3D
      Supported ROI geometries2D ROI: rectangle, 3D ROI: box, sphere
      Max. number of ROIs2D: 100, 3D: 100
      ROIs available in2D: SilhouetteMatch, LoadCarrier, 3D: ItemPick and BoxPick
      Supported reference framescamera, external
      +
      +
      +

      Region of interest

      +

      A region of interest (ROI) defines a volume in space (3D region of interest, region_of_interest), +or a rectangular region in the left camera image (2D region of interest, region_of_interest_2d) which is of interest for +a specific user-application.

      +

      A ROI can narrow the volume where a load carrier is searched for, or select a volume +which only contains items to be detected and/or grasped. +Processing times can significantly decrease when using a ROI.

      +

      3D regions of interest of the following types (type) are supported:

      +
      +
        +
      • BOX, with dimensions box.x, box.y, box.z.
      • +
      • SPHERE, with radius sphere.radius.
      • +
      +
      +

      The user can specify the 3D region of interest pose in the camera or the external coordinate system. +External can only be chosen if a +Hand-eye calibration is available. +When the sensor is robot mounted, and the region of interest is defined in the external frame, the current +robot pose must be given to every detect service call that uses this region of interest.

      +

      A 2D ROI is defined as a rectangular part of the left camera image, and can be set via the +REST-API interface +or the rc_visard NG Web GUI on the page +Regions of Interest under Database. +The Web GUI offers an easy-to-use selection tool. +Each ROI must have a unique name to address a specific 2D ROI.

      +

      In the REST-API, a 2D ROI is defined by the following values:

      +
        +
      • id: Unique name of the region of interest
      • +
      • offset_x, offset_y: offset in pixels along the x-axis and y-axis from the top-left corner of the image, respectively
      • +
      • width, height: width and height in pixels
      • +
      +

      The rc_visard NG can persistently store up to 100 different 3D regions of interest and the same number of 2D regions of interest. +The configuration of regions of interest is normally performed offline, during +the set up of the desired application. +This can be done via the REST-API interface +of RoiDB module, or in +the rc_visard NG Web GUI on the page +Regions of Interest under Database.

      +
      +

      Note

      +

      The configured regions of interest +are persistent even over firmware updates and rollbacks.

      +
      +
      +
      +

      Interaction with other modules

      +

      Internally, the RoiDB module depends on, and interacts with other on-board +modules as listed below.

      +
      +

      Hand-eye calibration

      +

      In case the camera has been calibrated to a robot, the pose of a 3D ROI +can be provided in the robot coordinate frame by setting the corresponding +pose_frame argument.

      +

      Two different pose_frame values can be chosen:

      +
        +
      1. Camera frame (camera). +The ROI pose is provided in the camera frame, +and no prior knowledge about the pose of the camera in the environment is required. +This means that the configured load carriers move with the camera. +It is the user’s responsibility to update the configured poses +if the camera frame moves (e.g. with a robot-mounted camera).
      2. +
      3. External frame (external). +The ROI pose is provided in the external frame, +configured by the user during the hand-eye calibration process. +The module relies on the on-board +Hand-eye calibration module +to retrieve the sensor mounting (static or robot mounted) and +the hand-eye transformation.
      4. +
      +
      +

      Note

      +

      If no hand-eye calibration is available, all pose_frame values should be set to camera.

      +
      +

      All pose_frame values that are not camera or external are rejected.

      +
      +
      +
      +

      Services

      +

      The RoiDB module is called rc_roi_db in the REST-API and is represented in the +Web GUI under +Database ‣ Regions of Interest. +The user can explore and call the RoiDB module’s services, +e.g. for development and testing, using the +REST-API interface or +the Web GUI.

      +

      The RoiDB module offers the following services.

      +
      +

      set_region_of_interest

      +
      +

      Persistently stores a 3D region of interest on the rc_visard NG. +All configured 3D regions of interest are persistent over firmware updates and rollbacks.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      PUT http://<host>/api/v2/nodes/rc_roi_db/services/set_region_of_interest
      +
      +
      +
      + +
      +

      Details for the definition of the region_of_interest type are given in +Region of interest.

      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "region_of_interest": {
      +      "box": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "id": "string",
      +      "pose": {
      +        "orientation": {
      +          "w": "float64",
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "position": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        }
      +      },
      +      "pose_frame": "string",
      +      "sphere": {
      +        "radius": "float64"
      +      },
      +      "type": "string"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "set_region_of_interest",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      set_region_of_interest_2d

      +
      +

      Persistently stores a 2D region of interest on the rc_visard NG. +All configured 2D regions of interest are persistent over firmware updates and rollbacks.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      PUT http://<host>/api/v2/nodes/rc_roi_db/services/set_region_of_interest_2d
      +
      +
      +
      + +
      +

      Details for the definition of the region_of_interest_2d type are given in +Region of interest.

      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "region_of_interest_2d": {
      +      "height": "uint32",
      +      "id": "string",
      +      "offset_x": "uint32",
      +      "offset_y": "uint32",
      +      "width": "uint32"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "set_region_of_interest_2d",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      get_regions_of_interest

      +
      +

      Returns the configured 3D regions of interest with the requested region_of_interest_ids.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      PUT http://<host>/api/v2/nodes/rc_roi_db/services/get_regions_of_interest
      +
      +
      +
      + +
      +

      If no region_of_interest_ids are provided, all configured 3D regions of interest are returned.

      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "region_of_interest_ids": [
      +      "string"
      +    ]
      +  }
      +}
      +
      +
      +
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "get_regions_of_interest",
      +  "response": {
      +    "regions_of_interest": [
      +      {
      +        "box": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "id": "string",
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "pose_frame": "string",
      +        "sphere": {
      +          "radius": "float64"
      +        },
      +        "type": "string"
      +      }
      +    ],
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      get_regions_of_interest_2d

      +
      +

      Returns the configured 2D regions of interest with the requested region_of_interest_2d_ids.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      PUT http://<host>/api/v2/nodes/rc_roi_db/services/get_regions_of_interest_2d
      +
      +
      +
      + +
      +

      If no region_of_interest_2d_ids are provided, all configured 2D regions of interest are returned.

      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "region_of_interest_2d_ids": [
      +      "string"
      +    ]
      +  }
      +}
      +
      +
      +
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "get_regions_of_interest_2d",
      +  "response": {
      +    "regions_of_interest": [
      +      {
      +        "height": "uint32",
      +        "id": "string",
      +        "offset_x": "uint32",
      +        "offset_y": "uint32",
      +        "width": "uint32"
      +      }
      +    ],
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      delete_regions_of_interest

      +
      +

      Deletes the configured 3D regions of interest with the requested region_of_interest_ids.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      PUT http://<host>/api/v2/nodes/rc_roi_db/services/delete_regions_of_interest
      +
      +
      +
      + +
      +

      All regions of interest to be deleted must be explicitly stated in region_of_interest_ids.

      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "region_of_interest_ids": [
      +      "string"
      +    ]
      +  }
      +}
      +
      +
      +
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "delete_regions_of_interest",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      delete_regions_of_interest_2d

      +
      +

      Deletes the configured 2D regions of interest with the requested region_of_interest_2d_ids.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      PUT http://<host>/api/v2/nodes/rc_roi_db/services/delete_regions_of_interest_2d
      +
      +
      +
      + +
      +

      All 2D regions of interest to be deleted must be explicitly stated in region_of_interest_2d_ids.

      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "region_of_interest_2d_ids": [
      +      "string"
      +    ]
      +  }
      +}
      +
      +
      +
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "delete_regions_of_interest_2d",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +

      Return codes

      +

      Each service response contains a return_code, +which consists of a value plus an optional message. +A successful service returns with a return_code value of 0. +Negative return_code values indicate that the service failed. +Positive return_code values indicate that the service succeeded with additional information. +The smaller value is selected in case a service has multiple return_code values, +but all messages are appended in the return_code message.

      +

      The following table contains a list of common codes:

      + + ++++ + + + + + + + + + + + + + + + + + + + + + + +
      Table 50 Return codes of the RoiDB module’s services
      CodeDescription
      0Success
      -1An invalid argument was provided
      -10New element could not be added as the maximum storage capacity of regions of interest has been exceeded
      10The maximum storage capacity of regions of interest has been reached
      11An existent persistent model was overwritten by the call to set_region_of_interest or set_region_of_interest_2d
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/safety.html b/v24.04/en/safety.html new file mode 100644 index 0000000..68748d6 --- /dev/null +++ b/v24.04/en/safety.html @@ -0,0 +1,732 @@ + + + + + + + + + + + Safety — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Safety

      +
      +

      Warning

      +

      The operator must have read and understood all of the instructions in this +manual before handling the rc_visard NG product.

      +
      +
      +

      Note

      +

      The term “operator” refers to anyone responsible for any of the following tasks +performed in conjunction with rc_visard NG:

      +
      +
        +
      • Installation
      • +
      • Maintenance
      • +
      • Inspection
      • +
      • Calibration
      • +
      • Programming
      • +
      • Decommissioning
      • +
      +
      +
      +

      This manual explains the rc_visard NG’s various components and general operations regarding the +product’s whole life-cycle, from installation through operation to decommissioning.

      +

      The drawings and photos in this documentation are representative examples; differences may exist +between them and the delivered product.

      +
      +

      General warnings

      +
      +

      Note

      +

      Any use of the rc_visard NG in noncompliance with these warnings is inappropriate and +may cause injury or damage as well as void the warranty.

      +
      +
      +

      Warning

      +
        +
      • The rc_visard NG needs to be properly mounted before use.
      • +
      • All cable sets need to be secured to the rc_visard NG and the mount.
      • +
      • Cords must be at most 30 m long.
      • +
      • An appropriate DC power source must supply power to the rc_visard NG.
      • +
      • Each rc_visard NG must be connected to a separate power supply.
      • +
      • The rc_visard NG’s housing must be grounded.
      • +
      • The rc_visard NG’s and any related equipment’s safety guidelines must always be satisfied.
      • +
      • The rc_visard NG does not fall under the purview of the machinery, low voltage, or medical directives.
      • +
      +
      +

      Risk assessment and final application:

      +

      The rc_visard NG may be used on a robot. Robot, rc_visard NG, and any other equipment used in the final +application must be evaluated with a risk assessment. The system integrator’s duty is to +ensure respect for all local safety measures and regulations. Depending on the application, +there may be risks that need additional protection/safety measures.

      +
      +
      +

      Intended use

      +

      The rc_visard NG is intended for data acquisition (e.g., images, disparity images) +in stationary and mobile robotic applications. The rc_visard NG is intended for installation on a +robot, automated machinery, mobile platform, or stationary equipment. It can also be used for data +acquisition in other applications.

      +
      +

      Warning

      +

      The rc_visard NG is NOT intended for safety critical applications.

      +
      +

      The GigE Vision® industry standard used by the rc_visard NG does not support authentication and encryption. +All data from and to the device is transmitted without authentication and encryption and could be +monitored or manipulated by a third party. It is the operator’s responsibility to connect the +rc_visard NG only to a secured internal network.

      +
      +

      Warning

      +

      The rc_visard NG must be connected to secured internal networks.

      +
      +

      The rc_visard NG may be used only within the scope of its technical specification. Any other use of the +product is deemed unintended use. Roboception will not be liable for any damages resulting from any +improper or unintended use.

      +
      +

      Warning

      +

      Always comply with local and/or national laws, regulations and directives on automation +safety and general machine safety.

      +
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/search.html b/v24.04/en/search.html new file mode 100644 index 0000000..6127328 --- /dev/null +++ b/v24.04/en/search.html @@ -0,0 +1,671 @@ + + + + + + + + + + + Search — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + + + + +
      + +
      + +
      +
      + +
      +
      +
      + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/searchindex.js b/v24.04/en/searchindex.js new file mode 100644 index 0000000..227289d --- /dev/null +++ b/v24.04/en/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({docnames:["accessories","appendix","camera_calibration","camera_modules","collisioncheck","concept_stereo","concepts","configuration_modules","contact","database_modules","detection_modules","disposal","eki","general","gigevision","glossary","gripper_db","grpc","handeye_calibration","hardware_spec","index","installation","interfaces","iocontrol","itempick","loadcarrier","loadcarrier_db","maintenance","modules","opc_ua","pose_format_abb","pose_format_fanuc","pose_format_franka_emika","pose_format_fruitcore_horst","pose_format_kawasaki","pose_format_kuka","pose_format_mitsubishi","pose_format_rt","pose_format_ur","pose_format_yaskawa","rest_api","rest_api_datamodel","rest_api_general","rest_api_nodes","rest_api_swagger_ui","rest_api_syslogs","rest_api_userspace","revisions","roi","safety","silhouettematch","standards","stereo_camera","stereo_matching","tagdetect","time_sync","troubleshooting","userspace","warranty","webgui"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:55},filenames:["accessories.rst","appendix.rst","camera_calibration.rst","camera_modules.rst","collisioncheck.rst","concept_stereo.rst","concepts.rst","configuration_modules.rst","contact.rst","database_modules.rst","detection_modules.rst","disposal.rst","eki.rst","general.rst","gigevision.rst","glossary.rst","gripper_db.rst","grpc.rst","handeye_calibration.rst","hardware_spec.rst","index.rst","installation.rst","interfaces.rst","iocontrol.rst","itempick.rst","loadcarrier.rst","loadcarrier_db.rst","maintenance.rst","modules.rst","opc_ua.rst","pose_format_abb.rst","pose_format_fanuc.rst","pose_format_franka_emika.rst","pose_format_fruitcore_horst.rst","pose_format_kawasaki.rst","pose_format_kuka.rst","pose_format_mitsubishi.rst","pose_format_rt.rst","pose_format_ur.rst","pose_format_yaskawa.rst","rest_api.rst","rest_api_datamodel.rst","rest_api_general.rst","rest_api_nodes.rst","rest_api_swagger_ui.rst","rest_api_syslogs.rst","rest_api_userspace.rst","revisions.rst","roi.rst","safety.rst","silhouettematch.rst","standards.rst","stereo_camera.rst","stereo_matching.rst","tagdetect.rst","time_sync.rst","troubleshooting.rst","userspace.rst","warranty.rst","webgui.rst"],objects:{"":{"/cad/gripper_elements":[16,0,1,"get--cad-gripper_elements"],"/cad/gripper_elements/{id}":[16,2,1,"put--cad-gripper_elements-id"],"/logs":[45,0,1,"get--logs"],"/logs/{log}":[45,0,1,"get--logs-log"],"/nodes":[43,0,1,"get--nodes"],"/nodes/{node}":[43,0,1,"get--nodes-node"],"/nodes/{node}/services":[43,0,1,"get--nodes-node-services"],"/nodes/{node}/services/{service}":[43,2,1,"put--nodes-node-services-service"],"/nodes/{node}/status":[43,0,1,"get--nodes-node-status"],"/pipelines/{pipeline}/nodes":[43,0,1,"get--pipelines-pipeline-nodes"],"/pipelines/{pipeline}/nodes/{node}":[43,0,1,"get--pipelines-pipeline-nodes-node"],"/pipelines/{pipeline}/nodes/{node}/parameters":[43,2,1,"put--pipelines-pipeline-nodes-node-parameters"],"/pipelines/{pipeline}/nodes/{node}/parameters/{param}":[43,2,1,"put--pipelines-pipeline-nodes-node-parameters-param"],"/pipelines/{pipeline}/nodes/{node}/services":[43,0,1,"get--pipelines-pipeline-nodes-node-services"],"/pipelines/{pipeline}/nodes/{node}/services/{service}":[43,2,1,"put--pipelines-pipeline-nodes-node-services-service"],"/pipelines/{pipeline}/nodes/{node}/status":[43,0,1,"get--pipelines-pipeline-nodes-node-status"],"/system":[45,0,1,"get--system"],"/system/backup":[45,3,1,"post--system-backup"],"/system/dns":[45,2,1,"put--system-dns"],"/system/license":[45,3,1,"post--system-license"],"/system/network":[45,0,1,"get--system-network"],"/system/network/settings":[45,2,1,"put--system-network-settings"],"/system/reboot":[45,2,1,"put--system-reboot"],"/system/rollback":[45,2,1,"put--system-rollback"],"/system/time":[45,2,1,"put--system-time"],"/system/ui_lock":[45,3,1,"post--system-ui_lock"],"/system/update":[45,3,1,"post--system-update"],"/templates/rc_boxpick":[24,0,1,"get--templates-rc_boxpick"],"/templates/rc_boxpick/{id}":[24,2,1,"put--templates-rc_boxpick-id"],"/templates/rc_silhouettematch":[50,0,1,"get--templates-rc_silhouettematch"],"/templates/rc_silhouettematch/{id}":[50,2,1,"put--templates-rc_silhouettematch-id"],"/userspace":[46,0,1,"get--userspace"]}},objnames:{"0":["http","get","HTTP get"],"1":["http","delete","HTTP delete"],"2":["http","put","HTTP put"],"3":["http","post","HTTP post"]},objtypes:{"0":"http:get","1":"http:delete","2":"http:put","3":"http:post"},terms:{"0x81080001":14,"10m":0,"10x10":25,"16h5":54,"1mp":17,"21x21":54,"24v":0,"25h9":54,"25h9_3":54,"30w":0,"36h10":54,"36h11":54,"36h11_5":54,"3d_":53,"3x3":54,"41h12":54,"4dof":18,"4x3":25,"4x4":54,"4x8":54,"6x6":54,"8con":0,"8gb":19,"8x8":25,"94b":0,"altger\u00e4t":11,"boolean":[14,41,45],"byte":[14,17,41],"case":[2,4,12,14,15,16,17,18,21,23,24,25,26,27,34,48,50,52,53,54,56,57,59],"class":[0,19],"default":[0,2,4,12,14,15,17,18,19,23,24,25,27,41,42,43,45,50,52,53,54,55,57],"enum":17,"final":[1,2,24,49,50],"float":[12,14,17,19,32,41],"function":[14,16,18,21,23,24,25,27,28,32,37,40,43,44,50,52,56],"import":[16,18,19,27,56,59],"int":12,"long":[16,24,49,50,56],"new":[4,16,18,24,25,26,27,45,48,50,53,54],"public":57,"return":[11,14,17,23,27,32,37,41,42,43,45,46],"short":[2,12,14,15,41],"static":[14,18,19,21,24,25,26,27,48,50,52,54],"switch":[14,21,43,52,53,56],"true":[2,4,14,16,18,24,25,41,43,45,46,50,52,53,54],"try":[50,54,55,56],"void":[27,49,56,58],"while":[1,12,14,16,18,24,42,52,54,55,56,59],Adding:50,DNS:[15,21,41,45,59],Doing:[2,58],FPS:[14,23,53],For:[0,1,2,5,8,11,12,14,16,17,18,19,21,23,24,25,26,27,42,50,53,54,58,59],IDs:[12,16,25,50,54],Its:43,NOT:49,Not:[16,24,42,43,45,50],One:[0,21],That:[4,18,24,44,50,53],The:[0,1,2,3,5,6,7,9,10,11,12,13,14,15,16,17,19,21,22,26,27,28,29,31,32,34,35,36,37,38,39,41,42,43,44,45,47,48,49,51,55,56,57,58,59],Their:14,Then:[24,27,50,57],There:[17,24,30,33,42,50,54],These:[3,10,12,14,18,19,24,25,50,52,53,54],Use:[4,12,24,25,50,54],Used:14,Using:[14,27,44],With:[13,24,50,53,54],a_0:32,a_1:32,a_2:32,a_3:32,a_4:32,a_5:32,a_6:32,a_7:32,a_8:32,a_9:32,a_r:[34,35,36],abb:1,abc:[1,12,15],abl:[5,12,21,56],abort:27,about:[5,11,14,16,17,18,21,24,25,26,27,41,42,43,45,48,50,54,58,59],abov:[2,4,14,15,24,26,43,50,53,54,56],absenc:2,acceler:6,accept:[15,16,18,21,24,26,43,45,50,54],access:[3,12,15,18,19,20,21,27,28,40,41,42,44,45,50,54,55],accessori:[19,20],accident:59,accompani:11,accord:[0,11,14,23,43,50,53],accordingli:[0,16,26,50],account:[14,24,57],accumul:[11,53],accur:[2,17,18,24,47,50,54],accuraci:[2,5,15,18,41,45,53],achiev:[2,5,17,18,50,53],aco:[34,38],acquir:[3,24,25,28,50,52,53,54,59],acquisit:[13,14,17,18,23,24,25,43,49,50,59],acquisition_mod:12,acquisition_trigg:[12,43],acquisitionalternatefilt:14,acquisitionframer:14,acquisitionmultipartmod:14,across:[27,56],act:[26,55],action:[42,44,47],activ:[10,12,16,21,24,27,29,41,45,50,53,55],active_imag:[41,45],actor:0,actual:[2,14,17,19,21,25,41,42,44,50,52,53,54],adapt:[0,12,19,52],adaptiveout1:[14,17,24,25,50,52],add:[12,17,18,50],added:[4,14,16,24,25,26,48,50],adding:[12,50,53],addit:[2,4,12,14,16,18,19,23,24,25,26,27,43,48,49,50,53,54,56],addition:[13,15,16,24,53,59],address:[15,20,21,27,41,42,45,48,56,59],adequ:[19,56],adhes:19,adjac:56,adjoin:24,adjust:[2,18,50,52,53],administr:[15,21,57],advanc:[14,53],advantag:[17,54],affect:[4,18,24,25,50,52,53,54,59],after:[1,2,12,16,17,18,21,24,25,27,47,50,52,53,54,57,59],afterward:45,again:[18,24,27,54,59],against:[4,59],agnost:18,aid:0,air:19,airflow:[19,56],algorithm:[2,5,15,25,40,43,53],align:[1,2,24,50,52,54],all:[2,4,12,13,14,15,16,17,18,19,21,23,24,25,26,27,28,31,32,34,35,36,39,42,43,44,48,49,50,52,53,54,55,56,57,58,59],allow:[2,9,10,12,14,16,17,18,19,21,23,24,25,26,42,43,44,48,50,53,54,55],along:[1,6,18,24,48,50],alpha:1,alreadi:[1,12,14,21,24,45,54],also:[1,2,3,4,12,14,15,16,17,18,21,23,24,25,26,27,28,29,37,40,43,47,49,50,52,53,54,55,56,59],altern:[17,18,24,25,50,53,56,59],alternateexposureact:17,although:[44,54],aluminum:19,alwai:[1,2,4,12,14,16,18,19,21,23,24,42,49,50,52,53,54],ambient:56,ambigu:[24,26,53,54],among:[14,50],amongst:44,amount:54,amplitud:56,angl:[0,1,18,19,31,32,34,35,36,39,50,54],ani:[0,4,5,11,12,14,16,18,21,24,25,27,40,44,47,49,50,53,54,58,59],anim:[24,50],anoth:[16,21,25],antireflect:27,anyedg:52,anyon:[49,59],anytim:21,apart:[17,24,54,58],api:[2,4,7,9,12,14,15,17,18,20,22,23,25,26,27,28,41,43,44,45,46,48,52,53,54,55,57,59],app:[32,41,46,57],appear:[2,5,15,24,25,50,52,53,54,56],append:[4,15,16,24,25,26,42,48,54,59],appendix:20,appli:[1,2,4,12,18,21,23,25,27,37,41,45,50,52,53,56,57],applic:[7,10,13,14,16,18,19,20,21,22,26,27,28,42,43,45,46,47,48,49,50,52,53,54,55,56,58,59],approach:[5,18],appropri:[0,2,18,24,49,50],approv:58,approxim:[5,18,19,25],apr:47,april:54,apriltag:10,arbitrari:[15,54],architectur:27,archiv:12,area:[2,15,24,50,52,53],arg:[4,12,16,18,24,25,26,41,43,48,50,53,54],argument:[4,12,16,18,23,24,25,26,32,37,41,42,43,44,45,48,50,52,53,54],argx:12,argx_typ:12,aris:[11,54],arm:19,around:[1,2,15,16,18,19,24,25,31,34,35,36,39,50,52,53,54,56],arrai:[1,12,16,24,29,31,32,34,35,36,37,38,39,41,43,45,50],arrow:[2,54],art:[0,15],artifact:[27,45],artifici:53,ascii:54,asid:[27,40],asin:[31,32,35,36,39],ask:[11,59],assess:49,assign:[4,15,18,21,24,41,50,54,56],associ:[15,24,50,54],assum:[4,14,24,47,50,53,54],atan:[31,32,34,35,36,39],attach:[16,18,19,50,54],attempt:58,attribut:[12,29,41,42,44],authent:49,author:[11,58],auto:[2,14,24,25,43,50,53,54,56],autom:49,automat:[2,12,15,16,24,25,27,44,50,52,53,54,59],avail:[0,2,4,9,12,13,14,15,16,17,18,19,21,23,24,25,26,27,28,29,41,43,44,45,46,48,50,52,53,54,57],averag:[14,17,19,52,53],avoid:[2,21,24,27,47,50,52,54],awai:[2,14,19,23,50,53],awar:[1,2,44],axes:[1,18,24,50,52,54],axi:[1,16,24,26,31,34,35,36,39,48,50,54],b_r:[35,36],back:[12,19,21,54],background:[2,25,50],backup:[20,45,59],backward:54,bad:[2,16,24,42,43,45,50],balanc:14,balanceratio:14,balanceratioselector:14,balancewhiteauto:14,bandwidth:[52,59],bar:[27,50,52,59],barrel:0,base:[1,2,4,14,16,17,18,21,23,24,25,26,48,52,53,54],base_plan:50,baselin:[14,17,19,43,52,53,59],baseplan:4,basi:[2,51],basic:15,batteri:11,becaus:[2,14,16,17,21,24,26,27,43,45,50,53,56],becom:[2,14,21,27,52,59],been:[1,4,5,12,16,24,25,26,47,48,50,54],befor:[2,11,12,18,21,49,50,52,53,54],beforehand:[4,16,50],begin:[1,27,31,32,34,35,36,37,38,39],behav:58,behavior:[14,27,42,43,44,47],behind:[4,5,24,25,50,53,54],being:[2,21,23,24,53,56],believ:47,belong:[12,14,24,50],below:[0,2,4,12,16,18,23,24,25,26,32,42,44,48,50,52,53,54,57,59],bend:19,best:[5,14,24,50,52,54],beta:1,better:18,between:[1,2,4,5,14,15,16,17,18,19,22,24,25,26,43,47,49,50,52,53,54,56],bigendian:17,biggest:24,bin:[17,24,25,26,50],binning_method:17,binningmethod:17,bit:[23,54],bitmask:17,black:[2,5,24,54],block:14,blue:[14,50,56],blur:[2,50,52,54,56],board:[4,13,16,18,19,21,23,24,25,26,28,48,50,53,54],bodi:[16,42,44],bold:50,bolt:19,book:24,bool:[4,12,17,18,24,25,41,43,50,52,53,54],boot:[14,19,21,41,45,56,57],border:[2,15,18,53,54],both:[0,1,2,3,5,14,16,18,19,21,24,25,26,50,52,53,54],bottom:[16,19,26,53],bound:[16,21,57],boundari:[24,50],box:[10,13,16,24,26,48,50],boxpick:[4,10,16,25,26,48],bracket:[4,18,24,25,50,53],bridg:57,brief:56,briefli:[2,56],bright:[14,17,50,56],brighter:52,broadcast:[21,56],brochur:24,browser:[21,27,42,56,59],brush:27,bryan:1,buff:12,buffer:[12,14,17],buffsiz:12,built:[16,41],bump:54,bundl:[40,43],burn:19,button:[2,18,21,27,50,52,53,54,59],c_r:[35,36],cabl:[0,18,19,21,49,56,58],cad:[19,27,41,50],cage:26,calcul:[12,18,25,31,32,34,35,36,39,54],calibr:[5,7,12,13,19,20,22,28,40,41,43,45,49,52,53,56,59],calibrate_base_plan:12,call:[1,2,4,5,12,14,16,17,19,21,22,23,24,25,26,27,35,38,40,41,42,43,44,48,50,52,54,57],camera:[5,6,7,12,13,14,15,17,19,20,22,23,26,28,40,42,43,45,48,51,53,54],can:[0,1,2,4,5,8,10,11,12,13,14,15,16,17,18,19,21,23,24,25,26,27,28,29,31,32,34,35,36,37,38,39,40,41,42,43,44,46,48,49,50,52,53,54,55,56,57,59],cannot:[2,4,15,18,21,24,25,26,27,50,52,53,56,57],capabl:[13,53],capac:[4,16,24,25,26,48,50],captur:[5,14,17,24,25,52,54],capture_new:53,cardan:1,care:[18,27,54],carri:54,carrier:[4,9,10,12,16,24,27,28,42,48,50,59],casual:59,cat5:0,categori:23,caus:[2,18,21,24,26,49,53,56,58],caution:58,ccc:[1,37,38],cccc:[31,32,34,35,36,37,38,39],cdot:[14,18,38,53],cell:[2,25,53],cell_count:53,cell_posit:25,cell_siz:25,cells_filling_level:25,celsiu:52,center:[15,16,18,19,24,25,26,50,53,54],central:15,certain:[2,14,24,28,40,43,50,54],certifi:[0,19],cet:47,chang:[2,5,12,14,15,16,17,18,21,23,24,25,26,27,43,44,45,47,50,52,53,54,56,58,59],change_st:12,channel:14,chapter:[1,24],charact:[12,15,54],charg:21,check:[2,7,9,15,16,17,24,26,27,29,56,57],check_collis:12,check_collisions_with_:50,check_collisions_with_base_plan:4,check_collisions_with_match:4,check_collisions_with_point_cloud:4,check_flang:16,child:[12,16],choos:[14,18,27,56],chosen:[4,14,16,18,21,24,25,26,27,48,50,52,54,59],chrome:[21,59],chunkcomponentid:14,chunkcomponentidvalu:14,chunkcomponentselector:14,chunklinestatusal:14,chunkmodeact:14,chunkpartindex:14,chunkrcout1reduct:14,chunkscan3d:14,chunkscan3dbaselin:14,chunkscan3dcoordinatescal:14,chunkscan3dfocallength:14,chunkscan3dprincipalpointu:14,chunkscan3dprincipalpointv:14,circl:50,circuitri:19,circul:47,circular:27,clamp:19,classifi:0,clean:[20,56],clear:[12,18,27,50,54],clearli:[25,54],click:[2,18,21,24,27,44,50,53,54,56,57,59],client:[12,14,15,27,29,40,43,45,55,56,59],clock:[15,41,45,55],clone:57,close:[2,5,17,18,27,50,56],closer:[5,53],closest:[17,50],cloth:27,cloud:[4,13,14,17,24],cluster:50,clutter:50,coat:27,code:[0,10,19,21,23,42,43,45,46],collect:[11,15,18],collid:[4,16,24,50],colliding_grasp:4,collis:[7,9,16,17,24,26],collision_check:[4,50],collision_check_tim:4,collision_detect:[4,24,50],collision_free_grasp:4,collisioncheck:[7,16,26],color:[14,17,20,21,43,50,52],column:[14,17,32,52,53],com:[0,8,12,14,15,17,19,21,27,53,57],combin:[4,6,14,16,24,25,32,50,52,53,54,56],come:[14,28,54],comma:57,command:[12,14,21,24,42,44,55],commiss:11,commod:54,common:[1,2,4,12,16,24,25,26,42,48,50,54],commun:[12,15,17,21],compar:[5,14,54,55],comparison:[16,17],compart:24,compat:[13,14,18,21,27],complement:24,complet:[2,5,14,18,21,27,43,50,53,54,56,57],complex:[44,50,58],compli:[49,58],compliant:14,compon:[0,14,15,19,40,41,45,49,50],componenten:[14,56],componentidvalu:14,components_constraint:41,componentselector:[14,56],compos:[41,46,57],comprehens:40,compress:56,compromis:27,comput:[1,2,3,5,6,12,13,14,15,16,17,19,21,23,25,26,27,28,31,32,34,35,36,39,40,41,50,52,54,56,59],compute_grasp:[4,12,26],conclud:50,concret:54,condens:19,condit:[2,20,27,50,53,56],conduct:18,confid:[3,6,12,13,14,17,20,24,25,28,42,59],confidence8:14,confidence_en:17,config:12,configur:[2,4,9,13,14,15,16,18,20,22,23,24,25,26,27,28,41,42,43,45,48,50,54,55,56,59],confirm:27,conflict:21,conform:51,conjunct:[24,25,49,50],connect:[14,15,16,17,18,19,20,21,23,24,25,42,43,49,50,52,53,54,58,59],connector:[0,21,56],consecut:[14,53],consent:47,consid:[4,16,18,23,24,25,26,50,52,54,56],consider:54,consist:[0,1,2,3,4,12,16,21,23,24,25,26,31,32,34,38,39,48,50,54],constant:52,constrain:[18,41],constraint:[24,41,54],consum:56,consumpt:19,contact:[0,11,20,21,27,29,56,58],contain:[0,4,11,12,14,16,17,18,19,23,24,25,26,27,41,46,47,48,50,53,54,56,57,59],contamin:19,content:[16,24,25,27,41,42,43,45,46,47,50],context:[42,43],continu:[2,12,14,17,18,50,52,53,54],contour:50,contrast:[15,25,50],control:[2,7,12,14,15,18,19,21,45,51,52,53,54],convect:[19,56],conveni:[21,55],convent:[1,14,32,34,35],convers:[1,12,30,33,53],convert:[12,16,31,32,34,35,36,39,53],cool:[19,56],coord3d_c16:14,coordin:[1,4,12,14,16,18,20,24,25,26,48,50,53,54],copyright:47,cord:49,corner:[2,24,48,50,53,54],correct:[2,11,18,19,50,55,56],correctli:[2,11,18,52,58],correspond:[4,5,12,14,16,17,18,23,24,25,26,27,28,32,43,48,50,52,53,54,56,59],corros:19,corrupt:2,cos:[1,31,32,34,35,36,38,39],could:[2,4,11,14,16,18,24,25,26,27,41,42,43,48,49,50,56,58],count:[25,53],counter:2,counterpart:14,coupl:19,cover:[2,24,53,54],coverag:[25,53],cpu:53,creat:[20,24,41,42,50,57],creation:16,critic:49,crop_dist:26,cross:2,crucial:[16,54],csv:59,cumbersom:2,cup:4,curl:[42,43,44],current:[0,2,6,12,14,15,16,17,18,21,23,24,25,27,40,41,42,43,44,45,48,50,52,53,54,55,56,57,59],current_method:[41,45],current_st:[24,43,54],custom:[0,2,19,27,29,47,50,53],cut:50,cutoff:19,cycl:[49,50],cylind:16,cylindr:50,d16_:14,d_1:5,d_2:5,damag:[2,19,47,49,56,58],danger:47,dark:[14,25,50,52,56],dashboard:59,data:[4,9,11,12,15,16,17,18,22,24,25,26,28,42,43,45,46,49,50,51,52,53,54,59],data_acquisition_mod:53,data_acquisition_tim:[24,25,50,54],databas:[16,20,26,28,42,43,48,50,59],dataset:[24,50,53],datatyp:[4,16,18,23,24,25,26,29,48,50,52,53,54],datatypedefinit:29,date:[24,41,45,47,55],dealer:11,debug:[41,54],decalibr:[2,5],decibel:[14,17,52],decl:12,declar:51,decod:54,decommiss:49,decoupl:19,decreas:[12,25,48,52,53,56],dedic:[18,24,50],deem:49,default_gatewai:[41,45],defin:[1,4,12,14,16,18,19,21,23,24,25,26,32,37,41,48,50,52,53,54],definit:[1,2,4,15,16,18,23,24,25,48,50,52,53,54],deform:24,degrad:54,degre:[1,12,15,18,31,32,34,35,36,39,50,52],delet:[4,9,11,16,18,24,25,26,42,44,45,48,50,59],delete_base_plane_calibr:12,delete_grasp:12,delete_gripp:[12,43],delete_load_carri:[12,43],delete_pos:12,delete_regions_of_interest:[12,43],delete_regions_of_interest_2d:[12,43],deliv:[14,49,52],deliveri:20,delta_d:17,delta_z:17,denot:[1,54],dens:[24,25],denser:[17,53],densiti:19,depend:[2,4,5,14,18,19,24,25,26,27,41,42,43,45,48,49,50,52,54,55],deploi:57,deprec:[14,18,23,53,54],depth:[3,5,6,13,14,17,19,20,24,25,28,50,52],depthacquisitionmod:14,depthacquisitiontrigg:14,depthdoubleshot:14,depthfil:14,depthmaxdepth:14,depthmaxdeptherr:14,depthminconf:14,depthmindepth:14,depthqual:14,depthseg:14,depthsmooth:14,depthstaticscen:14,deregist:45,describ:[0,2,4,12,14,15,16,17,18,21,24,25,27,30,33,47,50,52,53,54,56],descript:[12,14,16,17,19,26,41,42,43,44,48,54],design:[16,19,21,27,42,44,54,58],desir:[12,14,16,18,24,25,26,27,41,48,50,54,59],desktop:0,destruct:11,det:[32,37],detail:[4,6,12,16,17,18,19,23,24,25,26,41,48,50,52,53,54,58],detect:[2,4,9,12,13,16,20,21,23,26,28,41,42,43,48,52,56,59],detect_filling_level:12,detect_inverted_tag:54,detect_item:12,detect_load_carri:12,detect_object:[4,12],detector:[24,50],determin:[2,15,16,24,25,26,50,52,53],develop:[4,15,16,17,24,25,26,44,48,50,54],deviat:[24,41],devic:[0,1,2,3,5,11,14,15,18,20,24,27,30,33,41,42,44,45,49,51,56,57,58,59],dhcp:[15,21,41,42,45,55],dhcp_enabl:[41,45],dialog:[21,50],diamet:[19,24],dictionari:41,did:54,differ:[1,2,5,10,12,14,18,19,21,24,25,26,27,47,48,49,50,52,53,56],digit:[19,23],digitaliocontrol:23,dimens:[12,13,16,18,19,25,26,48,50,59],dimension:[32,54],dimensions_tolerance_m:24,diminish:56,din:0,direct:[11,16,19,24,26,49,50,53,54,56],directli:[0,15,21,50,52,56,57,59],directori:12,dirt:[19,27],dirti:56,disabl:[4,14,24,41,50,59],disadvantag:[17,23],disappear:2,discard:[11,54],disconnect:56,discourag:54,discoveri:[14,20,56,59],discret:50,discrimin:24,discuss:43,dispar:[3,5,6,12,14,17,20,23,24,25,28,49,50,59],disparity_en:17,disparity_error:17,disparity_error_en:17,disparityc:14,disparityimag:17,displac:5,displai:[2,16,18,24,50,52],dispos:[20,58],disregard:14,distanc:[5,14,19,24,56],distant:[5,56],distinct:[18,54],distinguish:[14,53,54],distort:[2,52,54],divers:18,divid:[14,28,53],dns:[41,45],dns_server:[41,45],docker:57,document:[11,12,18,19,43,47,49],doe:[0,2,15,17,18,24,27,49,50,52,53,54,56,58],doesn:19,dof:15,domain:[15,21,59],domest:19,don:[12,24],done:[2,12,15,16,17,24,26,31,32,34,35,36,37,38,39,48,50,55],dot:[7,17,23,24,25,50,54],doubl:[14,21,56,59],down:[2,21,41,50,52,54,56],download:[2,12,14,16,19,20,21,24,50,54],downscal:[53,54],drag:50,draw:[13,49],drawback:54,drawn:[2,50],drop:[2,21,27,50],due:[2,5,12,14,19,32,37,42,47,52,53,54],durat:19,dure:[2,4,5,16,18,19,21,24,25,26,27,42,43,44,48,50,52,53,54,56],dust:27,duti:49,dxf:50,dynam:[14,15,19,21,52],e2cf:0,each:[1,2,4,5,12,13,14,15,16,18,19,23,24,25,26,28,42,43,47,48,49,50,53,54,57,59],earli:27,eas:2,easi:[2,4,7,18,22,24,48,50,59],easiest:59,easili:[24,44,50,52,53,54],edg:[17,23,24,52,54,59],edit:[24,47,50],edu:54,eec:54,effect:[11,14,24,54,58],effector:[15,18],eggenburg:0,egston:0,eight:18,either:[0,2,4,7,16,18,21,24,25,26,27,41,42,50,52,53,54,55],eki:22,eki_checkbuff:12,eki_clearbuff:12,eki_clos:12,eki_exampl:12,eki_get:12,eki_getfram:12,eki_init:12,eki_open:12,eki_send:12,eki_set:12,eki_setstr:12,eki_statu:12,ekibridg:12,elaps:21,electr:[11,19,56,58],electrician:[0,56],electromagnet:19,electron:[0,11],elektro:11,element:[4,12,24,25,26,27,41,48,50,54],ellips:24,elong:24,email:8,embed:50,emika:1,emiss:0,emit:5,empti:[4,12,24,26,50,54,56],emva:14,en55011:19,enabl:[4,5,6,7,9,13,14,15,17,18,21,24,27,28,41,45,46,50,53,56,57,59],encod:[17,42],encrypt:49,end:[0,1,11,12,15,18,27,31,32,34,35,36,37,38,39],end_of_request:12,endfor:12,endpoint:[16,24,46,50,55,57],enforc:2,engag:19,enhanc:21,enough:[2,18,19,24,50,56],ensur:[2,11,16,18,19,24,32,37,47,49,50,52,56,58],enter:[2,18,21,50,56,59],entiti:[16,24,50],entri:[32,41,42,56],enumer:14,environ:[0,5,11,19,24,25,26,48,53,58,59],environment:[20,56],eps:[14,53],equal:[14,50,52,53],equat:[14,50,53],equip:[11,19,47,49],equival:[1,43],erron:[27,53],error8:14,error:[2,3,4,6,12,13,14,16,17,18,20,23,24,25,27,28,32,37,41,45,50,54,59],especi:[15,19,21,26,53,54],establish:12,estim:[6,10,18,24,25,50],etc:[8,12,15,18,22],eth0:55,ethernet:[14,15,19,20,21,22,41,50,51,55,56],ethernetkrl:12,euclidean:54,euler:[1,18],european:[11,58],evalu:[4,49],even:[2,5,12,18,26,48,52,54,59],eventu:21,everi:[2,14,15,18,21,23,24,26,48,50,52,53,54,56],everyon:13,evid:58,exact:[18,24,26,50],exact_pos:26,exactli:[2,16,18,26,52,54],exampl:[0,5,14,15,18,23,24,26,40,42,43,44,49,50,52,53],exce:[2,12,19,50,53,54,56],exceed:[4,16,19,24,25,26,48,50,56],except:[12,14,17,36,52],excess:42,exchang:[19,54],exclud:[4,27,50,52],exclus:41,execut:[21,27,44],exemplari:15,exert:19,exhibit:[5,27],exist:[4,16,18,19,24,25,26,27,47,48,49,50,56],exit:[19,41],exp:[43,52],exp_auto:43,exp_auto_mod:[14,17,24,25,50],exp_control:14,exp_max:43,exp_valu:43,expect:[2,12,18,27],explain:[1,4,6,18,21,42,49,50,59],explan:16,explicitli:[16,21,24,26,48,57],explor:[4,16,24,25,26,42,43,44,48,50,54],explos:19,expos:[2,18,19,41,43,45,52,54,56,57],exposur:[2,14,17,19,23,24,25,43,50,56,59],exposure_tim:17,exposureact:[14,23],exposurealternateact:[14,23,24,25,50,52,53],exposureauto:14,exposureregionheight:14,exposureregionoffseti:14,exposureregionoffsetx:14,exposureregionwidth:14,exposuretim:14,exposuretimeautomax:14,express:[18,53],expressli:58,ext:18,extend:19,extens:[24,27],extern:[3,7,14,18,23,24,25,26,48,50,52,53,54,56],extra:24,extract:[5,14,24,50],extrem:18,extrins:1,extrud:50,eye:[2,7,12,19,27,40,41,43,53],facilit:50,fact:5,factor:[14,17,52,53,56],factori:[18,23,25,52,53],fail:[4,12,16,18,23,24,25,26,48,50,54,56],failur:[18,58],fairli:24,fall:[21,49],fallback:[21,41],fallback_boot:[41,45],fallingedg:52,fals:[4,14,17,18,24,25,41,43,45,50,52,53,54],famili:27,familiar:57,fanuc:1,far:[2,14,18,53],farthest:50,fast:[52,56],fatal:[24,41,54],fault:56,faulti:41,featur:[4,6,16,19,27,43,44,50,53,54,59],few:25,fewer:[50,54],field:[0,4,16,18,19,21,24,26,41,43,50,52,56],fig:[2,4,5,16,18,19,23,24,25,26,50,52,54],figur:[18,44,52,53],file:[2,16,18,20,21,24,41,42,45,50,52,54,59],filenam:59,fill:[2,10,12,14,17,18,24,43,44,56],filling_level_cell_count:25,filter:[14,24,27,50,53,54,59],fin:[19,56],find:[2,5,21,50,53,54],fine:[5,15,53],finish:[2,27,53],firefox:[21,59],firmwar:[16,20,21,26,40,41,42,45,47,48,50,59],firmwareinfo:[41,45],first:[1,2,12,16,18,21,24,25,31,32,34,35,36,38,39,50,52,53,54,57],firstli:54,fit:[14,24,50],five:[2,14,27,57],fix:[1,14,15,18,50,52],fixtur:18,flag:[4,12,41,50],flang:18,flange_radiu:16,flash:[21,56],flat:[5,24,50,53],flatter:24,flexibl:24,flip:50,float32:41,float64:[4,12,16,18,24,25,26,41,42,43,48,50,52,53,54],floor:[25,26,50],flowchart:21,fly:53,focal:[2,14,17,43,52,53,54],focal_length:17,focallengthfactor:14,focu:56,follow:[0,1,3,4,5,6,11,12,14,16,18,19,21,22,23,24,25,26,27,31,32,34,35,36,37,38,39,41,42,43,44,45,48,49,50,51,52,53,54,56],forbidden:[24,42,43,45,50],forc:19,foreground:55,forget:54,forget_after_n_detect:54,form:[5,16,19,24,25,38,42,45,50],format:[14,15,16,17,18,20,41,44,45,53,54],former:44,formul:27,formula:54,forward:[12,54],found:[11,12,14,16,17,18,21,24,25,27,42,43,45,50,53],four:[14,18,21,26,54],fps:[15,43,53],frac:[1,14,31,32,34,35,36,37,38,39,53,54],fraction:[17,52,53],fragment:12,frame:[4,12,14,16,18,20,21,23,24,25,26,43,48,50,52,53,54,56,59],framework:14,franka:1,free:[4,16,19,21,24,25,50,56],freedom:[15,18],freeli:50,frequenc:[2,42,52],friendli:[40,43],from:[0,2,4,5,8,11,12,14,15,16,17,18,19,21,22,23,24,25,26,27,40,41,43,45,47,48,49,50,53,54,55,56,57,59],front:[19,21],fruitcor:1,fulfil:54,full:[2,14,15,17,26,42,43,44,47,50,53,54,59],fulli:[2,18,21,25,41,44,50,54],further:[2,3,4,11,18,24,25,26,43,50,54,59],furthermor:[6,18,21,24,26,50,53,54,59],fuse:19,futur:[2,50,52],fuzzi:56,gain:[14,17,43,56,59],gainselector:14,gamma:1,gase:19,gatewai:[21,41],gbp:0,gc_config:21,gener:[7,11,14,15,18,19,20,23,24,41,44,50,51,53,54,56,59],genicam:[3,13,15,17,20,22,23,28,40,43,52,53,55],gentli:27,geometr:[16,24],geometri:[4,16,24,26,48,50],german:[11,47],germani:[8,11,47],get:[2,12,14,15,16,17,24,27,40,41,42,43,44,45,46,50],get_base_plane_calibr:12,get_calibr:[12,43],get_calibration_pos:12,get_grasp:12,get_gripp:[12,43],get_grippers_schmalz_vac:12,get_grippers_schunk:12,get_io_valu:12,get_load_carri:[12,43],get_pos:12,get_preferred_orient:12,get_region_of_interest_2d:25,get_regions_of_interest:[12,43],get_regions_of_interest_2d:[12,43],get_sorting_strategi:12,get_symmetric_grasp:12,gev:45,gevieee1588:55,gigabit:[14,15,21],gige:[3,15,17,20,21,22,23,28,42,43,45,49,51,52,53,55,59],gigevis:[14,15],git:57,github:[12,17,21],give:[12,14,16,18,24,26,50,53,54,59],given:[1,2,4,14,15,16,18,19,23,24,25,26,31,32,34,39,48,50,52,53,54],glare:27,glass:27,global:[5,9,15,21,26,28,42,43,48,53],glossari:20,gmbh:[0,8,47],gnd:19,good:[2,18],googl:[17,21,59],gpio:[0,14,17,19,23,24,25,50,52,53],gpu:[53,57],grab:[14,52],gradient:25,grafana:46,grai:[5,24],graphic:22,grasp:[4,12,16,25,26,28,48],grasp_computation_tim:24,grasp_id:50,grasp_uuid:[24,50],graviti:24,great:[15,53],greater:[2,24,50,56],green:[2,14,18,19,21,25,27,50,56],grid:[0,2,19,24,25,43],grid_height:43,grid_width:43,gripper:[4,7,9,24,27,28,41,42,43,45,50,59],gripper_el:[16,41],gripper_id:[4,16,24,50],gripperdb:[4,9,24,50],gripperel:[16,41],ground:[0,49,56,58],group:50,grow:[53,56],grpc:[20,22,57],grpc_image_client_exampl:17,guarante:[2,19,24,25,26,50,53,54,58],guess:14,gui:[2,4,7,14,18,19,20,21,22,23,24,25,26,27,40,43,48,52,53,54,55,56,57],guid:[2,18,19],guidelin:[2,49,56],gvcp:14,gvsp:14,half:[23,50,53,54],ham:54,hand:[2,7,12,19,27,40,41,43,53],hand_eye_calibr:[41,45],handheld:18,handl:[11,19,49,51],happen:[32,37],hard:[26,58],hardwar:[15,20,52,54,58],has:[0,2,4,5,12,14,16,18,21,23,24,25,26,27,41,47,48,50,51,52,53,54,55,56,59],hash:45,have:[1,2,4,12,14,16,18,21,24,25,26,27,48,49,50,52,53,54,56],haxx:42,hazard:58,hdr:14,header:[16,24,42,43,45,46,50],health:[11,41,57],healthcheck:41,healthi:41,heat:19,heavili:[2,42],height:[2,14,16,17,26,43,48,50,52,53],height_open_sid:[24,25,26,50],heightmax:14,held:2,hello_rc_visard_ng:46,help:[11,53,54,58],henc:[12,14,18,27,41,53,54],here:[18,19],hertz:[43,52],high:[2,5,6,12,14,17,18,19,23,27,50,51,52,53,56],higher:[19,24,27,50,52,53,54],highest:[24,54],highli:54,highlight:[2,18],hint:[24,50],hold:[2,4,16,23,24,25,50,54],hole:[14,17,19,53],holist:40,horizont:[14,17,19],horst:1,host:[4,15,16,18,22,23,24,25,26,41,42,43,44,48,50,52,53,54,55,56,57,59],host_port:[41,46],hostnam:[41,45],hostport:41,hous:[0,19,27,49,56],household:[11,58],how:[14,16,24,25,44,50,52,53,54],howev:[0,2,4,5,18,24,47,50,52,53,54],html:54,http:[0,4,8,12,14,15,16,17,18,19,21,23,24,25,26,27,40,42,43,44,45,46,48,50,52,53,54,57,59],human:[11,52],humid:19,hundr:14,icon:59,idea:5,ideal:5,ident:[19,54],identifi:[12,15,21,24,26,27,41,50,54],idl:[24,41,43,54],ieee1588:[41,55],ieee:14,ignor:[18,25,50,53,54],illumin:[21,54,56],illustr:[4,5,18,24],imag:[2,3,5,6,13,15,18,19,20,22,23,24,25,26,27,28,40,41,42,43,45,48,49,50,54,55,57],image_vers:[41,45],imageinfo:41,imageinterfac:17,imageset:17,imagesetrequest:17,immedi:[14,21,27,56],immun:0,impact:[2,27],implement:[18,52,54],implicitli:[14,53],importantli:54,improp:[49,50],improv:[14,23,47,53,54],imu:59,in1:[14,52],in2:[14,52],inaccess:[21,56],inaccur:[2,18,53,56],inaccuraci:24,inact:[27,41,45,59],inactive_imag:[41,45],inappropri:[11,49],inch:1,includ:[12,18,19,21,24,25,26,27,41,43,44,46,50,53,54,57,58,59],inclus:41,incorrect:58,increas:[2,12,19,24,25,26,50,52,53,54,56],increment:[2,17],independ:[15,16,18,52],index:14,indic:[2,4,12,16,18,19,21,23,24,25,26,27,32,41,47,48,50,53,54,56,59],individu:[1,2,4,12,14,23,40,41,43,47,50,54,59],indoor:5,induc:18,industri:[0,14,19,49],inertia:19,infer:[41,53],infin:[19,53],infinit:[14,53],influenc:50,info:[8,41,43,45,59],inform:[3,4,5,12,14,15,16,17,18,20,21,22,23,24,25,26,27,28,41,42,43,45,46,47,48,50,53,54,57,58,59],init:41,initi:[12,19,41,44],injuri:[19,47,49,58],inner:[25,26,54],inner_dimens:[4,24,25,26,50],input:[7,14,17,18,23,50,52],input_mask:23,inscrib:24,insid:[2,4,16,19,24,25,26,50,53,54,57],inspect:[49,59],instal:[0,19,20,27,45,49,56],instanc:[12,50,54,56],instance_id:[12,54],instance_uuid:50,instant:18,instead:[4,14,17,18,24,25,45,50,52,54,57],instruct:[12,21,49,56],instrument:2,insuffici:[18,56],insul:19,int16:[4,16,18,23,24,25,26,41,48,50,52,53,54],int32:[17,18,23,24,25,41,43,50,52,53,54],int64:41,int8:[41,50],integ:[14,41,45,50,53],integr:[4,18,24,49,50],intellectu:47,intend:[19,20,50,58],intens:[5,14,23,24,50,52,53,56],intensitycombin:14,interact:44,interest:[9,24,25,27,28,29,42,53,54,59],interfac:[3,4,9,13,15,16,20,21,23,24,25,26,27,28,43,44,48,50,52,53,54,55],interfer:[5,19,50,58],interior:26,intermedi:[24,50],intern:[2,3,12,16,18,23,24,25,26,45,48,49,52,53,54,57],internet:[15,21,55],interpol:[53,54],interpret:[12,17,50],intersect:26,interv:53,intrins:[1,2],introduc:52,introduct:[17,20],intuit:[13,50],invalid:[2,4,12,14,16,17,18,24,25,26,42,43,45,48,50,53,54,59],invalid_data_valu:17,invers:1,invert:1,involv:2,iocontrol:[14,19,23,52,53],ip54:[13,19],ip_address:[41,45],is_bigendian:17,iso:19,isol:53,isopropanol:27,issu:[8,12,20,27,43,44,50,54],item:[4,12,19,26,48,50],item_model:24,item_uuid:24,itempick:[4,10,16,23,25,26,48],iter:24,its:[4,6,12,14,15,16,18,21,24,25,26,27,28,42,43,44,47,49,50,52,53,54,55,58],itself:[4,18,21,25,42],javascript:[12,42],json:[12,16,24,27,41,42,43,44,45,46,50,59],judg:18,jumbo:14,jump:54,just:[1,52],kaflerstrass:[8,47],kawasaki:1,keep:47,kei:[12,53],kept:[2,24,52],kit:[15,19,20],know:14,knowledg:[24,25,26,48],known:[2,5,12,14,15,18,21,42,50,55,57],krc:12,krl:[20,22,50],kss:22,kuka:[1,15,20,22,36,50],label:[21,24,41,56,57,58],languag:17,larg:[2,16,24,50,54,56],larger:[2,5,12,24,25,50,52,53,54],largest:[24,53,54],laser:50,last:[12,18,24,25,27,41,45,50,52,54],last_collision_free_grasp:4,last_evaluated_grasp:4,last_timestamp_process:[24,25,50,54],latenc:53,later:[19,27,43,50,54],latest:[27,54],latter:[14,18,21,44,53,54],law:49,layer:[21,24],layout:24,lead:[2,14,18,19,50,52,53,54,56],least:[4,12,16,18,19,25,27,50,54,55],leav:56,led:[19,20,21,27],ledg:26,left:[1,2,5,14,17,18,19,25,26,32,37,38,48,50,52,53,54,59],left_en:17,legisl:47,len:[2,19,20,52,56],length:[0,2,12,14,17,24,29,38,42,52,53,54],lens:[27,56],less:[0,2,14,17,50,53,54,56],lesser:56,let:[42,52],letter:12,level:[10,19,41,45,50],level_free_in_met:25,level_in_perc:25,liabl:49,librari:[13,14,40],licens:[4,10,12,14,16,19,20,23,24,25,29,40,41,42,43,45,50,53,54,59],licensecompon:41,licensecomponentconstraint:41,licenseconstraint:41,licenseinfo:[41,45],lies:54,life:[27,49],light:[0,2,5,23,50,52,53,56],like:[12,17,18,23,27,30,33,53],limit:[12,16,17,25,26,42,43,45,50,52,53,54,58],line:[2,14,21,25,42,45,50],linear:[4,52],lineselector:[14,23],linesourc:[14,23],linestatu:14,link:[15,18,21,41,56],link_spe:[41,45],linkloc:41,linux:[15,21,55,59],liquid:19,list:[4,12,14,16,18,21,24,25,26,41,42,43,45,48,50,53,54,57],listen:[12,41],live:[22,52,53,59],load:[4,9,10,12,16,19,24,27,28,42,48,50,59],load_carri:[4,24,25,26,27,45,50],load_carrier1:12,load_carrier2:12,load_carrier_:25,load_carrier_compart:[24,26],load_carrier_detection_tim:[24,25,50],load_carrier_id:[12,24,25,26,50],loadcarri:[10,26,48],loadcarrierdb:[9,12,25],local:[11,15,21,27,49,54,58,59],locat:[4,14,15,16,18,19,21,24,26,27,50,52],lock:[14,41,42,43,45,59],loctit:19,log:[2,20,41,42,54,55,59],logentri:41,logic:19,loginfo:[41,45],logo:54,longer:[24,25,50,54],look:[2,24],loop:56,loss:58,lost:[27,59],lot:17,low:[2,12,14,17,19,23,24,25,49,50,52,53,54,56],lower:[2,14,26,50,52,53,54,56],lowest:[14,54],lying:50,m12:[0,19,21],m12f:0,m12fr:0,mac:[15,21,41,45,59],machin:[14,19,40,49,50,54],machineri:49,made:[2,47,54],mai:[1,2,12,18,19,21,24,27,47,49,50,52,53,54,56,58],main:5,mainten:[20,49],major:[13,32],make:[2,13,18,21,23,24,25,26,27,50,52,54,59],malfunct:47,manag:[15,19,21,42,45,57],mandatori:[19,54],mani:[1,9,12,18,26,42,48,50,52,54,56],manipul:[49,54],manual:[2,13,14,15,18,19,27,41,43,45,47,49,54,56,59],manual_dns_serv:[41,45],manualdnsserv:[41,45],manufactur:[1,11,18,26,47],map:[14,24,52],margin:[25,26],mark:[2,4,14,16,17,18,24,50,53],mask:[21,23,41],mass:19,master:[41,55],master_ip:[41,45],masteronli:55,match:[3,5,12,14,15,21,23,40,41,43,52,54,56],materi:[19,26],mathbf:18,mathrm:[14,19],matric:1,matrix:[1,15,17,18,54,59],max:[4,12,14,16,18,19,23,24,25,26,32,37,41,42,43,48,50,53,54],max_corner_dist:54,max_deformation_m:24,max_dimens:24,max_point:17,max_suction_surface_length:24,max_suction_surface_width:24,max_vers:41,max_x_deg:50,max_z:53,maxdepth:[12,42,43],maxdeptherr:[12,43],maxim:[2,14,50,52,56],maximum:[2,4,12,14,16,17,23,25,26,41,43,48,52,56],mbp:41,mdn:[15,59],mean:[1,2,5,11,17,18,24,25,26,41,48,50,52,53],mean_z:53,meaning:2,meant:[23,56,59],meantim:54,measur:[2,3,5,13,14,18,20,23,24,25,26,32,49,50,53,56],measure_depth:12,mechan:[2,18,20,21,56,59],media:[15,21],medic:49,medium:[14,19,50,53,54],meet:[0,50],member:11,memori:[12,53],mender:[27,45],menu:[21,50,57,59],mesh:[17,59],mesh_en:17,mesh_opt:17,meshopt:17,messag:[4,12,16,17,18,23,24,25,26,27,41,43,45,48,50,52,53,54,55],metal:0,meter:[1,4,12,13,14,17,18,19,24,25,26,33,50,52,53,54],method:[5,11,17,18,21,29,41,50,53],metric:[13,19],microfib:27,microsecond:14,microsoft:59,middl:[52,53],might:[2,4,12,14,18,21,23,41,44,50,54,55,56,59],millimet:[1,12,13,18,31,32,34,35,38,39],min:[4,12,18,19,23,24,25,26,41,42,43,50,53,54],min_depth:17,min_dimens:24,min_vers:41,min_x_deg:50,min_z:53,minconf:[12,42,43],mindepth:[12,42,43],minilin:0,minim:[2,4,14,24,25,50],minimum:[2,4,14,17,19,26,41,42,43,52,56],ministri:11,minu:50,minut:[21,27,55,57,59],mirror:2,misalign:2,miscalibr:2,misconfigur:21,misdetect:24,miss:[12,24,25,42,45],mistak:2,mitsubishi:1,mix:[11,54],ml60:0,mobil:49,mode:[2,7,14,17,23,25,50,56,59],model:[4,12,16,18,19,21,24,26,41,43,45,46,48,50,52,53],modif:[47,58],modifi:[14,41,42,47,58],modul:[2,5,12,13,14,15,19,20,21,27,40,41,42,43,45,56,59],moment:19,monitor:[49,56],mono16:17,mono8:[14,17],monocamera:2,monochrom:[14,19,52],more:[4,5,6,12,14,15,17,18,21,23,24,25,42,44,50,54,55,58,59],moreov:[50,54],most:[1,2,40,43,49,50,53,54,59],mostli:13,motion:[2,4,6,27,52,54,56],mount:[0,16,19,24,25,26,27,48,49,50,53,54,56,57],mous:50,move:[18,24,25,26,48,50,52,54],movement:[4,18,19,52],mozilla:21,mtu:14,much:[2,14,17,24,25,54,56],multi:18,multicast:[15,59],multipart:[14,16,24,45,50],multipl:[4,5,12,16,24,25,26,42,43,46,48,50,53,54],multipli:[1,14,52,53],munich:[8,47],murr:0,must:[0,2,5,11,12,14,15,16,18,19,21,24,25,26,44,47,48,49,50,53,54,58],name:[4,12,14,15,16,18,23,24,25,26,27,41,42,43,44,45,46,48,50,52,53,54,59],nano:19,nanosecond:17,narrow:48,nation:49,natur:54,navig:[42,57],nbc:0,necessari:[2,4,16,17,18,27,44,47,50,54],necessarili:16,need:[12,15,18,19,21,23,24,25,27,30,33,49,50,52,54,55,57],neg:[4,11,12,16,18,23,24,25,26,32,37,48,50,54],neither:[5,18,50],nest:41,network:[0,12,15,17,18,19,20,27,41,42,45,49,51,52,55,56,59],networkinfo:[41,45],networkset:[41,45],never:[2,54],nevertheless:2,newer:[12,50],newest:27,newli:24,next:[2,14,18,19,41,44,45,53,54,59],next_boot_imag:[41,45],no_pos:26,node:[4,12,15,16,18,23,24,25,26,27,28,40,41,42,44,45,48,50,52,53,54,59],node_nam:12,nodeinfo:[41,43],nodestatu:[41,43],nois:[17,52,53,54,56],noisi:56,nomin:19,non:[12,14,50],noncompli:49,none:[11,21,50,54,56],nonexist:54,nontranspar:50,nor:[5,18],nordostpark:11,normal:[2,14,15,16,24,26,27,48,50,52,54,56],notat:[12,42],note:[14,43,47,53,54],noth:18,notic:[2,14,21,47,50],notif:27,notifi:[12,27],now:[2,59],nsec:[12,17,23,24,25,50,53,54],ntp:[15,41,45],ntp_statu:[41,45],ntpstatu:41,num_inst:12,number:[4,11,12,15,16,17,18,21,24,25,26,27,41,42,44,48,53,54],nuremberg:11,o_r:34,oat:1,obj:16,object:[4,5,10,12,13,14,15,16,24,25,26,28,41,42,43,45,52,53,56],object_height:50,object_id:50,object_plane_detect:50,object_to_detect:50,oblig:11,obligatori:[24,50],observ:[2,18,19,47],obstruct:56,obtain:[0,2,18,19,22,52,53,59],obviou:54,occlud:[2,50],occlus:[24,53],occupi:5,occur:[2,12,24,27,41,50,54],octet:[16,24,50],oder:53,odometri:52,off:[4,5,14,16,17,18,23,32,37,41,45,50,52,53,56],offer:[0,4,10,12,13,14,15,16,18,19,21,23,24,25,26,27,29,40,41,42,43,44,48,50,52,53,54,55],offic:0,offici:17,offlin:[16,26,48,54],offset:[2,4,14,17,19,24,41,45,48,50,59],offset_dev:[41,45],offset_i:[48,53],offset_mean:[41,45],offset_x:[48,53],often:[1,18,53],old:11,older:18,oldest:24,omit:[50,54],onc:[2,24,50,54],one:[0,1,2,4,12,14,15,16,18,23,24,25,26,32,41,42,43,45,50,52,53,54,55],ones:[24,54],onli:[0,2,4,5,9,11,12,14,15,16,17,18,19,21,23,25,26,27,42,43,48,49,52,53,54,57,59],onlin:54,onlyhigh:14,onlylow:14,onto:[2,24,50,52,53],opc:20,open:[0,21,26,27,44,56,58,59],opencontain:41,oper:[12,15,16,18,20,21,24,27,32,37,42,43,45,46,47,49,50,56,58,59],optic:[18,52],optim:[24,25,50,52,53],option:[0,4,10,11,12,13,16,18,21,23,24,25,26,27,29,41,43,45,48,50,53,54],order:[1,12,19,24,25,31,32,39,45,50,53],org:[14,15,41],orient:[1,4,5,12,15,16,18,19,24,25,26,27,30,31,34,38,39,43,48,53],orientation_prior:[25,26],origin:[1,16,19,24,25,26,27,50,53,54],orin:19,orthogon:18,other:[2,3,5,12,14,15,16,18,19,21,28,34,44,49,53,54,57,58],otherwis:[2,4,11,13,14,16,19,21,24,25,32,37,38,50,54],our:17,out1:[14,17,52,53],out1_mod:[14,17,53],out1_reduct:[17,52],out1high:[14,52],out2:14,out2_mod:14,out:[10,12,13,14,19,23,24,25,50,54,56],outdoor:5,outer:[25,26,50,54],outer_dimens:[4,24,25,26,50],outermost:54,outlin:19,outperform:54,output:[7,14,17,18,23,24,25,50,54,56],output_mask:23,outsid:[11,25,50,52,56],outward:[16,26],over:[7,15,16,17,19,26,48,50,51,52,53,54,55],overal:[14,19,25,27,44,53],overall_filling_level:25,overcurr:19,overexpos:[2,18,52,53],overfil:[24,25,50],overlai:2,overlap:50,overview:[0,14,16,19,20],overwrit:18,overwritten:[4,16,24,25,26,48,50,52],own:[12,15,17,55],owner:[11,47],p_r:31,p_x:[14,53],p_y:[14,53],p_z:[14,53],pack:24,packag:[12,19,21,24],packedgridlayout:24,packedlay:24,page:[2,18,21,24,25,27,48,50,52,53,54,55,57,59],pair:[3,5,14,25,28,53,54],pairwis:23,pallet:[18,24,26],parallel:[50,52,54],param:[41,43],paramet:[15,16,17,21,26,27,40,41,42,44,45,55,56,59],parameter:16,parameter_i:12,parameter_x:12,parameternamevalu:[41,43],parametervalu:[41,43],params_override_act:52,parent:16,parent_id:16,pars:[12,50],part:[2,4,14,16,18,19,20,21,25,26,42,47,48,50,52,54],parti:[0,19,49],partial:[27,50],particl:27,particular:[12,57],particularli:[14,44],partit:[21,27,45],partli:[52,53],pass:[18,24,25,50],passiv:[5,19,41],password:[45,59],path:[4,12,42,57],pattern:[5,14,18,23,24,25,50,53,54,56],paus:[41,55],peel:58,pend:53,per:[14,15,16,24,43,52,54],perceiv:[18,52],percent:25,percentag:50,percept:[10,24],perfectli:50,perform:[0,2,3,4,7,14,16,18,21,24,25,26,27,28,44,48,49,50,53,54,56],period:55,perman:[0,15,19,23,56],permit:[14,43,47,53,59],perpendicular:[2,25,26,50],perpendicularli:2,persist:[4,15,16,18,21,24,25,26,27,41,48,50],persistent_default_gatewai:[41,45],persistent_ip_address:[41,45],persistent_ip_en:[41,45],persistent_subnet_mask:[41,45],persistentip:41,person:[11,58],perspect:18,petrol:50,pg9:0,phase:19,phoenix:0,phone:8,photo:49,photocoupl:19,pick:[10,13,24,50],pictur:[18,19],pin:[0,56],pinout:0,pipelin:[4,18,23,24,25,41,42,43,44,45,50,52,53,54],pipeline_statu:59,pitch:50,pixel:[2,14,17,18,19,24,25,48,50,52,53,54],pixelformat:14,place:[2,10,13,18,24,50,54],plai:51,plain:45,planar:[3,10,50,54],plane:[4,10,24,25],plane_estimation_method:50,plane_prefer:50,plastic:0,platform:49,pleas:[1,2,8,11,14,17,18,19,21,23,27,29,42,43,47,52,53,54,56,58],plu:[4,16,23,24,25,26,48,50,54],plug:[0,19,21,51],ply:[16,17,53,59],png:[54,59],point:[2,4,5,13,14,15,16,17,18,19,24,25,26,28,37,42,52,54],point_cloud:50,polar:56,poll:56,pool:55,poorli:53,port:[12,17,41,46,55,57],portain:57,pose:[2,4,6,10,12,15,16,20,24,25,26,31,34,36,37,43,48,50,53],pose_fram:[4,12,24,25,26,48,50,53,54],pose_typ:[25,26],posit:[1,2,4,5,12,15,17,18,19,23,24,25,26,30,31,33,34,35,38,39,43,48,50,53,56],possibl:[2,4,5,14,16,18,23,25,27,50,52,56,59],post:[27,42,44,45],postpon:27,postprocess:53,potenti:[11,14,24,25,46,50,53],power:[20,49,56],practic:[18,32,37],pre:[4,5,21,24,50,54],pre_grasp_offset:[4,24,50],precaut:47,preced:52,precis:[19,55],precisiontimeprotocol:14,predefin:[2,50,54],prefer:[14,18,21,27,53,54],preferred_orient:[45,50],prefix:[14,25],preformat:44,presenc:[50,53],present:[50,58],preserv:[27,54],press:[2,18,27,52,59],prevent:[11,16,18,24,47,59],preview:[52,53],previou:[2,4,20,21,41,45,50,53,54],previous:[1,18,27,50,54],price:54,primit:[12,41],princip:[14,17,52,53],principal_point_u:17,principal_point_v:17,principl:[5,14,20],print:[21,24,50,54],prior:[21,24,25,26,27,47,48],prioriti:21,prismat:50,privaci:50,privileg:57,probabilist:53,probabl:53,problem:[27,56],proce:[2,18],procedur:[2,17,18,19,27,47],process:[3,13,14,18,19,21,23,24,25,26,27,40,43,44,48,50,52,53,54,56],processing_tim:[24,50,54],produc:11,product:[2,4,5,11,19,24,27,47,49,53,58],program:[17,49],programmat:[12,18,27,40],progress:[27,56],prohibit:43,project:[14,23,24,50,52,53,54,55],projector:[7,14,17,19,52,53,56],prometheu:46,proper:[11,19,50,52],properli:[16,18,21,49,50,55,56],properti:[19,24,41,47,58],proport:25,propos:12,protect:[11,13,19,21,47,49,58],proto3:17,protocol:[14,15,17,21,41,46,55,57],protrud:[25,26],provid:[0,2,3,4,5,6,7,9,10,12,13,16,17,18,19,22,24,25,26,27,28,40,43,47,48,50,52,53,54,55,56,58,59],ptp:[14,41,45],ptp_statu:[41,45],ptpd:55,ptpenabl:14,ptpstatu:41,ptpv2:14,publish:[46,53,57],pul:0,pulspow:0,punctur:58,pupil:19,pur:0,purchas:[4,10,12,16,19,24,25,27,50,53,54,58],puriti:27,purpos:[7,18,23],purview:49,put:[4,16,18,23,24,25,26,27,41,42,43,44,45,48,50,52,53,54],q_0:33,q_1:33,q_2:33,q_3:33,q_w:32,q_x:32,q_y:32,q_z:32,qquad:37,quadrat:[53,56],qualifi:56,qualiti:[2,12,13,14,18,24,43,52,56,59],quarter:[50,53],quaternion:[1,12,15,18,26,30,33,50,54],queri:[12,15,18,22,42,43,45,46,55,57],quick:53,quickstart:19,quit:1,quota:11,r4ac:0,r_r:31,r_x:[1,31,32,35,36,39],r_y:[1,31,32,34,35,36,39],r_z:[1,31,32,34,35,36,39],radian:[1,31,32,34,35,36,38,39],radiu:[4,19,48],rail:0,ran:[24,25,50,54],random:[7,17,23,24,25,50,53,54],rang:[2,14,15,17,18,19,21,24,50,52,53,56],rare:24,rate:[6,14,21,23,42,52,53,54,56,59],rather:40,ratio:[14,24,50,52],raw:45,rc_april_tag_detect:[10,12],rc_boxpick:[10,12,41],rc_camera:[3,12,15,24,25,43,50],rc_collision_check:[7,12],rc_cube:27,rc_genicam_api:21,rc_gev_serv:45,rc_gripper_db:[4,9,12,16,43],rc_hand_eye_calibr:[7,12,43,44],rc_iocontrol:[7,12,24,25,50],rc_itempick:[10,12],rc_load_carri:[10,12,24,50],rc_load_carrier_db:[9,12,25,26,43],rc_qr_code_detect:[10,12],rc_roi_db:[9,12,24,25,43,48,50],rc_silhouettematch:[10,12,41],rc_stereocalib:[2,7,12],rc_stereomatch:[3,12,24,25,42,43,44,50],rc_visard:[0,1,2,3,4,5,6,7,9,10,11,12,13,15,16,17,18,22,23,24,25,26,28,29,30,33,40,42,43,44,45,47,48,49,50,51,52,53,54,55,56,57,58,59],rc_visard_monitor:46,rc_visard_ng_v22:45,rc_visard_v1:45,rc_viscor:52,rcdiscov:[21,56,59],rcexposureautoaveragemax:14,rcexposureautoaveragemin:14,rcparamlockdis:14,rcsens:45,rcsystemreadi:14,reach:[4,12,16,18,24,25,26,48,50,52,53,55],reachabl:[21,50,55,56],reaction:21,read:[4,12,14,16,18,21,23,40,43,47,49,50,59],readi:[18,24,25,41,45,54,56],real:[2,6,12,13,53],realiti:16,realli:54,reason:[2,23,54],reboot:[2,20,21,45,50],recalibr:[2,5,27,56],receiv:[12,14,42,51,52,53,54],recent:54,recept:12,recollaps:44,recommend:[2,14,16,18,21,24,25,27,50,52,53,54],recomput:18,reconnect:21,reconstruct:[14,24],record:[12,14,50,53],recov:[32,37,38],recoveri:11,rectangl:[12,48,50,52],rectangular:[24,25,26,48,52,53],rectif:[2,3,5,41,45,53],rectifi:[2,3,5,6,14,24,25,50,52,53,59],recycl:[11,58],red:[2,14,16,18,19,21,25,50,54,56],redirect:44,reduc:[19,25,27,50,52,53,54,56,59],reduced_depth_rang:53,reduct:[17,52],ref:[25,50],refer:[1,13,14,15,16,18,19,23,24,25,26,27,42,48,49,50,53,54,56],referenc:[16,19,24,25,43,45,46,50],refin:50,reflect:[5,52,53],regard:[43,49],regardless:23,region:[5,9,14,24,25,26,27,28,42,53,59],region_of_interest:48,region_of_interest_2d:[48,53],region_of_interest_2d_id:[25,48,50,53],region_of_interest_id:[24,25,48],regions_of_interest:[27,45,48],regist:[6,11,45,57],registr:11,regul:49,regular:54,regularli:56,reject:[4,24,25,26,48,50,54],rel:[2,5,18,19,24,50],relat:[14,21,22,24,47,49,51,52,53,54],relationship:[2,52],releas:[21,52],relev:[14,18,24,47,50,52],reli:[19,24,25,26,48,50,54],reliabl:[18,47,54,56],relief:19,reload:18,remain:[18,19,24,27],remot:17,remov:[11,16,18,24,27,45,50,52,53,56,58],remove_calibr:12,render:50,renew:[27,50],repeat:[2,27],repetit:[24,53,56],replac:[27,50,52,53,56,59],replacebright:50,replic:50,report:[2,4,18,24,25,41,43,50,52,53,54,56],reposit:19,repositori:57,repres:[4,12,14,15,16,18,23,24,25,26,32,41,43,48,49,50,52,53],represent:[16,41],reproduc:47,reproject:2,req:12,request:[4,15,16,17,18,23,24,25,26,27,41,43,44,45,46,48,50,52,53,54,55],requir:[0,2,4,5,12,14,15,16,18,19,21,24,25,26,27,41,42,43,44,45,47,48,50,52,53,54,56,57,58],res:12,reset:[2,4,14,18,23,24,25,27,43,50,52,53,54],reset_calibr:12,reset_default:[12,43],residenti:0,resolut:[14,17,50,52,54,56,59],resolv:[15,24,26,54],reson:56,resourc:[11,15,21,41,43,44,45,53,54,56],respect:[4,7,12,14,16,18,19,23,24,26,27,28,41,42,43,48,49,50,53,54,55],respons:[0,2,4,5,11,15,16,18,19,23,24,25,26,41,42,43,44,45,46,47,48,49,50,52,53,54],rest:[2,4,7,9,12,15,17,18,20,22,23,24,25,26,27,28,41,42,43,44,48,52,53,54,55,57,59],restart:[12,41,43,56],restor:[18,20,21,23,25,43,45,52,53],restrict:20,result:[4,14,17,18,22,24,27,42,43,44,49,50,52,53,54,56,58],resx:12,resx_typ:12,ret:12,retriev:[9,16,18,21,23,24,25,26,42,43,48,50,54],return_cod:[4,12,16,18,23,24,25,26,45,48,50,52,54],revers:56,revert:15,revis:47,rgb8:17,right:[1,2,5,14,17,24,25,32,37,38,47,50,52,53,54,58,59],right_en:17,rigid:[24,54],rim:[25,26],rim_ledg:[24,25,26,50],rim_step_height:[24,25,26,50],rim_thick:[4,24,25,26,50],risingedg:52,risk:[19,49,58],rj45:[0,19],robocept:[0,2,5,8,11,12,13,14,17,18,19,21,27,29,47,49,50,53,57,58],robot:[1,4,7,10,12,13,15,18,19,22,24,25,26,27,30,31,32,33,34,35,36,39,48,49,50,52,53,54],robot_mount:43,robot_pos:[24,25,50,53,54],robust:[54,55],roi:[12,48,50],roidb:[9,24,25,53],roll:50,rollback:[16,21,26,27,41,45,48,50],root:[12,24,32,37],rotat:[1,2,15,16,19,24,26,31,34,35,36,38,39,50],rotation_error_degre:18,round:[32,37,54],rout:50,row:[2,4,14,17,21,24,25,50,52,53,54],rpc:17,rule:[12,17],run:[2,12,14,15,16,21,26,40,41,42,43,44,45,46,55,57,59],runtim:[4,5,24,50],s4w1000:0,sac:0,sacc:0,safeti:[4,16,20,21,25,26,47],sale:47,same:[1,2,4,5,12,14,16,17,18,21,24,25,26,27,36,48,50,52,53,54,56,59],sampl:[26,42,43,45,46,50,54],satisfactori:2,satisfi:[0,49],satur:52,save:[2,11,18,27,43,50,54,59],save_calibr:12,scale:[14,17,50,53,54,59],scan3dbaselin:14,scan3dcoordinateoffset:14,scan3dcoordinatescal:14,scan3ddistanceunit:14,scan3dfocallength:14,scan3dinvaliddataflag:14,scan3dinvaliddatavalu:14,scan3doutputmod:14,scan3dprincipalpointu:14,scan3dprincipalpointv:14,scan3dprinciplepointu:14,scan3dprinciplepointv:14,scan:21,scenario:[24,50],scene:[5,6,14,24,25,26,52,53,54,56,59],schema:12,schemat:18,scheme:12,sco:0,scope:[20,49],score:24,scratch:[18,27],screen:[2,59],screw:19,sdk:[8,15],search:[24,25,26,48,50],sec:[12,17,23,24,25,50,53,54],second:[12,15,17,21,23,24,25,41,43,50,52,53,54,56],secondli:54,section:[0,1,2,4,12,14,16,18,25,27,50],secur:[18,19,49,56,59],see:[2,4,8,12,14,15,16,17,18,21,23,24,25,26,27,36,41,42,43,47,50,52,53,54,55,56,59],seen:[53,54,55],seg:[12,43],segment:[14,24,50,56],select:[0,4,14,16,18,21,24,25,26,27,48,50,52,53,54],self:6,self_calibr:45,semant:18,semi:[5,15,53],send:[12,15,17],sens:5,sensit:2,sensor:[0,2,6,7,13,14,19,24,25,26,27,45,48,50,52,53,54,56],sent:[12,14,21,23,42,52],separ:[4,10,11,12,16,17,19,24,25,26,49,50,54,57],serial:[17,21,41,45],seriou:27,serv:[15,26,40],server:[15,17,21,29,41,42,45,55,59],servic:[0,22,40,41,42,44,58],service_nam:12,servicearg:41,servicerespons:41,set:[0,4,9,12,14,15,17,18,20,21,22,23,24,25,26,40,41,42,43,44,45,48,49,52,53,54,57,59],set_all_grasp:12,set_calibr:12,set_flag:12,set_grasp:12,set_gripp:[12,43],set_gripper_schmalz_vac:12,set_gripper_schunk:12,set_load_carri:[12,24,43],set_pos:[12,43,44],set_preferred_orient:12,set_region_of_interest:[12,43],set_region_of_interest_2d:[12,43],set_sorting_strategi:12,set_stroke_schunk:12,setup:[16,19,24,50,56],sever:[7,9,14,18,24,25,27,28,50,54,55,56],sfnc:14,sgm:[5,15,53],shade:50,shall:[0,50],shape:24,share:54,sharp:[54,56],shield:[0,58],shift:[1,24,50,54],shini:26,ship:[18,21],shock:[19,56,58],shorten:50,shortest:[24,50],shot:14,should:[2,4,11,12,14,18,19,21,24,25,26,27,48,50,52,53,54],show:[2,12,18,19,23,24,42,44,50,53,54,56,57,59],shown:[2,14,18,19,23,25,26,27,44,50,52,53,54],side:[2,4,14,17,24,26,27,50,53,54,59],sight:[2,50],sign:[18,32,37],signal:[5,19,21,52,53,56],signifi:53,signific:[2,50,54],significantli:[2,19,48,53,54,56],silhouett:50,silhouettematch:[4,10,16,25,26,27,48],similar:[18,24,50,54],similarli:1,simpl:[14,17,44,54,59],simpler:17,simpli:59,simplifi:[2,16,52,54],simultan:[2,4],sin:[1,31,32,34,35,36,38,39],sinc:[2,24,26,50,52,53,54],singl:[2,14,18,21,41,43,53,54],singlecompon:14,singlefram:[14,52,53],singleframeout1:[14,24,25,50,52,53],situat:[18,54],sixth:53,size:[2,12,14,16,17,19,41,45,50,53],sketch:[5,18],skin:19,skip:[2,27],slack:19,slave:[41,55],slider:[2,50,52],slightli:[2,18,27,52,53,54],slot:[18,21,43],slow:56,small:[2,12,18,50,53,56],smaller:[4,5,16,24,25,26,48,53,54],smallest:[14,17,53,54],smartpad:12,smartphon:54,smooth:[12,14,50,56],snap:50,snapshot:[52,53,59],socket:[0,19],soft:27,softwar:[3,5,8,10,12,13,15,19,20,41,42,43,45,47,50,52,53,54,58,59],solid:26,solut:[0,10,13,24,27],some:[2,15,18,21,26,42,43,44,54,56,57,59],sometim:1,soon:14,sort:[24,27],sourc:[14,19,21,23,49,56],space:[15,19,48,50,56],span:50,spare:20,spars:[53,56],spawn:50,special:[7,14,16,23,24,27,50,53,54],specif:[2,7,12,14,20,21,24,25,28,41,42,43,45,47,49,50,54,56],specifi:[1,2,12,13,15,16,18,19,21,24,25,26,27,48,50,52,53,54,56,57],speed:[25,41,51,54,56],sphere:48,spike:56,split:12,spot:2,sqrt:[32,37,38],squar:[2,18,24,32,37,54],stabl:17,stack:[10,14,46,50,57],stage:56,stai:16,stale:43,stamp:[52,53],stand:[14,15],standalon:[4,57],standard:[0,13,15,17,19,20,21,24,26,41,49,55],start:[2,12,17,18,27,40,41,43,50,55,56],startup:21,state:[11,15,16,23,26,40,41,42,43,45,48,50,56,57,59],static_scen:12,stationari:49,statist:[41,43,45,56],statu:[2,14,16,21,22,23,27,40,41,42,43,44,45,46,55],step:[2,16,17,24,25,26,27,50,53,54,57],step_x_deg:50,stepwis:52,stereo:[3,6,13,14,15,20,23,27,40,41,43,45,52,54,56,59],stereo_plu:53,stereoplu:[14,53],stiftung:11,still:[2,14,21,24,50,52],stl:16,stop:[12,40,43],storag:[4,16,19,24,25,26,48,50],store:[4,12,16,18,21,24,25,26,27,42,43,48,50,53,54],stp:16,straight:[0,24],strain:19,strategi:[24,27],stream:[3,16,20,22,24,50,52,53,59],streamimageset:17,strength:19,strict:50,strictli:24,string:[4,12,15,16,17,18,23,24,25,26,41,42,43,44,45,48,50,52,53,54],stripe:50,strong:2,strongli:[18,27],structur:[5,15,16,18,44,53,54,56],stubborn:27,sub:18,subdivid:[24,25,53],subdivis:25,subject:47,subnet:[21,41,56],subnet_mask:[41,45],subscrib:53,subsequ:[27,53],subtract:26,succe:54,succeed:[4,12,16,23,24,25,26,48,50,54],success:[4,12,16,18,21,23,24,25,26,27,42,43,45,46,48,50,53,54],successfulli:[2,18,21,27,50],suction:[4,24,50],suction_surface_length:24,suction_surface_width:24,sudo:55,suffer:54,suffici:[15,18,19],suffix:27,suggest:[0,18,19,24],suitabl:[0,19,52],supplementari:47,suppli:[20,21,27,49,56],supplier:[11,58],support:[11,14,16,17,20,24,25,26,27,29,41,47,48,49,50,51,52,53,54,56,57],sure:[2,21,27,54],surfac:[5,18,19,50,52,53,54],surface_area:24,surround:[19,25,54],swagger:[27,42],symbol:[11,24,50,59],symmetr:[16,50],symmetri:[26,50],sync:[19,41],synchron:[5,14,15,17,20,22,23,41,45,54,57],synchronizedcompon:14,synonym:24,syntax:17,sysinfo:[41,45],system:[0,1,13,15,16,17,18,21,24,26,27,40,41,42,48,49,50,53,54,55,56,59],system_info:59,t4110001081:0,t4110011081:0,t_r:34,tab:[2,27,54],tabl:[4,14,16,18,19,24,25,26,48,50,54],tag:[12,50],tagdetect:[10,12,23,50],tait:1,take:[4,18,24,27,54,55,58],taken:[5,17,53,54],tar:[27,52,59],target:[12,24,56],task:[18,23,49],tcp:[4,15,17,24,55,57],tcp_parent_id:16,tcp_pose_flang:16,tcp_pose_par:16,teach:18,technic:[13,20,49],technolog:[14,15,58],telegram:12,temp_left:[43,52],temp_right:[43,52],temperatur:[19,52,56],templat:[4,16,27,41,42,43,44,45,46],template_id:[24,50],temporarili:[21,42,50,52,59],temporaryip:41,term:[13,49,53],termin:[0,12,56],test:[4,16,24,25,26,42,43,44,48,50,52,54,59],text:[1,18,31,32,34,35,36,37,38,39,42,45],textur:[5,15,17,24,50,53,54,56],textured_rectangl:24,textureless:53,than:[0,2,5,12,14,17,19,21,24,25,26,50,52,53,54,55,56],thei:[2,12,14,16,17,24,25,27,43,45,50,53,54,56],them:[2,5,11,18,25,27,44,49,50,52,54,56],themselv:15,theori:2,therebi:50,therefor:[2,14,17,18,23,24,47,50,54],theta:38,thi:[1,2,4,5,11,12,13,14,15,16,17,18,19,21,23,24,25,26,27,29,41,42,43,44,45,47,48,49,50,52,53,54,55,56,57,58,59],thick:[2,18,26],thin:26,third:[0,1,19,49],those:[5,18,43,53,55],though:54,thread:19,threadlock:19,three:[1,15,19,26,31,34,39,50,53,54],three_sid:26,threshold:54,through:[2,19,49,50,52],throughout:13,thu:[2,4,5,21,25,36,50,53,59],tickmark:21,tighten:[19,21],tilt:[25,26,50],time:[0,1,2,6,12,13,14,15,16,17,19,20,21,22,26,27,40,41,42,43,44,45,48,56,57,59],time_match:53,time_postprocess:53,timeout:[24,25,50,54],timestamp:[12,14,17,23,24,25,41,43,45,50,53,54,55,59],titl:41,togeth:[5,24],toler:[24,53],too:[2,3,12,16,24,26,27,42,50,53,56],took:[24,25,50],tool:[14,15,16,18,21,24,42,48,50,54,59],top:[2,19,48,53,59],torqu:19,total:[0,12,53,54],touch:56,toward:[24,50,54],trace:27,track:[27,52],trade:[5,52],trajectori:4,transfer:[21,27,53],transform:[5,12,14,18,24,25,26,37,48,50,54],transit:[24,54],translat:[1,2,15,18,50],translation_error_met:18,transmiss:[12,23,52],transmit:[11,14,15,18,23,42,49,51,52,56],transpar:12,transport:[5,19],treat:58,treatment:11,tree:[12,16],tri:[21,52,54,55],triangl:50,trigger:[4,12,14,23,24,25,43,50,53,54,59],trim:50,tripod:19,troubleshoot:[19,20],truncat:12,tune:[24,50],turn:[6,16,19,21,27,56],twice:54,two:[1,5,12,18,19,21,24,25,26,48,50,53,54],type:[4,12,14,16,18,23,25,26,42,43,44,45,46,48,50,52,53,54],typic:[1,2,18,21,26,53],typo:18,u_i:38,u_x:38,u_z:38,ubjson:[16,24,43,45,46,50],ubuntu:21,udp:[14,17,57],ui_lock:[41,45,59],uilock:[41,45],uint16:41,uint32:[17,18,23,25,41,48,53],uint64:41,uint8:41,umich:54,unauthor:27,unavail:15,unbias:2,unc:19,uncalibr:[18,41],uncertainti:[6,53],uncollaps:44,unconstrain:24,uncov:19,under:[0,2,4,11,15,16,18,21,23,24,25,26,27,48,49,50,52,53,54,57],underexpos:52,underexposur:52,underli:6,understood:[21,49],undertaken:27,undesir:58,undetect:18,undisturb:17,unexpect:[27,47],unfortun:1,unhealthi:41,unifi:15,uniform:15,unintend:[18,49],union:11,uniqu:[15,16,18,21,24,41,48,50,54,59],unit:[1,12,13,14,19,32,50,52],univers:[1,24],unix:41,unknown:[10,18,24,41,50],unless:[13,19,27,47],unlock:[41,59],unmix:50,unnecessari:2,unobstruct:19,unreach:56,unsatisfactori:2,unset:24,unsign:14,unsus:19,untextur:[5,50,53],until:[17,27,50,53,55],unwant:14,updat:[2,16,18,19,20,24,25,26,29,40,41,42,43,45,48,50,59],upgrad:[21,27],upload:[24,27,42,50],upon:[14,53],upper:[50,52,53,54],upsid:2,uptim:[41,45],uri:[15,42],url:[15,41,59],usb:[15,57],use:[1,2,3,12,13,14,16,17,18,19,20,22,23,24,25,26,27,30,32,33,35,40,42,44,45,47,48,50,52,53,54,55,56,57],use_cached_imag:54,use_last:53,used:[0,1,2,4,5,9,11,12,13,14,15,16,17,18,19,21,23,24,25,26,27,31,32,34,36,37,38,39,41,42,47,48,49,50,52,53,54,57,58,59],useful:[14,15,17,21,26,27,52,53],user:[0,2,4,5,7,9,11,12,13,14,16,18,21,23,24,25,26,27,28,40,42,43,44,47,48,50,52,53,54,56,57,58],userspac:[20,41,42],userspaceapp:41,userspacecontain:41,uses:[1,3,5,12,13,14,15,16,17,23,24,25,29,48,50,52,53,55,56],using:[3,4,5,12,14,16,18,19,21,23,24,25,26,27,29,42,43,48,50,52,53,54,55,59],usual:[25,32,59],utc:45,util:[5,58],uuid:[4,12,24,50],uvex:27,valid:[4,11,12,16,18,21,24,25,27,41,43,45,50,53,54,56,59],valu:[2,5,6,12,14,16,17,18,19,23,26,32,41,42,43,45,48,56,59],valuabl:11,vanish:2,vari:[18,24,25,54],variabl:[29,54],varianc:18,variant:56,variat:[18,24],varieti:[18,28],variou:[0,21,42,49,52,53,59],vcc:19,vector:[1,15,18,24,25,32,38,50],veloc:6,vendor:[0,19,41],veri:[2,5,18,24,27,50],verif:[2,50],verifi:[18,21,24,27,45],version:[4,9,12,14,18,20,21,23,24,25,29,41,42,45,50,52,53,54],vertic:[14,17,19],veryf:45,via:[3,4,7,9,12,14,17,18,19,21,22,23,24,25,26,27,28,29,40,43,45,46,48,52,53,54,55,57,59],vibrat:[18,19,56],vicin:18,video:51,view:[6,18,19,22,24,27,44,50,54,56,57],view_pose_set:24,view_uuid:24,viewpoint:[5,18],visard:[21,45],visibl:[2,5,18,24,25,50,54,56],vision:[3,6,13,15,17,20,21,22,23,28,42,43,45,49,51,52,53,55,59],visual:[2,6,16,18,22,24,25,26,44,50,52,53,54],voltag:[19,49,56],volum:[24,25,26,48],w_r:31,wai:[1,4,7,18,26,50,55,58,59],wait:[27,53,54],wall:[0,4,5,26,53],warn:[4,16,20,23,24,25,27,41,45,47,50,54,56],warp:50,warranti:[20,27,49,56],wast:[11,58],water:50,watertight:[4,17,50],wb_auto:14,wb_ratio:14,weakli:[15,53],web:[2,4,7,8,13,14,18,19,20,21,22,23,24,25,26,27,40,42,43,48,52,53,54,55,56,57],websit:[11,17,50,54],weee:11,weight:[14,19,24,50],well:[2,4,10,12,14,18,21,42,44,49,50,53,54,55,56,57],were:[18,24,25,41,50],what:41,when:[2,4,12,14,15,16,17,18,19,23,24,25,26,27,41,43,44,47,48,50,52,53,54,56,59],whenev:[21,52,54],where:[14,15,18,23,24,25,26,32,42,48,50,52,53,54,59],wherea:[5,40],whether:[4,14,16,18,21,24,41,47,50,53,54,56],which:[1,2,3,4,5,6,7,9,11,12,13,14,15,16,17,18,19,21,23,24,25,26,27,28,32,37,40,41,42,48,50,52,53,54,55,59],white:[5,14,21,25,53,54,56],whole:[25,47,49,50,52,53],whose:[12,25,26,50],why:2,wide:[45,54],width:[2,14,17,24,43,48,52,53],widthmax:14,window:[15,21,27],wipe:27,wire:[20,23],wish:11,within:[12,18,19,21,24,49,50,53,56,57],without:[2,5,11,14,15,19,21,23,24,25,27,47,49,50,52,53,54,59],wizard:[2,18],wlan:17,work:[2,5,15,17,50,52,53,54,55,56,59],world:18,would:[4,15,16,17,24,50],wpr:1,write:43,written:[4,12,14,16,47,50],wrong:[2,53,54,56],wrongli:2,www:[0,8,14,19,21,27,53],x_r:[32,39],xyz:[1,15,18,38,39],xyzabc:15,y_r:[32,39],yaskawa:1,yaw:50,ycbcr411_8:14,yellow:[24,50,56],yield:[2,54],you:[2,11,27,29,50,58,59],your:[11,12,14,27,29,58],yyyi:45,z_r:[32,39],zero:17,zip:12},titles:["Accessories","Appendix","Camera calibration","3D camera modules","CollisionCheck","Stereo vision","Measurement principles","Configuration modules","Contact","Database modules","Detection modules","Information on disposal","KUKA Ethernet KRL Interface","Overview","GigE Vision 2.0/GenICam image interface","Glossary","GripperDB","gRPC image stream interface","Hand-eye calibration","Hardware specification","Roboception rc_visard NG User Manual","Installation","Interfaces","IO and Projector Control","ItemPick and BoxPick","LoadCarrier","LoadCarrierDB","Maintenance","Software modules","OPC UA interface","ABB pose format","FANUC XYZ-WPR format","Franka Emika Pose Format","Fruitcore HORST pose format","Kawasaki XYZ-OAT format","KUKA XYZ-ABC format","Mitsubishi XYZ-ABC format","Rotation matrix and translation vector","Universal Robots pose format","Yaskawa Pose Format","REST-API interface","Data type definitions","General API structure","Nodes, parameters, and services","Swagger UI","System and logs","UserSpace","Introduction","RoiDB","Safety","SilhouetteMatch","Applicable standards","Camera","Stereo matching","TagDetect","Time synchronization","Troubleshooting","UserSpace","Warranty","Web GUI"],titleterms:{"default":21,"import":14,"return":[4,12,16,18,24,25,26,48,50,53,54],"static":53,Eye:18,FPS:52,The:[4,18,23,24,25,50,52,53,54],abb:30,abc:[35,36],absolut:19,access:[57,59],accessori:0,accuraci:19,acquisit:[52,53],acquisition_mod:[52,53],acquisition_trigg:[52,53],acquisitioncontrol:14,activ:52,adapt:53,address:8,align:25,alon:4,analogcontrol:14,angl:38,api:[16,24,40,42,50],appendix:1,applic:[12,24,51,57],approv:51,approxim:54,apriltag:[50,54],assign:19,assum:25,assume_gravity_align:25,asymmetr:16,auto:52,automat:21,avail:42,axi:[18,38],backup:27,balanc:52,base:50,bit:14,blue:52,bottom:4,boxpick:24,bridg:12,bright:52,cad:16,calcul:16,calibr:[2,18,24,25,26,27,48,50,54],calibrate_base_plan:50,call:[18,53],camera:[2,3,18,24,25,27,50,52,56,59],carrier:[25,26],categori:14,check:[4,18,50],check_bottom:4,check_collis:4,check_collisions_with_base_plan:50,check_collisions_with_match:50,check_collisions_with_point_cloud:50,check_flang:4,chosen:53,chunk:14,chunkdatacontrol:14,clean:27,client:17,cloud:[50,53,59],cluster:24,cluster_max_curvatur:24,cluster_max_dimens:24,clustering_discontinuity_factor:24,clustering_max_surface_rms:24,clustering_patch_s:24,code:[4,12,16,18,24,25,26,48,50,53,54,56],collis:[4,50],collision_dist:4,collisioncheck:[4,24,50],color:56,comparison:54,compart:26,compon:12,comput:[18,24,53],compute_grasp:24,condit:19,confid:[53,56],configur:[7,12,21,57],connect:[0,12,56],connector:19,contact:8,control:[23,24,25,50,59],convers:[14,17,31,32,34,35,36,37,38,39],coordin:19,coverag:24,creat:[16,27],crop:25,crop_dist:25,curvatur:24,custom:14,data:[14,41],databas:9,definit:[17,26,41],delete_base_plane_calibr:50,delete_grasp:50,delete_gripp:[4,16],delete_load_carri:[25,26],delete_pos:18,delete_regions_of_interest:[24,25,48],delete_regions_of_interest_2d:[25,48,50],deliveri:19,depend:53,deprec:[4,24,25,50,52],depth:[53,56,59],depthcontrol:14,descript:[4,18,23,24,25,50,52,53],detect:[10,18,24,25,50,54],detect_filling_level:25,detect_item:24,detect_load_carri:25,detect_object:50,devic:21,devicecontrol:14,differ:54,digitaliocontrol:14,dimens:24,discontinu:24,discoveri:21,dispar:[53,56],dispos:11,distanc:[4,25,50,53,54],dot:19,doubl:53,double_shot:53,download:[8,27,52,53,59],edg:50,edge_sensit:50,eki:12,element:16,emika:32,enhanc:50,environment:19,error:[53,56],estim:54,ethernet:[0,12],exampl:[12,17,54],exp_auto:52,exp_auto_average_max:52,exp_auto_average_min:52,exp_auto_mod:52,exp_control:52,exp_height:52,exp_max:52,exp_offset_i:52,exp_offset_x:52,exp_valu:52,exp_width:52,explor:59,exposur:[52,53],exposure_adapt_timeout:53,eye:[18,24,25,26,48,50,54],factor:24,factori:21,famili:54,fanuc:31,featur:14,field:14,file:[12,27],fill:[25,53],firmwar:27,flang:[4,16],format:[1,30,31,32,33,34,35,36,38,39],fps:52,frame:19,franka:32,from:[31,32,34,35,36,37,38,39],fruitcor:33,full:19,gain:52,gain_valu:52,gamma:52,gener:[12,42,49],genicam:[14,56],get_base_plane_calibr:50,get_calibr:18,get_grasp:50,get_gripp:[4,16],get_io_valu:23,get_load_carri:[25,26],get_pos:18,get_preferred_orient:50,get_regions_of_interest:[24,25,48],get_regions_of_interest_2d:[25,48,50],get_sorting_strategi:[24,50],get_symmetric_grasp:50,gige:[14,56],glossari:15,grasp:[24,50],graviti:25,green:52,grid:18,grid_height:18,grid_width:18,gripper:16,gripperdb:16,grpc:17,gui:[16,50,59],hand:[18,24,25,26,48,50,54],hardwar:[19,56],hdr:52,height:18,high:54,highest:50,horst:33,host:21,ideal:54,identif:54,imag:[14,17,52,53,56,59],imageformatcontrol:14,inform:11,instal:21,intend:49,interact:[24,25,26,48,50],interest:[48,50],interfac:[12,14,17,18,19,22,29,40,51,57],intern:50,introduct:[4,16,24,25,26,47,48,50,54],issu:56,item:24,itempick:24,kawasaki:34,kit:0,krl:12,kuka:[12,35],led:56,len:27,level:25,licens:[21,27],line:24,line_sensit:24,linestatusal:14,load:[25,26],loadcarri:[24,25,50],loadcarrierdb:26,log:[27,45],machin:32,mainten:27,manual:[20,21,24,50,52,55],manual_line_sensit:24,match:[19,24,25,50,53],match_max_dist:50,match_percentil:50,matrix:[32,37],max:52,max_grasp:24,max_number_of_detected_object:50,maxdepth:53,maxdeptherr:53,maximum:[19,24,50,53,54],mean:14,measur:6,measure_depth:53,mechan:19,messag:32,millimet:19,min:52,min_cluster_coverag:24,min_plaus:25,minconf:53,mindepth:53,minimum:[24,25,53],mitsubishi:36,mode:[24,52,53],model:25,model_toler:25,modul:[3,4,7,9,10,16,18,23,24,25,26,28,48,50,52,53,54],monocalibr:2,mount:18,name:21,network:[21,57],node:43,non:19,ntp:55,number:50,oat:34,object:[19,50],offset:18,onli:[24,50],only_highest_priority_grasp:50,opc:29,oper:19,orient:[50,54],other:[4,24,25,26,48,50],out1:23,out1_mod:23,out2:23,out2_mod:23,overview:[4,13,18,23,24,25,50,52,53],paramet:[2,4,12,14,18,23,24,25,43,50,52,53,54],part:0,patch:24,percentil:50,pin:19,plane:50,plausibl:25,point:[50,53,59],point_cloud_enhanc:50,port:14,pose:[1,18,30,32,33,38,39,54],posit:[16,54],possibl:[24,53,54],power:[0,19,21],precis:54,prefer:[24,50],prefer_split:24,previou:27,principl:6,prioriti:50,process:2,project:19,projector:[23,24,25,50],provid:14,ptp:55,ptpcontrol:14,qualiti:[50,53,54],quaternion:[31,32,34,35,36,37,38,39],racecom:32,radiu:16,random:19,rate:19,rc_april_tag_detect:54,rc_boxpick:24,rc_camera:52,rc_collision_check:4,rc_hand_eye_calibr:18,rc_iocontrol:23,rc_itempick:24,rc_load_carri:25,rc_qr_code_detect:54,rc_silhouettematch:50,rc_stereomatch:53,rc_visard:[14,19,20,21,27],read:54,reboot:27,record:18,rectangl:24,rectif:52,red:52,reflect:19,region:[48,50,52],remove_calibr:18,represent:32,request:[12,42],reset:21,reset_calibr:18,reset_default:[4,18,23,24,25,50,52,53,54],resolut:[19,53],resourc:42,respons:12,rest:[16,40,50],restart:54,restor:27,restrict:57,result:2,return_cod:53,rmse:24,robocept:20,robot:[16,38],robot_mount:18,roidb:48,rotat:[18,32,37],rotation:16,routin:18,run:[4,18,23,24,25,50,52,53,54],safeti:49,save_calibr:18,scan3dcontrol:14,scenario:54,scene:50,scope:19,seg:53,segment:53,self:2,sensit:[24,50],sensor:18,servic:[2,4,12,16,17,18,23,24,25,26,43,48,50,52,53,54],set:[2,16,27,50,55],set_all_grasp:50,set_calibr:18,set_grasp:50,set_gripp:[4,16],set_load_carri:[25,26],set_pos:18,set_preferred_orient:50,set_region_of_interest:[24,25,48],set_region_of_interest_2d:[25,48,50],set_sorting_strategi:[24,50],shot:53,silhouettematch:50,size:[24,54],smooth:53,softwar:[21,27,28],sort:50,sourc:52,spare:0,specif:[4,16,19,26,48],split:24,stand:4,standard:[14,51],start:[24,54],state:[24,32,54],static_scen:53,statu:[4,18,24,25,50,52,53,54],step:18,stereo:[2,5,19,24,25,50,53],stop:[24,54],store:2,strategi:50,stream:[14,17],structur:[12,42],suitabl:50,suppli:[0,19],support:8,surfac:24,swagger:44,synchron:55,system:45,tag:54,tagdetect:54,tcp:[16,18,50],tcp_offset:18,tcp_rotation_axi:18,technic:19,templat:[24,50],textured_box:24,time:[4,18,23,24,25,50,52,53,54,55],timeout:53,toler:25,transform:32,translat:[32,37],transpar:19,transportlayercontrol:14,trigger:52,trigger_activ:52,trigger_sourc:52,troubl:56,troubleshoot:[12,56],type:[24,41],univers:38,updat:27,upload:16,use:49,user:20,userspac:[46,57],valu:[4,24,25,50,52,53,54],vector:37,verifi:2,version:27,via:[16,50],view:[52,53],vision:[5,14,56],warn:49,warranti:58,wb_auto:52,wb_ratio_blu:52,wb_ratio_r:52,web:[16,50,59],white:52,width:[18,54],wire:[0,19],within:4,wpr:31,xml:12,xyz:[31,32,34,35,36],yaskawa:39}}) \ No newline at end of file diff --git a/v24.04/en/silhouettematch.html b/v24.04/en/silhouettematch.html new file mode 100644 index 0000000..a25dfa6 --- /dev/null +++ b/v24.04/en/silhouettematch.html @@ -0,0 +1,3489 @@ + + + + + + + + + + + SilhouetteMatch — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      SilhouetteMatch

      +
      +

      Introduction

      +

      The SilhouetteMatch module is an optional on-board module of the rc_visard NG and requires a separate SilhouetteMatch license + to be purchased.

      +

      The module detects objects by matching a predefined silhouette (“template”) to edges in the image.

      +

      The SilhouetteMatch module can detect objects in two different scenarios:

      +
      +

      With calibrated base plane: The objects are placed on a common base plane, which must be calibrated before the detection, and the objects have +significant edges on a common plane that is parallel to the base plane.

      +

      With object plane detection: The objects can be placed at different, previously unknown heights, if the objects have a planar surface and their outer +contours are well visible in the images (e.g. stacked flat objects).

      +
      +

      Templates for object detection can be created by uploading a DXF file and specifying the object height. +The correct scale and unit of the contours are extracted from the DXF file. If no units are +present in the DXF file, the user has to specify which units should be used. When the outer +contour of the object in the DXF file is closed, a 3D collision model is created automatically +by extruding the contour by the given object height. This model will then be used for collision checking +and in 3D visualizations. +Uploading a DXF file can be done in the Web GUI via the + Create a new Template button in the +SilhouetteMatch Templates and Grasps section on the Modules ‣ SilhouetteMatch or +Database ‣ Templates pages.

      +

      Roboception also offers a template generation service on their +website, +where the user can upload CAD files or recorded data of the objects and request object templates for the SilhouetteMatch module.

      +

      The object templates consist of significant edges of each object. These template edges are matched to the +edges detected in the left and right camera images, considering the +actual size of the objects and their distance from the camera. The poses of the detected objects are +returned and can be used for grasping, for example.

      +

      The SilhouetteMatch module offers:

      +
        +
      • A dedicated page on the rc_visard NG Web GUI +for easy setup, configuration, testing, and application tuning.
      • +
      • A REST-API interface and a +KUKA Ethernet KRL Interface.
      • +
      • The definition of 2D regions of interest to select relevant parts of the camera image +(see Setting a region of interest).
      • +
      • A load carrier detection functionality for bin-picking applications +(see LoadCarrier), +to provide grasps for objects inside a bin only.
      • +
      • Storing of up to 50 templates.
      • +
      • The definition of up to 50 grasp points for each template via an interactive visualization in the Web GUI.
      • +
      • Collision checking between the gripper and the load carrier, the calibrated base plane, other detected objects and/or the point cloud.
      • +
      • Support for static and robot-mounted cameras and +optional integration with the Hand-eye calibration + module, +to provide grasps in the user-configured external reference frame.
      • +
      • Selection of a sorting strategy to sort the detected objects and returned grasps.
      • +
      • 3D visualization of the detection results with grasp points and gripper animations in the Web GUI.
      • +
      +
      +

      Suitable objects

      +

      The SilhouetteMatch module is intended for objects which have significant edges on a common plane that is +parallel to the plane on which the objects are placed. This applies to flat, nontransparent +objects, such as routed, laser-cut or water-cut 2D parts and flat-machined parts. More complex +parts can also be detected if there are significant edges on a common plane, e.g. a special +pattern printed on a flat surface. +The detection works best for objects on a texture-free plane. The color of the base plane should +be chosen such that a clear contrast between the objects and the base plane appears in the intensity image.

      +

      In case the objects are not placed on a common base plane or the base plane cannot be calibrated beforehand, +the objects need to have a planar surface and their outer contour must be well visible in the left and right images. +Furthermore, the template for these objects must have a closed outer contour.

      +
      +
      +

      Suitable scene

      +

      The scene must meet the following conditions to be suitable for the SilhouetteMatch module:

      +
        +
      • The objects to be detected must be suitable for the SilhouetteMatch module as described above.
      • +
      • Only objects belonging to one specific template are visible at a time (unmixed scenario). In case other objects are visible as well, a proper region of interest (ROI) must be set.
      • +
      • In case a calibrated base plane is used: The offset between the base plane normal and the camera’s line of sight does not exceed 10 degrees.
      • +
      • In case the object planes are detected automatically: The offset between the object’s planar surface normal and the camera’s line of sight does not exceed 25 degrees.
      • +
      • The objects are not partially or fully occluded.
      • +
      • All visible objects are right side up (no flipped objects).
      • +
      • The object edges to be matched are visible in both, left and right camera images.
      • +
      +
      +
      +
      +

      Base-plane calibration

      +

      In case all objects are placed on a common plane that is known beforehand, +a base-plane calibration should be performed before triggering a detection. +Thereby, the distance and angle of the plane on which the objects are +placed is measured and stored persistently on the rc_visard NG.

      +

      Separating the detection of the base plane from the actual object detection +renders scenarios possible in which the base plane is temporarily occluded. +Moreover, it increases performance of the object detection for scenarios where +the base plane is fixed for a certain time; thus, it is not necessary +to continuously re-detect the base plane.

      +

      The base-plane calibration can be performed in three different ways, +which will be explained in more detail further down:

      +
        +
      • AprilTag based
      • +
      • Stereo based
      • +
      • Manual
      • +
      +

      The base-plane calibration is successful if the normal vector of the estimated base plane is at most +10 degrees offset to the camera’s line of sight. If the base-plane calibration +is successful, it will be stored persistently on the rc_visard NG until it is removed or a new base-plane +calibration is performed.

      +
      +

      Note

      +

      To avoid privacy issues, the image of the persistently stored base-plane calibration will +appear blurred after rebooting the rc_visard NG.

      +
      +

      In scenarios where the base plane is not accessible for calibration, a plane parallel to the base plane can be calibrated. +Then an offset parameter can be used to shift the estimated plane onto the actual base plane where +the objects are placed. The offset parameter gives the distance in meters by which the estimated plane +is shifted towards the camera.

      +

      In the REST-API, a plane is defined by a normal and a distance. +normal is a normalized 3-vector, specifying the normal of the plane. +The normal points away from the camera. +distance represents the distance of the plane from the camera along the normal. +Normal and distance can also be interpreted as \(a\), \(b\), \(c\), and \(d\) components +of the plane equation, respectively:

      +
      +\[ax + by + cz + d = 0\]
      +
      +

      AprilTag based base-plane calibration

      +

      AprilTag detection (ref. TagDetect) +is used to find AprilTags +in the scene and fit a plane through them. At least three AprilTags must be placed on the base +plane so that they are visible in the left and right camera images. The tags should be placed +such that they are spanning a triangle that is as large as possible. The larger the triangle, +the more accurate is the resulting base-plane estimate. +Use this method if the base plane is untextured and no external random dot projector is available. +This calibration mode is available via the REST-API interface +and the rc_visard NG Web GUI.

      +
      +
      +

      Stereo based base-plane calibration

      +

      The 3D point cloud computed by the stereo matching module is used to fit a plane +through its 3D points. +Therefore, the region of interest (ROI) for this method must +be set such that only the relevant base plane is included. +The plane_preference parameter allows to select whether the plane closest to +or farthest from the camera should be used as base plane. +Selecting the closest plane can be used in scenarios where the base plane is +completely occluded by objects or not accessible for calibration. +Use this method if the base plane is well textured or you can +make use of a random dot projector to project texture on the base plane. +This calibration mode is available via the REST-API interface +and the rc_visard NG Web GUI.

      +
      +
      +

      Manual base-plane calibration

      +

      The base plane can be set manually if its parameters are known, e.g. from previous +calibrations. This calibration mode is only available via the REST-API interface +and not the rc_visard NG Web GUI.

      +
      +
      +
      +

      Setting a region of interest

      +

      If objects are to be detected only in part of the camera’s field of view, +a 2D region of interest (ROI) can be set accordingly as described in +Region of interest.

      +
      +
      +

      Setting of grasp points

      +

      To use SilhouetteMatch directly in a robot application, up to 50 grasp points +can be defined for each template. A grasp point represents the desired position and orientation +of the robot’s TCP (Tool Center Point) to grasp an object as shown in +Fig. 28.

      +
      +_images/grasp_points_silm.svg +

      Fig. 28 Definition of grasp points with respect to the robot’s TCP

      +
      +

      Each grasp consists of an id which must be +unique within all grasps for an object template, the template_id representing the template +to which the grasp should be attached, and the pose in the coordinate frame of the object template. +Grasp points can be set via the REST-API interface, +or by using the interactive visualization in the Web GUI. +Furthermore, a priority (spanning -2 for very low to 2 for very high) can be assigned to a grasp. +Priorities can facilitate robot applications and shorten response times when the run-time parameter +only_highest_priority_grasps is set to true. In this case collision checking concludes when +grasps with the highest possible priority have been found. Finally, different grasps can be associated with +different grippers by specifying a gripper_id. These individual grippers are then used for collision checking +of the corresponding grasps instead of the gripper defined in the detect_object request. If no gripper_id is given, the gripper +defined in the detect_object request will be used for collision checking.

      +

      When a grasp is defined on a symmetric object, all grasps symmetric to the defined one +will automatically be considered in the SilhouetteMatch module’s detect_object service call. Symmetric grasps +for a given grasp point can be retrieved using the get_symmetric_grasps service call and visualized in the Web GUI.

      +

      Users can also define replications of grasps around a custom axis. These replications spawn multiple grasps and free users +from setting too many grasps manually. The replication origin is defined as a coordinate frame in the object’s coordinate +frame and the x axis of the replication origin frame corresponds to the replication axis. +The grasp is replicated by rotating it around this x axis +starting from its original pose. The replication is done in steps of size step_x_deg degrees. +The range is defined by the minimal and maximal boundaries min_x_deg and max_x_deg. +The minimal (maximal) boundary must be a non-positive (non-negative) number up to (minus) 180 degrees.

      +
      +

      Setting grasp points in the Web GUI

      +

      The rc_visard NG Web GUI provides an intuitive and interactive way of defining grasp points for object templates. +In a first step, the object template has to be uploaded to the rc_visard NG. This can be done +in the Web GUI in any pipeline under Modules ‣ SilhouetteMatch +by clicking on + Add a new Template in the +Templates and Grasps section, or in Database ‣ Templates in the +SilhouetteMatch Templates and Grasps section. Once the +template upload is complete, a dialog with a 3D visualization of the object template is shown +for adding or editing grasp +points. The same dialog appears when editing an existing template. If the template contains a collision model or a visualization model, +this 3D model is visualized as well.

      +

      This dialog provides two ways for setting grasp points:

      +
        +
      1. Adding grasps manually: +By clicking on the + symbol, a new grasp is placed in the object origin. The +grasp can be given a unique name which corresponds to its ID. +The desired pose of the grasp can be entered in the fields for Position and Roll/Pitch/Yaw which are given +in the coordinate frame of the object template represented by the long x, y and z axes in the visualization. +The grasp point can be placed freely with respect to the object template - inside, outside or on the surface. +The grasp point and its orientation are visualized in 3D for verification.
      2. +
      3. Adding grasps interactively: +Grasp points can be added interactively by first clicking on the Add Grasp button +in the upper right corner of the visualization and then clicking on the desired point on the object template visualization. +If the 3D model is displayed, the grasps will be attached to the surface of the 3D model. Otherwise, the +grasp is attached to the template surface. The grasp orientation is a right-handed coordinate system and +is chosen such that its z axis is perpendicular to the surface pointing inside the template at +the grasp position. The position and orientation in the object coordinate frame is displayed on the right. +The position and orientation of the grasp can also be changed interactively. +In case Snap to surface is disabled (default), the grasp can be translated and rotated freely in all three dimensions +by clicking on Move Grasp in the visualization menu and then dragging the grasp along the +appropriate axis to the desired position. The orientation of the grasp can also be changed by rotating the axis with the mouse. +In case Snap to surface is enabled in the visualization, the grasp can only be moved along the +model surface.
      4. +
      +

      Users can also specify a grasp priority by changing the Priority slider. A dedicated gripper can be selected +in the Gripper drop down field.

      +

      By activating the Replication check box, users can replicate the +grasp around a custom axis. The replication axis and the resulting replicated grasps are visualized. +The position and orientation of the replication axis relative to the object coordinate frame can be adjusted +interactively by clicking on Move Replication Axis in the visualization menu and then dragging the axis +to the desired position and orientation. +The grasps are replicated within the specified rotation range at the selected rotation step size. Users can cycle through +a visualization of the replicated grasps by dragging the bar below Cycle through n replicated grasps in +the View Options section of the visualization menu. If a gripper is selected for the grasp or a gripper has +been chosen in the visualization menu, the gripper is also shown at the currently selected grasp.

      +

      If the object template has symmetries, the grasps which are symmetric to the defined grasps can be displayed along with +their replications (if defined) by enabling … symmetries in the View Options section of the visualization menu. +The user can also cycle through a visualization of the symmetric grasps by dragging the +bar below Cycle through n symmetric grasps.

      +
      +
      +

      Setting grasp points via the REST-API

      +

      Grasp points can be set via the REST-API interface +using the set_grasp or set_all_grasps services +(see Internal services). +A grasp consists of the template_id of the template +to which the grasp should be attached, an id uniquely identifying the grasp point and +the pose. The pose is given in the coordinate frame of the object template and +consists of a position in meters and an orientation as quaternion. +A dedicated gripper can be specified through setting the gripper_id field. The +priority is specified by an integer value, ranging from -2 for very low, to 2 for very high with a step size +of 1. The replication origin is defined as a transformation in the object’s coordinate frame and the x axis +of the transformation corresponds to the replication axis. The +replication range is controlled by the min_x_deg and max_x_deg fields and the step size step_x_deg.

      +
      +
      +
      +

      Setting the preferred orientation of the TCP

      +

      The SilhouetteMatch module determines the reachability of grasp points based on the preferred orientation of the +gripper or TCP. The preferred orientation can be set via the set_preferred_orientation service or on +the SilhouetteMatch page in the Web GUI. +The resulting direction of the TCP’s z axis is used to reject grasps which cannot be reached by the gripper. +Furthermore, the preferred orientation can be used to sort the reachable grasps by setting the corresponding +sorting strategy.

      +

      The preferred orientation can be set in the camera coordinate frame or in the external coordinate frame, in case +a hand-eye calibration is available. If the preferred orientation is specified in the external coordinate frame +and the sensor is robot mounted, the current robot pose has to be given to each object detection call, so that the +preferred orientation can be used for filtering and, optionally, sorting the grasps on the detected objects. +If no preferred orientation is set, the orientation of the left camera is used as the preferred orientation of the TCP.

      +
      +
      +

      Setting the sorting strategies

      +

      The objects and grasps returned by the detect_object service call are sorted according to a sorting strategy which can be +chosen by the user. The following sorting strategies are available and +can be set in the Web GUI +or using the set_sorting_strategies service call:

      +
        +
      • preferred_orientation: objects and grasp points with minimal rotation difference between their orientation and the preferred orientation of the TCP are returned first,
      • +
      • direction: objects and grasp points with the shortest distance along a defined direction vector in a given pose_frame are returned first.
      • +
      +

      If no sorting strategy is set or default sorting is chosen in the Web GUI, sorting is done based on a combination of +preferred_orientation and the minimal distance from the camera along the z axis of the preferred orientation of the TCP.

      +
      +
      +

      Detection of objects

      +

      For triggering the object detection, in general, the following information +must be provided to the SilhouetteMatch module:

      +
        +
      • The template of the object to be detected in the scene.
      • +
      • The coordinate frame in which the poses of the detected objects shall be returned +(ref. Hand-eye calibration).
      • +
      +

      Optionally, further information can be given to the SilhouetteMatch module:

      +
        +
      • A flag object_plane_detection determining whether the surface plane of the objects should be used for the detection instead of the calibrated base plane.
      • +
      • An offset, in case the calibrated base plane should be used but the objects are not lying on this plane but on a plane parallel +to it. The offset is the distance between both planes +given in the direction towards the camera. If omitted, an offset of 0 is assumed. It must not be set if object_plane_detection is true.
      • +
      • The ID of the load carrier which contains the objects to be detected.
      • +
      • The ID of the region of interest where to search for the load carrier if a +load carrier is set. Otherwise, the ID of the region of interest where the objects should +be detected. If omitted, objects are matched in the whole image.
      • +
      • The current robot pose in case the camera is mounted on the robot and +the chosen coordinate frame for the poses is external or the preferred orientation +is given in the external frame.
      • +
      • Collision detection information: The ID of the gripper to enable collision checking and optionally +a pre-grasp offset to define a pre-grasp position. +Details on collision +checking are given below in +CollisionCheck.
      • +
      +

      In case the object_plane_detection flag is not true, +objects can only be detected after a successful base-plane calibration. +It must be ensured that the position and orientation of the base plane +does not change before the detection of objects. +Otherwise, the base-plane calibration must be renewed.

      +

      When object_plane_detection is set to true, a base-plane calibration is not required and +an existing base-plane calibration will be ignored. During detection, the scene is clustered into +planar surfaces and template matching is performed on each plane whose tilt with respect to the +camera’s line of sight is less than 25° and whose size is large enough to contain the selected template. +When a match is found, its position and orientation are refined using the image edges and the +point cloud inside the template’s outer contour. For this, it is required that the outer contour of +the template is closed and that the object’s surface is planar.

      +

      On the Web GUI the detection can be tested in the Try Out section of the SilhouetteMatch page. +Different image streams can be selected to show intermediate results and the final matches as shown +in Fig. 29.

      +
      +

      The “Template” image stream shows the template +to be matched in red with the defined grasp points in green +(see Setting of grasp points). +The template is warped to the size and tilt matching +objects on the calibrated base plane or, in case object_plane_detection was used, +the highest segmented plane, would have. The corresponding plane is shown in dark blue.

      +

      The “Intermediate Result” image stream shows the edges of the left image that were used to search for matches in light blue. +The chosen region of interest is shown as bold petrol rectangle. +A shaded blue area on the left visualizes the region of the left camera image which does not overlap with +the right image, and in which no objects can be detected. If object_plane_detection was used, this +image stream also shows the detected planar clusters in the scene. Clusters that were +not used for matching, because they were too small or too tilted, are visualized with a stripe pattern.

      +

      The “Intermediate Result Right” image stream shows the edges of the right image that were used to search for matches in light blue. +The chosen region of interest is shown as bold petrol rectangle. +A shaded blue area on the right visualizes the region of the right camera image which does not overlap with +the left image, and in which no objects can be detected.

      +

      The “Result” image shows the detection result. The image edges +that were used to refine the match poses are shown in light blue and the matches (instances) +with the template edges are shown in red. The blue circles are the origins of the detected +objects as defined in the template and the green circles are the +collision-free grasp points. Colliding grasp points are visualized as +red dots and grasp points that were not checked for collisions are drawn in yellow.

      +
      +
      +_images/silhouetteMatchStreams.png +

      Fig. 29 “Template”, “Intermediate Result” and “Result” image streams of the SilhouetteMatch module as shown in the Web GUI +for a detection with object_plane_detection set to true

      +
      +

      The poses of the object origins in the chosen +coordinate frame are returned as results in a list of instances. +In case the calibrated base plane was used for the detection (object_plane_detection not set or false), +the orientations of the detected objects are aligned with the normal of the base plane. +Otherwise, the orientations of the detected objects are aligned with the normal of a plane fitted to the +object points in the 3D point cloud.

      +

      If the chosen template also has grasp points attached, +a list of grasps for all objects is returned in addition to the list of detected objects. +The grasp poses are given in the desired coordinate frame and +the grasps are sorted according to the selected sorting strategy +(see Setting the sorting strategies). +There are references between the detected object instances and the grasps via their uuids.

      +

      In case the templates have a continuous rotational symmetry (e.g. cylindrical objects), +all returned object poses will have the same orientation. Furthermore, all grasps symmetric +to each grasp point on an object are checked for reachability and collisions, and only the +best one according to the given sorting strategy is returned.

      +

      For objects with a discrete symmetry (e.g. prismatic objects), all collision-free symmetries of +each grasp point which are reachable according to the given preferred +TCP orientation are returned, ordered by the given sorting strategy.

      +

      The detection results and run times are affected by several run-time parameters which are listed +and explained further down. Improper parameters can lead to timeouts of the SilhouetteMatch module’s +detection process.

      +
      +
      +

      Interaction with other modules

      +

      Internally, the SilhouetteMatch module depends on, and interacts with other on-board +modules as listed below.

      +
      +

      Note

      +

      All changes and configuration updates to these modules will affect +the performance of the SilhouetteMatch module.

      +
      +
      +

      Stereo camera and stereo matching

      +

      The SilhouetteMatch module makes internally use of the rectified images from the +Camera module (rc_camera). +Thus, the exposure time should be set properly to achieve the optimal performance of the module.

      +

      For base-plane calibration in stereo mode, for load carrier detection, for automatic object plane detection and for collision checking +with the point cloud, the disparity images from the Stereo matching module +(rc_stereomatching) are used.

      +

      For detecting objects with a calibrated base plane, without load carrier and without collision checking with the point cloud, +the stereo-matching module should not be run in parallel to the SilhouetteMatch module, because the detection runtime increases.

      +

      For best results it is recommended to enable +smoothing +for Stereo matching.

      +
      +
      +

      IO and Projector Control

      +

      In case the rc_visard NG is used in conjunction with an external random dot projector and +the IO and Projector Control module (rc_iocontrol), +the projector should be used for the stereo-based base-plane calibration, for automatic object plane detection and for collision checking +with the point cloud.

      +

      The projected pattern must not be visible in the left and right camera images during object detection +as it interferes with the matching process. +Therefore, it is recommended to connect the projector to GPIO Out 1 and set +the stereo-camera module’s acquisition mode to SingleFrameOut1 +(see Stereo matching parameters), so that +on each image acquisition trigger an image with and without projector pattern is acquired.

      +

      Alternatively, the output mode for the GPIO output in use should be set to ExposureAlternateActive +(see Description of run-time parameters).

      +

      In either case, +the Auto Exposure Mode exp_auto_mode should be set to AdaptiveOut1 to optimize the exposure +of both images (see Stereo camera parameters).

      +
      +
      +

      Hand-eye calibration

      +

      In case the camera has been calibrated to a robot, the SilhouetteMatch module can automatically provide +poses in the robot coordinate frame. +For the SilhouetteMatch node’s Services, the frame of the +input and output poses and plane coordinates can be controlled with the pose_frame +argument.

      +

      Two different pose_frame values can be chosen:

      +
        +
      1. Camera frame (camera). +All poses and plane coordinates provided to and by the module are in the camera frame.
      2. +
      3. External frame (external). +All poses and plane coordinates provided to and by the module are in the external frame, +configured by the user during the hand-eye calibration process. +The module relies on the on-board +Hand-eye calibration module +to retrieve the camera mounting (static or robot mounted) and +the hand-eye transformation. +If the sensor mounting is static, no further information is needed. +If the sensor is robot-mounted, the robot_pose is required +to transform poses to and from the external frame.
      4. +
      +

      All pose_frame values that are not camera or external are rejected.

      +
      +

      Note

      +

      If no hand-eye calibration is available, all pose_frame values should be set to camera.

      +
      +
      +

      Note

      +

      If the hand-eye calibration has changed after base-plane calibration, +the base-plane calibration will be marked as invalid and must be renewed.

      +
      +

      If the sensor is robot-mounted, the current robot_pose has to be provided depending on the value of pose_frame, +the definition of the preferred TCP orientation and the sorting direction:

      +
        +
      • If pose_frame is set to external, providing the robot pose is obligatory.
      • +
      • If the preferred TCP orientation is defined in external, providing the robot pose is obligatory.
      • +
      • If the sorting direction is defined in external, providing the robot pose is obligatory.
      • +
      • In all other cases, providing the robot pose is optional.
      • +
      +

      If the current robot pose is provided during calibration, it is stored persistently on the rc_visard NG. +If the updated robot pose is later provided during get_base_plane_calibration or detect_object +as well, the base-plane calibration will be transformed automatically to this new robot pose. +This enables the user to change the robot pose (and thus camera position) +between base-plane calibration and object detection.

      +
      +

      Note

      +

      Object detection can only be performed if the limit of 10 degrees angle offset between +the base plane normal and the camera’s line of sight is not exceeded.

      +
      +
      +
      +

      LoadCarrier

      +

      The SilhouetteMatch module uses the load carrier detection functionality provided by the +LoadCarrier module (rc_load_carrier), +with the run-time parameters specified for this module. However, only one load carrier will be +returned and used in case multiple matching load carriers could be found in the scene. In case multiple +load carriers of the same type are visible, a region of interest should be set to ensure that always the +same load carrier is used for the SilhouetteMatch module.

      +
      +
      +

      CollisionCheck

      +

      Collision checking can be easily enabled for +grasp computation of the SilhouetteMatch module by passing a collision_detection argument to the +detect_object service call. It contains the ID of the used gripper and +optionally a pre-grasp offset. The gripper has to be +defined in the GripperDB module +(see Setting a gripper) +and details about collision checking are given in Collision checking within other modules. In addition to collision checking between the gripper and the detected load carrier, collisions +between the gripper and the calibrated base plane will be checked, if the run-time parameter check_collisions_with_base_plane is true. +If the selected SilhouetteMatch template contains a collision model and the run-time parameter check_collisions_with_matches is true, +also collisions between the gripper and all other detected objects (not limited to max_number_of_detected_objects) will be checked. The object +on which the grasp point to be checked is located, is excluded from the collision check.

      +

      If the run-time parameter check_collisions_with_point_cloud is true, +also collisions between the gripper and a watertight version of the point cloud are checked. +If this feature is used with suctions grippers, it should be ensured that the TCP is defined +to be outside the gripper geometry, or that the grasp points are defined above the object surface. +Otherwise every grasp will result in a collision between the gripper and the point cloud.

      +

      If collision checking is enabled, only grasps which are collision free will be returned. +However, the visualization images on the SilhouetteMatch +page of the Web GUI also show colliding grasp points in red. The objects which are considered in the collision check are +also visualized with their edges in red.

      +

      The CollisionCheck module’s run-time parameters affect the collision detection as described in +CollisionCheck Parameters.

      +
      +
      +
      +

      Parameters

      +

      The SilhouetteMatch software module is called rc_silhouettematch in the REST-API and is represented in the +Web GUI under +Modules ‣ SilhouetteMatch. +The user can explore and configure the rc_silhouettematch +module’s run-time parameters, e.g. for development and testing, using the Web GUI or the +REST-API interface.

      +
      +

      Parameter overview

      +

      This module offers the following run-time parameters:

      + + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table 30 The rc_silhouettematch module’s run-time parameters
      NameTypeMinMaxDefaultDescription
      check_collisions_with_-base_planeboolfalsetruetrueWhether to check for collisions between gripper and base plane
      check_collisions_with_matchesboolfalsetruetrueWhether to check for collisions between gripper and detected matches
      check_collisions_with_-point_cloudboolfalsetruefalseWhether to check for collisions between gripper and the point cloud
      edge_sensitivityfloat640.11.00.7Sensitivity of the edge detector
      match_max_distancefloat640.110.03.0Maximum allowed distance in pixels between the template and the detected edges in the image
      match_percentilefloat640.71.00.8Percentage of template pixels that must be within the maximum distance to successfully match the template
      max_number_of_detected_objectsint3212010Maximum number of detected objects
      only_highest_priority_graspsboolfalsetruefalseWhether to return only the highest priority level grasps
      point_cloud_enhancementstring--OffType of enhancement of the point cloud using the base plane: [Off, ReplaceBright]
      qualitystring--HighQuality: [Low, Medium, High]
      +
      +
      +

      Description of run-time parameters

      +

      Each run-time parameter is represented by a row on the Web GUI’s SilhouetteMatch page. +The name in the Web GUI is given in brackets behind the parameter name and the parameters are +listed in the order they appear in the Web GUI:

      +
      +

      max_number_of_detected_objects (Maximum Object Number)

      +
      +
      +

      This parameter gives the maximum number of objects to detect in the scene. If more than +the given number of objects can be detected in the scene, only the objects matching best to +the given sorting strategy are returned.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?max_number_of_detected_objects=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_silhouettematch/parameters?max_number_of_detected_objects=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      quality (Quality)

      +
      +
      +

      Object detection can be performed on images with different resolutions: +High (full image resolution), Medium (half image resolution) and +Low (quarter image resolution). The lower +the resolution, the lower the detection time, but the fewer details of the objects +are visible.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?quality=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_silhouettematch/parameters?quality=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      match_max_distance (Maximum Matching Distance)

      +
      +
      +

      This parameter gives the maximum allowed pixel distance of an image edge pixel from the object +edge pixel in the template to be still considered as matching. If the object is not perfectly +represented in the template, it might not be detected when this parameter is low. High values, +however, might lead to false detections in case of a cluttered scene or the presence of similar +objects, and also increase runtime.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?match_max_distance=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_silhouettematch/parameters?match_max_distance=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      match_percentile (Matching Percentile)

      +
      +
      +

      This parameter indicates how strict the matching process should be. The matching percentile is +the ratio of template pixels that must be within the Maximum Matching Distance to successfully match the template. +The higher this number, the more accurate the match must be to be considered as valid.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?match_percentile=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_silhouettematch/parameters?match_percentile=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      edge_sensitivity (Edge Sensitivity)

      +
      +
      +

      This parameter influences how many edges are detected in the left and right camera images. The higher this number, the +more edges are found in the intensity images. That means, for lower numbers, only the most significant edges +are considered for template matching. A large number of edges in the image might increase the detection time. +It must be ensured that the edges of the objects to be detected are detected in both, the left and the right camera images.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?edge_sensitivity=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_silhouettematch/parameters?edge_sensitivity=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      only_highest_priority_grasps (Only Highest Priority Grasps)

      +
      +

      If set to true, only grasps with the highest priority will be returned. If collision checking is enabled, only the collision-free +grasps among the group of grasps with the highest priority are returned. +This can save computation time and reduce the number of grasps to be parsed on the application side.

      +

      Without collision checking, only grasps of highest priority are returned.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?only_highest_priority_grasps=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_silhouettematch/parameters?only_highest_priority_grasps=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      check_collisions_with_base_plane (Check Collisions with Base Plane)

      +
      +
      +

      If this parameter is set to true, and collision checking is enabled by passing a gripper to the detect_object service call, +all grasp points will be checked for collisions between the gripper and the +calibrated base plane, and only grasp points at which the gripper would not collide with the base plane will be +returned.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?check_collisions_with_base_plane=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_silhouettematch/parameters?check_collisions_with_base_plane=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      check_collisions_with_matches (Check Collisions with Matches)

      +
      +
      +

      If this parameter is set to true, and collision checking is enabled by passing a gripper to the detect_object service call, +all grasp points will be checked for collisions between the gripper and all other detected objects (not limited to +max_number_of_detected_objects), and only grasp points at which the gripper would not collide with any other detected object +will be returned.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/parameters/parameters?check_collisions_with_matches=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_silhouettematch/parameters?check_collisions_with_matches=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      check_collisions_with_point_cloud (Check Collisions with Point Cloud)

      +
      +
      +

      If this parameter is set to true, and collision checking is enabled by passing a gripper to the detect_object service call, +all grasp points will be checked for collisions between the gripper a watertight version of the point cloud, and only grasp points +at which the gripper would not collide with this point cloud will be returned.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?check_collisions_with_point_cloud=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_silhouettematch/parameters?check_collisions_with_point_cloud=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      point_cloud_enhancement (Enhance with Base Plane)

      +
      +
      +

      This parameter is only considered when check_collisions_with_point_cloud is true and the object detection was +triggered without object_plane_detection. By default, point_cloud_enhancement is set to Off (Off). +If point_cloud_enhancement is set to ReplaceBright (Replace Bright Image Pixels), the calibrated base plane will +be used to enhance the point cloud that is used for collision checking. For this, the depth values of all bright image pixels inside the image or, +if set, the 2D region of interest will be set to the depth of the calibrated base plane. This parameter should be used when dark objects are placed on an +untextured bright background, e.g. on a light table.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/<0,1,2,3>/nodes/rc_silhouettematch/parameters?point_cloud_enhancement=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_silhouettematch/parameters?point_cloud_enhancement=<value>
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +

      Status values

      +

      This module reports the following status values:

      + + ++++ + + + + + + + + + + + + + + + + + + + +
      Table 31 The rc_silhouettematch module’s status values
      NameDescription
      data_acquisition_timeTime in seconds required by the last active service to acquire images
      last_timestamp_processedThe timestamp of the last processed dataset
      load_carrier_detection_timeProcessing time of the last load carrier detection in seconds
      processing_timeProcessing time of the last detection (including load carrier detection) in seconds
      +
      +
      +

      Services

      +

      The user can explore and call the rc_silhouettematch module’s services, +e.g. for development and testing, using the +REST-API interface or +the rc_visard NG +Web GUI.

      +

      The SilhouetteMatch module offers the following services.

      +
      +

      detect_object

      +
      +

      Triggers an object detection as described in +Detection of objects +and returns the pose of all found object instances.

      +

      Details

      +
      +

      All images used by the service are guaranteed to be newer than the service trigger time.

      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/services/detect_object
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/detect_object
      +
      +
      +
      +
      +
      + +
      +

      Required arguments:

      +
      +

      object_id in object_to_detect: ID of the template which should be detected.

      +

      pose_frame: see Hand-eye calibration.

      +
      +

      Potentially required arguments:

      +
      +
      robot_pose: see Hand-eye calibration.
      +

      Optional arguments:

      +
      +

      object_plane_detection: false if the objects are placed on a calibrated base plane, true if the objects’ surfaces are planar and +the base plane is unknown or the objects are located on multiple different planes, e.g. stacks.

      +

      offset: offset in meters by which the base-plane calibration will be shifted towards the camera.

      +

      load_carrier_id: ID of the load carrier which contains the items to be detected.

      +

      collision_detection: see Collision checking within other modules.

      +
      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "collision_detection": {
      +      "gripper_id": "string",
      +      "pre_grasp_offset": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      }
      +    },
      +    "load_carrier_id": "string",
      +    "object_plane_detection": "bool",
      +    "object_to_detect": {
      +      "object_id": "string",
      +      "region_of_interest_2d_id": "string"
      +    },
      +    "offset": "float64",
      +    "pose_frame": "string",
      +    "robot_pose": {
      +      "orientation": {
      +        "w": "float64",
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "position": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      }
      +    }
      +  }
      +}
      +
      +
      +
      +
      +

      The maximum number of returned instances can be controlled with the max_number_of_detected_objects +parameter.

      +

      object_id: ID of the detected template.

      +

      instances: list of detected object instances, ordered according to the chosen sorting strategy.

      +

      grasps: list of grasps on the detected objects, ordered according to the chosen sorting strategy. +The instance_uuid gives the reference to the detected object in instances this grasp belongs to. +The list of returned grasps will be trimmed to the 100 best grasps if more reachable grasps are found. +Each grasp contains a flag collision_checked and a gripper_id +(see Collision checking within other modules).

      +

      load_carriers: list of detected load carriers.

      +

      timestamp: timestamp of the image set the detection ran on.

      +

      return_code: holds possible warnings or error codes and messages.

      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "detect_object",
      +  "response": {
      +    "grasps": [
      +      {
      +        "collision_checked": "bool",
      +        "gripper_id": "string",
      +        "id": "string",
      +        "instance_uuid": "string",
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "pose_frame": "string",
      +        "priority": "int8",
      +        "timestamp": {
      +          "nsec": "int32",
      +          "sec": "int32"
      +        },
      +        "uuid": "string"
      +      }
      +    ],
      +    "instances": [
      +      {
      +        "grasp_uuids": [
      +          "string"
      +        ],
      +        "id": "string",
      +        "object_id": "string",
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "pose_frame": "string",
      +        "timestamp": {
      +          "nsec": "int32",
      +          "sec": "int32"
      +        },
      +        "uuid": "string"
      +      }
      +    ],
      +    "load_carriers": [
      +      {
      +        "height_open_side": "float64",
      +        "id": "string",
      +        "inner_dimensions": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "outer_dimensions": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "overfilled": "bool",
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "pose_frame": "string",
      +        "rim_ledge": {
      +          "x": "float64",
      +          "y": "float64"
      +        },
      +        "rim_step_height": "float64",
      +        "rim_thickness": {
      +          "x": "float64",
      +          "y": "float64"
      +        },
      +        "type": "string"
      +      }
      +    ],
      +    "object_id": "string",
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    },
      +    "timestamp": {
      +      "nsec": "int32",
      +      "sec": "int32"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      calibrate_base_plane

      +
      +

      Triggers the calibration of the base plane, as described in +Base-plane calibration.

      +

      Details

      +
      +

      A successful base-plane calibration is stored persistently on the rc_visard NG and returned by this service. +The base-plane calibration is persistent over firmware updates and rollbacks.

      +

      All images used by the service are guaranteed to be newer than the service trigger time.

      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/services/calibrate_base_plane
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/calibrate_base_plane
      +
      +
      +
      +
      +
      + +
      +

      Required arguments:

      +
      +

      plane_estimation_method: method to use for base-plane calibration. Valid values are STEREO, APRILTAG, MANUAL.

      +

      pose_frame: see Hand-eye calibration.

      +
      +

      Potentially required arguments:

      +
      +

      plane if plane_estimation_method is MANUAL: plane that will be set as base-plane calibration.

      +

      robot_pose: see Hand-eye calibration.

      +

      region_of_interest_2d_id: ID of the region of interest for base-plane calibration.

      +
      +

      Optional arguments:

      +
      +

      offset: offset in meters by which the estimated plane will be shifted towards the camera.

      +

      plane_preference in stereo: whether the plane closest to or farthest from the camera should be used as base plane. +This option can be set only if plane_estimation_method is STEREO. +Valid values are CLOSEST and FARTHEST. If not set, the default is FARTHEST.

      +
      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "offset": "float64",
      +    "plane": {
      +      "distance": "float64",
      +      "normal": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      }
      +    },
      +    "plane_estimation_method": "string",
      +    "pose_frame": "string",
      +    "region_of_interest_2d_id": "string",
      +    "robot_pose": {
      +      "orientation": {
      +        "w": "float64",
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "position": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      }
      +    },
      +    "stereo": {
      +      "plane_preference": "string"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +

      plane: calibrated base plane.

      +

      timestamp: timestamp of the image set the calibration ran on.

      +

      return_code: holds possible warnings or error codes and messages.

      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "calibrate_base_plane",
      +  "response": {
      +    "plane": {
      +      "distance": "float64",
      +      "normal": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "pose_frame": "string"
      +    },
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    },
      +    "timestamp": {
      +      "nsec": "int32",
      +      "sec": "int32"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      get_base_plane_calibration

      +
      +

      Returns the configured base-plane calibration.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/services/get_base_plane_calibration
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/get_base_plane_calibration
      +
      +
      +
      +
      +
      + +
      +

      Required arguments:

      +
      +
      pose_frame: see Hand-eye calibration.
      +

      Potentially required arguments:

      +
      +
      robot_pose: see Hand-eye calibration.
      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "pose_frame": "string",
      +    "robot_pose": {
      +      "orientation": {
      +        "w": "float64",
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "position": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      }
      +    }
      +  }
      +}
      +
      +
      +
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "get_base_plane_calibration",
      +  "response": {
      +    "plane": {
      +      "distance": "float64",
      +      "normal": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "pose_frame": "string"
      +    },
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      delete_base_plane_calibration

      +
      +

      Deletes the configured base-plane calibration.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/services/delete_base_plane_calibration
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/delete_base_plane_calibration
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "delete_base_plane_calibration",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      set_preferred_orientation

      +
      +

      Persistently stores the preferred orientation of the gripper to compute the reachability of the grasps, +which is used for filtering and, optionally, sorting the grasps returned by the detect_object service +(see Setting the preferred orientation of the TCP).

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/services/set_preferred_orientation
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/set_preferred_orientation
      +
      +
      +
      +
      +
      + +
      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "orientation": {
      +      "w": "float64",
      +      "x": "float64",
      +      "y": "float64",
      +      "z": "float64"
      +    },
      +    "pose_frame": "string"
      +  }
      +}
      +
      +
      +
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "set_preferred_orientation",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      get_preferred_orientation

      +
      +

      Returns the preferred orientation of the gripper to compute the reachability of the grasps, +which is used for filtering and, optionally, sorting the grasps returned by the detect_object service +(see Setting the preferred orientation of the TCP).

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/services/get_preferred_orientation
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/get_preferred_orientation
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "get_preferred_orientation",
      +  "response": {
      +    "orientation": {
      +      "w": "float64",
      +      "x": "float64",
      +      "y": "float64",
      +      "z": "float64"
      +    },
      +    "pose_frame": "string",
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      set_sorting_strategies

      +
      +

      Persistently stores the sorting strategy for sorting the grasps and detected objects returned by the detect_object service +(see Detection of objects).

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/services/set_sorting_strategies
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/set_sorting_strategies
      +
      +
      +
      +
      +
      + +
      +

      Only one strategy may have a weight greater than 0. If all weight values are set to 0, the module will use the +default sorting strategy.

      +

      If the weight for direction is set, the +vector must contain the direction vector and pose_frame must be either camera or external.

      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "direction": {
      +      "pose_frame": "string",
      +      "vector": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "weight": "float64"
      +    },
      +    "preferred_orientation": {
      +      "weight": "float64"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "set_sorting_strategies",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      get_sorting_strategies

      +
      +

      Returns the sorting strategy for sorting the grasps and detected objects returned by the detect_object service +(see Detection of objects).

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/services/get_sorting_strategies
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/get_sorting_strategies
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      All weight values are 0 when the module uses the default sorting strategy.

      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "get_sorting_strategies",
      +  "response": {
      +    "direction": {
      +      "pose_frame": "string",
      +      "vector": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "weight": "float64"
      +    },
      +    "preferred_orientation": {
      +      "weight": "float64"
      +    },
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      reset_defaults

      +
      +

      Resets all parameters of the module to its default values, +as listed in above table. +Also resets preferred orientation and sorting strategies. +The reset does not apply to templates and base-plane calibration.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/services/reset_defaults
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/reset_defaults
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "reset_defaults",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      set_region_of_interest_2d (deprecated)

      +
      +

      Persistently stores a 2D region of interest on the rc_visard NG.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +This service is not available in API version 2. +Use set_region_of_interest_2d in rc_roi_db instead.
      +
      +
      PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/set_region_of_interest_2d
      +
      +
      +
      +
      +
      +
      +
      +
      +

      get_regions_of_interest_2d (deprecated)

      +
      +

      Returns the configured 2D regions of interest with the requested region_of_interest_2d_ids.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +This service is not available in API version 2. +Use get_regions_of_interest_2d in rc_roi_db instead.
      +
      +
      PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/get_regions_of_interest_2d
      +
      +
      +
      +
      +
      +
      +
      +
      +

      delete_regions_of_interest_2d (deprecated)

      +
      +

      Deletes the configured 2D regions of interest with the requested region_of_interest_2d_ids.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +This service is not available in API version 2. +Use delete_regions_of_interest_2d in rc_roi_db instead.
      +
      +
      PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/delete_regions_of_interest_2d
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +

      Internal services

      +

      The following services for configuring grasps can change in future without notice. +Setting, retrieving and deleting grasps is recommend to be done via the Web GUI.

      +
      +

      set_grasp

      +
      +

      Persistently stores a grasp for the given object template on the rc_visard NG. +All configured grasps are persistent over firmware updates and rollbacks.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/services/set_grasp
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/set_grasp
      +
      +
      +
      +
      +
      + +
      +

      Details for the definition of the grasp type are given in +Setting of grasp points.

      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "grasp": {
      +      "gripper_id": "string",
      +      "id": "string",
      +      "pose": {
      +        "orientation": {
      +          "w": "float64",
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "position": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        }
      +      },
      +      "priority": "int8",
      +      "replication": {
      +        "max_x_deg": "float64",
      +        "min_x_deg": "float64",
      +        "origin": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "step_x_deg": "float64"
      +      },
      +      "template_id": "string"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "set_grasp",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      set_all_grasps

      +
      +

      Replaces the list of grasps for the given object template on the rc_visard NG.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/services/set_all_grasps
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/set_all_grasps
      +
      +
      +
      +
      +
      + +
      +

      Details for the definition of the grasp type are given in +Setting of grasp points.

      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "grasps": [
      +      {
      +        "gripper_id": "string",
      +        "id": "string",
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "priority": "int8",
      +        "replication": {
      +          "max_x_deg": "float64",
      +          "min_x_deg": "float64",
      +          "origin": {
      +            "orientation": {
      +              "w": "float64",
      +              "x": "float64",
      +              "y": "float64",
      +              "z": "float64"
      +            },
      +            "position": {
      +              "x": "float64",
      +              "y": "float64",
      +              "z": "float64"
      +            }
      +          },
      +          "step_x_deg": "float64"
      +        },
      +        "template_id": "string"
      +      }
      +    ],
      +    "template_id": "string"
      +  }
      +}
      +
      +
      +
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "set_all_grasps",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      get_grasps

      +
      +

      Returns all configured grasps which have the requested grasp_ids and belong to the requested template_ids.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/services/get_grasps
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/get_grasps
      +
      +
      +
      +
      +
      + +
      +

      If no grasp_ids are provided, all grasps belonging to the requested template_ids are returned. +If no template_ids are provided, all grasps with the requested grasp_ids are returned. +If neither IDs are provided, all configured grasps are returned.

      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "grasp_ids": [
      +      "string"
      +    ],
      +    "template_ids": [
      +      "string"
      +    ]
      +  }
      +}
      +
      +
      +
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "get_grasps",
      +  "response": {
      +    "grasps": [
      +      {
      +        "gripper_id": "string",
      +        "id": "string",
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "priority": "int8",
      +        "replication": {
      +          "max_x_deg": "float64",
      +          "min_x_deg": "float64",
      +          "origin": {
      +            "orientation": {
      +              "w": "float64",
      +              "x": "float64",
      +              "y": "float64",
      +              "z": "float64"
      +            },
      +            "position": {
      +              "x": "float64",
      +              "y": "float64",
      +              "z": "float64"
      +            }
      +          },
      +          "step_x_deg": "float64"
      +        },
      +        "template_id": "string"
      +      }
      +    ],
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      delete_grasps

      +
      +

      Deletes all grasps with the requested grasp_ids that belong to the requested template_ids.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/services/delete_grasps
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/delete_grasps
      +
      +
      +
      +
      +
      + +
      +

      If no grasp_ids are provided, all grasps belonging to the requested template_ids are deleted. +The template_ids list must not be empty.

      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "grasp_ids": [
      +      "string"
      +    ],
      +    "template_ids": [
      +      "string"
      +    ]
      +  }
      +}
      +
      +
      +
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "delete_grasps",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      get_symmetric_grasps

      +
      +

      Returns all grasps that are symmetric to the given grasp.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_silhouettematch/services/get_symmetric_grasps
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_silhouettematch/services/get_symmetric_grasps
      +
      +
      +
      +
      +
      + +
      +

      Details for the definition of the grasp type are given in +Setting of grasp points.

      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "grasp": {
      +      "pose": {
      +        "orientation": {
      +          "w": "float64",
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "position": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        }
      +      },
      +      "replication": {
      +        "max_x_deg": "float64",
      +        "min_x_deg": "float64",
      +        "origin": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "step_x_deg": "float64"
      +      },
      +      "template_id": "string"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +

      The first grasp in the returned list is the one that was passed with the service call. +If the object template does not have an exact symmetry, only the grasp passed with the +service call will be returned. If the object template has a continuous symmetry (e.g. a +cylindrical object), only 12 equally spaced sample grasps will be returned.

      +

      Details for the definition of the grasp type are given in +Setting of grasp points.

      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "get_symmetric_grasps",
      +  "response": {
      +    "grasps": [
      +      {
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "replication": {
      +          "max_x_deg": "float64",
      +          "min_x_deg": "float64",
      +          "origin": {
      +            "orientation": {
      +              "w": "float64",
      +              "x": "float64",
      +              "y": "float64",
      +              "z": "float64"
      +            },
      +            "position": {
      +              "x": "float64",
      +              "y": "float64",
      +              "z": "float64"
      +            }
      +          },
      +          "step_x_deg": "float64"
      +        },
      +        "template_id": "string"
      +      }
      +    ],
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +

      Return codes

      +

      Each service response contains a return_code, +which consists of a value plus an optional message. +A successful service returns with a return_code value of 0. +Negative return_code values indicate that the service failed. +Positive return_code values indicate that the service succeeded with additional information.

      + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table 32 Return codes of the SilhouetteMatch module services
      CodeDescription
      0Success
      -1An invalid argument was provided
      -3An internal timeout occurred, e.g. during object detection
      -4Data acquisition took longer than allowed
      -7Data could not be read or written to persistent storage
      -8Module is not in a state in which this service can be called. E.g. detect_object cannot be called if there is no base-plane calibration.
      -10New element could not be added as the maximum storage capacity of regions of interest or templates has been exceeded
      -100An internal error occurred
      -101Detection of the base plane failed
      -102The hand-eye calibration changed since the last base-plane calibration
      -104Offset between the base plane normal and the camera’s line of sight exceeds 10 degrees
      10The maximum storage capacity of regions of interest or templates has been reached
      11An existing element was overwritten
      100The requested load carrier was not detected in the scene
      101None of the detected grasps is reachable
      102The detected load carrier is empty
      103All detected grasps are in collision
      107The base plane was not transformed to the current camera pose, e.g. because no robot pose was provided during base-plane calibration
      108The template is deprecated.
      109The plane for object detection does not fit to the load carrier, e.g. objects are below the load carrier floor.
      111The detection result’s pose could not be refined with the point cloud because the template’s outer contour is not closed.
      151The object template has a continuous symmetry
      999Additional hints for application development
      +
      +
      +

      Template API

      +

      For template upload, download, listing and removal, special REST-API endpoints are provided. +Templates can also be uploaded, downloaded and removed via the Web GUI. +The templates include the grasp points, if grasp points have been configured. +Up to 50 templates can be stored persistently on the rc_visard NG.

      +
      +
      +GET /templates/rc_silhouettematch
      +

      Get list of all rc_silhouettematch templates.

      +

      Template request

      +
      GET /api/v2/templates/rc_silhouettematch HTTP/1.1
      +
      +
      +

      Template response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +[
      +  {
      +    "id": "string"
      +  }
      +]
      +
      +
      + +++ + + + + + + + + + +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation (returns array of Template)
      • +
      • 404 Not Found – node not found
      • +
      +
      Referenced Data Models:
        +
      +
      + +
      +
      +GET /templates/rc_silhouettematch/{id}
      +

      Get a rc_silhouettematch template. If the requested content-type is application/octet-stream, the template is returned as file.

      +

      Template request

      +
      GET /api/v2/templates/rc_silhouettematch/<id> HTTP/1.1
      +
      +
      +

      Template response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "id": "string"
      +}
      +
      +
      + +++ + + + + + + + + + + + +
      Parameters:
        +
      • id (string) – id of the template (required)
      • +
      +
      Response Headers:
       
        +
      • Content-Type – application/json application/ubjson application/octet-stream
      • +
      +
      Status Codes:
        +
      • 200 OK – successful operation (returns Template)
      • +
      • 404 Not Found – node or template not found
      • +
      +
      Referenced Data Models:
        +
      +
      + +
      +
      +PUT /templates/rc_silhouettematch/{id}
      +

      Create or update a rc_silhouettematch template.

      +

      Template request

      +
      PUT /api/v2/templates/rc_silhouettematch/<id> HTTP/1.1
      +Accept: multipart/form-data application/json
      +
      +
      +

      Template response

      +
      HTTP/1.1 200 OK
      +Content-Type: application/json
      +
      +{
      +  "id": "string"
      +}
      +
      +
      + +++ + + + + + + + + + + + + + + + + + +
      Parameters:
        +
      • id (string) – id of the template (required)
      • +
      +
      Form Parameters:
       
        +
      • file – template or dxf file (required)
      • +
      • object_height – object height in meters, required when uploading dxf (optional)
      • +
      • units – Units for dxf file if not embedded in dxf (one of mm, cm, m, in, ft) (optional)
      • +
      +
      Request Headers:
       
        +
      • Accept – multipart/form-data application/json
      • +
      +
      Response Headers:
        +
      Status Codes: +
      Referenced Data Models:
        +
      +
      + +
      +
      +DELETE /templates/rc_silhouettematch/{id}
      +

      Remove a rc_silhouettematch template.

      +

      Template request

      +
      DELETE /api/v2/templates/rc_silhouettematch/<id> HTTP/1.1
      +Accept: application/json application/ubjson
      +
      +
      + +++ + + + + + + + + + + + +
      Parameters:
        +
      • id (string) – id of the template (required)
      • +
      +
      Request Headers:
       
        +
      • Accept – application/json application/ubjson
      • +
      +
      Response Headers:
        +
      Status Codes:
        +
      • 200 OK – successful operation
      • +
      • 403 Forbidden – forbidden, e.g. because there is no valid license for this module.
      • +
      • 404 Not Found – node or template not found
      • +
      +
      +
      + +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/standards.html b/v24.04/en/standards.html new file mode 100644 index 0000000..cddb287 --- /dev/null +++ b/v24.04/en/standards.html @@ -0,0 +1,676 @@ + + + + + + + + + + + Applicable standards — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Applicable standards

      +
      +

      Interfaces

      +

      The rc_visard NG supports the following interface standards:

      +

      genicamlogo

      +

      The Generic Interface for Cameras standard is the basis for plug & play handling of cameras and devices.

      +

      gigelogo

      +

      GigE Vision® is an interface standard for transmitting high-speed video and related control data over Ethernet networks.

      +
      +
      +

      Approvals

      +
      +

      The rc_visard NG has received the following approvals:

      +
      +
      CE
      +
      EC Declaration of Conformity
      +
      +
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/stereo_camera.html b/v24.04/en/stereo_camera.html new file mode 100644 index 0000000..a7a94d8 --- /dev/null +++ b/v24.04/en/stereo_camera.html @@ -0,0 +1,1612 @@ + + + + + + + + + + + Camera — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Camera

      +

      The camera module is a base module which is available on every rc_visard NG and +is responsible for image acquisition and rectification. It provides various +parameters, e.g. to control exposure and frame rate.

      +
      +

      Rectification

      +

      To simplify image processing, the camera module rectifies all camera images +based on the camera calibration. This means that lens distortion is removed and +the principal point is located exactly in the middle of the image.

      +

      The model of a rectified camera is described with just one value, which is the focal length. +The rc_visard NG reports a focal length factor via its various interfaces. It +relates to the image width for supporting different image resolutions. The +focal length \(f\) in pixels can be easily obtained by multiplying the +focal length factor by the image width in pixels.

      +

      In case of a stereo camera, rectification also aligns images such that an +object point is always projected onto the same image row in both images. +The cameras’ optical axes become exactly parallel.

      +
      +
      +

      Viewing and downloading images

      +

      The rc_visard NG provides the time-stamped, rectified images +over the GenICam interface (see Provided image streams). Live streams of the images are provided +with reduced quality in the Web GUI.

      +

      The Web GUI also provides the possibility to download a snapshot of the current scene as a .tar.gz file +as described in Downloading camera images.

      +
      +
      +

      Parameters

      +

      The camera software module is called rc_camera and is represented by the +Camera page in the Web GUI. +The user can change the camera parameters there, or directly via the REST-API +(REST-API interface) or GigE Vision +(GigE Vision 2.0/GenICam image interface).

      +
      +

      Note

      +

      Camera parameters cannot be changed via the Web GUI or REST-API if rc_visard NG +is used via GigE Vision.

      +
      +
      +

      Parameter overview

      +

      This module offers the following run-time parameters:

      + + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table 6 The rc_camera module’s run-time parameters
      NameTypeMinMaxDefaultDescription
      acquisition_modestring--ContinuousAcquisition mode: [Continuous, Trigger]
      exp_autoboolfalsetruetrueSwitching between auto and manual exposure (deprecated, please use exp_control instead)
      exp_auto_average_maxfloat640.01.00.75Maximum average intensity in Auto exposure mode
      exp_auto_average_minfloat640.01.00.25Minimum average intensity in Auto exposure mode
      exp_auto_modestring--NormalAuto-exposure mode: [Normal, Out1High, AdaptiveOut1]
      exp_controlstring--AutoExposure control mode: [Manual, Auto, HDR]
      exp_heightint32010790Height of auto exposure region. 0 for whole image.
      exp_maxfloat641e-060.0234490.018Maximum exposure time in seconds in Auto exposure mode
      exp_offset_xint32014390First column of auto exposure region
      exp_offset_yint32010790First row of auto exposure region
      exp_valuefloat641e-060.0234490.005Exposure time in seconds in Manual exposure mode
      exp_widthint32014390Width of auto exposure region. 0 for whole image.
      fpsfloat641.025.025.0Frames per second in Hertz
      gain_valuefloat640.048.00.0Gain value in decibel if not in Auto exposure mode
      gammafloat640.110.00.7Gamma factor
      trigger_activationstring--RisingEdgeTrigger activation: [RisingEdge, FallingEdge, AnyEdge]
      trigger_sourcestring--SoftwareTrigger source: [Software, In1, In2]
      wb_autoboolfalsetruetrueSwitching white balance on and off (only for color camera)
      wb_ratio_bluefloat641.01.01.0Blue to green balance ratio if wb_auto is false (only for color camera)
      wb_ratio_redfloat641.01.01.0Red to green balance ratio if wb_auto is false (only for color camera)
      +
      +
      +

      Description of run-time parameters

      +
      +_images/webgui_camera_ng_en.png +

      Fig. 15 The Web GUI’s Camera page

      +
      +
      +

      acquisition_mode (Acquisition Mode)

      +
      +

      This values determines the camera acquisition mode. In Continuous mode, the camera will +acquire images at the specified frame rate fps. In Trigger mode, images are only +acquired when the camera receives a trigger signal.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/parameters?acquisition_mode=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_camera/parameters?acquisition_mode=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      trigger_source (Trigger Source)

      +
      +

      This value is only used when acquisition_mode is set to Trigger and determines the +source for the trigger. In Software mode a trigger can be sent via the rc_camera/acquisition_trigger service. +When the acquisition_mode for the depth images is set to SingleFrame or SingleFrameOut1 +(see Parameters), +the camera software trigger is sent automatically whenever a depth image +acquisition is triggered. +The modes In1 and In2 are hardware trigger modes. +An image is acquired whenever a signal on the chosen input is received.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/parameters?trigger_source=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_camera/parameters?trigger_source=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      trigger_activation (Trigger Activation)

      +
      +

      This value is only used when acquisition_mode is set to Trigger and trigger_source is set to +In1 or In2. It determines the signal edge that should be used to trigger an acquisition. Possible +values are RisingEdge, FallingEdge or AnyEdge.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/parameters?trigger_activation=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_camera/parameters?trigger_activation=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      fps (FPS)

      +
      +

      This value is the cameras’ frame rate (fps, frames per second), +which determines the upper frequency at which depth images +can be computed. This is also the frequency at which the rc_visard NG +delivers images via GigE Vision. Reducing this frequency also +reduces the network bandwidth required to transmit the images.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/parameters?fps=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_camera/parameters?fps=<value>
      +
      +
      +
      +
      +

      The camera always runs with 25 Hz when in Continuous acquisition +mode to ensure proper working of internal modules such as visual +odometry that need a constant frame rate. +The user frame rate setting is implemented by excluding frames +for stereo matching and transmission via GigE Vision to reduce +bandwidth as shown in figure Fig. 16.

      +
      +_images/fps_ng_en.png +

      Fig. 16 Images are internally always captured with 25 Hz. The fps parameter +determines how many of them are sent as camera images via GigE Vision.

      +
      +
      +
      +
      +

      gamma (Gamma)

      +
      +

      The gamma value determines the mapping of perceived light to the brightness of a pixel. +A gamma value of 1 corresponds to a linear relationship. Lower gamma values let dark image +parts appear brighter. A value around 0.5 corresponds to human vision.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/parameters?gamma=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_camera/parameters?gamma=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      exp_control (Exposure Auto, HDR or Manual)

      +
      +

      The exposure control mode can be set to Auto, HDR or Manual. +This replaces the deprecated exp_auto parameter.

      +

      Auto: This is the default mode in which the exposure time and gain +factor is chosen automatically to correctly expose the image. +The last automatically determined exposure and gain values are set into +exp_value and gain_value when switching auto-exposure off.

      +

      HDR: The HDR mode computes high-dynamic-range images by combining images +with different exposure times to avoid under-exposed and over-exposed areas. +This decreases the frame rate and is only suitable for static scenes.

      +

      Manual: In the manual exposure mode the exposure time and gain are kept +fixed independent of the resulting image brightness.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/parameters?exp_control=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_camera/parameters?exp_control=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      exp_auto (deprecated)

      +
      +

      This parameter is deprecated and will be removed in a future release. +Please use exp_control.

      +

      This value can be set to true for auto-exposure mode, +or to false for manual exposure mode. In manual exposure mode, the +chosen exposure time is kept, even if the images are overexposed or +underexposed. In auto-exposure mode, the exposure time and gain factor +is chosen automatically to correctly expose the image. The last +automatically determined exposure and gain values are set into +exp_value and gain_value when switching auto-exposure off.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/parameters?exp_auto=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_camera/parameters?exp_auto=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      exp_auto_mode (Auto Exposure Mode)

      +
      +

      The auto exposure mode can be set to Normal, Out1High or AdaptiveOut1. These modes are +relevant when the rc_visard NG is used with an external light source or projector connected +to the rc_visard’s or rc_viscore’s GPIO Out1, +which can be controlled by the IOControl module +(IO and Projector Control).

      +

      Normal: All images are considered for exposure control, except if the IOControl mode +for GPIO Out1 is ExposureAlternateActive: then only images where GPIO Out1 is HIGH will be +considered, since these images may be brighter in case GPIO Out1 is used to trigger an external light source.

      +

      Out1High: This exposure mode adapts the exposure time using only images with GPIO Out1 HIGH. Images where GPIO Out1 is LOW are not +considered at all, which means, that the exposure time does not change when only images with Out1 LOW are acquired. +This mode is recommended for using the acquisition_mode SingleFrameOut1 in the stereo matching module as described in +Stereo Matching Parameters +and having an external projector connected to GPIO Out1, when changes in the brightness of the scene should only be considered when Out1 is HIGH. +This is the case, for example, when a bright part of the robot moves through the field of view of the camera just before a detection is triggered, +which should not affect the exposure time.

      +

      AdaptiveOut1: This exposure mode uses all camera images and tracks the exposure difference between images +with GPIO Out1 LOW and HIGH. While the IOControl mode for GPIO Out1 is LOW, the images are under-exposed by this exposure +difference to avoid over-exposure for when GPIO Out1 triggers an external projector. The resulting exposure difference +is given as Out1 Reduction below the live images. This mode is recommended for using the acquisition_mode +SingleFrameOut1 in the stereo matching module as described in +Stereo Matching Parameters +and having an external projector connected to GPIO Out1, when changes in the brightness of the scene should be considered at all times. +This is the case, for example, in applications where the external lighting changes.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/parameters?exp_auto_mode=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_camera/parameters?exp_auto_mode=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      exp_max (Max Exposure)

      +
      +

      This value is the maximal exposure time in auto-exposure +mode in seconds. The actual +exposure time is adjusted automatically so that the images are exposed +correctly. If the maximum exposure time is reached, but the images are still +underexposed, the rc_visard NG stepwise increases the gain to increase the +images’ brightness. Limiting the exposure time is useful for avoiding +or reducing motion blur during fast movements. However, higher gain +introduces noise into the image. The best trade-off depends on the application.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/parameters?exp_max=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_camera/parameters?exp_max=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      exp_auto_average_max (Max Brightness) and exp_auto_average_min (Min Brightness)

      +
      +

      The auto-exposure tries to set the exposure time and gain factor such that the +average intensity (i.e. brightness) in the image or exposure region is between a +maximum and a minimum. The maximum brightness will be used if there is no saturation, e.g. +no over-exposure due to bright surfaces or reflections. In case of saturation, +the exposure time and gain factor are reduced, but only down to the minimum +brightness.

      +

      The maximum brightness has precedence over the minimum brightness parameter. +If the minimum brightness is larger than the maximum brightness, the auto-exposure +always tries to make the average intensity equal to the maximum brightness.

      +

      The current brightness is always shown in the status bar below the images.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/parameters?<exp_auto_average_max|exp_auto_average_min>=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_camera/parameters?<exp_auto_average_max|exp_auto_average_min>=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      exp_offset_x, exp_offset_y, exp_width, exp_height (Exposure Region)

      +
      +

      These values define a rectangular region in the left rectified image for +limiting the area used for computing the auto exposure. The exposure time and +gain factor of both images are chosen to optimally expose the defined region. +This can lead to over- or underexposure of image parts outside the defined +region. If either the width or height is 0, then the whole left and right +images are considered by the auto exposure function. This is the default.

      +

      The region is visualized in the Web GUI by a rectangle in the left +rectified image. It can be defined using the sliders or by selecting +it in the image after pressing the button Select Region in Image.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/parameters?<exp_offset_x|exp_offset_y|exp_width|exp_height>=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_camera/parameters?<exp_offset_x|exp_offset_y|exp_width|exp_height>=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      exp_value (Exposure)

      +
      +
      +

      This value is the exposure time in manual exposure mode in seconds. This exposure time is kept constant +even if the images are underexposed.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/parameters?exp_value=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_camera/parameters?exp_value=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      gain_value (Gain)

      +
      +

      This value is the gain factor in decibel that can be set in manual exposure mode. Higher gain factors +reduce the required exposure time but introduce noise.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/parameters?gain_value=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_camera/parameters?gain_value=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      wb_auto (White Balance Auto or Manual)

      +
      +

      This value can be set to true for automatic white balancing or false for manually +setting the ratio between the colors using wb_ratio_red and +wb_ratio_blue. The last automatically determined ratios are set into +wb_ratio_red and wb_ratio_blue when switching automatic white balancing off. +White balancing is without function for monochrome +cameras and will not be displayed in the Web GUI in this case.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/parameters?wb_auto=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_camera/parameters?wb_auto=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      wb_ratio_blue and wb_ratio_red (Blue | Green and Red | Green)

      +
      +

      These values are used to set blue to green and red to green ratios +for manual white balance. White balancing is without function for monochrome +cameras and will not be displayed in the Web GUI in this case.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/parameters?<wb_ratio_blue|wb_ratio_red>=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_camera/parameters?<wb_ratio_blue|wb_ratio_red>=<value>
      +
      +
      +
      +
      +
      +

      These parameters are also available over the GenICam interface with slightly different names and partly with different units +or data types (see GigE Vision 2.0/GenICam image interface).

      +
      +
      +
      +
      +

      Status values

      +

      This module reports the following status values:

      + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table 7 The rc_camera module’s status values
      NameDescription
      baselineStereo baseline \(t\) in meters
      brightness Current brightness of the image as value between 0 and 1
      color0 for monochrome cameras, 1 for color cameras
      expCurrent exposure time in seconds. This value is shown below the image preview in the Web GUI as Exposure (ms).
      focalFocal length factor normalized to an image width of 1
      fpsCurrent frame rate of the camera images in Hertz. This value is shown in the Web GUI below the image preview as FPS (Hz).
      gainCurrent gain factor in decibel. This value is shown in the Web GUI below the image preview as Gain (dB).
      gammaCurrent gamma value.
      heightHeight of the camera image in pixels. This value is shown in the Web GUI below the image preview as the second part of Resolution (px).
      out1_reduction Fraction of reduction (0.0 - 1.0) of brightness for images with GPIO Out1=LOW in exp_auto_mode=AdaptiveOut1 or exp_auto_mode=Out1High. This value is shown in the Web GUI below the image preview as Out1 Reduction (%).
      params_override_active1 if parameters are temporarily overwritten by a calibration process
      temp_leftTemperature of the left camera sensor in degrees Celsius
      temp_rightTemperature of the right camera sensor in degrees Celsius
      test0 for live images and 1 for test images
      timeProcessing time for image grabbing in seconds
      widthWidth of the camera image in pixels. This value is shown in the Web GUI below the image preview as the first part of Resolution (px).
      +
      +
      +

      Services

      +

      The camera module offers the following services.

      +
      +

      acquisition_trigger

      +
      +

      Triggers an image acquisition when acquisition_mode is set to Trigger and trigger_source is set to Software.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/acquisition_trigger
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_camera/services/acquisition_trigger
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "acquisition_trigger",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      reset_defaults

      +
      +

      Restores and applies the default values for this module’s parameters +(“factory reset”).

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_camera/services/reset_defaults
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_camera/services/reset_defaults
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "reset_defaults",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/stereo_matching.html b/v24.04/en/stereo_matching.html new file mode 100644 index 0000000..eb89274 --- /dev/null +++ b/v24.04/en/stereo_matching.html @@ -0,0 +1,1792 @@ + + + + + + + + + + + Stereo matching — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Stereo matching

      +

      The stereo matching module is a base module which is available on every rc_visard NG +and uses the rectified stereo-image pair to compute +disparity, error, and confidence images. It also offers a service to measure depth in +a specified image region (see Services).

      +

      To compute full resolution disparity, error and confidence images, an additional StereoPlus +license + is required. +This license is included in every rc_visard NG purchased after +31.01.2019.

      +
      +

      Computing disparity images

      +

      After rectification, an object point is guaranteed to be projected onto the same +pixel row in both left and right image. That point’s pixel +column in the right image is always lower than or equal +to the same point’s pixel column in the left image. The term disparity +signifies the difference between the pixel columns in the right and left images +and expresses the depth or distance of the object point from the camera. The +disparity image stores the disparity values of all pixels in the left camera +image.

      +

      The larger the disparity, the closer the object point. A disparity of 0 +means that the projections of the object point are in the same image column +and the object point is at infinite distance. Often, there are pixels for which disparity +cannot be determined. This is the case for occlusions that appear on the +left sides of objects, because these areas are not seen from the right camera. +Furthermore, disparity cannot be determined for textureless areas. Pixels +for which the disparity cannot be determined are marked as invalid with the +special disparity value of 0. To distinguish between invalid disparity +measurements and disparity measurements of 0 for objects that are infinitely +far away, the disparity value for the latter is set to the smallest possible +disparity value above 0.

      +

      To compute disparity values, the stereo matching algorithm has to find +corresponding object points in the left and right camera images. These are points +that represent the same object point in the scene. For stereo matching, the rc_visard NG uses +SGM (Semi-Global Matching), which offers quick run times and +great accuracy, especially at object borders, fine structures, and in weakly textured areas.

      +

      A key requirement for any stereo matching method is the presence of texture in the +image, i.e., image-intensity changes due to patterns or surface +structure within the scene. In completely untextured regions such as a flat white +wall without any structure, disparity values can either not be computed or the +results are erroneous or have low confidence (see +Confidence and error images). The texture in the scene should not be an +artificial, repetitive pattern, since those structures may lead to ambiguities and hence to wrong disparity measurements.

      +

      When working with poorly textured objects or in +untextured environments, a static artificial texture can be projected +onto the scene using an external pattern projector. This pattern should be random-like +and not contain repetitive structures. The rc_visard NG provides the IOControl module +(see IO and Projector Control) as +optional software module which can control a pattern projector connected to the sensor.

      +
      +
      +

      Computing depth images and point clouds

      +

      The following equations show how to compute an object point’s actual 3D coordinates \(P_x, P_y, P_z\) in the +camera coordinate frame +from the disparity image’s pixel coordinates \(p_{x}, p_{y}\) +and the disparity value \(d\) in pixels:

      +
      +(1)\[\begin{split}P_x&=\frac{p_x \cdot t}{d}\\ +P_y&=\frac{p_y \cdot t}{d}\\ +P_z&=\frac{f \cdot t}{d},\end{split}\]
      +

      where \(f\) is the focal length after rectification in pixels and \(t\) +is the stereo baseline in meters, which was determined during calibration. These values +are also transferred over the GenICam interface (see +Custom GenICam features of the rc_visard NG).

      +
      +

      Note

      +

      The rc_visard NG’s camera coordinate frame is defined as shown in +Coordinate frames.

      +
      +
      +

      Note

      +

      The rc_visard NG reports a focal length factor via its various +interfaces. It relates to the image width +for supporting different image resolutions. The focal length \(f\) +in pixels can be easily obtained by multiplying the focal length factor +by the image width in pixels.

      +
      +

      Please note that equations (1) assume that the coordinate +frame is centered in the principal point that is typically in the center of the image, +and \(p_{x}, p_{y}\) refer to the middle of the pixel, i.e. by adding 0.5 to the +integer pixel coordinates. The following figure shows the definition of the image coordinate +frame.

      +
      +_images/image_coordinates.png +

      Fig. 17 The image coordinate frame’s origin is defined to be at the image center +– \(w\) is the image width and \(h\) is the image height.

      +
      +

      The same equations, but with the corresponding GenICam parameters are given in +Image stream conversions.

      +

      The set of all object points computed from the disparity image gives the point +cloud, which can be used for 3D modeling applications. The disparity image is +converted into a depth image by replacing +the disparity value in each pixel with the value of \(P_z\).

      +
      +

      Note

      +

      Roboception provides software and examples for receiving disparity images from +the rc_visard NG via GigE Vision and computing depth images and point clouds. See +http://www.roboception.com/download.

      +
      +
      +
      +

      Confidence and error images

      +

      For each disparity image, additionally an error image and a confidence image are provided, +which give uncertainty measures for each disparity value. These images +have the same resolution and the same frame rate as the disparity image. The +error image contains the disparity error \(d_{eps}\) in pixels corresponding +to the disparity value at the same image coordinates in the disparity image. +The confidence image contains the corresponding confidence value \(c\) +between 0 and 1. The confidence is defined as the probability of the true +disparity value being within the interval of three times the error around the +measured disparity \(d\), i.e., \([d-3d_{eps}, d+3d_{eps}]\). +Thus, the disparity image with error and confidence values can be used in +applications requiring probabilistic inference. The confidence and error values +corresponding to an invalid disparity measurement will be 0.

      +

      The disparity error \(d_{eps}\) (in pixels) can be converted to a depth error \(z_{eps}\) +(in meters) using the focal length \(f\) (in pixels), the baseline \(t\) (in meters), and the disparity +value \(d\) (in pixels) of the same pixel in the disparity image:

      +
      +(2)\[z_{eps}=\frac{d_{eps}\cdot f\cdot t}{d^2}.\]
      +

      Combining equations (1) and (2) allows the +depth error to be related to the depth:

      +
      +\[z_{eps}=\frac{d_{eps}\cdot{P_z}^2}{f\cdot t}.\]
      +

      With the focal lengths and baselines of the different camera models and the typical combined +calibration and stereo matching error \(d_{eps}\) of 0.25 pixels, the depth accuracy +can be visualized as shown below.

      +
      +_images/reconstruction_error.png +
      +
      +
      +

      Viewing and downloading images and point clouds

      +

      The rc_visard NG provides time-stamped disparity, error, and confidence images over the +GenICam interface (see Provided image streams). +Live streams of the images are provided with reduced quality on the Depth Image page of the +Web GUI.

      +

      The Web GUI also provides the possibility to download a snapshot of the current scene containing the depth, error and confidence +images, as well as a point cloud in ply format as described in +Downloading depth images and point clouds.

      +
      +
      +

      Parameters

      +

      The stereo matching module is called rc_stereomatching in the REST-API and it is represented by the +Depth Image page in the Web GUI. +The user can change the stereo matching parameters there, or use the REST-API +(REST-API interface) or GigE Vision +(GigE Vision 2.0/GenICam image interface).

      +
      +

      Parameter overview

      +

      This module offers the following run-time parameters:

      + + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table 8 The rc_stereomatching module’s run-time parameters
      NameTypeMinMaxDefaultDescription
      acquisition_modestring--ContinuousAcquisition mode: [Continuous, SingleFrame, SingleFrameOut1]
      double_shotboolfalsetruefalseCombination of disparity images from two subsequent stereo image pairs
      exposure_adapt_timeoutfloat640.02.00.0Maximum time in seconds to wait after triggering in SingleFrame modes until auto exposure has finished adjustments
      fillint32043Disparity tolerance for hole filling in pixels
      maxdepthfloat640.1100.0100.0Maximum depth in meters
      maxdeptherrfloat640.01100.0100.0Maximum depth error in meters
      minconffloat640.51.00.5Minimum confidence
      mindepthfloat640.1100.00.1Minimum depth in meters
      qualitystring--HighQuality: [Low, Medium, High, Full]. Full requires ‘stereo_plus’ license.
      segint3204000200Minimum size of valid disparity segments in pixels
      smoothboolfalsetruetrueSmoothing of disparity image (requires ‘stereo_plus’ license)
      static_sceneboolfalsetruefalseAccumulation of images in static scenes to reduce noise
      +
      +
      +

      Description of run-time parameters

      +

      Each run-time parameter is represented by a row on the Web GUI’s Depth Image page. The name in the +Web GUI is given in brackets behind the parameter name and the parameters are listed in the order +they appear in the Web GUI:

      +
      +_images/webgui_depth_image_ng_en.png +

      Fig. 18 The Web GUI’s Depth Image page

      +
      +
      +

      acquisition_mode (Acquisition Mode)

      +
      +
      +

      The acquisition mode can be set to Continuous, SingleFrame (Single) or SingleFrameOut1 (Single + Out1). +The first one is the default, which performs stereo matching continuously according to the +user defined frame rate and the available computation resources. The two other modes +perform stereo matching upon each click of the Acquire button. The Single + Out1 +mode additionally controls an external projector that is connected to GPIO Out1 +(IO and Projector Control). In this mode, +out1_mode of the IOControl module is automatically set to ExposureAlternateActive upon each trigger call +and reset to Low after receiving images for stereo matching.

      +
      +

      Note

      +

      The Single + Out1 mode can only change the out1_mode if the IOControl +license is available on the rc_visard NG.

      +
      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?acquisition_mode=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_stereomatching/parameters?acquisition_mode=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      exposure_adapt_timeout (Exposure Adaptation Timeout)

      +
      +
      +

      The exposure adaptation timeout gives the maximum time in seconds that the system will wait after triggering +an image acquisition until auto exposure has found the optimal exposure time. This timeout is only used +in SingleFrame (Single) or SingleFrameOut1 (Single + Out1) +acquisition mode with auto exposure active. This value should be increased in applications +with changing lighting conditions, when images are under- oder overexposed and the resulting +disparity images are too sparse. In these cases multiple images are acquired until the auto-exposure +mode has adjusted or the timeout is reached, and only then the actual image acquisition is triggered.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?exposure_adapt_timeout=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_stereomatching/parameters?exposure_adapt_timeout=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      quality (Quality)

      +
      +
      +

      Disparity images can be computed in different resolutions: +Full (full image resolution), High (half of the full image resolution), +Medium (quarter of the full image resolution) +and Low (sixth of the full image resolution). Full resolution matching (Full) +is only possible with a valid StereoPlus license. The lower +the resolution, the higher the frame rate of the disparity image. Please note that the frame +rate of the disparity, confidence, and error images will always be less than or +equal to the camera frame rate. In case the projector is in ExposureAlternateActive mode, +the frame rate of the images can be at most half of the camera frame rate.

      +

      A 25 Hz frame rate can be achieved only at medium and low resolution.

      +

      If full resolution is selected, the depth range is internally limited due to +limited on-board memory resources. It is recommended to adjust mindepth +and maxdepth to the depth range that is required by the application.

      + + +++++++ + + + + + + + + + + + + + + +
      Table 9 Depth image resolutions depending on the chosen quality
      QualityFullHighMediumLow
      Resolution (pixel)1440 x 1080720 x 540360 x 270240 x 180
      +
      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?quality=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_stereomatching/parameters?quality=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      double_shot (Double-Shot)

      +
      +

      Enabling this option will lead to denser disparity images, but will increase processing time.

      +

      For scenes recorded with a projector in Single + Out1 acquisition +mode, or in continuous acquisition mode with the projector in ExposureAlternateActive mode, +holes caused by reflections of the projector are filled with depth information computed from +the images without projector pattern. In this case, the double_shot parameter must only be +enabled if the scene does not change during the acquisition of the images.

      +

      For all other scenes, holes are filled with depth information computed from a downscaled version of the same image.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?double_shot=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_stereomatching/parameters?double_shot=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      static_scene (Static)

      +
      +

      This option averages 8 consecutive camera images before matching. This reduces +noise, which improves the stereo matching result. However, the latency increases significantly. +The timestamp of the first +image is taken as timestamp of the disparity image. This option only affects +matching in full or high quality. It must only be enabled if the scene does not +change during the acquisition of the 8 images.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?static_scene=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_stereomatching/parameters?static_scene=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      mindepth (Minimum Distance)

      +
      +

      The minimum distance is the smallest distance from the camera +at which measurements should be possible. Larger values implicitly reduce the +disparity range, which also reduces the computation time. The minimum distance +is given in meters.

      +

      Depending on the capabilities of the sensor, the actual minimum distance +can be higher than the user setting. The actual minimum distance will be +reported in the status values.

      +

      In quality mode Full, the actual minimum distance can also be higher +than the user-defined minimum distance due to memory limitations. In this +case, lowering the maximum distance helps to reduce the actual minimum distance.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?mindepth=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_stereomatching/parameters?mindepth=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      maxdepth (Maximum Distance)

      +
      +

      The maximum distance is the largest distance from the camera +at which measurements should be possible. Pixels with larger distance values are +set to invalid in the disparity image. Setting this value to its maximum permits +values up to infinity. The maximum distance is given in meters.

      +

      In quality mode Full, the actual minimum distance can be higher +than the user-defined minimum distance due to memory limitations. In this +case, lowering the maximum distance helps to reduce the actual minimum distance.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?maxdepth=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_stereomatching/parameters?maxdepth=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      smooth (Smoothing)

      +
      +

      This option activates advanced smoothing of disparity values. It is only +available with a valid StereoPlus license.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?smooth=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_stereomatching/parameters?smooth=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      fill (Fill-in)

      +
      +

      This option is used to fill holes in the disparity image by interpolation. +The fill-in value is the maximum allowed disparity step on the border of the +hole. Larger fill-in values can decrease the number of holes, but the interpolated +values can have larger errors. At most 5% of pixels are interpolated. Interpolation +of small holes is preferred over interpolation of larger holes. The confidence for +the interpolated pixels is set to a low value of 0.5. A fill-in value of 0 +switches hole filling off.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?fill=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_stereomatching/parameters?fill=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      seg (Segmentation)

      +
      +

      The segmentation parameter is used to set the minimum number of +pixels that a connected disparity region in the disparity image must fill. +Isolated regions that are smaller are set to invalid in the disparity image. +The value is related to the high quality disparity image with half resolution +and does not have to be scaled when a different quality +is chosen. Segmentation is useful for removing erroneous disparities. However, +larger values may also remove real objects.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?seg=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_stereomatching/parameters?seg=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      minconf (Minimum Confidence)

      +
      +

      The minimum confidence can be set to filter potentially false disparity measurements. +All pixels with less confidence than the chosen value are set to invalid +in the disparity image.

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?minconf=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_stereomatching/parameters?minconf=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      maxdeptherr (Maximum Depth Error)

      +
      +

      The maximum depth error is used to filter measurements +that are too inaccurate. All pixels with a larger depth error than the chosen +value are set to invalid in the disparity image. The maximum +depth error is given in meters. The depth error generally grows quadratically +with an object’s distance from the camera (see Confidence and error images).

      +

      Via the REST-API, this parameter can be set as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/parameters/parameters?maxdeptherr=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_stereomatching/parameters?maxdeptherr=<value>
      +
      +
      +
      +
      +
      +

      The same parameters are also available over the GenICam interface with slightly different names and partly with different data types +(see GigE Vision 2.0/GenICam image interface).

      +
      +
      +
      +
      +

      Status values

      +

      This module reports the following status values:

      + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table 10 The rc_stereomatching module’s status values
      NameDescription
      fpsActual frame rate of the disparity, error, and confidence images. This value is shown in the Web GUI below the image preview as FPS (Hz).
      latencyTime in seconds between image acquisition and publishing of disparity image
      widthCurrent width of the disparity, error, and confidence images in pixels
      heightCurrent height of the disparity, error, and confidence images in pixels
      mindepthActual minimum working distance in meters
      maxdepthActual maximum working distance in meters
      time_matchingTime in seconds for performing stereo matching using SGM on the GPU
      time_postprocessingTime in seconds for postprocessing the matching result on the CPU
      reduced_depth_rangeIndicates whether the depth range is reduced due to computation resources
      +
      +
      +

      Services

      +

      The stereo matching module offers the following services.

      +
      +

      acquisition_trigger

      +
      +

      Signals the module to perform stereo matching of the next available +images, if the parameter acquisition_mode is set to SingleFrame or +SingleFrameOut1.

      +

      Details

      +
      +

      An error is returned if the acquisition_mode is set to Continuous.

      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/services/acquisition_trigger
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_stereomatching/services/acquisition_trigger
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      Possible return codes are shown below.

      + + ++++ + + + + + + + + + + + + + + + + + + + +
      Table 11 Possible return codes of the acquisition_trigger service call.
      CodeDescription
      0Success
      -8Triggering is only possible in SingleFrame acquisition mode
      101Trigger is ignored, because there is a trigger call pending
      102Trigger is ignored, because there are no subscribers
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "acquisition_trigger",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      measure_depth

      +
      +

      Computes the average, minimum and maximum depth in a given region of interest, which can optionally be subdivided into cells.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/services/measure_depth
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_stereomatching/services/measure_depth
      +
      +
      +
      +
      +
      + +
      +

      Optional arguments:

      +
      +

      region_of_interest_2d_id is the ID of the 2D region of interest (see RoiDB) +that will be used for the depth measurements.

      +

      region_of_interest_2d is an alternative on-the-fly definition of the region of interest for the depth measurements. +This region of interest will be ignored if a region_of_interest_2d_id is given. The region of interest is always defined +on the camera image with full resolution, where offset_x and offset_y are the pixel coordinates of the upper left corner +of the rectangular region of interest, and width and height are the width and height of it in pixels. +Default is a region of interest covering the whole image.

      +

      cell_count is the number of cells in x and y direction into which the region of interest is divided. +If not given, a cell count of 0, 0 is assumed and only the overall values will be computed. The total cell count +computed as product of the x and y values must not exceed 100.

      +

      data_acquisition_mode: if set to CAPTURE_NEW (default), a new image dataset will be used for the measurement. +If set to USE_LAST, the previous dataset will be used for the measurement.

      +

      pose_frame controls whether the coordinates of the depth measurement are +returned in the camera or external frame, if a hand-eye calibration is available (see +Hand-eye calibration). +The default is camera.

      +
      +

      Potentially required arguments:

      +
      +
      robot_pose is the pose of the robot at the time of the depth measurement. It is required when the external +pose frame is used and the camera is robot mounted.
      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "cell_count": {
      +      "x": "uint32",
      +      "y": "uint32"
      +    },
      +    "data_acquisition_mode": "string",
      +    "pose_frame": "string",
      +    "region_of_interest_2d": {
      +      "height": "uint32",
      +      "offset_x": "uint32",
      +      "offset_y": "uint32",
      +      "width": "uint32"
      +    },
      +    "region_of_interest_2d_id": "string",
      +    "robot_pose": {
      +      "orientation": {
      +        "w": "float64",
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "position": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      }
      +    }
      +  }
      +}
      +
      +
      +
      +
      + + ++++ + + + + + + + + + + + + + +
      Table 12 return_code values of the measure_depth service call
      valueDescription
      0measurement successful
      -1an invalid argument was given
      +

      cells contains the depth measurements of all requested cells. The cells are always ordered from left to right and top +to bottom in image coordinates.

      +

      overall contains the depth measurements of the full region of interest.

      +

      coverage is a number between 0 and 1 which reflects the fraction of valid depth measurements inside the respective cell. +A coverage of 0 means that the cell is invalid.

      +

      min_z and max_z return the 3D coordinate of the point in the cell with the minimum and maximum depth value, respectively. +The depth value is the z coordinate in the camera coordinate system.

      +

      For mean_z, the x and y coordinates define the point in the middle of the cell and the z coordinate is determined by the +average of all depth value measurements in the cell.

      +

      region_of_interest_2d returns the definition of the requested region of interest for the depth measurement.

      +

      If pose_frame is external, then the x, y and z coordinates are returned in the robot coordinate system.

      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "measure_depth",
      +  "response": {
      +    "cell_count": {
      +      "x": "uint32",
      +      "y": "uint32"
      +    },
      +    "cells": [
      +      {
      +        "coverage": "float64",
      +        "max_z": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "mean_z": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        },
      +        "min_z": {
      +          "x": "float64",
      +          "y": "float64",
      +          "z": "float64"
      +        }
      +      }
      +    ],
      +    "overall": {
      +      "coverage": "float64",
      +      "max_z": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "mean_z": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "min_z": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      }
      +    },
      +    "pose_frame": "string",
      +    "region_of_interest_2d": {
      +      "height": "uint32",
      +      "offset_x": "uint32",
      +      "offset_y": "uint32",
      +      "width": "uint32"
      +    },
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    },
      +    "timestamp": {
      +      "nsec": "int32",
      +      "sec": "int32"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      reset_defaults

      +
      +

      Restores and applies the default values for this module’s parameters +(“factory reset”).

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/rc_stereomatching/services/reset_defaults
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/rc_stereomatching/services/reset_defaults
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "reset_defaults",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/tagdetect.html b/v24.04/en/tagdetect.html new file mode 100644 index 0000000..4a3c4c0 --- /dev/null +++ b/v24.04/en/tagdetect.html @@ -0,0 +1,1765 @@ + + + + + + + + + + + TagDetect — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      TagDetect

      +
      +

      Introduction

      +

      The TagDetect modules are optional on-board modules of the rc_visard NG and require +separate licenses + to be purchased. The licenses +are included in every rc_visard NG purchased after 01.07.2020.

      +

      The TagDetect modules run on board the rc_visard NG and allow the detection of 2D matrix codes and tags. +Currently, there are TagDetect modules for QR codes and AprilTags. +The modules, furthermore, compute the position and orientation of each tag +in the 3D camera coordinate system, making it simple to manipulate a tag +with a robot or to localize the camera with respect to a tag.

      +

      Tag detection is made up of three steps:

      +
        +
      1. Tag reading on the 2D image pair (see Tag reading).
      2. +
      3. Estimation of the pose of each tag (see Pose estimation).
      4. +
      5. Re-identification of previously seen tags (see Tag re-identification).
      6. +
      +

      In the following, the two supported tag types are described, followed +by a comparison.

      +
      +

      QR code

      +
      +_images/example_qr_code.png +

      Fig. 21 Sample QR code

      +
      +

      QR codes are two-dimensional matrix codes that contain arbitrary user-defined data. +There is wide support for decoding of QR codes on commodity hardware +such as smartphones. +Also, many online and offline tools are available for the generation of such codes.

      +

      The “pixels” of a QR code are called modules. +Appearance and resolution of QR codes change with the amount +of data they contain. +While the special patterns in the three corners are always 7 modules +wide, the number of modules between them increases the +more data is stored. +The lowest-resolution QR code is of size 21x21 modules and can contain +up to 152 bits.

      +

      Even though many QR code generation tools support generation of +specially designed QR codes (e.g., containing a logo, having round +corners, or having dots as modules), a reliable detection of these tags by +the rc_visard NG’s TagDetect module is not guaranteed. +The same holds for QR codes which contain characters that are not part +of regular ASCII.

      +
      +
      +

      AprilTag

      +
      +_images/apriltag_dim_vis.png +

      Fig. 22 A 16h5 tag (left), a 36h11 tag (center) and a 41h12 tag (right). +AprilTags consist of a mandatory white (a) and black (b) border and +a variable amount of data bits (c).

      +
      +

      AprilTags are similar to QR codes. +However, they are specifically designed for robust identification at +large distances. +As for QR codes, we will call the tag pixels modules. +Fig. 22 shows how AprilTags are structured. +They have a mandatory white and black border, each one module +wide. The tag families 16h5, 25h9, 36h10 and 36h11 are surrounded by +this border and carry a variable amount of data modules in the center. +For tag family 41h12, the black and white border is shifted towards +the inside and the data modules are in the center and also at the border of the tags. +Other than QR codes, AprilTags do not contain any user-defined information but +are identified by a predefined family and ID. +The tags in +Fig. 22 +for example are of family 16h5, 36h11 and 41h12 have id 0, 11 and 0, respectively. +All supported families are shown in +Table 16.

      + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table 16 AprilTag families
      FamilyNumber of tag IDsRecommended
      16h530-
      25h935o
      36h102320o
      36h11587+
      41h122115+
      +

      For each family, the number before the “h” states the number of data +modules contained in the tag: +While a 16h5 tag contains 16 (4x4) data modules +((c) in Fig. 22), +a 36h11 tag contains 36 (6x6) modules and a 41h12 tag contains 41 (3x3 inner + 4x8 outer) modules. +The number behind the “h” refers to the Hamming distance between two tags of +the same family. +The higher, the more robust is the detection, but the fewer individual tag +IDs are available for the same number of data modules (see +Table 16).

      +

      The advantage of fewer modules (as for 16h5 compared to 36h11) is +the lower resolution of the tag. +Hence, each tag module is larger and the tag therefore can be detected +from a larger distance. +This, however, comes at a price: +Firstly, fewer data modules lead to fewer individual tag IDs. +Secondly, and more importantly, detection robustness is significantly +reduced due to a higher false positive rate; i.e, tags are mixed up +or nonexistent tags are detected in random image texture or noise. +The 41h12 family has its border shifted towards the inside, which gives +it more data modules at a lower number of total modules compared to the +36h11 family.

      +

      For these reasons we recommend using the 41h12 and 36h11 families and highly +discourage the use of the 16h5 family. +The latter family should only be used if a large detection distance +really is necessary for an application. +However, the maximum detection distance increases only by approximately 25% +when using a 16h5 tag instead of a 36h11 tag.

      +

      Pre-generated AprilTags can be downloaded at the +AprilTag project website (https://april.eecs.umich.edu/software/apriltag.html). +There, each family consists of multiple PNGs containing single +tags. +Each pixel in the PNGs corresponds to one AprilTag module. +When printing the tags of the families 36h11, 36h10, 25h9 and 16h5 special care must be taken to also include the +white border around the tag that is contained in the PNG (see (a) in Fig. 22). +Moreover, all tags should be scaled to the desired printing size +without any interpolation, so that the sharp edges are preserved.

      +
      +
      +

      Comparison

      +

      Both QR codes and AprilTags have their up and down sides. +While QR codes allow arbitrary user-defined data to be stored, +AprilTags have a pre-defined and limited set of tags. +On the other hand, AprilTags have a lower resolution and can therefore +be detected at larger distances. +Moreover, the continuous white to black border in AprilTags allow for +more precise pose estimation.

      +
      +

      Note

      +

      If user-defined data is not required, AprilTags should be preferred over QR codes.

      +
      +
      +
      +
      +

      Tag reading

      +

      The first step in the tag detection pipeline is reading the tags on the +2D image pair. +This step takes most of the processing time and its precision is crucial +for the precision of the resulting tag pose. +To control the speed of this step, the quality parameter +can be set by the user. +It results in a downscaling of the image pair before reading the tags. +High yields the largest maximum detection distance and highest +precision, but also the highest processing time. +Low results in the smallest maximum detection distance and +lowest precision, but processing requires less than half of the time. +Medium lies in between. +Please note that this quality parameter has no relation to the quality +parameter of +Stereo matching.

      +
      +_images/tag_sizes_vis.png +

      Fig. 23 Visualization of module size \(s\), size of a tag in +modules \(r\), and size of a tag in meters \(t\) +for AprilTags (left and center) and QR codes (right)

      +
      +

      The maximum detection distance \(z\) at quality High can be +approximated by using the following formulae,

      +
      +\[z = \frac{f s}{p},\]
      +
      +\[s = \frac{t}{r},\]
      +

      where \(f\) is the +focal length +in pixels and \(s\) is the size +of a module in meters. +\(s\) can easily be calculated by the latter formula, where \(t\) +is the size of the tag in meters and \(r\) is the width of the +code in modules (for AprilTags without the white border). +Fig. 23 visualizes these variables. +\(p\) denotes the number of image pixels per module required +for detection. +It is different for QR codes and AprilTags. +Moreover, it varies with the tag’s angle to the camera and illumination. +Approximate values for robust detection are:

      +
        +
      • AprilTag: \(p=5\) pixels/module
      • +
      • QR code: \(p=6\) pixels/module
      • +
      +

      The following tables give sample maximum distances for +different situations, assuming a focal length of +1075 pixels and the parameter quality to be set to High.

      + + +++++ + + + + + + + + + + + + + + + + + + + + +
      Table 17 Maximum detection distance examples for AprilTags with a width + of \(t=4\) cm
      AprilTag familyTag widthMaximum distance
      36h11 (recommended)8 modules1.1 m
      16h56 modules1.4 m
      41h12 (recommended)5 modules1.7 m
      + + ++++ + + + + + + + + + + + + + +
      Table 18 Maximum detection distance examples for QR codes with a width + of \(t=8\) cm
      Tag widthMaximum distance
      29 modules0.49 m
      21 modules0.70 m
      +
      +
      +

      Pose estimation

      +

      For each detected tag, the pose of this tag in the camera coordinate +frame is estimated. +A requirement for pose estimation is that a tag is fully visible in +the left and right camera image. +The coordinate frame of the tag is aligned as shown below.

      +
      +_images/tag_coord_frames.png +

      Fig. 24 Coordinate frames of AprilTags (left and center) and QR codes (right)

      +
      +

      The z-axis is pointing “into” the tag. +Please note that for AprilTags, although having the white border included +in their definition, the coordinate system’s origin is placed exactly at the +transition from the white to the black border. +Since AprilTags do not have an obvious orientation, the origin is +defined as the upper left corner in the orientation they are pre-generated in.

      +

      During pose estimation, the tag’s size is also estimated, while +assuming the tag to be square. +For QR codes, the size covers the full tag. +For AprilTags, the size covers only the part inside the border defined by the +transition from the black to the white border modules, +hence ignoring the outermost white border for the tag families 16h5, 25h9, 36h10 and 36h11.

      +

      The user can also specify the approximate size (\(\pm 10\%\)) of tags. +All tags not matching this size constraint are automatically filtered out. +This information is further used to resolve ambiguities in pose estimation +that may arise if multiple tags with the same ID are visible in the left +and right image and these tags are aligned in parallel to the image rows.

      +
      +

      Note

      +

      For best pose estimation results one should make sure to accurately print +the tag and to attach it to a rigid and as planar as possible surface. +Any distortion of the tag or bump in the surface will degrade the +estimated pose.

      +
      +
      +

      Note

      +

      It is highly recommended to set the approximate size of a tag. +Otherwise, if multiple tags with the same ID are visible in the left or right +image, pose estimation may compute a wrong pose if these tags have the +same orientation and are approximately aligned in parallel to the image +rows. +However, even if the approximate size is not given, the TagDetect modules +try to detect such situations and filter out affected tags.

      +
      +

      Below tables give approximate precisions of the estimated poses of AprilTags. +We distinguish between lateral precision (i.e., in x and y direction) and +precision in z direction. +It is assumed that quality is set to High, that the camera’s +viewing direction is parallel to the tag’s normal and that the images are well exposed +and do not suffer from motion blur. +The size of a tag does not have a significant effect on the lateral or z +precision; however, in general, larger tags improve precision. +With respect to precision of the orientation especially around the x and y +axes, larger tags clearly outperform smaller ones.

      + + +++++ + + + + + + + + + + + + + + + + + + + + +
      Table 19 Approximate position precision for AprilTag detections with High quality in an ideal scenario
      Distancerc_visard NG 160 - lateralrc_visard NG 160 - z
      0.5 m0.05 mm0.3 mm
      1.0 m0.15 mm1.4 mm
      2.0 m0.5 mm3.7 mm
      + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + +
      Table 20 Approximate orientation precision for AprilTag detections with High quality in an ideal scenario for different tag sizes
      Distance60 x 60 mm120 x 120 mm
      0.5 m0.2°
      1.0 m0.8°0.3°
      2.0 m2.0°0.8°
      3.0 m1.8°
      +
      +
      +

      Tag re-identification

      +

      Each tag has an ID; for AprilTags it is the family plus tag ID, for +QR codes it is the contained data. +However, these IDs are not unique, since the same tag may appear multiple times +in a scene.

      +

      For distinction of these tags, the TagDetect modules also assign +each detected tag a unique identifier. +To help the user identifying an identical tag over multiple detections, +tag detection tries to re-identify tags; +if successful, a tag is assigned the same unique identifier again.

      +

      Tag re-identification compares the positions of the +corners of the tags in the camera coordinate frame to find identical tags. +Tags are assumed identical if they did not or only slightly move in +that frame.

      +

      By setting the max_corner_distance +threshold, the user can specify how much a tag is allowed move in the static +coordinate frame between two detections to be considered identical. +This parameter defines the maximum distance between the corners of +two tags, which is shown in +Fig. 25. +The Euclidean distances of all four corresponding tag corners are computed in 3D. +If none of these distances exceeds the threshold, the tags are +considered identical.

      +
      +_images/tag-re-identification.png +

      Fig. 25 Simplified visualization of tag re-identification. +Euclidean distances between associated tag corners in 3D are compared +(red arrows).

      +
      +

      After a number of tag detection runs, previously detected tag instances +will be discarded if they are not detected in the meantime. +This can be configured by the parameter forget_after_n_detections.

      +
      +
      +

      Hand-eye calibration

      +

      In case the camera has been calibrated to a robot, the TagDetect module +can automatically provide poses in the robot coordinate frame. +For the TagDetect node’s Services, the frame of the +output poses can be controlled with the pose_frame argument.

      +

      Two different pose_frame values can be chosen:

      +
        +
      1. Camera frame (camera). +All poses provided by the module are in the camera frame.
      2. +
      3. External frame (external). +All poses provided by the module are in the external frame, +configured by the user during the hand-eye calibration process. +The module relies on the on-board +Hand-eye calibration module +to retrieve the sensor mounting (static or robot mounted) and +the hand-eye transformation. +If the sensor mounting is static, no further information is needed. +If the sensor is robot-mounted, the robot_pose is required +to transform poses to and from the external frame.
      4. +
      +

      All pose_frame values that are not camera or external are rejected.

      +
      +
      +

      Parameters

      +

      There are two separate modules available for tag detection, +one for detecting AprilTags and one for QR codes, named +rc_april_tag_detect and rc_qr_code_detect, respectively. +Apart from the module names they share the same interface definition.

      +

      In addition to the REST-API interface, the TagDetect modules provide pages +on the Web GUI under +Modules ‣ AprilTag and Modules ‣ QR Code, +on which they can be tried out and configured manually.

      +

      In the following, the parameters are listed based on the +example of rc_qr_code_detect. They are the same for +rc_april_tag_detect.

      +

      This module offers the following run-time parameters:

      + + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table 21 The rc_qr_code_detect module’s run-time parameters
      NameTypeMinMaxDefaultDescription
      detect_inverted_tagsboolfalsetruefalseDetect tags with black and white exchanged
      forget_after_n_detectionsint321100030Number of detection runs after which to forget about a previous tag during tag re-identification
      max_corner_distancefloat640.0010.010.005Maximum distance of corresponding tag corners in meters during tag re-identification
      qualitystring--HighQuality of tag detection: [Low, Medium, High]
      use_cached_imagesboolfalsetruefalseUse most recently received image pair instead of waiting for a new pair
      +

      Via the REST-API, these parameters can be set as follows.

      +
      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/<rc_qr_code_detect|rc_april_tag_detect>/parameters/parameters?<parameter-name>=<value>
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/<rc_qr_code_detect|rc_april_tag_detect>/parameters?<parameter-name>=<value>
      +
      +
      +
      +
      +
      +
      +
      +

      Status values

      +

      The TagDetect modules reports the following status values:

      + + ++++ + + + + + + + + + + + + + + + + + + + +
      Table 22 The rc_qr_code_detect and rc_april_tag_detect module’s status values
      NameDescription
      data_acquisition_timeTime in seconds required to acquire image pair
      last_timestamp_processedThe timestamp of the last processed image pair
      processing_timeProcessing time of the last detection in seconds
      stateThe current state of the node
      +

      The reported state can take one of the following values.

      + + ++++ + + + + + + + + + + + + + + + + +
      Table 23 Possible states of the TagDetect modules
      State nameDescription
      IDLEThe module is idle.
      RUNNINGThe module is running and ready for tag detection.
      FATALA fatal error has occurred.
      +
      +
      +

      Services

      +

      The TagDetect modules implement a state machine for starting and stopping. +The actual tag detection can be triggered via detect.

      +

      The user can explore and call the rc_qr_code_detect and rc_april_tag_detect modules’ services, +e.g. for development and testing, using the +REST-API interface or +the rc_visard NG +Web GUI.

      +
      +

      detect

      +
      +

      Triggers a tag detection.

      +
      +

      Details

      +
      +

      Depending on the use_cached_images parameter, the module will use +the latest received image pair (if set to true) or wait for a new pair +that is captured after the service call was triggered (if set to false, +this is the default). +Even if set to true, tag detection will never use one image pair twice.

      +

      It is recommended to call detect in state RUNNING only. +It is also possible to be called in state IDLE, resulting in an +auto-start and stop of the module. +This, however, has some drawbacks: +First, the call will take considerably longer; +second, tag re-identification will not work. +It is therefore highly recommended to manually start the module +before calling detect.

      +

      Tags might be omitted from the detect response due to several +reasons, e.g., if a tag is visible in only one of the cameras or if +pose estimation did not succeed. +These filtered-out tags are noted in the log, which can be accessed as +described in +Downloading log files.

      +

      A visualization of the latest detection is shown on the Web GUI tabs +of the TagDetect modules. Please note that this visualization +will only be shown after calling the detection service at least once. +On the Web GUI, one can also manually try the detection by clicking the +Detect button.

      +

      Due to changes in system time on the rc_visard NG there might occur jumps +of timestamps, forward as well as backward (see Time synchronization). +Forward jumps do not have an effect on the TagDetect module. +Backward jumps, however, invalidate already received images. +Therefore, in case a backwards time jump is detected, an error of +value -102 will be issued on the next detect call, also to inform +the user that the timestamps included in the response will jump back. +This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/<rc_qr_code_detect|rc_april_tag_detect>/services/detect
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/<rc_qr_code_detect|rc_april_tag_detect>/services/detect
      +
      +
      +
      +
      +
      + +
      +

      Optional arguments:

      +
      +

      tags is the list of tag IDs that the TagDetect module should detect. +For QR codes, the ID is the contained data. +For AprilTags, it is “<family>_<id>”, so, e.g., for a tag of +family 36h11 and ID 5, it is “36h11_5”. +Naturally, the AprilTag module can only be triggered for AprilTags, and +the QR code module only for QR codes.

      +

      The tags list can also be left empty. +In that case, all detected tags will be returned. +This feature should be used only during development and debugging +of an application. +Whenever possible, the concrete tag IDs should be listed, on the one +hand avoiding some false positives, on the other hand speeding up tag +detection by filtering tags not of interest.

      +

      For AprilTags, the user can not only specify concrete tags but also +a complete family by setting the ID to “<family>”, so, e.g., “36h11”. +All tags of this family will then be detected. It is further possible +to specify multiple complete tag families or a combination of +concrete tags and complete tag families; for instance, triggering for +“36h11”, “25h9_3”, and “36h10” at the same time.

      +

      In addition to the ID, the approximate size (\(\pm 10\%\)) of a tag +can be set with the size parameter. +As described in +Pose estimation, +this information helps to resolve ambiguities in pose estimation that may +arise in certain situations and can be used to filter out tags not fulfilling +the given size constraint.

      +

      The tags list is OR-connected. All tags will be returned that +match any of id-size pair elements in the tags list.

      +

      pose_frame controls whether the poses of the detected tags are +returned in the camera or external frame, +as detailed in +Hand-eye calibration. +The default is camera.

      +

      The definition for the request arguments with corresponding datatypes is:

      +
      {
      +  "args": {
      +    "pose_frame": "string",
      +    "robot_pose": {
      +      "orientation": {
      +        "w": "float64",
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      },
      +      "position": {
      +        "x": "float64",
      +        "y": "float64",
      +        "z": "float64"
      +      }
      +    },
      +    "tags": [
      +      {
      +        "id": "string",
      +        "size": "float64"
      +      }
      +    ]
      +  }
      +}
      +
      +
      +
      +
      +
      +

      timestamp is set to the timestamp of the image pair the tag +detection ran on.

      +

      tags contains all detected tags.

      +

      id is the ID of the tag, similar to id in the request.

      +

      instance_id is the random unique identifier of the tag +assigned by tag re-identification.

      +

      pose contains position and orientation. +The orientation is in quaternion format.

      +

      pose_frame is set to the coordinate frame above pose refers to. +It will either be “camera” or “external”.

      +

      size will be set to the estimated tag size in meters.

      +

      return_code holds possible warnings or error codes.

      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "detect",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    },
      +    "tags": [
      +      {
      +        "id": "string",
      +        "instance_id": "string",
      +        "pose": {
      +          "orientation": {
      +            "w": "float64",
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          },
      +          "position": {
      +            "x": "float64",
      +            "y": "float64",
      +            "z": "float64"
      +          }
      +        },
      +        "pose_frame": "string",
      +        "size": "float64",
      +        "timestamp": {
      +          "nsec": "int32",
      +          "sec": "int32"
      +        }
      +      }
      +    ],
      +    "timestamp": {
      +      "nsec": "int32",
      +      "sec": "int32"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +

      start

      +
      +

      Starts the module by transitioning from IDLE to RUNNING.

      +

      Details

      +
      +

      When running, the module receives images from the stereo camera and is +ready to perform tag detections. +To save computing resources, the +module should only be running when necessary.

      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/<rc_qr_code_detect|rc_april_tag_detect>/services/start
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/<rc_qr_code_detect|rc_april_tag_detect>/services/start
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "start",
      +  "response": {
      +    "accepted": "bool",
      +    "current_state": "string"
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +

      stop

      +
      +

      Stops the module by transitioning to IDLE.

      +
      +

      Details

      +
      +

      This transition can be performed from state RUNNING and FATAL. +All tag re-identification information is cleared during stopping.

      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/<rc_qr_code_detect|rc_april_tag_detect>/services/stop
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/<rc_qr_code_detect|rc_april_tag_detect>/services/stop
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "stop",
      +  "response": {
      +    "accepted": "bool",
      +    "current_state": "string"
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +

      restart

      +
      +

      Restarts the module.

      +
      +

      Details

      +
      +

      If in RUNNING or FATAL, the module will be stopped and then started. +If in IDLE, the module will be started.

      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/<rc_qr_code_detect|rc_april_tag_detect>/services/restart
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/<rc_qr_code_detect|rc_april_tag_detect>/services/restart
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "restart",
      +  "response": {
      +    "accepted": "bool",
      +    "current_state": "string"
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +

      reset_defaults

      +
      +

      Resets all parameters of the module to its default values, +as listed in above table.

      +

      Details

      +
      +

      This service can be called as follows.

      +
      + +
      +
      PUT http://<host>/api/v2/pipelines/0/nodes/<rc_qr_code_detect|rc_april_tag_detect>/services/reset_defaults
      +
      +
      +
      +
      +
      PUT http://<host>/api/v1/nodes/<rc_qr_code_detect|rc_april_tag_detect>/services/reset_defaults
      +
      +
      +
      +
      +
      + +
      +This service has no arguments.
      +
      +

      The definition for the response with corresponding datatypes is:

      +
      {
      +  "name": "reset_defaults",
      +  "response": {
      +    "return_code": {
      +      "message": "string",
      +      "value": "int16"
      +    }
      +  }
      +}
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +

      Return codes

      +

      Each service response contains a return_code, +which consists of a value plus an optional message. +A successful service returns with a return_code value of 0. +Negative return_code values indicate that the service failed. +Positive return_code values indicate that the service succeeded with additional information. +The smaller value is selected in case a service has multiple return_code values, +but all messages are appended in the return_code message.

      +

      The following table contains a list of common return codes:

      +
      +
      ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      CodeDescription
      0Success
      -1An invalid argument was provided
      -4A timeout occurred while waiting for the image pair
      -9The license is not valid
      -11Sensor not connected, not supported or not ready
      -101Internal error during tag detection
      -102There was a backwards jump of system time
      -103Internal error during tag pose estimation
      -200A fatal internal error occurred
      200Multiple warnings occurred; see list in message
      201The module was not in state RUNNING
      +
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/time_sync.html b/v24.04/en/time_sync.html new file mode 100644 index 0000000..a6e08b2 --- /dev/null +++ b/v24.04/en/time_sync.html @@ -0,0 +1,695 @@ + + + + + + + + + + + Time synchronization — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Time synchronization

      +

      The rc_visard NG provides timestamps with all images and messages. +To compare these with the time on the application host, the time needs to be properly synchronized.

      +
      +
      This can be done either via the Network Time Protocol (NTP), which is the default, or the Precision Time +Protocol (PTP).
      +

      The current system time as well as time synchronization status can be queried via +REST-API and seen on the +Web GUI’s System page.

      +
      +

      Note

      +

      Depending on the reachability of NTP servers or PTP masters it might take up to several minutes until the time is synchronized.

      +
      +
      +

      NTP

      +

      The Network Time Protocol (NTP) is a TCP/IP protocol for synchronizing time over a network. +A client periodically requests the current time from a server, and uses it to set and correct +its own clock.

      +

      By default the rc_visard NG tries to reach NTP servers from the NTP Pool Project, +which will work if the rc_visard NG has access to the internet.

      +

      If the rc_visard NG is configured for DHCP +(which is the default setting), it will also request NTP servers from the DHCP server and try to +use those.

      +
      +
      +

      PTP

      +

      The Precision Time Protocol (PTP, also known as IEEE1588) is a protocol which offers more precise and robust clock synchronization than with NTP.

      +

      The rc_visard can be configured to act as a PTP slave via the standard GigE Vision 2.0/GenICam interface using the GevIEEE1588 parameter.

      +

      At least one PTP master providing time has to be running in the network. +On Linux the respective command for starting a PTP master on ethernet port eth0 is, e.g., sudo ptpd --masteronly --foreground -i eth0.

      +

      While the rc_visard is synchronized with a PTP master (rc_visard in PTP status SLAVE), the NTP synchronization is paused.

      +
      +
      +

      Setting time manually

      +

      The rc_visard NG allows to set the current date and time manually using the REST-API’s /system/time endpoint, +if no time synchronization is active (see System and logs). +A more convenient way is setting the system time on the Web GUI’s System page.

      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/troubleshooting.html b/v24.04/en/troubleshooting.html new file mode 100644 index 0000000..c6851da --- /dev/null +++ b/v24.04/en/troubleshooting.html @@ -0,0 +1,885 @@ + + + + + + + + + + + Troubleshooting — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Troubleshooting

      +
      +

      LED colors

      +

      During the boot process, the LED will change color several times to indicate stages in the boot process:

      + + ++++ + + + + + + + + + + + + + + + + +
      Table 55 LED color codes
      LED colorBoot stage
      whitepower supply OK
      bluenormal boot process in progress
      greenboot complete, rc_visard NG ready
      +

      The LED will signal some warning or error states to support the user during troubleshooting.

      + + ++++ + + + + + + + + + + + + + + + + + + + +
      Table 56 LED color trouble codes
      LED colorWarning or error state
      offno power to the sensor
      brief red flash every 5 secondsno network connectivity
      redSome process has terminated and failed to restart.
      yellowhigh-temperature warning (case has exceeded 60 °C)
      +
      +
      +

      Hardware issues

      +

      LED does not illuminate

      +

      The rc_visard NG does not start up.

      +
        +
      • Ensure that cables are connected and secured properly.
      • +
      • Ensure that adequate DC voltage (18 V to 30 V) with correct polarity is applied to the +power connector at the pins labeled as Power and Ground as described in +the device’s pin assignment specification. +Connecting the sensor to voltage outside of the specified range, to alternating current, +with reversed polarity, or to a supply with voltage spikes will lead to permanent hardware damage.
      • +
      +

      LED turns yellow while the sensor appears to function normally

      +

      This may indicate a high housing temperature. The sensor might be mounted in a position that +obstructs free airflow around the cooling fins.

      +
        +
      • Clean cooling fins and housing.
      • +
      • Ensure a minimum of 10 cm free space in all directions around cooling fins to provide adequate convective cooling.
      • +
      • Ensure that ambient temperature is within specified range.
      • +
      +

      The sensor may slow down processing when cooling is insufficient or the ambient temperature exceeds the specified range.

      +

      Reliability issues and/or mechanical damage

      +

      This may be an indication of ambient conditions (vibration, shock, resonance, and temperature) being outside +of specified range. Please refer to the specification of environmental conditions.

      +
        +
      • Operating the rc_visard NG outside of specified ambient conditions might lead to damage and will void the warranty.
      • +
      +

      Electrical shock when touching the sensor

      +

      This indicates an electrical fault in sensor, cabling, or power supply or adjacent system.

      +
        +
      • Immediately turn off power to the system, disconnect cables, and have a qualified electrician check the setup.
      • +
      • Ensure that the sensor housing is properly grounded; check for large ground loops.
      • +
      +
      +
      +

      Connectivity issues

      +

      LED briefly flashes red every 5 seconds

      +

      If the LED briefly flashes red every 5 seconds, then the rc_visard NG is not able to detect a network +link.

      +
        +
      • Check that the network cable is properly connected to the rc_visard NG and the network.
      • +
      • If no problem is visible, then replace the Ethernet cable.
      • +
      +

      A GigE Vision client or rcdiscover-gui cannot detect the camera

      +
        +
      • Check whether the rc_visard NG’s LED flashes briefly every 5 seconds (check the cable if it does).
      • +
      • Ensure that the rc_visard NG is connected to the same subnet (the discovery mechanism uses broadcasts that +will not work across different subnets).
      • +
      +

      The Web GUI is inaccessible

      +
        +
      • Ensure that the rc_visard NG is turned on and connected to the same subnet as the host computer.
      • +
      • Check whether the rc_visard NG’s LED flashes briefly every 5 seconds (check the cable if it does).
      • +
      • Check whether rcdiscover-gui detects the sensor. If it reports the rc_visard NG as unreachable, +then the rc_visard NG’s +network configuration is wrong.
      • +
      • If the rc_visard NG is reported as reachable, try double clicking the entry to open the Web GUI in a browser.
      • +
      • If this does not work, try entering the rc_visard NG’s reported IP address directly in the browser +as target address.
      • +
      +

      Too many Web GUIs are open at the same time

      +

      The Web GUI consumes the rc_visard NG’s processing resources to compress images to be transmitted +and for statistical output that is regularly polled by the browser. Leaving several instances of +the Web GUI open on the same or different computers can significantly diminish the rc_visard NG’s +performance. The Web GUI is meant for configuration and validation, not to permanently monitor +the rc_visard NG.

      +
      +
      +

      Camera-image issues

      +

      The camera image is too bright

      +
        +
      • If the camera is in manual exposure mode, decrease the exposure time (see Parameters), or
      • +
      • switch to auto-exposure mode (see Parameters).
      • +
      +

      The camera image is too dark

      +
        +
      • If the camera is in manual exposure mode, increase the exposure time (see Parameters), or
      • +
      • switch to auto-exposure mode (see Parameters).
      • +
      +

      The camera image is too noisy

      +

      Large gain factors cause high-amplitude image noise. To decrease the image noise,

      +
        +
      • use an additional light source to increase the scene’s light intensity, or
      • +
      • choose a greater maximal auto-exposure time (see Parameters).
      • +
      +

      The camera image is out of focus

      +
        +
      • Check whether the object is too close to the lens and increase the distance between the object and the lens if it is.
      • +
      • Check whether the camera lenses are dirty and clean them if they are.
      • +
      • If none of the above applies, a severe hardware problem might exist. +Please contact support.
      • +
      +

      The camera image is blurred

      +

      Fast motions in combination with long exposure times can cause blur. To reduce motion blur,

      +
        +
      • decrease the motion speed of the camera,
      • +
      • decrease the motion speed of objects in the field of view of the camera, or
      • +
      • decrease the exposure time of the camera (see Parameters).
      • +
      +

      The camera image is fuzzy

      +
        +
      • Check whether the lenses are dirty and clean them if so (see Lens cleaning).
      • +
      • If none of the above applies, a severe hardware problem might exist. +Please contact support.
      • +
      +

      The camera image frame rate is too low

      +
        +
      • Increase the image frame rate as described in Parameters.
      • +
      • The maximal frame rate of the cameras is 25 Hz.
      • +
      +
      +
      +

      Depth/Disparity, error, and confidence image issues

      +

      All these guidelines also apply to error and confidence images, because they correspond directly to the disparity image.

      +

      The disparity image is too sparse or empty

      + +
        +
      • Check the cameras’ calibration and recalibrate if required (see Camera calibration).
      • +
      +

      The disparity images’ frame rate is too low

      +
        +
      • Check and increase the frame rate of the camera images (see Parameters). +The frame rate of the disparity image cannot be greater than the frame rate of the camera images.
      • +
      • Choose a lesser Disparity Image Quality.
      • +
      • Increase the Minimum Distance +as much as possible for the application.
      • +
      +

      The disparity image does not show close objects

      +
        +
      • Check whether the object is too close to the cameras. Consider the depth ranges of the camera variants.
      • +
      • Decrease the Minimum Distance.
      • +
      +

      The disparity image does not show distant objects

      + +

      The disparity image is too noisy

      + +

      The disparity values or the resulting depth values are too inaccurate

      +
        +
      • Decrease the distance between the camera and the scene. Depth-measurement error grows quadratically with the distance from the cameras.
      • +
      • Check whether the scene contains repetitive patterns and remove them if it does. They could cause wrong disparity measurements.
      • +
      +

      The disparity image is too smooth

      + +

      The disparity image does not show small structures

      + +
      +
      +

      GigE Vision/GenICam issues

      +

      No images

      + +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/userspace.html b/v24.04/en/userspace.html new file mode 100644 index 0000000..a5c1e8e --- /dev/null +++ b/v24.04/en/userspace.html @@ -0,0 +1,714 @@ + + + + + + + + + + + UserSpace — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      UserSpace

      +

      The UserSpace enables users to deploy and manage containers running on the +rc_visard NG. Standalone containers and docker-compose stacks are supported.

      +
      +

      Note

      +

      Familiarity with Docker containers is required.

      +
      +

      If available and enabled, the UserSpace can be accessed in the +Web GUI +in the menu under UserSpace. This page shows the running apps and containers +with their current state and health, in case a health-check is available. Each +container lists the published ports. If their protocol is http or https, these +containers can be accessed directly in the Web GUI.

      +
      +

      Configuration

      +

      If the UserSpace is enabled for the first time, a user for the portainer UI +needs to be created: In the Web GUI +navigate to UserSpace and click on Manage UserSpace Apps. +Then, register a user account for the administrator. +It is required to complete this step within +five minutes after booting the rc_visard NG.

      +
      +
      +

      Network access to UserSpace applications

      +

      To access containers via network, the container ports need to be published to host ports.

      +

      UserSpace information including running apps and their published ports can be queried via +REST-API userspace endpoint +or viewed in the Web GUI +in the menu under UserSpace.

      +

      All ports that are published to the host are listed with their protocol (UDP or TCP). +To explicitly specify a protocol (e.g. http or https) for app ports use container labels:

      +
        +
      • com.roboception.app.http: all exposed TCP ports use http
      • +
      • com.roboception.app.https.port=1234,5678: comma separated list with https ports
      • +
      +
      +
      +

      Interfaces

      +

      Docker containers managed in the UserSpace can use the public interfaces of +the rc_visard NG. In particular, Docker containers can access synchronized image +sets via gRPC and can +call the REST-API interface. The +rc_visard NG (the host) can be accessed under the Docker bridge IP (in default +Docker bridge network 172.17.0.1).

      +
      +
      +

      Restrictions

      +

      Some restrictions for containers apply:

      +
        +
      • Containers cannot be privileged.
      • +
      • No access to the host network (a Docker bridge network is used instead).
      • +
      • Only paths inside cloned git repositories with a docker-compose stack can be mounted, all other host paths cannot be mounted.
      • +
      • Host devices cannot be accessed. This includes e.g. USB and GPU devices.
      • +
      • Well known and internally used ports on the host cannot be bound. +This includes ports below 1024, ports from 4200 to 4299 and the ports +2342, 2343, 2344, 2345, 3956, 4840, 5353, 6379, +7000, 7001, 7002, 7003, 9100, 9118, 9256, 9445, 9446, 11311, 22350, 22352, +50010, 50051, 50052, 50053 and 50054.
      • +
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/warranty.html b/v24.04/en/warranty.html new file mode 100644 index 0000000..ae8f084 --- /dev/null +++ b/v24.04/en/warranty.html @@ -0,0 +1,675 @@ + + + + + + + + + + + Warranty — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Warranty

      +

      Any changes or modifications to the hard- and software not expressly approved by Roboception could void the user’s warranty and guarantee rights.

      +
      +

      Warning

      +

      The rc_visard NG utilizes complex hardware and software technology that may behave in a way not intended by the user. The purchaser must design its application to ensure that any failure or the rc_visard NG does not cause personal injury, property damage, or other losses.

      +
      +
      +

      Warning

      +

      Do not attempt to take apart, open, service, or modify the rc_visard NG. Doing so could present the risk of electric shock or other hazard. Any evidence of any attempt to open and/or modify the device, including any peeling, puncturing, or removal of any of the labels, will void the Limited Warranty.

      +
      +
      +

      Warning

      +

      CAUTION: to comply with the European CE requirement, all cables used to connect this device must be shielded and grounded. Operation with incorrect cables may result in interference with other devices or undesired effects of the product.

      +
      +
      +

      Note

      +

      This product may not be treated as household waste. By ensuring this product is disposed of correctly, you will help to protect the environment. For more detailed information about the recycling of this product, please contact your local authority, your household waste disposal service provider, or the product’s supplier.

      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/en/webgui.html b/v24.04/en/webgui.html new file mode 100644 index 0000000..1a9c8c0 --- /dev/null +++ b/v24.04/en/webgui.html @@ -0,0 +1,777 @@ + + + + + + + + + + + Web GUI — rc_visard NG 24.04.1 + documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + +
      + + + + + + +
      +
      + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Web GUI

      +

      The rc_visard NG’s Web GUI can be used to test, calibrate, and configure the device.

      +
      +

      Accessing the Web GUI

      +

      The Web GUI can be accessed from any web browser, such as Firefox, Google Chrome, or Microsoft Edge, via +the rc_visard NG’s IP address. The easiest way to access the Web GUI is to simply double click on the +desired device using the rcdiscover-gui tool as explained in Discovery of rc_visard NG devices.

      +

      Alternatively, some network environments automatically configure the unique host name of +the rc_visard NG in their Domain Name Server (DNS). In this case, the Web GUI can also be +accessed directly using the URL http://<host-name> by +replacing <host-name> with the device’s host name.

      +

      For Linux and Mac operating systems, this even works without DNS via the multicast +Domain Name System (mDNS), which is automatically used if .local is appended to the +host name. Thus, the URL simply becomes http://<host-name>.local.

      +
      +
      +

      Exploring the Web GUI

      +

      The Web GUI’s dashboard page gives the most important information about the device +and the software modules.

      +
      +_images/webgui_dashboard_ng_en.png +

      Fig. 57 Dashboard page of the rc_visard NG’s Web GUI

      +
      +

      The page’s side menu permits access to the individual pages of the rc_visard NG’s Web GUI:

      +
      +
      Camera
      +
      shows a live stream of the rectified camera images. +The frame rate can be reduced to save bandwidth when streaming to a +GigE Vision® client. Furthermore, exposure can be set manually or automatically. +See Parameters for more information.
      +
      Depth Image
      +
      shows a live stream of the left rectified, disparity, and +confidence images. The page contains various settings for depth-image +computation and filtering. See Parameters for more information.
      +
      +
      +
      Modules
      +
      gives access to the detection modules of the rc_visard NG +(see Detection modules).
      +
      Configuration
      +
      gives access to the configuration modules of the rc_visard NG +(see Configuration modules).
      +
      +
      +
      Database
      +
      gives access to the database modules of the rc_visard NG +(see Database modules).
      +
      System
      +
      gives access to general settings, device information and to the log files, +and permits the firmware or the license file to be updated.
      +
      +
      +

      Note

      +

      Further information on all parameters in the Web GUI can be obtained by pressing the Info +button next to each parameter.

      +
      +
      +
      +

      Web GUI access control

      +

      The Web GUI has a simple mechanism to lock the UI against casual and accidental changes.

      +

      When enabling Web GUI access control via the System page, you will be asked to set a password. +Now the Web GUI is in a locked mode indicated by the lock symbol in the top bar. +All pages, camera streams, parameters and detections can be inspected as usual, but changes are not possible.

      +

      To temporarily unlock the Web GUI and make changes, click the lock symbol and enter the password. +While enabling or disabling Web GUI access control affects anyone accessing this rc_visard NG, +the unlocked state is only valid for the browser where it was unlocked and indicated by the open lock symbol. +It is automatically locked again after 10 minutes of inactivity.

      +

      Web GUI access control can also be disabled again on the System page after providing the current password.

      +
      +

      Warning

      +

      This is not a security feature! It only locks the Web GUI and not the REST-API. +It is meant to prevent accidental and casual changes e.g. via a connected screen.

      +
      +
      +

      Note

      +

      In case the password is lost, this can be disabled via the REST-API +delete ui_lock.

      +
      +
      +
      +

      Downloading camera images

      +

      The Web GUI +provides an easy way to download a snapshot of the current scene as a .tar.gz file +by clicking on the camera icon below the image live streams on the Camera page. This snapshot contains:

      +
        +
      • the rectified camera images in full resolution as .png files,
      • +
      • a camera parameter file containing the camera matrix, image dimensions, exposure time, +gain value and the stereo baseline,
      • +
      • the current IMU readings as imu.csv file,
      • +
      • a pipeline_status.json file containing information about all 3D-camera, detection and configuration nodes running on the rc_visard NG,
      • +
      • a backup.json file containing the settings of the rc_visard NG including grippers, load carriers and regions of interest,
      • +
      • a system_info.json file containing system information about the rc_visard NG.
      • +
      +

      The filenames contain the timestamps.

      +
      +
      +

      Downloading depth images and point clouds

      +

      The Web GUI provides an easy way to download the depth data of the current scene as a .tar.gz file +by clicking on the camera icon below the image live streams on the Depth Image page. This snapshot contains:

      +
        +
      • the rectified left and right camera images in full resolution as .png files,
      • +
      • an image parameter file corresponding to the left image containing the camera matrix, image dimensions, exposure time, +gain value and the stereo baseline,
      • +
      • the disparity, error and confidence images in the resolution corresponding to the currently chosen quality as .png files,
      • +
      • a disparity parameter file corresponding to the disparity image containing the camera matrix, image dimensions, exposure time, +gain value and the stereo baseline, and information about the disparity values (i.e. invalid values, scale, offset),
      • +
      • the current IMU readings as imu.csv file,
      • +
      • a pipeline_status.json file containing information about all 3D-camera, detection and configuration nodes running on the rc_visard NG,
      • +
      • a backup.json file containing the settings of the rc_visard NG including grippers, load carriers and regions of interest,
      • +
      • a system_info.json file containing system information about the rc_visard NG.
      • +
      +

      The filenames contain the timestamps.

      +

      When clicking on the mesh icon below the image live streams on the Depth Image page, a snapshot is downloaded +which additionally includes a mesh of the point cloud in the current depth quality (resolution) as .ply file.

      +
      +

      Note

      +

      Downloading a depth snapshot will trigger an acquisition in the same way as clicking on the “Acquire” button on the +Depth Image page of the Web GUI, and, thus, might affect running applications.

      +
      +
      +
      + + +
      +
      + +
      +
      +
      + + + + +
      + +
      +

      + © Copyright 2023, Roboception GmbH. + +

      +
      + +
      + +
      +
      + +
      + +
      + +
      + + Options + en + + +
      +
      +
      Languages
      + + +
      en
      + + + +
      de
      + + +
      + +
      +
      Versions
      + +
      v23.10
      + +
      v24.01
      + +
      v24.04
      + +
      + + +
      +
      Downloads
      + +
      PDF (en)
      + +
      PDF (de)
      + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v24.04/index.html b/v24.04/index.html new file mode 100644 index 0000000..4f2192e --- /dev/null +++ b/v24.04/index.html @@ -0,0 +1,19 @@ + + + + + + Roboception rc_visard User Manual + + + + +

      English

      +

      Deutsch

      + +

      PDFs

      + +

      pdf (English)

      +

      pdf (Deutsch)

      + + diff --git a/v24.04/pdf/rc_visard_ng_manual_de.pdf b/v24.04/pdf/rc_visard_ng_manual_de.pdf new file mode 100644 index 0000000..02943df Binary files /dev/null and b/v24.04/pdf/rc_visard_ng_manual_de.pdf differ diff --git a/v24.04/pdf/rc_visard_ng_manual_en.pdf b/v24.04/pdf/rc_visard_ng_manual_en.pdf new file mode 100644 index 0000000..60a0889 Binary files /dev/null and b/v24.04/pdf/rc_visard_ng_manual_en.pdf differ