본문 바로가기

개인 프로젝트

2023-1 4족보행 로봇(Quadruped robot) 만들기 #7 (urdf 제작 및 rviz, gazebo 1)

반응형

※ 글#7, #8, #9는 fusion2urdf를 이용해 로봇을 gazebo에서 시뮬레이션하기 위한 세팅을 하는 과정에서 얻은 지식과 겪은 시행착오를 전부 기록하고 있다.

 
 
 
 
 
완성한 모델을 urdf로 만들기 전에 각 part에 알맞은 inertial값(mass, (mass) moment of inertia)을 설정해 줄 필요가 있었다.
(+글 중간에 과정을 설명할 예정이지만 이번 프로젝트에 한해 이 inertial을 정확하게 넣으려는 과정은 무의미했다...)
 
 
Rviz는 inertial이 없어도 상관없지만 Gazebo는 urdf의 inertial값이 없거나 이상하면 에러가 발생한다.
(+제대로 넣는다고 정상작동하는 것도 아니고 이상하게 넣는다고 무조건 에러가 발생하는 게 아니라는 것을 이번 과정 후반부에 배웠다.)
 
 
인벤터의 경우 각 부품의 Iproperties에서 이를 수정해 줄 수 있다. 

shoulder의 Iproperties

 
하지만 material에 PLA plastic은 없어서(추가할 수는 있지만) 다른 밀도(질량)가 비슷한 물질들로 대체해서 지정했다.
 
 

부품명실제 질량 대체 material모델 질량
프린팅 할 부품들(PLA)x ABSx
배터리 (Turnigy LiFe 2S 1450mAh)84g GFRC82g
DC-DC converter (XL4015)20g ABS24g
Servo controller (PCA9685)5.5g PC/ABS13g
Raspberry Pi 4B+47g Wood(Birch)60g
Motor (MG996R)55g GFRC52g

 
+)필요한 모터 토크의 계산은 끝났고, 엄청 정밀한 시뮬레이션을 하려는 게 아니라서 이런 식으로 대강의 inertial을 주는 것이 문제없다고 판단했다.
 
 
여기까지 하면 각 부품에 대한 설정은 전부 끝났다.
 
 
 
 
 
 
 
이제 urdf를 만들어야 하는데 안타깝게도 현재(2023.04)까지도 인벤터 assembly를 갖고 urdf를 만들어주는 툴이 없었다.
 
 
3D CAD 중에서 exportURDF를 사용할 수 있는 것은 Solidworks와 Fusion360밖에 없었다. 
 
 
나는 Fusion을 다룰 줄 알았기에 Fusion을 이용하기로 했다.
 
 
기본적인 전략은 이렇게 된다.
 
1. 각 part들은 인벤터에서 모델링한 후 Iproperties까지 설정.
2. Fusion에서 각 part들을 assemble.
3. fusion2urdf 스크립트를 이용해 urdf 제작
 
 
 
 
아래는 fusion2urdf 사용법, 주의사항을 정리한 것이다. 
 
https://www.youtube.com/watch?v=e-jlwTEPtIo 

https://www.youtube.com/watch?v=e-jlwTEPtIo

luke ME 님의 영상인데 Fusion2urdf 설치방법과 주의 사항을 한국어로 잘 설명해 주셨다. 여기서 하라는 것과 하지 말라는 것만 지키면 큰 문제는 발생하지 않는다.
 
 
 
https://github.com/syuntoku14/fusion2urdf

GitHub - syuntoku14/fusion2urdf: A Fusion 360 Script to export URDF

A Fusion 360 Script to export URDF. Contribute to syuntoku14/fusion2urdf development by creating an account on GitHub.

github.com

 
fusion2urdf 스크립트 제작자의 github이다. 여기서도 여러 주의사항을 확인할 수 있다.
 
 
 
