q3dviewer 1.0.8__py3-none-any.whl → 1.0.9__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- q3dviewer/base_glwidget.py +53 -8
- q3dviewer/base_item.py +15 -0
- q3dviewer/custom_items/axis_item.py +31 -94
- q3dviewer/custom_items/cloud_item.py +36 -30
- q3dviewer/custom_items/frame_item.py +56 -36
- q3dviewer/custom_items/gaussian_item.py +3 -3
- q3dviewer/custom_items/grid_item.py +88 -37
- q3dviewer/custom_items/image_item.py +1 -2
- q3dviewer/custom_items/line_item.py +4 -5
- q3dviewer/gau_io.py +0 -168
- q3dviewer/glwidget.py +22 -16
- q3dviewer/test/test_interpolation.py +58 -0
- q3dviewer/test/test_rendering.py +72 -0
- q3dviewer/tools/cinematographer.py +367 -0
- q3dviewer/tools/film_maker.py +395 -0
- q3dviewer/tools/lidar_calib.py +11 -22
- q3dviewer/tools/lidar_cam_calib.py +9 -20
- q3dviewer/utils/maths.py +155 -5
- q3dviewer/viewer.py +30 -7
- {q3dviewer-1.0.8.dist-info → q3dviewer-1.0.9.dist-info}/METADATA +8 -15
- q3dviewer-1.0.9.dist-info/RECORD +45 -0
- {q3dviewer-1.0.8.dist-info → q3dviewer-1.0.9.dist-info}/entry_points.txt +1 -1
- q3dviewer/basic_window.py +0 -228
- q3dviewer/cloud_viewer.py +0 -74
- q3dviewer/custom_items/camera_frame_item.py +0 -173
- q3dviewer/custom_items/trajectory_item.py +0 -79
- q3dviewer/utils.py +0 -71
- q3dviewer-1.0.8.dist-info/RECORD +0 -46
- {q3dviewer-1.0.8.dist-info → q3dviewer-1.0.9.dist-info}/LICENSE +0 -0
- {q3dviewer-1.0.8.dist-info → q3dviewer-1.0.9.dist-info}/WHEEL +0 -0
- {q3dviewer-1.0.8.dist-info → q3dviewer-1.0.9.dist-info}/top_level.txt +0 -0
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import pyqtgraph.opengl as gl
|
|
2
|
-
from OpenGL.GL import *
|
|
3
|
-
import numpy as np
|
|
4
|
-
import threading
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class TrajectoryItem(gl.GLGridItem):
|
|
8
|
-
def __init__(self, width=1, color=(0, 1, 0, 1)):
|
|
9
|
-
super(TrajectoryItem, self).__init__()
|
|
10
|
-
self.width = width
|
|
11
|
-
self.buff = np.empty((0, 3), np.float32)
|
|
12
|
-
self.wait_add_data = None
|
|
13
|
-
self.mutex = threading.Lock()
|
|
14
|
-
self.CAPACITY = 100000
|
|
15
|
-
self.valid_buff_top = 0
|
|
16
|
-
self.color = color
|
|
17
|
-
|
|
18
|
-
def addSetting(self, layout):
|
|
19
|
-
pass
|
|
20
|
-
|
|
21
|
-
def setData(self, data, append=True):
|
|
22
|
-
self.mutex.acquire()
|
|
23
|
-
data = data.astype(np.float32).reshape(-1, 3)
|
|
24
|
-
if (append is False):
|
|
25
|
-
self.wait_add_data = data
|
|
26
|
-
self.add_buff_loc = 0
|
|
27
|
-
else:
|
|
28
|
-
if (self.wait_add_data is None):
|
|
29
|
-
self.wait_add_data = data
|
|
30
|
-
else:
|
|
31
|
-
self.wait_add_data = np.concatenate([self.wait_add_data, data])
|
|
32
|
-
self.add_buff_loc = self.valid_buff_top
|
|
33
|
-
self.mutex.release()
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
def updateRenderBuffer(self):
|
|
37
|
-
if(self.wait_add_data is None):
|
|
38
|
-
return
|
|
39
|
-
self.mutex.acquire()
|
|
40
|
-
|
|
41
|
-
new_buff_top = self.add_buff_loc + self.wait_add_data.shape[0]
|
|
42
|
-
if new_buff_top > self.buff.shape[0]:
|
|
43
|
-
buff_capacity = self.buff.shape[0]
|
|
44
|
-
while (new_buff_top > buff_capacity):
|
|
45
|
-
buff_capacity += self.CAPACITY
|
|
46
|
-
self.buff = np.empty((buff_capacity, 3), np.float32)
|
|
47
|
-
self.buff[self.add_buff_loc:new_buff_top] = self.wait_add_data
|
|
48
|
-
glBindBuffer(GL_ARRAY_BUFFER, self.vbo)
|
|
49
|
-
glBufferData(GL_ARRAY_BUFFER, self.buff.nbytes, self.buff, GL_DYNAMIC_DRAW)
|
|
50
|
-
glBindBuffer(GL_ARRAY_BUFFER, 0)
|
|
51
|
-
else:
|
|
52
|
-
self.buff[self.add_buff_loc:new_buff_top] = self.wait_add_data
|
|
53
|
-
glBindBuffer(GL_ARRAY_BUFFER, self.vbo)
|
|
54
|
-
glBufferSubData(GL_ARRAY_BUFFER, self.add_buff_loc * 12,
|
|
55
|
-
self.wait_add_data.shape[0] * 12, self.wait_add_data)
|
|
56
|
-
self.valid_buff_top = new_buff_top
|
|
57
|
-
self.wait_add_data = None
|
|
58
|
-
self.mutex.release()
|
|
59
|
-
|
|
60
|
-
def initializeGL(self):
|
|
61
|
-
self.vbo = glGenBuffers(1)
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
def paint(self):
|
|
65
|
-
self.setupGLState()
|
|
66
|
-
self.updateRenderBuffer()
|
|
67
|
-
glEnable(GL_BLEND)
|
|
68
|
-
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
|
|
69
|
-
glBindBuffer(GL_ARRAY_BUFFER, self.vbo)
|
|
70
|
-
glEnableClientState(GL_VERTEX_ARRAY)
|
|
71
|
-
glVertexPointer(3, GL_FLOAT, 0, None)
|
|
72
|
-
glLineWidth(self.width)
|
|
73
|
-
glColor4f(*self.color) # z is blue
|
|
74
|
-
|
|
75
|
-
glDrawArrays(GL_LINE_STRIP, 0, self.valid_buff_top)
|
|
76
|
-
glDisableClientState(GL_VERTEX_ARRAY)
|
|
77
|
-
|
|
78
|
-
glBindBuffer(GL_ARRAY_BUFFER, 0)
|
|
79
|
-
glUseProgram(0)
|
q3dviewer/utils.py
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import numpy as np
|
|
2
|
-
import time
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
def matrix_to_quaternion(matrix):
|
|
6
|
-
trace = matrix[0, 0] + matrix[1, 1] + matrix[2, 2]
|
|
7
|
-
if trace > 0:
|
|
8
|
-
s = 0.5 / np.sqrt(trace + 1.0)
|
|
9
|
-
w = 0.25 / s
|
|
10
|
-
x = (matrix[2, 1] - matrix[1, 2]) * s
|
|
11
|
-
y = (matrix[0, 2] - matrix[2, 0]) * s
|
|
12
|
-
z = (matrix[1, 0] - matrix[0, 1]) * s
|
|
13
|
-
else:
|
|
14
|
-
if matrix[0, 0] > matrix[1, 1] and matrix[0, 0] > matrix[2, 2]:
|
|
15
|
-
s = 2.0 * np.sqrt(1.0 + matrix[0, 0] - matrix[1, 1] - matrix[2, 2])
|
|
16
|
-
w = (matrix[2, 1] - matrix[1, 2]) / s
|
|
17
|
-
x = 0.25 * s
|
|
18
|
-
y = (matrix[0, 1] + matrix[1, 0]) / s
|
|
19
|
-
z = (matrix[0, 2] + matrix[2, 0]) / s
|
|
20
|
-
elif matrix[1, 1] > matrix[2, 2]:
|
|
21
|
-
s = 2.0 * np.sqrt(1.0 + matrix[1, 1] - matrix[0, 0] - matrix[2, 2])
|
|
22
|
-
w = (matrix[0, 2] - matrix[2, 0]) / s
|
|
23
|
-
x = (matrix[0, 1] + matrix[1, 0]) / s
|
|
24
|
-
y = 0.25 * s
|
|
25
|
-
z = (matrix[1, 2] + matrix[2, 1]) / s
|
|
26
|
-
else:
|
|
27
|
-
s = 2.0 * np.sqrt(1.0 + matrix[2, 2] - matrix[0, 0] - matrix[1, 1])
|
|
28
|
-
w = (matrix[1, 0] - matrix[0, 1]) / s
|
|
29
|
-
x = (matrix[0, 2] + matrix[2, 0]) / s
|
|
30
|
-
y = (matrix[1, 2] + matrix[2, 1]) / s
|
|
31
|
-
z = 0.25 * s
|
|
32
|
-
return np.array([w, x, y, z])
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
def quaternion_to_matrix(quaternion):
|
|
36
|
-
_EPS = np.finfo(float).eps * 4.0
|
|
37
|
-
q = np.array(quaternion[:4], dtype=np.float64, copy=True)
|
|
38
|
-
nq = np.dot(q, q)
|
|
39
|
-
if nq < _EPS:
|
|
40
|
-
return np.identity(4)
|
|
41
|
-
q *= np.sqrt(2.0 / nq)
|
|
42
|
-
q = np.outer(q, q)
|
|
43
|
-
return np.array((
|
|
44
|
-
(1.0-q[1, 1]-q[2, 2], q[0, 1]-q[2, 3], q[0, 2]+q[1, 3], 0.0),
|
|
45
|
-
(q[0, 1]+q[2, 3], 1.0-q[0, 0]-q[2, 2], q[1, 2]-q[0, 3], 0.0),
|
|
46
|
-
(q[0, 2]-q[1, 3], q[1, 2]+q[0, 3], 1.0-q[0, 0]-q[1, 1], 0.0),
|
|
47
|
-
(0.0, 0.0, 0.0, 1.0)
|
|
48
|
-
), dtype=np.float64)
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
def make_transform(pose, rotation):
|
|
52
|
-
transform = np.matrix(np.identity(4, dtype=np.float64))
|
|
53
|
-
transform = quaternion_to_matrix(rotation)
|
|
54
|
-
transform[0:3, 3] = np.transpose(pose)
|
|
55
|
-
return transform
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
class FPSMonitor():
|
|
59
|
-
def __init__(self):
|
|
60
|
-
self.stamp_record = []
|
|
61
|
-
|
|
62
|
-
def count(self):
|
|
63
|
-
cur_stamp = time.time()
|
|
64
|
-
self.stamp_record.append(cur_stamp)
|
|
65
|
-
while len(self.stamp_record) > 0:
|
|
66
|
-
if(cur_stamp - self.stamp_record[0] > 1.):
|
|
67
|
-
self.stamp_record.pop(0)
|
|
68
|
-
else:
|
|
69
|
-
break
|
|
70
|
-
return len(self.stamp_record)
|
|
71
|
-
|
q3dviewer-1.0.8.dist-info/RECORD
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
q3dviewer/__init__.py,sha256=rP5XX_x8g7hxIMqNHlU89BN4dt5MSvoYYwip68fCmhc,173
|
|
2
|
-
q3dviewer/base_glwidget.py,sha256=i1GOuPJMd_HeOu6-Y0mMe73tM4U0z1gdM-XOJszXGnM,8916
|
|
3
|
-
q3dviewer/base_item.py,sha256=-6GogOKrjVRSTszio9ELPDhehBaUlTyNaag2bUl81l8,1337
|
|
4
|
-
q3dviewer/basic_window.py,sha256=CFErOPRMysFcCqq3vhDsQ-xZzLArO3m1yABCTIhq5do,7946
|
|
5
|
-
q3dviewer/cloud_viewer.py,sha256=IxxrB6Sl6aPCr9P9QzKHGkMcDP_DjsBWbkmIbsAoIM4,2358
|
|
6
|
-
q3dviewer/gau_io.py,sha256=S6NmqL5vSMgHVxKR-eu4CWCqgZeWBJKYRoOMAwr8Xbo,5890
|
|
7
|
-
q3dviewer/glwidget.py,sha256=BwBxbok40cq705QBYjPbtckf-hbLxnKTxyA6nhaT1Ic,4772
|
|
8
|
-
q3dviewer/utils.py,sha256=evF0d-v17hbTmquC24fmMIp9CsXpUnSQZr4MVy2sfao,2426
|
|
9
|
-
q3dviewer/viewer.py,sha256=Rv_YMo-N2kibh4Bnaz0g32hEtNyn8WXRmoh7GTSPcJg,1708
|
|
10
|
-
q3dviewer/custom_items/__init__.py,sha256=gOiAxdjDaAnFL8YbqSEWWWOwUrJfvzP9JLR34sCB9-4,434
|
|
11
|
-
q3dviewer/custom_items/axis_item.py,sha256=8ZIzBH9rYFD9DWNAlshpJFBpSyXfMcv-eewjqlJ9GIE,4423
|
|
12
|
-
q3dviewer/custom_items/camera_frame_item.py,sha256=VBsr3Avly_YWXViIh4DJkGc_HJt227GeOYLpGtbYTOw,5605
|
|
13
|
-
q3dviewer/custom_items/cloud_io_item.py,sha256=gjK3n9WKB7JwxC93ijkweEHA5EezpgNJ8KO-PBaDKCs,2835
|
|
14
|
-
q3dviewer/custom_items/cloud_item.py,sha256=kkIpJky7-Bbry3yCUodsU08BCZqtRQD69-0EMCLKnUs,12571
|
|
15
|
-
q3dviewer/custom_items/frame_item.py,sha256=YTBOEeRWh95trhAlKoZ9LZ4I2x-A5JjOhNPp4OvD5E0,6983
|
|
16
|
-
q3dviewer/custom_items/gaussian_item.py,sha256=B0mYjlW83Kr6FUtZ6P_f40pjjiASPB8g3CSjMTnjsvY,9857
|
|
17
|
-
q3dviewer/custom_items/grid_item.py,sha256=U4nk16d5Dkbt6U9s23c9PIlG-wPwu15Ho0HsamDuyqM,3436
|
|
18
|
-
q3dviewer/custom_items/image_item.py,sha256=tJryUj5qxaGx1j7W0lbzx-JJmehMPSEqJXPnSkG4FOI,5529
|
|
19
|
-
q3dviewer/custom_items/line_item.py,sha256=ujl78wBlvcotghauAy7ILTa22P_fdrFzrH6RD4TvY3M,4401
|
|
20
|
-
q3dviewer/custom_items/text_item.py,sha256=nuHMVMQrwy50lNk9hxB94criFxbJJK-SYiK2fSXWUMQ,2158
|
|
21
|
-
q3dviewer/custom_items/trajectory_item.py,sha256=uoKQSrTs_m_m1M8iNAm3peiXnZ9uVPsYQLYas3Gksjg,2754
|
|
22
|
-
q3dviewer/shaders/cloud_frag.glsl,sha256=tbCsDUp9YlPe0hRWlFS724SH6TtMeLO-GVYROzEElZg,609
|
|
23
|
-
q3dviewer/shaders/cloud_vert.glsl,sha256=Vxgw-Zrr0knAK0z4qMXKML6IC4EbffKMwYN2TMXROoI,2117
|
|
24
|
-
q3dviewer/shaders/gau_frag.glsl,sha256=5_UY84tWDts59bxP8x4I-wgnzY8aGeGuo28wX--LW7E,975
|
|
25
|
-
q3dviewer/shaders/gau_prep.glsl,sha256=eCT9nm65uz32w8NaDjeGKhyAZh42Aea-QTwr3yQVr9U,7218
|
|
26
|
-
q3dviewer/shaders/gau_vert.glsl,sha256=NNbVhv_JyqZDK9iXAyBAcIHAtim7G9yWbC9IaUfTL1w,1666
|
|
27
|
-
q3dviewer/shaders/sort_by_key.glsl,sha256=CA2zOcbyDGYAJSJEUvgjUqNshg9NAehf8ipL3Jsv4qE,1097
|
|
28
|
-
q3dviewer/tools/__init__.py,sha256=01wG7BGM6VX0QyFBKsqPmyf2e-vrmV_N3-mo-VQ1VBg,20
|
|
29
|
-
q3dviewer/tools/cloud_viewer.py,sha256=lNvOD0XWDAfgdqc2aJGigcCJsaWUS4qxadjFwf59-OY,3861
|
|
30
|
-
q3dviewer/tools/example_viewer.py,sha256=yeVXT0k4-h1vTLKnGzWADZD3our6XUaYUTy0p5daTkE,959
|
|
31
|
-
q3dviewer/tools/gaussian_viewer.py,sha256=vIwWmiFhjNmknrEkBLzt2yiegeH7LP3OeNjnGM6GzaI,1633
|
|
32
|
-
q3dviewer/tools/lidar_calib.py,sha256=beQP6Z9NyW7ME6zCRAxH1RRSm5zMalcmlmF_HzJPLi8,10811
|
|
33
|
-
q3dviewer/tools/lidar_cam_calib.py,sha256=kYR41Eq3o7frHLIWqysHUvVbB29GC0sDLzUigwxG4n4,11539
|
|
34
|
-
q3dviewer/tools/ros_viewer.py,sha256=ARB3I5wohY3maP8dCu0O0hxObd6JFKuK2y7AApVgMWA,2551
|
|
35
|
-
q3dviewer/utils/__init__.py,sha256=irm8Z_bT8l9kzhoMlds2Dal8g4iw4vjmqNPZSs4W6e0,157
|
|
36
|
-
q3dviewer/utils/cloud_io.py,sha256=ttD8FJExdDhXB1Z0Ej9S939i8gcq4JfyqwLXVh8CEFw,11094
|
|
37
|
-
q3dviewer/utils/convert_ros_msg.py,sha256=sAoQfy3qLQKsIArBAVm8H--wlQXOcmkKK3-Ox9UCcrc,1686
|
|
38
|
-
q3dviewer/utils/gl_helper.py,sha256=dRY_kUqyPMr7NTcupUr6_VTvgnj53iE2C0Lk0-oFYsI,1435
|
|
39
|
-
q3dviewer/utils/maths.py,sha256=ghnZQYxQtAQonTqQOmfHAMdSluk0sO1Ps_9bL2vMeb8,5397
|
|
40
|
-
q3dviewer/utils/range_slider.py,sha256=jZJQL-uQgnpgLvtYSWpKTrJlLkt3aqNpaRQAePEpNd0,3174
|
|
41
|
-
q3dviewer-1.0.8.dist-info/LICENSE,sha256=81cMOyNfw8KLb1JnPYngGHJ5W83gSbZEBU9MEP3tl-E,1124
|
|
42
|
-
q3dviewer-1.0.8.dist-info/METADATA,sha256=36WLMFrKUX9e1GTT3s9QgIBgchCmF_7v2QzF4TiNJck,349
|
|
43
|
-
q3dviewer-1.0.8.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92
|
|
44
|
-
q3dviewer-1.0.8.dist-info/entry_points.txt,sha256=2vsxH5_1WhM-DnDgY0TDbiAGFPFMfI0Wmfs_6iXEf4Y,317
|
|
45
|
-
q3dviewer-1.0.8.dist-info/top_level.txt,sha256=HFFDCbGu28txcGe2HPc46A7EPaguBa_b5oH7bufmxHM,10
|
|
46
|
-
q3dviewer-1.0.8.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|