Guides(으)로 돌아가기

ROS2 및 MoveIt2 로봇 팔 통합: 실용적인 가이드

ROS2 및 MoveIt2 <unk> URDF 설정, ros2_control, 운동 계획 및 텔레오퍼레이션 세로 모드와 로봇 팔을 통합하는 방법

[← 가이드]

ROS2 Humble와 MoveIt2를 사용하여 팔 통합을 위한 단계별 가습기 URDF 저작을 통해 실시간 카르테시아 세로 제어.

전제 조건

이 가이드 는 Ubuntu 22.04 LTSROS2 Humble Hawksbill (EOL 2027 년 5 월), Python 3.10, 그리고 MoveIt2 바이너리 버전 를 **Humble 를 대상으로 한다. 다음 작업을 하기 전에 전체 데스크톱 스택을 설치 하십시오:

  • **ROS2 T1
  • MoveIt2: T2 는 Moveit_core, Moveit_ros_planning, Moveit_ros_move_group, 그리고 모든 플러그인을 끌어내죠.
  • ros2_control: T3 하드웨어 추상화에서 필수
  • ** 파이썬 패키지:** T4 교과서 단편에서 사용되는 운동적 유틸리티에 대한
  • 콜콘: T5

환경 확인: T6는 오류가 없어야 합니다. 단일 기계에서 "네트워크 구성" 경고를 보시면, 멀티캐스트 문제를 방지하기 위해 T7을 수출하십시오.

URDF 설정

** 통일된 로봇 설명 형식 (URDF) **은 팔의 운동학, 역학 및 하드웨어 인터페이스에 대한 유일한 진실의 원천입니다. 잘 작성된 URDF는 대부분의 계획 실패를 예방합니다.

공동 한계는 먼저 올바른 것 이다. 부드러운 한계 (기획을 위해 MoveIt2에서 사용) 는 하드 한계 내에서 5° (비상 중지 위해 펌웨어에서 사용) 이어야 한다. 당신의 팔의 J2 하드웨어 한계 범위는 -120°에서 +120°까지라면, URDF T8T9 (라디언에서 ±120°) 를 설정하고, T10에서 MoveIt2공동 한계 제한을 ±117°로 설정한다.

역사전제는 일반적으로 잘못된 것이며 불안정한 시뮬레이션 역학을 유발한다. 반경 _r_와 길이가 _L_의 실린더로 추정되는 질량 _m_의 연결은 T11, T12, T13을 사용한다. 비사각형 용어는 대칭 연결에 대해 0이다. 잘못된 관동 (예를 들어, 모든 0 또는 위치지수 값) 은 가제보 물리학이 폭발하게 될 것이며 MoveIt2의 충돌 검사기가 예측할 수 없는 행동을 할 수 있습니다.

** 시각적 대 충돌 기하학:** 시각적 태그에 고 폴리 매쉬 (DAE/OBJ) 를 사용하며 충돌 태그에 단순화된 구상 껍데기 매쉬를 사용한다. MoveIt2의 FCL 충돌 검사기는 충돌 기하학에 비해 계획 시점에 실행된다.

ros2_control 하드웨어 인터페이스 태그는 URDF의 T15 요소 안에 표시되어야 합니다. 이 태그는 하드웨어 드라이버의 제어 인터페이스 유형과 플러그인 클래스를 선언합니다.

  • ** 하드웨어 플러그인:** 드라이버에 설정, 예를 들어 [OpenArm]T60) 팔에 T16.
  • ** 명령 인터페이스:** 위치 제어용으로 T17을 선언하고, 운전자가 지원하는 경우 T18T19을 선언합니다.
  • ** 상태 인터페이스:** 항상 T20T21를 선언합니다. 하드웨어가 토크 피드백을 제공하면 T22를 추가합니다.
  • param tag: 하드웨어 요소 내부의 파라마 태그를 통해 하드웨어 특정 매개 변수를 (예를 들어, 일련 포트, 보드 속도, 로봇 IP) 통과하십시오.

