Vive Tracker без HMD Axis кажется перевернутым - PullRequest
0 голосов
/ 10 октября 2018

Я хотел бы получить информацию о позе моего датчика Vive Tracker.

Я нашел этот урок , который довольно точный и работает, но ...

Когда я, например, кладу трекер Vive на стол и поворачиваю его руками, вместо смены YAW, он меняет PITCH моего трекера.

Как читать матрицу поз, чтобы иметь правильную ось?

1 Ответ

0 голосов
/ 15 ноября 2018

У меня была такая же проблема, потому что матрица вращения читается с теми же функциями HMD и контроллеров.

В случае Vive Tracker, вместо этого, вы должны использовать другие функции OpenVR, чтобыправильно прочитайте позу.

так же:

#get the pose with orientation in radians
    def get_pose_radians(self):
        pose = self.vr.getControllerStateWithPose(openvr.TrackingUniverseStanding, self.index,openvr.k_unMaxTrackedDeviceCount)
        return convert_to_radians(pose[2].mDeviceToAbsoluteTracking)

и функция, которая дает вашу позу в радианах, может быть:

#Convert the 3x4 position/rotation matrix to a x,y,z location and the appropriate Euler angles (in radians)
def convert_to_radians(pose_mat):

roundfact = 16

x = pose_mat[0][3]
y = pose_mat[1][3]
z = pose_mat[2][3]

# Algorhitm 1

#read here: https://steamcommunity.com/app/358720/discussions/0/343787920117426152/
pitch = math.atan2(pose_mat[2][1], pose_mat[2][2])
yaw = math.asin(pose_mat[2][0])
roll = math.atan2(-pose_mat[1][0], pose_mat[0][0])
return [x,y,z,yaw, pitch, roll]

Во избежание блокировки карданного подвесаи т. д., я предлагаю вам использовать кватернионы с этой функцией:

def convert_to_quaternion(pose_mat):
    r_w = math.sqrt( max( 0, 1 + pose_mat[0][0] + pose_mat[1][1]+ pose_mat[2][2] ) ) / 2
    r_x = math.sqrt( max( 0, 1 + pose_mat[0][0] - pose_mat[1][1] - pose_mat[2][2] ) ) / 2
    r_y = math.sqrt( max( 0, 1 - pose_mat[0][0] + pose_mat[1][1] - pose_mat[2][2] ) ) / 2
    r_z = math.sqrt( max( 0, 1 - pose_mat[0][0] - pose_mat[1][1] + pose_mat[2][2] ) ) / 2
    r_x *= math.copysign(1, r_x * ( -pose_mat[2][1] + pose_mat[1][2] ) )
    r_y *= math.copysign(1,r_y * ( -pose_mat[0][2] + pose_mat[2][0] ) )
    r_z *= math.copysign(1,r_z * ( pose_mat[1][0] - pose_mat[0][1] ) )

    x = pose_mat[0][3]
    y = pose_mat[1][3]
    z = pose_mat[2][3]
    return [x,y,z,r_w,r_x,r_y,r_z]
...