diff --git a/_posts/2024-06-09-2-ros1-in-m1-mac.md b/_posts/2024-06-09-2-ros1-in-m1-mac.md index d077dec..ea325dd 100644 --- a/_posts/2024-06-09-2-ros1-in-m1-mac.md +++ b/_posts/2024-06-09-2-ros1-in-m1-mac.md @@ -140,6 +140,10 @@ ros-noetic-gazebo-ros ros-noetic-gazebo-ros-control ros-noetic-gazebo-ros-pkgs r ros-noetic-joint-state-publisher ros-noetic-robot-state-publisher ros-noetic-xacro ros-noetic-position-controllers \ compilers cmake pkg-config make ninja colcon-common-extensions catkin_tools ros-noetic-simulators ``` +추가로 다음과 같은 명령으로 dependancy를 자동설치할 수도 있다. +``` +rosdep install --from-paths src --ignore-src -r -y +``` 7. if < eigen3.4 error 아래와 같은 convert 오류가 뜬다. g++이 c++11 라이브러리 문제인 줄 알았다. diff --git a/_posts/2024-06-21-gazebo-urdf-xacro.md b/_posts/2024-06-21-gazebo-urdf-xacro.md index 79a8d6d..559b3e6 100644 --- a/_posts/2024-06-21-gazebo-urdf-xacro.md +++ b/_posts/2024-06-21-gazebo-urdf-xacro.md @@ -12,8 +12,11 @@ math: true 본 post는 aidin_arm package를 이용할 때, gazebo simulator상에 load된 모델을 제어하는데 필요한 제반사항을 이해하기 위해 작성되었다. #### gazebo classic -[gazebo tutorial](https://classic.gazebosim.org/tutorials) -[gazebo classic source](https://github.com/gazebosim/gazebo-classic) +[gz classic tutorial1](https://wiki.ros.org/simulator_gazebo/Tutorials) +[gz classic tutorial2](https://classic.gazebosim.org/tutorials) +[gz classic tutorial source](https://github.com/ros-simulation/gazebo_ros_pkgs) +[gz classic source](https://github.com/gazebosim/gazebo-classic) +[gz model plugin](https://classic.gazebosim.org/tutorials?tut=plugins_model) gazebo는 3D dynamic simulator이다. 주로 ROS와 함께 사용된다. @@ -30,7 +33,7 @@ gazebo는 3D dynamic simulator이다. - Logging and playback #### 현재 gazebo(이전엔 ignition) -[gazebo source](https://github.com/gazebosim) +[gz ignition source](https://github.com/gazebosim) Ignition 시뮬레이터는 gazebo를 기반으로 한 시뮬레이션 프레임워크이다. gazebo의 차세대 버전이라고 할 수 있다. @@ -46,10 +49,11 @@ gazebo의 차세대 버전이라고 할 수 있다. - SDF(or SDFormat. XML file format이다) file을 사용하여 모델 정의. SDF library는 이 파일을 parse한다. #### .urdf +[urdf_XML_](https://wiki.ros.org/urdf/XML) + URDF는 XML 기반의 파일 형식으로, 로봇 모델의 물리적 구성 요소를 정의하는 데 사용된다. #### .xacro -[urdf_XML_](https://wiki.ros.org/urdf/XML) Xacro는 XML을 확장한 매크로 언어로, 복잡한 URDF 파일을 더 효율적으로 작성하고 관리할 수 있게 해준다. 매크로와 변수, 조건문을 사용하여 URDF 파일의 재사용성과 가독성을 높인다. ros1에서는 재사용성을 높이기위해 urdf에서 확장된 xacro로 모델을 주로 정의한다. @@ -60,208 +64,9 @@ ros1에서는 재사용성을 높이기위해 urdf에서 확장된 xacro로 모 ``` urdf외에 SDF를 사용할 수도 있다. URDF는 Gazebo에 의해 처리되기 전에 먼저 SDFormat으로 변환된다. -gazebo classic은 urdf의 확장으로 SDFormat를 사용할 수 있고, -gazebo ignition은 SDFormat를 모델정의의 기본으로 사용한다. -``` - -#### step1 -> drift issue -[urdf_XML_link](https://wiki.ros.org/urdf/XML/link) -[Using a URDF in Gazebo](https://classic.gazebosim.org/tutorials?tut=ros_urdf&cat=connect_ros) -[SDFormat extensions to URDF (the \ tag)](http://sdformat.org/tutorials?tut=sdformat_urdf_extensions&cat=specification&) -[sdformat specification](http://sdformat.org/spec?ver=1.11&elem=collision#link_collision) - -0. dont_collapse제거 -urdf_XML_link를 참조하면, link 태그의 속성에는 dont_collapse가 없다. -dont_collapse는 issac sim의 urdf에서 사용되는 문법인 것같다. - -before -``` - -``` -dont_collapse를 제거한다. -after -``` - -``` - -1. collision sdf element 문법 -Gazebo에 의해 처리되기 전에, URDF는 SDFormat으로 conversion된다. -따라서 urdf파일은 urdf_XML문법 외에도 sdformat문법을 사용할 수 있다. - -conversion과정에서 issue를 진단하기 위해서 다음과 같은 명령을 사용했다. -``` -# 문제있음 -gz sdf -p aidin8_arm_cover_masszero.xacro -# 문제없음 -gz sdf -p base.world -``` - - - - - - -urdf에서 surface, friction에 대한 ode속성은 변경할 수 있지만, simulation전반에 적용되는 ode자체의 iter속성을 바꿀수는 없는거야? surface, friction에 대한 ode는 어떤 방정식을 풀때의 속성이니? - - - - -before -``` - - - - - - - - - - - - - 1.0 - 1.0 - 0.0002 - - - - - -``` -현재 sdformat element들(contact_cfm, mu->mu1 등)의 사용이 잘못되었다. -다음과 같이 고친다. -after -``` - - - - - - - - - - - - - 0.0002 - - - - - 0.001 - - - 10000.0 - 0.001 - - - - -``` - -``` -개선없음. -lateral friction coef.(mu)가 10000인데도 미끌리는것처럼보이는걸로보아, -RF_foot과 ground_plane의 contact빈도가 매우 높을 것으로 예상된다. -``` -2. inertial에 pose주기 -inertial에 pose를 안주니까 미끄러지는 것을 확인했다.(3_two_link_drift.mov) -aidin8_arm_cover_masszero에도 줬지만 여전히 미끄러진다. - -3. foot의 형상을 sphere -> box -뒤로 미끌리다가 발의 형상때문에 point contact의 방향이 앞이라서 제자리를 유지한다. -하지만 지면과 접촉시 foot에 모멘트가 크게 발생해서 sphere가 아닌 형태의 발은 좋지 않다. -또 foot을 deformable하게 만들면 contact force에 noise가 발생한다. - -4. RF_foot과 ground_plane의 contact빈도확인 -[empty.world](https://github.com/arpg/Gazebo/blob/master/worlds/empty.world) -[ground_plane](https://github.com/arpg/Gazebo/blob/master/models/ground_plane/model.sdf) -[contact manager API](https://osrf-distributions.s3.amazonaws.com/gazebo/api/2.0.0/classgazebo_1_1physics_1_1ContactManager.html) -[gazebo_all Physics Engines and physics parameter](https://classic.gazebosim.org/tutorials?tut=physics_params&cat=physics#Contactparameters) -[sdformat extension to URDF](http://sdformat.org/tutorials?tut=sdformat_urdf_extensions&cat=specification&) -[URDF tag in Gazebo](https://classic.gazebosim.org/tutorials?tut=ros_urdf&cat=connect_ros) - -gazebo_physics parameter 링크를 참고하면 알겠지만, gazebo_physics parameter를 world파일에서 정의하는거나 urdf파일에 sdf element를 사용하는거나 같다. - -``` -std::cout << "# of contact: " << contactManager->GetContactCount() << std::endl; -``` -RF_foot의 컨택을 확인하고 싶은데, RF_foot은 커녕 위 명령의 결과가 0이 나와서 -contact중인 모델이 아예 없다는 이상한 결론이 나왔다. --> gz client에서 view-contact을 선택하면 contact정보를 다음의 명령으로 확인할 수 있다. - -``` -gz topic -l -gz topic -e {ex. /gazebo/default/box/link/my_contact} -``` - -또 이건 내가 contactManager api를 이용해서 debug용으로 출력함. -``` -# of contact: 1 -RB_knee -# of contact: 4 -RF_knee -RB_knee -LF_knee -LB_knee -# of contact: 1 -RB_knee -# of contact: 3 -``` - -gz client에서 시각적으로 보이고, debug 출력에서 볼 수 있듯이, contact point가 변동되고 있다(flickering contact point). - -5. flickering contact point -[flickering contact point](https://github.com/osrf/collision-benchmark/issues/6) -[유사한사례](https://robotics.stackexchange.com/questions/111332/issues-with-legs-vibrating-and-contact-flickering-in-gazebo-ros-noeitc) - -``` -하지만 이것은 drift와 상관이 있는 것 같지는 않다. -``` - -6. gz client 비정상종료 이슈 - -``` -[INFO] [1720161662.229288, 0.000000]: temporary hack to **fix** the -J joint position option (issue #93), sleeping for 1 second to avoid race condition. -``` -ps aux로 확인중에 왜인지모르게 해결되었다. - -7. foot에 대한 최대 contact parameter찾기 -``` - - 5.0 - 5.0 - 01e-4 - 0.0002 - - - +gz classic/ignition에서 urdf/sdf를 사용할 수 있고, urdf에서 gazebo tag내에서 sdf태그를 사용할 수 있지만, 모든 sdf태그가 지원되는 것은 아니다. ``` -``` -gz client-physics-gravity를 -9.81 -> -3까지 줄여봤는데 drift는 무게랑 상관없음을 알 수 있었다. -``` - -#### 물리엔진 관련 이슈 -1. Step 1. Start initializing encoder에서 제자리에 서기 -max_step_size를 "0.001->0.0005"로 변경하니, -제자리에 설때 "빠르게 발구르기 -> 안정적으로서기" 로 변했다. - - -2. sdf: physics-ode-solver-sor -sor: Set the successive over-relaxation parameter. -Successive Over-Relaxation method(연속과이완기법)에 사용되는 parameter이다. -솔버의 수렴 속도를 조절하는 데 사용되며, 1보다 크거나 같아야한다. - -3. contact_surface_layer -Description: The depth of the surface layer around all geometry objects. Contacts are allowed to sink into the surface layer up to the given depth before coming to rest. The default value is zero. Increasing this to some small value (e.g. 0.001) **can help prevent jittering problems** due to contacts being repeatedly made and broken. -0.001 -> 0.0001 : 시작하자마자 과도한 컨택때문에 로봇이 날라간다. - - - - #### .launch [roslaunch](https://wiki.ros.org/roslaunch) [roslaunch/XML](https://wiki.ros.org/roslaunch/XML) @@ -416,7 +221,6 @@ Launch a test node (see rostest). [robot_state_publisher docs](https://wiki.ros.org/robot_state_publisher) 이 패키지는 joint_states 토픽을 subscribe하여 TF frame정보로 변환하고 tf2_ros package에 전달한다. - #### tf package [TF docs](https://wiki.ros.org/tf2) 로봇 시스템은 일반적으로 world frame, base frame, gripper frame 등과 같이 시간에 따라 변하는 3D coordinate frame들을 갖는다. @@ -440,12 +244,7 @@ rosrun tf tf_echo {ref. frame} {target frame} ``` #### gazebo_ros package -[gazebo_ros_pkgs(of gazebo classic) docs](https://wiki.ros.org/simulator_gazebo/Tutorials) -[gazebo_ros package source code](https://github.com/ros-simulation/gazebo_ros_pkgs/blob/noetic-devel/gazebo_ros) - - node: spawn_robot -[spawn_model source code](https://github.com/ros-simulation/gazebo_ros_pkgs/blob/noetic-devel/gazebo_ros/scripts/spawn_model) - Gazebo 시뮬레이션 환경에 로봇 모델을 spawn하는 데 사용되는 노드이다. -unpause: 모델이 스폰된 후 시뮬레이션을 즉시 재개한다. -J: revolute joint의 초기값(radian)을 설정한다. @@ -461,136 +260,7 @@ output="screen"/> ``` #### ros control scheme(gazebo_ros_control pkg, controller manager pkg) -[controller_manager docs](https://wiki.ros.org/controller_manager) -[ros control docs_1](https://wiki.ros.org/ros_control) -[ros control docs_2](https://classic.gazebosim.org/tutorials?tut=ros_control) -[ex.rrbot roscontrol](https://github.com/ros-simulation/gazebo_ros_demos) - -![ros control overview](/assets/img/개념/2024-06-21-gazebo-urdf-xacro/ros%20control%20overview.png){: width="200"} -![ros control overview2](/assets/img/개념/2024-06-21-gazebo-urdf-xacro/ros%20control%20overview_2.png){: width="200"} - -``` -gazebo_ros_control pkg를 통해, gazebo에서 robot의 controllers를 simulating할 수 있다. -위 그림은 simulation, hardware, controllers and transmissions사이의 관계와, data flow를 나타냈다. -예를들면 다음과 같은 형식이다. -- The contoller manager는 robot's actuator's encoders로부터 joint state data와 set point를 input으로 받는다. -- 이는 hardware_interface::RobotHW instance인 contoller manager에 ~ 으로 정의된 transmission을 통해 이루어진다. -- PID같은 포괄적인 control loop feedback mechanism을 사용하여 control한다. -- controller의 output은 다시 contoller manager를 통해 actuator로 전달된다. - -gazebo_ros_control pkg는 controller manager, Gazebo plugin adapter, libgazebo_ros_control.dylib등을 포함한다. -``` - -0. gazebo_ros_control pkg -gazebo_ros_control pkg의 일부인 libgazebo_ros_control.dylib은 gazebo classic을 설치할 때 함께 설치된다. -controller manager pkg를 포함하고 있다. - -gazebo_ros_control pkg을 사용하려면 다음 두가지를 수행해야한다. - -0.1. gazebo_ros pkg 정의 -다음과 같이 gazebo_ros pkg에 정의된 gazebo ros control 플러그인을 load한다. -ex. -``` - -``` -0.2. libgazebo_ros_control.dylib 로드 -다음과 같이 urdf/xacro에서 libgazebo_ros_control 동적라이브러리(gazebo에서 plugin이라고 부름)를 load한다. -ex. -``` - - - - /aidin81 - gazebo_ros_control/DefaultRobotHWSim - - -``` - -1. controller manager -``` -hardware_interface::RobotHW instance로 표현되는, robot mechanism을 control하기위한 hard-realtime-compatible loop를 제공한다. -이는 simulator(ex. gazebo), planner(ex. moveIt)를 위한 ROS interface이다. -구체적으로는 controller를 load, unload, start, stop하기위한 infrastructure를 제공한다. -rqt 플러그인인 rqt_controller_manager로 컨트롤러를 그래픽으로 load, unload, start, stop할 수 있을 뿐만 아니라, load된 컨트롤러에 대한 정보를 표시할 수 있다. -controller manager packge를 실행하려면 다음과 같이 launch파일에서 controller_manager pkg에 포함된 controller_spawner node를 정의한다. -``` -ex. -if you just want to load the controller, but not start it yet: -``` - - - -``` - -2. plugin: JointStateController, JointEffortController -``` -controller manager의 관리를 받는 ros_controllers에 포함된 -controller plugin(gazebo에서 공유라이브러리를 plugin이라고 부름)이다. -``` - -2.1. JointStateController -``` -hardware_interface::JointStateInterface에 register된 모든 resource들의 state를 -sensor_msgs/JointState 타입의 topic으로 publish한다. -``` -2.2. JointEffortController -``` -desired effort(force/torque)를 Hardware Interface에 Command한다. -effort input을 받고 effort output을 보낸다. 단지 forward_command_controller의 input으로 전달한다. -``` -2.3. hardware_interface::RobotHW(ex. hardware_interface::EffortJointInterface) -``` -실제 로봇의 드라이버에 joint limit, effort transmission, (forward) state transmission등의 명령에 관련된 데이터를 읽고 쓰기 위해서는, hardware_interface::RobotHW를 상속받거나 controler manager에 새로운 hardware_interface를 정의해야한다. -Hardware Interface의 구현체는 기본적으로 read(), write(), init() 메소드를 구현하여 드라이버에 데이터를 읽고 쓰는 과정을 정의한다. -hardware_interface를 상속받는 구현체가 로봇 제조사나 커뮤니티에서 패키지로 제공되는 경우(ex. ur_modern_driver) 그걸 사용해야하고, 없으면 정의해야한다. -``` -2.4. example - -``` -// .launch - -``` - -controller를 사용하려면, 다음과 같이 ros parameter server에 load할 controller 설정을 정의해야한다. -``` -// aidinarm_control.yaml -joint_state_controller: - type: joint_state_controller/JointStateController - publish_rate: 1000 # 50 - -joint1_effort_controller: - type: effort_controllers/JointEffortController - joint: arm_joint1 - pid: {p: 100.0, i: 0.01, d: 10.0} -``` -이를 launch에서 Load한다. -``` - -``` - -``` -parameter file내에 보이는 joint1_effort_controller 필드는 -controller_manager에 인자로 전달된 controller name이다. -type은 effort_controllers plugin에 미리 정의된, namespace인 effort_controllers과 매크로변수 JointEffortController(HW interface를 값으로 가짐)이다. -즉, type을 통해 controller manager에 정의된 HW interface를 결정한다. -pid는 plugin에 전달되는 pid gain이 명시된 인자이다. -``` - +[노션 참고](https://eorms6199.notion.site/issue-aidin8-standing-mode-drift-fc0e8123bc6945ea8974a58e87fafb62) #### joy package [joy docs](https://wiki.ros.org/joy) @@ -598,7 +268,9 @@ pid는 plugin에 전달되는 pid gain이 명시된 인자이다. #### gazebo client(GUI) [OBB와 AABB](https://handhp1.tistory.com/6) UI상의 왼쪽 패널의 model들을 눌렀을 때 model주변에 나타나는 흰색 wireframe box는 AABB(Axis-Aligned Bounding Box)이다. -AABB는 3D world에서 교차검사(충돌검출이나 타격판정등을 위한) bounding box이다. urdf에서 정의하는 collision 영역이랑은 무관하다. +AABB는 3D world에서 교차검사(충돌검출이나 타격판정등을 위한) bounding box이다. +물리엔진으로 충돌 감지 알고리즘을 돌리는 것과 별개로, 충돌지점을 빠르게 파악하기 위해 AABB를 사용한다. +urdf에서 정의하는 collision 영역이랑은 무관하다. 박스를 이루는 면의 노말 벡터들이 곧 X Y Z축과 일치한다. #### .world 모델을 추가하고, 센서, 조명, 지형 등의 환경을 정의하는데 사용된다.