Rerun Python Görselleştirme
Rerun
Computer vision için geliştirilmiş, Rust, Python, Cpp uçları olan pakettir. Farklı OS'lar için native olarak Web için farklı bir renderer'a sahiptir.
İpuçları
Bağlantılar
Ros'taki TF ağaçları mantığına benzer şekilde, her bir obje tanımı için bir path' tanımlanır. Örneğin /world/object1, bu object1'in world'e göre relatif durumunu açıklar.
Değişim
Animasyonlu bir şekilde gösterilmek istendiğinde yani işin içerisine t (zaman) girdiğinde rerun syntax'ı yeni durumları overwrite etmek ister. Yani kümülatif bir girdi parçası değil t zamanındaki relatif durum toplamlarını bekler.
Zaman
Zaman farklı şekillerde ele alınabilir. Aşağıdaki örnekte busy-wait yaklaşımı kullanılmıştır. İterated bir şekilde de sağlanabilir.
UI
Farklı paneller eklemek için rerun içerisindeki blueprint kısmını kullanır.
Bir daire ve etrafında 3 boyutta daire çizen bir dikdörtgen (Aynı zamanda dönen) Örneği
import math
import rerun as rr
import rerun.blueprint as rrb
import numpy as np
import time as pytime
rr.init("example", spawn=True)
rr.log("/", rr.ViewCoordinates.RIGHT_HAND_Z_UP, static=True)
time = 0.0
rr.set_time_seconds("sim_time", seconds=time)
# Center Elipsoid
rr.log(
"/world/center",
rr.Ellipsoids3D(
centers=[[0,0,0]],
half_sizes=[[0.5,0.5,0.5]],
colors=[[0,120,255]],
fill_mode="solid"
),
static=True
)
# edge rectangle
rr.log(
"/world/edge",
rr.Boxes3D(
centers=[[0.0, 0.0, 0.0]], # <- burada 0,0,0 olmalı
half_sizes=[[0.2, 0.2, 0.4]],
fill_mode="solid",
),
static=True
)
# saniyede 20
# animation
target_dt = 0.02
start = pytime.time()
animation_duration = 10
coeff_orbital_x_radius = 1.5
coeff_orbital_y_radius = 2
coeff_orbital_z_radius = 3
animation_start = pytime.time()
while True:
if animation_duration <= pytime.time() - animation_start:
print("Animation Ended")
break
frame_start = pytime.time()
time_sim = frame_start - start
rr.set_time_seconds("sim_time", seconds=time_sim)
degree = 90 * time_sim
x_translation = coeff_orbital_x_radius * math.sin(time_sim * math.pi * 2) # value olarak radyan verilir
y_translation = coeff_orbital_y_radius * math.cos(time_sim * math.pi * 2) # value olarak radyan verilir
z_translation = coeff_orbital_z_radius * math.sin(time_sim * math.pi * 2) # value olarak radyan verilir
rr.log(
"/world/edge",
rr.Transform3D(
translation=[x_translation, y_translation, z_translation],
rotation=rr.RotationAxisAngle(
axis=(1, 1, 1),
degrees=degree,
),
)
)
# busy wait
while pytime.time() - frame_start < target_dt:
pass
Image Örneği
def image_3d():
rr.init("image_example", spawn=True)
rr.log("/", rr.ViewCoordinates.RIGHT_HAND_Z_UP, static=True)
rr.send_blueprint(
rrb.Blueprint(
rrb.Spatial3DView(origin="/world")
)
)
# Image
img = np.ones((100, 100, 3), dtype=np.uint8) * 255
img[30:70, 30:70] = [255, 0, 0]
# Image 2d oldugu için 3d düzelmde göstermek istendiğinde onu bir mesh ile
# temsil etmeliyiz.
rr.log(
"/world/image_plane",
rr.Mesh3D(
vertex_positions=[
[-1, -1, 0],
[ 1, -1, 0],
[ 1, 1, 0],
[-1, 1, 0],
],
vertex_texcoords=[
[0, 0],
[1, 0],
[1, 1],
[0, 1],
],
triangle_indices=[
[0,1,2],
[0,2,3],
],
albedo_texture=img,
),
)
def image_2d():
img = cv2.imread("/home/enes/Desktop/somelearning/rerun/example.jpg")
rr.init("image_example_2d", spawn=True)
# 🔵 2D layout blueprint
rr.send_blueprint(
rrb.Blueprint(
rrb.Vertical(
rrb.Horizontal(
rrb.Spatial2DView(origin="image/rgb"),
rrb.Spatial2DView(origin="image/gray"),
),
rrb.Spatial2DView(origin="image/canny"),
)
)
)
# Log the original image
rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
rr.log("image/rgb", rr.Image(rgb))
# Convert to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
rr.log("image/gray", rr.Image(gray))
# Run the canny edge detector
canny = cv2.Canny(gray, 50, 200)
rr.log("image/canny", rr.Image(canny))
image_2d()
Points Örneği
import rerun as rr
rr.log("/", rr.ViewCoordinates.RIGHT_HAND_Z_UP, static=True)
rr.init("rerun_example_points3d", spawn=True)
positions = [[0,0,1],[1,0,0],[0,1,0]]
colors = [[255,0,0],[0,0,255],[0,255,0]]
radii = [0.01,0.02,0.03]
rr.log("points", rr.Points3D(positions, colors=colors, radii=radii))
Skaler Değer
rr.log("metrics/frame_index", rr.Scalar(frame_index))