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