[DEBUG NOTE] 디버깅 노트 2023.02.08 - 2023.03.21



■■■■■■■■■■

<문제>
OSError : [Errno 113] No route to host

<ChatGPT>
how to solve this error? oserror errno 113
오류 번호 113, "No route to host"는 네트워크 요청이 실패할 때
리눅스와 윈도우를 포함한 다양한 운영 체제에서 발생할 수 있는 오류입니다.
이 오류는 다음과 같은 다양한 이유로 인해 발생할 수 있습니다:
1.호스트에 연결할 수 없음: 연결하려는 호스트가 중단되었거나
컴퓨터와 호스트 사이의 네트워크에 문제가 있습니다.
2.방화벽 제한: 방화벽은 특정 포트 또는 IP 주소에 대한 액세스를 차단할 수 있습니다.
방화벽이 연결하려는 호스트에 대한 액세스를 차단하는 경우
"호스트에 대한 경로 없음" 오류가 표시됩니다.
3.잘못된 네트워크 구성: 컴퓨터의 네트워크 구성이 올바르지 않으면
연결하려는 호스트에 연결하지 못할 수 있습니다.
이 문제를 해결하려면 다음 단계를 수행하십시오:
1. 호스트 확인: 호스트에 ping을 실행하여 호스트가 실행 중인지 확인합니다.
그렇지 않으면 호스트 자체에 문제가 있을 수 있습니다.
2. 방화벽 설정 확인: 방화벽이 호스트에 대한 액세스를 차단하고 있지 않은지 확인합니다.
방화벽을 일시적으로 사용하지 않도록 설정하여 문제가 해결되는지 확인할 수 있습니다.
3. 네트워크 구성 확인: 컴퓨터의 IP 주소, 서브넷 마스크, 기본 게이트웨이
및 DNS 설정이 올바른지 확인합니다.
4. 다른 네트워크 사용: 다른 네트워크에서 호스트에 연결할 수 있는 경우 네트워크 구성에
문제가 있을 수 있습니다. 다른 네트워크에서 연결하여 문제가 해결되었는지 확인하십시오.
5. 라우터 구성 확인: 라우터를 사용하는 경우 라우터의 구성을 확인하여
라우터가 호스트에 대한 액세스를 차단하지 않는지 확인합니다.
위의 단계에서 문제가 해결되지 않으면 네트워크 관리자 또는
호스트 관리자에게 문의하여 추가 지원을 요청해야 할 수 있습니다.

<해결>
운영PC의 IP 주소를 잘못 입력했다.

■■■■■■■■■■

<문제>
바이너리 파일 만들 때 에러 발생
raspberry pi -bash: pyinstaller: command not found

<해결>
pip install --upgrade pip
sudo pip3 install pyinstaller
pyinstaller --onefile 0000.py
실행하고 나면 dist 폴더에 생성된 파일 있음

■■■■■■■■■■

<문제>
작업한 코드에서 변수명을 갑작스레 바꾸게 되었다.
이미 다 짠 코드인데 말이지.
하나만 바꾸는게 아니라서 여러개 바꾸면 정신이 없을거다.

<해결>
VScode 에서는 변수명 일괄변경 기능을 제공한다. (다른에디터도 있겠지?)
수정할 변수 블록잡고 ctrl shift L을 누르면 된다.

■■■■■■■■■■

<문제>
dronekit.APIexception heartbeat
dronekit.mavlink: exception in mavlink input loop

<ChatGPT>
"dronekit.mavlink: mavlink 입력 루프에서 예외" 오류는
DroneKit-Python 라이브러리를 사용하여 드론과 통신할 때 발생할 수 있습니다.
이 오류는 일반적으로 드론과의 연결 또는 드론에서 수신되는 데이터에 문제가
있음을 나타냅니다.
다음은 문제를 해결하기 위해 시도할 수 있는 몇 가지 방법입니다:
1. 연결을 확인합니다: 드론에 대한 연결이 안정적인지, 연결 코드에 올바른 포트
및 보드 속도 설정이 사용되는지 확인합니다.
2. 원격 측정 확인: 연결이 안정적인 경우 드론에서 수신 중인 원격 측정 데이터를 확인합니다.
드론 키트-파이썬 라이브러리가 예상하지 못하거나 처리할 수 없는 데이터를
드론이 보내고 있을 가능성이 있습니다.
3. 라이브러리 업데이트: 최신 버전의 DronKit-Python 라이브러리를 사용하고 있는지
확인합니다. "pip install --upgrade dronekit" 명령을 실행하여 pip 패키지 관리자를
사용하여 라이브러리를 업데이트할 수 있습니다.
4. 디버깅: 오류의 근본 원인을 파악하려면 디버그 메시지를 인쇄하거나 디버거를
사용하는 등의 디버깅 기술을 사용합니다.
이러한 솔루션 중 어느 것도 작동하지 않는 경우, 드론 키트-파이썬 커뮤니티
또는 드론 제조업체에 문의하여 추가 지원을 받을 수도 있습니다.

