[ROS 강의 필기 노트]Chapter 4,6

2023. 1. 21. 19:07ROS

*강의 출처 : 로보티즈(표윤석 님)

Chapter 5의 명령어는 8분짜리 영상이고 강의자료에 주요 명령어들에 대한 설명들이 적혀있으므로 강의필기를 생략했다.

Chapter 4


새로운 개념을 알기 이전에 우리는 그 분야의 용어를 먼저 이해할 필요가 있다.

예전에는 수백 개의 용어를 한 번에 모두 설명하려 했으나 매우 비효율적이고 재미없었다고 한다. (때문에 책에 용어정리가 되어있다. : 필요할 때마다 찾아볼 것)

이번 강의에서는 중요한 것이 나오면 그때그때 용어설명을 하면서 진도를 나갈 것이다.

그럼에도 먼저 알아둬야 할 가장 중요한 용어 3가지를 설명한다.

1. Node


최소단위의 실행가능한 프로세서

예를 들어서 출입문에 출입문을 통과할 수 있는 보안 게이트가 있을 것이다.

이 중 얼굴 인식을 통해 출입문이 열리는 게이트에 대한 프로그램을 짠다고 생각해 보자.

아마 통으로 하나의 프로그램을 짤 것이다.

물론 프로그램이 더 복잡해지면 프로그램을 나눠서 짤 것이지만...

프로그램을 짜는 흐름을 살펴보자.

우선 카메라 디바이스를 통해 raw 데이터(생데이터)를 받을 것이다.

이 raw데이터를 가지고 후처리를 해줘야 한다. (단지 숫자이기 때문)

이를 위해 filter를 설계할 것이다.

우선 배경을 지우는 filter를 만들 것이다.

그다음 우리는 상체가 모두 필요한 것은 아니므로 얼굴만 추출해 내는 filter를 만들 것이다.

얼굴만 따냈으면 이 얼굴에 대한 특징점이 잘 나올 수 있는 filter를 넣어주고

이렇게 가공한 데이터를 가지고 눈, 코, 입에 대한 특징점을 뽑아올 것이다.

그리고 데이터 베이스에 있는 회사원들의 얼굴의 특징점들과 매칭작업을 할 것이다.

그다음 데이터베이스에 일치하는 얼굴이 있다면 게이트를 열도록 게이트 모터를 제어할 것이고 아니면 얼굴을 다시 대라고 했을 것이다.

왜 이 이야기를 했느냐?

노드는 이 일련의 프로그램을 한 프로그램이 아닌 여러 프로그램으로 나눠 개발할 수 있도록 해주는 단위 프로세서의 개념이다.

위의 사례를 노드를 활용하여 재설계한다면 얼굴을 인식하는 카메라 노드 하나, 필터 노드 하나, 게이트 문을 여는 모터 노드 하나... 이런 식으로 각각의 노드로 설계할 수 있다.

이렇게 했을 때의 장점은 단위 테스트를 가능하게 해 주고 ros는 오픈소스이기 때문에 위에서 설계한 하나의 노드를 조금 변형하여 다른 거대 프로그램을 개발하는 데 있어서 단위 노드로써 가져다 쓸 수 있다.

예를 들어 위의 얼굴 인식 노드를 조금 수정하여 스마트폰 어플 '얼굴로 나이 추정 하는 어플'을 개발하는데 가져다 쓸 수 있을 것이다. 이런 식으로 몇 개의 일부 노드들은 그대로 가져다 쓸 수도 있을 것이다.(개발시간 매우 단축)

ros는 이러한 생태계를 지향한다. ros에서 노드는 기본이고 대부분의 ros거대 프로그램은 노드기반으로 만들어진다.

하지만 ros가 노드라는 특징만 갖고 있었다면 다음의 단점이 있을 것이다.

위의 예시에서 각각의 노드를 설계했다고 치면 각각의 노드에서 받고 처리한 데이터를 다른 노드로 넘겨줘야 하는데 어떻게 넘겨줘야 하는지 정해야 한다.

