Search

[Python ProcessNet] 좌표계 변환 질문입니다.

Board √
Member √
Category √
RecurDyn
Created by
jeh24@kaist.ac.kr
Paul_Jung
Status √
Complete
Files
5 more properties
Question

로봇팔 각도 변경

RecurDyn에서 제공하는 Basic Object Control을 Python으로 사용하려고 하고 있습니다. 그러나 ProcessNet의 Help기능에 나와있는 아래 네 가지 함수(?)를 사용하는데 어려움이 있어서 질문 드립니다. TranslateObjectWithVector(body, ptDir, value) TranslateObjectWithTwoPoints(body, firstpt, secondpt) RotateObjectWithScalar(body, AxisOrigin, AxisDirection, value) RotateObjectWithVector(body, AxisOrigin, AxisDirection, p_firstvector, p_secondvector)
(로봇팔의 시작 지점과 끝 지점에 각 링크의 회전좌표계를 표시하기 위해 Marker를 설정해 놓은 상태입니다.)
로봇팔의 각도를 자동으로 변환하면서 시뮬레이션 진행하고 싶은데 python으로 코드를 짜면 편할거 같아서요. 그런데 processnet에서 제공하는 코드에는 ref.frame을 설정하는 부분을 못 찾아서요 ..! 로봇팔의 링크에 있는 회전좌표계를 ref.frame으로 설정하고 싶은데 어떻게 하면 좋을까요?
(로봇팔의 회전 좌표계가 관성 좌표계와 동일하지 않은 상황이라서 회전하는데 어려움이 있습니다.. 회전했을 때 각 링크의 시작 지점과 끝 지점의 위치를 계산하는 코드는 이미 만들어 놓은 상태입니다.!)
감사합니다.
Answer
함수 입력 값도 그렇고 따로 Reference Frame을 받아서 움직임을 결정하는 것이 아니라 기준이 되는 점의 위치와 회전 방향을 넣어줘야 함.
나 같은 경우, 4개의 함수 중에서 RotateObjectWithScalar를 이용해서 회전 시켜두는데 아래와 같이 사용하면 됨.

RotateObjectWithScalar(body, AxisOrigin, AxisDirection, value)

함수 사용 예시: X, Y, Z축 방향에 대한 회전

해당 함수의 경우 꽤 깊숙한 라이브러리 함수라서 아래처럼 objectControl 변수까지 정의 하고 사용해야 편함 (modelDocumnet 변수가 정의되어 있다는 가정)
# 변수 정의 utility = IUtility(modelDocument.Utility); objectControl = IObjectControl(utility.ObjectControl); # 기준 점 및 회전 방향 정의 (Global Inertia Frame 기준) rotationPoint = [bodyCGPos_X, bodyCGPos_Y, bodyCGPos_Z] # X, Y, Z 좌표 rotationDirection = [[1, 0, 0], [0, 1, 0], [0, 0, 1]] # X축 회전, Y축 회전, Z축 회전 # 회전시킬 각도 rotationAngle_X = 30; # [deg] rotationAngle_Y = 45; # [deg] rotationAngle_Z = 15; # [deg] # Body 회전 objectControl.RotateObjectWithScalar(body, rotationPoint, rotationDirection [0][:], rotationAngle_X ) objectControl.RotateObjectWithScalar(body, rotationPoint, rotationDirection [1][:], rotationAngle_Y ) objectControl.RotateObjectWithScalar(body, rotationPoint, rotationDirection [2][:], rotationAngle_Z )
Python
복사
위의 코드처럼 사용하면 Global Inertia Frame 기준으로 원하는 위치에 대해서 X, Y, Z축 방향으로 회전 가능함

X, Y, Z축 방향에 대한 회전이 아닌 경우

아마 특정 Reference Frame을 설정하고 싶다는 질문의 의도로 봤을 때, 임의의 벡터 방향으로 회전을 시키고 싶은 것으로 보임
이 경우, 위의 코드에서 RotationDirection에 원하는 회전 벡터의 방향을 Global Inertia Frame 기준으로 넣어주면 됨
⇒ 예를 들어 X = Y 축에 대해서 회전 시키고 싶으면 rotationDirection = [1, 1, 0] 으로 설정
즉, 로봇팔을 회전시키려는 방향 벡터를 Global Inertia Frame 기준으로 계산해두기만 하면 쉽게 회전 가능
위의 사진으로 유추해보면 로봇팔 연결 조인트 위치에서 Global Inertia Frame 기준으로 X = Z 축에 대해서 로봇팔이 회전하게 될꺼 같은데,
rotationDirection = [1, 0, 1] 로 입력해두고 해당 조인트 위치를 rotationPoint에 넣고 돌리면 될듯
Mention for reply completion notification: @Paul_Jung