로봇 운영 체제 소개: 궁극적인 로봇 응용 프레임워크
게시 됨: 2022-03-11로봇 운영 체제 (ROS)는 실제 운영 체제가 아니라 이기종 컴퓨터 클러스터에서 운영 체제의 기능을 제공하는 프레임워크 및 도구 집합입니다. 그 유용성은 로봇에 국한되지 않지만 제공되는 대부분의 도구는 주변 하드웨어 작업에 중점을 둡니다.
ROS는 2000개 이상의 패키지로 분할되며 각 패키지는 특수 기능을 제공합니다. 프레임워크에 연결된 도구의 수는 아마도 가장 큰 힘일 것입니다.
로봇 OS를 사용해야 하는 이유
ROS는 하드웨어 추상화, 장치 드라이버, 여러 시스템을 통한 프로세스 간 통신, 테스트 및 시각화를 위한 도구 등을 위한 기능을 제공합니다.
ROS의 주요 기능은 소프트웨어가 실행되는 방식과 통신하는 방식으로, 특정 하드웨어의 작동 방식을 몰라도 복잡한 소프트웨어를 설계할 수 있습니다. ROS는 프로세스 네트워크(노드)를 중앙 허브와 연결하는 방법을 제공합니다. 노드는 여러 장치에서 실행될 수 있으며 다양한 방법으로 해당 허브에 연결됩니다.
네트워크를 만드는 주요 방법은 요청 가능한 서비스를 제공하거나 다른 노드와의 게시자/가입자 연결을 정의하는 것입니다. 두 방법 모두 지정된 메시지 유형을 통해 통신합니다. 일부 유형은 핵심 패키지에서 제공되지만 메시지 유형은 개별 패키지에서 정의할 수 있습니다.
개발자는 작은 문제에 대해 기존 솔루션을 연결하여 복잡한 시스템을 구성할 수 있습니다. 시스템이 구현되는 방식을 통해 다음을 수행할 수 있습니다.
구성 요소를 즉시 유사한 인터페이스로 교체하여 다양한 변경을 위해 시스템을 중지할 필요가 없습니다.
여러 구성 요소의 출력을 다른 구성 요소에 대한 하나의 입력으로 다중화하여 다양한 문제의 병렬 해결 가능
메시징 시스템에 적절한 커넥터를 구현하기만 하면 다양한 프로그래밍 언어로 만들어진 컴포넌트를 연결하고, 다양한 개발자의 기존 모듈을 연결하여 소프트웨어 개발을 용이하게 합니다.
코드가 실행되는 위치와 프로세스 간 통신(IPC) 및 원격 프로시저 호출(RPC) 시스템 구현에 대해 걱정할 필요 없이 장치 네트워크를 통해 노드 생성
앞의 두 글머리 기호를 사용하여 추가 코드를 작성하지 않고 원격 하드웨어에서 요청 시 피드에 직접 연결
간단한 솔루션을 반복적으로 개발하여 이것이 얼마나 유용한지 보여줄 계획입니다. 다른 접근 방식에 비해 몇 가지 주요 이점이 있습니다. ROS는 다중 플랫폼을 지원하며 배후에서 처리되는 P2P 연결을 통해 여러 장치의 프로세스 간 연결을 허용합니다. 디자인은 C++ 통신 클래스를 래핑하거나 언어 인터페이스용 클래스를 수동으로 개발하여 모든 언어에 대한 지원을 허용합니다.
ROS는 커뮤니티를 위한 자체 커뮤니티에 의해 만들어집니다. 몇 년 후, 시스템 아키텍처 덕분에 통합하기 쉬운 재사용 가능한 패키지가 많이 나왔습니다.
MRPT, CARMEN, LCM, Player, Microsoft RDS 등과 같은 대체 접근 방식은 이러한 기능 중 일부를 제공하지만 전부는 아닙니다. 대부분의 경우 디자인의 단점은 언어 지원 제한, 프로세스 간의 최적화되지 않은 통신 또는 가장 수정하기 어려운 문제인 다양한 장치에 대한 지원 부족입니다.
무엇을 만들까요?
우리의 초점은 특정 문제에 대한 실제 알고리즘이 아니라 프레임워크이기 때문에 주어진 문제는 상당히 간단합니다. 우리의 목표는 컴퓨터의 게임패드와 로봇에 장착된 카메라의 피드를 사용하여 Wi-Fi를 통해 연결된 로봇을 원격으로 제어하고 모니터링할 수 있는 온보드 컴퓨터용 소프트웨어를 구축하는 것입니다.
우선, 우리는 ROS의 기본 원리를 보여주기 위해 간단한 시뮬레이션에 간단한 프로그램을 연결할 것입니다. 우리는 게임패드를 컴퓨터에 부착하고 게임패드 입력을 로봇의 제어 신호로 바꾸는 좋은 제어 체계를 설계하려고 노력할 것입니다.
ROS 코드를 작성하는 주요 언어는 C++와 Python이며, C++는 더 나은 성능으로 인해 선호됩니다. 코드의 상용구가 적고 명시적 빌드가 필요 없기 때문에 Python으로 예제를 설명합니다.
설치 및 구성
ROS 버전은 이름으로 참조됩니다. 이 날짜를 기준으로 최신 릴리스는 Jade Turtle 이며 최신 LTS 버전 Indigo Igloo 입니다. LTS 버전으로 가는 것이 바람직하고 ROS에서는 이전 버전과의 호환성이 보장되지 않으므로 모든 예제는 Indigo 용으로 작성됩니다.
ROS는 다양한 *NIX 플랫폼에서 사용할 수 있습니다. 공식적으로 지원되는 버전은 Ubuntu에 있습니다. OS X, Arch Linux, Debian, Raspbian 및 Android 버전은 커뮤니티에서 지원합니다.
데스크탑에 Ubuntu 14.04를 설치하는 과정을 살펴보겠습니다. 지원되는 모든 버전 및 플랫폼에 대한 프로세스는 공식 웹사이트에서 확인할 수 있습니다. ROS가 설치된 가상 머신도 사용할 수 있습니다.
설치는 플랫폼에 따라 다르지만(대부분의 플랫폼에는 패키지가 제공됨) 작업 공간 구성은 모든 플랫폼에서 동일합니다.
우분투에 설치
ROS는 자체 저장소를 제공합니다. 첫 번째 단계는 추가하는 것입니다.
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' sudo apt-key adv --keyserver hkp://pool.sks-keyservers.net --recv-key 0xB01FA116 sudo apt-get update
그런 다음 Ubuntu 버전에 사용할 수 있는 모든 ROS 버전에 대해 호스팅된 모든 패키지를 갖게 됩니다. 예를 들어 Ubuntu 14.04는 indigo
및 jade
를 지원합니다.
데스크탑에 기본 패키지를 설치하는 방법에는 다음 세 가지 옵션 중 하나가 있습니다.
최소 설치를 위해
sudo apt-get install ros-indigo-ros-base
기본 추가 GUI 도구를 사용하기 위한
sudo apt-get install ros-indigo-desktop
sudo apt-get install ros-indigo-desktop-full
은 탐색 및 인식을 위한 다양한 시뮬레이터 및 라이브러리를 포함한 모든 공식 기능을 제공합니다.
최상의 작업 환경을 위해 전체 옵션을 사용하는 것이 좋습니다. 노드를 실행하는 데만 사용되는 장치에 설치하는 경우 기본 버전으로 충분합니다. 어떤 옵션을 선택하든 다음을 실행하여 package_name
이라는 필요한 패키지를 설치할 수 있습니다.
sudo apt-get install ros-indigo-<package-name>
밑줄은 최종 이름에서 하이픈으로 대체되므로 stage_ros
는 ros-indigo-stage-ros
패키지에 있습니다.
다음 단계는 rosdep
를 초기화하는 것입니다. ROS의 패키지는 의존하는 구성 요소를 선언할 수 있습니다. rosdep
를 사용하면 너무 많은 수동 종속성 처리 없이 해당 패키지를 컴파일할 수 있습니다. 초기화하려면 다음을 호출하십시오.
sudo rosdep init rosdep update
ROS에는 도구에서 사용하는 여러 환경 변수가 있습니다. 기본 설치에서 초기화를 위한 bash 스크립트는 /opt/ros/indigo/setup.bash
에 있습니다. 변수는 모든 bash 세션 내에서 초기화되어야 하므로 가장 좋은 해결책은 변수를 ~/.bashrc
에 추가하는 것입니다.
echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc source ~/.bashrc
일부 패키지는 패키지로 제공되고 sudo apt-get install python-rosinstall
통해 설치되는 rosinstall
을 통해 외부 종속성을 설치합니다.
이것으로 우분투 설치가 끝났습니다. 다음은 작업 공간 설치에 대한 간단한 소개입니다.
구성
Groovy Galapagos 이후로 ROS 작업 공간은 catkin
을 통해 관리됩니다. 우리가 호스팅하는 모든 패키지에 대한 디렉토리를 정의해야 합니다. 디렉토리 내에 src
폴더를 만들고 그 안에 catkin_init_workspace
양식을 호출합니다. 그러면 현재 소스 ROS 버전에 대한 다양한 심볼릭 링크가 생성됩니다. 다음 단계는 이 작업 공간을 환경 변수에도 추가하는 것입니다.
이 전체 작업 공간 구성을 수행하려면 빈 디렉터리를 선택하고 다음 명령을 실행합니다.
mkdir src cd src catkin_init_workspace cd .. catkin_make echo "source $(pwd)/devel/setup.bash" >> ~/.bashrc source ~/.bashrc
이제 자신의 ROS 패키지를 만들 수 있는 작업 공간을 만들었습니다.
도구에 익숙해지기
코드를 만드는 것은 큰 도약입니다. 먼저 배후에서 실행되는 일부 시스템에 대해 알아보겠습니다. 첫 번째 단계는 기본 GUI를 실행하고 생성하는 메시지를 확인하는 것입니다.
ROS에서 무엇이든 실행하려면 핵심 프로세스를 시작해야 합니다. 새 터미널 창을 열고 다음을 입력하는 것만 큼 쉽습니다.
roscore
연결된 전체 장치 네트워크에서 통신 디스패치를 위한 중앙 허브를 호스팅할 장치에서 roscore
를 한 번만 실행하면 됩니다.
roscore
의 주요 역할은 노드에 연결해야 하는 다른 노드와 연결 방법(네트워크 포트 또는 공유 메모리를 통해)을 알려주는 것입니다. 목표는 모든 통신을 수행하는 데 필요한 시간과 대역폭을 최소화하면서 노드가 연결하려는 노드보다 알고 싶은 데이터에만 신경을 쓰도록 하는 것입니다.
rqt
roscore
를 실행한 후 ROS용 기본 GUI 도구인 rqt
를 실행할 수 있습니다. 우리가 보는 것은 매우 압도적입니다. 빈 창입니다. rqt
는 시각적 구성과 사전 정의된 보기로 구성할 수 있는 다양한 플러그인을 호스팅합니다.
먼저 Plugins > Robot Tools > Robot Steering
에서 Robot Steering 플러그인을 선택하여 실행해 보겠습니다. 우리가 얻는 것은 로봇이 갖기를 원하는 선형 및 회전 모션을 나타내는 두 개의 슬라이더입니다. 플러그인 상단에 /cmd_vel
이 있는 텍스트 상자가 있습니다. 우리는 우리가 원하는 무엇이든 이름을 바꿀 수 있습니다. 조정이 게시되는 주제의 이름을 나타냅니다. 터미널 도구는 백그라운드에서 진행 중인 작업을 볼 수 있는 가장 좋은 장소입니다.
터미널 도구
ROS에는 시스템에서 일어나는 일을 검사하기 위한 몇 가지 강력한 도구가 있습니다. 첫 번째로 소개할 도구는 rostopic
입니다. 이를 통해 노드가 구독하고 게시할 수 있는 주제를 검사할 수 있습니다. rostopic list
을 실행하면 다음이 생성됩니다.
/cmd_vel /rosout /rosout_agg
후자의 2가지 주제는 항상 실행 중이며 중앙 ROS 시스템과 관련이 있습니다. /cmd_vel
주제는 당사 운영팀에서 게시하고 있습니다. 스티어링에서 주제의 이름을 바꾸면 여기에서도 이름이 바뀝니다. 이제 우리는 주제 내에서 무슨 일이 일어나고 있는지에 관심이 있습니다. rostopic echo /cmd_vel
을 실행해도 아무 것도 표시되지 않습니다(슬라이더를 수정하지 않는 한). 취소할 때까지 프로세스가 실행됩니다. 이제 수직 슬라이더를 20m/s로 이동하겠습니다. 에코를 보면 다음이 계속해서 반복되는 것을 볼 수 있습니다.
linear: x: 0.2 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.0
얼마나 자주 이 메시지를 스팸합니까? rostopic hz /cmd_vel
은 평균 10Hz로 말합니다. 글쎄요, 느린 Wi-Fi 연결을 통해 이와 같은 주제를 얼마나 많이 실행할 수 있습니까? rostopic bw /cmd_vel
은 평균 480B/s를 감지합니다.
이제 모든 것이 훌륭하지만 메시지 유형에 대해 이야기했습니다. 이 데이터는 사람에게 유용하지만 응용 프로그램에는 원시 데이터가 필요하며 데이터를 해석할 수 있도록 메시지 유형을 알아야 합니다. 유형은 rostopic type /cmd_vel
로 결정될 수 있으며, 이는 geometry_msgs/Twist
임을 알려줍니다. 인수 없이 호출된 모든 ROS 터미널 도구는 표준 도움말 메시지를 반환합니다.
ROS Wiki는 이 문자열에 대한 웹 검색 결과에 포함된 내용과 구성 방식에 대한 Wiki 설명으로 충분합니다. 그러나 우리는 그것에 의존할 필요가 없습니다. rosmsg
는 메시지 유형에 대한 일반 도구입니다. rosmsg show geometry_msgs/Twist
를 실행하면 다음이 반환됩니다.
geometry_msgs/Vector3 linear float64 x float64 y float64 z geometry_msgs/Vector3 angular float64 x float64 y float64 z
메시지는 3D 공간에서 선형 및 각속도를 나타내는 두 개의 3D 벡터로 구성됩니다.
노드가 연결된 주제를 rosnode info <node-name>
이 노드에 대한 자세한 데이터를 제공합니다. 도구 rostopic
, rosmsg
및 rosnode
는 원시 ROS 기능을 검사하기 위한 주요 도구입니다. ROS에는 훨씬 더 많은 GUI 및 터미널 도구가 있지만 이러한 도구는 이 소개에서 다루지 않습니다.
ROS 노드를 실행하기 위한 주요 도구는 rusrun
및 roslaunch
입니다. rosrun
은 rosrun <package_name> <node_name>
을 통해 노드를 실행할 수 있고 roslaunch
는 시작 파일을 기반으로 노드를 실행할 수 있습니다. 이는 ROS 자동화의 가장 복잡한 요소이기 때문에 약간 익숙해질 것입니다.
첫 번째 코드 작업을 시작하기 위해 실행한 모든 것을 종료할 수 있습니다. 향후 참조를 위해 ROS와 관련된 모든 것을 실행하려면 roscore
의 활성 인스턴스가 필요하다는 것은 말할 필요도 없습니다. roscore
가 실행되는 터미널 창을 닫고 새 창을 열어 다시 실행하면 많은 문제를 해결할 수 있습니다. 이것은 bash
와 roscore
모두에서 다시 로드해야 하는 모든 종속성을 업데이트합니다.
게임패드 원격 조작 만들기
우리의 첫 번째 목표는 게임패드 입력을 기반으로 geometry_msgs/Twist
데이터를 /cmd_vel
에 게시하는 노드를 생성하여 Robot Steering
의 기능을 모방하는 것입니다. 우리의 첫 번째 목적지는 joy
패키지입니다.
joy
패키지
joy
패키지는 조이스틱 및 게임패드용 일반 ROS 드라이버를 제공합니다. 기본 설치에 포함되어 있지 않으므로 다음을 통해 설치해야 합니다.
sudo apt-get install ros-indigo-joy
설치가 rosrun joy joy_node
를 실행할 수 있습니다. 그러면 기본 조이스틱이나 게임패드에 연결됩니다. rostopic list
를 실행하면 /joy
라는 주제가 있음을 알 수 있습니다. rostopic echo
를 통해 들으면 다음 형식의 메시지가 표시됩니다(메시지를 게시하려면 게임패드 또는 조이스틱과 상호 작용해야 함).
header: seq: 4156 stamp: secs: 1450707466 nsecs: 204517084 frame_id: '' axes: [0.0, 0.0, 0.0, -0.0, 0.0, 0.0, 0.0, 0.0] buttons: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
지금은 헤더를 무시해도 됩니다. 그 외에 우리는 axes
과 buttons
이 무엇을 나타내는지 잘 설명하고 있습니다. 축을 이동하고 컨트롤러의 버튼을 누르면 이 숫자가 변경됩니다. 도구를 사용하여 메시지 유형이 sensor_msgs/Joy
이고 형식이 다음과 같은지 확인할 수 있습니다.

