สารบัญ:

การศึกษาเชิงทดลองของ Simple Harmonic Motion: 5 ขั้นตอน
การศึกษาเชิงทดลองของ Simple Harmonic Motion: 5 ขั้นตอน

วีดีโอ: การศึกษาเชิงทดลองของ Simple Harmonic Motion: 5 ขั้นตอน

วีดีโอ: การศึกษาเชิงทดลองของ Simple Harmonic Motion: 5 ขั้นตอน
วีดีโอ: การเคลื่อนที่แบบ SHM | ติวตรงจุด ปูพื้นฐานฟิสิกส์ 20 บท By พี่ตั้ว Physics Blueprint 2024, กรกฎาคม
Anonim

By arrowlikeติดตาม เพิ่มเติมโดยผู้เขียน:

เดิน Strandbeest, Java/Python และควบคุมแอป
เดิน Strandbeest, Java/Python และควบคุมแอป
เดิน Strandbeest, Java/Python และควบคุมแอป
เดิน Strandbeest, Java/Python และควบคุมแอป

ในห้องเรียน เรามักใช้นาฬิกาจับเวลาเพื่อทำการทดลองลูกตุ้ม หรือการทดลองการเคลื่อนไหวฮาร์โมนิกอย่างง่าย นี่เป็นความท้าทาย เราสามารถสร้างกราฟที่แท้จริงของการเคลื่อนที่ของมัน และดูว่าอะไรคือตำแหน่งเชิงมุมและความเร็วในทันที นั่นเป็นข้อมูลและความสนุกสนานมากขึ้น

คำถามแรก เราต้องตัดสินใจว่าตัวลูกตุ้มนั้นเป็นเชือกที่ไม่มีน้ำหนักหรือแท่งที่แข็งสม่ำเสมอ วิธีสายดูเหมือนจะง่ายกว่า จากแนวทางปฏิบัติในการสร้างสิ่งหนึ่ง ฉันมีข้อควรพิจารณาในการประนีประนอมดังต่อไปนี้: วิธีที่ง่ายที่สุดในการแขวนระบบลูกตุ้มอาจเป็นการแขวนไว้ที่ขอบด้านบนของประตูของคุณ นั่นทำให้ลูกตุ้มของคุณมีความยาวประมาณ 2 ม. โดยไม่ต้องทำงานโครงสร้างใดๆ แต่ต้องใช้ชิงช้าไม่แตะพื้นผิวประตู ซึ่งทำให้การทดลองทั้งหมดเสียหาย ดังนั้นระนาบที่แกว่งควรขนานกับพื้นผิวผนัง/ประตูของคุณอย่างแม่นยำ เชือกที่ไม่มีน้ำหนักมีแนวโน้มที่จะบาง หมุนได้ง่าย และทำให้การวัดมุมสวิงซับซ้อน เราต้องการใช้หนึ่งการวัดเพื่อแสดงสถานะการแกว่ง เชือกเส้นเล็ก เช่น เส้นปลา สามารถยืดหยุ่นและยืดได้ ซึ่งส่งผลต่อค่าคงที่ที่สำคัญที่สุดค่าหนึ่งของเราที่วัดโดยเราและใช้ในสมการ ซึ่งก็คือความยาวของลูกตุ้ม บางส่วนอาจได้รับผลกระทบจากอุณหภูมิ มวลน้ำหนักที่ห้อยอยู่ที่ปลายเชือกจะต้องหนักพอที่จะทำให้น้ำหนักของเชือกนั้นเบาบางลงได้ โปรดแสดงความคิดเห็นหากคุณเห็นด้วยหรือไม่เห็นด้วยกับพวกเขา หรือมีแนวคิดแลกเปลี่ยนการออกแบบอื่นๆ เพื่อศึกษาปัญหานี้ เราจำเป็นต้องมีอุปกรณ์ที่เบาจนไม่สามารถมองข้ามน้ำหนักได้ และเรายังคงถือว่าระบบลูกตุ้มเป็นแท่งที่แข็งสม่ำเสมอ ฉันกำลังใช้ตัวควบคุมอิเล็กทรอนิกส์แบบสวมใส่ได้ของ COTS ซึ่งส่งข้อมูลไจโร มาตรความเร่ง และมุมให้เราผ่านการเชื่อมต่อบลูทูธ การวัดเหล่านี้จะถูกเก็บไว้ในไฟล์ข้อมูลแอพมือถือ หลังจากนั้น เราจะวิเคราะห์ข้อมูลสำหรับการทดสอบการเคลื่อนที่แบบฮาร์มอนิกอย่างง่ายของเรา การวิเคราะห์เชิงตัวเลขมุ่งเน้นไปที่หัวข้อต่อไปนี้: 1) ทำนายระยะเวลาการแกว่งของลูกตุ้ม 2) รวบรวมข้อมูลการทดลองการเคลื่อนที่ฮาร์มอนิกอย่างง่ายแบบตั้งโปรแกรมได้ 3) ใช้ kmean เพื่อจัดกลุ่มข้อมูลและลบค่าผิดปกติในกระบวนการวิเคราะห์ 4) ใช้ FFT เวลาสั้นเพื่อประมาณการ ความถี่การสั่นของลูกตุ้ม

เสบียง

อุปกรณ์วัดบลูทูธ

