ⓑcalc_inertia_for_urdf.py를 이용해 inertia를 계산:
구글링 하던 도중 'urdf를 input으로 주면 각 링크의 mass와 stl파일을 기반으로 urdf의 inertia tag를 output으로 주는' 파이썬 코드를 찾았다.
정확하게 내가 필요한 것이었고 큰 문제도 없다고 했다.
https://github.com/gstavrinos/calc-inertia
GitHub - gstavrinos/calc-inertia: Based on a provided URDF (or xacro), it reads all geometries that have a mass inertial tag, an
Based on a provided URDF (or xacro), it reads all geometries that have a mass inertial tag, and prints a URDF-ready inertia matrix. - GitHub - gstavrinos/calc-inertia: Based on a provided URDF (or ...
github.com
사용법을 간단하게 정리해 보면
1. github 페이지에 있는 dependencies를 전부 설치해 준다.
2. calc_inertia_for_urdf.py를 다운로드하여서 실행시킨다. 이때 python이 아닌 python3로 실행시켜야 하며 urdf 디렉터리는 자기 것에 맞게 잘 넣어준다.
3. 나오는 inertia값들을 하나하나 복사해서 urdf에 넣어준다. (link가 46개라서 그냥 일일이 복붙 했지만 불가능할 정도로 많으면 그냥 코드를 하나 만들던가 xacro를 활용하는 것을 추천한다.)
이런 식으로 나오고 저 초록색 부분을 각 링크에 알맞게 넣어주면 된다...
일단 이렇게 나온 inertia들은 #7에서 chatGPT와 대화를 통해 얻은 'diagonal should be non-zero.'와 'off-diagonal should be zero'. 를 완벽하게 충족하고 있었다. 이 때문에 inertia tag에 대해 더 헷갈리게 되었던 거 같다.
이렇게 ⓑ방법을 통해 수정한 urdf를 gazebo.launch하니 기존의 '땅과 닿는 순간 joint가 없어지고 origin에 link가 모인다.'는 문제는 해결되었지만 다른 문제가 나타났다.
●joint가 분해되지는 않았지만 힘이 전혀 안 들어간 것처럼 무너졌다.
이 문제는 바로 원인을 알았고 해결했다.
fusion2urdf로 만든 urdf의 transmission tag (+urdf를 gazebo에서 사용하려면 transmission tag를 달아서 각 revolute joint를 설정해줘야 한다.)는 hardwareinterface가 EffortJointInterface로 되어있다.
아직 ros contorl을 통해 controller를 켜지도 않았고 effort의 값이 있지도 않기에 joint에 힘이 전혀 안 들어가는 것이다.
나는 effort control이 아닌 각도 제어, 즉 postion contol을 할 것이기에 EffortJointInterface를 전부 PositionJointInterface로 바꿔주고 다시 실행시켰다. (position은 최초 joint 각도를 지정해 urdf를 만들었기에 controller가 없어도 무너지지 않는다.)
+)이후 ros_control을 이용하기 위해 launch 폴더의 controller.launch와 controller.yaml도 postion control에 맞게 수정해 줬다.
위의 controller.yaml의 경우 LF_leg만 test를 위해 넣었었다. 다른 joint는 저기에 그냥 똑같이 추가해 주면 된다.
position control로 바꿔주니 무너지지 않고 잘 서있었다.
하지만 또 다른 문제가 발생했다. 이전 c2345 4족 보행 urdf때도 발생했던 문제였다.
●계속 가만히 있지 못하고 마치 누가 밀듯이 미끄러졌다.
c2345 당시에는 inventor의 모델링 축방향과 gazebo의 축방향이 달라서 생긴 inertia의 문제로 결론짓고 해결했었다.
하지만 이번에는 아예 이를 고려한 축방향으로 모델링을 했고 inertia도 지금 urdf를 기반으로 새로 계산해서 넣었기에 문제가 있을 수가 없었다.
여기서 멘탈이 완전히 나갔고 이틀 정도를 계속 이 원인만 찾는데 썼던 거 같다.
ros answer와 gazebo answer에 있는 모든 방법을 했지만 도저히 되지 않았고 결국 오로카에 질문을 올렸다.
올린 지 2시간 만에 답변을 받았고 그 답변으로 내가 며칠간 고생했던 urdf관련 여정이 끝을 맺었다.
https://cafe.naver.com/openrt/28544
Gazebo에서 model이 계속 혼자 움직입니다. 도와주세요.
안녕하세요. 4족보행 로봇을 만들고 있는 학생입니다. 제 로봇의 urdf를 만들어서 gazebo에서 spawn을 하니 계속 누가 살짝 밀듯이 혼자 미끄러지네요.ㅠㅠ 현...
cafe.naver.com
(개인적으로 매우 중요한 것을 배울 수 있던 질문이다. 꼭 보자)
이 글의 내용을 토대로 내가 최종적으로 바꾼 것은 아래와 같았다.
1. urdf의 모든 mass를 1.0으로 바꾼다.
2. urdf의 모든 inertia를 ixx, iyy, izz = 1.0e-3, 나머지는 0.0으로 바꾼다. *
3. gazebo tag에서 kp=500000, kd=100을 추가해 준다. *
이렇게 얻은 시뮬레이션은 이랬다.
좀 더 inertia랑 kp, kd를 조절해 주면 더 정확할 거 같지만 지금 자체로도 충분히 내가 원하는 정도의 urdf가 완성되었다.
+)2과정의 * : 원래 1과정을 한 후 2과정은 1.0e-03이 아닌 그냥 1.0을 했었다. 그러니 미끄러지는 것은 없어졌지만 로봇이 너무 느리게 넘어지고 이상하게 bounce 했다.
mass대비 inertia가 너무 커서 생긴 문제로 보여서 inertia를 크게 줄여주니 해결되었다.
+)3과정의 * : bounce 할 때 문제를 처음에는 inertia가 아니라 다른 것에서 있다고 생각해 구글링 했고 아래의 글을 읽었었다.
https://campus-rover.gitbook.io/lab-notebook/faq/bouncy-objects
Bouncy Objects in Gazebo - Autonomous Robotics Lab Notebook
The "kp" value can be thought of as the coefficient of deformation. A value of 500,000 is good for truly solid objects like metals; keep in mind that an object with a "kd" value of 0 and a "kp" value of 500,000 will still bounce all around but will be hard
campus-rover.gitbook.io
개인적으로 gazebo tag의 몇몇 tag를 정말 이해하기 쉽게 설명한 글이라고 생각한다.
어쨌든 위 글을 보고 Kp, Kd를 넣어줬는데 그럼에도 bounce 문제가 해결되지는 않았었다. 하지만 inertia 조절로 해결한 후에도 이 글에서 설명하는 tag 수정으로 더 사실적인 urdf를 만들 수 있었기에 이를 글에 추가했다.
이번 gazebo에 올리는 과정은 개인적으로 너무 힘들었다. 하지만 그만큼 이번 프로젝트에서 가장 크게 배운 과정이 아니었나 싶다.
이렇게 여기까지 해서 내가 모델링한 quadruped를 rviz와 gazebo에 성공적으로 올렸다.
물론 직후 tag들을 좀 더 수정해서 더 사실적인 urdf를 만들 것이다.
+2023.10.04) 다음 글인 #9에서 프로세스를 수정했다.================================================================fusion2urdf를 이용해 gazebo에 올리기 요약 ●이 과정으로 만드는 로봇 urdf는 기본적으로 토크, 속도 제어가 아닌 각도 제어가 전제이다. 1. 모델을 인벤터나 fusion으로 제작한다. 이 과정에서 mass나 inertia는 신경 쓰지 않아도 된다. 2. fusion에서 부품들을 assemble한다. 이때 fusion2urdf에 맞는 방식으로 제작해야 한다.(#7 글에 설명 O) 3. 성공적으로 urdf를 만들었다면 display.launch로 우선 rviz에서 모델이 잘 나왔는지, joint는 이상 없는지를 확인한다. 4. 이상이 없다면 description 패키지에서 아래의 것들을 수정한다.ⓐurdf의 모든 link의 mass = 1.0, inertia ixx, iyy, izz = 1.0e-3, inertia의 다른 element = 0.0 으로 넣는다. ⓑ.trans의 EffortJointInterface를 PositionJointInterface로 바꾼다. ⓒ.gazebo에서 <mu>, <mu2>, <kp>, <kd> tag등을 적절하게 넣어준다. (#8 글에 설명 O) ⓓlaunch 폴더의 controller.launch와 controller.yaml을 수정해 준다. (#8 글에 설명 O) ⓔgazebo.launch로 urdf가 무너지지 않고, 미끄러지지 않고 잘 서 있는지 확인한다. 5.잘 만들어졌으면 gazebo.launch가 켜져 있는 상태에서 controller.launch를 실행해 ros_control을 켜주고 이후 rqt를 실행시킨 후 [plugins] -> [robot tools] -> [Joint Trajectory Controller]를 열어서 설정 후 joint들을 움직여본다. 6.로봇이 잘 움직이고 사실적으로 움직이는지 확인한다. 7.mass, inertia, gazebo tag를 적절히 수정해 더 사실적인 움직임을 만든다.================================================================
이번에 진짜 많이 배웠다.
+)2023.6.30
학기 중에는 전공 공부에 집중하느라 못했고, 여름 방학 때는 갑작스럽게 인턴을 하게 되어 4족 보행 연구를 못할 것 같습니다. 4족 보행 로봇은 추후 시간이 생기면 재개하겠습니다.
========================================================================
정확한 정보 전달보단 공부 겸 기록에 초점을 둔 글입니다.
틀린 내용이 있을 수 있습니다.
틀린 내용이나 다른 문제가 있으면 댓글에 남겨주시면 감사하겠습니다. : )
========================================================================
'개인 프로젝트' 카테고리의 다른 글
2023-1 4족보행 로봇(Quadruped robot) 만들기 #10 (Inverse Kinemtics & 간단한 제어 코드 작성) (0) | 2023.10.17 |
---|---|
2023-1 4족보행 로봇(Quadruped robot) 만들기 #9 (urdf 제작 및 rviz, gazebo 3) (0) | 2023.10.04 |
2023-1 4족보행 로봇(Quadruped robot) 만들기 #7 (urdf 제작 및 rviz, gazebo 1) (0) | 2023.04.09 |
2023-1 4족보행 로봇(Quadruped robot) 만들기 #6 (몸통 설계, Prototype 모델링 완성) (0) | 2023.03.22 |
2023-1 4족보행 로봇(Quadruped robot) 만들기 #5 (다리 설계 3) (0) | 2023.03.09 |