Nero 로봇팔 joint_limits 수정 안전성 및 ROS 2 Control 지원 문의

안녕하세요, Nero 로봇팔을 구매하여 개발 진행 중인 사용자입니다.

현재 제공해주신 오픈소스 라이브러리와 패키지를 활용해 제어 환경을 구축하던 중, 몇 가지 의문점이 생겨 Discussion을 통해 문의드립니다.

1. joint_limits 수동 수정 시 펌웨어 영향 및 안전성 여부

제공해주신 URDF 파일과 pyAgxArm 라이브러리를 사용해 아래와 같이 설정 값을 가져오고 있습니다.

cfg = create_agx_arm_config(robot=ArmModel.NERO, firmware_version=NeroFW.V111)

하지만 이 cfg를 통해 획득한 joint_limits와 URDF에 명시된 관절 가동 범위가, 실제 로봇팔이 물리적으로 움직일 수 있는 범위보다 다소 좁게 설정되어 있음을 확인했습니다. 이로 인해 티칭, 리더모드 등을 통해 수동으로 팔을 움직여 놓은 특정 자세가, MoveIt 상에서는 범위를 벗어나 동작 불가능으로 판정되는 현상이 발생하고 있습니다.

이를 해결하기 위해 URDF 파일의 limit 속성을 수정하고, 파이썬 내부에서 cfg 변수(Dict 타입)의 joint_limits 값을 직접 변경하여 가동 범위를 넓히려고 합니다.

질문: 소프트웨어 단(URDF, pyAgxArm dict)에서 limit 값을 확장할 경우, 펌웨어 단에서 자체적으로 걸려 있는 제한과 충돌하거나 시스템에 무리를 줄 수 있는지 궁금합니다. (단순히 가동 범위만 늘어나는 유효한 변경인지, 혹은 펌웨어 단의 캘리브레이션이나 제어 로직에 문제를 유발할 소지가 있는지 답변 부탁드립니다.)

2. ROS 2 Control (Hardware Interface) 지원 여부

현재 패키지 구조를 분석한 결과, 공식 ros2_control을 사용하지 않고 pyAgxArm 라이브러리를 사용하는 agx_arm_ctrl_single_node.py 형태의 독자적인 노드로 하드웨어를 제어하고 있는 것으로 파악했습니다.

질문: 현재 Nero 로봇팔을 위해 공식적으로 지원되는 ros2_control 하드웨어 인터페이스 패키지가 존재하는지 궁금합니다.

3. 영점(Homing) 설정 방법 및 오작동 확인

nero_api.md 문서 상에서는 자동 영점 세팅(Auto Homing) 방법을 명확히 찾기 어려워 질문드립니다.

질문: 라이브러리 내부적으로 자동 영점 세팅을 수행하는 명령어가 따로 존재하나요? 또한, 자동 영점 구동 시 Joint 6이 한쪽 방향으로 확 꺾였다가 돌아오는 현상이 발생하는데, 이것이 정상 시퀀스인지 아니면 오작동인지 확인 부탁드립니다. (영상)

질문: 수동 영점 세팅 시 Joint 1은 물리적 노치(Notch)가 있어 기준을 잡기 수월했으나, Joint 2, 4, 6, 7은 기준 마크를 찾기 어렵습니다. 이 관절들은 외관상 무엇을 기준으로 정렬 상태를 맞춰야 하는지 가이드 부탁드립니다.

안녕하세요. 문의하신 내용에 대해 답변드립니다.

1. joint_limits 수동 수정 시 펌웨어 영향 및 안전성 여부

말씀해 주신 URDF와 실제 관절 가동 범위 간의 차이는 하드웨어 보호를 위한 의도적인 안전 설정(Safety Margin)입니다. URDF의 제한값과 실제 물리적 한계값을 완전히 동일하게 설정할 경우, 제어 과정에서 미세한 오버슈트(Overshooting)가 발생했을 때 하드웨어 한계를 초과하여 에러(Joint Disable 등)나 예기치 못한 정지가 발생할 위험이 있습니다. 매뉴얼에 명시된 가동 범위 내에서 소프트웨어 limit을 확장하는 것은 가능하나, 시스템의 안정성을 위해 물리적 한계점 대비 약 2~5도 정도의 여유(안전 마진)를 남겨둔 상태로 수정하여 테스트해 보시기를 권장합니다.

2. ROS 2 Control (Hardware Interface) 지원 여부