แอพโทรศัพท์ Android: ไปที่ Google playstore ค้นหา M2ROBOTS และติดตั้งแอพควบคุม ในกรณีที่เข้าถึง Google playstore ได้ยาก ให้ไปที่หน้าแรกส่วนตัวของฉันเพื่อดูวิธีการดาวน์โหลดแอปสำรอง

แท่งไม้

ชิ้นส่วนที่พิมพ์ 3 มิติบางส่วน

ใบเลื่อยหรือวัสดุโลหะที่คล้ายกัน

ขั้นตอนที่ 1: ลูกตุ้มคืออะไร? วิธีการสร้างแบบจำลอง?

มีบทความและหนังสือมากมายที่แนะนำให้รู้จักการกำเนิดสมการลูกตุ้ม รวมถึงหนังสือฟิสิกส์หลักสูตรของคุณ เนื้อหาดังกล่าวอาจจะดีกว่าที่จะไม่ทำซ้ำที่นี่อีก เฉพาะข้อสรุปสุดท้ายที่แสดงไว้ที่นี่เกี่ยวกับหัวข้อ "การเคลื่อนที่แบบฮาร์โมนิกอย่างง่าย" เพื่อที่จะทราบคาบของลูกตุ้ม ทั้งหมดที่เราจำเป็นต้องรู้คือความยาวของลูกตุ้มซึ่งแสดงเป็น "l" ในหน่วยเมตร

หากเราแน่ใจอย่างมีเหตุผลว่าน้ำหนักนั้นอยู่ที่ปลายเชือกไร้น้ำหนักที่ห้อยอยู่ในเดือยเกือบสมบูรณ์ และลูกตุ้มแกว่งเป็นมุมเล็กๆ θ น้อยกว่า 15° ช่วงเวลา T1 ของลูกตุ้มดังกล่าวจะกำหนดโดย:

T1 = 2*pi*(l/g)^0.5

g = ความเร่งโน้มถ่วง ประมาณ 9.8 m/s^2

หากสายไร้น้ำหนักถูกแทนที่ด้วยแท่งเหล็กแข็งที่สม่ำเสมอ อีกครั้งที่ความยาว l ระยะเวลาการเคลื่อนที่แบบฮาร์มอนิกอย่างง่าย T2 ถูกกำหนดโดย T1 = 2*pi*(2l/3g)^0.5

มันมีช่วงเวลาเดียวกับลูกตุ้มสายที่ไม่มีน้ำหนักซึ่งมีความยาวราว 2 ใน 3 ของความยาวก้านที่สม่ำเสมอ

นี่คือเบื้องหลัง และเราสามารถเริ่มเตรียมการทดสอบของเราได้

ขั้นตอนที่ 2: เตรียมชิ้นส่วนสำหรับสร้างฮาร์ดแวร์

เตรียมชิ้นส่วนสำหรับสร้างฮาร์ดแวร์
เตรียมชิ้นส่วนสำหรับสร้างฮาร์ดแวร์
เตรียมชิ้นส่วนสำหรับสร้างฮาร์ดแวร์
เตรียมชิ้นส่วนสำหรับสร้างฮาร์ดแวร์
เตรียมชิ้นส่วนสำหรับสร้างฮาร์ดแวร์
เตรียมชิ้นส่วนสำหรับสร้างฮาร์ดแวร์

เพื่อสร้างโครงสร้างลูกตุ้ม เราพิมพ์ 3 มิติบางส่วน และรีไซเคิลสิ่งที่เรามีอยู่แล้ว โครงสร้างลูกตุ้มโดยรวมแสดงในรูปที่ 1 เป็นส่วนผสมของชิ้นส่วนการพิมพ์ 3 มิติร่วมกับชิ้นส่วนที่ทำด้วยมือและแท่งไม้ยาวจาก Lowe's

ชิ้นส่วนที่พิมพ์ 3 มิติในรูปที่ 2 ถูกแขวนไว้ที่ขอบด้านบนของประตู เนื่องจากประตูของเราเป็นพื้นผิวเรียบที่ง่ายต่อการแขวนของบางอย่าง ลิงค์ดาวน์โหลดไฟล์ STL:

xiapeiqing.github.io/doc/kits/pendulum/pen…

ส่วนสีเขียวในรูปที่ 3 เชื่อมต่อราวไม้กับใบมีด และใบมีดตั้งอยู่บนรางสองชิ้นที่ติดตั้งบนไม้แขวนประตูที่พิมพ์ 3 มิติรุ่นก่อนหน้า ลิงค์ดาวน์โหลดไฟล์ STL:

รางสองชิ้นทำขึ้นโดยหักใบเลื่อยเก่าออกครึ่งหนึ่ง ดูรูปที่ 4 ส่วนในรูปที่ 2 ได้เตรียมขนาดช่องที่ถูกต้องสำหรับพวกเขา ตามหลักการแล้ว เราสามารถสร้างรอยบากรูปตัว "V" ในใบเลื่อยทั้งสองใบโดยใช้ตะไบ โลหะที่มีขอบคมพอสมควร เช่น ใบมีดโกนขอบเดียว หรือชิ้นส่วนโลหะที่ทำด้วยมือ สามารถนั่งในร่องรูปตัว "V" ได้ เหตุผลที่เราต้องการพื้นที่สัมผัสที่เล็กลงคือการลดพลังงานจลน์ที่สูญเสียไปขณะแกว่ง

