새소식

연구 및 프로젝트

로봇 회사 현장실습에서 한 일 🤖

  • -
기간  : 2023년 12월 22일 ~2024년 2월 29일
기업 : F&B 산업을 위한 로봇 팔 제작 회사
한 일 : 로봇 팔의 충돌 추정을 위한 딥러닝 모델 개발
상세 : 외부 센서 없이 조인트 포지션만 이용하여 로봇 팔에 충돌이 있었는지 감지하는 딥러닝 모델을 만들었고, 새롭게 트랜스포머 구조를 적용하였다. 이에 관해 논문 작성 중. 

 

1주차

 
첫 주차에는 MuJoCo 시뮬레이터를 세팅했다. 회사에서 제작한 로봇 팔의 URDF 를 받아와서 Ubuntu 환경에서 RViz 로 우선 생김새를 확인하고, 이를 무조코에서 쓸 수 있도록 MJCF 형태로 변환한 후 무조코 시뮬레이터에서 띄웠다. 
 
또한 무조코 시뮬레이터에서 각 관절 각도를 받아와서 출력하는 코드를 작성했다. 역기구학을 풀 수 있는 패키지인 RBDL-py 를 사용해봤는데, 자코비안 행렬을 정상적으로 구하지 못 했다. 로봇 팔 조인트 포지션을 이용해서 로봇 팔을 제어하는 코드를 작성했다. 
 

 

2주차

 
시뮬레이터 환경을 설정했다. MJCF (xml) 파일을 조정해서 바닥, 벽면, 중력 등을 조정했다.
RBDL-py 는 URDF 파일 포맷만 지원하는데 무조코는 MJCF 파일을 지원하기 때문에 RBDL-py 를 사용하기가 어렵다고 판단, PyTorch kinematics 를 테스트해보았다. 이를 이용해서 엔드 이펙터를 원하는 위치에 옮기도록 제어하는 코드를 제작했다.
다만 Jacobian 이 이상하게 구해져서 엔드 이펙터가 계속 원하는 위치로 이동하지 않았다. 엔드 이펙터가 가벼워서 진동이 심한 것 같아 엔드 이펙터의 끝단에 질량을 임의로 추가했다. PID 제어기로 제작한 토크 제어 로직이 잘 되는지 점검하기 위해, 2 Dof 로 이루어진 간단한 팔을 테스트해보았는데 이것도 잘 되지 않았다. 
 

3주차

 
외력을 추정하는 과제에 대한 리서치를 시작했다. 무조코 시뮬레이터에 있는 로봇에 IMU 를 달아서 센서 데이터를 얻어왔다. 무조코 상에서 xfrc_applied 를 이용해 링크에 외력을 줘서 움직이고, 외력의 방향을 시각화하는 코드를 작성했다. 
딥러닝 모델을 개발하기 위한 준비를 시작했다. 딥러닝 혹은 외력 추정에 관한 논문을 여러 편 읽었다. 또한 외력 추정 딥러닝 모델이 어떤 구조로 이루어져 있는지, 입력 데이터는 어떤 것인지 리서치했다. 이 문제를 anomaly detection 으로 해결하는 접근법에 대해서 자세히 살펴보았다.
 

4주차

 
PyTorch 를 사용해서 딥러닝 학습 코드를 만들기 시작했다. 모듈을 교체하거나 파라미터를 바꿔가면서 반복적으로 실험해야 하기 때문에 모듈화에 신경쓰며 코드를 제작했고, Agument Parser 를 이용해서 실행 인자로 파라미터를 조정할 수 있도록 코드를 작성했다. 
joint position 을 이용해서 Collision detection 을 하는 딥러닝 모델을 만들기 위한 데이터로더를 제작했다. Public dataset 을 받아서 테스트 코드를 만들면서 데이터를 확인했다. 제안하는 모델 아키텍쳐 구조를 정리했다. 관절에 마찰 계수등을 추가하며 로봇 제어기를 다듬었다. 원, 네모 등을 그리면서 토크 기반 제어 로봇 시뮬레이터를 계속 제작했다. 

 

 

5주차

 
딥러닝 학습을 위한 시뮬레이션 시나리오를 설계하고 이를 위한 코드를 제작했다. MLP, RNN, Transformer 에 대해서 테스트 하기 위해서 학습 및 모델 코드를 만들었다. 데이터에 조인트 값을 어떻게 임베딩할지 고민했다. Local-global transformer 를 시도해보았으나, 며칠 뒤에 굳이 그렇게 할 필요가 없다는 것을 알고 수정했다. 
Input tensor 의 차원을 어떻게 할 지 고민하면서 데이터로더를 계속 수정했다. Joint position 값에서 angular velocity, acceleration 값을 얻는 코드를 만들었다. Input data 가 0이 많고 매우 sparse 해지는 문제가 발생했다. Batch size, hidden size, 층 개수 등을 바꿔가면서 학습하고 모델 성능을 확인했다.  로봇 워크스페이스를 matplotlib 으로 시각화했다. 

6주차

 
Collision 데이터셋을 생성했다. 일정한 구간 내에서 장애물이 랜덤으로 생성되고, 여기에 로봇팔이 부딪히는 형태로 충돌이 발생하게 된다. 충돌을 판정하는 Discriminator 네트워크를 부착했다. Discriminator 네트워크는 예상 토크와 실제 토크의 차이값을 input tensor 로 받아서 충돌이 일어났는지 여부를 판정핬다. 
Desired point 에 도달하면 다음 시퀀스로 넘어가는 게 아니라, 일정 시간이 지나면 다음 시퀀스로 넘어가도록 시뮬레이션 코드를 수정했다. Discriminator 를 위한 데이터로더를 만들었다. 논문 작성을 시작했다. 

 

7주차

 
데이터로더를 수정하고, 아키텍쳐 overview 그림을 그렸다. 기존에는 한 시퀀스에 충돌이 있었는지 없었는지 binary 하게 기록했는데, 프레임별로 충돌 여부를 기록하는 방식으로 고쳤다. 바꾼 구조는 1행에 엄청나게 많은 열이 기록되기 때문에, read_csv 를 사용하면 시간이 오래 걸려서 다른 방식으로 고쳤다. 
Torque estimator 네트워크를 학습시키면서 성능을 확인했다. 성능이 좋지 않은 이유가 데이터셋이 작기 때문이라고 생각해 훨씬 오래 기록하면서 큰 데이터셋을 만들었다. 데이터 Normalization 이 필요해서 정규화를 해 주는 방향으로 고쳤다. Inference time 을 체크했을 때 transformer 구조가 확실히 강점이 있었다. 
 

8주차

 

 
논문을 작성했다. 데이터로더에서 데이터를 가져오는 시간이 너무 길어서 for 문을 없애고 불필요한 부분이 있는지 확인하고 pickle 을 사용해서 좀 더 빨리 데이터를 가져오도록 했다. 데이터셋 sparsity 문제가 심각한 것 같아 input tensor 의 차원을 다시 바꿨고, 이에 따라서 STE 라는 인코딩 방식을 새로 만들었다. 데이터 구조가 바뀜에 따라 데이터로더를 또 수정했다. 논문에 최종적으로 첨부할 실험을 선정해 실험을 수행했다. KL-divergence, Confusion matrix 등을 사용해서 만든 모델의 성능을 평가했다. 논문에 첨부할 Figure 를 많이 만들었다. 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.