확인 결과, 현재 Nero 로봇팔에 대해 공식적으로 지원되는 ros2_control 하드웨어 인터페이스 패키지는 따로 제공되지 않습니다. 파악하신 바와 같이 독자적인 노드를 통한 제어 방식을 사용해 주셔야 하며, 추후 관련 패키지 지원 등 변동 사항이 생기면 다시 안내해 드리겠습니다.

3. 영점(Homing) 설정 방법 및 오작동 확인

자동 영점 세팅(Auto Calibration) 구동 시 Joint 6이 한계값까지 확 꺾였다가 돌아오는 동작은, 관절을 물리적 끝단까지 이동시켜 기준 위치를 찾는 정상적인 영점 탐색 시퀀스입니다. 오작동이 아니니 안심하셔도 됩니다. 또한, 수동 영점 세팅 시 마크가 없는 Joint 2, 4, 6, 7의 정확한 정렬 기준에 대해서는 현재 제조사 측에 가이드를 문의해 둔 상태입니다. 제조사로부터 답변을 받는 대로 신속히 추가 안내해 드리겠습니다.

감사합니다.

2개의 좋아요

답변 감사합니다. 진행하면서 질문사항이 추가로 더 생겼습니다.

4. Payload 설정 API 지원 여부

동사(또는 동일 제조사)의 Piper 로봇팔 패키지에는 엔드이펙터 무게를 설정하는 set_payload API가 존재하는 반면, Nero 패키지에는 해당 API가 보이지 않습니다. 코드 구조상 CAN 프레임을 직접 전송하는 방식 등으로 호출은 가능해 보입니다.

질문: Nero 로봇팔의 펌웨어 단에서 set_payload 관련 기능(CAN 명령어)을 현재 수용하고 처리할 수 있는지 궁금합니다. 또한 그런 경우

5. MIT 제어를 위한 정확한 물성치(Inertia/Mass) 데이터 요청

현재 제공된 URDF 상의 물성치(질량, 관성 모멘트 등)는 외장 케이스(stl) 기준으로만 작성되어 있고, 내부 모터 및 주요 하드웨어의 무게가 제대로 반영되지 않은 것으로 보입니다(무게를 바탕으로 추정하였습니다). MIT 제어 모드를 활용해 피드포워드 토크를 계산하려면 실제 로봇팔의 정밀한 물성 데이터가 필요할것 같아 이를 요청하고자 합니다.

질문: 현재 제공되는 URDF 내 물성치에 모터 무게가 이미 포함되어 있는 것인지 궁금합니다. 만약 포함되어 있지 않다면, 내부 모터 무게와 하우징 무게가 모두 올바르게 반영된 정확한 물성치 데이터(또는 업데이트된 URDF 파일)를 제공받을 수 있는지 답변 부탁드립니다.

6. 비상정지(EMERGENCY_STOP) 해제 방법 및 상태 전이 가이드 요청

electronic_emergency_stop() 호출로 인해 EMERGENCY_STOP 상태가 되었을 때, clear_joint_error()로는 해제되지 않으며, reset()을 실행하면 해제는 되지만 모터의 토크가 순간적으로 풀려 로봇팔이 아래로 주저앉는 위험한 현상이 발생합니다.

(비상정지 외에도 MIT제어를 테스트하다가 JOINT_BRAKE_NOT_RELEASED상태가 되었는데 이 역시 clear_joint_error()로는 해소되지 않았습니다)

질문: 모터 토크를 유지하면서(로봇팔이 주저앉지 않도록) EMERGENCY_STOP 상태만 안전하게 클리어할 수 있는 별도의 API나 방법이 존재하나요?

질문: 현재 nero_api.md 문서에는 상태 종류만 나열되어 있고 각 상태 간의 전이 조건이 명시되어 있지 않습니다. 어떤 상태에서 어떤 명령어를 호출해야 안전하게 다른 상태로 전이(해소)되는지 정리된 '상태 전이 테이블(State Transition Table)'이나 가이드를 제공받을 수 있는지 답변 부탁드립니다.

7. 충돌 시 순응 모드 구현 사례 및 MIT 피드포워드 토크 획득 방법

로봇팔이 장애물과 충돌했을 때 순응 모드(혹은 중력보상모드)로 전환되는 기능을 Nero 암으로 구현하고자 합니다.

질문: Nero 로봇팔을 활용해 충돌 감지를 구현한 기존 사례나 참고할 만한 샘플 코드가 있는지 공유를 부탁드립니다.

