본문 바로가기
기계공학부 시절의 기록/ROS일기

Myo로 OpenManipulator 동작시키기 성공!!!

by juhyeonglee 2021. 10. 28.
728x90
반응형

구동영상

 

최대한 단순하게 코드를 작성하였다.

myo_raw/myo_ori 토픽에서 생성되는 데이터를 봤을 때, (https://needs-searcher.tistory.com/196?category=885778참고)

먼저 로봇컨트롤러에서 모든 모터각 =  0으로 초기자세를 잡은 뒤 myo에서 생성되는 roll, pitch, yaw값을 그대로 모터각으로 전달하면 쉽게 구현할 수 있겠다고 생각하였다. 하지만 센서장착 후 팔을 정면으로 뻗었을 때, 장착할 때마다 roll, pitch, yaw값이 조금씩 다르다는 단점이 있다. (대부분의 경우 정면으로 팔을 뻗었을 때 roll = pitch = yaw = 0가 된다.)

 

그래서

1. teleop노드를 실행했을 때, 즉시 로봇이 초기자세(모든 모터각 = 0)를 잡게 하고

2. myo에서 생성되는 데이터(roll, pitch, yaw)를 계속해서 로봇의 모터각(base, shoulder, elbow motor)으로 전달

** 주의 : 팔을 크게 왼쪽에서 오른쪽으로 이동했을 때 roll값은 약 -1 rad에서 +1 rad으로 바뀌는 것을 보았을 때, 이 값을 그대로 모터에 전달하면 로봇이 매우 빠르게 움직여 위험할 수 있다. myo에서 생성되는 rad값에 0.45를 곱해주면 적정한 속도로 로봇팔을 추종시킬 수 있다.

3. myo에 내장된 손동작인식값을 가져와 주먹을 쥐었을 때 그리퍼가 닫히고, 폈을 때 그리퍼가 열리도록 코드작성

을 구현하였다.


코드를 작성하는 과정에서 필요했던 것은

1. myo에서 생성되는, 내가 가져와 쓰고 싶은 데이터가 어느 토픽으로 pub되는가

2. 해당 데이터의 interface(데이터형식)는 어떻게 되는가

1과 2는 https://needs-searcher.tistory.com/192?category=885778 를 참고하여 rqt 혹은 터미널창에서 확인할 수 있다.

 

3. 해당 데이터형식을 가져와 쓸 수 있도록 header파일에 #include 선언

예)

#include <sensor_msgs/JointState.h>

#include <std_msgs/String.h>

#include <geometry_msgs/Vector3.h>

 

4. cpp본문에서

1) subscriber 노드 생성 : 토픽을 받아올 창구를 만든다.

2) 콜백함수 작성 : 창구에서 받아올 데이터를 Class의 멤버변수로 저장한다.

3) 모터각으로 전달하는 역할의 메소드(멤버함수) 작성 : 받아온 데이터가 저장된 멤버변수를 호출하여 모터로 전달.

** subscriber노드와 멤버변수, 멤버함수는 모두 헤더파일의 클래스에서 선언되어야 한다. 이 때, 멤버변수는 private접근지정자에 위치시켜 메소드에서만 안전하게 다뤄질 수 있도록 하고 메소드는 메인함수에서 실행을 위해 public접근지정자에 위치시킨다.

4) main함수에서 메소드 호출하여 실행되도록 한다.

 

5. 헤더파일에서

1) cpp본문에서 사용되는 subcriber노드, 멤버변수, 메소드들을 모두 선언한다. 4-3)에 유의하여 적절한 접근지정자에 위치시킨다.

2) 필요한 데이터인터페이스 헤더를 추가시킨다.

 
728x90
반응형

댓글