+) 원래 글을 쓸 때 이론 공부> 실습> 복습+글쓰기로 블로그에 글을 올렸는데 이번은 실습과정에서 너무 헤매고 여러 시도를 해서 도저히 깔끔하게 복습을 하는 게 불가능했다. 그래서 우선 정리 없이 막 떠오르는 정보들을 적어두고 나중에 익숙해지면 처음부터 깔끔하게 정리하려고 한다.
이 글은 '막 쓴 블로그 형식의 글 > 과정에서 생겼었던 문제 해결 과정' 순으로 작성한다.
이후 패키지 쓰는게 달라질 수도 있지만 일단은 내가 현재까지 배운 범위에서는 가상의 로봇을 제어할 때 Joint_state_publisher와 robot_state_publisher를 사용해야 한다.
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에서 시뮬레이션하기 위해 충돌, 무게, 관성, 각도 범위 등의 정보를 간단하게 추가해준 것이다.
<inertial> tag는 inventor에서 똑같은 link의 모델을 만들고 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 기반' + ': 뒤에 무조건 한 칸 띄어쓰기해야 함' --> 이거 하니까 이 오류가 없어졌다.
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. 모델 다듬기(다리) --> 전부 시도해봤는데 고쳐지지 않았다.
===============================================================================
정확한 정보 전달보단 공부 겸 기록에 초점을 둔 글입니다.
틀린 내용이 있을 수 있습니다.
틀린 내용이나 다른 문제가 있으면 댓글에 남겨주시면 감사하겠습니다. : )
===============================================================================
'팀 프로젝트' 카테고리의 다른 글
(비공개) C-2345 자세 제어 4족보행 로봇 #16(프로젝트 마무리) (0) | 2021.11.07 |
---|---|
C-2345 자세 제어 4족보행 로봇 #15 (URDF Gazebo, 프로젝트 중단) (0) | 2021.10.31 |
C-2345 자세 제어 4족보행 로봇 #13 (ROS URDF, Xacro Turorial) (0) | 2021.09.06 |
C-2345 자세 제어 4족보행 로봇 #12 (ROS 13강-Manipulation, ROS기초 강의 完) (0) | 2021.09.04 |
C-2345 자세 제어 4족보행 로봇 #11 (ROS 10, 11강-모바일 로봇, SLAM, Navigation) (0) | 2021.08.29 |