기억의 습작 23

사진 이미지에서 속성값 추출하기

from exif import Image #exif 패키지 필요 file = "DJI_20220706153625_0586.JPG" with open(file, "rb") as src: img = Image(src) # img.list_all() #지원되는 모든 속성값 출력 for data in img.list_all(): try: # 간혹 속성값 출력시 에러가 뜨는 속성이 있음. 아마도 print로 표현되지 않는 데이터 인듯) print(data, ":", img[data]) except: continue 참고사이트: https://medium.com/spatial-data-science/how-to-extract-gps-coordinates-from-images-in-python-e66e542af354..

Python 2022.08.17

ROS1-13 액션 예제 3 - 서버 동작

앞서 설명한데로, 액션과 서비스의 가장 큰 차이점은 서버 수행상태에 대한 feedback이 가능하단 점이다. 이때 feefback이 단순히 중간중간 값만 전달 받는 것이라면 얼마나 아쉬운가! 그래서 서버의 종료 상태를 다음과 같이 구분한다. - preempted: 클라이언트에서 취소한 경우. - succeeded: 정상적으로 종료한 경우 - aborted: 서버에서 취소한 경우. 위의 각 상태는 다음 클라이언트 메소드를 통해 확인할 수 있다. client.get_state() #preempted=2, succeded=3, aborted=4 - 각 상태에 대해서는 아래와 같이 행위를 지정할 수 있다. server.set_abort( result변수, "전달할 메시지") # 서버 중단시 전달할 결과값 설정 ..

ROS 2022.07.28

ROS1-12 액션 예제 2 - 서버/클라이언크 코딩

이제 이루가 사용할 데이터 세트 클래스가 마들어 졌으니, 서버와 클라이언트 코딩을 해보겠다. 프로젝트폴더/src/myServer.py #!/usr/bin/python3 import rospy import actionlib # actionlib 초기화를 위해 CountNumbersAction 클래스를 임포트 하고, # 그리고, 결과와 피드백 클래스를 임포트 한다 from my_work_action.msg import CountNumbersAction, CountNumbersResult, CountNumbersFeedback import time # sleep을 위해 임포트 # 클라이언트 호출이 있을때 수행할 함수 def cbServer(goal): targetNumber = goal.targetNumber..

ROS 2022.07.28

ROS1-12 액션 예제 1 - 준비하기

액션은 앞서 설명대로 3가지 데이터 세트를 다룬다. 목표치(Goal), 중간결과(Feedback), 최종결과(Result)가 그것이다. 이 3가지 데이터 세트를 처리하기 위해 서비스와 마찬가지로, 서버와 클라이언트 방식으로 노드를 구성한다. 이 서버와 클라이언트간의 관계를 순서에 따라간단히 표현하면 다음과 같다. - 서버는 요청사항을 수행할 함수를 뛰어(=서비스를 올려) 놓는다. - 클라이언트는 이 서버에 서비스를 수행할 값을 전달 한다. 여기까지는 앞서 설명한 서비스와 동일하다. 이제 부터 달라진다. - 서버는 요청받은 값으로 서비스를 수행 중, 중간 결과를 서비스 종료까지 반환하게 되는데, 이를 피드백(feedback) 이라고 한다. - 서비스가 완전히 종료되면, 최종결과 (Result)를 반환한다...

ROS 2022.07.28

ROS1-11 서비스 예제 - 서비스 코드

서비스 부터는 앞서 토픽의 publish, subscribe와 개념을 구분하기 위해서, server와 client로 노드를 구분한다. server는 서비스를 수행할 함수를 품고, 요청이 올때 까지 대기하는 노드이고, client는 실행상태에 있는 서비스 서버를 찾고, 함수에 값을 전달한 다음, 반환되는 결과 값을 처리하는 코드로 구성된다. 본 예제는 숫자를 전달하면, 숫자의 제곱승을 회신하는 서비스 서버와 클라이언트 예시로 작성되었다. src/myServer.py #!/usr/bin/python3 import rospy from my_work_service.srv import myService, myServiceResponse #catkin이 열심히 만들어준 클래스 자료형을 import 한다 # 요청시,..