MoveIt2 핵심 개념

계획 코드를 한 줄을 작성하기 전에 이 네 가지 개념을 이해하면 몇 시간 동안 디버깅을 할 수 있습니다.

MoveGroup는 고급 계획 인터페이스입니다. 그것은 계획 파이프라인, 계획 장면, 실행 관리자를 포괄합니다. 당신은 T23 C++ 클래스 또는 T24 파이썬 랩퍼를 통해 상호 작용합니다. MoveGroup은 SRDF에 이름 붙인 그룹을 위해 정의됩니다 (예를 들어 "팔", "잡기") 그리고 모든 계획 요청에 대한 입구점으로 작용합니다.

** 계획 파이프라인**는 선택적 사전/ 후처리 어댑터로 플러그인을 연결합니다. MoveIt2는 작업에 따라 세 개의 플러너 백백을 선별합니다:

Planner Best For Limitations
OMPL (default) General-purpose, cluttered environments, no dynamics needed Non-deterministic; replanning may give different paths
CHOMP Smooth, gradient-optimized trajectories Can get stuck in local minima; slow in tight spaces
PILZ Industrial Motion Planner Deterministic LIN/PTP/CIRC industrial moves No obstacle avoidance; requires clear workspace

** 계획 장면**은 환경의 생중계 3D 표현입니다. 그것은 URDF에서 시작되며 T25을 통해 충돌 객체 (박스, 구구, 망) 로 추가되어 실행 시간에 업데이트됩니다. 항상 무지의 객체를 중심으로 계획하기 전에 테이블, 고정 및 알려진 장애물을 현장에 추가하십시오.

** 제한 계획:** MoveIt2는 경로 제한 (예를 들어, 운동 내내 최종 효과자를 똑바로 유지), 관절 제한, 위치 제한 및 방향 제한을 지원합니다. 제한은 T26에서 지정되어 있습니다. OMPL의 제한 인식 계획에는 T27 플러그인이 필요합니다. 간단한 방향 유지 (예를 들어, 이동 중 지갑 수준을 유지) 위해, 진출 및 굴곡 축을 둘러싼 용납 ±10°의 방향 제한이 안정적으로 작동합니다.

운동 계획 교과서

이 4단계 작업 흐름은 새로운 터미널에서 충돌 검증된 카르테시아 경로를 실행하는 데까지 데려갑니다.

** 단계 1 데모를 시작하세요:** T28는 Panda 데모 팔로 rviz2를 생성합니다. 시작 파일을 자신의 팔의 MoveIt2 구성 패키지로 교환합니다.

** 단계 2 계획 장면 설정:** T29T30T29 메시지를 게시하십시오. 올바른 자세에서 작업 테이블을 나타내는 상자를 추가하십시오. 계속하기 전에 rviz2의 "계획 장면" 디스플레이에서 표시되는 것을 확인하십시오.

** 3 단계 카르테스 경로를 계획하십시오:** T31을 사용하여 T32는 최종 효과자 이동의 센티미터당 하나의 경로점을 의미합니다. 1.0의 반환 값은 경로의 100%가 계산되었습니다. 0.9 이하의 값은 일반적으로 경로의 중간에서 공동 한계 또는 충돌이 발생한 것을 의미합니다.

** 4 단계 충돌 확인을 실행:** 궤도를 통과하는 궤도 실행 관리자를 호출하는 T33. 관리자는 구성된 주파수 (일반적으로 250500 Hz) 에서 로스2_컨트롤에 공동 명령을 스트리밍합니다. 모니터링 된 계획 장면에서 실행 중에 충돌이 감지되면 (T34 장면 업데이트 스트림을 필요로합니다), MoveIt2는 궤도를 중단합니다.

텔레오퍼레이션 세보 모드

moveit_servo는 재계획 없이 실시간 카르테시아 속도 조절을 가능하게 한다. **100 Hz까지의 T35 메시지를 받아내며, 공동의 제한과 독자성 피를 적용하여 요청된 최종 효과자 속도를 추적하는 공동 속도 명령을 지속적으로 생성한다.