만약 20개의 노드로 이뤄진 프로그램이라면 이들이 유기적으로 연동되어야 한다. (어떻게 전송해야 하는지)

이때 나온 개념이 바로 통신이라는 개념이다.

이러한 통신을 위해 나온 방식이 메시지 통신이다. (이는 비단 이미지 데이터를 위한 통신을 이야기하는 것이 아니다.
imu센서데이터, 3D 거리 값, Depth값, 모터의 관절 값)

2. 패키지


하나 이상의 노드, 노드 실행을 위한 정보를 묶어 놓은 것.

위의 예시를 통해 설명하면, 만약 위의 프로그램이 20개의 노드로 이뤄져 있다면 이 노드들을 하나의 목적을 위해 묶어 놓은 것이다.

만약 20개 중 다른 목적을 위해 7개만 따로 재 묶음을 해도 이를 패키지로 만들 수 있다.

ros에는 약 5000개의 패키지들이 있다. 노드들은 훨씬 더 많을 것

그럼 어느 정도로 작게 나눠야 노드인가? : 이건 개발자 마음이다. 하지만 모터는 모터, 카메라는 카메라 이런 식으로 단위별로 나누는 것이 ros의 목적에 맞다.

3. 메시지


메시지에 대한 설명은 실제 프로그램을 작성하는 시간에 더 자세히 다룰 것이다.라고 함.

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

위에서 통신하는 방식으로 메시지 통신을 사용한다고 했는데 이 메시지 통신 방식에는 세 가지가 있다.

1. topic, publisher, subscriber


단방향, 연속성을 가진 통신 방식이다.

우선 ros에서는 노드끼리 통신한다고 했다. 통신을 할 때 메시지를 주고받게 되는데

메시지를 주는 노드가 publisher이고, 메시지를 받는 노드가 subscriber이다.

하나의 publisher 노드가 하나의 subscriber노드에게 메시지를 전달할 수도 있고(1:1),
하나의 publisher가 여러 개의 subscriber 노드에게 메시지를 전달할 수도 있고(1:N),
여러 개의 publisher가 여러 개의 subscriber 노드에게 메시지를 전달할 수도 있다.(N:N)
심지어 여러 개의 publisher가 하나의 subscriber 노드에게 메시지를 전달할 수도 있다.(N:1).


단, 처음에 설명했듯이 topic방식은 단방향이며( 메시지가 전달되는 방향이 publisher에서 subscriber 쪽으로)
연속성을 가진다.(계속 메시지를 보낸다.)

예를 들어서 A라는 카메가가 달린 로봇이 있는데 A가 B라는 로봇에게 카메라의 raw데이터를 전송하는 것뿐만 아니라 C, D, E라는 로봇들에게도 전달할 수 있다.

게다가 N:N, N:1도 가능하다.

예를 들어서 로봇의 위치정보를 갖고 있는 publisher노드가 위치정보가 담긴 topic(메시지)를 SLAM이라는 subscriber노드에게 전달하는 방식이 있다.

또한 전방의 물체로부터의 거리를 측정할 수 있는 거리센서 노드(publisher)를 갖고 있는 군집차량의 선두 차량의 노드가 뒤에 따라오는 B, C 차량들(2개의 subscriber)에게 메시지를 전달해 주는 방식도 있다.

2. survice, service server, service client


아까 토픽 같은 경우에는 단방향이고 연속성이라고 했다. 주로 센서데이터에 많이 쓰인다.

서비스는 양방향일 때 사용한다.

예를 들어 로봇 A에게 어느 위치 좌표로 이동하라고 서비스 서버에게 요청할 수 있다. 서비스 서버는 거기에 맞춰서 로봇을 동작시킬 수 있다. 마지막으로 요청한 서비스가 끝나면 끝났다고까지 알려주는 것이다.

메시지를 주고받기 때문에 양방향이고, 일회성이다. (토픽과는 다르다.)

