-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathphysics_warpper.py
109 lines (82 loc) · 3.13 KB
/
physics_warpper.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import numpy as np
class TorqueFunc():
def __init__(self, torque_func, viewer) -> None:
self.torque_func = torque_func
self.viewer = viewer
def pre_func(self):
torque = self.torque_func()
# torque = np.zeros((len(self.viewer.joint_name), 3))
torque[0] = np.zeros_like(torque[0])
self.viewer.set_torque(torque)
class PhysicsInfo():
'''
用于获取viewer当前的物理信息
'''
def __init__(self, viewer) -> None:
self.__viewer = viewer
@property
def joint_name(self):
return self.__viewer.joint_name
@property
def parent_index(self):
return self.__viewer.parent_index
@property
def root_idx(self):
return 0
@property
def substep(self):
return self.__viewer.substep
@property
def root_pos(self):
return self.__viewer.root_pos
@property
def root_quat(self):
return self.__viewer.root_quat
def get_root_pos_and_vel(self):
return self.__viewer.get_root_pos_vel()
def get_joint_translation(self):
return self.__viewer.get_physics_joint_positions()
def get_joint_orientation(self):
return self.__viewer.get_physics_joint_orientations()
def get_body_position(self):
return self.__viewer.get_physics_body_positions()
def get_body_velocity(self):
return self.__viewer.get_body_velocities()
def get_body_angular_velocity(self):
return self.__viewer.get_body_angular_velocities()
def get_body_mass(self):
'''
为了让仿真稳定一些,mass的值要比实际方块的大...
'''
return self.__viewer.get_body_mass()
class PhysicsHandler():
'''
主要用于set pose
'''
def __init__(self, viewer) -> None:
self.viewer = viewer
def get_state(self):
'''
获取当前的状态,用于保存
'''
viewer = self.viewer
return {
'velocity': viewer.get_body_velocities(),
'angular_velocity': viewer.get_body_angular_velocities(),
'joint_position': viewer.get_physics_joint_positions(),
'joint_orientation': viewer.get_physics_joint_orientations(),
'body_position': viewer.get_physics_body_positions(),
}
def set_state(self, state_dict):
self.set_physics_joints(state_dict['joint_position'], state_dict['joint_orientation'])
self.viewer.set_body_velocities(state_dict['velocity'])
self.viewer.set_body_angular_velocities(state_dict['angular_velocity'])
def get_pose(self):
return self.viewer.get_pose()
def set_pose(self, joint_translation, joint_orientation):
self.viewer.set_physics_joints(joint_translation, joint_orientation)
def sync_to_kinematics(self):
self.viewer.sync_physics_to_kinematics()
def simulate(self, torque_func, **kargs):
torque_func = TorqueFunc(torque_func, self.viewer)
self.viewer.simulationTask(torque_func.pre_func, **kargs)