SlideShare a Scribd company logo
1 of 52
Prototyping of a Robot Arm
Controller: getting the hands
dirty to learn new technologies
Enrique Llerena Dominguez
mimacom
Eclipsecon Europe 2019
$whoami
• Enrique Llerena Dominguez
• Software Engineer / Consultant @ mimacom
• Experience developing software for the finance,
retail, pharma, and automotive industry
• Professional Interests: Software Architecture,
Cloud Computing, Artificial Intelligence
• Free Time: Spending time with my kids, watching
football, learning german, and developing nice
things
Motivation
Learning!
Image Sources: cited in slide „Image
Sources“
Motivation
Learning!
Image Sources: cited in slide „Image
Sources“
Source: https://cdn.pixabay.com/photo/2015/10/30/12/24/questions-1014060_960_720.jpg
Image source: Photo by Alex Jones on Unsplash
What?
Image Sources: cited in slide „Image
Sources“
Why is this a match?
• It is a data stream.
• This is a classification problem.
Image Sources: cited in slide „Image
Sources“
Objectives
• Control the simulated robotic arm with the hands
over the sensor.
• How? Map a hand position to a movement
instruction
• Train a model so that everyone could define an
individualized mapping
Image source: Photo by David Fanuel on Unsplash
Image Sources: cited in slide „Image
Sources“
What does „Map a hand position to a movement instruction“ mean?
Instruction = servoId, delta
Servo 1
Servo 2
Servo 3
Positive Delta Negative Delta
Image Sources: cited in slide „Image
Sources“
What does „Map a hand position to a movement instruction“ mean?
Instruction = servoId, delta
Left Hand wide open = servo 2
Right Hand wide open = positive delta
Strategy
• Minimum Viable Product
• Small iterations to create small pieces with clearly
testable deltas
• Tackle the riskiest things first
This Photo by Unknown Author is licensed under CC BY-SA-NC . Source: http://www.sportsbabel.net/diagram.jpg
Challenges
• Get data from the sensor
• Model the simulated robotic arm, control it, and
communicate it with the exterior
• Transform sensor data into movements: Process
data and communicate both components
Image Source: Photo by Muyuan Ma on Unsplash
Target Architecture
First Prototype: Architecture
The first piece: the simulation
The first piece: the simulation
Image Sources: cited in slide „Image
Sources“
The second piece: Getting the data from the
sensor
The second piece: Getting the data from the
sensor
Image Sources: cited in slide „Image
Sources“
The third piece: The controller
The third piece: The controller
Image Sources: cited in slide „Image
Sources“
• Communicate the hands sensor with the
simulation
• Transform the hands data into a
movement instruction
Communication interfaces
Communication interfaces
First Prototype:
Result
FAILED!
Communicating the controller with
the simulation through the
command line is too slow.
Photo by John Torcasio on Unsplash
Fixing the first Prototype
Photo by Katrina Berban on Unsplash
The next goal: Integrating
Machine Learning
Photo by Markus Spiske on Unsplash
Target Architecture
The fourth piece: Machine Learning
Image Sources: cited in slide „Image
Sources“
• 2 Phases:
• Training
• Controlling
• Training:
• Data set generation
• Machine Learning model training
Hand Type Finger1_X Finger1_Y Finger1_Z … Finger5_Z
Instruction
Label
0 -226.271 202.675 999.255 … -105.923 0
0 -22.476 202.418 995.894 … -113.055 0
0 -726.617 110.996 136.756 … 719.333 1
0 -723.216 110.019 153.189 … 871.511 1
… … … … … … …
1 -210.596 148.747 320.942 … -711.063 3
1 -234.792 147.133 32.069 … -708.719 3
1 372.292 171.954 -631.447 … -383.639 4
1 370.837 167.724 -606.725 … -365.966 4
Instruction Label Meaning
0 Servo 1
1 Servo 2
2 Servo 3
3 Positive Delta
4 Negative Delta
Dataset Labels
Enough BLA BLA! Show me the
Deeplearning4j Code!
Image Sources: cited in slide „Image
Sources“
Image Source: Photo by Jeffrey F Lin on Unsplash
Biggest Challenges
• Use an iterator instead of the dataset to train the Neural Network.
• The data on the NDArray for prediction needs to be a float and not a
double.
• The Neural Network performs really poorly if we dont normalize it. If
we do so, we need to also normalize the input for prediction.
Not so big challenges
• The empty constructor of the NDArray throws an NPE when we try to
add elements to it.
• The data needs to be shuffled, or the Neural Network will perform
really bad.
• The Neural Network seems to be overfitting. It has a better
performance with less data.
What is missing?
Image Sources: cited in slide „Image
Sources“
Open Issues
• UX is bad.
• Sockets in the simulation are blocking.
• Always using the classified data, even if it does not match a trained
instruction.
• Bug: the simulation makes big jumps of state.
What went well?
Image Sources: cited in slide „Image
Sources“
Next steps / opportunities
• Evaluate which open issues are worth to solve.
• Challenge the necessity of Kafka to communicate the components.
• Implement a formal reactive approach on the controller?
• Use ROS on top of Gazebo?
Image Sources: cited in slide „Image
Sources“
DEMO!
Servo 1
Servo 2
Servo 3
Positive Delta Negative Delta
Thanks!
Github:
ellerenad
Repo:
RoboArmController (here)
Repo:
RoboArmController-spike-deeplearning4j (here)
enrique.dominguez@mimacom.com
ellerenad@hotmail.com
Image Sources
• Apache Kafka Logo, https://kafka.apache.org/
• C++ Logo, By Jeremy Kratz - https://github.com/isocpp/logos, Copyrighted free use, https://commons.wikimedia.org/w/index.php?curid=62851110
• Gazebo Logo, http://gazebosim.org/
• Deeplearning4j Logo, https://www.facebook.com/deeplearning4j/
• Hand Data Visualization: Screenshot of the Visualizer tool of the Leap Motion SDK
• Java Logo, By Source (WP:NFCC#4), Fair use, https://en.wikipedia.org/w/index.php?curid=51298819
• Junit 5 Logo, https://junit.org/junit5/assets/img/junit5-logo.png
• Leap Motion Logo: By Leap Motion - http://2015s.hackbu.org/img/sponsors/leap-motion.svg, Public Domain,
https://commons.wikimedia.org/w/index.php?curid=39152503
• Maven Logo, By Apache Software Foundation - Apache Software Foundation http://maven.apache.org/images/maventxt_logo_200.gif, Attribution,
https://commons.wikimedia.org/w/index.php?curid=10365467
• PlantUML User Diagram, generated with the PlantUML tool.
• Python Logo, By www.python.org - https://www.python.org/community/logos/, GPL, https://commons.wikimedia.org/w/index.php?curid=34991637
• RoboArmSimulation: Screenshot for the simulated robotic arm, generated used the Gazebo simulator.
• Tensorflow Logo, By TensorFlow - vectors combined, edited - Begoon - https://github.com/tensorflow/tensorflow https://github.com/valohai/ml-
logos/blob/master/tensorflow-text.svg https://github.com/valohai/ml-logos/blob/master/tensorflow-tf.svg , Apache License 2.0,
https://commons.wikimedia.org/w/index.php?curid=65268375

More Related Content

Similar to Prototyping of a Robot Arm Controller: getting the hands dirty to learn new technologies

Course Title CS591-Advance Artificial Intelligence
Course Title CS591-Advance Artificial Intelligence           Course Title CS591-Advance Artificial Intelligence
Course Title CS591-Advance Artificial Intelligence
CruzIbarra161
 

Similar to Prototyping of a Robot Arm Controller: getting the hands dirty to learn new technologies (20)

Asistencia | Live Face Prediction | Python
Asistencia | Live Face Prediction | Python  Asistencia | Live Face Prediction | Python
Asistencia | Live Face Prediction | Python
 
Deep Learning: concepts and use cases (October 2018)
Deep Learning: concepts and use cases (October 2018)Deep Learning: concepts and use cases (October 2018)
Deep Learning: concepts and use cases (October 2018)
 
Report face recognition : ArganRecogn
Report face recognition :  ArganRecognReport face recognition :  ArganRecogn
Report face recognition : ArganRecogn
 
Building a Custom Vision Model
Building a Custom Vision ModelBuilding a Custom Vision Model
Building a Custom Vision Model
 
Makine Öğrenmesi ile Görüntü Tanıma | Image Recognition using Machine Learning
Makine Öğrenmesi ile Görüntü Tanıma | Image Recognition using Machine LearningMakine Öğrenmesi ile Görüntü Tanıma | Image Recognition using Machine Learning
Makine Öğrenmesi ile Görüntü Tanıma | Image Recognition using Machine Learning
 
Python Project.pptx
Python Project.pptxPython Project.pptx
Python Project.pptx
 
Obscenity Detection in Images
Obscenity Detection in ImagesObscenity Detection in Images
Obscenity Detection in Images
 
YU CS Summer 2021 Project | TensorFlow Street Image Classification and Object...
YU CS Summer 2021 Project | TensorFlow Street Image Classification and Object...YU CS Summer 2021 Project | TensorFlow Street Image Classification and Object...
YU CS Summer 2021 Project | TensorFlow Street Image Classification and Object...
 
UserTesting 2016 webinar: Research to inform product design in Agile environm...
UserTesting 2016 webinar: Research to inform product design in Agile environm...UserTesting 2016 webinar: Research to inform product design in Agile environm...
UserTesting 2016 webinar: Research to inform product design in Agile environm...
 
AI powered emotion recognition: From Inception to Production - Global AI Conf...
AI powered emotion recognition: From Inception to Production - Global AI Conf...AI powered emotion recognition: From Inception to Production - Global AI Conf...
AI powered emotion recognition: From Inception to Production - Global AI Conf...
 
AI powered emotion recognition: From Inception to Production - Global AI Conf...
AI powered emotion recognition: From Inception to Production - Global AI Conf...AI powered emotion recognition: From Inception to Production - Global AI Conf...
AI powered emotion recognition: From Inception to Production - Global AI Conf...
 
[Revised] Intro to CNN
[Revised] Intro to CNN[Revised] Intro to CNN
[Revised] Intro to CNN
 
深度學習在AOI的應用
深度學習在AOI的應用深度學習在AOI的應用
深度學習在AOI的應用
 
Chapter 3 Reducing Risks Using CI
Chapter 3 Reducing Risks Using CIChapter 3 Reducing Risks Using CI
Chapter 3 Reducing Risks Using CI
 
Using Deep Learning to Find Similar Dresses
Using Deep Learning to Find Similar DressesUsing Deep Learning to Find Similar Dresses
Using Deep Learning to Find Similar Dresses
 
Course Title CS591-Advance Artificial Intelligence
Course Title CS591-Advance Artificial Intelligence           Course Title CS591-Advance Artificial Intelligence
Course Title CS591-Advance Artificial Intelligence
 
Machine Learning 101
Machine Learning 101Machine Learning 101
Machine Learning 101
 
HANDWRITTEN DIGIT RECOGNITION USING MACHINE LEARNING
HANDWRITTEN DIGIT RECOGNITION USING MACHINE LEARNINGHANDWRITTEN DIGIT RECOGNITION USING MACHINE LEARNING
HANDWRITTEN DIGIT RECOGNITION USING MACHINE LEARNING
 
HANDWRITTEN DIGIT RECOGNITION USING MACHINE LEARNING
HANDWRITTEN DIGIT RECOGNITION USING MACHINE LEARNINGHANDWRITTEN DIGIT RECOGNITION USING MACHINE LEARNING
HANDWRITTEN DIGIT RECOGNITION USING MACHINE LEARNING
 
Data quality is more important than you think
Data quality is more important than you thinkData quality is more important than you think
Data quality is more important than you think
 

Recently uploaded

Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
VictoriaMetrics
 

Recently uploaded (20)

WSO2Con2024 - Low-Code Integration Tooling
WSO2Con2024 - Low-Code Integration ToolingWSO2Con2024 - Low-Code Integration Tooling
WSO2Con2024 - Low-Code Integration Tooling
 
WSO2CON 2024 Slides - Unlocking Value with AI
WSO2CON 2024 Slides - Unlocking Value with AIWSO2CON 2024 Slides - Unlocking Value with AI
WSO2CON 2024 Slides - Unlocking Value with AI
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation Template
 
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
 
WSO2CON 2024 - Architecting AI in the Enterprise: APIs and Applications
WSO2CON 2024 - Architecting AI in the Enterprise: APIs and ApplicationsWSO2CON 2024 - Architecting AI in the Enterprise: APIs and Applications
WSO2CON 2024 - Architecting AI in the Enterprise: APIs and Applications
 
WSO2CON 2024 - Designing Event-Driven Enterprises: Stories of Transformation
WSO2CON 2024 - Designing Event-Driven Enterprises: Stories of TransformationWSO2CON 2024 - Designing Event-Driven Enterprises: Stories of Transformation
WSO2CON 2024 - Designing Event-Driven Enterprises: Stories of Transformation
 
WSO2Con2024 - GitOps in Action: Navigating Application Deployment in the Plat...
WSO2Con2024 - GitOps in Action: Navigating Application Deployment in the Plat...WSO2Con2024 - GitOps in Action: Navigating Application Deployment in the Plat...
WSO2Con2024 - GitOps in Action: Navigating Application Deployment in the Plat...
 
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
 
WSO2CON 2024 - How CSI Piemonte Is Apifying the Public Administration
WSO2CON 2024 - How CSI Piemonte Is Apifying the Public AdministrationWSO2CON 2024 - How CSI Piemonte Is Apifying the Public Administration
WSO2CON 2024 - How CSI Piemonte Is Apifying the Public Administration
 
What Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationWhat Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the Situation
 
WSO2CON 2024 - Building a Digital Government in Uganda
WSO2CON 2024 - Building a Digital Government in UgandaWSO2CON 2024 - Building a Digital Government in Uganda
WSO2CON 2024 - Building a Digital Government in Uganda
 
WSO2Con2024 - Hello Choreo Presentation - Kanchana
WSO2Con2024 - Hello Choreo Presentation - KanchanaWSO2Con2024 - Hello Choreo Presentation - Kanchana
WSO2Con2024 - Hello Choreo Presentation - Kanchana
 
WSO2Con2024 - Navigating the Digital Landscape: Transforming Healthcare with ...
WSO2Con2024 - Navigating the Digital Landscape: Transforming Healthcare with ...WSO2Con2024 - Navigating the Digital Landscape: Transforming Healthcare with ...
WSO2Con2024 - Navigating the Digital Landscape: Transforming Healthcare with ...
 
WSO2CON 2024 - Not Just Microservices: Rightsize Your Services!
WSO2CON 2024 - Not Just Microservices: Rightsize Your Services!WSO2CON 2024 - Not Just Microservices: Rightsize Your Services!
WSO2CON 2024 - Not Just Microservices: Rightsize Your Services!
 
WSO2Con2024 - Organization Management: The Revolution in B2B CIAM
WSO2Con2024 - Organization Management: The Revolution in B2B CIAMWSO2Con2024 - Organization Management: The Revolution in B2B CIAM
WSO2Con2024 - Organization Management: The Revolution in B2B CIAM
 
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
 
WSO2Con2024 - Software Delivery in Hybrid Environments
WSO2Con2024 - Software Delivery in Hybrid EnvironmentsWSO2Con2024 - Software Delivery in Hybrid Environments
WSO2Con2024 - Software Delivery in Hybrid Environments
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
 

Prototyping of a Robot Arm Controller: getting the hands dirty to learn new technologies

  • 1. Prototyping of a Robot Arm Controller: getting the hands dirty to learn new technologies Enrique Llerena Dominguez mimacom Eclipsecon Europe 2019
  • 2. $whoami • Enrique Llerena Dominguez • Software Engineer / Consultant @ mimacom • Experience developing software for the finance, retail, pharma, and automotive industry • Professional Interests: Software Architecture, Cloud Computing, Artificial Intelligence • Free Time: Spending time with my kids, watching football, learning german, and developing nice things
  • 3.
  • 4. Motivation Learning! Image Sources: cited in slide „Image Sources“
  • 5. Motivation Learning! Image Sources: cited in slide „Image Sources“
  • 7. Image source: Photo by Alex Jones on Unsplash
  • 8. What? Image Sources: cited in slide „Image Sources“
  • 9. Why is this a match? • It is a data stream. • This is a classification problem. Image Sources: cited in slide „Image Sources“
  • 10. Objectives • Control the simulated robotic arm with the hands over the sensor. • How? Map a hand position to a movement instruction • Train a model so that everyone could define an individualized mapping Image source: Photo by David Fanuel on Unsplash
  • 11. Image Sources: cited in slide „Image Sources“ What does „Map a hand position to a movement instruction“ mean? Instruction = servoId, delta
  • 14. Image Sources: cited in slide „Image Sources“ What does „Map a hand position to a movement instruction“ mean? Instruction = servoId, delta Left Hand wide open = servo 2 Right Hand wide open = positive delta
  • 15. Strategy • Minimum Viable Product • Small iterations to create small pieces with clearly testable deltas • Tackle the riskiest things first This Photo by Unknown Author is licensed under CC BY-SA-NC . Source: http://www.sportsbabel.net/diagram.jpg
  • 16. Challenges • Get data from the sensor • Model the simulated robotic arm, control it, and communicate it with the exterior • Transform sensor data into movements: Process data and communicate both components Image Source: Photo by Muyuan Ma on Unsplash
  • 19. The first piece: the simulation
  • 20. The first piece: the simulation Image Sources: cited in slide „Image Sources“
  • 21. The second piece: Getting the data from the sensor
  • 22. The second piece: Getting the data from the sensor Image Sources: cited in slide „Image Sources“
  • 23. The third piece: The controller
  • 24. The third piece: The controller Image Sources: cited in slide „Image Sources“ • Communicate the hands sensor with the simulation • Transform the hands data into a movement instruction
  • 26.
  • 28.
  • 29. First Prototype: Result FAILED! Communicating the controller with the simulation through the command line is too slow. Photo by John Torcasio on Unsplash
  • 30. Fixing the first Prototype
  • 31.
  • 32. Photo by Katrina Berban on Unsplash
  • 33. The next goal: Integrating Machine Learning Photo by Markus Spiske on Unsplash
  • 35. The fourth piece: Machine Learning Image Sources: cited in slide „Image Sources“ • 2 Phases: • Training • Controlling • Training: • Data set generation • Machine Learning model training
  • 36.
  • 37. Hand Type Finger1_X Finger1_Y Finger1_Z … Finger5_Z Instruction Label 0 -226.271 202.675 999.255 … -105.923 0 0 -22.476 202.418 995.894 … -113.055 0 0 -726.617 110.996 136.756 … 719.333 1 0 -723.216 110.019 153.189 … 871.511 1 … … … … … … … 1 -210.596 148.747 320.942 … -711.063 3 1 -234.792 147.133 32.069 … -708.719 3 1 372.292 171.954 -631.447 … -383.639 4 1 370.837 167.724 -606.725 … -365.966 4
  • 38. Instruction Label Meaning 0 Servo 1 1 Servo 2 2 Servo 3 3 Positive Delta 4 Negative Delta Dataset Labels
  • 39.
  • 40. Enough BLA BLA! Show me the Deeplearning4j Code! Image Sources: cited in slide „Image Sources“
  • 41. Image Source: Photo by Jeffrey F Lin on Unsplash
  • 42. Biggest Challenges • Use an iterator instead of the dataset to train the Neural Network. • The data on the NDArray for prediction needs to be a float and not a double. • The Neural Network performs really poorly if we dont normalize it. If we do so, we need to also normalize the input for prediction.
  • 43. Not so big challenges • The empty constructor of the NDArray throws an NPE when we try to add elements to it. • The data needs to be shuffled, or the Neural Network will perform really bad. • The Neural Network seems to be overfitting. It has a better performance with less data.
  • 44. What is missing? Image Sources: cited in slide „Image Sources“
  • 45. Open Issues • UX is bad. • Sockets in the simulation are blocking. • Always using the classified data, even if it does not match a trained instruction. • Bug: the simulation makes big jumps of state.
  • 46. What went well? Image Sources: cited in slide „Image Sources“
  • 47. Next steps / opportunities • Evaluate which open issues are worth to solve. • Challenge the necessity of Kafka to communicate the components. • Implement a formal reactive approach on the controller? • Use ROS on top of Gazebo?
  • 48. Image Sources: cited in slide „Image Sources“ DEMO!
  • 52. Image Sources • Apache Kafka Logo, https://kafka.apache.org/ • C++ Logo, By Jeremy Kratz - https://github.com/isocpp/logos, Copyrighted free use, https://commons.wikimedia.org/w/index.php?curid=62851110 • Gazebo Logo, http://gazebosim.org/ • Deeplearning4j Logo, https://www.facebook.com/deeplearning4j/ • Hand Data Visualization: Screenshot of the Visualizer tool of the Leap Motion SDK • Java Logo, By Source (WP:NFCC#4), Fair use, https://en.wikipedia.org/w/index.php?curid=51298819 • Junit 5 Logo, https://junit.org/junit5/assets/img/junit5-logo.png • Leap Motion Logo: By Leap Motion - http://2015s.hackbu.org/img/sponsors/leap-motion.svg, Public Domain, https://commons.wikimedia.org/w/index.php?curid=39152503 • Maven Logo, By Apache Software Foundation - Apache Software Foundation http://maven.apache.org/images/maventxt_logo_200.gif, Attribution, https://commons.wikimedia.org/w/index.php?curid=10365467 • PlantUML User Diagram, generated with the PlantUML tool. • Python Logo, By www.python.org - https://www.python.org/community/logos/, GPL, https://commons.wikimedia.org/w/index.php?curid=34991637 • RoboArmSimulation: Screenshot for the simulated robotic arm, generated used the Gazebo simulator. • Tensorflow Logo, By TensorFlow - vectors combined, edited - Begoon - https://github.com/tensorflow/tensorflow https://github.com/valohai/ml- logos/blob/master/tensorflow-text.svg https://github.com/valohai/ml-logos/blob/master/tensorflow-tf.svg , Apache License 2.0, https://commons.wikimedia.org/w/index.php?curid=65268375

Editor's Notes

  1. (obviously, right? it definitely didn't take 3 hours of debugging ;) ;) Well, honestly this problem was combined with the previous point)