●내가 겪었던 문제들
1. (github에 설명 O) urdf는 기본적으로 loop kinematics(내 로봇의 경우 다리 4절 링크)를 지원하지 않는다. 그래서 이 부분이 필수적으로 들어가야 하면  mimic joint를 사용해야 한다. 내 경우는 이 부분이 시뮬레이션에서 크게 중요하지 않아서 아예 빼고 urdf를 만드는 방향으로 진행했다.
https://answers.ros.org/question/341365/urdf-attaching-two-joints-to-one-link-for-a-gripper/

URDF, Attaching two joints to one link for a gripper - ROS Answers: Open Source Q&A Forum

URDF, Attaching two joints to one link for a gripper edit HI everyone im trying to make my own gripper , but i had a problem , how can i can attach two joints to the same link? for example LINK "A" attach with link c(green color) and "A" attached with B ,

answers.ros.org

 
+)2023.09.28 추가 : 당시에 urdf를 만들때는 미처 생각하지 못했던 부분이 '다리의 기구학이 달라진다.'는 점이었다. 만약 시뮬레이션으로만 움직이는 것을 구현하고 끝내면 상관이 없었겠지만 나는 gazebo에서 시뮬레이션한 제어 코드를 그대로 로봇에 사용할 예정(물론 약간의 수치 조정은 하지만) 이기에 기구학 문제는 중요해졌다. 그래서 추후 #9글부터 4절 링크 다리를 구현한 urdf로 진행했다. 
 
다행이 urdf로 loop kinematics를 구현하는 법을 '델타 로봇 프로젝트'를 진행하면서 익혔기에 진행할 수 있었다.
https://istein.tistory.com/110

2023-2 델타 로봇(Delta robot) - #4 (URDF 제작 및 Gazebo 1)

나는 gazebo를 이용한 시뮬레이션(굳이 gazebo가 아니라도)은 로봇 제작에 있어서 상당히 중요하다고 생각한다. 그 이유는 아래와 같이 꼽아볼 수 있다. ① 설계, 모델링 과정에서 미처 파악하지 못

istein.tistory.com

 
 

2. fusion에서 joint를 만들면 이름이 'rigid 1', 'revolute 1' 이런 식으로 만들어지는데 보면 _(언더바)가 아니라 빈칸(스페이스)을 포함하고 있다. 이 때문에 fusion2urdf는 오류 없이 작동해도 막상 ros에서 사용하면 에러가 발생한다. 귀찮아도 모든 joint 이름을 스페이스가 없는 것으로 바꿔줘야 한다.

이런식으로 전부 스페이스가 없는 이름으로 바꿔줬다.

 
3. 일반적인 실수는 아닐 거라 생각하는데 urdf를 만든 것을 rviz에서 보여주는 display.launch를 실행시킬 때 roscore가 이미 있는 상태에서 하면 'RobotModel'에서 error - No transform from [ ] to [base_link]가 발생한다. 아래 글의 마지막 댓글에서 이 원인을 찾았다.
 
https://answers.ros.org/question/327828/adding-a-robot-to-rvis-getting-error-no-transform-from-to/

Adding a robot to RVIS, getting error: No transform from [] to [] - ROS Answers: Open Source Q&A Forum

Adding a robot to RVIS, getting error: No transform from [] to [] edit Kinetic, ROS1 I've been through a variety of tutorials on adding a robot to RVIS. I made a simple differential control robot with a camera working nicely in Gazebo. According to the tut

answers.ros.org

 
 
4. joint만들때 rigid는 상관없지만 revolute는 alignment의 Offset을 사용하면 완성된 urdf의 움직임이 이상해진다. Angle은 상관없다.

 
5. fusion2urdf를 사용하고 나면 fusion의 모델에 이상한 component들이 엄청 생겨서 파일이 이상해진다. fusion2urdf를 사용하기 전에 모델을 꼭 저장하고 사용한 후에는 저장하지 말고 꺼야 한다. 안 그러면 귀찮아진다.
 
 

일부 큰 영향을 주지 않는 부품도 생략했다.
 
 

