so100arm rviz 욱 - dingdongdengdong/astra_ws GitHub Wiki
기존 로봇 팔을 lerobot project의 so100-arm으로 교체하기 위해 astra_ws
내에서 수정해야 할 코드에 대해 상세히 안내해 드리겠습니다. 제공해주신 astra_ws
의 구조를 분석한 결과, 해당 시스템은 ROS2를 기반으로 하며 MoveIt!을 이용한 모션 플래닝, 그리고 각 하드웨어(양팔, 리프트, 그리퍼 등)에 대한 커스텀 Python 컨트롤러 노드를 사용하는 것으로 파악됩니다.
so100-arm을 통합하기 위해서는 주로 로봇 모델 정의, MoveIt! 설정, 그리고 하드웨어 인터페이스 계층의 수정이 필요합니다.
로봇의 기구학적 구조, 관절 정보, 시각 및 충돌 모델 등을 정의하는 패키지입니다.
-
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! 설정 및 하드웨어 컨트롤러와 일관되게 유지되어야 합니다.
-
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.yaml
및config/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
: 위와 유사하게 로봇 이름 참조 및 필요한 설정 파일 로딩 경로를 확인해야 합니다.
-
-
이 패키지는 실제 로봇 하드웨어와 통신하고, 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! (또는 다른 상위 제어기)의 명령을 드라이버가 이해하는 형태로 변환하여 전달하는 역할을 할 수 있습니다.
-
LeRobot 직접 사용: LeRobot 프로젝트는 Feetech 모터를 포함한 로봇 제어 인터페이스를 제공합니다. 이 경우
-
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 솔버를 사용하게 됩니다.
- 로봇 모델 게시 (
만약 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