본문 바로가기
기계공학부 시절의 기록/Main Project Posting

Operating OpenManipulator-X using Myo-armband in ROS1(melodic) 최종정리

by juhyeonglee 2021. 11. 13.
728x90
반응형

로봇 학습에 쓰일 데이터 생성, 그리고 실질적인 로봇의 구동을 위해서 ROS기반 로봇제어를 수행하였다.

지금까지 일기형식으로 개발상황을 쭉 써내려왔는데 이를 가독성있게 정리해보려고 한다.


Objective

1. 팔의 움직임으로 로봇팔 실시간 원격조종

2. 팔의 현재 위치를 기준으로 로봇 위치 초기화(Calibration)

3. 원격조종으로 수행한 task의 경로를 저장하여 로봇으로 반복 수행

 

PC Enviroment ( Labtop )

OS : Ubuntu 18.04
ROS : melodic
CPU : i5
Graphic Card : 내장그래픽카드

Hardware
OpenManipulator-X(ROBOTIS)
OpenCR Interface

개발에 활용한 Original Packages(이들을 수정하여 사용함.)
1. ros_myo package

2. Openmanipulator package

3. open_manipulator_master_slave

 

 

References

1. 전 세 윤, 박 범 용, "근전도센서를 이용한 기반의 산업용 로봇 원격제어", 2020

2. suho0515 블로그 - Pick and Place using Inception_v3 in ROS

 


최종 코드 : 추후 업로드 예정

 

구현 영상

https://www.youtube.com/watch?v=6KJZIgR73MA 

 

 

실행 명령어

 

1. myo launch 

roslaunch ros_myo myo.launch

 

2. open_manipulator_controller 실행(포트명 ttyACM0 -> ttyACM1 변경함)

$ roslaunch open_manipulator_controller open_manipulator_controller.launch usb_port:=/dev/ttyACM1 baud_rate:=1000000

 

3. open_manipulator_teleop_keyboard 실행

$ roslaunch open_manipulator_teleop open_manipulator_teleop_keyboard.launch

 

4. 경로저장

$ rosrun record_pkg record_pkg

 


 

[Operating OpenManipulator-X using Myo-armband in ROS1(melodic)] #01. myo의 orientation값으로 Openmanipulator 구동 : open_manipulator_teleop.cpp에 subscriber, callback함수 만들기

방법 open_manipulator_controller에 모터각을 입력하는 open_manipulator_teleop에 myo_ori, myo_gest_str 값을 실시간으로 받을 수 있도록 subscriber노드를 만들어 myo의 데이터로 Openmanipulator를 조종할 수 있도록 한다.

1. myo-pc 연결 [myo-ros connecting]

2. myo_ori데이터 물리적의미 파악

3. myo와 open_manipulator_teleop노드 사이의 Topic 통신 구현

4. open_manipulator_teleop 코드 수정(미완성 코드-매우 부족)

- myo data를 실시간으로 할당할 새로운 멤버변수 만들기

- callback함수를 통해 subscribe한 myo데이터 멤버변수에 할당

5. myo와 OpenCR가 같은 포트를 사용함에 따라 생기는 통신충돌 문제 해결 : 포트 설정 변경

6. 구현 모습

 

[Operating OpenManipulator-X using Myo-armband in ROS1(melodic)] #02. myo에 내장된 동작인식 기능으로 Calibration 기능 수행 : open_manipulator_teleop.cpp 수정

1. 손이 특정 동작을 취했을 때, 그 때의 ori값을 상수값으로 저장. (실시간ori-해당 상수값)을 모터각으로 open_manipulator_controller 넘긴다. 

 

[Operating OpenManipulator-X using Myo-armband in ROS1(melodic)] #03. 움직인 경로 text파일로 저장하고 이를 읽어와 play하기

1. 해당 기능을 수행할 새로운 패키지 record_pkg 만들기

1. open_manipulator_controller로부터 실시간으로 joint_state를 받아오도록 subscriber 생성, callback함수로 새로운 멤버변수에 해당값 할당