요청사항을 주고받으면 접속이 끊기고 다시 서비스를 하려면 재접속을 해야 한다.

3. Action, Action server, Action client


서비스와 유사하게 서비스를 요청하고 그에 대한 액션 수행에 대한 결과 값을 전달해 주는 것은 같지만, Service와 다른 점은 client가 서비스를 요청한 이후에 서버가 결과를 다시 내보낼 때까지 server가 중간 결괏값을 전달해 주는 것이다.

강의자료에서는 청소를 예시로 들었는데 만약 Action client가 청소를 하라고 요청하면 Action server는 청소를 다 했는지 결괏값을 최종적으로 client에게 전달하기 이전에 중간 결과인 설거지, 빨래 등등의 중간 결과를 client에게 전달해 줄 수 있는 방식인 것이다.


* 추가 : 파라미터 서버 (ROS Master) 다른 통신 방식들과 유사하지만 좀 다름

어떤 변수를 마치 글로벌 변수처럼 네트워크에 지정해 놓을 수 있고 외부에서 그 변수의 값을 변경시킬 수 있고 그 값을 다른 노드에서 실시간으로(컴파일 필요 없이) 바로 받아서 사용할 수 있다.

ROS Master의 기능 중 일부이다.


----------------------------------------------------------
위의 세 가지 메시지 통신 방법들(Topic, Service, Action) 중에 가장 많이 쓰이는 방식은 topic방식이고 그다음으로 많이 쓰이는 방식은 Service, Action순서이다.

위에서는 3가지의 메시지 통신 방식이 어떻게 작동하는지 간단하게 살펴보았는데 이제 각각의 간략한 특징에 대해 살펴보자.

topic은 계속 프로세스를 처리해야 하기 때문에 네트워크라던지 CPU사용률이 높다. 반면에 service의 경우에는 자원사용에 대한 효율이 높다.

Action 방식의 경우에는 장시간으로 프로그램이 돌아가는 것에 쓰인다. (중간중간에 피드백을 줘야 하는 경우)
로봇 프로그램이 많이 복잡하고 많은 수행시간이 걸릴 경우 사용된다.

Action과 Service에서 사용되는 공통되는 용어로 Server와 Client라는 공통된 개념 용어가 있다.

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

메시지 통신이 동작되는 순서(원리)를 살펴보자.


ROS에서 가장 기본이 되는 기술적 포인트

1. 마스터 구동: XMLRPC(XML-Remmote Procedure Call) 서버


명령어 : $ roscore

ROS를 실행할 때 무조건 최소 한 번은 실행시켜줘야 한다.

마스터는 노드 정보들을 관리한다. 마스터 노드는 실제로 우리가 설계한 다른 노드들처럼 프로그램의 task(혹은 프로세스)를 수행하는 것은 아니지만 각 실행되는 노드들의 정보를 관리해서 노드들이 통신으로 연결되도록 해주는 역할을 한다.(실제 마스터를 통해(거쳐서) 항상 통신이 이뤄지는 것이 아니라 마스터는 노드끼리 직접적으로 통신할 수 있도록 해주는 것이다.)

2. 서브 스크라이버 노드 (Node) 구동 : XMLRPC 클라이언트


명령어 : $ rosrun 패키지이름 노드이름

위의 명령어가 실행되자마자 해당 노드의 정보가 마스터에게 전달된다.
어떤 정 보냐 하면 노드의 이름, 토픽의 이름, 어떤 형태의 메시지를 보낼 것인지(카메라인지, 모터인지에 따라 메시지의 형태가 정해져 있다.), ip정보와 port번호(이를 통해 다른 노드와 접속시킬 것이기 때문)

3. 퍼블리셔 노드(Node) 구동 : XMLRPC 클라이언트


명령어 : $rosrun 패키지이름 노드이름

두 번째로 구동시키 노드 역시 첫 번째로 구동시킨 노드와 마찬가지로 노드의 이름, 토픽의 이름, 메시지의 형태 정보, ip번호와 port번호를 마스터 노드에게 전달하게 된다.

