본문 바로가기

팀 프로젝트

C-2345 자세 제어 4족보행 로봇 #14 (Joint publish node 제작, URDF Gazebo에 올리기-정리X)

반응형

+) 원래 글을 쓸 때 이론 공부> 실습> 복습+글쓰기로 블로그에 글을 올렸는데 이번은 실습과정에서 너무 헤매고 여러 시도를 해서 도저히 깔끔하게 복습을 하는 게 불가능했다. 그래서 우선 정리 없이 막 떠오르는 정보들을 적어두고 나중에 익숙해지면 처음부터 깔끔하게 정리하려고 한다.

 

 

이 글은 '막 쓴 블로그 형식의 글 > 과정에서 생겼었던 문제 해결 과정' 순으로 작성한다.

 

 

 

 

 

 

 

 

이후 패키지 쓰는게 달라질 수도 있지만 일단은 내가 현재까지 배운 범위에서는 가상의 로봇을 제어할 때 Joint_state_publisher와 robot_state_publisher를 사용해야 한다.

 

rviz의 urdf모델을 움직일 때 rqt_graph

 

robot_state_publisher야 상관없지만 joint 제어를 위한 joint_state_publisher는 한계가 있는 데 바로 gui의 slide bar로 밖에 각도를 제어할 수 없다는 것이다.

 

 

우리가 계산한 값을 그대로 넣기에는 불편하고 나중에 IMU와의 센싱 값을 토대로 계산한 값을 넣는 것도 지금의 joint_state_publisher node로는 불가능하다.

 

 

우리는 터미널에 우리가 list나 tuple (python기준)으로 각도 값을 직접 입력해서 움직이게 하는 node가 필요하다.

 

 

다행히 그렇게 어려운 것 같아 보이지는 않고 나도 충분히 만들 수 있는 수준인 것 같아 바로 시도해보았다.

 

 

https://answers.ros.org/question/213075/publish-joint_state-with-python-to-rviz/

 

Publish Joint_State with Python to RVIZ - ROS Answers: Open Source Q&A Forum

Publish Joint_State with Python to RVIZ edit I have a robot that I built in URDF that I am visualizing in RVIZ. I can control the joints using the gui tool or a rostopic pub command, but I am unable to build a publisher node to interface with the rviz visu

answers.ros.org

아예 처음부터 만들까도 했지만 검색하니 ros커뮤니티에 간단한 예시가 있어서 이걸 기반으로 살짝만 건드려봤다.

 

 

#!/usr/bin/env python3

import rospy
from sensor_msgs.msg import JointState
from std_msgs.msg import Header

def talker():
    pub = rospy.Publisher('joint_states', JointState, queue_size=10)
    rospy.init_node('quadruped_joint_publisher')
    rate = rospy.Rate(10) # 10hz
    joint_str = JointState()
    joint_str.header = Header()
    joint_str.header.stamp = rospy.Time.now()
    
    joint_str.name = ['shoulder_FL','joint1_FL', 'joint2_FL', 'shoulder_FR', 'joint1_FR', 'joint2_FR', 'shoulder_BL', 'joint1_BL', 'joint2_BL', 'shoulder_BR', 'joint1_BR', 'joint2_BR']
    #joint를 Foward, Back, Left, Right의 shoulder, 1, 2로 분류, 2로 갈수록 지면에 가까운 joint (총 3X4개)
    
    joint_str.position = [1,1,1,1,1,1,1,1,1,1,1,1] #rad
    joint_str.velocity = []
    joint_str.effort = []
    pub.publish(joint_str)
    rate.sleep()

    while not rospy.is_shutdown():
      joint_str.header.stamp = rospy.Time.now()
      pub.publish(joint_str)
      rate.sleep()

 

 


if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException:
        pass

 

 

 

+) 2022.06.08 : 파이썬 중급과정을 끝낸 상태에서 코드를 보니 공부할 때 당시보다 더 보이고 이해되는 게 많다. ㅎ

 

 

 

 

 

 

 

 

gazebo에서 URDF 움직이기

우선 URDF/Tutorial의 step5 'Using URDF in GAZEBO'를 공부했는데 이 Tutorial을 하면서 처음으로 오류도 많이 나고 잘 되지 않았다.

 

 

https://cafe.naver.com/openrt/21101

 

[ROS Projects] - My Robotic Manipulator - #Part 4 - ROS + URDF/Transmission + Gazebo Controllers(번역)

[ROS Projects] - My Robotic Manipulator - #Part 4 - ROS + URDF/Transmission + Gazebo Controllers ...

cafe.naver.com

그래서 오로카에서 검색을 하다가 딱 내가 원하는 부분을 알려주는 글이 있어서 이 글을 바탕으로 공부를 했다.

 

+) 원래는 이 글을 따라간 것을 올리려고 했는데 중간에 오류 때문에 많이 헤매고 여러 사이트를 돌아다녔던지라 정리해서 글을 쓰기가 상당히 어려워졌다. 그래서 저 글을 기반으로 내가 찾은 정보를 덧붙이는 방식으로 글을 올린다.

 

 

 

 

1. urdf.xacro 고치기

우선 quadruped.urdf.xacro에 link의 <collision>, <inertial> tag와 joint의 <limit> tag를 추가해줬다.

 

 

본격적으로 Gazebo에서 시뮬레이션하기 위해 충돌, 무게, 관성, 각도 범위 등의 정보를 간단하게 추가해준 것이다.

link의 무게, 관성 정보를 갖는 <inertial> tag
joint의 각도 범위, 속도, 힘? 을 포함하는 <limit> tag

