LLM이 여러분의 PDF 문제를 해결해드립니다 – Ollama-Gemma2와 함께하는 프로젝트 이야기

여러분, 혹시 문서 더미 속에서 중요한 정보를 찾아야 했던 적 있나요? 직접 검사하고, 요약하는 일이 얼마나 힘든지 잘 아실 겁니다. 오늘은 이런 문제를 Python과 머신러닝(LMM)으로 해결하는 방법을 나눠보려 합니다. 프로젝트의 하이라이트는 Local 모델인 Ollama-Gemma2를 사용하여 PDF 데이터를 RAG(Retrieval-Augmented Generation) 모델로 검색하고 요약하는 것입니다.

PDF 데이터를 SQLite와 PostgreSQL에 저장하기!

여러분이 알고 계셔야 할 첫 번째 개념은 PDF 파일을 데이터베이스에 저장하는 것입니다. 여기선 SQLite와 PostgreSQL을 사용했습니다.

1. PDF 파일 로드

PyPDFLoader를 사용하여 PDF 파일을 로드합니다. 이 단계에서는 파일을 읽기만 합니다.

from langchain_community.document_loaders import PyPDFLoader

def load_pdf(file_path):
    loader = PyPDFLoader(file_path)
    documents = loader.load()
    return documents

file_path는 읽어들일 PDF 파일의 경로를 말합니다. documents는 PDF의 내용을 담고 있습니다.

2. 텍스트 분할

이어서, PDF에서 얻은 텍스트를 청크로 나눕니다. RecursiveCharacterTextSplitter를 사용하면 이 작업이 가능합니다.

from langchain.text_splitter import RecursiveCharacterTextSplitter

def split_text(documents):
    text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
    texts = text_splitter.split_documents(documents)
    return texts

chunk_size는 각 청크의 최대 크기를, chunk_overlap은 청크들 간의 중복 범위를 뜻합니다.

3. 텍스트를 데이터베이스에 저장하기

저장한 텍스트 청크를 데이터베이스에 넣는 것은 꽤 중요합니다. 아래는 이를 SQLite에 저장하는 코드입니다.

from langchain_community.vectorstores import SQLiteVSS

def save_to_db(texts, embeddings):
    vector_store = SQLiteVSS.from_texts(
        texts=texts,
        embedding=embeddings,
        table="documents"
    )
    return vector_store

위 코드에서 texts는 저장하려는 텍스트, embeddings는 임베딩 모델이며 모든 텍스트 청크는 ‘documents’ 테이블에 저장됩니다.

4. 데이터베이스로부터 읽어오기

이제 저장한 데이터를 다시 불러오는 방법에 대해 알아봅니다.

def load_from_db(embeddings):
    conn = SQLiteVSS.create_connection(db_file="vss.db")
    db = SQLiteVSS(table="documents", embedding=embeddings, connection=conn)
    return db

db_file은 SQLite 데이터베이스 파일의 이름입니다. 이는 필요한 데이터를 효율적으로 가져오기 위한 연결을 만듭니다.

Ollama-Gemma2: 문서 요약의 마법사

이제 Ollama-Gemma2 모델을 사용하여 데이터를 검색하고 요약해 봅시다. 이 모델은 사용자가 입력한 쿼리에 대해 문서를 이해하고 요약해 줍니다.

1. 임베딩 생성

위에서 사용한 텍스트 청크를 위한 임베딩을 생성합니다. 이 임베딩은 텍스트를 숫자 벡터로 변환하여 효율적으로 검색하는 데 사용됩니다.

from langchain_community.embeddings import HuggingFaceEmbeddings

embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")

2. 검색 및 요약

Ollama-Gemma2 모델을 사용하여 벡터 저장소에서 가장 유사한 텍스트 청크를 검색하고 이를 요약합니다.

from langchain.chains import RetrievalQA
from langchain_community.llms import Ollama

def query_to_db(query, vector_store, llm, chain_type):
    retriever = vector_store.as_retriever(search_type="similarity", search_kwargs={"k": 2})
    qa = RetrievalQA.from_chain_type(llm=llm, chain_type=chain_type, retriever=retriever)
    response = qa.invoke(query)
    return response

