본문 바로가기

분류 전체보기840

C 와 C++ 으로 10진수를 2진수로 변환하여 출력하기 C #include int main() { short n = 0; printf("-32,768~32,767 사이의 정수를 입력하세요: "); scanf("%hd", &n); for(int i=15; i>=0; i--){ printf("%d", (n >> i) & 1 ); if(i%4==0) printf(" "); } return 0; } C++ #include #include using namespace std; int main() { short n = 0; coutn; cout 2022. 9. 1.
빅 엔디안(Big Endian)과 리틀 엔디안(Little Endian) 컴퓨터는 데이터를 메모리에 저장할 때 바이트(byte) 단위로 나눠서 저장한다. 하지만 컴퓨터가 저장하는 데이터는 대게 32비트(4바이트)나 64비트(8바이트)로 구성된다. 따라서 이렇게 연속되는 바이트를 순서대로 저장해야 하는데, 이것을 바이트 저장 순서(바이트 오더 : byte order)라고 한다. 바이트 오더는 빅 엔디안(big endian) 과 리틀 엔디안(little endian) 방식이 있다. 빅 엔디안은 메모리의 Lower Address 에 MSB (최상위비트/Most Significant Bit) 부터 저장하는 방식이고, 리틀 엔디안은 메모리의 Lower Address 에 LSB (최하위비트/Least Significant Bit) 부터 저장하는 방식이다. 아래 예시에서 Data의 MSB.. 2022. 8. 31.
허수는 왜 존재하는 것일까? 출처 : https://angeloyeo.github.io/2019/06/15/imaginary_number.html#fn:myfootnote 허수의 존재 의미에 대하여 - 공돌이의 수학정리노트 angeloyeo.github.io 실수의 차원을 벗어난 수. 허수는 회전이다. 허수는 다음과 같은 질문에 답하기 위해서 만들어진 수의 개념일 것이다. . x^2 = -9 인 x가 존재할까? 이 질문은 매우 바보 같아 보일 수도 있다. 충분히 바보 같은 질문이다. 이 문제에 대한 해답은 x^2 = -1 인 x가 존재 한다고 수의 개념을 확장시키면 찾을 수 있을 것이다. 그럼 소위 라고 불리는 imaginary number가 지금까지 얘기했던 수 체계가 1차원 벡터로 확장되었다는 것과는 어떤 관계가 있는 것일까? .. 2022. 8. 31.
ICD 와 ESCID, Interface Control Document ICD (Interface Control Document)는 인터페이스 통제 문서로 시스템 또는 장치 사이에 주고받는 메시지의 구조를 정의 하는 중요한 정보로서 인터페이스를 규정한 문서를 말한다. ESICD (Electrical Signal Interface Control Document)는 전기적 신호의 인터페이스 및 프로토콜을 정의한 문서로 EICD라고도 한다. (디지털신호 입력/출력, 아날로그신호 입력/출력, 신호 특성과 voltage level 등) ICD 문서 예시 EICD 문서 예시 2022. 8. 30.
PBIT / CBIT / IBIT 항공, 방산 등 분야에 탑재되는 전자장비들은 안전을 위하여 신속한 고장탐지가 필요하며, 각 탑재장비는 BIT(Built-In-Test, 자체고장진단) 기능을 보유하도록 설계된다. HTML 삽입 미리보기할 수 없는 소스 탑재 전자장비에 자체입증회로, 자체점검회로, 오차 탐지 및 보정회로를 내장하여 고장 위치를 알아 내고 식별하는 On-Board 하드웨어 및 소프트웨어. BIT는 크게 PBIT, CBIT, IBIT 세 종류 로 분류된다. PBIT(Power up BIT) 구성품에 전원이 인가될 때 자동 수행되는 것으로 전원인가 자체고장진단 CBIT(Continuous BIT) 임무 수행 중에 정상 작동여부를 지속적으로 모니터링하는 것으로서 연속 자체고장진단 IBIT(Initiated BIT) 운용자의 명령에.. 2022. 8. 30.
CSCI / CSC / CSU 란 CSCI - Computer Software Configuration Item, 형상관리를 하는 단위 CSC - Computer Software Component, 독립적으로 배포 가능한 단위 CSU - Computer Software Unit, 독립적으로 테스트 가능한 단위 무기체계 내장형 소프트웨어 획득 및 관리 지침 제3조(용어정의) "소프트웨어 형상품목(CSCI : Computer Software Configuration Item)"이라 함은 최종사용기능을 만족하고, 획득기관이 형상관리를 하기 위해 분리한 소프트웨어 집합체로서 기능, 크기, (군수)지원 개념, 재사용 계획, 중요도, 상호운용성, 별도 통제 및 문서화 필요성 등의 요소를 고려·절충하여 선정한 소프트웨어를 말한다. "소프트웨어 구성품.. 2022. 8. 30.
STM32 ] 델타로봇과 MFC 연동 + 컨베이어 벨트 추가 (4) 컨베이어 벨트 추가 컨베이어 벨트에 달린 모터는 델타 로봇에 쓰인 것과 동일한 모델인 AX-12A 모터이다. Daisy Chain으로 연결하고 ID를 3으로 지정하고, Baudrate를 115200으로 맞춰줬다. 처음엔 모터 혼이 저 큰 구멍에 위치하게 배치되어 있었는데 테스트 구동을 해보니 장력 부족으로 벨트가 잘 돌아가지 않는 것 같아 뒤로 당겨서 배치해주었다. #define AX_CONVEYOR_ID3 dxl_control.c void setEndless(uint8_t ID, uint8_t State) { if ( State ) { uint8_t length = 9; uint8_t packet[length]; packet[0] = AX_HEADER; packet[1] = AX_HEADER; pack.. 2022. 8. 28.
MFC ] 윈도우 크기 조절 또는 고정하기, 최소/최대 사이즈 지정 1. WM_GETMINMAXINFO 메시지 처리기 함수를 추가한다. 속성 - 메시지 - WM_GETMINMAXINFO 를 찾아서 Add 혹은 프로젝트 - 클래스 마법사 2. OnGetMinMaxInfo 함수 안에서 전달된 파라미러 lpMMI를 사용해 창의 min / max 값을 설정한다. void CdeltaControlDlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI) { //lpMMI->ptMinTrackSize.x = 1200; //lpMMI->ptMinTrackSize.y = 800; lpMMI->ptMinTrackSize = CPoint(1200, 800); lpMMI->ptMaxTrackSize = CPoint(1400, 1000); CDialogEx::OnGetMinMax.. 2022. 8. 28.
STM32 ] USB CDC (Virtual Port Com) 사용하기 Clock Configuration USB 클럭이 PLL에서 나오는 48MHz로 설정되어 있어야 한다. Activate Clock Source Ethernet Disable USB_OTG_FS 설정. Device_only 모드로 Middleware - USB_DEVICE 에서 Class For FS IP 를 CDC (Communication Device 클래스)로 설정 Generation Code를 하면 프로젝트 안에 아래와 같이 폴더가 추가된 것을 볼 수 있다. 그 중에서도 usb 송수신 관련된 함수들은 usbd_cdc_if.c 파일 안에 있다. 소스코드 /* USER CODE BEGIN 0 */ #define BUF_SIZE 30 uint8_t usb_buf[BUF_SIZE]; uint32_t cou.. 2022. 8. 26.
C, Linux ] pthread 사용해 보기 #include #include #include #include #include void *thread1_func (void *vargp) { unsigned short cnt=0; printf("Thread 1 function starts...\n"); while(1) { sleep(1); printf("thread1_func is running ===>(%d)\n", cnt++); } } void *thread2_func (void *vargp) { unsigned short cnt=0; printf("Thread 2 function starts...\n"); while(1) { sleep(3); printf("thread2_func is running =======> (%d)\n", cnt++); .. 2022. 8. 25.
C ] 명령 프롬프트 구현 (함수포인터 사용) #include #include /* for strcmp() strlen*/ //#include /* for usleep() */ #include #include // argv MAX #define MAX_CMD_NUM 10 // string MAX #define BUF_LEN 128 int cmd_continue = 0; typedef int cmd_func(int argc, char* argv[]); struct Command_List { char* cmd; cmd_func* func; char* help_str; }; int cmd_test1(int argc, char* argv[]) { if (argv[1] == NULL) { printf("test 1 command received. \n"); .. 2022. 8. 25.
C ] 전처리기 (Preprocessor) 전처리기(preprocessor)는 프로그램을 컴파일할 때 컴파일 직전에 실행되는 것으로, 전처리기가 실행되면 각 코드 파일에서 #으로 시작하는 지시자(directives)를 찾는다. #include 지정된 파일을 그 위치에 복사, 파일을 포함시키기 위해 사용한다. Current directory 에서 먼저 찾고 그 다음 표준 라이브러리에서 찾음 // 표준 라이브러리 #include // 사용자가 정의한 파일 #include "filename" #define 심볼릭 상수나 매크로를 생성할 때 사용. 컴파일 시 텍스트로 대체됨. 매크로 사용의 장점은 코딩 오버헤드를 줄여줌. #define PI 3.141592 #define CIRCLE_AREA( x ) ( (PI) * ( x ) * ( x ) ) #def.. 2022. 8. 24.
C ] Windows 에서 PThread 사용하기 (Visual Studio 사용) PThread (Posix Thread)는 유닉스계열의 표준 스레드 라이브러리로 비록 유닉스 계열 라이브러리지만 win32에서도 사용할 수 있는 방법이 있다. 1. 아래 홈페이지 가서 라이브러리를 다운 받는다. https://www.sourceware.org/pthreads-win32/ POSIX Threads (pthreads) for Win32 Open SourcePOSIX Threads for Win32 Current release: 2.9.1 (2012-05-27)See the ANNOUNCEMENT and NEWS for details.Pthreads-w32 release 1.11.0 (2005-06-04) was the last series 1.x.x version! (Version 1.11... 2022. 8. 24.
OpenCV ] 영상의 밝기 조절 + 명암비 조절 + 히스토그램 분석 자세한 설명은 주석처리함 출처 : 책, OpenCV 4 로 배우는 컴퓨터 비전과 머신러닝 영상의 밝기를 100만큼 증가하기 void brightness1(){ Mat img3 = imread("lenna.bmp", IMREAD_COLOR); Mat img4; cvtColor(img3, img4, COLOR_BGR2GRAY);// 컬러 영상으로 변환 Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE); if (src.empty()) { cerr 2022. 8. 23.
STM32 ] Free RTOS를 적용한 델타 로봇 프로젝트 프로젝트 인원 : 개인 사용 Tool : STM32Cube IDE 사용 언어 : C 2022.08.11 - [MCU/STM32 (ARM Cortex-M)] - STM32 ] Dynamixel AX-12A 모터 제어하기 (1) STM32 ] Dynamixel AX-12A 모터 제어하기 (1) 다음 진행할 개인 프로젝트인 델타로봇의 제어를 위해 먼저 AX-12A 모터에 대해 파봤다. 다이나믹셀은 모터, 제어기, 드라이버, 센서, 감속기 밑 네트워크 기능을 하나의 모듈로 만든 로봇 전용 액 eteo.tistory.com 2022.08.11 - [MCU/STM32 (ARM Cortex-M)] - STM32 ] Dynamixel AX-12 사용 - 델타로봇 제어하기 (2) STM32 ] Dynamixel AX-1.. 2022. 8. 22.
STM32 ] 역기구학(Inverse kinematics)을 통한 델타로봇 제어 (3) 로봇은 관절(Joint)에 붙어있는 모터로 조인트 각도를 제어하여 움직인다. 그리고 실제 그리퍼가 붙어 주어진 작업을 수행하는 말단 장치(End Effector)의 위치는 조인트 각도로부터 결정된다. 조인트 각도와 엔드 이펙터의 위치, 이 둘 사이를 변환하는 계산 과정을 기구학 이라고 한다. 이 중 정기구학(Forward Kinematics)은 일련의 조인트 각도가 주어졌을 때 엔드 이펙터의 직교좌표상 위치를 구하는 과정이고 역기구학(Inverse Kinematics)은 엔드 이펙터의 직교좌표상 위치에 대응하는 조인트 각도를 구하는 과정이다. https://www.marginallyclever.com/other/samples/fk-ik-test.html Delta Robot Forward/Inverse .. 2022. 8. 22.
OpenCV ] 유용한 함수들. sum(), mean(), minMaxLoc(), normalize(), cvRound() sum() : 주어진 행렬의 전체 원소 합 반환 Scalar sum(InputArray src); mean() : 주어진 행렬의 원소 평균 반환 Scalar mean(InputArray src, InputArray mask = noArray()); 위 두 함수는 4채널 이하의 행렬에 대해서만 동작하고 반환형이 Scalar 타입임. minMaxLoc() : 주어진 행렬의 최소값, 최대값을 찾는 함수로 최소값, 최대값이 있는 좌표 정보도 함께 알아낼 수 있음. 최소값, 최대값을 받을 double 형 변수의 주소와 최소값, 최댓값 위치 좌표를 받을 Point형 변수의 주소를 매개변수로 전달하고 필요 없는 경우 0을 대입 void minMaxLoc(InputArray src, CV_OUT double* minV.. 2022. 8. 18.
OpenCV ] 연산 시간 측정, TickMeter 클래스 또는 getTickCount() 와 getTickFrequency() 함수 사용 TickMeter 클래스 사용 영상 반전에 걸리는 연산 시간을 측정 void time_inverse() { Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE); if (src.empty()) { cerr 2022. 8. 18.
OpenCV ] setTo(), copyTo() 함수와 마스크 연산 OpenCV 일부 함수에서는 ROI 설정을 위한 mask 연산을 지원한다. 보통 마스크 영상으로는 픽셀 값이 0 또는 255 로 구성된 흑백 영상이 사용되고, 인자에 마스크 영상이 주어진 경우 마스크 행렬의 원소가 0이 아닌 위치에서만 연산이 수행된다. 마스크 영상을 이용한 픽셀 값 설정 void mask_setTo() { Mat src = imread("lenna.bmp", IMREAD_COLOR); Mat mask = imread("mask_smile.bmp", IMREAD_GRAYSCALE); if (src.empty() || mask.empty()) { cerr 2022. 8. 18.
OpenCV ] 데이터 파일 입출력 OpenCV에서는 영상 데이터가 아니라 int, float, double 등 일반적인 자료형과 Mat 클래스 객체 등을 XML, YAML, JSON 파일 형식으로 저장하는 기능을 제공하는데 FileStorage 클래스 사용 데이터 파일 저장하기 void writeData() { String name = "Jane"; int age = 10; Point pt1(100, 200); vector Scores = { 80,90,50 }; Mat mat1 = (Mat_(2, 2) 2022. 8. 18.
OpenCV ] 트랙바 (슬라이더 컨트롤) 사용하기 트랙바를 이용하여 그레이스케일 레벨 표현하기 createTrackbar() 함수를 사용하여 트랙바를 생성하고 이 함수의 다섯번째 인자인 onChange에 지정하는 콜백함수가 트랙바의 위치가 변경될 때마다 자동으로 호출됨 트랙바 콜백함수의 형식 typedef void (*TrackbarCallback)(int pos, void* userdata); // 트랙바 콜백함수 // 첫번째 매개변수는 현재 트랙바의 위치 정보, // 두번째 매개변수는 createTrackbar() 함수에서 지정한 사용자 데이터의 포인터 값이 전달됨 void on_level_change(int pos, void* userdata) { Mat img = *(Mat*)userdata; img.setTo(pos * 16);// 0-255를.. 2022. 8. 18.
STM32 ] UART DMA, IDLE Line Interrupt 를 통한 데이터 수신 (Ring Buffer) 코드 출처 : https://controllerstech.com/uart-dma-with-idle-line-detection/ 이전에 UART로 원하는 형식의 데이터를 수신할 때는 패킷의 종료를 뜻하는 특정 문자를 끝에 넣거나 개행 문자를 넣어서 인터럽트 안에서 버퍼에 복사해 처리해야했는데 이 때는 수신될 데이터의 길이 또는 범위를 미리 알고 있어야 했다. 다음은 UART가 IDLE Line을 감지하고 발생시키는 Interrupt를 활용하여 사전에 길이를 알 수 없는 데이터를 효과적으로 수신하는 방법이다. CubeMX 설정 파라미터 세팅은 그대로 두고 DMA 세팅으로 가서 RX Request를 추가한다. Mode는 Normal으로 한다. Direction은 Peripheral To Memory 이고 By.. 2022. 8. 18.
C, Linux ] ls 명령어 구현 리눅스의 ls 명령어 구현하기 #include #include // 디렉터리 관련 DIR, struct dirent, opendir(), readdir(), closedir() 등이 정의된 헤더 포함 #include // Unix 에 쓰이는 표준 심볼들과 상수, 함수들이 정의된 헤더 포함 #include int main(int argc, char* argv[]) { // cwd에 1024 byte 동적할당 char * cwd = (char *)malloc(sizeof(char) * 1024); // DIR 과 dirent 구조체 포인터를 만들고 일단 NULL 대입 DIR * dir = NULL; struct dirent * entry = NULL; // 추가 인자 없이 실행된 경우 if(argc==1){.. 2022. 8. 17.
C, Linux ] main 함수의 매개변수 사용해서 파일 입출력 하기 main 함수에 전달되는 파라미터를 활용해 코드를 짤 때는 아래와 같이 출력해 디버깅 해보면 편하다. for(int i=0; i< argc; i++){ printf("%s\n",argv[i]); } 1. main 함수의 argument 로 파일이름과 파일에 저장할 문자열을 입력받아 파일을 생성하는 프로그램 #include #include #include int main(int argc, char *argv[]){ /* for(int i=0; i< argc; i++){ printf("%s\n",argv[i]); } */ if (argc < 3) { printf("Usage: fileio.exe "); return 0; } FILE *fp; fp = fopen(argv[1], "w"); if(fp==NULL.. 2022. 8. 17.
OpenCV , C++ ] 키보드와 마우스의 이벤트 처리 1. 키보드 이벤트 처리 i 또는 I 키를 누르면 영상의 색상이 반전되는 예제 void keyboard() { Mat img = imread("lenna.bmp"); if (img.empty()) { cerr 2022. 8. 16.
OpenCV , C++ ] 도형 그리기 + 문자열 출력 1. 직선 그리기 void drawLines() { Mat im = imread("lenna.bmp", IMREAD_GRAYSCALE); Mat img; cvtColor(im, img, COLOR_GRAY2BGR); //흑백영상 위에 그리면 원래 도형도 흑백으로 그려짐. 위 코드는 흑백 영상위에 컬러 도형을 그리는 방법 중 하나 //Mat img(400, 400, CV_8UC3, Scalar(255, 255, 255)); //직선 그리기 //void line(InputOutputArray img, Point pt1, Point pt2, const Scalar &color, int thickness = 1, int lineType = 8, int shift = 0) //입출력 영상 InputOutputAr.. 2022. 8. 16.
OpenCV , C++ ] 카메라와 동영상 파일 다루기 예제 코드 출처 : OpenCV 4로 배우는 컴퓨터 비전과 머신러닝 1. 웹캠으로부터 정지 영상 프레임을 두 번 받아와 각기 다른 창에 띄우는 예제 void CaptureVideo() { VideoCapture cap(0); // OpenCV에서는 VideoCapture라는 클래스를 이용해 카메라 또는 동영상 파일로부터 정지 영상 프레임을 받아 올 수 있음 // 동영상 파일을 불러올 때는 "파일 이름" 을 인자로 넣고, 파일이 다른 폴더에 있으면 절대경로 또는 상대경로 추가함 // 카메라 장치를 열 때에는 카메라 장치 id 번호를 정수 값으로 전달. 0으로 해서 안되면 1, 2 시도 if (!cap.isOpened()) {// 예외처리 cerr 2022. 8. 16.
VMware ] Linux Ubuntu 에서 한영키 사용하기 root 권한으로 로그인 쉘 스크립트 파일을 만든다. vi hangul.sh 아래와 같이 입력 후 저장하고 닫기 #!/bin/bash setkeycodes 72 122 setkeycodes 71 123 스크립트 파일 실행하기 chmod +x hangul.sh ./hangul.sh 한영키가 잘 먹히는것을 확인할 수 있다. 이제 systemctl 을 통해 부팅시마다 변경한 설정이 적용될 수 있도록 설정한다 아래 경로로 가서 서비스 새로 등록 cd /etc/systemd/system vi hangul.service 아래와 같이 입력 후 저장하고 닫기 [Unit] Description=Change Hangul keycode [Service] ExecStart=/[스크립트 파일이 있는 경로]/hangul.sh [.. 2022. 8. 14.
Linux Ubuntu ] Waiting for cache lock : Could not get lock /var/lib/dpkg/lock-fro 오류 해결 apt update 또는 apt install 시 아래 문구가 무한 반복되는 오류 잠긴 캐시 파일을 다음 명령어로 삭제 sudo rm /var/lib/dpkg/lock* 2022. 8. 14.
Linux ] Vim 에디터 단축키 이동gg : 맨 위로 커서 이동shift + g : 맨 아래로 커서 이동[Home] : 현재 줄의 맨 앞으로 커서 이동[End] : 현재 줄의 맨 뒤로 커서 이동[Page Up] / [Page Down] : 페이지 단위 이동shift + h : 현재 보이는 페이지 기준으로 맨 위로 커서 이동shift + m : 현재 보이는 페이지 기준으로 중간 위치로 커서 이동shift + l : 현재 보이는 페이지 기준으로 맨 아래로 커서 이동d : 현재 단어의 맨 앞으로 커서 이동 원하는 줄번호로 이동:줄번호    복사/붙여넣기/잘라내기현재 행 복사하기y 현재 행에 붙여넣기p 현재 행 잘라내기 (단순 행 삭제가 아니라 잘라내기로 동작한다.)dd 특정 줄부터 특정 줄까지 복사하기:5,15y (5번째 줄부터 15번째 줄.. 2022. 8. 14.