2. 실시간으로 받아온 joint_state를 담은 멤버변수를 이용해 txt파일에 순서대로 데이터를 저장하는 recording함수 만들기. 이를 main문 안의 while구문에서 실행

3. 해당패키지에서 '1'을 누르면 recoding, '2'를 누르면 stop & close file이 되도록 코드작성

** file make in cpp 참고 문헌

- [youtube]How to Write a Text file in C++ (Linux)

- [블로그. 그것으로 말미암아] 파일입출력 

- [블로그. 내일도 오늘같이]cpp 텍스트파일 배열에 저장 방법

- [블로그. Nathan 일상]파일 입출력

- [ROS Answer]원하는 경로에 파일 생성시키기는 방법

---------------------------------

- [블로그. SHA]getchar()함수 설명

- [블로그. suho0515] 키입력을 받았는지에 따라 bool값 반환하는 kbhit()함수 구현. (linux에서는 패키지제공이 되지 않아 직접 구현해야함.)

 

 

2. record_pkg로 만든 text 파일을 open_manipulator_teleop에서 접근하여 읽을 수 있도록 open_manipulator_teleop 코드수정

1. txt2vec함수 만들기 : txt파일의 데이터를 벡터 자료형에 각각의 joint마다 저장.

2. recordCallback함수 만들기 : main함수 안의 while문에서 실행시켜 실시간으로 1.에서 만든 벡터에서 하나씩 값을 가져와 새로운 멤버변수 joint_에 할당.

3. realtimePose함수 수정 : 값을 할당받은 멤버변수를 open_manipulator_controller의 모터값으로 전송. 기존의 코드는 myo_ori값만 전송했다면 이제는 기존의 모드를 'Operating모드', 저장된 txt파일을 읽어와 저장된 경로를 따라 움직이도록 하는 것은 'play-record모드'로 모드에 따라 다른 수행을 하도록 수정.

4. [error 해결] txt파일이 저장된 데이터가 없는 빈 파일이면 vector에 어떠한 값도 저장되지 않는다. 또, vector에 저장된 값이 모두 전달되었을 때는 더이상 vector로부터 joint_멤버변수에 할당할 값이 없다. 이 때 out of range 에러가 발생한다. --> 경로저장을 먼저 하고 play-record모드를 수행하면 되며 모든 값이 joint_로 전달되었을 때는 이를 터미널에 알리도록 수정하였다.(참고글)

5. 실제로 구동했을 때, 저장한 경로를 모두 수행하지 못하고 종료되거나, 너무 미미하게 로봇이 움직이는 문제점이 있었다. 

record_pkg에서, open_manipulator_controller로부터의 joint_state는 main()의 while에서 txt파일로 저장된다. 이 때 초당 매우 많은 data들이 txt파일로 저장된다.(촘촘하게. 그만큼 while문이 빠르게 반복된다.)

open_manipulator_teleop에서 txt파일로부터 데이터를 읽어 contoller에 전달하는 속도는 이에 미치지 못하는 것 같았다. 때문에 로봇이 매우 천천히 움직이게 된다.

이를 해결하기 위해서 open_manipulator_teleop에서 txt2vec함수로 vector에 각 joint마다 모터각들이 저장되어 있는데 이 벡터에서의 값을 띄엄띄엄씩 멤버변수로 할당함으로써 실제 로봇의 구동속도를 조절한다. 즉, 100개의 시간별로 변하는 모터각을 모두 joint로 할당하지 않고 10개씩 혹은 20개씩 띄엄띄엄 할당하는 것이다. 그러면 더 빠르게 로봇이 움직인다.

6. [error 해결]exceed joint limint at gripper

gripper에는 오로지 정확한 0.01 or -0.01값만 들어가도록 되어있다. open_manipulator_controller에서 open_manipulator_teleop로 전달하는 joint_state에서 gripper는 0.0099와 같이 정확한 0.01이 아닌 근사값들임을 rqt에서 확인하였다. 이를 완전히 0.01값으로 만들면서 부호만 살려두기 위해서 코드를 수정하였다.

 

[전체 rqt node graph]

 

 

 

 

 

 

 

 

728x90
반응형

댓글