4. 이제 마스터는 두 개의 노드로부터 받은 정보들을 바탕으로 두 개의 노드를 매칭해 준다.


마스터는 토픽이름과 메시지 형태 정보를 바탕으로 매칭하게 된다. (서로 같은 토픽인지, 그 메시지의 형태도 같은지를 확인한다.)

그게 맞았을 때는 두 번째에 구동된 퍼블리셔 노드의 정보를 마스터가 서브스크라이버 노드에게 전달해 준다.

그럼 이제 서브스크라이버 노드가 퍼블리셔노드의 모든 정보를 전달받았으므로 더 이상 마스터는 필요 없게 된다.

이제 서프스크라이버 노드가 퍼블리셔 노드의 정보를 이용하여 직접적으로 연결하게 된다.(publisher 노드에게 TCPROS 접속 요청) 요청을 받은 publisher는 다시 subscriber 노드에게 TCPROS응답을 하게 된다.

이제 그다음부터는 기존의 XMLRPC 형태의 통신 방식에서 TCPROS 방식으로 바뀌게 된다. (이제 마스터는 필요 없다.)

그다음부터 이제 두 노드 간의 메시지 통신이 이뤄지게 된다.

위의 메시지 통신 작동 과정을 우리가 처음에 실행했던 거북이 예제를 통해 복습해 보면 다음과 같다.

teleop_turtle이라는 노드에서 cml_vel(병진속도와 회전속도를 담고 있다.)이라는 메시지를 turtlesim노드에게 보낸 것이다.

이때 사용했던 rosrun이라는 명령어의 의미는 노드 하나를 실행시킨다는 뜻이다.

즉, 만약 rosrun turtlesim turtlesim_node라는 명령어의 의미는 turtlesim이라는 패키지의 turtlesim_node라는 노드를 실행시킨다는 명령이다.


참고 사이트

예를 들어서 내가 메시지 하나를 분석해보고 싶다 하면 다음의 사이트를 참고하면 된다.
http://wiki.ros.org/msg

이 중 일반적으로 많이 사용되는 메시지를 모아놓은 페이지는 다음과 같다.
http://wiki.ros.org/common_msgs

예를 들어서 우리가 예제에서 사용했던 (병진속도, 회전속도 : cmd_vel)의 메시지에 대해 분석해 보면

위의 사진에서 표시한 Vector3 linear(선(형) 속도 혹은 병진 속도), Vector3 angular(회전 속도)인데

더 나아가 Vector3가 의미하는 게 무엇인지 살펴보려면 아래의 Compact Message Definition 상자에 파란색으로 표시된 geometry_msgs/Vector3을 클릭해 보면 알 수 있다. (일단 상식으로는 벡터라는 것 방향과 크기를 가진 것으로 알고 있고 3이라는 숫자는 3차원 공간(3개의 변수)을 의미하는 것 같긴 하지만 아닐 수도 있다.)

예상한 것처럼 3개의 변수를 의미했고 마치 C언어 문법처럼 변수 앞의 자료형에 실수형 64bit를 표현하는 듯하다.
즉, Twist메시지를 쓴다는 것은 linear(병진 속도)의 정보는 3차원의 값(3개의 변수)을 가진 형태로 전송하게 되고, angular(회전 속도) 역시 3차원의 값(3개의 변수)을 가진 형태로 전송하게 된다. 총 6개의 속도값을 전송하게 된다.

이처럼 메시지 안에 메시지를 품고 있는 형태가 있을 수 있고 단순 자료형( 바로 int x 이런 식)으로 되어있거나 배열 같은 구조도 사용가능하게 되어있다. 이 외에도 메시지 안에 메시지 안에 메시지 안에 계속 있도록 만들 수도 있다. (사용자가 메시지 형태를 만들 수 있음) 위의 사이트에 없는 메시지 형태도 있을 수 있는데 그것들을 가져다 쓸 수도 있다.

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