팔에 대한 서보 모드를 시작하려면 YAML 서버 구성으로 서보 노드를 시작 파일에 추가하십시오. 주요 매개 변수는:

  • move_group_name: Servo 에 대한 계획 그룹은 SRDF 그룹 이름과 일치해야 합니다.
  • 카르테시아어 명령어: 기본 T36. 여기 50100Hz에서 T37을 게시하십시오.
  • joint_command_out_topic: 출력 T38 로스2_컨트롤로 전송된다.
  • ** incoming_command_timeout:** 0.1s로 설정합니다. 이 창 내에서 명령이 수신되지 않으면, servo는 팔을 중지합니다.
  • 하단_상수성_상수 / 하드_스톱_상수성_상수: 17 및 30 (상수상수) 로 설정한다. 팔은 단수성 가까이에 서서 멈추게 된다.

[텔레오퍼레이션 데이터 수집] (T61) 에서 입력 장치 (VR 컨트롤러, 스페이스마우스, 또는 장갑) 에서 얻은 트윈트 명령어를 일관된 100 Hz에서 게시하십시오. 명령 주파수에서 치는 속도 불순속을 유발하여 시범 품질을 떨어뜨립니다.

흔히 발생하는 문제 와 해결 방법

  • ** 컨트롤러 타이밍 / "궤도 포인트는 엄격히 증가하지 않는다":** 위치 제어 된 팔에 대한 하드웨어 인터페이스의 T39 (T40이 아닌) 를 구현하는지 확인하십시오. 속도 인터페이스에는 USB 기반의 팔이 보장할 수 없는 정확한 타이밍이 필요합니다.
  • ** 계획 중 공동 한계 위반:** T41에 5° (0.0873 rad) 안전 지위를 T42T43를 하드 한계 내에서 설정하여 적용하십시오. 이것은 계획자가 하드웨어의 한계 스위치를 실행 중간에 유발하는 궤도를 생성하는 것을 방지합니다.
  • ** 시뮬레이션에서의 불안정한 역학:** 잘못된 URDF 관동값은 가장 흔한 원인입니다. 각 링크의 관동성을 T44로 확인하고 rqt 로봇 설명 시청기에서 관동성을 검사하십시오.
  • MoveGroup 연결이 실패: 이동_그룹 노드가 실행되고 있는지 확인하고 RMW (전설 사이클론 DDS) 는 다른 노드와 동일한 도메인 ID를 가지고 있는지 확인합니다. T46을 일관되게 설정합니다.
  • **Servo는 T47를 사용하는 ROS2 타이머를 사용해서 T48를 사용하는 대신 T47를 사용해서 T48를 사용해서 T48를 사용해서 T48를 사용해서 T48를 사용해서 T47를 사용해서 T48를 사용해서 T48를 사용해서 T48를 사용해서 T48를 사용해서 T48를 사용해서 T48를 사용해서 T48를 사용해서 T48를 사용해서 T48를 사용해서 T48를 사용해서 T48를 사용해서 T48를 사용해서 T48를 사용해서 T48를 사용해서 T48를 사용해서 T48를 사용해서 T48를 사용해서 T48를 사용해서 T48를 사용해서 T48를 사용해서 T48를 사용해서

주요 패키지 참조

Package Purpose Install
moveit_servo Real-time Cartesian servo / teleop Included in ros-humble-moveit
moveit_planners_ompl OMPL sampling-based planners Included in ros-humble-moveit
moveit_visual_tools rviz2 debugging markers and trajectory visualization ros-humble-moveit-visual-tools
joint_state_broadcaster Broadcasts /joint_states from ros2_control ros-humble-ros2-controllers
robot_state_publisher Publishes TF tree from URDF + joint states ros-humble-robot-state-publisher
moveit_ros_perception OctoMap integration for 3D obstacle avoidance Included in ros-humble-moveit

OpenArm 1 MoveIt2 구성

