安装 AnyGrasp
你可以参考这篇 博客 来安装 AnyGrasp。
下面的示例程序展示了如何将 AnyGrasp 部署为服务器:
import argparseimport os
parser = argparse.ArgumentParser()parser.add_argument("-p", "--port", type=str)parser.add_argument("-d", "--device", type=str)args = parser.parse_args()
os.environ["CUDA_VISIBLE_DEVICES"] = args.device
import numpy as npimport open3d as o3dfrom flask import Flask, request, jsonifyimport torchimport gc
from gsnet import AnyGraspfrom graspnetAPI import GraspGroup
VISUALIZED = Falseapp = Flask(__name__)
class Configs: checkpoint_path = "log/checkpoint_detection.tar" max_gripper_width = 0.1 gripper_height = 0.03 top_down_grasp = True debug = True
cfgs = Configs()
print("Loading AnyGrasp model into memory...")anygrasp = AnyGrasp(cfgs)anygrasp.load_net()print("Model loaded successfully.")
def handle_grasp(data): try: dense_mode = data.get("dense_mode", False) print(dense_mode) colors = np.array(data["colors"]) depths = np.array(data["depths"]) fx, fy = float(data["fx"]), float(data["fy"]) cx, cy = float(data["cx"]), float(data["cy"]) scale = float(data["scale"])
intrinsic = o3d.camera.PinholeCameraIntrinsic() intrinsic.set_intrinsics( width=colors.shape[1], height=colors.shape[0], fx=fx, fy=fy, cx=cx, cy=cy ) colors = colors.astype(np.float32) / 255.0 xmap, ymap = np.arange(depths.shape[1]), np.arange(depths.shape[0]) xmap, ymap = np.meshgrid(xmap, ymap) points_z = depths / scale points_x = (xmap - cx) / fx * points_z points_y = (ymap - cy) / fy * points_z
mask = (points_z > -2.0) & (points_z <= 2.0) points = np.stack([points_x, points_y, points_z], axis=-1) points = points[mask].astype(np.float32) colors = colors[mask].astype(np.float32)
lims = [-20.0, 20.0, -20.0, 20.0, -2.0, 2.0]
with torch.no_grad(): gg, cloud = anygrasp.get_grasp( points, colors, lims=lims, apply_object_mask=True, dense_grasp=dense_mode, collision_detection=True, )
if gg is None or len(gg) == 0: return None
gg = gg.nms().sort_by_score() gg_pick = gg[:] # top-K or all
if VISUALIZED: trans_mat = np.array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]]) cloud.transform(trans_mat) grippers = gg_pick.to_open3d_geometry_list() for gripper in grippers: gripper.transform(trans_mat) o3d.visualization.draw_geometries([*grippers, cloud])
return gg_pick finally: gc.collect() torch.cuda.empty_cache()
@app.route("/process", methods=["POST"])def process_data(): try: data = request.get_json() data["colors"] = np.array(data["colors"], dtype=np.uint8) data["depths"] = np.array(data["depths"], dtype=np.uint16) result = handle_grasp(data)
if result is None: return jsonify({"message": "No Grasp detected!"}), 400
grasp_list = [] for grasp in result: grasp_list.append({ "translation": grasp.translation.tolist(), "rotation_matrix": grasp.rotation_matrix.tolist(), "depth": grasp.depth, "score": grasp.score, })
return jsonify({"grasp_groups": grasp_list}), 200
except Exception as e: print("Error:", e) return jsonify({"error": str(e)}), 500
if __name__ == "__main__": app.run(host="0.0.0.0", port=int(args.port), threaded=False)你可以使用以下命令来启动 AnyGrasp 服务器:
python anygrasp_sdk/grasp_detection/server.py -p 5000 -d 0-p:指定服务器监听的端口。-d:指定使用的 GPU 编号。
你还可以将该端口暴露在 内网中,这样可以让 多台服务器同时访问同一个 AnyGrasp 服务器实例。
你可以修改 configs/miscs/anygrasp.yml 中 default 段落来修改服务器的地址与端口为你自己的部署。