(+)분류 : 연구실(bwlee42)
1. ESS 시뮬레이션 ✎ ⊖
리처드 도킨스 아저씨의 이기적 유전자에 나오는 '매파와 비둘기파' 시뮬레이션 프로그램이다.
사실 저번 주에 친구 부탁으로 만들었다.
아래 깃허브 링크에 실행 버전, 설명 버전, 도식화 프로그램(matplptlib), readme 까지 올려놨다.
깃허브 리포지토리
사실 저번 주에 친구 부탁으로 만들었다.
아래 깃허브 링크에 실행 버전, 설명 버전, 도식화 프로그램(matplptlib), readme 까지 올려놨다.
깃허브 리포지토리
2. Python Genesis 활용 ✎ ⊖
나름 최근?에 나온 물리 엔진이라고 해서 사용해봤다.
사용법을 익혀나가는 단계인데, 꾸준히 공부하면 더 많은 것을 해볼 수 있지 않을까..
겨우 RTX 2050 달린 그램에서 시뮬레이션 돌리려니까 좀 빡세긴 하다.
해상도라던지 이런 건 좀 타협할 필요가 있어보인다.
젠슨 황이 글카 26만장 중 1장만이라도 나한테 줬으면 좋겠다.
최대 60프레임 기준, 유체 실험은 겨우 14~15 프레임 정도 나오고, 로봇 팔 오브젝트 하나만 있는 경우에도
30~57프레임 정도 수준이다. 많이 불안정하긴 하다. 멀티테스킹도 못한다.똥컴
아래는 간단한 실행 사진이다.

실행 시간이 길어질 수록 쓰로틀링 때문인지 프레임 수가 점점 더 떨어진다(...)
아래는 실행한 코드이다. 홈페이지에서 긁어온 간단한 예제이다.
파이썬 버전, Pytorch 버전, 글카 드라이버 버전 등 신경써야 할 게 많다.
가상환경에서 실행하는 것을 권장한다.그냥 하지 마라
사용법을 익혀나가는 단계인데, 꾸준히 공부하면 더 많은 것을 해볼 수 있지 않을까..
겨우 RTX 2050 달린 그램에서 시뮬레이션 돌리려니까 좀 빡세긴 하다.
해상도라던지 이런 건 좀 타협할 필요가 있어보인다.
최대 60프레임 기준, 유체 실험은 겨우 14~15 프레임 정도 나오고, 로봇 팔 오브젝트 하나만 있는 경우에도
30~57프레임 정도 수준이다. 많이 불안정하긴 하다. 멀티테스킹도 못한다.
아래는 간단한 실행 사진이다.

실행 시간이 길어질 수록 쓰로틀링 때문인지 프레임 수가 점점 더 떨어진다(...)
아래는 실행한 코드이다. 홈페이지에서 긁어온 간단한 예제이다.
파이썬 버전, Pytorch 버전, 글카 드라이버 버전 등 신경써야 할 게 많다.
가상환경에서 실행하는 것을 권장한다.
import numpy as np
import genesis as gs
gs.init(backend=gs.cuda)
scene = gs.Scene(
viewer_options = gs.options.ViewerOptions(
camera_pos = (0, -3.5, 2.5),
camera_lookat = (0.0, 0.0, 0.5),
camera_fov = 30,
res = (960, 640),
max_FPS = 60,
),
sim_options = gs.options.SimOptions(
dt = 0.01,
),
show_viewer = True,
)
plane = scene.add_entity(
gs.morphs.Plane(),
)
franka = scene.add_entity(
gs.morphs.MJCF(
file = 'xml/franka_emika_panda/panda.xml',
),
)
scene.build()
jnt_names = [
'joint1',
'joint2',
'joint3',
'joint4',
'joint5',
'joint6',
'joint7',
'finger_joint1',
'finger_joint2',
]
dofs_idx = [franka.get_joint(name).dof_idx_local for name in jnt_names]
# set positional gains
franka.set_dofs_kp(
kp = np.array([4500, 4500, 3500, 3500, 2000, 2000, 2000, 100, 100]),
dofs_idx_local = dofs_idx,
)
# set velocity gains
franka.set_dofs_kv(
kv = np.array([450, 450, 350, 350, 200, 200, 200, 10, 10]),
dofs_idx_local = dofs_idx,
)
# set force range for safety
franka.set_dofs_force_range(
lower = np.array([-87, -87, -87, -87, -12, -12, -12, -100, -100]),
upper = np.array([ 87, 87, 87, 87, 12, 12, 12, 100, 100]),
dofs_idx_local = dofs_idx,
)
# Hard reset
for i in range(150):
if i < 50:
franka.set_dofs_position(np.array([1, 1, 0, 0, 0, 0, 0, 0.04, 0.04]), dofs_idx)
elif i < 100:
franka.set_dofs_position(np.array([-1, 0.8, 1, -2, 1, 0.5, -0.5, 0.04, 0.04]), dofs_idx)
else:
franka.set_dofs_position(np.array([0, 0, 0, 0, 0, 0, 0, 0, 0]), dofs_idx)
scene.step()
# PD control
for i in range(1250):
if i == 0:
franka.control_dofs_position(
np.array([1, 1, 0, 0, 0, 0, 0, 0.04, 0.04]),
dofs_idx,
)
elif i == 250:
franka.control_dofs_position(
np.array([-1, 0.8, 1, -2, 1, 0.5, -0.5, 0.04, 0.04]),
dofs_idx,
)
elif i == 500:
franka.control_dofs_position(
np.array([0, 0, 0, 0, 0, 0, 0, 0, 0]),
dofs_idx,
)
elif i == 750:
# control first dof with velocity, and the rest with position
franka.control_dofs_position(
np.array([0, 0, 0, 0, 0, 0, 0, 0, 0])[1:],
dofs_idx[1:],
)
franka.control_dofs_velocity(
np.array([1.0, 0, 0, 0, 0, 0, 0, 0, 0])[:1],
dofs_idx[:1],
)
elif i == 1000:
franka.control_dofs_force(
np.array([0, 0, 0, 0, 0, 0, 0, 0, 0]),
dofs_idx,
)
# This is the control force computed based on the given control command
# If using force control, it's the same as the given control command
print('control force:', franka.get_dofs_control_force(dofs_idx))
# This is the actual force experienced by the dof
print('internal force:', franka.get_dofs_force(dofs_idx))
scene.step()