OpenArm 1 은 미리 구축된 MoveIt2 구성을 가지고 있지만 구조를 이해하는 것은 작업에 맞게 사용자 정의 할 때 도움이 됩니다.

  • URDF/XACRO: T49는 6개의 리볼트 관절 + 1개의 프리즘 관절을 정의합니다. 관절 제한은 하드웨어 제한 내에서 5도로 설정됩니다.
  • SRDF: T50는 "팔" 계획 그룹 (관절 1-6) 과 "잡기" 그룹 (잡기 관절) 을 정의한다. 두 개의 이름의 자세는 "집" (모든 0) 과 "자동" (관절은 [0, -0.5, 0.7, 0, 0.8, 0] rad).
  • joint_limits.yaml: 텔레오퍼레이션 때 안전성 위해 1.0 rad/s로 설정된 속도 제한. 2.0 rad/s^2로 가속 제한. 테스트 후 보다 빠른 자율적인 움직임을 위해 조정한다.
  • kinematics.yaml: KDL 풀기 기본: IK가 싱글리티 근처에 있는 작업에 대해서는 T51: T52로 전환하고 kinematics.yaml를 업데이트하십시오.

파이썬 이동그룹 인터페이스 예제

MoveIt2 파이썬 API를 사용하여 선택 및 장소 순서를 계획하고 실행하는 완전한 파이썬 예제:

#!/usr/bin/env python3
"""MoveIt2 pick-and-place example for OpenArm 1."""
import rclpy
from rclpy.node import Node
from moveit2 import MoveIt2
from geometry_msgs.msg import PoseStamped
import numpy as np

class PickPlace(Node):
    def __init__(self):
        super().__init__("pick_place")
        self.moveit2 = MoveIt2(
            node=self,
            joint_names=[f"joint_{i}" for i in range(1, 7)],
            base_link_name="base_link",
            end_effector_name="gripper_link",
            group_name="arm",
        )
        # Wait for MoveIt2 to be ready
        self.moveit2.wait_for_execution(timeout=10.0)

    def execute(self):
        # 1. Move to ready pose
        self.moveit2.move_to_configuration(
            [0.0, -0.5, 0.7, 0.0, 0.8, 0.0]
        )
        self.moveit2.wait_for_execution()

        # 2. Move to pick pose (Cartesian)
        pick_pose = PoseStamped()
        pick_pose.header.frame_id = "base_link"
        pick_pose.pose.position.x = 0.3
        pick_pose.pose.position.y = 0.0
        pick_pose.pose.position.z = 0.05
        pick_pose.pose.orientation.w = 1.0
        self.moveit2.move_to_pose(pick_pose)
        self.moveit2.wait_for_execution()

        # 3. Close gripper
        self.moveit2.move_to_configuration(
            joint_positions=[0.0],  # closed
            joint_names=["gripper_joint"],
            group_name="gripper",
        )
        self.moveit2.wait_for_execution()

        # 4. Move to place pose
        place_pose = PoseStamped()
        place_pose.header.frame_id = "base_link"
        place_pose.pose.position.x = 0.3
        place_pose.pose.position.y = -0.2
        place_pose.pose.position.z = 0.1
        place_pose.pose.orientation.w = 1.0
        self.moveit2.move_to_pose(place_pose)
        self.moveit2.wait_for_execution()

        # 5. Open gripper
        self.moveit2.move_to_configuration(
            joint_positions=[0.04],  # open
            joint_names=["gripper_joint"],
            group_name="gripper",
        )
        self.moveit2.wait_for_execution()

def main():
    rclpy.init()
    node = PickPlace()
    node.execute()
    rclpy.shutdown()

if __name__ == "__main__":
    main()

카르테시아 경로 계획: 상세한 작업 흐름

