chore(camera): 添加front相机

This commit is contained in:
gouhanke
2026-02-06 11:53:01 +08:00
parent 66009473ad
commit 31419a6fc1
12 changed files with 23 additions and 12 deletions

View File

@@ -8,5 +8,6 @@
</body> </body>
<camera name="top" pos="0.0 1.0 2.0" fovy="44" mode="targetbody" target="table"/> <camera name="top" pos="0.0 1.0 2.0" fovy="44" mode="targetbody" target="table"/>
<camera name="angle" pos="0.0 0.0 2.0" fovy="37" mode="targetbody" target="table"/> <camera name="angle" pos="0.0 0.0 2.0" fovy="37" mode="targetbody" target="table"/>
<camera name="front" pos="0 0 0.9" fovy="55" mode="fixed" quat="0.7071 0.7071 0 0"/>
</worldbody> </worldbody>
</mujoco> </mujoco>

View File

@@ -58,8 +58,8 @@ class BiDianaMed(ArmBase):
def __init__(self): def __init__(self):
super().__init__( super().__init__(
name="Bidiana", name="Bidiana",
urdf_path="./assets/models/manipulators/DianaMed/DualDianaMed.urdf", urdf_path="roboimi/assets/models/manipulators/DianaMed/DualDianaMed.urdf",
xml_path="./assets/models/manipulators/DianaMed/bi_diana_transfer_ee.xml", xml_path="roboimi/assets/models/manipulators/DianaMed/bi_diana_transfer_ee.xml",
gripper=None gripper=None
) )
self.left_arm = self.Arm(self, 'single', self.urdf_path) self.left_arm = self.Arm(self, 'single', self.urdf_path)

View File

@@ -21,7 +21,7 @@ def main():
render_cam_name = 'angle' render_cam_name = 'angle'
episode_len = 700 #SIM_TASK_CONFIGS[task_name]['episode_len'] episode_len = 700 #SIM_TASK_CONFIGS[task_name]['episode_len']
camera_names = ['angle','r_vis', 'top'] #SIM_TASK_CONFIGS[task_name]['camera_names'] camera_names = ['angle','r_vis', 'top', 'front'] #SIM_TASK_CONFIGS[task_name]['camera_names']
if task_name == 'sim_transfer': if task_name == 'sim_transfer':
policy = TestPickAndTransferPolicy(inject_noise) policy = TestPickAndTransferPolicy(inject_noise)
print(task_name) print(task_name)

View File

@@ -29,7 +29,7 @@ class VLAEvaluator:
self, self,
agent: torch.nn.Module, agent: torch.nn.Module,
device: str = 'cuda', device: str = 'cuda',
camera_names: List[str] = ['r_vis', 'top'], camera_names: List[str] = ['r_vis', 'top', 'front'],
num_queries: int = 1, num_queries: int = 1,
obs_horizon: int = 2, obs_horizon: int = 2,
pred_horizon: int = 16, pred_horizon: int = 16,
@@ -351,7 +351,7 @@ def evaluate_policy(
max_timesteps: int = 700, max_timesteps: int = 700,
task_name: str = 'sim_transfer', task_name: str = 'sim_transfer',
device: str = 'cuda', device: str = 'cuda',
camera_names: List[str] = ['r_vis', 'top'], camera_names: List[str] = ['r_vis', 'top', 'front'],
num_queries: int = 1, num_queries: int = 1,
obs_horizon: int = 2, obs_horizon: int = 2,
save_video: bool = True save_video: bool = True
@@ -500,7 +500,7 @@ def main():
help='Maximum timesteps per episode') help='Maximum timesteps per episode')
parser.add_argument('--device', type=str, default='cuda', parser.add_argument('--device', type=str, default='cuda',
help='Device for inference') help='Device for inference')
parser.add_argument('--camera_names', nargs='+', default=['r_vis', 'top'], parser.add_argument('--camera_names', nargs='+', default=['r_vis', 'top', 'front'],
help='Camera names to use') help='Camera names to use')
parser.add_argument('--num_queries', type=int, default=16, parser.add_argument('--num_queries', type=int, default=16,
help='Policy query frequency (timesteps)') help='Policy query frequency (timesteps)')

View File