ROS 2022.07.27

ROS1-10 서비스 예제 - 서비스 메시지 준비하기

토픽은 일방적으로 데이터를 전달하기 때문에, 전달되는 데이터 형이 기본형 1개인 경우, 별도의 사용자 데이터 정의가 필요하지 않았다. 하지만, 서비스 부터는 '주고-받는' 약속이 필요하기 때문에, 기본형 1개의 데이터만 주고 받더라도, 사용자 데이터 정의가 필요하다. 그럼 사용자 데이터 정의를 통해 catkin_make가 어떤 것을 만들어 내는지 확인해 보자. 1. 서비스 메시지 파일 생성 - 토픽과 아주 비슷하지만, 문의를 할 데이터 형에 대한 선언과 문의를 처리한 다음 회신할 결과 데이터 형을 다음과 같이 프로젝트 폴더의 srv (폴더를 만들어 주어야 한다.) 안에 OOO.srv 로 만들어 주면 된다. srv/myServer.srv int32 request_number --- int32 respons..

ROS 2022.07.27

ROS1-09 토픽 예제2 - 사용자가 정의한 자료형

1. 자료형 만들기 기본 자료형을 사용하는 경우, 한번에 하나의 기본자료 밖에 처리하지 못한다. 따라서 예를 들어, 나이, 성별, 이름과 같은 자료의 묶음을 전달하고 전달 받기 위해서는 (또는 기본 자료형이 아닌 패키지 자료형) 사용자 정의 자료형을 먼저 만들어야 한다. int16 으로된 나이(age)와 String으로된 이름(name)과 int32로 된 송출횟수(pub_count) 을 Publish 해본다면 자료형은 다음과 같아지고, 이러한 자료형은 src 폴더 안에, msg 라는 서브 폴더를 만들어서 그 안에 파일이름.msg 로 저쟝해야 한다. msg/student.msg int16 age string name int32 pub_count 이렇게 간단한 선언만으로 사용자 정의 자료형이 만들어지진 않는..

ROS 2022.07.26

ROS1-07 본격적으로 코딩 하기 전에 기억할 순서!

제일 우선, 아래 명령어로 내가 만들 프로젝트(=패키지)를 초기화 한다. $cd ~/catkin_ws/src $catkin_create_pkg my_package rospy 이렇게 하면, ~/catking_ws/src 폴더 안에 my_package라는 폴더가 만들어 지고, 그 안에 코드 작성에 필요한 기본적인 파일(대표적으로 CMakeList.txt, package.xml)들과 폴더가 생성된다. 이제 package 폴더 안의 src 폴더에 들어가서 파이썬 코드를 작성하면 된다. 소스 코드 작성이 끝나면, roscore를 실행 해 준 다음, 아래와 같이 소스코드를 실행하면 된다. $roscore $rosrun my_package 실행소스파일.py 뒷장에서 설명을 하겠지만, 주고 받을 데이터 자료형을 기본형..

ROS 2022.07.26

ROS1-08 토픽 예제1 - 기본 자료형을 사용하는 경우

$rosrun pkg_name my_publisher.py ROS1-06에서 설명한데로, 토픽은 자료를 뿌려주는 Publisher와 이를 사용하는 Subscriber로 구성된다. !! 중요!! 설명을 위해 주석을 한글로 넣었지만, 경험상 한글은 주석을 포함해도 모두다 인식을 못한다. 즉 한글 문자는 모두 지워주어야 한다. my_Publisher.py #!/usr/bin/python3 import rospy from std_msgs.msg import String #전달할 메시지의 자료형 # 노드의 이름, ROSCore에 동일 이름으로 등록된 노드가 있다면, # 해당 노드를 종료시키고, 새로운 노드가 활성화 된다. rospy.init_node('my_publisher01') # rospy.Publisher..

ROS 2022.07.26