카르테시아 경로는 최종 효과자가 3D 공간 (물어 지는, 도는, 삽입) 에서 특정 궤도를 따라야 하는 작업에 필수적이다.

  • 차로점 거리: T53 (1cm 사이로) 를 설정하여 부드러운 움직임을 할 수 있습니다. 더 큰 단계 (5cm) 는 각에서 이 움직이는 움직임을 만들어냅니다. 더 작은 단계 (<5mm) 는 눈에 띄는 개선 없이 계획 시간을 증가시킵니다.
  • 뛰기 문턱: T54를 설정하여 점스 디테터를 비활성화 (대부분의 작업에 권장된다). 0이 아닌 문턱은 관절의 경로점 사이의 문턱을 넘어 이동하는 경우 계획에 방해를 줍니다. 이는 IK의 중단성을 감지하지만 관절 경계에 가까운 유효한 경로를 거부합니다.
  • ** 분자 확인:** T55은 요청된 경로의 얼마나 달성 가능한지 나타내는 분자 (0.0-1.0) 를 반환합니다. 분자 <0.95이면 경로는 합동 한계 또는 충돌 경계를 통과할 가능성이 있습니다. 접근 방향을 조정하거나 방향 제한을 완화하십시오.
  • ** 카르테스 운동 중 방향 제한:** 붓거나 삽입하는 등의 작업에 있어서, 지탱기 수준을 유지하기 위해 방향 제한을 추가하십시오. 지향 용납도를 지각 및 굴곡 축을 중심으로 +/-10도로 설정하여, 360도 자유로써 을 설정하십시오.

충돌 검증: 계획 현장에 객체를 추가

MoveIt2는 알고 있는 객체에 충돌하는 것을 피합니다. 계획하기 전에 항상 작업 공간 객체를 추가합니다.

  • ** 테이블 표면:** 테이블과 맞먹는 크기가 있는 원시 상자를 추가하여 올바른 높이로 배치합니다. 이것은 가장 흔하게 실종되는 충돌 객체이며 팔 테이블 충돌을 유발합니다.
  • ** 카메라 마운팅:** 상장 및 옆 카메라 마운팅에 단순화된 상자 모양을 추가합니다. 이 부분은 팔이 카메라에 닿을 때까지 잊혀집니다.
  • ** 첨부된 물체:** 지갑이 물체를 잡을 때 T56을 사용하여 최종 효과자 링크에 붙여 놓습니다. 이것은 계획자가 잡힌 물체를 환경과 충돌하는 경로를 생성하는 것을 방지합니다. 배치할 때 분리하십시오.
  • OctoMap (동적 장애물): 이동 장애물 있는 환경에서는 깊이 카메라의 포인트 클라우드를 MoveIt2의 OctoMap 통합에 공급하십시오. MoveIt2는 3D 점유율 지도를 만들고 그 주위에 계획을 세웁니다. 세부 사항과 계획 속도를 잘 균형 잡기 위해 T57을 사용하여 T58 (2cm 록셀) 를 설정합니다.

관련 가이드

RCSV와 작업

RCSV는 우리가 판매하고 서비스하는 모든 팔 플랫폼에 ROS2 및 MoveIt2 통합 지원을 제공합니다.

  • OpenArm 리소스 -- 오픈소스 URDF, MoveIt2 구성 및 OpenArm 1 로스2_컨트롤 드라이버
  • 하드웨어 스토어 -- 미리 구성된 ROS2 드라이버로 OpenArm 1 (4,500 달러) 를 구입합니다
  • 정비 및 유지보수 -- ROS2 통합 서비스, 운전자 개발 및 캘리브레이션
  • 데이터 플랫폼 -- MoveIt2 서버 모드에서 수집된 텔레오퍼레이션 데이터를 업로드
  • [우리와 연락하세요] T72) -- 당신의 팔 플랫폼에 대한 ROS2 통합 지원 요청

건축 을 시작 하기 위해 준비 되었습니까?

ROS2와 MoveIt2 통합을 위해 설계된 오픈소스 로봇 팔을 탐험하세요. 미리 구축된 URDF, MoveIt2 구성 및 ros2_control 드라이버를 사용합니다.

[OpenArm Resources]