@@ -53,6 +53,7 @@ class DualDianaMed(MujocoEnv):
self.l_vis = None self.l_vis = None
self.top = None self.top = None
self.angle = None self.angle = None
self.front = None
self.obs = None self.obs = None
self.rew = None self.rew = None
@@ -168,6 +169,7 @@ class DualDianaMed(MujocoEnv):
obs['images']['angle'] = self.angle obs['images']['angle'] = self.angle
obs['images']['r_vis'] = self.r_vis obs['images']['r_vis'] = self.r_vis
obs['images']['l_vis'] = self.l_vis obs['images']['l_vis'] = self.l_vis
obs['images']['front'] = self.front
return obs return obs
def _get_image_obs(self): def _get_image_obs(self):
@@ -177,6 +179,7 @@ class DualDianaMed(MujocoEnv):
obs['images']['angle'] = self.angle obs['images']['angle'] = self.angle
obs['images']['r_vis'] = self.r_vis obs['images']['r_vis'] = self.r_vis
obs['images']['l_vis'] = self.l_vis obs['images']['l_vis'] = self.l_vis
obs['images']['front'] = self.front
return obs return obs
def _get_qpos_obs(self): def _get_qpos_obs(self):
@@ -202,6 +205,8 @@ class DualDianaMed(MujocoEnv):
return self.r_vis return self.r_vis
elif self.cam == 'l_vis': elif self.cam == 'l_vis':
return self.l_vis return self.l_vis
elif self.cam == 'front':
return self.front
else: else:
raise AttributeError("please input right name") raise AttributeError("please input right name")
@@ -222,6 +227,9 @@ class DualDianaMed(MujocoEnv):
img_renderer.update_scene(self.mj_data,camera="angle") img_renderer.update_scene(self.mj_data,camera="angle")
self.angle = img_renderer.render() self.angle = img_renderer.render()
self.angle = self.angle[:, :, ::-1] self.angle = self.angle[:, :, ::-1]
img_renderer.update_scene(self.mj_data,camera="front")
self.front = img_renderer.render()
self.front = self.front[:, :, ::-1]
cv2.imshow('Cam view', self.cam_view) cv2.imshow('Cam view', self.cam_view)
cv2.waitKey(1) cv2.waitKey(1)

View File

@@ -77,7 +77,8 @@ class DualDianaMed_Pos_Ctrl(DualDianaMed):
while self.cam_flage: while self.cam_flage:
if(type(self.top)==type(None) if(type(self.top)==type(None)
or type(self.angle)==type(None) or type(self.angle)==type(None)
or type(self.r_vis)==type(None)): or type(self.r_vis)==type(None)
or type(self.front)==type(None)):
time.sleep(0.001) time.sleep(0.001)
t+=1 t+=1
else: else:

View File

@@ -20,7 +20,7 @@ SIM_TASK_CONFIGS = {
'dataset_dir': DATASET_DIR + '/sim_transfer', 'dataset_dir': DATASET_DIR + '/sim_transfer',
'num_episodes': 20, 'num_episodes': 20,
'episode_len': 700, 'episode_len': 700,
'camera_names': ['top','r_vis'], 'camera_names': ['top','r_vis','front'],
'xml_dir': HOME_PATH + '/assets' 'xml_dir': HOME_PATH + '/assets'
}, },

View File

@@ -19,4 +19,4 @@ obs_horizon: 2 # How many historical observations to use
diffusion_steps: 100 # Number of diffusion timesteps for training diffusion_steps: 100 # Number of diffusion timesteps for training
# Camera Configuration # Camera Configuration
num_cams: 2 # Number of cameras (e.g., r_vis, top) num_cams: 3 # Number of cameras (e.g., r_vis, top)

View File

@@ -4,7 +4,7 @@ defaults:
- data: resnet_dataset - data: resnet_dataset
train: train:
batch_size: 32 # Batch size for training batch_size: 16 # Batch size for training
lr: 1e-4 # Learning rate lr: 1e-4 # Learning rate
max_steps: 20000 # Maximum training steps max_steps: 20000 # Maximum training steps
log_freq: 100 # Log frequency (steps) log_freq: 100 # Log frequency (steps)

View File

@@ -13,6 +13,7 @@ action_horizon: 8 # Action execution horizon (used during evaluation)
camera_names: camera_names:
- r_vis - r_vis
- top - top
- front
# Normalization Type: 'gaussian' (mean/std) or 'min_max' ([-1, 1]) # Normalization Type: 'gaussian' (mean/std) or 'min_max' ([-1, 1])
normalization_type: gaussian normalization_type: gaussian

View File

@@ -4,5 +4,5 @@ dataset_dir: "/home/d51/workspace/work/robo-imi-act/roboimi/demos/dataset/sim_tr
pred_horizon: 16 pred_horizon: 16
obs_horizon: 1 obs_horizon: 1
action_horizon: 8 action_horizon: 8
camera_names: ['r_vis', 'top'] # ['angle', 'r_vis', 'top'] camera_names: ['r_vis', 'top', 'front'] # ['angle', 'r_vis', 'top']
normalization_type: 'gaussian' # 'min_max' or 'gaussian' normalization_type: 'gaussian' # 'min_max' or 'gaussian'

View File

@@ -13,7 +13,7 @@ class RobotDiffusionDataset(Dataset):
pred_horizon=16, pred_horizon=16,
obs_horizon=2, obs_horizon=2,
action_horizon=8, action_horizon=8,
camera_names=['r_vis', 'top'], camera_names=['r_vis', 'top', 'front'],
normalization_type='gaussian'): normalization_type='gaussian'):
""" """
Args: Args: