From ad19d3063d65fdf9c99013b3f5cb1b9f766554c6 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Fri, 27 Nov 2020 12:17:12 +0100 Subject: [PATCH 01/47] Add Case study experiment --- content/case_experiment.tex | 502 +++++++++++++++++++++++++++++++++++- content/case_method.tex | 2 + graphics/cable_angle.tex | 55 ++++ graphics/cablebot.tex | 24 ++ graphics/combined.tex | 26 ++ graphics/plotter.tex | 23 ++ graphics/polar.tex | 22 ++ graphics/polar_protrude.tex | 23 ++ graphics/robmosys.tex | 64 +++++ graphics/scara.tex | 32 +++ graphics/tics.tikz | 37 +++ 11 files changed, 808 insertions(+), 2 deletions(-) create mode 100644 graphics/cable_angle.tex create mode 100644 graphics/cablebot.tex create mode 100644 graphics/combined.tex create mode 100644 graphics/plotter.tex create mode 100644 graphics/polar.tex create mode 100644 graphics/polar_protrude.tex create mode 100644 graphics/robmosys.tex create mode 100644 graphics/scara.tex create mode 100644 graphics/tics.tikz diff --git a/content/case_experiment.tex b/content/case_experiment.tex index b059b66..17a621a 100644 --- a/content/case_experiment.tex +++ b/content/case_experiment.tex @@ -1,3 +1,501 @@ %&tex -\chapter{case experiment} -\label{case_experiment} +\chapter{Case Study: Execution} +\label{chap:case_experiment} +This chapter presents the execution of the case study. +Where the goal of the case study is to evaluate the design plan as presented in \autoref{chap:analysis}. +To achieve this goal, I will develop a system according to the design plan and document this design process. +The system to be designed is chosen previously in \autoref{sec:sod}. +Documenting the process is done by following the evaluation protocol as described in \autoref{sec:evaluation_protocol}. +To start the case study unbiased, during the preparation I did perform as little preliminary research as possible on the design options of the "Tweet on a Whiteboard system". + +The chapter begins with the section about the preparation phase, which contains the four corresponding design steps as shown in \autoref{fig:design_plan_analysis}. +This is followed by two completed development cycles in the later two sections. +Both of these sections cover the three steps that are shown in \autoref{fig:design_plan_analysis}. +Each design step is described in a separate subsection. +Herein, the result of the design step is presented and concluded with an evaluation section at the end. +This evaluation section discusses the pairs of questions that were answered according to the evaluation protocol (\autoref{tab:prepost}). +The questions regarding the design method itself are discussed in \autoref{chap:reflection}. + +\section{Preparation Phase} +The preparation phase contains four design steps. +It begins with a problem description. +This description is detailed into a list of specifications. +Based on the specifications, a number of design solutions proposed and eventually one of these solutions is chosen as initial design. +Splitting the initial design into features is done in the feature definition step. + +\subsection{Problem Description} +In the problem description the need for a system can be described as follows: +\begin{itemize} + \item Write a twitter message, or tweet, on a whiteboard. + \item Remove the tweet from the whiteboard. + \item Write the tweet within three minutes on the board. + \item The text must be readable across a meeting room. + \item The solution must contain interesting dynamics. +\end{itemize} + +\subsubsection{Evaluation} +The problem description is very brief, which is not a complete surprise. +As most of the work for the problem description was already done by choosing the subject of design. +However, it was not expected to be this minimal. +Perhaps the most serious disadvantage is the absence of stakeholders. +Normally, a good problem definition focusses on getting the stakeholders on the same line \autocite{shafaat_exploring_2015}. +However, this case study does only have one stakeholder, the author, defeating the purpose getting everyone on the same line. +Creating a more elaborate problem description would not improve the following design process, but it does cost valuable time. + + \subsection{Specifications} + \label{sec:specifications} + The next step is to create specifications based on the problem description. + The goal is to write and remove a tweet on the whiteboard. + Originally a tweet had a character limit of 140, but this was doubled to 280\footnote{\url{https://blog.twitter.com/official/en_us/topics/product/2017/tweetingmadeeasier.html}}. + However, for this system the limit remains at 140 characters. + The text is limited to fifty characters per line, with a total of three lines. + This results in ten extra characters that can be used for word wrapping. + For the readability, the distance to a whiteboard in a meeting room is taken as \SI{4}{\meter}. + The operating speed should allow the tweet to be written within three minutes. + Therefore, the goal is to write one character per second. + The last requirement is to have interesting dynamics. + Looking at simple plotters, they are referred to as 2.5D as the 'third' dimension only describes a binary state. + For this system, the minimum is set to a system that has at least four full states that have to be controlled. + Using \ac{ears} to define these specifications gives: + \begin{enumerate} + \item The Writer shall be able to write at least fifty characters per line. + \item The Writer shall be able to write at least three of text. + \item The Writer shall plot characters with a size that is readable from 4 meters for a person with good eyesight. + \item The Writer shall plot in a regular used font with corresponding character spacing. + \item When a new tweet is send to the Writer, the Writer, shall wipe the existing tweet and write down the new tweet. + \item If the Writer is not wiping or writing then the Writer shall not obstruct the view of the whiteboard. + \item While writing, the Writer shall have a writing speed of at least one character per second. + \item The Writer shall contain at least four states that require control in order to function. + \end{enumerate} + Some other specifications that are related to the operation of the system are: + \begin{enumerate} + \setcounter{enumi}{8} + \item If the Writer is tasked to wipe the tweet, the Writer shall wipe the tweet within sixty seconds + \item When a reset-signal is send to the Writer, the Writer shall recalibrate its position on the board. + \item When a wipe-signal is send to the Writer, the Writer shall wipe the board clean. + \item The Writer shall not damage itself. + \end{enumerate} + + Additionally there are some restrictions on construction. + As the rapid prototyping facilities at the university are closed due to the Covid-19 pandemic, the available tooling in reduced to some hobby/DIY tools: + \begin{itemize} + \item The Writer shall not exceed a total cost in materials and/or tools of €200. + \item The Writer shall be constructed with simple tools in the following list: + \begin{itemize} + \item Screwdrivers (Hex/Inbus, Torx, Philips, etc) in different sizes. + \item Drill + \item Screwtaps + \item Jigsaw + \item Wrenches + \item Soldering iron + \item Various Pliers + \item PLA 3D printer + \end{itemize} + \end{itemize} + \subsubsection{Evaluation} + The specifications step was performed without problems. + Defining the specifications for the problem description did not present any difficulty. + Due to the simplicity of the problem description, there were no contradictory requirements, which would complicate the specifications. + Furthermore, a single stakeholder takes away any negotiation the stakeholders. + + Although the specifications itself are not difficult to define, ensuring that they are complete is difficult. + Team members and stakeholders help to spot any ambiguity or problems with the validity. + \ac{ears} was very useful in this case as it gives a strong template to help avoid ambiguity. + + \subsection{Initial design} + The initial design started with a design space exploration. + The goal was to collect possible solutions and ideas for the implementation. + The exploration resulted in a lot of whiteboard writing robots. + These robots can be sorted in four different configurations + Each configuration explained in the following sections. + From the possible configurations, the optimal configuration that fits the specifications is made into an initial design. + + \subsubsection{Cable-Driven} + The cable-driven robot is suspended with multiple cables. + The end-effector that contains the marker is moved along a board by changing the length of the cables. + The cable-based positioning systems result in a end-effector with a large range and high velocities. + A basic setup can be seen in \autoref{fig:cablebotdrawing}. + This given setup contains two cables that are motorized. + The big advantage of this system is that it scales good, as the cables can have almost any length. + \begin{figure} + \centering + \includegraphics[width=10.8cm]{graphics/cablebot.pdf} + \caption{Planar view of cable driven robot. This setup contains two motorized pulleys in both top corners. From these two cables a mass is suspended at position $x,y$. + By changing the length of the cables, the mass can be moved over along the whole board.} + \label{fig:cablebotdrawing} + \end{figure} + \begin{marginfigure} + \centering + \includegraphics[width=3.74cm]{graphics/cable_angle.pdf} + \caption{Illustrating the limit for horizontal acceleration $a$, for different angles to compensate for gravitational acceleration $g$. + The red arrow represents the acceleration as a result of the pulling force of the cable, which is vectorized in a vertical acceleration that compensates $g$ and a vertical acceleration $a$.} + \label{fig:cable_angle} + \end{marginfigure} + + Although it is possible to achieve high velocities, this system is limited by the gravitational acceleration. + In case of vertical acceleration, the maximum downward acceleration or upward deceleration is limited by \SI{9.81}{\meter\per\second\squared}. + The horizontal acceleration depends on the relative angle of the suspending cable. + The closer the end-effector is below the cable pulley, the lower the vertical acceleration becomes. + \autoref{fig:cable_angle} illustrates the vertical acceleration for different angles. + + A possible solution to this is to add one or two additional wires to the system. + These can pull on the system to 'assist' the gravitational force. + Depending on the implementation, the extra cables make the system over-constrained. + Nevertheless, the extra cables allow for higher acceleration limits in vertical and horizontal direction. + + \subsubsection{Cartesian-coordinate robot} + This configuration is a very common design for plotters and shown in \autoref{fig:plotter}. + This setup is also known as a gantry robot or linear robot. + It normally consists of two sliders, which behave as a prismatic joint. + Because each slider covers a single X or Y axis, the control and dynamics of this system are rather simple. + A bigger challenge is the construction of the system, as the vertical slider has to stay vertical during operation. + Especially the length of this setup makes twisting of the vertical slider more likely. + \begin{figure} + \centering + \includegraphics[width=8.74cm]{graphics/plotter.pdf} + \caption{This Cartesian plotter consists of two horizontal sliders to provide the $x$-movement and one vertical slider to provide the $y$-movement.} + \label{fig:plotter} + \end{figure} + + + \subsubsection{Polar-coordinate robot} + This robot is a combination of a prismatic and a revolute joint. + Where the revolute joint can rotate the prismatic joint as seen in \autoref{fig:polar}. + With this it can reach any point within a radius from rotational joint. + This is a little more complex design than the Cartesian robot. + \begin{figure} + \centering + \includegraphics[width=8.74cm]{graphics/polar.pdf} + \caption{A combination of a revolute joint and a prismatic joint, creating a polar-coordinate robot.} + \label{fig:polar} + \end{figure} + \begin{marginfigure} + \centering + \includegraphics[width=3.74cm]{graphics/polar_protrude.pdf} + \caption{The diagonal lined section shows the part of the protruding area that is used by the arm.} + \label{fig:polar_protrude} + \end{marginfigure} + + This robot has some disadvantages. + The range of the robot is defined by the length of the prismatic joint. + However, if the prismatic joint is fully retracted, the joint does not get shorter. + In that case the arm still protrudes on the other side. + Therefore the complete radius around the revolute joint cannot have any obstacles. + \autoref{fig:polar_protrude} gives an impression of the required area. + Even with this area, the arm cannot reach the complete board. + This makes required space of the setup very inefficient. + Another disadvantage is that a long arm increases the moment of inertia and the gravitational torque quadratically. + Furthermore, the long arm introduces stiffness problems and it amplifies any inaccuracy in the joint. + + \subsubsection{SCARA} + The SCARA robot is a configuration with two linkages that are connected via rotational joints. + It can be compared to a human arm drawing on a table as seen in \autoref{fig:scara}. + Similar to the Polar robot it can reach all points within a radius from the base of the robot. + However, the arm can be configurated to not protrude outside of the board. + If the situation requires the arm to protrude, it is still significantly less than the polar arm (\autoref{fig:polar_protrude}). + Furthermore, depending on the configuration the of the arm the area where it protrudes can be significantly smaller. + However, the additional joint and extra arm length does add to the moment of inertia and gravitational torque similar to the polar robot. + The SCARA is therefore not a robot that is convenient with large working areas. + However, it can be really quick and precise in relative small areas. + \begin{figure} + \centering + \includegraphics[width=8.74cm]{graphics/scara.pdf} + \caption{Schematic example of a SCARA, consisting of two rotation linkages. This setup can be compared to a human arm, where the gray base above the whiteboard represents the shoulder and the connections between both linkages the elbow.} + \label{fig:scara} + \end{figure} + + \subsubsection{Choice of system} + The previous sections have shown four different configurations. + These configurations are compared in \autoref{tab:initial_design}. + Each of the systems are scored on range, dimension, speed, scaling and the interesting dynamics. + The range scores the system on the practical dimension of the system, larger is better. + The cable and cartesian configuration scale very well, the cables or slider rails can be made longer without real difficulty. + The SCARA or polar configuration run into problems with the arm lengths, as forces scale quadratically with their length. + The dimension looks at the number of states that require control and is for all systems defined as 2.5D. + The half dimension is the binary state for the marker on or off the board. + Except for the cable bot, all configurations score sufficient on speed. + The cable bot can be quick, but is limited in acceleration, and depends on the type of cable configuration. + The last one, how interesting or challenging are the dynamics. + The cartesian configuration is trivial, both sliders operate completely separate from each other and the position coordinates can be mapped one to one with the sliders. + For the other configuration, some inverse kinematics are required to get from desired position to the control angles of the system. + + \begin{table}[] + \caption{Table with comparison of the four proposed configurations and a combined configuration of the cable bot and the SCARA.} + \label{tab:initial_design} + \begin{tabular}{l|l|l|l|l|l|} + \cline{2-6} + & Cable bot & Cartesian & Polar & SCARA & Combined \\ \hline + \multicolumn{1}{|l|}{Range} & + + & + & - - & - & + + \\ \hline + \multicolumn{1}{|l|}{Dimension} & 2.5 & 2.5 & 2.5 & 2.5 & 4.5 \\ \hline + \multicolumn{1}{|l|}{Speed} & - & + & + & + + & + \\ \hline + \multicolumn{1}{|l|}{\begin{tabular}[c]{@{}l@{}}Interesting\\ dynamics\end{tabular}} & + & - - & + & + & + + \\ \hline + \end{tabular} + \end{table} + Based on the dimension, all configurations fail to meet the required four state minimum. + By combining two configurations, it is possible to meet the minimum of four states. + To get the best system, I decided to combine a 'speed' and a 'range' configuration. + This results in a system that has both properties. + Combining anything with the cartesian configurations, creates just a moving base for the other configurations. + Together with the trivial dynamics, this option is discarded. + Suspending the SCARA of the polar configuration with cables creates very interesting dynamics, as moving the end-effector also influences the cables. + From both options, the SCARA is quicker and scales better with range than the polar. + Therefore, the SCARA is chosen above the polar configuration to be combined with the cable bot. + The grading for the combined system is shown in the most right column in \autoref{tab:initial_design}. + + \begin{figure} + \centering + \includegraphics[width=10.8cm]{graphics/combined.pdf} + \caption{Combined system that integrates the cable bot together with the SCARA. The SCARA in red is mounted on the carriage in blue. This carriage is then suspended by cables.} + \label{fig:combined} + \end{figure} + In the combined system, the SCARA will only be large enough to write a small number of characters at the time. + This will alternate with the cable bot moving the base of the SCARA to the next position, so that it can write the next set of characters on the whiteboard. + \autoref{fig:combined} shows a simple view of the system. + + \subsubsection{Evaluation} + This was the first step that felt really productive in the design process. + It created a enormous amount of information and insight of the design. + In hind sight, it would have been useful to have this information during the specifications step. + However, as the specifications step are mainly on the "what" to solve, and specifically not on "how" to solve it, this information was avoided on purpose during the specifications step. + + This step did result in a initial design that can be used in the next steps. + However, I noticed that none of the previous steps gave some implementation threshold. + For the problem description and the specifications steps this was a minimum implementation level. + This step was a optimal implementation level, the minimum was reached rather quick. + But at what level of implementation needs this step to be concluded? + A related question: Would a simple dynamic model of the initial design be a useful insight or a waste of time? + + \subsection{Feature Definition} + \label{sec:case_featuredefinition} + At this point there are specifications and an initial design for the system. + In the following steps of the design method features will be implemented one by one. + The goal of this step is then to define these features. + During this step it became clear that this approach was not feasible. + Prior to this step the expectation was that this step would produce three features that could be implemented. + These three features were the SCARA, the cable suspended carriage, and the end-effector. + However, independent of the interpretation of this step, the result was not the three expected features. + + Why were those three features expected in the first place? + During the previous steps a useful evaluation was to anticipate for the subsequent steps. + Where one of the following steps is to implement an individual feature. + Therefore, it must be possible to implement the feature. + Separating the initial design into the smallest components that could still be implemented, resulted in the SCARA, carriage and end-effector. + + The problem is that these three components do not describe the complete system. + Some functions of the system (feature) is performed by a combination of the components. + Therefore can the components in the system not be seen as features of the system. + Defining the components as features of the system is not a solution. + The relations between the components and features is still required. + + %As the features describe the behavior of the components, it is not a solution to replace the features with components. + + A solution to organize the relations between features and components was found in RobMoSys\footnote{\url{https://robmosys.eu/approach/}}. + RobMoSys defines a separation of levels in a design. + Where the levels start functional and moves via software to hardware implementation. + Although not all levels of RobMoSys are used, it was very useful to define the features of the system. + The definition can be seen in \autoref{fig:robmosys} + The current definition of features allows to start the implementation with a component. + When the component is finished features can be implemented by following the tree upwards. + \begin{figure*} + \centering + \includegraphics[width=0.85\linewidth]{graphics/robmosys} + \caption{Feature Definition based on the separation of levels introduced by RobMoSys} + \label{fig:robmosys} + \end{figure*} + + \subsubsection{Evaluation} + Even though there is a feature definition that can be used in the next step, there remain a couple of difficulties. + There is still a really strong border between features and components. + And the single level of components makes it impossible to depict the dependencies between components. + Developing larger and complex systems will have sub-components in the system, introducing even more dependencies. + Therefore, this is not a valid solution for feature definition. + Fortunately the current solution suffices to continue the case study. + + \subsection{Test Protocol} + The last step of the preliminary design is to design tests. + The tests are designed around the specifications. + However, during the creation of the tests it was found that the list of specifications were lacking. + Furthermore, the previous steps did not provide any order of operation. + During this step the order of operation and additional specifications are determined. + + There are two modes of operation: writing and wiping. + The writing operation can be split in the following steps: + \begin{enumerate} + \item Move cable driven carriage to position of characters. + \item Write three characters with the SCARA. + \item Repeat step 1 and 2 till the Tweet is on the board. + \item Move carriage away from the text on the board. + \end{enumerate} + + The other operation is wiping. + This is similar to the operation of writing with the following steps: + \begin{enumerate} + \item Move cable driven carriage to position of characters. + \item Clear the area in reach of the SCARA. + \item Repeat step 1 and 2 till the Tweet is removed from on the board. + \end{enumerate} + Furthermore, switching between the states requires the tool to be switched. + As this is a difficult operation there are not yet requirements or order of operation specified. + + Based on the order of operation, the following specifications were added to the list in \autoref{sec:specifications}: + \begin{enumerate} + \setcounter{enumi}{11} + \item While writing, the SCARA shall have a writing speed of at least 1.5 characters per second. + \item When the Carriage/base of the SCARA is at a static position, the SCARA shall be able to write at least 3 characters at that position. + \item When the SCARA finished writing at their current position, the Carriage shall move the SCARA to it's next position where it can write the subsequent characters. + \item When the SCARA has to be moved to a new position, the Carriage shall perform this movement within 1 second. + \end{enumerate} + These additional specifications are also based on the combined system decission that was made in section \autoref{sec:initialdesign}. + These specifications distribute responsibility between sub-components. + + With the updated specifications it was possible to create a number of test cases. + In total there are five small test cases and four large test cases. + The small tests cover a sub-system and the large tests apply on the complete systems. + Each tests has a list of specifications that are covered with the test and for smaller tests the subsystem under test is also determined. + With a short description it is described how the test should be performed. + + One of the small tests is performed by drawing a square: + \begin{test} + \begin{description} + \item[Coverage] SCARA + \item[Specifications] 3, 7, 11, 13 + \item[Description] + The SCARA must draw a square of at least \SI{50}{\milli\meter} high and \SI{70}{\milli\meter} wide. + This box is large enough to draw at least 3 characters. + This square should be drawn within one second. + If it is slower than that, it is not able to achieve specification 7. + \end{description} + \end{test} + Repeatability is tested in one of the large system wide tests: + \begin{test} + \begin{description} + \item[Coverage] All features + \item[Specifications] 3, 4, 9, 11 + \item[Description] + To test the repeatability of the system must do four things: + \begin{itemize} + \item The system will be reset. + \item Draw multiple squares (\SI{60}{\milli\meter} x \SI{60}{\milli\meter}) at a random position within the drawing range (\SI{1000}{\milli\meter} x \SI{300}{\milli\meter}). + \item The system will be reset again. + \item Then in a random order, at least different from the order of squares, a circle with a \SI{55}{\milli\meter} diameter must to be drawn inside the squares. + \end{itemize} + The test is successful if the circles are not drawn outside of the squares. + \end{description} + \end{test} + + \subsubsection{Evaluation} + This step was completed with not many difficulties. + The specific order of operation and extra specifications should not be part of this step. + It was already concluded that the steps in the preliminary design were not as expected. + The fact that this step resulted in an additional changes only adds to that conclusion. + + The design of the test cases resulted in valuable information about the system. + This information would be very useful in an earlier stage of the preliminary design. + + + \subsection{Recap} + During the problem definition and the specifications step it was difficult to stay within the "what" has to be solved and not go into the "how" it has to be solved. + Furthermore, + The test definitions of the last step conclude the preliminary design phase. + This preliminary design shows a clear notion of a hasty execution from a design standpoint. + The preliminary design was performed over a period of 5 weeks, by one developer with little experience in design documentation. + This makes notion of hasty not surprising for this unproven design method. + That does not mean that this preliminary design is a waste of time. + From the evaluation moments during the preliminary phase there are a couple of interesting points. + \begin{itemize} + \item The lack of a design team with experienced engineers would drastically improve the execution of this design phase. + Such a team is also able to find the smaller problems of such a design phase, which are currently completely overlooked. + \item It is not possible to view each step in the design process as singular. + Each step creates more insight and information about the final design. + Making a very strong separation between the steps forces the developer to make decisions on to little information. + \item The term features has to be split in to functions and components for a hardware design. + The actual implementation are the components such that they can perform the function. + \end{itemize} + + Another point was noticed while evaluation the complete preliminary design phase. + The lack of a team makes it easy to forget documenting intuitive design decisions. + Although the design method is followed as closely as possible, it often occurs that a decision is made outside of the working environment. + This was noticed during the writing of this chapter that some design decisions were completely missing. + However, during the next phase, these decisions do play a crucial role. + Therefore, this section will give a short recap of the planned design. + + \subsubsection{Complete system} + From the initial design the abstract shape of the design is clear. + This is still in line with \autoref{fig:general_design}. + The SCARA is small and can therefore move the arm quick with a fine precision. + At the end of the SCARA there is a end-effector that can grab, hold, end release tool. + It holds a marker while writing and with help of the SCARA it can release the marker. + Then it can grab a cleaning tool to erase whiteboard. + To compensate for the small reach of the SCARA, the SCARA will be mounted to a carriage. + This carriage is suspended from cables and can move along the whiteboard. + The cables give the system a enormous range and velocity. + However, it is not very good in acceleration as cables cannot push. + This makes it suitable for the large and course movements along the board, which complements the movement characteristics of the SCARA. + + + + \subsubsection{SCARA} + The central component of the system is the SCARA. + There are a couple of design options for the SCARA. + As the dynamic complexity is a important part of this design, there will be two arms. + There are some different options for the configuration of the arms and their actuation. + \autoref{fig:configurations} shows four of the possible configurations that are considered during the design phase. + There are still options about where to place the motors and how to connect the joints. + \rrot{Figure needs some graphic improvement} + %\begin{figure} + % \centering + % \includegraphics[width=\linewidth]{graphics/IMG_20201001_134140.jpg} + % \caption{Four different SCARA configurations} + % \label{fig:configurations} + %\end{figure} + + \subsubsection{End-effector} + The end-effector is the connection between the SCARA and the tool. + It has two main functions: lifting the tool from the board and switching the tool. + The tool switching functionality is performed by the SCARA as well, by moving the end-effector to the right position. + However, the role of the SCARA is strongly dependent\footnote{ Note, that this dependency exists but not represented in \autoref{fig:robmosys} due to the limitation of the current method.} on how the end-effector is implemented. + For the grabbing function there is a configuration that uses a spring-loaded clamp. + Where one side of the clamp is longer so it can be opened by moving the SCARA. + This operation is shown in \autoref{fig:gripper} + %\begin{figure*} + % \centering + % \includegraphics[width=\linewidth]{graphics/IMG_20201001_144018.jpg} + % \caption{Operation principle of a spring-loaded tool clamp showed from left to right. The green circle represents the tool and the red arm a tool holder. The solid ground is what pushed the upper arm open so the marker can be placed in the tool holder.} + % \label{fig:gripper} + %\end{figure*} + + Another dynamically simpler option is to open the clamp with a motor. + The motor adds weight to the end-effector which might require the SCARA to operate slower or to be build stronger. + This component is probably the most difficult one because it requires clamping of the tools. + Modeling this behavior is difficult as it will involve contact dynamics. + + \subsubsection{Cable driven Carriage} + The end-effector and the SCARA are moved all together on a carriage. + The carriage will be suspended from two or four cables. + A configuration with two cables is the simplest. + However, the tension in this system is generated by the gravitational pull. + This introduces limitations in the acceleration of the system. + If the carriage moves upwards and the cable pulleys stop. + The carriage is only decelerated by the force of gravity. + Moving over its set point, followed by crashing down in to the cables. + + However, making the system with four motorized pulleys makes the system over constrained. + This will solve the acceleration problem. But it will create a difficult positioning system. + As all the wires have to be tensioned but not distort the movement by restricting the other motors. + + \subsubsection{Electronics} + Although this mainly is a hardware design, there is going to be some control-software. + For this the likely option is a STM nucleo board with RIOT-OS as a embedded OS. + This choice is mainly because of previous experience and local knowledge of the operating system. + + +\section{First Development Cycle} + \subsection{Feature Selection} + \subsection{Rapid Development} + \subsection{Variable Approach} + +\section{Second Development Cycle} + \subsection{Feature Selection} + \subsection{Rapid Development} + \subsection{Variable Approach} + diff --git a/content/case_method.tex b/content/case_method.tex index 2869741..c76f1a3 100644 --- a/content/case_method.tex +++ b/content/case_method.tex @@ -9,6 +9,7 @@ The last important thing is a subject of design that is developed in the case st The next sections present the evaluation protocol and the subject of design. \section{Evaluation Protocol} +\label{sec:evaluation_protocol} The evaluation protocol ensures that the different steps, decisions and changes of the design are consistently evaluated. This protocol contains a questionnaire and model validation. The full questionnaire is administered during each step in the design plan. @@ -83,6 +84,7 @@ The next sections present the evaluation protocol and the subject of design. The prototype does not only show where the design process went wrong, it can also be used to improve the design plan to prevent these modeling problems. \section{Subject of Design} +\label{sec:sod} The choice in subject of design has a strong influence on the effectiveness of the evaluation of the design plan. To ensure the best subject of design a list of requirements is composed. Based on this list the best subject of design is a "Tweet on a whiteboard writer", which is referred to as system. diff --git a/graphics/cable_angle.tex b/graphics/cable_angle.tex new file mode 100644 index 0000000..36aaa1b --- /dev/null +++ b/graphics/cable_angle.tex @@ -0,0 +1,55 @@ +%&tex +\documentclass{standalone} +\usepackage{tikz} +\usepackage{siltex} +\usetikzlibrary {arrows.meta,positioning} +\usepackage{gensymb} +\input{graphics/tics.tikz} + +\begin{document} +\begin{tikzpicture}[thick, on grid, x = 2.16cm, y = 2.16cm, >=Stealth] + + %Whiteboard + \def \smallangle {30} + \filldraw[gray] (0,0) -- (0.4,0) arc [start angle=0, end angle=\smallangle, radius=0.4] -- cycle; + \node at ({cos(\smallangle/2)*0.6},{sin(\smallangle/2)*0.6}) {$\smallangle\degree$}; + \draw[->] (0,0) -- (0,1); + \node at (0.1,1) {$g$}; + \draw[->,red] (0,0) -- ({cos(\smallangle)/sin(\smallangle)},1); + \draw[->] (0,0) -- ({cos(\smallangle)/sin(\smallangle)},0); + \node at ({cos(\smallangle)/sin(\smallangle)},-0.1) {$a$}; + \draw (0,0) pic {masspoint}; + + \begin{scope}[shift={(0,1.4)}] + \def \smallangle {60} + \filldraw[gray] (0,0) -- (0.4,0) arc [start angle=0, end angle=\smallangle, radius=0.4] -- cycle; + \node at ({cos(\smallangle/2)*0.6},{sin(\smallangle/2)*0.6}) {$\smallangle\degree$}; + \draw[->] (0,0) -- (0,1); + \node at (0.1,1) {$g$}; + \draw[->,red] (0,0) -- ({cos(\smallangle)/sin(\smallangle)},1); + \draw[->] (0,0) -- ({cos(\smallangle)/sin(\smallangle)},0); + \node at ({cos(\smallangle)/sin(\smallangle)},-0.1) {$a$}; + \draw (0,0) pic {masspoint}; + \end{scope} + + + % \fill[pattern = north east lines] ($ (0,0) + (-1,0) $) rectangle ($ (0,0) + (1,0.5) $); + % \draw[thick] ($ (0,0.5) + (-1,0) $) -- ($ (0,0.5) + (1,0) $); + % + % %draw arm and joints + % \fill (0,0.5) circle (0.2); + % \draw[thick] (0,0.5) to node[midway,right,draw=none] {$a$} (-1.5,3.5); + % \fill (-1.5,3.5) circle (0.2); + % \draw[thick] (-1.5,3.5) to node[midway,above,draw=none] {$b$}(1.51,4.26); + % + % %draw mass + % \draw (1.7,4.32) circle (0.2) node {$m$}; + % + % %draw arc + % %\draw[dashed,gray] (-1.5,3.5) -- ++(2.5,0); + % %\draw (1,0.5) arc (0:116:1cm) node[above,midway] {$\theta$}; + + % %\draw [arrow] (c.south) -- +(0,-1cm) node[midway,right,draw=none] {$F_{g} = m \cdot g$}; +\end{tikzpicture} +\end{document} + diff --git a/graphics/cablebot.tex b/graphics/cablebot.tex new file mode 100644 index 0000000..c95dcdb --- /dev/null +++ b/graphics/cablebot.tex @@ -0,0 +1,24 @@ +%&tex +\documentclass{standalone} +\usepackage{tikz} +\usepackage{siltex} +\usetikzlibrary {arrows.meta,positioning} +\input{graphics/tics.tikz} + +\begin{document} +\begin{tikzpicture}[thick, on grid, x = 2.16cm, y = 2.16cm] + %Whiteboard + \draw (0,0.5) pic {whiteboard}; + \draw (0,3) -- (1.5,1); + \draw (4,3) -- (1.5,1); + \draw (0,3) pic {pulley}; + \begin{scope}[x=-2.16cm] + \draw(-4,3) pic {pulley}; + \end{scope} + + %Draw mass with coordinates + \draw (1.5,1) pic {masspoint}; + \node at (1.8,0.8) {$x,y$}; +\end{tikzpicture} +\end{document} + diff --git a/graphics/combined.tex b/graphics/combined.tex new file mode 100644 index 0000000..c20b477 --- /dev/null +++ b/graphics/combined.tex @@ -0,0 +1,26 @@ +%&tex +\documentclass{standalone} +\usepackage{tikz} +\usepackage{siltex} +\usetikzlibrary {arrows.meta,positioning} +\usetikzlibrary{calc,patterns} +\input{graphics/tics.tikz} + +\begin{document} +\begin{tikzpicture}[thick, >=Stealth, on grid, y=2.16cm, x=2.16cm] + \def \x {0.45}; + \def \y {0.35}; + \def \posx {1.7}; + \def \posy {1.2}; + \def \beta {-120}; + \def \alpha {130}; + \draw (0,0.5) pic {whiteboard}; + \draw (0,3) -- (\posx-\x,\posy+\y); + \draw (4,3) -- (\posx+\x,\posy+\y); + \draw (0,3) pic {pulley}; + \begin{scope}[x=-2.16cm] + \draw(-4,3) pic {pulley}; + \end{scope} + \draw (1.7,1.2) pic {scara}; +\end{tikzpicture} +\end{document} diff --git a/graphics/plotter.tex b/graphics/plotter.tex new file mode 100644 index 0000000..3315ed6 --- /dev/null +++ b/graphics/plotter.tex @@ -0,0 +1,23 @@ +%&tex +\documentclass{standalone} +\usepackage{tikz} +\usepackage{siltex} +\usetikzlibrary {arrows.meta,positioning} +\input{graphics/tics.tikz} + +\begin{document} +\begin{tikzpicture}[thick, on grid, x = 2.16cm, y = 2.16cm, >=Stealth] + \draw(0,-0.1) pic {rail}; + \draw(0,2.6) pic {rail}; + \draw(0,0) pic {whiteboard}; + \begin{scope}[shift={(1,0)}] + \draw[fill=gray!60] (-0.05,-0.1) rectangle (0.05,2.6); + \draw[<->] (-0.3,-0.2) -- node[midway,below]{$x$} (0.3,-0.2); + \begin{scope}[shift={(0,1.7)}] + \draw[fill=gray!80] (-0.12,-0.15) rectangle (0.12,0.15); + \draw[<->] (0.25,-0.25) -- node[midway,right]{$y$} (0.25,0.25); + \end{scope} + \end{scope} +\end{tikzpicture} +\end{document} + diff --git a/graphics/polar.tex b/graphics/polar.tex new file mode 100644 index 0000000..80fe6cf --- /dev/null +++ b/graphics/polar.tex @@ -0,0 +1,22 @@ +%&tex +\documentclass{standalone} +\usepackage{tikz} +\usepackage{siltex} +\usetikzlibrary {calc,arrows.meta,positioning,patterns} +\input{graphics/tics.tikz} + +\begin{document} +\begin{tikzpicture}[thick, on grid, x = 2.16cm, y = 2.16cm, >=Stealth] + \draw(-2,-2.75) pic {whiteboard}; + %\filldraw[pattern = north west lines, pattern color=gray!60,draw=none] (-2,0) -- (2,0) arc[start angle = 0, end angle = 180, radius=2] -- cycle; + \draw[fill=gray] (0,0) circle (0.2); + \begin{scope}[rotate=45,shift={(-1,0)}] + \draw[fill=gray!60] (-1,0.05) rectangle (1.5,-0.05); + \draw[<->] (-0.2,0.15) -- node[midway,above]{$r$} (-0.8,0.15); + \begin{scope}[shift={(-0.3,0)}] + \draw[<->] ({0.8*cos(160)},{0.8*sin(160)}) arc[start angle = 160, end angle= 200, radius = 0.8] node[midway, below left]{$\Phi$}; + \end{scope} + \end{scope} +\end{tikzpicture} +\end{document} + diff --git a/graphics/polar_protrude.tex b/graphics/polar_protrude.tex new file mode 100644 index 0000000..a96014f --- /dev/null +++ b/graphics/polar_protrude.tex @@ -0,0 +1,23 @@ +%&tex +\documentclass{standalone} +\usepackage{tikz} +\usepackage{siltex} +\usetikzlibrary {calc,arrows.meta,positioning,patterns} +\input{graphics/tics.tikz} + +\begin{document} +\begin{tikzpicture}[thick, on grid, x = 1.16cm, y = 1.16cm, >=Stealth] + \clip[draw=none] (-0.7,-0.9) rectangle (2.12,2.2); + \draw(-2,-2.75) pic {whiteboard}; + \filldraw[pattern = north west lines, pattern color=gray!60,draw=gray!60] (-2.1,0) -- (2.1,0) arc[start angle = 0, end angle = 180, radius=2.1] -- cycle; + \draw[fill=gray] (0,0) circle (0.2); + \begin{scope}[rotate=60,shift={(0.5,0)}] + \draw[fill=gray!60] (-1,0.05) rectangle (1.5,-0.05); + \draw[<->] (0.2,0.15) -- node[midway,above left]{$r$} (0.8,0.15); + \begin{scope}[shift={(-0.3,0)}] + \draw[<->] ({0.8*cos(160)},{0.8*sin(160)}) arc[start angle = 160, end angle= 200, radius = 0.8] node[midway, below left]{$\Phi$}; + \end{scope} + \end{scope} +\end{tikzpicture} +\end{document} + diff --git a/graphics/robmosys.tex b/graphics/robmosys.tex new file mode 100644 index 0000000..27b040e --- /dev/null +++ b/graphics/robmosys.tex @@ -0,0 +1,64 @@ +\documentclass{standalone} +\usepackage{tikz} +\usepackage{siltex} +\usetikzlibrary {arrows.meta,positioning} + +\begin{document} + +\begin{tikzpicture}[on grid,y=1.5cm,x=2.24cm, nodes={text height=.7em, text width=1.8cm, align=center, +draw=black!20, thick, fill=white, font=\footnotesize}, +>={Stealth[round,sep]}, rounded corners, semithick] + \node (a) at (0,0) {Mission}; + \node (b) at (0,-1) {Task}; + \node (c) at (0,-2) {Skill}; + \node (d) at (0,-3) {Function}; + \node (e) at (0,-4) {Component}; + + \begin{scope}[shift={(2.596cm,0)}] + %\draw[fill=lightgray] (-0.6, 0.4) rectangle (4.6,-3.4); + \node (A) at (2.5,0) {Draw a tweet on a board}; + \node (B) at (2,-1) {Writing}; + \node (C) at (3,-1) {Wiping}; + \node (D) at (0,-2) {Write char at position}; + \node (E) at (1,-2) {Wipe area}; + \node (F) at (2,-2) {Hold Marker}; + \node (G) at (3,-2) {Hold Wiper}; + \node (H) at (4,-2) {Move to Position}; + \node (I) at (0,-3) {Move Marker on Board}; + \node (J) at (1,-3) {Move Wiper on Board}; + \node (K) at (2,-3) {Switch Tools}; + \node (L) at (3,-3) {Lift Marker}; + \node (M) at (4,-3) {More Carriage}; + \node (N) at (1,-4) {SCARA}; + \node (O) at (2.5,-4) {End-effector}; + \node (P) at (4,-4) {Cable driven Carriage}; + \end{scope} + \path[->] (A) edge (B) + (A) edge (C) + (B) edge (D) + (B) edge (H) + (C) edge (E) + (B) edge (F) + (C) edge (G) + (D) edge (I) + (D) edge (L) + (E) edge (J) + (F) edge (K) + (G) edge (K) + (H) edge (M) + (a) edge (b) + (b) edge (c) + (c) edge (d); + \path[->,dashed] + (I) edge (N) + (J) edge (N) + (K) edge (N) + (K) edge (O) + (L) edge (O) + (M) edge (P) + (d) edge (e); + + + +\end{tikzpicture} +\end{document} diff --git a/graphics/scara.tex b/graphics/scara.tex new file mode 100644 index 0000000..06c7147 --- /dev/null +++ b/graphics/scara.tex @@ -0,0 +1,32 @@ +%&tex +\documentclass{standalone} +\usepackage{tikz} +\usepackage{siltex} +\usetikzlibrary {arrows.meta,positioning} +\usetikzlibrary{calc,patterns} +\input{graphics/tics.tikz} + +\begin{document} +\begin{tikzpicture}[>=Stealth, on grid, y=2.16cm, x=2.16cm] + + \draw(0,0) pic {whiteboard}; + \begin{scope}[shift={(2,2.8)}] + \draw[fill=gray] (0,0) circle (0.2); + \begin{scope}[rotate=-60, rounded corners] + \draw[fill=gray!60](-0.075,-0.075) rectangle (1.5,0.075); + \begin{scope}[shift={(0.8,0)}] + \draw[<->] ({0.8*cos(20)},{0.8*sin(20)}) arc[start angle = 20, end angle= -20, radius = 0.8] node[midway, below right]{$\alpha$}; + \end{scope} + \begin{scope}[shift={(1.44,0)}] + \begin{scope}[rotate=-104] + \draw[fill=gray!60](-0.075,-0.075) rectangle (1.5,0.075); + \begin{scope}[shift={(0.8,0)}] + \draw[<->] ({0.8*cos(20)},{0.8*sin(20)}) arc[start angle = 20, end angle= -20, radius = 0.8] node[midway, left]{$\beta$}; + \end{scope} + \end{scope} + \end{scope} + \end{scope} + \end{scope} +\end{tikzpicture} +\end{document} + diff --git a/graphics/tics.tikz b/graphics/tics.tikz new file mode 100644 index 0000000..5a376d6 --- /dev/null +++ b/graphics/tics.tikz @@ -0,0 +1,37 @@ + +\tikzset{ + pulley/.pic= + { + \draw (0,0) -- (-0.3,0); + \draw (-0.3,-0.2) circle [radius=0.2]; + \draw (-0.3,-0.2) circle [radius=0.04]; + }, + whiteboard/.pic= + { + \draw[line width=1mm, color=gray, fill=lightgray!70] (0,0) rectangle (4,2.5); + }, + masspoint/.pic= + { + \draw[fill=white] (0,0) circle (0.2) node {m}; + }, + rail/.pic= + { + \draw[fill=gray!60] (0,0.05) rectangle (4,-0.05); + }, + scara/.pic= + { + \def \wall {0.05}; + \draw[fill=gray!60,rounded corners] ({-\x-\wall},{-\y-\wall}) rectangle ({\x+\wall},{\y+\wall}); + \draw[fill=lightgray!70,rounded corners] ({-\x},{-\y+\wall}) rectangle ({\x},{\y}); + \begin{scope}[shift={(-\x/2,-\y+\wall/2)},rotate=\alpha, x=7mm, y=7mm] + \draw[fill=red](-0.1,-0.1) rectangle (1.6,0.1); + \begin{scope}[shift={(1.65,0)}] + \begin{scope}[rotate=\beta] + \draw[fill=red](-0.1,-0.1) rectangle (1.4,0.1); + \draw[fill=red](1.4,0) circle (0.2); + \end{scope} + \end{scope} + \end{scope} + } +} + From fd9be5d645c40f3d67da350c3c106f7d0207dac5 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Mon, 7 Dec 2020 17:31:52 +0100 Subject: [PATCH 02/47] Add test protocol as step. --- content/analysis.tex | 48 +++++++++++++++---------------- graphics/design_flow_analysis.tex | 10 ++++--- 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/content/analysis.tex b/content/analysis.tex index 777da0c..975fa03 100644 --- a/content/analysis.tex +++ b/content/analysis.tex @@ -44,11 +44,8 @@ The steps that are introduced by \ridm are covered in more detail. To find the best solution it is important to explore the different solutions and design space. Often, there are many possible alternatives but they must be narrowed down to the solutions that fit within the schedule and available resources. The best alternative is materialized in a design document together with the system requirements. - To verify that the system works in line with the system requirements, a test protocol is written for the system. - This protocol explains how the tests are preformed and what the pass conditions are. This design document is used in the next phase of the design. - \section{Rapid Iterative Design Method} From this point, the design plan is based on the \ridm and not anymore on the waterfall model. The first step is the feature definition, which prepares the required features based on the initial design. @@ -56,13 +53,20 @@ The steps that are introduced by \ridm are covered in more detail. The definition of the feature contains a description and a set of sub-requirements which is used to implement and test the feature. During the feature definition, the dependencies, risks and time resources are determined as well, this establishes the order of implementation in the feature selection step. - The second step is the feature selection, where one of the features is selected. - This selection is based on the dependencies, risk, and time requirements in the feature definitions. - The third step is the rapid development cycle, which uses the sub-requirements and description of the selected feature to create an initial design, a minimal implementation and tests. - In the last step, the variable detail approach is used to add detail to the minimal implementation over multiple iterations. + Based on the requirements of \ridm as explained in \autoref{chap:background}, the next step is the feature selection. + However, it became apparent that the number of tests related to a specific feature is a good metric for the selection step. + Because, at the point that a feature is implemented, the tests are completed as well, and when the tests of the complete system pass, the system meets the specifications. + Following the \ridm, these tests are specified at the start of the rapid development cycle. + This makes it impossible to use the tests during the feature selections. + Therefore, a test protocol step is added after the feature definition and before the feature selection step. + + The third step is the feature selection, where one of the features is selected. + This selection is based on the dependencies, tests, risk, and time requirements in the feature definitions. + The fourth step is the rapid development cycle, which uses the sub-requirements and description of the selected feature to create an initial design and a minimal implementation. + In the last step, the variable detail approach is used to add detail to the minimal implementation over the course of multiple iterations. The tests are used to determine if the added detail does not introduce any unexpected behavior. This cycle of adding detail and testing is repeated till the feature is fully implemented. - From this point, the \ridm is repeated from the second step until all features are implemented. + From this point, the \ridm is repeated from the third step until all features are implemented. \subsection{Feature Definition} \label{sec:featuredefinition} @@ -71,9 +75,6 @@ The steps that are introduced by \ridm are covered in more detail. To achieve these short cycles, the features that are implemented in these cycles, are as small as possible. However, the features must still be implemented and tested individually during the implementation and can thus not be split indefinitely. Together with the definition of the features, the requirements are divided along the features as well. - During the initial design, a test protocol is made to evaluate the system-wide specifications. - For the feature requirements, tests are added to the test protocol as well. - These tests only require the corresponding feature to be implemented and must all pass to finish the implementation of the feature. The optimal strategy on splitting features and specifications is strongly dependent on the type of system. Therefore, the best engineering judgement of the developer the best tool available. @@ -95,7 +96,14 @@ The steps that are introduced by \ridm are covered in more detail. Due to these dependencies it is possible that the division of requirements changes, because the result of the implemented feature was not as expected. This is not directly a problem, but a good administration of the requirements makes an update of these requirements easier. - +\subsection{Test protocol} + \label{sec:systemtesting} + During the rapid development cycle and the variable detail approach, the system is tested constantly. + This is to make sure that the design still performs as expected. + The tests are based on the specifications. + Each specification must be covered with at least one test. + The tests consist of a description which specifies how to perform the test and what the result of the test must of must not be. + Together with the description, there is a list of required features to perform the test and a list of specifications that are met if the test passes. \subsection{Feature Selection} \label{sec:feature_selection} @@ -194,15 +202,6 @@ The electrical motors have also internal states, but store significantly less en An basic model would in this case only consists of the arms, possibly even without any dynamic behavior. The dynamic behavior, motor characteristics, resistance, or gravitational force are examples of detail elements that can be added to increase the detail. -Now with initial design and the basic model, all that is left is to describe a list of tests. -The goal of these tests is to verify if the design meets the specifications of the feature. -The tests have a short description on how to perform the tests and what should be achieved. -It is important that all the specifications are covered by at least one test. -This relatively simple approach of testing is possible due to the limited scope of this thesis. -For a complexer design, the testing needs to be automated. -The \ac{amt} \autocite{jansen_automated_2019} is an interesting method to perform the testing of the models. -However, at the time of writing, the software is in a proof of concept state and not usable for this thesis. - \subsection{Variable Detail Approach} With the variable detail approach the basic model is developed into a refined model of the feature. This is done by implementing the detail elements over the course of multiple iterations. @@ -233,7 +232,7 @@ The developer must evaluate if there are feasible alternatives left for this ele When all detail elements are implemented and the basic model has evolved into a refined model of the feature, the design cycle moves back to the feature selection. In the case that this is the last feature to implement, this concludes the development. -\section{Summation} +\section{Summary of Design Plan} \begin{marginfigure} \centering \includegraphics[width=6cm]{graphics/design_flow_analysis.pdf} @@ -241,11 +240,12 @@ In the case that this is the last feature to implement, this concludes the devel \label{fig:design_plan_analysis} \end{marginfigure} The waterfall model from \ac{se} and the \ridm \autocite{broenink_rapid_2019} are combined to create the design plan as shown in \autoref{fig:design_plan_analysis}. -The first four steps of the design process form the preparation phase: problem description, specifications, initial design, and feature definition. +The first five steps of the design process form the preparation phase: problem description, specifications, initial design, feature definition, and test protocol. The initial design step creates a holistic design based on the prior problem description and specifications step. The last step of the preparation is the feature definition, where the initial design is split into different features. The resulting initial design and its features together form the design proposal for the development steps. -The development step consists of the feature selection, rapid development, and variable detail steps. +The last step of the preparation phase is the test protocol step, where the tests are defined to monitor the design process and validate that the system meets the specifications. +The development cycle consists of the feature selection, rapid development, and variable detail steps. These three steps are applied to each feature in the initial design individually. With each iteration of the development cycle a new feature is added to the complete system. diff --git a/graphics/design_flow_analysis.tex b/graphics/design_flow_analysis.tex index 43301cd..dc73fd5 100644 --- a/graphics/design_flow_analysis.tex +++ b/graphics/design_flow_analysis.tex @@ -8,13 +8,14 @@ draw=black!50, thick, font=\footnotesize, fill=white}, \begin{document} \begin{tikzpicture}[on grid,y=1.2cm,x=3.2cm] - \draw[fill=lightgray] (-1.7cm, 1.5cm) rectangle (1.7cm, -4.1cm); - \draw[fill=lightgray] (-1.7cm,-4.3cm) rectangle (5cm, -8.2cm); + \draw[fill=lightgray] (-1.7cm, 1.5cm) rectangle (1.7cm, -5.3cm); + \draw[fill=lightgray] (-1.7cm,-5.5cm) rectangle (5cm, -9.2cm); \node (pd) {Problem Description}; \node (sp)[below=1 of pd] {Specifications}; \node (id)[below=1 of sp] {Initial Design}; \node (fs)[below=1 of id] {Feature Definition}; - \node (ss)[below=1 of fs] {Feature Selection}; + \node (tp)[below=1 of fs] {Test Protocol}; + \node (ss)[below=1 of tp] {Feature Selection}; \node (a1)[below=0.8 of ss,draw=none, fill=none] {}; \node (rd)[below=0.8 of a1] {Rapid Development}; \node (va)[right=1 of a1] {Variable Approach}; @@ -23,7 +24,8 @@ draw=black!50, thick, font=\footnotesize, fill=white}, \path[->] (pd) edge (sp) (sp) edge (id) (id) edge (fs) - (fs) edge (ss) + (fs) edge (tp) + (tp) edge (ss) (ss) edge (rd) (rd.east) edge[bend right] (va) (va) edge[bend right] (ss.east); From 629cd8ad772a5d998135ea69bd80b9e62b3b0eb1 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Tue, 8 Dec 2020 14:07:46 +0100 Subject: [PATCH 03/47] Update submodule --- include | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include b/include index 53a54d3..c875326 160000 --- a/include +++ b/include @@ -1 +1 @@ -Subproject commit 53a54d3e4842e0ad2991fe196a02c8e35cbc2600 +Subproject commit c875326fd17b40f70a50ab641868fdbb1036c14d From 1bbe08bbb4e4faaf79a2d0646104dbb87d5ba5c4 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Tue, 8 Dec 2020 16:15:59 +0100 Subject: [PATCH 04/47] Split chapter in multiple files --- content/case_experiment.tex | 471 +----------------- .../case_experiment_feature_definition.tex | 46 ++ content/case_experiment_initial_design.tex | 163 ++++++ .../case_experiment_problem_description.tex | 19 + content/case_experiment_recap.tex | 96 ++++ content/case_experiment_specifications.tex | 60 +++ content/case_experiment_test_protocol.tex | 82 +++ 7 files changed, 472 insertions(+), 465 deletions(-) create mode 100644 content/case_experiment_feature_definition.tex create mode 100644 content/case_experiment_initial_design.tex create mode 100644 content/case_experiment_problem_description.tex create mode 100644 content/case_experiment_recap.tex create mode 100644 content/case_experiment_specifications.tex create mode 100644 content/case_experiment_test_protocol.tex diff --git a/content/case_experiment.tex b/content/case_experiment.tex index 17a621a..89c73dd 100644 --- a/content/case_experiment.tex +++ b/content/case_experiment.tex @@ -23,471 +23,12 @@ This description is detailed into a list of specifications. Based on the specifications, a number of design solutions proposed and eventually one of these solutions is chosen as initial design. Splitting the initial design into features is done in the feature definition step. -\subsection{Problem Description} -In the problem description the need for a system can be described as follows: -\begin{itemize} - \item Write a twitter message, or tweet, on a whiteboard. - \item Remove the tweet from the whiteboard. - \item Write the tweet within three minutes on the board. - \item The text must be readable across a meeting room. - \item The solution must contain interesting dynamics. -\end{itemize} - -\subsubsection{Evaluation} -The problem description is very brief, which is not a complete surprise. -As most of the work for the problem description was already done by choosing the subject of design. -However, it was not expected to be this minimal. -Perhaps the most serious disadvantage is the absence of stakeholders. -Normally, a good problem definition focusses on getting the stakeholders on the same line \autocite{shafaat_exploring_2015}. -However, this case study does only have one stakeholder, the author, defeating the purpose getting everyone on the same line. -Creating a more elaborate problem description would not improve the following design process, but it does cost valuable time. - - \subsection{Specifications} - \label{sec:specifications} - The next step is to create specifications based on the problem description. - The goal is to write and remove a tweet on the whiteboard. - Originally a tweet had a character limit of 140, but this was doubled to 280\footnote{\url{https://blog.twitter.com/official/en_us/topics/product/2017/tweetingmadeeasier.html}}. - However, for this system the limit remains at 140 characters. - The text is limited to fifty characters per line, with a total of three lines. - This results in ten extra characters that can be used for word wrapping. - For the readability, the distance to a whiteboard in a meeting room is taken as \SI{4}{\meter}. - The operating speed should allow the tweet to be written within three minutes. - Therefore, the goal is to write one character per second. - The last requirement is to have interesting dynamics. - Looking at simple plotters, they are referred to as 2.5D as the 'third' dimension only describes a binary state. - For this system, the minimum is set to a system that has at least four full states that have to be controlled. - Using \ac{ears} to define these specifications gives: - \begin{enumerate} - \item The Writer shall be able to write at least fifty characters per line. - \item The Writer shall be able to write at least three of text. - \item The Writer shall plot characters with a size that is readable from 4 meters for a person with good eyesight. - \item The Writer shall plot in a regular used font with corresponding character spacing. - \item When a new tweet is send to the Writer, the Writer, shall wipe the existing tweet and write down the new tweet. - \item If the Writer is not wiping or writing then the Writer shall not obstruct the view of the whiteboard. - \item While writing, the Writer shall have a writing speed of at least one character per second. - \item The Writer shall contain at least four states that require control in order to function. - \end{enumerate} - Some other specifications that are related to the operation of the system are: - \begin{enumerate} - \setcounter{enumi}{8} - \item If the Writer is tasked to wipe the tweet, the Writer shall wipe the tweet within sixty seconds - \item When a reset-signal is send to the Writer, the Writer shall recalibrate its position on the board. - \item When a wipe-signal is send to the Writer, the Writer shall wipe the board clean. - \item The Writer shall not damage itself. - \end{enumerate} - - Additionally there are some restrictions on construction. - As the rapid prototyping facilities at the university are closed due to the Covid-19 pandemic, the available tooling in reduced to some hobby/DIY tools: - \begin{itemize} - \item The Writer shall not exceed a total cost in materials and/or tools of €200. - \item The Writer shall be constructed with simple tools in the following list: - \begin{itemize} - \item Screwdrivers (Hex/Inbus, Torx, Philips, etc) in different sizes. - \item Drill - \item Screwtaps - \item Jigsaw - \item Wrenches - \item Soldering iron - \item Various Pliers - \item PLA 3D printer - \end{itemize} - \end{itemize} - \subsubsection{Evaluation} - The specifications step was performed without problems. - Defining the specifications for the problem description did not present any difficulty. - Due to the simplicity of the problem description, there were no contradictory requirements, which would complicate the specifications. - Furthermore, a single stakeholder takes away any negotiation the stakeholders. - - Although the specifications itself are not difficult to define, ensuring that they are complete is difficult. - Team members and stakeholders help to spot any ambiguity or problems with the validity. - \ac{ears} was very useful in this case as it gives a strong template to help avoid ambiguity. - - \subsection{Initial design} - The initial design started with a design space exploration. - The goal was to collect possible solutions and ideas for the implementation. - The exploration resulted in a lot of whiteboard writing robots. - These robots can be sorted in four different configurations - Each configuration explained in the following sections. - From the possible configurations, the optimal configuration that fits the specifications is made into an initial design. - - \subsubsection{Cable-Driven} - The cable-driven robot is suspended with multiple cables. - The end-effector that contains the marker is moved along a board by changing the length of the cables. - The cable-based positioning systems result in a end-effector with a large range and high velocities. - A basic setup can be seen in \autoref{fig:cablebotdrawing}. - This given setup contains two cables that are motorized. - The big advantage of this system is that it scales good, as the cables can have almost any length. - \begin{figure} - \centering - \includegraphics[width=10.8cm]{graphics/cablebot.pdf} - \caption{Planar view of cable driven robot. This setup contains two motorized pulleys in both top corners. From these two cables a mass is suspended at position $x,y$. - By changing the length of the cables, the mass can be moved over along the whole board.} - \label{fig:cablebotdrawing} - \end{figure} - \begin{marginfigure} - \centering - \includegraphics[width=3.74cm]{graphics/cable_angle.pdf} - \caption{Illustrating the limit for horizontal acceleration $a$, for different angles to compensate for gravitational acceleration $g$. - The red arrow represents the acceleration as a result of the pulling force of the cable, which is vectorized in a vertical acceleration that compensates $g$ and a vertical acceleration $a$.} - \label{fig:cable_angle} - \end{marginfigure} - - Although it is possible to achieve high velocities, this system is limited by the gravitational acceleration. - In case of vertical acceleration, the maximum downward acceleration or upward deceleration is limited by \SI{9.81}{\meter\per\second\squared}. - The horizontal acceleration depends on the relative angle of the suspending cable. - The closer the end-effector is below the cable pulley, the lower the vertical acceleration becomes. - \autoref{fig:cable_angle} illustrates the vertical acceleration for different angles. - - A possible solution to this is to add one or two additional wires to the system. - These can pull on the system to 'assist' the gravitational force. - Depending on the implementation, the extra cables make the system over-constrained. - Nevertheless, the extra cables allow for higher acceleration limits in vertical and horizontal direction. - - \subsubsection{Cartesian-coordinate robot} - This configuration is a very common design for plotters and shown in \autoref{fig:plotter}. - This setup is also known as a gantry robot or linear robot. - It normally consists of two sliders, which behave as a prismatic joint. - Because each slider covers a single X or Y axis, the control and dynamics of this system are rather simple. - A bigger challenge is the construction of the system, as the vertical slider has to stay vertical during operation. - Especially the length of this setup makes twisting of the vertical slider more likely. - \begin{figure} - \centering - \includegraphics[width=8.74cm]{graphics/plotter.pdf} - \caption{This Cartesian plotter consists of two horizontal sliders to provide the $x$-movement and one vertical slider to provide the $y$-movement.} - \label{fig:plotter} - \end{figure} - - - \subsubsection{Polar-coordinate robot} - This robot is a combination of a prismatic and a revolute joint. - Where the revolute joint can rotate the prismatic joint as seen in \autoref{fig:polar}. - With this it can reach any point within a radius from rotational joint. - This is a little more complex design than the Cartesian robot. - \begin{figure} - \centering - \includegraphics[width=8.74cm]{graphics/polar.pdf} - \caption{A combination of a revolute joint and a prismatic joint, creating a polar-coordinate robot.} - \label{fig:polar} - \end{figure} - \begin{marginfigure} - \centering - \includegraphics[width=3.74cm]{graphics/polar_protrude.pdf} - \caption{The diagonal lined section shows the part of the protruding area that is used by the arm.} - \label{fig:polar_protrude} - \end{marginfigure} - - This robot has some disadvantages. - The range of the robot is defined by the length of the prismatic joint. - However, if the prismatic joint is fully retracted, the joint does not get shorter. - In that case the arm still protrudes on the other side. - Therefore the complete radius around the revolute joint cannot have any obstacles. - \autoref{fig:polar_protrude} gives an impression of the required area. - Even with this area, the arm cannot reach the complete board. - This makes required space of the setup very inefficient. - Another disadvantage is that a long arm increases the moment of inertia and the gravitational torque quadratically. - Furthermore, the long arm introduces stiffness problems and it amplifies any inaccuracy in the joint. - - \subsubsection{SCARA} - The SCARA robot is a configuration with two linkages that are connected via rotational joints. - It can be compared to a human arm drawing on a table as seen in \autoref{fig:scara}. - Similar to the Polar robot it can reach all points within a radius from the base of the robot. - However, the arm can be configurated to not protrude outside of the board. - If the situation requires the arm to protrude, it is still significantly less than the polar arm (\autoref{fig:polar_protrude}). - Furthermore, depending on the configuration the of the arm the area where it protrudes can be significantly smaller. - However, the additional joint and extra arm length does add to the moment of inertia and gravitational torque similar to the polar robot. - The SCARA is therefore not a robot that is convenient with large working areas. - However, it can be really quick and precise in relative small areas. - \begin{figure} - \centering - \includegraphics[width=8.74cm]{graphics/scara.pdf} - \caption{Schematic example of a SCARA, consisting of two rotation linkages. This setup can be compared to a human arm, where the gray base above the whiteboard represents the shoulder and the connections between both linkages the elbow.} - \label{fig:scara} - \end{figure} - - \subsubsection{Choice of system} - The previous sections have shown four different configurations. - These configurations are compared in \autoref{tab:initial_design}. - Each of the systems are scored on range, dimension, speed, scaling and the interesting dynamics. - The range scores the system on the practical dimension of the system, larger is better. - The cable and cartesian configuration scale very well, the cables or slider rails can be made longer without real difficulty. - The SCARA or polar configuration run into problems with the arm lengths, as forces scale quadratically with their length. - The dimension looks at the number of states that require control and is for all systems defined as 2.5D. - The half dimension is the binary state for the marker on or off the board. - Except for the cable bot, all configurations score sufficient on speed. - The cable bot can be quick, but is limited in acceleration, and depends on the type of cable configuration. - The last one, how interesting or challenging are the dynamics. - The cartesian configuration is trivial, both sliders operate completely separate from each other and the position coordinates can be mapped one to one with the sliders. - For the other configuration, some inverse kinematics are required to get from desired position to the control angles of the system. - - \begin{table}[] - \caption{Table with comparison of the four proposed configurations and a combined configuration of the cable bot and the SCARA.} - \label{tab:initial_design} - \begin{tabular}{l|l|l|l|l|l|} - \cline{2-6} - & Cable bot & Cartesian & Polar & SCARA & Combined \\ \hline - \multicolumn{1}{|l|}{Range} & + + & + & - - & - & + + \\ \hline - \multicolumn{1}{|l|}{Dimension} & 2.5 & 2.5 & 2.5 & 2.5 & 4.5 \\ \hline - \multicolumn{1}{|l|}{Speed} & - & + & + & + + & + \\ \hline - \multicolumn{1}{|l|}{\begin{tabular}[c]{@{}l@{}}Interesting\\ dynamics\end{tabular}} & + & - - & + & + & + + \\ \hline - \end{tabular} - \end{table} - Based on the dimension, all configurations fail to meet the required four state minimum. - By combining two configurations, it is possible to meet the minimum of four states. - To get the best system, I decided to combine a 'speed' and a 'range' configuration. - This results in a system that has both properties. - Combining anything with the cartesian configurations, creates just a moving base for the other configurations. - Together with the trivial dynamics, this option is discarded. - Suspending the SCARA of the polar configuration with cables creates very interesting dynamics, as moving the end-effector also influences the cables. - From both options, the SCARA is quicker and scales better with range than the polar. - Therefore, the SCARA is chosen above the polar configuration to be combined with the cable bot. - The grading for the combined system is shown in the most right column in \autoref{tab:initial_design}. - - \begin{figure} - \centering - \includegraphics[width=10.8cm]{graphics/combined.pdf} - \caption{Combined system that integrates the cable bot together with the SCARA. The SCARA in red is mounted on the carriage in blue. This carriage is then suspended by cables.} - \label{fig:combined} - \end{figure} - In the combined system, the SCARA will only be large enough to write a small number of characters at the time. - This will alternate with the cable bot moving the base of the SCARA to the next position, so that it can write the next set of characters on the whiteboard. - \autoref{fig:combined} shows a simple view of the system. - - \subsubsection{Evaluation} - This was the first step that felt really productive in the design process. - It created a enormous amount of information and insight of the design. - In hind sight, it would have been useful to have this information during the specifications step. - However, as the specifications step are mainly on the "what" to solve, and specifically not on "how" to solve it, this information was avoided on purpose during the specifications step. - - This step did result in a initial design that can be used in the next steps. - However, I noticed that none of the previous steps gave some implementation threshold. - For the problem description and the specifications steps this was a minimum implementation level. - This step was a optimal implementation level, the minimum was reached rather quick. - But at what level of implementation needs this step to be concluded? - A related question: Would a simple dynamic model of the initial design be a useful insight or a waste of time? - - \subsection{Feature Definition} - \label{sec:case_featuredefinition} - At this point there are specifications and an initial design for the system. - In the following steps of the design method features will be implemented one by one. - The goal of this step is then to define these features. - During this step it became clear that this approach was not feasible. - Prior to this step the expectation was that this step would produce three features that could be implemented. - These three features were the SCARA, the cable suspended carriage, and the end-effector. - However, independent of the interpretation of this step, the result was not the three expected features. - - Why were those three features expected in the first place? - During the previous steps a useful evaluation was to anticipate for the subsequent steps. - Where one of the following steps is to implement an individual feature. - Therefore, it must be possible to implement the feature. - Separating the initial design into the smallest components that could still be implemented, resulted in the SCARA, carriage and end-effector. - - The problem is that these three components do not describe the complete system. - Some functions of the system (feature) is performed by a combination of the components. - Therefore can the components in the system not be seen as features of the system. - Defining the components as features of the system is not a solution. - The relations between the components and features is still required. - - %As the features describe the behavior of the components, it is not a solution to replace the features with components. - - A solution to organize the relations between features and components was found in RobMoSys\footnote{\url{https://robmosys.eu/approach/}}. - RobMoSys defines a separation of levels in a design. - Where the levels start functional and moves via software to hardware implementation. - Although not all levels of RobMoSys are used, it was very useful to define the features of the system. - The definition can be seen in \autoref{fig:robmosys} - The current definition of features allows to start the implementation with a component. - When the component is finished features can be implemented by following the tree upwards. - \begin{figure*} - \centering - \includegraphics[width=0.85\linewidth]{graphics/robmosys} - \caption{Feature Definition based on the separation of levels introduced by RobMoSys} - \label{fig:robmosys} - \end{figure*} - - \subsubsection{Evaluation} - Even though there is a feature definition that can be used in the next step, there remain a couple of difficulties. - There is still a really strong border between features and components. - And the single level of components makes it impossible to depict the dependencies between components. - Developing larger and complex systems will have sub-components in the system, introducing even more dependencies. - Therefore, this is not a valid solution for feature definition. - Fortunately the current solution suffices to continue the case study. - - \subsection{Test Protocol} - The last step of the preliminary design is to design tests. - The tests are designed around the specifications. - However, during the creation of the tests it was found that the list of specifications were lacking. - Furthermore, the previous steps did not provide any order of operation. - During this step the order of operation and additional specifications are determined. - - There are two modes of operation: writing and wiping. - The writing operation can be split in the following steps: - \begin{enumerate} - \item Move cable driven carriage to position of characters. - \item Write three characters with the SCARA. - \item Repeat step 1 and 2 till the Tweet is on the board. - \item Move carriage away from the text on the board. - \end{enumerate} - - The other operation is wiping. - This is similar to the operation of writing with the following steps: - \begin{enumerate} - \item Move cable driven carriage to position of characters. - \item Clear the area in reach of the SCARA. - \item Repeat step 1 and 2 till the Tweet is removed from on the board. - \end{enumerate} - Furthermore, switching between the states requires the tool to be switched. - As this is a difficult operation there are not yet requirements or order of operation specified. - - Based on the order of operation, the following specifications were added to the list in \autoref{sec:specifications}: - \begin{enumerate} - \setcounter{enumi}{11} - \item While writing, the SCARA shall have a writing speed of at least 1.5 characters per second. - \item When the Carriage/base of the SCARA is at a static position, the SCARA shall be able to write at least 3 characters at that position. - \item When the SCARA finished writing at their current position, the Carriage shall move the SCARA to it's next position where it can write the subsequent characters. - \item When the SCARA has to be moved to a new position, the Carriage shall perform this movement within 1 second. - \end{enumerate} - These additional specifications are also based on the combined system decission that was made in section \autoref{sec:initialdesign}. - These specifications distribute responsibility between sub-components. - - With the updated specifications it was possible to create a number of test cases. - In total there are five small test cases and four large test cases. - The small tests cover a sub-system and the large tests apply on the complete systems. - Each tests has a list of specifications that are covered with the test and for smaller tests the subsystem under test is also determined. - With a short description it is described how the test should be performed. - - One of the small tests is performed by drawing a square: - \begin{test} - \begin{description} - \item[Coverage] SCARA - \item[Specifications] 3, 7, 11, 13 - \item[Description] - The SCARA must draw a square of at least \SI{50}{\milli\meter} high and \SI{70}{\milli\meter} wide. - This box is large enough to draw at least 3 characters. - This square should be drawn within one second. - If it is slower than that, it is not able to achieve specification 7. - \end{description} - \end{test} - Repeatability is tested in one of the large system wide tests: - \begin{test} - \begin{description} - \item[Coverage] All features - \item[Specifications] 3, 4, 9, 11 - \item[Description] - To test the repeatability of the system must do four things: - \begin{itemize} - \item The system will be reset. - \item Draw multiple squares (\SI{60}{\milli\meter} x \SI{60}{\milli\meter}) at a random position within the drawing range (\SI{1000}{\milli\meter} x \SI{300}{\milli\meter}). - \item The system will be reset again. - \item Then in a random order, at least different from the order of squares, a circle with a \SI{55}{\milli\meter} diameter must to be drawn inside the squares. - \end{itemize} - The test is successful if the circles are not drawn outside of the squares. - \end{description} - \end{test} - - \subsubsection{Evaluation} - This step was completed with not many difficulties. - The specific order of operation and extra specifications should not be part of this step. - It was already concluded that the steps in the preliminary design were not as expected. - The fact that this step resulted in an additional changes only adds to that conclusion. - - The design of the test cases resulted in valuable information about the system. - This information would be very useful in an earlier stage of the preliminary design. - - - \subsection{Recap} - During the problem definition and the specifications step it was difficult to stay within the "what" has to be solved and not go into the "how" it has to be solved. - Furthermore, - The test definitions of the last step conclude the preliminary design phase. - This preliminary design shows a clear notion of a hasty execution from a design standpoint. - The preliminary design was performed over a period of 5 weeks, by one developer with little experience in design documentation. - This makes notion of hasty not surprising for this unproven design method. - That does not mean that this preliminary design is a waste of time. - From the evaluation moments during the preliminary phase there are a couple of interesting points. - \begin{itemize} - \item The lack of a design team with experienced engineers would drastically improve the execution of this design phase. - Such a team is also able to find the smaller problems of such a design phase, which are currently completely overlooked. - \item It is not possible to view each step in the design process as singular. - Each step creates more insight and information about the final design. - Making a very strong separation between the steps forces the developer to make decisions on to little information. - \item The term features has to be split in to functions and components for a hardware design. - The actual implementation are the components such that they can perform the function. - \end{itemize} - - Another point was noticed while evaluation the complete preliminary design phase. - The lack of a team makes it easy to forget documenting intuitive design decisions. - Although the design method is followed as closely as possible, it often occurs that a decision is made outside of the working environment. - This was noticed during the writing of this chapter that some design decisions were completely missing. - However, during the next phase, these decisions do play a crucial role. - Therefore, this section will give a short recap of the planned design. - - \subsubsection{Complete system} - From the initial design the abstract shape of the design is clear. - This is still in line with \autoref{fig:general_design}. - The SCARA is small and can therefore move the arm quick with a fine precision. - At the end of the SCARA there is a end-effector that can grab, hold, end release tool. - It holds a marker while writing and with help of the SCARA it can release the marker. - Then it can grab a cleaning tool to erase whiteboard. - To compensate for the small reach of the SCARA, the SCARA will be mounted to a carriage. - This carriage is suspended from cables and can move along the whiteboard. - The cables give the system a enormous range and velocity. - However, it is not very good in acceleration as cables cannot push. - This makes it suitable for the large and course movements along the board, which complements the movement characteristics of the SCARA. - - - - \subsubsection{SCARA} - The central component of the system is the SCARA. - There are a couple of design options for the SCARA. - As the dynamic complexity is a important part of this design, there will be two arms. - There are some different options for the configuration of the arms and their actuation. - \autoref{fig:configurations} shows four of the possible configurations that are considered during the design phase. - There are still options about where to place the motors and how to connect the joints. - \rrot{Figure needs some graphic improvement} - %\begin{figure} - % \centering - % \includegraphics[width=\linewidth]{graphics/IMG_20201001_134140.jpg} - % \caption{Four different SCARA configurations} - % \label{fig:configurations} - %\end{figure} - - \subsubsection{End-effector} - The end-effector is the connection between the SCARA and the tool. - It has two main functions: lifting the tool from the board and switching the tool. - The tool switching functionality is performed by the SCARA as well, by moving the end-effector to the right position. - However, the role of the SCARA is strongly dependent\footnote{ Note, that this dependency exists but not represented in \autoref{fig:robmosys} due to the limitation of the current method.} on how the end-effector is implemented. - For the grabbing function there is a configuration that uses a spring-loaded clamp. - Where one side of the clamp is longer so it can be opened by moving the SCARA. - This operation is shown in \autoref{fig:gripper} - %\begin{figure*} - % \centering - % \includegraphics[width=\linewidth]{graphics/IMG_20201001_144018.jpg} - % \caption{Operation principle of a spring-loaded tool clamp showed from left to right. The green circle represents the tool and the red arm a tool holder. The solid ground is what pushed the upper arm open so the marker can be placed in the tool holder.} - % \label{fig:gripper} - %\end{figure*} - - Another dynamically simpler option is to open the clamp with a motor. - The motor adds weight to the end-effector which might require the SCARA to operate slower or to be build stronger. - This component is probably the most difficult one because it requires clamping of the tools. - Modeling this behavior is difficult as it will involve contact dynamics. - - \subsubsection{Cable driven Carriage} - The end-effector and the SCARA are moved all together on a carriage. - The carriage will be suspended from two or four cables. - A configuration with two cables is the simplest. - However, the tension in this system is generated by the gravitational pull. - This introduces limitations in the acceleration of the system. - If the carriage moves upwards and the cable pulleys stop. - The carriage is only decelerated by the force of gravity. - Moving over its set point, followed by crashing down in to the cables. - - However, making the system with four motorized pulleys makes the system over constrained. - This will solve the acceleration problem. But it will create a difficult positioning system. - As all the wires have to be tensioned but not distort the movement by restricting the other motors. - - \subsubsection{Electronics} - Although this mainly is a hardware design, there is going to be some control-software. - For this the likely option is a STM nucleo board with RIOT-OS as a embedded OS. - This choice is mainly because of previous experience and local knowledge of the operating system. - +\input{content/case_experiment_problem_description.tex} +\input{content/case_experiment_specifications.tex} +\input{content/case_experiment_initial_design.tex} +\input{content/case_experiment_feature_definition.tex} +\input{content/case_experiment_test_protocol.tex} +\input{content/case_experiment_recap.tex} \section{First Development Cycle} \subsection{Feature Selection} diff --git a/content/case_experiment_feature_definition.tex b/content/case_experiment_feature_definition.tex new file mode 100644 index 0000000..c3fc5ec --- /dev/null +++ b/content/case_experiment_feature_definition.tex @@ -0,0 +1,46 @@ +%&tex + \subsection{Feature Definition} + \label{sec:case_featuredefinition} + At this point there are specifications and an initial design for the system. + In the following steps of the design method features will be implemented one by one. + The goal of this step is then to define these features. + During this step it became clear that this approach was not feasible. + Prior to this step the expectation was that this step would produce three features that could be implemented. + These three features were the SCARA, the cable suspended carriage, and the end-effector. + However, independent of the interpretation of this step, the result was not the three expected features. + + Why were those three features expected in the first place? + During the previous steps a useful evaluation was to anticipate for the subsequent steps. + Where one of the following steps is to implement an individual feature. + Therefore, it must be possible to implement the feature. + Separating the initial design into the smallest components that could still be implemented, resulted in the SCARA, carriage and end-effector. + + The problem is that these three components do not describe the complete system. + Some functions of the system (feature) is performed by a combination of the components. + Therefore can the components in the system not be seen as features of the system. + Defining the components as features of the system is not a solution. + The relations between the components and features is still required. + + %As the features describe the behavior of the components, it is not a solution to replace the features with components. + + A solution to organize the relations between features and components was found in RobMoSys\footnote{\url{https://robmosys.eu/approach/}}. + RobMoSys defines a separation of levels in a design. + Where the levels start functional and moves via software to hardware implementation. + Although not all levels of RobMoSys are used, it was very useful to define the features of the system. + The definition can be seen in \autoref{fig:robmosys} + The current definition of features allows to start the implementation with a component. + When the component is finished features can be implemented by following the tree upwards. + \begin{figure*} + \centering + \includegraphics[width=0.85\linewidth]{graphics/robmosys} + \caption{Feature Definition based on the separation of levels introduced by RobMoSys} + \label{fig:robmosys} + \end{figure*} + + \subsubsection{Evaluation} + Even though there is a feature definition that can be used in the next step, there remain a couple of difficulties. + There is still a really strong border between features and components. + And the single level of components makes it impossible to depict the dependencies between components. + Developing larger and complex systems will have sub-components in the system, introducing even more dependencies. + Therefore, this is not a valid solution for feature definition. + Fortunately the current solution suffices to continue the case study. diff --git a/content/case_experiment_initial_design.tex b/content/case_experiment_initial_design.tex new file mode 100644 index 0000000..3630936 --- /dev/null +++ b/content/case_experiment_initial_design.tex @@ -0,0 +1,163 @@ +%&tex + \subsection{Initial design} + The initial design started with a design space exploration. + The goal was to collect possible solutions and ideas for the implementation. + The exploration resulted in a lot of whiteboard writing robots. + These robots can be sorted in four different configurations + Each configuration explained in the following sections. + From the possible configurations, the optimal configuration that fits the specifications is made into an initial design. + + \subsubsection{Cable-Driven} + The cable-driven robot is suspended with multiple cables. + The end-effector that contains the marker is moved along a board by changing the length of the cables. + The cable-based positioning systems result in a end-effector with a large range and high velocities. + A basic setup can be seen in \autoref{fig:cablebotdrawing}. + This given setup contains two cables that are motorized. + The big advantage of this system is that it scales good, as the cables can have almost any length. + \begin{figure} + \centering + \includegraphics[width=10.8cm]{graphics/cablebot.pdf} + \caption{Planar view of cable driven robot. This setup contains two motorized pulleys in both top corners. From these two cables a mass is suspended at position $x,y$. + By changing the length of the cables, the mass can be moved over along the whole board.} + \label{fig:cablebotdrawing} + \end{figure} + \begin{marginfigure} + \centering + \includegraphics[width=3.74cm]{graphics/cable_angle.pdf} + \caption{Illustrating the limit for horizontal acceleration $a$, for different angles to compensate for gravitational acceleration $g$. + The red arrow represents the acceleration as a result of the pulling force of the cable, which is vectorized in a vertical acceleration that compensates $g$ and a vertical acceleration $a$.} + \label{fig:cable_angle} + \end{marginfigure} + + Although it is possible to achieve high velocities, this system is limited by the gravitational acceleration. + In case of vertical acceleration, the maximum downward acceleration or upward deceleration is limited by \SI{9.81}{\meter\per\second\squared}. + The horizontal acceleration depends on the relative angle of the suspending cable. + The closer the end-effector is below the cable pulley, the lower the vertical acceleration becomes. + \autoref{fig:cable_angle} illustrates the vertical acceleration for different angles. + + A possible solution to this is to add one or two additional wires to the system. + These can pull on the system to 'assist' the gravitational force. + Depending on the implementation, the extra cables make the system over-constrained. + Nevertheless, the extra cables allow for higher acceleration limits in vertical and horizontal direction. + + \subsubsection{Cartesian-coordinate robot} + This configuration is a very common design for plotters and shown in \autoref{fig:plotter}. + This setup is also known as a gantry robot or linear robot. + It normally consists of two sliders, which behave as a prismatic joint. + Because each slider covers a single X or Y axis, the control and dynamics of this system are rather simple. + A bigger challenge is the construction of the system, as the vertical slider has to stay vertical during operation. + Especially the length of this setup makes twisting of the vertical slider more likely. + \begin{figure} + \centering + \includegraphics[width=8.74cm]{graphics/plotter.pdf} + \caption{This Cartesian plotter consists of two horizontal sliders to provide the $x$-movement and one vertical slider to provide the $y$-movement.} + \label{fig:plotter} + \end{figure} + + + \subsubsection{Polar-coordinate robot} + This robot is a combination of a prismatic and a revolute joint. + Where the revolute joint can rotate the prismatic joint as seen in \autoref{fig:polar}. + With this it can reach any point within a radius from rotational joint. + This is a little more complex design than the Cartesian robot. + \begin{figure} + \centering + \includegraphics[width=8.74cm]{graphics/polar.pdf} + \caption{A combination of a revolute joint and a prismatic joint, creating a polar-coordinate robot.} + \label{fig:polar} + \end{figure} + \begin{marginfigure} + \centering + \includegraphics[width=3.74cm]{graphics/polar_protrude.pdf} + \caption{The diagonal lined section shows the part of the protruding area that is used by the arm.} + \label{fig:polar_protrude} + \end{marginfigure} + + This robot has some disadvantages. + The range of the robot is defined by the length of the prismatic joint. + However, if the prismatic joint is fully retracted, the joint does not get shorter. + In that case the arm still protrudes on the other side. + Therefore the complete radius around the revolute joint cannot have any obstacles. + \autoref{fig:polar_protrude} gives an impression of the required area. + Even with this area, the arm cannot reach the complete board. + This makes required space of the setup very inefficient. + Another disadvantage is that a long arm increases the moment of inertia and the gravitational torque quadratically. + Furthermore, the long arm introduces stiffness problems and it amplifies any inaccuracy in the joint. + + \subsubsection{SCARA} + The SCARA robot is a configuration with two linkages that are connected via rotational joints. + It can be compared to a human arm drawing on a table as seen in \autoref{fig:scara}. + Similar to the Polar robot it can reach all points within a radius from the base of the robot. + However, the arm can be configurated to not protrude outside of the board. + If the situation requires the arm to protrude, it is still significantly less than the polar arm (\autoref{fig:polar_protrude}). + Furthermore, depending on the configuration the of the arm the area where it protrudes can be significantly smaller. + However, the additional joint and extra arm length does add to the moment of inertia and gravitational torque similar to the polar robot. + The SCARA is therefore not a robot that is convenient with large working areas. + However, it can be really quick and precise in relative small areas. + \begin{figure} + \centering + \includegraphics[width=8.74cm]{graphics/scara.pdf} + \caption{Schematic example of a SCARA, consisting of two rotation linkages. This setup can be compared to a human arm, where the gray base above the whiteboard represents the shoulder and the connections between both linkages the elbow.} + \label{fig:scara} + \end{figure} + + \subsubsection{Choice of system} + The previous sections have shown four different configurations. + These configurations are compared in \autoref{tab:initial_design}. + Each of the systems are scored on range, dimension, speed, scaling and the interesting dynamics. + The range scores the system on the practical dimension of the system, larger is better. + The cable and cartesian configuration scale very well, the cables or slider rails can be made longer without real difficulty. + The SCARA or polar configuration run into problems with the arm lengths, as forces scale quadratically with their length. + The dimension looks at the number of states that require control and is for all systems defined as 2.5D. + The half dimension is the binary state for the marker on or off the board. + Except for the cable bot, all configurations score sufficient on speed. + The cable bot can be quick, but is limited in acceleration, and depends on the type of cable configuration. + The last one, how interesting or challenging are the dynamics. + The cartesian configuration is trivial, both sliders operate completely separate from each other and the position coordinates can be mapped one to one with the sliders. + For the other configuration, some inverse kinematics are required to get from desired position to the control angles of the system. + + \begin{table}[] + \caption{Table with comparison of the four proposed configurations and a combined configuration of the cable bot and the SCARA.} + \label{tab:initial_design} + \begin{tabular}{l|l|l|l|l|l|} + \cline{2-6} + & Cable bot & Cartesian & Polar & SCARA & Combined \\ \hline + \multicolumn{1}{|l|}{Range} & + + & + & - - & - & + + \\ \hline + \multicolumn{1}{|l|}{Dimension} & 2.5 & 2.5 & 2.5 & 2.5 & 4.5 \\ \hline + \multicolumn{1}{|l|}{Speed} & - & + & + & + + & + \\ \hline + \multicolumn{1}{|l|}{\begin{tabular}[c]{@{}l@{}}Interesting\\ dynamics\end{tabular}} & + & - - & + & + & + + \\ \hline + \end{tabular} + \end{table} + Based on the dimension, all configurations fail to meet the required four state minimum. + By combining two configurations, it is possible to meet the minimum of four states. + To get the best system, I decided to combine a 'speed' and a 'range' configuration. + This results in a system that has both properties. + Combining anything with the cartesian configurations, creates just a moving base for the other configurations. + Together with the trivial dynamics, this option is discarded. + Suspending the SCARA of the polar configuration with cables creates very interesting dynamics, as moving the end-effector also influences the cables. + From both options, the SCARA is quicker and scales better with range than the polar. + Therefore, the SCARA is chosen above the polar configuration to be combined with the cable bot. + The grading for the combined system is shown in the most right column in \autoref{tab:initial_design}. + + \begin{figure} + \centering + \includegraphics[width=10.8cm]{graphics/combined.pdf} + \caption{Combined system that integrates the cable bot together with the SCARA. The SCARA in red is mounted on the carriage in blue. This carriage is then suspended by cables.} + \label{fig:combined} + \end{figure} + In the combined system, the SCARA will only be large enough to write a small number of characters at the time. + This will alternate with the cable bot moving the base of the SCARA to the next position, so that it can write the next set of characters on the whiteboard. + \autoref{fig:combined} shows a simple view of the system. + + \subsubsection{Evaluation} + This was the first step that felt really productive in the design process. + It created a enormous amount of information and insight of the design. + In hind sight, it would have been useful to have this information during the specifications step. + However, as the specifications step are mainly on the "what" to solve, and specifically not on "how" to solve it, this information was avoided on purpose during the specifications step. + + This step did result in a initial design that can be used in the next steps. + However, I noticed that none of the previous steps gave some implementation threshold. + For the problem description and the specifications steps this was a minimum implementation level. + This step was a optimal implementation level, the minimum was reached rather quick. + But at what level of implementation needs this step to be concluded? + A related question: Would a simple dynamic model of the initial design be a useful insight or a waste of time? diff --git a/content/case_experiment_problem_description.tex b/content/case_experiment_problem_description.tex new file mode 100644 index 0000000..ac39db1 --- /dev/null +++ b/content/case_experiment_problem_description.tex @@ -0,0 +1,19 @@ +%&tex +\subsection{Problem Description} +In the problem description the need for a system can be described as follows: +\begin{itemize} + \item Write a twitter message, or tweet, on a whiteboard. + \item Remove the tweet from the whiteboard. + \item Write the tweet within three minutes on the board. + \item The text must be readable across a meeting room. + \item The solution must contain interesting dynamics. +\end{itemize} + +\subsubsection{Evaluation} +The problem description is very brief, which is not a complete surprise. +As most of the work for the problem description was already done by choosing the subject of design. +However, it was not expected to be this minimal. +Perhaps the most serious disadvantage is the absence of stakeholders. +Normally, a good problem definition focusses on getting the stakeholders on the same line \autocite{shafaat_exploring_2015}. +However, this case study does only have one stakeholder, the author, defeating the purpose getting everyone on the same line. +Creating a more elaborate problem description would not improve the following design process, but it does cost valuable time. diff --git a/content/case_experiment_recap.tex b/content/case_experiment_recap.tex new file mode 100644 index 0000000..1da1c7c --- /dev/null +++ b/content/case_experiment_recap.tex @@ -0,0 +1,96 @@ +%&tex + \subsection{Recap} + During the problem definition and the specifications step it was difficult to stay within the "what" has to be solved and not go into the "how" it has to be solved. + Furthermore, + The test definitions of the last step conclude the preliminary design phase. + This preliminary design shows a clear notion of a hasty execution from a design standpoint. + The preliminary design was performed over a period of 5 weeks, by one developer with little experience in design documentation. + This makes notion of hasty not surprising for this unproven design method. + That does not mean that this preliminary design is a waste of time. + From the evaluation moments during the preliminary phase there are a couple of interesting points. + \begin{itemize} + \item The lack of a design team with experienced engineers would drastically improve the execution of this design phase. + Such a team is also able to find the smaller problems of such a design phase, which are currently completely overlooked. + \item It is not possible to view each step in the design process as singular. + Each step creates more insight and information about the final design. + Making a very strong separation between the steps forces the developer to make decisions on to little information. + \item The term features has to be split in to functions and components for a hardware design. + The actual implementation are the components such that they can perform the function. + \end{itemize} + + Another point was noticed while evaluation the complete preliminary design phase. + The lack of a team makes it easy to forget documenting intuitive design decisions. + Although the design method is followed as closely as possible, it often occurs that a decision is made outside of the working environment. + This was noticed during the writing of this chapter that some design decisions were completely missing. + However, during the next phase, these decisions do play a crucial role. + Therefore, this section will give a short recap of the planned design. + + \subsubsection{Complete system} + From the initial design the abstract shape of the design is clear. + This is still in line with \autoref{fig:general_design}. + The SCARA is small and can therefore move the arm quick with a fine precision. + At the end of the SCARA there is a end-effector that can grab, hold, end release tool. + It holds a marker while writing and with help of the SCARA it can release the marker. + Then it can grab a cleaning tool to erase whiteboard. + To compensate for the small reach of the SCARA, the SCARA will be mounted to a carriage. + This carriage is suspended from cables and can move along the whiteboard. + The cables give the system a enormous range and velocity. + However, it is not very good in acceleration as cables cannot push. + This makes it suitable for the large and course movements along the board, which complements the movement characteristics of the SCARA. + + + + \subsubsection{SCARA} + The central component of the system is the SCARA. + There are a couple of design options for the SCARA. + As the dynamic complexity is a important part of this design, there will be two arms. + There are some different options for the configuration of the arms and their actuation. + \autoref{fig:configurations} shows four of the possible configurations that are considered during the design phase. + There are still options about where to place the motors and how to connect the joints. + \rrot{Figure needs some graphic improvement} + %\begin{figure} + % \centering + % \includegraphics[width=\linewidth]{graphics/IMG_20201001_134140.jpg} + % \caption{Four different SCARA configurations} + % \label{fig:configurations} + %\end{figure} + + \subsubsection{End-effector} + The end-effector is the connection between the SCARA and the tool. + It has two main functions: lifting the tool from the board and switching the tool. + The tool switching functionality is performed by the SCARA as well, by moving the end-effector to the right position. + However, the role of the SCARA is strongly dependent\footnote{ Note, that this dependency exists but not represented in \autoref{fig:robmosys} due to the limitation of the current method.} on how the end-effector is implemented. + For the grabbing function there is a configuration that uses a spring-loaded clamp. + Where one side of the clamp is longer so it can be opened by moving the SCARA. + This operation is shown in \autoref{fig:gripper} + %\begin{figure*} + % \centering + % \includegraphics[width=\linewidth]{graphics/IMG_20201001_144018.jpg} + % \caption{Operation principle of a spring-loaded tool clamp showed from left to right. The green circle represents the tool and the red arm a tool holder. The solid ground is what pushed the upper arm open so the marker can be placed in the tool holder.} + % \label{fig:gripper} + %\end{figure*} + + Another dynamically simpler option is to open the clamp with a motor. + The motor adds weight to the end-effector which might require the SCARA to operate slower or to be build stronger. + This component is probably the most difficult one because it requires clamping of the tools. + Modeling this behavior is difficult as it will involve contact dynamics. + + \subsubsection{Cable driven Carriage} + The end-effector and the SCARA are moved all together on a carriage. + The carriage will be suspended from two or four cables. + A configuration with two cables is the simplest. + However, the tension in this system is generated by the gravitational pull. + This introduces limitations in the acceleration of the system. + If the carriage moves upwards and the cable pulleys stop. + The carriage is only decelerated by the force of gravity. + Moving over its set point, followed by crashing down in to the cables. + + However, making the system with four motorized pulleys makes the system over constrained. + This will solve the acceleration problem. But it will create a difficult positioning system. + As all the wires have to be tensioned but not distort the movement by restricting the other motors. + + \subsubsection{Electronics} + Although this mainly is a hardware design, there is going to be some control-software. + For this the likely option is a STM nucleo board with RIOT-OS as a embedded OS. + This choice is mainly because of previous experience and local knowledge of the operating system. + diff --git a/content/case_experiment_specifications.tex b/content/case_experiment_specifications.tex new file mode 100644 index 0000000..ab55205 --- /dev/null +++ b/content/case_experiment_specifications.tex @@ -0,0 +1,60 @@ +%&tex + \subsection{Specifications} + \label{sec:specifications} + The next step is to create specifications based on the problem description. + The goal is to write and remove a tweet on the whiteboard. + Originally a tweet had a character limit of 140, but this was doubled to 280\footnote{\url{https://blog.twitter.com/official/en_us/topics/product/2017/tweetingmadeeasier.html}}. + However, for this system the limit remains at 140 characters. + The text is limited to fifty characters per line, with a total of three lines. + This results in ten extra characters that can be used for word wrapping. + For the readability, the distance to a whiteboard in a meeting room is taken as \SI{4}{\meter}. + The operating speed should allow the tweet to be written within three minutes. + Therefore, the goal is to write one character per second. + The last requirement is to have interesting dynamics. + Looking at simple plotters, they are referred to as 2.5D as the 'third' dimension only describes a binary state. + For this system, the minimum is set to a system that has at least four full states that have to be controlled. + Using \ac{ears} to define these specifications gives: + \begin{enumerate} + \item The Writer shall be able to write at least fifty characters per line. + \item The Writer shall be able to write at least three of text. + \item The Writer shall plot characters with a size that is readable from 4 meters for a person with good eyesight. + \item The Writer shall plot in a regular used font with corresponding character spacing. + \item When a new tweet is send to the Writer, the Writer, shall wipe the existing tweet and write down the new tweet. + \item If the Writer is not wiping or writing then the Writer shall not obstruct the view of the whiteboard. + \item While writing, the Writer shall have a writing speed of at least one character per second. + \item The Writer shall contain at least four states that require control in order to function. + \end{enumerate} + Some other specifications that are related to the operation of the system are: + \begin{enumerate} + \setcounter{enumi}{8} + \item If the Writer is tasked to wipe the tweet, the Writer shall wipe the tweet within sixty seconds + \item When a reset-signal is send to the Writer, the Writer shall recalibrate its position on the board. + \item When a wipe-signal is send to the Writer, the Writer shall wipe the board clean. + \item The Writer shall not damage itself. + \end{enumerate} + + Additionally there are some restrictions on construction. + As the rapid prototyping facilities at the university are closed due to the Covid-19 pandemic, the available tooling in reduced to some hobby/DIY tools: + \begin{itemize} + \item The Writer shall not exceed a total cost in materials and/or tools of €200. + \item The Writer shall be constructed with simple tools in the following list: + \begin{itemize} + \item Screwdrivers (Hex/Inbus, Torx, Philips, etc) in different sizes. + \item Drill + \item Screwtaps + \item Jigsaw + \item Wrenches + \item Soldering iron + \item Various Pliers + \item PLA 3D printer + \end{itemize} + \end{itemize} + \subsubsection{Evaluation} + The specifications step was performed without problems. + Defining the specifications for the problem description did not present any difficulty. + Due to the simplicity of the problem description, there were no contradictory requirements, which would complicate the specifications. + Furthermore, a single stakeholder takes away any negotiation the stakeholders. + + Although the specifications itself are not difficult to define, ensuring that they are complete is difficult. + Team members and stakeholders help to spot any ambiguity or problems with the validity. + \ac{ears} was very useful in this case as it gives a strong template to help avoid ambiguity. diff --git a/content/case_experiment_test_protocol.tex b/content/case_experiment_test_protocol.tex new file mode 100644 index 0000000..6325d5e --- /dev/null +++ b/content/case_experiment_test_protocol.tex @@ -0,0 +1,82 @@ +%&tex + \subsection{Test Protocol} + The last step of the preliminary design is to design tests. + The tests are designed around the specifications. + However, during the creation of the tests it was found that the list of specifications were lacking. + Furthermore, the previous steps did not provide any order of operation. + During this step the order of operation and additional specifications are determined. + + There are two modes of operation: writing and wiping. + The writing operation can be split in the following steps: + \begin{enumerate} + \item Move cable driven carriage to position of characters. + \item Write three characters with the SCARA. + \item Repeat step 1 and 2 till the Tweet is on the board. + \item Move carriage away from the text on the board. + \end{enumerate} + + The other operation is wiping. + This is similar to the operation of writing with the following steps: + \begin{enumerate} + \item Move cable driven carriage to position of characters. + \item Clear the area in reach of the SCARA. + \item Repeat step 1 and 2 till the Tweet is removed from on the board. + \end{enumerate} + Furthermore, switching between the states requires the tool to be switched. + As this is a difficult operation there are not yet requirements or order of operation specified. + + Based on the order of operation, the following specifications were added to the list in \autoref{sec:specifications}: + \begin{enumerate} + \setcounter{enumi}{11} + \item While writing, the SCARA shall have a writing speed of at least 1.5 characters per second. + \item When the Carriage/base of the SCARA is at a static position, the SCARA shall be able to write at least 3 characters at that position. + \item When the SCARA finished writing at their current position, the Carriage shall move the SCARA to it's next position where it can write the subsequent characters. + \item When the SCARA has to be moved to a new position, the Carriage shall perform this movement within 1 second. + \end{enumerate} + These additional specifications are also based on the combined system decission that was made in section \autoref{sec:initialdesign}. + These specifications distribute responsibility between sub-components. + + With the updated specifications it was possible to create a number of test cases. + In total there are five small test cases and four large test cases. + The small tests cover a sub-system and the large tests apply on the complete systems. + Each tests has a list of specifications that are covered with the test and for smaller tests the subsystem under test is also determined. + With a short description it is described how the test should be performed. + + One of the small tests is performed by drawing a square: + \begin{test} + \begin{description} + \item[Coverage] SCARA + \item[Specifications] 3, 7, 11, 13 + \item[Description] + The SCARA must draw a square of at least \SI{50}{\milli\meter} high and \SI{70}{\milli\meter} wide. + This box is large enough to draw at least 3 characters. + This square should be drawn within one second. + If it is slower than that, it is not able to achieve specification 7. + \end{description} + \end{test} + Repeatability is tested in one of the large system wide tests: + \begin{test} + \begin{description} + \item[Coverage] All features + \item[Specifications] 3, 4, 9, 11 + \item[Description] + To test the repeatability of the system must do four things: + \begin{itemize} + \item The system will be reset. + \item Draw multiple squares (\SI{60}{\milli\meter} x \SI{60}{\milli\meter}) at a random position within the drawing range (\SI{1000}{\milli\meter} x \SI{300}{\milli\meter}). + \item The system will be reset again. + \item Then in a random order, at least different from the order of squares, a circle with a \SI{55}{\milli\meter} diameter must to be drawn inside the squares. + \end{itemize} + The test is successful if the circles are not drawn outside of the squares. + \end{description} + \end{test} + + \subsubsection{Evaluation} + This step was completed with not many difficulties. + The specific order of operation and extra specifications should not be part of this step. + It was already concluded that the steps in the preliminary design were not as expected. + The fact that this step resulted in an additional changes only adds to that conclusion. + + The design of the test cases resulted in valuable information about the system. + This information would be very useful in an earlier stage of the preliminary design. + From ffef1b73043e68cf053f9228b78493d3b42e4373 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Wed, 9 Dec 2020 17:35:39 +0100 Subject: [PATCH 05/47] Removed recap --- content/case_experiment.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/case_experiment.tex b/content/case_experiment.tex index 89c73dd..c35f65c 100644 --- a/content/case_experiment.tex +++ b/content/case_experiment.tex @@ -28,7 +28,7 @@ Splitting the initial design into features is done in the feature definition ste \input{content/case_experiment_initial_design.tex} \input{content/case_experiment_feature_definition.tex} \input{content/case_experiment_test_protocol.tex} -\input{content/case_experiment_recap.tex} +%\input{content/case_experiment_recap.tex} \section{First Development Cycle} \subsection{Feature Selection} From 77005d6d5e6a2009a6929762f796fea4f92880a5 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Wed, 9 Dec 2020 17:37:05 +0100 Subject: [PATCH 06/47] Rework content --- .../case_experiment_feature_definition.tex | 96 +++++++++++-------- content/case_experiment_initial_design.tex | 1 + 2 files changed, 56 insertions(+), 41 deletions(-) diff --git a/content/case_experiment_feature_definition.tex b/content/case_experiment_feature_definition.tex index c3fc5ec..314a004 100644 --- a/content/case_experiment_feature_definition.tex +++ b/content/case_experiment_feature_definition.tex @@ -1,46 +1,60 @@ %&tex - \subsection{Feature Definition} - \label{sec:case_featuredefinition} - At this point there are specifications and an initial design for the system. - In the following steps of the design method features will be implemented one by one. - The goal of this step is then to define these features. - During this step it became clear that this approach was not feasible. - Prior to this step the expectation was that this step would produce three features that could be implemented. - These three features were the SCARA, the cable suspended carriage, and the end-effector. - However, independent of the interpretation of this step, the result was not the three expected features. +\subsection{Feature Definition} + \label{sec:case_featuredefinition} + At this point there are specifications and an initial design for the system. + In the following steps of the design method features will be implemented one by one. + The goal of this step is to define those features. + However, the predefined approach was not able to produces a set of features that could be implemented. + This forced me to create a new approach for this step, introducing components into the design. + This section will first address why the current approach is not suitable, followed by the alternative approach. - Why were those three features expected in the first place? - During the previous steps a useful evaluation was to anticipate for the subsequent steps. - Where one of the following steps is to implement an individual feature. - Therefore, it must be possible to implement the feature. - Separating the initial design into the smallest components that could still be implemented, resulted in the SCARA, carriage and end-effector. + \subsubsection{Struggles with Features} + For their case study, \textcite{broenink_rapid_2019} design a control system for a mini-segway. + This mini-segway is an already existing \ac{cps} that is used during the lab-sessions of a control course, and any control-law can be uploaded directly to the system. + The specified features of that system are defined as: + \begin{enumerate} + \item Balancing the mini-segway upright + \item Steering the mini-segway + \item Driving forward and backward + \end{enumerate} + Although this is not explicitly explained, these features have dependencies: the steering and the driving both rely on a balanced segway. - The problem is that these three components do not describe the complete system. - Some functions of the system (feature) is performed by a combination of the components. - Therefore can the components in the system not be seen as features of the system. - Defining the components as features of the system is not a solution. - The relations between the components and features is still required. + A set of features for the Whiteboard writer would be: + \begin{enumerate} + \item Write character on position + \item Move carriage to position + \item Write text + \end{enumerate} + In this case, features 1 and 2 are required for feature 3. + However, in contrast with the mini-segway, the whiteboard writer does not exist yet. + Instead of creating a model based on the system, the system has to be designed first. + For these three features, the required hardware can be designed together with the feature. + The first feature would then also contain the design of the SCARA and the second feature the cable bot design. + Adding the features needed to meet the specifications for wiping the whiteboard, then such a feature would also need to design the SCARA. + In other words, more than one feature uses the SCARA in their behavior. + Resulting in the question: which feature should implement the hardware? - %As the features describe the behavior of the components, it is not a solution to replace the features with components. + \subsubsection{Separating Functions and Components} + It was decided not to add the SCARA and the cable bot as features, for the reason that they do not define behavior. + Instead, the features define how the hardware behaves. + A solution to organize the relations between features and components was found in RobMoSys\footnote{\url{https://robmosys.eu/approach/}}. + RobMoSys defines a separation of levels in a design. + Where the levels start functional and moves via software to hardware implementation. + Although not all levels of RobMoSys are used, it was very useful to define the features of the system. + The definition is shown in \autoref{fig:robmosys}. + The current definition of features allows to start the implementation with a component. + When the component is finished features can be implemented by following the tree upwards. + \begin{figure*} + \centering + \includegraphics[width=0.85\linewidth]{graphics/robmosys} + \caption{Feature Definition based on the separation of levels introduced by RobMoSys} + \label{fig:robmosys} + \end{figure*} - A solution to organize the relations between features and components was found in RobMoSys\footnote{\url{https://robmosys.eu/approach/}}. - RobMoSys defines a separation of levels in a design. - Where the levels start functional and moves via software to hardware implementation. - Although not all levels of RobMoSys are used, it was very useful to define the features of the system. - The definition can be seen in \autoref{fig:robmosys} - The current definition of features allows to start the implementation with a component. - When the component is finished features can be implemented by following the tree upwards. - \begin{figure*} - \centering - \includegraphics[width=0.85\linewidth]{graphics/robmosys} - \caption{Feature Definition based on the separation of levels introduced by RobMoSys} - \label{fig:robmosys} - \end{figure*} - - \subsubsection{Evaluation} - Even though there is a feature definition that can be used in the next step, there remain a couple of difficulties. - There is still a really strong border between features and components. - And the single level of components makes it impossible to depict the dependencies between components. - Developing larger and complex systems will have sub-components in the system, introducing even more dependencies. - Therefore, this is not a valid solution for feature definition. - Fortunately the current solution suffices to continue the case study. + \subsubsection{Evaluation} + Even though there is a feature definition that can be used in the next step, there remain a couple of difficulties. + There is still a clear separation between features and components. + And the single level of components makes it impossible to depict the dependencies between components. + Developing larger and complex systems will have sub-components in the system, introducing even more dependencies. + Therefore, this is not a valid solution for feature definition. + Fortunately the current solution suffices to continue the case study. diff --git a/content/case_experiment_initial_design.tex b/content/case_experiment_initial_design.tex index 3630936..7b95523 100644 --- a/content/case_experiment_initial_design.tex +++ b/content/case_experiment_initial_design.tex @@ -1,5 +1,6 @@ %&tex \subsection{Initial design} + \label{sec:initialdesign} The initial design started with a design space exploration. The goal was to collect possible solutions and ideas for the implementation. The exploration resulted in a lot of whiteboard writing robots. From 5dd832f9949d77f50eb33e9b844afdaf7a7f1db8 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Wed, 9 Dec 2020 17:37:55 +0100 Subject: [PATCH 07/47] Rework content --- content/case_experiment_initial_design.tex | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/content/case_experiment_initial_design.tex b/content/case_experiment_initial_design.tex index 7b95523..f32d76f 100644 --- a/content/case_experiment_initial_design.tex +++ b/content/case_experiment_initial_design.tex @@ -46,15 +46,16 @@ This setup is also known as a gantry robot or linear robot. It normally consists of two sliders, which behave as a prismatic joint. Because each slider covers a single X or Y axis, the control and dynamics of this system are rather simple. - A bigger challenge is the construction of the system, as the vertical slider has to stay vertical during operation. - Especially the length of this setup makes twisting of the vertical slider more likely. + The biggest challenge is in the construction of the system, especially when the size of the system is increased. + The larger system requires bigger length sliders, which are expensive. + Another difficulty is the actuation of both horizontal sliders, if these sliders do not operate synchronous, the vertical slider will rotate. + However, this is slider is not allowed to rotate, thus probably breaking the system. \begin{figure} \centering \includegraphics[width=8.74cm]{graphics/plotter.pdf} \caption{This Cartesian plotter consists of two horizontal sliders to provide the $x$-movement and one vertical slider to provide the $y$-movement.} \label{fig:plotter} \end{figure} - \subsubsection{Polar-coordinate robot} This robot is a combination of a prismatic and a revolute joint. @@ -143,7 +144,7 @@ \begin{figure} \centering \includegraphics[width=10.8cm]{graphics/combined.pdf} - \caption{Combined system that integrates the cable bot together with the SCARA. The SCARA in red is mounted on the carriage in blue. This carriage is then suspended by cables.} + \caption{Combined system that integrates the cable bot together with the SCARA. The SCARA in red is mounted on the carriage. This carriage is then suspended by cables.} \label{fig:combined} \end{figure} In the combined system, the SCARA will only be large enough to write a small number of characters at the time. From 3d6c4d57f96f27be313ec5dc0aa04d91c39ed1cf Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Wed, 9 Dec 2020 17:38:29 +0100 Subject: [PATCH 08/47] Rework Test protocol --- content/case_experiment_test_protocol.tex | 177 +++++++++++++--------- 1 file changed, 104 insertions(+), 73 deletions(-) diff --git a/content/case_experiment_test_protocol.tex b/content/case_experiment_test_protocol.tex index 6325d5e..79759e1 100644 --- a/content/case_experiment_test_protocol.tex +++ b/content/case_experiment_test_protocol.tex @@ -1,82 +1,113 @@ %&tex - \subsection{Test Protocol} - The last step of the preliminary design is to design tests. - The tests are designed around the specifications. - However, during the creation of the tests it was found that the list of specifications were lacking. - Furthermore, the previous steps did not provide any order of operation. - During this step the order of operation and additional specifications are determined. +\subsection{Test Protocol} + The last step of the preparation phase is to design tests. + The tests are designed to validate if the system meets the specifications. + While defining the tests, it became clear that part of the specifications was not explicitly defined. + As the specifications were made before the design decissisions in the initial design and the feature definition, the specifications did not take that information into account. + Updating the specifications after the design decissions was overlooked during the specification of the design plan. + To ensure the repeatibility of the tests, this step starts with specifying the order of operation and improved specifications. - There are two modes of operation: writing and wiping. - The writing operation can be split in the following steps: - \begin{enumerate} - \item Move cable driven carriage to position of characters. - \item Write three characters with the SCARA. - \item Repeat step 1 and 2 till the Tweet is on the board. - \item Move carriage away from the text on the board. - \end{enumerate} + \subsubsection{Defining the Order of Operation} + There are two modes of operation: writing and wiping. + Defining the order of operation also distributes the responsibility between the different components. + The writing operation can be split in the following steps: + \begin{order}{Writing} + \emph{Precondition:} Marker as end-effector. + \begin{enumerate} + \item Move cable driven carriage to position of characters. + \item Write three characters with the SCARA. + \item Repeat step 1 and 2 till the Tweet is on the board. + \item Move carriage away from the text on the board. + \end{enumerate} + \end{order} - The other operation is wiping. - This is similar to the operation of writing with the following steps: - \begin{enumerate} - \item Move cable driven carriage to position of characters. - \item Clear the area in reach of the SCARA. - \item Repeat step 1 and 2 till the Tweet is removed from on the board. - \end{enumerate} - Furthermore, switching between the states requires the tool to be switched. - As this is a difficult operation there are not yet requirements or order of operation specified. + The other operation is wiping. + This is similar to the operation of writing with the following steps: + \begin{order}{Wiping} + \emph{Precondition:} Wiper as end-effector. + \begin{enumerate} + \item Move cable driven carriage to position of characters. + \item Clear the area in reach of the SCARA. + \item Repeat step 1 and 2 till the Tweet is removed from on the board. + \end{enumerate} + \end{order} + Furthermore, switching between the states requires the tool to be switched. + However, at this point, it is not known how tools will be switched. + Therefore, the order of operation is determined during the development of the end-effector. + Additionally, the missing order of operation for the end-effector did not result in difficulty while defining the tests. - Based on the order of operation, the following specifications were added to the list in \autoref{sec:specifications}: - \begin{enumerate} - \setcounter{enumi}{11} - \item While writing, the SCARA shall have a writing speed of at least 1.5 characters per second. - \item When the Carriage/base of the SCARA is at a static position, the SCARA shall be able to write at least 3 characters at that position. - \item When the SCARA finished writing at their current position, the Carriage shall move the SCARA to it's next position where it can write the subsequent characters. - \item When the SCARA has to be moved to a new position, the Carriage shall perform this movement within 1 second. - \end{enumerate} - These additional specifications are also based on the combined system decission that was made in section \autoref{sec:initialdesign}. - These specifications distribute responsibility between sub-components. + \subsubsection{Improving Specifications} + Based on the order of operation, the following specifications were added to the list in \autoref{sec:specifications}: + \begin{enumerate} + \setcounter{enumi}{11} + \item While writing, the SCARA shall have a writing speed of at least 1.5 characters per second. + \item When the Carriage/base of the SCARA is at a static position, the SCARA shall be able to write at least 3 characters at that position. + \item When the SCARA finished writing at their current position, the Carriage shall move the SCARA to it's next position where it can write the subsequent characters. + \item When the SCARA has to be moved to a new position, the Carriage shall perform this movement within 1 second. + \end{enumerate} + These additional specifications are also based on the combined system decission that was made in section \autoref{sec:initialdesign}. + These specifications distribute responsibility between sub-components. - With the updated specifications it was possible to create a number of test cases. - In total there are five small test cases and four large test cases. - The small tests cover a sub-system and the large tests apply on the complete systems. - Each tests has a list of specifications that are covered with the test and for smaller tests the subsystem under test is also determined. - With a short description it is described how the test should be performed. + \subsubsection{Setting up the tests} + With the updated specifications it was possible to create a number of test cases. + In total there are five small test cases and four large test cases. + The small tests cover a sub-system and the large tests apply on the complete systems. + Each tests has a list of specifications that are covered with the test and for smaller tests the subsystem under test is also determined. + With a short description it is described how the test should be performed. - One of the small tests is performed by drawing a square: - \begin{test} - \begin{description} - \item[Coverage] SCARA - \item[Specifications] 3, 7, 11, 13 - \item[Description] - The SCARA must draw a square of at least \SI{50}{\milli\meter} high and \SI{70}{\milli\meter} wide. - This box is large enough to draw at least 3 characters. - This square should be drawn within one second. - If it is slower than that, it is not able to achieve specification 7. - \end{description} - \end{test} - Repeatability is tested in one of the large system wide tests: - \begin{test} - \begin{description} - \item[Coverage] All features - \item[Specifications] 3, 4, 9, 11 - \item[Description] - To test the repeatability of the system must do four things: - \begin{itemize} - \item The system will be reset. - \item Draw multiple squares (\SI{60}{\milli\meter} x \SI{60}{\milli\meter}) at a random position within the drawing range (\SI{1000}{\milli\meter} x \SI{300}{\milli\meter}). - \item The system will be reset again. - \item Then in a random order, at least different from the order of squares, a circle with a \SI{55}{\milli\meter} diameter must to be drawn inside the squares. - \end{itemize} - The test is successful if the circles are not drawn outside of the squares. - \end{description} - \end{test} + One of the small tests focusses on the speed and range requirements of the SCARA: + \begin{test}{Speed and Range} + During this test, a rectangle will be drawn on the whiteboard using the SCARA. + This rectangle is will be at least \SI{50}{\milli\meter} high and \SI{70}{\milli\meter} wide, such that three characters fit within the rectangle. + To test the speed requirements, the rectangle should be drawn within one second. + \tcbline + \begin{description} + \item[Features:] SCARA + \item[Specifications:] 3, 7, 11, 13 + \item[Results:] The test passes when: + \begin{itemize} + \item Rectangle height is at least \SI{50}{\milli\meter} + \item Rectangle width is at least \SI{70}{\milli\meter} + \item Completion time is less than \SI{1}{\second} + \end{itemize} +% The SCARA must draw a square of at least \SI{50}{\milli\meter} high and \SI{70}{\milli\meter} wide. +% This box is large enough to draw at least 3 characters. +% This square should be drawn within one second. +% If it is slower than that, it is not able to achieve specification 7. + \end{description} + \end{test} + Repeatability is tested in one of the large system wide tests: + \begin{test}{Repeatability} + This tests if the Writer can reach draw repeatedly on the same position on the board. + The system will start with drawing multiple \SI{60}{\milli\meter} squares on the board in a random location. + To test the repeatability, a circle with a \SI{55}{\milli\meter} diameter must be drawn inside of the square. + This should be done with twenty squares in an area of at least \SI{1000}{\milli\meter} x \SI{300}{\milli\meter}. + The drawing order of each square must be different from the drawing order of circles, this ensures that the Cable bot makes a different approach path. + \tcbline + \begin{description} + \item[Features:] SCARA, Cable Bot + \item[Specifications:] 3, 4, 9, 11 + \item[Results:] + The test passes when: + \begin{itemize} + \item Each square has a circle drawn inside. + \item The squares and circles are within \SI{5}{\milli\meter} of their given dimensions. + \item All the circles are completely within their corresponding square. + \end{itemize} + \end{description} + \end{test} - \subsubsection{Evaluation} - This step was completed with not many difficulties. - The specific order of operation and extra specifications should not be part of this step. - It was already concluded that the steps in the preliminary design were not as expected. - The fact that this step resulted in an additional changes only adds to that conclusion. + \subsubsection{Evaluation} + This step was completed without many difficulties. + Even though it required a revision of the earlier specifications and defining order of operation. + However, this is an issue with the preparation phase in general, not with this step in particular. - The design of the test cases resulted in valuable information about the system. - This information would be very useful in an earlier stage of the preliminary design. + During the analysis, I expected more specific tests. + Each test could then be used as a milestone during the development of the system. + Every time detail is added, an additional test passes. + Or a test fails, notifying that something went wrong and should be investigated. + Creating such specific tests relies on the details in the design of the system. + The current design is basic and these details are added during the feature implementation. + Nevertheless, this step resulted in a set of tests that cover all specifications and features that are specified in this preparation phase. + When all the tests pass, the system should meet all the requirements. From a3b5f270da3555c670e49583f2e50bc457e3b7cc Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Wed, 9 Dec 2020 17:42:07 +0100 Subject: [PATCH 09/47] Update submodule --- include | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include b/include index c875326..7901e90 160000 --- a/include +++ b/include @@ -1 +1 @@ -Subproject commit c875326fd17b40f70a50ab641868fdbb1036c14d +Subproject commit 7901e909a15e604df2f978f95d93a34cd369d286 From 3a16ef958b67af1c162b4be7a561d0b6043da7ff Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Thu, 10 Dec 2020 13:44:59 +0100 Subject: [PATCH 10/47] Update submodule --- include | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include b/include index 7901e90..00f6dba 160000 --- a/include +++ b/include @@ -1 +1 @@ -Subproject commit 7901e909a15e604df2f978f95d93a34cd369d286 +Subproject commit 00f6dba02622fda48d1b9921714f53669ab66ffc From a107c4d06baa06f325a8c341112be31a845ccd73 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Thu, 10 Dec 2020 16:05:21 +0100 Subject: [PATCH 11/47] Remove word from intro --- content/case_experiment.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/case_experiment.tex b/content/case_experiment.tex index c35f65c..ddc682b 100644 --- a/content/case_experiment.tex +++ b/content/case_experiment.tex @@ -3,7 +3,7 @@ \label{chap:case_experiment} This chapter presents the execution of the case study. Where the goal of the case study is to evaluate the design plan as presented in \autoref{chap:analysis}. -To achieve this goal, I will develop a system according to the design plan and document this design process. +To achieve this goal, I develop a system according to the design plan and document this design process. The system to be designed is chosen previously in \autoref{sec:sod}. Documenting the process is done by following the evaluation protocol as described in \autoref{sec:evaluation_protocol}. To start the case study unbiased, during the preparation I did perform as little preliminary research as possible on the design options of the "Tweet on a Whiteboard system". From 2c899c7447a55ce7d2d974bc7919c7d633a61c54 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Tue, 15 Dec 2020 17:45:15 +0100 Subject: [PATCH 12/47] Add feedback Tim --- content/case_experiment.tex | 5 +- content/case_experiment_initial_design.tex | 63 +++++++++++-------- .../case_experiment_problem_description.tex | 5 +- content/case_experiment_specifications.tex | 62 ++++++++++-------- graphics/robmosys.tex | 6 +- include | 2 +- 6 files changed, 81 insertions(+), 62 deletions(-) diff --git a/content/case_experiment.tex b/content/case_experiment.tex index ddc682b..2bf0dec 100644 --- a/content/case_experiment.tex +++ b/content/case_experiment.tex @@ -4,9 +4,9 @@ This chapter presents the execution of the case study. Where the goal of the case study is to evaluate the design plan as presented in \autoref{chap:analysis}. To achieve this goal, I develop a system according to the design plan and document this design process. -The system to be designed is chosen previously in \autoref{sec:sod}. +As described in \autoref{sec:sod}, the system to be designed is a "Tweet on a Whiteboard Writer". Documenting the process is done by following the evaluation protocol as described in \autoref{sec:evaluation_protocol}. -To start the case study unbiased, during the preparation I did perform as little preliminary research as possible on the design options of the "Tweet on a Whiteboard system". +To start the case study unbiased, during the preparation I did perform as little preliminary research as possible on the design options of the whiteboard writer. The chapter begins with the section about the preparation phase, which contains the four corresponding design steps as shown in \autoref{fig:design_plan_analysis}. This is followed by two completed development cycles in the later two sections. @@ -31,6 +31,7 @@ Splitting the initial design into features is done in the feature definition ste %\input{content/case_experiment_recap.tex} \section{First Development Cycle} +\input{content/case_experiment_end-effector.tex} \subsection{Feature Selection} \subsection{Rapid Development} \subsection{Variable Approach} diff --git a/content/case_experiment_initial_design.tex b/content/case_experiment_initial_design.tex index f32d76f..620f7ac 100644 --- a/content/case_experiment_initial_design.tex +++ b/content/case_experiment_initial_design.tex @@ -14,7 +14,7 @@ The cable-based positioning systems result in a end-effector with a large range and high velocities. A basic setup can be seen in \autoref{fig:cablebotdrawing}. This given setup contains two cables that are motorized. - The big advantage of this system is that it scales good, as the cables can have almost any length. + The big advantage of this system is that it scales well, as the cables can have almost any length. \begin{figure} \centering \includegraphics[width=10.8cm]{graphics/cablebot.pdf} @@ -25,7 +25,7 @@ \begin{marginfigure} \centering \includegraphics[width=3.74cm]{graphics/cable_angle.pdf} - \caption{Illustrating the limit for horizontal acceleration $a$, for different angles to compensate for gravitational acceleration $g$. + \caption{Illustrating the limit for pure horizontal acceleration $a$, for different angles to compensate for gravitational acceleration $g$. The red arrow represents the acceleration as a result of the pulling force of the cable, which is vectorized in a vertical acceleration that compensates $g$ and a vertical acceleration $a$.} \label{fig:cable_angle} \end{marginfigure} @@ -33,8 +33,8 @@ Although it is possible to achieve high velocities, this system is limited by the gravitational acceleration. In case of vertical acceleration, the maximum downward acceleration or upward deceleration is limited by \SI{9.81}{\meter\per\second\squared}. The horizontal acceleration depends on the relative angle of the suspending cable. - The closer the end-effector is below the cable pulley, the lower the vertical acceleration becomes. - \autoref{fig:cable_angle} illustrates the vertical acceleration for different angles. + The closer the end-effector is below the cable pulley, the lower the pure horizontal acceleration becomes. + \autoref{fig:cable_angle} illustrates the horizontal acceleration for different angles. A possible solution to this is to add one or two additional wires to the system. These can pull on the system to 'assist' the gravitational force. @@ -48,8 +48,8 @@ Because each slider covers a single X or Y axis, the control and dynamics of this system are rather simple. The biggest challenge is in the construction of the system, especially when the size of the system is increased. The larger system requires bigger length sliders, which are expensive. - Another difficulty is the actuation of both horizontal sliders, if these sliders do not operate synchronous, the vertical slider will rotate. - However, this is slider is not allowed to rotate, thus probably breaking the system. + Another difficulty is the actuation of both horizontal sliders, if these sliders do not operate synchronous, the vertical slider rotates. + However, the construction of the slider is not able to rotate, resulting in damage to the system. \begin{figure} \centering \includegraphics[width=8.74cm]{graphics/plotter.pdf} @@ -106,14 +106,21 @@ \subsubsection{Choice of system} The previous sections have shown four different configurations. These configurations are compared in \autoref{tab:initial_design}. - Each of the systems are scored on range, dimension, speed, scaling and the interesting dynamics. + Each of the systems are scored on range, speed, cost, obstruction, effective area, and the interesting dynamics. The range scores the system on the practical dimension of the system, larger is better. The cable and cartesian configuration scale very well, the cables or slider rails can be made longer without real difficulty. The SCARA or polar configuration run into problems with the arm lengths, as forces scale quadratically with their length. - The dimension looks at the number of states that require control and is for all systems defined as 2.5D. - The half dimension is the binary state for the marker on or off the board. Except for the cable bot, all configurations score sufficient on speed. The cable bot can be quick, but is limited in acceleration, and depends on the type of cable configuration. + For the cost, all systems fit within the €200 budget, except for the Cartesian setup. + All systems require some DC or stepper motors, but the cartesian setup also requires linear sliders which are expensive for longer distances. + The obstruction score depends on the capability of the system to move away from the text on the board, such that the system does not obstruct the written tweet. + For the scalability, only the cable bot scores high. + The cables make it possible to easily change the operating range of the system, only requiring reconfiguration. + The cartesian system scales poor because the length of the sliders is fixed, and longer sliders are expensive. + For the Polar system and SCARA, the forces on the joints scale quadratically with the length of the arms. + However, the SCARA can be build with counter balance making it scale less worse than the Polar system. + With the effective area, the system is scored on the area it requires to operated versus the writable area. The last one, how interesting or challenging are the dynamics. The cartesian configuration is trivial, both sliders operate completely separate from each other and the position coordinates can be mapped one to one with the sliders. For the other configuration, some inverse kinematics are required to get from desired position to the control angles of the system. @@ -125,20 +132,23 @@ \cline{2-6} & Cable bot & Cartesian & Polar & SCARA & Combined \\ \hline \multicolumn{1}{|l|}{Range} & + + & + & - - & - & + + \\ \hline - \multicolumn{1}{|l|}{Dimension} & 2.5 & 2.5 & 2.5 & 2.5 & 4.5 \\ \hline \multicolumn{1}{|l|}{Speed} & - & + & + & + + & + \\ \hline - \multicolumn{1}{|l|}{\begin{tabular}[c]{@{}l@{}}Interesting\\ dynamics\end{tabular}} & + & - - & + & + & + + \\ \hline + \multicolumn{1}{|l|}{Cost} & + + & - - & + & + & + \\ \hline + \multicolumn{1}{|l|}{Obstruction} & - & + & + & + & - \\ \hline + \multicolumn{1}{|l|}{Scalability} & + + & - & - - & - & + \\ \hline + \multicolumn{1}{|l|}{\begin{tabular}[c]{@{}l@{}}Effective\\ area\end{tabular}} & + + & + & - - & + & + + \\ \hline + \multicolumn{1}{|l|}{\begin{tabular}[c]{@{}l@{}}Interesting\\ dynamics\end{tabular}} & - & - - & - & + & + + \\ \hline \end{tabular} \end{table} - Based on the dimension, all configurations fail to meet the required four state minimum. - By combining two configurations, it is possible to meet the minimum of four states. - To get the best system, I decided to combine a 'speed' and a 'range' configuration. - This results in a system that has both properties. - Combining anything with the cartesian configurations, creates just a moving base for the other configurations. - Together with the trivial dynamics, this option is discarded. - Suspending the SCARA of the polar configuration with cables creates very interesting dynamics, as moving the end-effector also influences the cables. - From both options, the SCARA is quicker and scales better with range than the polar. - Therefore, the SCARA is chosen above the polar configuration to be combined with the cable bot. + + Based on this comparison, I decided to disqualify the cartesian and polar system. + The cartesian has no interesting dynamics and is expensive to build at a large enough scale. + The polar system is just not feasible, the arm length required to cover the writing area results forces that are too large. + Making the joint that can deliver the torque for that arm and also providing enough speed is just out of the scope of this case study. + The two remaining configurations also contain some downsides. The cable bot is slow, and the arm length for the SCARA is also likely to cause problems. + Therefore, I decided to combine both systems: a cable bot system that moves a small SCARA along the whiteboard. + The small SCARA is quick while the cable bot gives the system an enormous range. + Resulting in a system that scores high on all criteria except obstruction. The grading for the combined system is shown in the most right column in \autoref{tab:initial_design}. \begin{figure} @@ -157,9 +167,10 @@ In hind sight, it would have been useful to have this information during the specifications step. However, as the specifications step are mainly on the "what" to solve, and specifically not on "how" to solve it, this information was avoided on purpose during the specifications step. - This step did result in a initial design that can be used in the next steps. - However, I noticed that none of the previous steps gave some implementation threshold. - For the problem description and the specifications steps this was a minimum implementation level. - This step was a optimal implementation level, the minimum was reached rather quick. - But at what level of implementation needs this step to be concluded? - A related question: Would a simple dynamic model of the initial design be a useful insight or a waste of time? + This step did result in an initial design that can be used in the next steps. + However, I noticed that none of the previous steps have a clear start or end. + For the problem description and the specification steps the question is when all required information is collected. + In the initial design it is always possible continue researching design options to come up with an even better design. + Especially with complex system, it is unrealistic to create complete specifications before making design decissions. + Resulting in the question: at what point do we have enough information and must we move to the next design step? + This is also known as the \emph{requirement versus design paradox} \autocite{fitzgerald_collaborative_2014}. diff --git a/content/case_experiment_problem_description.tex b/content/case_experiment_problem_description.tex index ac39db1..9a6e2f8 100644 --- a/content/case_experiment_problem_description.tex +++ b/content/case_experiment_problem_description.tex @@ -1,6 +1,9 @@ %&tex \subsection{Problem Description} -In the problem description the need for a system can be described as follows: +The problem description describes the need for a solution or system. +In this case, I want a robot that can write a tweet on a whiteboard. +A specific requirement is that the system must be complex enough, such that it uses sufficient aspects of the design method to be able to evaluate that design method. +The system must meet the following requirements: \begin{itemize} \item Write a twitter message, or tweet, on a whiteboard. \item Remove the tweet from the whiteboard. diff --git a/content/case_experiment_specifications.tex b/content/case_experiment_specifications.tex index ab55205..d1b5cda 100644 --- a/content/case_experiment_specifications.tex +++ b/content/case_experiment_specifications.tex @@ -3,18 +3,19 @@ \label{sec:specifications} The next step is to create specifications based on the problem description. The goal is to write and remove a tweet on the whiteboard. - Originally a tweet had a character limit of 140, but this was doubled to 280\footnote{\url{https://blog.twitter.com/official/en_us/topics/product/2017/tweetingmadeeasier.html}}. + Originally a tweet had a character limit of 140, but this was doubled to 280\autocite{rosen_tweeting_2017}. However, for this system the limit remains at 140 characters. The text is limited to fifty characters per line, with a total of three lines. This results in ten extra characters that can be used for word wrapping. For the readability, the distance to a whiteboard in a meeting room is taken as \SI{4}{\meter}. The operating speed should allow the tweet to be written within three minutes. Therefore, the goal is to write one character per second. - The last requirement is to have interesting dynamics. - Looking at simple plotters, they are referred to as 2.5D as the 'third' dimension only describes a binary state. - For this system, the minimum is set to a system that has at least four full states that have to be controlled. + The last requirement is that the dynamics of the system must be sophisticated. + Meaning that a solution with complex or non-trivial behavior is preferred. Using \ac{ears} to define these specifications gives: - \begin{enumerate} + \begin{specification} + \begin{enumerate} + \setlength{\itemsep}{10pt} \item The Writer shall be able to write at least fifty characters per line. \item The Writer shall be able to write at least three of text. \item The Writer shall plot characters with a size that is readable from 4 meters for a person with good eyesight. @@ -22,33 +23,40 @@ \item When a new tweet is send to the Writer, the Writer, shall wipe the existing tweet and write down the new tweet. \item If the Writer is not wiping or writing then the Writer shall not obstruct the view of the whiteboard. \item While writing, the Writer shall have a writing speed of at least one character per second. - \item The Writer shall contain at least four states that require control in order to function. + \item The dynamics of the Writer shall be complex/sophisticated/interesting. \end{enumerate} + \end{specification} Some other specifications that are related to the operation of the system are: - \begin{enumerate} - \setcounter{enumi}{8} - \item If the Writer is tasked to wipe the tweet, the Writer shall wipe the tweet within sixty seconds - \item When a reset-signal is send to the Writer, the Writer shall recalibrate its position on the board. - \item When a wipe-signal is send to the Writer, the Writer shall wipe the board clean. - \item The Writer shall not damage itself. - \end{enumerate} + \begin{specification} + \begin{enumerate} + \setcounter{enumi}{8} + \setlength{\itemsep}{10pt} + \item If the Writer is tasked to wipe the tweet, the Writer shall wipe the tweet within sixty seconds + \item When a reset-signal is send to the Writer, the Writer shall recalibrate its position on the board. + \item When a wipe-signal is send to the Writer, the Writer shall wipe the board clean. + \item The Writer shall not damage itself. + \end{enumerate} + \end{specification} Additionally there are some restrictions on construction. As the rapid prototyping facilities at the university are closed due to the Covid-19 pandemic, the available tooling in reduced to some hobby/DIY tools: - \begin{itemize} - \item The Writer shall not exceed a total cost in materials and/or tools of €200. - \item The Writer shall be constructed with simple tools in the following list: - \begin{itemize} - \item Screwdrivers (Hex/Inbus, Torx, Philips, etc) in different sizes. - \item Drill - \item Screwtaps - \item Jigsaw - \item Wrenches - \item Soldering iron - \item Various Pliers - \item PLA 3D printer - \end{itemize} - \end{itemize} + \begin{specification} + \begin{itemize} + \setlength{\itemsep}{10pt} + \item The Writer shall not exceed a total cost in materials and/or tools of €200. + \item The Writer shall be constructed with simple tools in the following list: + \begin{itemize} + \item Screwdrivers (Hex/Inbus, Torx, Philips, etc) + \item Drill + \item Screwtaps + \item Jigsaw + \item Wrenches + \item Soldering iron + \item Various Pliers + \item PLA 3D printer + \end{itemize} + \end{itemize} + \end{specification} \subsubsection{Evaluation} The specifications step was performed without problems. Defining the specifications for the problem description did not present any difficulty. diff --git a/graphics/robmosys.tex b/graphics/robmosys.tex index 27b040e..ed08c69 100644 --- a/graphics/robmosys.tex +++ b/graphics/robmosys.tex @@ -55,10 +55,6 @@ draw=black!20, thick, fill=white, font=\footnotesize}, (K) edge (N) (K) edge (O) (L) edge (O) - (M) edge (P) - (d) edge (e); - - - + (M) edge (P); \end{tikzpicture} \end{document} diff --git a/include b/include index 00f6dba..c009dc2 160000 --- a/include +++ b/include @@ -1 +1 @@ -Subproject commit 00f6dba02622fda48d1b9921714f53669ab66ffc +Subproject commit c009dc2baa96d33c3c2e89bc156a691f439fdc12 From 7096102440277d8d0d022843978c3930d3d10c93 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Thu, 17 Dec 2020 10:54:53 +0100 Subject: [PATCH 13/47] Add end-effector cycle --- content/case_experiment_end-effector.tex | 71 ++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 content/case_experiment_end-effector.tex diff --git a/content/case_experiment_end-effector.tex b/content/case_experiment_end-effector.tex new file mode 100644 index 0000000..48e006a --- /dev/null +++ b/content/case_experiment_end-effector.tex @@ -0,0 +1,71 @@ +With the preparation phase completed, the development cycle is next. +This consists of three steps: Feature selection, Rapid Development and Variable Approach. +The current section explains the first development cycle during the design. +The end-effector is the feature that is selected in the first cycle. +The implementation of the end-effector was not successful, as the design was too complex. +Fortunately, this failure did give valuable insight on the design method. + + \subsection{Feature Selection} + \begin{table}[] + \caption{Overview of the different features and their dependencies, number of tests that can be completed and the risk/time factor. + The risk/time factor is calculate as risk divided by time.} + \label{tab:firstfeatureselection} + \begin{tabular}{|l|l|l|l|l|l|} + \hline + Feature & Dependees & Tests & Risk & Time & Risk/Time \\ \hline + SCARA & - & 3 & 40\% & 10 days & 4 \\ \hline + End-effector & SCARA & 2 & 60\% & 8 days & 7.5 \\ \hline + Carriage & - & 2 & 30\% & 10 days & 3 \\ \hline + \end{tabular} + \end{table} + The feature is selected according to the feature selection step, explained in \autoref{sec:feature_selection}. + For each component in the system the dependees, tests and risk/time factor is determined. + These values are combined into \autoref{tab:firstfeatureselection}. + + %%%%%Euhm, ja dat staat dus niet in het initial design. + The SCARA is dependent on the end-effector, as was explained in the initial design. + However, for the carriage no dependency was defined even though it has to lift the other two components. + This is mainly because the behavior of the SCARA changes depending on the end-effector, resulting in a possible design change. + For the carriage it only changes the mass that has to be lifted. + Upgrading the motor torque is a minor parametric change and the dependency is therefore insignificant. + + The testing number is directly the number of tests that can be completed by implementing that single component. + For the risk and time it was a engineering judgement and no specific protocol to determine the values. + The estimated risk is high for the end-effector due to the collision dynamics of the operation. + It has to grab something and that is difficult to model. Furthermore, it was not known if that design would work. + The SCARA has the most moving parts, but no difficult dynamics and has therefore an estimated risk of medium. + For the carriage the there was no real risks and got therefore a low risk indication. + + The SCARA would be implemented first based on number of tests, but is dependent on the end-effector. + Beginning with the end-effector is an obvious choices. + It unlocks the SCARA and has the highest risk/time factor. + + \subsubsection{Evaluation} + This first step of the detail design phase did go well. + A more refined method for this step could be very useful. + But the risk and time assessment will probably always be a engineering judgement from the developer. + Within a design team a form of planning poker\footnote{\url{https://en.wikipedia.org/wiki/Planning_poker}{Wikipedia entry: Planning Poker}} could be a good option. + + \subsection{End-effector model} + The end-effector will operate as an interface between the SCARA and the different tools. + For that it has to be able to grab and release the tools. + The initial design is shown in \autoref{fig:gripper}. + With only some experience in modelling with collisions the decision was made to try to make some collisions in the 20-sim 3D mechanics editor. + Unfortunately, collisions in a 20-sim model are difficult. + There is little tooling available and there are no debugging options if the model does not behave as expected. + The marker kept falling trough the gripper or flew away. + With the small amount of progress made in two days the implementation was not promising. + A crash in the software caused the model to corrupt, where the complete configuration of the shapes and their collisions was lost. + Therefore it was decided that end-effector would be removed from the design. + + With the end-effector removed, the SCARA will get a direct connection with the marker. + The lifting of the marker will be included in the SCARA as well. + Furthermore, this means that the wiping will no be possible via the SCARA. + + \subsubsection{Evaluation} + The lost progress of the model is unfortunate, but the implementation did not go expected anyway. + It was probably for the best as it forced an evaluation of the design and avoided a tunnel vision while trying to get it to work. + However, it did show the value of the risk/time analysis. + This early failure resulted in changes for other components. + But as none of the components were implemented yet, no work was lost. + From dfe851560682cb10356d3f54ac851bca092d551f Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Thu, 17 Dec 2020 16:50:22 +0100 Subject: [PATCH 14/47] Add end-effector behavior picture --- content/case_experiment_end-effector.tex | 12 ++- graphics/end-effector.tex | 127 +++++++++++++++++++++++ 2 files changed, 137 insertions(+), 2 deletions(-) create mode 100644 graphics/end-effector.tex diff --git a/content/case_experiment_end-effector.tex b/content/case_experiment_end-effector.tex index 48e006a..6bab988 100644 --- a/content/case_experiment_end-effector.tex +++ b/content/case_experiment_end-effector.tex @@ -22,7 +22,6 @@ Fortunately, this failure did give valuable insight on the design method. For each component in the system the dependees, tests and risk/time factor is determined. These values are combined into \autoref{tab:firstfeatureselection}. - %%%%%Euhm, ja dat staat dus niet in het initial design. The SCARA is dependent on the end-effector, as was explained in the initial design. However, for the carriage no dependency was defined even though it has to lift the other two components. This is mainly because the behavior of the SCARA changes depending on the end-effector, resulting in a possible design change. @@ -30,7 +29,7 @@ Fortunately, this failure did give valuable insight on the design method. Upgrading the motor torque is a minor parametric change and the dependency is therefore insignificant. The testing number is directly the number of tests that can be completed by implementing that single component. - For the risk and time it was a engineering judgement and no specific protocol to determine the values. + For the risk and time it was an engineering judgement and no specific protocol to determine the values. The estimated risk is high for the end-effector due to the collision dynamics of the operation. It has to grab something and that is difficult to model. Furthermore, it was not known if that design would work. The SCARA has the most moving parts, but no difficult dynamics and has therefore an estimated risk of medium. @@ -45,6 +44,15 @@ Fortunately, this failure did give valuable insight on the design method. A more refined method for this step could be very useful. But the risk and time assessment will probably always be a engineering judgement from the developer. Within a design team a form of planning poker\footnote{\url{https://en.wikipedia.org/wiki/Planning_poker}{Wikipedia entry: Planning Poker}} could be a good option. + + \begin{figure} + \centering + \includegraphics[width=0.9\linewidth]{graphics/end-effector.pdf} + \caption{Operation of the end-effector. The marker is clamped in the springloaded end-effector (1). + To release the marker, the upper part of the clamp is placed against the holder (2). This extra arm length is used as a leverage to open clamp while the end-effector moves downwards (3,4). + The arm length also allows to move backwards without disturbing the marker (5,6). To grab the marker, the process is repeated in reverse.} + \label{fig:gripper} + \end{figure} \subsection{End-effector model} The end-effector will operate as an interface between the SCARA and the different tools. diff --git a/graphics/end-effector.tex b/graphics/end-effector.tex new file mode 100644 index 0000000..3a4b14b --- /dev/null +++ b/graphics/end-effector.tex @@ -0,0 +1,127 @@ +%&tex +\documentclass{standalone} +\usepackage{tikz} +\usepackage{siltex} +\usetikzlibrary {calc,arrows.meta,positioning,patterns,math} +%\input{graphics/tics.tikz} + +\begin{document} + \begin{tikzpicture}[x=0.6cm, y=0.6cm] + \def \markerradius {0.5}; + \def \angle {40}; + \def \startangle {-90-\angle}; + \def \stopangle {-90+\angle}; + \def \length{4}; + \def \thick{0.3}; + \def \clampoffset{2}; + \pgfmathsetmacro{\clamppos}{\clampoffset-\markerradius*sin(\angle)}; + \pgfmathsetmacro{\side}{\markerradius*(1-cos(\angle))}; + \def \clampsection {++(${\side}*(0,1)$) arc[start angle=\startangle,end angle=\stopangle,radius=\markerradius] -- ++(${-1*\side}*(0,1)$)}; + \def \blockdistance {2.8} + \def \blockpos {(0,0)}; + \def \markerdrop {0.5}; + \def \spacing {5.5}; + \def \yspacing {3.9}; + \tikzset{ + block/.pic= + { + \def \height {1.5}; + \def \width {1}; + \draw[pattern = north west lines] (\clamppos,-1) -- (\clamppos,-\markerdrop) -- \clampsection -- ++(0,-0.2) -- (\blockdistance,-\markerdrop-0.2) -- (\blockdistance,1) -- (\blockdistance+\width,1) -- (\blockdistance+\width,-1); + }, + upperclamp/.pic= + { + \def \startangle {90+\angle}; + \def \stopangle {90-\angle}; + \def \side {-\markerradius*(1-cos(\angle))}; + \draw[fill=lightgray] (0,0) -- (${\clamppos}*(1,0)$) coordinate(a) -- \clampsection coordinate(b) -- (\length,0) -- ++(0,\thick) -- (0,\thick); + }, + lowerclamp/.pic= + { + \draw[fill=lightgray] (0,0) -- (${\clamppos}*(1,0)$) -- \clampsection -- ++(0,-\thick) -- (0,-\thick); + }, + marker/.pic= + { + \draw[fill=gray] (0,0) circle(\markerradius); + } + } + \def \nodepos {(\blockdistance+1,1.9)}; + \begin{scope}[shift={(0*\spacing,0)}] + \def \eex {1.3}; + \def \eey {-0.5}; + \pgfmathsetmacro{\clampangle}{max(0,atan2(\eey,{\blockdistance+\eex}))}; + \draw \blockpos pic {block}; + \node at \nodepos {1.}; + \draw (2-\eex,{\markerradius+\eey*-1}) pic {marker}; + \begin{scope}[shift={(-\eex,-\eey)}] + \draw (0,0) pic {lowerclamp}; + \draw (0,1) pic[rotate=\clampangle] {upperclamp}; + \end{scope} + \end{scope} + \begin{scope}[shift={(1*\spacing,0)}] + \def \eex {0}; + \def \eey {0}; + \pgfmathsetmacro{\clampangle}{max(0,atan2(\eey,{\blockdistance+\eex}))}; + \draw \blockpos pic {block}; + \node at \nodepos {2.}; + \draw (2,\markerradius) pic {marker}; + \begin{scope}[shift={(-\eex,-\eey)}] + \draw (0,0) pic {lowerclamp}; + \draw (0,1) pic[rotate=\clampangle] {upperclamp}; + \end{scope} + \end{scope} + \begin{scope}[shift={(2*\spacing,0)}] + \def \eex {0}; + \def \eey {0.5}; + \pgfmathsetmacro{\clampangle}{max(0,atan2(\eey,{\blockdistance+\eex}))}; + \draw \blockpos pic {block}; + \node at \nodepos {3.}; + \draw (2,\markerradius-\markerdrop) pic {marker}; + \begin{scope}[shift={(-\eex,-\eey)}] + \draw (0,0) pic {lowerclamp}; + \draw (0,1) pic[rotate=\clampangle] {upperclamp}; + \end{scope} + \end{scope} + \begin{scope}[shift={(0*\spacing,-\yspacing)}] + \def \eex {0}; + \def \eey {0.7}; + \pgfmathsetmacro{\clampangle}{max(0,atan2(\eey,{\blockdistance+\eex}))}; + \draw \blockpos pic {block}; + \node at \nodepos {4.}; + \draw (2,\markerradius-\markerdrop) pic {marker}; + \begin{scope}[shift={(-\eex,-\eey)}] + \draw (0,0) pic {lowerclamp}; + \draw (0,1) pic[rotate=\clampangle] {upperclamp}; + \end{scope} + \end{scope} + \begin{scope}[shift={(1*\spacing,-\yspacing)}] + \def \eex {1}; + \def \eey {0.7}; + \pgfmathsetmacro{\clampangle}{max(0,atan2(\eey,{\blockdistance+\eex}))}; + \draw \blockpos pic {block}; + \node at \nodepos {5.}; + \draw (2,\markerradius-\markerdrop) pic {marker}; + \begin{scope}[shift={(-\eex,-\eey)}] + \draw (0,0) pic {lowerclamp}; + \draw (0,1) pic[rotate=\clampangle] {upperclamp}; + \end{scope} + \end{scope} + \begin{scope}[shift={(2*\spacing,-\yspacing)}] + \def \eex {1}; + \def \eey {0}; + \pgfmathsetmacro{\clampangle}{max(0,atan2(\eey,{\blockdistance-\eex}))}; + \draw \blockpos pic {block}; + \node at \nodepos {6.}; + \draw (2,\markerradius-\markerdrop) pic {marker}; + \begin{scope}[shift={(-\eex,-\eey)}] + \draw (0,0) pic {lowerclamp}; + \draw (0,1) pic[rotate=\clampangle] {upperclamp}; + \end{scope} + \end{scope} + + \draw (4.2,-1.3*\yspacing) -- ++(0,1.9*\yspacing); + \draw[shift={(\spacing,0)}] (4.2,-1.3*\yspacing) -- ++(0,1.9*\yspacing); + \draw(-1.4,-1.5) -- ++(3*\spacing,0); + + \end{tikzpicture} +\end{document} From 3106a8a9cda768c086ed2fa96a490832c49b82e5 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Fri, 18 Dec 2020 16:15:13 +0100 Subject: [PATCH 15/47] Add scara design figure --- graphics/scara_design.tex | 165 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 graphics/scara_design.tex diff --git a/graphics/scara_design.tex b/graphics/scara_design.tex new file mode 100644 index 0000000..be31df2 --- /dev/null +++ b/graphics/scara_design.tex @@ -0,0 +1,165 @@ + +%&tex +\documentclass{standalone} +\usepackage{tikz} +\usepackage{siltex} +\usetikzlibrary {calc,arrows.meta,positioning,patterns,math} +%\input{graphics/tics.tikz} + +\begin{document} + \begin{tikzpicture}[on grid] + % Define Drawing Box dimentions + \def \boxheight {5}; + \def \boxwidth {6}; + \def \boxorigin {(-\boxwidth/2,-1)}; + \def \boxsize {(\boxwidth,\boxheight)}; + \def \armcolor {gray}; + + + \def \width {0.3}; + \def \length {5}; + \def \holediameter {0.10}; + \def \floorheight {0.5}; + \pgfmathsetmacro{\floorwidth}{4}; + \def \arm { + \draw[fill=\armcolor] (0,0) ++(0,\width/2) arc[start angle=90, end angle=270, radius=\width/2] -- ++(\length,0) arc[start angle=-90, end angle=90, radius=\width/2] -- cycle; + \draw[fill=white] (0,0) circle (\holediameter/2); + \draw[fill=white] (\length,0) circle (\holediameter/2); + } + \def \doublescara { + \pgfmathsetmacro{\C}{sqrt(pow(\A,2)+pow(\B,2)-2*\A*\B*cos(\c))}; + \pgfmathsetmacro{\b}{acos((pow(\A,2) + pow(\C,2) - pow(\B,2))/(2*\A*\C))}; + \pgfmathsetmacro{\d}{180-\h-\b}; + \pgfmathsetmacro{\D}{sqrt(pow(\C,2)+pow(\B,2)-2*\B*\C*cos(\d))}; + \pgfmathsetmacro{\g}{acos(\D/(2*\B))}; + \pgfmathsetmacro{\f}{acos((pow(\D,2) + pow(\B,2) - pow(\C,2))/(2*\D*\B))}; + \pgfmathsetmacro{\a}{180-\b-\c}; + \pgfmathsetmacro{\e}{180-\d-\f}; + \pgfmathsetmacro{\k}{180-\f-\g}; + \pgfmathsetmacro{\m}{180-\g-\e-\a}; + \begin{scope}[shift={(-\A/2,0)}, rotate=\c] + \def \length{\B} + \arm + \begin{scope}[shift={(\B,0)}, rotate=-\m] + \def \length{\B} + \arm + \end{scope} + \end{scope} + \begin{scope}[shift={(\A/2,0)}, rotate=\h] + \def \length{\B} + \arm + \begin{scope}[shift={(\B,0)}, rotate=\k] + \def \length{\B} + \arm + \end{scope} + \end{scope} + }; + + + + \tikzset{arm/.pic={ + \def \length {#1} + \draw[fill=gray] (0,0) ++(0,\width/2) arc[start angle=90, end angle=270, radius=\width/2] -- ++(\length,0) arc[start angle=-90, end angle=90, radius=\width/2] -- cycle; + \draw[fill=white] (0,0) circle (\holediameter/2); + \draw[fill=white] (\length,0) circle (\holediameter/2); + }, + floor/.pic={ + \def \width {#1/2}; + \draw (-\width,0) -- (\width,0); + \fill[pattern=north west lines] (-\width,-\floorheight) rectangle (\width,0); + }, + box/.pic={ + \draw \boxorigin rectangle ++\boxsize; + } + }; + + \pgfmathsetmacro{\B}{2}; + \pgfmathsetmacro{\A}{1}; + \begin{scope}[shift={(0,0)}] + \draw (0,0) pic {box}; + \draw (0,0) pic {floor=2}; + \pgfmathsetmacro{\c}{90}; + \pgfmathsetmacro{\h}{40}; + \def \armcolor{lightgray}; + \doublescara; + \pgfmathsetmacro{\c}{130}; + \pgfmathsetmacro{\h}{60}; + \def \armcolor{gray}; + \doublescara; + \end{scope} + + \begin{scope}[shift={(0*\boxwidth,\boxheight)}] + \draw (0,0) pic {box}; + \draw (0,0) pic {floor=2}; + \begin{scope}[shift={(0,0)}, rotate=120] + \def \length{\B} + \arm + \begin{scope}[shift={(\B,0)}, rotate=-100] + \def \length{\B} + \arm + \end{scope} + \end{scope} + \end{scope} + \begin{scope}[shift={(\boxwidth,0*\boxheight)}] + \draw (0,0) pic {box}; + \draw (0,0) pic {floor=2}; + \def \a {105}; + \def \b {5}; + \def \c {\b-\a}; + \def \C {1}; + \def \B {2.5}; + \def \A {3}; + \begin{scope}[shift={(0,0)}, rotate=180+\b] + \def \length{\C} + \begin{scope}[shift={(\length,0)}, rotate=-(180+\c)] + \def \length{\A} + \arm + \begin{scope}[shift={(\length,0)}, rotate=\c] + \def \length{\B+\C} + \arm + \end{scope} + \end{scope} + \arm + \end{scope} + \begin{scope}[shift={(0,0)}, rotate=\a] + \def \length{\A} + \arm + \end{scope} + \begin{scope}[shift={(\C,0)}, rotate=\a] + \def \length{\C} + \begin{scope}[shift={(\length,0)}, rotate=-180-\a] + \def \length{\C} + \arm + \end{scope} + \arm + \end{scope} + \end{scope} + \begin{scope}[shift={(1*\boxwidth,1*\boxheight)}] + \draw (0,0) pic {box}; + \draw (0,0) pic {floor=2}; + \def \a {105}; + \def \b {5}; + \def \c {\b-\a}; + \def \C {1}; + \def \B {2.5}; + \def \A {3}; + \begin{scope}[shift={(0,0)}, rotate=180+\b] + \def \length{\C} + \begin{scope}[shift={(\length,0)}, rotate=-(180+\c)] + \def \length{\A} + \arm + \begin{scope}[shift={(\length,0)}, rotate=\c] + \def \length{\B+\C} + \arm + \end{scope} + \end{scope} + \arm + \end{scope} + \begin{scope}[shift={(0,0)}, rotate=\a] + \def \length{\A} + \arm + \end{scope} + \end{scope} + + \end{tikzpicture} +\end{document} From 22a6b4f72d6a2bae0605f341209a39d613c43c10 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Mon, 4 Jan 2021 12:33:31 +0100 Subject: [PATCH 16/47] Add second development cycle --- content/case_experiment.tex | 7 +- content/case_experiment_scara.tex | 106 ++++++++++++++++++++++++++++++ graphics/scad_carriage.png | Bin 0 -> 34619 bytes 3 files changed, 107 insertions(+), 6 deletions(-) create mode 100644 content/case_experiment_scara.tex create mode 100644 graphics/scad_carriage.png diff --git a/content/case_experiment.tex b/content/case_experiment.tex index 2bf0dec..cf81356 100644 --- a/content/case_experiment.tex +++ b/content/case_experiment.tex @@ -32,12 +32,7 @@ Splitting the initial design into features is done in the feature definition ste \section{First Development Cycle} \input{content/case_experiment_end-effector.tex} - \subsection{Feature Selection} - \subsection{Rapid Development} - \subsection{Variable Approach} \section{Second Development Cycle} - \subsection{Feature Selection} - \subsection{Rapid Development} - \subsection{Variable Approach} +\input{content/case_experiment_scara.tex} diff --git a/content/case_experiment_scara.tex b/content/case_experiment_scara.tex new file mode 100644 index 0000000..84a4435 --- /dev/null +++ b/content/case_experiment_scara.tex @@ -0,0 +1,106 @@ +%&tex + \subsection{Feature Selection} + The implementation of the end-effector proofed to be impractical. + This means that only two features are left. + The updated table in \autoref{tab:featurestab2} shows that the next step would be the SCARA. + The SCARA has a higher risk/time factor and covers more tests. + \begin{table}[] + \caption{} + \label{tab:featurestab2} + \begin{tabular}{|l|l|l|l|l|l|} + \hline + Feature & Dependees & Tests & Risk & Time & Risk/Time \\ \hline + SCARA & - & 3 & 40\% & 10 days & 4 \\ \hline + End-effector & SCARA & 2 & 60\% & 8 days & 7.5 \\ \hline + Carriage & - & 2 & 30\% & 10 days & 3 \\ \hline + \end{tabular} + \end{table} + + \subsection{Rapid Development} + At the end of this implementation the SCARA is able to write the first characters + This will be achieved by working through different levels of detail. + Where each level adds more detail to the model. + The levels that are implemented are as follow: + \begin{enumerate} + \item Basic kinematics model, no physics. + \item Basic physics model, ideal 2D physics. + \item Basic Motor behavior, 2D physics with non-ideal DC-motor. + \item Basic control law, path planning. + \item Advanced motor behavior, 2D physics with stepper motor behavior. + \item Advanced physics model, 3D physics with complex dynamics with Lie-algebra. + \item Marker lifting behavior, servo lifts marker of the board. + \end{enumerate} + This mainly describes the different level of physics detail. + Together with the physics model there will be a solid 3D CAD model. + The CAD model helps to check with dimensions and possible collisions of objects. + + \subsubsection{Basics} + \begin{marginfigure} + \centering + \begin{tikzpicture} + \tikzstyle{arrow} = [-latex,ultra thick] + + % draw roof + \fill[pattern = north east lines] ($ (0,0) + (-1,0) $) rectangle ($ (0,0) + (1,0.5) $); + \draw[thick] ($ (0,0.5) + (-1,0) $) -- ($ (0,0.5) + (1,0) $); + + %draw arm and joints + \fill (0,0.5) circle (0.2); + \draw[thick] (0,0.5) to node[midway,right,draw=none] {$a$} (-1.5,3.5); + \fill (-1.5,3.5) circle (0.2); + \draw[thick] (-1.5,3.5) to node[midway,above,draw=none] {$b$}(1.51,4.26); + + %draw mass + \draw (1.7,4.32) circle (0.2) node {$m$}; + + %draw arc + %\draw[dashed,gray] (-1.5,3.5) -- ++(2.5,0); + %\draw (1,0.5) arc (0:116:1cm) node[above,midway] {$\theta$}; + + %\draw [arrow] (c.south) -- +(0,-1cm) node[midway,right,draw=none] {$F_{g} = m \cdot g$}; + \end{tikzpicture} + \caption{Basic kinematics of the SCARA} + \label{fig:scaraarm} + \end{marginfigure} + The first four detail steps are just creating the basics dynamics of the SCARA as shown in \autoref{fig:scaraarm} + It start with the kinematics model that is used to test the forward and inverse kinematics of the design. + It gave a general idea of angles and arm lengths that are required in the design. + The second detail iteration adds the basic physics of the model. + This model was in the form of a double pendulum, with to powered joints. + The ideal motors in the joints made it that it could move with almost infinite speed. + To get a better idea of the forces in the model, the ideal motors are replaced with a beter motor model. + As the system did not operate with infinite gain anymore it the path planning was updated as well. + A simple PID controller was implemented to make SCARA follow a square path. + + Now that the model forms a basic with the non-ideal motors, basic physics and a controllaw, it can be used to make some estimates. + The model followed the required path in the specified amount out time. + With this, the minimum required torque could be calculated. + Which is then used to dimension the motors. + + \subsubsection{Advanced Model} + The basic model contains all elementary components and detail can be added for different components. + The first step was to improve the motor models. + Up to now it was a primitive model with a source of effort, resistance and gyrator in series. + For the design it was decided to go with a stepper motor. + The advantage of a stepper motor is the holding torque, such that the motor can be forced in a certain angle. + With the new motors the controller was updated, to accommodate for the behavior of the steppers. + + The next step was to upgrade the model to a full three dimensional dynamics. + Although the SCARA model itself is valid in only two dimensions, having the SCARA suspended from wires required the full dimensions. + The dynamics of the SCARA are based on a serial link structure \autocite{dresscher_modeling_2010}. + This allowed for a simple, yet quick implementation of the dynamics. + + \subsubsection{3D modeling} + With a full dynamics model in 20-sim, the next step was to design the system in OpenSCAD. + Although 20-sim has a 3D editor, it is significantly easier to build components with OpenSCAD. + Furthermore, for prototyping the OpenSCAD objects can be exported for 3D printing. + The model made it possible to check component clearance and get an idea of size. + The model is shown in \autoref{fig:scad_carriage}. + \begin{figure} + \centering + \includegraphics[width=0.8\linewidth]{graphics/scad_carriage.png} + \caption{Rendered 3D model of the SCARA} + \label{fig:scad_carriage} + \end{figure} + + \subsection{Variable Approach} diff --git a/graphics/scad_carriage.png b/graphics/scad_carriage.png new file mode 100644 index 0000000000000000000000000000000000000000..c4f8821f4ffbcb79e6a648b0b432bc56e637fe5a GIT binary patch literal 34619 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 Jl(z`_{{ZxwpuYeB literal 0 HcmV?d00001 From 0c83eefe127ac6117992ca27716a114516f30a9f Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Mon, 4 Jan 2021 17:13:01 +0100 Subject: [PATCH 17/47] Update test description box Added all the tests in a box in the appendix. And added a number to the testbox. --- content/appendix_test_cases.tex | 179 ++++++++++++++++++++++ content/case_experiment.tex | 2 +- content/case_experiment_test_protocol.tex | 28 ++-- include | 2 +- report.tex | 10 +- 5 files changed, 203 insertions(+), 18 deletions(-) create mode 100644 content/appendix_test_cases.tex diff --git a/content/appendix_test_cases.tex b/content/appendix_test_cases.tex new file mode 100644 index 0000000..3f689e2 --- /dev/null +++ b/content/appendix_test_cases.tex @@ -0,0 +1,179 @@ +\chapter{Test Specifications} +\label{app:test_specification} +\setcounter{testcounter}{0} + + \begin{test}{Small rectangle} + During this test, a rectangle will be drawn on the whiteboard using the SCARA. + This rectangle is will be at least \SI{50}{\milli\meter} high and \SI{70}{\milli\meter} wide, such that three characters fit within the rectangle. + To test the speed requirements, the rectangle should be drawn within one second. + \tcbline + \begin{description} + \item[Features:] SCARA + \item[Specifications:] 3, 7, 11, 13 + \item[Results:] The test passes when: + \begin{itemize} + \item Rectangle height is at least \SI{50}{\milli\meter} + \item Rectangle width is at least \SI{70}{\milli\meter} + \item Completion time is less than \SI{1}{\second} + \end{itemize} +% The SCARA must draw a square of at least \SI{50}{\milli\meter} high and \SI{70}{\milli\meter} wide. +% This box is large enough to draw at least 3 characters. +% This square should be drawn within one second. +% If it is slower than that, it is not able to achieve specification 7. + \end{description} + \end{test} + + \begin{test}[label={test_perimeter}]{Perimeter} + The carriage must move along the outer edges of the text area. + This area consists of three lines of text with fifty characters each. + Resulting in perimeter of \SI{1000}{\milli\meter} wide and \SI{250}{\milli\meter} high. + This proves that reach of the system is sufficient to write the text. + Furthermore, the carriage should move outside of the perimeter as well. + Moving outside of the text area is to prove that carriage has a position where it does not obstruct the written text. + \tcbline + \begin{description} + \item[Features:] Cable Bot + \item[Specifications:] 1, 2, 6, 11 + \item[Results:] The test passes when: + \begin{itemize} + \item The carriage moved along the edge of the text area. + \item The carriage moved outside of the text area. + \end{itemize} + \end{description} + \end{test} + + + \begin{test}[label={test_speed_carriage}]{Cable Bot Speed} + The carriage must be able to move a distance of \SI{80}{\milli\meter} in horizontal direction to move within a second. + At the start and the end of the movement the speed of the carriage must be zero. + This is to ensure that the SCARA can then write its characters at the given position. + + \tcbline + \begin{description} + \item[Features:] Cable Bot + \item[Specifications:] 7, 14 + \item[Results:] The test passes when: + \begin{itemize} + \item At the start and end of the test, the carriage does not move relative to the board. + \item During the test, the carriage has moved \SI{80}{\milli\meter} within \SI{1}{\second}. + \end{itemize} + \end{description} + \end{test} + + + \begin{test}[label={test_triple_char}]{Triple Chars} + The SCARA together with the end-effector must write 3 characters without + moving the carriage. This extends on the small square but the + end-effector must now be able to lift the marker of the board. The three + characters should be written on the board within two seconds. + + \tcbline + \begin{description} + \item[Features:] SCARA, End-Effector + \item[Specifications:] 3, 4, 12, 13 + \item[Results:] The test passes when: + \begin{itemize} + \item The SCARA wrote three characters on the whiteboard within \SI{1}{\second}. + \item The carriage did not move more than \SI{10}{\milli\meter}. + \end{itemize} + \end{description} + \end{test} + + + \begin{test}[label={test_tool_change}]{Tool Change} + Tool changing is not a specific part of the specification. + However, the system has to switch in some way between the marker and a wiper, or a different color. + For this test the system must switch a tool within 10 seconds. + \tcbline + \begin{description} + \item[Features:] SCARA, End-Effector + \item[Specifications:] 16 + \item[Results:] The test passes when: + \begin{itemize} + \item A tool is released from the end-effector and stored for later use. + \item A different tool is attached to the end-effector. + \item The tool switch is completed within \SI{10}{\second}. + \end{itemize} + \end{description} + \end{test} + + + \begin{test}[label={test_repeat}]{Repeatability} + This tests if the Writer can reach draw repeatedly on the same position on the board. + The system will start with drawing multiple \SI{60}{\milli\meter} squares on the board in a random location. + To test the repeatability, a circle with a \SI{55}{\milli\meter} diameter must be drawn inside of the square. + This should be done with twenty squares in an area of at least \SI{1000}{\milli\meter} x \SI{300}{\milli\meter}. + The drawing order of each square must be different from the drawing order of circles, this ensures that the Cable bot makes a different approach path. + \tcbline + \begin{description} + \item[Features:] SCARA, Cable Bot + \item[Specifications:] 3, 4, 9, 11 + \item[Results:] + The test passes when: + \begin{itemize} + \item Each square has a circle drawn inside. + \item The squares and circles are within \SI{5}{\milli\meter} of their given dimensions. + \item All the circles are completely within their corresponding square. + \end{itemize} + \end{description} + \end{test} + + + \begin{test}[label={test_linear}]{Linearity} + The system must draw a grid on the drawing range (\SI{1000}{\milli\meter} x \SI{300}{\milli\meter}), with the horizontal and vertical lines spaces \SI{100}{\milli\meter} from each other. + The distance between two horizontal or two vertical lines cannot be smaller than \SI{90}{\milli\meter} or larger than \SI{110}{\milli\meter}. + The lines are not allowed to deviate more than \SI{10}{\milli\meter} in a line section of \SI{300}{\milli\meter}. + \tcbline + \begin{description} + \item[Features:] SCARA, End-Effector, Cable Bot + \item[Specifications:] + \item[Results:] The test passes when: + \begin{itemize} + \item All lines are drawn, 11 vertical and 4 horizontal lines. + \item All lines in parallel separated from their neighbor by atleast \SI{90}{\milli\meter} and atmost \SI{110}{\milli\meter}. + \item Each line does not deviate more than \SI{10}{\milli\meter}. + \end{itemize} + \end{description} + \end{test} + + \begin{test}[label={test_writing}]{Writing} + + To test the complete writing abilities the following text must be + written on the board: + +\begin{verbatim} +THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG!?@,.- +0123456789101112131415161718192021222324252627282 +the quick brown fox jumps over the lazy dog!?@,.- +\end{verbatim} + + This is a full 150 character area. It must be readable and write all the + characters correctly. It must be completed withing 150 seconds. Which is + 2 minutes and 30 seconds. + + \tcbline + \begin{description} + \item[Features:] SCARA, End-Effector, Cable Bot + \item[Specifications:] 1, 2, 3, 4, 6, 7, 11, 12, 13, 14, 15 + \item[Results:] The test passes when: + \begin{itemize} + \item The text as described is readable from a atleast \SI{4}{\meter} distance. + \item The text is writen on a clean whiteboard within \SI{150}{\second}. + \end{itemize} + \end{description} + \end{test} + + \begin{test}[label={test_wiping}]{Wiping} + The complete board must be cleared of any marking within 60 seconds. + This is without the change of tool. + + \tcbline + \begin{description} + \item[Features:] SCARA, End-Effector, Cable Bot + \item[Specifications:] 8, 10, 5 + \item[Results:] The test passes when: + \begin{itemize} + \item The system cleaned the board within \SI{60}{\second}. + \end{itemize} + \end{description} + \end{test} diff --git a/content/case_experiment.tex b/content/case_experiment.tex index cf81356..b8894d0 100644 --- a/content/case_experiment.tex +++ b/content/case_experiment.tex @@ -28,7 +28,7 @@ Splitting the initial design into features is done in the feature definition ste \input{content/case_experiment_initial_design.tex} \input{content/case_experiment_feature_definition.tex} \input{content/case_experiment_test_protocol.tex} -%\input{content/case_experiment_recap.tex} +\input{content/case_experiment_recap.tex} \section{First Development Cycle} \input{content/case_experiment_end-effector.tex} diff --git a/content/case_experiment_test_protocol.tex b/content/case_experiment_test_protocol.tex index 79759e1..1565a58 100644 --- a/content/case_experiment_test_protocol.tex +++ b/content/case_experiment_test_protocol.tex @@ -38,13 +38,16 @@ \subsubsection{Improving Specifications} Based on the order of operation, the following specifications were added to the list in \autoref{sec:specifications}: - \begin{enumerate} - \setcounter{enumi}{11} - \item While writing, the SCARA shall have a writing speed of at least 1.5 characters per second. - \item When the Carriage/base of the SCARA is at a static position, the SCARA shall be able to write at least 3 characters at that position. - \item When the SCARA finished writing at their current position, the Carriage shall move the SCARA to it's next position where it can write the subsequent characters. - \item When the SCARA has to be moved to a new position, the Carriage shall perform this movement within 1 second. - \end{enumerate} + \begin{specification} + \begin{enumerate} + \setcounter{enumi}{11} + \item While writing, the SCARA shall have a writing speed of at least 1.5 characters per second. + \item When the Carriage/base of the SCARA is at a static position, the SCARA shall be able to write at least three characters at that position. + \item When the SCARA finished writing at their current position, the Carriage shall move the SCARA to it's next position where it can write the subsequent characters. + \item When the SCARA has to be moved to a new position, the Carriage shall perform this movement within one second. + \item When the system changes from writing to wiping or vice-versa, the SCARA and End-effector should change the tool within ten seconds. + \end{enumerate} + \end{specification} These additional specifications are also based on the combined system decission that was made in section \autoref{sec:initialdesign}. These specifications distribute responsibility between sub-components. @@ -56,7 +59,8 @@ With a short description it is described how the test should be performed. One of the small tests focusses on the speed and range requirements of the SCARA: - \begin{test}{Speed and Range} + \setcounter{testcounter}{0} + \begin{test}[label={rect}]{Small rectangle} During this test, a rectangle will be drawn on the whiteboard using the SCARA. This rectangle is will be at least \SI{50}{\milli\meter} high and \SI{70}{\milli\meter} wide, such that three characters fit within the rectangle. To test the speed requirements, the rectangle should be drawn within one second. @@ -70,14 +74,11 @@ \item Rectangle width is at least \SI{70}{\milli\meter} \item Completion time is less than \SI{1}{\second} \end{itemize} -% The SCARA must draw a square of at least \SI{50}{\milli\meter} high and \SI{70}{\milli\meter} wide. -% This box is large enough to draw at least 3 characters. -% This square should be drawn within one second. -% If it is slower than that, it is not able to achieve specification 7. \end{description} \end{test} Repeatability is tested in one of the large system wide tests: - \begin{test}{Repeatability} + \setcounter{testcounter}{5} + \begin{test}[label={rep}]{Repeatability} This tests if the Writer can reach draw repeatedly on the same position on the board. The system will start with drawing multiple \SI{60}{\milli\meter} squares on the board in a random location. To test the repeatability, a circle with a \SI{55}{\milli\meter} diameter must be drawn inside of the square. @@ -96,6 +97,7 @@ \end{itemize} \end{description} \end{test} + The complete set of system tests is included in \autoref{app:test_specification}. \subsubsection{Evaluation} This step was completed without many difficulties. diff --git a/include b/include index c009dc2..760f11d 160000 --- a/include +++ b/include @@ -1 +1 @@ -Subproject commit c009dc2baa96d33c3c2e89bc156a691f439fdc12 +Subproject commit 760f11d1c941aa977eb1012e679186373144d2eb diff --git a/report.tex b/report.tex index a48eb76..85ffe53 100644 --- a/report.tex +++ b/report.tex @@ -19,11 +19,13 @@ \begin{document} \maketitle -\makerro +\frontmatter \include{include/acronyms} \input{samenvatting} \input{summary} \tableofcontents + +\mainmatter \input{introduction} \input{background} \input{analysis} @@ -34,7 +36,9 @@ \input{improved_design} \input{conclusion} -%\include{introduction} +\appendix +\input{appendix_test_cases} -\printbibliography +\backmatter +\printbibliography[heading=bibintoc,heading=bibnumbered] \end{document} From 4821af5678dd17b7310829b912014ceec57fcc1f Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Tue, 5 Jan 2021 15:05:34 +0100 Subject: [PATCH 18/47] Improve First dev Cycle section --- content/case_experiment_end-effector.tex | 34 ++++++++++++++++++------ 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/content/case_experiment_end-effector.tex b/content/case_experiment_end-effector.tex index 6bab988..a48da70 100644 --- a/content/case_experiment_end-effector.tex +++ b/content/case_experiment_end-effector.tex @@ -54,24 +54,42 @@ Fortunately, this failure did give valuable insight on the design method. \label{fig:gripper} \end{figure} - \subsection{End-effector model} + \subsection{Rapid Development of the End-Effector} The end-effector will operate as an interface between the SCARA and the different tools. For that it has to be able to grab and release the tools. - The initial design is shown in \autoref{fig:gripper}. - With only some experience in modelling with collisions the decision was made to try to make some collisions in the 20-sim 3D mechanics editor. - Unfortunately, collisions in a 20-sim model are difficult. + The end-effector is mounted at the end of the SCARA. + + The development starts with an initial design of the system. + The next step is to develop that further into a model and prototype. + This development did not get past the basic model implementation due to unforeseen difficulties. + However, the evaluation gave new useful insight on the design plan. + + \subsubsection{Initial design} + There are multiple options to connect a tool with a moving arm. + However, there is a trade-off to be made with the SCARA feature, the heavier the end-effector is, the more force the SCARA must deliver. + And because the goal is to make the SCARA light and quick, this end-effector should be light-weight. + The best options in this case is to go with a simple spring-loaded clamp. + It is light-weight, and provides sufficient clamping force and precision for this application. + To release the tool, the clamp must be forced open. + Instead of using a servo, the movement of the SCARA can force the clamp open, resulting in a significant simplification of the design. + The initial design of the clamp and the operation is shown in \autoref{fig:gripper}. + + \subsubsection{Behavior Modelling} + The next step is to implement this design with the corresponding behavior in a dynamic model. + The challenge in this case is the modelling of the contact dynamics. + Based on some experience in modelling with collisions, I decided to use the 20-sim 3D mechanics editor. There is little tooling available and there are no debugging options if the model does not behave as expected. The marker kept falling trough the gripper or flew away. With the small amount of progress made in two days the implementation was not promising. - A crash in the software caused the model to corrupt, where the complete configuration of the shapes and their collisions was lost. - Therefore it was decided that end-effector would be removed from the design. + A system freeze caused the model to corrupt, where the complete configuration of the shapes and their collisions was lost. + Based on the loss of work and the low feasibility of the implementation, it was decided that the end-effector would no longer be part of the design. With the end-effector removed, the SCARA will get a direct connection with the marker. - The lifting of the marker will be included in the SCARA as well. + The lifting of the marker from the will be included in the SCARA as well. Furthermore, this means that the wiping will no be possible via the SCARA. \subsubsection{Evaluation} - The lost progress of the model is unfortunate, but the implementation did not go expected anyway. + The lost progress of the model is unfortunate, but the implementation did not go as expected anyway. It was probably for the best as it forced an evaluation of the design and avoided a tunnel vision while trying to get it to work. However, it did show the value of the risk/time analysis. This early failure resulted in changes for other components. From 5ec7a2d32906b0c306ac5e0ddc55c2b9e70aac49 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Tue, 5 Jan 2021 16:51:42 +0100 Subject: [PATCH 19/47] Improve Second development Cycle --- content/appendix_test_cases.tex | 2 +- content/case_experiment_scara.tex | 87 +++++++++++++++++++++--------- graphics/scara_20sim_model.png | Bin 0 -> 34846 bytes 3 files changed, 64 insertions(+), 25 deletions(-) create mode 100644 graphics/scara_20sim_model.png diff --git a/content/appendix_test_cases.tex b/content/appendix_test_cases.tex index 3f689e2..714e8a2 100644 --- a/content/appendix_test_cases.tex +++ b/content/appendix_test_cases.tex @@ -2,7 +2,7 @@ \label{app:test_specification} \setcounter{testcounter}{0} - \begin{test}{Small rectangle} + \begin{test}[label={test1}]{Small rectangle} During this test, a rectangle will be drawn on the whiteboard using the SCARA. This rectangle is will be at least \SI{50}{\milli\meter} high and \SI{70}{\milli\meter} wide, such that three characters fit within the rectangle. To test the speed requirements, the rectangle should be drawn within one second. diff --git a/content/case_experiment_scara.tex b/content/case_experiment_scara.tex index 84a4435..9220765 100644 --- a/content/case_experiment_scara.tex +++ b/content/case_experiment_scara.tex @@ -1,22 +1,27 @@ %&tex + As the previous development cycle was aborted prematurely, that cycle did not finish. + The second cycle is picks up at the feature selection step in the Development Cycle. + \subsection{Feature Selection} The implementation of the end-effector proofed to be impractical. This means that only two features are left. - The updated table in \autoref{tab:featurestab2} shows that the next step would be the SCARA. - The SCARA has a higher risk/time factor and covers more tests. + The updated table in \autoref{tab:featurestab2} shows the updated feature comparison. + Compared with the previous feature selection in \autoref{tab:firstfeatureselection}, the number of tests for the SCARA decreased and the Risk/Time increased. + This is because System Test \ref{test_tool_change} relied on both the SCARA and the End-effector and is no longer applicable. + Based on the feature comparison, the next component to implement is the SCARA. + \begin{table}[] \caption{} \label{tab:featurestab2} \begin{tabular}{|l|l|l|l|l|l|} \hline Feature & Dependees & Tests & Risk & Time & Risk/Time \\ \hline - SCARA & - & 3 & 40\% & 10 days & 4 \\ \hline - End-effector & SCARA & 2 & 60\% & 8 days & 7.5 \\ \hline + SCARA & - & 2 & 50\% & 12 days & 4.2 \\ \hline Carriage & - & 2 & 30\% & 10 days & 3 \\ \hline \end{tabular} \end{table} - \subsection{Rapid Development} + \subsection{Rapid Development of SCARA} At the end of this implementation the SCARA is able to write the first characters This will be achieved by working through different levels of detail. Where each level adds more detail to the model. @@ -34,7 +39,11 @@ Together with the physics model there will be a solid 3D CAD model. The CAD model helps to check with dimensions and possible collisions of objects. - \subsubsection{Basics} + \subsection{Variable Approach} + The following steps is to increase the detail of the model. + This is done according to the steps in the previous section. + + \subsubsection{Basics implementation} \begin{marginfigure} \centering \begin{tikzpicture} @@ -68,29 +77,60 @@ The second detail iteration adds the basic physics of the model. This model was in the form of a double pendulum, with to powered joints. The ideal motors in the joints made it that it could move with almost infinite speed. - To get a better idea of the forces in the model, the ideal motors are replaced with a beter motor model. + To get a better idea of the forces in the model, the ideal motors are replaced with a better motor model. As the system did not operate with infinite gain anymore it the path planning was updated as well. - A simple PID controller was implemented to make SCARA follow a square path. + A simple PID-controller was implemented to make the SCARA follow a rectangular path. + + \begin{marginfigure} + \centering + \includegraphics[width=0.9\linewidth]{graphics/scara_20sim_model.png} + \caption{3D plot of the current implementation. The rectangular shapes represent are the linkages and implemented as rigid bodies. + The sphere on the origin and the one between both linkages represent the actuated joints. + There is no inertia implemented for these joints.} + \label{fig:scara_20sim} + \end{marginfigure} - Now that the model forms a basic with the non-ideal motors, basic physics and a controllaw, it can be used to make some estimates. - The model followed the required path in the specified amount out time. - With this, the minimum required torque could be calculated. - Which is then used to dimension the motors. + The current implementation can be seen in \autoref{fig:scara_20sim}. + Now that the model forms a basic with the non-ideal motors, basic physics and a control law, it can be used to make some estimates. + The model was configured to follow the required path in the specified amount out time according to System Test \ref{test1}. + The torque required gave a rough estimate of the required actuation force of the motors. + + \subsubsection{Detailed design decisions} + The basic model gave some good insight and information about the dynamic behavior of the system. + However, the current configuration is very simple but requires a motor in the joint. + In \autoref{fig:scaradesign}, this setup is shown as configuration 1. + The disadvantage is that a motorized joint is heavy and has to be accelerated with the rest of the arm. + Other configurations in \autoref{fig:scaradesign} move the motor to a static position. + Configuration 2 is a double arm setup, but has quite limited operating range. + Due to a singularity in the system when both arms at the top are in line with each other. + Configuration 3 also has such a singularity, but due to the extended top arm this point of singularity is outside of the operating range. + However, this configuration requires one axis with two motorized joints on it. + Even though this is possible, it does increase the complexity of the construction. + By adding an extra linkage, the actuation can be split as shown in configuration 4. + \begin{figure} + \centering + \includegraphics[width=0.875\linewidth]{graphics/scara_design.pdf} + \caption{Four different SCARA configurations. The colored circles mark which of the joints are actuated. Configuration 3 has two independently actuated joints on the same position.} + \label{fig:scaradesign} + \end{figure} - \subsubsection{Advanced Model} - The basic model contains all elementary components and detail can be added for different components. - The first step was to improve the motor models. - Up to now it was a primitive model with a source of effort, resistance and gyrator in series. - For the design it was decided to go with a stepper motor. - The advantage of a stepper motor is the holding torque, such that the motor can be forced in a certain angle. - With the new motors the controller was updated, to accommodate for the behavior of the steppers. + The actuation of the arm is done with stepper motors. + The advantage of stepper motors over simple DC-motors is that they hold a specific position. + There is no extra feedback loop required to compensate for external forces. + However, they are heavier and more expensive. + But the extra mass is probably beneficial as adds momentum to the base. + Reducing the counter movement of the base when the arm is actuated. - The next step was to upgrade the model to a full three dimensional dynamics. - Although the SCARA model itself is valid in only two dimensions, having the SCARA suspended from wires required the full dimensions. + \subsubsection{Implementing details} + The first step was to replace the DC-motor with a stepper motor model. + This based on a model by \textcite{karadeniz_modelling_2018}. + The controller is updated as well, to accommodate for the behavior of the steppers, + + The next step is to implement a dynamic model of the configuration (4) as shown in \autoref{fig:scaradesign}. The dynamics of the SCARA are based on a serial link structure \autocite{dresscher_modeling_2010}. - This allowed for a simple, yet quick implementation of the dynamics. - \subsubsection{3D modeling} + + \subsubsection{3D Modeling} With a full dynamics model in 20-sim, the next step was to design the system in OpenSCAD. Although 20-sim has a 3D editor, it is significantly easier to build components with OpenSCAD. Furthermore, for prototyping the OpenSCAD objects can be exported for 3D printing. @@ -103,4 +143,3 @@ \label{fig:scad_carriage} \end{figure} - \subsection{Variable Approach} diff --git a/graphics/scara_20sim_model.png b/graphics/scara_20sim_model.png new file mode 100644 index 0000000000000000000000000000000000000000..a9905bbf9bc0286ceccd6f3b90b5d17cbe03e3b6 GIT binary patch literal 34846 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%0Dw?rITnz{i~z17 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 literal 0 HcmV?d00001 From 8f06513e3b758afd3d4c8f81f04d4684b4f1d8a7 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Tue, 5 Jan 2021 16:53:46 +0100 Subject: [PATCH 20/47] Remove RRO CI-job --- .gitlab-ci.yml | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e0a6788..e91d45e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -2,7 +2,6 @@ --- stages: - typeset - - rro variables: GIT_SUBMODULE_STRATEGY: recursive @@ -13,12 +12,9 @@ final_report: script: - apk update; apk add make - make - - mkdir tmp - - mv RichReportOutline.rro tmp/ artifacts: paths: - report.pdf - - tmp/RichReportOutline.rro only: refs: - web @@ -30,21 +26,3 @@ final_report: - report.tex - content/*.tex - graphics/*.tex - -rro: - stage: rro - dependencies: - - final_report - image: registry.gitlab.com/silkeh/latex:latest - script: - - latexmk -xelatex include/RichReportOutline.tex - artifacts: - paths: - - RichReportOutline.pdf - only: - refs: - - web - - branches - - tags - changes: - - tmp/RichReportOutline.rro From ec340bf7c76a1f7f798249d43ee5af616f92fce7 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Wed, 6 Jan 2021 17:41:33 +0100 Subject: [PATCH 21/47] Add numbers and reorder figure --- graphics/scara_design.tex | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/graphics/scara_design.tex b/graphics/scara_design.tex index be31df2..bae0cee 100644 --- a/graphics/scara_design.tex +++ b/graphics/scara_design.tex @@ -7,13 +7,15 @@ %\input{graphics/tics.tikz} \begin{document} - \begin{tikzpicture}[on grid] + \begin{tikzpicture}[on grid, x=0.75cm, y=0.75cm] % Define Drawing Box dimentions \def \boxheight {5}; \def \boxwidth {6}; \def \boxorigin {(-\boxwidth/2,-1)}; \def \boxsize {(\boxwidth,\boxheight)}; \def \armcolor {gray}; + \def \jointred {\draw[fill=orange] (0,0) circle(0.4);} + \def \jointblue {\draw[fill=blue] (0,0) circle(0.4);} \def \width {0.3}; @@ -38,6 +40,7 @@ \pgfmathsetmacro{\k}{180-\f-\g}; \pgfmathsetmacro{\m}{180-\g-\e-\a}; \begin{scope}[shift={(-\A/2,0)}, rotate=\c] + \jointred \def \length{\B} \arm \begin{scope}[shift={(\B,0)}, rotate=-\m] @@ -46,6 +49,7 @@ \end{scope} \end{scope} \begin{scope}[shift={(\A/2,0)}, rotate=\h] + \jointblue \def \length{\B} \arm \begin{scope}[shift={(\B,0)}, rotate=\k] @@ -73,34 +77,45 @@ } }; - \pgfmathsetmacro{\B}{2}; + \pgfmathsetmacro{\B}{2.3}; \pgfmathsetmacro{\A}{1}; - \begin{scope}[shift={(0,0)}] + \def \nodepos {(2.4,3.4)}; + %rechts boven + \begin{scope}[shift={(1*\boxwidth,1*\boxheight)}] + \node at \nodepos {2.}; \draw (0,0) pic {box}; \draw (0,0) pic {floor=2}; - \pgfmathsetmacro{\c}{90}; - \pgfmathsetmacro{\h}{40}; - \def \armcolor{lightgray}; - \doublescara; + %\pgfmathsetmacro{\c}{90}; + %\pgfmathsetmacro{\h}{40}; + %\def \armcolor{lightgray}; + %\doublescara; \pgfmathsetmacro{\c}{130}; \pgfmathsetmacro{\h}{60}; \def \armcolor{gray}; \doublescara; \end{scope} + + % Links boven \begin{scope}[shift={(0*\boxwidth,\boxheight)}] + \node at \nodepos {1.}; \draw (0,0) pic {box}; \draw (0,0) pic {floor=2}; \begin{scope}[shift={(0,0)}, rotate=120] + \jointred \def \length{\B} \arm \begin{scope}[shift={(\B,0)}, rotate=-100] + \jointblue \def \length{\B} \arm \end{scope} \end{scope} \end{scope} + + %rechts onder \begin{scope}[shift={(\boxwidth,0*\boxheight)}] + \node at \nodepos {4.}; \draw (0,0) pic {box}; \draw (0,0) pic {floor=2}; \def \a {105}; @@ -110,6 +125,7 @@ \def \B {2.5}; \def \A {3}; \begin{scope}[shift={(0,0)}, rotate=180+\b] + \jointblue \def \length{\C} \begin{scope}[shift={(\length,0)}, rotate=-(180+\c)] \def \length{\A} @@ -126,6 +142,7 @@ \arm \end{scope} \begin{scope}[shift={(\C,0)}, rotate=\a] + \jointred \def \length{\C} \begin{scope}[shift={(\length,0)}, rotate=-180-\a] \def \length{\C} @@ -134,7 +151,10 @@ \arm \end{scope} \end{scope} - \begin{scope}[shift={(1*\boxwidth,1*\boxheight)}] + + % Links onder + \begin{scope}[shift={(0,0)}] + \node at \nodepos {3.}; \draw (0,0) pic {box}; \draw (0,0) pic {floor=2}; \def \a {105}; @@ -144,6 +164,7 @@ \def \B {2.5}; \def \A {3}; \begin{scope}[shift={(0,0)}, rotate=180+\b] + \draw[fill=blue] (0,0) circle(0.5); \def \length{\C} \begin{scope}[shift={(\length,0)}, rotate=-(180+\c)] \def \length{\A} @@ -156,6 +177,7 @@ \arm \end{scope} \begin{scope}[shift={(0,0)}, rotate=\a] + \jointred \def \length{\A} \arm \end{scope} From e5791cc30b824da8f7f737eeb6b9174c1990c5cd Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Thu, 7 Jan 2021 13:56:49 +0100 Subject: [PATCH 22/47] Remove recap --- content/case_experiment.tex | 1 - 1 file changed, 1 deletion(-) diff --git a/content/case_experiment.tex b/content/case_experiment.tex index b8894d0..55e56ff 100644 --- a/content/case_experiment.tex +++ b/content/case_experiment.tex @@ -28,7 +28,6 @@ Splitting the initial design into features is done in the feature definition ste \input{content/case_experiment_initial_design.tex} \input{content/case_experiment_feature_definition.tex} \input{content/case_experiment_test_protocol.tex} -\input{content/case_experiment_recap.tex} \section{First Development Cycle} \input{content/case_experiment_end-effector.tex} From e127069ab470071dd564a2251a28f664d8409896 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Thu, 7 Jan 2021 17:16:21 +0100 Subject: [PATCH 23/47] Rework scara kinematics figure --- content/case_experiment_scara.tex | 23 +----------------- graphics/scara_arm_kinematics.tex | 39 +++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 22 deletions(-) create mode 100644 graphics/scara_arm_kinematics.tex diff --git a/content/case_experiment_scara.tex b/content/case_experiment_scara.tex index 9220765..ccaaafc 100644 --- a/content/case_experiment_scara.tex +++ b/content/case_experiment_scara.tex @@ -46,28 +46,7 @@ \subsubsection{Basics implementation} \begin{marginfigure} \centering - \begin{tikzpicture} - \tikzstyle{arrow} = [-latex,ultra thick] - - % draw roof - \fill[pattern = north east lines] ($ (0,0) + (-1,0) $) rectangle ($ (0,0) + (1,0.5) $); - \draw[thick] ($ (0,0.5) + (-1,0) $) -- ($ (0,0.5) + (1,0) $); - - %draw arm and joints - \fill (0,0.5) circle (0.2); - \draw[thick] (0,0.5) to node[midway,right,draw=none] {$a$} (-1.5,3.5); - \fill (-1.5,3.5) circle (0.2); - \draw[thick] (-1.5,3.5) to node[midway,above,draw=none] {$b$}(1.51,4.26); - - %draw mass - \draw (1.7,4.32) circle (0.2) node {$m$}; - - %draw arc - %\draw[dashed,gray] (-1.5,3.5) -- ++(2.5,0); - %\draw (1,0.5) arc (0:116:1cm) node[above,midway] {$\theta$}; - - %\draw [arrow] (c.south) -- +(0,-1cm) node[midway,right,draw=none] {$F_{g} = m \cdot g$}; - \end{tikzpicture} + \includegraphics[width=0.9\linewidth]{graphics/scara_arm_kinematics.pdf} \caption{Basic kinematics of the SCARA} \label{fig:scaraarm} \end{marginfigure} diff --git a/graphics/scara_arm_kinematics.tex b/graphics/scara_arm_kinematics.tex new file mode 100644 index 0000000..985fe9a --- /dev/null +++ b/graphics/scara_arm_kinematics.tex @@ -0,0 +1,39 @@ +%&tex +\documentclass{standalone} +\usepackage{tikz} +\usepackage{siltex} +\usetikzlibrary{calc,positioning,patterns,math} + +\begin{document} +\begin{tikzpicture}[x=0.75cm, y=0.75cm] + \tikzstyle{arrow} = [-latex,ultra thick] + + % draw roof + \fill[pattern = north east lines] ($ (0,0) + (-1,0) $) rectangle ($ (0,0) + (1,0.5) $); + \draw[thick] ($ (0,0.5) + (-1,0) $) -- ($ (0,0.5) + (1,0) $); + + %draw arm and joints + \pgfmathsetmacro{\alphahoek}{120}; + \pgfmathsetmacro{\a}{4}; + \pgfmathsetmacro{\betahoek}{-105}; + \pgfmathsetmacro{\b}{4}; + \pgfmathsetmacro{\radius}{0.8}; + \begin{scope}[shift={(0,0.5)}] + \draw (\radius,0) arc [start angle=0, end angle=\alphahoek, radius=\radius] node[above,midway] {$\alpha$}; + \begin{scope}[rotate=\alphahoek] + \fill (0,0) circle (0.2); + \draw[thick] (0,0) to node[midway,right,draw=none] {$a$} (\a,0); + \begin{scope}[shift={(\a,0)}] + \draw (-\radius,0) arc [start angle=-180, end angle=\betahoek, radius=\radius] node[right,midway] {$\beta$}; + \begin{scope}[rotate=\betahoek] + \fill (0,0) circle (0.2); + \draw[thick] (0,0) to node[midway,below,draw=none] {$b$} (\b,0); + \begin{scope}[shift={(\b,0)}] + \draw[fill=white] (0,0) circle (0.3) node {$m$}; + \end{scope} + \end{scope} + \end{scope} + \end{scope} + \end{scope} +\end{tikzpicture} +\end{document} From 8d363878c69c2dbc8cfae399a98c02ca8ae7bca9 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Thu, 7 Jan 2021 17:43:02 +0100 Subject: [PATCH 24/47] Add specifications overview to appendix --- content/appendix_specifications.tex | 24 ++++++++++++++++++++++++ include | 2 +- report.tex | 1 + 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 content/appendix_specifications.tex diff --git a/content/appendix_specifications.tex b/content/appendix_specifications.tex new file mode 100644 index 0000000..f9ead32 --- /dev/null +++ b/content/appendix_specifications.tex @@ -0,0 +1,24 @@ +%&tex +\chapter{System Specifications} + \begin{specification} + \begin{enumerate} + \setlength{\itemsep}{10pt} + \item The Writer shall be able to write at least fifty characters per line. + \item The Writer shall be able to write at least three of text. + \item The Writer shall plot characters with a size that is readable from 4 meters for a person with good eyesight. + \item The Writer shall plot in a regular used font with corresponding character spacing. + \item When a new tweet is send to the Writer, the Writer, shall wipe the existing tweet and write down the new tweet. + \item If the Writer is not wiping or writing then the Writer shall not obstruct the view of the whiteboard. + \item While writing, the Writer shall have a writing speed of at least one character per second. + \item The dynamics of the Writer shall be complex/sophisticated/interesting. + \item If the Writer is tasked to wipe the tweet, the Writer shall wipe the tweet within sixty seconds + \item When a reset-signal is send to the Writer, the Writer shall recalibrate its position on the board. + \item When a wipe-signal is send to the Writer, the Writer shall wipe the board clean. + \item The Writer shall not damage itself. + \item While writing, the SCARA shall have a writing speed of at least 1.5 characters per second. + \item When the Carriage/base of the SCARA is at a static position, the SCARA shall be able to write at least three characters at that position. + \item When the SCARA finished writing at their current position, the Carriage shall move the SCARA to it's next position where it can write the subsequent characters. + \item When the SCARA has to be moved to a new position, the Carriage shall perform this movement within one second. + \item When the system changes from writing to wiping or vice-versa, the SCARA and End-effector should change the tool within ten seconds. + \end{enumerate} + \end{specification} diff --git a/include b/include index 760f11d..e812986 160000 --- a/include +++ b/include @@ -1 +1 @@ -Subproject commit 760f11d1c941aa977eb1012e679186373144d2eb +Subproject commit e8129869df0b121e0b4aafe70ffbcab4183ec03b diff --git a/report.tex b/report.tex index 85ffe53..4f27be3 100644 --- a/report.tex +++ b/report.tex @@ -38,6 +38,7 @@ \appendix \input{appendix_test_cases} +\input{appendix_specifications} \backmatter \printbibliography[heading=bibintoc,heading=bibnumbered] From 94bb9b1cfbd8ddeef4d9f7cb32c9cb755dfce814 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Fri, 8 Jan 2021 16:54:16 +0100 Subject: [PATCH 25/47] Fix typo --- content/case_experiment_recap.tex | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/content/case_experiment_recap.tex b/content/case_experiment_recap.tex index 1da1c7c..1c08c5e 100644 --- a/content/case_experiment_recap.tex +++ b/content/case_experiment_recap.tex @@ -1,8 +1,7 @@ %&tex \subsection{Recap} During the problem definition and the specifications step it was difficult to stay within the "what" has to be solved and not go into the "how" it has to be solved. - Furthermore, - The test definitions of the last step conclude the preliminary design phase. + Furthermore, the test definitions of the last step conclude the preliminary design phase. This preliminary design shows a clear notion of a hasty execution from a design standpoint. The preliminary design was performed over a period of 5 weeks, by one developer with little experience in design documentation. This makes notion of hasty not surprising for this unproven design method. From c429551c9cf75926be42ef3106f8a6b63e6a71eb Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Fri, 8 Jan 2021 16:55:15 +0100 Subject: [PATCH 26/47] Fix specifications numbering --- content/case_experiment_test_protocol.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/case_experiment_test_protocol.tex b/content/case_experiment_test_protocol.tex index 1565a58..6652b17 100644 --- a/content/case_experiment_test_protocol.tex +++ b/content/case_experiment_test_protocol.tex @@ -40,7 +40,7 @@ Based on the order of operation, the following specifications were added to the list in \autoref{sec:specifications}: \begin{specification} \begin{enumerate} - \setcounter{enumi}{11} + \setcounter{enumi}{12} \item While writing, the SCARA shall have a writing speed of at least 1.5 characters per second. \item When the Carriage/base of the SCARA is at a static position, the SCARA shall be able to write at least three characters at that position. \item When the SCARA finished writing at their current position, the Carriage shall move the SCARA to it's next position where it can write the subsequent characters. From 65657b0e61e1e4e01599af1ed400b86bcdc15a8b Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Fri, 8 Jan 2021 16:56:10 +0100 Subject: [PATCH 27/47] Update second cycle section --- content/appendix_specifications.tex | 2 +- content/case_experiment_end-effector.tex | 1 + content/case_experiment_scara.tex | 132 ++++++++++++++++------- 3 files changed, 93 insertions(+), 42 deletions(-) diff --git a/content/appendix_specifications.tex b/content/appendix_specifications.tex index f9ead32..1535ed4 100644 --- a/content/appendix_specifications.tex +++ b/content/appendix_specifications.tex @@ -16,7 +16,7 @@ \item When a wipe-signal is send to the Writer, the Writer shall wipe the board clean. \item The Writer shall not damage itself. \item While writing, the SCARA shall have a writing speed of at least 1.5 characters per second. - \item When the Carriage/base of the SCARA is at a static position, the SCARA shall be able to write at least three characters at that position. + \item When the Carriage/base of the SCARA is at a static position, the SCARA shall be able to write at least three characters at that position. \label{threecharspec} \item When the SCARA finished writing at their current position, the Carriage shall move the SCARA to it's next position where it can write the subsequent characters. \item When the SCARA has to be moved to a new position, the Carriage shall perform this movement within one second. \item When the system changes from writing to wiping or vice-versa, the SCARA and End-effector should change the tool within ten seconds. diff --git a/content/case_experiment_end-effector.tex b/content/case_experiment_end-effector.tex index a48da70..276cf2f 100644 --- a/content/case_experiment_end-effector.tex +++ b/content/case_experiment_end-effector.tex @@ -6,6 +6,7 @@ The implementation of the end-effector was not successful, as the design was too Fortunately, this failure did give valuable insight on the design method. \subsection{Feature Selection} + \label{sec:case_feature_selection_1} \begin{table}[] \caption{Overview of the different features and their dependencies, number of tests that can be completed and the risk/time factor. The risk/time factor is calculate as risk divided by time.} diff --git a/content/case_experiment_scara.tex b/content/case_experiment_scara.tex index ccaaafc..1e2fce8 100644 --- a/content/case_experiment_scara.tex +++ b/content/case_experiment_scara.tex @@ -21,45 +21,68 @@ \end{tabular} \end{table} - \subsection{Rapid Development of SCARA} - At the end of this implementation the SCARA is able to write the first characters - This will be achieved by working through different levels of detail. - Where each level adds more detail to the model. - The levels that are implemented are as follow: + \subsubsection{Evaluation} + The feature selection for the second cycle is an updated selection process of the first cycle (\autoref{sec:case_feature_selection_1}). + This resulted in a quick and effortless feature selection process. + + \subsection{Rapid Development for SCARA} + The goal is to present a functional model of the SCARA. + Based on the tests and requirements, it must be able to write three characters within 2 seconds. + The basic design principle is based on the initial design and shown in \autoref{fig:combined}. + The lowest level of detail is a kinematics model of the design. + This does not involve any physics simulation yet, but gives insight in the operation range, arm length and joint behavior. + In the following steps, the level of detail is gradually increased until it is a competent model. + However, planning all the different steps in advance is difficult as design decisions still need to be made. + Nonetheless, I can describe at least the following levels of detail for the model: \begin{enumerate} \item Basic kinematics model, no physics. \item Basic physics model, ideal 2D physics. \item Basic Motor behavior, 2D physics with non-ideal DC-motor. \item Basic control law, path planning. - \item Advanced motor behavior, 2D physics with stepper motor behavior. - \item Advanced physics model, 3D physics with complex dynamics with Lie-algebra. - \item Marker lifting behavior, servo lifts marker of the board. \end{enumerate} - This mainly describes the different level of physics detail. - Together with the physics model there will be a solid 3D CAD model. - The CAD model helps to check with dimensions and possible collisions of objects. + After these steps the optimal order of implementation for the levels of detail becomes vague. + However, the following elements are required to make a competent model: + \begin{itemize} + \item Improved motor model + \item 3D physics model + \end{itemize} + When the first design decisions made, the succeeding levels of detail for these and other elements are laid out. + + + \subsubsection{Evaluation} + The current steps in the rapid development are difficult to perform. + There is, unsurprisingly, lack of a clear vision of the end-product. + Making describing all the different levels of detail explicitly farfetched. + However, it was still possible to describe some levels of detail and a couple of expected elements that are added later. - \subsection{Variable Approach} + \subsection{Variable Detail Approach} The following steps is to increase the detail of the model. This is done according to the steps in the previous section. - \subsubsection{Basics implementation} + \subsubsection{Basic Kinematics Model} \begin{marginfigure} \centering \includegraphics[width=0.9\linewidth]{graphics/scara_arm_kinematics.pdf} - \caption{Basic kinematics of the SCARA} + \caption{Basic kinematics of the SCARA. The arm consists of two linkages $a$ and $b$; two joints $\alpha$ and $\beta$; and a point mass $m$ which represents the end-effector/tool.} \label{fig:scaraarm} \end{marginfigure} - The first four detail steps are just creating the basics dynamics of the SCARA as shown in \autoref{fig:scaraarm} - It start with the kinematics model that is used to test the forward and inverse kinematics of the design. - It gave a general idea of angles and arm lengths that are required in the design. - The second detail iteration adds the basic physics of the model. - This model was in the form of a double pendulum, with to powered joints. - The ideal motors in the joints made it that it could move with almost infinite speed. - To get a better idea of the forces in the model, the ideal motors are replaced with a better motor model. - As the system did not operate with infinite gain anymore it the path planning was updated as well. - A simple PID-controller was implemented to make the SCARA follow a rectangular path. + The development starts with a basic model model as shown in \autoref{fig:scaraarm}. + It consists of the forward and inverse kinematics of the design. + With this kinematics model it was easy to find a good configuration of the SCARA. + I tested if the SCARA could reach the required operating area, to be able to satisfy specification \ref{threecharspec}. + The operating area is not a couple of centimeters away from the base of the SCARA. + This is to avoid the singularity point that lies at the base of the SCARA. + Resulting in longer arms than strictly necessary but this reduces the operating angles of the joints allowing for simpler construction. + At this point, there are already multiple design decisions made about the position of the operating area and the arm lengths. + The second detail iteration adds the basic physics of the model. + This model was in the form of a double pendulum, with two attenuated joints. + The ideal motors in the joints made gave the SCARA almost unlimited acceleration. + As the one of the goals is to get an indication on what the required torque for these joints is, the ideal motors are replaced with basic DC-motors. + Implementing a simple PID-controller allowed the SCARA to follow the rectangular path as described in system test \ref{test1}. + Based the simulation, it was possible to determine minimum specifications of the motors. + The motors must be able to deliver at least \SI{0.2}{\newton\meter} of torque and reach an angular velocity of at least \SI{12}{\radian\per\second}. + \begin{marginfigure} \centering \includegraphics[width=0.9\linewidth]{graphics/scara_20sim_model.png} @@ -96,29 +119,56 @@ The actuation of the arm is done with stepper motors. The advantage of stepper motors over simple DC-motors is that they hold a specific position. There is no extra feedback loop required to compensate for external forces. - However, they are heavier and more expensive. - But the extra mass is probably beneficial as adds momentum to the base. - Reducing the counter movement of the base when the arm is actuated. + They are heavier and more expensive as well. + The additional mass is probably beneficial as adds momentum to the base, reducing the counter movement of the base when the arm is actuated. + The extra costs are easily compensated as it save development time due to the simplified control law. + + Due to the aborted implementation of the end-effector, the SCARA must also lift the marker of the board. + The chosen configuration of the SCARA makes it possible to add an extra joint in the linkage. + As the marker only needs to be moved a couple of millimeters from the board, a simple servo suffices. \subsubsection{Implementing details} + The new concrete design decisions, make it possible to plan the next steps of adding detail. + The following steps are an addition of steps in as described in the previous section: + \begin{enumerate} + \setcounter{enumi}{4} + \item Stepper motor behavior. + \item Updating physics model to 3D physics. + \item Marker lifting behavior, servo lifts marker of the board. + \end{enumerate} The first step was to replace the DC-motor with a stepper motor model. - This based on a model by \textcite{karadeniz_modelling_2018}. - The controller is updated as well, to accommodate for the behavior of the steppers, - + This is based on a model by \textcite{karadeniz_modelling_2018}. + The controller is updated as well, to accommodate for the behavior of the steppers. The next step is to implement a dynamic model of the configuration (4) as shown in \autoref{fig:scaradesign}. The dynamics of the SCARA are based on a serial link structure \autocite{dresscher_modeling_2010}. + This serial link structure was makes it easy to add or extend joints and bodies to the system. + Therefore, the last detail, the marker lifting, was added without any difficulty. + The servo is connected via a linkage with the marker such that it rotates away from the board. + \subsubsection{Evaluation} + The complete development was rather smooth. + However, this was not without deviating from the original design plan. + The different levels of detail could not be defined before the start of the development but had to be updated midway. - \subsubsection{3D Modeling} - With a full dynamics model in 20-sim, the next step was to design the system in OpenSCAD. - Although 20-sim has a 3D editor, it is significantly easier to build components with OpenSCAD. - Furthermore, for prototyping the OpenSCAD objects can be exported for 3D printing. - The model made it possible to check component clearance and get an idea of size. - The model is shown in \autoref{fig:scad_carriage}. - \begin{figure} - \centering - \includegraphics[width=0.8\linewidth]{graphics/scad_carriage.png} - \caption{Rendered 3D model of the SCARA} - \label{fig:scad_carriage} - \end{figure} + In total there are seven predefined levels of detail in the design. + Meaning that there must also be seven test cycles. + However, I noticed that this number was significantly higher. + During the design, running the simulation of the dynamics is easy. + Resulting in extremely short feedback loops, sometimes even minutes. + For example, changing the arm lengths and evaluate the new behavior. + Did it improve? Is this as expected? + Implicitly, the system was very often tested and changed based on test results. + + Furthermore, the step from 2D to 3D physics was in no means a small increment in detail. + The first four levels of detail, as describe in the previous section, all were implemented in with two dimensions. + As the later details required a third dimension, all the detail was directly converted from 2D into 3D. + This is a large amount of work, introducing a high cost when the conversion fails. + Moreover, it creates a new 3D physics model, parallel to the 2D physics model instead of adding detail to the latter. + Alternative approaches for 3D model physics could be: + \begin{itemize} + \item Ignore 2D and start implementation in 3D modelling. + \item Retrace all incremental detail steps of the 2D model in a 3D model. + \end{itemize} + Both options are not ideal, the first one does not allow a simple basic model and the second approach redoes work. + The advantage of starting with 3D is that allows for a continuous development of one model, instead of switching the complete model. From 6cd77f19a1a699f83a69acb3aa0852901bb9f2c3 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Mon, 11 Jan 2021 15:51:58 +0100 Subject: [PATCH 28/47] Add system design validation section --- content/case_experiment.tex | 3 +++ content/case_experiment_prototype.tex | 15 +++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 content/case_experiment_prototype.tex diff --git a/content/case_experiment.tex b/content/case_experiment.tex index 55e56ff..8eea9c1 100644 --- a/content/case_experiment.tex +++ b/content/case_experiment.tex @@ -35,3 +35,6 @@ Splitting the initial design into features is done in the feature definition ste \section{Second Development Cycle} \input{content/case_experiment_scara.tex} +\section{System Design Validation} +\input{content/case_experiment_prototype.tex} + diff --git a/content/case_experiment_prototype.tex b/content/case_experiment_prototype.tex new file mode 100644 index 0000000..e1647ea --- /dev/null +++ b/content/case_experiment_prototype.tex @@ -0,0 +1,15 @@ + Together with the physics model there will be a solid 3D CAD model. + The CAD model helps to check with dimensions and possible collisions of objects. + With a full dynamics model in 20-sim, the next step was to design the system in OpenSCAD. + Although 20-sim has a 3D editor, it is significantly easier to build components with OpenSCAD. + Furthermore, for prototyping the OpenSCAD objects can be exported for 3D printing. + The model made it possible to check component clearance and get an idea of size. + The model is shown in \autoref{fig:scad_carriage}. + \begin{figure} + \centering + \includegraphics[width=0.8\linewidth]{graphics/scad_carriage.png} + \caption{Rendered 3D model of the SCARA} + \label{fig:scad_carriage} + \end{figure} + + From b92af707ead7c4c9c6bc3af449c2e40531ae7bfb Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Tue, 12 Jan 2021 17:00:38 +0100 Subject: [PATCH 29/47] Add prototyping section --- content/case_experiment_prototype.tex | 48 +++++++++++++++++++------- content/case_experiment_scara.tex | 1 + graphics/scad_carriage.png | Bin 34619 -> 78213 bytes graphics/scad_scara.png | Bin 0 -> 35104 bytes graphics/scad_scara_circles.png | Bin 0 -> 95506 bytes include | 2 +- 6 files changed, 37 insertions(+), 14 deletions(-) create mode 100644 graphics/scad_scara.png create mode 100644 graphics/scad_scara_circles.png diff --git a/content/case_experiment_prototype.tex b/content/case_experiment_prototype.tex index e1647ea..e4d50aa 100644 --- a/content/case_experiment_prototype.tex +++ b/content/case_experiment_prototype.tex @@ -1,15 +1,37 @@ - Together with the physics model there will be a solid 3D CAD model. - The CAD model helps to check with dimensions and possible collisions of objects. - With a full dynamics model in 20-sim, the next step was to design the system in OpenSCAD. - Although 20-sim has a 3D editor, it is significantly easier to build components with OpenSCAD. - Furthermore, for prototyping the OpenSCAD objects can be exported for 3D printing. - The model made it possible to check component clearance and get an idea of size. - The model is shown in \autoref{fig:scad_carriage}. - \begin{figure} - \centering - \includegraphics[width=0.8\linewidth]{graphics/scad_carriage.png} - \caption{Rendered 3D model of the SCARA} - \label{fig:scad_carriage} - \end{figure} +To ensure that the design method resulted in a functional system, a prototype will be build from the current state of the design. +Although the development only implemented a very small portion of the full design, I determined that a prototype is more valuable than repeating the development cycle for the next feature. +For the construction of the prototype \ac{ots}-parts are used as much as possible and the mechanical linkages of the SCARA will be printed. +To write characters on a whiteboard, drivers and controlloop have to be implemented in software. +\subsection{Construction} + The construction of the SCARA consists of a 3D printed mechanical structure that is actuated with stepper motors. + The type of stepper motor was already chosen during the development of the SCARA. + For the mechanical part I used OpenSCAD as CAD software, based on prior experience with the software. + As the inverse kinematics were already determined in basic model of the SCARA they could be easily parsed to the CAD software. + This allowed me to check for clearance between the mechanical parts, while repeating \autoref{test1}. + The test revealed that there was collision between some parts. + These collisions were resolved by adding a indentation and moving linkage and are shown in \autoref{fig:scad_clearance} + The configuration with the stepper motors, servo and marker is shown in \autoref{fig:scad_carriage}. + \begin{figure} + \centering + \includegraphics[width=0.8\linewidth]{graphics/scad_scara_circles.png} + \caption{CAD of the SCARA configuration, with the end-effector orientated in the lower left corner of the operating area. + The configuration has been adapted at the two circled points, to resolve collisions in this orientation. + An indentation was made to ensure that the arm could make the required corner. + Furthermore, the bottom linkage has been moved from above to below the actuated joints, as this linkage would otherwise collide with the end-effector.} + \label{fig:scad_clearance} + \end{figure} + + \begin{figure} + \centering + \includegraphics[width=0.8\linewidth]{graphics/scad_carriage.png} + \caption{Rendered 3D model of the SCARA, including steppers, marker and servo.} + \label{fig:scad_carriage} + \end{figure} + +\subsection{Implementing Behavior} + Now with a physical SCARA, the last step is to implement the behavior. + The stepper motors are powered via a stepper controller. + The path planning for the SCARA and the operation of the stepper controller is implemented on a \ac{mcu}. + diff --git a/content/case_experiment_scara.tex b/content/case_experiment_scara.tex index 1e2fce8..0168840 100644 --- a/content/case_experiment_scara.tex +++ b/content/case_experiment_scara.tex @@ -172,3 +172,4 @@ Both options are not ideal, the first one does not allow a simple basic model and the second approach redoes work. The advantage of starting with 3D is that allows for a continuous development of one model, instead of switching the complete model. + diff --git a/graphics/scad_carriage.png b/graphics/scad_carriage.png index c4f8821f4ffbcb79e6a648b0b432bc56e637fe5a..05bf631013dee4b1f54b0c728906fcbd353703f6 100644 GIT binary patch literal 78213 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

xUaBbTpm>8%_1a$BBf|5JBJB@ax* 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 literal 0 HcmV?d00001 diff --git a/graphics/scad_scara_circles.png b/graphics/scad_scara_circles.png new file mode 100644 index 0000000000000000000000000000000000000000..7980334b31c23abb13b9fe637c6f30556bdb79df GIT binary patch literal 95506 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

&c02Sgznp3`MrvBL^NFs*59J~(Usi- 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 $P-?#m(X>ZEIRR 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 literal 0 HcmV?d00001 diff --git a/include b/include index e812986..d67b00e 160000 --- a/include +++ b/include @@ -1 +1 @@ -Subproject commit e8129869df0b121e0b4aafe70ffbcab4183ec03b +Subproject commit d67b00ea55a6274f292704af4eb068cc501d4f59 From 2d5f3a817f369bfdbeec0065e0a8f10c6b4e86b9 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Fri, 15 Jan 2021 15:24:30 +0100 Subject: [PATCH 30/47] Update evaluation --- content/case_experiment_scara.tex | 45 ++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/content/case_experiment_scara.tex b/content/case_experiment_scara.tex index 0168840..244dbd7 100644 --- a/content/case_experiment_scara.tex +++ b/content/case_experiment_scara.tex @@ -145,6 +145,36 @@ Therefore, the last detail, the marker lifting, was added without any difficulty. The servo is connected via a linkage with the marker such that it rotates away from the board. + \subsubsection{Component Design} + At this point the development has produced a design with a competent dynamic model. + The developed design does, however, not incorporate the physical component design. + Nevertheless, must these components be designed to validate that the SCARA and its components can be constructed. + For the mechanical part I used OpenSCAD as CAD software, based on prior experience with the software. + With this it was possible to implement all the components that have to be made, as well as the \ac{ots}-components. + Using the inverse kinematics model from the basic design of the SCARA, the angles were directly applied on the components in system. + Allowing me to change the configuration of the SCARA and inspect the clearance between each component. + Following the rectangular path as defined in \autoref{test1}, it revealed that collision occurred between some parts. + These collisions were resolved by adding an indentation and moving linkage and are shown in \autoref{fig:scad_clearance} + The configuration with the stepper motors, servo and marker is shown in \autoref{fig:scad_carriage}. + \begin{figure} + \centering + \includegraphics[width=0.8\linewidth]{graphics/scad_scara_circles.png} + \caption{ + CAD of the SCARA configuration, with the end-effector orientated in the lower left corner of the operating area. + The configuration has been adapted at the two circled points, to resolve collisions in this orientation. + An indentation was made to ensure that the arm could make the required corner. + Furthermore, the bottom linkage has been moved from above to below the actuated joints, as this linkage would otherwise collide with the end-effector. + } + \label{fig:scad_clearance} + \end{figure} + + \begin{figure} + \centering + \includegraphics[width=0.8\linewidth]{graphics/scad_carriage.png} + \caption{Rendered 3D model of the SCARA, including steppers, marker and servo.} + \label{fig:scad_carriage} + \end{figure} + \subsubsection{Evaluation} The complete development was rather smooth. However, this was not without deviating from the original design plan. @@ -158,18 +188,3 @@ For example, changing the arm lengths and evaluate the new behavior. Did it improve? Is this as expected? Implicitly, the system was very often tested and changed based on test results. - - Furthermore, the step from 2D to 3D physics was in no means a small increment in detail. - The first four levels of detail, as describe in the previous section, all were implemented in with two dimensions. - As the later details required a third dimension, all the detail was directly converted from 2D into 3D. - This is a large amount of work, introducing a high cost when the conversion fails. - Moreover, it creates a new 3D physics model, parallel to the 2D physics model instead of adding detail to the latter. - Alternative approaches for 3D model physics could be: - \begin{itemize} - \item Ignore 2D and start implementation in 3D modelling. - \item Retrace all incremental detail steps of the 2D model in a 3D model. - \end{itemize} - Both options are not ideal, the first one does not allow a simple basic model and the second approach redoes work. - The advantage of starting with 3D is that allows for a continuous development of one model, instead of switching the complete model. - - From 3d23e026d3d4bf13bc511f94c06df631dc2390da Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Mon, 18 Jan 2021 17:02:59 +0100 Subject: [PATCH 31/47] Improve text --- content/case_experiment_scara.tex | 87 ++++++++++++++++++------------- 1 file changed, 52 insertions(+), 35 deletions(-) diff --git a/content/case_experiment_scara.tex b/content/case_experiment_scara.tex index 244dbd7..56f8954 100644 --- a/content/case_experiment_scara.tex +++ b/content/case_experiment_scara.tex @@ -1,17 +1,16 @@ %&tex - As the previous development cycle was aborted prematurely, that cycle did not finish. - The second cycle is picks up at the feature selection step in the Development Cycle. + As the previous development cycle was aborted prematurely, the development cycle is repeated for the next feature. \subsection{Feature Selection} The implementation of the end-effector proofed to be impractical. This means that only two features are left. - The updated table in \autoref{tab:featurestab2} shows the updated feature comparison. + \autoref{tab:featurestab2} shows an updated feature comparison. Compared with the previous feature selection in \autoref{tab:firstfeatureselection}, the number of tests for the SCARA decreased and the Risk/Time increased. - This is because System Test \ref{test_tool_change} relied on both the SCARA and the End-effector and is no longer applicable. + This is because \autoref{test_tool_change} relied on both the SCARA and the End-effector which is no longer applicable. Based on the feature comparison, the next component to implement is the SCARA. \begin{table}[] - \caption{} + \caption{Comparison of the two remaining features in the design process. This table is an updated version of \autoref{tab:firstfeatureselection}.} \label{tab:featurestab2} \begin{tabular}{|l|l|l|l|l|l|} \hline @@ -27,12 +26,14 @@ \subsection{Rapid Development for SCARA} The goal is to present a functional model of the SCARA. - Based on the tests and requirements, it must be able to write three characters within 2 seconds. - The basic design principle is based on the initial design and shown in \autoref{fig:combined}. - The lowest level of detail is a kinematics model of the design. - This does not involve any physics simulation yet, but gives insight in the operation range, arm length and joint behavior. - In the following steps, the level of detail is gradually increased until it is a competent model. - However, planning all the different steps in advance is difficult as design decisions still need to be made. + The specifications state that it must be able to write three characters within 2 seconds. + And to pass \autoref{test1} it must draw a \SI{50}{\milli\meter} by \SI{70}{\milli\meter} rectangle within 1 second. + The basic design principle is based on the initial design as shown in \autoref{fig:combined}. + For the lowest detail level of the design, I decided on a kinematics model. + The model is stays very simple as it does not implement any physics. + However, the model enables me to tinker with the design parameters, such as the lengths of the linkages and joint angles. + In the following steps, the level of detail is gradually increased to arrive at a competent model. + Planning all the different steps in advance is difficult as design decisions still need to be made. Nonetheless, I can describe at least the following levels of detail for the model: \begin{enumerate} \item Basic kinematics model, no physics. @@ -52,12 +53,18 @@ \subsubsection{Evaluation} The current steps in the rapid development are difficult to perform. There is, unsurprisingly, lack of a clear vision of the end-product. - Making describing all the different levels of detail explicitly farfetched. - However, it was still possible to describe some levels of detail and a couple of expected elements that are added later. + Which makes an explicit description of all the different levels of detail unfeasible. + However, it was still possible to describe the initial steps in the level of detail of the design. + The remaining elements, that are essential to the design, will take shape in a later stage of the development. + Apart from this small deviation, the deliverables of this step are a good start of this development cycle. \subsection{Variable Detail Approach} - The following steps is to increase the detail of the model. - This is done according to the steps in the previous section. + The following steps is to increase the level of detail of the model. + The initial model together with the set of steps in the detail level is inherited from the previous design step. + To start, I will implement the basic model and implement the different levels of detail. + Based on the model after those steps, it is possible to make more detailed design decisions. + The decisions make it possible to plan the subsequent levels of detail. + Implementing these details as well, results in a competent model. \subsubsection{Basic Kinematics Model} \begin{marginfigure} @@ -103,8 +110,7 @@ In \autoref{fig:scaradesign}, this setup is shown as configuration 1. The disadvantage is that a motorized joint is heavy and has to be accelerated with the rest of the arm. Other configurations in \autoref{fig:scaradesign} move the motor to a static position. - Configuration 2 is a double arm setup, but has quite limited operating range. - Due to a singularity in the system when both arms at the top are in line with each other. + Configuration 2 is a double arm setup, but has quite limited operating range, caused by a singularity region in the system when both arms at the top are in line with each other. Configuration 3 also has such a singularity, but due to the extended top arm this point of singularity is outside of the operating range. However, this configuration requires one axis with two motorized joints on it. Even though this is possible, it does increase the complexity of the construction. @@ -116,12 +122,12 @@ \label{fig:scaradesign} \end{figure} - The actuation of the arm is done with stepper motors. - The advantage of stepper motors over simple DC-motors is that they hold a specific position. - There is no extra feedback loop required to compensate for external forces. - They are heavier and more expensive as well. - The additional mass is probably beneficial as adds momentum to the base, reducing the counter movement of the base when the arm is actuated. - The extra costs are easily compensated as it save development time due to the simplified control law. + The actuation of the arm is done with stepper motors, which have the advantage over DC-motors with their holding torque. + The holding torque removes the need of a feedback controller to compensate for external forces. + Instead, the stepper motors can be fully operated with a feedforward controller. + However, they are heavier and more expensive. + The additional mass is beneficial as increased inertia of the base, reducing the displacement due to the reaction force of the SCARA acceleration. + The extra costs are easily compensated as it saves development time due to the simplified control law, and the removed need for extra angle sensors used in feedback control. Due to the aborted implementation of the end-effector, the SCARA must also lift the marker of the board. The chosen configuration of the SCARA makes it possible to add an extra joint in the linkage. @@ -129,33 +135,35 @@ \subsubsection{Implementing details} The new concrete design decisions, make it possible to plan the next steps of adding detail. - The following steps are an addition of steps in as described in the previous section: + The following steps are an addition to the steps as described in the previous section: \begin{enumerate} \setcounter{enumi}{4} \item Stepper motor behavior. \item Updating physics model to 3D physics. \item Marker lifting behavior, servo lifts marker of the board. \end{enumerate} - The first step was to replace the DC-motor with a stepper motor model. - This is based on a model by \textcite{karadeniz_modelling_2018}. + Starting with replacing the DC-motor with a stepper motor model, which is based on a model by \textcite{karadeniz_modelling_2018}. The controller is updated as well, to accommodate for the behavior of the steppers. - The next step is to implement a dynamic model of the configuration (4) as shown in \autoref{fig:scaradesign}. + The next step is to implement a dynamic model of configuration 4 in \autoref{fig:scaradesign}. The dynamics of the SCARA are based on a serial link structure \autocite{dresscher_modeling_2010}. - This serial link structure was makes it easy to add or extend joints and bodies to the system. + This serial link structure makes it easy to add and extend joints, bodies and mass points to the system. Therefore, the last detail, the marker lifting, was added without any difficulty. The servo is connected via a linkage with the marker such that it rotates away from the board. \subsubsection{Component Design} - At this point the development has produced a design with a competent dynamic model. - The developed design does, however, not incorporate the physical component design. - Nevertheless, must these components be designed to validate that the SCARA and its components can be constructed. + At this point the development has reached a detailed design together with a dynamic model representing that design. + The dynamic model is a useful tool to test and evaluate the system behavior. + However, it does not include the shapes of the components and can therefore not be used to evaluate clearance or collision between components. + By implementing the design using CAD software, it is possible to search for collisions. + Furthermore, this model can than also be used to print the custom parts. For the mechanical part I used OpenSCAD as CAD software, based on prior experience with the software. - With this it was possible to implement all the components that have to be made, as well as the \ac{ots}-components. + With this it was possible to implement all the custom components as well as the \ac{ots}-components. Using the inverse kinematics model from the basic design of the SCARA, the angles were directly applied on the components in system. Allowing me to change the configuration of the SCARA and inspect the clearance between each component. - Following the rectangular path as defined in \autoref{test1}, it revealed that collision occurred between some parts. - These collisions were resolved by adding an indentation and moving linkage and are shown in \autoref{fig:scad_clearance} - The configuration with the stepper motors, servo and marker is shown in \autoref{fig:scad_carriage}. + Following the rectangular path as defined in \autoref{test1} revealed that collisions occurred between parts. + These collisions were resolved by adding an indentation in one linkage and moving another linkage. + These changes are shown in \autoref{fig:scad_clearance} + The complete setup with the custom parts and the \ac{ots}-components, such as stepper motors, servo and marker, is shown in \autoref{fig:scad_carriage}. \begin{figure} \centering \includegraphics[width=0.8\linewidth]{graphics/scad_scara_circles.png} @@ -188,3 +196,12 @@ For example, changing the arm lengths and evaluate the new behavior. Did it improve? Is this as expected? Implicitly, the system was very often tested and changed based on test results. + + \subsection{Conclusion} + With the development of the SCARA completed. + Following the design plan, the development has to be repeated for the design of the Cable bot. + However, the evaluation of the development until this point resulted in enough information to draw conclusions about the design plan. + I expect that executing this development a third time is not beneficial to the case study, given the additional effort. + Time is better spent on the realization of a prototype and improving the current design method. + Therefore, the next section will go into the construction of the prototype instead of the development of the Cable bot. + From fe1ff6e7216f3fd15ccb1b33f58f0f984ac06577 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Mon, 18 Jan 2021 17:03:37 +0100 Subject: [PATCH 32/47] Remove duplex content --- content/case_experiment_prototype.tex | 29 +++------------------------ 1 file changed, 3 insertions(+), 26 deletions(-) diff --git a/content/case_experiment_prototype.tex b/content/case_experiment_prototype.tex index e4d50aa..7cd1587 100644 --- a/content/case_experiment_prototype.tex +++ b/content/case_experiment_prototype.tex @@ -1,34 +1,11 @@ To ensure that the design method resulted in a functional system, a prototype will be build from the current state of the design. -Although the development only implemented a very small portion of the full design, I determined that a prototype is more valuable than repeating the development cycle for the next feature. +Although the development resulted in only a partial design, I determined that a prototype is more valuable than repeating the development cycle for the next feature. For the construction of the prototype \ac{ots}-parts are used as much as possible and the mechanical linkages of the SCARA will be printed. -To write characters on a whiteboard, drivers and controlloop have to be implemented in software. +To write characters on a whiteboard; drivers and controlloop are implemented in software. -\subsection{Construction} - The construction of the SCARA consists of a 3D printed mechanical structure that is actuated with stepper motors. - The type of stepper motor was already chosen during the development of the SCARA. - For the mechanical part I used OpenSCAD as CAD software, based on prior experience with the software. - As the inverse kinematics were already determined in basic model of the SCARA they could be easily parsed to the CAD software. - This allowed me to check for clearance between the mechanical parts, while repeating \autoref{test1}. - The test revealed that there was collision between some parts. - These collisions were resolved by adding a indentation and moving linkage and are shown in \autoref{fig:scad_clearance} - The configuration with the stepper motors, servo and marker is shown in \autoref{fig:scad_carriage}. - \begin{figure} - \centering - \includegraphics[width=0.8\linewidth]{graphics/scad_scara_circles.png} - \caption{CAD of the SCARA configuration, with the end-effector orientated in the lower left corner of the operating area. - The configuration has been adapted at the two circled points, to resolve collisions in this orientation. - An indentation was made to ensure that the arm could make the required corner. - Furthermore, the bottom linkage has been moved from above to below the actuated joints, as this linkage would otherwise collide with the end-effector.} - \label{fig:scad_clearance} - \end{figure} +\subsection{Mechanical Construction} - \begin{figure} - \centering - \includegraphics[width=0.8\linewidth]{graphics/scad_carriage.png} - \caption{Rendered 3D model of the SCARA, including steppers, marker and servo.} - \label{fig:scad_carriage} - \end{figure} \subsection{Implementing Behavior} Now with a physical SCARA, the last step is to implement the behavior. From bb78f154803e5810ac16292251c86657cc2d0083 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Wed, 13 Jan 2021 16:05:40 +0100 Subject: [PATCH 33/47] Improve evaluation --- content/case_experiment_test_protocol.tex | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/content/case_experiment_test_protocol.tex b/content/case_experiment_test_protocol.tex index 6652b17..44615ff 100644 --- a/content/case_experiment_test_protocol.tex +++ b/content/case_experiment_test_protocol.tex @@ -101,8 +101,13 @@ \subsubsection{Evaluation} This step was completed without many difficulties. - Even though it required a revision of the earlier specifications and defining order of operation. - However, this is an issue with the preparation phase in general, not with this step in particular. + Which includes the revision of the earlier specifications and definition of orders of operation. + Indicating that I overlooked details while defining the specifications in \autoref{sec:specifications}. + According to the design plan as described in \autoref{chap:analysis}, I should go back and review those specifications. + Followed by reviewing all steps after the specifications. + However, this complete review is not practical and extremely time consuming. + The point here is, looking at the evaluations of this and previous steps, that chosen design strategy is not feasible, especially as a novice designer. + In \autoref{chap:case_evaluation} I will evaluate this with more detail. During the analysis, I expected more specific tests. Each test could then be used as a milestone during the development of the system. From 6de418b97e73844bf539d004d41e36aa006e7064 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Tue, 19 Jan 2021 16:41:27 +0100 Subject: [PATCH 34/47] Improve development phase --- content/case_experiment_end-effector.tex | 8 ++++---- content/case_experiment_scara.tex | 12 +++++++----- include | 2 +- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/content/case_experiment_end-effector.tex b/content/case_experiment_end-effector.tex index 276cf2f..cb1d001 100644 --- a/content/case_experiment_end-effector.tex +++ b/content/case_experiment_end-effector.tex @@ -1,7 +1,7 @@ With the preparation phase completed, the development cycle is next. This consists of three steps: Feature selection, Rapid Development and Variable Approach. The current section explains the first development cycle during the design. -The end-effector is the feature that is selected in the first cycle. +For this first cycle of the design process, I will develop the end-effector. The implementation of the end-effector was not successful, as the design was too complex. Fortunately, this failure did give valuable insight on the design method. @@ -30,11 +30,11 @@ Fortunately, this failure did give valuable insight on the design method. Upgrading the motor torque is a minor parametric change and the dependency is therefore insignificant. The testing number is directly the number of tests that can be completed by implementing that single component. - For the risk and time it was an engineering judgement and no specific protocol to determine the values. + The risk and time values are not determined with a specific protocol, but with simple engineering judgement. The estimated risk is high for the end-effector due to the collision dynamics of the operation. It has to grab something and that is difficult to model. Furthermore, it was not known if that design would work. The SCARA has the most moving parts, but no difficult dynamics and has therefore an estimated risk of medium. - For the carriage the there was no real risks and got therefore a low risk indication. + For the carriage there was no real risks and got therefore a low risk indication. The SCARA would be implemented first based on number of tests, but is dependent on the end-effector. Beginning with the end-effector is an obvious choices. @@ -44,7 +44,7 @@ Fortunately, this failure did give valuable insight on the design method. This first step of the detail design phase did go well. A more refined method for this step could be very useful. But the risk and time assessment will probably always be a engineering judgement from the developer. - Within a design team a form of planning poker\footnote{\url{https://en.wikipedia.org/wiki/Planning_poker}{Wikipedia entry: Planning Poker}} could be a good option. + Within a design team a form of planning poker \autocite{grenning_planning_2002} could be a good option. \begin{figure} \centering diff --git a/content/case_experiment_scara.tex b/content/case_experiment_scara.tex index 56f8954..9718866 100644 --- a/content/case_experiment_scara.tex +++ b/content/case_experiment_scara.tex @@ -2,7 +2,7 @@ As the previous development cycle was aborted prematurely, the development cycle is repeated for the next feature. \subsection{Feature Selection} - The implementation of the end-effector proofed to be impractical. + The implementation of the end-effector proved to be impractical. This means that only two features are left. \autoref{tab:featurestab2} shows an updated feature comparison. Compared with the previous feature selection in \autoref{tab:firstfeatureselection}, the number of tests for the SCARA decreased and the Risk/Time increased. @@ -77,7 +77,7 @@ It consists of the forward and inverse kinematics of the design. With this kinematics model it was easy to find a good configuration of the SCARA. I tested if the SCARA could reach the required operating area, to be able to satisfy specification \ref{threecharspec}. - The operating area is not a couple of centimeters away from the base of the SCARA. + The operating area is a couple of centimeters away from the base of the SCARA. This is to avoid the singularity point that lies at the base of the SCARA. Resulting in longer arms than strictly necessary but this reduces the operating angles of the joints allowing for simpler construction. @@ -131,9 +131,9 @@ Due to the aborted implementation of the end-effector, the SCARA must also lift the marker of the board. The chosen configuration of the SCARA makes it possible to add an extra joint in the linkage. - As the marker only needs to be moved a couple of millimeters from the board, a simple servo suffices. + As the marker only needs to be moved a couple of millimeters from the board, a simple hobby servo suffices. - \subsubsection{Implementing details} + \subsubsection{Advanced Detail Design} The new concrete design decisions, make it possible to plan the next steps of adding detail. The following steps are an addition to the steps as described in the previous section: \begin{enumerate} @@ -186,7 +186,9 @@ \subsubsection{Evaluation} The complete development was rather smooth. However, this was not without deviating from the original design plan. - The different levels of detail could not be defined before the start of the development but had to be updated midway. + It was not feasible to define all different levels of detail before the start of the development. + Prior to the design, it was possible to plan 4 levels of detail. + After these steps, the design decisions taken made it possible to define the following levels of detail. In total there are seven predefined levels of detail in the design. Meaning that there must also be seven test cycles. diff --git a/include b/include index d67b00e..2388754 160000 --- a/include +++ b/include @@ -1 +1 @@ -Subproject commit d67b00ea55a6274f292704af4eb068cc501d4f59 +Subproject commit 23887547caf9e84215373493f0c49ccd51d0f9de From bcc4b09fcba7cb1f76c3a437e83260853a44cf25 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Tue, 19 Jan 2021 16:52:57 +0100 Subject: [PATCH 35/47] Change evaluation --- content/case_experiment_scara.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/case_experiment_scara.tex b/content/case_experiment_scara.tex index 9718866..46657d3 100644 --- a/content/case_experiment_scara.tex +++ b/content/case_experiment_scara.tex @@ -53,7 +53,7 @@ \subsubsection{Evaluation} The current steps in the rapid development are difficult to perform. There is, unsurprisingly, lack of a clear vision of the end-product. - Which makes an explicit description of all the different levels of detail unfeasible. + Which makes an explicit description of every level of detail not realistic. However, it was still possible to describe the initial steps in the level of detail of the design. The remaining elements, that are essential to the design, will take shape in a later stage of the development. Apart from this small deviation, the deliverables of this step are a good start of this development cycle. From 356e3ecba2325185e60c4103e39654ef5caa4f98 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Wed, 20 Jan 2021 16:57:06 +0100 Subject: [PATCH 36/47] Add comparison table between test and spec --- content/appendix_specifications.tex | 6 +++ graphics/compare_table.tex | 61 +++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 graphics/compare_table.tex diff --git a/content/appendix_specifications.tex b/content/appendix_specifications.tex index 1535ed4..0c820bd 100644 --- a/content/appendix_specifications.tex +++ b/content/appendix_specifications.tex @@ -22,3 +22,9 @@ \item When the system changes from writing to wiping or vice-versa, the SCARA and End-effector should change the tool within ten seconds. \end{enumerate} \end{specification} + + \begin{table} + \caption{} + \label{tab:compare} + \includegraphics[width=0.8\linewidth]{graphics/compare_table.pdf} + \end{table} diff --git a/graphics/compare_table.tex b/graphics/compare_table.tex new file mode 100644 index 0000000..36bdada --- /dev/null +++ b/graphics/compare_table.tex @@ -0,0 +1,61 @@ +%&tex +\documentclass{standalone} +\usepackage{tikz,array} +\usepackage{siltex} +\usetikzlibrary{calc,positioning,patterns,math} + +\newcommand{\tikzmark}[1]{\tikz[remember picture,overlay]\coordinate (#1);} + +\newcolumntype{V}[1]{@{\hspace{\tabcolsep}}c@{\hspace{\tabcolsep}\tikzmark{#1}}} +\newcolumntype{T}[1]{@{\hspace{\tabcolsep}}m{0.3cm}@{\hspace{\tabcolsep}\tikzmark{#1}}} +\newcommand{\xd}{\tikz{\fill[gray] (0,0) circle (3pt);}} +\newcommand{\od}{\tikz{\draw[gray] (0,0) circle (3pt);}} + + +\begin{document} +\begin{tikzpicture}[remember picture] + \def\th{3.4}; + \def\ct(#1,#2,#3){% + \draw (mytable.north-|#1) --++ (60:\th); + \node[rotate=60,anchor=west] at ($(mytable.north-|#1)!0.5!(mytable.north-|#2)$) {#3}; + } + \node[inner xsep=-\pgflinewidth,inner ysep=-\pgflinewidth, anchor=north west] at (0,0) (mytable){% + \begin{tabular}{|V{a}| T{b}| T{c}| T{d}| T{e}| T{f}| T{g}| T{h}| T{i}| T{j}| T{k}|} + \hline + % & Small rectangle & Perimiter & Cable bot Speed & Tripple Chars & Tool Change & Repeatability & Linearity & Writing & Wiping \\ \hline + 1 & &\xd& & & & &\xd&\xd& & \\ \hline + 2 & &\xd& & & & &\xd&\xd& & \\ \hline + 3 &\xd& & &\xd& &\xd&\xd&\xd& & \\ \hline + 4 & & & &\xd& &\xd& &\xd& & \\ \hline + 5 & & & & &\od& & &\od&\od& \\ \hline + 6 & &\xd& & & & & &\xd& & \\ \hline + 7 &\xd& &\xd& & & & &\xd& & \\ \hline + 8 & & & & & & & & & &\xd\\ \hline + 9 & & &\xd& & &\xd& & & & \\ \hline + 10 & & & & & & & & &\xd& \\ \hline + 11 & &\xd& & & &\xd& &\xd&\xd& \\ \hline + 12 &\od&\od&\od&\od&\od&\od&\od&\xd&\xd& \\ \hline + 13 &\xd& & &\xd& & & &\xd& & \\ \hline + 14 &\xd& &\xd&\xd& & & &\xd& & \\ \hline + 15 & & &\xd& & & & &\xd& & \\ \hline + 16 & & &\xd& & & & &\xd& & \\ \hline + 17 & & & & &\xd& & & & & \\ \hline + \end{tabular} + }; + \draw (mytable.north east) --++ (60:\th); + \draw (mytable.north west) --++ (60:\th); + \draw (mytable.north east) ++ (60:\th) --([shift={(60:\th)}]mytable.north west); + + \ct(mytable.north west,a,System Specification); + \ct(a,b,Small rectangle); + \ct(b,c,Perimiter); + \ct(c,d,Cable bot speed); + \ct(d,e,Triple Chars); + \ct(e,f,Tool Change); + \ct(f,g,Repeatability); + \ct(g,h,Linearity); + \ct(h,i,Writing); + \ct(i,j,Wiping); + \ct(j,k,Complexity); +\end{tikzpicture} +\end{document} From 2064817f2f5f6a0f2419687b7f80cf48ac90d490 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Thu, 21 Jan 2021 11:37:28 +0100 Subject: [PATCH 37/47] Add software --- content/case_experiment_prototype.tex | 42 +++++++++++++++++++++------ 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/content/case_experiment_prototype.tex b/content/case_experiment_prototype.tex index 7cd1587..ac6324b 100644 --- a/content/case_experiment_prototype.tex +++ b/content/case_experiment_prototype.tex @@ -1,14 +1,38 @@ -To ensure that the design method resulted in a functional system, a prototype will be build from the current state of the design. -Although the development resulted in only a partial design, I determined that a prototype is more valuable than repeating the development cycle for the next feature. -For the construction of the prototype \ac{ots}-parts are used as much as possible and the mechanical linkages of the SCARA will be printed. -To write characters on a whiteboard; drivers and controlloop are implemented in software. - +%&tex +To validate the dynamical and mechanical models, I will build a prototype of the current design. +For the mechanical design, the CAD model is used to print the custom parts. +Other components, such as steppers, microcontroller, screws and miscellaneous electronics, are ordered. +To test the dynamics, the steppers and servo have to be actuated. +To achieve this actuation a control law is written in software. \subsection{Mechanical Construction} +With the 3D printed parts the SCARA was easy to construct. +The diameter of the holes in the parts were printed slightly undersized. +This was on purpose, such that the holes can be drilled to the specified size. +To connect the bodies on the joints, a bolt with washers is used. +Although this is clearly not the ideal technique to build joints, it was by far the easiest option. + +During assembly I noticed that the bolts of a joint and those that hold the stepper motor in place collided. +This was possible because the bolts were not included in the CAD-model. +In hindsight this should have been included. +Fortunately there was enough clearance to mount the SCARA slightly further on the axle. +Resulting in an operating SCARA without having to redesign the mechanics. +\subsection{Control of the SCARA} +Although the focus of the design plan was specifically not the software, it still forms a important part of the development. +To run the hardware, I chose for for a STM32 \ac{mcu}. This is a powerfull processor with sufficient IO available. +RIOT-OS was chosen as an operating system due to prior experience and available support. +To be able to write characters on the board the following tasks have to be implemented in software: +\begin{itemize} + \item Driver for the stepper controller + \item Driver for servo motor + \item Control/Path planning +\end{itemize} -\subsection{Implementing Behavior} - Now with a physical SCARA, the last step is to implement the behavior. - The stepper motors are powered via a stepper controller. - The path planning for the SCARA and the operation of the stepper controller is implemented on a \ac{mcu}. +The stepper controller chip can be configured over UART and has two simple IO pins for step and direction signal. +To simplify the control, the software driver configures the stepper controller and includes functions to move the stepper motor to a certain angle. +Meaning that the feedforward control of the steppers is handled by the software driver class. +The angle of the servo motor is controlled by the duty cycle of a \SI{50}{\hertz} PWM signal. +The PWM signal generation is offloaded to the IO peripherals and the software driver has a toggle function to lift the marker from the board. +Most of the code for the software driver was already available as a module in RIOT-OS. From 137c584ef41f54e7ba54122d7cb4b41d5375738f Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Thu, 21 Jan 2021 11:38:42 +0100 Subject: [PATCH 38/47] Update ci config --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e91d45e..b04bd69 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -11,7 +11,7 @@ final_report: image: registry.gitlab.com/silkeh/latex:latest script: - apk update; apk add make - - make + - make -j artifacts: paths: - report.pdf From f6a7296ed52f290e73e961901fbb868517a4aa1a Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Thu, 21 Jan 2021 13:38:41 +0100 Subject: [PATCH 39/47] Move copied text to includes --- content/appendix_specifications.tex | 20 +--- content/appendix_test_cases.tex | 101 ++++++++------------- content/case_experiment_scara.tex | 2 +- content/case_experiment_specifications.tex | 14 +-- content/case_experiment_test_protocol.tex | 43 +-------- content/input/speclista.tex | 8 ++ content/input/speclistb.tex | 4 + content/input/speclistc.tex | 5 + content/input/systemtest1.tex | 19 ++++ content/input/systemtest6.tex | 18 ++++ 10 files changed, 105 insertions(+), 129 deletions(-) create mode 100644 content/input/speclista.tex create mode 100644 content/input/speclistb.tex create mode 100644 content/input/speclistc.tex create mode 100644 content/input/systemtest1.tex create mode 100644 content/input/systemtest6.tex diff --git a/content/appendix_specifications.tex b/content/appendix_specifications.tex index 0c820bd..fb960e5 100644 --- a/content/appendix_specifications.tex +++ b/content/appendix_specifications.tex @@ -3,23 +3,9 @@ \begin{specification} \begin{enumerate} \setlength{\itemsep}{10pt} - \item The Writer shall be able to write at least fifty characters per line. - \item The Writer shall be able to write at least three of text. - \item The Writer shall plot characters with a size that is readable from 4 meters for a person with good eyesight. - \item The Writer shall plot in a regular used font with corresponding character spacing. - \item When a new tweet is send to the Writer, the Writer, shall wipe the existing tweet and write down the new tweet. - \item If the Writer is not wiping or writing then the Writer shall not obstruct the view of the whiteboard. - \item While writing, the Writer shall have a writing speed of at least one character per second. - \item The dynamics of the Writer shall be complex/sophisticated/interesting. - \item If the Writer is tasked to wipe the tweet, the Writer shall wipe the tweet within sixty seconds - \item When a reset-signal is send to the Writer, the Writer shall recalibrate its position on the board. - \item When a wipe-signal is send to the Writer, the Writer shall wipe the board clean. - \item The Writer shall not damage itself. - \item While writing, the SCARA shall have a writing speed of at least 1.5 characters per second. - \item When the Carriage/base of the SCARA is at a static position, the SCARA shall be able to write at least three characters at that position. \label{threecharspec} - \item When the SCARA finished writing at their current position, the Carriage shall move the SCARA to it's next position where it can write the subsequent characters. - \item When the SCARA has to be moved to a new position, the Carriage shall perform this movement within one second. - \item When the system changes from writing to wiping or vice-versa, the SCARA and End-effector should change the tool within ten seconds. + \input{content/input/speclista.tex} + \input{content/input/speclistb.tex} + \input{content/input/speclistc.tex} \end{enumerate} \end{specification} diff --git a/content/appendix_test_cases.tex b/content/appendix_test_cases.tex index 714e8a2..1122000 100644 --- a/content/appendix_test_cases.tex +++ b/content/appendix_test_cases.tex @@ -3,59 +3,41 @@ \setcounter{testcounter}{0} \begin{test}[label={test1}]{Small rectangle} - During this test, a rectangle will be drawn on the whiteboard using the SCARA. - This rectangle is will be at least \SI{50}{\milli\meter} high and \SI{70}{\milli\meter} wide, such that three characters fit within the rectangle. - To test the speed requirements, the rectangle should be drawn within one second. - \tcbline - \begin{description} - \item[Features:] SCARA - \item[Specifications:] 3, 7, 11, 13 - \item[Results:] The test passes when: - \begin{itemize} - \item Rectangle height is at least \SI{50}{\milli\meter} - \item Rectangle width is at least \SI{70}{\milli\meter} - \item Completion time is less than \SI{1}{\second} - \end{itemize} -% The SCARA must draw a square of at least \SI{50}{\milli\meter} high and \SI{70}{\milli\meter} wide. -% This box is large enough to draw at least 3 characters. -% This square should be drawn within one second. -% If it is slower than that, it is not able to achieve specification 7. - \end{description} + \input{content/input/systemtest1.tex} \end{test} \begin{test}[label={test_perimeter}]{Perimeter} - The carriage must move along the outer edges of the text area. + The Cable bot must move along the outer edges of the text area. This area consists of three lines of text with fifty characters each. - Resulting in perimeter of \SI{1000}{\milli\meter} wide and \SI{250}{\milli\meter} high. + Resulting in a perimeter of \SI{1000}{\milli\meter} wide and \SI{250}{\milli\meter} high. This proves that reach of the system is sufficient to write the text. - Furthermore, the carriage should move outside of the perimeter as well. - Moving outside of the text area is to prove that carriage has a position where it does not obstruct the written text. + Furthermore, the Cable bot should move outside of the perimeter as well. + Moving outside of the text area is to prove that Cable bot has a position where it does not obstruct the written text. \tcbline \begin{description} \item[Features:] Cable Bot - \item[Specifications:] 1, 2, 6, 11 + \item[Specifications:] 1, 2, 6, 11, (12) \item[Results:] The test passes when: \begin{itemize} - \item The carriage moved along the edge of the text area. - \item The carriage moved outside of the text area. + \item The Cable bot moved along the edge of the text area. + \item The Cable bot moved outside of the text area. \end{itemize} \end{description} \end{test} \begin{test}[label={test_speed_carriage}]{Cable Bot Speed} - The carriage must be able to move a distance of \SI{80}{\milli\meter} in horizontal direction to move within a second. - At the start and the end of the movement the speed of the carriage must be zero. - This is to ensure that the SCARA can then write its characters at the given position. - + The Cable bot must be able to move a distance of \SI{80}{\milli\meter} in horizontal direction within a second. + At the start and the end of the movement the speed of the Cable bot must be zero. + This is to ensure that the SCARA can then write three characters at the given position. \tcbline \begin{description} \item[Features:] Cable Bot - \item[Specifications:] 7, 14 + \item[Specifications:] 7, 9, (12), 14, 15, 16 \item[Results:] The test passes when: \begin{itemize} - \item At the start and end of the test, the carriage does not move relative to the board. - \item During the test, the carriage has moved \SI{80}{\milli\meter} within \SI{1}{\second}. + \item At the start and end of the test, the Cable bot does not move relative to the board. + \item During the test, the Cable bot has moved \SI{80}{\milli\meter} within \SI{1}{\second}. \end{itemize} \end{description} \end{test} @@ -63,31 +45,30 @@ \begin{test}[label={test_triple_char}]{Triple Chars} The SCARA together with the end-effector must write 3 characters without - moving the carriage. This extends on the small square but the + moving the Cable bot. This extends on the small rectangle of \autoref{test1} but the end-effector must now be able to lift the marker of the board. The three characters should be written on the board within two seconds. \tcbline \begin{description} \item[Features:] SCARA, End-Effector - \item[Specifications:] 3, 4, 12, 13 + \item[Specifications:] 3, 4, (12), 13, 14 \item[Results:] The test passes when: \begin{itemize} - \item The SCARA wrote three characters on the whiteboard within \SI{1}{\second}. - \item The carriage did not move more than \SI{10}{\milli\meter}. + \item The SCARA wrote three characters on the whiteboard within \SI{2}{\second}. + \item The Cable bot did not move more than \SI{10}{\milli\meter}. \end{itemize} \end{description} \end{test} \begin{test}[label={test_tool_change}]{Tool Change} - Tool changing is not a specific part of the specification. - However, the system has to switch in some way between the marker and a wiper, or a different color. + The system has to switch in some way between the marker and a wiper, or a different color. For this test the system must switch a tool within 10 seconds. \tcbline \begin{description} \item[Features:] SCARA, End-Effector - \item[Specifications:] 16 + \item[Specifications:] (5), (12), 17 \item[Results:] The test passes when: \begin{itemize} \item A tool is released from the end-effector and stored for later use. @@ -99,25 +80,8 @@ \begin{test}[label={test_repeat}]{Repeatability} - This tests if the Writer can reach draw repeatedly on the same position on the board. - The system will start with drawing multiple \SI{60}{\milli\meter} squares on the board in a random location. - To test the repeatability, a circle with a \SI{55}{\milli\meter} diameter must be drawn inside of the square. - This should be done with twenty squares in an area of at least \SI{1000}{\milli\meter} x \SI{300}{\milli\meter}. - The drawing order of each square must be different from the drawing order of circles, this ensures that the Cable bot makes a different approach path. - \tcbline - \begin{description} - \item[Features:] SCARA, Cable Bot - \item[Specifications:] 3, 4, 9, 11 - \item[Results:] - The test passes when: - \begin{itemize} - \item Each square has a circle drawn inside. - \item The squares and circles are within \SI{5}{\milli\meter} of their given dimensions. - \item All the circles are completely within their corresponding square. - \end{itemize} - \end{description} + \input{content/input/systemtest6.tex} \end{test} - \begin{test}[label={test_linear}]{Linearity} The system must draw a grid on the drawing range (\SI{1000}{\milli\meter} x \SI{300}{\milli\meter}), with the horizontal and vertical lines spaces \SI{100}{\milli\meter} from each other. @@ -126,7 +90,7 @@ \tcbline \begin{description} \item[Features:] SCARA, End-Effector, Cable Bot - \item[Specifications:] + \item[Specifications:] 1, 2, 3, (12) \item[Results:] The test passes when: \begin{itemize} \item All lines are drawn, 11 vertical and 4 horizontal lines. @@ -154,7 +118,7 @@ the quick brown fox jumps over the lazy dog!?@,.- \tcbline \begin{description} \item[Features:] SCARA, End-Effector, Cable Bot - \item[Specifications:] 1, 2, 3, 4, 6, 7, 11, 12, 13, 14, 15 + \item[Specifications:] 1, 2, 3, 4, (5), 6, 7, 12, 13, 14, 15, 16 \item[Results:] The test passes when: \begin{itemize} \item The text as described is readable from a atleast \SI{4}{\meter} distance. @@ -166,14 +130,29 @@ the quick brown fox jumps over the lazy dog!?@,.- \begin{test}[label={test_wiping}]{Wiping} The complete board must be cleared of any marking within 60 seconds. This is without the change of tool. - \tcbline \begin{description} \item[Features:] SCARA, End-Effector, Cable Bot - \item[Specifications:] 8, 10, 5 + \item[Specifications:] (5), 10, 11, 12 \item[Results:] The test passes when: \begin{itemize} \item The system cleaned the board within \SI{60}{\second}. \end{itemize} \end{description} \end{test} + + \begin{test}[label={test:compexity}]{Complexity} + The last test is that the design has to be complex enough. + This has to be evaluated by the developer of the system. + \tcbline + \begin{description} + \item[Features:] SCARA, End-Effector, Cable Bot + \item[Specifications:] 8 + \item[Results:] The test passes when: + \begin{itemize} + \item The developer can motivate that the system is complex enough to evaluate the case study. + \end{itemize} + \end{description} + \end{test} + + diff --git a/content/case_experiment_scara.tex b/content/case_experiment_scara.tex index 46657d3..0bc0e0f 100644 --- a/content/case_experiment_scara.tex +++ b/content/case_experiment_scara.tex @@ -76,7 +76,7 @@ The development starts with a basic model model as shown in \autoref{fig:scaraarm}. It consists of the forward and inverse kinematics of the design. With this kinematics model it was easy to find a good configuration of the SCARA. - I tested if the SCARA could reach the required operating area, to be able to satisfy specification \ref{threecharspec}. + I tested if the SCARA could reach the required operating area, to be able to satisfy system specification 14. The operating area is a couple of centimeters away from the base of the SCARA. This is to avoid the singularity point that lies at the base of the SCARA. Resulting in longer arms than strictly necessary but this reduces the operating angles of the joints allowing for simpler construction. diff --git a/content/case_experiment_specifications.tex b/content/case_experiment_specifications.tex index d1b5cda..4e4fe90 100644 --- a/content/case_experiment_specifications.tex +++ b/content/case_experiment_specifications.tex @@ -16,14 +16,7 @@ \begin{specification} \begin{enumerate} \setlength{\itemsep}{10pt} - \item The Writer shall be able to write at least fifty characters per line. - \item The Writer shall be able to write at least three of text. - \item The Writer shall plot characters with a size that is readable from 4 meters for a person with good eyesight. - \item The Writer shall plot in a regular used font with corresponding character spacing. - \item When a new tweet is send to the Writer, the Writer, shall wipe the existing tweet and write down the new tweet. - \item If the Writer is not wiping or writing then the Writer shall not obstruct the view of the whiteboard. - \item While writing, the Writer shall have a writing speed of at least one character per second. - \item The dynamics of the Writer shall be complex/sophisticated/interesting. + \input{content/input/speclista.tex} \end{enumerate} \end{specification} Some other specifications that are related to the operation of the system are: @@ -31,10 +24,7 @@ \begin{enumerate} \setcounter{enumi}{8} \setlength{\itemsep}{10pt} - \item If the Writer is tasked to wipe the tweet, the Writer shall wipe the tweet within sixty seconds - \item When a reset-signal is send to the Writer, the Writer shall recalibrate its position on the board. - \item When a wipe-signal is send to the Writer, the Writer shall wipe the board clean. - \item The Writer shall not damage itself. + \input{content/input/speclistb.tex} \end{enumerate} \end{specification} diff --git a/content/case_experiment_test_protocol.tex b/content/case_experiment_test_protocol.tex index 44615ff..1210388 100644 --- a/content/case_experiment_test_protocol.tex +++ b/content/case_experiment_test_protocol.tex @@ -41,11 +41,7 @@ \begin{specification} \begin{enumerate} \setcounter{enumi}{12} - \item While writing, the SCARA shall have a writing speed of at least 1.5 characters per second. - \item When the Carriage/base of the SCARA is at a static position, the SCARA shall be able to write at least three characters at that position. - \item When the SCARA finished writing at their current position, the Carriage shall move the SCARA to it's next position where it can write the subsequent characters. - \item When the SCARA has to be moved to a new position, the Carriage shall perform this movement within one second. - \item When the system changes from writing to wiping or vice-versa, the SCARA and End-effector should change the tool within ten seconds. + \input{content/input/speclistc.tex} \end{enumerate} \end{specification} These additional specifications are also based on the combined system decission that was made in section \autoref{sec:initialdesign}. @@ -60,42 +56,13 @@ One of the small tests focusses on the speed and range requirements of the SCARA: \setcounter{testcounter}{0} - \begin{test}[label={rect}]{Small rectangle} - During this test, a rectangle will be drawn on the whiteboard using the SCARA. - This rectangle is will be at least \SI{50}{\milli\meter} high and \SI{70}{\milli\meter} wide, such that three characters fit within the rectangle. - To test the speed requirements, the rectangle should be drawn within one second. - \tcbline - \begin{description} - \item[Features:] SCARA - \item[Specifications:] 3, 7, 11, 13 - \item[Results:] The test passes when: - \begin{itemize} - \item Rectangle height is at least \SI{50}{\milli\meter} - \item Rectangle width is at least \SI{70}{\milli\meter} - \item Completion time is less than \SI{1}{\second} - \end{itemize} - \end{description} + \begin{test}{Small rectangle} + \input{content/input/systemtest1.tex} \end{test} Repeatability is tested in one of the large system wide tests: \setcounter{testcounter}{5} - \begin{test}[label={rep}]{Repeatability} - This tests if the Writer can reach draw repeatedly on the same position on the board. - The system will start with drawing multiple \SI{60}{\milli\meter} squares on the board in a random location. - To test the repeatability, a circle with a \SI{55}{\milli\meter} diameter must be drawn inside of the square. - This should be done with twenty squares in an area of at least \SI{1000}{\milli\meter} x \SI{300}{\milli\meter}. - The drawing order of each square must be different from the drawing order of circles, this ensures that the Cable bot makes a different approach path. - \tcbline - \begin{description} - \item[Features:] SCARA, Cable Bot - \item[Specifications:] 3, 4, 9, 11 - \item[Results:] - The test passes when: - \begin{itemize} - \item Each square has a circle drawn inside. - \item The squares and circles are within \SI{5}{\milli\meter} of their given dimensions. - \item All the circles are completely within their corresponding square. - \end{itemize} - \end{description} + \begin{test}{Repeatability} + \input{content/input/systemtest6.tex} \end{test} The complete set of system tests is included in \autoref{app:test_specification}. diff --git a/content/input/speclista.tex b/content/input/speclista.tex new file mode 100644 index 0000000..18540a8 --- /dev/null +++ b/content/input/speclista.tex @@ -0,0 +1,8 @@ +\item The Writer must be able to write at least fifty characters per line. +\item The Writer must be able to write at least three lines of text. +\item The Writer must plot characters with a size that is readable from 4 meters for a person with good eyesight. +\item The Writer must plot in a regular used font with corresponding character spacing. +\item When a new tweet is send to the Writer, the Writer must wipe the existing tweet and write down the new tweet. +\item If the Writer is not wiping or writing then the Writer must not obstruct the view of the whiteboard. +\item While writing, the Writer must have a writing speed of at least one character per second. +\item The dynamics of the Writer must be complex/sophisticated/interesting. diff --git a/content/input/speclistb.tex b/content/input/speclistb.tex new file mode 100644 index 0000000..fdb03bd --- /dev/null +++ b/content/input/speclistb.tex @@ -0,0 +1,4 @@ +\item If the Writer is tasked to wipe the tweet, the Writer must wipe the tweet within sixty seconds +\item When a reset-signal is send to the Writer, the Writer must recalibrate its position on the board. +\item When a wipe-signal is send to the Writer, the Writer must wipe the board clean. +\item The Writer must not damage itself. diff --git a/content/input/speclistc.tex b/content/input/speclistc.tex new file mode 100644 index 0000000..a2309e9 --- /dev/null +++ b/content/input/speclistc.tex @@ -0,0 +1,5 @@ +\item While writing, the SCARA must have a writing speed of at least 1.5 characters per second. +\item When the Carriage/base of the SCARA is at a static position, the SCARA shall be able to write at least three characters at that position. +\item When the SCARA finished writing at their current position, the Cable bot shall move the SCARA to it's next position where it can write the subsequent characters. +\item When the SCARA has to be moved to a new position, the Cable bot shall perform this movement within one second. +\item When the system changes from writing to wiping or vice-versa, the SCARA and End-effector should change the tool within ten seconds. diff --git a/content/input/systemtest1.tex b/content/input/systemtest1.tex new file mode 100644 index 0000000..b17a96d --- /dev/null +++ b/content/input/systemtest1.tex @@ -0,0 +1,19 @@ + + During this test, a rectangle will be drawn on the whiteboard using the SCARA. + This rectangle is \SI{50}{\milli\meter} high and \SI{70}{\milli\meter} wide, such that three characters fit within the rectangle. + To test the speed requirements, the rectangle should be drawn within one second. + \tcbline + \begin{description} + \item[Features:] SCARA + \item[Specifications:] 3, 7, 11, 13, 14 + \item[Results:] The test passes when: + \begin{itemize} + \item Rectangle height is at least \SI{50}{\milli\meter} + \item Rectangle width is at least \SI{70}{\milli\meter} + \item Completion time is less than \SI{1}{\second} + \end{itemize} +% The SCARA must draw a square of at least \SI{50}{\milli\meter} high and \SI{70}{\milli\meter} wide. +% This box is large enough to draw at least 3 characters. +% This square should be drawn within one second. +% If it is slower than that, it is not able to achieve specification 7. + \end{description} diff --git a/content/input/systemtest6.tex b/content/input/systemtest6.tex new file mode 100644 index 0000000..40da6ca --- /dev/null +++ b/content/input/systemtest6.tex @@ -0,0 +1,18 @@ + + This tests if the Writer can draw repeatedly on the same position, for different approach angles, on the board. + The system will start with drawing multiple \SI{60}{\milli\meter} squares on the board in a random location. + To test the repeatability, a circle with a \SI{55}{\milli\meter} diameter must be drawn inside of the square. + This should be done with twenty squares in an area of at least \SI{1000}{\milli\meter} x \SI{300}{\milli\meter}. + The drawing order of each square must be different from the drawing order of circles, this ensures that the Cable bot makes a different approach path. + \tcbline + \begin{description} + \item[Features:] SCARA, Cable Bot + \item[Specifications:] 3, 4, 9, 11, (12) + \item[Results:] + The test passes when: + \begin{itemize} + \item Each square has a circle drawn inside. + \item The squares and circles are within \SI{5}{\milli\meter} of their given dimensions. + \item All the circles are completely within their corresponding square. + \end{itemize} + \end{description} From ef7c11897d330c1a53c3559756d16f5292f0aa12 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Thu, 21 Jan 2021 13:55:41 +0100 Subject: [PATCH 40/47] Remove unnecessary semicolons --- graphics/compare_table.tex | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/graphics/compare_table.tex b/graphics/compare_table.tex index 36bdada..b524f43 100644 --- a/graphics/compare_table.tex +++ b/graphics/compare_table.tex @@ -8,13 +8,13 @@ \newcolumntype{V}[1]{@{\hspace{\tabcolsep}}c@{\hspace{\tabcolsep}\tikzmark{#1}}} \newcolumntype{T}[1]{@{\hspace{\tabcolsep}}m{0.3cm}@{\hspace{\tabcolsep}\tikzmark{#1}}} -\newcommand{\xd}{\tikz{\fill[gray] (0,0) circle (3pt);}} -\newcommand{\od}{\tikz{\draw[gray] (0,0) circle (3pt);}} +\newcommand{\xd}{\tikz{\fill[gray] (0,0) circle (3pt)}} +\newcommand{\od}{\tikz{\draw[gray] (0,0) circle (3pt)}} \begin{document} \begin{tikzpicture}[remember picture] - \def\th{3.4}; + \def\th{3.4} \def\ct(#1,#2,#3){% \draw (mytable.north-|#1) --++ (60:\th); \node[rotate=60,anchor=west] at ($(mytable.north-|#1)!0.5!(mytable.north-|#2)$) {#3}; @@ -46,16 +46,16 @@ \draw (mytable.north west) --++ (60:\th); \draw (mytable.north east) ++ (60:\th) --([shift={(60:\th)}]mytable.north west); - \ct(mytable.north west,a,System Specification); - \ct(a,b,Small rectangle); - \ct(b,c,Perimiter); - \ct(c,d,Cable bot speed); - \ct(d,e,Triple Chars); - \ct(e,f,Tool Change); - \ct(f,g,Repeatability); - \ct(g,h,Linearity); - \ct(h,i,Writing); - \ct(i,j,Wiping); - \ct(j,k,Complexity); + \ct(mytable.north west,a,System Specification) + \ct(a,b,Small rectangle) + \ct(b,c,Perimiter) + \ct(c,d,Cable bot speed) + \ct(d,e,Triple Chars) + \ct(e,f,Tool Change) + \ct(f,g,Repeatability) + \ct(g,h,Linearity) + \ct(h,i,Writing) + \ct(i,j,Wiping) + \ct(j,k,Complexity) \end{tikzpicture} \end{document} From 354839b013efa6ba31a1759dfc947d912f6a8b17 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Thu, 21 Jan 2021 14:12:29 +0100 Subject: [PATCH 41/47] Fix robmosys reference --- content/case_experiment_feature_definition.tex | 2 +- include | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/case_experiment_feature_definition.tex b/content/case_experiment_feature_definition.tex index 314a004..b2096e3 100644 --- a/content/case_experiment_feature_definition.tex +++ b/content/case_experiment_feature_definition.tex @@ -37,7 +37,7 @@ \subsubsection{Separating Functions and Components} It was decided not to add the SCARA and the cable bot as features, for the reason that they do not define behavior. Instead, the features define how the hardware behaves. - A solution to organize the relations between features and components was found in RobMoSys\footnote{\url{https://robmosys.eu/approach/}}. + A solution to organize the relations between features and components was found in RobMoSys \autocite{noauthor_robmosys_2017}. RobMoSys defines a separation of levels in a design. Where the levels start functional and moves via software to hardware implementation. Although not all levels of RobMoSys are used, it was very useful to define the features of the system. diff --git a/include b/include index 2388754..dcb4ffe 160000 --- a/include +++ b/include @@ -1 +1 @@ -Subproject commit 23887547caf9e84215373493f0c49ccd51d0f9de +Subproject commit dcb4ffe97d76a51ebad862ce9cb93bf0f7ff407c From bcf75eeb15ec014c91478459b5a4ff5d3b91e9bd Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Mon, 25 Jan 2021 15:45:11 +0100 Subject: [PATCH 42/47] Finish software section --- content/case_experiment_prototype.tex | 39 ++++++++++++++++++++++++--- graphics/code_objects.tex | 21 +++++++++++++++ graphics/electronics.tex | 21 +++++++++++++++ include | 2 +- 4 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 graphics/code_objects.tex create mode 100644 graphics/electronics.tex diff --git a/content/case_experiment_prototype.tex b/content/case_experiment_prototype.tex index ac6324b..88aa581 100644 --- a/content/case_experiment_prototype.tex +++ b/content/case_experiment_prototype.tex @@ -19,20 +19,53 @@ Fortunately there was enough clearance to mount the SCARA slightly further on th Resulting in an operating SCARA without having to redesign the mechanics. \subsection{Control of the SCARA} +\begin{marginfigure} + \centering + \includegraphics[width=5cm]{graphics/electronics.pdf} + \caption{Hardware connections. The servo motor connected to a pwm-output. The stepper controller connected via UART and IO-pins. The stepper controller provides the correct current for the stepper motors.} + \label{fig:signals} +\end{marginfigure} Although the focus of the design plan was specifically not the software, it still forms a important part of the development. To run the hardware, I chose for for a STM32 \ac{mcu}. This is a powerfull processor with sufficient IO available. +The servo motor is directly connected to the IO of the \ac{mcu} while the stepper motor is connected via a stepper controller board, see \autoref{fig:signals}. RIOT-OS was chosen as an operating system due to prior experience and available support. To be able to write characters on the board the following tasks have to be implemented in software: \begin{itemize} \item Driver for the stepper controller \item Driver for servo motor + \item Inverse Kinematics \item Control/Path planning \end{itemize} The stepper controller chip can be configured over UART and has two simple IO pins for step and direction signal. To simplify the control, the software driver configures the stepper controller and includes functions to move the stepper motor to a certain angle. Meaning that the feedforward control of the steppers is handled by the software driver class. -The angle of the servo motor is controlled by the duty cycle of a \SI{50}{\hertz} PWM signal. -The PWM signal generation is offloaded to the IO peripherals and the software driver has a toggle function to lift the marker from the board. -Most of the code for the software driver was already available as a module in RIOT-OS. +The angle of the servo motor is controlled by the pulse length of a square wave. +This signal is generated in the IO peripherals as a PWM signal. +The software driver has a toggle function that changes the pulse length. Making the maker lift from or lower on the board. +The code for the servo driver was already available as a module in RIOT-OS. +\begin{marginfigure} + \centering + \includegraphics[width=2.83cm]{graphics/code_objects.pdf} + \caption{Simplified data flow in the software. The path planning generates a vector to the next set point. The interpolation reduces the length of this vector. With the inverse kinematics the required stepper motor angles are generated. These angles are set as new set point for the stepper driver.} + \label{fig:objects} +\end{marginfigure} + +The path planning is able to write three characters with the SCARA. +The font for the characters is made by \textcite{hudson_asteroids_2015}. +This font consists of a simple coordinates for characters and is written in C. +The path planning is updated with a fixed interval. +During the update, the set point is linearly interpolated, otherwise the lines are curved between set points. +To get the angle set points for the stepper motors, the $x,y$-coordinate set point is converted using the inverse kinematics. +The inverse kinematics is analogous to the model that is used in the development cycle of the SCARA. +The angle set points are updated for the stepper driver. +The data path is shown in \autoref{fig:objects}. + +The stepper driver has a feedforward controller. +The driver limits the acceleration and speed to keep the motor within operating specifications and keeps track of the current status of the stepper motor. +When the angle set point is updated, the driver calculates the time interval between each step and sets a hardware timer to that interval. +This allows the controller and other drivers to be executed between each step. +This approach works only if the code executes fast enough. +During the testing, I found that the inverse kinematics calculation was too expensive, even with the integrated floating point unit. +As the \ac{mcu} has sufficient flash storage available, the inverse kinematics calculation is replaced by a lookup table. diff --git a/graphics/code_objects.tex b/graphics/code_objects.tex new file mode 100644 index 0000000..b38d3c3 --- /dev/null +++ b/graphics/code_objects.tex @@ -0,0 +1,21 @@ +\documentclass{standalone} +\usepackage{tikz} +\usepackage{siltex} +\usetikzlibrary {arrows.meta,positioning} +\tikzset{nodes={text height=.7em, text width=2.8cm, align=center, +draw=black!50, thick, font=\footnotesize, fill=white}, +>={Stealth[round,sep]}, rounded corners, semithick} + +\begin{document} +\begin{tikzpicture}[y=0.8cm,x=3.2cm] + \node (pp) {Path planning}; + \node (ip)[below=1 of pp] {Interpolation}; + \node (ik)[below=1 of ip] {Inverse Kinematics\\/Lookup Table}; + \node (sd)[below=1 of ik] {Stepper driver}; + \begin{scope}[nodes={right, draw=none, fill=none, midway,text width={}}] + \path[->] (pp) edge node {$x,y$} (ip) + (ip) edge node {$x,y$} (ik) + (ik) edge node {$\phi,\psi$} (sd); + \end{scope} +\end{tikzpicture} +\end{document} diff --git a/graphics/electronics.tex b/graphics/electronics.tex new file mode 100644 index 0000000..a698021 --- /dev/null +++ b/graphics/electronics.tex @@ -0,0 +1,21 @@ +\documentclass{standalone} +\usepackage{tikz} +\usepackage{siltex} +\usetikzlibrary {arrows.meta,positioning} +\tikzset{nodes={minimum height=0.6cm, text width=2.25cm, align=center, +draw=black!50, thick, font=\footnotesize, fill=white}, +>={Stealth[round,sep]}, rounded corners, semithick} + +\begin{document} +\begin{tikzpicture}[on grid,y=1.2cm,x=2.75cm] + \node (mc) {Micro Controller}; + \node (ha)[left=0.5 of mc,draw=none,fill=none]{}; + \node (hb)[right=0.5 of mc,draw=none,fill=none]{}; + \node (sc)[below=1 of hb] {Stepper Controller}; + \node (sm)[below=1 of sc] {Stepper Motor}; + \node (sv)[below=1 of ha] {Servo Motor}; + \path[->] (mc) edge (sc) + (mc) edge (sv) + (sc) edge (sm); +\end{tikzpicture} +\end{document} diff --git a/include b/include index dcb4ffe..c481ca0 160000 --- a/include +++ b/include @@ -1 +1 @@ -Subproject commit dcb4ffe97d76a51ebad862ce9cb93bf0f7ff407c +Subproject commit c481ca012ef63f75bae07a0174d5098a4623e8e9 From 934f58b798245e5e00666d33f7f33817a05be2eb Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Wed, 10 Feb 2021 16:38:37 +0100 Subject: [PATCH 43/47] Small tweak of evaluation --- content/case_experiment_problem_description.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/case_experiment_problem_description.tex b/content/case_experiment_problem_description.tex index 9a6e2f8..b2d9a40 100644 --- a/content/case_experiment_problem_description.tex +++ b/content/case_experiment_problem_description.tex @@ -19,4 +19,4 @@ However, it was not expected to be this minimal. Perhaps the most serious disadvantage is the absence of stakeholders. Normally, a good problem definition focusses on getting the stakeholders on the same line \autocite{shafaat_exploring_2015}. However, this case study does only have one stakeholder, the author, defeating the purpose getting everyone on the same line. -Creating a more elaborate problem description would not improve the following design process, but it does cost valuable time. +Creating a more elaborate problem description would not improve the evaluation of the design process, but it does cost valuable time. From 9128e3c304abea9477c3e885d10f5af72cfe5386 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Wed, 10 Feb 2021 16:53:29 +0100 Subject: [PATCH 44/47] Reviewed specifications. --- content/case_experiment_specifications.tex | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/content/case_experiment_specifications.tex b/content/case_experiment_specifications.tex index 4e4fe90..7b40a90 100644 --- a/content/case_experiment_specifications.tex +++ b/content/case_experiment_specifications.tex @@ -4,11 +4,11 @@ The next step is to create specifications based on the problem description. The goal is to write and remove a tweet on the whiteboard. Originally a tweet had a character limit of 140, but this was doubled to 280\autocite{rosen_tweeting_2017}. - However, for this system the limit remains at 140 characters. + However, the decision is made to keep the limit at 140, as it does not improve the case study but can increase the construction cost. The text is limited to fifty characters per line, with a total of three lines. - This results in ten extra characters that can be used for word wrapping. + This results in ten extra characters that are used for word wrapping. For the readability, the distance to a whiteboard in a meeting room is taken as \SI{4}{\meter}. - The operating speed should allow the tweet to be written within three minutes. + The operating speed must allow the tweet to be written within three minutes. Therefore, the goal is to write one character per second. The last requirement is that the dynamics of the system must be sophisticated. Meaning that a solution with complex or non-trivial behavior is preferred. @@ -29,7 +29,7 @@ \end{specification} Additionally there are some restrictions on construction. - As the rapid prototyping facilities at the university are closed due to the Covid-19 pandemic, the available tooling in reduced to some hobby/DIY tools: + As the rapid prototyping facilities at the university are closed due to the Covid-19 pandemic, the available tooling in reduced to my personal tools: \begin{specification} \begin{itemize} \setlength{\itemsep}{10pt} @@ -51,7 +51,8 @@ The specifications step was performed without problems. Defining the specifications for the problem description did not present any difficulty. Due to the simplicity of the problem description, there were no contradictory requirements, which would complicate the specifications. - Furthermore, a single stakeholder takes away any negotiation the stakeholders. + Furthermore, a single stakeholder takes away any negotiation between stakeholders. + Where the stakeholders are a combination of engineers on the design team and/or the project client. Although the specifications itself are not difficult to define, ensuring that they are complete is difficult. Team members and stakeholders help to spot any ambiguity or problems with the validity. From b2a7f238d07650ce559c408ae29c6757724078c6 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Wed, 10 Feb 2021 17:43:35 +0100 Subject: [PATCH 45/47] Review of initial design --- content/case_experiment_initial_design.tex | 95 +++++++++++++--------- 1 file changed, 56 insertions(+), 39 deletions(-) diff --git a/content/case_experiment_initial_design.tex b/content/case_experiment_initial_design.tex index 620f7ac..12da2b0 100644 --- a/content/case_experiment_initial_design.tex +++ b/content/case_experiment_initial_design.tex @@ -3,15 +3,15 @@ \label{sec:initialdesign} The initial design started with a design space exploration. The goal was to collect possible solutions and ideas for the implementation. - The exploration resulted in a lot of whiteboard writing robots. + The exploration resulted in a lot of whiteboard writing robots ideas. These robots can be sorted in four different configurations Each configuration explained in the following sections. - From the possible configurations, the optimal configuration that fits the specifications is made into an initial design. + From the possible configurations, the one that fits the specifications best, is made into an initial design. \subsubsection{Cable-Driven} The cable-driven robot is suspended with multiple cables. The end-effector that contains the marker is moved along a board by changing the length of the cables. - The cable-based positioning systems result in a end-effector with a large range and high velocities. + The cable-based positioning systems result in an end-effector with a large range and high velocities. A basic setup can be seen in \autoref{fig:cablebotdrawing}. This given setup contains two cables that are motorized. The big advantage of this system is that it scales well, as the cables can have almost any length. @@ -60,7 +60,7 @@ \subsubsection{Polar-coordinate robot} This robot is a combination of a prismatic and a revolute joint. Where the revolute joint can rotate the prismatic joint as seen in \autoref{fig:polar}. - With this it can reach any point within a radius from rotational joint. + With this it can reach any point within a radius from the rotational joint. This is a little more complex design than the Cartesian robot. \begin{figure} \centering @@ -75,27 +75,28 @@ \label{fig:polar_protrude} \end{marginfigure} - This robot has some disadvantages. + This robot has multiple disadvantages. The range of the robot is defined by the length of the prismatic joint. - However, if the prismatic joint is fully retracted, the joint does not get shorter. - In that case the arm still protrudes on the other side. - Therefore the complete radius around the revolute joint cannot have any obstacles. + Thus when the operating range is doubled, the robot size has to be doubled or even more than that. + Furthermore, when the arm of the robot is retracted, it protrudes on the other side. + Therefore, the complete radius around the revolute joint cannot have any obstacles. \autoref{fig:polar_protrude} gives an impression of the required area. Even with this area, the arm cannot reach the complete board. This makes required space of the setup very inefficient. - Another disadvantage is that a long arm increases the moment of inertia and the gravitational torque quadratically. + Another disadvantage is that a long arm increases the moment of inertia and the gravitational torque on the joint quadratically. Furthermore, the long arm introduces stiffness problems and it amplifies any inaccuracy in the joint. \subsubsection{SCARA} The SCARA robot is a configuration with two linkages that are connected via rotational joints. It can be compared to a human arm drawing on a table as seen in \autoref{fig:scara}. Similar to the Polar robot it can reach all points within a radius from the base of the robot. - However, the arm can be configurated to not protrude outside of the board. - If the situation requires the arm to protrude, it is still significantly less than the polar arm (\autoref{fig:polar_protrude}). - Furthermore, depending on the configuration the of the arm the area where it protrudes can be significantly smaller. - However, the additional joint and extra arm length does add to the moment of inertia and gravitational torque similar to the polar robot. - The SCARA is therefore not a robot that is convenient with large working areas. - However, it can be really quick and precise in relative small areas. + But the SCARA does not protrude like the polar arm (\autoref{fig:polar_protrude}). + Depending on the configuration of the arm, it is possible to keep the arm completely within the area of operation. + A downside is that the mass of the additional joint and extra arm length increase the moment of inertia and gravitational torque similar to the polar robot. + This makes the SCARA configuration convenient for small working areas as that keeps the forces managable. + Additionally, as the arms of the SCARA have a fixed length, it is possible to create a counter balance. + This can be used to remove any gravitational torque from the system. It would however increase the moment of inertia even further. + For current specifications, the working area is too large for any practical application of the SCARA. \begin{figure} \centering \includegraphics[width=8.74cm]{graphics/scara.pdf} @@ -106,24 +107,38 @@ \subsubsection{Choice of system} The previous sections have shown four different configurations. These configurations are compared in \autoref{tab:initial_design}. - Each of the systems are scored on range, speed, cost, obstruction, effective area, and the interesting dynamics. - The range scores the system on the practical dimension of the system, larger is better. - The cable and cartesian configuration scale very well, the cables or slider rails can be made longer without real difficulty. - The SCARA or polar configuration run into problems with the arm lengths, as forces scale quadratically with their length. - Except for the cable bot, all configurations score sufficient on speed. - The cable bot can be quick, but is limited in acceleration, and depends on the type of cable configuration. - For the cost, all systems fit within the €200 budget, except for the Cartesian setup. - All systems require some DC or stepper motors, but the cartesian setup also requires linear sliders which are expensive for longer distances. - The obstruction score depends on the capability of the system to move away from the text on the board, such that the system does not obstruct the written tweet. - For the scalability, only the cable bot scores high. - The cables make it possible to easily change the operating range of the system, only requiring reconfiguration. - The cartesian system scales poor because the length of the sliders is fixed, and longer sliders are expensive. - For the Polar system and SCARA, the forces on the joints scale quadratically with the length of the arms. - However, the SCARA can be build with counter balance making it scale less worse than the Polar system. - With the effective area, the system is scored on the area it requires to operated versus the writable area. - The last one, how interesting or challenging are the dynamics. - The cartesian configuration is trivial, both sliders operate completely separate from each other and the position coordinates can be mapped one to one with the sliders. - For the other configuration, some inverse kinematics are required to get from desired position to the control angles of the system. + Each of the systems are scored on range, speed, cost, obstruction, effective area, and the interesting dynamics: + \begin{description} + \item{\emph{Range}}\\ + The range scores the system on the practical dimension of the system, larger is better. + The cable and cartesian configuration scale very well, the cables or slider rails can be made longer without real difficulty. + The SCARA or polar configuration run into problems with the arm lengths, as forces scale quadratically with their length. + \item{\emph{Speed}}\\ + Except for the cable bot, all configurations score sufficient on speed. + The cable bot can reach high velocities, but the acceleration is limited, depending on the configuration, to the gravitational acceleration. + \item{\emph{Cost}}\\ + For the cost, all systems fit within the €200 budget, except for the Cartesian setup. + All systems require DC or stepper motors, but the cartesian setup also requires linear sliders which are expensive, especially for longer distances. + \item{\emph{Obstruction}}\\ + The obstruction score depends on the capability of the system to move away from the text on the board, such that the system does not obstruct the written tweet. + All systems except for the cable bot can move themself outside of the working area. + It is possible that the cables of the cable bot obstruct the view. + However, the wires are expected to be thin enough to not block any text. + \item{\emph{Scalability}}\\ + For the scalability, only the cable bot scores high. + The cables make it possible to easily change the operating range of the system, only requiring reconfiguration. + The cartesian system scales poor because the length of the sliders is fixed, and longer sliders are expensive. + For the Polar system and SCARA, the forces on the joints scale quadratically with the length of the arms. + However, the SCARA can be build with counter balance making it scale less worse than the Polar system. + \item{\emph{Effective Area}}\\ + With the effective area, the system is scored on the area it requires to operated versus the writable area. + \item{\emph{Interesting Dynamics}}\\ + The last metric, scores the system on the complexity of the dynamics. + This is a more subjective metric, but also a very important one. + In the problem description, the complexity of the dynamics was determined as one of the core requirements. + The cartesian configuration is trivial, both sliders operate completely separate from each other and the position coordinates can be mapped one to one with the sliders. + For the other configuration, some inverse kinematics are required to get from desired position to the control angles of the system. + \end{description} \begin{table}[] \caption{Table with comparison of the four proposed configurations and a combined configuration of the cable bot and the SCARA.} @@ -141,13 +156,15 @@ \end{tabular} \end{table} - Based on this comparison, I decided to disqualify the cartesian and polar system. - The cartesian has no interesting dynamics and is expensive to build at a large enough scale. + Based on this comparison, I disqualified the cartesian and polar system. + The cartesian has no interesting dynamics and is expensive to build at the current scale. The polar system is just not feasible, the arm length required to cover the writing area results forces that are too large. - Making the joint that can deliver the torque for that arm and also providing enough speed is just out of the scope of this case study. - The two remaining configurations also contain some downsides. The cable bot is slow, and the arm length for the SCARA is also likely to cause problems. - Therefore, I decided to combine both systems: a cable bot system that moves a small SCARA along the whiteboard. - The small SCARA is quick while the cable bot gives the system an enormous range. + Making a rotational joint that delivers the torque and velocity required for such an arm, is just out of the scope of this case study. + The two remaining configurations come with serious downsides as well. + The cable bot is slow, and the arm length for the SCARA is also likely to cause problems. + However, by combining both, it is possible to get a system that fits the requirements very well. + By building a small SCARA that is the suspended by the cable bot, it combines the best of both worlds. + The small SCARA is quick and accurate, while the cable bot gives the system an enormous range. Resulting in a system that scores high on all criteria except obstruction. The grading for the combined system is shown in the most right column in \autoref{tab:initial_design}. From f41100e0faa3558ecb326e1994915297b2d1c694 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Mon, 22 Feb 2021 14:36:45 +0100 Subject: [PATCH 46/47] Review end-effector section --- content/case_experiment_end-effector.tex | 116 ++++++++++++----------- graphics/end-effector.tex | 24 ++--- include | 2 +- 3 files changed, 76 insertions(+), 66 deletions(-) diff --git a/content/case_experiment_end-effector.tex b/content/case_experiment_end-effector.tex index cb1d001..4115d07 100644 --- a/content/case_experiment_end-effector.tex +++ b/content/case_experiment_end-effector.tex @@ -1,64 +1,62 @@ With the preparation phase completed, the development cycle is next. This consists of three steps: Feature selection, Rapid Development and Variable Approach. The current section explains the first development cycle during the design. -For this first cycle of the design process, I will develop the end-effector. -The implementation of the end-effector was not successful, as the design was too complex. -Fortunately, this failure did give valuable insight on the design method. +For this first cycle of the design process, I design the end-effector. +However, not long after the start of the development process, the implementation proved to be too complex. +This led to the decision to abort the implemention of the end-effector. +Eventhough no progress was made, this attempted implementation did provide valuable insight in the desing process. \subsection{Feature Selection} \label{sec:case_feature_selection_1} \begin{table}[] - \caption{Overview of the different features and their dependencies, number of tests that can be completed and the risk/time factor. + \caption{Overview of the different features and their dependencies, number of tests that are covered and the risk/time factor. The risk/time factor is calculate as risk divided by time.} \label{tab:firstfeatureselection} \begin{tabular}{|l|l|l|l|l|l|} \hline Feature & Dependees & Tests & Risk & Time & Risk/Time \\ \hline - SCARA & - & 3 & 40\% & 10 days & 4 \\ \hline - End-effector & SCARA & 2 & 60\% & 8 days & 7.5 \\ \hline - Carriage & - & 2 & 30\% & 10 days & 3 \\ \hline + \ac{scara} & - & 3 & 40\% & 10 days & 4 \\ \hline + End-effector & \ac{scara} & 2 & 60\% & 8 days & 7.5 \\ \hline + \ac{cdc} & - & 2 & 30\% & 10 days & 3 \\ \hline \end{tabular} \end{table} - The feature is selected according to the feature selection step, explained in \autoref{sec:feature_selection}. - For each component in the system the dependees, tests and risk/time factor is determined. + For each feature in the system the dependees, tests and risk/time factor is determined, as explained in \autoref{sec:feature_selection}. These values are combined into \autoref{tab:firstfeatureselection}. - The SCARA is dependent on the end-effector, as was explained in the initial design. - However, for the carriage no dependency was defined even though it has to lift the other two components. - This is mainly because the behavior of the SCARA changes depending on the end-effector, resulting in a possible design change. - For the carriage it only changes the mass that has to be lifted. + The \ac{scara} depends on the end-effector, as explained in the initial design. + However, for the \ac{cdc} no dependency was defined even though it has to lift the other two components. + This is mainly because the torque and range requirements of the \ac{scara} depending on the implementation of the end-effector. + Especially the required range depends on the method of grabbing and releasing tools. + For the \ac{cdc} it only changes the mass that has to be lifted. Upgrading the motor torque is a minor parametric change and the dependency is therefore insignificant. - The testing number is directly the number of tests that can be completed by implementing that single component. + The testing number is directly the number of tests that apply to that feature. The risk and time values are not determined with a specific protocol, but with simple engineering judgement. The estimated risk is high for the end-effector due to the collision dynamics of the operation. It has to grab something and that is difficult to model. Furthermore, it was not known if that design would work. - The SCARA has the most moving parts, but no difficult dynamics and has therefore an estimated risk of medium. - For the carriage there was no real risks and got therefore a low risk indication. + The \ac{scara} has the most moving parts, but no difficult dynamics and has therefore an estimated risk of medium. + For the \ac{cdc} there was no real risks and got therefore a low risk indication. - The SCARA would be implemented first based on number of tests, but is dependent on the end-effector. - Beginning with the end-effector is an obvious choices. - It unlocks the SCARA and has the highest risk/time factor. + Based on \autoref{tab:firstfeatureselection}, the end-effector is implemented first. + The end-effector has the most dependees, and is therefore chosen above the other two. \subsubsection{Evaluation} This first step of the detail design phase did go well. - A more refined method for this step could be very useful. - But the risk and time assessment will probably always be a engineering judgement from the developer. + Although risk and time assessment is always depend on some engineering judgment, this human factor introduces uncertainty in the assessment. + However, an improved approach for the risk assesment can drastically reduce this human factor. Within a design team a form of planning poker \autocite{grenning_planning_2002} could be a good option. - \begin{figure} - \centering - \includegraphics[width=0.9\linewidth]{graphics/end-effector.pdf} - \caption{Operation of the end-effector. The marker is clamped in the springloaded end-effector (1). - To release the marker, the upper part of the clamp is placed against the holder (2). This extra arm length is used as a leverage to open clamp while the end-effector moves downwards (3,4). - The arm length also allows to move backwards without disturbing the marker (5,6). To grab the marker, the process is repeated in reverse.} - \label{fig:gripper} - \end{figure} - \subsection{Rapid Development of the End-Effector} - The end-effector will operate as an interface between the SCARA and the different tools. - For that it has to be able to grab and release the tools. - The end-effector is mounted at the end of the SCARA. + This section explains the process of the development of the end-effector. + The first step is to create an initial design of the model. + In subsequent steps, detail is added to this model. + + The previous section explained the relative high risk assessment for the end-effector. + Which was not exaggerated as the implementation proved to be troublesome. + Eventually, the implementation was unfeasible and was therefore cut short. + Nonetheless did it result in useful evaluation points on the design method. + The process of this step is explained in the following sections. + The development starts with an initial design of the system. The next step is to develop that further into a model and prototype. @@ -66,28 +64,41 @@ Fortunately, this failure did give valuable insight on the design method. However, the evaluation gave new useful insight on the design plan. \subsubsection{Initial design} - There are multiple options to connect a tool with a moving arm. - However, there is a trade-off to be made with the SCARA feature, the heavier the end-effector is, the more force the SCARA must deliver. - And because the goal is to make the SCARA light and quick, this end-effector should be light-weight. - The best options in this case is to go with a simple spring-loaded clamp. - It is light-weight, and provides sufficient clamping force and precision for this application. - To release the tool, the clamp must be forced open. - Instead of using a servo, the movement of the SCARA can force the clamp open, resulting in a significant simplification of the design. - The initial design of the clamp and the operation is shown in \autoref{fig:gripper}. + The end-effector is mounted on the \ac{scara} and acts as an interface. + With the end-effector, the \ac{scara} is able to grab and release tools. + There are multiple approaches to handle these tools. + However, there is a trade-off to be made with the \ac{scara} feature, the heavier the end-effector is, the more force the \ac{scara} must deliver. + And because the goal is to make the \ac{scara} light and quick, this end-effector must be light-weight as well. + The best options in this case is a simple spring-loaded clamp. + To release the tool, the clamp is forced open, pushing it against the holder. + As the end-effector is connected to the \ac{scara}, the \ac{scara} is responsible for the pushing force. + Because the actuation force of the \ac{scara} is used, it removes the need for an additional servo in the end-effector. + Resulting in a simpler and lighter design. + The initial design of the clamp and the operation is shown in \autoref{fig:gripper}. + Although this design requires the \ac{scara} to deliver more force. + The relative low mass of the end-effector also keeps the moment of inertia small. + Therefore, the current design reduces the impact on the acceleration of the \ac{scara} to a minimum. + \begin{figure*} + \centering + \includegraphics[width=151mm]{graphics/end-effector.pdf} + \caption{Operation of the end-effector. The clamp is forced open against the holder to release the marker. + Instead of releasing, the marker is grabbed by reversing the order of executing for these steps.} + \label{fig:gripper} + \end{figure*} \subsubsection{Behavior Modelling} - The next step is to implement this design with the corresponding behavior in a dynamic model. - The challenge in this case is the modelling of the contact dynamics. - Based on some experience in modelling with collisions, I decided to use the 20-sim 3D mechanics editor. - There is little tooling available and there are no debugging options if the model does not behave as expected. - The marker kept falling trough the gripper or flew away. - With the small amount of progress made in two days the implementation was not promising. - A system freeze caused the model to corrupt, where the complete configuration of the shapes and their collisions was lost. - Based on the loss of work and the low feasibility of the implementation, it was decided that the end-effector would no longer be part of the design. + The next step is to implement this design with the corresponding behavior in a dynamic model. + The challenge in this case is the modelling of the contact dynamics. + Based on some experience in modelling with collisions, I decided to use the 20-sim 3D mechanics editor. + Unfortunately, there is little tooling available and there are no debugging options if the model does not behave as expected. + The marker kept falling trough the gripper or flew away. + With the small amount of progress made in two days the implementation was not promising. + A system freeze caused the model to corrupt, where the complete configuration of the shapes and their collisions was lost. + Based on the loss of work and the low feasibility of the implementation, the decision was made to remove the end-effector from the design. - With the end-effector removed, the SCARA will get a direct connection with the marker. - The lifting of the marker from the will be included in the SCARA as well. - Furthermore, this means that the wiping will no be possible via the SCARA. + With the end-effector removed, the \ac{scara} gets a direct connection with the marker. + The lifting of the marker from the is included in the \ac{scara} as well. + Furthermore, this means that the erasing is no longer possible as a feature. \subsubsection{Evaluation} The lost progress of the model is unfortunate, but the implementation did not go as expected anyway. @@ -95,4 +106,3 @@ Fortunately, this failure did give valuable insight on the design method. However, it did show the value of the risk/time analysis. This early failure resulted in changes for other components. But as none of the components were implemented yet, no work was lost. - diff --git a/graphics/end-effector.tex b/graphics/end-effector.tex index 3a4b14b..e9a680f 100644 --- a/graphics/end-effector.tex +++ b/graphics/end-effector.tex @@ -6,7 +6,7 @@ %\input{graphics/tics.tikz} \begin{document} - \begin{tikzpicture}[x=0.6cm, y=0.6cm] + \begin{tikzpicture}[x=0.9cm, y=0.9cm, nodes={text width=4.5cm,anchor=north west,draw=none}] \def \markerradius {0.5}; \def \angle {40}; \def \startangle {-90-\angle}; @@ -20,8 +20,8 @@ \def \blockdistance {2.8} \def \blockpos {(0,0)}; \def \markerdrop {0.5}; - \def \spacing {5.5}; - \def \yspacing {3.9}; + \def \spacing {5.6}; + \def \yspacing {4.6}; \tikzset{ block/.pic= { @@ -45,13 +45,13 @@ \draw[fill=gray] (0,0) circle(\markerradius); } } - \def \nodepos {(\blockdistance+1,1.9)}; + \def \nodepos {(\blockdistance-4.0,2.9)}; \begin{scope}[shift={(0*\spacing,0)}] \def \eex {1.3}; \def \eey {-0.5}; \pgfmathsetmacro{\clampangle}{max(0,atan2(\eey,{\blockdistance+\eex}))}; \draw \blockpos pic {block}; - \node at \nodepos {1.}; + \node at \nodepos {1. Marker is clamped in springloaded end-effector.}; \draw (2-\eex,{\markerradius+\eey*-1}) pic {marker}; \begin{scope}[shift={(-\eex,-\eey)}] \draw (0,0) pic {lowerclamp}; @@ -63,7 +63,7 @@ \def \eey {0}; \pgfmathsetmacro{\clampangle}{max(0,atan2(\eey,{\blockdistance+\eex}))}; \draw \blockpos pic {block}; - \node at \nodepos {2.}; + \node at \nodepos {2. End-effector is positioned on the holder.}; \draw (2,\markerradius) pic {marker}; \begin{scope}[shift={(-\eex,-\eey)}] \draw (0,0) pic {lowerclamp}; @@ -75,7 +75,7 @@ \def \eey {0.5}; \pgfmathsetmacro{\clampangle}{max(0,atan2(\eey,{\blockdistance+\eex}))}; \draw \blockpos pic {block}; - \node at \nodepos {3.}; + \node at \nodepos {3. End-effector is moved down, forcing the upper clamp open.}; \draw (2,\markerradius-\markerdrop) pic {marker}; \begin{scope}[shift={(-\eex,-\eey)}] \draw (0,0) pic {lowerclamp}; @@ -87,7 +87,7 @@ \def \eey {0.7}; \pgfmathsetmacro{\clampangle}{max(0,atan2(\eey,{\blockdistance+\eex}))}; \draw \blockpos pic {block}; - \node at \nodepos {4.}; + \node at \nodepos {4. End-effector continues down, leaving the marker in the holder.}; \draw (2,\markerradius-\markerdrop) pic {marker}; \begin{scope}[shift={(-\eex,-\eey)}] \draw (0,0) pic {lowerclamp}; @@ -99,7 +99,7 @@ \def \eey {0.7}; \pgfmathsetmacro{\clampangle}{max(0,atan2(\eey,{\blockdistance+\eex}))}; \draw \blockpos pic {block}; - \node at \nodepos {5.}; + \node at \nodepos {5. The longer arm allows the end-effector to move sideways.}; \draw (2,\markerradius-\markerdrop) pic {marker}; \begin{scope}[shift={(-\eex,-\eey)}] \draw (0,0) pic {lowerclamp}; @@ -111,7 +111,7 @@ \def \eey {0}; \pgfmathsetmacro{\clampangle}{max(0,atan2(\eey,{\blockdistance-\eex}))}; \draw \blockpos pic {block}; - \node at \nodepos {6.}; + \node at \nodepos {6. Return to begin position, now without marker.}; \draw (2,\markerradius-\markerdrop) pic {marker}; \begin{scope}[shift={(-\eex,-\eey)}] \draw (0,0) pic {lowerclamp}; @@ -119,8 +119,8 @@ \end{scope} \end{scope} - \draw (4.2,-1.3*\yspacing) -- ++(0,1.9*\yspacing); - \draw[shift={(\spacing,0)}] (4.2,-1.3*\yspacing) -- ++(0,1.9*\yspacing); + \draw (4.2,-1.3*\yspacing) -- (4.2,2.9); + \draw[shift={(\spacing,0)}] (4.2,-1.3*\yspacing) -- (4.2,2.9); \draw(-1.4,-1.5) -- ++(3*\spacing,0); \end{tikzpicture} diff --git a/include b/include index c481ca0..c60fc73 160000 --- a/include +++ b/include @@ -1 +1 @@ -Subproject commit c481ca012ef63f75bae07a0174d5098a4623e8e9 +Subproject commit c60fc733267eb72f37dc3228cf76d95be5a7d7db From 998c608855a068d4ec2b21e816fa2a3274011ce9 Mon Sep 17 00:00:00 2001 From: Wouter Horlings Date: Mon, 22 Feb 2021 15:56:39 +0100 Subject: [PATCH 47/47] Review of Scara-design --- content/case_experiment_scara.tex | 127 ++++++++++++++---------------- 1 file changed, 58 insertions(+), 69 deletions(-) diff --git a/content/case_experiment_scara.tex b/content/case_experiment_scara.tex index 0bc0e0f..dd33be6 100644 --- a/content/case_experiment_scara.tex +++ b/content/case_experiment_scara.tex @@ -1,13 +1,15 @@ %&tex As the previous development cycle was aborted prematurely, the development cycle is repeated for the next feature. + Starting with a feature selection process. Followed by the rapid development. + \subsection{Feature Selection} - The implementation of the end-effector proved to be impractical. + The implementation of the end-effector proved to be unfeasible and was therefore removed from the design. This means that only two features are left. \autoref{tab:featurestab2} shows an updated feature comparison. - Compared with the previous feature selection in \autoref{tab:firstfeatureselection}, the number of tests for the SCARA decreased and the Risk/Time increased. - This is because \autoref{test_tool_change} relied on both the SCARA and the End-effector which is no longer applicable. - Based on the feature comparison, the next component to implement is the SCARA. + Compared with the previous feature selection in \autoref{tab:firstfeatureselection}, the number of tests for the \ac{scara} decreased and the Risk/Time increased. + This is because \autoref{test_tool_change} relied on both the \ac{scara} and the End-effector which is no longer applicable. + Based on the feature comparison, the next component to implement is the \ac{scara}. \begin{table}[] \caption{Comparison of the two remaining features in the design process. This table is an updated version of \autoref{tab:firstfeatureselection}.} @@ -15,22 +17,22 @@ \begin{tabular}{|l|l|l|l|l|l|} \hline Feature & Dependees & Tests & Risk & Time & Risk/Time \\ \hline - SCARA & - & 2 & 50\% & 12 days & 4.2 \\ \hline - Carriage & - & 2 & 30\% & 10 days & 3 \\ \hline + \ac{scara} & - & 2 & 50\% & 12 days & 4.2 \\ \hline + \ac{cdc} & - & 2 & 30\% & 10 days & 3 \\ \hline \end{tabular} \end{table} \subsubsection{Evaluation} The feature selection for the second cycle is an updated selection process of the first cycle (\autoref{sec:case_feature_selection_1}). - This resulted in a quick and effortless feature selection process. + This resulted in a quick and effortless feature selection process, as most of the work was already done. \subsection{Rapid Development for SCARA} - The goal is to present a functional model of the SCARA. - The specifications state that it must be able to write three characters within 2 seconds. - And to pass \autoref{test1} it must draw a \SI{50}{\milli\meter} by \SI{70}{\milli\meter} rectangle within 1 second. + The goal is to present a functional model of the \ac{scara}. + The requirements state that it must be able to write three characters within two seconds. + And to pass \autoref{test1} it must draw a \SI{50}{\milli\meter} by \SI{70}{\milli\meter} rectangle within one second. The basic design principle is based on the initial design as shown in \autoref{fig:combined}. For the lowest detail level of the design, I decided on a kinematics model. - The model is stays very simple as it does not implement any physics. + The model is very simple as it does not implement any physics. However, the model enables me to tinker with the design parameters, such as the lengths of the linkages and joint angles. In the following steps, the level of detail is gradually increased to arrive at a competent model. Planning all the different steps in advance is difficult as design decisions still need to be made. @@ -55,86 +57,73 @@ There is, unsurprisingly, lack of a clear vision of the end-product. Which makes an explicit description of every level of detail not realistic. However, it was still possible to describe the initial steps in the level of detail of the design. - The remaining elements, that are essential to the design, will take shape in a later stage of the development. + The remaining elements, that are essential to the design, take shape in a later stage of the development. Apart from this small deviation, the deliverables of this step are a good start of this development cycle. \subsection{Variable Detail Approach} The following steps is to increase the level of detail of the model. The initial model together with the set of steps in the detail level is inherited from the previous design step. - To start, I will implement the basic model and implement the different levels of detail. + To start, I implement the basic model and implement the different levels of detail. Based on the model after those steps, it is possible to make more detailed design decisions. The decisions make it possible to plan the subsequent levels of detail. - Implementing these details as well, results in a competent model. + Implementing these details results in a competent model. \subsubsection{Basic Kinematics Model} \begin{marginfigure} \centering \includegraphics[width=0.9\linewidth]{graphics/scara_arm_kinematics.pdf} - \caption{Basic kinematics of the SCARA. The arm consists of two linkages $a$ and $b$; two joints $\alpha$ and $\beta$; and a point mass $m$ which represents the end-effector/tool.} + \caption{Basic kinematics of the \ac{scara}. The arm consists of two linkages $a$ and $b$; two joints $\alpha$ and $\beta$; and a point mass $m$ which represents the end-effector/tool.} \label{fig:scaraarm} \end{marginfigure} - The development starts with a basic model model as shown in \autoref{fig:scaraarm}. - It consists of the forward and inverse kinematics of the design. - With this kinematics model it was easy to find a good configuration of the SCARA. - I tested if the SCARA could reach the required operating area, to be able to satisfy system specification 14. - The operating area is a couple of centimeters away from the base of the SCARA. - This is to avoid the singularity point that lies at the base of the SCARA. - Resulting in longer arms than strictly necessary but this reduces the operating angles of the joints allowing for simpler construction. + The development starts with the basic model shown in \autoref{fig:scaraarm}. + The model consists of the forward and inverse kinematics of the design. + With this kinematics model it was easy to find a suitable configuration of the \ac{scara}. + I tested if the \ac{scara} reaches the required operating area, to satisfy system requirement 14. + The operating area is a couple of centimeters away from the base of the \ac{scara}. + This is to avoid the singularity point that lies at the base of the \ac{scara}. + Resulting in longer arms than strictly necessary but reducing the operating angles of the joints, allowing for simpler construction. At this point, there are already multiple design decisions made about the position of the operating area and the arm lengths. - The second detail iteration adds the basic physics of the model. - This model was in the form of a double pendulum, with two attenuated joints. - The ideal motors in the joints made gave the SCARA almost unlimited acceleration. + As second detail iteration the basic physics of the model are implemented. + The model is in the form of a double pendulum, with two actuated joints. + The ideal motors in the joints made give the \ac{scara} unlimited acceleration. As the one of the goals is to get an indication on what the required torque for these joints is, the ideal motors are replaced with basic DC-motors. - Implementing a simple PID-controller allowed the SCARA to follow the rectangular path as described in system test \ref{test1}. - Based the simulation, it was possible to determine minimum specifications of the motors. + Implementing a simple PID-controller allows the \ac{scara} to follow the rectangular path as described in \autoref{test1}. + The simulation allowed me to determine the minimum requirements of the motors. The motors must be able to deliver at least \SI{0.2}{\newton\meter} of torque and reach an angular velocity of at least \SI{12}{\radian\per\second}. - - \begin{marginfigure} - \centering - \includegraphics[width=0.9\linewidth]{graphics/scara_20sim_model.png} - \caption{3D plot of the current implementation. The rectangular shapes represent are the linkages and implemented as rigid bodies. - The sphere on the origin and the one between both linkages represent the actuated joints. - There is no inertia implemented for these joints.} - \label{fig:scara_20sim} - \end{marginfigure} - - The current implementation can be seen in \autoref{fig:scara_20sim}. - Now that the model forms a basic with the non-ideal motors, basic physics and a control law, it can be used to make some estimates. - The model was configured to follow the required path in the specified amount out time according to System Test \ref{test1}. - The torque required gave a rough estimate of the required actuation force of the motors. \subsubsection{Detailed design decisions} - The basic model gave some good insight and information about the dynamic behavior of the system. + The basic model gave some valuable insight about the dynamic behavior of the system. However, the current configuration is very simple but requires a motor in the joint. In \autoref{fig:scaradesign}, this setup is shown as configuration 1. - The disadvantage is that a motorized joint is heavy and has to be accelerated with the rest of the arm. + The disadvantage is that a motorized joint is heavy, which has to be accelerated with the rest of the arm. Other configurations in \autoref{fig:scaradesign} move the motor to a static position. Configuration 2 is a double arm setup, but has quite limited operating range, caused by a singularity region in the system when both arms at the top are in line with each other. - Configuration 3 also has such a singularity, but due to the extended top arm this point of singularity is outside of the operating range. + Configuration 3 also has such a singularity, but due to the extended top arm this point of singularity is located outside of the operating range. However, this configuration requires one axis with two motorized joints on it. Even though this is possible, it does increase the complexity of the construction. - By adding an extra linkage, the actuation can be split as shown in configuration 4. + By adding an extra linkage, the actuation is split as shown in configuration 4. + Configuration 4 is the preferred option for the \ac{scara} \begin{figure} \centering \includegraphics[width=0.875\linewidth]{graphics/scara_design.pdf} - \caption{Four different SCARA configurations. The colored circles mark which of the joints are actuated. Configuration 3 has two independently actuated joints on the same position.} + \caption{Four different \ac{scara} configurations. The colored circles mark which of the joints are actuated. Configuration 3 has two independently actuated joints on the same position.} \label{fig:scaradesign} \end{figure} - The actuation of the arm is done with stepper motors, which have the advantage over DC-motors with their holding torque. - The holding torque removes the need of a feedback controller to compensate for external forces. - Instead, the stepper motors can be fully operated with a feedforward controller. - However, they are heavier and more expensive. - The additional mass is beneficial as increased inertia of the base, reducing the displacement due to the reaction force of the SCARA acceleration. + The actuation of the arm is done with stepper motors, which have a strong advantage over DC-motors with their holding torque. + The holding torque removes the need for a feedback controller that compensates for external forces. + Allowing the stepper motors to be fully operated with a feedforward controller. + However, they are heavier and more expensive but the additional mass is beneficial as increased inertia of the base. + The extra inertia reduces the displacement which is caused by the reaction force of the \ac{scara} accelerating. The extra costs are easily compensated as it saves development time due to the simplified control law, and the removed need for extra angle sensors used in feedback control. - Due to the aborted implementation of the end-effector, the SCARA must also lift the marker of the board. - The chosen configuration of the SCARA makes it possible to add an extra joint in the linkage. + Due to the aborted implementation of the end-effector, the \ac{scara} must also lift the marker of the board. + With the fourth configuration (\autoref{fig:scaradesign}), it is possible to add an extra joint in the linkage. As the marker only needs to be moved a couple of millimeters from the board, a simple hobby servo suffices. \subsubsection{Advanced Detail Design} - The new concrete design decisions, make it possible to plan the next steps of adding detail. + The design decisions made in the previous sections, make it possible to plan the next steps of adding detail. The following steps are an addition to the steps as described in the previous section: \begin{enumerate} \setcounter{enumi}{4} @@ -142,10 +131,10 @@ \item Updating physics model to 3D physics. \item Marker lifting behavior, servo lifts marker of the board. \end{enumerate} - Starting with replacing the DC-motor with a stepper motor model, which is based on a model by \textcite{karadeniz_modelling_2018}. + Starting by replacing the DC-motor with a stepper motor model, which is based on a model by \textcite{karadeniz_modelling_2018}. The controller is updated as well, to accommodate for the behavior of the steppers. The next step is to implement a dynamic model of configuration 4 in \autoref{fig:scaradesign}. - The dynamics of the SCARA are based on a serial link structure \autocite{dresscher_modeling_2010}. + The dynamics of the \ac{scara} are based on a serial link structure \autocite{dresscher_modeling_2010}. This serial link structure makes it easy to add and extend joints, bodies and mass points to the system. Therefore, the last detail, the marker lifting, was added without any difficulty. The servo is connected via a linkage with the marker such that it rotates away from the board. @@ -154,12 +143,12 @@ At this point the development has reached a detailed design together with a dynamic model representing that design. The dynamic model is a useful tool to test and evaluate the system behavior. However, it does not include the shapes of the components and can therefore not be used to evaluate clearance or collision between components. - By implementing the design using CAD software, it is possible to search for collisions. - Furthermore, this model can than also be used to print the custom parts. + By implementing the design using CAD software, it is possible to inspect for collisions. + Furthermore, this model is than also used to print the custom parts. For the mechanical part I used OpenSCAD as CAD software, based on prior experience with the software. With this it was possible to implement all the custom components as well as the \ac{ots}-components. - Using the inverse kinematics model from the basic design of the SCARA, the angles were directly applied on the components in system. - Allowing me to change the configuration of the SCARA and inspect the clearance between each component. + Using the inverse kinematics model from the basic design of the \ac{scara}, the angles were directly applied on the components in system. + Allowing me to change the configuration of the \ac{scara} and inspect the clearance between each component. Following the rectangular path as defined in \autoref{test1} revealed that collisions occurred between parts. These collisions were resolved by adding an indentation in one linkage and moving another linkage. These changes are shown in \autoref{fig:scad_clearance} @@ -168,10 +157,11 @@ \centering \includegraphics[width=0.8\linewidth]{graphics/scad_scara_circles.png} \caption{ - CAD of the SCARA configuration, with the end-effector orientated in the lower left corner of the operating area. + CAD of the \ac{scara} configuration, with the end-effector orientated in the lower left corner of the operating area. The configuration has been adapted at the two circled points, to resolve collisions in this orientation. - An indentation was made to ensure that the arm could make the required corner. - Furthermore, the bottom linkage has been moved from above to below the actuated joints, as this linkage would otherwise collide with the end-effector. + An indentation was made to ensure that the arm can make the required angle. + The bottom linkage was located above the joints as depicted in the fourth configuration in \autoref{fig:scaradesign}. + This was moved to below the actuated joints as it did collide with the end-effector. } \label{fig:scad_clearance} \end{figure} @@ -179,7 +169,7 @@ \begin{figure} \centering \includegraphics[width=0.8\linewidth]{graphics/scad_carriage.png} - \caption{Rendered 3D model of the SCARA, including steppers, marker and servo.} + \caption{Rendered 3D model of the \ac{scara}, including steppers, marker and servo.} \label{fig:scad_carriage} \end{figure} @@ -188,7 +178,7 @@ However, this was not without deviating from the original design plan. It was not feasible to define all different levels of detail before the start of the development. Prior to the design, it was possible to plan 4 levels of detail. - After these steps, the design decisions taken made it possible to define the following levels of detail. + After implementing these levels of detail, the design decisions taken made it possible to define additional levels of detail. In total there are seven predefined levels of detail in the design. Meaning that there must also be seven test cycles. @@ -200,10 +190,9 @@ Implicitly, the system was very often tested and changed based on test results. \subsection{Conclusion} - With the development of the SCARA completed. - Following the design plan, the development has to be repeated for the design of the Cable bot. + With the development of the \ac{scara} completed. + Following the design plan, the development has to be repeated for the design of the \ac{cdc}. However, the evaluation of the development until this point resulted in enough information to draw conclusions about the design plan. I expect that executing this development a third time is not beneficial to the case study, given the additional effort. Time is better spent on the realization of a prototype and improving the current design method. - Therefore, the next section will go into the construction of the prototype instead of the development of the Cable bot. - + Therefore, the next section goes into the construction of the prototype instead of the development of the \ac{cdc}.

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 literal 34619 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 Jl(z`_{{ZxwpuYeB diff --git a/graphics/scad_scara.png b/graphics/scad_scara.png new file mode 100644 index 0000000000000000000000000000000000000000..c5f050fb9ba2f95c0f1ec17eddb1114e5c734087 GIT binary patch literal 35104 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