ชิ้นส่วนที่พิมพ์ 3 มิติสุดท้ายในรูปที่ 5 เป็นถาดขนาดเล็กสำหรับใส่เครื่องมือวัดแบบอิเล็กทรอนิกส์

ลิงค์ดาวน์โหลด:

เครื่องมือวัดบลูทูธสร้างการประมาณมุม การวัดไจโร และการวัดความเร่ง ข้อมูลทั้งหมดนี้มีให้เราผ่านทางลิงค์ไร้สายบลูทูธ

เรากำลังจะทำการทดลองหลายครั้งโดยปรับใช้อุปกรณ์นี้ในตำแหน่งต่างๆ ของแขนลูกตุ้ม และดูความแตกต่าง

ขั้นตอนที่ 3: การเก็บรวบรวมข้อมูลการทดลอง

การเก็บรวบรวมข้อมูลการทดลอง
การเก็บรวบรวมข้อมูลการทดลอง
การเก็บรวบรวมข้อมูลการทดลอง
การเก็บรวบรวมข้อมูลการทดลอง
การเก็บรวบรวมข้อมูลการทดลอง
การเก็บรวบรวมข้อมูลการทดลอง

มีสองวิธีที่ทำได้สำหรับการรวบรวมข้อมูลทดลองก่อนที่เราจะวิเคราะห์ชุดข้อมูลที่ได้รับ:

1) ใช้แอพโทรศัพท์ Android ที่ระบุในส่วนข้อกำหนดเพื่อบันทึกการวัดทั้งหมดที่ผลิตโดยอุปกรณ์ลงในไฟล์ข้อมูลที่เก็บไว้ในการ์ด SD ของโทรศัพท์ของคุณ เราสามารถคัดลอกไฟล์และโพสต์ประมวลผลข้อมูลได้

2) ใช้คอมพิวเตอร์ที่ใช้บลูทูธ พีซี แล็ปท็อป หรือมินิคอมพิวเตอร์ RaspberryPi เพื่อสร้างการเชื่อมต่อบลูทูธกับอุปกรณ์ และอ่านข้อมูลสำหรับการวิเคราะห์แบบเรียลไทม์หรือออฟไลน์

มีทั้งข้อดีและข้อเสียสำหรับแต่ละวิธีเราจะลองทั้งสองอย่างและบอกความแตกต่างในคำแนะนำนี้

สำหรับวิธีที่ (1) การใช้แอพ android เมื่อเราอยู่ในอินเทอร์เฟซการควบคุมแอพ android ข้อมูล telemetry ที่ส่งจากเครื่องมือวัดบลูทู ธ ไปยังโทรศัพท์ Android จะถูกบันทึกลงในไฟล์ datalog ชื่อ m2flightDatayyyymmdd_hhmmss.txt สามารถพบได้ในโฟลเดอร์ Download/m2LogFiles ของโทรศัพท์ Android ของคุณ โฟลเดอร์ "ดาวน์โหลด" เป็นโฟลเดอร์ที่มีอยู่ก่อนแล้วในระบบปฏิบัติการ Android ของโทรศัพท์ของคุณ และ "m2LogFiles" เป็นโฟลเดอร์ที่แอปสร้างขึ้น เนื้อหาชื่อไฟล์ yyyymmdd_hhmmss คือวิธีเข้ารหัสเวลาเริ่มต้นการทดสอบ (ปี เดือน วัน ชั่วโมง นาที และวินาที) ในชื่อไฟล์

แต่ละบรรทัดในล็อกไฟล์คือหนึ่งเร็กคอร์ด โดยเริ่มต้นด้วยการประทับเวลาของเหตุการณ์ สตริงคำนำ "eam:" ตามด้วยข้อมูล triplet 4 รายการ ได้แก่

การอ่านค่าแกน XYZ ของตัวตรวจวัดความเร่งในฮาร์ดแวร์เซ็นเซอร์ดิบลงทะเบียนค่าการอ่านค่า

การอ่านแกน Gyroscope XYZ ในฮาร์ดแวร์เซ็นเซอร์ดิบลงทะเบียนค่าการอ่านกลับ

การอ่านค่าแกน Magnetometer XYZ ในฮาร์ดแวร์เซ็นเซอร์ดิบลงทะเบียนค่าการอ่านค่า

ออนบอร์ดโดยประมาณ Roll/Pitch/Raw ในหน่วยองศา

ไฟล์ข้อมูลที่สร้างขึ้นโดยใช้โปรแกรมคอมพิวเตอร์ไพ ธ อนจะใช้รูปแบบไฟล์ข้อมูลที่เหมือนกัน ดังนั้นโปรแกรมที่เราใช้ในขั้นตอนการวิเคราะห์ข้อมูลจะไม่ถูกรบกวนกับแหล่งข้อมูลที่ผลิตโดยโปรแกรมหลามหรือแอป Android ของเรา

มาเริ่มการเข้ารหัสโดยใช้วิธี (2)

ในการโต้ตอบกับเครื่องมือวัดบลูทูธ มี SDK ให้เลือก 2 รสชาติ:

1) Python SDK ซึ่งสามารถติดตั้งได้โดย "pip3 install m2controller" โดย python3 เป็นภาษาที่ใช้ ตัวอย่างของรหัสแอปพลิเคชันของผู้ใช้ถูกเก็บไว้ใน https://github.com/xiapeiqing/m2robots/tree/maste… สำหรับการทดลองนี้ เราจะใช้สคริปต์หลาม pendulum1.py