이렇게 완성한 urdf는 50점짜리였다.

 
 
 
 
 
 
우선 rviz에서는 urdf가 정상적으로 작동했다.
 
 
만들어진 패키지에 display.launch를 통해 rviz로 urdf를 불렀다. 
 
+)본래 launch파일은 joint_state_publisher를 사용하지만 나는 joint_state_publisher_gui로 수정해서 joint 조절 바를 같이 실행시켰다.
 

display.launch (수정 버전)

 
 
 
 
 
문제는 gazebo에서 spawn할 때 발생했다.
 

위처럼 모델이 잘 spawn 되었지만 play만 누르면 model의 joint가 끊어져 link들이 origin에 모였다.
 
 
혹시 모델이 시작할 때 ground에 박혀 시작해서 문제가 생기는 건가 싶어서 모델을 살짝 공중에서 떨어뜨리는 방식도 시도해 봤다.

소용없었다. 하지만 얻어낸 정보가 있었다. 10 step 단위로 움직임을 확인하니 모델이 떨어지는 동안은 멀쩡하다가 ground와 닿는 순간 부서졌다.
 

 
여기서부터 구글링으로 유튜브와 ros.org, gazebo 커뮤니티 등을 엄청나게 찾아봤다. 
 
 
거의 3일 정도를 계속 검색하고, 시도하고를 반복했다.
 
 
아래는 내가 중점적으로 참고했던 내 문제와 같은 문제를 겪은 사람들의 글이다.
 
https://answers.gazebosim.org/question/27233/robot-teleporting-to-origin-with-broken-joints/?sort=oldest 

robot teleporting to origin with broken joints - Gazebo: Q&A Forum

robot teleporting to origin with broken joints edit Hi all, From time to time, all the links of my robot teleport to the origin... I have seen the following issue on GitHub, but I don't know if it is related : https://github.com/osrf/gazebo/issues... On my

answers.gazebosim.org

 
https://answers.gazebosim.org//question/4589/robot-exploding-when-touching-other-objects/

Robot exploding when touching other objects - Gazebo: Q&A Forum

Robot exploding when touching other objects edit Hi everyone! I am having problems with my simulation. When my robot tries to move over an object (in this case the parking block) it suddenly explodes (see picture) What am I doing wrong? Thanks in advance E

answers.gazebosim.org

 
https://answers.gazebosim.org//question/4102/my-robot-blows-up-when-i-launch-the-controllers-update-2/

My robot blows up when I launch the controllers [update 2] - Gazebo: Q&A Forum

My robot blows up when I launch the controllers [update 2] edit EDIT2: I have forked the gazebo_ros_demos package to try a velocity control on the rrbot simple robot. Here is the link to my repo: https://github.com/Arn-O/gazeborosdemos.git I have changed s

answers.gazebosim.org

 
https://answers.gazebosim.org//question/12064/model-collapses-when-physics-is-on/

Model collapses when Physics is on - Gazebo: Q&A Forum

Model collapses when Physics is on edit Or see the video how it goes. Model keeps standing when physics is off upon the launch. So I suspect it's related to how either model file handles physics or how the model is spawned may be wrong. I do want to use ph

answers.gazebosim.org

 
 
글에서 알려준 가능성은 1개만 빼고 전부 해봤지만 해결되지 않았다.
 
 
그 1개는 'urdf의 inertia가 잘못되었다.'였는데 이전처럼 내가 직접 urdf를 작성한 게 아니고 fusion2urdf 스크립트를 썼기에 inertia는 문제가 없을 거라고 생각해서 무시했었다.
 
 
하지만 다른 방법으로는 전부 해결되지 않았기에 inertia에 문제가 있다는 가능성을 확인해 보기 시작했다. 
 
 
Inertia에 문제가 있다는 것은 비교적 쉽게 확인할 수 있었다.
 
 
gazebo.launch를 실행한 후 gazebo 상단 메뉴에서 [view] -> [inertias]를 선택하면 모든 link의 inertia를 아래 사진과 같이 보여준다.

