|
|
1. 이론 공부
1부 22장 : ROS2파일시스템
1부 23장 : 빌드툴 사용법
1부 24장 : 패키지 작성법(사용할 라이브러리 관련 내용을 추가하는 방법을 공부할것)
2부 3장 : 퍼블리시, 서브스크라이브 노드작성
2부 3장 예제코드
https://github.com/robotpilot/ros2-seminar-examples/tree/main/my_first_ros_rclcpp_pkg
ROS용 Dynamixel 제어패키지 -> 너무 복잡하여 매우 어렵고 ROS1용만 있음
https://github.com/ROBOTIS-GIT/dynamixel-workbench
사용자인터페이스 패키지 : dynamixel_workbench_operators
다이나믹셀 제어패키지 : dynamixel_workbench_controllers
Jetson nano보드에서 사용한 Dynamixel SDK(C++버전)을 이용하면 되지만 코드가 너무 복잡하여 사용하기 매우 힘듦
Dynamixel SDK(C++버전)를 이용하기 쉽도록 간단한 Wrapper 패키지를 직접 작성해볼것
Dynamixel SDK 이매뉴얼 : https://emanual.robotis.com/docs/en/software/dynamixel/dynamixel_sdk/overview/
Dynamixel SDK 소스코드 : https://github.com/ROBOTIS-GIT/DynamixelSDK
이것을 하려면 다이나믹셀 동작원리와 라이브러리 함수를 모두 이해해야한다.
다이나믹셀 Emanual : https://emanual.robotis.com/docs/en/dxl/
위 사이트의 모든 자료를 읽어볼것->Dynamixel SDK를 자유자재로 사용할수 있게 해야함
2. 패키지 설계
PC : 사용자의 키보드 입력을 받아 로봇으로 전송하는 퍼블리시 노드작성(s: 정지, f:전진, b: 후진, r:좌회전, l:우회전)
Jetson nano : 제어명령을 서브스크라이브하여 다이나믹셀을 제어하는 노드 작성
먼저 Dynamixel SDK(C++버전)이 Jetson nano 보드에 설치되어 있어야한다.
dxl.hpp -> Dynamixel SDK C++ 라이브러리를 그대로 사용하면 코드가 길어지고 불편함, 사용하기 편리하도록 새로운 Wrapper클래스 작성, 선언부 작성
dxl.cpp -> Dynamixel SDK C++ 라이브러리를 그대로 사용하면 코드가 길어지고 불편함, 사용하기 편리하도록 새로운 Wrapper클래스 작성, 구현부 작성
dynamixel_publisher.cpp -> 사용자 키보드 입력을 받아 제어명령(좌,우모터의 속도명령)을 퍼블리시하는 노드작성(main함수 포함), 2부 3장을 참고하여 클래스로 작성
dynamixel_subscriber.cpp -> 제어명령(좌,우모터의 속도명령)을 서브스크라이브하고 새로 작성한 클래스를 이용하여 다이나믹셀을 제어하는 노드작성(main함수 포함), 2부 3장을 참고하여 클래스로 작성
package.xml -> 패키지 설정파일, 2부 3장을 참고하여 수정
CMakeLists.txt -> 빌드 설정파일, 2부 3장을 참고하여 수정
깃허브 소스를 그대로 내려받아 사용해도 되지만 처음에는 모든 소스코드를 직접 작성해보는것이 실력향상의 지름길
3. 리눅스에서 패키지 작성
패키지를 C++로 작성하기 때문에 Dynamixel SDK는 C++버전을 사용할것
Dynamixel SDK는 C++버전을 설치하지 않았다면 아래 사이트의 지시대로 설치할것
리눅스에서는 사용자 홈디렉토리(/home/ncslab) 아래에 ros2_ws 이름의 작업공간을 생성
ros2_ws 아래에 src 생성, src 아래에 모든 패키지를 생성한다.
(1) 패키지 생성
$ cd ~/ros2_ws/src -> 패키지 생성은 ros2_ws/src디렉토리에서 작업해야함
$ ros2 pkg create dynamixel_ros2 --build-type ament_cmake --dependencies rclcpp std_msgs
src 디렉토리 아래에 패키지명과 같은 디렉토리가 생성되고 그 아래에 위 그림과 같은 서브디렉토리와 파일들이 생성된다.
* 디렉토리에 포함된 모든 서브디렉토리와 파일을 삭제하고 싶으면
$ rm -rf * -> 현재위치를 반드시 확인하고 실행하라. 묻지도 않고 모든것을 강제로 삭제한다. 와일드카드문자 *는 all을 의미한다.
* 원하는 디렉토리만 삭제하고 싶으면
$ rm -rf <디렉토리명> -> 디렉토리와 그안의 내용물을 강제로 삭제한다.
(2) 소스파일 작성
2. 패키지 설계 내용대로 다음 4개의 소스파일을 작성하고 헤더파일은 include/dynamixel_ros2 아래에 저장하고 소스파일은 src 디렉토리에 저장한다.
AX-12W, MX-12W 모델만 사용가능하고 XL, XC 모델 코드는 구현 안됨
dxl.hpp -> Dynamixel SDK C++ 라이브러리를 사용하기 편리하게 클래스화
dxl.cpp-> Dynamixel SDK C++ 라이브러리를 사용하기 편리하게 클래스화
dynamixel_publisher.cpp -> 사용자입력을 받아 속도명령 토픽을 퍼블리시하는 노드
dynamixel_subscriber.cpp -> 속도명령 토픽을 서브스크라이브하여 다이나믹셀을 제어하는 노드
(3) 패키지 설정파일(package.xml), 빌드설정파일(CMakeLists.txt) 수정
패키지 생성시 기본적인 내용으로 자동으로 생성해주고 이후에 패키지 기능에 맞게 추가 및 수정해야 함
Dynamixel SDK, geometry_msgs 관련 내용을 추가해야한다.
주의: 다른 패키지의 설정파일내용을 그대로 덮어쓰기하지말것 ros2 pkg create 명령어로 작성한 파일에 내용을 추가 또는 수정할것, 덮어쓰기하면 패키지이름이 변경되어 빌드시 패키지를 찾지 못하니 주의할것
(4) 패키지 빌드
$ cd ~/ros2_ws -> 빌드명령어를 실행하는 위치 주의할 것, src 디렉토리가 아님
$ colcon build --symlink-install --packages-select dynamixel_ros2
빌드후에 디렉토리 build, install, log가 없으면 새로 생성된다. build 디렉토리에는 빌드과정에서 생성되는 파일들이 저장되고 실행파일 또는 심볼릭 링크가 install 디렉토리에 복사된다.
빌드시 에러가 발생하면 소스코드 수정 후 다시 빌드명령어를 실행한다.
빌드 옵션 설명은 다음 링크를 참고하라.
colcon user guide(빌드 명령어 사용법)
https://colcon.readthedocs.io/en/released/index.html
--symlink-install : 실행파일을 install 디렉토리에 복사할때 파일을 복사하지 않고 심볼릭 링크를 생성하라는 옵션
--packages-select <패키지명> : 지정된 패키지만 빌드하라는 옵션, 디폴트는ㅣㄴ - src 디렉토리의 모든 패키지를 빌드한다.
--event-handlers console_direct+ : 일반적으로는 에러메시지만 출력해준다 만약 빌드과정의 모든 메시지를 출력하고 싶으면 추가할것
(5) 패키지 실행
$ source ~/ros2_ws/install/local_setup.bash -> 빌드결과를 환경설정에 업데이트함, 패키지 실행시 반드시 먼저 실행해야한다.
$ ros2 run dynamixel_ros2 dynamixel_publisher -> 실행은 모든 디렉토리에서 가능함
s -> stop, f->전진, b-> 후진, l->좌회전, r->우회전임
새로운 터미널을 열고 다음을 실행
다이나믹셀 제어시는 장치인식을 확인하고 접근권한 설정을 먼저해야한다.
$ ls /dev/ttyUSB*
$ sudo chmod a+rw /dev/ttyUSB0
$ source ~/ros2_ws/install/local_setup.bash -> 빌드결과를 환경설정에 업데이트함, 패키지 실행시 반드시 먼저 실행해야한다.
$ ros2 run dynamixel_ros2 dynamixel_subscriber -> 실행은 모든 디렉토리에서 가능함
서브스크라이브한 속도명령을 화면에 출력하고 다이나믹셀을 제어한다.
(5) 노드그래프
$ ros2 topic list -> 토픽리스트를 보여준다.
dynamixel_publisher 노드에서 퍼블리시하는 토픽 /cmd_vel 을 확인할것
$ rqt_graph -> 노드와 토픽을 그래프로 보여준다.(PC의 X server에서 출력된것임)
4. 윈도우즈에서 패키지 작성
다이나믹셀은 젯슨보드에 연결되어 있으므로 윈도우즈 패키지에는 다이나믹셀 제어 라이브러리가 필요없으므로 제어명령을 퍼블리시하고 섭스크라이브하여 화면에 출력하는 기능만 구현해보자
패키지 구현 과정은 리눅스와 동일하다.
윈도우즈에서도 사용자 폴더 아래에 ros2_ws 라는 ROS 작업공간을 만들고 그 아래에 src 폴더를 생성 후 패키지를 생성한다.
주의할점
패키지를 생성하는 위치 : <사용자폴더명>\ros2_ws\src
패키지를 빌드하는 위치 : <사용자폴더명>\ros2_ws
패키지를 실행하는 위치 : 아무데서나 가능, 단, 실행전에 <사용자폴더명>\ros2_ws\install\local_setup.ps1 실행
(1) 패키지 생성
> cd <사용자폴더명>\ros2_ws\src -> 패키지생성은 ros2_ws\src 에서 실행해야함
> ros2 pkg create dynamixel_ros2 --build-type ament_cmake --dependencies rclcpp geometry_msgs
(2) 소스파일 작성
리눅스용 패키지 소스에서 다이나믹셀 관련 코드를 빼고 속도제어명령을 송수신하는 부분만 작성함
저장위치는 ros2_ws\src\<패키지명>\src
dynamixel_publisher.cpp -> 사용자입력을 받아 속도명령 토픽을 퍼블리시하는 노드
dynamixel_subscriber.cpp -> 속도명령 토픽을 서브스크라이브하여 다이나믹셀을 제어하는 노드
(3) 패키지 설정파일(package.xml), 빌드설정파일(CMakeLists.txt) 수정
자동생성된 설정파일들을 다음 파일로 대체하면 됨
(4) 패키지 빌드
리눅스 명령어와 같다.
> cd <사용자폴더명>\ros2_ws\ -> 패키지빌드는 ros2_ws\ 에서 실행해야함
> colcon build --symlink-install --packages-select dynamixel_ros2
* 마지막 두줄은 에러코드인것 같은데 아직 원인을 찾지못함,
Summary: 1 package finished [9.08s] -> 실행파일은 생성됨
(5) 패키지 실행
패키지 실행전에 환경설정을 위하여 <사용자폴더명>\ros2_ws\install\local_setup.ps1를 먼저 실행해야한다.
리눅스와 명령어가 다름에 주의하라. 패키지 실행명령은 리눅스와 같다.
> install\local_setup.ps1 -> 작업폴더를 ros2_ws 폴더로 변경하고 실행할것
> ros2 run dynamixel_ros2 dynamixel_publisher
새로운 터미널을 열고 패키지 실행전에 환경설정을 위하여 <사용자폴더명>\ros2_ws\install\local_setup.ps1를 먼저 실행 후 패키지를 실행하라.
> install\local_setup.ps1 -> 작업폴더를 ros2_ws 폴더로 변경하고 실행할것
> ros2 run dynamixel_ros2 dynamixel_subscriber
(6) 토픽 리스트 확인
리눅스와 ROS명령어는 같음
> ros2 topic list -> /cmd_vel 토픽 확인
노드, 토픽 그래프 출력
> rqt_graph -> 약간의 버그가 있는것 같음, 왼쪽 빈원, 리눅스와 결과 다름
5. 서로 다른 컴퓨터에서 패키지 실행
서로 다른 컴퓨터는 같은 네트워크에 연결되어 있어야 함, 즉, 같은 공유기에 와이파이로 접속된 상태로 실험을 해야함
무선환경에서는 같은 공유기에 연결되면 같은 네트워크에 연결된 것이고 공유기가 다르면 다른 네트워크가 됩니다.
유선환경에서는 같은 라우터나 허브에 연결된 컴퓨터는 같은 네트워크에 연결된 겁니다.
윈도우즈에서 사용자로부터 제어명령을 받아 속도명령을 퍼블리시하고 리눅스에서 속도명령을 서브스크라이브하여 다이나믹셀을 제어해준다.
(1) 윈도우즈에 dynamixel_publisher 노드 실행
유선랜에 연결되어 있다면 유선은 끊고 공유기에 와이파이로 연결한다.
환경변수 ROS_DOMAIN_ID가 정의되어 있어야 함(camera 패키지작성 글 참고)
> install\local_setup.ps1 -> 작업폴더를 ros2_ws 폴더로 변경하고 실행할것
> ros2 run dynamixel_ros2 dynamixel_publisher
(2) 리눅스에서 dynamixel_subscriber 노드 실행
환경변수 ROS_DOMAIN_ID가 정의되어 있어야 함(camera 패키지작성 글 참고)
$ ls /dev/ttyUSB* -> 장치인식 확인
$ sudo chmod a+rw /dev/ttyUSB0 -> 접근권한 설정
토픽 확인
$ ros2 topic list -> /cmd_vel 확인
$ source ~/ros2_ws/install/local_setup.bash -> 빌드결과를 환경설정에 업데이트함, 패키지 실행시 반드시 먼저 실행해야한다.
$ ros2 run dynamixel_ros2 dynamixel_subscriber -> 실행은 모든 디렉토리에서 가능함
실제 실습시 윈도우즈에서 제어명령을 퍼블리시하고 리눅스에서 섭스크라이브하여 다이나믹셀을 제어하므로 위 예제를 잘 기억해둘것
6. 과제
(1) 다이나믹셀 제어명령 전송시 사용하는 토픽 메시지 인터페이스인 geometry_msgs::msg::Twist에 대하여 조사하라.
(2) 아래내용을 조사하라.
- 각속도(rad/s)와 선속도(m/s)의 의미를 설명하고 관계식을 적으시오
- rpm단위를 설명하고 x rpm을 y rad/s로 환산하는 y=ax 형태의 공식을 적으시오
- 로봇의 선속도, 각속도(회전속도)의 정의를 적으시오. 속도의 기준점을 생각해볼것
- 좌우 모터의 각속도(회전속도, rad/s)가 주어지면 로봇의 선속도(v),각속도(w)를 구하는 공식을 적고 설명하시오.
- 반대로 로봇의 선속도 각속도가 주어지면 좌우 모터의 회전속도(rad/s)를 구하는 공식을 적고 설명하시오.
- X rad/s를 Y rpm으로 환산하는 Y=aX 형태로 공식을 유도하라.
- 다이나믹셀 매뉴얼에서 MX-12W 모터의 속도명령값의 단위를 찾으시오. MX모터의 경우 -1023~1023 범위의 명령값을 사용하는데 이값의 실제 단위가 무엇인지 찾아보라는 의미임
다이나믹셀의 내부 moving speed 메모리를 이해해야한다.
https://emanual.robotis.com/docs/kr/dxl/
- 만약 X rpm으로 모터를 구동하려면 다이나믹셀의 moving speed 메모리에 실제 명령값 Y은 얼마를 전달해야하는가?
Y = aX 형태로 공식을 유도하라.
(3) 위 예제코드에서 제어명령으로 좌,우모터 속도 대신에 로봇의 선속도, 각속도를 사용하는 코드를 작성하시오.
- 단위를 모두 SI단위계로 환산해야함 선속도는 m/s, 각속도는 rad/s, 길이는 m, 시간은 sec
- 선속도와 각속도의 초기값은 0으로 설정하고 키보드 입력에 따라서 증가 또는 감소하도록 하라.
- 예를들어 a를 누르면 선속도를 일정값만큼 증가시킴, b를 누르면 선속도를 감소시킴
- 각속도도 비슷하게 처리할것
- 선속도, 각속도의 최대,최소값을 정의하고 범위를 벗어나지 않게 해야함
- 선속도가 1m/s이면 1초에 1m를 움직이는 속도임 따라서 적절하게 증감량을 조절하는것이 필요
- 키보드로 로봇의 선속도,각속도 입력 -> 퍼블리시 -> 섭스크라이브 -> (2)번에서 구한 공식을 이용하여 좌우 모터 선속도로 환산 -> (2)에서 구한 공식을 이용하여 좌우 모터의 각속도로 환산 -> rpm단위로 환산 -> 다이나믹셀 명령값단위로 환산 -> 명령값전송
- 앞으로 로봇의 제어명령은 선속도, 각속도를 이용할것 -> ros패키지에서 모두 제어명령으로 선속도,각속도를 이용하므로 호환성을 고려해야함
|
|