DroneKit에 "Heartbeat timeout" 메시지가 포함된 API 예외는
일반적으로 자동 조종 장치와 GCS(지상 제어 스테이션) 간의 통신이 끊길 때 발생합니다.
이 문제는 두 장치 간의 통신 링크에 간섭이나 중단이 있을 때 발생할 수 있습니다.
"Heartbeat"은 자동 조종 장치가 여전히 작동하고 연결되어 있음을 나타내기 위해
정기적으로 GCS로 전송되는 신호입니다. GCS가 특정 시간 내에 이 신호를
수신하지 않으면 자동 조종 장치가 더 이상 연결되지 않은 것으로 가정하고
"Heartbeat timeout" 메시지와 함께 API 예외를 발생시킵니다.
이 문제를 해결하려면 다음 단계를 수행하십시오:
1. auto pilot과 GCS의 연결 상태를 확인하고, 두 장치가 모두 올바르게 연결되고
구성되었는지 확인합니다.
2. 두 장치 사이의 통신 링크에 간섭이나 장애물이 있는지 확인합니다.
가능한 경우 장치를 시야가 확실한 위치로 이동합니다.
3. GCS와 오토파일럿을 다시 시작하고 다시 시도합니다.
4. 문제가 지속되면 자동 파일럿과 GCS 모두에서 펌웨어를 업데이트합니다.
5. 위의 단계 중 아무 것도 작동하지 않는 경우 제조업체에 문의하거나
DronKit 커뮤니티에 추가 지원을 요청해야 할 수 있습니다.

■■■■■■■■■■

<문제>
listener 파일에 video 송출 문제가 생김.
/dev/video invalid argument 에러가 뜬다.

<가정>
송출자체에 문제가 없다면
rtmp로 들어가면 비디오 볼 수 있어.

<결과>
rtmp에도 안 뜸

Posted by ssanatos
,

[DEBUG NOTE] 디버깅 노트 2022.12.12 - 2022.12.23

■■■■■■■■■■

<문제>
Install 후에 왜 ifconfig 에 PPP가 뜨지 않았을까? 원래 정상작동이라면 PPP가 떠야한다.

<가정>
가정1. 모뎀이 2개 꽂혀 있어서
가정2. 모뎀이 설정된 포트와 다른 곳에 꽂혀서

<실험>
실험1. 해당 LTE 모뎀으로 아래포트에 연결 -> ppp 안뜸.
실험2. 해당 LTE 모뎀으로 위포트에 연결 -> ppp 안뜸. 해당 LTE모뎀이 불량이든지, USIM 개통이 안됐든지.
실험3. 드론 LTE 모뎀으로 아래포트에 연결 -> ppp 뜸.
실험4. 드론 LTE 모뎀으로 위포트에 연결 -> ppp뜸. 즉 LTE모뎀을 라즈베리 어느포트에 연결하든지 상관없다.

<결론>
따라서 2개 꽂혀서 그렇다.

■■■■■■■■■■

<문제>
왜 wi-fi가 안 잡힐까? 원래라면 잡혀야 하는데?

<가정>
가정1. psk 값에 패스워드 대신 key 값을 넣어야 해
가정2. 오타
가정3. 다른 파라미터 값 수정을 안했나

<실험>
실험1. dhcpcd.conf 에 wlan0를 설정하는 것을 깜박해서 바꿨다.
실험2. psk 값에 패스워드 대신 key 값을 넣으니까 된다.
실험3. 오타가 있었나보다. 패스워드를 다시 입력하니까 된다.

■■■■■■■■■■

<문제>
systemctl status networking.service 에러가 뜨는 이유?

<검색>
https://lux.cuenet.kr/105


<결론>
설정한 인터페이스 명이 달라서.

■■■■■■■■■■

<문제>
업데이트가 자동적으로 이뤄지게 프로그램 상에서 지원하면,
매번 종속된 모든 라이브러리를 체크하느라 부팅이 느려진다.
그리고 업데이트 이후 특정 라이브러리가 버전업이 되면서
호환이 맞지 않아 버그가 발생하는 경우가 있다.
더군다나 업데이트를 지원하면 디바이스의 LTE 연결이 반드시 필요해진다.
업데이트를 안 할 수도 없는 노릇이다.

<가정>
업데이트는 꼭 필요하다?
꼭 그렇지만도 않다. 특히나 우리 서비스처럼 폐쇄적인 시스템에서는 더더욱 필요없다.
유저로서의 개인적인 경험은, 업데이트가 귀찮을 때가 있다.
빨리 사용하고 싶은데 업데이트로 이런저런 과정을 거치면서 기다리는게 싫다.
두 번째 이유는 더 큰데, 괜히 업데이트 해서 내가 세팅해 놓은 값들이 바뀔까봐
우려스러워서 업데이트를 망설이는게 있다. 그런 일이 일어나면 굉장히 짜증날 거고
일어나지 않더라도 딱 맞게 잘 돌아가고 있는거 괜히 업데이트해서 불편해지거나
흐트러질 수 있다는 가능성만으로도 그걸 기피하게 된다. 더군다나 중요한 일을
앞두고 강제로 업데이트를 진행해서 문제가 생긴다면 사용자의 불만이 폭주할 것이다.

