본문 바로가기

전체 글

Matlab Mini drone Competition 2021 Our Rise to the Moon Team has won 6th in Matlab Mini Drone Competition 2021 Goal is to make the Line Following Algorithm using Parrot Mambo simulink program https://kr.mathworks.com/academia/student-competitions/minidrones/emea.html MathWorks Minidrone Competition – EMEA 2021 MathWorks Minidrone Competition MathWorks Minidrone Competition – EMEA 2021 kr.mathworks.com 아래 그림과 같이 길을 따라서 드론이 비행을 합니다.. 더보기
ROS2 - Python 보호되어 있는 글입니다. 더보기
Airsim Simulation& Drone Competition Arisim, Unreal Engine, PX4(noise added) 설치 링크 및 실행코드 https://github.com/rladntjd/Drone_Competition.git GitHub - rladntjd/Drone_Competition: Autonomous Drone Simulation Competition Autonomous Drone Simulation Competition. Contribute to rladntjd/Drone_Competition development by creating an account on GitHub. github.com -Mavros 실행코드는 아래와 같다. roslaunch mavros px4.launch fcu_url:="udp://:14540@127.0... 더보기
[VIO] Stereo-MSCKF 알고리즘 분석 및 적용 S-MSCKF 는 stereo camera 를 사용하는 MSCKF 알고리즘 이다 MSCKF 는 IMU 와 Camera 센서를 사용하여 고정된 feature 에 대해서 measurement update 를 수행하여 odometry 를 제공하는 알고리즘이다. MSCKF는 기본알고리즘은 아래와 같다 - State Definition State 에서 1개의 IMU state 와 N 개의 Cam sate 가 있다. - Propagation (IMU) 위의 그림과 같이 IMU 의 msg 는 Camera msg 보다 많은 양의 msg 가 들어온다. 따라서 Camera msg 와 다음 Camera msg 사이동안 받은 IMU msg 를 IMU buffer에 저장하고 Camera msg 가 들어오면 imu Propaga.. 더보기
[논문] Time-Continuous Real-Time Trajectory Generation for Safe Autonomous Flight of a Quadrotor in Unknown Environment Time-Continuous Real-Time Trajectory Generation for Safe Autonomous Flight of a Quadrotor in Unknown Environment https://www.mdpi.com/2076-3417/11/7/3238 Time-Continuous Real-Time Trajectory Generation for Safe Autonomous Flight of a Quadrotor in Unknown Environment In this paper, we present an efficient global and local replanning method for a quadrotor to complete a flight mission in a clutter.. 더보기
python 스타일 가이드 정리 - shebang line을 제일 위에 적기 - shebang 다음줄에 encoding 적기 - import 할때는 한줄에 여러개를 콤마로 묶지 않고 따로 쓰기 - 약어는 (as) 는 표준어 처럼 쓰이는 것만 사용 ex numpy as np - import * 은 사용 금지 - import 할때는 base 가 되는것 부터 먼저 적기 - import 사이는 줄을 띄우지 않지만 너무 많은 경우 섹션을 나누고 섹션 사이는 1줄로 나누기 - 전역 변수는 최대한 사용 금지 - string 을 사용할때는 string + string 연산은 금지 (시간이 너무 오래 걸리는 연산) 대신 f-strings 연산을 사용한다. 버전이 3.6보다 낮으면 formatter 사용 f."The Velocity is {vel}." .. 더보기
[S-hero] Multi Tethered Drone for Better Accessibility Purpose Aerial Robot은 다양한 분야에서 사용할 수 있습니다. Aerial robot 의 대표적인 드론은 배터리 사용량 때문에 짧은 시간 동안만 비행할 수 있습니다. 더 긴 시간 비행하기 위해 tethered 드론이 사용되지만, 유선 시스템은 드론의 움직임을 제한합니다. 그라운드뿐만 아니라 드론 아래에도 윈치가 배치된 멀티 tethered 드론은 더 많은 움직임의 자유와 더 긴 비행 시간을 가질 수 있는 해결책이 될 수 있습니다. 비행 시간 문제를 해결하는 멀티 tethered 드론의 기본 개념은 위 그림에서 확인할 수 있습니다. A 드론은 에너지를 지상 또는 다른 드론에서 전달 받아 다른 드론에 전력을 전달하는 역할을 합니다. 드론과 지상의 거리를 기반으로 cable의 길이를 제어합니다... 더보기
[18회 로봇 항공기 대회] 응급kit 배송 드론 System Overview High-Level Controller : Raspberry pi4 Low-Level Controller : Pixhawk2 Maximum Speed 12 m/s Rising/Descending Maximum Speed 상승 : 3m/s 하강 : 1m/s Crusing Speed 7 m/s Weight 3.8kg Length*Width*Height 550*550*300mm Maximum Flight Weight 6.0kg Maximum Flight time 25분 Battery Model Polytronics 10000mah 4s Li-pi Battery Spec Mission The home -> wp1, wp3 -> home 구간은 Artificial Potential F.. 더보기
TensorFlow Feature = input Label = output Graph = Computational 의 일부 (아직 계산 하기 전) Session = Graph 의 집합 Rank = Tensor 의 차원 ex) rank 2 => 행렬 Shape = 각 차원에 값이 얼마나 있는지 ex) (3,3,2) 1차원에 3개의 값, 2차원에 3개의 값, 3차원에 2개의 값 rank1_tensor = tf.Variable(["Test"], tf.string) rank2_tensor = tf.Variable([["test", "ok"], ["test", "yes"]], tf.string) tf.rank(rank2_tensor) 이라고 한다면 출력은 아래와 같다 즉 rank 는 2 이다. reshape 는 이미 존재하는 Ten.. 더보기
opencv PYTHON -opencv 파일 불러오기 및 webcam 사용 및 띄우기 # -*- coding: utf-8 -*- import cv2 ''' cap = cv2.VideoCapture("Resources/test.video.mp4") # 파일 불러오는 방법 ''' cap = cv2.VideoCapture(0) # webcam 쓰는 방법 cap.set(3,640) #가로 640 으로 설정 cap.set(4,480) #세로 480 으로 설정 cap.set(10,100) #밝기 100 으로 설정 while True: success, img = cap.read() # success 에서는 treu 나 false 가 들어가고 , img 에 image 전달 cv2.imshow("video", img) if cv2.waitKey.. 더보기
Extended Kalman Filter & Error state Kalman Filter (IMU + Motion Capture) IMU 와 motion capture 를 사용하여 Sensor Fusion 을 할 것이다. (IMU+ GPS 와 비슷하게 설정하기 위해) 아래와 같이 State를 정의 한다. Measurement 에는 Motion Capture 에서 받은 position 와 Velocity를 사용한다. q_measured 는 Accelometer 와 Magnetometer 에서 받은 값을 통해 quaternion을 생성한다. 또한 Error state Kalman Filter 를 통해 Bias 를 update 할 수 있다. 아래는 Kalman Filter 와 Extended Kalman Filter 의 증명 과정이다. - probablistic Robotics - https://arxiv.org/abs/1711.0250.. 더보기
MAVROS OFFBOARD 사용 예시 코드 아래 코드는 PX4 Firmware 기준 publish & Subscribe & service 해야할것 # Publisher self.local_pose_pub = rospy.Publisher('/mavros/setpoint_position/local', PoseStamped, queue_size=10) self.velocity_pub = rospy.Publisher('/mavros/setpoint_velocity/cmd_vel_unstamped', Twist, queue_size=10) # Subscriber rospy.Subscriber('/mavros/state', State, self.stateCb) rospy.Subscriber('/mavros/home_position/home', HomePos.. 더보기
C ++ 연습장 printf => std::cout(출력) & 역참조 연산자 = > * #include int main(void) { int x = 5; std::cout 지역변수 함수 내에서 전역 변수 사용하고 싶으면 "::전역변수"(전역 변수& 지역 변수 이름 겹쳤을때) 으로 사용가능 전역변수 & 지역변수 이름 다르면 그냥 바로 "전역변수" 로 사용가능 Call By Value & Call By Reference Call By Value 는 값을 받아서 함수를 돌린다 => 따라서 함수 밖의 값에 영향을 미치지 않는다. Call By Reference 는 값의 주소를 받아서 함수를 돌린다 => 따라서 함수 밖의 값에 영향을 미칠 수 있다. Call By Value Call By Refernece (By Pointer).. 더보기
Camera Calibration (with IMU) Using Kalibr github.com/ethz-asl/kalibr.git ethz-asl/kalibr The Kalibr visual-inertial calibration toolbox. Contribute to ethz-asl/kalibr development by creating an account on GitHub. github.com - april 6 6 grid 뽑아서 길이 측정 & yaml 파일에 저장 - rosbag 로 imu & camera 토픽 메시지 저장 - camera calibration 하기 - camera IMU calibration 하기 Camera intrinsic & extrinsic parameter 찾기 ./kalibr_calibrate_cameras --targe.. 더보기
[Senior Capstone Project] 드론 수동 조종을 위한 안전 비행 보조 모듈 개발 이 프로젝트는 PPM 변환 신호를 통해 GEO FENCE 기술을 구현하는 것입니다. 따라서 컨트롤러 신호(PPM) 신호가 라즈베리 파이에서 픽스호크로 전송되어 GEO FENCE를 활성화합니다. 픽스호크의 경우, 제어 신호에 따라 비행하는 것과 동일하게 됩니다. 아래 그림은 시스템의 개략도입니다. 그림에서 보듯이, PPM 신호는 직접 플라이트 컨트롤러로 받아와서 전송되는 것이 아니라 라즈베리 파이를 통해 전송됩니다. 이 때 라즈베리 파이에서 Geo Fence 내부라면 입력으로 받은 PPM 신호를 그대로 플라이트 컨트롤러로 전송합니다. 그러나 GEO 펜스 외부라면 입력으로 받은 PPM 신호가 아닌 제어 루프를 통해 새로운 신호를 플라이트 컨트롤러로 전송합니다. 제어는 PI 제어를 사용하여 수행되었습니다. 이.. 더보기
PIXHAWK SIMULATION sudo apt-get install ros-melodic-mavros ros-melodic-mavros-extras wget https://raw.githubusercontent.com/mavlink/mavros/master/mavros/scripts/install_geographiclib_datasets.sh sudo chmod +x install_geographiclib_dataset.sh sudo ./install_geographiclib_dataset.sh wget https://raw.githubusercontest.com/PX4/Devguide/master/build_scripts/ubuntu_sim_common_deps.sh sudo chmod +x ubuntu_sim_common_deps.. 더보기
아두이노 센서 사용 코드 예시 목차 저항 PWM LED 센서 실습 애노드 캐소드 실습 택트 스위치 실습 피에조 부조 실습 조도 센서 실습 적외선 센서 실습 LCD 센서 실습 온,습도 센서 및 LCD 센서 실습 초음파 센서 실습 서보 모터 실습 스텝 모터 실습 DC 모터 실습 블루투스 모듈 실습 WIFI 모듈 실습 (STA 모드) WIFI 모듈 실습 (AP 모드) 저항 저항을 사용할 때 띠의 색으로 저항의 크기를 표시한다. 색을 보고 알맞은 저항을 사용하면 된다. 저항이 크면 클수록 흐르는 전류의 양은 줄어든다. Pwm 신호 Pwm 신호란 pulse width modulation 의 줄임말로, 디지털 신호로 아날로그 신호를 만드는 기법이다. 신호에서 일정 시간동안 0과 1을 반복한다. 이중 1이였던 시간을 Duty Cycle 이라한다... 더보기
[공수치] MATLAB 코드 정리 - Type - Conjugate A’ = A conjugate - 행렬 위치 불러오기 - 단순 행렬 만들기 - Colon operator Ex) - Linspace (범위 내에서 간격이 동일한 여러 개 만들기) - Logspace (10^x1 과 10^x2 의 구간 내에서 10의 몇승 씩 만큼 차이 나도록 만들기) - Character string & ellipsis - Mathematical operations - Complex number i 와 j 를 둘다 써도 complex number 를 - 행렬 연산 행렬 연산에서 * = 행렬 곱하기 행렬 연산에서 ^ = 행렬 제곱( 행렬이 square 이여야지 오류가 안남) 행렬 연산에서 .* = element 끼리 곱하는거 행렬 연산에서 .^ = elem.. 더보기
BLDC 모터 BLDC 모터란 Blush less 즉 교차기가 없다. 따라서 고속회전에도 쓰일수 있으며 드론에 모터로 적합하다. 내부 코일에 자력을 형성하여 회전 하는 원리를 가지고 있다. 내부 구조는 아래와 같다. 모터에서 3가지 영역으로 나누어 밖의 회전부분과 안의 코일의 자성으로 인한 인력으로 모터가 회전하는것이 주 원리이다. 이것을 가능하게 하기 위해 코일의 전극을 아래 그림과 같이 일정주기로 계속 바꾸어 주어야한다. 그리고 모터의 회전속도에 따라서 코일의 전극의 주기가 달라진다. 이렇게 모터의 회전을 위하여 코일에 해당되는 전력이 일정 주기로 바뀌어 지기 위해서 ESC 가 필요하다. ESC는 PWM 신호를 수신 받아 회전속도에 맞게 모터에 전극 신호를 준다. 더보기
pixhawk 사용법 픽스호크의 전력을 연결하는 배선도는 아래와 같다. BEC = 일정한 전압을 공급하는 장치로서 픽스호크가 아닌 라즈베리 파이, 젯슨 보드 등에 전원 공급이 가능하다. - 픽스호크 기본 wiring RC 로 조종기의 신호를 수신 가능하다(ppm, sbus) main output 을 모터의 ESC 와 연결한다. 모터의 순서와 output 의 순서를 맞게 연결해야한다. 모터의 순서는 아래 링크를 참조한다. https://ardupilot.org/copter/docs/connect-escs-and-motors.html 전체적인 배선도는 아래와 같다. 단 조립할때 부저와 픽스호크를 5cm 보다 멀게 부착 해야한다. (가속도계에 영향이 가기 때문) - 픽스호크의 부착된 LED 의 신호 의미 - 픽스호크 기본 설정 픽.. 더보기
GPS(nmea) gps 를 사용함에 있어서 nmea 규격을 사용하는 경우가 많다. nmea = The National Marine Electronics Association 으로 gps 에서 표준 프로토콜이다. 프로토콜은 gpgga, gpgsv, gprmc, gpgsa 로 구성 되어 있다. ex) gps 의 예시는 아래와 같다. gpgga = Global Positioning System Fix Data 시간, 위도, 경도, 고도 등을 알 수 있다. ex) $GPGGA,114455.532,3735.0079,N,12701.6446,E,1,03,7.9,48.8,M,19.6,M,0.0,0000*48 - 114455.532는 시간으로서 Zulu time (그리니치 표준시) 기준으로 11시 44분 55.532초를 뜻한다. - 3.. 더보기
Quadrotors Dynamics error 의 정의를 아래와 같이 한다. 아래와 같다면, exponentially 0 으로 수렴한다. 대표적으로 PD, PID 를 사용한다. 예시는 아래와 같다. (이 글에서는 PD 를 기반으로 설명 하겠다.) Agility y-z plane 에서 본다면 agility 는 아래와 같다. 따라서 무게와 inertia 가 적으면서 추력이 강하면 roll, pitch 가 빨라지며 가속도가 빨라지게 된다. Rotation Euler angle 에 기반하여 본다면 아래와 같다. P = body-fixed frame q = inertial frame 일때 아래와 같다. 각속도를 구해보면 아래와 같다. (world 인지 body-fixed 인지 구분을 잘 해야한다!!!!!) ex) roll = pi/2 상황일때 각속.. 더보기
ppm 신호 protocol ppm 이란 pulse-position modulation 의 약자 이다. 일반적으로 조종기의 수신기에서 값을 보낼때 ppm 신호 또는 sbus 신호로 보낼 수 있다. sbus 신호는 디지털이라 잡음이 없다는 장점이 있다. ppm 신호는 아날로그 신호라 잡음이 있다는 단점이 있다. 아래의 그림 처럼 일반적으로 frame 의 시간은 20ms 이다. 즉 하나의 신호를 전달하기 위해서는 20ms 가 소요된다는 말이다. 따라서 50Hz로 전송 가능하다. 또한 하나의 스틱이 하나의 체널을 의미한다. 따라서 하나의 스틱과 다음의 스틱까지의 시간으로 체널의 값이 정해진다. ex) 만일 2번째 스틱과 3번째 스틱의 시간 차가 2000(마이크로 sec) 이라면 2channel 값이 2000이 되는 것이다. 하나의 ppm.. 더보기
git hub 사용법 Manual git add . git config user.name "깃허브 닉네임" git config user.email "깃허브 이메일" git commit -m "메세지" git push origin master git clone (git hub 주소) git init = 깃이 관리하게 시작 git config --global user.name "rladntjd" git config --global user.email "kws1611@naver.com" Git status = 아직 타임캡슐에 묻은거 안묻은거 확인 Untracked 아직 담기지 않은거 Git add -A = 모든걸 다 여기에 넣는거 Git commit -m “이름” = 타임 캡슐에 묻기 Git log = 캡슐 정보와 메시지 뜸 Git reset.. 더보기
[우수학부생] Kalman Filter 을 이용한 자세 추정 및 모션 캡처를 이용한 실험 결과 - 칼만 필터를 사용할때는 state, 모델, Z 뭔지 반드시 설명 해야함 - 78.5hz 가 아쉽 - 최소 500hz 에서 law pass filter 한번 돌리고 다시 칼만을 넣으면 훨씬 더 정확해질 수 있음 연구 목적 IMU를 통해 받아들여지는 Raw Data를 KALMAN Filter를 사용하여 noise 제거 및 정확도 향상 연구 내용 IMU 센서는 자이로 센서, 가속도 센서, 지자기 센서로 구분 된다. IMU 센서는 Body Frame 에서의 값들을 측정한다. 자이로 센서는 각속도를 측정하는 센서이다. 각속도를 적분하는 방식으로 자세를 계산할 수 있다. 하지만 오차가 함께 계산이 된다는 단점이 있다. 가속도 센서는 센서 주변 외력에 의한 가속도를 측정하는 센서이다. 가속도 센서는 와 같이 지구.. 더보기
imu 센서를 활용한 attitude estimation (quaternion base) mpu9250 을 기준으로 작성된 글입니다. 1) 자이로 센서 자이로 센서 = 각속도를 나타내는 센서로 각 각가속도 *dt 값으로 변화량을 나타낼수 있다. 쿼터니언 기반으로 나타낸 식은 아래와 같다. 자이로는 accel 과 지자기 센서보다 훨씬 높은 정확도를 가지지만 bias 를 동반 하기 때문에 일정 주기마다 bias 를 빼는 작업이 필수적이다. 실제로 높은 정확성 때문에 complementary filter 에서 쓰일때도 자이로센서를 0.92~0.98 까지 비율을 쓴다. 2) 가속도 센서 (accel sensor) 가속도 센서는 중력 가속도를 측정할 수 있는 센서이다. 가속도 측정을 통해서 자세를 추정 할 수 있다. 하지만 yaw 값( z축 회전) 은 알수 없으므로 roll, pitch 값만 추정이 .. 더보기
ROS 연습장 (python, C++) - ros 기본 setup Cd ~ 에서 sudo gedit ~/.bashrc 에서 제일 밑에 source ~/catkin_ws/devel/setup.bash 넣기 - ros package 만들기 Catkin_ws/src 에서 catkin_create_pkg std_msgs rospy roscpp 패키지 안에 있는 xml, cmake.txt 수정하기 (dependencies 설정) - ros package build catkin_ws 에서 catkin_make 로 빌드 가능 특정 패키지 빌드 원하면 아래와 같이 적기 catkin_make --pkg - ros script 작성 파이썬으로 작성할시 #!/usr/bin/python 제일 위에다가 적어야지 파이썬으로 인식함 (파이썬 경로) 파이썬 경로는 whi.. 더보기
motion catpure 1) 카메라 설치 밑 선 연결 2) 노트북에서 motive 열기 3) show mask 로 지금 있는 마스크들을다 지움 4) clear mask 로 있는 마스크들을다 보이게함 5) winding 시작 마지막에 acceptional 떠야지 정상임 6) 삼각형 (좌표 알림) 놓고 드레그 7) 물체 만들고 드레그 rigid body 로 설정 8) ip 설정하고 보내기 (engine 체크 해줘야지 보내짐) - starting code roslaunch vrpn_client_ros sample.launch server:=192.168.0.104 더보기
Kalman Filter 칼만 필터 (Kalman Filter) 칼만필터의 대략적인 개요는 아래와 같다 예측과 측정값을 통해 값을 추정하는 것이다. 기본이 되는 칼만 필터의 수식은 아래와 같다. - 시스템 모델 A, Q 를 기초로 하여 X^, P^ 를 예측 - 측정값&예측값 차이로 보정하여 새로운 값 추정 기본적인 시스템 모델은 아래와 같이 표현 할 수 있다. 여기서 A 는 상태 전이 행렬 이라고 불리며 정의는 아래와 같다. 추정값 계산을 할때 1st low pass filter 와 같이 가중치를 이용하여 값을 계산하는 것은 똑같지만, 가중치가 계속 바뀌는것이 칼만 필터의 특징이다. 가중치는 kalman gain 이고 K 로 적는다 kalman gain (칼만 이득) 을 계산하는 과정은 아래와 같다 위의 식을 행렬이 아니라 일반.. 더보기
파이썬 코딩 연습장 # 정수/정수 = 몫을 구하는거 실수/정수 = 나누기 계산 1/100 = 0.0 1.0/100 = 0.01 # 숫자랑 문자 합치는게 안됨 x = 1 y = "2" print(x+y) # 에러발생 print(str(x) + y) print(x + int(y)) #라고 해줘야지 에러가 발생하지 않음 # 함수 def function_name(): print("함수 예시") function_name() #함수 불러오기 def function_name1(name1, name2, age): print("%s 이름 " % name1) print("%s 이름 %d 나이" % (name2, age)) # 함수 def dsum(a,b): result = a + b return result # 값을 대입하는건 return .. 더보기