query는 사용자가 입력하는 질문입니다. vector_store는 텍스트 청크가 저장된 데이터베이스 연결을, llm은 Ollama-Gemma2 모델을 나타냅니다. 마지막으로 chain_type은 검색 방식입니다.

예제: 문서를 한글로 요약하기

프로젝트의 진짜 재미는 데이터를 입력하고 요약 결과를 확인하는 순간입니다. 예제를 통해 마지막 단계를 보겠습니다.

if __name__ == "__main__":
    # 데이터 불러오기
    texts = load_pdf_process("example.pdf") 
    embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
    vector_store = load_from_db(embeddings)

    # Ollama-Gemma2 모델 생성
    ollama_model = Ollama(model="gemma2")

    # 쿼리 수행
    query = "문서를 한글로 요약해주세요."
    response = query_to_db(query, vector_store, ollama_model, "stuff")
    print(response)

위의 코드는 PDF 파일을 로드하고, 청크로 분할하고, 데이터베이스에 저장하며, Ollama-Gemma2 모델을 사용해 요약 결과를 반환합니다.

전체 코드는 아래 링크에서 참조 할 수 있습니다.

https://github.com/bipark/Ollama-Gemma2-PDF-RAG

마무리

이번 프로젝트를 통해 PDF 파일을 읽고, 청크로 나누며, 데이터베이스에 저장한 후, 이를 LLM 모델로 분석하고 요약하는 다양한 과정을 알아봤습니다. Ollama-Gemma2 모델은 오늘날의 문서 분석 및 요약 작업을 한층 더 효율적이고 쉽게 만들어줍니다. 여러분도 이 방법을 사용하여 문서 더미 속에서 중요한 정보를 빠르고 쉽게 찾아 보세요!

이 글은 Github 문서를 토대로 제목부터 모두 AI가 작성 했습니다.

무서운 세상입니다. 이건 제가 썼습니다. ^^;

MirrorOn

LLM(Large Language Model)은 이제 없으면 아쉬운 존재입니다. 개발자 입장에서는 벌써 2년째 Github Copilot을 코딩도우미로 잘 쓰고 있었지만 ChatGPT, Claude가 좀 더 좋은 코드를 만들어 주는 상황이 되었고, 최근 검색증강생성(RAG – Retrieval-Augmented Generation)이 개발자 입장에서 중요한 키워드가 되어서 MML의 구조와 Api에 대한 공부를 하지 않을수 없게 되어서 공부를 시작했습니다.

공부에 가장 빠른 방법은 가르치거나 만들어 보는것이라고 늘 생각해서 뭔가 공부 하면 새 프로젝트를 하나 시작해서 적용해 보는 편인데, 이번에 LLM을 공부하며 만든 프로젝트가 MirrorOn 입니다.

다중 LLM 질의 도구 MirrorOn

MirrorOn은 한번 질문을 던져서 여러개의 LLM으로 부터 답을 얻는 질의도구 입니다. 이름은 ‘거울아~ 거울아~’ 에서 착안한겁니다. ^^ 거울을 켜(On!)면 누가 세상에서 가장 아름다운지 알려줄겁니다.

현재(V 0.1.0)에서는 ChatGPT, Claude, Ollama를 사용할 수 있습니다. ChatGPT, Claude는 API key 가 필요합니다. 사용자가 직접 API key를 발급받고 설정에서 키를 입력하고 질문을 입력하면 API 질의결과를 조회할 수 있습니다. 대화의 맥락을 이어갈수 있도록 구성되어 있고, 메뉴를 통하여 복사,삭제, 공유등을 실행할 수 있습니다.

로컬 LLM