2) Java SDK ซึ่งไม่ได้ใช้ในคำแนะนำนี้เพราะเราต้องการการแสดงภาพและการวิเคราะห์ข้อมูลลูกตุ้มที่ได้มาในภายหลัง ซึ่งอาจต้องใช้ความพยายามอีกเล็กน้อยสำหรับเราในการเขียนโปรแกรมใน Java

ซอร์สโค้ดโปรแกรมรวบรวมข้อมูล python3 มีความคิดเห็นมากมายสำหรับรายละเอียดการทำงานของโค้ด สแนปชอตของซอร์สโค้ดมีให้ที่นี่

#!/usr/bin/env python# -*- การเข้ารหัส: UTF-8 -*- จาก m2controller นำเข้า m2controller จาก m2controller นำเข้า m2Const สัญญาณนำเข้า เวลานำเข้า วันที่นำเข้า เวลานำเข้า usrCfg นำเข้า pendulum2

requestExit = เท็จ

################################################################

# เราต้องการใช้หลักการตั้งชื่อล็อกไฟล์แบบเดียวกัน เพื่อให้โมดูลการวิเคราะห์ข้อมูล pendulum2.py ไม่เชื่อเรื่องพระเจ้าในการรับไฟล์ข้อมูลบันทึก #################### ################################################# ชื่อไฟล์บันทึก = " m2flightData%s.txt"%(datetime.datetime.fromtimestamp(time.time()).strftime('%Y%m%d_%H%M%S')) dataLogfile = open(logfilename, "w")

def signal_handler (sig, เฟรม):

global requestExit print('ผู้ใช้ Ctrl-C เพื่อออกจากการทำงานของโปรแกรม') requestExit = True signal.signal(signal. SIGINT, signal_handler)

################################################################

# ทุกครั้งที่มีข้อมูลการวัดที่อัตรา 20Hz ฟังก์ชัน "โทรกลับ" นี้จะถูกเรียก ################################## ################################# def callbackfunc (telemetry): strTimeStamp = datetime.datetime.fromtimestamp (time.time) ()).strftime('%H:%M:%S.%f')[:-3] dataStr = "%s, eam:%d, %d, %d, %d, %d, %d, %d, %d, %d, %2.1f, %2.1f, %2.1f\n"%(strTimeStamp, การวัดและส่งข้อมูลทางไกล['m_fAccelHwUnit'][0], การวัดและส่งข้อมูลทางไกล['m_fAccelHwUnit'][1], การวัดและส่งข้อมูลทางไกล['m_fAccelHwUnit'][2], การวัดระยะทาง['m_fGyroHwUnit'][0], การวัดระยะทาง['m_fGyroHwUnit'][1], การวัดระยะทาง['m_fGyroHwUnit'][2], การวัดระยะไกล['m_fMagHwUnit'][0], การวัดระยะไกล['m_fMagHwUnit'][1], การวัดระยะไกล['m_fMagHwUnit'][2], การวัดระยะทาง['m_fRPYdeg'][0], การวัดระยะไกล['m_fRPYdeg'][1], การวัดระยะไกล['m_fRPYdeg'][2]) ## ####################################################### ############ # เราพิมพ์สตริงข้อมูลไปที่หน้าจอและบันทึกลงในไฟล์บันทึก ###################### ########################################## พิมพ์ (dataStr) dataLogfile.writelines (dataStr)

################################################################

# เริ่มต้นคอนโทรลเลอร์ อย่าลืมตั้งค่าฟิลด์ BleMACaddress ให้เป็นที่อยู่ MAC ของอุปกรณ์ #################################### ############################### # สิ่งที่ต้องทำ: เริ่มต้น BleMACaddress หากไม่ได้ตั้งค่าโดยผู้ใช้ controller = m2controller. BleCtrller(m2Const.etDebian, callbackfunc, usrCfg. BleMACaddress) controller.connect() ในขณะที่ True: ############################# ###################################### # รอข้อมูลการวัดที่สร้างและส่งจากการวัดลูกตุ้ม อุปกรณ์ #################################################### ############### controller.m_CommsTunnel.waitForNotifications(1.0) if requestExit: ######################## ######################################## # การดูแลบ้านทำงานที่นี่เมื่อเราเสร็จสิ้นการบันทึกข้อมูล ####################################################### ############## controller.stop() dataLogfile.close() break

################################################################

# การรวบรวมข้อมูลเสร็จสิ้น ตอนนี้เรามาวิเคราะห์ข้อมูลบันทึกกัน ####################################### ############################ pendulum2.parseDataLogFile(logfilename)

สำหรับการอัปเดตในระยะยาว โปรดชำระเงิน

ทีนี้มาอธิบายวิธีการทำงานของมันกัน โปรแกรมหลามนี้เขียนบนแพ็คเกจที่ติดตั้งได้ของ pip ชื่อ m2controller แพ็คเกจระดับล่างมีกลไกการโทรกลับ ดังนั้นทุกการอัปเดตการวัดที่ได้รับจะทริกเกอร์ฟังก์ชันการโทรกลับที่เราเขียน และบันทึกข้อมูลลงในไฟล์บันทึกในเครื่อง รูปแบบของเนื้อหาข้อมูลไฟล์บันทึกจะเหมือนกับที่สร้างโดยแอพคู่หู Android เพื่อให้สามารถแลกเปลี่ยนไฟล์บันทึกข้อมูลที่สร้างโดยโปรแกรม python หรือแอพคู่หูสำหรับ Android ได้

