1. Trang chủ
  2. » Luận Văn - Báo Cáo

Nghiên cứu thuật toán dẫn đường thời gian thực cho phương tiện bay không người lái phục vụ công tác tìm kiếm cứu nạn

87 6 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 87
Dung lượng 2,75 MB

Nội dung

Mẫu 1a MẪU BÌA LUẬN VĂN CĨ IN CHỮ NHŨ VÀNG Khổ 210 x 297 mm PHẠM HOÀNG ANH BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI - PHẠM HOÀNG ANH KỸ THUẬT ĐIỆN TỬ NGHIÊN CỨU THUẬT TOÁN DẪN ĐƯỜNG THỜI GIAN THỰC CHO PHƯƠNG TIỆN BAY KHƠNG NGƯỜI LÁI PHỤC VỤ CƠNG TÁC TÌM KIẾM CỨU NẠN LUẬN VĂN THẠC SĨ KHOA HỌC KỸ THUẬT ĐIỆN TỬ 2013B Hà Nội – Năm 2014 MẪU TRANG PHỤ BÌA LUẬN VĂN Mẫu 1b BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI PHẠM HỒNG ANH NGHIÊN CỨU THUẬT TỐN DẪN ĐƯỜNG THỜI GIAN THỰC CHO PHƯƠNG TIỆN BAY KHÔNG NGƯỜI LÁI PHỤC VỤ CƠNG TÁC TÌM KIẾM CỨU NẠN Chun ngành : KỸ THUẬT ĐIỆN TỬ LUẬN VĂN THẠC SĨ KHOA HỌC KỸ THUẬT ĐIỆN TỬ NGƯỜI HƯỚNG DẪN KHOA HỌC : TS ĐỖ TRỌNG TUẤN Hà Nội – Năm 2014 MỤC LỤC LỜI CAM ĐOAN DANH MỤC CÁC KÝ HIỆU, CÁC CHỮ VIẾT TẮT DANH MỤC CÁC BẢNG DANH MỤC CÁC HÌNH VẼ, ĐỒ THỊ PHẦN MỞ ĐẦU 10 Lý chọn đề tài 10 Lịch sử nghiên cứu 12 Mục đích nghiên cứu luận văn, đối tượng, phạm vi nghiên cứu 12 Tóm tắt đóng góp tác giả 13 Phương pháp nghiên cứu 13 CHƯƠNG 1: TỔNG QUAN VỀ PHƯƠNG TIỆN BAY KHÔNG NGƯỜI LÁI UAV 14 1.1 Quá trình phát triển loại phương tiện bay 14 1.1.1 Lịch sử phát triển phương tiện bay 14 1.1.2 Đánh giá loại phương tiện bay 18 1.2 Cấu trúc điều khiển tổng quát 20 1.3 Lựa chọn phương tiện bay nhiều cánh quạt OctoRotor UAV 21 CHƯƠNG 2: ĐỘNG LỰC HỌC ĐIỀU KHIỂN CHO PHƯƠNG TIỆN BAY OCTOROTOR UAV 26 2.1 Biểu diễn phương tiện bay không người lái không gian 26 2.1.1 Định vị phương tiện bay không gian 26 2.1.2 Biểu diễn trạng thái phương tiện bay không gian chiều 27 2.2 Động lực học điều khiển cho phương tiện bay OctoRotor UAV 32 2.3 Cấu trúc điều khiển OctoRotor UAV 34 CHƯƠNG 3: THUẬT TOÁN DẪN ĐƯỜNG THỜI GIAN THỰC CHO OCTOROTOR UAV SỬ DỤNG BỘ LỌC KALMAN ĐỂ TÍCH HỢP TÍN HIỆU INS/GPS 36 3.1 Hệ dẫn đường quán tính cho phương tiện bay 36 3.1.1 Khái niệm 36 3.1.2 Lý thuyết hệ dẫn đường quán tính 36 3.1.3 Ưu điểm hệ dẫn đường quán tính 41 3.1.4 Nhược điểm hệ dẫn đường quán tính 42 3.1.5 Các loại nhiễu ảnh hưởng đến khối IMU 42 3.2 Thuật toán dẫn đường thời gian thực sử dụng lọc Kalman Filter tích hợp INS/GPS 43 3.2.1 Khái quát hệ thống định vị GPS 43 3.2.2 Lý thuyết lọc Kalman 45 3.2.3 Thuật toán dẫn đường thời gian thực sử dụng lọc Kalman Filter tích hợp INS/GPS 49 3.3 Thực mô đánh giá thông số phần mềm Mallab/Simulink 54 3.3.1 Kiến trúc chương trình mơ 54 3.3.2 Thực kịch mô 66 KẾT LUẬN 72 Kết luận 72 Hướng phát triển 72 TÀI LIỆU THAM KHẢO 73 PHỤ LỤC 75 LỜI CAM ĐOAN Tôi xin cam đoan luận văn nghiên cứu Tất kết đạt chưa trình bày luận văn thạc sỹ khác Các số liệu, lý thuyết tham khảo trích dẫn từ tài liệu gốc Hà Nội, ngày 29/09/2014 Học viên thực Phạm Hoàng Anh DANH MỤC CÁC KÝ HIỆU, CÁC CHỮ VIẾT TẮT Từ viết tắt PCCC UAV KHCN EKF GPS IMU INS MEMS KF NED PC-box SINS DCM OctoRotor UAV PID 𝜙𝑑 , 𝜃𝑑 , 𝜓̇𝑑 𝜙𝑚 , 𝜃𝑚 𝜓̇𝑚 Ω𝑚 Nội dung Phòng cháy chữa cháy Phương tiện bay không người lái (Unmanned Aerial Vehicle) Khoa học công nghệ Bộ lọc Kalman mở rộng (Extended Kalman Filter) Hệ thống định vị vệ tinh toàn cầu (Global Positioning System) Bộ đo đạc quán tính (Inertial Measurement Unit) Hệ thống dẫn đường quán tính (Inertial Navigation System) Hệ vi điện tử (Micro ElectroMechanical System) Bộ lọc Kalman (Kalman Filter) Các trục hệ toạ độ dẫn đường (North, East, Down) Máy tính cá nhân chuyên dụng (Persional Computer Box) Hệ dẫn đường loại gắn chặt (Strapdown INS) Ma trận cosin định hướng (Direct Cosin Matrix) Phương tiện bay không người lái cánh quạt Bộ điều khiển vi tích phân tỷ lệ (Proportional Integral Derivative) Góc Roll, Pitch, Yaw mong muốn Góc Roll, Pitch, Yaw đo Vận tốc thực tế động F m (eVN, eVE, eVD) (GBx, GBy, GBz) (Tn, Te) Véc tơ tổng lực tác dụng lên vật thể Khối lượng vật thể Hệ tọa độ dẫn đường Độ trôi quay vi Lỗi góc nghiêng DANH MỤC CÁC BẢNG Bảng 1: Đánh giá loại phương tiện bay 18 Bảng 2: Thông số kỹ thuật đề tài nghiên cứu Sở KHCN Hà Nội 22 Bảng 3: Bảng tính tốn giá trị góc Euler từ ma trận xoay 31 Bảng 4: Bảng mô tả thông số đầu điều khiển động 57 Bảng 5: Giá trị đầu từ khối cảm biến 57 Bảng 6: Đánh giá sai số phương pháp dẫn đường 70 DANH MỤC CÁC HÌNH VẼ, ĐỒ THỊ Hình 1.1 - Lịch sử phát triển phương tiện bay 14 Hình 1.2 - Breguet- Richet Gyroplane No.1 [10] .15 Hình 1.3 - QuadCopter Etienne Oemichen [10] 15 Hình 1.4 - Bạch tuộc bay [10] 16 Hình 1.5 - Convertawings Model A [10] 16 Hình 1.6 - Sơ đồ khối điều khiển, định vị dẫn đường phương tiện bay 20 Hình 1.7 - Mơ hình phương tiện bay động OctoRotor 22 Hình 1.8 - Phân bổ ứng suất kết cấu thiết bị bay chong chóng mang, trường hợp bay treo .23 Hình 1.9 - Phân bố biến dạng kết cấu thiết bị bay chong chóng mang, trường hợp bay treo ổn định 23 Hình 1.10 - Phân bố ứng suất biến dạng tổng kết cấu thiết bị bay chong chong mang chuyển động với gia tốc 5m/s2 theo phương thẳng đứng 24 Hình 1.11 - Phân bố ứng suất biến dạng tổng kết cấu thiết bị bay chong chong mang chuyển động với gia tốc 10m/s2 theo phương thẳng đứng 24 Hình 1.12 - Phân bố ứng suất biến dạng tổng kết cấu thiết bị bay chong chong mang chuyển động với gia tốc 15m/s2 theo phương thẳng đứng 25 Hình 1.13 - Phân bố ứng suất biến dạng tổng kết cấu thiết bị bay chong chong mang chuyển động với gia tốc 15m/s2 theo phương ngang 25 Hình 2.1 - Hệ toạ độ biểu diễn phương tiện bay .27 Hình 2.2 - Ứng dụng Góc Tait- Bryan hàng khơng 28 Hình 2.3 - Biểu diễn tham số điều khiển OctoRotor UAV .34 Hình 2.4 - Sơ đồ khối chức mở rộng hệ thống điều khiển cho OctoRotorUAV 35 Bảng 6: Đánh giá sai số phương pháp dẫn đường Nội dung Bán kính sai số lớn chiếu theo hệ trục XY Sai số lớn chiếu theo trục X mặt phẳng XZ Sai số lớn chiếu theo trục Y mặt phẳng YZ Chỉ có tín hiệu GPS Chỉ có tín hiệu INS Kết hợp tín hiệu INS + GPS 14 m 15 m 6m 10 m 15 m 5m 13 m 16 m 7m Nhận xét: Qua bảng thống kê (bảng 6) ta tấy dẫn đường ta thấy trường hợp không sử dụng INS không sử dụng GPS sai số lớn (bằng 16 m) Trong sai số sử dụng INS + GPS 7m Như dẫn đường sử dụng phương pháp định vị INS kết hợp GPS cho độ xác tốt Về điều khiển cân Kết mơ khơng điều khiển góc mà thay đổi mức ga cho thấy thiết bị cân tốt, góc nghiêng gia động khoảng từ -1o tới 10 Kết mơ góc nghiêng, giá trị cực đại hay cực tiểu, Octocopter đạt đến trì góc nghiêng theo thuật tốn điều khiển từ -35o đến 35o Hình 3.30 - Đồ thị so sánh đáp ứng góc Roll 70 Hình 3.31 - Đồ thị so sánh đáp ứng góc Pitch Về đáp ứng trọng tải: Với trọng tải hệ thống 8kg, thiết bị bay cất canh mức ga khoảng 41% Đây giá trị lí tưởng Điều cho phép tăng tải trọng thiết bị bay, giúp Octocopter mang nhiều thiết bị hỗ trợ Theo tính tốn mơ giá trị khối lượng cất cánh mức 50% ga (một mức an toàn thường sử dụng rộng rãi) 13 kg Tức hệ thống có thẻ tăng thêm 5kg Hình 3.32 - Đáp ứng sức nâng tăng ga Trên đồ thị hình 3.32 đường màu đỏ giá trị tín hiệu điều khiển mức ga từ Ch3-throttle Giá trị nhân lên lần để dễ dàng quan sát biến thiên Đường màu xanh tốc độ theo trục thẳng đứng Octocopter Kết đồ thị cho thấy, mức ga giá trị nhỏ 2.87 (tương đương với tín hiệu điêu khiển 0.410) Octocopter có tốc độ bay thẳng đứng âm Kết hợp với việc thay đổi mức ga chậm, để giảm việc tác động từ quán tính Kết thu tín hiệu điều khiển thiết bị bay có tốc độ cất cánh lớn 0.41 tương ứng với xung PWM điều khiển 1410 Nhỏ 50% mức ga chung Giá trị kết tốt so với thiết bị bay nhiều cánh quạt 71 KẾT LUẬN Kết luận - Đề tài trình bày biểu diễn phương tiện bay không người lái không gian Cụ thể phương tiện bay không người lái nhiều cánh quạt OctoRotor UAV - Trình bày mơ phương trình động lực học điều khiển phương tiện bay OcoRotor UAV ứng dụng công tác hỗ trợ cứu hộ cứu nạn chữa cháy nhà cao tầng khuôn khổ đề tài nghiên cứu Sở KHCN thành phố Hà Nội - Nghiên cứu thuật toán định vị dẫn đường thời gian thực sử dụng lọc Kalman để tích hợp INS/GPS Hướng phát triển - Thực thi thuật toán kết hợp INS/GPS tảng phần cứng - Hoàn thiện thuật toán điều khiển nhằm tối ưu, hỗ trợ tối đa cho người điều khiển phương tiện bay nhằm thực công tác cứu hộ - Kết hợp thuật toán dẫn đường với thuật toán điều khiển để thiết bị bay hoạt động tốt điều kiện môi trường đặc thù như: nhiệt độ cao, khói bao phủ, độ ẩm lớn Đặc biệt khả hoạt động thiết bị bay hoạt động không gian bay tương đối hạn chế có nhiều vật cản 72 TÀI LIỆU THAM KHẢO [1] Cai, G., Peng K., Chen, B M., and Lee, T H., (2005), “Design and Assembling of a UAV Helicopter System”, Proceedings of the5th International Conference on Control & Automation, Budapest, Hungary, 2005, pp 697–702 [2] Đỗ Trọng Tuấn et al (2013) “Nghiên cứu, thiết kế, chế tạo phương tiện bay hỗ trợ cơng tác phịng cháy chữa cháy địa bàn thành phố Hà Nội”, mã số 01C – 02/04/2013 – 2, Sở KHCN thành phố Hà Nội [3] Eric N Johnson, Michael A Turbe, Allen D Wu, Suresh K Kannan and James C Neidhoefer, “Flight Test Results of Autonomous Fixed-Wing UAV Transitions to and from Stationary Hover”, AIAA Guidance, Navigation, and Control Conference and Exhibit 21 - 24 August 2006, Keystone, Colorado [4] Francois Hugon, Robert F Hartley, Brian DeRosa, Christopher Carvalho, (2012), “ArduPilot 2.0 Simulink Block Set”, Embry-Riddle Aeronautical University Savannah, Georgia, Embry-Riddle Aeronautical University Daytona Beach, Floria [5] Guillaume J J D., (2009) Fault-tolerant Flight Control and Guidance Systems: Practical Methods for Small Unmanned Aerial Vehicles Springer [6] Harbick, K., Montgomery, J F., and Sukhatme, G S., (2004), “Planar Spline Trajectory Following for an Autonomous Helicopter”, Journal of Advanced Computational Intelligence – Computational Intelligence in Robotics and Automation, Vol 8, No 3, 2004, pp 237–242 [7] Miaobo Dong , Ben M Chen , Guowei Cai, Kemao Pen, (2007), “Development of a Real-time Onboard and Ground Station Software System for a UAV Helicopter”, Journal of Aerospace computing, inormation and communication, Vol.4, August 2007 [8] Phạm Hoàng Anh, Phạm Gia Điềm, Đỗ Trọng Tuấn, Ngô Văn Hiền, Nguyễn Phú Hùng, (2014), “Mơ hình thiết kế hệ thống điều khiển cho Quadrotor dựa công nghệ Arduino” Hội nghị học thuỷ khí tồn quốc 2014 73 [9] Randal Beard, Derek Kingston, Morgan Quigley, Deryl Snyder, Reed Christiansen, Walt Johnson, Timothy McLain,and Michael A Goodrich, “Autonomous Vehicle Technologies for Small Fixed-Wing UAVs”, Journal of Aerospace computing, inormation and communication, Vol 2, January 2005 [10] Samir B., Roland S., (2007) “Full Control of a Quadrotor” Proc of the 2007 IEEE/RSI International Conference on IROS, San Diego, CA, USA, ISBN 14244-0912-8, pp 153-158 [11] Vikas Kumar N, (2004), “Intergration of Inertial Navigation System and Global Positioning System Using Kalman Filtering”, Department of Aerospace engineering indian institite of Technology, Bombay, Mumbai 74 PHỤ LỤC A Phụ lục code chương trình mơ Matlab/Simulink function varargout = multi_sim(varargin) gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, 'gui_Singleton', gui_Singleton, 'gui_OpeningFcn', @multi_sim_OpeningFcn, 'gui_OutputFcn', @multi_sim_OutputFcn, 'gui_LayoutFcn', [] , 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end %=============================Initialization============================ === function multi_sim_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject; set(handles.start_button, 'Enable', 'on'); set(handles.stop_button, 'Enable', 'off'); global v f v_r index accelerometer gyroscope plot_length update_rate; load_system('multi_model'); set_param('multi_model/ch1_input', 'Value', '1000'); set_param('multi_model/ch2_input', 'Value', '1000'); set_param('multi_model/ch3_input', 'Value', '1000'); set_param('multi_model/ch4_input', 'Value', '1000'); set_param('multi_model/ch5_input', 'Value', '1000'); set_param('multi_model/ch6_input', 'Value', '1000'); update_rate = 60; plot_length = 5; index = update_rate * plot_length; 75 gyroscope = zeros(4, update_rate * plot_length); accelerometer = zeros(4, update_rate * plot_length); axes(handles.model_plot); axis('off'); axes(handles.gyroscope_plot); axis('off'); axes(handles.accelerometer_plot); axis('off'); fid = fopen('model.stl', 'r'); ftitle = fread(fid,80,'uchar=>schar'); numFaces = fread(fid,1,'int32'); T = fread(fid,inf,'uint8=>uint8'); fclose(fid); trilist = 1:48; ind = reshape(repmat(50*(0:(numFaces1)),[48,1]),[1,48*numFaces])+repmat(trilist,[1,numFaces]); Tri = reshape(typecast(T(ind),'single'),[3,4,numFaces]); v = Tri(:,2:4,:); v = reshape(v,[3,3*numFaces]); v = double(v)'; f = reshape(1:3*numFaces,[3,numFaces])'; v_r = v * [1, 0, 0; 0, 1, 0; 0, 0, 1]; handles.timer = timer('ExecutionMode', 'fixedSpacing', 'Period', round(1000 / update_rate) / 1000, 'TimerFcn', {@update_data, handles}); guidata(hObject, handles); function varargout = multi_sim_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output; function ch6_pwm_CreateFcn(hObject, eventdata, handles) if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 9]); end function ch5_pwm_CreateFcn(hObject, eventdata, handles) if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 9]); end function ch4_pwm_CreateFcn(hObject, eventdata, handles) if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) 76 set(hObject,'BackgroundColor',[.9 9]); end function ch3_pwm_CreateFcn(hObject, eventdata, handles) if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 9]); end function ch2_pwm_CreateFcn(hObject, eventdata, handles) if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 9]); end function ch1_pwm_CreateFcn(hObject, eventdata, handles) if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 9]); end %==================================Buttons========================== ======= function model_button_Callback(hObject, eventdata, handles) if get(hObject,'value') ~= axes(handles.model_plot); cla; axis('off') end function gyroscope_button_Callback(hObject, eventdata, handles) global update_rate plot_length gyroscope; if get(hObject,'value') ~= gyroscope = zeros(4, update_rate * plot_length); axes(handles.gyroscope_plot); cla; axis('off'); end function accelerometer_button_Callback(hObject, eventdata, handles) global update_rate plot_length accelerometer; if get(hObject,'value') ~= accelerometer = zeros(4, update_rate * plot_length); axes(handles.accelerometer_plot); cla; axis('off'); end 77 function measurements_button_Callback(hObject, eventdata, handles) if get(hObject,'value') ~= set(handles.x_position,'String', ''); set(handles.y_position,'String', ''); set(handles.z_position,'String', ''); set(handles.x_velocity,'String', ''); set(handles.y_velocity,'String', ''); set(handles.z_velocity,'String', ''); set(handles.roll_attitude,'String', ''); set(handles.pitch_attitude,'String', ''); set(handles.yaw_attitude,'String', ''); set(handles.roll_rate,'String', ''); set(handles.pitch_rate,'String', ''); set(handles.yaw_rate,'String', ''); set(handles.out1,'String', ''); set(handles.out2,'String', ''); set(handles.out3,'String', ''); set(handles.out4,'String', ''); set(handles.out5,'String', ''); set(handles.out6,'String', ''); set(handles.out7,'String', ''); set(handles.out8,'String', ''); end function start_button_Callback(hObject, eventdata, handles) global update_rate plot_length gyroscope accelerometer; set(handles.start_button, 'Enable', 'off'); set(handles.stop_button, 'Enable', 'on'); gyroscope = zeros(4, update_rate * plot_length); accelerometer = zeros(4, update_rate * plot_length); set_param('multi_model','SimulationCommand','Start'); start(handles.timer); function stop_button_Callback(hObject, eventdata, handles) set(handles.start_button, 'Enable', 'on'); set(handles.stop_button, 'Enable', 'off'); set_param('multi_model','SimulationCommand','Stop'); stop(handles.timer); function ch6_center_Callback(hObject, eventdata, handles) 78 if get(hObject,'value') == set(handles.ch6_center, 'Enable', 'off'); end set(handles.pwm6,'String', '1500'); set(handles.ch6_pwm,'Value',1500); set_param('multi_model/ch6_input', 'Value', '1500'); function ch5_center_Callback(hObject, eventdata, handles) if get(hObject,'value') == set(handles.ch5_center, 'Enable', 'off'); end set(handles.pwm5,'String', '1500'); set(handles.ch5_pwm,'Value',1500); set_param('multi_model/ch5_input', 'Value', '1500'); function ch4_center_Callback(hObject, eventdata, handles) if get(hObject,'value') == set(handles.ch4_center, 'Enable', 'off'); end set(handles.pwm4,'String', '1500'); set(handles.ch4_pwm,'Value',1500); set_param('multi_model/ch4_input', 'Value', '1500'); function ch3_center_Callback(hObject, eventdata, handles) if get(hObject,'value') == set(handles.ch3_center, 'Enable', 'off'); end set(handles.pwm3,'String', '1500'); set(handles.ch3_pwm,'Value',1500); set_param('multi_model/ch3_input', 'Value', '1500'); function ch2_center_Callback(hObject, eventdata, handles) if get(hObject,'value') == set(handles.ch2_center, 'Enable', 'off'); end set(handles.pwm2,'String', '1500'); set(handles.ch2_pwm,'Value',1500); set_param('multi_model/ch2_input', 'Value', '1500'); function ch1_center_Callback(hObject, eventdata, handles) if get(hObject,'value') == set(handles.ch1_center, 'Enable', 'off'); end set(handles.pwm1,'String', '1500'); set(handles.ch1_pwm,'Value',1500); 79 set_param('multi_model/ch1_input', 'Value', '1500'); function ch6_pwm_Callback(hObject, eventdata, handles) set(handles.pwm6,'String', sprintf('%f', get(hObject,'value'))); if get(hObject,'value') ~= 1500 set(handles.ch6_center, 'Value', 0); set(handles.ch6_center, 'Enable', 'on'); elseif get(hObject,'value') == 1500 set(handles.ch6_center, 'Value', 1); set(handles.ch6_center, 'Enable', 'off'); end set_param('multi_model/ch6_input', 'Value', sprintf('%f', get(hObject,'value'))); function ch5_pwm_Callback(hObject, eventdata, handles) set(handles.pwm5,'String', sprintf('%f', get(hObject,'value'))); if get(hObject,'value') ~= 1500 set(handles.ch5_center, 'Value', 0); set(handles.ch5_center, 'Enable', 'on'); elseif get(hObject,'value') == 1500 set(handles.ch5_center, 'Value', 1); set(handles.ch5_center, 'Enable', 'off'); end set_param('multi_model/ch5_input', 'Value', sprintf('%f', get(hObject,'value'))); function ch4_pwm_Callback(hObject, eventdata, handles) set(handles.pwm4,'String', sprintf('%f', get(hObject,'value'))); if get(hObject,'value') ~= 1500 set(handles.ch4_center, 'Value', 0); set(handles.ch4_center, 'Enable', 'on'); elseif get(hObject,'value') == 1500 set(handles.ch4_center, 'Value', 1); set(handles.ch4_center, 'Enable', 'off'); end set_param('multi_model/ch4_input', 'Value', sprintf('%f', get(hObject,'value'))); function ch3_pwm_Callback(hObject, eventdata, handles) set(handles.pwm3,'String', sprintf('%f', get(hObject,'value'))); if get(hObject,'value') ~= 1500 set(handles.ch3_center, 'Value', 0); set(handles.ch3_center, 'Enable', 'on'); elseif get(hObject,'value') == 1500 set(handles.ch3_center, 'Value', 1); set(handles.ch3_center, 'Enable', 'off'); end set_param('multi_model/ch3_input', 'Value', sprintf('%f', get(hObject,'value'))); 80 function ch2_pwm_Callback(hObject, eventdata, handles) set(handles.pwm2,'String', sprintf('%f', get(hObject,'value'))); if get(hObject,'value') ~= 1500 set(handles.ch2_center, 'Value', 0); set(handles.ch2_center, 'Enable', 'on'); elseif get(hObject,'value') == 1500 set(handles.ch2_center, 'Value', 1); set(handles.ch2_center, 'Enable', 'off'); end set_param('multi_model/ch2_input', 'Value', sprintf('%f', get(hObject,'value'))); function ch1_pwm_Callback(hObject, eventdata, handles) set(handles.pwm1,'String', sprintf('%f', get(hObject,'value'))); if get(hObject,'value') ~= 1500 set(handles.ch1_center, 'Value', 0); set(handles.ch1_center, 'Enable', 'on'); elseif get(hObject,'value') == 1500 set(handles.ch1_center, 'Value', 1); set(handles.ch1_center, 'Enable', 'off'); end set_param('multi_model/ch1_input', 'Value', sprintf('%f', get(hObject,'value'))); %==================================Graphics========================== ====== function update_data(hObject, eventdata, handles) tic; global v f v_r index accelerometer gyroscope plot_length update_rate; model_scale = 0.25; simulation_data = get_param('multi_model/dynamic_model/simulation_data', 'RuntimeObject'); simulation_time = simulation_data.InputPort(19).Data; % Plot Gyroscope -if get(handles.gyroscope_button, 'Value') == gyroscope = circshift(gyroscope, [4 -1]); axes(handles.gyroscope_plot); gyroscope(1, index) = simulation_data.InputPort(16).Data; gyroscope(2, index) = simulation_data.InputPort(17).Data; gyroscope(3, index) = simulation_data.InputPort(18).Data; gyroscope(4, index) = simulation_time; plot(gyroscope(4,:), gyroscope(1,:), gyroscope(4,:), gyroscope(2,:), gyroscope(3,:)); 81 gyroscope(4,:), ylim('auto'); if simulation_time < plot_length xlim([0 plot_length]); else xlim([simulation_time - plot_length simulation_time]); end drawnow; end % Plot Accelerometer -if get(handles.accelerometer_button, 'Value') == accelerometer = circshift(accelerometer, [4 -1]); axes(handles.accelerometer_plot); accelerometer(1, index) = simulation_data.InputPort(13).Data; accelerometer(2, index) = simulation_data.InputPort(14).Data; accelerometer(3, index) = -simulation_data.InputPort(15).Data; accelerometer(4, index) = simulation_time; plot(accelerometer(4,:), accelerometer(1,:), accelerometer(4,:), accelerometer(4,:), accelerometer(3,:)); ylim('auto'); if simulation_time < plot_length xlim([0 plot_length]); else xlim([simulation_time - plot_length simulation_time]); end drawnow; end accelerometer(2,:), % -Update Data -if get(handles.measurements_button, 'Value') == set(handles.x_position,'String', sprintf('%f', simulation_data.InputPort(4).Data)); set(handles.y_position,'String', sprintf('%f', simulation_data.InputPort(5).Data)); set(handles.z_position,'String', sprintf('%f', -simulation_data.InputPort(6).Data)); set(handles.x_velocity,'String', sprintf('%f', simulation_data.InputPort(1).Data)); set(handles.y_velocity,'String', sprintf('%f', simulation_data.InputPort(2).Data)); set(handles.z_velocity,'String', sprintf('%f', -simulation_data.InputPort(3).Data)); set(handles.roll_attitude,'String', sprintf('%f', simulation_data.InputPort(7).Data)); set(handles.pitch_attitude,'String', sprintf('%f', simulation_data.InputPort(8).Data)); set(handles.yaw_attitude,'String', sprintf('%f', simulation_data.InputPort(9).Data)); set(handles.roll_rate,'String', sprintf('%f', simulation_data.InputPort(10).Data)); set(handles.pitch_rate,'String', sprintf('%f', simulation_data.InputPort(11).Data)); set(handles.yaw_rate,'String', sprintf('%f', simulation_data.InputPort(12).Data)); 82 output_data 'RuntimeObject'); = get_param('multi_model/dynamic_model/aircraft_dynamics', set(handles.out1,'String', sprintf('%f', output_data.InputPort(1).Data(1))); set(handles.out2,'String', sprintf('%f', output_data.InputPort(1).Data(2))); set(handles.out3,'String', sprintf('%f', output_data.InputPort(1).Data(3))); set(handles.out4,'String', sprintf('%f', output_data.InputPort(1).Data(4))); set(handles.out5,'String', sprintf('%f', output_data.InputPort(1).Data(5))); set(handles.out6,'String', sprintf('%f', output_data.InputPort(1).Data(6))); set(handles.out7,'String', sprintf('%f', output_data.InputPort(1).Data(7))); set(handles.out8,'String', sprintf('%f', output_data.InputPort(1).Data(8))); end % -Update Model if get(handles.model_button, 'Value') == roll_attitude = simulation_data.InputPort(7).Data; pitch_attitude = simulation_data.InputPort(8).Data; yaw_attitude = simulation_data.InputPort(9).Data; pitch_matrix = [1 0; cosd(pitch_attitude) -sind(pitch_attitude); sind(pitch_attitude) cosd(pitch_attitude)]; roll_matrix = [cosd(roll_attitude) sind(roll_attitude); 0; -sind(roll_attitude) cosd(roll_attitude)]; yaw_matrix = [cosd(yaw_attitude) -sind(yaw_attitude) 0; sind(yaw_attitude) cosd(yaw_attitude) 0; 0 1]; v = v_r * pitch_matrix * roll_matrix * yaw_matrix; axes(handles.model_plot); cla(handles.model_plot); patch('Faces',f,'Vertices',v, 'FaceColor', [0.5 0.5 0.5], 'EdgeColor', 'none', 'FaceLighting', 'gouraud', 'AmbientStrength', 0.01); camlight('headlight'); material('dull'); axis('off'); xlim([-model_scale model_scale]); ylim([-model_scale model_scale]); zlim([-model_scale model_scale]); camproj('perspective'); view([180 10]); drawnow; end cycles = / toc; if cycles > update_rate 83 cycles = update_rate; end set(handles.update_rate,'String', sprintf('%f', cycles)); %================================================================= 84 ... Trọng Tuấn đề xuất đề tài ? ?Nghiên cứu thuật toán dẫn đường thời gian thực cho phương tiện bay không người lái phục vụ công tác tìm kiếm cứu nạn? ?? Mặc dù cố gắng việc nghiên cứu hoàn thành luận văn... ANH NGHIÊN CỨU THUẬT TỐN DẪN ĐƯỜNG THỜI GIAN THỰC CHO PHƯƠNG TIỆN BAY KHÔNG NGƯỜI LÁI PHỤC VỤ CƠNG TÁC TÌM KIẾM CỨU NẠN Chun ngành : KỸ THUẬT ĐIỆN TỬ LUẬN VĂN THẠC SĨ KHOA HỌC KỸ THUẬT ĐIỆN TỬ NGƯỜI... người lái Cụ thể đối tượng nghiên cứu loại phương tiện bay không người lái nhiều cánh quạt – OctoRotor UAV 12 - Xây dựng thuật toán dẫn đường thời gian thực cho phương tiện bay không người lái - Thực

Ngày đăng: 10/03/2022, 22:56

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w