네임(Names)


노드나 메시지(토픽, 서비스, 액션)는 이름(고유식별자)을 갖고 있는데 이들의 이름을 적절하게 지어서 관리할 수 있어야 한다. 왜냐하면 이름이 같으면 안 되기 때문이다.

예를 들어 똑같은 로봇 두 개를 동시에 실행시킬 때( 두 개의 로봇의 노드 이름을 바꿀 수 있다.)
또한 메시지를 보내는데 메시지 이름을 바꿔서 보내고 싶을 때 사용한다.

추후에 더 자세히 다룰 것이다.

좌표변환과 관련된 실습은 다음에 해볼 것이다.

클라이언트 라이브러리 : 굉장히 많이 있지만 우리는 일단 roscpp을 사용할 것이다.

이기종 디바이스 간의 통신도 나중에 실습해 볼 것이다. (이거 6강에서 실습함)

Chapter 6


Rviz에 대한 설명 (강의 자료 그대로 보면 됨)

한마디로 '시각화 툴' 숫자나 물리량들을 우리가 쉽게 볼 수 있도록 시각화해 주는 툴이다.

Rviz의 사용 예시

1. Kinect의 Point Cloud Data

Kinect라는 rgbd 카메라 센서인데 3차원상의 거리를 2차원상의 평면에 point(점)으로 표시해 준다.

빨간색이 카메라와 가까운 부분 파란색이 거리가 먼 부분이다.

2. 라이다(Lidar)(2D)

레이저 기반 거리센서 (위에서 봤을 때 마치 단면도를 보듯이 거리 데이터를 시각화해 준다.)



3. 초음파 센서


방사형태로써 거리를 파악하는 센서이지만 워낙 센서의 해상도가 낮기 때문에 거리를 측정한 다기보단 이 위치에 물체가 있다 정도로 활용하게 된다.

4. imu센서 데이터

가속도 기울기 센서 센서의 기울기 정도를 파악할 수 있다.

5. intel의 RealSense

왼쪽 사진은 Depth영상이고, 오른쪽 아래 사진은 IR영상이다.(적외선 카메라(밤에도 보임))

6. 위에서 설명한 Kinect를 활용한 프로그램 : 사람의 손이 가리키는 방향을 계산해서 시각화해 준다.



실습

rviz 실행

1. 3D 뷰인데 3차원 공간상에 내가 만약 로봇을 모델링한 것이 있다면 로봇이 보이게 될 것이다.
2. 디스플레이 옵션 : 색깔을 거리별로 변하게 할지, 점의 크기는 어떻게 할지 등등..
3. 생략
4. 툴 : 자주 사용 되는 것 --> 모바일 로봇에서 많이 쓰이는데, 2D Pose Estimate(현재 로봇의 위치를 대략적으로 추측하는 것), 2D Nav Goal(원하는 목적지가 있을 때 이 메뉴를 클릭하고 화면상에서 화살표를 지정하면 된다.)
5. 뷰형태 : 위에서 본 것 특정 축을 따라가서 보는 것, 등등
6. 실제시간과 시뮬레이터의 시간을 표시하는 것

디스플레이의 종류(ADD) 강의자료에 자세히 나옴)

RQT에 대한 설명 : 강의자료 그대로 빠르게 말하심

RQT의 사용 예시

웹브라우저를 띄워 볼 수 있고 토픽을 직접 보낼 수도 있다.

그리고 강의 초반에 turtlesim노드에 cmd_vel 메시지를 보낼 때 선속도와 회전속도를 조작시킬 수도 있다.

또한 데이터를 그래프(plot) 형태로 표현할 수 있다.

즉, 한마디로 코드로 명령할 수 있는 실행을 사용자가 보기 쉬운 GUI형태로 조작하기 편리하게 해 준다.(리눅스에서 파일을 접근할 때 터미널에서 ls 찾아서 하기도 하지만 어르신들은 폴도 아이콘 눌러서 여는 게 더 편하듯이 말이다.) 또한 개발자가 직접적으로 파악하기 힘든 raw 데이터 혹은 숫자 같은 것들을 시각화해 준다.

