This document provides a brief intro of the usage of builtin functions and detectors designed for each App.
Robotplus
1. Copper Detection
Create and Load Detector
Using the default Kpick’s detector
from kpick.apps.robotplus.copper_detector import create_and_load_copper_detector detector = create_and_load_copper_detector(cfg_path=cfg_path)
Note
cfg_path is default kpick/apps/robotplus/configs/copper_grip.cfg when cfg_path is None or not given
Modify and Load Detector
Extending the default Kpick’s detector
from kpick.apps.robotplus.copper_detector import CopperDetector, create_and_load_copper_detector class AppDector(CopperDetector): def new_function(self): print('new function') detector = create_and_load_copper_detector(Detector=AppDector,cfg_path=cfg_path)
Demo on single RGB-D image
def demo_detect_copper_single():
import cv2
import kpick
import os
from ketisdk.vision.utils.rgbd_utils_v2 import RGBD
KPICK_DIR = os.path.split(kpick.__file__)[0]
# configs
depth_min = 900
depth_max = 1000
workspace = [(530, 278), (1252, 286), (1248, 714), (536, 704)]
# load image
rgb = cv2.imread(os.path.join(KPICK_DIR, 'apps/robotplus/test_images/copper01_rgb.png'))[:, :, ::-1]
depth = cv2.imread(os.path.join(KPICK_DIR, 'apps/robotplus/test_images/copper01_depth.png'), cv2.IMREAD_UNCHANGED)
rgbd = RGBD(rgb=rgb, depth=depth, depth_min=depth_min, depth_max=depth_max)
rgbd.set_workspace(pts=workspace)
# load model
detector = create_and_load_copper_detector()
# predict
detector.args.flag.show_steps = True
ret = detector.detect_and_show_grips(rgbd=rgbd, net_args=detector.args.grip_net, args=detector.args)
# show
cv2.imshow('reviewer', ret['im'][:, :, ::-1])
cv2.waitKey()
2. Cylind Detection
3. OI Detection
FPCB
Mujin
Order Picking
1. Output format
Field |
Description |
suction |
all suction candidates. Num_suction x 4, where each row presents a suction with format is [x,y,z,score] |
best_n_inds |
top n best suction grasp indexes |
bes_ind |
best suction grasp index |
best |
target suction grasp |
im |
display suctions on the input image |
2. Create and Load Detector on Custom Project
Extending the default Kpick’s detector
from kpick.apps.orderpicking.detector import create_and_load_order_detector, OrderDetector class AppDetector(OrderDetector): def new_function(self): print('new function') detector = create_and_load_order_detector(Detector=AppDetector, cfg_path=cfg_path)
3. Demo on single RGB-D image
import cv2
import kpick
import os
from ketisdk.vision.utils.rgbd_utils_v2 import RGBD
KPICK_DIR = os.path.split(kpick.__file__)[0]
# configs
depth_min = 700
depth_max = 900
workspace = [(398, 172), (949, 174), (949, 580), (398, 572)]
# load image
rgb = cv2.imread(os.path.join(KPICK_DIR, 'apps/orderpicking/test_images/1_rgb.png'))[:, :, ::-1]
depth = cv2.imread(os.path.join(KPICK_DIR, 'apps/orderpicking/test_images/1_depth.png'), cv2.IMREAD_UNCHANGED)
rgbd = RGBD(rgb=rgb, depth=depth, depth_min=depth_min, depth_max=depth_max)
rgbd.set_workspace(pts=workspace)
# load model
detector = create_and_load_order_detector()
# predict
detector.args.flag.show_steps = False
ret = detector.detect_and_show_suctions(rgbd=rgbd, net_args=detector.args.suction_net, rpn_args=detector.args.rpn,
args=detector.args, remove_bg=False)
# show
cv2.imshow('reviewer', ret['im'][:, :, ::-1])
cv2.waitKey()
4. Parameters tuning
Parameter |
Description |
suction_net.pad_sizes |
Patch sizes of suction pose scanning process. Larger value should be set for larger object |
suction_net.stride |
Stride of suction scanning process. Smaller value makes more suction candidates, but computational heavier. |
rpn.enable |
Enable RPN for suction detector or not |
rpn.score_thresh |
Score threshold of RPN |
rpn.min_size |
Minimum size of larger size of a detected object |
Kimchi
Smart Gripper
Random Piece Picking
1. Output format
Field |
Description |
target_grasp |
target grasp selected among all detectors’ results |
target_grasp_name |
name of target grasp, can be: grip, suction, inner_grip, suction_2pts |
im |
display grip on the input image |
2. Create and Load Detector
Using the default Kpick’s detector
from kpick.apps.randompicking.detector import create_and_load_random_picking_detector detector = create_and_load_random_picking_detector(detector_type='suction', cfg_path=cfg_path)
Note
Please refer kpick/apps/randompicking/configs/*.cfg
3. Modify and Load Detector
Extending the default Kpick’s detector
from kpick.apps.randompicking.detector import create_and_load_random_picking_detector, OnePointDualGraspDetector, OnePointDualGraspDetector, RandomGripDetector, RandomSuctionDetector class AppDetector(RandomSuctionDetector): def new_function(self): print('new function') detector = RandomGripDetector(Detector=AppDetector, cfg_path=cfg_path, detector_type='suction')
4. Demo on single RGB-D image
import cv2
from ketisdk.vision.utils.rgbd_utils_v2 import RGBD
import os
from ketisdk.vision.utils.rgbd_utils_v2 import RGBD
import kpick
KPICK_DIR = os.path.split(kpick.__file__)[0]
# load image
rgb = cv2.imread(os.path.join(KPICK_DIR, 'apps/randompicking/test_images/01_rgb.png'))[:, :, ::-1]
depth = cv2.imread(os.path.join(KPICK_DIR, 'apps/randompicking/test_images/01_depth.png'), cv2.IMREAD_UNCHANGED)
rgbd = RGBD(rgb=rgb, depth=depth, depth_min=600, depth_max=800)
# set crop roi
rgbd.set_workspace(pts=[(348, 193), (894, 194), (894, 594), (345, 590)])
# predict
detector = create_and_load_random_picking_detector(detector_type='grip')
detector.args.flag.show_steps = True
ret = detector.detect_and_show_grips(rgbd=rgbd, net_args=detector.args.grip_net,
args=detector.args, remove_bg=detector.args.grip_net.remove_bg)
# show
cv2.imshow('grip', ret['im'][:, :, ::-1])
# predict
detector = create_and_load_random_picking_detector(detector_type='suction')
detector.args.flag.show_steps = True
ret = detector.detect_and_show_suctions(rgbd=rgbd, net_args=detector.args.suction_net, args=detector.args,
remove_bg=detector.args.suction_net.remove_bg, rpn_args=detector.args.rpn)
# show
cv2.imshow('suction', ret['im'][:, :, ::-1])
# predict
detector = create_and_load_random_picking_detector(detector_type='one_point_dual')
detector.args.flag.show_steps = True
ret = detector.detect_and_show_multimode_grasp(rgbd=rgbd, grip_args=detector.args.grip_net,
suction_args=detector.args.suction_net,
inner_grip_args=detector.args.inner_grip_net,
args=detector.args)
# show
cv2.imshow('one_point_dual', ret['im'][:, :, ::-1])
# predict
detector = create_and_load_random_picking_detector(detector_type='two_points_dual')
detector.args.flag.show_steps = True
ret = detector.detect_and_show_multimode_grasp(rgbd=rgbd, grip_args=detector.args.grip_net,
suction_args=detector.args.suction_net,
inner_grip_args=detector.args.inner_grip_net,
args=detector.args)
# show
cv2.imshow('two_points_dual', ret['im'][:, :, ::-1])
cv2.waitKey()
5. Parameters tuning
Parameter |
Description |
grip_net.erode_h |
gripper plate’s width |
grip_net.grip_w_ranges |
ranges of gripper’s width, which are tuned for each target object |
grip_net.grad_thresh |
gradient threshold. Smaller value makes more grip candidates but noisy, and vice versa |
grip_net.remove_bg |
remove detected grips on the background or not |
grip_net.top_n |
top n target grips |
grip_net.dy |
Smaller value makes more dense grip candidates. |
grip_net.ellipse_axes |
Dimensions of ellipse that examines neighbor grips. For bigger object, dimension should be larger |
suction_net.pad_sizes |
Patch sizes of suction pose scanning process. Larger value should be set for larger object |
suction_net.stride |
Stride of suction scanning process. Smaller value makes more suction candidates, but computational heavier. |
rpn.enable |
Enable RPN for suction detector or not |