Monitoring Occupant Posture Using a Standardized Sensor Interface with a Vehicle Seat
Abstract
:1. Introduction and Related Works
2. Sensor Interface Between Seat and Car Body
2.1. Layout of the Sensor Interface
2.2. Control, Calibration, and Signal Processing
- The ATMega328P processor of the Arduino Uno, with a clock speed of 16 MHz, 32 KB of flash memory, and 2 KB of SRAM, lacks sufficient computing power; while it supports a high sampling rate, it is inadequate for processing complex data and storing it in memory;
- Direct data transmission to Microsoft Excel is time-consuming due to the complexity of the data structure, including formatting in rows, columns, and colors; experimental tests estimated that writing a single string of values takes approximately 30 ms;
- The single-core ATMega328P processor only allows for the sequential execution of functions, meaning the data must be read, processed, formatted, and then sent to the Excel data logger.
- Data reading is carried out through Arduino UNO with a program written in the Arduino IDE;
- Data processing and more complex tasks, such as data storage, are managed using an HP G7 laptop with a multicore processor Intel Core i7 and a Python 3.13.0 program that utilizes a parallel programming model. The data are stored in a simpler format, such as *.csv. The Python program runs multiple threads, which are synchronized using a priority system of Lock and Flag semaphores. The implemented threads include the following:
- Main data processing: Responsible for acquiring, processing, and formatting the read data;
- Graphical interface: provides real-time visualization of the CP position and the detection of any OP postures;
- Self-calibration thread: enables the system to recalibrate itself after a set time interval;
- Data save thread: ensures periodic data storage during acquisition.
2.2.1. Data Reading Thread
- Initializing the inertial platform (lines 1–5 and 20–30);
- Initializing variables for the amplifier outputs (lines 7–11);
- Setting the serial communication speed (line 18);
- Defining the sampling interval of 20 milliseconds (lines 13–15 and 33–36).
2.2.2. Data Processing Thread
2.2.3. Calibration Thread
2.2.4. Graphical User Interface Thread
2.2.5. Data Save Thread
2.2.6. Data Conversion Code
3. Occupant Monitoring Tests
3.1. Static Tests
3.2. Dynamic Driving Tests
- Start driving in first gear;
- Half-eight turn at approximately 15 km/h;
- Full-throttle acceleration in second gear until reaching the preset 50 km/h in the speed limiter function of the car;
- Left lane change;
- Right lane change;
- Hard brake to full stop;
- Restart driving in first gear;
- Repeat 2;
- Repeat 3;
- Right lane change;
- Left lane change;
- Repeat 6.
3.3. Dynamic Passenger Tests
3.4. Results Discussion
4. Conclusions
Author Contributions
Funding
Data Availability Statement
Acknowledgments
Conflicts of Interest
Appendix A. Reading Thread Code
- 1. #include <Wire.h>2. #include <Adafruit_Sensor.h>3. #include <Adafruit_BNO055.h>4.5. Adafruit_BNO055 bno = Adafruit_BNO055(55);6.7. // Declaration of the pins of the amplifiers8. int const ampPin1 = A0; // analog pin of amplifier 19. int const ampPin2 = A1; // analog pin of amplifier 210. int const ampPin3 = A2; // analog pin of amplifier 311. int const ampPin4 = A3; // analog pin of amplifier 412.13. // definition of the milliseconds counter and sampling rate14. unsigned long previousMillis = 0;15. const long interval = 20;16.17. void setup() {18. Serial.begin(250000); // set of serial communication speed19.20. Wire.setClock(100000); // set of sampling rate of IMU data at 400 KHz21.22. // BNO055 sensor initialization23. if (!bno.begin()) {24. Serial.println(“Ooops, no BNO055 detected ... Check your wiring or I2C ADDR!”);25. while (1); // stop here if the sensor is not detected26. }27.28. delay(1000);29. bno.setExtCrystalUse(true);30. }31.32. void loop() {33. unsigned long currentMillis = millis(); // definition time in milliseconds34.35. if (currentMillis - previousMillis >= interval) {36. previousMillis = currentMillis;37.38. // read sensor and send data39. // read data from amplifiers40. float ampVal1 = analogRead(ampPin1);41. float ampVal2 = analogRead(ampPin2);42. float ampVal3 = analogRead(ampPin3);43. float ampVal4 = analogRead(ampPin4);44.45. // read acceleration data from BNO05546. imu::Vector<3> acceleration = bno.getVector(Adafruit_BNO055::VECTOR_ACCELEROMETER);47. float accX = acceleration.x();48. float accY = acceleration.y();49. float accZ = acceleration.z();50.51. // data send in ASCII format52. Serial.print(“AA,”); // fix header in ASCII53.54. // send data of the 4 amplifiers55. Serial.print(ampVal1, 2); Serial.print(“,”);56. Serial.print(ampVal2, 2); Serial.print(“,”);57. Serial.print(ampVal3, 2); Serial.print(“,”);58. Serial.print(ampVal4, 2); Serial.print(“,”);59.60. // send dat of the 3 accelerations61. Serial.print(accX, 2); Serial.print(“,”);62. Serial.print(accY, 2); Serial.print(“,”);63. Serial.print(accZ, 2);64.65. // adding a line terminator to indicate the end of the packet66. Serial.println();67. }68. }
Appendix B. Processing Thread Code
- 1. import serial2. import time3. import csv4. import threading5. from pynput import keyboard6. from collections import deque7. import tkinter as tk8. # Configure serial communication9. serial_com = serial.Serial(‘COM2’, 250000, timeout = 0.02)10. # (Serial Port, Baudrate, Reading time step synchronized with Arduino)11.12. # Initial time count13. start_time = time.perf_counter() # Time reference14.15. try:16. print(“Reading data”)17. while True:18. # Get current time19. current_time = time.time()20.21. # Convert in h, m, s format22. gmt_time = time.strftime(‘%H:%M:%S’, time.localtime(current_time))23. try:24. # Read a line from serial port25. serial_line = serial_com.readline().decode(‘utf-8’).strip() # Decodify serial line26.27. if serial_line:28. # Divide data by comma separator29. data = serial_line.split(“,”)30. if data[0] == “AA”: # Verify header presence and read float variables31. ampVal1 = float(data[1])32. ampVal2 = float(data[2])33. ampVal3 = float(data[3])34. ampVal4 = float(data[4])35. accX = float(data[5])36. accY = float(data[6])37. accZ = float(data[7])38.39. # Computation based on received data40. kg1 = (ampVal1 - 512) * (500/512)41. kg2 = (ampVal2 - 512) * (500/512)42. kg3 = (ampVal3 - 512) * (500/512)43. kg4 = (ampVal4 - 512) * (500/512)44. m_12, m_34 = kg1 + kg2, kg3 + kg445. mtot = m_12 + m_3446. yg = -(kg1 * y13 + kg2 * y24 + kg3 * y13 + kg4 * y24)/mtot47. xg = (m_12 * x12 + m_34 * x34)/mtot48. CPX, CPY = xg - shiftx, yg - shifty49. AX, AY = accX * scalex, accY * scaley50.51. # Loop to define monitored position52. if CPX > (AX + toll_1):53. pos = 1 # Forward reclined54. elif CPY > (AY + toll_2):55. pos = 2 # Left reclined56. elif CPY < (AY - toll_3):57. pos = 3 # Right reclined58. else:59. pos = 0 # Normal position60.61. # elapsed time estimated in ms62. elapsed_time = int((time.perf_counter() - start_time) * 1000)63.64. # Update queue with new values65. recent_xg_static.append(xg)66. recent_yg_static.append(yg)67. recent_xg_dinamic.append(xg)68. recent_yg_dinamic.append(yg)69. recent_accX.append(accX)70. ecent_accY.append(accY)71.72. # Start automatic calibration after 30 s73. if not calibrated and elapsed_time > 30 * 1000:74. # * 1000 because system uses ms75. print(“Automatic calibration ON ”)76. reset_pressure_center()77.78. # run scale function after 1 min79. if elapsed_time >= 60 * 1000:80. scale()81.82. # Update data for graphical interface83. with lock:84. CP_values[“CPX”] = CPX85. CP_values[“CPY”] = CPY86.87.88. # Store data in buffer to later write them on CSV89. with buffer_lock:90. data_buffered.append([gmt_time, elapsed_time, xg, yg, CPX, CPY, kg1, kg2, kg3, kg4, accX, accY, accZ, ACCX, ACCY, pos, mtot])91.92. # Print data in visual monitor93. print(f”{‘Time’:<10} {‘elapsed_time’:<10} {‘xg’:<10} {‘yg’:<10} {‘CPX’:<10} {‘CPY’:<10} {‘kg1’:<10} {‘kg2’:<10} {‘kg3’:<10} {‘kg4’:<10} {‘accX’:<10} {‘accY’:<10} {‘ac-cZ’:<10} {‘ACCX’:<10} {‘ACCY’:<10} {‘Pos’:<10} {‘Total Mass’:<10}”)94.95. print(f”{gmt_time:<10} {elapsed_time:<10.2f} {xg:<10.2f} {yg:<10.2f} {CPX:<10.2f} {CPY:<10.2f} {kg1:<10.2f} {kg2:<10.2f} {kg3:<10.2f} {kg4:<10.2f} {accX:<10.2f} {accY:<10.2f} {accZ:<10.2f} {ACCX:<10.2f} {ACCY:<10.2f} {pos:<10} {mtot:<10.2f}”)96.97. except (ValueError):98. print(“values conversion failed”)99.100. except KeyboardInterrupt:101. print(“Program quitted ”)102. finally:103. serial_com.close()104. print(“Serial connection quitted ”)
Appendix C. Calibration Thread Code
- 1. # Initilized variables for calibration process2. shiftx_static = 03. shifty_static = 04. shiftx_dinamic = 05. shifty_dinamic = 06. scalex = 07. scaley = 08. scaled = False9.10. # Queues for storage of last useful values for system calibration11. recent_xg_static = deque(maxlen = 500)12. # Queue for xg (max 500 elements sampled at 50 Hz)13. recent_yg_static = deque(maxlen = 500)14. # Queue for yg (max 500 elements sampled at 50 Hz)15. recent_xg_dinamic = deque(maxlen = 3000)16. # Queue for xg_pred (max 3000 elements sampled at 50 Hz)17. recent_yg_dinamic = deque(maxlen = 3000)18. # Queue for yg_pred (max 3000 elements sampled at 50 Hz)19. recent_accX = deque(maxlen = 3000)20. # Queue for accX of 3000 elements21. recent_accY = deque(maxlen = 3000)22. # Queue for accY of 3000 elements23. # Function to reset the center of pressure considering the average of the data stored in the queues24. def reset_pressure_center() :25. global shiftx, shifty, shiftx_pred, shifty_pred26.27. if recent_xg_static and recent_yg_static:28. # Check available data for xg and yg29. shiftx = -(sum(recent_xg_static)/len(recent_xg_static))30. # Calculate the average of xg31. shifty = -(sum(recent_yg_static)/len(recent_yg_static))32. # Calculate the average of yg33. else:34. print(“CP reset failed”)35.36. # Function to scale accelerations37. def scale():38. global scalex, scaley, scaled39.40. if len(recent_xg_dinamic) > 0 and len(recent_xg_dinamic) > 0 and len(recent_accX) > 0 and len(recent_accY) > 0:41. # Necessary condition to execute the loop42. # Calculating the absolute values of CP components and accelerations on X and Y axis43. abs_xg = [abs(x) for x in recent_xg_dinamic]44. abs_yg = [abs(y) for y in recent_yg_dinamic]45. abs_accX = [abs(x) for x in recent_accX]46. abs_accY = [abs(y) for y in recent_accY]47.48. # Calculating the scale factors on X and Y axis49. scalex = -(max(abs_xg) - min(abs_xg))/(max(abs_accX) - min(abs_accX))50. scaley = -(max(abs_yg) - min(abs_yg))/(max(abs_accY) - min(abs_accY))51. scaled = True # Flag for execution52. else:53. print(“scale process failed”)54.55.56. # Function to manage the manual reset of the center of pressure57. def z_press(key):58. try:59. if key.char == ‘z’: # Pressing ‘z’ for manual recalibration60. thread_c = threading.Thread(target = reset_pressure_center)61. # Selecting the function to enable the recalibration thread62. thread_c.start()63. # Starting the manual recalibration thread64. except AttributeError:65. pass66.67.68. k_listen = keyboard.Listener(z_press = z_press)69. # Keyboard listener definition70. k_listen.start() # start to listen
Appendix D. Graphical User Interface Thread
- 1. # Shared variables for the Graphical Interface2. CP_values = {“CPX”: 0.0, “CPY”: 0.0}3. pos = 0 # Position initialized4. lock_D = threading.Lock() # Thread D lock for synchronization of data access5.6. # Function for GI startup7. def run_GUI():8. def update_CP():9. #Function for the visualization in real time of CPX and CPY values10. # Access data through lock11. with lock_D:12. value1.set(f“CPX: {CP_values[‘CPX’]:.2f}”)13. value2.set(f“CPY: {CP_values[‘CPY’]:.2f}”)14.15. def update_alarm(): #function for red or green light16. current_pos = pos17. # Change colour of the light based on the pos value18. if current_pos == 0:19. alarm_area.itemconfig(light, fill = “green”)20. status_label.config(text = “OK: Normal position”, fg = “green”)21. #Green light for Normal Position22. else:23. alarm_area.itemconfig(light, fill = “red”)24. status_label.config(text = f“Warning: Position {current_pos}”, fg = “red”) #Red light for Out of Position25.26. # Create the main window27. window = tk.Tk()28. window.title(“Monitoring in real time”)29.30. # Graphical area for the alarm31. alarm_area = tk.Canvas(window, width = 100, height = 100) #Window dimension32. alarm_area.pack(pady = 20) #Set of vertical border33. light = alarm_area.create_oval(20, 20, 80, 80, fill = “gray”, outline = “black”)#Dimension and base colour of led light34. # Labels to visualize the values35. tk.Label(window, textvariable = value1, font = (“Helvetica”, 14)).pack()36. tk.Label(window, textvariable = value2, font = (“Helvetica”, 14)).pack()37. status_label = tk.Label(window, text = “Stato: ---”, font = (“Helvetica”, 14))38. status_label.pack(pady = 10)39.40. # Variables for CP components41. value1 = tk.StringVar()42. value2 = tk.StringVar()43.44. window.after(100, update_CP) # Update loads after 100ms45. window.after(20, update_alarm) # Update alarm after 20ms46. # Start of GI and alarm update47. update_CP()48. update_alarm()49.50. # Start loop51. window.mainloop()52. # Start thread53. thread_D = threading.Thread(target = run_GI, daemon = True)54. thread_D.start()
Appendix E. Data Save Thread
- 1. # Buffer list to store data2. data_buffered = [] # Initialize the list3. list_size = 500 # Definition of the list with dimension of 500 values4. fill_buffer= True # Control flag for buffer filling5.6. # Lock for synchronzation buffer access7. save_lock = threading.Lock()8.9. # Function to save data on csv10. def CSV():11.12. global data_buffered # Declaration of a global variable13. while fill_buffer or len(data_buffered) > 0:14. # Continue running program if no data are available in buffer15. save_list = []16.17. # Read a list from the buffer without thread overlap18. with save_lock:19. if len(data_buffered) >= list_size:20. # If buffer has enough values, stored data21. save_list = data_buffered[:list_size]22. # Copy a list of data reading from the data_buffered23. data_buffered = data_buffered[list_size:]24. # Empties the list on the buffer once copied25.26. # Write the list in CSV27. if save_list: # If there are data to save28. with open(‘File.csv’, mode = ‘a’, newline = ‘ ’) as file:# (Open a named file, append mode to add data without overwriting and without empty new lines)29. data_to_write = csv.writer(file) # write data in a CSV file30. data_to_write.writerows([datum for datum in save_list])31. # Write data list adding each element of save_list and a line in the CSV32.33.34. time.sleep(0.1)35. # Pause to reduce the frequency of runs36.37. # Start the save thread in the background38. thread_E = threading.Thread(target = CSV, daemon = True)39. # (Function to execute, daemon to kill thread_E when main is killed)40.41. thread_E.start() # Starting the thread for saving data
Appendix F. Data Conversion Code
- 1. import pandas as pd2.3. # Name of CSV and Excel files4. csv_file = “File.csv”5. excel_file = “File.xlsx”6.7. # Define column headers8. column_names = [“Time”, “timer”, “CPX”, “CPY”, “kg1”, “kg2”, “kg3”, “kg4”,9. “accX”, “accY”, “AX”, “AY”, “Pos”, “Total Mass”]10.11. try:12. # Read CSV file as text and remove square brackets13. with open(csv_file, ‘r’) as file:14. data = []15. for line in file:16. line = line.strip() # Remove initial/final white spaces17. # Separate values, also handling commas in numbers18. values = line.split(‘,’)19. # Removes any extra spaces and separates the time from the numbers20. data.append([value.strip().replace(“’”, “”) for value in values])21.22. # Convert data to a DataFrame23. data_frame = pd.DataFrame(data)24.25. # Add headers26. data_frame.columns = column_names27.28. # Convert each column to numeric, except the first one (Time) which is string29. for col_name in data_frame.columns[1:]: # Skip first column ‘Time’30. data_frame[col_name] = pd.to_numeric(data_frame[col_name], errors = ‘coerce’) # Convert to numeric, replace errors with NaN31.32. # Save as Excel file33. data_frame.to_excel(excel_file, index = False)# Save without including the index34.35. print(f“File successfully converted: {excel_file}”)36. except FileNotFoundError as e:37. print(f“Error: {e}”)
References
- Mutlag, A.H.; Mahdi, S.Q.; Salim, O.N.M. A Comparative Study of an Artificial Intelligence-Based Vehicle Airbag Controller. In Proceedings of the 2022 IEEE 18th International Colloquium on Signal Processing & Applications, Selangor, Malaysia, 12 May 2022. [Google Scholar] [CrossRef]
- Machens, K.U.; Kübler, L. Dynamic Testing with Pre-Crash Activation to Design Adaptive Safety Systems. In Proceedings of the 27th International Technical Conference on the Enhanced Safety of Vehicles (ESV), Yokohama, Japan, 3–6 April 2023; Available online: https://www-esv.nhtsa.dot.gov/Proceedings/27/27ESV-000067.pdf (accessed on 6 May 2024).
- Lebarbé, M.; Potier, P.; Baudrit, P.; Petit, P.; Trosseille, X.; Vallancien, G. Thoracic Injury Investigation Using PMHS in Frontal Airbag Out-of-Position Situations. Stapp Car Crash J. 2005, 49, 323–342. [Google Scholar] [CrossRef] [PubMed]
- Maxeiner, H.; Hahn, M. Airbag-Induced Lethal Cervical Trauma. J. Trauma Acute Care Surg. 1997, 42, 1148–1151. [Google Scholar] [CrossRef] [PubMed]
- Potula, S.R.; Solanki, K.N.; Oglesby, D.L.; Tschopp, M.A.; Bhatia, M.A. Investigating occupant safety through simulating the interaction between side curtain airbag deployment and an out-of-position occupant. Accid. Anal. Prev. 2009, 49, 392–403. [Google Scholar] [CrossRef] [PubMed]
- Yoganandan, M.; Pintar, F.A.; Zhang, J.; Gennarelli, T.A. Lateral impact injuries with side airbag deployments—A descriptive study. Accid. Anal. Prev. 2007, 39, 22–27. [Google Scholar] [CrossRef] [PubMed]
- Depottey, T.A.; Schneider, D.W. Airbag Cushion with Adaptive Venting for Reduced Out-of-Position Effects. U.S. Patent 7,261,319, 28 August 2007. [Google Scholar]
- Farmer, M.E.; Jain, A.K. Occupant classification system for automotive airbag suppression. In Proceedings of the IEEE Com-puter Society Conference on Computer Vision and Pattern Recognition, Madison, WI, USA, 18–20 June 2003. [Google Scholar] [CrossRef]
- Hall, I.; Rao, M.K.; Ryan, S. Airbag System for Out-of-Position Occupant Protection and Adaptive Venting. U.S. Patent 7,448,646, 11 November 2008. [Google Scholar]
- Schneider, D.W.; Rose, L.D. Airbag Adaptive Venting for Out-of-Position Occupants. U.S. Patent 7,770,926, 10 August 2010. [Google Scholar]
- Bergasa, L.M.; Nuevo, J.; Sotelo, M.A.; Barea, R.; Lopez, M.E. Real-time system for monitoring driver vigilance. IEEE Trans. Intell. Transp. Syst. 2006, 7, 63–77. [Google Scholar] [CrossRef]
- Borghi, G.; Venturelli, M.; Vezzani, R.; Cucchiara, R. Poseidon: Face-from-depth for driver pose estimation. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, Honolulu, HI, USA, 21–26 July 2017. [Google Scholar] [CrossRef]
- Dong, Y.; Hu, Z.; Uchimura, K.; Murayama, N. Driver Inattention Monitoring System for Intelligent Vehicles: A Review. IEEE Trans. Intell. Transp. Syst. 2011, 12, 596–614. [Google Scholar] [CrossRef]
- Driver Attention Monitor (Honda Sensing® Feature). Available online: https://www.hondainfocenter.com/2024/CR-V/Feature-Guide/Interior-Features/Driver-Attention-Monitor/ (accessed on 8 March 2024).
- A Moment More Attention: Mercedes-Benz Presents “Awake”. Available online: https://media.mercedes-benz.com/article/2798d797-85c0-45bc-aa01-e12fcbc5745f (accessed on 8 March 2024).
- Mazda Driver Attention Alert. Available online: https://www.mazdausa.com/static/manuals/2020/cx-30/contents/05281103.html (accessed on 16 April 2025).
- Volvo Driver Alert. Available online: https://www.volvocars.com/en-eg/support/car/xc60/article/f57bafffba0c0468c0a8015174f226d8 (accessed on 8 March 2024).
- J3016_201401; Taxonomy and Definitions for Terms Related to On-Road Motor Vehicle Automated Driving Systems. SAE: Warrendale, PA, USA, 2014; pp. 1–16. Available online: https://www.sae.org/standards/content/j3016_201401/ (accessed on 6 May 2024).
- Kyung, G.; Nussbaum, M.A. Driver Sitting Comfort and Discomfort (part II): Relationships with and Prediction from Interface Pressure. Int. J. Ind. Ergon. 2008, 38, 526–538. [Google Scholar] [CrossRef]
- Na, S.; Lim, S.; Choi, H.S.; Chung, M.K. Evaluation of driver’s discomfort and postural change using dynamic body pressure distribution. Int. J. Ind. Ergon. 2005, 35, 1085–1096. [Google Scholar] [CrossRef]
- Ito, K.; Inayoshi, M.; Enomoto, A.; Fujii, H. Vehicle Tilt Detecting Apparatus and Seat Load Detecting Apparatus Using the Same. U.S. Patent US8296099B2, 23 October 2009. [Google Scholar]
- Inayoshi, M.; Enomoto, A.; Fujii, H. Apparatus and Method for Determining Impact on Vehicle and Apparatus for Warning Impact on Vehicle. U.S. Patent US8328276B2, 11 December 2009. [Google Scholar]
- Schousek, T.J. Vehicle Occupant Restraint with Seat Pressure Sensor. U.S. Patent 5,474,327, 12 December 1995. [Google Scholar]
- White, C.W.; Behr, L.W. Passenger Out-of-Position Sensor. U.S. Patent 5,071,160, 10 December 1991. [Google Scholar]
- Toshiaki Ishida, T.; Ogasawara, H. Load Detection Structure for Vehicle Seat. JP Patent JP3904913B2, 7 November 2001. [Google Scholar]
- Yanagi, E. Load Sensor and Seat Weight Measuring Apparatus with a Plurality of Strain Gauges. U.S. Patent US7055365B2, 6 June 2002. [Google Scholar]
- Osmer, W.; Wills, M.; Blakesley, P. Vehicle Occupant Position Detector and Airbag Control System. U.S. Patent EP1202876B1, 28 May 1999. [Google Scholar]
- Martínez, M.V.; Del Campo, I.; Echanobe, J.; Basterretxea, K. Driving behavior signals and machine learning: A personalized driver assistance system. In Proceedings of the IEEE 18th International Conference on Intelligent Transportation Systems, Las Palmas de Gran Canaria, Spain, 15–18 September 2015. [Google Scholar]
- Zhang, Y.; Lin, W.C.; Chin, Y.K.S. A pattern-recognition approach for driving skill characterization. IEEE Trans. Intell. Transp. Syst. 2010, 11, 905–916. [Google Scholar] [CrossRef]
- Yaniger, S.I. Force sensing resistors™: A review of the technology. In Proceedings of the Electro International Conference, New York, NY, USA, 16–18 April 1991; pp. 666–668. [Google Scholar] [CrossRef]
- Vergnano, A.; Leali, F. Out of Position Driver Monitoring from Seat Pressure in Dynamic Maneuvers. In Proceedings of the 2nd International Conference on Intelligent Human Systems Integration, San Diego, CA, USA, 7–10 February 2019. [Google Scholar] [CrossRef]
- Vergnano, A.; Leali, F. A methodology for out of position occupant identification from pressure sensors embedded in a vehicle seat. Hum. Intell. Syst. Integr. 2020, 2, 35–44. [Google Scholar] [CrossRef]
- Vergnano, A.; Muscio, A.; Leali, F. Sensor matrix robustness for monitoring the interface pressure between car driver and seat. In Proceedings of the 2nd International Conference on Human Systems Engineering and Design: Future Trends and Applications (IHSED 2019), Munich, Germany, 16–18 September 2019. [Google Scholar]
- Ng, D.; Cassar, T.; Gross, C.M. Evaluation of an intelligent seat system. Appl. Ergon. 1995, 26, 109–116. [Google Scholar] [CrossRef]
- Vergnano, A.; Piras, A.; Leali, F. Vehicle Seat with Occupant Detection System. IT Patent 102019000022221, 26 November 2019. [Google Scholar]
- Vergnano, A.; Piras, A.; Leali, F. Modular Car Seat for Monitoring the Pressure Distribution on Regions of Pan and Backrest. In Proceedings of the 3rd International Conference on Human Systems Engineering and Design, Pula, Croatia, 22–24 September 2020. [Google Scholar] [CrossRef]
- Vergnano, A.; Giorgianni, C.; Leali, F. Monitoring the Center of Gravity of a Vehicle Seat to Detect the Occupant Position. Designs 2024, 8, 44. [Google Scholar] [CrossRef]
- Severy, D.M.; Blaisdell, D.M.; Kerkhoff, J.F. Automotive seat design and collision performance. SAE Trans. 1976, 85, 2551–2565. [Google Scholar]
- Kathiresan, S.S.; Echempati, R. Structural Analysis and Design Modification of Seat Rail Structures in Various Operating Conditions; SAE Technical Paper 2020-01-1101; SAE: Warrendale, PA, USA, 2020. [Google Scholar]
- Sun, C.; Zhu, W. Design and Simulation Analysis of Automobile Seat Impact Detection System. Procedia Comput. Sci. 2004, 243, 224–234. [Google Scholar] [CrossRef]
- Uniform Provisions Concerning the Approval of Vehicles with Regard to the Seats, Their Anchorages and Any Head Restraints; Addendum 16: Regulation No. 17; United Nations Economic Commission for Europe: Geneva, Switzerland, 2002.
- National Highway Traffic Safety Administration, Department of Transportation. Title 49—Transportation, Subtitle B—Other Regulations Relating to Transportation, Chapter V—Part 571—Federal Motor Vehicle Safety Standards, 49 CFR 571.207. 2025. Available online: https://www.ecfr.gov/current/title-49/subtitle-B/chapter-V/part-571/subpart-B/section-571.207 (accessed on 16 April 2025).
- Whitney, D.E. Mechanical Assemblies: Their Design, Manufacture, and Role in Product Development; Oxford University Press: New York, NY, USA, 2004. [Google Scholar]
- Reed, M.P.; Ebert, S.M.; Jones, M.H.; Park, B.K. D. Occupant Dynamics During Crash Avoidance Maneuvers (No. DOT HS 812 997); United States Department of Transportation, National Highway Traffic Safety Administration: Washington, DC, USA, 2021. Available online: https://rosap.ntl.bts.gov/view/dot/54737 (accessed on 16 April 2025).
- Aero Club of Modena. Available online: https://aeroclubmodena.it/ (accessed on 23 April 2024).
1 16FRSs Proto [31,32] | 2 Pressure Mat [33] | 3 Modular Seat [35,36] | 4 4-Legs Proto [37] | 5 Current Interface | |
---|---|---|---|---|---|
Technology | 16 Force Sensing Resistors + IMU | Polymeric piezoresistive foil + IMU | 52 load cells + IMU | 4 load cells + IMU | 4 load cells + IMU |
Working Principle | Monitoring pressure distribution and vehicle accelerations | Monitoring pressure distribution and vehicle accelerations | Monitoring forces and vehicle accelerations | Monitoring centre of pressure and vehicle accelerations | Monitoring centre of pressure and vehicle accelerations |
Sensing | Nonlinearity, hysteresis, and drift | Nonlinearity, hysteresis, and drift | Linear and fast | Linear and fast | Linear and fast |
Data Frame Rate | 100 ms | 400 ms | 100 ms | 100 ms | 20 ms |
Evaluation of pressure distribution | Limited, on 16 small areas | Very effective, on the whole surface | Limited, monitoring resulting forces | No | No |
Evaluation of forces | With data processing | With data processing | On 13 relevant areas of the seat | Resulting forces of the whole driver-seat system | Resulting forces of the whole driver-seat system |
Posture Classification | Yes | Yes | Yes | Yes | Yes |
Support to multiple vehicle platforms | No | No | No | No | Yes |
Feasibility | Easy to embed the FSRs in the seat | Air-proof layer not suitable for comfortable seats | Great design effort | Need to redesign and homologate the seat | Reuse commercial seats |
Occupant | Weight [kg] | Stature [m] |
---|---|---|
1 | 78 | 1.75 |
2 | 96 | 1.86 |
3 | 62 | 1.68 |
Position | Tolerance [mm] |
---|---|
1 | 45 (both sides) |
2 | 15 (driver); 25 (passenger) |
3 | 25 (driver); 15 (passenger) |
Position | Tolerance [mm] |
---|---|
1 | 60 (both sides) |
2 | 30 (both sides) |
3 | 30 (both sides) |
Test | 0 Pos | 1 Pos | 2 Pos | 3 Pos | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
4-Legs | Interface | 4-Legs | Interface | 4-Legs | Interface | 4-Legs | Interface | |||||
Individ. | Driver | Driver | Passenger | Driver | Driver | Passenger | Driver | Driver | Passenger | Driver | Driver | Passenger |
1 | 86% | 86% | 97% | 99% | 90% | 95% | 51% | 60% | 89% | 73% | 85% | 47% |
2 | 89% | 88% | 88% | 100% | 90% | 94% | 52% | 51% | 79% | 84% | 79% | 65% |
3 | 92% | 83% | 98% | 94% | 94% | 92% | 45% | 52% | 84% | 76% | 87% | 47% |
Disclaimer/Publisher’s Note: The statements, opinions and data contained in all publications are solely those of the individual author(s) and contributor(s) and not of MDPI and/or the editor(s). MDPI and/or the editor(s) disclaim responsibility for any injury to people or property resulting from any ideas, methods, instructions or products referred to in the content. |
© 2025 by the authors. Licensee MDPI, Basel, Switzerland. This article is an open access article distributed under the terms and conditions of the Creative Commons Attribution (CC BY) license (https://creativecommons.org/licenses/by/4.0/).
Share and Cite
Vergnano, A.; Pelizzari, A.; Giorgianni, C.; Kovanda, J.; Zimmer, A.; Lopes da Silva, J.; Rezvanpour, H.; Leali, F. Monitoring Occupant Posture Using a Standardized Sensor Interface with a Vehicle Seat. Designs 2025, 9, 52. https://doi.org/10.3390/designs9020052
Vergnano A, Pelizzari A, Giorgianni C, Kovanda J, Zimmer A, Lopes da Silva J, Rezvanpour H, Leali F. Monitoring Occupant Posture Using a Standardized Sensor Interface with a Vehicle Seat. Designs. 2025; 9(2):52. https://doi.org/10.3390/designs9020052
Chicago/Turabian StyleVergnano, Alberto, Alessandro Pelizzari, Claudio Giorgianni, Jan Kovanda, Alessandro Zimmer, Joed Lopes da Silva, Hamed Rezvanpour, and Francesco Leali. 2025. "Monitoring Occupant Posture Using a Standardized Sensor Interface with a Vehicle Seat" Designs 9, no. 2: 52. https://doi.org/10.3390/designs9020052
APA StyleVergnano, A., Pelizzari, A., Giorgianni, C., Kovanda, J., Zimmer, A., Lopes da Silva, J., Rezvanpour, H., & Leali, F. (2025). Monitoring Occupant Posture Using a Standardized Sensor Interface with a Vehicle Seat. Designs, 9(2), 52. https://doi.org/10.3390/designs9020052