딥러닝 수업을 완료하고, 카이로스 2기에서는 ROS 개발을 위한 준비 작업으로 시스템 프로그래밍 강의를 들었다.
ROS 실행 환경은 window등 OS에서도 돌아가지만, OS 없이도 무료 플랫폼인 리눅스에서 돌아가기 때문에, 다른 많은 툴과 같이 가볍고 효율적인 리눅스 환경에 대해 아는 것이 중요하다고 생각된다.😮
또한 현재 배우고 있는 ROS2는 파이썬 개발을 지원하지만, ROS1이나 인터페이스 정의 등에서 C++ 기본 지식이 필요하기에 함께 진행하였다.
1. Linux
1-1) 환경설정
1-2) 명령어
1-3) 활용
2. C++
2-1) 생성자
2-2) 포인터 & 레퍼런스
2-3) Vector
1. Linux
1) 환경설정
우선 가정 먼저, 리눅스를 사용하기 위한 가상환경을 세팅하는데 어쩔 수 없이 참 긴 시간이 들었다 ^^
리눅스를 위한 가상환경을 구축하기 위해 가상머신으로는 Virtual Box를 깔고, 그 위에 우분투 Ubuntu 설치를 진행하였다.
우분투 버전은 ROS2 humble를 위해서는 22.04 버전으로 진행하면 되는데, 리눅스를 배울때는 20.04버전으로 사용했다.
Virtual Box 설정에서는 호스트키 설정과(Ctrl + Shift + Alt) 기본 os와 가상환경 간 클립보드 공유를 위한 설정(양방향) 등이 되어야 사용하기 편리하니 먼저 진행하도록 하자..
가상환경에는 터미널을 쉽게 다루기 위한 Terminator 와 vscode 등 필수적인 소프트웨어도 sudo 명령어를 통해 세팅해두었다.🥰
2) 명령어
리눅스를 잘 다루기 위해서는 명령어를 자유자재로 사용하는 것이 필수적이다.
처음에는 낯설고 GUI가 그리운 순간이 있었지만, 익숙해지니 마우스를 사용하지 않고 키워드만으로 모든 것을 처리할 수 있는 것의 편리함이 너무 좋았다!😎
ls (list) : 디렉토리 내 목록 보기
cd (change directory) : 현위치(폴더) 바꾸기
mkdir : 폴더 생성
mv : 파일/폴더 이동시키기
cp (soft copy) : 파일/폴더 복사 (단순 복사 - 원 파일 변경시 반영되지 않음)
ln (hard copy) : 파일/폴더 복사 (하드 카피 - 원 파일 변경시 같이 반영)
history : 이전 명령어 내역 보기
clear : 터미널 창 작성내용 지우기
가장 많이 사용한 명령어는 현위치를 바꾸는 cd와 내부를 확인하는 ls이다.
파일구조를 이해하면서 절대경로와 상대경로의 개념을 이해하고 적용할 수 있었다.
- 절대경로 : 무조건 루트 디렉토리부터의 고유한 경로 표현 ex) /kairos/hello/world/a.txt
- 상대경로 : 현재 작업 디렉토리에서부터의 상대적인 경로 표현 ex) ../world/a.txt
파일을 새로 쓰거나 읽는 것도 터미널 창에서 가능하다.
- touch + 파일명 : 신규 파일 생성
- cat + 파일명 : 해당 파일 내용 읽어오기
- cat > 파일명 : 해당 파일에 이후 내용 덮어쓰기
- cat >> 파일명 : 해당 파일에 이후 내용 뒤에 이어쓰기
- head/tail : 해당 파일의 앞부분/뒷부분만 읽어오기
3) 활용 (bashrc, 에디터)
번외로 terminator 창에 뜨는 줄마다 랜덤 이모지가 뜨도록 설정할 수 있다.🍉
이를 이해하기 위해서는 ~/.bashrc 파일을 우선 이해해야 한다.
.bashrc 파일을 통해 사용자 환경 설정을 자동으로 불러오도록 할 수 있기 때문에, 해당 파일에 alias 등을 설정해두면 터미널을 킬때마다 매번 수행하지 않고도 환경설정된 대로 즉시 사용이 가능하다.
fruits=(🍋 🍌 🍉 🍓 🍒 🥥 🥝 🥑)
PS1='$(echo -n ${fruits[RANDOM % ${#fruits[@]}]}) \u@\h:\w\$ '
리눅스 환경에서 많이 쓰는 에디터들에 대해서도 배웠다.
대표적으로 gedit, vim, nano 등을 사용하는데, 처음 직관적으로 사용하기에는 거의 윈도우 메모장이나 다름 없는 gedit이 가장 쉬워서 손이 많이 갔다.
그래도 리눅스와 결이 맞다고 생각되는 vim 에디터도 잘 쓰고 싶었는데, 연습이 많이 필요하지만 익숙해지면 정말 빠르게 쓸 수 있을 것 같았다.
shell file 에 대해서도 배웠는데 .sh 확장자 파일을 실행시켜 쉘에서 작동시킬 수 있다.
실습 예시로는 name.sh 만들고 sh 명령어로 실행시켜 echo 읽기를 아래와 같이 진행해보았다.
특이한 점으로는 expr 산식을 넣어 $뒤에 선언된 변수의 값을 사용할 수 있다는 점과, $0~ 시작되는 값들을 통해 쉘 파일일 실행될 때 넣은 인자를 불러올 수 있다는 점이다.
중간에 쉘에서 값을 가져오고 싶을때는 read 명령어를 사용할 수도 있다.🤗
2. C++
C++에 대해서는 처음 아두이노를 배울 당시에 기초적인 내용은 진행했었기 때문에 이번 강의에는 조금 심화된 활용면에 대해 배울 수 있었다.
특히 ROS에서 사용될 수 있는 클래스 개념, 포인터 개념, Vector에 대한 간단한 학습과 실습을 진행하였다.
1) 클래스
C++ 클래스를 배우면서 이번에 특히 흥미로웠던 점은 생성시 매개변수를 어떻게 넣는지에 따라 자동으로 각각 다른 생성자를 호출할 수 있다는 점이었다.😊
이것은 특히 변수의 타입을 먼저 지정하지 않고 들어오는 값에 따라 지정되는 파이썬과 다르게, 먼저 타입을 선언해야 하는 C언어의 특성에 의한 것이라고 생각되었다.
예를 들어 아래 코드와 같은 클래스를 만든다면, main()함수에서 아무 값도 넣어주지 않으면 num1, num2는 각각 0으로 초기화되고, 값을 넣으면 그 값으로 초기화되도록 하는 것을 하나의 클래스에 각각의 생성자로 지정해줄 수 있다.
class exClass
{
int num1;
int num2;
public:
exClass()
{
num1 = 0;
num2 = 0;
}
exClass(int n)
{
num1 = n;
num2 = 0;
}
exClass(int n1, int n2)
{
num1 = n1;
num2 = n2;
}
};
int main(void)
{
exClass sc1;
exClass sc2(100);
exClass sc3(100,200);
return 0;
}
2) 포인터 & 레퍼런스
다음으로 또 C++에서 매우 중요한 개념인 포인터와 레퍼런스도 간단히 다루었다.
내가 처음 C++를 배웠을때 들었던 것이, 두 사람이 서로 자리를 바꾸기 위해서는 의자가 몇개 필요한가? -> 3개 라는 농담이었는데, 이 예시로 hard copy, soft copy를 제일 많이 다루는 것 같다.
그리고 그때는 call by address를 메인으로 배웠던 것 같은데, 이번에는 call by reference를 더 많이 사용한다고 해서, 앞으로 C++을 사용할 일이 있다면 call by reference 문법으로 사용하는것으로..🤔
int a = 10;
int b = 20;
// Reference
int& ref = a;
ref = 30;
cout << "a : " << a << endl; // 30
// ref = b 불가
// Pointer
int* ptr = &a;
ptr = &b; // 변경 가능
*ptr = 40;
cout << "b : " << b << endl; // 40
3) Vector
마지막으로 굉장히 실제로 많이 사용하는 것으로 아는 Vector 클래스!
C++의 기본 배열과 다르게, 파이썬 List 처럼 가변 길이 배열을 구현할 수 있어서 나에게는 선녀와 같아 보였다.😂
기본적으로 push_back()으로 append()를 하지만, 인덱스를 통해 특정 위치에 있는 값들을 추가/삭제 등이 가능해서 활용도가 정말 높을 것 같다.
vector<string> v;
v.push_back("hello");
v.push_back("mamel");
v.push_back("my");
v.push_back("melody");
v.push_back("kitty");
cout << v[v.size() - 1] << endl;
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
시스템 프로그래밍 교육 후기👀
- 늘 느끼지만 제일 오래걸리고 제일 힘든건 정말로 환경설정이다.😇
- ROS를 위한 준비라고만 생각했는데, 생각보다 리눅스에 대해서 배울 부분도 많고 무엇보다 흥미로워서 놀랐다. 뭔가 그리고 '개발자'에 대한 외부의 이미지는 아무래도 검정 화면에 글씨를 다다닥 쓰는 해커같은(?) 이미지이지 않은가.. 그런 이미지를 충족할 수 있는 시간이 아닐까ㅎ
- 개발을 C++로 입문했지만.. 파이썬을 훨씬 오래다루게 된 입장으로서, 정말 C++을 메인으로 하는 회사에 가게 된다면 살아남을 수 있을까 하는 솔직한 심정..^^ 물론 반대로 C에서 되고 파이썬에서 안되는 게 있을테니 그러면 또 답답하겠지만은 지금으로서는 아니 왜 이게 안되는..? 하는 소소한 슬픔이 있는 시간이었다.
🌱 카이로스 2기에서 배운 딥러닝 강의들이 궁금하다면?
https://bagjo2884.tistory.com/24
[카이로스2기] 딥러닝 심화 교육1 : 전이학습, YOLO v8 with CV2
이번주는 딥러닝의 마지막 강의, 딥러닝 심화 교육을 진행하였다.PLC 이전에 진행했던 딥러닝 기초 강의에 대한 간단한 복습과 이어서, 아래와 같이 전이학습과 YOLO를 메인으로 심화 과정을 배웠
bagjo2884.tistory.com
https://bagjo2884.tistory.com/25
[카이로스2기] 딥러닝 심화 교육2 : YOLO v8 with myCobot
딥러닝 심화 두번째 교육에서는 YOLO 모델을 이어서 사용하되, 6축 로봇 myCobot을 함께 활용한 실습을 진행하였다.지난 아두이노때에 서보모터 3개를 이용한 3축 로봇암을 간단하게 사용해보았었
bagjo2884.tistory.com
다음 시간에는 드디어! 기다리고 기다리던 ROS 수업으로 만나요 🤖
'KAIROS 2기' 카테고리의 다른 글
[카이로스 2기] ROS2 기초 : 시리얼 통신(ESP), URDF (2) | 2024.10.13 |
---|---|
[카이로스2기] ROS2 기초 : 드디어 만난 ROS를 배워보자 (0) | 2024.10.06 |
[카이로스2기] 딥러닝 심화 교육2 : YOLO v8 with myCobot (5) | 2024.09.22 |
[카이로스2기] 딥러닝 심화 교육1 : 전이학습, YOLO v8 with CV2 (0) | 2024.09.15 |
[카이로스2기] PLC 기초3 : 음악분수, 모터 다단 제어, RC카 경주대회 (4) | 2024.09.08 |