Ollama(https://ollama.com)는 사용자의 컴퓨터에서 LLM을 실행할수 있도록 도와주는 프로그램입니다. 링크에서 Ollama를 설치하고 원하는 Model을 설치해서 질문을 무료(!)로 할 수 있습니다. 컴퓨터의 용량이 허락하는대로 다양한 Model을 실행할 수 있습니다.

MirrorOn을 Ollama 클라이언트로 쓰면 매월 LLM에 지불하는 비용을 아낄수 있습니다.

RAG – Retrieval-Augmented Generation

검색증강생성(RAG)는 애플리케이션 개발자의 입장에서는 향후 필수적으로 갖추어야 하는 기능이 될것같습니다. MML이 모든것을 다 알수없지만 사용자의 요구사항은 다양하고 거기에 맞추는 방법이 RAG입니다.

MirrorOn V0.1.0에서는 기본적인 기능을 만들어 봤습니다. 현재는 PDF 문서를 업로드 하고 요약, 검색하는 정도입니다만 추후 벡터화등의 기능을 추가할 예정입니다.

그리고 이미지를 업로드 해서 내용에 대한 질문을 하거나, LLM에게 인스트력션을 제공하는 등의 LLM을 사용하기 위한 특별한 기능들이 있습니다. 상세한 기능은 링크를 참고 하세요. 영어와 일본어도 지원합니다.

기능 설명

https://github.com/bipark/MirrorOn

다운로드

현재는 Mac 버전만 존재 합니다. 맥앱스토어에 업로드 하기위해 몇주를 시도했지만, API key를 입력하는 기능 문제로 애플에서 승인을 보류하고 있어서 Git Release에서 다운 받도록 업로드 했습니다. 추후 애플의 승인이 있으면 앱스토어 에서도 볼수 있기를 바랍니다. 원도우즈용 버전도 만들고 있습니다.

맥용 다운로드 링크

https://github.com/bipark/MirrorOn/releases/tag/MirrorOn

2024,7,13 Billy

Spatial Video (공간동영상) in Swift

Spatial Video는 아이폰 15프로, 15프로맥스에서 지원하는 3차원 동영상 비디오 입니다. 아이폰 15프로 또는 맥스를 가지고 있다면 Spatial Video를 만들 수 있습니다. 하지만 현재 이렇게 녹화된 동영상은 애플 비젼프로, 오큘러스에서만 플레이 할수 있습니다.

Spatial Video의 기본 원리는 양쪽눈의 시각차이를 이용한 방법 이므로 이미 사용중인 3D 안경을 이용하는 방법으로 일반 동영상 플레이어에서도 3D 동영상을 볼 수 있습니다.

Swift를 이용한 동영상 분리

아래 링크의 프로젝트에서 Swift를 이용하여 Spatial Video를 분리하여 좌측, 우측 동영상을 분리하여 UIImage로 변환하는 기능을 볼수 있습니다.

Spatial Video Separate - Swift/SwiftUI
https://github.com/bipark/SpatialVideoSeparate-Swift

앱 다운로드

아래 링크의 앱은 Spatial Video의 좌측, 우측으로 분리하여 3D 안경을 이용하여 볼 수 있는 애너글리프 3D, 카드보드 3D 동영상으로 변환하는 기능을 가진 아이폰용 앱입니다.

https://apps.apple.com/us/app/spatial-video-converter-pro/id6479389968

BodyCam – 아이폰 동영상레코더

10년 넘게 앱 스토어에서 앱을 팔고(?) 있지만 최근엔 잘 안팔립니다. 시장도 포화되었고, 유저들 사용성도 고착화 되어 새로운 앱을 깔지 않죠. 게다가 유료라면 더욱 거들떠 보지도 않습니다.

그래도 스토어에 앱을 만들어 올리는 일은 개발자로서 긴장을 늦추지 않는 개인적인 방법입니다. 그러면서 평소같으면 하지 않을 프레임워크 공부도 하고 스토어 정책변화도 살피고 합니다. 그게 돈 버는 일 할때 도움이 되거든요. 재사용할 수 있는 코드도 미리 좀 만들어 놓고, 스토어 업로드 할때 당황(?)하지 않고.. ^^

올해 iOS의 AVFoundation을 많이 쓰게 되면서 공부삼아 만들어본 블랙박스 형식의 녹화 전용앱을 스토어에 업로드 했습니다. 단위 녹화시간, 해상도, fps를 조정할 수 있고, 애플워치로 녹화/중지도 되고, 앨범에 저장하지 않고 자체적으로 저장하거나 iCloud 에 저장할 수 있습니다만 유료입니다. 2.99달러. 물론 안사셔도 됩니다. 그냥 광고입니다 ^^;

자전거에 달고 액션캠으로 써보려고 만든건데 테스트 하다보니 아이폰 15프로를 사고 싶다는 생각이 간절하더군요.

다운로드 링크

https://apps.apple.com/us/app/bodycam-for-professional/id6473234309?platform=iphone

크랙 디텍터 – Crack Detector

크랙디텍터(Crack Detector) V3가 앱스토어에 릴리즈되었습니다. 크랙디텍터는 스마트폰 카메라에서 촬영한 콘크리트 벽면의 벌어진틈(크랙)을 찾아내고 크랙의 두께와 길이를 이미지 프로세싱 방법으로 측정하는 소프트웨어 서비스 입니다.

V3 – 머신러닝

크랙디텍터를 만들기 시작한건 거의 10년이 넘었습니다만 상용화 가능한 수준의 제품이 된건 이번 버전이 처음입니다.

V3에서 가장 큰 변화는 사진에서 크랙을 찾아내는 방법을 기존의 룰베이스 이미지 프로세싱에서 세그멘테이션 머신러닝을 도입한 것입니다. 기존의 이미지 프로세싱 방법은 현장의 위치, 조명, 시간등에 따른 이미지 품질 차이로 인해서 크랙을 못찾거나 그림자를 크랙으로 인식하는 등의 문제가 있었습니다만 머신러닝 도입후 크랙디텍션 성능이 매우 향상되었습니다.

마커

앱을 다운 받고 콘크리트 벽에 크랙을 촬영하면 이미지를 분석해서 크랙을 찾아냅니다만 크랙의 크기를 Pixel 단위로 표시합니다. 마커를 활용하면 Pixel 단위를 mm 단위로 정확하게 변환 할 수 있습니다.

마커는 정밀측정이 가능한 4개의 마커를 가진 하드웨어 타입과 1개의 마커를 사용하는 스티커 타입을 쓸 수 있습니다.

앱다운로드

다운로드 - 아이폰
https://apps.apple.com/kr/app/crack-detector/id1530337221

무료다운로드 이며 안드로이드용은 준비 중입니다. 앱사용에 관한 문의는 rtlink.park@gmail.com

개발배경

OpenSource – Flutter WebRTC Camara

최근 WebRTC 관련 작업을 많이 하고 있습니다. 주로 Flutter를 사용해서 앱을 만들고 있는데 아래 플러터 패키지가 꾸준히 업그레이드 되고 있어서 도움을 많이 받고 있습니다.

플러터용 WebRTC 패키지
https://pub.dev/packages/flutter_webrtc
WebRTC를 이용한 반려동물 CCTV
http://practical.kr/?p=580

시그널링(Signaling)

WebRTC는 offer – answer – candidate 등의 데이터를 주고받는 과정을 거쳐야만 화상통신을 연결 할 수 있는데 이 과정을 시그널링이라고 하고 일반적으로 시그널 서버를 만들어서 카메라와 뷰어를 연결합니다. 규정된 방법은 없고 개발자가 원하는 방법으로 데이터를 전달 하기만 하면 됩니다. 주로 소켓을 많이 이용합니다.

저는 이런 방법을 사용해 보기도 했습니다.

MQTT 기반으로 WebRTC 연결
http://practical.kr/?p=521

이것을 위해 별도의 서버를 운영을 해야 합니다. 언젠가 이런 생각을 해 봤습니다. 로그인 하지 않고 서버 없이 연결 할 수 없을까? 원격은 좀 어렵겠지만 로컬 Wifi에서는 가능하지 않을까? 로컬 Wifi 에 연결된 모든 앱이 소켓을 열고 서로 데이터를 주고 받으면 WebRTC 서버 없이 연결할 수 있겠는데? … 그런데 일단 앱의 IP를 알아야만 되더군요.

IP 찾기( Discover)

Bonsoir 패키지
https://pub.dev/packages/bonsoir

Bonsoir는 Zeroconf(https://ko.wikipedia.org/wiki/Zeroconf) 기반의 Discover 패키지입니다. 아래의 코드처럼 이벤트를 리스닝하고 있으면 브로드개스트를 하는 모든 기기를 찾을 수 있습니다. 애플은 봉주르라는 이름으로 기기들을 연결하고 있습니다.

  Future<void> _discoverService() async {
    _discovery = BonsoirDiscovery(type: _type);
    if (_discovery != null) {
      await _discovery!.ready;

      _discovery!.eventStream!.listen((event) {
        if (event.service != null) {
          ResolvedBonsoirService service = event.service as ResolvedBonsoirService;

          if (event.type == BonsoirDiscoveryEventType.discoveryServiceResolved) {
            final index = _resolvedServices.indexWhere((ResolvedBonsoirService item) => item.ip == service.ip);
            if (index == -1 && service.ip.toString() != "null") {
              _resolvedServices.add(service);
              setState(() {});
            }
          } else if (event.type == BonsoirDiscoveryEventType.discoveryServiceLost) {
            _resolvedServices.remove(service);
            setState(() {});
          }
        }
      });
      await _discovery!.start();
    }
  }

오픈소스 WebRTC 카메라

위의 몇가지 기술을 조립해서 앱을 만들어 봤습니다. 플러터의 장점인 멀티 플랫폼 지원 기능으로 아이폰 / 안드로이드 / 맥 에서 실행 가능 하도록 만들었습니다. 아래 링크에서 소스를 다운 받을 수 있습니다.

우선 맥앱을 빌드해서 맥에 실행하고 스마트폰에 앱을 빌드해서 실행하면 위의 그림과 같이 와이파이 무선 카메라를 실행 할 수 있습니다. 연결에 제한이 없으므로 많은 카메라를 한번에 연결 할 수도 있습니다.

코드를 수정하면 두대의 스마트폰으로 한대는 서버로 다른 스마트폰을 카메라로 사용할 수도 있습니다.

소스코드 링크
https://github.com/bipark/flutter_webrtc_wifi_camera

rtlink.park@gmail.com

EdgeDB와 GraphQL

전에 GraphQL을 Node.js기반으로 테스트 해보고 블로그를 한번 썼었다. 늘 그렇지만 이런 테스트의 목적은 어떻게 하면 코드를 적게 쓰고 목적을 달성하려는 의지이다. 좋게 말하면 생산성 향상.

http://practical.kr/?p=62

긱뉴스에 올라온 링크의 글(EdgeDB 관련)을 읽고 다시 호기심이 생겨서 한번 테스트를 해봤다.

EdgeDB 1년 사용 후기 - "다시는 SQL로 돌아가지 않을꺼야"

https://news.hada.io/topic?id=7052

EdgeDB는 Postgres 위에 만든 Graph/Relational DB 라고 한다. R-DB 이기는 하지만 SQL을 사용하지 않고 EgdeQL라는 새로 정의된 쿼리언어(?)를 사용하는데 SQL을 안다면 그리 어렵지는 않다.

개인적으로 쿼리언어를 바꾸는건 사실상 거의 불가능(? – 너무 오래 써서) 하다고 생각하고 있지만 의외로 GraphQL을 사용할 수 있는데 관심이 생겼다. 서버 코드 적게 쓰거나 안써도 될까? 이건 늘 관심사다. 그래도 DB 바꾸는 일은 쉬운일이 절대 아니다. 특히 SQL은 더더욱. EdgeDB의 GraphQL 부분만 한번 테스트 해봤다. 다음 프로젝트에서 써먹을 수 있을까 싶어서…

설치

설치는 매우 쉽다. 커맨드 라인에 명령어를 입력하면 자동으로 설치된다. 링크를 따라가면 Windows용 설치 명령어도 있다.

EdgeDB 설치
https://www.edgedb.com/install

스키마 만들기

설치가 완료되고 테스트용 스키마를 만들었다. 설치된 폴더 아래에 \dbschema 라는 폴더가 있고 거기에 default.esdl 파일이 생성되어 있다. 이 파일을 텍스트 편집기로 열고 아래 스키마를 입력하고 저장한다.

module default {
  type Person {
    required property first_name -> str;
    required property last_name -> str;
  }

  type Movie {
    required property title -> str;
    property year -> int64;
    link director -> Person;
    multi link actors -> Person;
  }
};

그리고 마이그레이션 과정을 거치면

마이그레이션 실행

> edgedb migration create
> edgedb migrate

스키마가 생성되고 입력, 수정, 삭제 등이 가능하다. 테스트를 위해 몇개의 데이터를 삽입했다.

https://www.edgedb.com/docs/guides/quickstart#insert-data

GraphQL 실행

테스트의 목적이 GraphQL을 통한 데이터 쿼리였으니 GraphQL 기능을 Enable 상태로 바꾸어야 한다. 방법은 위의 default.esd 파일의 첫줄에 아래 명령어를 추가 해주고 마이그레이션 명령을 한번 더 실행하는 것으로 완료된다.

using extension graphql;

실행하고 나서 edgedb instance list 커맨드를 실행하면 Name, Port, Status등을 확인 할 수 있다.

그리고 PostMan 같은 API Call 도구를 이용해서 http get을 통해서 아래와 같이 Json데이터를 얻을 수 있었다.

GraphQL 호출결과

결론

GraphQL은 마치 과거에 C/S 프로그램을 연상 시키지만 SQL을 사용하지 않는다는 점에서 보안상의 헛점을 해결한듯 보인다. 그러면서도 REST 서버 코드를 줄이고 생산성을 높인다는 점에서 매력적으로 보인다. EdgeDB는 SQL을 버리면서 또다른 방법을 보여준것 같아서 기대가 된다.

다음 프로젝트에 한번 써볼까? 2020.07.28 박병일

Velodyne 라이다와 파이썬 연결

최근 Velodyne 라이다 VLP-16을 사용해 볼 기회가 생겼다. 이 라이다는 자율주행 자동차에 많이 사용되고 있지만 나는 라이다를 고정하고 특정 목표물의 시간에 따른 위치변화(변이)를 확인하고자 테스트를 시작했고 결과물로 파이썬에서 라이다 데이터를 실시간으로 읽어서 파일 혹은 데이터 베이스에 저장할 목적으로 테스트를 했다.

ROS

라이다를 구입할 때 받은 VeloView라는 프로그램으로 라이다가 정상적으로 작동하고 PCAP 또는 CSV 형태의 파일로 저장 가능한 것을 확인했지만 그건 내가 원하는 방법이 아니었다.

VeloView

며칠의 삽질끝에 ROS를 이용하는 것이 가장(?) 효율적이라는 결론을 얻고 Ubuntu 20.04에 ROS – Noetic을 설치했다. 아래의 링크에서 ROS 설치 방법을 확인할 수 있다.

ROS - Noetic 설치
http://wiki.ros.org/noetic/Installation/Ubuntu

Velodyne Driver 설치

ROS를 이용하는 가장 큰 이유는 이미 만들어진 드라이버를 활용할 수 있기 때문인데 Velodyne Lidar 역시 버전별로 드라이버가 있다. 아래의 링크와 같이 드라이버를 설치했다. 링크에는 최초에 라이다를 연결하는 방법부터 rviz를 이용하여 VeloView와 같은 형식으로 라이다 데이터를 조회 할 수 있는 방법까지 알려준다.

아래 링크의 내용에서 
sudo apt-get install ros-VERSION-velodyne
부분은
sudo apt-get install ros-noetic-velodyne
으로 변경해서 설치해 준다


Velodyne Driver 설치
http://wiki.ros.org/velodyne/Tutorials/Getting%20Started%20with%20the%20Velodyne%20VLP16
RViz 측정결과 화면

ROS – RViz 에서 데이터를 확인할 수 있었지만 위치 데이터를 얻는 것이 목적이었기 때문에 VeloView와 동일하게 ROS에서 잘 연결되는구나를 확인하고 다음 삽질을 시작했다. 목표는 파이썬에서 각도별 거리를 얻어내는 것.

Publisher, Subscriber, PointCloud, Python

파이썬으로 라이다 데이터를 추출하기 위하여 ROS 튜토리얼을 스터디하던 과정에서 ROS 노드들의 통신 방식에 대해서 알게 되었다. 전에 내가 IOT 장비 연결에 주로 사용하던 MQTT 프로토콜과 거의 흡사한 구조.

발행자(Publisher)와 수신자(Subscriber)가 일정한 토픽(topic)을 공유하고 데이터를 송, 수신하는 방식으로 아래 링크를 참조하면 파이썬으로 데이터를 송, 수신하는 샘플을 확인할 수 있다.

위의 RViz 프로그램 역시 토픽을 Subscribe하여 라이다의 3차원 이미지를 그린다.

파이썬을 이용한 ROS 데이터 송수신 샘플
http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28python%29

아래의 커맨드를 실행해서 퍼블리셔(Publisher)를 실행시킨다. Velodyne Driver 설치 링크에서 이미 Publisher를 실행했었다. 그래서 RViz가 라이다 데이터를 수신해서 결과 화면을 그릴 수 있었다. 종료되었다면 아래와 같이 다시 실행할 수 있다.

$ roslaunch velodyne_pointcloud VLP16_points.launch

위의 샘플 코드를 응용하여 아래와 같이 벨로다인 토픽을 수신(Subscribe)한다.

if __name__ == '__main__':
    rospy.init_node("listener", anonymous=True)
    rospy.Subscriber('/velodyne_points', PointCloud2, callback)

    rospy.spin()

위의 코드에서 rospy.Subscriber() 의 파라메타는 토픽, 수신할 구조체 형식, 콜백 함수인데 콜백 함수의 구조는 아래와 같다.

import sensor_msgs.point_cloud2 as pc2

def callback(input_ros_msg):
    for data in pc2.read_points(input_ros_msg, skip_nans=True):
        x2 = data[0]
        y2 = data[1]
        z2 = data[2]
        intensity = data[3]
        ring = data[4]
        time1 = datetime.fromtimestamp(data[5])

        distance = math.sqrt((x2)**2+(y2)**2+(z2)**2)
        azimuth = math.degrees(math.atan2((x2),(y2)))

콜백을 통하여 전달된 데이터는 PointCloud 구조로 변환하고 변환된 좌표를 이용하여 거리와 방위각을 계산할 수 있다. 이제 데이터를 얻었으니 저장만하면 된다 . ^_^

거리와 방위각 계산방법은 아래 링크를 참고했다. 
https://gis.stackexchange.com/questions/108547/how-to-calculate-distance-azimuth-and-dip-from-two-xyz-coordinates

2022.07.07 박병일

Practical, a companion animal video player ‘Banzle’ officially opened in the App Store

Seoul–(Newswire) May 03, 2022 — Mobile app developer Practical (CEO Park Byeong-il) has developed its own ‘Banzle video player for pets’ on Google Play Store (Android) and App Store. It was announced on the 3rd that it was officially opened through (IOS).

‘Banzle’, a video player for companion animals developed by Practical, is a video player that allows companion animals to spend the day happily by playing the video on a smartphone that is not in use to the companion animal alone at home after the companion has gone to work. Smartphone-only apps and services.

As of 2022, there are 15 million domestic companions, and the reality is that one in four companion animals spends more than six hours a day alone. Companion owners turn on the lights or install air-conditioning, air-conditioning, automatic feeders, CCTV, etc. to soothe the loneliness of their companion animals and secure their safety. Accordingly, the pet tech market is growing significantly every year.

Banzle is a new pet tech product that allows you to check the current status of your companion animal using the camera on your smartphone, make a video call with your pet, and select a video to play on your pet at home from a remote location.

CEO Park Byeong-il said, “Currently, YouTube’s videos specialized for dogs and cats are provided through the Banzzle app, and we will invest more in developing videos for companion animals in the future.”

Banzzle can be downloaded for free from Google Play Store (Android) and App Store (IOS).

Practical Overview

Practical is a smartphone app developer established in 2018.

Google Play Store (Android): https://play.google.com/store/apps/details?id=com….
App Store (IOS): https://apps.apple.com/app/id1610958994

Website: http://practical.kr

반즐(Banzle) – 반려동물 전용 동영상 플레이어

반즐은 집에 혼자있는 반려친구를 위한 스마트폰용 동영상 플레이어입니다.

사용하지 않는 스마트폰을 활용해서 집에 혼자 있는 반려친구에게 전용 동영상을 틀어주세요.

반려견용, 반려묘용 동영상이 따로 준비되어 있어요. 밖에서도 원격으로 동영상을 바꿔서 틀어줄 수도 있어요.

그리고 혼자 있을때 무얼 하고 있는지 스마트폰 카메라로 화상통화를 할수 있어요.

아래 링크에서 다운받아 보세요. 무료앱이예요.

사용방법은 아래와 같아요. 그런데 주의할 점은 두대의 스마트폰에 반드시 같은 아이디로 로그인해야 원격 플레이와 화상통화를 할수 있어요.

◆ 주의사항

  1. 외출할때 꼭 “반즐”앱을 실행하고 나가야 해요
  2. 충전기에 연결되어 있어야해요
  3. 반려친구가 건드려서 앱이 꺼지지 않도록 적절한 위치에 두세요