สัญญาณ ctrl-C ของผู้ใช้ที่ระบบปฏิบัติการจับได้จะถูกส่งไปยังโปรแกรม และหยุดการวนซ้ำที่ไม่สิ้นสุดเพื่อรอการมาถึงของข้อมูลการวัดใหม่

จนถึงขณะนี้ ไฟล์บันทึกได้ถูกสร้างขึ้นเรียบร้อยแล้ว และโปรแกรมนี้จะเรียกโปรแกรมวิเคราะห์เพื่อศึกษาผลการทดลองของเรา

ต่อไปนี้คือการทดลอง 2 ครั้ง และการเปรียบเทียบแสดงความแตกต่างที่เห็นได้ชัดเจนมากโดยติดอุปกรณ์ 7gram ไว้ที่ตำแหน่งต่างๆ

ในรูปที่ 2 เราใช้มาตราส่วนเพื่อกำหนดน้ำหนักจริงของอุปกรณ์วัดบลูทูธนี้

รูปที่ 3 แสดงการตั้งค่าลูกตุ้มที่อุปกรณ์ 7gram ติดอยู่ที่ปลายด้านล่างของลูกตุ้ม การกำหนดค่าการตั้งค่าในรูปที่ 4 มีมวล 7gram อยู่ใกล้กับเดือยแกว่งมาก

รูปที่ 5 เป็นภาพระยะใกล้ของโครงสร้างลูกตุ้ม

ขั้นตอนที่ 4: การวิเคราะห์ข้อมูล

การวิเคราะห์ข้อมูล
การวิเคราะห์ข้อมูล
การวิเคราะห์ข้อมูล
การวิเคราะห์ข้อมูล
การวิเคราะห์ข้อมูล
การวิเคราะห์ข้อมูล

เครื่องมือวัดบลูทูธมีน้ำหนักประมาณ 7 กรัม ซึ่งมีน้ำหนักน้อยกว่าแท่งไม้ยาวประมาณ 1.6 เมตร ใช้สมมติฐานของ "แท่งแข็งสม่ำเสมอ" และเราได้สมการคาบลูกตุ้มนี้ T1 = 2*pi*(2l/3g)^0.5

เพื่อให้ได้ค่าคงที่ของแรงโน้มถ่วง เราสามารถใช้ 9.8m/s^2 แต่ค่าคงที่ของแรงโน้มถ่วงที่แม่นยำยิ่งขึ้น ณ ตำแหน่งทางภูมิศาสตร์ใดก็ตามสามารถเรียกค้นได้จากบริการเว็บนี้:

www.wolframalpha.com/widgets/view.jsp?id=e…

สำหรับซานฟรานซิสโก เท่ากับ 9.81278m/s^2

ความยาวลูกตุ้มวัดได้ 64.5''

2*pi*sqrt(2*64.5*0.0254/(3*9.81278)) ให้ระยะเวลาลูกตุ้มที่คาดไว้ 2.0962(วินาที)

ลองดูว่าเห็นด้วยกับการทดลองของเราหรือไม่

ในการทดลองครั้งที่ 1 การตั้งค่าลูกตุ้มมีอุปกรณ์ 7gram ติดอยู่ที่ปลายด้านล่างของลูกตุ้ม ไฟล์บันทึกของฉันสามารถดาวน์โหลดได้ใน:

xiapeiqing.github.io/doc/kits/pendulum/pen…

เปลี่ยนชื่อเป็น "PendulumTestData.txt" และวางไว้ในโฟลเดอร์เดียวกันของโปรแกรมวิเคราะห์หลาม สแนปชอตของซอร์สโค้ดมีให้ที่นี่