<inertial> tag는 inventor에서 똑같은 link의 모델을 만들고 iproperties에서 질량과 관성을 확인하는 방법으로 추가해줬다.

 

다리의 iproperties

material은 3d 프린터의 재료인 ABS plastic으로 했다. (원래는 PLA를 쓰는데 안 보여서 ABS로 했다.)

 

 

단위가 urdf에선 무게 : kg, 관성 : kg*m^2인 것만 주의해서 넣으면 된다.

 

 

joint의 <limit> tag는 revolute joint 기준으로 velocity : 회전 속도(rad/s), effort : 최대토크(N*m), lower/upper : 최소/최대 각도(rad)를 넣어주면 된다.

 

 

Gazebo에서 일단은 움직이게 하는 게 목적이므로 임의로 대충 값을 넣어줬다.

 

 

 

 

 

 

2. Moveit으로 Gazebo용 파일 만들기

+)표 박사님의 ROS강의에서 내가 배운 것은 Gazebo는 URDF가 아니라 SRDF 파일을 쓴다는 거 였는데 참고한 글에서는 바로 URDF를 올렸다. 이 부분에 관해선 나중에 다시 알아봐야겠다.

(SRDF가 아닌 URDF를 올렸을 때의 차이, SRDF를 올리는 방법 등)

 

 

전에 들었던 표박사님의 ROS강의에서 Moveit을 이용하면 .urdf를 다양한 확장자로 바꿀 수 있고 여러 가지 파일들을 자동으로 만들어 준다는 내용이 기억나서 완성된 urdf.xacro를 moveit에서 실행시켜봤다.

URDF(또는 xacro)에 문제가 없다면 이렇게 moveit으로 불러오기 했을 때 정상적으로 모델이 뜰 것이다.

 

 

moveit 설정은 ROS강의에서 예시로 했던 것과 동일하게 구성했다.

 

 

+)moveit을 다시 만지다 보니 ROS Control 설정을 건들고 만들면 생성 파일에 이 글의 후반부에 작성할 joints.yaml과 정리된 urdf가 나오는 것을 확인했다. 일단은 위 글의 방법에 익숙해진 후 이 방법도 시도해봐야겠다.

 

 

+)이 과정에서 그냥 moveit으로 파일들을 만들면 urdf가 아닌 원래 gazebo에서 쓰는 srdf파일만 만들어진다. 그래서 simulation 메뉴의 generate URDF를 통해 만들어지는 urdf를 복사해서 새로운 urdf를 하나 만들어뒀다. 이는 이 글 후반부에 쓰인다.

 

 

 

 

 

 

3. 올린 모델의 joint가 제 역할을 하게 만들기 

joint가 제 역할을 하게 한다는 게 무슨 말이냐 하면 그냥 link와 joint만의 정보를 가진 urdf(혹은 xacro)를 올리면 joint에 힘이 아예 안 들어가고 그냥 연체동물처럼 흐물거린다고 한다.

 

 

당연히 이 상태로는 joint에 움직이라는 명령을 줄 수 없을뿐더러 가만히 있지도 못한다.

 

 

그래서 joint만 만들어 주는 것 외에도 joint에 transmission과 actuator를 줘야 한다. (moveit으로 urdf를 gazebo용으로 변환하면 자동으로 생성된다.)

 

 

하여튼 위 카페 글대로 했다.

 

 

 

 

애먹은 부분:

1 launch파일에서 ns group으로 모두를 묶어야 했는데 일부만 묶어서 실행 안됐었다.

 

 

2. [WARN] [1498111835.614948, 92.563000]: Controller Spawner couldn't find the expected controller_manager ROS interface.오류

 

sol)

yaml의 문법을 잘 몰랐었다.

'indentation 기반' + ': 뒤에 무조건 한 칸 띄어쓰기해야 함' --> 이거 하니까 이 오류가 없어졌다.

 

https://answers.ros.org/question/360930/error-in-robot-control-gazebo-load_parameters-unable-to-set-parameters-last-param-was-bl_wheel_trans_controllerpidi10-cannot-marshal-none-unless/

 

Error in robot control (gazebo) - load_parameters: unable to set parameters (last param was [/bl_wheel_trans_controller/pid/i=1.

Error in robot control (gazebo) - load_parameters: unable to set parameters (last param was [/bl_wheel_trans_controller/pid/i=1.0]): cannot marshal None unless allow_none is enabled edit Hello, I'm trying to control my robot which is written in xacro file.

answers.ros.org

위 오류도 마찬가지로 yaml 제대로 쓰니까 해결됐다.

 

 

3 moveit으로 만든 gazebo용 urdf에서 마지막 <gazebo> tag의 <namespace> tag를 지워야 한다고 한다.

 

 

4.Joint가 힘이 달리는 건지 뭔지 모르겠는데 자꾸 덜덜 떨린다. ---> 힘을 받는 joint만 그런다. ---> 근데 작동은 잘된다.......

 

sol?)

yaml의 pid부분을 2000 500 100의 높은 값에서 10 이하로 낮추니 크게 줄어듦 > pid도 나중에 공부해야겠다.

 

 

5.(미해결) 얘가 world에서 자세를 바꾸면 계속 미끄러져 감 --> 1. 마찰계수 추가 가능한가?  2. 모델 다듬기(다리) --> 전부 시도해봤는데 고쳐지지 않았다.

 

 

 

 

 

 

 

===============================================================================

정확한 정보 전달보단 공부 겸 기록에 초점을 둔 글입니다.

틀린 내용이 있을 수 있습니다.

틀린 내용이나 다른 문제가 있으면 댓글에 남겨주시면 감사하겠습니다.   : )

===============================================================================

반응형