[LoG]
최초작성 : 23.3.3
수정 : 23.3.20 , 3.23(사진 입력)

 

- 평소 우분투를 사용하는 유저인데 오디오, 그래픽, 비디오, 포토그래피, 출판 등의 목적을 위한 우분투 스튜디오가 있다는 사실을 알게 됨

- 이게 다 무료라고? (영상편집이 나도 모르게 업무에 활용되기에 우분투의 성능을 테스트해 보기로 함)

- 결론 : 우분투 재단은 정말 선한 영향력을 행사하는 조직이라고 생각한다. 이 많은 SW를 무료로 개발해서 제공하니, 감사할 따름이다. (단 설치할 때는 쉽지 않음. 노트북, PC 마다 설정을 변경해줘야 하는 이슈들이 종종 있음)

 

1. 링크 : https://ubuntustudio.org/

23.3.3 홈페이지 화면

(1-1) LTS 버전인 22.04.2로 다운로드 : [파일명] ubuntustudio-22.04.2-dvd-amd64 (4.76GB)

(1-2) Rufus로 부팅 디스크 만들기 (아무래도 동영상 편집을 위한 PC의 요구사양이 높다 보니 파티션 구성은 GPT로 설정) -  ISO (이미지로 굽기) (소요시간 : 14~20분) 

파티션 GPT 설정시 에러 메시지 뜸

(1-3) PC 설치

(1-3-1) F2 버튼 - BIOS 환경 진입 - Boot 순서 USB 로 변경

(1-3-2) BIOS 진입 -  Security - Delete all Secure Boot variables - "Yes" 

 

2. 문제

- GIGABYTE 에서 디자인한 RX7G (AORUS 17G) Laptop 에  설치 시도.

- 증상 : https://askubuntu.com/questions/1416862/cant-install-ubuntu-or-any-linux-distro-on-gigabyte-b450-aorus

부팅USB가 안 읽히고 멈춰있음

- USB 로 부팅하게 하기 위해선 안전부팅(Secure Boot)를 해제 해주고 시도 하니 GNU GRUB 화면(설치 가능화면)이 나옴 (1-3-2)

이 화면이 어찌나 반가우던지요 (이틀 걸림)

(1-3-3) Try or Install Ubuntu Studio가 아래와 같은 상황이 생긴다면 두번째 Ubuntu Studio (safe graphics)로 들어가기

설치 과정 중에 뜨는 에러 화면메시지들... 그냥 일단 설치하고 업그레이드 해서 고쳐 보기로 함

 

(1-3-4)  Ubuntu Studio (safe graphics) - 바탕화면에 install 아이콘으로 설치 (설치 과정은 생략)

뭔가 감성적인 듯한 UI (라즈베리파이 OS 같은 느낌이였어요)

 

(1-3-5) 드디어 에러 메시지와 함께 설치 완료. 험난한 길이 예상되네요. 

 

-끝-

 

[참고]

1. 원문 : https://www.python.org/dev/peps/pep-0008/

2. 파이썬 코딩의 기술(개정2판) /  브렛 슬라킨 저 / 길벗

 