#!/usr/bin/env python# -*- coding: UTF-8 -*- import csv import matplotlib.pyplot as plt plt.style.use('seaborn-whitegrid') import numpy as np from datetime import datetime, timedelta นำเข้า seaborn เป็น sns จาก sklearn.cluster นำเข้า KMeans จากตัวนับการนำเข้าคอลเลกชัน ###################################### ############################# # ฟังก์ชั่นนี้เรียกใช้งานการวิเคราะห์ไฟล์ข้อมูล ############ ####################################################### ## def parseDataLogFile (ชื่อไฟล์ข้อมูล): ########################################## ###################### # แยกข้อมูลในไฟล์บันทึกข้อมูลที่คั่นด้วยเครื่องหมายจุลภาค (CSV) และบันทึกเนื้อหาในแต่ละคอลัมน์ลงในตัวแปรประเภท float ## ####################################################### ############ ด้วย open(datafilename) เป็น csvfile: readCSV = csv.reader(csvfile, delimiter=', ') timestampS = fAccelHwUnit_x = fAccelHwUnit_y = fAccelHwUnit_z = fGyroHwUnit_x = fGyroHwUnit_y = fGyroHwUnit_z = fMagHwUnit_x = fMagHwUnit_y = fMagHwUni t_z = fRPYdeg_r = fRPYdeg_p = fRPYdeg_y = สำหรับแถวใน readCSV: ลอง: x = datetime.strptime(row[0].split(', ')[0], '%H:%M:%S.%f') timestampS.append(timedelta(hours=x.hour, minutes=x.minute, seconds=x.second, microseconds=x.microsecond).total_seconds()) fAccelHwUnit_x.append(float(แถว) [1][4:])) fAccelHwUnit_y.append(float(row[2])) fAccelHwUnit_z.append(float(row[3])) fGyroHwUnit_x.append(float(row[4])) fGyroHwUnit_y.append(float) (แถว[5])) fGyroHwUnit_z.append(float(แถว[6])) fMagHwUnit_x.append(float(แถว[7])) fMagHwUnit_y.append(float(แถว[8])) fMagHwUnit_z.append(float(แถว) [9])) fRPYdeg_r.append(float(row[10])) fRPYdeg_p.append(float(row[11])) fRPYdeg_y.append(float(row[12])) ยกเว้น: pass timestampS = np.asarray(timestamps) timestamps = timestamps - timestamps [0] fAccelHwUnit_x = np.asarray (fAccelHwUnit_x) fAccelHwUnit_y = np.asarray (fAccelHwUnit_y) fAccelHwUnit_z = np.asarray (fAccelHwUnit_z) fGyroHwUnit_x = np.asarray (fGyroHwUnit_x) fGyroHwUnit_y = np.asarray (fGyroHwUnit_y) fGyroH wUnit_z = np.asarray (fGyroHwUnit_z) fMagHwUnit_x = np.asarray (fMagHwUnit_x) fMagHwUnit_y = np.asarray (fMagHwUnit_y) fMagHwUnit_z = np.asarray (fMagHwUnit_z) fRPYdeg_r = np.asarray (fRPYdeg_r) fRPYdeg_p = np.asarray (fRPYdeg_p) fRPYdeg_p = fRPYdeg_p - np.mean(fRPYdeg_p) fRPYdeg_y = np.asarray(fRPYdeg_y)

################################################################

# เราต้องการการประมาณความถี่การสุ่มตัวอย่างที่แม่นยำเพื่อการประมาณช่วงเวลาการแกว่งที่แม่นยำ #################################### ############################ FsHz = getSamplingIntervalS(timestampS) ################ ################################################ # ใช้ องค์ประกอบระดับเสียงในเอาต์พุตระบบอ้างอิงส่วนหัวของทัศนคติสำหรับการวิเคราะห์ช่วงเวลาลูกตุ้ม ##################################### ########################### analyze_timeSequence (timestampS, fRPYdeg_p, FsHz, 'pitch') ############# ####################################################### ### # ใช้เอาต์พุตการวัดดิบของ acceleromter สำหรับการวิเคราะห์ช่วงลูกตุ้ม ##################################### ########################### analyze_timeSequence (การประทับเวลา, fAccelHwUnit_x, FsHz, 'เร่ง') ############# ####################################################### ### # ใช้เอาต์พุตการวัดดิบไจโรสำหรับการวิเคราะห์ช่วงลูกตุ้ม ##################################### ########################### analyze_timeSequence (การประทับเวลา, fGyroHwUnit_y, FsHz, ' gyro') print('done, ขอแสดงความยินดี:-)') plt.show() ############################### ################################# # ในกระบวนการสื่อสารผ่านบลูทูธ มีโอกาสน้อยที่ data comm packet จะทำได้ หาย # เราใช้ K-mean เพื่อแยกข้อมูลการวัด 20Hz ออกจากค่าผิดปกติ ซึ่งเกิดจากการดร็อปแพ็กเก็ต # ดำดิ่งสู่ "สัญญาณและระบบเพื่อดูรายละเอียดเพิ่มเติม" ################ ################################################### def getSamplingIntervalS (ประทับเวลา): plt.figure() sampleIntervalS = np.diff(timestampS) sns.distplot(sampleIntervalS) plt.ylabel('histogram') plt.xlabel('measurement interval(s)') clusterCnt = 5 km = KMeans (n_clusters = clusterCnt) km.fit (sampleIntervalS.reshape (-1, 1)) centroids = km.cluster_centers_ elemCnt = ตัวนับ (km.labels_) การเกิดขึ้น Cnt = สำหรับ ii ในช่วง (clusterCnt): การเกิดขึ้นCnt.append (elemCnt [ii)]) FsHz = 1/centroids[occurrenceCnt.index(max(occurrenceCnt))] ส่งกลับ FsHz

################################################################

# ใช้สเปกโตรมิเตอร์ เช่น FFT ระยะเวลาสั้น ๆ เพื่อรับองค์ประกอบความถี่ peak bin คือค่าประมาณการแกว่งของลูกตุ้มที่ดีที่สุดของเรา ############################# ######################################## def analyze_timeSequence (การประทับเวลา, timeSeqData, FsHz, strComment): มะเดื่อ (ax1, ax2) = plt.subplots(nrows=2) ax1.plot(timestampS, timeSeqData, marker='o', markerfacecolor='blue', markersize=2, color='skyblue', linewidth=1) ax1.set_title("การวัดโดเมนเวลาลูกตุ้ม -- %s"%strComment) ax1.set_xlabel("sampling time(second)") ax1.set_ylabel(strComment); NFFT = 2048 # ความยาวของส่วนหน้าต่าง