질문: 순응 모드를 위해 MIT 제어 모드 적용 시, 사용자가 직접 계산하는 방식 외에 현재 포즈에 맞는 피드포워드 토크(중력 보상 토크 등) 입력 값을 획득할 수 있는 방법이 제공되는지 궁금합니다.

안녕하세요. 추가로 문의 주신 사항들에 대해 순서대로 답변드립니다.

4.Payload 설정 API 지원 여부

Nero 로봇팔의 payload 설정은 현재 웹 제어 UI의 설정 메뉴를 통해 지원되고 있습니다. pyAgxArm SDK 및 CAN 프레임을 통한 직접 API 호출 방식으로의 payload 설정은 현재 공식적으로 지원되지 않으며, SDK 소스 코드 상에도 해당 기능이 구현되어 있지 않음을 확인하였습니다.

5.MIT 제어를 위한 정확한 물성치 데이터

현재 제공되는 URDF의 물성치(질량, 관성 모멘트)는 외장 케이스 형상 기준으로 작성된 것으로, 내부 모터 무게가 정확히 반영되어 있지 않습니다. 제조사에서는 내부 모터의 상세 스펙 및 물성 데이터를 외부에 공개하지 않는 정책을 취하고 있어, 모터 무게가 올바르게 반영된 업데이트 URDF 파일의 제공은 현재 어려운 상황입니다. 양해 부탁드립니다.

6.비상정지(EMERGENCY_STOP) 해제 방법 및 상태 전이 가이드

Nero 암의 모터에는 물리적인 브레이크 기구가 별도로 존재하지 않습니다. 이로 인해 EMERGENCY_STOP 상태는 소프트웨어 API 수준에서만 구현되며, 토크를 유지한 채로 에러 상태만 선택적으로 클리어하는 별도의 API는 현재 제공되지 않습니다. JOINT_BRAKE_NOT_RELEASED 상태 역시 동일하게 물리적 브레이크 기구 부재로 인한 상태이며, clear_joint_error()로는 해소되지 않고 reset()을 통해서만 복구됩니다.

7.충돌 시 순응 모드 구현 및 피드포워드 토크 획득

충돌 감지 기반 순응 모드 구현에는 set_crash_protection_rating API를 통한 Collision Grade 파라미터 설정을 활용하시는 것을 권장드립니다. 조인트별로 0~8 단계의 감도를 설정할 수 있으며, 충돌 이벤트 감지 후 MIT 모드 전환 등의 후속 처리를 연동하여 순응 모드를 구현하실 수 있습니다. 별도의 공식 샘플 코드는 현재 제공되고 있지 않은 점 양해 부탁드립니다.

MIT 제어 모드에서의 피드포워드 토크(중력 보상 토크 등) 값을 SDK 또는 펌웨어 레벨에서 직접 제공하는 API는 현재 지원되지 않습니다. 중력 보상 토크는 URDF 기반의 동역학 라이브러리(예: Pinocchio, KDL 등)를 활용하여 사용자 측에서 직접 계산하시는 방법을 사용하셔야 합니다.

8.수동 영점 세팅

또한 이전에 문의주셨던 "수동 영점 세팅 시 마크가 없는 Joint 2, 4, 6, 7의 정확한 정렬 기준"에 대해 제조사에 문의했고, 제조사에서도 J1을 제외하면 정렬 기준을 육안으로 확인할 수 없으니, 자동 영점 세팅을 사용하는 것을 권장했습니다.

감사합니다.

질문 6번에 각 상태간의 전이 조건이나 어떤 상태가 어떤 것으로 해소되는지에 대한 가이드라인을 제조사 측에 요청할 수 있을까요?

@hanhyo_WeGo

상태 전이 조건 및 해소 조건에 대한 가이드라인 요청이 진행되고 있는지 확인 부탁드립니다.

안녕하세요. 답변이 지연되어 대단히 죄송합니다.

문의하신 ‘상태 전이 테이블 및 해소 조건’ 에 대해 제조사에 확인을 요청하였습니다.

아쉽게도 제조사 측에서는 현재 별도의 상태 전이 테이블 문서는 제공하지 않고 있으며, 비상정지 해제 시 아래와 같은 기본적인 API 호출 순서만을 답변으로 보내왔습니다.

  • 제조사 안내 순서: enable&CAN mode → e-stop mode → standby mode → enable mode → Move P/J/C/L/MIT

원하시는 명확한 가이드를 제공해 드리지 못해 죄송합니다. 추가로 궁금한 점이 있으시면 언제든 말씀해 주시기 바랍니다.

감사합니다.