PyODE 접촉 판정 및 점프 행위의 샘플

18475 단어 PythonPyODE

구현 경과


PyODE 웹 사이트여기.
본가의 튜토리얼에는'접촉 판정'과'바닥에서 튕기는'튜토리얼 3이 있다.
그러나 많은 낙하 대상이 있고 3D 묘사 부분의 코드가 많아 OpenGL이 필요하다
아무래도 과도해서 실시하기 어려운 샘플이다.
그래서 이 기사에서 우리는 가장 간단한'Tutorial 1'을 접촉해 보았고 바닥에 배척을 더했다.
↓ 관련 기사입니다.
Tutorial 1 구현 보도
Tutorial 3 구현 보도

개요


본가의'터토리얼 1'은 대상자에게 초속으로 자유롭게 떨어지는 모습을 관찰하는 것이다.
앞기사에서는 Matplotlib을 통해 드로잉 디스플레이를 추가하여 구현합니다.
이 시간에 프로그램에서.
• 대상의 접촉 판정에 대한 형상 정의
마루의 정의
접촉 판정 절차
중의 세 개.
이들 추가 부분은 이 같은'본가 터트리얼 3'을 패러디했다.

2 샘플 코드(전체)


상수COLLISION로 여는 곳은 추가분이다.
Tutorial-1_bouncing.py
##  pyODE example-1: with MPL-plot
##  Appended ``A floor and collision'' to observe bouncing motion.

import ode

# Create a world object
world = ode.World()
world.setGravity( (0,-9.81,0) )


# Create a body inside the world
body = ode.Body(world)
M = ode.Mass()
rho = 2500.0
r = 0.05
M.setSphere( rho, r)
M.mass = 1.0
body.setMass(M)

body.setPosition( (0,0,0) )
#body.addForce( (0,200,0) )
body.setLinearVel( (0.0,10.0,0.0))  


ERP_GLOBAL = 1.0
CFM_GLOBAL = 0.0
COLLISION = True
BOUNCE = 0.5 

if COLLISION:
    # Create a space object
    space = ode.Space()
    # Create a plane geom which prevent the objects from falling forever
    floor = ode.GeomPlane( space, (0,1,0), 0. )

    geom = ode.GeomSphere( space, radius=r )
    geom.setBody( body )

    world.setERP( ERP_GLOBAL )   ####    ERP : Error Reduction Parameter 
    world.setCFM( CFM_GLOBAL )   ####    CFM : Constraint Force Mixing

    # A joint group for the contact joints that are generated whenever
    # two bodies collide
    contactgroup = ode.JointGroup()

    # Collision callback
    def near_callback(args, geom1, geom2):
        """ Callback function for the collide() method.

        This function checks if the given geoms do collide and
        creates contact joints if they do.
        """

        # Check if the objects do collide
        contacts = ode.collide(geom1, geom2)

        # Create contact joints
        (world, contactgroup) = args

        for c in contacts:

            c.setBounce( BOUNCE ) #0.2)
            c.setMu(5000)

            j = ode.ContactJoint( world, contactgroup, c )
            j.attach( geom1.getBody(), geom2.getBody() )



##  Proceed the simulation...
total_time = 0.0
dt = 0.04

import numpy as np
nt = 100
txyzuvw = np.zeros( (7,nt+1) )
tn=0

END_TIME = 5.0
while total_time <= END_TIME:
    x,y,z = body.getPosition()
    u,v,w = body.getLinearVel()
    print( "%1.2fsec: pos=(%6.3f, %6.3f, %6.3f)  vel=(%6.3f, %6.3f, %6.3f)" % (total_time, x, y, z, u,v,w) )
    if tn <= nt:
        txyzuvw[0][tn]=total_time
        txyzuvw[1][tn]=x
        txyzuvw[2][tn]=y
        txyzuvw[3][tn]=z
        txyzuvw[4][tn]=u
        txyzuvw[5][tn]=v
        txyzuvw[6][tn]=w

    if COLLISION:
        # Detect collisions and create contact joints
        space.collide( (world,contactgroup), near_callback )

    world.step(dt)
    total_time+=dt

    if COLLISION:
        # Remove all contact joints
        contactgroup.empty()

    tn += 1

end_tn = tn

import matplotlib.pyplot as plt
# MPL-Plot 
plt.plot( txyzuvw[0][0:end_tn], txyzuvw[2][0:end_tn], label='Vertical position')
plt.plot( txyzuvw[0][0:end_tn], txyzuvw[5][0:end_tn], label='Vertical velocity')
plt.xlabel('time [s]')
plt.ylabel('Vertical position [m]')
plt.legend()

xmin = np.min( txyzuvw[0] )
xmax = np.max( txyzuvw[0] )

plt.hlines( [0], xmin, xmax, "blue", linestyles='dashed')     # hlines

savepath = './y_ERP%g_CFM%g_BR%g.png'%(ERP_GLOBAL, CFM_GLOBAL, BOUNCE)
plt.savefig( savepath )
print('An image-file exported : [%s]'%savepath )

#plt.show()
plt.pause(1.0)

↑ 20200506: 수정은 시작 위치를 기록할 수 없습니다BOUNCE = 0.5는 배척 계수다.

3 프로그램 실행 및 결과


numby와 matplotlib을 미리 설치하십시오.
집행 후...

↑ 이 그래프 이미지(PNG)는 현재 저장됩니다.
수직 방향(Y 좌표)에서 물체의 높이와 속도를 투사하는 시간의 변화.
접촉 판정에 사용되는 물체의 직경값은 0.1m이다.(조금 더 작아도 괜찮아.)
떨어진 대상-10.0[m/s]이 바닥에 부딪혀+5.0 [m/s]배척
첫 번째 반등 행위는 계수와 같다.
두 번째 점프는 상당히 빗나갔다.
이 근거dt의 값도 변하고 ERP, CFM에 따라 달라질 수 있다.
    world.setERP( ERP_GLOBAL )   ####    ERP : Error Reduction Parameter 
    world.setCFM( CFM_GLOBAL )   ####    CFM : Constraint Force Mixing
↑ 이 부분에 설정된 두 값은 더 높은 계산을 할 때 연구가 필요하다.
이번 수치1.00.0는 탄성 충돌 시 이상치다.
아마도 아날로그의 부드러운 물리성에 근거하여 원가를 계산하는 상황에 따라 조정해야 할 것이다
(필자는 물건이라고 생각하고 아직 제대로 파악하지 못한 땀)

좋은 웹페이지 즐겨찾기