Pxx, freqs, bins, im = ax2.specgram(timeSeqData, NFFT=NFFT, Fs=FsHz, noverlap=NFFT/2)

ax2.set_title("Spectrogram") ax2.set_xlabel("ตัวอย่าง") ax2.set_ylabel("ความถี่ (Hz)");

# วิธี `specgram` ส่งคืนวัตถุ 4 ชิ้น พวกเขาคือ:

# - Pxx: the periodogram # - freqs: the frequency vector # - bins: the centers of the time bins # - im: the matplotlib.image. AxesImage ตัวอย่างที่แสดงข้อมูลในพล็อต pkresult = np.where(Pxx == np.amax(Pxx)) oscFreqHz = freqs[pkresult[0][0] print('pendulum oscillation Freq(Hz)=%f, Period(Sec)=%f, estimation data source: %s'%(oscFreqHz, 1/oscFreqHz, strComment)) คืนค่า 1/oscFreqHz

################################################################

# เราควรเรียกใช้โปรแกรมนี้โดยอิสระ กล่าวคือ ไม่ถูกเรียกโดย pendulum1.py # เรากำหนดชื่อไฟล์ข้อมูลบันทึกเริ่มต้นที่จะวิเคราะห์ ######################### ############################################## ถ้า _name_ == "_main_ ": defaultFilename = './PendulumTestData.txt' นำเข้า os.path ถ้า os.path.isfile(defaultFilename): parseDataLogFile(defaultFilename) อื่น: พิมพ์ ("ไฟล์บันทึกเริ่มต้น %s ไม่มีอยู่"%defaultFilename)

สำหรับการอัปเดตในระยะยาว โปรดชำระเงิน

ซอร์สโค้ดมีความคิดเห็นโดยละเอียด ให้สรุปการประมาณค่าทางคณิตศาสตร์ในระดับสูงที่นี่

1) ก่อนอื่นเราอ่านเนื้อหาไฟล์ CSV ลงในคอมพิวเตอร์โดยใช้แพ็คเกจหลามที่เรียกว่า "csv" เรามีการวัดเป็นระยะ

21:34:26.362, eam:0, -128, 14464, -8, 144, -96, 2112, -1280, 1664, -0.5, -5.5, 40.5

21:34:26.373, eam:128, 0, 14272, -8, 136, 40, 2112, -1280, 1664, -0.5, -6.5, 40.0

21:34:26.412, eam:448, -64, 14208, -8, 136, 24, 2176, -1280, 1664, -0.5, -7.5, 40.5

21:34:26.462, eam:448, -128, 14272, -8, 120, 16, 2176, -1280, 1664, -0.5, -8.0, 40.5

2) เนื่องจากอัตราการวัดมีความสำคัญมากและทำให้เกิดข้อผิดพลาดในการประมาณค่าช่วงลูกตุ้มโดยตรง เราจึงต้องการประมาณค่าเหล่านี้ ช่วงการวัดเล็กน้อยของเราคือ 50ms นั่นคือ 20Hz ค่าเฉลี่ยของการวัดทั้งหมดดูเหมือนโอเค แต่บางครั้งเราสูญเสียแพ็กเก็ตการรับส่งข้อมูล ช่วงเวลาการอัปเดตกลายเป็น 100ms หรือ 150ms, …

หากเราวางแผนการเกิดขึ้นของข้อมูลเหล่านี้ ดูรูปที่ 1 ในฐานะมนุษย์ เราสามารถมีค่านัยน์ตาที่ 0.05 วินาทีได้อย่างง่ายดาย อย่างไรก็ตาม เราสามารถทำได้ดีกว่านั้นหรือไม่

เราจำเป็นต้องใช้วิธีการจำแนกประเภทเพื่อเลือกเฉพาะวิธีที่ดีสำหรับการคำนวณหาค่าเฉลี่ย Python มีกล่องเครื่องมือชื่อ KMeans เพื่อช่วยเราจัดกลุ่มหรือพูดการจัดหมวดหมู่ แนวคิดเหล่านี้ถูกใช้ในหลายพื้นที่ของข้อมูลขนาดใหญ่และ AI

3) รูปที่ 2 มีสองภาพ พล็อตบนสุดคือลำดับโดเมนเวลาของการวัดมุมสวิงของเราเป็นองศา เมื่ออ้างอิงถึงการประทับเวลาของแกน x ในหน่วยวินาที เราสามารถอ่านค่าประมาณ 22.5 รอบใน 50 วินาที ซึ่งแปลเป็นช่วงลูกตุ้ม 2.22 วินาที มีวิธีทำให้กระบวนการนี้เป็นอัตโนมัติและมีการประมาณการที่แม่นยำกว่านี้หรือไม่? ได้ เราสามารถใช้เครื่องมือทางคณิตศาสตร์ที่เรียกว่าสเปกโตรแกรม ซึ่งใช้ข้อมูลการวัดเล็กๆ น้อยๆ และบอกความถี่ให้เราทราบ ดูรูปด้านล่าง ค่าที่อ่านได้จากแกน y สำหรับเส้นที่มืดที่สุดคือความถี่การแกว่งของลูกตุ้ม การเป็นเส้นแนวนอนเป็นการยืนยันว่าการแกว่งของลูกตุ้มไม่เปลี่ยนแปลงเลยตลอดการทดสอบ ค่าผกผันของความถี่การแกว่งคือคาบการแกว่งของลูกตุ้ม

