Ch8. 로봇, 센서, 모터
- Robot은 크게 Hardware / Software로 분류되며, ROS는 이중 응용 software의 범주에 포함된다
- 지원 범위에 따라 로봇 패키지, 센서 패키지로 구분된다
1) 로봇 패키지 (http://robots.ros.org/ 에서 확인 가능)
2) 센서 패키지 (wiki.rog.org의 'Sensors'에서 확인 가능)
- 1D Range Finders : 저가의 로봇을 만들 때 사용하는 적외선 방식의 직선거리 센서 (한 점의 거리를 측정)
- 2D Range Finders : 2D 평면상의 거리를 측정하는 센서. 주로 navigation에 많이 사용됨 (ex) LRF-Laser Range Finders = LIDAR)
- 3D Sensors : Intel사의 Realsense, Microsoft사의 Kinect등의 3D 거리 측정에 사용되는 센서
- Audio / Speech Recognition
- Cameras : 물체/얼굴 인식, 문자 판독 등에 많이 사용되는 카메라의 드라이버 및 각종 응용 패키지
- Sensor Interfaces : USB 및 web protocol을 지원하는 센서는 매우 적음 (강의 기준)
- Pose Estimation : GPS, IMU 등
- 사용해야 하는 sensor의 종류가 정말 많고, 특히 LRF나 3D 센서, 카메라 등은 data양이 많아서 MCU의 ADC만으로 값을 받기에는 한계가 있음
- 따라서 PC를 통해 sensor의 값을 받음
- ROS는 이러한 센서들의 드라이버와 라이브러리를 사용할 수 있는 개발환경을 제공함
- 센서 패키지 실습 (RPLidar)
$ cd ~/catkin_ws/src
$ git clone https://github.com/Slamtec/rplidar_ros
$ cd ..
$ catkin_make
- catkin workspace의 src folder에 RPLiar사에서 제공하는 github repository를 clone
- clone 후 catkin_ws로 돌아와서 package compile
$ sudo chmod 666 /dev/ttyUSB0
$ source devel/setup.bash
$ roslaunch rplidar_ros rplidar.launch
- RPLidar와 연결된 USB Port에 읽기/쓰기 권한 부여
- ROS 설정 파일을 불러온 후 package의 launch file 실행
$ rviz
- 새로운 terminal 창을 열고 rviz 실행
- Fixed Frame을 laser로 변경
- 좌측 하단의 Add를 클릭한 후 Axes를 선택하여 추가
- Add에서 Topic -> LaserScan 추가 (Topic 지정은 필수)
- 아래와 같이 Lidar에서 측정한 거리값을 불러올 수 있다
$ rostopic list
- 위의 명령어를 통해 sensor의 topic message를 확인할 수 있다
$ rosrun image_view image_view image:=/image_raw
$ rqt_image_view image:=/image_raw
- Camera같이 image 정보를 publish하는 sensor의 경우, image_view node나 rqt의 image_view plugin을 통해 확인 할 수 있다 ( +rviz -> 아래 설명)
- image_raw는 camera의 topic을 image로 보기 위한 option
$ rviz
- 위 방법 외에도 rviz를 통해 볼 수도 있다
- Add -> By display type -> rviz -> Image를 통해 이미지 표시를 불러온다
- 그 후 좌측 상단의 Displays창에서 Image -> Image Topic의 값을 '/image_raw'로 변경하여 image가 표시되게 한다
3) 모터 패키지 (http://wiki.ros.org/Motor%20Controller%20Drivers 에서 확인 가능)
http://wiki.ros.org/Motor%20Controller%20Drivers
- DynamixelSDK : http://wiki.ros.org/dynamixel_sdk
Ch9. 임베디드 시스템
- 위와 같이 하나의 로봇을 만드는 데는 수많은 작은 Embedded System이 필요하다
- x86은 컴퓨터에 사용되는 계열 (Intel 계열), ARM은 스마트폰에 사용되는 계열
- PC(오른쪽)와 달리 Embedded system(왼쪽)에서는 ROS 설치가 불가능함 (OS를 사용하지 않는 Firmware level이므로)
- 실시간성 확보 및 hardware 제어를 위해서는 ROS 설치 PC와 Embedded System간의 연결이 요구됨
- ROS에서는 이를 위해 rosserial이라는 package를 제공
- rosserial은 아래와 같이 PC와 제어기 간의 message 통신을 위해 중계자 역할을 수행하는 ROS package
- MCU에서 사용한 data를 ROS message로 변환하는 역할
- PC에서는 rosserial server, MCU에서는 rosserial client를 실행 (MCU의 Firmware를 writing)
$ sudo apt install ros-noetic-rosserial ros-noetic-server ros-noetic-rosserial-arduino
- rosserial 관련 package 설치
- rosserial server는 PC에서 사용하는 package. 주로 data 변환을 담당
- rosserial_python : Python 기반의 rosserial server. 주로 사용됨
- rosserial_server : C++기반의 rosserial server. 일부 기능에 제약이 있음
- rosserial_java : Java 기반의 rosserial server. Android SDK와 함께 사용
- rosserial client (각 Firmware를 사용할 수 있는 개발 환경 구축)
- rosseial_arduino : Arduino용 library. OpenCR은 이를 수정하여 사용 중
- rosseial_embeddedlinux : Embedded Linux용 library
- rosseial_windows : Window OS, Window 응용프로그램과의 통신 지원
- rosseial_mbed : ARM사의 mbed 지원
- roslib : ROS Client Library 구현에서 공유되는 수많은 data 구조와 tool들이 포함된 ROS 기본 Dependency 및 support Library
- rosserial은 serial로 message를 전송(8bits씩)
- rosserial의 제약사항 (PC와 Embedded System간의 Computing Resource 자체의 차이로 인함)
- Memory : PC에서는 memory가 크게 문제가 되지 않으나 MCU는 memory에 제약이 있으므로 Publisher/Subscriber의 개수 및 송수신 buffer의 크기에 제한이 있음
- Float64 : MCU는 대부분 64bits float 연산을 지원하지 않아 32bits로 변환함
- Strings : 문자열 data를 String message 안에 저장하지 않고 외부에서 정의한 문자열 data의 pointer값만 message에 저장함
- Arrays : Memory 제약때문에 array의 크기를 지정해서 사용
- 통신 속도 : Embedded System은 Serial 통신 시 기본적으로 UART 통신을 사용. 이 때 UART통신은 115200bps와 같은 속도로는 message의 개수가 많아지면 응답 및 처리속도가 느려짐
- OpenCR (Open-source Control module for ROS)
- Robotis사에서 개발한 ROS용 Embedded Board (현재 Turtlebot3에 사용중)
- Robotis사와 ROS를 개발한 OSRF(현재 Open Robotics), OROCA의 협업을 통해 만들어짐
- Open Source 기반의 ROS 지원 Embedded Board
- MCU상에서 최상위급 CPU인 Cortex-M7 사용
- 메모리 size를 크게 해 더 많은 Publisher/Subscriber의 개수 및 송수신 buffer를 사용할 수 있음
- USB packet 전송을 사용해 통신 속도를 높임
- 여러 전원 설계를 통해 라즈베리파이 등의 SBC와 연동 가능하게 함
- Arduino 호환 핀 보유
- 내부 IMU 관련 내용
- Block Diagram 및 Flash Memory Map
- OpenCR 개발환경 구축
- OpenCR은 Arduino IDE를 지원
- OpenCR 개발환경 구축 방법
- http://emanual.robotis.com/docs/en/platform/turtlebot3/appendix_opencr1_0/
- rosserial 예제 (LED 제어)
$ arduino
- Arduino IDE 실행 후 Example에서 a_LED를 불러와 build후 upload
- LED 4개를 ROS 표준 data type인 std_msg/Byte를 이용하여 led_out Subscriber를 정의하는 예제
#include <ros.h> // ROS Header
#include <std_msgs/String.h> // 사용할 message liclude
#include <std_msgs/Byte.h> // ""
// 사용할 LED 4개 선언
int led_pin_user[4] = { BDPIN_LED_USER_1, BDPIN_LED_USER_2,
BDPIN_LED_USER_3, BDPIN_LED_USER_4 };
ros::NodeHandle nh; // node handler 선언
// Subscriber Callback 함수
// led_msg에 따라 LED를 선택하여 킴
void messageCb( const std_msgs::Byte& led_msg) {
int i;
for (i=0; i<4; i++)
{
if (led_msg.data & (1 << i))
{
digitalWrite(led_pin_user[i], LOW);
}
else
{
digitalWrite(led_pin_user[i], HIGH);
}
}
}
// 'led_out' topic을 subscribe하는 sub라는 이름의 Subscriber 선언
ros::Subscriber<std_msgs::Byte> sub("led_out", messageCb );
void setup() {
pinMode(led_pin_user[0], OUTPUT); // 위에서 선언한 4개의 LED를 Output으로 선언
pinMode(led_pin_user[1], OUTPUT);
pinMode(led_pin_user[2], OUTPUT);
pinMode(led_pin_user[3], OUTPUT);
nh.initNode();
nh.subscribe(sub);
void loop() {
nh.spinOnce(); // led_out이라는 message를 받기 전까지 대기
}
$ roscore
$ rosrun rosserial_python serial_node.py __name:=opencr _port:=/dev/ttyACM0 _baud:=115200
- roscore 실행 후 rosserial server 실행
- OpenCR에서는 이미 write를 했으므로 위의 firmware가 실행중인 상태
$ rostopic pub -1 led_out std_msgs/Byte 1 -> USER1 LED On
$ rostopic pub -1 led_out std_msgs/Byte 2 -> USER2 LED On
$ rostopic pub -1 led_out std_msgs/Byte 4 -> USER3 LED On
$ rostopic pub -1 led_out std_msgs/Byte 8 -> USER4 LED On
$ rostopic pub -1 led_out std_msgs/Byte 0 -> LED Off
- rostopic pub을 이용하여 led_out에 값을 입력하여 LED 제어
$ rqt_graph
- 실행 node 확인 (사진 추가)
- rostopic 명령어가 퍼블리셔 노드로 opencr(rosserial server)가 서브스크라이버로 동작하고 있으며, 두 노드간에 ‘/led_out’ 이라는 토픽명으로 정보가 송수신되고 있는 것을 확인할 수 있다.
- IMU 제어 예제도 해볼 것
- OpenCR 관련 내용
https://youngseong.tistory.com/103
Ch 10. 모바일 로봇
- ROS 공식 Mobile Robot Platform인 Turtlebot3에 관련된 내용
- Mobile로봇 제작 시 고려 사항
(추후 내용 추가 예정)
- Turtlebot3 관련 내용
https://youngseong.tistory.com/73
https://www.youtube.com/watch?v=IIlvF9c8Wzw&list=PLRG6WP3c31_VIFtFAxSke2NG_DumVZPgw&index=8
https://www.youtube.com/watch?v=VKNVj9IDMeo
https://www.youtube.com/watch?v=rV-POzbzoHc
'Study_ROS > [ROBOTIS ROS Courses]' 카테고리의 다른 글
[ROBOTIS ROS Courses] Ch11. SLAM과 Navigation (0) | 2023.01.24 |
---|---|
[ROBOTIS ROS Courses] Ch7. ROS 기본 프로그래밍 (0) | 2022.09.17 |
[ROBOTIS ROS Courses] Ch6. ROS 도구(RViz, rqt, Gazebo) (0) | 2022.09.17 |
[ROBOTIS ROS Courses] Ch5. ROS 명령어 + 용어 정리 (0) | 2022.09.10 |
[ROBOTIS ROS Courses] Ch3. ROS 개발환경 구축 ~ Ch4. ROS의 중요 컨셉 (0) | 2022.09.10 |