<결론>
모든 라이브러리들이 업데이트 된 버전을 틈틈히 올려서
사용자들이 버전을 선택해서 이용할 수 있게하자.
그러면 디바이스 단에서 업데이트가 필요하지 않을 것이므로,
LTE가 필요한 이유도 하나 줄어들게 되고, 또 그를 위한 모뎀도
제거할 수 있다.

■■■■■■■■■■

<문제>
사용자가 자신의 사용환경에 맞춰 파라미터를 세팅하는 과정은
재고의 여지없이 불가피하다. 그런데 리눅스 터미널 화면에서
파라미터를 세팅하는 과정은 사용자에게 너무 어려울 수 있으며,
종종 이에 대한 문의가 들어온다.

<가정>
사용자가 느끼는 이 어려움은 CLI로 인한 어려움인가?
대부분 우리의 유저는 일반 생활가전을 다루는 주부, 아이들이 아니라
그래도 나름 기기를 다루는 것에 관심이 많고, 메뉴얼을 보면서
기기를 조작하는 것에 익숙한 유저라고 추정된다.
그렇다고 가정했을 때, 종종 우리가 받게 되는 문의의
핵심 문제는 CLI 환경 자체에 있다기 보다는
파라미터 설정 과정의 복잡성과 메뉴얼이나 설명의
불충분함이 문제일 것이라고 여겨진다.
CLI 환경을 GUI 환경으로 어렵지 않게 바꿀 수 있다.
sudo apt-get install xfce4 -y 로 가능하다.
근데 GUI 를 넣으면 메모리를 꽤 많이(500MB) 차지해서,
적은 메모리를 사용하는 유저에게는 부담스러울 수 있다.
그리고 GUI를 넣는다는건 모니터를 꼭 연결한다는 가정인데,
매번 기기마다 모니터를 연결하는 불편한 방식을 권장하는 모양새다.
사용자가 CLI에 익숙해진다면 단순히 ssh로 접속하여 기기만 바꿔서
세팅을 달리 할 수 있으므로, GUI는 굳이 필요없다.

<결론>
따라서 CLI를 더 쉽게 사용할 수 있도록 돕는게 더 나은 방안이다.
CLI 세팅 과정을 어떻게든 최소화한다.
파일은 하나로 통일하고,
복잡한 명령어는 단축키로 만들고,
파라미터는 보기 좋고, 읽기 좋게 배치하고
당연한 것들은 자동화시키고,
불필요한 것들은 삭제하거나 안보이게 만들고,
여러 파트의 과정들을 최대한 축소시키거나 통합한다.
그리고 메뉴얼을 최대한 친절하게 만든다.
일상어 사용 + 예시 + 그림 + 사소한 과정도 빼지 않고.

■■■■■■■■■■

<문제>
메인 프로그램 이후에 터미널이 죽는다.

<가정>
백그라운드로 실행하지 않아서 그렇다.

<결론>
실행 명령어 뒤에 & 앰퍼샌드 붙일 것.

■■■■■■■■■■

<문제>
이미지 생성 과정에서 raspberry pi OS 중 라즈비안 64bit lite 버전이
라즈베리파이 3, 4를 위한 것이어서 다운받았는데 SDAS 설치 과정에서
sudo ./setwifi 를 치면 버젓이 있는 파일에 sudo: unable to edcute no such file 이란 에러가 뜬다.
sudo로 권한을 변경해주기도 했는데 그럼에도 에러가 뜬다.

<가정>
가정1. 패키지 이름뒤에 :i386을 붙여본다.

<실험>
실험1. 패키지 이름뒤에 :i386을 붙여도 안된다.

<검색>
https://ubuntuforums.org/showthread.php?t=2359697

이 사이트를 참고하자면 이건, 64bit 운영체제에서 32bit 프로그램을 돌리려하기 때문이란다.

<결론>
32bit로 하니깐 된다. ㅎ

■■■■■■■■■■

<문제>
rc.local 파일에 특정 문자열 넣기. echo >>로 집어넣으면 마지막줄에 넣어지는데,
맨 마지막에는 exit 0 가 있어야 한다. 따라서 그 위에 넣어야 함

<검색>

<결론>
perl -p -i -e '$.==<22:특정열> and print"<명령어>"'<InputFile> 이렇게 해야한다.
sudo perl -p -i -e '$.==19 and print "sudo /home/pi/expand_rootfs"' /etc/rc.local
더 좋은 방법을 찾았다.
그냥 실행 코드를 넣어줄 것이 아니라 직접 실행하면 된다.

Posted by ssanatos
,