รายงานขั้นสุดท้ายที่จัดทำโดยโปรแกรมเป็นการสรุปข้อความ:

การสั่นของลูกตุ้ม Freq(Hz)=0.449224, Period(Sec)=2.226059, estimation data source: pitch

เราสามารถพบผลการคำนวณด้วยมือที่มองได้ก่อนหน้านี้ 2.22 วินาที ซึ่งค่อนข้างสอดคล้องกับค่าที่คำนวณโดยโปรแกรม

เมื่อเทียบกับค่าที่คำนวณตามทฤษฎี 2.0962(วินาที) เรามีข้อผิดพลาดเหลือประมาณ 5% จะกำจัดพวกเขาได้อย่างไร? จำข้อสันนิษฐานว่า "ก้านแข็งสม่ำเสมอ" หรือไม่? แม้แต่น้ำหนักที่เพิ่มขึ้น 7 กรัมก็ดูไม่สำคัญ แต่ก็เป็นสาเหตุที่ใหญ่ที่สุดของข้อผิดพลาดที่เหลืออยู่

ตอนนี้เราย้ายอุปกรณ์ใกล้กับเดือย ดูขั้นตอนก่อนหน้าสำหรับภาพถ่ายระยะใกล้ ไฟล์บันทึกที่ฉันสร้างสามารถดาวน์โหลดได้ที่นี่:

xiapeiqing.github.io/doc/kits/pendulum/pen…

เรียกใช้ขั้นตอนการวิเคราะห์เดียวกัน และเราได้ระยะเวลา 2.089867 (วินาที) ดูรูปที่ 3 ซึ่งเกือบจะเหมือนกับการทำนายตามทฤษฎี ยอดเยี่ยม!

เนื่องจากเราไม่เพียงแต่มีการวัดมุมสวิงเท่านั้น แต่ยังมีการวัดไจโรสโคปิกและการวัดความเร่งในอัตราเดียวกันด้วย ทำการวิเคราะห์แบบเดียวกันสำหรับการวัดอีก 2 รายการ เราจะได้ผลลัพธ์ในรูปที่ 4 และ 5 ค่าประมาณจากแหล่งการวัดทั้งสามเห็นด้วย ซึ่งทำให้เรามั่นใจในความสำเร็จของการทดสอบมากขึ้น

นี่คือผลลัพธ์ของผลลัพธ์สุดท้ายของโปรแกรม python ที่ทำงานอยู่:

การแกว่งของลูกตุ้ม Freq(Hz)=0.478499, Period(Sec)=2.089867, estimation data source: pitch

การสั่นของลูกตุ้ม Freq(Hz)=0.478499, Period(Sec)=2.089867, estimation data source: accel

การแกว่งของลูกตุ้ม Freq(Hz)=0.478499, Period(Sec)=2.089867, estimation data source: gyro

ความคิดสุดท้ายในขั้นตอนนี้ ผลการประเมินจะเหมือนกันทุกประการโดยใช้แหล่งข้อมูลอินพุตต่างกันได้อย่างไร นี่คือสัญชาตญาณ ฉันจะทิ้งคำถามนี้ไว้กับผู้อ่าน นี่คือคำใบ้: จำได้ไหมว่าเรากำลังใช้ FFT ในช่วงเวลาสั้น ๆ เพื่อประมาณความถี่การแกว่ง ในโดเมนดิจิทัล การประมาณความถี่จะแสดงในช่องความถี่แบบไม่ต่อเนื่องแทนการประมาณค่าตัวเลขลอยตัว

ขั้นตอนที่ 5: คำแนะนำในการทำงานในอนาคต

คำแนะนำงานในอนาคตมีอยู่สองสามประเภท

ในขั้นตอนก่อนหน้านี้ เราจัดการเพื่อลดข้อผิดพลาดในการทดสอบจาก ~5% ให้เหลือน้อยกว่า 1% เราทำได้ดีกว่านี้ไหม เมื่อสังเกตเห็นขนาดการสั่นลดลงแบบทวีคูณ ปัจจัยหนึ่งที่เอื้ออำนวยอาจเป็นแรงต้านอากาศที่เกิดจากการแกว่งลูกตุ้ม ภาพตัดขวางของลูกตุ้มอาจต้องปรับเปลี่ยนให้มีรูปร่างเพรียวขึ้นเพื่อลดการลากตามหลักอากาศพลศาสตร์

เราสามารถใช้อัตราขยายที่เปลี่ยนแปลงตามเวลาที่เรียนรู้โดยใช้เทคนิคตัวกรองแบบปรับตัวเพื่อส่งสัญญาณขนาดสูงสุดคงที่ได้หรือไม่ ในระหว่างนี้ ความสัมพันธ์ระหว่างการลดทอนขนาดกับแรงภายนอก

เราแทบจะไม่พบสิ่งใดที่ง่ายกว่า "การเคลื่อนไหวแบบฮาร์โมนิกอย่างง่าย" เราสามารถใช้สิ่งอำนวยความสะดวกที่เราวิเคราะห์ลูกตุ้มเพื่อวิเคราะห์สิ่งที่ซับซ้อนกว่านั้น เช่น กิจกรรมกีฬา ลำดับการปล่อยจรวดน้ำ ฯลฯ ได้หรือไม่

แฮ็คอย่างมีความสุข

แนะนำ: