본문 바로가기

Study_ROS/[ROBOTIS ROS Courses]

[ROBOTIS ROS Courses] Ch8. 로봇, 센서, 모터 ~ Ch10. 모바일 로봇

728x90

Ch8. 로봇, 센서, 모터

 

  • Robot은 크게 Hardware / Software로 분류되며, ROS는 이중 응용 software의 범주에 포함된다
  • 지원 범위에 따라 로봇 패키지, 센서 패키지로 구분된다

 

1) 로봇 패키지 (http://robots.ros.org/ 에서 확인 가능)

https://robots.ros.org/

 

robots.ros.org

An index of ROS Robots

robots.ros.org

 

2) 센서 패키지 (wiki.rog.org의 'Sensors'에서 확인 가능)

http://wiki.ros.org/Sensors

 

Sensors - ROS Wiki

 

wiki.ros.org

  • 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

 

Motor Controller Drivers - ROS Wiki

ROS Motor Controller Drivers This page aggregates all ROS packages that allow interfacing with a motor controller or servo controller. PhidgetMotorControl HC (1064) phidgets-ros-pkg Node Architecture Publisher/Subscriber model Subscribes to: Publishes: phi

wiki.ros.org

 

 

dynamixel_sdk - ROS Wiki

melodic noetic   Show EOL distros:  EOL distros:   indigo kinetic indigo: Documentation generated on June 09, 2019 at 02:21 AM (doc job).kinetic: Documentation generated on April 16, 2021 at 10:22 AM (doc job).melodic: Documentation generated on March

wiki.ros.org

 

 

Ch9. 임베디드 시스템

 

  • 위와 같이 하나의 로봇을 만드는 데는 수많은 작은 Embedded System이 필요하다

컴퓨터 자원의 종류

  • x86은 컴퓨터에 사용되는 계열 (Intel 계열), ARM은 스마트폰에 사용되는 계열
  • PC(오른쪽)와 달리 Embedded system(왼쪽)에서는 ROS 설치가 불가능함 (OS를 사용하지 않는 Firmware level이므로)
  • 실시간성 확보 및 hardware 제어를 위해서는 ROS 설치 PC와 Embedded System간의 연결이 요구됨
  • ROS에서는 이를 위해 rosserial이라는 package를 제공

Turtlebot3에서의 PC와 Embedded System의 구성

  • 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 개발환경 구축

 

ROBOTIS e-Manual

 

emanual.robotis.com

 

ROBOTIS e-Manual

 

emanual.robotis.com

 

- 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

 

우분투에서 Arduino IDE를 통한 rosserial 사용법

Ubuntu 20.04 환경에서 진행 아래의 사이트에서 Arduino IDE 설치 https://www.arduino.cc/en/software 혹은 terminal에서 아래 명령어를 통해 설치 $ wget https://downloads.arduino.cc/arduino-1.8.18-linux64.tar.xz $ sudo chmod +x ardui

youngseong.tistory.com

 

 

 

 

Ch 10. 모바일 로봇

  • ROS 공식 Mobile Robot Platform인 Turtlebot3에 관련된 내용
  • Mobile로봇 제작 시 고려 사항

 

ROS 로고 옆의 점들이 거북이 등껍질을 상징

 

 

(추후 내용 추가 예정)

 

  • Turtlebot3 관련 내용

https://youngseong.tistory.com/73

 

[KUSMO] 8/13 ~ 15 (Ubuntu 20.04 듀얼부팅, SLAM, Navigation, Simulation)

8/13 Ubuntu Releases(https://releases.ubuntu.com/20.04/)에서 Ubuntu 20.04 LTS(64bit) 설치 $ sudo apt update $ sudo apt upgrade $ wget https://raw.githubusercontent.com/ROBOTIS-GIT/robotis_tools/master/install_ros_noetic.sh $ chmod 755 ./install_ros_noe

youngseong.tistory.com

 

 

 

 

 

 


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