RQT 실습


처음에 강의에서 설명한 대로 uvc_camera를 사용하면 실행이 안된다. 오류 문구로는 uvc_camera 패키지를 찾을 수 없다고 나오는데 해당 오류에 대해 구글링을 해본 결과 ROS Melodic버전에서 더 이상 uvc_camera를 지원하지 않기 때문에

usb_cam을 사용해야 한다고 나와있었다.

https://blog.naver.com/PostView.nhn?blogId=angelkim88&logNo=221631642641

때문에 usb_cam을 활용하여 실습을 진행하였다.

이때 주의해야 할 사항이 있다.

1. 위의 포스트에 자잘한 오타가 있다. (audo --> sudo)

2. usb설정에서 카메라가 노트북에 연결이 되어있는 상태인지 확인해 볼 필요가 있다.
https://webnautes.tistory.com/1371

가상머신 상에서 웹캠을 연동하지 않았을 때(Before)

가상머신 상에서 웹캠을 연동했을 때(After)

만약 우분투를 듀얼부팅으로 설치했다면 2번의 과정은 생략해도 된다.

3. https://blog.naver.com/PostView.nhn?blogId=angelkim88&logNo=221631642641
해당 포스트에서 설명하는 대로 usb_cam 패키지 설치 및 실행
(추가적으로 만약 두개의 카메라를 사용하거나 내장 웹캠을 사용하지 않는경우 usb_cam-test.launch 파일에서 실행하는 어댑터를 /dev/video숫자 부분을 수정해 주어야 한다. 이때 만약 내장 웹캠만 연결 되어있을 경우

$ ls /dev/video*

에서 단순히 video0만 나타날 것이고

추가적으로 카메라를 usb 단자를 통해 연결시켰을 경우 video0 video1 video2....등등으로 카메라의 개수만큼 나올 것이다.

자동으로 설정이 되는 경우도 있지만 가끔 카메라 관련 드라이버를 서치해줘야 하는 경우도 있으니 유의해야 한다.)


4. 이 때 rosrun usb_cam usb_cam_node 를 실행했을 때 실행가능한 파일이 아니라면서

Couldn't executable 어쩌고 하면서 오류 메세지가 나온다면

$ source /opt/ros/melodic/setup.bash

라는 명령을 해줘야 한다. 우리가 처음에 ros를 설치할 때 환경설정으로 .bashrc 파일에 해당 설정이 자동으로 항상 쉘이 켜질 때마다 실행하도록 설정해 두었었지만 자동으로 실행되지 않는 경우가 있다.

위의 명령을 실행 한후 다시 usb_cam_node를 실행하면 정상적으로 작동할 것이다.

그리고 반드시 sudo apt update와 sudo apt upgrade를 해줘야 한다. 그리고 우분투 재부팅

위의 각각의 분할된 터미널을 보면

1행 1열의 터미널에서 roscore를 실행시켰고

1행 2열에는 usb_cam_node를 실행시킴으로써 카메라를 작동시켰다.

1행 4열에는 turtlesim_node를 실행시키고

2행 2열에는 rqt_image_view를 실행시켰다. rqt_image_view는 위에서 포스카 파이팅이라는 실습을 통해서도 확인했듯이 usb_cam노드로 부터 받은 raw데이터를 시각화시켜서 보여주게 된다.

2행 1열에는 echo 명령어를 통해 현재 어떤 raw데이터 값이 전달되고 있는지 확인할 수 있게 해 준다.

2행 3열에는 현재 통신이 이뤄지고 있는 topic들은 어떤 것들이 있는지 topiclist라는 명령을 통해 그 리스트들을 나열하여 볼 수 있다.