- 파이썬 코드를 작성할 때는 항상 PEP8 (파이썬 개선 제안 #8) 스타일 가이드를 따르기
- 큰 파이썬 커뮤니티와 공통된 스타일을 공유하면 다른 사람과 협력할 때 도움이 됨
- 일관성 있는 스타일을 사용하면 나중에 자신이 작성한 코드를 직접 수정할 때 더 수월함

(1) 공백(whitespace) / 탭, 스페이스, 새줄(newline) 등의 문자를 모두 합한 말


- 탭 대신 스페이스를 사용해 들여쓰기
- 문법적으로 중요한 들여쓰기에는 4칸 스페이스 사용하기
- 라인 길이는 79개 문자 이하
- 긴 식을 다음 줄에 이어서 쓸 경우, 일반적인 들여쓰기보다 4 스페이스 더 들여쓰기
- 파일 안에 각 함수와 클래스 사이에는 빈 줄을 두 줄 넣기
- 클래스 안에서 메서드(함수)와 메서드(함수) 사이에는 빈 줄을 한 줄 넣기
- 딕셔너리(dictionary)에서 키와 콜론(:) 사이에는 공백을 넣지 않고, 한 줄 안에 키와 값을 같이 넣는 경우에는 콜론 다음에 스페이스를 하나 넣기
- 변수 대입에서 = 전후에는 스페이스를 하나씩만 넣기
- 타입 표기를 덧붙이는 경우, 변수 이름과 콜론 사이에 공백을 넣지 않도록 주의! 콜론과 타입 정보 사이에는 스페이스 하나 넣기

(2) 명명 규약
- 함수, 변수, 애트리뷰트(attribute)는 lowercase_underscore 처럼 소문자와 밑줄 사용하기
- 보호돼야 하는 인스턴스 애트리뷰트는 일반적인 애트리뷰트 이름 규칙을 따르되, _leading_underscore 처럼 밑줄로 시작하기
- 비공개(private) (한 클래스 안에서만 쓰이고 다른 곳에서는 쓰면 안 되는 경우) 인스턴스 애트리뷰트는 일반적인 애트리뷰트 이름 규칙을 따르되, __leading_underscore처럼 밑줄 두 개로 시작하기
- 클래스(예외도 포함)는 CapitalizedWord처럼 여러 단어를 이어 붙이되, 각 단어의 첫 글자를 대문자로 하기
- 모듈 수준의 상수는 ALL_CAPS 처럼 모든 글자를 대문자로 하고 단어와 단어 사이를 밑줄로 연결한 형태를 사용
- 클래스에 들어 있는 인스턴스 메서드(함수)는 호출 대상 객체를 가리키는 첫 번째 인자의 이름으로 반드시 self를 사용해야 함
- 클래스 메서드는 클래스를 가리키는 첫 번째 인자의 이름으로 반드시 cls를 사용해야 함 (cls 참고 : https://journeytosth.tistory.com/73)

(3) 식과 문
- 긍정적인 식을 부정하지 말고 (if not a is b) 부정을 내부에 넣기 (if a is not b)
- 빈 컨테이너(container)나 시퀀스(sequence) ([]나 " 등)를 검사할 때는 길이를 0과 비교 (if len(something)==0) 하지 말기. 대신 if 컨테이너가 비어 있지 않은 경우 암묵적으로 True로 평가된다는 사실을 활용할 것
- 한 줄짜리 if 문이나 한 줄짜리 for, while 루프, 한 줄짜리 except 복합문을 사용하지 말기. 명확성을 위해 각 부분을 여러 줄에 나눠 배치하기
- 식을 한 줄 안에 다 쓸 수 없는 경우, 식을 괄호로 둘러싸고 줄바꿈과 들여쓰기를 추가해서 읽기 쉽게 만들기
- 여러 줄에 걸쳐 식을 쓸 때는 줄이 계속된다는 표시를 하는 \ 문자보다는 괄호를 사용하기

(4) 임포트
- import 문(from x import y 포함)을 항상 파일 맨 앞에 위치하기
- 모듈을 임포트할 때 절대적인 이름(absolute name)을 사용하고, 현 모듈의 경로에 상대적인 이름은 사용하지 말기
(예를 들어 bar 패키지로부터 foo 모듈을 임포트한다면 from bar import foo라고 해야지, import foo라고 하면 안 됨)
- 반드시 상대적인 경로로 임포트해야 하는 경우는 from . import foo 처럼 명시적인 구문을 사용하기
- 임포트를 적을 때는 표준 라이브러리 모듈, 서드 파티 모듈, 개인이 만든 모듈 순서로 섹션을 나누기. 각 섹션에는 알파벳 순서로 모듈을 임포트하기.

[참고]

The Modbus Protocol In-Depth : www.ni.com/ko-kr/innovations/white-papers/14/the-modbus-protocol-in-depth.html

Modbus 사이트 : modbus.org/


(주의! 공부 차원으로 해석을 해서 정확하지 않을 수 있음. 해석이 막힐 때는 구글 번역기를 사용함)

 

1. Modbus Protocol 이란?

Modbus는 master(의역 : 주장치(PC를 말함인가?))-slave(종속 장치) 관계를 사용해서 시행하는 request(요청)-response(응답) 프로토콜이다. master-slave 관계에서, 통신은 쌍으로 항상 발생하며 - 한 장치가 요청을 개시해야 응답을 기다리고 - 개시된 장치(the master)가 모든 대화에 책임이 있다. 보통 master는 HMI(Human Machine Interface), SCADA(Supervisory Control and Data Acqusition) 시스템이고 slave는 센서, PLC(Programmable Logic Controller), 또는 PAC(Programmable Automation Controller) 이다. 이러한 요청과 응답 내용, 그리고 이러한 메시지가 전송되는 네트워크 계층은 프로토콜의 다른 계층에 의해 정의 된다.

 

2. 모드버스 프로토콜의 레이어

초기 구현에서, Modbus는 serial 위에 구축 된 단일 프로토콜이여서, 여러 레이어로 나눌 수 없었다. 시간이 지나, 시리얼을 통해 사용되는 패킷 형식을을 변경하거나 TCP/IP 및 UDP(사용자 데이터그램 프로토콜) 네트워크의 사용을 허용하기 위해 다른 애플리케이션 데이터가 소개되었다. 이것은 핵심 프로토콜의 분리를 이끌었고, PDU(프로토콜 데이터 유닛)와 네트워크 레이어를 정의했고, ADU(애플리케이션 데이터 유닛)를 정의했다.

 

3. PDU (프로토콜 데이터 유닛)

MODBUS APPLICATION PROTOCOL SPECIFICATION V1.1b

Modbus_Application_Protocol_V1_1b.pdf
0.31MB

MODBUS MESSAGING ON TCP/IP IMPLEMENTATION GUIDE V1.0b 

Modbus_Messaging_Implementation_Guide_V1_0b.pdf
0.43MB

 

이것을 다루는 PDU와 코드는 위 모드버스 애플리케이션 프로토콜 설명(첨부 문서)에 핵심으로 구성되 있다. 이 설명서는 PDU의 형식을 정의한다. 프로토콜에 의해 다양한 데이터 형식이 사용되고, 데이터에 접근하기 위한 함수코드의 사용, 그리고 각 함수 코드의 구체적인 실행과 제약들이 사용된다.

 

Modbus PDU 형식은 데이터의 연관된 세트로 주어진 함수코드로 정의된다. 이 데이터의 크기와 내용들은 함수 코드에 의해 정의되고, 전체의 PDU(함수코드와 데이터)는 253바이트 크기를 초과할 수 없다. 모든 함수 코드는 slaves(종속장치들)가 원하는 애플리케이션 동작에 따라 유연하게 구현할 수 있는 구체적 동작을 한다. PDU 설명서는 데이터 접근과 취급에 관한 핵심 개념을 정의한다; 그러나 slave(종속장치)는 사양서에 명쾌하게 정의 되지 않은 한 가지 방법으로 데이터를 처리할 수 있다.

 

3-1. Modbus 데이터 접근하기와 Modbus 데이터 모델

일반적으로, 모드버스-접근가능한 데이터는 4개의 데이터 더미나 address(주소) 범위 중 하나(coils, discrete inputs, holding registers, input registers)에 저장된다. 대부분의 사양서와 마찬가지로, 산업 또는 응용에 따라 이름이 다를 수 있다. 예를 들어, holding registers 는 출력 레지스터라고 할 수 있고, coils는 디지털 또는 이산 출력이라고 할 수 있다. 이러한 데이터 더미는 포함된 데이터의 유형 및 액세스 권한을 정의한다. Slave(종속) 장치들은 로컬로 호스팅 되는데, 이 데이터에 직접 접근할 수 있다. Modbus에 접근가능한 데이터는 일반적으로 장치의 메인 메모리의 부분 집합이다. 반대로, Modbus 마스터(주장치)는 다양한 함수코드를 통해 이 데이터에 접근을 요청해야 한다. [테이블 1]에 각 블럭의 행동에 대해 서술했다.

 

메모리 구역 데이터 유형 마스터 접근 종속장치 접근
Coils Boolean 읽기/쓰기 읽기/쓰기
Discrete Inputs Boolean 읽기 전용 읽기/쓰기
Holding Registers Unsigned Word 읽기/쓰기 읽기/쓰기
Input Registers Unsigned Word 읽기 전용 읽기/쓰기

[테이블1] Modbus 데이터 모델 구역

 

이러한 블럭은 다양한 데이터 요소에 대한 접근을 제한하거나 허용하는 기능을 제공하고 또한 application 레이어에 다양한 데이터 형식으로 접근할 수 있는 간단한 메커니즘을 제공한다.

 

블럭들은 완전히 개념적이다. 주어진 시스템에서 독립된 메모리 주소로 존재하고, 또한 겹칠 수도 있다. 예를들면, Coil 한 개가 holding 레지스터 한 개에 해당하는 word의 첫번째 비트로 메모리 안 같은 위치에 존재할 수 있다. 주소(어드레싱) 제도는 전적으로 종속장치(slave)에 의해 정의되고, 각 메모리 블럭의 해석은 장치의 데이터 모델의 중요한 부분이다.

 

3-2. 데이터 모델 어드레싱

사양서는 65,536(2**16)개 요소의 주소공간을 포함함하는 것으로 각 블럭을 정의한다. PDU 정의 내에서, Modbus 는 0~65,535 범위의 각 데이터 요소에 주소를 정의한다. 하지만, 각 데이터 요소는 1부터 n까지 번호화 되어 있고, n의 최대값은 65,536 이다. 그것은, Coil 1은 주소0의 코일블록에 있고, holding 레지스터 54는 종속장치가 hoding 레지스터로 정의하는 메모리의 섹션 안에서 주소 53에 있다.

 

1. Learning OpenCV 4 Computer Vision with Python 3 - Third Edition (저자 : Joseph Howse, Joe Minichino)

github.com/PacktPublishing/Learning-OpenCV-4-Computer-Vision-with-Python-Third-Edition

 

 

[참고]

[개요]

  • 우분투16.04 -> 18.04 로 업데이트한 이유 : 최근 나오는 영상센서 제조사가 SDK를 우분투 18.04 이상의 버전으로 제공을 많이 하기 때문에
  • 우분투18.04(16.04 포함)는 윈도우와 다르게 비디오, 사운드를 직접 잡아줘야 하는 이슈가 있음. 그럼에도 우분투(리눅스)를 사용하는 이유는 많은 로봇OS 와 인공지능 관련 알고리즘이 리눅스를 통해 개발되기 때문임.
  • MSI GP75 Leopard-9SD 모델을 사용 중에 이어폰 사용시만 소리가 나오는 문제를 발견하게 됨.

[해결] (첫번째 링크의 짐농 님 블로그 참고)

 

1. 사운드 카드 확인

NG-GP75-Leopard-9SD:~$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: ALC1220 Analog [ALC1220 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 1: ALC1220 Digital [ALC1220 Digital]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

 

2. alsa-base.conf 파일 수정

$sudo gedit /etc/modprobe.d/alsa-base.conf

 

(마지막 줄에 추가 후 저장 후 종료)

options snd-hda-intel model=clevo-p950

 

$sudo alsa force-reload

$sudo reboot

 

3. 스피커 출력 확인

 

*짐농님 감사해요!!

 

[결론]

리얼텍 ALC1220 을 clevo-p950에 연결

 

최초작성 : 20.12.18
수정 :
21.12.9 (Notepad++ 단축키 추가)

 

자꾸 까먹어서 적어둬요. (내 머리속에는 지우개가 있나보다)

 


[파이참, Visual Studio]

(1) 여러 줄 띄어쓰기 : (드래그로 여러줄 선택 후) Tap 키

(2) 여러 줄 띄어쓰기 전 상황으로 가기 : SHIFT + TAP 키

 

(3) 여러 줄 주석처리 : CTRL + / 

(4) 여러 줄 주석처리 전 상황으로 가기 : CTRL + /  (여러줄 주석처리와 같음)

 

[Notepad++]

(1),(2) 위와 동일

(3) 여러줄 주석처리 : CTRL + K

(4) 여러 줄 주석처리 전 상황으로 가기 : CTRL + SHIFT + K  

[참고] 

  • TCP IP 소켓 프로그래밍 / 윤상배 저 / 한빛미디어

 

2020.11.19

 

1. 도메인 : 각 영역에 알맞은 통신기기를 선택하는 것처럼, 소켓 역시 쓰이고자 하는 영역에 맞는 값을 지정해줘야 함. 도메인을 이용하면 사용 영역을 저장할 수 있음. 

 

도메인에 사용하는 값들

  • AF_UNIX : 시스템 내부 영역에서 프로세스와 프로세스 간의 통신을 위해 사용 됨
  • AF_INET : 인터넷 영역에서 물리적으로 서로 멀리 떨어진 컴퓨터 사이의 통신을 위해 사용됨. 일반적인 네트워크 프로그램은 이 값을 사용함. IPv4를 사용함
  • AF_IPX : Novell Internet 프로토콜. 지금은 거의 사용되지 않음. MS 윈도우 비스타부터 지원하지 않음.
  • AF_INET6 : AF_INET과 같음. IPv6을 사용함
  • AF_X25 : X.25 아마추어 라디오용 프로토콜

IP 버전 : 프로토콜 버전. IP는 현재 버전6까지 나옴. 가장 너리 사용되는 버전은 IPv4. IPv6는 차세대 프로토콜로 조금씩 사용처를 넓혀가는 추세

 

2. 타입

데이터 통신에 사용할 프로토콜 유형을 지정하기 위해 사용함.

  • SOCK_STREAM : 연결지향의 TCP/IP 기반 통신에서 사용함
  • SOCK_DGRAM : 데이터그램 방식의 UDP/IP 기반 통신에서 사용함
  • SOCK_RAW : 소켓은 개발자에게서 TCP/IP의 복잡함을 감춤으로써 쉽게 프로그래밍하게 도와줌. 하지만 때때로 TCP/IP를 직접 다룰 필요가 있는데, 이때 사용할 수 있는 프로토콜. (RAW_SOCKET)

3. 프로토콜

  • IPPROTO_TCP : TCP 프로토콜로 AF_INET 도메인과 SOCK_STREAM 유형과 함께 사용함
  • IPPROTO_UDP : UDP 프로토콜로 AF_INET 도메인과 SOCK_DGRAM 유형과 함께 사용함

참고 : 

[1]github.com/riptideio/pymodbus/

 

[파이썬2 설치] 

$sudo apt-get install python-pymodbus 

 

[파이썬3 (at Ubuntu16.04)] 

$pip3 install pymodbus

 

[동작 테스트 코드 예제]

pymodbus.readthedocs.io/en/dev/source/example/modules.html

 


참고 :

[2] (import ssl 오류 시)  bigwork.tistory.com/25

 

  • pymodbus 라이브러리 사용 시 ssl 라이브러리 import 되지 않는 경우
  • 파이썬 3.6.9 버전에서 발생 (파이썬 3.6.12 버전)으로 업데이트 진행하면 import 됨

 

[업데이트 방법] [2]

1. www.python.org/ftp/python/

 접속 후 3.6.12 버전 다운로드

2.  압축 풀고 폴더로 이동
3. (터미널창) $./configure
4. $sudo make altinstall
5. $python3 (버전확인)

+ Recent posts