so100arm rviz 욱 - dingdongdengdong/astra_ws GitHub Wiki

astra_ws 코드 수정 가이드: so100-arm 통합

기존 로봇 팔을 lerobot project의 so100-arm으로 교체하기 위해 astra_ws 내에서 수정해야 할 코드에 대해 상세히 안내해 드리겠습니다. 제공해주신 astra_ws의 구조를 분석한 결과, 해당 시스템은 ROS2를 기반으로 하며 MoveIt!을 이용한 모션 플래닝, 그리고 각 하드웨어(양팔, 리프트, 그리퍼 등)에 대한 커스텀 Python 컨트롤러 노드를 사용하는 것으로 파악됩니다.

so100-arm을 통합하기 위해서는 주로 로봇 모델 정의, MoveIt! 설정, 그리고 하드웨어 인터페이스 계층의 수정이 필요합니다.

1. 로봇 기술(Description) 패키지 수정: astra_description

로봇의 기구학적 구조, 관절 정보, 시각 및 충돌 모델 등을 정의하는 패키지입니다.

  • URDF (Unified Robot Description Format) 또는 XACRO 교체/수정:

    • 현재 모델 위치 파악: astra_controller/launch/start.launch.py 파일에서 astra_description 패키지의 publish_model.launch.py를 포함하여 로봇 모델을 게시하고 있습니다. astra_description 패키지 내의 (urdf/ 또는 meshes/ 폴더 등) 기존 로봇 팔의 URDF 또는 XACRO 파일을 찾아야 합니다.
    • so100-arm 모델 통합: 이 파일을 so100-arm의 URDF/XACRO로 교체하거나, 기존 전체 로봇 모델 파일 내에서 해당 팔 부분만 so100-arm의 정의로 수정해야 합니다. so100-arm용 모델 파일은 [SO-100 Robot Arm ROS2 Package](https://github.com/brukg/SO-100-arm) 또는 직접 보유하신 모델을 사용하십시오.
    • 메시 파일: URDF/XACRO에서 참조하는 3D 모델(STL, DAE 등) 파일 경로도 so100-arm의 것으로 변경해야 합니다. astra_description/meshes/ 폴더 등에 새로운 메시 파일을 복사하고 URDF/XACRO에서 이 경로를 참조하도록 수정합니다.
  • 관절 이름 및 설정 파일 수정:

    • astra_description/config/joint_names_astra_description.yaml: 이 파일에는 컨트롤러에서 사용하는 관절 이름들이 정의되어 있습니다 (joint_r1 부터 joint_r7r/l, joint_l1 부터 joint_l7r/l 등). so100-arm의 실제 관절 이름 (일반적으로 6 DOF 암 + 1 DOF 그리퍼)으로 이 목록을 업데이트해야 합니다. 이 이름들은 MoveIt! 설정 및 하드웨어 컨트롤러와 일관되게 유지되어야 합니다.

2. MoveIt! 설정 패키지 수정: astra_moveit_config

MoveIt!은 모션 플래닝, 순/역기구학, 충돌 검사 등을 수행합니다. 로봇 모델이 변경되면 MoveIt! 설정도 반드시 업데이트되어야 합니다.

  • MoveIt! Setup Assistant 재실행 (권장): 가장 확실하고 오류를 줄이는 방법은 새로운 so100-arm URDF/XACRO를 사용하여 MoveIt! Setup Assistant를 실행하고 astra_moveit_config 패키지를 재생성하거나 새로운 이름으로 설정 패키지를 생성하는 것입니다. 이를 통해 새로운 로봇 모델에 맞는 SRDF, IKfast/KDL 설정, 관절 제한, 플래닝 그룹 등이 자동으로 생성됩니다.
  • 수동 업데이트 시 주요 파일: MoveIt! Setup Assistant를 사용하지 않고 수동으로 수정할 경우 다음 파일들을 확인하고 수정해야 합니다.
    • config/kinematics.yaml: 새로운 팔의 플래닝 그룹 이름(예: so100_arm), 베이스 링크, 툴 링크 등을 명시하고, 사용하려는 기구학 솔버 플러그인 및 파라미터를 so100-arm에 맞게 수정해야 합니다. 기존에 right_arm에 대해 설정된 부분을 새로운 팔에 맞게 변경합니다.
    • config/joint_limits.yaml: so100-arm 각 관절의 실제 위치, 속도, 가속도 제한 값으로 업데이트해야 합니다. 정확한 물리적 제한 값을 설정하는 것이 안전한 작동과 성능에 중요합니다.
    • config/moveit_controllers.yamlconfig/ros2_controllers.yaml: MoveIt!이 모션 실행을 위해 통신할 컨트롤러를 정의합니다. so100-arm의 관절 이름들과 하드웨어 인터페이스에서 제공할 컨트롤러 이름(예: so100_arm_controller)으로 수정해야 합니다. FollowJointTrajectory 액션 인터페이스를 사용하는 컨트롤러를 사용한다면, MoveIt! 설정 파일에 해당 액션 서버 이름을 정확히 명시해야 합니다.
    • SRDF (Semantic Robot Description Format) 파일 (config/<robot_name>.srdf): 일반적으로 config/ 폴더 내에 astra_description.srdf와 같은 이름으로 존재합니다. 이 파일은 플래닝 그룹, 엔드 이펙터 정의, 기본 자세, 충돌 무시 쌍 등을 정의하므로, so100-arm의 구조와 필요에 맞게 완전히 새로 생성되거나 대폭 수정되어야 합니다 (MoveIt! Setup Assistant가 대부분의 작업을 처리해 줍니다).
    • Launch 파일들 (launch/*.launch.py):
      • launch/rsp.launch.py: MoveItConfigsBuilder에서 참조하는 로봇 이름("astra_description") 및 URDF/XACRO 파일 경로가 새 모델에 맞는지 확인합니다.
      • launch/move_group.launch.py: 위와 유사하게 로봇 이름 참조 및 필요한 설정 파일 로딩 경로를 확인해야 합니다.

3. 하드웨어 컨트롤러 패키지 수정: astra_controller

이 패키지는 실제 로봇 하드웨어와 통신하고, ROS2의 상위 명령을 하드웨어 명령으로 변환하는 역할을 합니다. so100-arm은 Feetech 서보 모터를 사용하므로, 이 부분이 크게 변경될 가능성이 높습니다.

  • astra_controller/arm_controller.py:

    • 현재 이 파일은 특정 시리얼 프로토콜(COMM_HEAD = 0x5A)을 사용하여 로봇 팔과 직접 통신하는 로직을 포함하고 있습니다.
    • 수정 옵션 1: 기존 코드 수정: so100-arm의 Feetech 서보 모터 통신 프로토콜에 맞게 시리얼 명령 전송, 데이터 파싱, 단위 변환(to_si_unit, to_raw_unit 함수 등) 로직을 전면적으로 수정해야 합니다. Feetech 서보 모터의 통신 프로토콜 문서를 참고하십시오.
    • 수정 옵션 2: LeRobot 라이브러리 또는 Feetech ROS2 드라이버 활용 (권장):
      • LeRobot 직접 사용: LeRobot 프로젝트는 Feetech 모터를 포함한 로봇 제어 인터페이스를 제공합니다. 이 경우 arm_controller.py의 로직 대신 LeRobot의 기능을 사용하여 arm_node.py가 LeRobot API를 호출하도록 변경할 수 있습니다. non_ros_src/lerobot/ 폴더 내의 예제 (예: examples/10_use_so100.md, scripts/control_robot.py)를 참고하십시오. 이 방법은 LeRobot의 다른 기능(데이터 수집 등)과 통합하기 용이합니다.
      • Feetech ROS2 드라이버 사용: 만약 so100-arm 또는 Feetech 서보를 위한 범용 ROS2 하드웨어 인터페이스 패키지가 있다면 (예: [SO-100 Robot Arm ROS2 Package](https://github.com/brukg/SO-100-arm) 내 또는 커뮤니티 제공), 해당 드라이버를 사용하고 arm_node.py가 이 표준 ROS2 인터페이스(토픽, 액션 등)와 통신하도록 수정하는 것이 더 안정적이고 표준화된 접근 방식입니다. arm_node.py는 해당 드라이버 노드를 실행하고, MoveIt! (또는 다른 상위 제어기)의 명령을 드라이버가 이해하는 형태로 변환하여 전달하는 역할을 할 수 있습니다.
  • astra_controller/arm_node.py:

    • device 파라미터: so100-arm에 연결된 Feetech 서보 모터 통신을 위한 실제 시리얼 포트 (예: /dev/ttyUSB0 또는 /dev/ttyACM0)로 변경해야 합니다.
    • joint_names, gripper_joint_names 파라미터: 새로운 URDF 및 MoveIt! 설정에 정의된 so100-arm의 관절 이름과 정확히 일치시켜야 합니다.
    • 만약 arm_controller.py의 로직 대신 새로운 드라이버나 LeRobot API를 사용한다면, ArmController 클래스를 인스턴스화하고 사용하는 부분, 그리고 MoveIt! 등으로부터의 명령을 처리하는 콜백 함수 로직이 변경됩니다. 이 노드는 MoveIt!의 FollowJointTrajectory 액션 서버 인터페이스를 구현하도록 수정될 가능성이 높습니다.
  • astra_controller/launch/start.launch.py:

    • 로봇 모델 게시 (publish_model.launch.py 포함) 부분이 새로운 astra_description 패키지 또는 수정된 URDF/XACRO 파일을 제대로 참조하는지 확인합니다.
    • 교체하려는 팔(왼쪽/오른쪽)에 해당하는 arm_node 노드의 파라미터(device, joint_names 등)를 수정합니다.
    • 만약 새로운 하드웨어 인터페이스 노드를 사용한다면, 기존 arm_node 대신 새 노드를 실행하도록 변경하고 필요한 파라미터를 설정합니다.
    • ik_node: 만약 이것이 MoveIt!의 기구학 솔버와 별개로 사용되는 커스텀 IK 솔버라면 so100-arm의 기구학에 맞게 수정해야 합니다. 일반적으로는 MoveIt!에 포함된 IK 솔버를 사용하게 됩니다.

4. LeRobot 프로젝트 통합 (선택 사항)

만약 lerobot project의 AI 기반 제어(모방 학습, 강화 학습 등) 기능을 활용하고자 한다면, 추가적인 통합 작업이 필요합니다.

  • lerobot PyTorch 라이브러리를 설치합니다.
  • lerobot에서 제공하는 데이터 수집, 정책 학습 및 로봇 제어 도구를 활용합니다. 이는 기존 astra_controller의 일부 기능이나 MoveIt! 기반 제어 방식을 대체하거나 보완할 수 있습니다.
  • astra_ws 내의 non_ros_src/lerobot 폴더에 포함된 LeRobot 관련 코드 및 문서가 유용한 참고 자료가 될 것입니다. arm_node.py 또는 별도의 ROS 노드에서 LeRobot 라이브러리를 호출하여 로봇을 제어하는 방식을 구현할 수 있습니다.

일반적인 조언

  • 단계적 접근: 한 번에 모든 것을 바꾸려 하기보다는, 로봇 모델 게시(Rviz에서 새 팔이 제대로 보이는지 확인)부터 시작하여 MoveIt! 설정(Setup Assistant 사용 권장), 하드웨어 인터페이스(Feetech 서보에 명령을 보내고 상태를 읽을 수 있는지 테스트) 순으로 단계적으로 진행하고 각 단계마다 테스트하는 것이 좋습니다.
  • 버전 관리: Git과 같은 버전 관리 시스템을 사용하여 변경 사항을 추적하고 문제가 발생했을 때 이전 상태로 쉽게 돌아갈 수 있도록 하십시오.
  • 문서화 참고: so100-arm 및 LeRobot 프로젝트의 공식 문서, GitHub 저장소의 이슈 및 토론 내용을 적극적으로 참고하십시오. 특히 Feetech 서보의 통신 프로토콜에 대한 정확한 정보가 필요합니다.
  • 단일 팔 우선 테스트: 양팔 시스템인 경우, 먼저 하나의 팔(예: 오른쪽 팔)만 so100-arm으로 교체하여 성공적으로 통합한 후, 다른 팔에 동일한 변경 사항을 적용하는 것이 문제를 단순화하고 디버깅 시간을 줄이는 데 도움이 될 수 있습니다.
  • ROS2 툴 활용: rviz2, ros2 topic echo, ros2 node info, ros2 param dump 등 ROS2 기본 툴을 활용하여 각 노드가 예상대로 작동하고 데이터를 주고받는지 확인하십시오.
  • 오류 메시지 분석: 컴파일 또는 런타임 오류 메시지를 주의 깊게 읽고 분석하여 문제의 원인을 파악하십시오. ROS 관련 오류는 구글 검색을 통해 해결 방법을 찾는 경우가 많습니다.
graph TD
    %% 전체 그래프 방향 설정 (Set overall graph direction)
    direction TB

    %% 시작 및 하드웨어 준비 (Start and Hardware Preparation)
    A[시작: 로봇 팔 교체 결정] --> B[1. so100-arm 하드웨어 준비]

    %% 팔 선택 (Arm Selection)
    B --> C{기존 팔이 양팔 중 하나인가?}
    C -->|"예"| D[교체할 팔 결정 - 예: 오른쪽 팔]
    C -->|"아니오 - 단일 팔"| D

    %% URDF 수정 서브그래프 (URDF Modification Subgraph)
    subgraph "로봇 기술 패키지 수정 (astra_description)"
        direction TB
        D --> E[2. URDF 패키지 수정]
        E --> E1[2.1. 기존 URDF 백업]
        E1 --> E2[2.2. so100-arm URDF, XACRO 준비]
        E2 --> E3[2.3. URDF 파일 교체 또는 수정]
        E3 --> E4[2.4. so100-arm 메시 경로 업데이트]
        E4 --> E5[2.5. joint_names.yaml 관절 이름 수정]
    end

    %% MoveIt! 설정 서브그래프 (MoveIt! Configuration Subgraph)
    subgraph "MoveIt! 설정 수정 (astra_moveit_config)"
        direction TB
        E5 --> F[3. MoveIt! 설정 수정]
        F --> F1[3.1. MoveIt! 설정 도구 실행]
        F1 --> G
        F1 --> F2[3.2. 기존 설정 수동 수정]
        F2 --> F3[3.2.1. kinematics.yaml 수정 - 플래닝, 솔버]
        F3 --> F4[3.2.2. joint_limits.yaml 수정 - 관절 제한]
        F4 --> F5[3.2.3. moveit_controllers.yaml 수정 - 컨트롤러, 관절]
        F5 --> F6[3.2.4. ros2_controllers.yaml 수정 - 컨트롤러, 인터페이스]
        F6 --> F7[3.2.5. SRDF 파일 수정 - 플래닝 그룹, 엔드 이펙터]
        F7 --> F8[3.2.6. MoveIt! Launch 파일 검토, 수정]
        F8 --> G
    end

    %% 컨트롤러 수정 서브그래프 (Controller Modification Subgraph)
    subgraph "하드웨어 컨트롤러 수정 (astra_controller)"
        direction TB
        G --> G1{어떤 제어 방식 선택?}
        G1 -->|"LeRobot 사용"| G2a[4.1a. LeRobot 라이브러리 설치, 설정]
        G2a --> G3a[4.2a. arm_node.py 수정 - LeRobot API 호출]
        G3a --> G4
        G1 -->|"ROS2 Control + 새 드라이버"| G2b[4.1b. Feetech 서보 드라이버 준비]
        G2b --> G3b[4.2b. arm_node.py 수정 - 새 드라이버 통신]
        G3b --> G4
        G1 -->|"기존 arm_controller 수정"| G2c[4.1c. arm_controller.py 수정 - Feetech 프로토콜]
        G2c --> G4
        G4 --> G5[4.3. arm_node.py 관절 이름 파라미터 수정]
    end

    %% 시스템 테스트 서브그래프 (System Testing Subgraph)
    subgraph "시스템 통합 및 테스트"
        direction TB
        G5 --> H[5. 시스템 통합, 테스트]
        H --> H1[5.1. start.launch.py 수정 - arm_node 설정]
        H1 --> H2[5.2. RViz 로봇 모델 시각화 확인]
        H2 --> H3[5.3. MoveIt! 플래닝, 실행 테스트 - 시뮬레이션, 실제]
        H3 --> H4[5.4. 저수준 제어 테스트 - 관절, 그리퍼]
        H4 --> I[완료]
    end

    %% 스타일링 (Styling)
    classDef start_end fill:#F9E1E1,stroke:#D32F2F,stroke-width:2px
    classDef process fill:#D6EAF8,stroke:#2E86C1,stroke-width:2px
    classDef decision fill:#FFF9C4,stroke:#FBC02D,stroke-width:2px

    class A,I start_end
    class B,D,E,E1,E2,E3,E4,E5,F,F1,F2,F3,F4,F5,F6,F7,F8,G,G2a,G2b,G2c,G3a,G3b,G4,G5,H,H1,H2,H3,H4 process
    class C,G1 decision
Loading
⚠️ **GitHub.com Fallback** ⚠️