이 사진을 전부 해석할 줄은 몰랐지만 한 가지 확실한 것은 tibia의 inertia가 잘못되었다는 것이었다. 다른 link와 달리 분홍색 박스가 생기지도 않았고 초록색 선도 생기지 않았다.
 
 
왜인지는 모르겠지만 fusion2urdf로 만든 urdf의 inertia는 정확하지 않을 수 있다는 결론을 내리고 나는 어쩔 수 없이 inertia를 계산할 다른 방법을 찾기 시작했다.
 
 
 
 
 
 
 
ⓐmeshlab을 이용해 stl의 inertia를 구한 후 mass moment of inertia를 직접 계산한다. (Gazebo 공식 추천 방법) : 
 
이 방법을 위해서는 inertia tensor를 완전히 이해할 필요가 있다고 생각해서 inertia tensor의 diagonal (ixx, iyy, izz) 과 off-diagonal (ixy, iyz, ixz)에 대한 내용을 중심으로 공부를 해봤다. 
 
 
chatGPT한테도 물어보고 roswiki, tutorial 등을 많이 찾아봤지만 완벽하게 이해를 하지 못했다. 특히 off-diagonal 성분을 제대로 이해하지 못했다. 
 
 
다른 해결책을 찾아서 이 부분의 공부는 멈췄지만 추후 완벽하게 이해해야 하는 필요성을 느꼈다. 아래는 내가 참고한 사이트와 chatGPT에게 물어봤던 내용이다.
 
 
http://wiki.ros.org/urdf/Tutorials/Adding%20Physical%20and%20Collision%20Properties%20to%20a%20URDF%20Model

urdf/Tutorials/Adding Physical and Collision Properties to a URDF Model - ROS Wiki

Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags. Adding Physical and Collision Properties to a

wiki.ros.org

 
https://classic.gazebosim.org/tutorials?cat=build_robot&tut=inertia 

Gazebo  : Tutorial : Inertial parameters of triangle meshes

Overview An accurate simulation requires physically plausible inertial parameters: the mass, center of mass location, and the moment of inertia matrix of all links. This tutorial will guide you through the process of obtaining and setting these parameters

classic.gazebosim.org

 
 
 
+)아래 chatGPT와 나눈 대화는 내가 chatGPT를 잘 다루지 못하기에 잘못된 대답이 나왔을 수도 있다.

->이때 당시에는 'urdf의 inertia = 전부 mass moment of inertia'로 알고 있어서 이런 질문을 했다. 일단 GPT답변의 요점은 'diagonal elements는 0이 아니여야 한다.'였다.
 
 

->첫 질문의 확인 사살(?)용 질문
 
 

->그럼 off-diagonal은 0이야만 하는가에는 맞다고 했다.
 
 
여기까지 한 후 내 urdf를 봤는데 inertia의 diagonal이 0.0인 것도 있고 off-diagonal이 0.0이 아닌 것도 보였기에 나는 fusion2urdf로 만든 urdf의 inertia가 완전히 틀렸다고 생각했다.

 
 
하지만 다른 정상작동하는 urdf와, roswiki의 inertia tag의 설명을 보니 위 생각이 틀렸음을 알았다. 
 
 
+이후 추가로 한 대화

 
 
 
 
 
 
 
 
 
 
이 이후 inertia를 이해하고 계산하는 건 '잠시' 포기하고 대신 계산을 해주는 프로그램이 있나 찾아봤다.
 
 
방법 ⓑ는 다음 글에서.....
 
 
 
 
 

========================================================================
정확한 정보 전달보단 공부 겸 기록에 초점을 둔 글입니다.
틀린 내용이 있을 수 있습니다.
틀린 내용이나 다른 문제가 있으면 댓글에 남겨주시면 감사하겠습니다.   : )
========================================================================

반응형