|
18 | 18 | from av2.datasets.sensor.av2_sensor_dataloader import convert_pose_dataframe_to_SE3 |
19 | 19 | from av2.structures.sweep import Sweep |
20 | 20 | from av2.structures.cuboid import CuboidList, Cuboid |
21 | | -from av2.utils.io import read_feather |
| 21 | +from av2.utils.io import read_feather, io_utils |
22 | 22 | from av2.map.map_api import ArgoverseStaticMap |
23 | 23 | from av2.geometry.se3 import SE3 |
24 | 24 | from av2.datasets.sensor.constants import AnnotationCategories |
@@ -83,11 +83,16 @@ def create_eval_mask(data_mode: str, output_dir_: Path, mask_dir: str): |
83 | 83 |
|
84 | 84 | def read_pose_pc_ground(data_dir: Path, log_id: str, timestamp: int, avm: ArgoverseStaticMap): |
85 | 85 | log_poses_df = read_feather(data_dir / log_id / "city_SE3_egovehicle.feather") |
| 86 | + # more detail: https://argoverse.github.io/user-guide/datasets/lidar.html#sensor-suite |
| 87 | + ego2sensor_pose = io_utils.read_ego_SE3_sensor((data_dir / log_id))['up_lidar'] |
86 | 88 | filtered_log_poses_df = log_poses_df[log_poses_df["timestamp_ns"].isin([timestamp])] |
87 | 89 | pose = convert_pose_dataframe_to_SE3(filtered_log_poses_df.loc[filtered_log_poses_df["timestamp_ns"] == timestamp]) |
88 | 90 | pc = Sweep.from_feather(data_dir / log_id / "sensors" / "lidar" / f"{timestamp}.feather").xyz |
89 | 91 | # transform to city coordinate since sweeps[0].xyz is in ego coordinate to get ground mask |
90 | 92 | is_ground = avm.get_ground_points_boolean(pose.transform_point_cloud(pc)) |
| 93 | + |
| 94 | + # NOTE(SeFlow): transform to sensor coordinate, since some ray-casting based methods need sensor coordinate |
| 95 | + pc = ego2sensor_pose.inverse().transform_point_cloud(pc) |
91 | 96 | return pc, pose, is_ground |
92 | 97 |
|
93 | 98 | def compute_sceneflow(data_dir: Path, log_id: str, timestamps: Tuple[int, int]) -> Dict[str, Union[np.ndarray, SE3]]: |
|
0 commit comments