Introduce
ROS를 처음 공부하기 위해 블로그를 찾아본 결과 아래와 같은 사이트
https://robertchoi.gitbook.io/ros/
ROS 하루에 입문하기 - ROS 하루에 입문하기
문서 작성을 위해서 최규남, 이상우, 성규현, 설윤호, 하희목, 하지현, 김영주님이 분담하여, 작성하였습니다.
robertchoi.gitbook.io
를 발견하게 되어 다음 블로그 포스팅에 대한 공부 기록을 하고자 한다
ROS는 로봇 응용프로그램을 개발할 때 필요한 하드웨어 추상화, 하위 디바이스 제어, 센싱, 인식, 슬램, 네비게이션 등의 기능 구현 및 메시지 전달, 패키지 관리, 개발 환경에 필요한 라이브러리와 다양한 개발 및 디버깅 도구를 제공하는 오픈 소스 기반의 로봇 메타 OS이다.
여기서 메타OS라는 점에서 즉, 윈도우, 리눅스, 맥OS 위에 있는 운영체제이기 때문에
ROS로 여러가지 통합 세팅이 가능한 것이다
팁으로
모든 소스는 BSD 라이센스(Berkeley Software Distribution License)로 해당 저작권자의 이름을 같이 배포하면, 수정/배포에 제약을 받지 않는다.
즉, 저작권자의 이름을 밝히고 자유롭게 사용하자
환경세팅
추천하는 환경세팅은
-
리눅스 OS : Ubuntu 16.04.x Xenial Xerus LTSROS : ROS Kinetic Kame가제보 : Gazebo 7.x
이지만 눈물나게도 이미 우분투 20.04를 깔았기 때문에 도전을 해보고자 한다
파일 형식
ROS는 XML파일 형식으로 기술 문서를 정의한다 -> 로봇의 하드웨어를 표현할 수 있기 때문이란다
여기서 XML 파일이란
XML
확장자가 .xml로 끝나는 파일을 말하고 제작으로 사용되는 마크업 언어이다
비슷한 용으로 HTML 이 있는데 이건 웹을 구축하기 위해서 만듬
XML의 근본적인 목표는 데이터를 기술하기 위한 언어 이여서 데이터 변환이 주용도 이다
-> 브라우저 , 메모장, Excel, xml 뷰어를 통해 열수 있다
2022 XML 파일과 그 여는 방법을 철저히 설명
XML 파일은 태그로 구성된 데이터로, 이를 이용하여 소프트웨어간에 데이터가 교환됩니다. 이 페이지에서는 XML 파일이란 무엇이며 XML 파일을 여는 방법을 자세히 설명합니다.
recoverit.wondershare.kr
터틀봇 버거
현재 우리가 진행하고 있는 연구가 터틀봇 3의 버거 모델이기 때문에 다음과 같은 부분은 스크립트 하기로 하였다
-
대용량 Li-Po 배터리
-
로보티즈의 다이나믹셀을 이용한 2개의 바퀴
-
OpenCR 제어 보드
-
라즈베리파이를 이용한 싱글보드컴퓨터
-
다양한 모양으로 변경이 가능한 프레임
-
360도 슬램과 네비게이션을 위한 LiDAR
운영체제
ROS가 지원되는 운영체젠는 다양하지만
공식적으로는 우분투만 지원을 하고 있다
우분투의 16.04는 현재 가장 많은 라이브러리를 가지고 있고
18.04 는 비교적 최신 버전의 ROS를 사용하기 위해 필요하고
ROS 1의 최신버전을 사용하고 싶으면 20.04를 다운로드 받아야하는데
필자는 20,04를 아직은 추천하지 않는다고 한다 (라이브러리가 많이 없어서 ㅠㅜ)
-> 근데 2년전 글이니깐 지금은 괜찮지 않을까 싶다
또한 가상머신은 추천하지 않고 우분투를 영어로 설치하는 것을 추천한다고 한다
우분투에 ROS 설치하기
제일 먼저
wget을 통해 다음을 가져오자
기본적으로 우분투 20.04는 noetic를 사용한다고 한다
http://wiki.ros.org/noetic/Installation/Ubuntu
noetic/Installation/Ubuntu - ROS Wiki
If you rely on these packages, please support OSRF. These packages are built and hosted on infrastructure maintained and paid for by the Open Source Robotics Foundation, a 501(c)(3) non-profit organization. If OSRF were to receive one penny for each downlo
wiki.ros.org
다음 e-manual에 따라서 설치를 하도록 하자
위에 카테고리에 본인이 맞는 ROS 버전을 선택하는 것에 대해 주의하자
https://emanual.robotis.com/docs/en/platform/turtlebot3/quick-start/
ROBOTIS e-Manual
emanual.robotis.com
참고로 좀 많이 다운로드 받았던 kinetic은 라즈베리파이 4를 지원하지 않는 다고 한다
다음 코드를 통해서 ROS 를 다운로드 받아주자
$ sudo apt update
$ sudo apt upgrade
$ wget https://raw.githubusercontent.com/ROBOTIS-GIT/robotis_tools/master/install_ros_noetic.sh
$ chmod 755 ./install_ros_noetic.sh
$ bash ./install_ros_noetic.sh
뭔가 위에 작업을 해준다면 깔릴 거 같지만
e-manual 에 Install Dependent ROS Packages 라는 말이 조금 중이적인 거 같아서 한번 더 아래의 코드를 실행 시켜준다
sudo apt-get install ros-noetic-joy ros-noetic-teleop-twist-joy \
ros-noetic-teleop-twist-keyboard ros-noetic-laser-proc \
ros-noetic-rgbd-launch ros-noetic-rosserial-arduino \
ros-noetic-rosserial-python ros-noetic-rosserial-client \
ros-noetic-rosserial-msgs ros-noetic-amcl ros-noetic-map-server \
ros-noetic-move-base ros-noetic-urdf ros-noetic-xacro \
ros-noetic-compressed-image-transport ros-noetic-rqt* ros-noetic-rviz \
ros-noetic-gmapping ros-noetic-navigation ros-noetic-interactive-markers
근데 아마 안해줘도 될 것 같긴 하다
Ros- noetic-desktop-full
In most cases, you will want to install ros-noetic-desktop-full for full ROS experience.
If you installed the Ubuntu desktop version, you would want to install ros-noetic-desktop-full with all the desktop packages. This metapackage is what we run here. But occasionally, if you are installing on a robot that does not have to have any GUI, you want to install ros-noetic-ros-base to save some space and avoid some ROS packages using your CPU and memory resources. In the following, I will explain each ROS metapackage.
위에 말을 요약을 하자면
대부분의 사람들은 desktop-full을 원하지만 만약 컴퓨터에서 작업할 경우 이 명령어 가 상관이 없다
하지만 로봇 같은 경우는 GUI도 없고 어쩌피 full performance를 기대하기 어렵기 때문에 환경에 맞춰서
아래의 코드 중 원하는 것을 골라서 다운받으면 된다
참고로 Desktop-full 은 최소 2.7GB 를 사용하여서 992개의 라이브러리를 가지고 있고 대충 10 분정도 걸린다
sudo apt-get install [아래 옵션들 중 하나]
ros-noetic-desktop-full
ros-noetic-desktop
ros-noetic-ros-base
ros-noetic-ros-core
나머지 옵션들에 대한 정보는
https://varhowto.com/install-ros-noetic-ubuntu-20-04/
How to Install ROS Noetic on Ubuntu 20.04 - VarHowto
Here you will learn how to install ROS Noetic on Ubuntu 20.04. Specifically, you will learn how to set up the official ROS repo, add official ROS keyring to
varhowto.com
여기에서 확인을 할 수 있다
소스 리스트 추가
ROS 저장소로부터 패키지를 내려 받기 위해
(ROS 저장소에는 다양한 유용한 패키지가 포함되어 있으며 이를 다운로드 받아서 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://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
그러고 나서 패키지 인덱스를 업데이트 해준다
sudo apt-get update && sudo apt-get upgrade -y
다양한 rqt 플러그 인을 사용하기 위해 아래의 코드를 수행
sudo apt-get install ros-noetic-rqt*
여기서 rqt란 ROS 에서 제공하는 모니터링 도구이다
rqt는 GUI 개발에 쓰이는 Qt Framework 기반의 ROS Software framework이다
https://enssionaut.com/board_robotics/957
로봇 - ROS(Robot Operating System) 개념과 활용 - 6. rqt를 이용한 데이터 모니터링
ROS는 로봇으로부터 얻을 수 있는 데이터를 쉽게 확인하고 관리할 수 있도록 rqt라고 하는 모니터링 도구를 제공합니다. rqt는 GUI 개발에 쓰이는 Qt framework 기반의 ROS software framework입니다. rqt는 우
enssionaut.com
rosdep 초기화
ROS 를 사용하기 전에 반드시 rosdep 을 초기화해야 한다. Rosdep 은 ros 의 핵심 컴포넌트들을 사용하거나 컴파일 할 때 의존성패키지를 쉽게 설치하여 사용자 편의성을 높여주는 기능이다.
sudo rosdep init
rosdep update
추가로 위 블로그 대로 진행해 주면 된다
https://robertchoi.gitbook.io/ros/install
2장 ROS 설치하기 - ROS 하루에 입문하기
자신이 사용하려는 ROS버전에 따라서 우부투 역시 다른 버전을 준비하여야 한다. 현재 가장 많은 패키지를 가지고 있는 것은 16.04버전을 설치하여 사용할 수 있는 키네틱 버전이고, 비교적 최신
robertchoi.gitbook.io
만약 환경설정 파일을 못 찾겠다면
잘 찾아보면 있다
혹시 최상단에 잘 나갔는지 확인하는 것도 방법이다
여기에 들어가면 setup.bash라는 파일에 환경변수 들이 정의가 되어 있다
source 명령어는 스크립트 파일을 수정한 후에 수정된 값을 바로 적용하기 위서 사용한다
예를 들면 /etc/bashrc 등에 아무리 파일을 수정하여도 재부팅하거나 재 로그인 하지 않으면
적용/변경이 되지 않지만 source 명령어로 바로 적용이 가능하다
source /opt/ros/noetic/setup.bash
ROS 환경설정
위와 같이 환경설정을 부를 때 마다 저렇게 치기 귀찮기 때문에 이러한 번거로움을 없에거
기타 설정을 불러들이기 위해 gedit으로 bashrc를 편집하자
gedit ~/.bashrc
이렇게 창이 열리는데
다음과 같은 코드를 덮어쓰기 한다
맨 아래에 있다 (export에 관한 설명은 아래에 있다)
alias eb =‘nano ~/.bashrc'
alias sb ='source ~/.bashrc'
alias cw ='cd ~/catkin_ws'
alias cs ='cd ~/catkin_ws/src'
alias cm ='cd ~/catkin_ws && catkin_make'
source /opt/ros/kinetic/setup.bash
source ~/catkin_ws/devel/setup.bash
export ROS_MASTER_URI=http://localhost:11311
export ROS_HOSTNAME=localhost
#export ROS_MASTER_URI=http://192.168.1.100:11311
#export ROS_HOSTNAME=192.168.1.100
또한 ROS 는 catkin이라는 ROS 전용 빌드 시스템을 사용하고 있기 때문에
Catkin 작업 폴더를 생성하고 초기화 해주자
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
여기서 catkin이란
Catkin
catkin이란 공통된 source를 가지는 ROS 패키지들을 하나로 묶어 관리하는 workspace이다
쉽게 생각하면 GItHub에 main 이고 나머지 package 들이 branch 들이라 생각하면 편하다
그래서 다음과 같이 작업 폴더를 만들어 준 다음
mkdir -p 옵션은 존재하지 않는 중간의 디렉토리까지 자동으로 생성 해준다
-p 없으면 경로로 이름을 선언할 때 중간다리가 없으면 error가 나온다
mkdir -p ~/catkin_ws/src
접근을 해주자
cd ~/catkin_ws/src
여기에서 ~/ 의 의미는 계정의 디렉토리의 함축어이다
만약의 사용자 이름이 kist라고 하면
~/download : /home/kist/download 이다
처음 한번만 초기화를 시켜줘야한다 (git init이랑 비슷하다고 생각)
catkin_init_workspace
이렇게 text 파일 하나 생기면 성공
시험 삼아서 catkin_make를 이용해서 빌드를 해보면
주의점 : 실행위치는 src의 상위 폴더인 workspace 에 있어야 한다 (capkin_ws)
catkin_make
ls
실행 결과에
Build
Devel
Src
다음과 같이 있으면 성공이다
여기에 catkin 빌드 시스템과 관련된 환경 파일을 불러보면
source ~/catkin_ws/devel/setup.bash
이렇게 나오게 되면 성공
TurtleBot3 Packages
마지막으로 TurtleBot3 Packages를 다운로드 해주자
$ sudo apt install ros-noetic-dynamixel-sdk
$ sudo apt install ros-noetic-turtlebot3-msgs
$ sudo apt install ros-noetic-turtlebot3
Network Configuration
NTP (Network Time Protocol)
아래의 코드를 통해 NTP를 설정 함으로써 서로 다른 pc간의 시간 오차를 줄일 수 있다
sudo apt-get install -y chrony ntpdate
sudo ntpdate -q ntp.ubuntu.com
이쯤에서 중간 점검도 할 겸 운영체제의 변수들을 출력해보자
env
이런 식으로 여러가지 정보를 볼 수 있다
ROS Python version이나
ROS_PACKAG_PATH
등등 볼 수 있다
만약 여기에 나만의 변수를 추가하고 싶으면 어떻게 해야할까???
여기서 등장하는 것이 "쉘 변수" 이다
쉘 변수 (echo)
운영체제 변수 (환경변수)를 설명하기전에 설명하는 것이 쉘 변수 이다
쉘 변수란 터미널 내에서의 변수를 이야기 하는 것이다
만약에 TEST_VAR = "YOO_SJ" 라는 변수를 추가한다고 가정해 본다면
TEST_VAR="YOO _SJ"
이렇게 적기만 하면 될까??
처리는 되지만 아무런 변화도 안보인다
만약 이후에
TEST_VAR
라고 하면
없다고 한다
그러면 이것을 출력하고 싶으면 어떻게 할까?
그때 echo를 이용하면 된다
echo TEST_VAR
echo $TEST_VAR
두개의 차이는
$가 붙으면 그 변수가 품고있는 값을 출력하는 것이고
$가 없으면 그 변수 자체를 출력하는 것이다
하지만 여기서 문제점이 만약 다른 터미널을 띄우고 똑같은 작업을 진행한다면
다음과 같이 $TEST_VAR 에서 아무것도 출력되지 않는 것을 확인할 수 있다
즉, 쉘변수는 그 터미널에서만 유의미한 값을 가지는 지역변수라는 것이다
이렇게 만들어진 쉘 변수를 신분 상승을 시켜서 환경변수로 저장을 하고 싶다면 사용하는 것이 export이다
export TEST_VAR
하지만 여기서 환경변수를 올렸다고 해서 전역변수이거나 비휘발성 변수가 되는 것이 아니다
엄밀히 말하면 "임시 환경변수"라는 표현이 적절하다
즉, 그 터미널 내에서만 유의미한 값인 것이다
하지만 터미널을 끄지 않고 env를 쳐보면 나오기는 할 것이다 (찾기 힘든거지 분명히 있다)
그렇다면 "진짜 환경변수" 즉 비휘발성이고 전역변수로 만들고 싶으면 어떻게 하면 되냐
bashrc 파일을 수정하면 된다
bashrc 파일은 무슨 일이 있지 않는 이상 홈 디렉토리에 있다
****
.bashrc
Dot file의 한 종류이며 bash가 interactive shell
(user input에 의해 script가 실행되는 shell mode)로 실행될 때 먼저 자동적으로 실행.
여기에 관련 설정을 넣어 두면 새 터미널을 열 때마다 그 명령이 수행.
***
당연히 추가를 한 이후에
중요한 것은 그냥 bashrc라고 치면 아무것도 안보인다 (없는 파일)
.bashrc 이다
왜인지는 모르겠지만 절대 띄어쓰기를 하면 인식을 잘 못하는 듯하다
export TEST_VAR = "YOO_SJ"
export TEST_VAR="YOO_SJ"
export TEST_VAR= "YOO_SJ"
위에서 "변수= "은 정상적으로 작동이 되지만 "변수 =" 은 정상적으로 기능하지 않는다
bash: export: `=': not a valid identifier 라는 오류가 나오는데
찾아보니 그냥 붙여서 쓰라고 한다
ROS 네트워크 설정
가장 중요한 변수 두개는
ROS_MASTER_URI
ROS_HOSTNAME
이다
ROS의 기본 통신 방식은 네트워크를 이용한 노드 간의 메시지 통신이다
둘 다 자신의 네트워크 IP를 입력해주면 된다고 한다
만약 다음과 같이
export ROS_MASTER_URI = http://localhost:11311
export ROS_HOSTNAME = localhost
HOSTNAME에 localhost라고 적는 경우
이는 하나의 PC에서 모든 ROS패키지를 구동하는 상황
즉 <SIngle machone configuration>
하지만 ROS는 기본적으로 TCP/IP통신 기반으로 반들어졌기 때문에 두개 이상의 디바이스에서 통신이 가능하다
먼저 다시 말하지만 IP통신 기반이므로
다음 라이브러리가 깔려있어야한다
sudo apt install net-tools
깔고나면
ifconfig
위의 코드가 되는지 확인 하고 넘어가 주자
읽는 방법은
- IPv4주소(inet),
- 서브넷마스트(netmask),
- 브로드캐스트주소(broadcast)
- MAC주소(ether)도 표시된다.
- eth0 : 유선랜 , wlan : 와이파이
만약 두대의 상황을 가정한다음 다음과 같이 바꿔 줘야한다
다음 단계로 넘어가기 위해서는 GATEWAY가 필요한데 다음과 같은 코드들로 알수 있다
route
netstat -r
ip route
리눅스 게이트웨이 확인 - 제타위키
다음 문자열 포함...
zetawiki.com
여기서 본인 IP가 맞는지 확인하는 방법은
ping <IP주소>
자기 자신의 IP주소를 날려서
신호가 돌아오면 자기 자신이 맞다
여기서 추가로
아래에서 나올
":11311" 의 의미는 master의 주소를 설정해 주지 않으면 기본으로 부여 되는 값이다
밑에 나올 변수를 사용하기 위해서 다음 사이트의 정보를 요약해 보자
http://wiki.ros.org/ROS/NetworkSetup
ROS/NetworkSetup - ROS Wiki
ROS is a distributed computing environment. A running ROS system can comprise dozens, even hundreds of nodes, spread across multiple machines. Depending on how the system is configured, any node may need to communicate with any other node, at any time. As
wiki.ros.org
http://wiki.ros.org/ROS/EnvironmentVariables
ROS/EnvironmentVariables - ROS Wiki
There are many environment variables that you can set to affect the behavior of ROS. Of these, the most important to understand are ROS_MASTER_URI, ROS_ROOT, and ROS_PACKAGE_PATH as they are commonly used in the system and frequently mentioned in documenta
wiki.ros.org
- ROS_MASTER_URI
- ROS_HOSTNAME
- ROS_IP
ROS_MASTER_URI
ROS_MASTER_URI is a required setting that tells nodes where they can locate the master.
The ROS_MASTER_URI is an important environment variable that tells a Node where the Master is
export ROS_MASTER_URI=http://mia:11311/
즉, 다시 말해서 ROS_MASTER_URI는 rescore를 실행하는 마스터의 IP를 적어주는 것이다
(Node에게 어디에 Master가 있는지를 알려주는 역활)
예. A (master) 에 a,b,c,d (slave)가 묶여있는 상황이라면
A,a,b,c,d, 전부 ROS_MASTER_URI에 A의 IP를 적어주면 된다
다음과 같은 예시를 들을 수 있다
<MASTER>
export ROS_IP=192.168.11.11 # Master IP address
export ROS_HOSTNAME=${ROS_IP}
export ROS_MASTER_URI=http://${ROS_IP}:11311
<주변기기>
export ROS_IP=192.168.22.22 # My IP address
export ROS_HOSTNAME=${ROS_IP}
export ROS_MASTER_URI=http://192.168.11.11:11311 # Master IP address
즉, 나의 IP가 바뀌었을 때 일일이 바꾸는 것이 귀찮으므로 다음과 같이 변수로 저장을 한다음
${ROS_IP}를 하용하여서 이용할 수 있지만
주변기기의 ROS_MASTER_URI 부분은 MASTER_IP를 고정 박아야 한다
그렇다면 HOSTNAME은 무엇일까?
ROS_HOSTNAME
Use ROS_HOSTNAME if you are specifying a host name
ROS_HOSTNAME is never set to the name of another machine,
always to the name of the machine running the node.
But unless you have working DNS for all involved hosts, using ROS_IP is probably going to be easier.
ROS_HOSTNAME affect the network address of a Node and ROS_NAMESPACE lets you change its namespace
export ROS_IP=192.168.22.22 # My IP address
export ROS_HOSTNAME=${ROS_IP}
ROS_HOSTNAME은 DNS (Domain Name System)를 사용할 경우 쓰고
https://aws.amazon.com/ko/route53/what-is-dns/
DNS란 무엇입니까? – DNS 소개 - AWS
12개월 동안 AWS 프리 티어에 액세스하고 연중무휴 24시간 고객 서비스, 지원 포럼 등을 비롯한 AWS Basic Support의 기능을 사용할 수 있습니다. 현재 Amazon Route 53는 AWS 프리 티어에서 제공되지 않는다
aws.amazon.com
ROS_IP는 IP를 사용할 경우에 쓴다
ROS_IP and ROS_HOSTNAME are optional environment variable that sets the declared network address of a ROS Node or tool
둘의 공통점은 둘다 ROS Node (즉 본인의) Network address를 알려주는 방식이다
ROS_IP
Use ROS_IP if you are specifying an IP address
export ROS_IP=192.168.22.22 # My IP address
export ROS_HOSTNAME=${ROS_IP}
예시 :
<master pc>
GATEWAY : 192.111.1.1
IP : 192.222.2.22
<Robot>
GATEWAY : 192.888.8.8
IP : 192.999.9.99
라 가정을 하자
<MASTER PC> -> roscore의 의미 : MASTER PC를 작동시키겠다
ROS_HOSTNAME=192.999.9.99
ROS_MASTER_URI=http://192.888.8.8
<HOST PC> -> ex) ROBOTS
ROS_HOSTNAME=192.999.9.99
ROS_MASTER_URI=http://192.888.8.8
<ROS 통신 방식>
마지막으로 Master 와 Host 를 구현하기에 앞서
ROS의 통신 방식을 알아보자
<Python 환경으로 예시를 들겠다>
위에 그림에서 Node들 끼리 Message 주고 받는 것을 볼 수 있다
이 Message를 주고 받는 방식을 이해하려면
Publisher / Subscriber 개념을 알아야 한다
<Publisher / Subscriber>
- Publisher
신문으로 예시를 드는 것이 편하다
신문에서 출판사 역할을 Publisher가 한다고 생각하면 된다
출판사가 타겟을 정해놓고 발해아하는 것이 아닌
"다 보세요~" 하면서 정보를 뿌리듯이
Publisher 또한 하나의 데이터 풀장을 만들어 준다
지금 참고하고 있는 블로그에 적절한 짤이 있어서 첨부해보았다
그러면 이걸 누가 줍줍하냐 -> 이것이 Subscriber이다
- Subscriber
Subscriber는 신문에 모든 정보를 읽지는 않는다
(나한테 필요한 정보만을 제목을 보고 읽듯이)
즉, 같은 ROS 네트워크 상에 존재하는 특정 토픽명을 가진 메시지가 발행되는 것을 주시하고
그 메세지가 발생 되면 이벤트 리스터를 실행한다
그러면 이러한 관계를 어떻게 만들까?
<catkin_ws Tree 구조>
조금 검색해 보면 catkin_ws 즉 Ros workspace는 다음과 같은 구조를 가진다고 한다
catkin_ws
├── build
├── devel
└── src
└── CMakeLists.txt
근데 나는 src 밖에 없다
이는 다음과 같은 방법으로 해결할 수 있다
먼저 workspace에 접근을 해준 다음 (없다면 아래의 mkdir 을 통해 만들도록 하자)
초기화를 시켜주자
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace
위에 코드를 실행시키면 catkin_ws/src에 CMakeLists.txt 라는 파일이 생긴다
그 다음 빌드를 하기위해 src의 상위 폴더로 나가 주고
다음 코드를 실행시키면
cd ~/catkin_ws/
catkin_make
무언가가 우다다 나오면서
build와 devel 폴더가 나온다
공식문서를 확인해보면
catkin_make는 catkin 작업공간과 같이 사용하기에 무척 편리한 명령입니다. 현재 폴더를 살펴보면 'build'와 'devel'폴더가 생긴 것을 알 수 있습니다. 'devel'폴더의 안에는 몇 가지 setup.*sh파일이 들어있습니다. 이 파일들을 쉘에 등록하면 이 작업공간이 ROS 환경의 최상위에 오버레이됩니다. 자세한 이해를 위해서는 catkin링크를 이용하시길 바랍니다. 새로운 setup.*sh파일을 쉘에 적용하기 전에 아래를 참고하시길 바랍니다.
작업공간을 ROS 환경의 최상위에 오버레이 하려면 아래의 코드를 실행시켜주자
source devel/setup.bash
이제 다시 본론으로 돌아와서
다음 세개의 폴더 build, devel, src 중에 src 폴더 안에 패키지를 생성해 주자
(workspace안에 패키지를 묶어서 사용한다 했으므로)
그러면 패키지를 어떻게 만드냐
아래의 ROS Wiki를 참고해보자!!
roscreate - ROS Wiki
melodic noetic Show EOL distros: EOL distros: electric fuerte groovy hydro indigo jade kinetic lunar diamondback: Only showing information from the released package extracted on Unknown. No API documentation available. Please see this page for in
wiki.ros.org
roscreate contains the roscreate-pkg and roscreate-stack tools
roscreate에 둘다 포함이 되어 있다고 한다
단, 주의점으로
the directory that you run roscreate-pkg in matters. You must run it in a directory that can be located from your
ROS_PACKAGE_PATH (see ROS environment variables). Furthermore, you cannot run it inside of another ROS package.
pkg를 돌리는 디렉토리 위치를 주의하라고 한다
package 만들기
roscreate-pkg pkgname
패키지에 접근하기 (cd 와 동일)
roscd pkgname
본인의 경우 pkg_test라는 패키지를 만들었다
그 다음에 python을 기반으로 작업을 진행 할 것이므로 app.py를 패키지 내부에 src폴더를 만들어서 넣어줬다
mkdir -p ./pkg_test/src/app.py
이렇게 패키지 만들면 큰일 납니다 -> 사실 상관 없을 수도...??
<rqt_graph Error 해결> 부분을 참고하세여
roscreate - ROS Wiki
melodic noetic Show EOL distros: EOL distros: electric fuerte groovy hydro indigo jade kinetic lunar diamondback: Only showing information from the released package extracted on Unknown. No API documentation available. Please see this page for in
wiki.ros.org
이거 대로 만드셔야 합니다
(중간에 폴더하나를 바로 만들려고 p 옵션을 사용하였다)
저래 했더니 app.py 이름으로 된 폴더가 생겨서
그냥 다시 만들었다
vi python
vsc로 app.py를 열어주고
다음의 코드를 적었다
예시
from rospy import Publisher, Rate, init_node
from std_msgs.msg import Int64
import rospy
if __name__ == '__main__':
init_node("publisher_test") #publisher_test라는 node를 만들어 줌
publisher = Publisher(name="simple_pub", data_class=Int64, queue_size=1)
#simple_pub이라는 이름의 topic을 가지는 Int64 타입의 Publisher
'''Publisher parameter
name : Publisher가 발행하는 topic 이름 (ROS 네트워크 상에서 존재하는 유니크한 값),
data_class : Publisher가 발행할 메세지 타입(클래스),-> Ros에서 제공해주는 메세지 클래스(std_msg 라이브러리에서 가져와야한다)
ex) Int64 -> from std_msgs.msg import Int64
queue_size : 데이터의 Queue 사이즈,
subscriber_listener,
tcp_nodelay,
latch,
headers,
'''
rospy.spin() #해당 노드가 멈추지 않고 돌 수 있도록 해줌
위에 코드에서
Publisher에 필수 parameter는 name 과 data_class 와 queue_size 이다
여기서 data_class 는 우리가 하고 싶은 대로 적는 것이 아닌 정해진 것을 가져다 써야한다 합니다
저에 경우 std_msgs 에서 가져왔습니다
그 다음 터미널에서 다음 코드를 실행시키면
추가로
roscore / rosrun
- roscore
ROS Master None, ROS Param Server 등을 한번에 작동 시키는 코드
- rosrun
Node를 실행시키는 코드로써 rosrun <pkg_name><node_name>의 구조를 가지는 노드를 실행시키는 명령어
roscore && rosrun pkg_test app.py
아무일도 일어나지 않는다
하지만 무언가가 돌아가고 있다는 것은 직감적으로 알 수 있는데
다음 코드를 실행해보면
<rqt_graph>
ROS 에서 제공하는 시각화 도구의 일종으로 노드와 토픽간의 연결관계를 시각화해서 보여준다
rqt_graph
<rqt_graph Error 해결>
하려고 했지만
자 언젠가는 고칠 수 있겠죠???
저를 믿고 기록을 이어 나가 보겠습니다
오류 내용은 다음과 같습니다
PluginManager._load_plugin() could not load plugin "rqt_graph/RosGraph": RosPyPluginProvider._init_node() could not find ROS master
자 대충 끝에만 읽어보면 ROS master를 찾지 못했다고 하네요
그리고 앞에 경고창을 보면 먼저 roscore를 실행해보라고 조언을 해줍니다
해봅시다!
진짜 모르겠음 ㅠㅠㅠ
보면 ROS_MASTER_URI는 제대로 들어가 있는 것을 볼 수 있습니다
그러면 저게 문제일까요??
ping 날려 봅시다
주소에는 문제가 없어보입니다
구글링을 해보면
위에 깃허브에서 달린 대화가 제가 유일하게 해결할 수 있는 실마리인데요
(솔직히 저렇게 대답하는건 저도 할 수 있을거 같네요..)
그래도 물어볼 사람이 없으니 곰곰히 되짚어 봅시다
자 첫번째 문제점을 발견하였습니다
코드가 틀렸나 싶어서 예제코드를 붙여서 실행해보았습니다
rosrun pkg_test app.py
없다고 나오는 것이 이상하여서 다시 차차 본 결과
mkdir 로 패키지를 만든 것을 확인 할 수 있었다
이렇게 만들면 이건 디렉토리지 패키지가 아니다
아 살짝 졸면서 했는데 이게 이런 파장을 가져올 줄이야...
다시 제대로 만들어 줍시다
roscreate-pkg pkg_test
pkg_test 부분에는 본인이 만들고 싶은 이름을 적으면 됩니다
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
ROS 개발자 너무 귀엽지 않나요????
저 다급한 모습
ROS_PACKAGE_PATH에 안 만들어졌다고 다급해 합니다
wiki를 보면 필수는 아니라 하네요
http://wiki.ros.org/ROS/EnvironmentVariables
ROS/EnvironmentVariables - ROS Wiki
There are many environment variables that you can set to affect the behavior of ROS. Of these, the most important to understand are ROS_MASTER_URI, ROS_ROOT, and ROS_PACKAGE_PATH as they are commonly used in the system and frequently mentioned in documenta
wiki.ros.org
export ROS_PACKAGE_PATH= ~/catkin_ws/src 이렇게 적어줬습니다
잘 만들어졌는지 확인하는 코드
roscd pkg_test
자 안된다고 나옵니다...
뭐가 문제일까요??
하라는 대로 해봅시다
상위 폴더로 가서
source devel/setup.bash
해도 접근을 못하네요
자! 이러면 뭔가가 꼬인 것입니다
차분하게 ~/catkin_ws/src에서
cd ..
~/catkin_ws로 올라가 주시고
rm -rf build/ devel/
기존의 build 와 devel을 삭제해줍시다
catkin_make 다시하려고요!!
그 다음 현재 디렉토리가 catkin_ws인지 확인하고
catkin_make
이게 제일 정확합니다
주우욱 나오는 거 보고
cd src
roscd pkg_test
해 본다면!!
roscd: No such package/stack 'pkg_test'
안된다고 하지만 이는 setup을 안해서 입니다
/catkin_ws 에서 밑에 코드를 돌리면
source devel/setup.bash
다시 src로 가고 cd 해보면
cd src
roscd pkg_test
야호 ㅠㅠㅠ
위와 똑같이 src 만들고 app.py를 만들고 코드 ~~~~~~~ 해주면
그리고 혹시 몰라 바꾼 .bashrc에 환경변수 localhost부분도 원래 IP로 바꾼다음
printenv
해주면 아직 바뀌지 않은 것을 확인할 수 있다
그냥 새 터미널을 띄우면 바뀐다
roscore
해보면
RLException: Invalid <param> tag: Cannot load command parameter [rosversion]: command [['rosversion', 'roslaunch']] returned with code [1].
이건 또 뭘까
source /opt/ros/noetic/setup.bash
이걸로 해결
돌려보면
또 패키지 못찾겠덴다 ....
근성을 가지고
아래의 코드 실행
source ~/catkin_ws/devel/setup.bash
rospack profile
프로파일 해줬더니 위치를 잡아냈다...
해...치웠나??
어림도 없지!!!
뭐가 문젤까...
[rosrun] Couldn't find executable named app.py below /home/kist/catkin_ws/src/pkg_test
[rosrun] Found the following, but they're either not files, [rosrun] or not executable:
[rosrun] /home/kist/catkin_ws/src/pkg_test/src/app.py
chmod +x app.py
권한 문제인 것 같아서 실행 권한을 부여하였다
실행하면
좀 되라 ㅠㅠㅠㅠㅠㅠ
저거는 python 환경세팅 문제라고 한다
코드 맨위에 다음 코드를 추가하자
#!/usr/bin/env python3
중간에 오류나서
다시 생각해보니
pkg_test 를 또 cd 로 접근해서 생긴 문제다
다시 rosrun 하고
rqt_graph띄운 결과
비록 빈화면이지만 띄워는 봤다...
내일 다시 차분히 정리해보자
http://wiki.ros.org/ROS/NetworkSetup
ROS/NetworkSetup - ROS Wiki
ROS is a distributed computing environment. A running ROS system can comprise dozens, even hundreds of nodes, spread across multiple machines. Depending on how the system is configured, any node may need to communicate with any other node, at any time. As
wiki.ros.org
그 다음 추후 그림은 다음과 같이
아 참고로 noetic은 ROS 1이고
본인의 ROS 버전을 확인하고 싶으면
rosversion -d
를 하면 확인할 수 있다 (noetic)
'Robotics > ROS' 카테고리의 다른 글
[Robotics] ROS를 이용한 Publisher/Subscriber (0) | 2023.03.28 |
---|---|
[Robotics] ROS 명령어 및 용어 정리 (0) | 2023.03.28 |
[Robotics] 아두이노 우분투 개발환경 설정 (0) | 2023.03.23 |
[Robotics] 라즈베리파이 원격 연결 (1) | 2023.03.13 |
[Robotics] ROS에 관하여 (0) | 2023.03.07 |