feat(layout): Expose limit_reach_range and max_orient_diff in bfs_placement.
This commit is contained in:
parent
a34b1dacea
commit
137855bdc6
@ -128,7 +128,6 @@ def entrypoint() -> None:
|
|||||||
|
|
||||||
layout_info = bfs_placement(
|
layout_info = bfs_placement(
|
||||||
layout_path,
|
layout_path,
|
||||||
limit_reach_range=True if args.insert_robot else False,
|
|
||||||
seed=args.seed_layout,
|
seed=args.seed_layout,
|
||||||
)
|
)
|
||||||
layout_path = f"{output_root}/layout.json"
|
layout_path = f"{output_root}/layout.json"
|
||||||
|
|||||||
@ -233,7 +233,8 @@ def bfs_placement(
|
|||||||
rotate_objs: bool = True,
|
rotate_objs: bool = True,
|
||||||
rotate_bg: bool = True,
|
rotate_bg: bool = True,
|
||||||
rotate_context: bool = True,
|
rotate_context: bool = True,
|
||||||
limit_reach_range: bool = True,
|
limit_reach_range: tuple[float, float] | None = (0.20, 0.85),
|
||||||
|
max_orient_diff: float | None = 60,
|
||||||
robot_dim: float = 0.12,
|
robot_dim: float = 0.12,
|
||||||
seed: int = None,
|
seed: int = None,
|
||||||
) -> LayoutInfo:
|
) -> LayoutInfo:
|
||||||
@ -249,7 +250,8 @@ def bfs_placement(
|
|||||||
rotate_objs: If True, apply a random rotation around the Z-axis for manipulated and distractor objects.
|
rotate_objs: If True, apply a random rotation around the Z-axis for manipulated and distractor objects.
|
||||||
rotate_bg: If True, apply a random rotation around the Y-axis for the background object.
|
rotate_bg: If True, apply a random rotation around the Y-axis for the background object.
|
||||||
rotate_context: If True, apply a random rotation around the Z-axis for the context object.
|
rotate_context: If True, apply a random rotation around the Z-axis for the context object.
|
||||||
limit_reach_range: If True, enforce a check that manipulated objects are within the robot's reach.
|
limit_reach_range: If set, enforce a check that manipulated objects are within the robot's reach range, in meter.
|
||||||
|
max_orient_diff: If set, enforce a check that manipulated objects are within the robot's orientation range, in degree.
|
||||||
robot_dim: The approximate dimension (e.g., diameter) of the robot for box representation.
|
robot_dim: The approximate dimension (e.g., diameter) of the robot for box representation.
|
||||||
seed: Random seed for reproducible placement.
|
seed: Random seed for reproducible placement.
|
||||||
|
|
||||||
@ -376,20 +378,40 @@ def bfs_placement(
|
|||||||
continue
|
continue
|
||||||
# Make sure the manipulated object is reachable by robot.
|
# Make sure the manipulated object is reachable by robot.
|
||||||
if (
|
if (
|
||||||
limit_reach_range
|
limit_reach_range is not None
|
||||||
and object_mapping[node]
|
and object_mapping[node]
|
||||||
== Scene3DItemEnum.MANIPULATED_OBJS.value
|
== Scene3DItemEnum.MANIPULATED_OBJS.value
|
||||||
):
|
):
|
||||||
cx = parent_pos[0] + node_box[0] + obj_dx / 2
|
cx = parent_pos[0] + node_box[0] + obj_dx / 2
|
||||||
cy = parent_pos[1] + node_box[2] + obj_dy / 2
|
cy = parent_pos[1] + node_box[2] + obj_dy / 2
|
||||||
cz = parent_pos[2] + p_z2 - z1
|
cz = parent_pos[2] + p_z2 - z1
|
||||||
robot_pose = position[robot_node][:3]
|
robot_pos = position[robot_node][:3]
|
||||||
if not check_reachable(
|
if not check_reachable(
|
||||||
base_xyz=np.array(robot_pose),
|
base_xyz=np.array(robot_pos),
|
||||||
reach_xyz=np.array([cx, cy, cz]),
|
reach_xyz=np.array([cx, cy, cz]),
|
||||||
|
min_reach=limit_reach_range[0],
|
||||||
|
max_reach=limit_reach_range[1],
|
||||||
):
|
):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
# Make sure the manipulated object is inside the robot's orientation.
|
||||||
|
if (
|
||||||
|
max_orient_diff is not None
|
||||||
|
and object_mapping[node]
|
||||||
|
== Scene3DItemEnum.MANIPULATED_OBJS.value
|
||||||
|
):
|
||||||
|
cx = parent_pos[0] + node_box[0] + obj_dx / 2
|
||||||
|
cy = parent_pos[1] + node_box[2] + obj_dy / 2
|
||||||
|
cx2, cy2 = position[robot_node][:2]
|
||||||
|
v1 = np.array([-cx2, -cy2])
|
||||||
|
v2 = np.array([cx - cx2, cy - cy2])
|
||||||
|
dot = np.dot(v1, v2)
|
||||||
|
norms = np.linalg.norm(v1) * np.linalg.norm(v2)
|
||||||
|
theta = np.arccos(np.clip(dot / norms, -1.0, 1.0))
|
||||||
|
theta = np.rad2deg(theta)
|
||||||
|
if theta > max_orient_diff:
|
||||||
|
continue
|
||||||
|
|
||||||
if not has_iou_conflict(
|
if not has_iou_conflict(
|
||||||
node_box, placed_boxes_map[parent_node]
|
node_box, placed_boxes_map[parent_node]
|
||||||
):
|
):
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user