1행 3열에는 2행 3열에서 확인한 topiclist 중에 내가 알고자 하는 topic에 대한 정보를 알 수 있도록 하였는데 이 부분이 강의 내용과 조금 달랐다. 왜냐하면 나는 uvc_camera가 아닌 usb_cam을 사용하기 때문이다. 때문에 rostopic info /에 대한 명령도 조금 다를 수밖에 없었는데 이를 파악하기 위해 두 번 탭을 사용하였다.


2행 4열에는 teleop_key 노드를 실행시켰고

2행 5열에는 rqt_graph를 사용하여 현재 노드들의 통신 관계를 시각화하였다.

rqt_plot 실습


거북이의 속도정보를 그래프로 받아볼 수 있다.

rqt_bag 실습


Gazebo 설명

1. Gazebo는 물리엔진(ode(open dynamics engine, 불릿엔진 등등)을 탑재하여 실제 현상과 유사한 결과를 도출해 낼 수 있도록 시뮬레이션해 주는 도구인데 이때 물리엔진은 상황에 따라 유체, 충돌등등과 같이 본인이 중점적으로 시뮬레이션하고자 하는 환경에 대해 좀 더 자세히 묘사할 수 있는 엔진을 사용하면 된다. (여러 개의 물리엔진을 섞어서도 사용가능) https://ko.wikipedia.org/wiki/%EB%B6%88%EB%A6%BF_%EB%AC%BC%EB%A6%AC_%EC%97%94%EC%A7%84

불릿 물리 엔진 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

2. 다르파 챌린지(DARRPA)를 통해 더욱 발전됨 이후 빠르게 업데이트됨. 기하급수적 발전.
3. 굳이 ros와 연동하지 않고도 사용할 수도 있지만 ros와 시너지를 갖고 있음(호환성 좋음)
4. 각종센서들이 이미 플러그인 되어있음.(나무 사막환경 등)
5. 센서의 노이즈를 조정시킬 수 있음( 실제 센서에는 노이즈가 있기 때문)
6. urdf를 불러와서 시뮬레이션시킬 수 있다.
7. 터미널뿐만 아니라 GUI로도 잘되어있다.

이기종 디바이스 간의 통신(라즈베리파이로 실습)

집에 갖고 있는 컴퓨터가 노트북과 라즈베리파이(Raspberry pi 4) 밖에 없어서 라즈비안 운영체제가 설치되어 있는 라즈베리파이에 ROS를 설치한 후 이기종 디바이스 간의 통신을 실습해 보았다.

라즈베리파이에 ros를 설치할 경우 workspace의 파일 이름이 다르기 때문에 환결설정에 있는 설명 그대로 하게 되면 bashrc 설정에 오류를 겪게 된다. 때문에 다음과 같이 변경해 준다. (경로에 해당 파일이 없다고 해서 파일을 직접 확인해 본 결과 우분투에서 설치했던 파일이름과 달라서 이대로 변경해 주니 오류가 사라졌다.)


내 노트북의 카메라에서 촬영되는 영상을 라즈베리파이에서 확인할 수 있도록 하려고 했다.

우선, 내 컴퓨터의 ip주소를 알아야 하는데 내 노트북에는 가상환경 기반으로 ros가 설치되어 있기 때문에 바로 ip 주소를 확인할 수 없었다.(ifconfig 명령 시 오류)

때문에 다음의 명령을 통해 ifconfig가 동작하도록 해주어야 한다.

$ sudo apt-get install net-tools

이렇게 했을 경우 이제 비로소 ifconfig 명령이 통한다.

근데 라즈베리파이에서 ros관련 도구들이 실행이 잘 안 됐었다. 안드로이드 폰도 없어서 일단 실습은 여기까지 해보기로 했다.

앞으로 안드로이드로 실습하는 것에 대한 걱정으로 가상머신에 안드로이드 운영체제를 설치하는 도중.. 어차피 가상머신에는 imu센서가 없다는 걸 깨닫고 설치를 중단하려는 내 손을 막을 수 없었다....


다음 실습은 어떤 오류들이 기다리고 있을까.... 기대된다...!!

#uvc_camera