std_msgs/Header header uint32 seq time stamp string frame_id float32[] axes int32[] buttons
원격 조작 만들기
코드 작성의 첫 번째 단계는 패키지를 만드는 것입니다. 작업 공간의 src
폴더 내에서 다음을 실행합니다.
catkin_create_pkg toptal_tutorial rospy joy geometry_msgs sensor_msgs
여기에 우리가 만들고자 하는 패키지의 이름과 의존할 패키지의 이름을 명시합니다. 걱정하지 마세요. 종속성은 나중에 수동으로 업데이트할 수 있습니다.
이제 toptal_tutorial
폴더가 있습니다. 폴더 내에서 모든 Python 스크립트를 저장할 scripts
폴더를 만듭니다.
teleop.py
라는 파일을 만들고 그 안에 다음을 설정하겠습니다.
#!/usr/bin/env python import rospy from sensor_msgs.msg import Joy def joy_callback(data): print data def main(): rospy.init_node('teleop') rospy.Subscriber('joy', Joy, joy_callback) while not rospy.is_shutdown(): pass if __name__ == '__main__': main()
스크립트를 실행할 수 있도록 chmod +x teleop.py
도 설정해야 합니다. 한 터미널에서 rosrun joy joy_node
를 실행하고 다른 터미널에서 rosrun toptal_tutorial teleop.py
를 실행하면 teleop.py
의 터미널 출력이 Joy 메시지로 채워집니다.
코드가 하는 일을 살펴보겠습니다.
먼저 ROS 프레임워크와 상호 작용하기 위한 라이브러리를 호스팅하는 rospy를 가져옵니다. 메시지를 정의하는 각 패키지에는 메시지 정의가 포함된 msg
하위 패키지가 있습니다. 입력을 처리하기 위해 Joy
를 가져오고 있습니다. 명시적으로 언급하지 않는 한 포함된 메시지 유형(예: Joy
메시지에 있는 std_msgs.msg
의 Header
)을 가져올 필요가 없습니다.
첫 번째 단계는 특정 이름으로 노드를 초기화하는 것입니다(이 경우 "teleop"이라고 함). 그런 다음 sensor_msgs.msg.Joy
유형의 "joy" 주제를 구독하고 joy_callback
함수를 호출하여 각 메시지를 처리하는 구독자를 만듭니다. 콜백은 메시지에서 데이터인 하나의 매개변수를 수신합니다. 데이터 멤버에 액세스하는 것은 간단합니다. 첫 번째 축의 상태를 인쇄하려는 경우 메시지 유형을 호출하면 print data.axes[0]
을 호출하고 부동 소수점이 됩니다. 끝의 루프는 ROS가 종료될 때까지 루프합니다.
다음 단계는 데이터를 어떻게든 처리하는 것입니다. 입력에 따라 변경되는 Twist 메시지를 만든 다음 cmd_vel
주제에 게시해야 합니다.
#!/usr/bin/env python import rospy from sensor_msgs.msg import Joy from geometry_msgs.msg import Twist # new from functools import partial # new def joy_callback(pub, data): # modified cmd_vel = Twist() # new cmd_vel.linear.x = data.axes[1] # new cmd_vel.angular.z = data.axes[0] # new pub.publish(cmd_vel) # new def main(): rospy.init_node('teleop') pub = rospy.Publisher('cmd_vel', Twist, queue_size=1000) # new rospy.Subscriber('joy', Joy, partial(joy_callback, pub)) # modified while not rospy.is_shutdown(): pass if __name__ == '__main__': main()
먼저 Twist
메시지를 추가하고 functools.partial
을 통해 바인딩 함수 인수에 대한 지원을 추가합니다. Twist
유형의 메시지를 cmd_vel
에 게시하는 게시자 pub
를 만듭니다. 해당 게시자를 콜백에 바인딩하고 처음 두 축이 나타내는 속도로 모든 입력에 대해 Twist 메시지를 게시하도록 합니다. 이 코드는 우리가 예상한 대로 수행되며 rostopic echo /cmd_vel
을 통해 결과 출력을 볼 수 있습니다.
아직 한 가지 문제가 있습니다. /joy
주제는 좋은 속도로 게시할 수 있습니다. rostopic hz /cmd_vel
을 모니터링하고 아날로그 스틱을 원으로 움직이면 많은 메시지를 볼 수 있습니다. 이는 많은 양의 통신을 초래할 뿐만 아니라 이러한 메시지를 수신하는 프로세스에서 각각을 처리해야 합니다. 그 데이터를 그렇게 자주 퍼블리싱할 필요는 없고, 10Hz의 안정적인 속도로 퍼블리싱하는 것이 좋습니다. 다음 코드로 이를 수행할 수 있습니다.
#!/usr/bin/env python import rospy from sensor_msgs.msg import Joy from geometry_msgs.msg import Twist from functools import partial def joy_callback(cmd_vel, data): # modified cmd_vel.linear.x = data.axes[1] cmd_vel.angular.z = data.axes[0] # moved pub.publish(cmd_vel) to main loop def main(): rospy.init_node('teleop') cmd_vel = Twist() # new pub = rospy.Publisher('cmd_vel', Twist, queue_size=1000) rospy.Subscriber('joy', Joy, partial(joy_callback, cmd_vel)) # modified rate = rospy.Rate(10) # new while not rospy.is_shutdown(): pub.publish(cmd_vel) # new rate.sleep() # new if __name__ == '__main__': main()
변경 가능한 Twist
객체를 수신하고 루프 내에서 수정하도록 콜백을 수정했습니다. rospy.Rate
의 sleep
기능은 안정적인 출력 주파수를 유지합니다.
최종 코드는 /cmd_vel
주제가 10Hz에서 속도 명령을 받아 Robot Steering rqt
플러그인의 출력을 모방합니다.
시뮬레이션된 시스템 실행
세계 시뮬레이션
우리의 첫 번째 목표는 달성하고자 하는 시나리오를 시뮬레이션할 수 있는 환경을 만드는 것입니다. stage_ros
패키지 내의 노드 stageros
를 사용하면 이미지를 통해 정의된 2D 스테이지 내에서 하나의 로봇을 실행할 수 있습니다. 세계 파일에 대한 stage_ros
패키지와 이를 생성하는 방법에 대해 설명하는 전체 구문이 있습니다. 그것은 매우 간단하지만 우리의 범위를 벗어납니다. 운 좋게도 패키지에는 여러 데모 세계가 포함되어 있습니다. 먼저 다음을 실행하여 파일 디렉토리로 이동합니다.
roscd stage_ros cd world
폴더 안에는 여러 파일이 있습니다. 하나 실행해 봅시다.
rosrun stage_ros stageros willow-erratic.world
이것은 여러 주제를 만들었습니다. 각각의 의미는 패키지와 함께 문서화되어 있습니다. 중요한 부분은 cmd_vel
이 있다는 것입니다.
표시된 단계에는 제어하는 로봇을 나타내는 파란색 사각형이 있습니다. 코드나 로봇 조종 을 사용하여 이 로봇을 제어할 수 있습니다. 시도해보십시오.
시작 파일을 통한 시스템 설정
패키지 내에 launch
폴더를 만들고 그 안에 teleop.launch
라는 파일을 만들어 보겠습니다. 최종 폴더 구조는 다음과 같아야 합니다.
toptal_tutorial/ ├── CMakeLists.txt ├── launch │ └── teleop.launch ├── package.xml ├── scripts │ └── teleop.py └── src
teleop.launch
파일 내에서 노드 집합과 상호 연결을 정의합니다.
<launch> <arg name="world_file" default="$(find stage_ros)/world/willow-four-erratics-multisensor.world" /> <node pkg="stage_ros" type="stageros" name="simulated_world" args="$(arg world_file)"></node> <group ns="robot_0"> <node pkg="joy" type="joy_node" name="joy_input"></node> <node pkg="toptal_tutorial" type="teleop.py" name="joy_convert"></node> </group> </launch>
새로운 세계는 4개의 로봇으로 구성되며 각 주제에는 robot_<n>
접두사가 있습니다. 따라서 로봇 번호 0에는 robot_0/cmd_vel
이라는 속도 명령 항목이 있습니다. 이것이 우리가 제어를 robot_0
이라는 네임스페이스 내에 두어 이름을 새 형식으로 조정하는 이유입니다. 그런 의미에서 주제 이름을 파일 시스템의 폴더로 생각할 수 있습니다.
실행 파일을 실행하려면 roscore
가 필요하지 않습니다. 어떤 의미에서 roscore
는 아무 것도 하지 않는 런치파일의 특별한 경우일 뿐입니다. roscore
가 없으면 실행된 첫 번째 실행 파일만 코어를 실행하고 나머지는 코어에 연결합니다. 이제 다음을 사용하여 출시를 실행합니다.
roslaunch toptal_tutorial teleop.launch
모든 것이 정확하면 4개의 로봇이 있는 시뮬레이터가 생성되며 그 중 하나는 게임패드 또는 조이스틱으로 제어됩니다. 이 세계는 이전 세계보다 훨씬 더 많은 것을 가지고 있습니다. 4개의 로봇 각각에는 다음이 포함됩니다.
/robot_<n>/base_pose_ground_truth /robot_<n>/base_scan_0 /robot_<n>/base_scan_1 /robot_<n>/camera_info_0 /robot_<n>/camera_info_1 /robot_<n>/cmd_vel /robot_<n>/depth_0 /robot_<n>/depth_1 /robot_<n>/image_0 /robot_<n>/image_1 /robot_<n>/odom
<n>
을 0, 1, 2 또는 3으로 바꿉니다. 이것은 마지막 주제로 이어집니다.
rqt
로 데이터 보기
우리는 rqt
에 대해 너무 깊이 들어가지 않았지만 더 복잡한 데이터를 보기 위한 완벽한 도구입니다. 모든 주제로 실험할 수 있지만 우리는 image_0
, image_1
, depth_0
및 depth_1
주제에 중점을 둡니다.
rqt
를 실행하고 열려 있는 플러그인을 제거해 보겠습니다. 이제 4개의 이미지 시각화 도구( Plugins > Visualization > Image View
)를 열고 2x2 그리드 형태로 배치합니다. 마지막으로 각 보기의 왼쪽 상단에서 robot_0
에 대해 명시된 네 가지 주제 중 하나를 선택하겠습니다.
우리가 얻는 것은 저해상도 카메라로 깊이 인식이 가능한 스테레오 비전입니다. 입력 시스템이 없었더라면 이 결과를 얻을 수도 있었다는 점을 명심하십시오. 이것을 실행하면( stage_ros/world
폴더 내에서):
rosrun stage_ros stageros willow-four-erratics-multisensor.world
/robot_0/cmd_vel
이라는 주제와 함께 Robot Steering 플러그인을 추가하면 컨트롤이 온스크린 슬라이더가 되어도 동일한 결과를 얻을 수 있습니다.
실제 시스템에 결과 적용하기
많은 하드웨어가 ROS를 완벽하게 지원하며 종종 타사 자원 봉사자가 제공합니다. 많은 로봇 플랫폼에는 이러한 유형의 메시지를 생성하는 드라이버가 있으며 ROS에는 웹캠을 사용하고 이미지 피드를 게시하는 노드가 있습니다.
마지막 결과는 우리가 달성하고자 하는 것을 시뮬레이션한 것이지만 다음 수정을 통해 동일한 결과를 얻을 수 있습니다.
- 로봇의 온보드 컴퓨터에 ROS 설치
- ROS를 기본 플랫폼과 카메라, 레이저 거리 측정기 등과 같은 모든 고급 센서에 연결하는 온보드 컴퓨터용 실행 파일을 만듭니다. 필요한 노드는 이미 존재할 수 있거나 한쪽에는 ROS에 대한 게시자/가입자를 만들고 다른 한쪽에는 직렬 통신용 드라이버를 만들어 구현할 수 있습니다.
- 시작 시 실행 파일을 실행합니다.
- 원격 컴퓨터
export ROS_MASTER_URI=http://<robot_hostname>:11311/
을 bash 시작에 추가하여 원격 컴퓨터가 주어진 호스트 이름과 포트에서roscore
를 찾도록 합니다. - 로봇 모니터링 및 제어를 위한
rqt
및/또는 모든 스크립트 실행
이것이 실제로 귀결되는 것은 원격 장치에서 적절한 환경 변수를 내보내고 나머지는 스스로 처리하는 것입니다. 컴퓨터 클러스터에서 ROS를 실행하려면 모든 컴퓨터에 대해 한 단계만 수행하면 됩니다.
결론
우리는 아주 적은 양의 코딩으로 원하는 대로 조작할 수 있는 복잡한 변수 시스템을 가질 수 있는 방법을 보여주었습니다. 간단한 게시자/가입자 시스템을 사용하면 특정 요소의 기본 구현에 대해 걱정하지 않으면서 컴퓨터 클러스터에서 데이터를 처리하는 소프트웨어 파이프라인을 빠르게 개발할 수 있습니다.
우리는 간단한 시뮬레이터를 사용했지만, gazebo
(전체 데스크톱 버전에도 포함)와 같은 더 복잡한 시뮬레이터를 사용하면 물리학 및 복잡한 센서로 3D 세계를 생성할 수 있으며 개발되기 훨씬 전에 최종 결과와 제품에 대한 경험을 제공할 수 있습니다.
이 소개는 매우 기본적인 내용이었지만 이 다재다능한 프레임워크 작업에 더 관심을 갖게 되었기를 바랍니다.